From eguan@redhat.com Mon Apr 1 05:57:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1C33B29DFE for ; Mon, 1 Apr 2013 05:57:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EB5168F8033 for ; Mon, 1 Apr 2013 03:57:56 -0700 (PDT) X-ASG-Debug-ID: 1364813876-04bdf0542d9cda0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id T1cui4zZa5VeIwHc for ; Mon, 01 Apr 2013 03:57:56 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r31Avt3l011182 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 1 Apr 2013 06:57:56 -0400 Received: from localhost (dhcp-13-36.nay.redhat.com [10.66.13.36]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r31AvsKd027727; Mon, 1 Apr 2013 06:57:55 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 0/4] xfstests: random regression tests Date: Mon, 1 Apr 2013 18:57:40 +0800 X-ASG-Orig-Subj: [PATCH 0/4] xfstests: random regression tests Message-Id: <1364813864-10820-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1364813876 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 308 and 309 are actually at version 3, revised after the re-factor. Posts for version 2 are: http://oss.sgi.com/archives/xfs/2013-03/msg00746.html http://oss.sgi.com/archives/xfs/2013-03/msg00747.html 310 and 311 are new test cases. I keep the NNN test name and make the seq number unique across different test types. All comments are appreciated. Thanks, Eryu Guan Eryu Guan (4): xfstests generic 308: check ctime updates for setfacl xfstests generic 309: test write to the last block of max file size on ext4 xfstests ext4 310: test read /proc/fs/ext4//mb_groups while the fs is being unmounted xfstests generic 311: test dir mtime and ctime are updated on rename tests/ext4/310 | 74 +++++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/310.out | 2 ++ tests/ext4/group | 2 +- tests/generic/308 | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/308.out | 2 ++ tests/generic/309 | 69 ++++++++++++++++++++++++++++++++++++++++++++ tests/generic/309.out | 2 ++ tests/generic/311 | 74 +++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/311.out | 2 ++ tests/generic/group | 3 ++ 10 files changed, 308 insertions(+), 1 deletion(-) create mode 100644 tests/ext4/310 create mode 100644 tests/ext4/310.out create mode 100644 tests/generic/308 create mode 100644 tests/generic/308.out create mode 100644 tests/generic/309 create mode 100644 tests/generic/309.out create mode 100644 tests/generic/311 create mode 100644 tests/generic/311.out -- 1.8.1.4 From eguan@redhat.com Mon Apr 1 05:57:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 92F4129E02 for ; Mon, 1 Apr 2013 05:57:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 67CEF8F8033 for ; Mon, 1 Apr 2013 03:57:59 -0700 (PDT) X-ASG-Debug-ID: 1364813878-04cbb01fb89b040001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id aZItmWWBCy5A4pC8 for ; Mon, 01 Apr 2013 03:57:58 -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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r31Avw8r010961 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 1 Apr 2013 06:57:58 -0400 Received: from localhost (dhcp-13-36.nay.redhat.com [10.66.13.36]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r31AvuFD029099; Mon, 1 Apr 2013 06:57:57 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 1/4] xfstests generic 308: check ctime updates for setfacl Date: Mon, 1 Apr 2013 18:57:41 +0800 X-ASG-Orig-Subj: [PATCH 1/4] xfstests generic 308: check ctime updates for setfacl Message-Id: <1364813864-10820-2-git-send-email-eguan@redhat.com> In-Reply-To: <1364813864-10820-1-git-send-email-eguan@redhat.com> References: <1364813864-10820-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1364813878 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Check if ctime is updated and written to disk after setfacl Regression test for the following extN commits c6ac12a ext4: update ctime when changing the file's permission by setfacl 30e2bab ext3: update ctime when changing the file's permission by setfacl 523825b ext2: update ctime when changing the file's permission by setfacl Signed-off-by: Eryu Guan --- tests/generic/308 | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/308.out | 2 ++ tests/generic/group | 1 + 3 files changed, 82 insertions(+) create mode 100644 tests/generic/308 create mode 100644 tests/generic/308.out diff --git a/tests/generic/308 b/tests/generic/308 new file mode 100644 index 0000000..797a907 --- /dev/null +++ b/tests/generic/308 @@ -0,0 +1,79 @@ +#! /bin/bash +# FS QA Test No. 308 +# +# Check if ctime is updated and written to disk after setfacl +# +# Regression test for the following extN commits +# c6ac12a ext4: update ctime when changing the file's permission by setfacl +# 30e2bab ext3: update ctime when changing the file's permission by setfacl +# 523825b ext2: update ctime when changing the file's permission by setfacl +# +# Based on test 277 +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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" + +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $testfile +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +testfile=$SCRATCH_MNT/testfile.$seq + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch + +echo "Silence is golden" + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount >/dev/null 2>&1 + +touch $testfile +_scratch_remount +ctime1=`stat -c %Z $testfile` + +sleep 1 +setfacl -m 'u::x,g::x,o::x' $testfile +ctime2=`stat -c %Z $testfile` + +_scratch_remount +ctime3=`stat -c %Z $testfile` + +if [ "$ctime1" == "$ctime2" ]; then + echo "error: ctime not updated after setfacl" +elif [ "$ctime1" == "$ctime3" ]; then + echo "error: on disk ctime not updated" +else + status=0 +fi + +exit diff --git a/tests/generic/308.out b/tests/generic/308.out new file mode 100644 index 0000000..a731eaa --- /dev/null +++ b/tests/generic/308.out @@ -0,0 +1,2 @@ +QA output created by 308 +Silence is golden diff --git a/tests/generic/group b/tests/generic/group index 450e942..6c74b63 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -109,3 +109,4 @@ 299 auto aio enospc rw stress 300 auto aio enospc preallocrw stress 306 auto quick rw +308 auto quick -- 1.8.1.4 From eguan@redhat.com Mon Apr 1 05:58:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 08B3E29E09 for ; Mon, 1 Apr 2013 05:58:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AA10CAC008 for ; Mon, 1 Apr 2013 03:58:01 -0700 (PDT) X-ASG-Debug-ID: 1364813880-04bdf0542d9cdb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HtgdlJwzxevsO3vI for ; Mon, 01 Apr 2013 03:58: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]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r31Aw0lU027185 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 1 Apr 2013 06:58:00 -0400 Received: from localhost (dhcp-13-36.nay.redhat.com [10.66.13.36]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r31Avxsa030930; Mon, 1 Apr 2013 06:58:00 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 2/4] xfstests generic 309: test write to the last block of max file size on ext4 Date: Mon, 1 Apr 2013 18:57:42 +0800 X-ASG-Orig-Subj: [PATCH 2/4] xfstests generic 309: test write to the last block of max file size on ext4 Message-Id: <1364813864-10820-3-git-send-email-eguan@redhat.com> In-Reply-To: <1364813864-10820-1-git-send-email-eguan@redhat.com> References: <1364813864-10820-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1364813880 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On unpatched ext4 if an extent exists which includes the block right before the maximum file offset, and the block for the maximum file offset is written, the kernel panics. On patched ext4, the write would get EFBIG since we lower s_maxbytes by one fs block. Regression test for commit: f17722f ext4: Fix max file size and logical block counting of extent format file Though it's an ext4 specific issue, it's no harm to run on all file systems, so put it in generic. Signed-off-by: Eryu Guan --- tests/generic/309 | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/309.out | 2 ++ tests/generic/group | 1 + 3 files changed, 72 insertions(+) create mode 100644 tests/generic/309 create mode 100644 tests/generic/309.out diff --git a/tests/generic/309 b/tests/generic/309 new file mode 100644 index 0000000..875c09f --- /dev/null +++ b/tests/generic/309 @@ -0,0 +1,69 @@ +#! /bin/bash +# FS QA Test No. 309 +# +# Regression test for commit: +# f17722f ext4: Fix max file size and logical block counting of extent format file +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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" + +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $testfile +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +testfile=$TEST_DIR/testfile.$seq + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +rm -f $seq.full +echo "Silence is golden" + +block_size=`stat -f -c %s $TEST_DIR` + +# On unpatched ext4, if an extent exists which includes the block right +# before the maximum file offset, and the block for the maximum file offset +# is written, the kernel panics +# On patched ext4, the write would get EFBIG since we lower s_maxbytes by +# one fs block + +# Create a sparse file with an extent lays at one block before old s_maxbytes +offset=$(((2**32 - 2) * $block_size)) +$XFS_IO_PROG -f -c "pwrite $offset $block_size" -c fsync $testfile >$seq.full 2>&1 + +# Write to the block after the extent just created +offset=$(((2**32 - 1) * $block_size)) +$XFS_IO_PROG -f -c "pwrite $offset $block_size" -c fsync $testfile >>$seq.full 2>&1 + +# Got here without hitting BUG_ON(), test passed +status=0 +exit diff --git a/tests/generic/309.out b/tests/generic/309.out new file mode 100644 index 0000000..56330d6 --- /dev/null +++ b/tests/generic/309.out @@ -0,0 +1,2 @@ +QA output created by 309 +Silence is golden diff --git a/tests/generic/group b/tests/generic/group index 6c74b63..9ff2ab1 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -110,3 +110,4 @@ 300 auto aio enospc preallocrw stress 306 auto quick rw 308 auto quick +309 auto quick -- 1.8.1.4 From eguan@redhat.com Mon Apr 1 05:58:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0FFDA29E0A for ; Mon, 1 Apr 2013 05:58:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8052DAC007 for ; Mon, 1 Apr 2013 03:58:04 -0700 (PDT) X-ASG-Debug-ID: 1364813883-04cb6c1e7aa07f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id oCCNZAkxn0HKoYqh for ; Mon, 01 Apr 2013 03:58:03 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r31Aw3e6027191 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 1 Apr 2013 06:58:03 -0400 Received: from localhost (dhcp-13-36.nay.redhat.com [10.66.13.36]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r31Aw1mA027735; Mon, 1 Apr 2013 06:58:02 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 3/4] xfstests ext4 310: test read /proc/fs/ext4//mb_groups while the fs is being unmounted Date: Mon, 1 Apr 2013 18:57:43 +0800 X-ASG-Orig-Subj: [PATCH 3/4] xfstests ext4 310: test read /proc/fs/ext4//mb_groups while the fs is being unmounted Message-Id: <1364813864-10820-4-git-send-email-eguan@redhat.com> In-Reply-To: <1364813864-10820-1-git-send-email-eguan@redhat.com> References: <1364813864-10820-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1364813883 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Regression test for commit: 9559996 ext4: remove mb_groups before tearing down the buddy_cache Signed-off-by: Eryu Guan --- tests/ext4/310 | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/310.out | 2 ++ tests/ext4/group | 2 +- 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 tests/ext4/310 create mode 100644 tests/ext4/310.out diff --git a/tests/ext4/310 b/tests/ext4/310 new file mode 100644 index 0000000..eb9320f --- /dev/null +++ b/tests/ext4/310 @@ -0,0 +1,74 @@ +#! /bin/bash +# FS QA Test No. 310 +# +# Regression test for commit: +# 9559996 ext4: remove mb_groups before tearing down the buddy_cache +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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" + +PIDS="" +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + kill $PIDS >/dev/null 2>&1 +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch + +rm -f $seq.full +echo "Silence is golden" + +DEV_BASENAME=$(basename $(readlink -f $SCRATCH_DEV)) +echo "Start test on device $SCRATCH_DEV, basename $DEV_BASENAME" >$seq.full +_scratch_mkfs >>$seq.full 2>&1 + +while true;do + mount $SCRATCH_DEV $SCRATCH_MNT + umount $SCRATCH_DEV +done & +PIDS=$! + +while true;do + cat /proc/fs/ext4/$DEV_BASENAME/mb_groups > /dev/null 2>&1 +done & +PIDS="$PIDS $!" + +# sleep for 180s, in most cases a buggy kernel could hit BUG_ON within 3 minutes +sleep 180 + +# no BUG_ON, all done +kill $PIDS >/dev/null 2>&1 +wait +status=0 +exit diff --git a/tests/ext4/310.out b/tests/ext4/310.out new file mode 100644 index 0000000..7b9eaf7 --- /dev/null +++ b/tests/ext4/310.out @@ -0,0 +1,2 @@ +QA output created by 310 +Silence is golden diff --git a/tests/ext4/group b/tests/ext4/group index 6a44db3..a53cd87 100644 --- a/tests/ext4/group +++ b/tests/ext4/group @@ -8,4 +8,4 @@ 302 aio dangerous ioctl rw stress 303 aio dangerous ioctl rw stress 304 aio dangerous ioctl rw stress - +310 auto -- 1.8.1.4 From eguan@redhat.com Mon Apr 1 05:58:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 695D429E0D for ; Mon, 1 Apr 2013 05:58:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E9F8BAC007 for ; Mon, 1 Apr 2013 03:58:06 -0700 (PDT) X-ASG-Debug-ID: 1364813885-04cb6c1e7aa0810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VLiXyIqMfvx4FRhb for ; Mon, 01 Apr 2013 03:58:05 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r31Aw5ZO011203 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 1 Apr 2013 06:58:05 -0400 Received: from localhost (dhcp-13-36.nay.redhat.com [10.66.13.36]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r31Aw4to019902; Mon, 1 Apr 2013 06:58:04 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 4/4] xfstests generic 311: test dir mtime and ctime are updated on rename Date: Mon, 1 Apr 2013 18:57:44 +0800 X-ASG-Orig-Subj: [PATCH 4/4] xfstests generic 311: test dir mtime and ctime are updated on rename Message-Id: <1364813864-10820-5-git-send-email-eguan@redhat.com> In-Reply-To: <1364813864-10820-1-git-send-email-eguan@redhat.com> References: <1364813864-10820-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: 1364813885 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Test directory mtime and ctime are updated when moving a file onto an existing file in the directory Regression test for commit: 0b23076 ext3: fix update of mtime and ctime on rename Signed-off-by: Eryu Guan --- tests/generic/311 | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/311.out | 2 ++ tests/generic/group | 1 + 3 files changed, 77 insertions(+) create mode 100644 tests/generic/311 create mode 100644 tests/generic/311.out diff --git a/tests/generic/311 b/tests/generic/311 new file mode 100644 index 0000000..46cc791 --- /dev/null +++ b/tests/generic/311 @@ -0,0 +1,74 @@ +#! /bin/bash +# FS QA Test No. 311 +# +# Test directory mtime and ctime are updated when moving a file onto an +# existing file in the directory +# +# Regression test for commit: +# 0b23076 ext3: fix update of mtime and ctime on rename +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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" + +status=0 # success is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf $TEST_DIR/testdir_$seq + rm -f $TEST_DIR/testfile.$seq +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs generic +_supported_os IRIX Linux + +echo "Silence is golden" + +mkdir -p $TEST_DIR/testdir_$seq +touch $TEST_DIR/testdir_$seq/testfile +touch $TEST_DIR/testfile.$seq + +mtime1=`stat -c %Y $TEST_DIR/testdir_$seq` +ctime1=`stat -c %Z $TEST_DIR/testdir_$seq` + +sleep 1 +mv $TEST_DIR/testfile.$seq $TEST_DIR/testdir_$seq/testfile + +mtime2=`stat -c %Y $TEST_DIR/testdir_$seq` +ctime2=`stat -c %Z $TEST_DIR/testdir_$seq` + +if [ "$mtime1" == "$mtime2" ]; then + echo "mtime not updated" + let status=$status+1 +fi +if [ "$ctime1" == "$ctime2" ]; then + echo "ctime not updated" + let status=$status+1 +fi + +exit diff --git a/tests/generic/311.out b/tests/generic/311.out new file mode 100644 index 0000000..62f2530 --- /dev/null +++ b/tests/generic/311.out @@ -0,0 +1,2 @@ +QA output created by 311 +Silence is golden diff --git a/tests/generic/group b/tests/generic/group index 9ff2ab1..1f4b62e 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -111,3 +111,4 @@ 306 auto quick rw 308 auto quick 309 auto quick +311 auto quick -- 1.8.1.4 From eguan@redhat.com Mon Apr 1 05:58:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C128829DFE for ; Mon, 1 Apr 2013 05:58:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AD1C7304032 for ; Mon, 1 Apr 2013 03:58:25 -0700 (PDT) X-ASG-Debug-ID: 1364813904-04cb6c1e79a08a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nuDDyHwrREqXZ7iA for ; Mon, 01 Apr 2013 03:58:24 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r31AwOJm012380 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 1 Apr 2013 06:58:24 -0400 Received: from localhost (dhcp-13-36.nay.redhat.com [10.66.13.36]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r31AwNpd011659; Mon, 1 Apr 2013 06:58:23 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH] xfstests: set correct seqres variable in new when creating test template Date: Mon, 1 Apr 2013 18:58:15 +0800 X-ASG-Orig-Subj: [PATCH] xfstests: set correct seqres variable in new when creating test template Message-Id: <1364813895-10883-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: 1364813904 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When setting seqres in the new script, '$' should be escaped, otherwise seqres will be set to '/' not '$RESULT_DIR/$seq' Signed-off-by: Eryu Guan --- new | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/new b/new index d9c38c8..2bc1e8f 100755 --- a/new +++ b/new @@ -106,7 +106,7 @@ cat <$id # # creator seq=\`basename \$0\` -seqres=$RESULT_DIR/$seq +seqres=\$RESULT_DIR/\$seq echo "QA output created by \$seq" here=\`pwd\` -- 1.8.1.4 From rjohnston@sgi.com Mon Apr 1 08:19:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 2DD4029E08 for ; Mon, 1 Apr 2013 08:19:47 -0500 (CDT) Received: from xmail.sgi.com (pv-excas3-dc21.corp.sgi.com [137.38.102.206]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7325EAC002; Mon, 1 Apr 2013 06:19:43 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 1 Apr 2013 08:19:22 -0500 Message-ID: <5159896A.4050706@sgi.com> Date: Mon, 1 Apr 2013 08:19:38 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eryu Guan CC: Subject: Re: [PATCH] xfstests: set correct seqres variable in new when creating test template References: <1364813895-10883-1-git-send-email-eguan@redhat.com> In-Reply-To: <1364813895-10883-1-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Looks good. --Rich Reviewed-by: Rich Johnston From rjohnston@sgi.com Mon Apr 1 08:21:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 03B7C29E14 for ; Mon, 1 Apr 2013 08:21:53 -0500 (CDT) Received: from xmail.sgi.com (pv-excas3-dc21-nlb.corp.sgi.com [137.38.102.207]) by relay2.corp.sgi.com (Postfix) with ESMTP id E47C230404E; Mon, 1 Apr 2013 06:21:49 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 1 Apr 2013 08:21:49 -0500 Message-ID: <515989FD.30607@sgi.com> Date: Mon, 1 Apr 2013 08:22:05 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eryu Guan CC: Subject: Re: [PATCH] xfstests: set correct seqres variable in new when creating test template References: <1364813895-10883-1-git-send-email-eguan@redhat.com> In-Reply-To: <1364813895-10883-1-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Eryu, Thanks for submitting this patch, it has been committed. --Rich commit d1ec02af9e0516652ce92584dc4f92704579af18 Author: Eryu Guan Date: Mon Apr 1 10:58:15 2013 +0000 xfstests: set correct seqres variable in new when creating test template When setting seqres in the new script, '$' should be escaped, otherwise seqres will be set to '/' not '$RESULT_DIR/$seq' From rdominguez5@mail.csuchico.edu Mon Apr 1 10:32:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=SUBJ_ALL_CAPS autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8761529E08 for ; Mon, 1 Apr 2013 10:32:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 76D19304064 for ; Mon, 1 Apr 2013 08:32:02 -0700 (PDT) X-ASG-Debug-ID: 1364830321-04cb6c1e78bd790001-NocioJ Received: from mail-ve0-f177.google.com (mail-ve0-f177.google.com [209.85.128.177]) by cuda.sgi.com with ESMTP id FXyibZChRSpHBPFZ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 01 Apr 2013 08:32:01 -0700 (PDT) X-Barracuda-Envelope-From: rdominguez5@mail.csuchico.edu X-Barracuda-Apparent-Source-IP: 209.85.128.177 Received: by mail-ve0-f177.google.com with SMTP id jw11so2620619veb.8 for ; Mon, 01 Apr 2013 08:32:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type:content-transfer-encoding:x-gm-message-state; bh=3BcMe8AD96/LGTnACS8mT/sbaQsWdhm+kyRWFGL6uXk=; b=pRW8v/SRnbvOaUKZa0bBi3f2dbQEHUaVwCEtrMLsThC1oK+wRdXfUDnDOtD742TPvI L8O7Q8+rbXucP76avApqBDnx2/hDIRY94bXVe5zkQ3ixIeCkyzKsGsOnKJBwAwb+PnFv jp6HVCHm+sP+1QVmuSiMA4kctYutNfld1WkDLV0cqWZpDRVFKRUjHvrbMJmmg7+k4fjX prWTgTXF6vAu4CEfKqg/KP3Zt26l0yxsL/LIaX3ErUAZk8qeNpHQSgPn4JBn0a/NV7uF bNSazy2baEiRbM1DyJysi80xR5qJaGdeF/f8ajdcJ4nRPFeBuzfmWKPGZ1CHQLXB6kWZ r5LQ== MIME-Version: 1.0 X-Received: by 10.58.48.166 with SMTP id m6mr9352184ven.59.1364830320938; Mon, 01 Apr 2013 08:32:00 -0700 (PDT) Received: by 10.220.223.11 with HTTP; Mon, 1 Apr 2013 08:32:00 -0700 (PDT) Date: Mon, 1 Apr 2013 16:32:00 +0100 Message-ID: Subject: =?ISO-8859-1?Q?ATENCI=D3N_WEB=2DMAIL_DEL_USUARIO?= From: WEBMASTER HELP DESK X-ASG-Orig-Subj: =?ISO-8859-1?Q?ATENCI=D3N_WEB=2DMAIL_DEL_USUARIO?= To: undisclosed-recipients:; Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Gm-Message-State: ALoCoQmu2K6SWO+jGedSPSHHh9u0LzvDYNiI3mWf1H1Hc1jZQw8Rb6eIPdOtnRQWinMU3qBZTH7F X-Barracuda-Connect: mail-ve0-f177.google.com[209.85.128.177] X-Barracuda-Start-Time: 1364830321 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126876 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --=20 Estimado usuario Webmail Su buz=F3n ha superado el l=EDmite de 2GB establecido por nuestro webmaster, que est=E1 funcionando a 2.30GB usted no puede enviar ni recibir nuevos mensajes hasta que se confirme su bandeja de entrada. Pulse el enlace para validar tu cuenta http://www.hotelcaribeubatuba.com.br/formulario/phpform/use/identity/form1.= html =A1gracias administrador del sistema From advpoker228@cs2.com7.ftg.com Mon Apr 1 13:55:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C093B7F54 for ; Mon, 1 Apr 2013 13:55:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AAF5C8F8052 for ; Mon, 1 Apr 2013 11:55:57 -0700 (PDT) X-ASG-Debug-ID: 1364842545-04cbb01fb8d14a0001-w1Z2WR Received: from mail.ginga.com.sg (mail.ginga.com.sg [58.185.13.254]) by cuda.sgi.com with SMTP id VGUFRy5uyxGpp3Nm for ; Mon, 01 Apr 2013 11:55:47 -0700 (PDT) X-Barracuda-Envelope-From: advpoker228@cs2.com7.ftg.com X-Barracuda-Apparent-Source-IP: 58.185.13.254 Received: from hc.local ([75.150.36.157]) by mail.ginga.com.sg with Microsoft SMTPSVC(6.0.3790.4675); Tue, 2 Apr 2013 02:56:54 +0800 Message-ID: From: "PayPal Accounts" Subject: =?utf-8?B?Q2hlY2sgOik=?= Date: Mon, 1 Apr 2013 10:52:43 -0800 X-ASG-Orig-Subj: =?utf-8?B?Q2hlY2sgOik=?= MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-OriginalArrivalTime: 01 Apr 2013 18:56:54.0578 (UTC) FILETIME=[AD681120:01CE2F0A] X-Barracuda-Connect: mail.ginga.com.sg[58.185.13.254] X-Barracuda-Start-Time: 1364842545 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.71 X-Barracuda-Spam-Status: No, SCORE=1.71 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA578_TXT, FUZZY_CREDIT, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126890 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 0.50 BSF_SC7_SA578_TXT Custom Rule SA578_TXT To: undisclosed-recipients:; Greetings fellow poker lovers=2E We welcome you to our renowned Poker Website in the SouthEast Asia. For = anyone outside SouthEast Asia, you may contact us directly (check on our website for our contact = details), and we can arrange something in order for you to become a member. Our website is located at = http://www.poker228.net - Currently with over 500 members playing at any given time, so you will always have some = people to play with! We'll be waiting at http://www.poker228.net - Thank you [IND]: Kami juga menjual data-data kartu kredit yang kami peroleh melalui = beberapa online shop=2E Jika anda tertarik, harap hubungi kami langsung lewat ym/bb. Kami = siap melayani anda. From demon_shmanyak@amazontech.com Mon Apr 1 17:52:37 2013 Return-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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 44B897F8A for ; Mon, 1 Apr 2013 17:52:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C7DD6AC002 for ; Mon, 1 Apr 2013 15:52:33 -0700 (PDT) X-ASG-Debug-ID: 1364856750-04cb6c1e78e3ac0001-NocioJ Received: from mail-1.namedomainsolutions.ru (mail-1.namedomainsolutions.ru [217.12.33.188]) by cuda.sgi.com with ESMTP id J7Kpci8DLKonwEi3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 01 Apr 2013 15:52:32 -0700 (PDT) X-Barracuda-Envelope-From: demon_shmanyak@amazontech.com X-Barracuda-Apparent-Source-IP: 217.12.33.188 Received: by mail-1.namedomainsolutions.ru (Postfix, from userid 8) id C1E4816535C; Tue, 2 Apr 2013 02:52:25 +0400 (MSK) Received: from Unknown (unknown [212.58.8.41]) by mail-1.namedomainsolutions.ru (Postfix) with ESMTPA id B3F9A1652F5; Tue, 2 Apr 2013 02:52:24 +0400 (MSK) Message-ID: Reply-To: =?windows-1251?B?yu7s6PLl8iDj7vHz5ODw8fLi5e3t7uPuIOfg?= =?windows-1251?B?6uDn4A==?= From: =?windows-1251?B?yu7s6PLl8iDj7vHz5ODw8fLi5e3t7uPuIOfg?= =?windows-1251?B?6uDn4A==?= To: , , , Subject: =?windows-1251?B?w+7x5+Dq4OcuIMjn7OXt5e3o/yDiIOfg6u7t?= =?windows-1251?B?7uTg8uXr/PHy4uUg4iAyMDEz4y4=?= Date: Tue, 2 Apr 2013 00:52:29 +0200 X-ASG-Orig-Subj: =?windows-1251?B?w+7x5+Dq4OcuIMjn7OXt5e3o/yDiIOfg6u7t?= =?windows-1251?B?7uTg8uXr/PHy4uUg4iAyMDEz4y4=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0372_01CE2F3C.5A1AC490" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Barracuda-Connect: mail-1.namedomainsolutions.ru[217.12.33.188] X-Barracuda-Start-Time: 1364856751 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126906 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_0372_01CE2F3C.5A1AC490 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CA=D3=D0=D1 =CF=CE=C2=DB=D8=C5=CD=C8=DF =CA=C2=C0=CB=C8=D4=C8=CA=C0=D6=C8= =C8 --------------------------- =C3=CE=D1=D3=C4=C0=D0=D1=D2=C2=C5=CD=CD=DB=C9 =C7=C0=CA=C0=C7.=20 =D1=EB=EE=E6=ED=FB=E5 =E2=EE=EF=F0=EE=F1=FB =E2 =EF=F0=E0=EA=F2=E8=EA=E5 = =EF=F0=E8=EC=E5=ED=E5=ED=E8=FF =EA=EE=ED=EA=F3=F0=E5=ED=F2=ED=FB=F5 =E8 =ED= =E5=EA=EE=ED=EA=F3=F0=E5=ED=F2=ED=FB=F5 =F2=EE=F0=E3=EE=E2. =D2=E8=EF=E8=F7=ED=FB=E5 =EE=F8=E8=E1=EA=E8 =F3=F7=E0=F1=F2=ED=E8=EA=EE=E2= . =D4=C7-9=F7. =D4=C7-122. =D4=C7-79. 29 - =E70 =E0=EF=F0=E5=EB=FF 2013 =E3=EE=E4=E0 =D1=C0=CD=CA=D2-=CF=C5=D2=C5=D0=C1=D3=D0=C3 --------------- =D6=E5=EB=FC =EA=F3=F0=F1=E0: =CE=F1=E2=E5=F2=E8=F2=FC =E2=E0=E6=ED=FB=E5 =E2=EE=EF=F0=EE=F1=FB =E7=E0=EA= =EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=E0 =E2 =F1=F4=E5=F0=E5 =E3=EE=F1=F3=E4= =E0=F0=F1=F2=E2=E5=ED=ED=EE=E3=EE =E7=E0=EA=E0=E7=E0. =CA=EE=EC=F3 =E1=F3=E4=E5=F2 =ED=E5=EE=E1=F5=EE=E4=E8=EC=EE? =CA=EE=EC=EC=E5=F0=F7=E5=F1=EA=E8=EC =E4=E8=F0=E5=EA=F2=EE=F0=E0=EC, =EC=E5= =ED=E5=E4=E6=E5=F0=E0=EC =EF=EE =EF=F0=EE=E4=E0=E6=E0=EC, =E1=F3=F5=E3=E0= =EB=F2=E5=F0=E0=EC, =FD=EA=EE=ED=EE=EC=E8=F1=F2=E0=EC, =F1=EF=E5=F6=E8=E0= =EB=E8=F1=F2=E0=EC =EF=EE =F0=E0=E1=EE=F2=E5 =F1 =E3=EE=F1=F3=E4=E0=F0=F1= =F2=E2=E5=ED=ED=FB=EC =E7=E0=EA=E0=E7=EE=EC. =CF=EE =EE=EA=EE=ED=F7=E0=ED=E8=E8 =EA=F3=F0=F1=E0 =E2=FB=E4=E0=E5=F2=F1=FF= =F3=E4=EE=F1=F2=EE=E2=E5=F0=E5=ED=E8=E5 =EE =EF=EE=E2=FB=F8=E5=ED=E8=E8 = =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8=E8. =CF=EE=E4=F0=EE=E1=ED=E0=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF =E2=FB=F1=FB=EB= =E0=E5=F2=F1=FF =EF=EE =E7=E0=EF=F0=EE=F1=F3. =F2=E5=EB.: 8 { =EA=EE=E4_=D1=CF=E1 } 6=F7=3D2 .. 15 7=E7 = =20 ------=_NextPart_000_0372_01CE2F3C.5A1AC490 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CA=D3=D0=D1 =CF=CE=C2=DB=D8=C5=CD=C8=DF =CA=C2=C0=CB=C8=D4=C8=CA=C0= =D6=C8=C8
---------------------------
=C3=CE=D1=D3=C4=C0=D0=D1=D2=C2=C5=CD=CD=DB=C9 =C7=C0=CA=C0=C7.
=D1= =EB=EE=E6=ED=FB=E5 =E2=EE=EF=F0=EE=F1=FB =E2 =EF=F0=E0=EA=F2=E8=EA=E5 =EF= =F0=E8=EC=E5=ED=E5=ED=E8=FF=20 =EA=EE=ED=EA=F3=F0=E5=ED=F2=ED=FB=F5 =E8 =ED=E5=EA=EE=ED=EA=F3=F0=E5=ED=F2= =ED=FB=F5 =F2=EE=F0=E3=EE=E2.
=D2=E8=EF=E8=F7=ED=FB=E5 =EE=F8=E8=E1=EA= =E8=20 =F3=F7=E0=F1=F2=ED=E8=EA=EE=E2.
=D4=C7-9=F7. =D4=C7-122. =D4=C7-79.
 
29 - =E70 =E0=EF=F0=E5=EB=FF=20 2013=20 =E3=EE=E4=E0
=D1=C0=CD=CA=D2-=CF=C5=D2=C5=D0=C1=D3=D0=C3
----------= -----
 
=D6=E5=EB=FC =EA=F3=F0=F1=E0:
=CE=F1=E2=E5=F2=E8=F2=FC =E2=E0=E6=ED= =FB=E5 =E2=EE=EF=F0=EE=F1=FB =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2= =E0 =E2 =F1=F4=E5=F0=E5=20 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E3=EE =E7=E0=EA=E0=E7=E0.
 

=CA=EE=EC=F3 =E1=F3=E4=E5=F2 =ED=E5=EE=E1=F5=EE=E4=E8=EC=EE?
= =CA=EE=EC=EC=E5=F0=F7=E5=F1=EA=E8=EC =E4=E8=F0=E5=EA=F2=EE=F0=E0=EC, =EC=E5= =ED=E5=E4=E6=E5=F0=E0=EC =EF=EE=20 =EF=F0=EE=E4=E0=E6=E0=EC, =E1=F3=F5=E3=E0=EB=F2=E5=F0=E0=EC, =FD=EA=EE=ED= =EE=EC=E8=F1=F2=E0=EC, =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2=E0=EC =EF=EE =F0=E0= =E1=EE=F2=E5 =F1 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=EC=20 =E7=E0=EA=E0=E7=EE=EC.
 

=CF=EE =EE=EA=EE=ED=F7=E0=ED=E8=E8 =EA=F3=F0=F1=E0 =E2=FB=E4=E0=E5= =F2=F1=FF =F3=E4=EE=F1=F2=EE=E2=E5=F0=E5=ED=E8=E5 =EE =EF=EE=E2=FB=F8=E5=ED= =E8=E8=20 =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8=E8.
 
=CF=EE=E4=F0=EE=E1=ED=E0=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF =E2=FB=F1= =FB=EB=E0=E5=F2=F1=FF =EF=EE =E7=E0=EF=F0=EE=F1=F3.
=F2=E5=EB.:=20 8 { =EA=EE=E4_=D1=CF=E1 } 6=F7=3D2 .. 15 7=E7
------=_NextPart_000_0372_01CE2F3C.5A1AC490-- From qcai@redhat.com Tue Apr 2 01:08:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D20DC7F61 for ; Tue, 2 Apr 2013 01:08:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B8BFA30406A for ; Mon, 1 Apr 2013 23:08:54 -0700 (PDT) X-ASG-Debug-ID: 1364882930-04cb6c1e7a101e10001-NocioJ Received: from mx4-phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) by cuda.sgi.com with ESMTP id Lg8aN7bGOYsbWMzF for ; Mon, 01 Apr 2013 23:08:50 -0700 (PDT) X-Barracuda-Envelope-From: qcai@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.25 Received: from zmail14.collab.prod.int.phx2.redhat.com (zmail14.collab.prod.int.phx2.redhat.com [10.5.83.16]) by mx4-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r3268nQ8025698; Tue, 2 Apr 2013 02:08:49 -0400 Date: Tue, 2 Apr 2013 02:08:49 -0400 (EDT) From: CAI Qian To: xfs@oss.sgi.com Cc: LKML Message-ID: <247719576.438259.1364882929749.JavaMail.root@redhat.com> In-Reply-To: <1462091996.435156.1364882416199.JavaMail.root@redhat.com> Subject: xfs deadlock on 3.9-rc5 running xfstests case #78 MIME-Version: 1.0 X-ASG-Orig-Subj: xfs deadlock on 3.9-rc5 running xfstests case #78 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.5.82.12] X-Mailer: Zimbra 8.0.3_GA_5664 (ZimbraWebClient - FF19 (Linux)/8.0.3_GA_5664) Thread-Topic: xfs deadlock on 3.9-rc5 running xfstests case #78 Thread-Index: ePds5FjhEOUFhfYr3RIc3zkWaEmy1Q== X-Barracuda-Connect: mx4-phx2.redhat.com[209.132.183.25] X-Barracuda-Start-Time: 1364882930 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... Saw on almost all the servers range from x64, ppc64 and s390x with kernel 3.9-rc5 and xfsprogs-3.1.10. Never caught this in 3.9-rc4, so looks like something new broke this. Log is here with sysrq debug info. http://people.redhat.com/qcai/stable/log CAI Qian From david@fromorbit.com Tue Apr 2 02:05:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 138E57F62 for ; Tue, 2 Apr 2013 02:05:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E2C4A30406B for ; Tue, 2 Apr 2013 00:05:41 -0700 (PDT) X-ASG-Debug-ID: 1364886339-04cbb01fb910aaf0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id dkBtxQsdN4AII5k3 for ; Tue, 02 Apr 2013 00:05:40 -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: AlcSABSCWlF5LBrj/2dsb2JhbABDgzuCN7dihSQEAX4XdIIfAQEFJxMcIxAIGwklDwUlAyETiBMNsRqQABWNeIEdB4NAA5ZqgSCPbIFVgUoo Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail07.adl2.internode.on.net with ESMTP; 02 Apr 2013 17:35:38 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UMvHl-0005rd-MC; Tue, 02 Apr 2013 18:05:37 +1100 Date: Tue, 2 Apr 2013 18:05:37 +1100 From: Dave Chinner To: CAI Qian Cc: xfs@oss.sgi.com, LKML , axboe@kernel.dk Subject: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Message-ID: <20130402070537.GP6369@dastard> X-ASG-Orig-Subj: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] References: <1462091996.435156.1364882416199.JavaMail.root@redhat.com> <247719576.438259.1364882929749.JavaMail.root@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <247719576.438259.1364882929749.JavaMail.root@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1364886339 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [Added jens Axboe to CC] On Tue, Apr 02, 2013 at 02:08:49AM -0400, CAI Qian wrote: > Saw on almost all the servers range from x64, ppc64 and s390x with kernel > 3.9-rc5 and xfsprogs-3.1.10. Never caught this in 3.9-rc4, so looks like > something new broke this. Log is here with sysrq debug info. > http://people.redhat.com/qcai/stable/log Has nothing to do with XFS: [34762.105676] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [34762.152871] systemd-udevd D ffff88030bc94440 0 4391 412 0x00000084 [34762.196660] ffff8801134d9a98 0000000000000082 ffff880303e09ac0 ffff8801134d9fd8 [34762.240512] ffff8801134d9fd8 ffff8801134d9fd8 ffff880304f98000 ffff880303e09ac0 [34762.287047] ffff8802936c1ac0 ffff88060521f998 ffff88060521f99c ffff880303e09ac0 [34762.331446] Call Trace: [34762.345444] [] schedule+0x29/0x70 [34762.373908] [] schedule_preempt_disabled+0xe/0x10 [34762.411394] [] __mutex_lock_slowpath+0xc3/0x140 [34762.447597] [] mutex_lock+0x2a/0x50 [34762.476785] [] __blkdev_get+0x6b/0x4b0 [34762.508839] [] ? selinux_file_alloc_security+0x4a/0x80 [34762.546436] [] blkdev_get+0x19d/0x2e0 [34762.580977] [] ? inode_has_perm.isra.31.constprop.61+0x2a/0x30 [34762.624346] [] blkdev_open+0x5f/0x90 [34762.656318] [] do_dentry_open+0x20f/0x2c0 [34762.689762] [] ? blkdev_get+0x2e0/0x2e0 [34762.722221] [] finish_open+0x35/0x50 [34762.754363] [] do_last+0x6de/0xde0 [34762.783808] [] ? inode_permission+0x18/0x50 [34762.819265] [] ? link_path_walk+0x78/0x880 [34762.853700] [] ? selinux_file_alloc_security+0x4a/0x80 [34762.892881] [] path_openat+0xb7/0x4b0 [34762.923621] [] ? getname_flags.part.33+0x30/0x150 [34762.960839] [] do_filp_open+0x41/0xa0 [34762.992114] [] ? __alloc_fd+0x42/0x110 [34763.023342] [] do_sys_open+0xf4/0x1e0 [34763.054129] [] sys_open+0x21/0x30 [34763.082134] [] system_call_fastpath+0x16/0x1b And: [34763.116218] INFO: task umount:4421 blocked for more than 120 seconds. [34763.153670] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [34763.200321] umount D ffff88030bcb4440 0 4421 452 0x00000080 [34763.242026] ffff8801134fbcb8 0000000000000082 ffff8802936c1ac0 ffff8801134fbfd8 [34763.287320] ffff8801134fbfd8 ffff8801134fbfd8 ffff8803069d0000 ffff8802936c1ac0 [34763.330722] ffff8802936c1ac0 ffff88060521f998 ffff88060521f99c ffff8802936c1ac0 [34763.374428] Call Trace: [34763.388977] [] schedule+0x29/0x70 [34763.419164] [] schedule_preempt_disabled+0xe/0x10 [34763.456279] [] __mutex_lock_slowpath+0xc3/0x140 [34763.492474] [] mutex_lock+0x2a/0x50 [34763.520840] [] loop_clr_fd+0x285/0x480 [34763.552050] [] lo_release+0x70/0x80 [34763.580787] [] __blkdev_put+0x17c/0x1d0 [34763.612479] [] blkdev_put+0x57/0x140 [34763.641557] [] kill_block_super+0x4d/0x80 [34763.674257] [] deactivate_locked_super+0x57/0x80 [34763.708755] [] deactivate_super+0x4e/0x70 [34763.742906] [] mntput_no_expire+0xd7/0x130 [34763.776872] [] sys_umount+0x9c/0x3c0 [34763.811819] [] system_call_fastpath+0x16/0x1b It's clearly a loopback device problem, stuck on the bdev->bd_inode->i_mutex. And there's changesin the loop device teardown since 3.9-rc4: $ glo v3.9-rc4..HEAD -- drivers/block/loop.c c1681bf loop: prevent bdev freeing while device in use 8761a3d loop: cleanup partitions when detaching loop device 183cfb5 loop: fix error return code in loop_add() $ So this looks like someone hasn't been testing their loopback driver changes properly... Cheers, Dave. -- Dave Chinner david@fromorbit.com From axboe@kernel.dk Tue Apr 2 02:19:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B81047F6A for ; Tue, 2 Apr 2013 02:19:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F51C8F804B for ; Tue, 2 Apr 2013 00:19:41 -0700 (PDT) X-ASG-Debug-ID: 1364887179-04bdf0542c104400001-NocioJ Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by cuda.sgi.com with ESMTP id JUCxhibs1gpTsuC5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 02 Apr 2013 00:19:39 -0700 (PDT) X-Barracuda-Envelope-From: axboe@kernel.dk X-Barracuda-Apparent-Source-IP: 205.233.59.134 Received: from kernel.dk ([54.225.238.116]) by merlin.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1UMvVK-0005RP-Mq; Tue, 02 Apr 2013 07:19:38 +0000 Received: from localhost (unknown [87.104.106.3]) by kernel.dk (Postfix) with ESMTPA id 2495A20C47; Tue, 2 Apr 2013 07:19:38 +0000 (UTC) Date: Tue, 2 Apr 2013 09:19:37 +0200 From: Jens Axboe To: Dave Chinner Cc: CAI Qian , xfs@oss.sgi.com, LKML Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Message-ID: <20130402071937.GC3670@kernel.dk> X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] References: <1462091996.435156.1364882416199.JavaMail.root@redhat.com> <247719576.438259.1364882929749.JavaMail.root@redhat.com> <20130402070537.GP6369@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130402070537.GP6369@dastard> X-Barracuda-Connect: merlin.infradead.org[205.233.59.134] X-Barracuda-Start-Time: 1364887179 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 02 2013, Dave Chinner wrote: > [Added jens Axboe to CC] > > On Tue, Apr 02, 2013 at 02:08:49AM -0400, CAI Qian wrote: > > Saw on almost all the servers range from x64, ppc64 and s390x with kernel > > 3.9-rc5 and xfsprogs-3.1.10. Never caught this in 3.9-rc4, so looks like > > something new broke this. Log is here with sysrq debug info. > > http://people.redhat.com/qcai/stable/log CAI Qian, can you try and back the below out and test again? commit 8761a3dc1f07b163414e2215a2cadbb4cfe2a107 Author: Phillip Susi Date: Fri Mar 22 12:21:53 2013 -0600 loop: cleanup partitions when detaching loop device Any partitions added by user space to the loop device were being left in place after detaching the loop device. This was because the detach path issued a BLKRRPART to clean up partitions if LO_FLAGS_PARTSCAN was set, meaning that the partitions were auto scanned on attach. Replace this BLKRRPART with code that unconditionally cleans up partitions on detach instead. Signed-off-by: Phillip Susi Modified by Jens to export delete_partition(). Signed-off-by: Jens Axboe diff --git a/block/partition-generic.c b/block/partition-generic.c index 789cdea..ae95ee6 100644 --- a/block/partition-generic.c +++ b/block/partition-generic.c @@ -257,6 +257,7 @@ void delete_partition(struct gendisk *disk, int partno) hd_struct_put(part); } +EXPORT_SYMBOL(delete_partition); static ssize_t whole_disk_show(struct device *dev, struct device_attribute *attr, char *buf) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index ee13a82..fe5f640 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1044,12 +1044,29 @@ static int loop_clr_fd(struct loop_device *lo) lo->lo_state = Lo_unbound; /* This is safe: open() is still holding a reference. */ module_put(THIS_MODULE); - if (lo->lo_flags & LO_FLAGS_PARTSCAN && bdev) - ioctl_by_bdev(bdev, BLKRRPART, 0); lo->lo_flags = 0; if (!part_shift) lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN; mutex_unlock(&lo->lo_ctl_mutex); + + /* + * Remove all partitions, since BLKRRPART won't remove user + * added partitions when max_part=0 + */ + if (bdev) { + struct disk_part_iter piter; + struct hd_struct *part; + + mutex_lock_nested(&bdev->bd_mutex, 1); + invalidate_partition(bdev->bd_disk, 0); + disk_part_iter_init(&piter, bdev->bd_disk, + DISK_PITER_INCL_EMPTY); + while ((part = disk_part_iter_next(&piter))) + delete_partition(bdev->bd_disk, part->partno); + disk_part_iter_exit(&piter); + mutex_unlock(&bdev->bd_mutex); + } + /* * Need not hold lo_ctl_mutex to fput backing file. * Calling fput holding lo_ctl_mutex triggers a circular -- Jens Axboe From axboe@kernel.dk Tue Apr 2 02:30:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D08697F6B for ; Tue, 2 Apr 2013 02:30:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2578FAC005 for ; Tue, 2 Apr 2013 00:30:40 -0700 (PDT) X-ASG-Debug-ID: 1364887838-04cbb01fb710ca60001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id EigroOSVkZEjt7Ev (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 02 Apr 2013 00:30:39 -0700 (PDT) X-Barracuda-Envelope-From: axboe@kernel.dk X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from kernel.dk ([54.225.238.116]) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1UMvfw-0004Y4-R8; Tue, 02 Apr 2013 07:30:36 +0000 Received: from localhost (87-104-106-3-dynamic-customer.profibernet.dk [87.104.106.3]) by kernel.dk (Postfix) with ESMTPA id 1A62620C47; Tue, 2 Apr 2013 07:30:35 +0000 (UTC) Date: Tue, 2 Apr 2013 09:30:35 +0200 From: Jens Axboe To: Dave Chinner Cc: CAI Qian , xfs@oss.sgi.com, LKML Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Message-ID: <20130402073035.GD3670@kernel.dk> X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] References: <1462091996.435156.1364882416199.JavaMail.root@redhat.com> <247719576.438259.1364882929749.JavaMail.root@redhat.com> <20130402070537.GP6369@dastard> <20130402071937.GC3670@kernel.dk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130402071937.GC3670@kernel.dk> X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1364887838 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126940 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Tue, Apr 02 2013, Jens Axboe wrote: > On Tue, Apr 02 2013, Dave Chinner wrote: > > [Added jens Axboe to CC] > > > > On Tue, Apr 02, 2013 at 02:08:49AM -0400, CAI Qian wrote: > > > Saw on almost all the servers range from x64, ppc64 and s390x with kernel > > > 3.9-rc5 and xfsprogs-3.1.10. Never caught this in 3.9-rc4, so looks like > > > something new broke this. Log is here with sysrq debug info. > > > http://people.redhat.com/qcai/stable/log > > CAI Qian, can you try and back the below out and test again? Nevermind, it's clearly that one. The below should improve the situation, but it's not pretty. A better fix would be to allow auto-deletion even if PART_NO_SCAN is set. diff --git a/drivers/block/loop.c b/drivers/block/loop.c index fe5f640..d6c5764 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1057,14 +1057,15 @@ static int loop_clr_fd(struct loop_device *lo) struct disk_part_iter piter; struct hd_struct *part; - mutex_lock_nested(&bdev->bd_mutex, 1); - invalidate_partition(bdev->bd_disk, 0); - disk_part_iter_init(&piter, bdev->bd_disk, - DISK_PITER_INCL_EMPTY); - while ((part = disk_part_iter_next(&piter))) - delete_partition(bdev->bd_disk, part->partno); - disk_part_iter_exit(&piter); - mutex_unlock(&bdev->bd_mutex); + if (mutex_trylock(&bdev->bd_mutex, 1)) + invalidate_partition(bdev->bd_disk, 0); + disk_part_iter_init(&piter, bdev->bd_disk, + DISK_PITER_INCL_EMPTY); + while ((part = disk_part_iter_next(&piter))) + delete_partition(bdev->bd_disk, part->partno); + disk_part_iter_exit(&piter); + mutex_unlock(&bdev->bd_mutex); + } } /* -- Jens Axboe From qcai@redhat.com Tue Apr 2 03:39:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0A4EB7F6A for ; Tue, 2 Apr 2013 03:39:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 934C5AC002 for ; Tue, 2 Apr 2013 01:39:17 -0700 (PDT) X-ASG-Debug-ID: 1364891955-04bdf0542d10a1f0001-NocioJ Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id 2uXj137Luvso64Dh for ; Tue, 02 Apr 2013 01:39:16 -0700 (PDT) X-Barracuda-Envelope-From: qcai@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 r328d7O9019619; Tue, 2 Apr 2013 04:39:08 -0400 Date: Tue, 2 Apr 2013 04:39:07 -0400 (EDT) From: CAI Qian To: Jens Axboe Cc: Dave Chinner , xfs@oss.sgi.com, LKML Message-ID: <14055702.547701.1364891947331.JavaMail.root@redhat.com> In-Reply-To: <20130402073035.GD3670@kernel.dk> References: <1462091996.435156.1364882416199.JavaMail.root@redhat.com> <247719576.438259.1364882929749.JavaMail.root@redhat.com> <20130402070537.GP6369@dastard> <20130402071937.GC3670@kernel.dk> <20130402073035.GD3670@kernel.dk> Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.5.82.11] X-Mailer: Zimbra 8.0.3_GA_5664 (ZimbraWebClient - FF19 (Linux)/8.0.3_GA_5664) Thread-Topic: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Thread-Index: lwwsQD9i1uXlfS7RBXRI8uYb88Y7ZQ== X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1364891956 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > From: "Jens Axboe" > To: "Dave Chinner" > Cc: "CAI Qian" , xfs@oss.sgi.com, "LKML" > Sent: Tuesday, April 2, 2013 3:30:35 PM > Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 runnin= g xfstests case #78] >=20 > On Tue, Apr 02 2013, Jens Axboe wrote: > > On Tue, Apr 02 2013, Dave Chinner wrote: > > > [Added jens Axboe to CC] > > >=20 > > > On Tue, Apr 02, 2013 at 02:08:49AM -0400, CAI Qian wrote: > > > > Saw on almost all the servers range from x64, ppc64 and s390x with > > > > kernel > > > > 3.9-rc5 and xfsprogs-3.1.10. Never caught this in 3.9-rc4, so looks > > > > like > > > > something new broke this. Log is here with sysrq debug info. > > > > http://people.redhat.com/qcai/stable/log > >=20 > > CAI Qian, can you try and back the below out and test again? >=20 > Nevermind, it's clearly that one. The below should improve the > situation, but it's not pretty. A better fix would be to allow > auto-deletion even if PART_NO_SCAN is set. Jens, when compiled the mainline (up to fefcdbe) with this patch, it error-ed out, drivers/block/loop.c: In function =E2=80=98loop_clr_fd=E2=80=99: drivers/block/loop.c:1067:3: error: too many arguments to function =E2=80= =98mutex_trylock=E2=80=99 In file included from include/linux/notifier.h:13:0, from include/linux/memory_hotplug.h:6, from include/linux/mmzone.h:771, from include/linux/gfp.h:4, from include/linux/kmod.h:22, from include/linux/module.h:13, from drivers/block/loop.c:52: include/linux/mutex.h:168:12: note: declared here drivers/block/loop.c: At top level: drivers/block/loop.c:1084:2: warning: data definition has no type or storag= e class [enabled by default] drivers/block/loop.c:1084:2: warning: type defaults to =E2=80=98int=E2=80= =99 in declaration of =E2=80=98fput=E2=80=99 [-Wimplicit-int] drivers/block/loop.c:1084:2: warning: parameter names (without types) in fu= nction declaration [enabled by default] drivers/block/loop.c:1084:2: error: conflicting types for =E2=80=98fput=E2= =80=99 In file included from drivers/block/loop.c:56:0: include/linux/file.h:14:13: note: previous declaration of =E2=80=98fput=E2= =80=99 was here drivers/block/loop.c:1085:2: error: expected identifier or =E2=80=98(=E2=80= =99 before =E2=80=98return=E2=80=99 drivers/block/loop.c:1086:1: error: expected identifier or =E2=80=98(=E2=80= =99 before =E2=80=98}=E2=80=99 token CC crypto/gf128mul.o CC lib/sort.o drivers/block/loop.c: In function =E2=80=98loop_clr_fd=E2=80=99: drivers/block/loop.c:1076:2: warning: control reaches end of non-void funct= ion [-Wreturn-type] CC lib/parser.o CC [M] sound/pci/atiixp.o make[2]: *** [drivers/block/loop.o] Error 1 CAI Qian >=20 > diff --git a/drivers/block/loop.c b/drivers/block/loop.c > index fe5f640..d6c5764 100644 > --- a/drivers/block/loop.c > +++ b/drivers/block/loop.c > @@ -1057,14 +1057,15 @@ static int loop_clr_fd(struct loop_device *lo) > =09=09struct disk_part_iter piter; > =09=09struct hd_struct *part; > =20 > -=09=09mutex_lock_nested(&bdev->bd_mutex, 1); > -=09=09invalidate_partition(bdev->bd_disk, 0); > -=09=09disk_part_iter_init(&piter, bdev->bd_disk, > -=09=09=09=09=09DISK_PITER_INCL_EMPTY); > -=09=09while ((part =3D disk_part_iter_next(&piter))) > -=09=09=09delete_partition(bdev->bd_disk, part->partno); > -=09=09disk_part_iter_exit(&piter); > -=09=09mutex_unlock(&bdev->bd_mutex); > +=09=09if (mutex_trylock(&bdev->bd_mutex, 1)) > +=09=09=09invalidate_partition(bdev->bd_disk, 0); > +=09=09=09disk_part_iter_init(&piter, bdev->bd_disk, > +=09=09=09=09=09=09DISK_PITER_INCL_EMPTY); > +=09=09=09while ((part =3D disk_part_iter_next(&piter))) > +=09=09=09=09delete_partition(bdev->bd_disk, part->partno); > +=09=09=09disk_part_iter_exit(&piter); > +=09=09=09mutex_unlock(&bdev->bd_mutex); > +=09=09} > =09} > =20 > =09/* >=20 > -- > Jens Axboe >=20 >=20 From axboe@kernel.dk Tue Apr 2 04:00:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 02F837F6B for ; Tue, 2 Apr 2013 04:00:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D9ADE8F804B for ; Tue, 2 Apr 2013 02:00:51 -0700 (PDT) X-ASG-Debug-ID: 1364893250-04cbb01fb9113670001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id F5p0R1RXLMiZ84oI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 02 Apr 2013 02:00:50 -0700 (PDT) X-Barracuda-Envelope-From: axboe@kernel.dk X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from kernel.dk ([54.225.238.116]) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1UMx5E-0001M0-So; Tue, 02 Apr 2013 09:00:49 +0000 Received: from localhost (unknown [87.104.106.3]) by kernel.dk (Postfix) with ESMTPA id 0E86E20CA1; Tue, 2 Apr 2013 09:00:47 +0000 (UTC) Date: Tue, 2 Apr 2013 11:00:47 +0200 From: Jens Axboe To: CAI Qian Cc: Dave Chinner , xfs@oss.sgi.com, LKML Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Message-ID: <20130402090047.GF3670@kernel.dk> X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] References: <1462091996.435156.1364882416199.JavaMail.root@redhat.com> <247719576.438259.1364882929749.JavaMail.root@redhat.com> <20130402070537.GP6369@dastard> <20130402071937.GC3670@kernel.dk> <20130402073035.GD3670@kernel.dk> <14055702.547701.1364891947331.JavaMail.root@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <14055702.547701.1364891947331.JavaMail.root@redhat.com> X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1364893250 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126946 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 02 2013, CAI Qian wrote: > > > ----- Original Message ----- > > From: "Jens Axboe" > > To: "Dave Chinner" > > Cc: "CAI Qian" , xfs@oss.sgi.com, "LKML" > > Sent: Tuesday, April 2, 2013 3:30:35 PM > > Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] > > > > On Tue, Apr 02 2013, Jens Axboe wrote: > > > On Tue, Apr 02 2013, Dave Chinner wrote: > > > > [Added jens Axboe to CC] > > > > > > > > On Tue, Apr 02, 2013 at 02:08:49AM -0400, CAI Qian wrote: > > > > > Saw on almost all the servers range from x64, ppc64 and s390x with > > > > > kernel > > > > > 3.9-rc5 and xfsprogs-3.1.10. Never caught this in 3.9-rc4, so looks > > > > > like > > > > > something new broke this. Log is here with sysrq debug info. > > > > > http://people.redhat.com/qcai/stable/log > > > > > > CAI Qian, can you try and back the below out and test again? > > > > Nevermind, it's clearly that one. The below should improve the > > situation, but it's not pretty. A better fix would be to allow > > auto-deletion even if PART_NO_SCAN is set. > Jens, when compiled the mainline (up to fefcdbe) with this patch, > it error-ed out, Looks like I sent the wrong one, updated below. diff --git a/drivers/block/loop.c b/drivers/block/loop.c index fe5f640..faa3afa 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1057,14 +1057,15 @@ static int loop_clr_fd(struct loop_device *lo) struct disk_part_iter piter; struct hd_struct *part; - mutex_lock_nested(&bdev->bd_mutex, 1); - invalidate_partition(bdev->bd_disk, 0); - disk_part_iter_init(&piter, bdev->bd_disk, - DISK_PITER_INCL_EMPTY); - while ((part = disk_part_iter_next(&piter))) - delete_partition(bdev->bd_disk, part->partno); - disk_part_iter_exit(&piter); - mutex_unlock(&bdev->bd_mutex); + if (mutex_trylock(&bdev->bd_mutex)) { + invalidate_partition(bdev->bd_disk, 0); + disk_part_iter_init(&piter, bdev->bd_disk, + DISK_PITER_INCL_EMPTY); + while ((part = disk_part_iter_next(&piter))) + delete_partition(bdev->bd_disk, part->partno); + disk_part_iter_exit(&piter); + mutex_unlock(&bdev->bd_mutex); + } } /* -- Jens Axboe From qcai@redhat.com Tue Apr 2 04:31:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9AFB87F72 for ; Tue, 2 Apr 2013 04:31:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7B6A930406A for ; Tue, 2 Apr 2013 02:31:09 -0700 (PDT) X-ASG-Debug-ID: 1364895068-04cb6c1e79113610001-NocioJ Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id Or4BlyxSZk1YIl9b for ; Tue, 02 Apr 2013 02:31:08 -0700 (PDT) X-Barracuda-Envelope-From: qcai@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 r329V63b029058; Tue, 2 Apr 2013 05:31:06 -0400 Date: Tue, 2 Apr 2013 05:31:06 -0400 (EDT) From: CAI Qian To: Jens Axboe Cc: Dave Chinner , xfs@oss.sgi.com, LKML Message-ID: <985125161.581860.1364895066584.JavaMail.root@redhat.com> In-Reply-To: <20130402090047.GF3670@kernel.dk> References: <1462091996.435156.1364882416199.JavaMail.root@redhat.com> <247719576.438259.1364882929749.JavaMail.root@redhat.com> <20130402070537.GP6369@dastard> <20130402071937.GC3670@kernel.dk> <20130402073035.GD3670@kernel.dk> <14055702.547701.1364891947331.JavaMail.root@redhat.com> <20130402090047.GF3670@kernel.dk> Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.5.82.11] X-Mailer: Zimbra 8.0.3_GA_5664 (ZimbraWebClient - FF19 (Linux)/8.0.3_GA_5664) Thread-Topic: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Thread-Index: VFaXVt88xXrJyY97wdDxyGpExk9LwQ== X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1364895068 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126948 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > From: "Jens Axboe" > To: "CAI Qian" > Cc: "Dave Chinner" , xfs@oss.sgi.com, "LKML" > Sent: Tuesday, April 2, 2013 5:00:47 PM > Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] > > On Tue, Apr 02 2013, CAI Qian wrote: > > > > > > ----- Original Message ----- > > > From: "Jens Axboe" > > > To: "Dave Chinner" > > > Cc: "CAI Qian" , xfs@oss.sgi.com, "LKML" > > > > > > Sent: Tuesday, April 2, 2013 3:30:35 PM > > > Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 > > > running xfstests case #78] > > > > > > On Tue, Apr 02 2013, Jens Axboe wrote: > > > > On Tue, Apr 02 2013, Dave Chinner wrote: > > > > > [Added jens Axboe to CC] > > > > > > > > > > On Tue, Apr 02, 2013 at 02:08:49AM -0400, CAI Qian wrote: > > > > > > Saw on almost all the servers range from x64, ppc64 and s390x with > > > > > > kernel > > > > > > 3.9-rc5 and xfsprogs-3.1.10. Never caught this in 3.9-rc4, so looks > > > > > > like > > > > > > something new broke this. Log is here with sysrq debug info. > > > > > > http://people.redhat.com/qcai/stable/log > > > > > > > > CAI Qian, can you try and back the below out and test again? > > > > > > Nevermind, it's clearly that one. The below should improve the > > > situation, but it's not pretty. A better fix would be to allow > > > auto-deletion even if PART_NO_SCAN is set. > > Jens, when compiled the mainline (up to fefcdbe) with this patch, > > it error-ed out, > > Looks like I sent the wrong one, updated below. The patch works well. Thanks! CAI Qian > > diff --git a/drivers/block/loop.c b/drivers/block/loop.c > index fe5f640..faa3afa 100644 > --- a/drivers/block/loop.c > +++ b/drivers/block/loop.c > @@ -1057,14 +1057,15 @@ static int loop_clr_fd(struct loop_device *lo) > struct disk_part_iter piter; > struct hd_struct *part; > > - mutex_lock_nested(&bdev->bd_mutex, 1); > - invalidate_partition(bdev->bd_disk, 0); > - disk_part_iter_init(&piter, bdev->bd_disk, > - DISK_PITER_INCL_EMPTY); > - while ((part = disk_part_iter_next(&piter))) > - delete_partition(bdev->bd_disk, part->partno); > - disk_part_iter_exit(&piter); > - mutex_unlock(&bdev->bd_mutex); > + if (mutex_trylock(&bdev->bd_mutex)) { > + invalidate_partition(bdev->bd_disk, 0); > + disk_part_iter_init(&piter, bdev->bd_disk, > + DISK_PITER_INCL_EMPTY); > + while ((part = disk_part_iter_next(&piter))) > + delete_partition(bdev->bd_disk, part->partno); > + disk_part_iter_exit(&piter); > + mutex_unlock(&bdev->bd_mutex); > + } > } > > /* > > -- > Jens Axboe > > From axboe@kernel.dk Tue Apr 2 04:48:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0CCD57F72 for ; Tue, 2 Apr 2013 04:48:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F0F6A8F8050 for ; Tue, 2 Apr 2013 02:48:51 -0700 (PDT) X-ASG-Debug-ID: 1364896116-04cbb01fb8118300001-NocioJ Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by cuda.sgi.com with ESMTP id euDKnocIpwFDRZJ8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 02 Apr 2013 02:48:37 -0700 (PDT) X-Barracuda-Envelope-From: axboe@kernel.dk X-Barracuda-Apparent-Source-IP: 205.233.59.134 Received: from kernel.dk ([54.225.238.116]) by merlin.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1UMxpU-0000fb-Ab; Tue, 02 Apr 2013 09:48:36 +0000 Received: from localhost (87-104-106-3-dynamic-customer.profibernet.dk [87.104.106.3]) by kernel.dk (Postfix) with ESMTPA id C487320C9B; Tue, 2 Apr 2013 09:48:35 +0000 (UTC) Date: Tue, 2 Apr 2013 11:48:34 +0200 From: Jens Axboe To: CAI Qian Cc: Dave Chinner , xfs@oss.sgi.com, LKML , psusi@ubuntu.com Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Message-ID: <20130402094834.GA4667@kernel.dk> X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] References: <1462091996.435156.1364882416199.JavaMail.root@redhat.com> <247719576.438259.1364882929749.JavaMail.root@redhat.com> <20130402070537.GP6369@dastard> <20130402071937.GC3670@kernel.dk> <20130402073035.GD3670@kernel.dk> <14055702.547701.1364891947331.JavaMail.root@redhat.com> <20130402090047.GF3670@kernel.dk> <985125161.581860.1364895066584.JavaMail.root@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <985125161.581860.1364895066584.JavaMail.root@redhat.com> X-Barracuda-Connect: merlin.infradead.org[205.233.59.134] X-Barracuda-Start-Time: 1364896117 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126950 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 02 2013, CAI Qian wrote: > > > ----- Original Message ----- > > From: "Jens Axboe" > > To: "CAI Qian" > > Cc: "Dave Chinner" , xfs@oss.sgi.com, "LKML" > > Sent: Tuesday, April 2, 2013 5:00:47 PM > > Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] > > > > On Tue, Apr 02 2013, CAI Qian wrote: > > > > > > > > > ----- Original Message ----- > > > > From: "Jens Axboe" > > > > To: "Dave Chinner" > > > > Cc: "CAI Qian" , xfs@oss.sgi.com, "LKML" > > > > > > > > Sent: Tuesday, April 2, 2013 3:30:35 PM > > > > Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 > > > > running xfstests case #78] > > > > > > > > On Tue, Apr 02 2013, Jens Axboe wrote: > > > > > On Tue, Apr 02 2013, Dave Chinner wrote: > > > > > > [Added jens Axboe to CC] > > > > > > > > > > > > On Tue, Apr 02, 2013 at 02:08:49AM -0400, CAI Qian wrote: > > > > > > > Saw on almost all the servers range from x64, ppc64 and s390x with > > > > > > > kernel > > > > > > > 3.9-rc5 and xfsprogs-3.1.10. Never caught this in 3.9-rc4, so looks > > > > > > > like > > > > > > > something new broke this. Log is here with sysrq debug info. > > > > > > > http://people.redhat.com/qcai/stable/log > > > > > > > > > > CAI Qian, can you try and back the below out and test again? > > > > > > > > Nevermind, it's clearly that one. The below should improve the > > > > situation, but it's not pretty. A better fix would be to allow > > > > auto-deletion even if PART_NO_SCAN is set. > > > Jens, when compiled the mainline (up to fefcdbe) with this patch, > > > it error-ed out, > > > > Looks like I sent the wrong one, updated below. > The patch works well. Thanks! Thanks for testing! I don't particularly like this stuff in loop, though. It's quite nasty and depends on other behaviour. It would be prettier if we just had rescan_partitions() do the right thing, and only drop partitions and not rescan if NO_PART_SCAN is set. Ala the below, dropping the loop change and implementing that change in the core code. Phillip, can you check whether this does the right thing for your bug too? diff --git a/block/ioctl.c b/block/ioctl.c index a31d91d..8b78b5a 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -155,7 +155,7 @@ static int blkdev_reread_part(struct block_device *bdev) struct gendisk *disk = bdev->bd_disk; int res; - if (!disk_part_scan_enabled(disk) || bdev != bdev->bd_contains) + if (bdev != bdev->bd_contains) return -EINVAL; if (!capable(CAP_SYS_ADMIN)) return -EACCES; diff --git a/block/partition-generic.c b/block/partition-generic.c index ae95ee6..bf4bb60 100644 --- a/block/partition-generic.c +++ b/block/partition-generic.c @@ -431,6 +431,15 @@ rescan: disk->fops->revalidate_disk(disk); check_disk_size_change(disk, bdev); bdev->bd_invalidated = 0; + + /* + * If partition scanning is disabled, we are done. + */ + if (!disk_part_scan_enabled(disk)) { + kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE); + return 0; + } + if (!get_capacity(disk) || !(state = check_partition(disk, bdev))) return 0; if (IS_ERR(state)) { diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 2c127f9..8b6df76 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1057,24 +1057,6 @@ static int loop_clr_fd(struct loop_device *lo) mutex_unlock(&lo->lo_ctl_mutex); /* - * Remove all partitions, since BLKRRPART won't remove user - * added partitions when max_part=0 - */ - if (bdev) { - struct disk_part_iter piter; - struct hd_struct *part; - - mutex_lock_nested(&bdev->bd_mutex, 1); - invalidate_partition(bdev->bd_disk, 0); - disk_part_iter_init(&piter, bdev->bd_disk, - DISK_PITER_INCL_EMPTY); - while ((part = disk_part_iter_next(&piter))) - delete_partition(bdev->bd_disk, part->partno); - disk_part_iter_exit(&piter); - mutex_unlock(&bdev->bd_mutex); - } - - /* * Need not hold lo_ctl_mutex to fput backing file. * Calling fput holding lo_ctl_mutex triggers a circular * lock dependency possibility warning as fput can take -- Jens Axboe From hpj@urpla.net Tue Apr 2 05:35:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B76FC7F72 for ; Tue, 2 Apr 2013 05:35:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 50B5AAC002 for ; Tue, 2 Apr 2013 03:35:18 -0700 (PDT) X-ASG-Debug-ID: 1364898915-04bdf0542c114570001-NocioJ Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.17.10]) by cuda.sgi.com with ESMTP id yV67MgsYiTEPilVy (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 02 Apr 2013 03:35:16 -0700 (PDT) X-Barracuda-Envelope-From: hpj@urpla.net X-Barracuda-Apparent-Source-IP: 212.227.17.10 Received: from lisa (p5B2A4A0D.dip0.t-ipconnect.de [91.42.74.13]) by mrelayeu.kundenserver.de (node=mreu4) with ESMTP (Nemesis) id 0LzUbG-1UiJ460OEk-014eIr; Tue, 02 Apr 2013 12:35:04 +0200 Received: from localhost (localhost [127.0.0.1]) by tyrex.lisa.loc (Postfix) with ESMTP id 80B0E1B971B00; Tue, 2 Apr 2013 12:35:03 +0200 (CEST) X-Virus-Scanned: amavisd-new at lisa.loc Received: from tyrex.lisa.loc ([127.0.0.1]) by localhost (tyrex.lisa.loc [127.0.0.1]) (amavisd-new, port 10024) with LMTP id Q4L1j_ETCRjp; Tue, 2 Apr 2013 12:34:54 +0200 (CEST) From: Hans-Peter Jansen To: xfs@oss.sgi.com Cc: Dave Chinner , Dave Hall , stan@hardwarefreak.com Subject: Re: xfs_fsr, sunit, and swidth Date: Tue, 02 Apr 2013 12:34:53 +0200 X-ASG-Orig-Subj: Re: xfs_fsr, sunit, and swidth Message-ID: <1938112.G9K3FbV7Ck@xrated> User-Agent: KMail/4.10.1 (Linux/3.4.33-2.24-desktop; KDE/4.10.1; x86_64; ; ) In-Reply-To: <20130331012231.GJ6369@dastard> References: <5141C1FC.4060209@hardwarefreak.com> <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="iso-8859-1" X-Provags-ID: V02:K0:hfZc+w098kaXBLzp1Q4wi2Ld1b22YYF3Uy2arunAk+i YdrgYw6MoLlNK6xBE4jP7gCAw8XnurK68i0zpHOafShDcxHiO+ vfKhAr47QCN3LPBSMrgmNuLxz120skfr7BvXTA8ji+kX8K630A gkJfHgpY8uIaDYyU5fWRZrorxddb8ClbFkUhyEQAq5yYO0nsfC pUQ3F4xQ+8hmzdHJy33f37jdw8eHEHNr9Vom4aUHcuuIrDskjQ c8ettyz+6lsHtBy3LyQDNBVphh0G/cD8KSVVHKncD5tEK7pZo+ /A6U4Z1KXxX+vDL0/rwV4jxXCtUaD+brcJdrLScvzC5+EqJrQ= = X-Barracuda-Connect: moutng.kundenserver.de[212.227.17.10] X-Barracuda-Start-Time: 1364898916 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126952 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Sonntag, 31. M=E4rz 2013 12:22:31 Dave Chinner wrote: > On Fri, Mar 29, 2013 at 03:59:46PM -0400, Dave Hall wrote: > > Dave, Stan, > >=20 > > Here is the link for perf top -U: http://pastebin.com/JYLXYWki. > > The ag report is at http://pastebin.com/VzziSa4L. Interestingly, > > the backups ran fast a couple times this week. Once under 9 hours.= > > Today it looks like it's running long again. >=20 > 12.38% [xfs] [k] xfs_btree_get_rec > 11.65% [xfs] [k] _xfs_buf_find > 11.29% [xfs] [k] xfs_btree_increment > 7.88% [xfs] [k] xfs_inobt_get_rec > 5.40% [kernel] [k] intel_idle > 4.13% [xfs] [k] xfs_btree_get_block > 4.09% [xfs] [k] xfs_dialloc > 3.21% [xfs] [k] xfs_btree_readahead > 2.00% [xfs] [k] xfs_btree_rec_offset > 1.50% [xfs] [k] xfs_btree_rec_addr >=20 > Inode allocation searches, looking for an inode near to the parent > directory. >=20 > Whatthis indicates is that you have lots of sparsely allocated inode > chunks on disk. i.e. each 64 indoe chunk has some free inodes in it, > and some used inodes. This is Likely due to random removal of inodes > as you delete old backups and link counts drop to zero. Because we > only index inodes on "allocated chunks", finding a chunk that has a > free inode can be like finding a needle in a haystack. There are > heuristics used to stop searches from consuming too much CPU, but it > still can be quite slow when you repeatedly hit those paths.... >=20 > I don't have an answer that will magically speed things up for > you right now... Hmm, unfortunately, this access pattern is pretty common, at least all = "cp -al=20 & rsync" based backup solutions will suffer from it after a while. I no= ticed,=20 that the "removing old backups" part is also taking *ages* in this scen= ario.=20 I had to manually remove parts of a backup (subtrees with a few million= =20 ordinary files, massively hardlinked as usual), that took 4-5 hours for= each=20 run on a Hitachi Ultrastar 7K4000 drive. For the 8 subtrees, that final= ly took=20 one and a half day, freeing about 500 GB space. Oh well. The question is: is it (logically) possible to reorganize the fragmente= d inode=20 allocation space with a specialized tool (to be implemented), that lays= out=20 the allocation space in such a way, that matches XFS earliest "expectat= ions",=20 or does that violate some deeper FS logic, I'm not aware of?=20 I have to mention, that I haven't made any tests with other file system= s, as=20 playing games with backups ranges very low on my scale of sensible test= s, but=20 experience has shown, that XFS usually sucks less than its alternatives= , even=20 if the access pattern don't match its primary optimization domain. Hence, implementing such a tool makes sense, where "least sucking" shou= ld be=20 aimed for. Cheers, Pete From bounce@bounce.esadcursosmta.com.br Tue Apr 2 11:03:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_FONT_SIZE_LARGE, HTML_MESSAGE,LOTS_OF_MONEY,MIME_QP_LONG_LINE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9F9D37F7E for ; Tue, 2 Apr 2013 11:03:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1ECE1AC003 for ; Tue, 2 Apr 2013 09:02:58 -0700 (PDT) X-ASG-Debug-ID: 1364918572-04cbb01fb8141a90001-NocioJ Received: from mta07.esadcursosmta.com.br (mta07.esadcursosmta.com.br [177.152.247.118]) by cuda.sgi.com with ESMTP id gKfGp49AVkktOaPt for ; Tue, 02 Apr 2013 09:02:52 -0700 (PDT) X-Barracuda-Envelope-From: bounce@bounce.esadcursosmta.com.br X-Barracuda-Apparent-Source-IP: 177.152.247.118 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=akna; d=esadcursosmta.com.br; h=From:To:Subject:Date:Content-Type:MIME-Version:Reply-To:Message-ID:List-Unsubscribe; bh=qt4mYxKMB12u9pZyW3Ls8vcIGIs=; b=ZlhCRFVxgdGTOeScf0hcrZxLjHLBJArOz4F8G/SUoKxZv2eeNFar/SNbbbxyWsYe7CbjUCLdStkS G0t0Zzbftzz305R9G7JsoMeTt/tGRiNPoo+VKC5+hf+xY3maN82m Received: by mta07.esadcursosmta.com.br id hbc0j01fvtsl for ; Tue, 2 Apr 2013 13:02:47 -0300 (envelope-from ) From: =?iso-8859-1?Q?Esad_cursos?= To: Subject: =?iso-8859-1?Q?Curso_de_Gest=E3o_e_Controle_do_Or=E7amento_P=FAbl?= =?iso-8859-1?Q?ico?= Date: Tue, 2 Apr 2013 13:02:47 -0300 X-ASG-Orig-Subj: =?iso-8859-1?Q?Curso_de_Gest=E3o_e_Controle_do_Or=E7amento_P=FAbl?= =?iso-8859-1?Q?ico?= Content-Type: multipart/alternative; boundary="----=_NextPart_001" MIME-Version: 1.0 X-Priority: 3 X-Mailer: Mail Class v2.0 Reply-To: marcia@esadweb.com.br Message-ID: <201304021301510.900690001364918511@pmta01> List-Unsubscribe: , X-Trackmail: [c1334713-368722a0:permission] X-Barracuda-Connect: mta07.esadcursosmta.com.br[177.152.247.118] X-Barracuda-Start-Time: 1364918572 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.62 X-Barracuda-Spam-Status: No, SCORE=1.62 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA_HREF_WWW_MISMATCH, DKIM_SIGNED, DKIM_VERIFIED, HTML_FONT_SIZE_LARGE, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126974 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.80 BSF_SC7_SA_HREF_WWW_MISMATCH BODY: Custom Phishing Mismatch -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 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 This is a multi-part message in MIME format. ------=_NextPart_001 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Ol=E1 , este programa n=E3o permite a visualiza=E7= =E3o de mensagens formatadas (com cores, imagens e links). S= olicitamos que copie o texto abaixo e cole no campo "Endere= =E7o" do seu navegador. http://emkt.esadweb.com.br/emkt/tracer/?1,1334713,368722a0,1f5e Para garantir qu= e nossas mensagens cheguem em sua caixa de entrada, adicione= o e-mail marcia@esadweb.com.br ao seu cat=E1logo de endere=E7os= . N=E3o deseja mais receber nossas mensagens? Cancele sua i= nscri=E7=E3o aqui: http://emkt.esadweb.com.br/emkt/tracer/?9,1334713,368722a0,1f5e ------=_NextPart_001 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Problemas para visualizar a mensagem? Acesse este link.

 

3D""=

GCOP
17 a 19 de abril de 2013- Rio de Janeiro



ORÇAMENTO PÚBLICO E= RESPONSABILIDADE NA GESTÃO FISCAL


APRESENTAÇÃO

 

ema relevante na gestão pública, o curs= o de orçamento público e a responsabilidade n= a gestão é um curso abrangente e voltado para = a apresentação dos conceitos e situaç&= otilde;es envolvidas com a gestão orçament&aa= cute;ria.

Nas diversas apresentações de cursos qu= e focam a Administração Financeira e Or&ccedi= l;amentária, observamos solicitações do= s participantes para um curso, cujo programa abordasse a qu= estão orçamentária “in totum&rdqu= o;, com toda a amplitude que o tema requer.

O curso está atualizado de acordo com o Manua= l Técnico do Orçamento, o Manual de Contabili= dade Pública da Secretaria do Tesouro Nacional e a Le= i de Responsabilidade Fiscal.

OBJETIVOS = DO CURSO

O curso objetiva trazer ao participante uma vis&atild= e;o integrada do Processo Orçamentário, em qu= e os passos e os procedimentos de elaboração = integrada do PPA, do LDO e da LOA são apresentados fo= cando sua Gestão Orçamentária.<= /p>

Para os servidores não afetos diretamente= à Gestão e Execução Orça= mentário, esta será uma oportunidade ú= nica para conhecer a gestão orçamentári= a com atenção a tão importante respons= abilidade na gestão fiscal.

PÚB= LICO ALVO

= Servidores, nas três esferas de poder, em seus tr&eci= rc;s níveis. Especialmente aqueles em cujas fun&cced= il;ões diárias careçam de claros conhec= imentos do processo orçamentário.

Programa:<= /strong>

= 1.Introdução

Atividade Financeira do Estado

Planejamento Governamental

Conceitos, objetivos e princípios da LRF=

 

2.Plano Plurianual

Conceito, princípios e objetivos do PPA<= /p>

Programas

O Novo PPA 2012-2015 do governo federal;

 

3.Lei de Diretrizes Orçamentária= s

Conceito

Diretrizes orçamentárias e a LRF<= /p>

Anexo de Metas e Anexo de Riscos Fiscais

 

4.Lei Orçamentária Anual

Conceito

Orçamento-programa

Princípios orçamentários

Principais classificações orçamen= tárias

Ações orçamentárias: proje= tos, atividades e operações especiais;<= /p>

Créditos adicionais

 

5.Ciclo orçamentário

Elaboração da proposta orçament&a= acute;ria

Apreciação, aprovação, san= ção e publicação

Execução orçamentária

Controle e avaliação

 

6.Receita Pública

Conceito e classificação da receita

Etapas, estágios e regime contábil da re= ceita pública

Classificação da receita segundo a natur= eza

A receita pública e a LRF

 

7.Despesa Pública

Princípios da despesa pública

Etapas, estágios e regime contábil da re= ceita pública

Modalidades de Empenho

A qualidade do gasto

Classificação das despesas segundo a nat= ureza

A despesa pública e a LRF

Restos a Pagar e a LRF

Despesas de Exercícios Anteriores

 

Data= : 17 a 19 de abril de 2013=
Horário: 08h30 às 17h30
Carga Horária: 24 horas
Inscrição: R$ 2.270,00 para cliente ESAD = e R$ 2.670,00 para não clientes
Itens inclusos: MATERIAL DIDÁTICO COMP= LETO, COFFEE-BREAKS, ALMOÇOS, CERTIFICADO DE PARTICIP= AÇÃO (AO FINAL DO CURSO, COMPARECIMENTO INTEGR= AL).

 

 FAÇA JÀ SUA INSCRIÇ&Atild= e;O - AQUI

= Informações e reservas=
Telefax (21) 3152-8231
site: www.esadcursos.com.br e-mail: esad@esadcursos.com.b= r

Você está recebendo o informat= ivo de cursos da Esad.
Caso não queira mais receber e-mails como este, respo= nda este e-mail colocando no assunto REMOVER.

 

Ri= o de Janeiro

Av. das Américas, 500
Bloco 08 - Sala 242
Rio de Janeiro - RJ - Cep: 22.640-100
Tel/Fax: 21 3152-8231
Brasília<= /strong>

SCS Quadra 07 - Bloco A - Nº 100 - Sala 715
Shopping Pátio Brasil - Ed. Executive Tower
Brasília - DF - Cep: 70.307-901
Tel/Fax: 61 3321-6940 ou 3321-8988
 

Quero encaminhar essa mensagem para meus contatos, acesse este link.
N=E3o deseja mais receber nossas mensagens? Acesse este link.
------=_NextPart_001-- From Liz.Climo@ccdhb.org.nz Tue Apr 2 12:21:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=EMAIL_URI_PHISH,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 136777F80 for ; Tue, 2 Apr 2013 12:21:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D742230407E for ; Tue, 2 Apr 2013 10:21:45 -0700 (PDT) X-ASG-Debug-ID: 1364923303-04bdf0542a15a6a0001-w1Z2WR Received: from wn0hamail02.ad.ccdhb.health.nz (smtp4.ccdhb.org.nz [202.0.124.22]) by cuda.sgi.com with ESMTP id n697tX295CoEFheU for ; Tue, 02 Apr 2013 10:21:43 -0700 (PDT) X-Barracuda-Envelope-From: Liz.Climo@ccdhb.org.nz X-Barracuda-Apparent-Source-IP: 202.0.124.22 X-WSS-ID: 0MKN1IG-03-066-02 X-TMWD-Spam-Summary: TS=20130402172041; ID=1; SEV=2.4.5; DFV=B2013040228; IFV=NA; AIF=B2013040228; RPD=NA; ENG=NA; RPDID=NA; CAT=NONE; CON=NONE; SIG=AAABAB09AAAAAAAAAAAAAArQCLkAAH0= X-M-MSG: Received: from WN0NTEML10.AD.CCDHB.HEALTH.NZ (wn0nteml10.ad.ccdhb.health.nz [10.208.8.185]) by wn0hamail02.ad.ccdhb.health.nz (Postfix) with ESMTP id 2BA1E40581B; Wed, 3 Apr 2013 06:20:25 +1300 (NZDT) Received: from WN0NTEML11.AD.CCDHB.HEALTH.NZ ([10.208.8.186]) by WN0NTEML10.AD.CCDHB.HEALTH.NZ with Microsoft SMTPSVC(6.0.3790.4675); Wed, 3 Apr 2013 06:20:25 +1300 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----_=_NextPart_001_01CE2FC6.5CCFB5AD" Subject: Attention Date: Wed, 3 Apr 2013 06:20:24 +1300 X-ASG-Orig-Subj: Attention Message-ID: <0DC819FA838FFD4C848F40AA0D6F67F43E8DFD@WN0NTEML11.AD.CCDHB.HEALTH.NZ> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Attention Thread-Index: Ac4vxluzZ3yoARBfRACYUnMIEBzxZA== From: "Liz Climo [CCDHB]" To: service@webmail.com X-OriginalArrivalTime: 02 Apr 2013 17:20:25.0732 (UTC) FILETIME=[5D660440:01CE2FC6] X-Barracuda-Connect: smtp4.ccdhb.org.nz[202.0.124.22] X-Barracuda-Start-Time: 1364923303 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126980 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 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------_=_NextPart_001_01CE2FC6.5CCFB5AD Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Your Mailbox Has Exceeded It Storage Limit As Set By Your = Administrator,Click Below to complete update on your storage limit quota CLICK HERE =20 =20 Please note that you have within 24 hours to complete this update. because = = you might lose access to your Email Box. System Administrator=20 This email or attachment(s) may contain confidential or legally privileged = = information intended for the sole use of the addressee(s). Any use, = redistribution, disclosure, or reproduction of this message, except as = intended, is prohibited. If you received this email in error, please notify= = the sender and remove all copies of the message, including any attachments.= = Any views or opinions expressed in this email (unless otherwise stated) may= = not represent those of Capital & Coast District Health Board. http://www.ccdhb.org.nz (1C_S1) =20 ------_=_NextPart_001_01CE2FC6.5CCFB5AD Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Your Mailbox Has Exceeded It Storage Limit As Set By Your = Administrator,Click Below to complete update on your storage limit quota
 
Please note that you have within 24 hours to complete this update. = because you might lose access to your Email Box.

System Administrato= r=

This email or attachment(s) may contain confidential or legally privileged = = information intended for the sole use of the addressee(s). Any use, = redistribution, disclosure, or reproduction of this message, except as = intended, is prohibited. If you received this email in error, please notify= = the sender and remove all copies of the message, including any attachments.= = Any views or opinions expressed in this email (unless otherwise stated) may= = not represent those of Capital & Coast District Health Board.

(1C_S1)


------_=_NextPart_001_01CE2FC6.5CCFB5AD-- From xfs@tlinx.org Tue Apr 2 13:17:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 189C97F75 for ; Tue, 2 Apr 2013 13: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 DC0EF304082 for ; Tue, 2 Apr 2013 11:17:40 -0700 (PDT) X-ASG-Debug-ID: 1364926658-04bdf0542b1603d0001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id GctpTGMIyvgXOLKn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 02 Apr 2013 11:17:39 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r32IHQP4019527; Tue, 2 Apr 2013 11:17:29 -0700 Message-ID: <515B20B5.10007@tlinx.org> Date: Tue, 02 Apr 2013 11:17:25 -0700 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: Dave Chinner CC: xfs-oss Subject: Re: FYI: better workaround for updating 'df' info after 'rm' on xfs-vols References: <512C12B5.3070908@tlinx.org> <20130226045038.GN5551@dastard> X-ASG-Orig-Subj: Re: FYI: better workaround for updating 'df' info after 'rm' on xfs-vols In-Reply-To: <20130226045038.GN5551@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1364926659 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126982 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dave Chinner wrote: > On Mon, Feb 25, 2013 at 05:41:09PM -0800, Linda Walsh wrote: >> Some time ago I reported that after I deleted >> some large amount of space from one of my xfs volumes, >> 'df' still showed the original, pre-delete space, though >> 'du' only showed the expected amount. > > Sure, because unlinked files might not have their second phase of > processing (which releases the disk space) done immediately. > >> Mentioned that I had tried 'sync' to no avail, and had >> only found umount/mount to cause the figures to synchronize. > > sync doesn't cause unlinked inodes to be reclaimed and processed, > unlike remount,ro, unmount or freeze. > >> Someone suggested cat [1|3] >/proc/sys/vm/drop_caches. > > echo, not cat. It does work every time, whether you see anything > obvious or not. And if you want to reclaim inodes, then you want > "echo 2 > ..." > >> xfs_mount -o remount,ro + rw >> seemed to do the trick and cause the disk space to update without >> me having to stop processes with FD's open on the vol. > > freeze/thaw should do what you want without affecting anything > running on the fs at all. ---- It doesn't work at al. .... I've deleted off 2.4T from an 11T volume in about 15 files. du reflects the actions: Ishtar:/backups> du -sxh /backups/ 9.6T /backups/ Ishtar:/backups> df . df does not: Filesystem Size Used Avail Use% Mounted on /dev/mapper/Backups-Backups 11T 11T 14G 100% /backups Any stats you want to debug this? Ishtar:/backups> xfs_info /backups meta-data=/dev/mapper/Backups-Backups isize=256 agcount=11, agsize=268435440 blks = sectsz=512 attr=2 data = bsize=4096 blocks=2929458176, imaxpct=5 = sunit=16 swidth=96 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=32768, version=2 = sectsz=512 sunit=16 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 ---- from to extents blocks pct 1 1 861 861 0.02 2 3 1424 3587 0.10 4 7 913 3785 0.10 16 31 2 52 0.00 512 1023 2 1164 0.03 1024 2047 1 1833 0.05 2048 4095 2 5972 0.17 8192 16383 1 8688 0.24 32768 65535 2 94647 2.62 65536 131071 2 190992 5.29 262144 524287 3 1230194 34.10 1048576 2097151 1 2066103 57.27 total free extents 3214 total free blocks 3607878 ### well at 4k/block, that's 1.4T which is about right average free extent size 1122.55 xfs_db> q So why df Ishtar:/backups> df . Filesystem Size Used Avail Use% Mounted on /dev/mapper/Backups-Backups 11T 11T 14G 100% /backups Ishtar:law/test> mount -l|grep backups /dev/mapper/Backups-Backups on /backups type xfs (rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=131072k,logbsize=256k,sunit=128,swidth=768,noquota) [Backups] --- reality check -- swidth DOES mean total width, right? i.e. 768/128 = 6 disks wide which is a correct number of data disks in the array. BTW, I'm wondering if my alignment is important or correct on it: parted -l on the volume shows: Disk /dev/sdb: 12.0TB Sector size (logical/physical): 512B/512B Partition Table: gpt_sync_mbr Number Start End Size File system Name Flags 1 17.4kB 12.0TB 12.0TB backup lvm (i.e. it's not starting @ 0) sudo pvs /dev/sdb1 -o +pe_start,pvseg_start PV VG Fmt Attr PSize PFree 1st PE Start /dev/sdb1 Backups lvm2 a-- 10.91t 0 512.00k 0 sudo vgs Backups -o +vg_mda_size,vg_mda_copies,vg_extent_size VG #PV #LV #SN Attr VSize VFree VMdaSize #VMdaCps Ext Backups 1 1 0 wz--n- 10.91t 0 188.00k unmanaged 4.00m my system's xfs settings: Ishtar:/proc/sys/fs/xfs> for i in * do printf "%30s: %-10s\n" "$i" $(<"$i") done age_buffer_centisecs: 1500 error_level: 3 filestream_centisecs: 3000 inherit_noatime: 1 inherit_nodefrag: 1 inherit_nodump: 1 inherit_nosymlinks: 0 inherit_sync: 1 irix_sgid_inherit: 0 irix_symlink_mode: 0 panic_mask: 0 rotorstep: 1 speculative_prealloc_lifetime: 300 stats_clear: 0 xfsbufd_centisecs: 100 xfssyncd_centisecs: 3000 --------------- Also I don't understand. does irix_sgid_inherit mean something other than directories created in a dir with the sgid bit set also get it set with the same group ownership? As I just tested it .. made a dir set the group & chmod g+s.. made a dir in it, and it got created w/same group and w/sgid bit set. But looking at the above, I'd think the sgid bit wasn't supposed to be inherited...(I can go look it up, but just looked strange). ---- In the ~54 minutes it took to write this: > df /backups Filesystem Size Used Avail Use% Mounted on /dev/mapper/Backups-Backups 11T 11T 14G 100% /backups From rajabifarzad@yahoo.com Tue Apr 2 13:26:54 2013 Return-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=FORGED_YAHOO_RCVD, 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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9768E7F87 for ; Tue, 2 Apr 2013 13:26:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7F0BC8F8068 for ; Tue, 2 Apr 2013 11:26:54 -0700 (PDT) X-ASG-Debug-ID: 1364927211-04cb6c1e78166200001-NocioJ Received: from itresearches ([168.62.199.184]) by cuda.sgi.com with ESMTP id vmBbT1BkDQzkeoYX for ; Tue, 02 Apr 2013 11:26:51 -0700 (PDT) X-Barracuda-Envelope-From: rajabifarzad@yahoo.com X-Barracuda-Apparent-Source-IP: 168.62.199.184 Received: from crmmanager.cloudapp.net ([168.61.41.124]) by itresearches with Microsoft SMTPSVC(7.5.7601.17514); Tue, 2 Apr 2013 18:26:50 +0000 Date: Tue, 2 Apr 2013 18:26:50 +0000 X-Sender: rajabifarzad@yahoo.com Errors-To: rajabifarzad@yahoo.com To: xfs@oss.sgi.com From: Nick Robinson Reply-To: Nick Robinson Subject: A change! Message-ID: X-ASG-Orig-Subj: A change! X-Priority: 3 X-Mailer: oemPro X-Mailer-MsgId: eGZzQG9zcy5zZ2kuY29t X-Mailer-CSID: NV8xMA== MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/html; charset="UTF-8" X-OriginalArrivalTime: 02 Apr 2013 18:26:50.0681 (UTC) FILETIME=[A49CFA90:01CE2FCF] X-Barracuda-Connect: UNKNOWN[168.62.199.184] X-Barracuda-Start-Time: 1364927211 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.01 X-Barracuda-Spam-Status: No, SCORE=2.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, FORGED_YAHOO_RCVD, FORGED_YAHOO_RCVD_2, HTML_MESSAGE, MIME_HTML_ONLY, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126984 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FORGED_YAHOO_RCVD 'From' yahoo.com does not match 'Received' headers 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.41 FORGED_YAHOO_RCVD_2 'From' yahoo.com does not match 'Received' headers 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963

"There are people in the world that seem to be alive. They breathe, walk, talk and live. However, they are indeed taken prisoner by the world, kept in bondage by life and smitten by the events. For staying alive, they belittle themselves so much so that they seem to be dead. In contrast, free people may have a short life, but they live well. They breathe at will and are not subjected to the will of others - others are subjected to them."

Sometimes when a single star cleaves dark, we just notice that the dark had surrounded us completely!
Sometimes we are swamped with marsh so much as if we have forgotten flow and movement!
Sometimes our mirrors are full of dust so much that we cannot imagine a mirror without dust any more!

He is a scientist, a sportsman, an author, a poet, a photographer, and a painter; he is a commando, he is a minister, but he is none of them, it is better to say that Mostafa Chamran is a lover! He really love the way where he go. Dr. Mostafa Chamran is among those who reading about them disturbs imaginations.

Although reading the eighty eight episodes book may take eighty eight minutes at most, we maybe can evaluate the light around us by it. It is worth.
When he finished the painting, he wrote a poem of his with his handwriting under the painting: “Maybe I cannot demolish this darkness, but I distinguish between darkness and light and truth and falsehood by the same little light. The light, however little, will increase in his/her heart if someone is after it!”

This book(22) is going to show a new way to everyone who needs a change in life!

This book(22) is for those who are seeking truth and have not yet found it. It is for those who have freedom of thought and hate people depriving others of freedom, whether they are ordinary people on the streets of the city, or the great media that not only do not think freely but also do not let others think freely. And whenever truth was to be told to the public, if it was likely to shake the high palace governing public opinion, it was nipped in the bud.

The book is for those who are looking for something new to live by ... a new idea ...
Though it certainly is not so new since it has existed since the very early life of humans on the Earth, but it is new for you and me, governed by the media.

A new idea for a new lifestyle! The lifestyle seems painful at first glance, but if we look carefully, it is like a calm ocean which no light wind can disturb.


Book Details:
Book Title : 22: Not a new lifestyle For those who thirst for humanity!
Author : Mr. Nick Robinson
Paperback: 90 pages
Language: English
ISBN-10: 1481212206
ISBN-13: 978-1481212205
Product Dimensions: 9 x 6 x 0.2 inches
Shipping Weight: 6.7 ounces
Available as digital edition
Amazon paperback "6.22 $": http://www.amazon.com/dp/1481212206/
Amazon Digital Edition "2.22 $": http://www.amazon.com/dp/B00BU6KK3A

Ahlulbayt  ltd
www.shia.es
22@shia.es
+12066665252 --- From lox8096@gmail.com Tue Apr 2 13:44:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0F81C7F84 for ; Tue, 2 Apr 2013 13:44:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 924A3AC005 for ; Tue, 2 Apr 2013 11:44:18 -0700 (PDT) X-ASG-Debug-ID: 1364928256-04bdf0542b162a30001-NocioJ Received: from mail-ve0-f194.google.com (mail-ve0-f194.google.com [209.85.128.194]) by cuda.sgi.com with ESMTP id LsYvnBNiJ9pIBoZY (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 02 Apr 2013 11:44:16 -0700 (PDT) X-Barracuda-Envelope-From: lox8096@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.194 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.194] Received: by mail-ve0-f194.google.com with SMTP id ox1so229348veb.9 for ; Tue, 02 Apr 2013 11:44:15 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.194] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.194] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=taEgk6jqiLuUpkvRrQMIC1DhUfbkr0FdIdCW1+uTrg4=; b=mBl8LniFiC8EjVmaouPdxTrFpSH3xYOixMV6ekpnol/rXB8jFrAvNu+mkSuwvfSToe x7WaY5BkVo6OyIY8jTj4dy0x6qP8F+FLJBkNWug7jQ+opDqr0zL/o6BA9C61hcLINa2G 3xWUdvO2z5L1AGkZrV9SD9JNN3+M/IjRrvKwNQFf+hQLwKI1GHvLHS9SC91NknZXAjPP ypd26Y9mtI2RSVB72z2YkjkPdHIPiREjSKQ3JnllO1e0bDHLcQu3kdqxyVyG5pTbybBZ c8xdeFjH1BDSHtoCln45IJ7tfM/sdxaVvzgdjfxcJ56BtJ1vtxzY0juFWkpBttBVRpyY 0gsg== MIME-Version: 1.0 X-Received: by 10.52.26.102 with SMTP id k6mr11849741vdg.127.1364928255810; Tue, 02 Apr 2013 11:44:15 -0700 (PDT) Received: by 10.220.222.130 with HTTP; Tue, 2 Apr 2013 11:44:15 -0700 (PDT) Date: Tue, 2 Apr 2013 11:44:15 -0700 Message-ID: Subject: 88TB filesystem going off-line without warning From: L Ox X-ASG-Orig-Subj: 88TB filesystem going off-line without warning To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=20cf307f3642d4e3f304d9651f49 X-Barracuda-Connect: mail-ve0-f194.google.com[209.85.128.194] X-Barracuda-Start-Time: 1364928256 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126984 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 --20cf307f3642d4e3f304d9651f49 Content-Type: text/plain; charset=ISO-8859-1 Hi, We have a new Linux/XFS deployment (about a month old) and randomly without warning the XFS filesystem will go off-line. We are running Scientific Linux release 5.9 with the latest updates. # uname -a Linux node24 2.6.18-348.3.1.el5 #1 SMP Mon Mar 11 15:43:13 EDT 2013 x86_64 x86_64 x86_64 GNU/Linux # cat /etc/redhat-release Scientific Linux release 5.9 (Boron) Here are the errors we see in /var/log/messages after the initial off-line event: -- snip -- Apr 2 07:50:28 node24 kernel: xfs_iunlink_remove: xfs_inotobp() returned an error 22 on dm-6. Returning error. Apr 2 07:50:28 node24 kernel: xfs_inactive: xfs_ifree() returned an error = 22 on dm-6 Apr 2 07:50:28 node24 kernel: xfs_force_shutdown(dm-6,0x1) called from line 1419 of file fs/xfs/xfs_vnodeops.c. Return address = 0xffffffff8855b86b Apr 2 07:50:28 node24 kernel: Filesystem dm-6: I/O Error Detected. Shutting down filesystem: dm-6 Apr 2 07:50:28 node24 kernel: Please umount the filesystem, and rectify the problem(s) Apr 2 07:50:52 node24 kernel: Filesystem dm-6: xfs_log_force: error 5 returned. Apr 2 07:51:52 node24 last message repeated 2 times -- snip -- Here are the messages after I umount/xfs_repair/mount the filesystem: -- snip -- Apr 2 10:23:04 node24 kernel: xfs_force_shutdown(dm-6,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff8855c0fe Apr 2 10:23:07 node24 kernel: Filesystem dm-6: xfs_log_force: error 5 returned. Apr 2 10:23:07 node24 last message repeated 4 times Apr 2 10:24:08 node24 kernel: Filesystem dm-6: Disabling barriers, trial barrier write failed Apr 2 10:24:08 node24 kernel: XFS mounting filesystem dm-6 Apr 2 10:24:08 node24 kernel: Starting XFS recovery on filesystem: dm-6 (logdev: internal) Apr 2 10:24:10 node24 kernel: Ending XFS recovery on filesystem: dm-6 (logdev: internal) Apr 2 10:24:17 node24 multipathd: dm-6: umount map (uevent) Apr 2 10:58:54 node24 kernel: Filesystem dm-6: Disabling barriers, trial barrier write failed Apr 2 10:58:54 node24 kernel: XFS mounting filesystem dm-6 -- snip -- We are taking 6 devices from a SAN and using LVM to effectively create a RAID0 block devices which XFS is sitting on. We do not see any multipathd errors. I created the filesystem using this command. # mkfs.xfs -f -d su=256k,sw=6,sectsize=4096,unwritten=0 -i attr=2 -l sectsize=4096,lazy-count=1 -r extsize=4096 /dev/mapper/vol_d24-root Here are the mount options: # cat /etc/fstab | grep xfs /dev/mapper/vol_d24-root /archive/d24 xfs defaults,inode64 0 9 # mount | grep xfs /dev/mapper/vol_d24-root on /archive/d24 type xfs (rw,inode64) Here is the output of xfs_info: # xfs_info /dev/mapper/vol_d24-root meta-data=/dev/mapper/vol_d24-root isize=256 agcount=88, agsize=268435392 blks = sectsz=4096 attr=2 data = bsize=4096 blocks=23441774592, imaxpct=25 = sunit=64 swidth=384 blks, unwritten=0 naming =version 2 bsize=4096 log =internal bsize=4096 blocks=32768, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 After the initial off-line event I: - umount - ran xfs_repair (it told me to mount/umount and then re-run xfs_repair) - mount - umount - xfs_repair Here is the output of xfs_repair: -- snip -- # xfs_repair /dev/mapper/vol_d24-root Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 2acde2416940: Badness in key lookup (length) bp=(bno 14657493984, len 16384 bytes) key=(bno 14657493984, len 8192 bytes) - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 2acde2416940: Badness in key lookup (length) bp=(bno 26065183200, len 16384 bytes) key=(bno 26065183200, len 8192 bytes) - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 2acde2e17940: Badness in key lookup (length) bp=(bno 43039175488, len 16384 bytes) key=(bno 43039175488, len 8192 bytes) - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 - agno = 44 - agno = 45 - agno = 46 - agno = 47 2acde0613940: Badness in key lookup (length) bp=(bno 101051527232, len 16384 bytes) key=(bno 101051527232, len 8192 bytes) 2acde0613940: Badness in key lookup (length) bp=(bno 101081120768, len 16384 bytes) key=(bno 101081120768, len 8192 bytes) 2acde0613940: Badness in key lookup (length) bp=(bno 102336613216, len 16384 bytes) key=(bno 102336613216, len 8192 bytes) - agno = 48 - agno = 49 2acde2416940: Badness in key lookup (length) bp=(bno 107185599392, len 16384 bytes) key=(bno 107185599392, len 8192 bytes) 2acde1014940: Badness in key lookup (length) bp=(bno 107606543312, len 16384 bytes) key=(bno 107606543312, len 8192 bytes) 2acde1014940: Badness in key lookup (length) bp=(bno 107674994560, len 16384 bytes) key=(bno 107674994560, len 8192 bytes) 2acde1014940: Badness in key lookup (length) bp=(bno 107675078656, len 16384 bytes) key=(bno 107675078656, len 8192 bytes) 2acde1014940: Badness in key lookup (length) bp=(bno 107675078688, len 16384 bytes) key=(bno 107675078688, len 8192 bytes) 2acde1014940: Badness in key lookup (length) bp=(bno 107675078720, len 16384 bytes) key=(bno 107675078720, len 8192 bytes) 2acde1014940: Badness in key lookup (length) bp=(bno 107675175008, len 16384 bytes) key=(bno 107675175008, len 8192 bytes) 2acde1014940: Badness in key lookup (length) bp=(bno 107704942624, len 16384 bytes) key=(bno 107704942624, len 8192 bytes) 2acde1014940: Badness in key lookup (length) bp=(bno 107763211904, len 16384 bytes) key=(bno 107763211904, len 8192 bytes) - agno = 50 2acde1014940: Badness in key lookup (length) bp=(bno 109436122656, len 16384 bytes) key=(bno 109436122656, len 8192 bytes) 2acde2e17940: Badness in key lookup (length) bp=(bno 110466056352, len 16384 bytes) key=(bno 110466056352, len 8192 bytes) 2acde2e17940: Badness in key lookup (length) bp=(bno 110603835392, len 16384 bytes) key=(bno 110603835392, len 8192 bytes) - agno = 51 - agno = 52 - agno = 53 - agno = 54 - agno = 55 - agno = 56 - agno = 57 - agno = 58 - agno = 59 - agno = 60 - agno = 61 2acde2416940: Badness in key lookup (length) bp=(bno 132435472416, len 16384 bytes) key=(bno 132435472416, len 8192 bytes) - agno = 62 2acde2416940: Badness in key lookup (length) bp=(bno 135330780000, len 16384 bytes) key=(bno 135330780000, len 8192 bytes) 2acde2416940: Badness in key lookup (length) bp=(bno 135508074496, len 16384 bytes) key=(bno 135508074496, len 8192 bytes) 2acde2416940: Badness in key lookup (length) bp=(bno 135675982432, len 16384 bytes) key=(bno 135675982432, len 8192 bytes) - agno = 63 - agno = 64 - agno = 65 - agno = 66 - agno = 67 - agno = 68 - agno = 69 - agno = 70 - agno = 71 - agno = 72 - agno = 73 - agno = 74 - agno = 75 - agno = 76 - agno = 77 - agno = 78 - agno = 79 - agno = 80 - agno = 81 - agno = 82 - agno = 83 - agno = 84 - agno = 85 - agno = 86 - agno = 87 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 5 - agno = 6 - agno = 7 - agno = 2 - agno = 3 - agno = 8 - agno = 9 - agno = 4 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 19 - agno = 20 - agno = 18 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 - agno = 44 - agno = 45 - agno = 46 - agno = 47 - agno = 48 - agno = 49 - agno = 50 - agno = 51 - agno = 52 - agno = 53 - agno = 54 - agno = 55 - agno = 56 - agno = 57 - agno = 58 - agno = 59 - agno = 60 - agno = 61 - agno = 62 - agno = 63 - agno = 64 - agno = 65 - agno = 66 - agno = 67 - agno = 68 - agno = 69 - agno = 70 - agno = 71 - agno = 72 - agno = 73 - agno = 74 - agno = 75 - agno = 76 - agno = 77 - agno = 78 - agno = 79 - agno = 80 - agno = 81 - agno = 82 - agno = 83 - agno = 84 - agno = 85 - agno = 86 - agno = 87 Phase 5 - rebuild AG headers and trees... - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... disconnected inode 202102936036, moving to lost+found disconnected inode 215350040250, moving to lost+found disconnected inode 215350208634, moving to lost+found disconnected inode 271016406074, moving to lost+found Phase 7 - verify and correct link counts... done -- snip -- Any ideas? Thanks --20cf307f3642d4e3f304d9651f49 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hi,

We have a new Linux/XFS deployment (about a mon= th old) and randomly without warning the XFS filesystem will go off-line. W= e are running Scientific Linux release 5.9 with the latest updates.

# uname -a
Linux node24 2.6.18-348.3.1.el5 #1 SMP Mon Mar 11 15:43:13 ED= T 2013 x86_64 x86_64 x86_64 GNU/Linux

# cat /etc/redhat-release
S= cientific Linux release 5.9 (Boron)

Here are the errors we see in /v= ar/log/messages after the initial off-line event:

-- snip --

Apr=A0 2 07:50:28 node24 kernel: xfs_iunlink_remove: = xfs_inotobp()=A0 returned an error 22 on dm-6.=A0 Returning error.
Apr= =A0 2 07:50:28 node24 kernel: xfs_inactive:=A0 xfs_ifree() returned an erro= r =3D 22 on dm-6
Apr=A0 2 07:50:28 node24 kernel: xfs_force_shutdown(dm-6,0x1) called from l= ine 1419 of file fs/xfs/xfs_vnodeops.c.=A0 Return address =3D 0xffffffff885= 5b86b
Apr=A0 2 07:50:28 node24 kernel: Filesystem dm-6: I/O Error Detect= ed.=A0 Shutting down filesystem: dm-6
Apr=A0 2 07:50:28 node24 kernel: Please umount the filesystem, and rectify = the problem(s)
Apr=A0 2 07:50:52 node24 kernel: Filesystem dm-6: xfs_log= _force: error 5 returned.
Apr=A0 2 07:51:52 node24 last message repeated= 2 times

-- snip --

Here are the messages after I umount/xfs_repair/mount= the filesystem:

-- snip --

Apr=A0 2 10:23:04 node24 kernel: = xfs_force_shutdown(dm-6,0x1) called from line 420 of file fs/xfs/xfs_rw.c.= =A0 Return address =3D 0xffffffff8855c0fe
Apr=A0 2 10:23:07 node24 kernel: Filesystem dm-6: xfs_log_force: error 5 re= turned.
Apr=A0 2 10:23:07 node24 last message repeated 4 times
Apr=A0= 2 10:24:08 node24 kernel: Filesystem dm-6: Disabling barriers, trial barri= er write failed
Apr=A0 2 10:24:08 node24 kernel: XFS mounting filesystem dm-6
Apr=A0 2 1= 0:24:08 node24 kernel: Starting XFS recovery on filesystem: dm-6 (logdev: i= nternal)
Apr=A0 2 10:24:10 node24 kernel: Ending XFS recovery on filesys= tem: dm-6 (logdev: internal)
Apr=A0 2 10:24:17 node24 multipathd: dm-6: umount map (uevent)
Apr=A0 2 = 10:58:54 node24 kernel: Filesystem dm-6: Disabling barriers, trial barrier = write failed
Apr=A0 2 10:58:54 node24 kernel: XFS mounting filesystem dm= -6

-- snip --

We are taking 6 devices from a SAN and using LVM to e= ffectively create a RAID0 block devices which XFS is sitting on. We do not = see any multipathd errors.

I created the filesystem using this comma= nd.

# mkfs.xfs -f -d su=3D256k,sw=3D6,sectsize=3D4096,unwritten=3D0 -i attr= =3D2 -l sectsize=3D4096,lazy-count=3D1 -r extsize=3D4096 /dev/mapper/vol_d2= 4-root

Here are the mount options:

# cat /etc/fstab | grep xf= s
/dev/mapper/vol_d24-root=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /archive/d24= =A0=A0=A0=A0=A0=A0 xfs defaults,inode64=A0=A0=A0=A0=A0=A0=A0 0 9

# mount | grep xfs
/dev/mapper/vol_d24-root on /archive/d24 type xfs= (rw,inode64)

Here is the output of xfs_info:

# xfs_info /dev= /mapper/vol_d24-root
meta-data=3D/dev/mapper/vol_d24-root isize=3D256=A0= =A0=A0 agcount=3D88, agsize=3D268435392 blks
=A0=A0=A0=A0=A0=A0=A0=A0 =3D=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0 sectsz=3D4096=A0 attr=3D2
data=A0=A0=A0=A0 =3D=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 bsize=3D409= 6=A0=A0 blocks=3D23441774592, imaxpct=3D25
=A0=A0=A0=A0=A0=A0=A0=A0 =3D= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 sunit=3D= 64=A0=A0=A0=A0 swidth=3D384 blks, unwritten=3D0
naming=A0=A0 =3Dversion = 2=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 bsize=3D4096
log=A0=A0=A0=A0=A0 =3Dinternal=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 bs= ize=3D4096=A0=A0 blocks=3D32768, version=3D2
=A0=A0=A0=A0=A0=A0=A0=A0 = =3D=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 sects= z=3D4096=A0 sunit=3D1 blks, lazy-count=3D1
realtime =3Dnone=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 extsz=3D4096=A0=A0 blocks=3D0, r= textents=3D0

After the initial off-line event I:
- umount
- ran xfs_repair (it tol= d me to mount/umount and then re-run xfs_repair)
- mount
- umount
= - xfs_repair

Here is the output of xfs_repair:

-- snip --

# xfs_repair /dev/mapper/vol_d24-root
Phase 1 - find and verify supe= rblock...
Phase 2 - using internal log
=A0=A0=A0=A0=A0=A0=A0 - zero l= og...
=A0=A0=A0=A0=A0=A0=A0 - scan filesystem freespace and inode maps..= .
=A0=A0=A0=A0=A0=A0=A0 - found root inode chunk
Phase 3 - for each AG...
=A0=A0=A0=A0=A0=A0=A0 - scan and clear agi unli= nked lists...
=A0=A0=A0=A0=A0=A0=A0 - process known inodes and perform i= node discovery...
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 0
=A0=A0=A0=A0=A0= =A0=A0 - agno =3D 1
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 2
=A0=A0=A0=A0= =A0=A0=A0 - agno =3D 3
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 4
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 52acde2416940: Badness in key lookup (length)
bp=3D(bno 14657493984, len= 16384 bytes) key=3D(bno 14657493984, len 8192 bytes)
=A0=A0=A0=A0=A0=A0= =A0 - agno =3D 6
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 7
=A0=A0=A0=A0=A0= =A0=A0 - agno =3D 8
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 9
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 10=A0=A0=A0=A0=A0=A0=A0 - agno =3D 11
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 1= 2
2acde2416940: Badness in key lookup (length)
bp=3D(bno 26065183200,= len 16384 bytes) key=3D(bno 26065183200, len 8192 bytes)
=A0=A0=A0=A0= =A0=A0=A0 - agno =3D 13
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 14
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 15<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 16
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 17
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 18
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 19
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 20
2acde2e17940: Badness in k= ey lookup (length)
bp=3D(bno 43039175488, len 16384 bytes) key=3D(bno 43= 039175488, len 8192 bytes)
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 21
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 22<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 23
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 24
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 25
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 26
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 27
=A0=A0=A0=A0=A0=A0=A0 - ag= no =3D 28
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 29
=A0=A0=A0=A0=A0=A0=A0 -= agno =3D 30
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 31
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 32<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 33
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 34
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 35
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 36
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 37
=A0=A0=A0=A0=A0=A0=A0 - ag= no =3D 38
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 39
=A0=A0=A0=A0=A0=A0=A0 -= agno =3D 40
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 41
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 42<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 43
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 44
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 45
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 46
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 47
2acde0613940: Badness in k= ey lookup (length)
bp=3D(bno 101051527232, len 16384 bytes) key=3D(bno 1= 01051527232, len 8192 bytes)
2acde0613940: Badness in key lookup (length)
bp=3D(bno 101081120768, len= 16384 bytes) key=3D(bno 101081120768, len 8192 bytes)
2acde0613940: Bad= ness in key lookup (length)
bp=3D(bno 102336613216, len 16384 bytes) key= =3D(bno 102336613216, len 8192 bytes)
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 48
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 49<= br>2acde2416940: Badness in key lookup (length)
bp=3D(bno 107185599392, = len 16384 bytes) key=3D(bno 107185599392, len 8192 bytes)
2acde1014940: = Badness in key lookup (length)
bp=3D(bno 107606543312, len 16384 bytes) key=3D(bno 107606543312, len 8192 = bytes)
2acde1014940: Badness in key lookup (length)
bp=3D(bno 1076749= 94560, len 16384 bytes) key=3D(bno 107674994560, len 8192 bytes)
2acde10= 14940: Badness in key lookup (length)
bp=3D(bno 107675078656, len 16384 bytes) key=3D(bno 107675078656, len 8192 = bytes)
2acde1014940: Badness in key lookup (length)
bp=3D(bno 1076750= 78688, len 16384 bytes) key=3D(bno 107675078688, len 8192 bytes)
2acde10= 14940: Badness in key lookup (length)
bp=3D(bno 107675078720, len 16384 bytes) key=3D(bno 107675078720, len 8192 = bytes)
2acde1014940: Badness in key lookup (length)
bp=3D(bno 1076751= 75008, len 16384 bytes) key=3D(bno 107675175008, len 8192 bytes)
2acde10= 14940: Badness in key lookup (length)
bp=3D(bno 107704942624, len 16384 bytes) key=3D(bno 107704942624, len 8192 = bytes)
2acde1014940: Badness in key lookup (length)
bp=3D(bno 1077632= 11904, len 16384 bytes) key=3D(bno 107763211904, len 8192 bytes)
=A0=A0= =A0=A0=A0=A0=A0 - agno =3D 50
2acde1014940: Badness in key lookup (length)
bp=3D(bno 109436122656, len= 16384 bytes) key=3D(bno 109436122656, len 8192 bytes)
2acde2e17940: Bad= ness in key lookup (length)
bp=3D(bno 110466056352, len 16384 bytes) key= =3D(bno 110466056352, len 8192 bytes)
2acde2e17940: Badness in key lookup (length)
bp=3D(bno 110603835392, len= 16384 bytes) key=3D(bno 110603835392, len 8192 bytes)
=A0=A0=A0=A0=A0= =A0=A0 - agno =3D 51
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 52
=A0=A0=A0=A0= =A0=A0=A0 - agno =3D 53
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 54
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 55
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 56<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 57
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 58
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 59
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 60
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 61
2acde2416940: Badness in k= ey lookup (length)
bp=3D(bno 132435472416, len 16384 bytes) key=3D(bno 1= 32435472416, len 8192 bytes)
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 62
2acde2416940: Badness in key lookup = (length)
bp=3D(bno 135330780000, len 16384 bytes) key=3D(bno 13533078000= 0, len 8192 bytes)
2acde2416940: Badness in key lookup (length)
bp=3D= (bno 135508074496, len 16384 bytes) key=3D(bno 135508074496, len 8192 bytes= )
2acde2416940: Badness in key lookup (length)
bp=3D(bno 135675982432, len= 16384 bytes) key=3D(bno 135675982432, len 8192 bytes)
=A0=A0=A0=A0=A0= =A0=A0 - agno =3D 63
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 64
=A0=A0=A0=A0= =A0=A0=A0 - agno =3D 65
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 66
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 67
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 68<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 69
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 70
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 71
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 72
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 73
=A0=A0=A0=A0=A0=A0=A0 - ag= no =3D 74
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 75
=A0=A0=A0=A0=A0=A0=A0 -= agno =3D 76
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 77
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 78<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 79
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 80
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 81
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 82
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 83
=A0=A0=A0=A0=A0=A0=A0 - ag= no =3D 84
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 85
=A0=A0=A0=A0=A0=A0=A0 -= agno =3D 86
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 87
=A0=A0=A0=A0=A0=A0=A0 - process newl= y discovered inodes...
Phase 4 - check for duplicate blocks...
=A0=A0= =A0=A0=A0=A0=A0 - setting up duplicate extent list...
=A0=A0=A0=A0=A0=A0= =A0 - check for inodes claiming duplicate blocks...
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 0
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 1=A0=A0=A0=A0=A0=A0=A0 - agno =3D 5
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 6=A0=A0=A0=A0=A0=A0=A0 - agno =3D 7
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 2<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 3
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 8=
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 9
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 4
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 10
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 11
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 12<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 13
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 14
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 15
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 16
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 17
=A0=A0=A0=A0=A0=A0=A0 - ag= no =3D 19
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 20
=A0=A0=A0=A0=A0=A0=A0 -= agno =3D 18
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 21
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 22<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 23
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 24
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 25
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 26
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 27
=A0=A0=A0=A0=A0=A0=A0 - ag= no =3D 28
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 29
=A0=A0=A0=A0=A0=A0=A0 -= agno =3D 30
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 31
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 32<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 33
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 34
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 35
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 36
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 37
=A0=A0=A0=A0=A0=A0=A0 - ag= no =3D 38
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 39
=A0=A0=A0=A0=A0=A0=A0 -= agno =3D 40
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 41
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 42<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 43
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 44
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 45
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 46
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 47
=A0=A0=A0=A0=A0=A0=A0 - ag= no =3D 48
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 49
=A0=A0=A0=A0=A0=A0=A0 -= agno =3D 50
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 51
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 52<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 53
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 54
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 55
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 56
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 57
=A0=A0=A0=A0=A0=A0=A0 - ag= no =3D 58
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 59
=A0=A0=A0=A0=A0=A0=A0 -= agno =3D 60
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 61
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 62<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 63
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 64
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 65
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 66
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 67
=A0=A0=A0=A0=A0=A0=A0 - ag= no =3D 68
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 69
=A0=A0=A0=A0=A0=A0=A0 -= agno =3D 70
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 71
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 72<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 73
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 74
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 75
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 76
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 77
=A0=A0=A0=A0=A0=A0=A0 - ag= no =3D 78
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 79
=A0=A0=A0=A0=A0=A0=A0 -= agno =3D 80
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 81
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 82<= br>=A0=A0=A0=A0=A0=A0=A0 - agno =3D 83
=A0=A0=A0=A0=A0=A0=A0 - agno =3D = 84
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 85
=A0=A0=A0=A0=A0=A0=A0 - agno = =3D 86
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 87
Phase 5 - rebuild AG heade= rs and trees...
=A0=A0=A0=A0=A0=A0=A0 - reset superblock...
Phase 6 - check inode connectivity...
=A0=A0=A0=A0=A0=A0=A0 - resetting = contents of realtime bitmap and summary inodes
=A0=A0=A0=A0=A0=A0=A0 - t= raversing filesystem ...
=A0=A0=A0=A0=A0=A0=A0 - traversal finished ...<= br>=A0=A0=A0=A0=A0=A0=A0 - moving disconnected inodes to lost+found ...
disconnected inode 202102936036, moving to lost+found
disconnected inode= 215350040250, moving to lost+found
disconnected inode 215350208634, mov= ing to lost+found
disconnected inode 271016406074, moving to lost+found<= br> Phase 7 - verify and correct link counts...
done

-- snip --
Any ideas?

Thanks
--20cf307f3642d4e3f304d9651f49-- From xfs@tlinx.org Tue Apr 2 15:22:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DE0147F85 for ; Tue, 2 Apr 2013 15:22:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB3818F8054 for ; Tue, 2 Apr 2013 13:22:09 -0700 (PDT) X-ASG-Debug-ID: 1364934125-04cb6c1e7716ffe0001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id cZ5Vn58qt51lkwaB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 02 Apr 2013 13:22:07 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r32KM28n003226 for ; Tue, 2 Apr 2013 13:22:04 -0700 Message-ID: <515B3DE8.4000006@tlinx.org> Date: Tue, 02 Apr 2013 13:22:00 -0700 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss Subject: FYI: xfs_freeze/thaw doesn't sync free space w/df output Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: FYI: xfs_freeze/thaw doesn't sync free space w/df output Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1364934126 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 Sorry for repost, but when I went to look at my email I found the original buried several pages down in a response, and guessing that many or most people probably use threaded readers now, they'd be unlikely to see this... FWIW, 3 hours later, still hasn't sync'd automatically. Shouldn't that be a bug? -------- Original Message -------- Subject: Re: FYI: better workaround for updating 'df' info after 'rm' on xfs-vols Dave Chinner wrote: >LindaW Wrote: >> xfs_mount -o remount,ro + rw >> seemed to do the trick and cause the disk space to update without >> me having to stop processes with FD's open on the vol. > > freeze/thaw should do what you want without affecting anything > running on the fs at all. ---- It doesn't work at al. .... I've deleted off 2.4T from an 11T volume in about 15 files. du reflects the actions: Ishtar:/backups> du -sxh /backups/ 9.6T /backups/ Ishtar:/backups> df . df does not: Filesystem Size Used Avail Use% Mounted on /dev/mapper/Backups-Backups 11T 11T 14G 100% /backups Any stats you want to debug this? Ishtar:/backups> xfs_info /backups meta-data=/dev/mapper/Backups-Backups isize=256 agcount=11, agsize=268435440 blks = sectsz=512 attr=2 data = bsize=4096 blocks=2929458176, imaxpct=5 = sunit=16 swidth=96 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=32768, version=2 = sectsz=512 sunit=16 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 ---- from to extents blocks pct 1 1 861 861 0.02 2 3 1424 3587 0.10 4 7 913 3785 0.10 16 31 2 52 0.00 512 1023 2 1164 0.03 1024 2047 1 1833 0.05 2048 4095 2 5972 0.17 8192 16383 1 8688 0.24 32768 65535 2 94647 2.62 65536 131071 2 190992 5.29 262144 524287 3 1230194 34.10 1048576 2097151 1 2066103 57.27 total free extents 3214 total free blocks 3607878 ### well at 4k/block, that's 1.4T which is about right average free extent size 1122.55 xfs_db> q So why df Ishtar:/backups> df . Filesystem Size Used Avail Use% Mounted on /dev/mapper/Backups-Backups 11T 11T 14G 100% /backups Ishtar:law/test> mount -l|grep backups /dev/mapper/Backups-Backups on /backups type xfs (rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=131072k,logbsize=256k,sunit=128,swidth=768,noquota) [Backups] --- reality check -- swidth DOES mean total width, right? i.e. 768/128 = 6 disks wide which is a correct number of data disks in the array. BTW, I'm wondering if my alignment is important or correct on it: parted -l on the volume shows: Disk /dev/sdb: 12.0TB Sector size (logical/physical): 512B/512B Partition Table: gpt_sync_mbr Number Start End Size File system Name Flags 1 17.4kB 12.0TB 12.0TB backup lvm (i.e. it's not starting @ 0) sudo pvs /dev/sdb1 -o +pe_start,pvseg_start PV VG Fmt Attr PSize PFree 1st PE Start /dev/sdb1 Backups lvm2 a-- 10.91t 0 512.00k 0 sudo vgs Backups -o +vg_mda_size,vg_mda_copies,vg_extent_size VG #PV #LV #SN Attr VSize VFree VMdaSize #VMdaCps Ext Backups 1 1 0 wz--n- 10.91t 0 188.00k unmanaged 4.00m my system's xfs settings: Ishtar:/proc/sys/fs/xfs> for i in * do printf "%30s: %-10s\n" "$i" $(<"$i") done age_buffer_centisecs: 1500 error_level: 3 filestream_centisecs: 3000 inherit_noatime: 1 inherit_nodefrag: 1 inherit_nodump: 1 inherit_nosymlinks: 0 inherit_sync: 1 irix_sgid_inherit: 0 irix_symlink_mode: 0 panic_mask: 0 rotorstep: 1 speculative_prealloc_lifetime: 300 stats_clear: 0 xfsbufd_centisecs: 100 xfssyncd_centisecs: 3000 --------------- Also I don't understand. does irix_sgid_inherit mean something other than directories created in a dir with the sgid bit set also get it set with the same group ownership? As I just tested it .. made a dir set the group & chmod g+s.. made a dir in it, and it got created w/same group and w/sgid bit set. But looking at the above, I'd think the sgid bit wasn't supposed to be inherited...(I can go look it up, but just looked strange). ---- In the ~54 minutes it took to write this: > df /backups Filesystem Size Used Avail Use% Mounted on /dev/mapper/Backups-Backups 11T 11T 14G 100% /backups _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs From xfs@tlinx.org Tue Apr 2 15:28:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BC8297F85 for ; Tue, 2 Apr 2013 15:28:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9B2A1304077 for ; Tue, 2 Apr 2013 13:27:58 -0700 (PDT) X-ASG-Debug-ID: 1364934473-04cbb01fb91717a0001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id mC8oxiNpPYqTWpo2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 02 Apr 2013 13:27:56 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r32KRpHd004324 for ; Tue, 2 Apr 2013 13:27:53 -0700 Message-ID: <515B3F45.8070504@tlinx.org> Date: Tue, 02 Apr 2013 13:27:49 -0700 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss Subject: General Question... I note many emails about BTRFS ... is it related to XFS? Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: General Question... I note many emails about BTRFS ... is it related to XFS? Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1364934475 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I have no issues with the messages related to BTRFS on the list, but it did stimulate my curiosity -- what's the relationship betweeen BTRFS and XFS? * Just using a similar test suite? * Code sharing? * Feature sharing/overlap? * merging? * Nothing, they are just crowding the list..? ;-) * Other? Or are we allowed to know? *curious one*....;-) From bpm@sgi.com Tue Apr 2 15:35:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DEC827F8A for ; Tue, 2 Apr 2013 15:34:59 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42BFAAC003; Tue, 2 Apr 2013 13:34:59 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 01A1B500B4B; Tue, 2 Apr 2013 15:34:58 -0500 (CDT) Date: Tue, 2 Apr 2013 15:34:58 -0500 From: Ben Myers To: Linda Walsh Cc: xfs-oss Subject: Re: General Question... I note many emails about BTRFS ... is it related to XFS? Message-ID: <20130402203458.GY22182@sgi.com> References: <515B3F45.8070504@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515B3F45.8070504@tlinx.org> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Linda, On Tue, Apr 02, 2013 at 01:27:49PM -0700, Linda Walsh wrote: > I have no issues with the messages related to BTRFS on the list, but it > did stimulate my curiosity -- what's the relationship betweeen BTRFS and XFS? > > * Just using a similar test suite? We're all sharing the test suite. ;) Regards, Ben From rwheeler@redhat.com Tue Apr 2 15:37:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4D34D7F8D for ; Tue, 2 Apr 2013 15:37:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D27D7AC005 for ; Tue, 2 Apr 2013 13:37:30 -0700 (PDT) X-ASG-Debug-ID: 1364935049-04cb6c1e7a1714e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0KdBHFxdOF6hAdxX; Tue, 02 Apr 2013 13:37:29 -0700 (PDT) X-Barracuda-Envelope-From: rwheeler@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r32KbTsK013552 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Apr 2013 16:37:29 -0400 Received: from tunkums.home (ovpn-113-54.phx2.redhat.com [10.3.113.54]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r32KbSB1010398; Tue, 2 Apr 2013 16:37:28 -0400 Message-ID: <515B4188.90205@redhat.com> Date: Tue, 02 Apr 2013 16:37:28 -0400 From: Ric Wheeler User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130311 Thunderbird/17.0.4 MIME-Version: 1.0 To: Ben Myers CC: Linda Walsh , xfs-oss Subject: Re: General Question... I note many emails about BTRFS ... is it related to XFS? References: <515B3F45.8070504@tlinx.org> <20130402203458.GY22182@sgi.com> X-ASG-Orig-Subj: Re: General Question... I note many emails about BTRFS ... is it related to XFS? In-Reply-To: <20130402203458.GY22182@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1364935049 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/02/2013 04:34 PM, Ben Myers wrote: > Hey Linda, > > On Tue, Apr 02, 2013 at 01:27:49PM -0700, Linda Walsh wrote: >> I have no issues with the messages related to BTRFS on the list, but it >> did stimulate my curiosity -- what's the relationship betweeen BTRFS and XFS? >> >> * Just using a similar test suite? > We're all sharing the test suite. ;) > > Regards, > Ben > And some of the developers are lucky enough to be shared between the two projects as well ;) Ric From xfs@tlinx.org Tue Apr 2 15:55:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 812627F8E for ; Tue, 2 Apr 2013 15:55:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 58983304032 for ; Tue, 2 Apr 2013 13:55:38 -0700 (PDT) X-ASG-Debug-ID: 1364936134-04bdf0542d16dbc0001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id fMUEUfjJMkut1jaU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 02 Apr 2013 13:55:36 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r32KtVd8008851 for ; Tue, 2 Apr 2013 13:55:34 -0700 Message-ID: <515B45C2.50203@tlinx.org> Date: Tue, 02 Apr 2013 13:55:30 -0700 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss Subject: Re: General Question... I note many emails about BTRFS ... is it related to XFS? References: <515B3F45.8070504@tlinx.org> <20130402203458.GY22182@sgi.com> <515B4188.90205@redhat.com> X-ASG-Orig-Subj: Re: General Question... I note many emails about BTRFS ... is it related to XFS? In-Reply-To: <515B4188.90205@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1364936135 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126994 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Ric Wheeler wrote: > On 04/02/2013 04:34 PM, Ben Myers wrote: >> Hey Linda, >> >> On Tue, Apr 02, 2013 at 01:27:49PM -0700, Linda Walsh wrote: >>> I have no issues with the messages related to BTRFS on the list, but it >>> did stimulate my curiosity -- what's the relationship betweeen BTRFS >>> and XFS? >>> >>> * Just using a similar test suite? >> We're all sharing the test suite. ;) ---- Excellent way to leverage a huge body of existing work... I'm sure it will flush out more errors in XFS as well, especially in the more BTRFS specific tests... XFS will just have to add some more features to fully pass the test suite... ;-) BtB, having BTRFS pass the XFS test suite would certainly make me more confident about trying it out and using it for production work...but I suppose that's part of the intent! From bpm@sgi.com Tue Apr 2 17:44:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7FECD7F8E for ; Tue, 2 Apr 2013 17:44:37 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 00D55AC003; Tue, 2 Apr 2013 15:44:33 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 8CB27500B4C; Tue, 2 Apr 2013 17:44:33 -0500 (CDT) Date: Tue, 2 Apr 2013 17:44:33 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 09/21] xfs: add version 3 inode format with CRCs Message-ID: <20130402224433.GZ22182@sgi.com> References: <1363091454-8852-1-git-send-email-david@fromorbit.com> <1363091454-8852-10-git-send-email-david@fromorbit.com> <20130314160321.GV22182@sgi.com> <20130315011104.GD21651@dastard> <20130326225600.GL6369@dastard> <20130327005307.GK30652@sgi.com> <20130327014828.GN6369@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130327014828.GN6369@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Dave, On Wed, Mar 27, 2013 at 12:48:28PM +1100, Dave Chinner wrote: > On Tue, Mar 26, 2013 at 07:53:07PM -0500, Ben Myers wrote: > > On Wed, Mar 27, 2013 at 09:56:00AM +1100, Dave Chinner wrote: > > > On Fri, Mar 15, 2013 at 12:11:04PM +1100, Dave Chinner wrote: > > > > On Thu, Mar 14, 2013 at 11:03:21AM -0500, Ben Myers wrote: > > > > > On Tue, Mar 12, 2013 at 11:30:42PM +1100, Dave Chinner wrote: > > > > > > xfs_buf_zero(fbuf, 0, ninodes << mp->m_sb.sb_inodelog); > > > > > > for (i = 0; i < ninodes; i++) { > > > > > > int ioffset = i << mp->m_sb.sb_inodelog; > > > > > > - uint isize = sizeof(struct xfs_dinode); > > > > > > + uint isize = xfs_dinode_size(version); > > > > > > > > > > > > free = xfs_make_iptr(mp, fbuf, i); > > > > > > free->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); > > > > > > free->di_version = version; > > > > > > free->di_gen = cpu_to_be32(gen); > > > > > > free->di_next_unlinked = cpu_to_be32(NULLAGINO); > > > > > > + > > > > > > + if (version == 3) { > > > > > > + free->di_ino = cpu_to_be64(ino); > > > > > > + ino++; > > > > > > + uuid_copy(&free->di_uuid, &mp->m_sb.sb_uuid); > > > > > > + xfs_dinode_calc_crc(mp, free); > > > > > > + } > > > > > > + > > > > > > xfs_trans_log_buf(tp, fbuf, ioffset, ioffset + isize - 1); > > > > > > > > > > If I have it right, it's ok not to log the literal are here (even though the > > > > > crc was calculated including the literal area) because the log is protected by > > > > > its own crcs and recovery will recalculate the crc. > > > > > > > > Prior to CRCs it's OK not to log the literal areas because the > > > > contents really don't matter. The entire buffer is zeroed because > > > > it's faster than zeroing individual inode cores one by one and it > > > > ensures that we can always tell a freshly allocated inode block with > > > > xfs_db because the literal areas are all zero (i.e. good for > > > > debugging). But these are conveniences, not a necessity, and hence > > > > the advantage of not logging the literal areas reduces the overhead > > > > of logging inode allocations *significantly*. > > > > > > > > > What do we have in the > > > > > literal area after log replay in that case? > > > > > > > > For non-CRC inode buffers, it doesn't matter. > > > > > > > > But you are right that it does matter for CRC enabled inode buffers > > > > as it will result in the CRC in the inode core being incorrect. I'l > > > > havea think about this - there are a couple of potential ways of > > > > solving the problem, and I need to think about them a bit first. > > > > > > Ben, FYI: I've taken the easy way out for this - log the entire > > > inode buffer rather than just the inode core. The CRC means we are > > > dependent on having all the inode logged so that seems to be the > > > simplest way to deal with this problem overall, even though it > > > increases the amount of metadata logged for inode creates > > > substantially. > > > > > > I'll address this potential performance issue in future with new > > > inode create and unlink transactions that allow us to avoid logging > > > buffers for all inode modifications. There are other good reasons > > > for doing this as well (e.g. avoid the subtly broken special > > > handling of physical inode buffer logging vs logical inode logging > > > in log recovery), so I think this is best to just take the simple > > > option here.... > > > > It seems like this is a more general problem with fresh on-disk > > structures. When we calculate crc and log only part of a buffer we are > > prone to the crc being incorrect after log replay because the unlogged > > portions of the buffer are still undefined. They aren't the 0s we > > calculated crcs with. > > But it doesn't matter for all other metadata as we don't log CRC > fields except in the inode/dquot at allocation. It is the exception > rather than the rule. > > > I have a couple suggestions: > > > > 1) We could read the undefined garbage from disk before we initialize > > the structure and then calculate the crc. That way if we log only parts > > of the result the crc would still match after a crash. > > The overhead of reading every inode cluster from disk during > allocation will drop create performance by orders of magnitude. i.e. > far worse in terms of performance than logging the entire buffer. I didn't say it was a *good* suggestion. ;) > > 2) Create a new transaction to write a known pattern over the > > entire buffer, then initialize the buffer with that pattern, > > calculate the crc, and still log only the parts of the buffer > > which were modified. In the non-crash case we still need to > > arrange for the buffer to be patterned after the log wraps, but it > > has the advantage of not having to log large structures just to > > zero them. > > We need to ensure we log the entire object if we are logging the CRC > of the object. We don't need to log the entire object if we can arrange for the contents of the buffer to be a known pattern after recovery and then calculate the CRC against that. It's just the initialization that is problematic. The rest of the time the contents are already cached anyway. > In this case, the initialisation and calculation of > the CRC needs to be atomic, so it needs to be a single transactions. I agree that the initialisation of the block and the calculation of the crc must be in the same transaction. It would need to be a new log item type that specifies a pattern (normally zero) and a length to be written to the buffer. I used the wrong terminology, as usual. > That's what logging the entire buffer does. Yep. I'm just pointing out that if logging the entire structure becomes an issue we have some other options. This could be useful for other reasons too, e.g. to prevent stale data exposure after a crash. Regards, Ben From bpm@sgi.com Tue Apr 2 17:49:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 EBEF17F95 for ; Tue, 2 Apr 2013 17:49:22 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 84E4AAC005; Tue, 2 Apr 2013 15:49:22 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 3CCCE500B4B; Tue, 2 Apr 2013 17:49:22 -0500 (CDT) Date: Tue, 2 Apr 2013 17:49:22 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 09/21] xfs: add version 3 inode format with CRCs Message-ID: <20130402224922.GA22182@sgi.com> References: <1363091454-8852-1-git-send-email-david@fromorbit.com> <1363091454-8852-10-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1363091454-8852-10-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Tue, Mar 12, 2013 at 11:30:42PM +1100, Dave Chinner wrote: > From: Christoph Hellwig > > Add a new inode version with a larger core. The primary objective is > to allow for a crc of the inode, and location information (uuid and ino) > to verify it was written in the right place. We also extend it by: > > a creation time (for Samba); > a changecount (for NFSv4); > a flush sequence (in LSN format for recovery); > an additional inode flags field; and > some additional padding. > > These additional fields are not implemented yet, but already laid > out in the structure. > > [dchinner@redhat.com] Added LSN and flags field, some factoring and rework to > capture all the necessary information in the crc calculation. > > Signed-off-by: Christoph Hellwig > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf_item.h | 4 +- > fs/xfs/xfs_dinode.h | 33 +++++++-- > fs/xfs/xfs_ialloc.c | 23 +++++- > fs/xfs/xfs_inode.c | 179 ++++++++++++++++++++++++++++++++-------------- > fs/xfs/xfs_inode.h | 26 +++++++ > fs/xfs/xfs_inode_item.c | 2 +- > fs/xfs/xfs_log_recover.c | 35 +++++++-- > fs/xfs/xfs_trans_buf.c | 5 +- > 8 files changed, 237 insertions(+), 70 deletions(-) ... > diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h > index 6b5bd17..bdc946a 100644 > --- a/fs/xfs/xfs_dinode.h > +++ b/fs/xfs/xfs_dinode.h > @@ -19,7 +19,7 @@ > #define __XFS_DINODE_H__ > > #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ > -#define XFS_DINODE_GOOD_VERSION(v) (((v) == 1 || (v) == 2)) > +#define XFS_DINODE_GOOD_VERSION(v) ((v) >= 1 && (v) <= 3) > > typedef struct xfs_timestamp { > __be32 t_sec; /* timestamp seconds */ > @@ -70,11 +70,36 @@ typedef struct xfs_dinode { > > /* di_next_unlinked is the only non-core field in the old dinode */ > __be32 di_next_unlinked;/* agi unlinked list ptr */ > -} __attribute__((packed)) xfs_dinode_t; > + > + /* start of the extended dinode, writable fields */ > + __be32 di_crc; /* CRC of the inode */ > + __be64 di_changecount; /* number of attribute changes */ > + __be64 di_lsn; /* flush sequence */ > + __be64 di_flags2; /* more random flags */ > + __u8 di_pad2[16]; /* more padding for future expansion */ Please add to the pad: (as an optimisation for the most common case, a single link) 8 bytes for a parent inode pointer 4 bytes for a name offset in the parent's data fork and 4 bytes for an allocation policy Thanks, Ben > + > + /* fields only written to during inode creation */ > + xfs_timestamp_t di_crtime; /* time created */ > + __be64 di_ino; /* inode number */ > + uuid_t di_uuid; /* UUID of the filesystem */ > + > + /* structure must be padded to 64 bit alignment */ > +} xfs_dinode_t; From sergzv_am@global.net.pk Tue Apr 2 20:03:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 EA7A57F84 for ; Tue, 2 Apr 2013 20:03:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CA2A1304081 for ; Tue, 2 Apr 2013 18:03:25 -0700 (PDT) X-ASG-Debug-ID: 1364951002-04cb6c1e79183790001-NocioJ Received: from mail2.lovelandia.ru ([91.210.87.247]) by cuda.sgi.com with ESMTP id viDj1wXf3LCWVoNp for ; Tue, 02 Apr 2013 18:03:22 -0700 (PDT) X-Barracuda-Envelope-From: sergzv_am@global.net.pk X-Barracuda-Apparent-Source-IP: 91.210.87.247 Received: from Unknown (unknown [219.156.131.93]) by mail2.lovelandia.ru (Postfix) with ESMTPA id E2F93215A5; Wed, 3 Apr 2013 05:03:17 +0400 (MSK) Message-ID: Reply-To: =?windows-1251?B?1O7w7Ojw7uLg7ejlIPDl6uvg7O3u6SDj8PPv?= =?windows-1251?B?7/s=?= From: =?windows-1251?B?1O7w7Ojw7uLg7ejlIPDl6uvg7O3u6SDj8PPv?= =?windows-1251?B?7/s=?= To: , , , Subject: =?windows-1251?B?zO7y6OLg9uj/IOgg9uXr6CDx7vLw8+Tt6Oru?= =?windows-1251?B?4iDw5err4Ozt7uPuIO7y5OXr4A==?= Date: Wed, 3 Apr 2013 03:03:17 +0200 X-ASG-Orig-Subj: =?windows-1251?B?zO7y6OLg9uj/IOgg9uXr6CDx7vLw8+Tt6Oru?= =?windows-1251?B?4iDw5err4Ozt7uPuIO7y5OXr4A==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_1303_01CE3017.CA715890" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3505.912 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3505.912 X-Barracuda-Connect: UNKNOWN[91.210.87.247] X-Barracuda-Start-Time: 1364951002 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, BSF_SC5_MJ1963, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127010 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. ------=_NextPart_000_1303_01CE3017.CA715890 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CA=CE=CD=D4=C5=D0=C5=CD=D6=C8=DF ----------- =DD=D4=D4=C5=CA=D2=C8=C2=CD=C0=DF =D0=C0=C1=CE=D2=C0 =D0=C5=CA=CB=C0=CC=CD= =CE=C3=CE =CE=D2=C4=C5=CB=C0 =C2 =CA=CE=CC=CF=C0=CD=C8=C8. =CE=F2 =F2=E5=EE=F0=E8=E8 =EA =EF=F0=E0=EA=F2=E8=EA=E5. I5 - l6 =E0=EF=F0=E5=EB=FF 20I3 =E3=EE=E4=E0, =D1=E0=ED=EA=F2-=CF=E5= =F2=E5=F0=E1=F3=F0=E3 =D6=E5=EB=FC =EA=F3=F0=F1=E0: =CF=F0=E5=E4=EE=F1=F2=E0=E2=E8=F2=FC =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FE= =EF=EE=EB=ED=FB=E9 =ED=E0=E1=EE=F0 =E8=ED=F1=F2=F0=F3=EC=E5=ED=F2=EE=E2 = =EF=EE =FD=F4=F4=E5=EA=F2=E8=E2=ED=EE=EC=F3 =F3=EF=F0=E0=E2=EB=E5=ED=E8=FE =F0=E5=EA=EB=E0=EC=ED=FB=EC =EE=F2=E4=E5=EB=EE=EC. =C0 =F2=E0=EA=E6=E5 =EF= =EE =F0=E0=F6=E8=EE=ED=E0=EB=FC=ED=EE=EC=F3 =F0=E0=F1=EF=F0=E5=E4=E5=EB=E5= =ED=E8=FE =E2=F0=E5=EC=E5=ED=E8 =F1=EE=F2=F0=F3=E4=ED=E8=EA=EE=E2, =F0=E0= =E7=E2=E8=F2=E8=FE =EC=EE=F2=E8=E2=E0=F6=E8=E8 =E8 =F1=EE=EE=F2=ED=EE=F8=E5= =ED=E8=FE =F6=E5=EB=E5=E9 =EA=EE=EC=EF=E0=ED=E8=E8 =F1 =EB=E8=F7=ED=FB=EC= =E8 =F1=EE=EE=E1=F0=E0=E6=E5=ED=E8=FF=EC=E8 =EF=EE=E4=F7=E8=ED=E5=ED=ED=FB= =F5 =EF=EE =EA=EB=FE=F7=E5=E2=FB=EC =E2=EE=EF=F0=EE=F1=E0=EC. =CA=EE=EC=F3: =D0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FF=EC, =EC=E5=ED=E5=E4=E6=E5=F0=E0=EC =EF= =EE =F0=E5=EA=EB=E0=EC=E5, =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FF=EC =F0=E5= =EA=EB=E0=EC=ED=FB=F5 =EE=F2=E4=E5=EB=EE=E2=20 =CF=EE =E2=EE=EF=F0=EE=F1=E0=EC =F3=F7=E0=F1=F2=E8=FF =E8 =F0=E5=E3=E8=F1= =F2=F0=E0=F6=E8=E8 =EE=E1=F0=E0=F9=E0=E9=F2=E5=F1=FC =EF=EE =F2=E5=EB=E5=F4= =EE=ED=F3: ( 8l2 ) 6=D7=3D2 - =CEI __ 28 =20 =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC, =CA=EE=ED=EE=E2=E0=EB=EE=E2=E0 =CE=EB=FC=E3=E0 =C8=E2=E0=ED=EE=E2=ED=E0 =EC=E5=ED=E5=E4=E6=E5=F0 =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE=E3=EE =EE= =F2=E4=E5=EB=E0 ------=_NextPart_000_1303_01CE3017.CA715890 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CA=CE=CD=D4=C5=D0=C5=CD=D6=C8=DF
-----------
 
=DD=D4=D4=C5=CA=D2=C8=C2=CD=C0=DF =D0=C0=C1=CE=D2=C0 =D0=C5=CA=CB=C0= =CC=CD=CE=C3=CE =CE=D2=C4=C5=CB=C0 =C2 =CA=CE=CC=CF=C0=CD=C8=C8.
=CE=F2= =F2=E5=EE=F0=E8=E8 =EA=20 =EF=F0=E0=EA=F2=E8=EA=E5.
 
I5 - l6=20 =E0=EF=F0=E5=EB=FF 20I3 =E3=EE=E4=E0,=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
 

=D6=E5=EB=FC =EA=F3=F0=F1=E0:
=CF=F0=E5=E4=EE=F1=F2=E0=E2=E8=F2= =FC =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FE =EF=EE=EB=ED=FB=E9 =ED=E0=E1=EE=F0= =E8=ED=F1=F2=F0=F3=EC=E5=ED=F2=EE=E2 =EF=EE=20 =FD=F4=F4=E5=EA=F2=E8=E2=ED=EE=EC=F3 =F3=EF=F0=E0=E2=EB=E5=ED=E8=FE
=F0= =E5=EA=EB=E0=EC=ED=FB=EC =EE=F2=E4=E5=EB=EE=EC. =C0 =F2=E0=EA=E6=E5 =EF=EE= =F0=E0=F6=E8=EE=ED=E0=EB=FC=ED=EE=EC=F3=20 =F0=E0=F1=EF=F0=E5=E4=E5=EB=E5=ED=E8=FE =E2=F0=E5=EC=E5=ED=E8 =F1=EE=F2=F0= =F3=E4=ED=E8=EA=EE=E2, =F0=E0=E7=E2=E8=F2=E8=FE =EC=EE=F2=E8=E2=E0=F6=E8=E8= =E8 =F1=EE=EE=F2=ED=EE=F8=E5=ED=E8=FE =F6=E5=EB=E5=E9=20 =EA=EE=EC=EF=E0=ED=E8=E8 =F1 =EB=E8=F7=ED=FB=EC=E8 =F1=EE=EE=E1=F0=E0=E6=E5= =ED=E8=FF=EC=E8 =EF=EE=E4=F7=E8=ED=E5=ED=ED=FB=F5 =EF=EE =EA=EB=FE=F7=E5=E2= =FB=EC =E2=EE=EF=F0=EE=F1=E0=EC.
 

=CA=EE=EC=F3:
=D0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FF=EC, =EC=E5= =ED=E5=E4=E6=E5=F0=E0=EC =EF=EE =F0=E5=EA=EB=E0=EC=E5, =F0=F3=EA=EE=E2=EE= =E4=E8=F2=E5=EB=FF=EC =F0=E5=EA=EB=E0=EC=ED=FB=F5=20 =EE=F2=E4=E5=EB=EE=E2
 

=CF=EE =E2=EE=EF=F0=EE=F1=E0=EC =F3=F7=E0=F1=F2=E8=FF =E8 =F0=E5= =E3=E8=F1=F2=F0=E0=F6=E8=E8 =EE=E1=F0=E0=F9=E0=E9=F2=E5=F1=FC =EF=EE =F2=E5= =EB=E5=F4=EE=ED=F3:
( 8l2 ) 6=D7=3D2 - =CEI __ 28
 
=D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC,
=CA=EE=ED=EE=E2=E0=EB=EE=E2=E0 =CE= =EB=FC=E3=E0 =C8=E2=E0=ED=EE=E2=ED=E0
=EC=E5=ED=E5=E4=E6=E5=F0 =E8=ED=F4= =EE=F0=EC=E0=F6=E8=EE=ED=ED=EE=E3=EE=20 =EE=F2=E4=E5=EB=E0
------=_NextPart_000_1303_01CE3017.CA715890-- From dave@fromorbit.com Tue Apr 2 22:09:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AB7397F9A for ; Tue, 2 Apr 2013 22:09:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9BE0330407A for ; Tue, 2 Apr 2013 20:09:27 -0700 (PDT) X-ASG-Debug-ID: 1364958564-04cbb01fb718be60001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id HS7Cz0eYbiDwXER5 for ; Tue, 02 Apr 2013 20:09:25 -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: Aj4KAG+cW1F5LBrj/2dsb2JhbABDgwc2wDAEgQkXdIIfAS0vHB8YagM0iBMNoEahHo18hGQDkyWUUYMfKIEuBA Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 13:39:23 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNE4g-00008j-0B for xfs@oss.sgi.com; Wed, 03 Apr 2013 14:09:22 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNE4f-0003FC-QF for xfs@oss.sgi.com; Wed, 03 Apr 2013 14:09:21 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: don't free EFIs before the EFDs are committed Date: Wed, 3 Apr 2013 14:09:21 +1100 X-ASG-Orig-Subj: [PATCH] xfs: don't free EFIs before the EFDs are committed Message-Id: <1364958561-12440-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364958564 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127018 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words From: Dave Chinner Filesystems are occasionally being shut down with this error: xfs_trans_ail_delete_bulk: attempting to delete a log item that is not in the AIL. It was diagnosed to be related to the EFI/EFD commit order when the EFI and EFD are in different checkpoints and the EFD is committed before the EFI here: http://oss.sgi.com/archives/xfs/2013-01/msg00082.html The real problem is that a single bit cannot fully describe the states that the EFI/EFD processing can be in. These completion states are: EFI EFI in AIL EFD Result committed/unpinned Yes committed OK committed/pinned No committed Shutdown uncommitted No committed Shutdown Note that the "result" field is what should happen, not what does happen. The current logic is broken and handles the first two cases correctly by luck. That is, the code will free the EFI if the XFS_EFI_COMMITTED bit is *not* set, rather than if it is set. The inverted logic "works" because if both EFI and EFD are committed, then the first __xfs_efi_release() call clears the XFS_EFI_COMMITTED bit, and the second frees the EFI item. Hence as long as xfs_efi_item_committed() has been called, everything appears to be fine. It is the third case where the logic fails - where xfs_efd_item_committed() is called before xfs_efi_item_committed(), and that results in the EFI being freed before it has been committed. That is the bug that triggered the shutdown, and hence keeping track of whether the EFI has been committed or not is insufficient to correctly order the EFI/EFD operations w.r.t. the AIL. What we really want is this: the EFI is always placed into the AIL before the last reference goes away. The only way to guarantee that is that the EFI is not freed until after it has been unpinned *and* the EFD has been committed. That is, restructure the logic so that the only case that can occur is the first case. This can be done easily by replacing the XFS_EFI_COMMITTED with an EFI reference count. The EFI is initialised with it's own count, and that is not released until it is unpinned. However, there is a complication to this method - the high level EFI/EFD code in xfs_bmap_finish() does not hold direct references to the EFI structure, and runs a transaction commit between the EFI and EFD processing. Hence the EFI can be freed even before the EFD is created using such a method. Further, log recovery uses the AIL for tracking EFI/EFDs that need to be recovered, but it uses the AIL *differently* to the EFI transaction commit. Hence log recovery never pins or unpins EFIs, so we can't drop the EFI reference count indirectly to free the EFI. However, this doesn't prevent us from using a reference count here. There is a 1:1 relationship between EFIs and EFDs, so when we initialise the EFI we can take a reference count for the EFD as well. This solves the xfs_bmap_finish() issue - the EFI will never be freed until the EFD is processed. In terms of log recovery, during the committing of the EFD we can look for the XFS_EFI_RECOVERED bit being set and drop the EFI reference as well, thereby ensuring everything works correctly there as well. Signed-off-by: Dave Chinner --- fs/xfs/xfs_extfree_item.c | 27 +++++++++++++-------------- fs/xfs/xfs_extfree_item.h | 14 +++++++++----- fs/xfs/xfs_log_recover.c | 1 + 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index feb36d7..c0f3750 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -50,9 +50,8 @@ xfs_efi_item_free( * Freeing the efi requires that we remove it from the AIL if it has already * been placed there. However, the EFI may not yet have been placed in the AIL * when called by xfs_efi_release() from EFD processing due to the ordering of - * committed vs unpin operations in bulk insert operations. Hence the - * test_and_clear_bit(XFS_EFI_COMMITTED) to ensure only the last caller frees - * the EFI. + * committed vs unpin operations in bulk insert operations. Hence the reference + * count to ensure only the last caller frees the EFI. */ STATIC void __xfs_efi_release( @@ -60,7 +59,7 @@ __xfs_efi_release( { struct xfs_ail *ailp = efip->efi_item.li_ailp; - if (!test_and_clear_bit(XFS_EFI_COMMITTED, &efip->efi_flags)) { + if (atomic_dec_and_test(&efip->efi_refcount)) { spin_lock(&ailp->xa_lock); /* xfs_trans_ail_delete() drops the AIL lock. */ xfs_trans_ail_delete(ailp, &efip->efi_item, @@ -126,8 +125,8 @@ xfs_efi_item_pin( * which the EFI is manipulated during a transaction. If we are being asked to * remove the EFI it's because the transaction has been cancelled and by * definition that means the EFI cannot be in the AIL so remove it from the - * transaction and free it. Otherwise coordinate with xfs_efi_release() (via - * XFS_EFI_COMMITTED) to determine who gets to free the EFI. + * transaction and free it. Otherwise coordinate with xfs_efi_release() + * to determine who gets to free the EFI. */ STATIC void xfs_efi_item_unpin( @@ -171,19 +170,13 @@ xfs_efi_item_unlock( /* * The EFI is logged only once and cannot be moved in the log, so simply return - * the lsn at which it's been logged. For bulk transaction committed - * processing, the EFI may be processed but not yet unpinned prior to the EFD - * being processed. Set the XFS_EFI_COMMITTED flag so this case can be detected - * when processing the EFD. + * the lsn at which it's been logged. */ STATIC xfs_lsn_t xfs_efi_item_committed( struct xfs_log_item *lip, xfs_lsn_t lsn) { - struct xfs_efi_log_item *efip = EFI_ITEM(lip); - - set_bit(XFS_EFI_COMMITTED, &efip->efi_flags); return lsn; } @@ -241,6 +234,7 @@ xfs_efi_init( efip->efi_format.efi_nextents = nextents; efip->efi_format.efi_id = (__psint_t)(void*)efip; atomic_set(&efip->efi_next_extent, 0); + atomic_set(&efip->efi_refcount, 2); return efip; } @@ -310,8 +304,13 @@ xfs_efi_release(xfs_efi_log_item_t *efip, uint nextents) { ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); - if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) + if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) { __xfs_efi_release(efip); + + /* recovery needs us to drop the EFI reference, too */ + if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) + __xfs_efi_release(efip); + } } static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index 375f68e..4322224 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -114,16 +114,20 @@ typedef struct xfs_efd_log_format_64 { * Define EFI flag bits. Manipulated by set/clear/test_bit operators. */ #define XFS_EFI_RECOVERED 1 -#define XFS_EFI_COMMITTED 2 /* - * This is the "extent free intention" log item. It is used - * to log the fact that some extents need to be free. It is - * used in conjunction with the "extent free done" log item - * described below. + * This is the "extent free intention" log item. It is used to log the fact + * that some extents need to be free. It is used in conjunction with the + * "extent free done" log item described below. + * + * The EFI is reference counted so that it is not freed prior to both the EFI + * and EFD being committed and unpinned. This ensures that when the last + * reference goes away the EFI will always be in the AIL as it has been + * unpinned, regardless of whether the EFD is processed before or after the EFI. */ typedef struct xfs_efi_log_item { xfs_log_item_t efi_item; + atomic_t efi_refcount; atomic_t efi_next_extent; unsigned long efi_flags; /* misc flags */ xfs_efi_log_format_t efi_format; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index d1dba7c..3ca3380 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2948,6 +2948,7 @@ xlog_recover_process_efi( * This will pull the EFI from the AIL and * free the memory associated with it. */ + set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); xfs_efi_release(efip, efip->efi_format.efi_nextents); return XFS_ERROR(EIO); } -- 1.7.10.4 From david@fromorbit.com Tue Apr 2 23:08:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8A9FB7F9D for ; Tue, 2 Apr 2013 23:08:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04707AC003 for ; Tue, 2 Apr 2013 21:08:49 -0700 (PDT) X-ASG-Debug-ID: 1364962127-04cb6c1e7a192320001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 2C8bJmBemaT0XrK1 for ; Tue, 02 Apr 2013 21:08:47 -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: ApwTAIyqW1F5LBrj/2dsb2JhbABDgwe7SIUeBAGBCRd0gh8BAQQBOhwjBQsIAw4KCSUPBSUDIROIDgXBcxWNZ4EdB4NAA5ZqkQyDHyg Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 14:38:46 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UNF09-0000Eh-SB; Wed, 03 Apr 2013 15:08:45 +1100 Date: Wed, 3 Apr 2013 15:08:45 +1100 From: Dave Chinner To: Ben Myers Cc: xfs@oss.sgi.com Subject: Re: [PATCH 09/21] xfs: add version 3 inode format with CRCs Message-ID: <20130403040845.GU17758@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/21] xfs: add version 3 inode format with CRCs References: <1363091454-8852-1-git-send-email-david@fromorbit.com> <1363091454-8852-10-git-send-email-david@fromorbit.com> <20130314160321.GV22182@sgi.com> <20130315011104.GD21651@dastard> <20130326225600.GL6369@dastard> <20130327005307.GK30652@sgi.com> <20130327014828.GN6369@dastard> <20130402224433.GZ22182@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130402224433.GZ22182@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: 1364962127 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127022 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 02, 2013 at 05:44:33PM -0500, Ben Myers wrote: > On Wed, Mar 27, 2013 at 12:48:28PM +1100, Dave Chinner wrote: > > On Tue, Mar 26, 2013 at 07:53:07PM -0500, Ben Myers wrote: > > > On Wed, Mar 27, 2013 at 09:56:00AM +1100, Dave Chinner wrote: > > > > On Fri, Mar 15, 2013 at 12:11:04PM +1100, Dave Chinner wrote: > > > > Ben, FYI: I've taken the easy way out for this - log the entire > > > > inode buffer rather than just the inode core. The CRC means we are > > > > dependent on having all the inode logged so that seems to be the > > > > simplest way to deal with this problem overall, even though it > > > > increases the amount of metadata logged for inode creates > > > > substantially. > > > > > > > > I'll address this potential performance issue in future with new > > > > inode create and unlink transactions that allow us to avoid logging > > > > buffers for all inode modifications. There are other good reasons > > > > for doing this as well (e.g. avoid the subtly broken special > > > > handling of physical inode buffer logging vs logical inode logging > > > > in log recovery), so I think this is best to just take the simple > > > > option here.... > > > > > > It seems like this is a more general problem with fresh on-disk > > > structures. When we calculate crc and log only part of a buffer we are > > > prone to the crc being incorrect after log replay because the unlogged > > > portions of the buffer are still undefined. They aren't the 0s we > > > calculated crcs with. > > > > But it doesn't matter for all other metadata as we don't log CRC > > fields except in the inode/dquot at allocation. It is the exception > > rather than the rule. ..... > > > 2) Create a new transaction to write a known pattern over the > > > entire buffer, then initialize the buffer with that pattern, > > > calculate the crc, and still log only the parts of the buffer > > > which were modified. In the non-crash case we still need to > > > arrange for the buffer to be patterned after the log wraps, but it > > > has the advantage of not having to log large structures just to > > > zero them. > > > > We need to ensure we log the entire object if we are logging the CRC > > of the object. > > We don't need to log the entire object if we can arrange for the contents of > the buffer to be a known pattern after recovery and then calculate the CRC > against that. It's just the initialization that is problematic. The rest of > the time the contents are already cached anyway. Right, but... > > In this case, the initialisation and calculation of > > the CRC needs to be atomic, so it needs to be a single transactions. > > I agree that the initialisation of the block and the calculation of the crc > must be in the same transaction. It would need to be a new log item type that > specifies a pattern (normally zero) and a length to be written to the buffer. > I used the wrong terminology, as usual. > > > That's what logging the entire buffer does. > > Yep. I'm just pointing out that if logging the entire structure becomes an > issue we have some other options. .... to do that we need a new transaction type, new flags/fields in the xfs_buf_log_item, new handling of unlogged buffer contents that still are tracked in the AIL, new reservations, new transaction nesting as there's now 3 transactions needed for inode allocation, etc. It's pretty messy, and it doesn't replace the fact we then immediately have to relog the buffer with the initialised inode cores. It doesn't simplify log recovery, either, and that already has issues with buffer based inode allocation vs logical inode logging.... But, as I mentioned, I already have a patchset that basically does all this for inode allocation. It doesn't initialised buffers to a byte pattern - it initialises a contiguous extent to contain inodes, and introduces a "ordered buffer" that is not logged but is still tracked in the AIL to ensure that the correct behaviour occurs. That patchset has been around for a while - the original series I wrote: $ ls -l src/kern/patches/icreate total 64 -rw------- 1 dave dave 10423 Dec 3 2009 xfs-icreate-factor-inode-stamping -rw------- 1 dave dave 12304 Dec 3 2009 xfs-icreate-item -rw------- 1 dave dave 6347 Dec 3 2009 xfs-icreate-ordered-buf-item -rw------- 1 dave dave 2679 Dec 3 2009 xfs-icreate-remove-log-di -rw------- 1 dave dave 4713 Dec 3 2009 xfs-icreate-use-xact -rw------- 1 dave dave 7924 Dec 3 2009 xfs-icreate-xact-recovery -rw------- 1 dave dave 6159 Dec 3 2009 xfs-icreate-xact-resv That will solve the perf problem of inode initialisation and CRCs, as well as a bunch of other problems limiting inode create performance. It will also avoid having to log buffers for inode creation and hence remove all the recovery coherency problems that causes... > This could be useful for other reasons too, > e.g. to prevent stale data exposure after a crash. That can't actually happen as they are metadata buffers and hence the unreferenced contents of the buffers cannot escape to userspace.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Wed Apr 3 00:11:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 99C2D7F9E for ; Wed, 3 Apr 2013 00:11:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6C6D530407E for ; Tue, 2 Apr 2013 22:11:40 -0700 (PDT) X-ASG-Debug-ID: 1364965897-04bdf0542b18ea40001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id qBstnHfNkE1rsDHT for ; Tue, 02 Apr 2013 22:11:37 -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: Aj0KAJm4W1F5LBrj/2dsb2JhbABDgwfAZQSBCBd0gh8BAQUnLzMIGDE5AxsZiBPBW418hGQDp3aDHyiBMCQ Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:36 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFyx-0000L4-6S for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:35 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFyx-0005B5-3S for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:35 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 05/22] xfs: add CRC checks to the AGI Date: Wed, 3 Apr 2013 16:11:15 +1100 X-ASG-Orig-Subj: [PATCH 05/22] xfs: add CRC checks to the AGI Message-Id: <1364965892-19623-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965897 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Same set of changes made to the AGF need to be made to the AGI. This patch has a similar history to the AGF, hence a similar sign-off chain. Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_ag.h | 8 +++++++ fs/xfs/xfs_buf_item.h | 4 +++- fs/xfs/xfs_fsops.c | 3 +++ fs/xfs/xfs_ialloc.c | 57 ++++++++++++++++++++++++++++++++++------------ fs/xfs/xfs_log_recover.c | 8 +++++++ 5 files changed, 65 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 272ef09..317aa86 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -152,6 +152,7 @@ typedef struct xfs_agi { __be32 agi_root; /* root of inode btree */ __be32 agi_level; /* levels in inode btree */ __be32 agi_freecount; /* number of free inodes */ + __be32 agi_newino; /* new inode just allocated */ __be32 agi_dirino; /* last directory inode chunk */ /* @@ -159,6 +160,13 @@ typedef struct xfs_agi { * still being referenced. */ __be32 agi_unlinked[XFS_AGI_UNLINKED_BUCKETS]; + + uuid_t agi_uuid; /* uuid of filesystem */ + __be32 agi_crc; /* crc of agi sector */ + __be32 agi_pad32; + __be64 agi_lsn; /* last write sequence */ + + /* structure must be padded to 64 bit alignment */ } xfs_agi_t; #define XFS_AGI_MAGICNUM 0x00000001 diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 067d5f0..c256606 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -47,6 +47,7 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_BTREE_BUF (1<<5) #define XFS_BLF_AGF_BUF (1<<6) #define XFS_BLF_AGFL_BUF (1<<7) +#define XFS_BLF_AGI_BUF (1<<8) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -54,7 +55,8 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_GDQUOT_BUF | \ XFS_BLF_BTREE_BUF | \ XFS_BLF_AGF_BUF | \ - XFS_BLF_AGFL_BUF) + XFS_BLF_AGFL_BUF | \ + XFS_BLF_AGI_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index a693a54..87595b2 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -304,8 +304,11 @@ xfs_growfs_data_private( agi->agi_freecount = 0; agi->agi_newino = cpu_to_be32(NULLAGINO); agi->agi_dirino = cpu_to_be32(NULLAGINO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid); for (bucket = 0; bucket < XFS_AGI_UNLINKED_BUCKETS; bucket++) agi->agi_unlinked[bucket] = cpu_to_be32(NULLAGINO); + error = xfs_bwrite(bp); xfs_buf_relse(bp); if (error) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index ba62661..6d0a495 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -36,6 +36,8 @@ #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_bmap.h" +#include "xfs_cksum.h" +#include "xfs_buf_item.h" /* @@ -1453,6 +1455,7 @@ xfs_ialloc_log_agi( /* * Log the allocation group inode header buffer. */ + xfs_trans_buf_set_type(tp, bp, XFS_BLF_AGI_BUF); xfs_trans_log_buf(tp, bp, first, last); } @@ -1470,19 +1473,23 @@ xfs_check_agi_unlinked( #define xfs_check_agi_unlinked(agi) #endif -static void +static bool xfs_agi_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_agi *agi = XFS_BUF_TO_AGI(bp); - int agi_ok; + if (xfs_sb_version_hascrc(&mp->m_sb) && + !uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_uuid)) + return false; /* * Validate the magic number of the agi block. */ - agi_ok = agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC) && - XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)); + if (agi->agi_magicnum != cpu_to_be32(XFS_AGI_MAGIC)) + return false; + if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum))) + return false; /* * during growfs operations, the perag is not fully initialised, @@ -1490,30 +1497,52 @@ xfs_agi_verify( * use it by using uncached buffers that don't have the perag attached * so we can detect and avoid this problem. */ - if (bp->b_pag) - agi_ok = agi_ok && be32_to_cpu(agi->agi_seqno) == - bp->b_pag->pag_agno; + if (bp->b_pag && be32_to_cpu(agi->agi_seqno) != bp->b_pag->pag_agno) + return false; - if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, - XFS_RANDOM_IALLOC_READ_AGI))) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agi); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } xfs_check_agi_unlinked(agi); + return true; } static void xfs_agi_read_verify( struct xfs_buf *bp) { - xfs_agi_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + int agi_ok = 1; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + agi_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agi, agi_crc)); + agi_ok = agi_ok && xfs_agi_verify(bp); + + if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, + XFS_RANDOM_IALLOC_READ_AGI))) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void xfs_agi_write_verify( struct xfs_buf *bp) { - xfs_agi_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_agi_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_AGI(bp)->agi_lsn = cpu_to_be64(bip->bli_item.li_lsn); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agi, agi_crc)); } const struct xfs_buf_ops xfs_agi_buf_ops = { diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index da2a19e..6778a79 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1971,6 +1971,14 @@ xlog_recover_do_reg_buffer( } bp->b_ops = &xfs_agfl_buf_ops; break; + case XFS_BLF_AGI_BUF: + if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_AGI_MAGIC)) { + xfs_warn(mp, "Bad AGI block magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_agi_buf_ops; + break; default: break; } -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:11:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 38BF27FA4 for ; Wed, 3 Apr 2013 00: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 285468F8059 for ; Tue, 2 Apr 2013 22:11:48 -0700 (PDT) X-ASG-Debug-ID: 1364965906-04cbb01fba194150001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id g5S5G0mUyiuqWgpG for ; Tue, 02 Apr 2013 22:11:46 -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: Aj0KAJm4W1F5LBrj/2dsb2JhbABDgwc2wC8EgQgXdIJ8O4ECA4hHDaA1oRmNbQ+BOoMqA6d2gx8ogS8 Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:45 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFyx-0000Kx-10 for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:35 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFyw-0005Aj-T1 for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:34 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 00/22] xfs: metadata CRCs, fourth version Date: Wed, 3 Apr 2013 16:11:10 +1100 X-ASG-Orig-Subj: [PATCH 00/22] xfs: metadata CRCs, fourth version Message-Id: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965906 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Folks, New CRC patchset. Previous versions: http://oss.sgi.com/archives/xfs/2013-01/msg00328.html http://oss.sgi.com/archives/xfs/2013-02/msg00451.html http://oss.sgi.com/archives/xfs/2013-03/msg00291.html This version is based on 3.9-rc4 + TOT xfsdev. 3.9-rc5 has loopback bugs that make it useless for testing, so I've just kept my tree on -rc4. New in this patch set: - numerous bug fixes - cleanups to addresse Bens review comments - logs entire inode allocation buffers - reworks the buffer type tracking for log recovery - fixes the endian issues reported by sparse - splits out the symlink code rearrangement - adds support for v5 superblock feature masks - add mount warnings about CRC support being experimental Still to do: - Documentation (half written, not in series) - DT_* type fields in the directory entries. This can be done with a feature bit if not done in time. - storage of attributes larger than 256 bytes in shortform attribute forks. Same comment about a feature bit. The addition of the feature mask support to the superblock added a new field to the superblock - a log compatibility feature mask. This is to allow new transactions and recovery features to be added and prevent kernels that don't understand those features from performing log recovery. The idea is that clean logs can be mounted by kernels that don't support the new feature if everything else is compatible, but if they require log recovery the mount will be aborted. This means pure log changes don't require a compat/incompat/rocompat feature bit to be set. The result of adding this is that all the old CRC enabled filesystems will not work with this kernel - the CRC field location changed, and that makes the mount fail hard. So a new userspace will be needed to test the CRC side of this patchset. (Coming soon!) Comments, testing welcome... -Dave. From dave@fromorbit.com Wed Apr 3 00:11:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1E7727FA4 for ; Wed, 3 Apr 2013 00:11:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0C4D3304081 for ; Tue, 2 Apr 2013 22:11:48 -0700 (PDT) X-ASG-Debug-ID: 1364965907-04cb6c1e79196af0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id XjmEJDQ0FBdcuVUB for ; Tue, 02 Apr 2013 22:11:47 -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: Aj0KAJm4W1F5LBrj/2dsb2JhbABDgwfAZQSBCBd0gh8BAQVWMwgYMTkDGxmIE8FbjVUngTqDKgOgXocYgx8ogS4 Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:45 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFyx-0000Ky-1l for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:35 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFyw-0005Am-U8 for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:34 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 01/22] xfs: increase hexdump output in xfs_corruption_error Date: Wed, 3 Apr 2013 16:11:11 +1100 X-ASG-Orig-Subj: [PATCH 01/22] xfs: increase hexdump output in xfs_corruption_error Message-Id: <1364965892-19623-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965907 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Currently xfs_corruption_error() dumps the first 16 bytes of the buffer that is passed to it when a corruption occurs. This is not large enough to see the entire state of the header of the block that was determined to be corrupt. increase the output to 64 bytes to capture the majority of all headers in all types of metadata blocks. Signed-off-by: Dave Chinner --- fs/xfs/xfs_error.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index 07bf3b9..35d3f5b 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -178,7 +178,7 @@ xfs_corruption_error( inst_t *ra) { if (level <= xfs_error_level) - xfs_hex_dump(p, 16); + xfs_hex_dump(p, 64); xfs_error_report(tag, level, mp, filename, linenum, ra); xfs_alert(mp, "Corruption detected. Unmount and run xfs_repair"); } -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:11:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1A4817FA4 for ; Wed, 3 Apr 2013 00:11:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 09C30304082 for ; Tue, 2 Apr 2013 22:11:49 -0700 (PDT) X-ASG-Debug-ID: 1364965906-04cbb01fba194150002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id am9pR5UQgEMB5bu8 for ; Tue, 02 Apr 2013 22:11:47 -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: AkAKAJm4W1F5LBrj/2dsb2JhbAA5CoMHwGUEAYEHF3SCHwEBBScvMwgYMTkDGxmIE8FbjV0fgRKDUgOndoMfKA Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:45 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFz2-0000LM-5h for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:40 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFyx-0005Aw-1C for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:35 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 03/22] xfs: add CRC checks to the AGF Date: Wed, 3 Apr 2013 16:11:13 +1100 X-ASG-Orig-Subj: [PATCH 03/22] xfs: add CRC checks to the AGF Message-Id: <1364965892-19623-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965907 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The AGF already has some self identifying fields (e.g. the sequence number) so we only need to add the uuid to it to identify the filesystem it belongs to. The location is fixed based on the sequence number, so there's no need to add a block number, either. Hence the only additional fields are the CRC and LSN fields. These are unlogged, so place some space between the end of the logged fields and them so that future expansion of the AGF for logged fields can be placed adjacent to the existing logged fields and hence not complicate the field-derived range based logging we currently have. Based originally on a patch from myself, modified further by Christoph Hellwig and then modified again to fit into the verifier structure with additional fields by myself. The multiple signed-off-by tags indicate the age and history of this patch. Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_ag.h | 23 +++++++++++-- fs/xfs/xfs_alloc.c | 80 ++++++++++++++++++++++++++++++++-------------- fs/xfs/xfs_buf_item.h | 4 ++- fs/xfs/xfs_fsops.c | 3 ++ fs/xfs/xfs_log_recover.c | 8 +++++ 5 files changed, 91 insertions(+), 27 deletions(-) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index f2aeedb..9f4815e 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -63,12 +63,29 @@ typedef struct xfs_agf { __be32 agf_spare0; /* spare field */ __be32 agf_levels[XFS_BTNUM_AGF]; /* btree levels */ __be32 agf_spare1; /* spare field */ + __be32 agf_flfirst; /* first freelist block's index */ __be32 agf_fllast; /* last freelist block's index */ __be32 agf_flcount; /* count of blocks in freelist */ __be32 agf_freeblks; /* total free blocks */ + __be32 agf_longest; /* longest free space */ __be32 agf_btreeblks; /* # of blocks held in AGF btrees */ + uuid_t agf_uuid; /* uuid of filesystem */ + + /* + * reserve some contiguous space for future logged fields before we add + * the unlogged fields. This makes the range logging via flags and + * structure offsets much simpler. + */ + __be64 agf_spare64[16]; + + /* unlogged fields, written during buffer writeback. */ + __be64 agf_lsn; /* last write sequence */ + __be32 agf_crc; /* crc of agf sector */ + __be32 agf_spare2; + + /* structure must be padded to 64 bit alignment */ } xfs_agf_t; #define XFS_AGF_MAGICNUM 0x00000001 @@ -83,7 +100,8 @@ typedef struct xfs_agf { #define XFS_AGF_FREEBLKS 0x00000200 #define XFS_AGF_LONGEST 0x00000400 #define XFS_AGF_BTREEBLKS 0x00000800 -#define XFS_AGF_NUM_BITS 12 +#define XFS_AGF_UUID 0x00001000 +#define XFS_AGF_NUM_BITS 13 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) #define XFS_AGF_FLAGS \ @@ -98,7 +116,8 @@ typedef struct xfs_agf { { XFS_AGF_FLCOUNT, "FLCOUNT" }, \ { XFS_AGF_FREEBLKS, "FREEBLKS" }, \ { XFS_AGF_LONGEST, "LONGEST" }, \ - { XFS_AGF_BTREEBLKS, "BTREEBLKS" } + { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ + { XFS_AGF_UUID, "UUID" } /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index a8beb5c..c34f799 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -33,7 +33,9 @@ #include "xfs_alloc.h" #include "xfs_extent_busy.h" #include "xfs_error.h" +#include "xfs_cksum.h" #include "xfs_trace.h" +#include "xfs_buf_item.h" struct workqueue_struct *xfs_alloc_wq; @@ -2058,11 +2060,14 @@ xfs_alloc_log_agf( offsetof(xfs_agf_t, agf_freeblks), offsetof(xfs_agf_t, agf_longest), offsetof(xfs_agf_t, agf_btreeblks), + offsetof(xfs_agf_t, agf_uuid), sizeof(xfs_agf_t) }; trace_xfs_agf(tp->t_mountp, XFS_BUF_TO_AGF(bp), fields, _RET_IP_); + xfs_trans_buf_set_type(tp, bp, XFS_BLF_AGF_BUF); + xfs_btree_offsets(fields, offsets, XFS_AGF_NUM_BITS, &first, &last); xfs_trans_log_buf(tp, bp, (uint)first, (uint)last); } @@ -2143,22 +2148,24 @@ xfs_alloc_put_freelist( return 0; } -static void +static bool xfs_agf_verify( + struct xfs_mount *mp, struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_agf *agf; - int agf_ok; + struct xfs_agf *agf = XFS_BUF_TO_AGF(bp); - agf = XFS_BUF_TO_AGF(bp); + if (xfs_sb_version_hascrc(&mp->m_sb) && + !uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_uuid)) + return false; - agf_ok = agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && - XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && - be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) && - be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp); + if (!(agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && + XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && + be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) && + be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp))) + return false; /* * during growfs operations, the perag is not fully initialised, @@ -2166,33 +2173,58 @@ xfs_agf_verify( * use it by using uncached buffers that don't have the perag attached * so we can detect and avoid this problem. */ - if (bp->b_pag) - agf_ok = agf_ok && be32_to_cpu(agf->agf_seqno) == - bp->b_pag->pag_agno; + if (bp->b_pag && be32_to_cpu(agf->agf_seqno) != bp->b_pag->pag_agno) + return false; - if (xfs_sb_version_haslazysbcount(&mp->m_sb)) - agf_ok = agf_ok && be32_to_cpu(agf->agf_btreeblks) <= - be32_to_cpu(agf->agf_length); + if (xfs_sb_version_haslazysbcount(&mp->m_sb) && + be32_to_cpu(agf->agf_btreeblks) > be32_to_cpu(agf->agf_length)) + return false; + + return true;; - if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, - XFS_RANDOM_ALLOC_READ_AGF))) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agf); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } } static void xfs_agf_read_verify( struct xfs_buf *bp) { - xfs_agf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + int agf_ok = 1; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + agf_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agf, agf_crc)); + + agf_ok = agf_ok && xfs_agf_verify(mp, bp); + + if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, + XFS_RANDOM_ALLOC_READ_AGF))) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void xfs_agf_write_verify( struct xfs_buf *bp) { - xfs_agf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_agf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_AGF(bp)->agf_lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agf, agf_crc)); } const struct xfs_buf_ops xfs_agf_buf_ops = { diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 101ef83..76bd7a1 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -45,12 +45,14 @@ extern kmem_zone_t *xfs_buf_item_zone; * once the changes have been replayed into the buffer. */ #define XFS_BLF_BTREE_BUF (1<<5) +#define XFS_BLF_AGF_BUF (1<<6) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ XFS_BLF_PDQUOT_BUF | \ XFS_BLF_GDQUOT_BUF | \ - XFS_BLF_BTREE_BUF) + XFS_BLF_BTREE_BUF | \ + XFS_BLF_AGF_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 6fe286a..b6cca27 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -247,6 +247,9 @@ xfs_growfs_data_private( tmpsize = agsize - XFS_PREALLOC_BLOCKS(mp); agf->agf_freeblks = cpu_to_be32(tmpsize); agf->agf_longest = cpu_to_be32(tmpsize); + if (xfs_sb_version_hascrc(&mp->m_sb)) + uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_uuid); + error = xfs_bwrite(bp); xfs_buf_relse(bp); if (error) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 3762ce2..dadf245 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1953,6 +1953,14 @@ xlog_recover_do_reg_buffer( break; } break; + case XFS_BLF_AGF_BUF: + if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_AGF_MAGIC)) { + xfs_warn(mp, "Bad AGF block magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_agf_buf_ops; + break; default: break; } -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:11:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D77C47FB1 for ; Wed, 3 Apr 2013 00:11:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52A3BAC002 for ; Tue, 2 Apr 2013 22:11:51 -0700 (PDT) X-ASG-Debug-ID: 1364965907-04cb6c1e79196af0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id FpFB6sWdChL7D6hQ for ; Tue, 02 Apr 2013 22:11: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: Aj8KAJm4W1F5LBrj/2dsb2JhbABDgwfAZQQBgQcXdIIfAQEFJy8zCBgxOQMbGYgTwVuNaROBEoNSA6d2gx8ogS8BHgY Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:45 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFyx-0000L6-7L for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:35 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFyx-0005B9-4L for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:35 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 06/22] xfs: add CRC checks for quota blocks Date: Wed, 3 Apr 2013 16:11:16 +1100 X-ASG-Orig-Subj: [PATCH 06/22] xfs: add CRC checks for quota blocks Message-Id: <1364965892-19623-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965908 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Christoph Hellwig Use the reserved space in struct xfs_dqblk to store a UUID and a crc for the quota blocks. [dchinner@redhat.com] Add a LSN field and update for current verifier infrastructure. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_dquot.c | 112 ++++++++++++++++++++++++++++++++++++++++------ fs/xfs/xfs_log_recover.c | 10 +++++ fs/xfs/xfs_qm.c | 23 ++++++++-- fs/xfs/xfs_qm.h | 2 + fs/xfs/xfs_quota.h | 11 ++++- 5 files changed, 141 insertions(+), 17 deletions(-) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 45bb08f..a41f8bf 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -36,6 +36,7 @@ #include "xfs_trans_space.h" #include "xfs_trans_priv.h" #include "xfs_qm.h" +#include "xfs_cksum.h" #include "xfs_trace.h" /* @@ -248,6 +249,8 @@ xfs_qm_init_dquot_blk( d->dd_diskdq.d_version = XFS_DQUOT_VERSION; d->dd_diskdq.d_id = cpu_to_be32(curid); d->dd_diskdq.d_flags = type; + if (xfs_sb_version_hascrc(&mp->m_sb)) + uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); } xfs_trans_dquot_buf(tp, bp, @@ -283,25 +286,87 @@ xfs_dquot_set_prealloc_limits(struct xfs_dquot *dqp) dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5; } -static void +STATIC void +xfs_dquot_buf_calc_crc( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; + int i; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + for (i = 0; i < mp->m_quotainfo->qi_dqperchunk; i++, d++) { + xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), + offsetof(struct xfs_dqblk, dd_crc)); + } +} + +STATIC bool +xfs_dquot_buf_verify_crc( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; + int ndquots; + int i; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return true; + + /* + * if we are in log recovery, the quota subsystem has not been + * initialised so we have no quotainfo structure. In that case, we need + * to manually calculate the number of dquots in the buffer. + */ + if (mp->m_quotainfo) + ndquots = mp->m_quotainfo->qi_dqperchunk; + else + ndquots = xfs_qm_calc_dquots_per_chunk(mp, + XFS_BB_TO_FSB(mp, bp->b_length)); + + for (i = 0; i < ndquots; i++, d++) { + if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), + offsetof(struct xfs_dqblk, dd_crc))) + return false; + if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid)) + return false; + } + + return true; +} + +STATIC bool xfs_dquot_buf_verify( + struct xfs_mount *mp, struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; - struct xfs_disk_dquot *ddq; xfs_dqid_t id = 0; + int ndquots; int i; /* + * if we are in log recovery, the quota subsystem has not been + * initialised so we have no quotainfo structure. In that case, we need + * to manually calculate the number of dquots in the buffer. + */ + if (mp->m_quotainfo) + ndquots = mp->m_quotainfo->qi_dqperchunk; + else + ndquots = xfs_qm_calc_dquots_per_chunk(mp, bp->b_length); + + /* * On the first read of the buffer, verify that each dquot is valid. * We don't know what the id of the dquot is supposed to be, just that * they should be increasing monotonically within the buffer. If the * first id is corrupt, then it will fail on the second dquot in the * buffer so corruptions could point to the wrong dquot in this case. */ - for (i = 0; i < mp->m_quotainfo->qi_dqperchunk; i++) { - int error; + for (i = 0; i < ndquots; i++) { + struct xfs_disk_dquot *ddq; + int error; ddq = &d[i].dd_diskdq; @@ -309,27 +374,37 @@ xfs_dquot_buf_verify( id = be32_to_cpu(ddq->d_id); error = xfs_qm_dqcheck(mp, ddq, id + i, 0, XFS_QMOPT_DOWARN, - "xfs_dquot_read_verify"); - if (error) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, d); - xfs_buf_ioerror(bp, EFSCORRUPTED); - break; - } + "xfs_dquot_buf_verify"); + if (error) + return false; } + return true; } static void xfs_dquot_buf_read_verify( struct xfs_buf *bp) { - xfs_dquot_buf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (!xfs_dquot_buf_verify_crc(mp, bp) || !xfs_dquot_buf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } void xfs_dquot_buf_write_verify( struct xfs_buf *bp) { - xfs_dquot_buf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (!xfs_dquot_buf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + xfs_dquot_buf_calc_crc(mp, bp); } const struct xfs_buf_ops xfs_dquot_buf_ops = { @@ -1073,6 +1148,17 @@ xfs_qm_dqflush( &dqp->q_logitem.qli_item.li_lsn); /* + * copy the lsn into the on-disk dquot now while we have the in memory + * dquot here. This can't be done later in the write verifier as we + * can't get access to the log item at that point in time. + */ + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dqblk *dqb = (struct xfs_dqblk *)ddqp; + + dqb->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn); + } + + /* * Attach an iodone routine so that we can remove this dquot from the * AIL and release the flush lock once the dquot is synced to disk. */ diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 6778a79..27b3ec2 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1979,6 +1979,16 @@ xlog_recover_do_reg_buffer( } bp->b_ops = &xfs_agi_buf_ops; break; + case XFS_BLF_UDQUOT_BUF: + case XFS_BLF_PDQUOT_BUF: + case XFS_BLF_GDQUOT_BUF: + if (*(__be16 *)bp->b_addr != cpu_to_be16(XFS_DQUOT_MAGIC)) { + xfs_warn(mp, "Bad DQUOT block magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_dquot_buf_ops; + break; default: break; } diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index d0acb4e..f41702b 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -617,6 +617,20 @@ xfs_qm_dqdetach( } } +int +xfs_qm_calc_dquots_per_chunk( + struct xfs_mount *mp, + unsigned int nbblks) /* basic block units */ +{ + unsigned int ndquots; + + ASSERT(nbblks > 0); + ndquots = BBTOB(nbblks); + do_div(ndquots, sizeof(xfs_dqblk_t)); + + return ndquots; +} + /* * This initializes all the quota information that's kept in the * mount structure @@ -656,9 +670,8 @@ xfs_qm_init_quotainfo( /* Precalc some constants */ qinf->qi_dqchunklen = XFS_FSB_TO_BB(mp, XFS_DQUOT_CLUSTER_SIZE_FSB); - ASSERT(qinf->qi_dqchunklen); - qinf->qi_dqperchunk = BBTOB(qinf->qi_dqchunklen); - do_div(qinf->qi_dqperchunk, sizeof(xfs_dqblk_t)); + qinf->qi_dqperchunk = xfs_qm_calc_dquots_per_chunk(mp, + qinf->qi_dqchunklen); mp->m_qflags |= (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_CHKD); @@ -897,6 +910,10 @@ xfs_qm_dqiter_bufs( if (error) break; + /* + * XXX(hch): need to figure out if it makes sense to validate + * the CRC here. + */ xfs_qm_reset_dqcounts(mp, bp, firstid, type); xfs_buf_delwri_queue(bp, buffer_list); xfs_buf_relse(bp); diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h index 82c2108..5d16a6e 100644 --- a/fs/xfs/xfs_qm.h +++ b/fs/xfs/xfs_qm.h @@ -75,6 +75,8 @@ typedef struct xfs_quotainfo { &((qi)->qi_gquota_tree)) +extern int xfs_qm_calc_dquots_per_chunk(struct xfs_mount *mp, + unsigned int nbblks); extern void xfs_trans_mod_dquot(xfs_trans_t *, xfs_dquot_t *, uint, long); extern int xfs_trans_reserve_quota_bydquots(xfs_trans_t *, xfs_mount_t *, xfs_dquot_t *, xfs_dquot_t *, long, long, uint); diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index b50ec5b..c61e31c 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h @@ -77,7 +77,14 @@ typedef struct xfs_disk_dquot { */ typedef struct xfs_dqblk { xfs_disk_dquot_t dd_diskdq; /* portion that lives incore as well */ - char dd_fill[32]; /* filling for posterity */ + char dd_fill[4]; /* filling for posterity */ + + /* + * These two are only present on filesystems with the CRC bits set. + */ + __be32 dd_crc; /* checksum */ + __be64 dd_lsn; /* last modification in log */ + uuid_t dd_uuid; /* location information */ } xfs_dqblk_t; /* @@ -380,5 +387,7 @@ extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *); extern int xfs_mount_reset_sbqflags(struct xfs_mount *); +extern const struct xfs_buf_ops xfs_dquot_buf_ops; + #endif /* __KERNEL__ */ #endif /* __XFS_QUOTA_H__ */ -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:11:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 939DD7FA5 for ; Wed, 3 Apr 2013 00:11:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 36B008F8065 for ; Tue, 2 Apr 2013 22:11:45 -0700 (PDT) X-ASG-Debug-ID: 1364965897-04bdf0542b18ea40002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id L3I58RAYcFaUU3bV for ; Tue, 02 Apr 2013 22:11:39 -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: AkMKAJm4W1F5LBrj/2dsb2JhbAA5CoMHg1q9CwQBgQcXdIIfAQEFGgEIBAsBIzMIGAUCERUCAjkDGxmIE68UkkeBI4w6H4ESBhaCI4ETA6d2gx8o Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:36 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFyx-0000Kz-38 for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:35 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFyw-0005Aq-Vs for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:34 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: =?UTF-8?q?=5BPATCH=2002/22=5D=20xfs=3A=20add=20support=20for=20large=20btree=20blocks?= Date: Wed, 3 Apr 2013 16:11:12 +1100 X-ASG-Orig-Subj: =?UTF-8?q?=5BPATCH=2002/22=5D=20xfs=3A=20add=20support=20for=20large=20btree=20blocks?= Message-Id: <1364965892-19623-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965899 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Christoph Hellwig Add support for larger btree blocks that contains a CRC32C checksum, a filesystem uuid and block number for detecting filesystem consistency and out of place writes. [dchinner@redhat.com] Also include an owner field to allow reverse mappings to be implemented for improved repairability and a LSN field to so that log recovery can easily determine the last modification that made it to disk for each buffer. [dchinner@redhat.com] Add buffer log format flags to indicate the type of buffer to recovery so that we don't have to do blind magic number tests to determine what the buffer is. [dchinner@redhat.com] Modified to fit into the verifier structure. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_alloc_btree.c | 105 +++++++++++++------ fs/xfs/xfs_alloc_btree.h | 12 ++- fs/xfs/xfs_attr_leaf.c | 2 +- fs/xfs/xfs_bmap.c | 47 ++++++--- fs/xfs/xfs_bmap_btree.c | 110 +++++++++++++------ fs/xfs/xfs_bmap_btree.h | 19 ++-- fs/xfs/xfs_btree.c | 256 +++++++++++++++++++++++++++++++++++++-------- fs/xfs/xfs_btree.h | 64 ++++++++++-- fs/xfs/xfs_buf_item.h | 24 ++++- fs/xfs/xfs_dinode.h | 4 +- fs/xfs/xfs_fsops.c | 23 +++- fs/xfs/xfs_ialloc_btree.c | 87 ++++++++++----- fs/xfs/xfs_ialloc_btree.h | 9 +- fs/xfs/xfs_inode.c | 33 +++--- fs/xfs/xfs_log_recover.c | 28 +++++ fs/xfs/xfs_trans.h | 2 + fs/xfs/xfs_trans_buf.c | 29 +++-- 17 files changed, 645 insertions(+), 209 deletions(-) diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index b1ddef6..30c4c14 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -33,6 +33,7 @@ #include "xfs_extent_busy.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_cksum.h" STATIC struct xfs_btree_cur * @@ -272,7 +273,7 @@ xfs_allocbt_key_diff( return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; } -static void +static bool xfs_allocbt_verify( struct xfs_buf *bp) { @@ -280,66 +281,103 @@ xfs_allocbt_verify( struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); struct xfs_perag *pag = bp->b_pag; unsigned int level; - int sblock_ok; /* block passes checks */ /* * magic number and level verification * - * During growfs operations, we can't verify the exact level as the - * perag is not fully initialised and hence not attached to the buffer. - * In this case, check against the maximum tree depth. + * During growfs operations, we can't verify the exact level or owner as + * the perag is not fully initialised and hence not attached to the + * buffer. In this case, check against the maximum tree depth. + * + * Similarly, during log recovery we will have a perag structure + * attached, but the agf information will not yet have been initialised + * from the on disk AGF. Again, we can only check against maximum limits + * in this case. */ level = be16_to_cpu(block->bb_level); switch (block->bb_magic) { + case cpu_to_be32(XFS_ABTB_CRC_MAGIC): + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.s.bb_blkno != cpu_to_be64(bp->b_bn)) + return false; + if (pag && + be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) + return false; + /* fall through */ case cpu_to_be32(XFS_ABTB_MAGIC): - if (pag) - sblock_ok = level < pag->pagf_levels[XFS_BTNUM_BNOi]; - else - sblock_ok = level < mp->m_ag_maxlevels; + if (pag && pag->pagf_init) { + if (level >= pag->pagf_levels[XFS_BTNUM_BNOi]) + return false; + } else if (level >= mp->m_ag_maxlevels) + return false; break; + case cpu_to_be32(XFS_ABTC_CRC_MAGIC): + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.s.bb_blkno != cpu_to_be64(bp->b_bn)) + return false; + if (pag && + be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) + return false; + /* fall through */ case cpu_to_be32(XFS_ABTC_MAGIC): - if (pag) - sblock_ok = level < pag->pagf_levels[XFS_BTNUM_CNTi]; - else - sblock_ok = level < mp->m_ag_maxlevels; + if (pag && pag->pagf_init) { + if (level >= pag->pagf_levels[XFS_BTNUM_CNTi]) + return false; + } else if (level >= mp->m_ag_maxlevels) + return false; break; default: - sblock_ok = 0; - break; + return false; } /* numrecs verification */ - sblock_ok = sblock_ok && - be16_to_cpu(block->bb_numrecs) <= mp->m_alloc_mxr[level != 0]; + if (be16_to_cpu(block->bb_numrecs) > mp->m_alloc_mxr[level != 0]) + return false; /* sibling pointer verification */ - sblock_ok = sblock_ok && - (block->bb_u.s.bb_leftsib == cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_leftsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_leftsib && - (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_rightsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_rightsib; - - if (!sblock_ok) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } + if (!block->bb_u.s.bb_leftsib || + (be32_to_cpu(block->bb_u.s.bb_leftsib) >= mp->m_sb.sb_agblocks && + block->bb_u.s.bb_leftsib != cpu_to_be32(NULLAGBLOCK))) + return false; + if (!block->bb_u.s.bb_rightsib || + (be32_to_cpu(block->bb_u.s.bb_rightsib) >= mp->m_sb.sb_agblocks && + block->bb_u.s.bb_rightsib != cpu_to_be32(NULLAGBLOCK))) + return false; + + return true; } static void xfs_allocbt_read_verify( struct xfs_buf *bp) { - xfs_allocbt_verify(bp); + if (!(xfs_btree_sblock_verify_crc(bp) && + xfs_allocbt_verify(bp))) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void xfs_allocbt_write_verify( struct xfs_buf *bp) { - xfs_allocbt_verify(bp); + if (!xfs_allocbt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + xfs_btree_sblock_calc_crc(bp); + } const struct xfs_buf_ops xfs_allocbt_buf_ops = { @@ -444,6 +482,9 @@ xfs_allocbt_init_cursor( cur->bc_private.a.agbp = agbp; cur->bc_private.a.agno = agno; + if (xfs_sb_version_hascrc(&mp->m_sb)) + cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; + return cur; } diff --git a/fs/xfs/xfs_alloc_btree.h b/fs/xfs/xfs_alloc_btree.h index 7e89a2b..e3a3f74 100644 --- a/fs/xfs/xfs_alloc_btree.h +++ b/fs/xfs/xfs_alloc_btree.h @@ -31,8 +31,10 @@ struct xfs_mount; * by blockcount and blockno. All blocks look the same to make the code * simpler; if we have time later, we'll make the optimizations. */ -#define XFS_ABTB_MAGIC 0x41425442 /* 'ABTB' for bno tree */ -#define XFS_ABTC_MAGIC 0x41425443 /* 'ABTC' for cnt tree */ +#define XFS_ABTB_MAGIC 0x41425442 /* 'ABTB' for bno tree */ +#define XFS_ABTB_CRC_MAGIC 0x41423342 /* 'AB3B' */ +#define XFS_ABTC_MAGIC 0x41425443 /* 'ABTC' for cnt tree */ +#define XFS_ABTC_CRC_MAGIC 0x41423343 /* 'AB3C' */ /* * Data record/key structure @@ -59,10 +61,10 @@ typedef __be32 xfs_alloc_ptr_t; /* * Btree block header size depends on a superblock flag. - * - * (not quite yet, but soon) */ -#define XFS_ALLOC_BLOCK_LEN(mp) XFS_BTREE_SBLOCK_LEN +#define XFS_ALLOC_BLOCK_LEN(mp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + XFS_BTREE_SBLOCK_CRC_LEN : XFS_BTREE_SBLOCK_LEN) /* * Record, key, and pointer address macros for btree blocks. diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index f96a734..aa4765f 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -232,7 +232,7 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) return 0; return dp->i_d.di_forkoff; } - dsize = XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot); + dsize = XFS_BMAP_BROOT_SPACE(mp, dp->i_df.if_broot); break; } diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 20efb39..0531cd3 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -439,11 +439,15 @@ xfs_bmap_sanity_check( { struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); - if (block->bb_magic != cpu_to_be32(XFS_BMAP_MAGIC) || - be16_to_cpu(block->bb_level) != level || + if (block->bb_magic != cpu_to_be32(XFS_BMAP_CRC_MAGIC) && + block->bb_magic != cpu_to_be32(XFS_BMAP_MAGIC)) + return 0; + + if (be16_to_cpu(block->bb_level) != level || be16_to_cpu(block->bb_numrecs) == 0 || be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) return 0; + return 1; } @@ -1031,6 +1035,7 @@ xfs_bmap_extents_to_btree( xfs_extnum_t nextents; /* number of file extents */ xfs_bmbt_ptr_t *pp; /* root block address pointer */ + mp = ip->i_mount; ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS); @@ -1044,16 +1049,18 @@ xfs_bmap_extents_to_btree( * Fill in the root. */ block = ifp->if_broot; - block->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); - block->bb_level = cpu_to_be16(1); - block->bb_numrecs = cpu_to_be16(1); - block->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); - block->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block_int(mp, block, XFS_BUF_DADDR_NULL, + XFS_BMAP_CRC_MAGIC, 1, 1, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block_int(mp, block, XFS_BUF_DADDR_NULL, + XFS_BMAP_MAGIC, 1, 1, ip->i_ino, + XFS_BTREE_LONG_PTRS); /* * Need a cursor. Can't allocate until bb_level is filled in. */ - mp = ip->i_mount; cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); cur->bc_private.b.firstblock = *firstblock; cur->bc_private.b.flist = flist; @@ -1102,10 +1109,15 @@ xfs_bmap_extents_to_btree( */ abp->b_ops = &xfs_bmbt_buf_ops; ablock = XFS_BUF_TO_BLOCK(abp); - ablock->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); - ablock->bb_level = 0; - ablock->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); - ablock->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block_int(mp, ablock, abp->b_bn, + XFS_BMAP_CRC_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block_int(mp, ablock, abp->b_bn, + XFS_BMAP_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS); + arp = XFS_BMBT_REC_ADDR(mp, ablock, 1); nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); for (cnt = i = 0; i < nextents; i++) { @@ -1155,7 +1167,8 @@ xfs_bmap_local_to_extents( xfs_extlen_t total, /* total blocks needed by transaction */ int *logflagsp, /* inode logging flags */ int whichfork, - void (*init_fn)(struct xfs_buf *bp, + void (*init_fn)(struct xfs_trans *tp, + struct xfs_buf *bp, struct xfs_inode *ip, struct xfs_ifork *ifp)) { @@ -1207,7 +1220,7 @@ xfs_bmap_local_to_extents( bp = xfs_btree_get_bufl(args.mp, tp, args.fsbno, 0); /* initialise the block and copy the data */ - init_fn(bp, ip, ifp); + init_fn(tp, bp, ip, ifp); /* account for the change in fork size and log everything */ xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1); @@ -1314,16 +1327,19 @@ xfs_bmap_add_attrfork_extents( */ STATIC void xfs_bmap_local_to_extents_init_fn( + struct xfs_trans *tp, struct xfs_buf *bp, struct xfs_inode *ip, struct xfs_ifork *ifp) { bp->b_ops = &xfs_bmbt_buf_ops; memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); + xfs_trans_buf_set_type(tp, bp, XFS_BLF_BTREE_BUF); } STATIC void xfs_symlink_local_to_remote( + struct xfs_trans *tp, struct xfs_buf *bp, struct xfs_inode *ip, struct xfs_ifork *ifp) @@ -1342,8 +1358,7 @@ xfs_symlink_local_to_remote( * * XXX (dgc): investigate whether directory conversion can use the generic * formatting callout. It should be possible - it's just a very complex - * formatter. it would also require passing the transaction through to the init - * function. + * formatter. */ STATIC int /* error */ xfs_bmap_add_attrfork_local( diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index 061b45c..3a86c3f 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -37,6 +37,7 @@ #include "xfs_error.h" #include "xfs_quota.h" #include "xfs_trace.h" +#include "xfs_cksum.h" /* * Determine the extent state. @@ -59,24 +60,31 @@ xfs_extent_state( */ void xfs_bmdr_to_bmbt( - struct xfs_mount *mp, + struct xfs_inode *ip, xfs_bmdr_block_t *dblock, int dblocklen, struct xfs_btree_block *rblock, int rblocklen) { + struct xfs_mount *mp = ip->i_mount; int dmxr; xfs_bmbt_key_t *fkp; __be64 *fpp; xfs_bmbt_key_t *tkp; __be64 *tpp; - rblock->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block_int(mp, rblock, XFS_BUF_DADDR_NULL, + XFS_BMAP_CRC_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block_int(mp, rblock, XFS_BUF_DADDR_NULL, + XFS_BMAP_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS); + rblock->bb_level = dblock->bb_level; ASSERT(be16_to_cpu(rblock->bb_level) > 0); rblock->bb_numrecs = dblock->bb_numrecs; - rblock->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); - rblock->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); dmxr = xfs_bmdr_maxrecs(mp, dblocklen, 0); fkp = XFS_BMDR_KEY_ADDR(dblock, 1); tkp = XFS_BMBT_KEY_ADDR(mp, rblock, 1); @@ -424,7 +432,13 @@ xfs_bmbt_to_bmdr( xfs_bmbt_key_t *tkp; __be64 *tpp; - ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_MAGIC)); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_CRC_MAGIC)); + ASSERT(uuid_equal(&rblock->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid)); + ASSERT(rblock->bb_u.l.bb_blkno == + cpu_to_be64(XFS_BUF_DADDR_NULL)); + } else + ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_MAGIC)); ASSERT(rblock->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO)); ASSERT(rblock->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO)); ASSERT(rblock->bb_level != 0); @@ -708,59 +722,89 @@ xfs_bmbt_key_diff( cur->bc_rec.b.br_startoff; } -static void +static int xfs_bmbt_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); unsigned int level; - int lblock_ok; /* block passes checks */ - /* magic number and level verification. + switch (block->bb_magic) { + case cpu_to_be32(XFS_BMAP_CRC_MAGIC): + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(block->bb_u.l.bb_blkno) != bp->b_bn) + return false; + /* + * XXX: need a better way of verifying the owner here. Right now + * just make sure there has been one set. + */ + if (be64_to_cpu(block->bb_u.l.bb_owner) == 0) + return false; + /* fall through */ + case cpu_to_be32(XFS_BMAP_MAGIC): + break; + default: + return false; + } + + /* + * numrecs and level verification. * - * We don't know waht fork we belong to, so just verify that the level + * We don't know what fork we belong to, so just verify that the level * is less than the maximum of the two. Later checks will be more * precise. */ level = be16_to_cpu(block->bb_level); - lblock_ok = block->bb_magic == cpu_to_be32(XFS_BMAP_MAGIC) && - level < max(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1]); - - /* numrecs verification */ - lblock_ok = lblock_ok && - be16_to_cpu(block->bb_numrecs) <= mp->m_bmap_dmxr[level != 0]; + if (level > max(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1])) + return false; + if (be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) + return false; /* sibling pointer verification */ - lblock_ok = lblock_ok && - block->bb_u.l.bb_leftsib && - (block->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO) || - XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_leftsib))) && - block->bb_u.l.bb_rightsib && - (block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO) || - XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_rightsib))); - - if (!lblock_ok) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } + if (!block->bb_u.l.bb_leftsib || + (block->bb_u.l.bb_leftsib != cpu_to_be64(NULLDFSBNO) && + !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_leftsib)))) + return false; + if (!block->bb_u.l.bb_rightsib || + (block->bb_u.l.bb_rightsib != cpu_to_be64(NULLDFSBNO) && + !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_rightsib)))) + return false; + + return true; + } static void xfs_bmbt_read_verify( struct xfs_buf *bp) { - xfs_bmbt_verify(bp); + if (!(xfs_btree_lblock_verify_crc(bp) && + xfs_bmbt_verify(bp))) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + } static void xfs_bmbt_write_verify( struct xfs_buf *bp) { - xfs_bmbt_verify(bp); + if (!xfs_bmbt_verify(bp)) { + xfs_warn(bp->b_target->bt_mount, "bmbt daddr 0x%llx failed", bp->b_bn); + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + xfs_btree_lblock_calc_crc(bp); } const struct xfs_buf_ops xfs_bmbt_buf_ops = { @@ -838,6 +882,8 @@ xfs_bmbt_init_cursor( cur->bc_ops = &xfs_bmbt_ops; cur->bc_flags = XFS_BTREE_LONG_PTRS | XFS_BTREE_ROOT_IN_INODE; + if (xfs_sb_version_hascrc(&mp->m_sb)) + cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; cur->bc_private.b.forksize = XFS_IFORK_SIZE(ip, whichfork); cur->bc_private.b.ip = ip; diff --git a/fs/xfs/xfs_bmap_btree.h b/fs/xfs/xfs_bmap_btree.h index 88469ca..70c43d9 100644 --- a/fs/xfs/xfs_bmap_btree.h +++ b/fs/xfs/xfs_bmap_btree.h @@ -18,7 +18,8 @@ #ifndef __XFS_BMAP_BTREE_H__ #define __XFS_BMAP_BTREE_H__ -#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ +#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ +#define XFS_BMAP_CRC_MAGIC 0x424d4133 /* 'BMA3' */ struct xfs_btree_cur; struct xfs_btree_block; @@ -136,10 +137,10 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; /* * Btree block header size depends on a superblock flag. - * - * (not quite yet, but soon) */ -#define XFS_BMBT_BLOCK_LEN(mp) XFS_BTREE_LBLOCK_LEN +#define XFS_BMBT_BLOCK_LEN(mp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + XFS_BTREE_LBLOCK_CRC_LEN : XFS_BTREE_LBLOCK_LEN) #define XFS_BMBT_REC_ADDR(mp, block, index) \ ((xfs_bmbt_rec_t *) \ @@ -186,12 +187,12 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; #define XFS_BMAP_BROOT_PTR_ADDR(mp, bb, i, sz) \ XFS_BMBT_PTR_ADDR(mp, bb, i, xfs_bmbt_maxrecs(mp, sz, 0)) -#define XFS_BMAP_BROOT_SPACE_CALC(nrecs) \ - (int)(XFS_BTREE_LBLOCK_LEN + \ +#define XFS_BMAP_BROOT_SPACE_CALC(mp, nrecs) \ + (int)(XFS_BMBT_BLOCK_LEN(mp) + \ ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))) -#define XFS_BMAP_BROOT_SPACE(bb) \ - (XFS_BMAP_BROOT_SPACE_CALC(be16_to_cpu((bb)->bb_numrecs))) +#define XFS_BMAP_BROOT_SPACE(mp, bb) \ + (XFS_BMAP_BROOT_SPACE_CALC(mp, be16_to_cpu((bb)->bb_numrecs))) #define XFS_BMDR_SPACE_CALC(nrecs) \ (int)(sizeof(xfs_bmdr_block_t) + \ ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))) @@ -204,7 +205,7 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; /* * Prototypes for xfs_bmap.c to call. */ -extern void xfs_bmdr_to_bmbt(struct xfs_mount *, xfs_bmdr_block_t *, int, +extern void xfs_bmdr_to_bmbt(struct xfs_inode *, xfs_bmdr_block_t *, int, struct xfs_btree_block *, int); extern void xfs_bmbt_get_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s); extern xfs_filblks_t xfs_bmbt_get_blockcount(xfs_bmbt_rec_host_t *r); diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index db01040..ec77036 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -30,9 +30,11 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" +#include "xfs_buf_item.h" #include "xfs_btree.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_cksum.h" /* * Cursor allocation zone. @@ -42,9 +44,13 @@ kmem_zone_t *xfs_btree_cur_zone; /* * Btree magic numbers. */ -const __uint32_t xfs_magics[XFS_BTNUM_MAX] = { - XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC +static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { + { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC }, + { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, + XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC } }; +#define xfs_btree_magic(cur) \ + xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] STATIC int /* error (0 or EFSCORRUPTED) */ @@ -54,30 +60,38 @@ xfs_btree_check_lblock( int level, /* level of the btree block */ struct xfs_buf *bp) /* buffer for block, if any */ { - int lblock_ok; /* block passes checks */ + int lblock_ok = 1; /* block passes checks */ struct xfs_mount *mp; /* file system mount point */ mp = cur->bc_mp; - lblock_ok = - be32_to_cpu(block->bb_magic) == xfs_magics[cur->bc_btnum] && + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + lblock_ok = lblock_ok && + uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid) && + block->bb_u.l.bb_blkno == cpu_to_be64( + bp ? bp->b_bn : XFS_BUF_DADDR_NULL); + } + + lblock_ok = lblock_ok && + be32_to_cpu(block->bb_magic) == xfs_btree_magic(cur) && be16_to_cpu(block->bb_level) == level && be16_to_cpu(block->bb_numrecs) <= cur->bc_ops->get_maxrecs(cur, level) && block->bb_u.l.bb_leftsib && (block->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO) || XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_leftsib))) && + be64_to_cpu(block->bb_u.l.bb_leftsib))) && block->bb_u.l.bb_rightsib && (block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO) || XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_rightsib))); + be64_to_cpu(block->bb_u.l.bb_rightsib))); + if (unlikely(XFS_TEST_ERROR(!lblock_ok, mp, XFS_ERRTAG_BTREE_CHECK_LBLOCK, XFS_RANDOM_BTREE_CHECK_LBLOCK))) { if (bp) trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_ERROR_REPORT("xfs_btree_check_lblock", XFS_ERRLEVEL_LOW, - mp); + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); } return 0; @@ -90,16 +104,26 @@ xfs_btree_check_sblock( int level, /* level of the btree block */ struct xfs_buf *bp) /* buffer containing block */ { + struct xfs_mount *mp; /* file system mount point */ struct xfs_buf *agbp; /* buffer for ag. freespace struct */ struct xfs_agf *agf; /* ag. freespace structure */ xfs_agblock_t agflen; /* native ag. freespace length */ - int sblock_ok; /* block passes checks */ + int sblock_ok = 1; /* block passes checks */ + mp = cur->bc_mp; agbp = cur->bc_private.a.agbp; agf = XFS_BUF_TO_AGF(agbp); agflen = be32_to_cpu(agf->agf_length); - sblock_ok = - be32_to_cpu(block->bb_magic) == xfs_magics[cur->bc_btnum] && + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + sblock_ok = sblock_ok && + uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid) && + block->bb_u.s.bb_blkno == cpu_to_be64( + bp ? bp->b_bn : XFS_BUF_DADDR_NULL); + } + + sblock_ok = sblock_ok && + be32_to_cpu(block->bb_magic) == xfs_btree_magic(cur) && be16_to_cpu(block->bb_level) == level && be16_to_cpu(block->bb_numrecs) <= cur->bc_ops->get_maxrecs(cur, level) && @@ -109,13 +133,13 @@ xfs_btree_check_sblock( (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || be32_to_cpu(block->bb_u.s.bb_rightsib) < agflen) && block->bb_u.s.bb_rightsib; - if (unlikely(XFS_TEST_ERROR(!sblock_ok, cur->bc_mp, + + if (unlikely(XFS_TEST_ERROR(!sblock_ok, mp, XFS_ERRTAG_BTREE_CHECK_SBLOCK, XFS_RANDOM_BTREE_CHECK_SBLOCK))) { if (bp) trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR("xfs_btree_check_sblock", - XFS_ERRLEVEL_LOW, cur->bc_mp, block); + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); } return 0; @@ -194,6 +218,72 @@ xfs_btree_check_ptr( #endif /* + * Calculate CRC on the whole btree block and stuff it into the + * long-form btree header. + * + * Prior to calculting the CRC, pull the LSN out of the buffer log item and put + * it into the buffer so recovery knows what the last modifcation was that made + * it to disk. + */ +void +xfs_btree_lblock_calc_crc( + struct xfs_buf *bp) +{ + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return; + if (bip) + block->bb_u.l.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_LBLOCK_CRC_OFF); +} + +bool +xfs_btree_lblock_verify_crc( + struct xfs_buf *bp) +{ + if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_LBLOCK_CRC_OFF); + return true; +} + +/* + * Calculate CRC on the whole btree block and stuff it into the + * short-form btree header. + * + * Prior to calculting the CRC, pull the LSN out of the buffer log item and put + * it into the buffer so recovery knows what the last modifcation was that made + * it to disk. + */ +void +xfs_btree_sblock_calc_crc( + struct xfs_buf *bp) +{ + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return; + if (bip) + block->bb_u.s.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_SBLOCK_CRC_OFF); +} + +bool +xfs_btree_sblock_verify_crc( + struct xfs_buf *bp) +{ + if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_SBLOCK_CRC_OFF); + return true; +} + +/* * Delete the btree cursor. */ void @@ -277,10 +367,8 @@ xfs_btree_dup_cursor( *ncur = NULL; return error; } - new->bc_bufs[i] = bp; - ASSERT(!xfs_buf_geterror(bp)); - } else - new->bc_bufs[i] = NULL; + } + new->bc_bufs[i] = bp; } *ncur = new; return 0; @@ -321,9 +409,14 @@ xfs_btree_dup_cursor( */ static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) { - return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? - XFS_BTREE_LBLOCK_LEN : - XFS_BTREE_SBLOCK_LEN; + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) + return XFS_BTREE_LBLOCK_CRC_LEN; + return XFS_BTREE_LBLOCK_LEN; + } + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) + return XFS_BTREE_SBLOCK_CRC_LEN; + return XFS_BTREE_SBLOCK_LEN; } /* @@ -863,43 +956,85 @@ xfs_btree_set_sibling( } void +xfs_btree_init_block_int( + struct xfs_mount *mp, + struct xfs_btree_block *buf, + xfs_daddr_t blkno, + __u32 magic, + __u16 level, + __u16 numrecs, + __u64 owner, + unsigned int flags) +{ + buf->bb_magic = cpu_to_be32(magic); + buf->bb_level = cpu_to_be16(level); + buf->bb_numrecs = cpu_to_be16(numrecs); + + if (flags & XFS_BTREE_LONG_PTRS) { + buf->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); + buf->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); + if (flags & XFS_BTREE_CRC_BLOCKS) { + buf->bb_u.l.bb_blkno = cpu_to_be64(blkno); + buf->bb_u.l.bb_owner = cpu_to_be64(owner); + uuid_copy(&buf->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid); + buf->bb_u.l.bb_pad = 0; + } + } else { + /* owner is a 32 bit value on short blocks */ + __u32 __owner = (__u32)owner; + + buf->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); + buf->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); + if (flags & XFS_BTREE_CRC_BLOCKS) { + buf->bb_u.s.bb_blkno = cpu_to_be64(blkno); + buf->bb_u.s.bb_owner = cpu_to_be32(__owner); + uuid_copy(&buf->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid); + } + } +} + +void xfs_btree_init_block( struct xfs_mount *mp, struct xfs_buf *bp, __u32 magic, __u16 level, __u16 numrecs, + __u64 owner, unsigned int flags) { - struct xfs_btree_block *new = XFS_BUF_TO_BLOCK(bp); - - new->bb_magic = cpu_to_be32(magic); - new->bb_level = cpu_to_be16(level); - new->bb_numrecs = cpu_to_be16(numrecs); - - if (flags & XFS_BTREE_LONG_PTRS) { - new->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); - new->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); - } else { - new->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); - new->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); - } + xfs_btree_init_block_int(mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, + magic, level, numrecs, owner, flags); } STATIC void xfs_btree_init_block_cur( struct xfs_btree_cur *cur, + struct xfs_buf *bp, int level, - int numrecs, - struct xfs_buf *bp) + int numrecs) { - xfs_btree_init_block(cur->bc_mp, bp, xfs_magics[cur->bc_btnum], - level, numrecs, cur->bc_flags); + __u64 owner; + + /* + * we can pull the owner from the cursor right now as the different + * owners align directly with the pointer size of the btree. This may + * change in future, but is safe for current users of the generic btree + * code. + */ + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) + owner = cur->bc_private.b.ip->i_ino; + else + owner = cur->bc_private.a.agno; + + xfs_btree_init_block_int(cur->bc_mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, + xfs_btree_magic(cur), level, numrecs, + owner, cur->bc_flags); } /* * Return true if ptr is the last record in the btree and - * we need to track updateѕ to this record. The decision + * we need to track updates to this record. The decision * will be further refined in the update_lastrec method. */ STATIC int @@ -1147,6 +1282,7 @@ xfs_btree_log_keys( XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); if (bp) { + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_key_offset(cur, first), xfs_btree_key_offset(cur, last + 1) - 1); @@ -1171,6 +1307,7 @@ xfs_btree_log_recs( XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_rec_offset(cur, first), xfs_btree_rec_offset(cur, last + 1) - 1); @@ -1195,6 +1332,7 @@ xfs_btree_log_ptrs( struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); int level = xfs_btree_get_level(block); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_ptr_offset(cur, first, level), xfs_btree_ptr_offset(cur, last + 1, level) - 1); @@ -1223,7 +1361,12 @@ xfs_btree_log_block( offsetof(struct xfs_btree_block, bb_numrecs), offsetof(struct xfs_btree_block, bb_u.s.bb_leftsib), offsetof(struct xfs_btree_block, bb_u.s.bb_rightsib), - XFS_BTREE_SBLOCK_LEN + offsetof(struct xfs_btree_block, bb_u.s.bb_blkno), + offsetof(struct xfs_btree_block, bb_u.s.bb_lsn), + offsetof(struct xfs_btree_block, bb_u.s.bb_uuid), + offsetof(struct xfs_btree_block, bb_u.s.bb_owner), + offsetof(struct xfs_btree_block, bb_u.s.bb_crc), + XFS_BTREE_SBLOCK_CRC_LEN }; static const short loffsets[] = { /* table of offsets (long) */ offsetof(struct xfs_btree_block, bb_magic), @@ -1231,17 +1374,40 @@ xfs_btree_log_block( offsetof(struct xfs_btree_block, bb_numrecs), offsetof(struct xfs_btree_block, bb_u.l.bb_leftsib), offsetof(struct xfs_btree_block, bb_u.l.bb_rightsib), - XFS_BTREE_LBLOCK_LEN + offsetof(struct xfs_btree_block, bb_u.l.bb_blkno), + offsetof(struct xfs_btree_block, bb_u.l.bb_lsn), + offsetof(struct xfs_btree_block, bb_u.l.bb_uuid), + offsetof(struct xfs_btree_block, bb_u.l.bb_owner), + offsetof(struct xfs_btree_block, bb_u.l.bb_crc), + offsetof(struct xfs_btree_block, bb_u.l.bb_pad), + XFS_BTREE_LBLOCK_CRC_LEN }; XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGBI(cur, bp, fields); if (bp) { + int nbits; + + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { + /* + * We don't log the CRC when updating a btree + * block but instead recreate it during log + * recovery. As the log buffers have checksums + * of their own this is safe and avoids logging a crc + * update in a lot of places. + */ + if (fields == XFS_BB_ALL_BITS) + fields = XFS_BB_ALL_BITS_CRC; + nbits = XFS_BB_NUM_BITS_CRC; + } else { + nbits = XFS_BB_NUM_BITS; + } xfs_btree_offsets(fields, (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? loffsets : soffsets, - XFS_BB_NUM_BITS, &first, &last); + nbits, &first, &last); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, first, last); } else { xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, @@ -2204,7 +2370,7 @@ xfs_btree_split( goto error0; /* Fill in the btree header for the new right block. */ - xfs_btree_init_block_cur(cur, xfs_btree_get_level(left), 0, rbp); + xfs_btree_init_block_cur(cur, rbp, xfs_btree_get_level(left), 0); /* * Split the entries between the old and the new block evenly. @@ -2513,7 +2679,7 @@ xfs_btree_new_root( nptr = 2; } /* Fill in the new block's btree header and log it. */ - xfs_btree_init_block_cur(cur, cur->bc_nlevels, 2, nbp); + xfs_btree_init_block_cur(cur, nbp, cur->bc_nlevels, 2); xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS); ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) && !xfs_btree_ptr_is_null(cur, &rptr)); diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h index f932897..6e6c915 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/xfs_btree.h @@ -42,11 +42,15 @@ extern kmem_zone_t *xfs_btree_cur_zone; * Generic btree header. * * This is a combination of the actual format used on disk for short and long - * format btrees. The first three fields are shared by both format, but - * the pointers are different and should be used with care. + * format btrees. The first three fields are shared by both format, but the + * pointers are different and should be used with care. * - * To get the size of the actual short or long form headers please use - * the size macros below. Never use sizeof(xfs_btree_block). + * To get the size of the actual short or long form headers please use the size + * macros below. Never use sizeof(xfs_btree_block). + * + * The blkno, crc, lsn, owner and uuid fields are only available in filesystems + * with the crc feature bit, and all accesses to them must be conditional on + * that flag. */ struct xfs_btree_block { __be32 bb_magic; /* magic number for block type */ @@ -56,10 +60,23 @@ struct xfs_btree_block { struct { __be32 bb_leftsib; __be32 bb_rightsib; + + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be32 bb_owner; + __le32 bb_crc; } s; /* short form pointers */ struct { __be64 bb_leftsib; __be64 bb_rightsib; + + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be64 bb_owner; + __le32 bb_crc; + __be32 bb_pad; /* padding for alignment */ } l; /* long form pointers */ } bb_u; /* rest */ }; @@ -67,6 +84,16 @@ struct xfs_btree_block { #define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */ #define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */ +/* sizes of CRC enabled btree blocks */ +#define XFS_BTREE_SBLOCK_CRC_LEN (XFS_BTREE_SBLOCK_LEN + 40) +#define XFS_BTREE_LBLOCK_CRC_LEN (XFS_BTREE_LBLOCK_LEN + 48) + + +#define XFS_BTREE_SBLOCK_CRC_OFF \ + offsetof(struct xfs_btree_block, bb_u.s.bb_crc) +#define XFS_BTREE_LBLOCK_CRC_OFF \ + offsetof(struct xfs_btree_block, bb_u.l.bb_crc) + /* * Generic key, ptr and record wrapper structures. @@ -101,13 +128,11 @@ union xfs_btree_rec { #define XFS_BB_NUMRECS 0x04 #define XFS_BB_LEFTSIB 0x08 #define XFS_BB_RIGHTSIB 0x10 +#define XFS_BB_BLKNO 0x20 #define XFS_BB_NUM_BITS 5 #define XFS_BB_ALL_BITS ((1 << XFS_BB_NUM_BITS) - 1) - -/* - * Magic numbers for btree blocks. - */ -extern const __uint32_t xfs_magics[]; +#define XFS_BB_NUM_BITS_CRC 8 +#define XFS_BB_ALL_BITS_CRC ((1 << XFS_BB_NUM_BITS_CRC) - 1) /* * Generic stats interface @@ -256,6 +281,7 @@ typedef struct xfs_btree_cur #define XFS_BTREE_LONG_PTRS (1<<0) /* pointers are 64bits long */ #define XFS_BTREE_ROOT_IN_INODE (1<<1) /* root may be variable size */ #define XFS_BTREE_LASTREC_UPDATE (1<<2) /* track last rec externally */ +#define XFS_BTREE_CRC_BLOCKS (1<<3) /* uses extended btree blocks */ #define XFS_BTREE_NOERROR 0 @@ -393,8 +419,20 @@ xfs_btree_init_block( __u32 magic, __u16 level, __u16 numrecs, + __u64 owner, unsigned int flags); +void +xfs_btree_init_block_int( + struct xfs_mount *mp, + struct xfs_btree_block *buf, + xfs_daddr_t blkno, + __u32 magic, + __u16 level, + __u16 numrecs, + __u64 owner, + unsigned int flags); + /* * Common btree core entry points. */ @@ -408,6 +446,14 @@ int xfs_btree_delete(struct xfs_btree_cur *, int *); int xfs_btree_get_rec(struct xfs_btree_cur *, union xfs_btree_rec **, int *); /* + * btree block CRC helpers + */ +void xfs_btree_lblock_calc_crc(struct xfs_buf *); +bool xfs_btree_lblock_verify_crc(struct xfs_buf *); +void xfs_btree_sblock_calc_crc(struct xfs_buf *); +bool xfs_btree_sblock_verify_crc(struct xfs_buf *); + +/* * Internal btree helpers also used by xfs_bmap.c. */ void xfs_btree_log_block(struct xfs_btree_cur *, struct xfs_buf *, int); diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index ee36c88..101ef83 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -24,19 +24,33 @@ extern kmem_zone_t *xfs_buf_item_zone; * This flag indicates that the buffer contains on disk inodes * and requires special recovery handling. */ -#define XFS_BLF_INODE_BUF 0x1 +#define XFS_BLF_INODE_BUF (1<<0) /* * This flag indicates that the buffer should not be replayed * during recovery because its blocks are being freed. */ -#define XFS_BLF_CANCEL 0x2 +#define XFS_BLF_CANCEL (1<<1) + /* * This flag indicates that the buffer contains on disk * user or group dquots and may require special recovery handling. */ -#define XFS_BLF_UDQUOT_BUF 0x4 -#define XFS_BLF_PDQUOT_BUF 0x8 -#define XFS_BLF_GDQUOT_BUF 0x10 +#define XFS_BLF_UDQUOT_BUF (1<<2) +#define XFS_BLF_PDQUOT_BUF (1<<3) +#define XFS_BLF_GDQUOT_BUF (1<<4) + +/* + * all buffers now need flags to tell recovery where the magic number + * is so that it can verify and calculate the CRCs on the buffer correctly + * once the changes have been replayed into the buffer. + */ +#define XFS_BLF_BTREE_BUF (1<<5) + +#define XFS_BLF_TYPE_MASK \ + (XFS_BLF_UDQUOT_BUF | \ + XFS_BLF_PDQUOT_BUF | \ + XFS_BLF_GDQUOT_BUF | \ + XFS_BLF_BTREE_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h index 88a3368..6b5bd17 100644 --- a/fs/xfs/xfs_dinode.h +++ b/fs/xfs/xfs_dinode.h @@ -107,8 +107,8 @@ typedef enum xfs_dinode_fmt { #define XFS_LITINO(mp, version) \ ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) -#define XFS_BROOT_SIZE_ADJ \ - (XFS_BTREE_LBLOCK_LEN - sizeof(xfs_bmdr_block_t)) +#define XFS_BROOT_SIZE_ADJ(ip) \ + (XFS_BMBT_BLOCK_LEN((ip)->i_mount) - sizeof(xfs_bmdr_block_t)) /* * Inode data & attribute fork sizes, per inode. diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 2866b8c..6fe286a 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -316,7 +316,13 @@ xfs_growfs_data_private( goto error0; } - xfs_btree_init_block(mp, bp, XFS_ABTB_MAGIC, 0, 1, 0); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, bp, XFS_ABTB_CRC_MAGIC, 0, 1, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, bp, XFS_ABTB_MAGIC, 0, 1, + agno, 0); + arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1); arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); arec->ar_blockcount = cpu_to_be32( @@ -339,7 +345,13 @@ xfs_growfs_data_private( goto error0; } - xfs_btree_init_block(mp, bp, XFS_ABTC_MAGIC, 0, 1, 0); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, bp, XFS_ABTC_CRC_MAGIC, 0, 1, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, bp, XFS_ABTC_MAGIC, 0, 1, + agno, 0); + arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1); arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); arec->ar_blockcount = cpu_to_be32( @@ -363,7 +375,12 @@ xfs_growfs_data_private( goto error0; } - xfs_btree_init_block(mp, bp, XFS_IBT_MAGIC, 0, 0, 0); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, bp, XFS_IBT_CRC_MAGIC, 0, 0, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, bp, XFS_IBT_MAGIC, 0, 0, + agno, 0); error = xfs_bwrite(bp); xfs_buf_relse(bp); diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index bec344b..c82ac88 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -34,6 +34,7 @@ #include "xfs_alloc.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_cksum.h" STATIC int @@ -182,52 +183,88 @@ xfs_inobt_key_diff( cur->bc_rec.i.ir_startino; } -void +static int xfs_inobt_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_perag *pag = bp->b_pag; unsigned int level; - int sblock_ok; /* block passes checks */ - /* magic number and level verification */ - level = be16_to_cpu(block->bb_level); - sblock_ok = block->bb_magic == cpu_to_be32(XFS_IBT_MAGIC) && - level < mp->m_in_maxlevels; + /* + * During growfs operations, we can't verify the exact owner as the + * perag is not fully initialised and hence not attached to the buffer. + * + * Similarly, during log recovery we will have a perag structure + * attached, but the agi information will not yet have been initialised + * from the on disk AGI. We don't currently use any of this information, + * but beware of the landmine (i.e. need to check pag->pagi_init) if we + * ever do. + */ + switch (block->bb_magic) { + case cpu_to_be32(XFS_IBT_CRC_MAGIC): + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.s.bb_blkno != cpu_to_be64(bp->b_bn)) + return false; + if (pag && + be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) + return false; + /* fall through */ + case cpu_to_be32(XFS_IBT_MAGIC): + break; + default: + return 0; + } - /* numrecs verification */ - sblock_ok = sblock_ok && - be16_to_cpu(block->bb_numrecs) <= mp->m_inobt_mxr[level != 0]; + /* numrecs and level verification */ + level = be16_to_cpu(block->bb_level); + if (level >= mp->m_in_maxlevels) + return false; + if (be16_to_cpu(block->bb_numrecs) > mp->m_inobt_mxr[level != 0]) + return false; /* sibling pointer verification */ - sblock_ok = sblock_ok && - (block->bb_u.s.bb_leftsib == cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_leftsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_leftsib && - (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_rightsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_rightsib; - - if (!sblock_ok) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } + if (!block->bb_u.s.bb_leftsib || + (be32_to_cpu(block->bb_u.s.bb_leftsib) >= mp->m_sb.sb_agblocks && + block->bb_u.s.bb_leftsib != cpu_to_be32(NULLAGBLOCK))) + return false; + if (!block->bb_u.s.bb_rightsib || + (be32_to_cpu(block->bb_u.s.bb_rightsib) >= mp->m_sb.sb_agblocks && + block->bb_u.s.bb_rightsib != cpu_to_be32(NULLAGBLOCK))) + return false; + + return true; } static void xfs_inobt_read_verify( struct xfs_buf *bp) { - xfs_inobt_verify(bp); + if (!(xfs_btree_sblock_verify_crc(bp) && + xfs_inobt_verify(bp))) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void xfs_inobt_write_verify( struct xfs_buf *bp) { - xfs_inobt_verify(bp); + if (!xfs_inobt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + xfs_btree_sblock_calc_crc(bp); + } const struct xfs_buf_ops xfs_inobt_buf_ops = { @@ -301,6 +338,8 @@ xfs_inobt_init_cursor( cur->bc_blocklog = mp->m_sb.sb_blocklog; cur->bc_ops = &xfs_inobt_ops; + if (xfs_sb_version_hascrc(&mp->m_sb)) + cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; cur->bc_private.a.agbp = agbp; cur->bc_private.a.agno = agno; diff --git a/fs/xfs/xfs_ialloc_btree.h b/fs/xfs/xfs_ialloc_btree.h index 25c0239..3ac36b76 100644 --- a/fs/xfs/xfs_ialloc_btree.h +++ b/fs/xfs/xfs_ialloc_btree.h @@ -29,7 +29,8 @@ struct xfs_mount; /* * There is a btree for the inode map per allocation group. */ -#define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ +#define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ +#define XFS_IBT_CRC_MAGIC 0x49414233 /* 'IAB3' */ typedef __uint64_t xfs_inofree_t; #define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) @@ -76,10 +77,10 @@ typedef __be32 xfs_inobt_ptr_t; /* * Btree block header size depends on a superblock flag. - * - * (not quite yet, but soon) */ -#define XFS_INOBT_BLOCK_LEN(mp) XFS_BTREE_SBLOCK_LEN +#define XFS_INOBT_BLOCK_LEN(mp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + XFS_BTREE_SBLOCK_CRC_LEN : XFS_BTREE_SBLOCK_LEN) /* * Record, key, and pointer address macros for btree blocks. diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 4f20165..202ce37 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -786,6 +786,7 @@ xfs_iformat_btree( xfs_dinode_t *dip, int whichfork) { + struct xfs_mount *mp = ip->i_mount; xfs_bmdr_block_t *dfp; xfs_ifork_t *ifp; /* REFERENCED */ @@ -794,7 +795,7 @@ xfs_iformat_btree( ifp = XFS_IFORK_PTR(ip, whichfork); dfp = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); - size = XFS_BMAP_BROOT_SPACE(dfp); + size = XFS_BMAP_BROOT_SPACE(mp, dfp); nrecs = be16_to_cpu(dfp->bb_numrecs); /* @@ -805,14 +806,14 @@ xfs_iformat_btree( * blocks. */ if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <= - XFS_IFORK_MAXEXT(ip, whichfork) || + XFS_IFORK_MAXEXT(ip, whichfork) || XFS_BMDR_SPACE_CALC(nrecs) > - XFS_DFORK_SIZE(dip, ip->i_mount, whichfork) || + XFS_DFORK_SIZE(dip, mp, whichfork) || XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) { - xfs_warn(ip->i_mount, "corrupt inode %Lu (btree).", - (unsigned long long) ip->i_ino); + xfs_warn(mp, "corrupt inode %Lu (btree).", + (unsigned long long) ip->i_ino); XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW, - ip->i_mount, dip); + mp, dip); return XFS_ERROR(EFSCORRUPTED); } @@ -823,8 +824,7 @@ xfs_iformat_btree( * Copy and convert from the on-disk structure * to the in-memory structure. */ - xfs_bmdr_to_bmbt(ip->i_mount, dfp, - XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), + xfs_bmdr_to_bmbt(ip, dfp, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), ifp->if_broot, size); ifp->if_flags &= ~XFS_IFEXTENTS; ifp->if_flags |= XFS_IFBROOT; @@ -2037,7 +2037,7 @@ xfs_iroot_realloc( * allocate it now and get out. */ if (ifp->if_broot_bytes == 0) { - new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff); + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, rec_diff); ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); ifp->if_broot_bytes = (int)new_size; return; @@ -2051,9 +2051,9 @@ xfs_iroot_realloc( */ cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); new_max = cur_max + rec_diff; - new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, - (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */ + XFS_BMAP_BROOT_SPACE_CALC(mp, cur_max), KM_SLEEP | KM_NOFS); op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, ifp->if_broot_bytes); @@ -2061,7 +2061,7 @@ xfs_iroot_realloc( (int)new_size); ifp->if_broot_bytes = (int)new_size; ASSERT(ifp->if_broot_bytes <= - XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ); + XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ(ip)); memmove(np, op, cur_max * (uint)sizeof(xfs_dfsbno_t)); return; } @@ -2076,7 +2076,7 @@ xfs_iroot_realloc( new_max = cur_max + rec_diff; ASSERT(new_max >= 0); if (new_max > 0) - new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); else new_size = 0; if (new_size > 0) { @@ -2084,7 +2084,8 @@ xfs_iroot_realloc( /* * First copy over the btree block header. */ - memcpy(new_broot, ifp->if_broot, XFS_BTREE_LBLOCK_LEN); + memcpy(new_broot, ifp->if_broot, + XFS_BMBT_BLOCK_LEN(ip->i_mount)); } else { new_broot = NULL; ifp->if_flags &= ~XFS_IFBROOT; @@ -2114,7 +2115,7 @@ xfs_iroot_realloc( ifp->if_broot = new_broot; ifp->if_broot_bytes = (int)new_size; ASSERT(ifp->if_broot_bytes <= - XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ); + XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ(ip)); return; } @@ -2427,7 +2428,7 @@ xfs_iflush_fork( ASSERT(ifp->if_broot != NULL); ASSERT(ifp->if_broot_bytes <= (XFS_IFORK_SIZE(ip, whichfork) + - XFS_BROOT_SIZE_ADJ)); + XFS_BROOT_SIZE_ADJ(ip))); xfs_bmbt_to_bmdr(mp, ifp->if_broot, ifp->if_broot_bytes, (xfs_bmdr_block_t *)cp, XFS_DFORK_SIZE(dip, mp, whichfork)); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 3ca3380..3762ce2 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -29,6 +29,7 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" +#include "xfs_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" @@ -1928,6 +1929,33 @@ xlog_recover_do_reg_buffer( /* Shouldn't be any more regions */ ASSERT(i == item->ri_total); + + switch (buf_f->blf_flags & XFS_BLF_TYPE_MASK) { + case XFS_BLF_BTREE_BUF: + switch (be32_to_cpu(*(__be32 *)bp->b_addr)) { + case XFS_ABTB_CRC_MAGIC: + case XFS_ABTC_CRC_MAGIC: + case XFS_ABTB_MAGIC: + case XFS_ABTC_MAGIC: + bp->b_ops = &xfs_allocbt_buf_ops; + break; + case XFS_IBT_CRC_MAGIC: + case XFS_IBT_MAGIC: + bp->b_ops = &xfs_inobt_buf_ops; + break; + case XFS_BMAP_CRC_MAGIC: + case XFS_BMAP_MAGIC: + bp->b_ops = &xfs_bmbt_buf_ops; + break; + default: + xfs_warn(mp, "Bad btree block magic!"); + ASSERT(0); + break; + } + break; + default: + break; + } } /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index cd29f61..1b04fe5 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -505,6 +505,8 @@ void xfs_trans_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); +void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, + uint); void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 3edf5db..f950edd 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -659,6 +659,7 @@ xfs_trans_binval( ASSERT(XFS_BUF_ISSTALE(bp)); ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); ASSERT(!(bip->__bli_format.blf_flags & XFS_BLF_INODE_BUF)); + ASSERT(!(bip->__bli_format.blf_flags & XFS_BLF_TYPE_MASK)); ASSERT(bip->__bli_format.blf_flags & XFS_BLF_CANCEL); ASSERT(bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY); ASSERT(tp->t_flags & XFS_TRANS_DIRTY); @@ -671,6 +672,7 @@ xfs_trans_binval( bip->bli_flags &= ~(XFS_BLI_INODE_BUF | XFS_BLI_LOGGED | XFS_BLI_DIRTY); bip->__bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; bip->__bli_format.blf_flags |= XFS_BLF_CANCEL; + bip->__bli_format.blf_flags &= ~XFS_BLF_TYPE_MASK; for (i = 0; i < bip->bli_format_count; i++) { memset(bip->bli_formats[i].blf_data_map, 0, (bip->bli_formats[i].blf_map_size * sizeof(uint))); @@ -751,6 +753,26 @@ xfs_trans_inode_alloc_buf( bip->bli_flags |= XFS_BLI_INODE_ALLOC_BUF; } +/* + * Set the type of the buffer for log recovery so that it can correctly identify + * and hence attach the correct buffer ops to the buffer after replay. + */ +void +xfs_trans_buf_set_type( + struct xfs_trans *tp, + struct xfs_buf *bp, + uint type) +{ + struct xfs_buf_log_item *bip = bp->b_fspriv; + + ASSERT(bp->b_transp == tp); + ASSERT(bip != NULL); + ASSERT(atomic_read(&bip->bli_refcount) > 0); + ASSERT((type & XFS_BLF_TYPE_MASK) != 0); + + bip->__bli_format.blf_flags &= ~XFS_BLF_TYPE_MASK; + bip->__bli_format.blf_flags |= type; +} /* * Similar to xfs_trans_inode_buf(), this marks the buffer as a cluster of @@ -769,14 +791,9 @@ xfs_trans_dquot_buf( xfs_buf_t *bp, uint type) { - xfs_buf_log_item_t *bip = bp->b_fspriv; - - ASSERT(bp->b_transp == tp); - ASSERT(bip != NULL); ASSERT(type == XFS_BLF_UDQUOT_BUF || type == XFS_BLF_PDQUOT_BUF || type == XFS_BLF_GDQUOT_BUF); - ASSERT(atomic_read(&bip->bli_refcount) > 0); - bip->__bli_format.blf_flags |= type; + xfs_trans_buf_set_type(tp, bp, type); } -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:11:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D93C87FB3 for ; Wed, 3 Apr 2013 00:11:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 75FE2AC002 for ; Tue, 2 Apr 2013 22:11:50 -0700 (PDT) X-ASG-Debug-ID: 1364965908-04bdf0542b18ea70001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cz7DzhPxShj2g9cE for ; Tue, 02 Apr 2013 22:11: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: Aj8KAJm4W1F5LBrj/2dsb2JhbABDgwfAZQQBgQcXdIIfAQEFJy8zCBgxOQMbGYgTwVuNfIESBoNMA6d2gx8o Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:45 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFyx-0000L1-5R for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:35 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFyx-0005B1-2R for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:35 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 04/22] xfs: add CRC checks to the AGFL Date: Wed, 3 Apr 2013 16:11:14 +1100 X-ASG-Orig-Subj: [PATCH 04/22] xfs: add CRC checks to the AGFL Message-Id: <1364965892-19623-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965908 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Christoph Hellwig Add CRC checks, location information and a magic number to the AGFL. Previously the AGFL was just a block containing nothing but the free block pointers. The new AGFL has a real header with the usual boilerplate instead, so that we can verify it's not corrupted and written into the right place. [dchinner@redhat.com] Added LSN field, reworked significantly to fit into new verifier structure and growfs structure, enabled full verifier functionality now there is a header to verify and we can guarantee an initialised AGFL. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_ag.h | 25 +++++++++- fs/xfs/xfs_alloc.c | 119 ++++++++++++++++++++++++++++++---------------- fs/xfs/xfs_buf_item.h | 4 +- fs/xfs/xfs_fsops.c | 5 ++ fs/xfs/xfs_log_recover.c | 10 ++++ 5 files changed, 119 insertions(+), 44 deletions(-) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 9f4815e..272ef09 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -30,6 +30,7 @@ struct xfs_trans; #define XFS_AGF_MAGIC 0x58414746 /* 'XAGF' */ #define XFS_AGI_MAGIC 0x58414749 /* 'XAGI' */ +#define XFS_AGFL_MAGIC 0x5841464c /* 'XAFL' */ #define XFS_AGF_VERSION 1 #define XFS_AGI_VERSION 1 @@ -190,11 +191,31 @@ extern const struct xfs_buf_ops xfs_agi_buf_ops; */ #define XFS_AGFL_DADDR(mp) ((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) #define XFS_AGFL_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp)) -#define XFS_AGFL_SIZE(mp) ((mp)->m_sb.sb_sectsize / sizeof(xfs_agblock_t)) #define XFS_BUF_TO_AGFL(bp) ((xfs_agfl_t *)((bp)->b_addr)) +#define XFS_BUF_TO_AGFL_BNO(mp, bp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + &(XFS_BUF_TO_AGFL(bp)->agfl_bno[0]) : \ + (__be32 *)(bp)->b_addr) + +/* + * Size of the AGFL. For CRC-enabled filesystes we steal a couple of + * slots in the beginning of the block for a proper header with the + * location information and CRC. + */ +#define XFS_AGFL_SIZE(mp) \ + (((mp)->m_sb.sb_sectsize - \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + sizeof(struct xfs_agfl) : 0)) / \ + sizeof(xfs_agblock_t)) + typedef struct xfs_agfl { - __be32 agfl_bno[1]; /* actually XFS_AGFL_SIZE(mp) */ + __be32 agfl_magicnum; + __be32 agfl_seqno; + uuid_t agfl_uuid; + __be64 agfl_lsn; + __be32 agfl_crc; + __be32 agfl_bno[]; /* actually XFS_AGFL_SIZE(mp) */ } xfs_agfl_t; /* diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index c34f799..40d3d57 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -432,53 +432,84 @@ xfs_alloc_fixup_trees( return 0; } -static void +static bool xfs_agfl_verify( struct xfs_buf *bp) { -#ifdef WHEN_CRCS_COME_ALONG - /* - * we cannot actually do any verification of the AGFL because mkfs does - * not initialise the AGFL to zero or NULL. Hence the only valid part of - * the AGFL is what the AGF says is active. We can't get to the AGF, so - * we can't verify just those entries are valid. - * - * This problem goes away when the CRC format change comes along as that - * requires the AGFL to be initialised by mkfs. At that point, we can - * verify the blocks in the agfl -active or not- lie within the bounds - * of the AG. Until then, just leave this check ifdef'd out. - */ struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_agfl *agfl = XFS_BUF_TO_AGFL(bp); - int agfl_ok = 1; - int i; + if (!uuid_equal(&agfl->agfl_uuid, &mp->m_sb.sb_uuid)) + return false; + if (be32_to_cpu(agfl->agfl_magicnum) != XFS_AGFL_MAGIC) + return false; + /* + * during growfs operations, the perag is not fully initialised, + * so we can't use it for any useful checking. growfs ensures we can't + * use it by using uncached buffers that don't have the perag attached + * so we can detect and avoid this problem. + */ + if (bp->b_pag && be32_to_cpu(agfl->agfl_seqno) != bp->b_pag->pag_agno) + return false; + for (i = 0; i < XFS_AGFL_SIZE(mp); i++) { - if (be32_to_cpu(agfl->agfl_bno[i]) == NULLAGBLOCK || + if (be32_to_cpu(agfl->agfl_bno[i]) != NULLAGBLOCK && be32_to_cpu(agfl->agfl_bno[i]) >= mp->m_sb.sb_agblocks) - agfl_ok = 0; + return false; } + return true; +} + +static void +xfs_agfl_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + int agfl_ok = 1; + + /* + * There is no verification of non-crc AGFLs because mkfs does not + * initialise the AGFL to zero or NULL. Hence the only valid part of the + * AGFL is what the AGF says is active. We can't get to the AGF, so we + * can't verify just those entries are valid. + */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + agfl_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agfl, agfl_crc)); + + agfl_ok = agfl_ok && xfs_agfl_verify(bp); if (!agfl_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agfl); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } -#endif } static void xfs_agfl_write_verify( struct xfs_buf *bp) { - xfs_agfl_verify(bp); -} + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; -static void -xfs_agfl_read_verify( - struct xfs_buf *bp) -{ - xfs_agfl_verify(bp); + /* no verification of non-crc AGFLs */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_agfl_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (bip) + XFS_BUF_TO_AGFL(bp)->agfl_lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agfl, agfl_crc)); } const struct xfs_buf_ops xfs_agfl_buf_ops = { @@ -1984,18 +2015,18 @@ xfs_alloc_get_freelist( int btreeblk) /* destination is a AGF btree */ { xfs_agf_t *agf; /* a.g. freespace structure */ - xfs_agfl_t *agfl; /* a.g. freelist structure */ xfs_buf_t *agflbp;/* buffer for a.g. freelist structure */ xfs_agblock_t bno; /* block number returned */ + __be32 *agfl_bno; int error; int logflags; - xfs_mount_t *mp; /* mount structure */ + xfs_mount_t *mp = tp->t_mountp; xfs_perag_t *pag; /* per allocation group data */ - agf = XFS_BUF_TO_AGF(agbp); /* * Freelist is empty, give up. */ + agf = XFS_BUF_TO_AGF(agbp); if (!agf->agf_flcount) { *bnop = NULLAGBLOCK; return 0; @@ -2003,15 +2034,17 @@ xfs_alloc_get_freelist( /* * Read the array of free blocks. */ - mp = tp->t_mountp; - if ((error = xfs_alloc_read_agfl(mp, tp, - be32_to_cpu(agf->agf_seqno), &agflbp))) + error = xfs_alloc_read_agfl(mp, tp, be32_to_cpu(agf->agf_seqno), + &agflbp); + if (error) return error; - agfl = XFS_BUF_TO_AGFL(agflbp); + + /* * Get the block number and update the data structures. */ - bno = be32_to_cpu(agfl->agfl_bno[be32_to_cpu(agf->agf_flfirst)]); + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp); + bno = be32_to_cpu(agfl_bno[be32_to_cpu(agf->agf_flfirst)]); be32_add_cpu(&agf->agf_flfirst, 1); xfs_trans_brelse(tp, agflbp); if (be32_to_cpu(agf->agf_flfirst) == XFS_AGFL_SIZE(mp)) @@ -2104,12 +2137,13 @@ xfs_alloc_put_freelist( int btreeblk) /* block came from a AGF btree */ { xfs_agf_t *agf; /* a.g. freespace structure */ - xfs_agfl_t *agfl; /* a.g. free block array */ __be32 *blockp;/* pointer to array entry */ int error; int logflags; xfs_mount_t *mp; /* mount structure */ xfs_perag_t *pag; /* per allocation group data */ + __be32 *agfl_bno; + int startoff; agf = XFS_BUF_TO_AGF(agbp); mp = tp->t_mountp; @@ -2117,7 +2151,6 @@ xfs_alloc_put_freelist( if (!agflbp && (error = xfs_alloc_read_agfl(mp, tp, be32_to_cpu(agf->agf_seqno), &agflbp))) return error; - agfl = XFS_BUF_TO_AGFL(agflbp); be32_add_cpu(&agf->agf_fllast, 1); if (be32_to_cpu(agf->agf_fllast) == XFS_AGFL_SIZE(mp)) agf->agf_fllast = 0; @@ -2138,13 +2171,17 @@ xfs_alloc_put_freelist( xfs_alloc_log_agf(tp, agbp, logflags); ASSERT(be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp)); - blockp = &agfl->agfl_bno[be32_to_cpu(agf->agf_fllast)]; + + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp); + blockp = &agfl_bno[be32_to_cpu(agf->agf_fllast)]; *blockp = cpu_to_be32(bno); + startoff = (char *)blockp - (char *)agflbp->b_addr; + xfs_alloc_log_agf(tp, agbp, logflags); - xfs_trans_log_buf(tp, agflbp, - (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl), - (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl + - sizeof(xfs_agblock_t) - 1)); + + xfs_trans_buf_set_type(tp, agflbp, XFS_BLF_AGFL_BUF); + xfs_trans_log_buf(tp, agflbp, startoff, + startoff + sizeof(xfs_agblock_t) - 1); return 0; } diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 76bd7a1..067d5f0 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -46,13 +46,15 @@ extern kmem_zone_t *xfs_buf_item_zone; */ #define XFS_BLF_BTREE_BUF (1<<5) #define XFS_BLF_AGF_BUF (1<<6) +#define XFS_BLF_AGFL_BUF (1<<7) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ XFS_BLF_PDQUOT_BUF | \ XFS_BLF_GDQUOT_BUF | \ XFS_BLF_BTREE_BUF | \ - XFS_BLF_AGF_BUF) + XFS_BLF_AGF_BUF | \ + XFS_BLF_AGFL_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index b6cca27..a693a54 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -268,6 +268,11 @@ xfs_growfs_data_private( } agfl = XFS_BUF_TO_AGFL(bp); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC); + agfl->agfl_seqno = cpu_to_be32(agno); + uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_uuid); + } for (bucket = 0; bucket < XFS_AGFL_SIZE(mp); bucket++) agfl->agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index dadf245..da2a19e 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1961,6 +1961,16 @@ xlog_recover_do_reg_buffer( } bp->b_ops = &xfs_agf_buf_ops; break; + case XFS_BLF_AGFL_BUF: + if (!xfs_sb_version_hascrc(&mp->m_sb)) + break; + if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_AGFL_MAGIC)) { + xfs_warn(mp, "Bad AGFL block magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_agfl_buf_ops; + break; default: break; } -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:11:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2B67F7FA4 for ; Wed, 3 Apr 2013 00:11:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0C916304081 for ; Tue, 2 Apr 2013 22:11:52 -0700 (PDT) X-ASG-Debug-ID: 1364965906-04cbb01fba194150003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id F2bvteIzK44qDhgJ for ; Tue, 02 Apr 2013 22:11: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: AkAKAJm4W1F5LBrj/2dsb2JhbABDgwfAZQQBgQcXdIIfAQEFGg0vMwgYMTkDGxmIE8FbjXyBEoNSA6d2gx8o Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:46 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFz7-0000LX-FN for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:45 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFz7-0005Bh-BZ for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:45 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 12/22] xfs: add CRC checking to dir2 data blocks Date: Wed, 3 Apr 2013 16:11:22 +1100 X-ASG-Orig-Subj: [PATCH 12/22] xfs: add CRC checking to dir2 data blocks Message-Id: <1364965892-19623-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965909 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner This addition follows the same pattern as the dir2 block CRCs. Signed-off-by: Dave Chinner --- fs/xfs/xfs_dir2_block.c | 22 +++++----- fs/xfs/xfs_dir2_data.c | 100 ++++++++++++++++++++++++++++++++-------------- fs/xfs/xfs_dir2_format.h | 21 +++++----- fs/xfs/xfs_dir2_leaf.c | 71 ++++++++++++++++++-------------- fs/xfs/xfs_dir2_node.c | 39 ++++++++++-------- fs/xfs/xfs_dir2_priv.h | 12 +++--- fs/xfs/xfs_file.c | 2 +- 7 files changed, 162 insertions(+), 105 deletions(-) diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 79a3f1b..7ec87c2 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -77,7 +77,7 @@ xfs_dir3_block_verify( if (hdr3->magic != cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) return false; } - if (__xfs_dir2_data_check(NULL, bp)) + if (__xfs_dir3_data_check(NULL, bp)) return false; return true; } @@ -553,7 +553,7 @@ xfs_dir2_block_addname( xfs_dir2_data_log_header(tp, bp); xfs_dir2_block_log_tail(tp, bp); xfs_dir2_data_log_entry(tp, bp, dep); - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); return 0; } @@ -596,7 +596,7 @@ xfs_dir2_block_getdents( */ wantoff = xfs_dir2_dataptr_to_off(mp, *offset); hdr = bp->b_addr; - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); /* * Set up values for the loop. */ @@ -720,7 +720,7 @@ xfs_dir2_block_lookup( dp = args->dp; mp = dp->i_mount; hdr = bp->b_addr; - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); /* @@ -771,7 +771,7 @@ xfs_dir2_block_lookup_int( return error; hdr = bp->b_addr; - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); /* @@ -908,7 +908,7 @@ xfs_dir2_block_removename( xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, bp); - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); /* * See if the size as a shortform is good enough. */ @@ -965,7 +965,7 @@ xfs_dir2_block_replace( */ dep->inumber = cpu_to_be64(args->inumber); xfs_dir2_data_log_entry(args->trans, bp, dep); - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); return 0; } @@ -1046,12 +1046,14 @@ xfs_dir2_leaf_to_block( * Read the data block if we don't already have it, give up if it fails. */ if (!dbp) { - error = xfs_dir2_data_read(tp, dp, mp->m_dirdatablk, -1, &dbp); + error = xfs_dir3_data_read(tp, dp, mp->m_dirdatablk, -1, &dbp); if (error) return error; } hdr = dbp->b_addr; - ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC)); + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); + /* * Size of the "leaf" area in the block. */ @@ -1329,6 +1331,6 @@ xfs_dir2_sf_to_block( ASSERT(needscan == 0); xfs_dir2_block_log_leaf(tp, bp, 0, be32_to_cpu(btp->count) - 1); xfs_dir2_block_log_tail(tp, bp); - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); return 0; } diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 8484ec4..78320df 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -31,6 +31,8 @@ #include "xfs_dir2_format.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" +#include "xfs_buf_item.h" +#include "xfs_cksum.h" STATIC xfs_dir2_data_free_t * xfs_dir2_data_freefind(xfs_dir2_data_hdr_t *hdr, xfs_dir2_data_unused_t *dup); @@ -41,7 +43,7 @@ xfs_dir2_data_freefind(xfs_dir2_data_hdr_t *hdr, xfs_dir2_data_unused_t *dup); * Return 0 is the buffer is good, otherwise an error. */ int -__xfs_dir2_data_check( +__xfs_dir3_data_check( struct xfs_inode *dp, /* incore inode pointer */ struct xfs_buf *bp) /* data block's buffer */ { @@ -76,6 +78,7 @@ __xfs_dir2_data_check( lep = xfs_dir2_block_leaf_p(btp); endp = (char *)lep; break; + case cpu_to_be32(XFS_DIR3_DATA_MAGIC): case cpu_to_be32(XFS_DIR2_DATA_MAGIC): endp = (char *)hdr + mp->m_dirblksize; break; @@ -189,21 +192,27 @@ __xfs_dir2_data_check( return 0; } -static void -xfs_dir2_data_verify( +static bool +xfs_dir3_data_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_dir2_data_hdr *hdr = bp->b_addr; - int block_ok = 0; + struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; - block_ok = hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC); - block_ok = block_ok && __xfs_dir2_data_check(NULL, bp) == 0; - - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (hdr3->magic != cpu_to_be32(XFS_DIR3_DATA_MAGIC)) + return false; + if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(hdr3->blkno) != bp->b_bn) + return false; + } else { + if (hdr3->magic != cpu_to_be32(XFS_DIR2_DATA_MAGIC)) + return false; } + if (__xfs_dir3_data_check(NULL, bp)) + return false; + return true; } /* @@ -212,7 +221,7 @@ xfs_dir2_data_verify( * format buffer or a data format buffer on readahead. */ static void -xfs_dir2_data_reada_verify( +xfs_dir3_data_reada_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; @@ -225,7 +234,8 @@ xfs_dir2_data_reada_verify( bp->b_ops->verify_read(bp); return; case cpu_to_be32(XFS_DIR2_DATA_MAGIC): - xfs_dir2_data_verify(bp); + case cpu_to_be32(XFS_DIR3_DATA_MAGIC): + xfs_dir3_data_verify(bp); return; default: XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); @@ -235,32 +245,56 @@ xfs_dir2_data_reada_verify( } static void -xfs_dir2_data_read_verify( +xfs_dir3_data_read_verify( struct xfs_buf *bp) { - xfs_dir2_data_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_DIR3_DATA_CRC_OFF)) || + !xfs_dir3_data_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void -xfs_dir2_data_write_verify( +xfs_dir3_data_write_verify( struct xfs_buf *bp) { - xfs_dir2_data_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; + + if (!xfs_dir3_data_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_DATA_CRC_OFF); } -const struct xfs_buf_ops xfs_dir2_data_buf_ops = { - .verify_read = xfs_dir2_data_read_verify, - .verify_write = xfs_dir2_data_write_verify, +const struct xfs_buf_ops xfs_dir3_data_buf_ops = { + .verify_read = xfs_dir3_data_read_verify, + .verify_write = xfs_dir3_data_write_verify, }; -static const struct xfs_buf_ops xfs_dir2_data_reada_buf_ops = { - .verify_read = xfs_dir2_data_reada_verify, - .verify_write = xfs_dir2_data_write_verify, +static const struct xfs_buf_ops xfs_dir3_data_reada_buf_ops = { + .verify_read = xfs_dir3_data_reada_verify, + .verify_write = xfs_dir3_data_write_verify, }; int -xfs_dir2_data_read( +xfs_dir3_data_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, @@ -268,18 +302,18 @@ xfs_dir2_data_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp, - XFS_DATA_FORK, &xfs_dir2_data_buf_ops); + XFS_DATA_FORK, &xfs_dir3_data_buf_ops); } int -xfs_dir2_data_readahead( +xfs_dir3_data_readahead( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mapped_bno) { return xfs_da_reada_buf(tp, dp, bno, mapped_bno, - XFS_DATA_FORK, &xfs_dir2_data_reada_buf_ops); + XFS_DATA_FORK, &xfs_dir3_data_reada_buf_ops); } /* @@ -309,6 +343,7 @@ xfs_dir2_data_freefind( * one we're looking for it has to be exact. */ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); for (dfp = &bf[0], seenzero = matched = 0; @@ -458,6 +493,7 @@ xfs_dir2_data_freescan( char *p; /* current entry pointer */ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); @@ -534,13 +570,12 @@ xfs_dir3_data_init( XFS_DATA_FORK); if (error) return error; - bp->b_ops = &xfs_dir2_data_buf_ops; + bp->b_ops = &xfs_dir3_data_buf_ops; /* * Initialize the header. */ hdr = bp->b_addr; - if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; @@ -591,6 +626,7 @@ xfs_dir2_data_log_entry( xfs_dir2_data_hdr_t *hdr = bp->b_addr; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); @@ -610,6 +646,7 @@ xfs_dir2_data_log_header( xfs_dir2_data_hdr_t *hdr = bp->b_addr; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); @@ -628,6 +665,7 @@ xfs_dir2_data_log_unused( xfs_dir2_data_hdr_t *hdr = bp->b_addr; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); @@ -675,7 +713,8 @@ xfs_dir2_data_make_free( /* * Figure out where the end of the data area is. */ - if (hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC)) + if (hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)) endptr = (char *)hdr + mp->m_dirblksize; else { xfs_dir2_block_tail_t *btp; /* block tail */ @@ -857,6 +896,7 @@ xfs_dir2_data_use_free( hdr = bp->b_addr; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); ASSERT(be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG); diff --git a/fs/xfs/xfs_dir2_format.h b/fs/xfs/xfs_dir2_format.h index ec5044a..0ac0950 100644 --- a/fs/xfs/xfs_dir2_format.h +++ b/fs/xfs/xfs_dir2_format.h @@ -283,7 +283,8 @@ struct xfs_dir3_data_hdr { static inline struct xfs_dir2_data_free * xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) { - if (hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { + if (hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { struct xfs_dir3_data_hdr *hdr3 = (struct xfs_dir3_data_hdr *)hdr; return hdr3->best_free; } @@ -345,17 +346,6 @@ xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) be16_to_cpu(dup->length) - sizeof(__be16)); } -static inline struct xfs_dir2_data_unused * -xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) -{ - if (hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - return (struct xfs_dir2_data_unused *) - ((char *)hdr + sizeof(struct xfs_dir3_data_hdr)); - } - return (struct xfs_dir2_data_unused *) - ((char *)hdr + sizeof(struct xfs_dir2_data_hdr)); -} - static inline size_t xfs_dir3_data_hdr_size(bool dir3) { @@ -379,6 +369,13 @@ xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); } +static inline struct xfs_dir2_data_unused * +xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_unused *) + ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); +} + /* * Offsets of . and .. in data space (always block 0) */ diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 979735b..c7dca95 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -149,7 +149,7 @@ xfs_dir2_block_to_leaf( int needlog; /* need to log block header */ int needscan; /* need to rescan bestfree */ xfs_trans_t *tp; /* transaction pointer */ - struct xfs_dir2_data_free *bf; + struct xfs_dir2_data_free *bf; trace_xfs_dir2_block_to_leaf(args); @@ -175,7 +175,7 @@ xfs_dir2_block_to_leaf( ASSERT(lbp != NULL); leaf = lbp->b_addr; hdr = dbp->b_addr; - xfs_dir2_data_check(dp, dbp); + xfs_dir3_data_check(dp, dbp); btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); bf = xfs_dir3_data_bestfree_p(hdr); @@ -204,8 +204,12 @@ xfs_dir2_block_to_leaf( /* * Fix up the block header, make it a data block. */ - dbp->b_ops = &xfs_dir2_data_buf_ops; - hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); + dbp->b_ops = &xfs_dir3_data_buf_ops; + if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) + hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); + else + hdr->magic = cpu_to_be32(XFS_DIR3_DATA_MAGIC); + if (needscan) xfs_dir2_data_freescan(mp, hdr, &needlog); /* @@ -221,7 +225,7 @@ xfs_dir2_block_to_leaf( if (needlog) xfs_dir2_data_log_header(tp, dbp); xfs_dir2_leaf_check(dp, lbp); - xfs_dir2_data_check(dp, dbp); + xfs_dir3_data_check(dp, dbp); xfs_dir2_leaf_log_bests(tp, lbp, 0, 0); return 0; } @@ -385,6 +389,7 @@ xfs_dir2_leaf_addname( __be16 *tagp; /* end of data entry */ xfs_trans_t *tp; /* transaction pointer */ xfs_dir2_db_t use_block; /* data block number */ + struct xfs_dir2_data_free *bf; /* bestfree table */ trace_xfs_dir2_leaf_addname(args); @@ -568,14 +573,15 @@ xfs_dir2_leaf_addname( else xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); hdr = dbp->b_addr; - bestsp[use_block] = hdr->bestfree[0].length; + bf = xfs_dir3_data_bestfree_p(hdr); + bestsp[use_block] = bf[0].length; grown = 1; } else { /* * Already had space in some data block. * Just read that one in. */ - error = xfs_dir2_data_read(tp, dp, + error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, use_block), -1, &dbp); if (error) { @@ -583,13 +589,14 @@ xfs_dir2_leaf_addname( return error; } hdr = dbp->b_addr; + bf = xfs_dir3_data_bestfree_p(hdr); grown = 0; } /* * Point to the biggest freespace in our data block. */ dup = (xfs_dir2_data_unused_t *) - ((char *)hdr + be16_to_cpu(hdr->bestfree[0].offset)); + ((char *)hdr + be16_to_cpu(bf[0].offset)); ASSERT(be16_to_cpu(dup->length) >= length); needscan = needlog = 0; /* @@ -622,8 +629,8 @@ xfs_dir2_leaf_addname( * If the bests table needs to be changed, do it. * Log the change unless we've already done that. */ - if (be16_to_cpu(bestsp[use_block]) != be16_to_cpu(hdr->bestfree[0].length)) { - bestsp[use_block] = hdr->bestfree[0].length; + if (be16_to_cpu(bestsp[use_block]) != be16_to_cpu(bf[0].length)) { + bestsp[use_block] = bf[0].length; if (!grown) xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); } @@ -643,7 +650,7 @@ xfs_dir2_leaf_addname( xfs_dir2_leaf_log_header(tp, lbp); xfs_dir2_leaf_log_ents(tp, lbp, lfloglow, lfloghigh); xfs_dir2_leaf_check(dp, lbp); - xfs_dir2_data_check(dp, dbp); + xfs_dir3_data_check(dp, dbp); return 0; } @@ -967,7 +974,7 @@ xfs_dir2_leaf_readbuf( * Read the directory block starting at the first mapping. */ mip->curdb = xfs_dir2_da_to_db(mp, map->br_startoff); - error = xfs_dir2_data_read(NULL, dp, map->br_startoff, + error = xfs_dir3_data_read(NULL, dp, map->br_startoff, map->br_blockcount >= mp->m_dirblkfsbs ? XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); @@ -996,7 +1003,7 @@ xfs_dir2_leaf_readbuf( */ if (i > mip->ra_current && map[mip->ra_index].br_blockcount >= mp->m_dirblkfsbs) { - xfs_dir2_data_readahead(NULL, dp, + xfs_dir3_data_readahead(NULL, dp, map[mip->ra_index].br_startoff + mip->ra_offset, XFS_FSB_TO_DADDR(mp, map[mip->ra_index].br_startblock + @@ -1009,7 +1016,7 @@ xfs_dir2_leaf_readbuf( * use our mapping, but this is a very rare case. */ else if (i > mip->ra_current) { - xfs_dir2_data_readahead(NULL, dp, + xfs_dir3_data_readahead(NULL, dp, map[mip->ra_index].br_startoff + mip->ra_offset, -1); mip->ra_current = i; @@ -1135,17 +1142,17 @@ xfs_dir2_leaf_getdents( ASSERT(xfs_dir2_byte_to_db(mp, curoff) == map_info->curdb); hdr = bp->b_addr; - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); /* * Find our position in the block. */ - ptr = (char *)(hdr + 1); + ptr = (char *)xfs_dir3_data_entry_p(hdr); byteoff = xfs_dir2_byte_to_off(mp, curoff); /* * Skip past the header. */ if (byteoff == 0) - curoff += (uint)sizeof(*hdr); + curoff += xfs_dir3_data_entry_offset(hdr); /* * Skip past entries until we reach our offset. */ @@ -1481,7 +1488,7 @@ xfs_dir2_leaf_lookup_int( if (newdb != curdb) { if (dbp) xfs_trans_brelse(tp, dbp); - error = xfs_dir2_data_read(tp, dp, + error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, newdb), -1, &dbp); if (error) { @@ -1522,7 +1529,7 @@ xfs_dir2_leaf_lookup_int( ASSERT(cidb != -1); if (cidb != curdb) { xfs_trans_brelse(tp, dbp); - error = xfs_dir2_data_read(tp, dp, + error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, cidb), -1, &dbp); if (error) { @@ -1568,6 +1575,7 @@ xfs_dir2_leaf_removename( int needscan; /* need to rescan data frees */ xfs_dir2_data_off_t oldbest; /* old value of best free */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_data_free *bf; /* bestfree table */ trace_xfs_dir2_leaf_removename(args); @@ -1582,7 +1590,8 @@ xfs_dir2_leaf_removename( mp = dp->i_mount; leaf = lbp->b_addr; hdr = dbp->b_addr; - xfs_dir2_data_check(dp, dbp); + bf = xfs_dir3_data_bestfree_p(hdr); + xfs_dir3_data_check(dp, dbp); /* * Point to the leaf entry, use that to point to the data entry. */ @@ -1591,7 +1600,7 @@ xfs_dir2_leaf_removename( dep = (xfs_dir2_data_entry_t *) ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); needscan = needlog = 0; - oldbest = be16_to_cpu(hdr->bestfree[0].length); + oldbest = be16_to_cpu(bf[0].length); ltp = xfs_dir2_leaf_tail_p(mp, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); ASSERT(be16_to_cpu(bestsp[db]) == oldbest); @@ -1620,16 +1629,16 @@ xfs_dir2_leaf_removename( * If the longest freespace in the data block has changed, * put the new value in the bests table and log that. */ - if (be16_to_cpu(hdr->bestfree[0].length) != oldbest) { - bestsp[db] = hdr->bestfree[0].length; + if (be16_to_cpu(bf[0].length) != oldbest) { + bestsp[db] = bf[0].length; xfs_dir2_leaf_log_bests(tp, lbp, db, db); } - xfs_dir2_data_check(dp, dbp); + xfs_dir3_data_check(dp, dbp); /* * If the data block is now empty then get rid of the data block. */ - if (be16_to_cpu(hdr->bestfree[0].length) == - mp->m_dirblksize - (uint)sizeof(*hdr)) { + if (be16_to_cpu(bf[0].length) == + mp->m_dirblksize - xfs_dir3_data_entry_offset(hdr)) { ASSERT(db != mp->m_dirdatablk); if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { /* @@ -1809,7 +1818,7 @@ xfs_dir2_leaf_trim_data( /* * Read the offending data block. We need its buffer. */ - error = xfs_dir2_data_read(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp); + error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp); if (error) return error; @@ -1819,10 +1828,12 @@ xfs_dir2_leaf_trim_data( #ifdef DEBUG { struct xfs_dir2_data_hdr *hdr = dbp->b_addr; + struct xfs_dir2_data_free *bf = xfs_dir3_data_bestfree_p(hdr); - ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC)); - ASSERT(be16_to_cpu(hdr->bestfree[0].length) == - mp->m_dirblksize - (uint)sizeof(*hdr)); + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); + ASSERT(be16_to_cpu(bf[0].length) == + mp->m_dirblksize - xfs_dir3_data_entry_offset(hdr)); ASSERT(db == be32_to_cpu(ltp->bestcount) - 1); } #endif diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 0fe39b9..abf617d 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -753,13 +753,13 @@ xfs_dir2_leafn_lookup_for_entry( ASSERT(state->extravalid); curbp = state->extrablk.bp; } else { - error = xfs_dir2_data_read(tp, dp, + error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, newdb), -1, &curbp); if (error) return error; } - xfs_dir2_data_check(dp, curbp); + xfs_dir3_data_check(dp, curbp); curdb = newdb; } /* @@ -787,7 +787,7 @@ xfs_dir2_leafn_lookup_for_entry( state->extrablk.index = (int)((char *)dep - (char *)curbp->b_addr); state->extrablk.magic = XFS_DIR2_DATA_MAGIC; - curbp->b_ops = &xfs_dir2_data_buf_ops; + curbp->b_ops = &xfs_dir3_data_buf_ops; if (cmp == XFS_CMP_EXACT) return XFS_ERROR(EEXIST); } @@ -802,7 +802,7 @@ xfs_dir2_leafn_lookup_for_entry( state->extrablk.index = -1; state->extrablk.blkno = curdb; state->extrablk.magic = XFS_DIR2_DATA_MAGIC; - curbp->b_ops = &xfs_dir2_data_buf_ops; + curbp->b_ops = &xfs_dir3_data_buf_ops; } else { /* If the curbp is not the CI match block, drop it */ if (state->extrablk.bp != curbp) @@ -1152,6 +1152,7 @@ xfs_dir2_leafn_remove( int needlog; /* need to log data header */ int needscan; /* need to rescan data frees */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_data_free *bf; /* bestfree table */ trace_xfs_dir2_leafn_remove(args, index); @@ -1186,7 +1187,8 @@ xfs_dir2_leafn_remove( dbp = dblk->bp; hdr = dbp->b_addr; dep = (xfs_dir2_data_entry_t *)((char *)hdr + off); - longest = be16_to_cpu(hdr->bestfree[0].length); + bf = xfs_dir3_data_bestfree_p(hdr); + longest = be16_to_cpu(bf[0].length); needlog = needscan = 0; xfs_dir2_data_make_free(tp, dbp, off, xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); @@ -1198,12 +1200,12 @@ xfs_dir2_leafn_remove( xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, dbp); - xfs_dir2_data_check(dp, dbp); + xfs_dir3_data_check(dp, dbp); /* * If the longest data block freespace changes, need to update * the corresponding freeblock entry. */ - if (longest < be16_to_cpu(hdr->bestfree[0].length)) { + if (longest < be16_to_cpu(bf[0].length)) { int error; /* error return value */ struct xfs_buf *fbp; /* freeblock buffer */ xfs_dir2_db_t fdb; /* freeblock block number */ @@ -1232,12 +1234,13 @@ xfs_dir2_leafn_remove( * Calculate which entry we need to fix. */ findex = xfs_dir2_db_to_fdindex(mp, db); - longest = be16_to_cpu(hdr->bestfree[0].length); + longest = be16_to_cpu(bf[0].length); /* * If the data block is now empty we can get rid of it * (usually). */ - if (longest == mp->m_dirblksize - (uint)sizeof(*hdr)) { + if (longest == mp->m_dirblksize - + xfs_dir3_data_entry_offset(hdr)) { /* * Try to punch out the data block. */ @@ -1611,6 +1614,7 @@ xfs_dir2_node_addname_int( xfs_trans_t *tp; /* transaction pointer */ __be16 *bests; struct xfs_dir3_icfree_hdr freehdr; + struct xfs_dir2_data_free *bf; dp = args->dp; mp = dp->i_mount; @@ -1868,7 +1872,8 @@ xfs_dir2_node_addname_int( * change again. */ hdr = dbp->b_addr; - bests[findex] = hdr->bestfree[0].length; + bf = xfs_dir3_data_bestfree_p(hdr); + bests[findex] = bf[0].length; logfree = 1; } /* @@ -1884,19 +1889,20 @@ xfs_dir2_node_addname_int( /* * Read the data block in. */ - error = xfs_dir2_data_read(tp, dp, xfs_dir2_db_to_da(mp, dbno), + error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, dbno), -1, &dbp); if (error) return error; hdr = dbp->b_addr; + bf = xfs_dir3_data_bestfree_p(hdr); logfree = 0; } - ASSERT(be16_to_cpu(hdr->bestfree[0].length) >= length); + ASSERT(be16_to_cpu(bf[0].length) >= length); /* * Point to the existing unused space. */ dup = (xfs_dir2_data_unused_t *) - ((char *)hdr + be16_to_cpu(hdr->bestfree[0].offset)); + ((char *)hdr + be16_to_cpu(bf[0].offset)); needscan = needlog = 0; /* * Mark the first part of the unused space, inuse for us. @@ -1928,8 +1934,8 @@ xfs_dir2_node_addname_int( * If the freespace entry is now wrong, update it. */ bests = xfs_dir3_free_bests_p(mp, free); /* gcc is so stupid */ - if (be16_to_cpu(bests[findex]) != be16_to_cpu(hdr->bestfree[0].length)) { - bests[findex] = hdr->bestfree[0].length; + if (be16_to_cpu(bests[findex]) != be16_to_cpu(bf[0].length)) { + bests[findex] = bf[0].length; logfree = 1; } /* @@ -2119,7 +2125,8 @@ xfs_dir2_node_replace( * Point to the data entry. */ hdr = state->extrablk.bp->b_addr; - ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC)); + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); dep = (xfs_dir2_data_entry_t *) ((char *)hdr + xfs_dir2_dataptr_to_off(state->mp, be32_to_cpu(lep->address))); diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index e6f2e0a..910e644 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -43,17 +43,17 @@ extern int xfs_dir2_leaf_to_block(struct xfs_da_args *args, /* xfs_dir2_data.c */ #ifdef DEBUG -#define xfs_dir2_data_check(dp,bp) __xfs_dir2_data_check(dp, bp); +#define xfs_dir3_data_check(dp,bp) __xfs_dir3_data_check(dp, bp); #else -#define xfs_dir2_data_check(dp,bp) +#define xfs_dir3_data_check(dp,bp) #endif -extern const struct xfs_buf_ops xfs_dir2_data_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_data_buf_ops; -extern int __xfs_dir2_data_check(struct xfs_inode *dp, struct xfs_buf *bp); -extern int xfs_dir2_data_read(struct xfs_trans *tp, struct xfs_inode *dp, +extern int __xfs_dir3_data_check(struct xfs_inode *dp, struct xfs_buf *bp); +extern int xfs_dir3_data_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mapped_bno, struct xfs_buf **bpp); -extern int xfs_dir2_data_readahead(struct xfs_trans *tp, struct xfs_inode *dp, +extern int xfs_dir3_data_readahead(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mapped_bno); extern struct xfs_dir2_data_free * diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index f03bf1a..cf6eacd 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -893,7 +893,7 @@ xfs_dir_open( */ mode = xfs_ilock_map_shared(ip); if (ip->i_d.di_nextents > 0) - xfs_dir2_data_readahead(NULL, ip, 0, -1); + xfs_dir3_data_readahead(NULL, ip, 0, -1); xfs_iunlock(ip, mode); return 0; } -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:11:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 77CF57FB6 for ; Wed, 3 Apr 2013 00:11:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6740E304081 for ; Tue, 2 Apr 2013 22:11:54 -0700 (PDT) X-ASG-Debug-ID: 1364965906-04cbb01fba194150004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id smkFklHxa50DH29z for ; Tue, 02 Apr 2013 22:11:52 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkAKAJm4W1F5LBrj/2dsb2JhbABDgwfAZQQBgQcXdIIfAQEFJy8zCBgYGTkDGxmIE8FbjXyBEhyDNgOndoMfKIEuAgIcBg Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:50 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzC-0000LS-Bw for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:50 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFz7-0005BO-7N for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:45 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 09/22] xfs: add CRC checks to remote symlinks Date: Wed, 3 Apr 2013 16:11:19 +1100 X-ASG-Orig-Subj: [PATCH 09/22] xfs: add CRC checks to remote symlinks Message-Id: <1364965892-19623-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965911 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Add a header to the remote symlink block, containing location and owner information, as well as CRCs and LSN fields. This requires verifiers to be added to the remote symlink buffers for CRC enabled filesystems. This also fixes a bug reading multiple block symlinks, where the second block overwrites the first block when copying out the link name. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf_item.h | 4 +- fs/xfs/xfs_log_recover.c | 9 ++ fs/xfs/xfs_symlink.c | 279 +++++++++++++++++++++++++++++++++++++++------- fs/xfs/xfs_symlink.h | 34 +++++- 4 files changed, 283 insertions(+), 43 deletions(-) diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index abae8c8..09cab4e 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -49,6 +49,7 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_AGFL_BUF (1<<7) #define XFS_BLF_AGI_BUF (1<<8) #define XFS_BLF_DINO_BUF (1<<9) +#define XFS_BLF_SYMLINK_BUF (1<<10) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -58,7 +59,8 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_AGF_BUF | \ XFS_BLF_AGFL_BUF | \ XFS_BLF_AGI_BUF | \ - XFS_BLF_DINO_BUF) + XFS_BLF_DINO_BUF | \ + XFS_BLF_SYMLINK_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 2878782..d1292fd 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -45,6 +45,7 @@ #include "xfs_cksum.h" #include "xfs_trace.h" #include "xfs_icache.h" +#include "xfs_symlink.h" STATIC int xlog_find_zeroed( @@ -2002,6 +2003,14 @@ xlog_recover_do_reg_buffer( } bp->b_ops = &xfs_inode_buf_ops; break; + case XFS_BLF_SYMLINK_BUF: + if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_SYMLINK_MAGIC)) { + xfs_warn(mp, "Bad symlink block magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_symlink_buf_ops; + break; default: break; } diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 7512c96..5f234389 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -43,6 +43,152 @@ #include "xfs_log_priv.h" #include "xfs_trace.h" #include "xfs_symlink.h" +#include "xfs_cksum.h" +#include "xfs_buf_item.h" + + +/* + * Each contiguous block has a header, so it is not just a simple pathlen + * to FSB conversion. + */ +int +xfs_symlink_blocks( + struct xfs_mount *mp, + int pathlen) +{ + int fsblocks = 0; + int len = pathlen; + + do { + fsblocks++; + len -= XFS_SYMLINK_BUF_SPACE(mp, mp->m_sb.sb_blocksize); + } while (len > 0); + + ASSERT(fsblocks <= XFS_SYMLINK_MAPS); + return fsblocks; +} + +static int +xfs_symlink_hdr_set( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return 0; + + dsl->sl_magic = cpu_to_be32(XFS_SYMLINK_MAGIC); + dsl->sl_offset = cpu_to_be32(offset); + dsl->sl_bytes = cpu_to_be32(size); + uuid_copy(&dsl->sl_uuid, &mp->m_sb.sb_uuid); + dsl->sl_owner = cpu_to_be64(ino); + dsl->sl_blkno = cpu_to_be64(bp->b_bn); + bp->b_ops = &xfs_symlink_buf_ops; + + return sizeof(struct xfs_dsymlink_hdr); +} + +/* + * Checking of the symlink header is split into two parts. the verifier does + * CRC, location and bounds checking, the unpacking function checks the path + * parameters and owner. + */ +bool +xfs_symlink_hdr_ok( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + + if (offset != be32_to_cpu(dsl->sl_offset)) + return false; + if (size != be32_to_cpu(dsl->sl_bytes)) + return false; + if (ino != be64_to_cpu(dsl->sl_owner)) + return false; + + /* ok */ + return true; +} + +static bool +xfs_symlink_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (dsl->sl_magic != cpu_to_be32(XFS_SYMLINK_MAGIC)) + return false; + if (!uuid_equal(&dsl->sl_uuid, &mp->m_sb.sb_uuid)) + return false; + if (bp->b_bn != be64_to_cpu(dsl->sl_blkno)) + return false; + if (be32_to_cpu(dsl->sl_offset) + + be32_to_cpu(dsl->sl_bytes) >= MAXPATHLEN) + return false; + if (dsl->sl_owner == 0) + return false; + + return true; +} + +static void +xfs_symlink_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_dsymlink_hdr, sl_crc)) || + !xfs_symlink_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_symlink_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_symlink_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (bip) { + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + dsl->sl_lsn = cpu_to_be64(bip->bli_item.li_lsn); + } + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_dsymlink_hdr, sl_crc)); +} + +const struct xfs_buf_ops xfs_symlink_buf_ops = { + .verify_read = xfs_symlink_read_verify, + .verify_write = xfs_symlink_write_verify, +}; void xfs_symlink_local_to_remote( @@ -51,38 +197,60 @@ xfs_symlink_local_to_remote( struct xfs_inode *ip, struct xfs_ifork *ifp) { - /* remote symlink blocks are not verifiable until CRCs come along */ - bp->b_ops = NULL; - memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); + struct xfs_mount *mp = ip->i_mount; + char *buf; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) { + bp->b_ops = NULL; + memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); + return; + } + + /* + * As this symlink fits in an inode literal area, it must also fit in + * the smallest buffer the filesystem supports. + */ + ASSERT(BBTOB(bp->b_length) >= + ifp->if_bytes + sizeof(struct xfs_dsymlink_hdr)); + + bp->b_ops = &xfs_symlink_buf_ops; + + buf = bp->b_addr; + buf += xfs_symlink_hdr_set(mp, ip->i_ino, 0, ifp->if_bytes, bp); + memcpy(buf, ifp->if_u1.if_data, ifp->if_bytes); } /* ----- Kernel only functions below ----- */ - STATIC int xfs_readlink_bmap( - xfs_inode_t *ip, - char *link) + struct xfs_inode *ip, + char *link) { - xfs_mount_t *mp = ip->i_mount; - int pathlen = ip->i_d.di_size; - int nmaps = XFS_SYMLINK_MAPS; - xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; - xfs_daddr_t d; - int byte_cnt; - int n; - xfs_buf_t *bp; - int error = 0; + struct xfs_mount *mp = ip->i_mount; + struct xfs_bmbt_irec mval[XFS_SYMLINK_MAPS]; + struct xfs_buf *bp; + xfs_daddr_t d; + char *cur_chunk; + int pathlen = ip->i_d.di_size; + int nmaps = XFS_SYMLINK_MAPS; + int byte_cnt; + int n; + int error = 0; + int fsblocks = 0; + int offset; - error = xfs_bmapi_read(ip, 0, XFS_B_TO_FSB(mp, pathlen), mval, &nmaps, - 0); + fsblocks = xfs_symlink_blocks(mp, pathlen); + error = xfs_bmapi_read(ip, 0, fsblocks, mval, &nmaps, 0); if (error) goto out; + offset = 0; for (n = 0; n < nmaps; n++) { d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); - bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0, NULL); + bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0, + &xfs_symlink_buf_ops); if (!bp) return XFS_ERROR(ENOMEM); error = bp->b_error; @@ -91,13 +259,34 @@ xfs_readlink_bmap( xfs_buf_relse(bp); goto out; } + byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); if (pathlen < byte_cnt) byte_cnt = pathlen; + + cur_chunk = bp->b_addr; + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (!xfs_symlink_hdr_ok(mp, ip->i_ino, offset, + byte_cnt, bp)) { + error = EFSCORRUPTED; + xfs_alert(mp, +"symlink header does not match required off/len/owner (0x%x/Ox%x,0x%llx)", + offset, byte_cnt, ip->i_ino); + xfs_buf_relse(bp); + goto out; + + } + + cur_chunk += sizeof(struct xfs_dsymlink_hdr); + } + + memcpy(link + offset, bp->b_addr, byte_cnt); + pathlen -= byte_cnt; + offset += byte_cnt; - memcpy(link, bp->b_addr, byte_cnt); xfs_buf_relse(bp); } + ASSERT(pathlen == 0); link[ip->i_d.di_size] = '\0'; error = 0; @@ -108,10 +297,10 @@ xfs_readlink_bmap( int xfs_readlink( - xfs_inode_t *ip, + struct xfs_inode *ip, char *link) { - xfs_mount_t *mp = ip->i_mount; + struct xfs_mount *mp = ip->i_mount; xfs_fsize_t pathlen; int error = 0; @@ -150,26 +339,26 @@ xfs_readlink( int xfs_symlink( - xfs_inode_t *dp, + struct xfs_inode *dp, struct xfs_name *link_name, const char *target_path, umode_t mode, - xfs_inode_t **ipp) + struct xfs_inode **ipp) { - xfs_mount_t *mp = dp->i_mount; - xfs_trans_t *tp; - xfs_inode_t *ip; - int error; + struct xfs_mount *mp = dp->i_mount; + struct xfs_trans *tp = NULL; + struct xfs_inode *ip = NULL; + int error = 0; int pathlen; - xfs_bmap_free_t free_list; + struct xfs_bmap_free free_list; xfs_fsblock_t first_block; - bool unlock_dp_on_error = false; + bool unlock_dp_on_error = false; uint cancel_flags; int committed; xfs_fileoff_t first_fsb; xfs_filblks_t fs_blocks; int nmaps; - xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; + struct xfs_bmbt_irec mval[XFS_SYMLINK_MAPS]; xfs_daddr_t d; const char *cur_chunk; int byte_cnt; @@ -180,9 +369,6 @@ xfs_symlink( uint resblks; *ipp = NULL; - error = 0; - ip = NULL; - tp = NULL; trace_xfs_symlink(dp, link_name); @@ -307,6 +493,8 @@ xfs_symlink( xfs_trans_log_inode(tp, ip, XFS_ILOG_DDATA | XFS_ILOG_CORE); } else { + int offset; + first_fsb = 0; nmaps = XFS_SYMLINK_MAPS; @@ -322,7 +510,10 @@ xfs_symlink( xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); cur_chunk = target_path; + offset = 0; for (n = 0; n < nmaps; n++) { + char *buf; + d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, @@ -331,15 +522,25 @@ xfs_symlink( error = ENOMEM; goto error2; } + bp->b_ops = &xfs_symlink_buf_ops; + + byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); if (pathlen < byte_cnt) { byte_cnt = pathlen; } - pathlen -= byte_cnt; - memcpy(bp->b_addr, cur_chunk, byte_cnt); + buf = bp->b_addr; + buf += xfs_symlink_hdr_set(mp, ip->i_ino, offset, + byte_cnt, bp); + + memcpy(buf, cur_chunk, byte_cnt); + cur_chunk += byte_cnt; + pathlen -= byte_cnt; + offset += byte_cnt; - xfs_trans_log_buf(tp, bp, 0, byte_cnt - 1); + xfs_trans_log_buf(tp, bp, 0, (buf + byte_cnt - 1) - + (char *)bp->b_addr); } } @@ -392,7 +593,7 @@ xfs_symlink( /* * Free a symlink that has blocks associated with it. */ -STATIC int +int xfs_inactive_symlink_rmt( xfs_inode_t *ip, xfs_trans_t **tpp) @@ -438,12 +639,12 @@ xfs_inactive_symlink_rmt( done = 0; xfs_bmap_init(&free_list, &first_block); nmaps = ARRAY_SIZE(mval); - error = xfs_bmapi_read(ip, 0, XFS_B_TO_FSB(mp, size), + error = xfs_bmapi_read(ip, 0, xfs_symlink_blocks(mp, size), mval, &nmaps, 0); if (error) goto error0; /* - * Invalidate the block(s). + * Invalidate the block(s). No validation is done. */ for (i = 0; i < nmaps; i++) { bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, diff --git a/fs/xfs/xfs_symlink.h b/fs/xfs/xfs_symlink.h index 07bdabc..b39398d 100644 --- a/fs/xfs/xfs_symlink.h +++ b/fs/xfs/xfs_symlink.h @@ -17,16 +17,44 @@ #ifndef __XFS_SYMLINK_H #define __XFS_SYMLINK_H 1 +struct xfs_mount; +struct xfs_trans; +struct xfs_inode; +struct xfs_buf; +struct xfs_ifork; +struct xfs_name; + +#define XFS_SYMLINK_MAGIC 0x58534c4d /* XSLM */ + +struct xfs_dsymlink_hdr { + __be32 sl_magic; + __be32 sl_offset; + __be32 sl_bytes; + __be32 sl_crc; + uuid_t sl_uuid; + __be64 sl_owner; + __be64 sl_blkno; + __be64 sl_lsn; +}; + /* * The maximum pathlen is 1024 bytes. Since the minimum file system - * blocksize is 512 bytes, we can get a max of 2 extents back from - * bmapi. + * blocksize is 512 bytes, we can get a max of 3 extents back from + * bmapi when crc headers are taken into account. */ -#define XFS_SYMLINK_MAPS 2 +#define XFS_SYMLINK_MAPS 3 + +#define XFS_SYMLINK_BUF_SPACE(mp, bufsize) \ + ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ + sizeof(struct xfs_dsymlink_hdr) : 0)) + +int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, struct xfs_inode *ip, struct xfs_ifork *ifp); +extern const struct xfs_buf_ops xfs_symlink_buf_ops; + #ifdef __KERNEL__ int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DDF6A29E0E for ; Wed, 3 Apr 2013 00:12:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CD3668F804C for ; Tue, 2 Apr 2013 22:12:00 -0700 (PDT) X-ASG-Debug-ID: 1364965917-04cb6c1e79196b30001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id lKLHgXjeWQEkjEBG for ; Tue, 02 Apr 2013 22:11:57 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkAKAJm4W1F5LBrj/2dsb2JhbAA7CIMHwGUEAYEHF3SCHwEBBRoNLzMIGDE5AxsZiBPBW41jGYESBoNMA4wBkV2KGIMfKIEwJA Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:55 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFz7-0000LO-9F for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:45 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFyx-0005BE-5J for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:35 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 07/22] xfs: add version 3 inode format with CRCs Date: Wed, 3 Apr 2013 16:11:17 +1100 X-ASG-Orig-Subj: [PATCH 07/22] xfs: add version 3 inode format with CRCs Message-Id: <1364965892-19623-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965917 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Christoph Hellwig Add a new inode version with a larger core. The primary objective is to allow for a crc of the inode, and location information (uuid and ino) to verify it was written in the right place. We also extend it by: a creation time (for Samba); a changecount (for NFSv4); a flush sequence (in LSN format for recovery); an additional inode flags field; and some additional padding. These additional fields are not implemented yet, but already laid out in the structure. [dchinner@redhat.com] Added LSN and flags field, some factoring and rework to capture all the necessary information in the crc calculation. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf_item.h | 4 +- fs/xfs/xfs_dinode.h | 33 +++++++-- fs/xfs/xfs_ialloc.c | 50 ++++++++++--- fs/xfs/xfs_inode.c | 179 ++++++++++++++++++++++++++++++++-------------- fs/xfs/xfs_inode.h | 26 +++++++ fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_log_recover.c | 32 +++++++-- fs/xfs/xfs_trans_buf.c | 5 +- 8 files changed, 254 insertions(+), 77 deletions(-) diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index c256606..abae8c8 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -48,6 +48,7 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_AGF_BUF (1<<6) #define XFS_BLF_AGFL_BUF (1<<7) #define XFS_BLF_AGI_BUF (1<<8) +#define XFS_BLF_DINO_BUF (1<<9) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -56,7 +57,8 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_BTREE_BUF | \ XFS_BLF_AGF_BUF | \ XFS_BLF_AGFL_BUF | \ - XFS_BLF_AGI_BUF) + XFS_BLF_AGI_BUF | \ + XFS_BLF_DINO_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h index 6b5bd17..f7a0e95 100644 --- a/fs/xfs/xfs_dinode.h +++ b/fs/xfs/xfs_dinode.h @@ -19,7 +19,7 @@ #define __XFS_DINODE_H__ #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ -#define XFS_DINODE_GOOD_VERSION(v) (((v) == 1 || (v) == 2)) +#define XFS_DINODE_GOOD_VERSION(v) ((v) >= 1 && (v) <= 3) typedef struct xfs_timestamp { __be32 t_sec; /* timestamp seconds */ @@ -70,11 +70,36 @@ typedef struct xfs_dinode { /* di_next_unlinked is the only non-core field in the old dinode */ __be32 di_next_unlinked;/* agi unlinked list ptr */ -} __attribute__((packed)) xfs_dinode_t; + + /* start of the extended dinode, writable fields */ + __le32 di_crc; /* CRC of the inode */ + __be64 di_changecount; /* number of attribute changes */ + __be64 di_lsn; /* flush sequence */ + __be64 di_flags2; /* more random flags */ + __u8 di_pad2[16]; /* more padding for future expansion */ + + /* fields only written to during inode creation */ + xfs_timestamp_t di_crtime; /* time created */ + __be64 di_ino; /* inode number */ + uuid_t di_uuid; /* UUID of the filesystem */ + + /* structure must be padded to 64 bit alignment */ +} xfs_dinode_t; #define DI_MAX_FLUSH 0xffff /* + * Size of the core inode on disk. Version 1 and 2 inodes have + * the same size, but version 3 has grown a few additional fields. + */ +static inline uint xfs_dinode_size(int version) +{ + if (version == 3) + return sizeof(struct xfs_dinode); + return offsetof(struct xfs_dinode, di_crc); +} + +/* * The 32 bit link count in the inode theoretically maxes out at UINT_MAX. * Since the pathconf interface is signed, we use 2^31 - 1 instead. * The old inode format had a 16 bit link count, so its maximum is USHRT_MAX. @@ -105,7 +130,7 @@ typedef enum xfs_dinode_fmt { * Inode size for given fs. */ #define XFS_LITINO(mp, version) \ - ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) + ((int)(((mp)->m_sb.sb_inodesize) - xfs_dinode_size(version))) #define XFS_BROOT_SIZE_ADJ(ip) \ (XFS_BMBT_BLOCK_LEN((ip)->i_mount) - sizeof(xfs_bmdr_block_t)) @@ -133,7 +158,7 @@ typedef enum xfs_dinode_fmt { * Return pointers to the data or attribute forks. */ #define XFS_DFORK_DPTR(dip) \ - ((char *)(dip) + sizeof(struct xfs_dinode)) + ((char *)dip + xfs_dinode_size(dip->di_version)) #define XFS_DFORK_APTR(dip) \ (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip)) #define XFS_DFORK_PTR(dip,w) \ diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 6d0a495..3039f82 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -167,6 +167,7 @@ xfs_ialloc_inode_init( int version; int i, j; xfs_daddr_t d; + xfs_ino_t ino = 0; /* * Loop over the new block(s), filling in the inodes. @@ -185,13 +186,29 @@ xfs_ialloc_inode_init( } /* - * Figure out what version number to use in the inodes we create. - * If the superblock version has caught up to the one that supports - * the new inode format, then use the new inode version. Otherwise - * use the old version so that old kernels will continue to be - * able to use the file system. + * Figure out what version number to use in the inodes we create. If + * the superblock version has caught up to the one that supports the new + * inode format, then use the new inode version. Otherwise use the old + * version so that old kernels will continue to be able to use the file + * system. + * + * For v3 inodes, we also need to write the inode number into the inode, + * so calculate the first inode number of the chunk here as + * XFS_OFFBNO_TO_AGINO() only works within a filesystem block, not + * across multiple filesystem blocks (such as a cluster) and so cannot + * be used in the cluster buffer loop below. + * + * Further, because we are writing the inode directly into the buffer + * and calculating a CRC on the entire inode, we have ot log the entire + * inode so that the entire range the CRC covers is present in the log. + * That means for v3 inode we log the entire buffer rather than just the + * inode cores. */ - if (xfs_sb_version_hasnlink(&mp->m_sb)) + if (xfs_sb_version_hascrc(&mp->m_sb)) { + version = 3; + ino = XFS_AGINO_TO_INO(mp, agno, + XFS_OFFBNO_TO_AGINO(mp, agbno, 0)); + } else if (xfs_sb_version_hasnlink(&mp->m_sb)) version = 2; else version = 1; @@ -214,17 +231,32 @@ xfs_ialloc_inode_init( * individual transactions causing a lot of log traffic. */ fbuf->b_ops = &xfs_inode_buf_ops; - xfs_buf_zero(fbuf, 0, ninodes << mp->m_sb.sb_inodelog); + xfs_buf_zero(fbuf, 0, BBTOB(fbuf->b_length)); for (i = 0; i < ninodes; i++) { int ioffset = i << mp->m_sb.sb_inodelog; - uint isize = sizeof(struct xfs_dinode); + uint isize = xfs_dinode_size(version); free = xfs_make_iptr(mp, fbuf, i); free->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); free->di_version = version; free->di_gen = cpu_to_be32(gen); free->di_next_unlinked = cpu_to_be32(NULLAGINO); - xfs_trans_log_buf(tp, fbuf, ioffset, ioffset + isize - 1); + + if (version == 3) { + free->di_ino = cpu_to_be64(ino); + ino++; + uuid_copy(&free->di_uuid, &mp->m_sb.sb_uuid); + xfs_dinode_calc_crc(mp, free); + } else { + /* just log the inode core */ + xfs_trans_log_buf(tp, fbuf, ioffset, + ioffset + isize - 1); + } + } + if (version == 3) { + /* need to log the entire buffer */ + xfs_trans_log_buf(tp, fbuf, 0, + BBTOB(fbuf->b_length) - 1); } xfs_trans_inode_alloc_buf(tp, fbuf); } diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 202ce37..558ef49 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -44,6 +44,7 @@ #include "xfs_quota.h" #include "xfs_filestream.h" #include "xfs_vnodeops.h" +#include "xfs_cksum.h" #include "xfs_trace.h" #include "xfs_icache.h" @@ -866,6 +867,17 @@ xfs_dinode_from_disk( to->di_dmstate = be16_to_cpu(from->di_dmstate); to->di_flags = be16_to_cpu(from->di_flags); to->di_gen = be32_to_cpu(from->di_gen); + + if (to->di_version == 3) { + to->di_changecount = be64_to_cpu(from->di_changecount); + to->di_crtime.t_sec = be32_to_cpu(from->di_crtime.t_sec); + to->di_crtime.t_nsec = be32_to_cpu(from->di_crtime.t_nsec); + to->di_flags2 = be64_to_cpu(from->di_flags2); + to->di_ino = be64_to_cpu(from->di_ino); + to->di_lsn = be64_to_cpu(from->di_lsn); + memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); + uuid_copy(&to->di_uuid, &from->di_uuid); + } } void @@ -902,6 +914,17 @@ xfs_dinode_to_disk( to->di_dmstate = cpu_to_be16(from->di_dmstate); to->di_flags = cpu_to_be16(from->di_flags); to->di_gen = cpu_to_be32(from->di_gen); + + if (from->di_version == 3) { + to->di_changecount = cpu_to_be64(from->di_changecount); + to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec); + to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec); + to->di_flags2 = cpu_to_be64(from->di_flags2); + to->di_ino = cpu_to_be64(from->di_ino); + to->di_lsn = cpu_to_be64(from->di_lsn); + memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); + uuid_copy(&to->di_uuid, &from->di_uuid); + } } STATIC uint @@ -962,6 +985,47 @@ xfs_dic2xflags( (XFS_DFORK_Q(dip) ? XFS_XFLAG_HASATTR : 0); } +static bool +xfs_dinode_verify( + struct xfs_mount *mp, + struct xfs_inode *ip, + struct xfs_dinode *dip) +{ + if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) + return false; + + /* only version 3 or greater inodes are extensively verified here */ + if (dip->di_version < 3) + return true; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize, + offsetof(struct xfs_dinode, di_crc))) + return false; + if (be64_to_cpu(dip->di_ino) != ip->i_ino) + return false; + if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_uuid)) + return false; + return true; +} + +void +xfs_dinode_calc_crc( + struct xfs_mount *mp, + struct xfs_dinode *dip) +{ + __uint32_t crc; + + if (dip->di_version < 3) + return; + + ASSERT(xfs_sb_version_hascrc(&mp->m_sb)); + crc = xfs_start_cksum((char *)dip, mp->m_sb.sb_inodesize, + offsetof(struct xfs_dinode, di_crc)); + dip->di_crc = xfs_end_cksum(crc); +} + /* * Read the disk inode attributes into the in-core inode structure. */ @@ -990,17 +1054,13 @@ xfs_iread( if (error) return error; - /* - * If we got something that isn't an inode it means someone - * (nfs or dmi) has a stale handle. - */ - if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) { -#ifdef DEBUG - xfs_alert(mp, - "%s: dip->di_magic (0x%x) != XFS_DINODE_MAGIC (0x%x)", - __func__, be16_to_cpu(dip->di_magic), XFS_DINODE_MAGIC); -#endif /* DEBUG */ - error = XFS_ERROR(EINVAL); + /* even unallocated inodes are verified */ + if (!xfs_dinode_verify(mp, ip, dip)) { + xfs_alert(mp, "%s: validation failed for inode %lld failed", + __func__, ip->i_ino); + + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, dip); + error = XFS_ERROR(EFSCORRUPTED); goto out_brelse; } @@ -1022,10 +1082,20 @@ xfs_iread( goto out_brelse; } } else { + /* + * Partial initialisation of the in-core inode. Just the bits + * that xfs_ialloc won't overwrite or relies on being correct. + */ ip->i_d.di_magic = be16_to_cpu(dip->di_magic); ip->i_d.di_version = dip->di_version; ip->i_d.di_gen = be32_to_cpu(dip->di_gen); ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter); + + if (dip->di_version == 3) { + ip->i_d.di_ino = be64_to_cpu(dip->di_ino); + uuid_copy(&ip->i_d.di_uuid, &dip->di_uuid); + } + /* * Make sure to pull in the mode here as well in * case the inode is released without being used. @@ -1161,6 +1231,7 @@ xfs_ialloc( xfs_buf_t **ialloc_context, xfs_inode_t **ipp) { + struct xfs_mount *mp = tp->t_mountp; xfs_ino_t ino; xfs_inode_t *ip; uint flags; @@ -1187,7 +1258,7 @@ xfs_ialloc( * This is because we're setting fields here we need * to prevent others from looking at until we're done. */ - error = xfs_iget(tp->t_mountp, tp, ino, XFS_IGET_CREATE, + error = xfs_iget(mp, tp, ino, XFS_IGET_CREATE, XFS_ILOCK_EXCL, &ip); if (error) return error; @@ -1208,7 +1279,7 @@ xfs_ialloc( * the inode version number now. This way we only do the conversion * here rather than here and in the flush/logging code. */ - if (xfs_sb_version_hasnlink(&tp->t_mountp->m_sb) && + if (xfs_sb_version_hasnlink(&mp->m_sb) && ip->i_d.di_version == 1) { ip->i_d.di_version = 2; /* @@ -1258,6 +1329,19 @@ xfs_ialloc( ip->i_d.di_dmevmask = 0; ip->i_d.di_dmstate = 0; ip->i_d.di_flags = 0; + + if (ip->i_d.di_version == 3) { + ASSERT(ip->i_d.di_ino == ino); + ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid)); + ip->i_d.di_crc = 0; + ip->i_d.di_changecount = 1; + ip->i_d.di_lsn = 0; + ip->i_d.di_flags2 = 0; + memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2)); + ip->i_d.di_crtime = ip->i_d.di_mtime; + } + + flags = XFS_ILOG_CORE; switch (mode & S_IFMT) { case S_IFIFO: @@ -2716,20 +2800,18 @@ abort_out: STATIC int xfs_iflush_int( - xfs_inode_t *ip, - xfs_buf_t *bp) + struct xfs_inode *ip, + struct xfs_buf *bp) { - xfs_inode_log_item_t *iip; - xfs_dinode_t *dip; - xfs_mount_t *mp; + struct xfs_inode_log_item *iip = ip->i_itemp; + struct xfs_dinode *dip; + struct xfs_mount *mp = ip->i_mount; ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); ASSERT(xfs_isiflocked(ip)); ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK)); - - iip = ip->i_itemp; - mp = ip->i_mount; + ASSERT(iip != NULL && iip->ili_fields != 0); /* set *dip = inode's place in the buffer */ dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); @@ -2790,9 +2872,9 @@ xfs_iflush_int( } /* * bump the flush iteration count, used to detect flushes which - * postdate a log record during recovery. + * postdate a log record during recovery. This is redundant as we now + * log every change and hence this can't happen. Still, it doesn't hurt. */ - ip->i_d.di_flushiter++; /* @@ -2868,41 +2950,30 @@ xfs_iflush_int( * need the AIL lock, because it is a 64 bit value that cannot be read * atomically. */ - if (iip != NULL && iip->ili_fields != 0) { - iip->ili_last_fields = iip->ili_fields; - iip->ili_fields = 0; - iip->ili_logged = 1; + iip->ili_last_fields = iip->ili_fields; + iip->ili_fields = 0; + iip->ili_logged = 1; - xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn, - &iip->ili_item.li_lsn); + xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn, + &iip->ili_item.li_lsn); - /* - * Attach the function xfs_iflush_done to the inode's - * buffer. This will remove the inode from the AIL - * and unlock the inode's flush lock when the inode is - * completely written to disk. - */ - xfs_buf_attach_iodone(bp, xfs_iflush_done, &iip->ili_item); + /* + * Attach the function xfs_iflush_done to the inode's + * buffer. This will remove the inode from the AIL + * and unlock the inode's flush lock when the inode is + * completely written to disk. + */ + xfs_buf_attach_iodone(bp, xfs_iflush_done, &iip->ili_item); - ASSERT(bp->b_fspriv != NULL); - ASSERT(bp->b_iodone != NULL); - } else { - /* - * We're flushing an inode which is not in the AIL and has - * not been logged. For this case we can immediately drop - * the inode flush lock because we can avoid the whole - * AIL state thing. It's OK to drop the flush lock now, - * because we've already locked the buffer and to do anything - * you really need both. - */ - if (iip != NULL) { - ASSERT(iip->ili_logged == 0); - ASSERT(iip->ili_last_fields == 0); - ASSERT((iip->ili_item.li_flags & XFS_LI_IN_AIL) == 0); - } - xfs_ifunlock(ip); - } + /* update the lsn in the on disk inode if required */ + if (ip->i_d.di_version == 3) + dip->di_lsn = cpu_to_be64(iip->ili_item.li_lsn); + + /* generate the checksum. */ + xfs_dinode_calc_crc(mp, dip); + ASSERT(bp->b_fspriv != NULL); + ASSERT(bp->b_iodone != NULL); return 0; corrupt_out: diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index b8520b5..9112979 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -150,13 +150,38 @@ typedef struct xfs_icdinode { __uint16_t di_dmstate; /* DMIG state info */ __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ __uint32_t di_gen; /* generation number */ + + /* di_next_unlinked is the only non-core field in the old dinode */ + xfs_agino_t di_next_unlinked;/* agi unlinked list ptr */ + + /* start of the extended dinode, writable fields */ + __uint32_t di_crc; /* CRC of the inode */ + __uint64_t di_changecount; /* number of attribute changes */ + xfs_lsn_t di_lsn; /* flush sequence */ + __uint64_t di_flags2; /* more random flags */ + __uint8_t di_pad2[16]; /* more padding for future expansion */ + + /* fields only written to during inode creation */ + xfs_ictimestamp_t di_crtime; /* time created */ + xfs_ino_t di_ino; /* inode number */ + uuid_t di_uuid; /* UUID of the filesystem */ + + /* structure must be padded to 64 bit alignment */ } xfs_icdinode_t; +static inline uint xfs_icdinode_size(int version) +{ + if (version == 3) + return sizeof(struct xfs_icdinode); + return offsetof(struct xfs_icdinode, di_next_unlinked); +} + /* * Flags for xfs_ichgtime(). */ #define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */ #define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */ +#define XFS_ICHGTIME_CREATE 0x4 /* inode create timestamp */ /* * Per-fork incore inode flags. @@ -556,6 +581,7 @@ int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *, struct xfs_buf **, uint, uint); int xfs_iread(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, uint); +void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *); void xfs_dinode_to_disk(struct xfs_dinode *, struct xfs_icdinode *); void xfs_idestroy_fork(struct xfs_inode *, int); diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index f034bd1..f76ff52 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -179,7 +179,7 @@ xfs_inode_item_format( nvecs = 1; vecp->i_addr = &ip->i_d; - vecp->i_len = sizeof(struct xfs_icdinode); + vecp->i_len = xfs_icdinode_size(ip->i_d.di_version); vecp->i_type = XLOG_REG_TYPE_ICORE; vecp++; nvecs++; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 27b3ec2..2878782 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1786,6 +1786,7 @@ xlog_recover_do_inode_buffer( xfs_agino_t *buffer_nextp; trace_xfs_log_recover_buf_inode_buf(mp->m_log, buf_f); + bp->b_ops = &xfs_inode_buf_ops; inodes_per_buf = BBTOB(bp->b_io_length) >> mp->m_sb.sb_inodelog; for (i = 0; i < inodes_per_buf; i++) { @@ -1989,6 +1990,18 @@ xlog_recover_do_reg_buffer( } bp->b_ops = &xfs_dquot_buf_ops; break; + case XFS_BLF_DINO_BUF: + /* + * we get here with inode allocation buffers, not buffers that + * track unlinked list changes. + */ + if (*(__be16 *)bp->b_addr != cpu_to_be16(XFS_DINODE_MAGIC)) { + xfs_warn(mp, "Bad INODE block magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_inode_buf_ops; + break; default: break; } @@ -2277,6 +2290,7 @@ xlog_recover_inode_pass2( int attr_index; uint fields; xfs_icdinode_t *dicp; + uint isize; int need_free = 0; if (item->ri_buf[0].i_len == sizeof(xfs_inode_log_format_t)) { @@ -2302,7 +2316,7 @@ xlog_recover_inode_pass2( trace_xfs_log_recover_inode_recover(log, in_f); bp = xfs_buf_read(mp->m_ddev_targp, in_f->ilf_blkno, in_f->ilf_len, 0, - NULL); + &xfs_inode_buf_ops); if (!bp) { error = ENOMEM; goto error; @@ -2413,7 +2427,8 @@ xlog_recover_inode_pass2( error = EFSCORRUPTED; goto error; } - if (unlikely(item->ri_buf[1].i_len > sizeof(struct xfs_icdinode))) { + isize = xfs_icdinode_size(dicp->di_version); + if (unlikely(item->ri_buf[1].i_len > isize)) { XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(7)", XFS_ERRLEVEL_LOW, mp, dicp); xfs_buf_relse(bp); @@ -2425,13 +2440,13 @@ xlog_recover_inode_pass2( } /* The core is in in-core format */ - xfs_dinode_to_disk(dip, item->ri_buf[1].i_addr); + xfs_dinode_to_disk(dip, dicp); /* the rest is in on-disk format */ - if (item->ri_buf[1].i_len > sizeof(struct xfs_icdinode)) { - memcpy((xfs_caddr_t) dip + sizeof(struct xfs_icdinode), - item->ri_buf[1].i_addr + sizeof(struct xfs_icdinode), - item->ri_buf[1].i_len - sizeof(struct xfs_icdinode)); + if (item->ri_buf[1].i_len > isize) { + memcpy((char *)dip + isize, + item->ri_buf[1].i_addr + isize, + item->ri_buf[1].i_len - isize); } fields = in_f->ilf_fields; @@ -2515,6 +2530,9 @@ xlog_recover_inode_pass2( } write_inode_buffer: + /* re-generate the checksum. */ + xfs_dinode_calc_crc(log->l_mp, dip); + ASSERT(bp->b_target->bt_mount == mp); bp->b_iodone = xlog_recover_iodone; xfs_buf_delwri_queue(bp, buffer_list); diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index f950edd..8a0f6af 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -704,12 +704,13 @@ xfs_trans_inode_buf( ASSERT(atomic_read(&bip->bli_refcount) > 0); bip->bli_flags |= XFS_BLI_INODE_BUF; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DINO_BUF); } /* * This call is used to indicate that the buffer is going to * be staled and was an inode buffer. This means it gets - * special processing during unpin - where any inodes + * special processing during unpin - where any inodes * associated with the buffer should be removed from ail. * There is also special processing during recovery, * any replay of the inodes in the buffer needs to be @@ -728,6 +729,7 @@ xfs_trans_stale_inode_buf( bip->bli_flags |= XFS_BLI_STALE_INODE; bip->bli_item.li_cb = xfs_buf_iodone; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DINO_BUF); } /* @@ -751,6 +753,7 @@ xfs_trans_inode_alloc_buf( ASSERT(atomic_read(&bip->bli_refcount) > 0); bip->bli_flags |= XFS_BLI_INODE_ALLOC_BUF; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DINO_BUF); } /* -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AED7729E13 for ; Wed, 3 Apr 2013 00:12:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 711748F804C for ; Tue, 2 Apr 2013 22:12:02 -0700 (PDT) X-ASG-Debug-ID: 1364965918-04bdf0542c18eaa0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id isXuYxSOuGeKhYS5 for ; Tue, 02 Apr 2013 22:11:59 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkAKAJm4W1F5LBrj/2dsb2JhbAA7CIMHwGUEAYEHF3SCHwEBBRoNLxYdCBgxOQMbGYgTwVuNTBcGCAuBEoNSA6d2gx8ogS4BAxw Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:55 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzC-0000LP-B1 for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:50 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFyx-0005BJ-6R for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:35 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 08/22] xfs: split out symlink code into it's own file. Date: Wed, 3 Apr 2013 16:11:18 +1100 X-ASG-Orig-Subj: [PATCH 08/22] xfs: split out symlink code into it's own file. Message-Id: <1364965892-19623-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965918 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The symlink code is about to get more complicated when CRCs are added for remote symlink blocks. The symlink management code is mostly self contained, so move it to it's own files so that all th enew code and the existing symlink code will not be intermingled with other unrelated code. Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 5 +- fs/xfs/xfs_bmap.c | 21 +- fs/xfs/xfs_symlink.c | 529 +++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_symlink.h | 38 ++++ fs/xfs/xfs_vnodeops.c | 478 +------------------------------------------- 5 files changed, 578 insertions(+), 493 deletions(-) create mode 100644 fs/xfs/xfs_symlink.c create mode 100644 fs/xfs/xfs_symlink.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index d02201d..062f25c 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -45,11 +45,11 @@ xfs-y += xfs_aops.o \ xfs_itable.o \ xfs_message.o \ xfs_mru_cache.o \ - xfs_super.o \ - xfs_xattr.o \ xfs_rename.o \ + xfs_super.o \ xfs_utils.o \ xfs_vnodeops.o \ + xfs_xattr.o \ kmem.o \ uuid.o @@ -73,6 +73,7 @@ xfs-y += xfs_alloc.o \ xfs_inode.o \ xfs_log_recover.o \ xfs_mount.o \ + xfs_symlink.o \ xfs_trans.o # low-level transaction/log code diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 0531cd3..0fcb7f4 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -47,6 +47,7 @@ #include "xfs_filestream.h" #include "xfs_vnodeops.h" #include "xfs_trace.h" +#include "xfs_symlink.h" kmem_zone_t *xfs_bmap_free_item_zone; @@ -1321,9 +1322,10 @@ xfs_bmap_add_attrfork_extents( } /* - * Block initialisation functions for local to extent format conversion. - * As these get more complex, they will be moved to the relevant files, - * but for now they are too simple to worry about. + * Block initialisation function for local to extent format conversion. + * + * This shouldn't actually be called by anyone, so make sure debug kernels cause + * a noticable failure. */ STATIC void xfs_bmap_local_to_extents_init_fn( @@ -1332,23 +1334,12 @@ xfs_bmap_local_to_extents_init_fn( struct xfs_inode *ip, struct xfs_ifork *ifp) { + ASSERT(0); bp->b_ops = &xfs_bmbt_buf_ops; memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); xfs_trans_buf_set_type(tp, bp, XFS_BLF_BTREE_BUF); } -STATIC void -xfs_symlink_local_to_remote( - struct xfs_trans *tp, - struct xfs_buf *bp, - struct xfs_inode *ip, - struct xfs_ifork *ifp) -{ - /* remote symlink blocks are not verifiable until CRCs come along */ - bp->b_ops = NULL; - memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); -} - /* * Called from xfs_bmap_add_attrfork to handle local format files. Each * different data fork content type needs a different callout to do the diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c new file mode 100644 index 0000000..7512c96 --- /dev/null +++ b/fs/xfs/xfs_symlink.c @@ -0,0 +1,529 @@ +/* + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2012-2013 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_types.h" +#include "xfs_bit.h" +#include "xfs_log.h" +#include "xfs_trans.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_dir2.h" +#include "xfs_mount.h" +#include "xfs_da_btree.h" +#include "xfs_bmap_btree.h" +#include "xfs_ialloc_btree.h" +#include "xfs_dinode.h" +#include "xfs_inode.h" +#include "xfs_inode_item.h" +#include "xfs_itable.h" +#include "xfs_ialloc.h" +#include "xfs_alloc.h" +#include "xfs_bmap.h" +#include "xfs_error.h" +#include "xfs_quota.h" +#include "xfs_utils.h" +#include "xfs_trans_space.h" +#include "xfs_log_priv.h" +#include "xfs_trace.h" +#include "xfs_symlink.h" + +void +xfs_symlink_local_to_remote( + struct xfs_trans *tp, + struct xfs_buf *bp, + struct xfs_inode *ip, + struct xfs_ifork *ifp) +{ + /* remote symlink blocks are not verifiable until CRCs come along */ + bp->b_ops = NULL; + memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); +} + +/* ----- Kernel only functions below ----- */ + +STATIC int +xfs_readlink_bmap( + xfs_inode_t *ip, + char *link) +{ + xfs_mount_t *mp = ip->i_mount; + int pathlen = ip->i_d.di_size; + int nmaps = XFS_SYMLINK_MAPS; + xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; + xfs_daddr_t d; + int byte_cnt; + int n; + xfs_buf_t *bp; + int error = 0; + + error = xfs_bmapi_read(ip, 0, XFS_B_TO_FSB(mp, pathlen), mval, &nmaps, + 0); + if (error) + goto out; + + for (n = 0; n < nmaps; n++) { + d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); + byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); + + bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0, NULL); + if (!bp) + return XFS_ERROR(ENOMEM); + error = bp->b_error; + if (error) { + xfs_buf_ioerror_alert(bp, __func__); + xfs_buf_relse(bp); + goto out; + } + if (pathlen < byte_cnt) + byte_cnt = pathlen; + pathlen -= byte_cnt; + + memcpy(link, bp->b_addr, byte_cnt); + xfs_buf_relse(bp); + } + + link[ip->i_d.di_size] = '\0'; + error = 0; + + out: + return error; +} + +int +xfs_readlink( + xfs_inode_t *ip, + char *link) +{ + xfs_mount_t *mp = ip->i_mount; + xfs_fsize_t pathlen; + int error = 0; + + trace_xfs_readlink(ip); + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + xfs_ilock(ip, XFS_ILOCK_SHARED); + + pathlen = ip->i_d.di_size; + if (!pathlen) + goto out; + + if (pathlen < 0 || pathlen > MAXPATHLEN) { + xfs_alert(mp, "%s: inode (%llu) bad symlink length (%lld)", + __func__, (unsigned long long) ip->i_ino, + (long long) pathlen); + ASSERT(0); + error = XFS_ERROR(EFSCORRUPTED); + goto out; + } + + + if (ip->i_df.if_flags & XFS_IFINLINE) { + memcpy(link, ip->i_df.if_u1.if_data, pathlen); + link[pathlen] = '\0'; + } else { + error = xfs_readlink_bmap(ip, link); + } + + out: + xfs_iunlock(ip, XFS_ILOCK_SHARED); + return error; +} + +int +xfs_symlink( + xfs_inode_t *dp, + struct xfs_name *link_name, + const char *target_path, + umode_t mode, + xfs_inode_t **ipp) +{ + xfs_mount_t *mp = dp->i_mount; + xfs_trans_t *tp; + xfs_inode_t *ip; + int error; + int pathlen; + xfs_bmap_free_t free_list; + xfs_fsblock_t first_block; + bool unlock_dp_on_error = false; + uint cancel_flags; + int committed; + xfs_fileoff_t first_fsb; + xfs_filblks_t fs_blocks; + int nmaps; + xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; + xfs_daddr_t d; + const char *cur_chunk; + int byte_cnt; + int n; + xfs_buf_t *bp; + prid_t prid; + struct xfs_dquot *udqp, *gdqp; + uint resblks; + + *ipp = NULL; + error = 0; + ip = NULL; + tp = NULL; + + trace_xfs_symlink(dp, link_name); + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + /* + * Check component lengths of the target path name. + */ + pathlen = strlen(target_path); + if (pathlen >= MAXPATHLEN) /* total string too long */ + return XFS_ERROR(ENAMETOOLONG); + + udqp = gdqp = NULL; + if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) + prid = xfs_get_projid(dp); + else + prid = XFS_PROJID_DEFAULT; + + /* + * Make sure that we have allocated dquot(s) on disk. + */ + error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid, + XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp); + if (error) + goto std_return; + + tp = xfs_trans_alloc(mp, XFS_TRANS_SYMLINK); + cancel_flags = XFS_TRANS_RELEASE_LOG_RES; + /* + * The symlink will fit into the inode data fork? + * There can't be any attributes so we get the whole variable part. + */ + if (pathlen <= XFS_LITINO(mp, dp->i_d.di_version)) + fs_blocks = 0; + else + fs_blocks = XFS_B_TO_FSB(mp, pathlen); + resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks); + error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0, + XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); + if (error == ENOSPC && fs_blocks == 0) { + resblks = 0; + error = xfs_trans_reserve(tp, 0, XFS_SYMLINK_LOG_RES(mp), 0, + XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); + } + if (error) { + cancel_flags = 0; + goto error_return; + } + + xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); + unlock_dp_on_error = true; + + /* + * Check whether the directory allows new symlinks or not. + */ + if (dp->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) { + error = XFS_ERROR(EPERM); + goto error_return; + } + + /* + * Reserve disk quota : blocks and inode. + */ + error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0); + if (error) + goto error_return; + + /* + * Check for ability to enter directory entry, if no space reserved. + */ + error = xfs_dir_canenter(tp, dp, link_name, resblks); + if (error) + goto error_return; + /* + * Initialize the bmap freelist prior to calling either + * bmapi or the directory create code. + */ + xfs_bmap_init(&free_list, &first_block); + + /* + * Allocate an inode for the symlink. + */ + error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (mode & ~S_IFMT), 1, 0, + prid, resblks > 0, &ip, NULL); + if (error) { + if (error == ENOSPC) + goto error_return; + goto error1; + } + + /* + * An error after we've joined dp to the transaction will result in the + * transaction cancel unlocking dp so don't do it explicitly in the + * error path. + */ + xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); + unlock_dp_on_error = false; + + /* + * Also attach the dquot(s) to it, if applicable. + */ + xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp); + + if (resblks) + resblks -= XFS_IALLOC_SPACE_RES(mp); + /* + * If the symlink will fit into the inode, write it inline. + */ + if (pathlen <= XFS_IFORK_DSIZE(ip)) { + xfs_idata_realloc(ip, pathlen, XFS_DATA_FORK); + memcpy(ip->i_df.if_u1.if_data, target_path, pathlen); + ip->i_d.di_size = pathlen; + + /* + * The inode was initially created in extent format. + */ + ip->i_df.if_flags &= ~(XFS_IFEXTENTS | XFS_IFBROOT); + ip->i_df.if_flags |= XFS_IFINLINE; + + ip->i_d.di_format = XFS_DINODE_FMT_LOCAL; + xfs_trans_log_inode(tp, ip, XFS_ILOG_DDATA | XFS_ILOG_CORE); + + } else { + first_fsb = 0; + nmaps = XFS_SYMLINK_MAPS; + + error = xfs_bmapi_write(tp, ip, first_fsb, fs_blocks, + XFS_BMAPI_METADATA, &first_block, resblks, + mval, &nmaps, &free_list); + if (error) + goto error2; + + if (resblks) + resblks -= fs_blocks; + ip->i_d.di_size = pathlen; + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + + cur_chunk = target_path; + for (n = 0; n < nmaps; n++) { + d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); + byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); + bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, + BTOBB(byte_cnt), 0); + if (!bp) { + error = ENOMEM; + goto error2; + } + if (pathlen < byte_cnt) { + byte_cnt = pathlen; + } + pathlen -= byte_cnt; + + memcpy(bp->b_addr, cur_chunk, byte_cnt); + cur_chunk += byte_cnt; + + xfs_trans_log_buf(tp, bp, 0, byte_cnt - 1); + } + } + + /* + * Create the directory entry for the symlink. + */ + error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, + &first_block, &free_list, resblks); + if (error) + goto error2; + xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); + + /* + * If this is a synchronous mount, make sure that the + * symlink transaction goes to disk before returning to + * the user. + */ + if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) { + xfs_trans_set_sync(tp); + } + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) { + goto error2; + } + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_qm_dqrele(udqp); + xfs_qm_dqrele(gdqp); + + *ipp = ip; + return 0; + + error2: + IRELE(ip); + error1: + xfs_bmap_cancel(&free_list); + cancel_flags |= XFS_TRANS_ABORT; + error_return: + xfs_trans_cancel(tp, cancel_flags); + xfs_qm_dqrele(udqp); + xfs_qm_dqrele(gdqp); + + if (unlock_dp_on_error) + xfs_iunlock(dp, XFS_ILOCK_EXCL); + std_return: + return error; +} + +/* + * Free a symlink that has blocks associated with it. + */ +STATIC int +xfs_inactive_symlink_rmt( + xfs_inode_t *ip, + xfs_trans_t **tpp) +{ + xfs_buf_t *bp; + int committed; + int done; + int error; + xfs_fsblock_t first_block; + xfs_bmap_free_t free_list; + int i; + xfs_mount_t *mp; + xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; + int nmaps; + xfs_trans_t *ntp; + int size; + xfs_trans_t *tp; + + tp = *tpp; + mp = ip->i_mount; + ASSERT(ip->i_d.di_size > XFS_IFORK_DSIZE(ip)); + /* + * We're freeing a symlink that has some + * blocks allocated to it. Free the + * blocks here. We know that we've got + * either 1 or 2 extents and that we can + * free them all in one bunmapi call. + */ + ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2); + + /* + * Lock the inode, fix the size, and join it to the transaction. + * Hold it so in the normal path, we still have it locked for + * the second transaction. In the error paths we need it + * held so the cancel won't rele it, see below. + */ + size = (int)ip->i_d.di_size; + ip->i_d.di_size = 0; + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + /* + * Find the block(s) so we can inval and unmap them. + */ + done = 0; + xfs_bmap_init(&free_list, &first_block); + nmaps = ARRAY_SIZE(mval); + error = xfs_bmapi_read(ip, 0, XFS_B_TO_FSB(mp, size), + mval, &nmaps, 0); + if (error) + goto error0; + /* + * Invalidate the block(s). + */ + for (i = 0; i < nmaps; i++) { + bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, + XFS_FSB_TO_DADDR(mp, mval[i].br_startblock), + XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0); + if (!bp) { + error = ENOMEM; + goto error1; + } + xfs_trans_binval(tp, bp); + } + /* + * Unmap the dead block(s) to the free_list. + */ + if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, + &first_block, &free_list, &done))) + goto error1; + ASSERT(done); + /* + * Commit the first transaction. This logs the EFI and the inode. + */ + if ((error = xfs_bmap_finish(&tp, &free_list, &committed))) + goto error1; + /* + * The transaction must have been committed, since there were + * actually extents freed by xfs_bunmapi. See xfs_bmap_finish. + * The new tp has the extent freeing and EFDs. + */ + ASSERT(committed); + /* + * The first xact was committed, so add the inode to the new one. + * Mark it dirty so it will be logged and moved forward in the log as + * part of every commit. + */ + xfs_trans_ijoin(tp, ip, 0); + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + /* + * Get a new, empty transaction to return to our caller. + */ + ntp = xfs_trans_dup(tp); + /* + * Commit the transaction containing extent freeing and EFDs. + * If we get an error on the commit here or on the reserve below, + * we need to unlock the inode since the new transaction doesn't + * have the inode attached. + */ + error = xfs_trans_commit(tp, 0); + tp = ntp; + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + goto error0; + } + /* + * transaction commit worked ok so we can drop the extra ticket + * reference that we gained in xfs_trans_dup() + */ + xfs_log_ticket_put(tp->t_ticket); + + /* + * Remove the memory for extent descriptions (just bookkeeping). + */ + if (ip->i_df.if_bytes) + xfs_idata_realloc(ip, -ip->i_df.if_bytes, XFS_DATA_FORK); + ASSERT(ip->i_df.if_bytes == 0); + /* + * Put an itruncate log reservation in the new transaction + * for our caller. + */ + if ((error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0, + XFS_TRANS_PERM_LOG_RES, XFS_ITRUNCATE_LOG_COUNT))) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + goto error0; + } + + xfs_trans_ijoin(tp, ip, 0); + *tpp = tp; + return 0; + + error1: + xfs_bmap_cancel(&free_list); + error0: + return error; +} diff --git a/fs/xfs/xfs_symlink.h b/fs/xfs/xfs_symlink.h new file mode 100644 index 0000000..07bdabc --- /dev/null +++ b/fs/xfs/xfs_symlink.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2012 Red Hat, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_SYMLINK_H +#define __XFS_SYMLINK_H 1 + +/* + * The maximum pathlen is 1024 bytes. Since the minimum file system + * blocksize is 512 bytes, we can get a max of 2 extents back from + * bmapi. + */ +#define XFS_SYMLINK_MAPS 2 + +void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, + struct xfs_inode *ip, struct xfs_ifork *ifp); + +#ifdef __KERNEL__ + +int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, + const char *target_path, umode_t mode, struct xfs_inode **ipp); +int xfs_readlink(struct xfs_inode *ip, char *link); +int xfs_inactive_symlink_rmt(struct xfs_inode *ip, struct xfs_trans **tpp); + +#endif /* __KERNEL__ */ +#endif /* __XFS_SYMLINK_H */ diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index aa0c066..1501f4f 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2012 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -48,103 +49,8 @@ #include "xfs_vnodeops.h" #include "xfs_trace.h" #include "xfs_icache.h" +#include "xfs_symlink.h" -/* - * The maximum pathlen is 1024 bytes. Since the minimum file system - * blocksize is 512 bytes, we can get a max of 2 extents back from - * bmapi. - */ -#define SYMLINK_MAPS 2 - -STATIC int -xfs_readlink_bmap( - xfs_inode_t *ip, - char *link) -{ - xfs_mount_t *mp = ip->i_mount; - int pathlen = ip->i_d.di_size; - int nmaps = SYMLINK_MAPS; - xfs_bmbt_irec_t mval[SYMLINK_MAPS]; - xfs_daddr_t d; - int byte_cnt; - int n; - xfs_buf_t *bp; - int error = 0; - - error = xfs_bmapi_read(ip, 0, XFS_B_TO_FSB(mp, pathlen), mval, &nmaps, - 0); - if (error) - goto out; - - for (n = 0; n < nmaps; n++) { - d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); - byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); - - bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0, NULL); - if (!bp) - return XFS_ERROR(ENOMEM); - error = bp->b_error; - if (error) { - xfs_buf_ioerror_alert(bp, __func__); - xfs_buf_relse(bp); - goto out; - } - if (pathlen < byte_cnt) - byte_cnt = pathlen; - pathlen -= byte_cnt; - - memcpy(link, bp->b_addr, byte_cnt); - xfs_buf_relse(bp); - } - - link[ip->i_d.di_size] = '\0'; - error = 0; - - out: - return error; -} - -int -xfs_readlink( - xfs_inode_t *ip, - char *link) -{ - xfs_mount_t *mp = ip->i_mount; - xfs_fsize_t pathlen; - int error = 0; - - trace_xfs_readlink(ip); - - if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); - - xfs_ilock(ip, XFS_ILOCK_SHARED); - - pathlen = ip->i_d.di_size; - if (!pathlen) - goto out; - - if (pathlen < 0 || pathlen > MAXPATHLEN) { - xfs_alert(mp, "%s: inode (%llu) bad symlink length (%lld)", - __func__, (unsigned long long) ip->i_ino, - (long long) pathlen); - ASSERT(0); - error = XFS_ERROR(EFSCORRUPTED); - goto out; - } - - - if (ip->i_df.if_flags & XFS_IFINLINE) { - memcpy(link, ip->i_df.if_u1.if_data, pathlen); - link[pathlen] = '\0'; - } else { - error = xfs_readlink_bmap(ip, link); - } - - out: - xfs_iunlock(ip, XFS_ILOCK_SHARED); - return error; -} /* * This is called by xfs_inactive to free any blocks beyond eof @@ -249,145 +155,6 @@ xfs_free_eofblocks( return error; } -/* - * Free a symlink that has blocks associated with it. - */ -STATIC int -xfs_inactive_symlink_rmt( - xfs_inode_t *ip, - xfs_trans_t **tpp) -{ - xfs_buf_t *bp; - int committed; - int done; - int error; - xfs_fsblock_t first_block; - xfs_bmap_free_t free_list; - int i; - xfs_mount_t *mp; - xfs_bmbt_irec_t mval[SYMLINK_MAPS]; - int nmaps; - xfs_trans_t *ntp; - int size; - xfs_trans_t *tp; - - tp = *tpp; - mp = ip->i_mount; - ASSERT(ip->i_d.di_size > XFS_IFORK_DSIZE(ip)); - /* - * We're freeing a symlink that has some - * blocks allocated to it. Free the - * blocks here. We know that we've got - * either 1 or 2 extents and that we can - * free them all in one bunmapi call. - */ - ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2); - - /* - * Lock the inode, fix the size, and join it to the transaction. - * Hold it so in the normal path, we still have it locked for - * the second transaction. In the error paths we need it - * held so the cancel won't rele it, see below. - */ - size = (int)ip->i_d.di_size; - ip->i_d.di_size = 0; - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - /* - * Find the block(s) so we can inval and unmap them. - */ - done = 0; - xfs_bmap_init(&free_list, &first_block); - nmaps = ARRAY_SIZE(mval); - error = xfs_bmapi_read(ip, 0, XFS_B_TO_FSB(mp, size), - mval, &nmaps, 0); - if (error) - goto error0; - /* - * Invalidate the block(s). - */ - for (i = 0; i < nmaps; i++) { - bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, - XFS_FSB_TO_DADDR(mp, mval[i].br_startblock), - XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0); - if (!bp) { - error = ENOMEM; - goto error1; - } - xfs_trans_binval(tp, bp); - } - /* - * Unmap the dead block(s) to the free_list. - */ - if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, - &first_block, &free_list, &done))) - goto error1; - ASSERT(done); - /* - * Commit the first transaction. This logs the EFI and the inode. - */ - if ((error = xfs_bmap_finish(&tp, &free_list, &committed))) - goto error1; - /* - * The transaction must have been committed, since there were - * actually extents freed by xfs_bunmapi. See xfs_bmap_finish. - * The new tp has the extent freeing and EFDs. - */ - ASSERT(committed); - /* - * The first xact was committed, so add the inode to the new one. - * Mark it dirty so it will be logged and moved forward in the log as - * part of every commit. - */ - xfs_trans_ijoin(tp, ip, 0); - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - /* - * Get a new, empty transaction to return to our caller. - */ - ntp = xfs_trans_dup(tp); - /* - * Commit the transaction containing extent freeing and EFDs. - * If we get an error on the commit here or on the reserve below, - * we need to unlock the inode since the new transaction doesn't - * have the inode attached. - */ - error = xfs_trans_commit(tp, 0); - tp = ntp; - if (error) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - goto error0; - } - /* - * transaction commit worked ok so we can drop the extra ticket - * reference that we gained in xfs_trans_dup() - */ - xfs_log_ticket_put(tp->t_ticket); - - /* - * Remove the memory for extent descriptions (just bookkeeping). - */ - if (ip->i_df.if_bytes) - xfs_idata_realloc(ip, -ip->i_df.if_bytes, XFS_DATA_FORK); - ASSERT(ip->i_df.if_bytes == 0); - /* - * Put an itruncate log reservation in the new transaction - * for our caller. - */ - if ((error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_ITRUNCATE_LOG_COUNT))) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - goto error0; - } - - xfs_trans_ijoin(tp, ip, 0); - *tpp = tp; - return 0; - - error1: - xfs_bmap_cancel(&free_list); - error0: - return error; -} - int xfs_release( xfs_inode_t *ip) @@ -1353,247 +1120,6 @@ xfs_link( } int -xfs_symlink( - xfs_inode_t *dp, - struct xfs_name *link_name, - const char *target_path, - umode_t mode, - xfs_inode_t **ipp) -{ - xfs_mount_t *mp = dp->i_mount; - xfs_trans_t *tp; - xfs_inode_t *ip; - int error; - int pathlen; - xfs_bmap_free_t free_list; - xfs_fsblock_t first_block; - bool unlock_dp_on_error = false; - uint cancel_flags; - int committed; - xfs_fileoff_t first_fsb; - xfs_filblks_t fs_blocks; - int nmaps; - xfs_bmbt_irec_t mval[SYMLINK_MAPS]; - xfs_daddr_t d; - const char *cur_chunk; - int byte_cnt; - int n; - xfs_buf_t *bp; - prid_t prid; - struct xfs_dquot *udqp, *gdqp; - uint resblks; - - *ipp = NULL; - error = 0; - ip = NULL; - tp = NULL; - - trace_xfs_symlink(dp, link_name); - - if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); - - /* - * Check component lengths of the target path name. - */ - pathlen = strlen(target_path); - if (pathlen >= MAXPATHLEN) /* total string too long */ - return XFS_ERROR(ENAMETOOLONG); - - udqp = gdqp = NULL; - if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) - prid = xfs_get_projid(dp); - else - prid = XFS_PROJID_DEFAULT; - - /* - * Make sure that we have allocated dquot(s) on disk. - */ - error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid, - XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp); - if (error) - goto std_return; - - tp = xfs_trans_alloc(mp, XFS_TRANS_SYMLINK); - cancel_flags = XFS_TRANS_RELEASE_LOG_RES; - /* - * The symlink will fit into the inode data fork? - * There can't be any attributes so we get the whole variable part. - */ - if (pathlen <= XFS_LITINO(mp, dp->i_d.di_version)) - fs_blocks = 0; - else - fs_blocks = XFS_B_TO_FSB(mp, pathlen); - resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks); - error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); - if (error == ENOSPC && fs_blocks == 0) { - resblks = 0; - error = xfs_trans_reserve(tp, 0, XFS_SYMLINK_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); - } - if (error) { - cancel_flags = 0; - goto error_return; - } - - xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); - unlock_dp_on_error = true; - - /* - * Check whether the directory allows new symlinks or not. - */ - if (dp->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) { - error = XFS_ERROR(EPERM); - goto error_return; - } - - /* - * Reserve disk quota : blocks and inode. - */ - error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0); - if (error) - goto error_return; - - /* - * Check for ability to enter directory entry, if no space reserved. - */ - error = xfs_dir_canenter(tp, dp, link_name, resblks); - if (error) - goto error_return; - /* - * Initialize the bmap freelist prior to calling either - * bmapi or the directory create code. - */ - xfs_bmap_init(&free_list, &first_block); - - /* - * Allocate an inode for the symlink. - */ - error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (mode & ~S_IFMT), 1, 0, - prid, resblks > 0, &ip, NULL); - if (error) { - if (error == ENOSPC) - goto error_return; - goto error1; - } - - /* - * An error after we've joined dp to the transaction will result in the - * transaction cancel unlocking dp so don't do it explicitly in the - * error path. - */ - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); - unlock_dp_on_error = false; - - /* - * Also attach the dquot(s) to it, if applicable. - */ - xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp); - - if (resblks) - resblks -= XFS_IALLOC_SPACE_RES(mp); - /* - * If the symlink will fit into the inode, write it inline. - */ - if (pathlen <= XFS_IFORK_DSIZE(ip)) { - xfs_idata_realloc(ip, pathlen, XFS_DATA_FORK); - memcpy(ip->i_df.if_u1.if_data, target_path, pathlen); - ip->i_d.di_size = pathlen; - - /* - * The inode was initially created in extent format. - */ - ip->i_df.if_flags &= ~(XFS_IFEXTENTS | XFS_IFBROOT); - ip->i_df.if_flags |= XFS_IFINLINE; - - ip->i_d.di_format = XFS_DINODE_FMT_LOCAL; - xfs_trans_log_inode(tp, ip, XFS_ILOG_DDATA | XFS_ILOG_CORE); - - } else { - first_fsb = 0; - nmaps = SYMLINK_MAPS; - - error = xfs_bmapi_write(tp, ip, first_fsb, fs_blocks, - XFS_BMAPI_METADATA, &first_block, resblks, - mval, &nmaps, &free_list); - if (error) - goto error2; - - if (resblks) - resblks -= fs_blocks; - ip->i_d.di_size = pathlen; - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - - cur_chunk = target_path; - for (n = 0; n < nmaps; n++) { - d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); - byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); - bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, - BTOBB(byte_cnt), 0); - if (!bp) { - error = ENOMEM; - goto error2; - } - if (pathlen < byte_cnt) { - byte_cnt = pathlen; - } - pathlen -= byte_cnt; - - memcpy(bp->b_addr, cur_chunk, byte_cnt); - cur_chunk += byte_cnt; - - xfs_trans_log_buf(tp, bp, 0, byte_cnt - 1); - } - } - - /* - * Create the directory entry for the symlink. - */ - error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, - &first_block, &free_list, resblks); - if (error) - goto error2; - xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); - xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); - - /* - * If this is a synchronous mount, make sure that the - * symlink transaction goes to disk before returning to - * the user. - */ - if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) { - xfs_trans_set_sync(tp); - } - - error = xfs_bmap_finish(&tp, &free_list, &committed); - if (error) { - goto error2; - } - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - xfs_qm_dqrele(udqp); - xfs_qm_dqrele(gdqp); - - *ipp = ip; - return 0; - - error2: - IRELE(ip); - error1: - xfs_bmap_cancel(&free_list); - cancel_flags |= XFS_TRANS_ABORT; - error_return: - xfs_trans_cancel(tp, cancel_flags); - xfs_qm_dqrele(udqp); - xfs_qm_dqrele(gdqp); - - if (unlock_dp_on_error) - xfs_iunlock(dp, XFS_ILOCK_EXCL); - std_return: - return error; -} - -int xfs_set_dmattrs( xfs_inode_t *ip, u_int evmask, -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 67A2629E1B for ; Wed, 3 Apr 2013 00:12:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 38E278F804C for ; Tue, 2 Apr 2013 22:12:03 -0700 (PDT) X-ASG-Debug-ID: 1364965918-04bdf0542c18eaa0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id rQCZP86YNaCsvuxZ for ; Tue, 02 Apr 2013 22:12:01 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aj4KAJm4W1F5LBrj/2dsb2JhbABDgwfAZQSBCBd0gh8BAQUnLzMIGBgZOQMbGYgTwVuNfIEugzYDnGyLCoMfKA Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:42:01 +1030 Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzM-0000Ll-G5 for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:12:00 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFzC-0005Bq-E9 for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:50 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 14/22] xfs: shortform directory offsets change for dir3 format Date: Wed, 3 Apr 2013 16:11:24 +1100 X-ASG-Orig-Subj: [PATCH 14/22] xfs: shortform directory offsets change for dir3 format Message-Id: <1364965892-19623-15-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965920 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Because the header size for the CRC enabled directory blocks is larger, the offset of the first entry into a directory block is different to the dir2 format. The shortform directory stores the dirent's offset so that it doesn't change when moving from shortform to block form and back again, and hence it needs to take into account the different header sizes to maintain the correct offsets. Signed-off-by: Dave Chinner --- fs/xfs/xfs_dir2_format.h | 25 ++++++++++++++----------- fs/xfs/xfs_dir2_sf.c | 10 +++++----- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/fs/xfs/xfs_dir2_format.h b/fs/xfs/xfs_dir2_format.h index 7b986d3..a3b1bd8 100644 --- a/fs/xfs/xfs_dir2_format.h +++ b/fs/xfs/xfs_dir2_format.h @@ -228,16 +228,6 @@ xfs_dir2_sf_nextentry(struct xfs_dir2_sf_hdr *hdr, xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) /* - * Offsets of . and .. in data space (always block 0) - */ -#define XFS_DIR2_DATA_DOT_OFFSET \ - ((xfs_dir2_data_aoff_t)sizeof(struct xfs_dir2_data_hdr)) -#define XFS_DIR2_DATA_DOTDOT_OFFSET \ - (XFS_DIR2_DATA_DOT_OFFSET + xfs_dir2_data_entsize(1)) -#define XFS_DIR2_DATA_FIRST_OFFSET \ - (XFS_DIR2_DATA_DOTDOT_OFFSET + xfs_dir2_data_entsize(2)) - -/* * Describe a free area in the data block. * * The freespace will be formatted as a xfs_dir2_data_unused_t. @@ -378,7 +368,20 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) /* * Offsets of . and .. in data space (always block 0) - */ + * + * The macros are used for shortform directories as they have no headers to read + * the magic number out of. Shortform directories need to know the size of the + * data block header because the sfe embeds the block offset of the entry into + * it so that it doesn't change when format conversion occurs. Bad Things Happen + * if we don't follow this rule. + */ +#define XFS_DIR3_DATA_DOT_OFFSET(mp) \ + xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&(mp)->m_sb)) +#define XFS_DIR3_DATA_DOTDOT_OFFSET(mp) \ + (XFS_DIR3_DATA_DOT_OFFSET(mp) + xfs_dir2_data_entsize(1)) +#define XFS_DIR3_DATA_FIRST_OFFSET(mp) \ + (XFS_DIR3_DATA_DOTDOT_OFFSET(mp) + xfs_dir2_data_entsize(2)) + static inline xfs_dir2_data_aoff_t xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) { diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index b975622..6157424 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -535,7 +535,7 @@ xfs_dir2_sf_addname_hard( * to insert the new entry. * If it's going to end up at the end then oldsfep will point there. */ - for (offset = XFS_DIR2_DATA_FIRST_OFFSET, + for (offset = XFS_DIR3_DATA_FIRST_OFFSET(dp->i_mount), oldsfep = xfs_dir2_sf_firstentry(oldsfp), add_datasize = xfs_dir2_data_entsize(args->namelen), eof = (char *)oldsfep == &buf[old_isize]; @@ -617,7 +617,7 @@ xfs_dir2_sf_addname_pick( sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; size = xfs_dir2_data_entsize(args->namelen); - offset = XFS_DIR2_DATA_FIRST_OFFSET; + offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); sfep = xfs_dir2_sf_firstentry(sfp); holefit = 0; /* @@ -688,7 +688,7 @@ xfs_dir2_sf_check( dp = args->dp; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - offset = XFS_DIR2_DATA_FIRST_OFFSET; + offset = XFS_DIR3_DATA_FIRST_OFFSET(dp->i_mount); ino = xfs_dir2_sf_get_parent_ino(sfp); i8count = ino > XFS_DIR2_MAX_SHORT_INUM; @@ -812,9 +812,9 @@ xfs_dir2_sf_getdents( * mp->m_dirdatablk. */ dot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, - XFS_DIR2_DATA_DOT_OFFSET); + XFS_DIR3_DATA_DOT_OFFSET(mp)); dotdot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, - XFS_DIR2_DATA_DOTDOT_OFFSET); + XFS_DIR3_DATA_DOTDOT_OFFSET(mp)); /* * Put . entry unless we're starting past it. -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6013429E19 for ; Wed, 3 Apr 2013 00:12:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4CCE48F8054 for ; Tue, 2 Apr 2013 22:12:03 -0700 (PDT) X-ASG-Debug-ID: 1364965917-04cb6c1e79196b30002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 0PBS2twg5l4BwCug for ; Tue, 02 Apr 2013 22:12:00 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkAKAJm4W1F5LBrj/2dsb2JhbABDgwfAZQQBgQcXdIIfAQEFGgEMLzMIGDE5AxsZiBPBW418gRKDUgOndoMfKIEwJA Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:55 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzH-0000Lm-D6 for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:55 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFz7-0005BX-8c for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:45 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 10/22] xfs: add CRC checks to block format directory blocks Date: Wed, 3 Apr 2013 16:11:20 +1100 X-ASG-Orig-Subj: [PATCH 10/22] xfs: add CRC checks to block format directory blocks Message-Id: <1364965892-19623-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965919 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that directory buffers are made from a single struct xfs_buf, we can add CRC calculation and checking callbacks. While there, add all the fields to the on disk structures for future functionality such as d_type support, uuids, block numbers, owner inode, etc. To distinguish between the different on disk formats, change the magic numbers for the new format directory blocks. Signed-off-by: Dave Chinner --- fs/xfs/xfs_dir2_block.c | 132 +++++++++++++++++++++++++++----------- fs/xfs/xfs_dir2_data.c | 160 ++++++++++++++++++++++++++++------------------ fs/xfs/xfs_dir2_format.h | 143 +++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_dir2_leaf.c | 6 +- fs/xfs/xfs_dir2_node.c | 2 +- fs/xfs/xfs_dir2_priv.h | 4 +- fs/xfs/xfs_dir2_sf.c | 2 +- 7 files changed, 344 insertions(+), 105 deletions(-) diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 12afe07..79a3f1b 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -28,11 +29,13 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" +#include "xfs_buf_item.h" #include "xfs_dir2.h" #include "xfs_dir2_format.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_cksum.h" /* * Local function prototypes. @@ -56,44 +59,74 @@ xfs_dir_startup(void) xfs_dir_hash_dotdot = xfs_da_hashname((unsigned char *)"..", 2); } -static void -xfs_dir2_block_verify( +static bool +xfs_dir3_block_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_dir2_data_hdr *hdr = bp->b_addr; - int block_ok = 0; - - block_ok = hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); - block_ok = block_ok && __xfs_dir2_data_check(NULL, bp) == 0; - - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (hdr3->magic != cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) + return false; + if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(hdr3->blkno) != bp->b_bn) + return false; + } else { + if (hdr3->magic != cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) + return false; } + if (__xfs_dir2_data_check(NULL, bp)) + return false; + return true; } static void -xfs_dir2_block_read_verify( +xfs_dir3_block_read_verify( struct xfs_buf *bp) { - xfs_dir2_block_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_DIR3_DATA_CRC_OFF)) || + !xfs_dir3_block_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void -xfs_dir2_block_write_verify( +xfs_dir3_block_write_verify( struct xfs_buf *bp) { - xfs_dir2_block_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; + + if (!xfs_dir3_block_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_DATA_CRC_OFF); } -const struct xfs_buf_ops xfs_dir2_block_buf_ops = { - .verify_read = xfs_dir2_block_read_verify, - .verify_write = xfs_dir2_block_write_verify, +const struct xfs_buf_ops xfs_dir3_block_buf_ops = { + .verify_read = xfs_dir3_block_read_verify, + .verify_write = xfs_dir3_block_write_verify, }; static int -xfs_dir2_block_read( +xfs_dir3_block_read( struct xfs_trans *tp, struct xfs_inode *dp, struct xfs_buf **bpp) @@ -101,7 +134,29 @@ xfs_dir2_block_read( struct xfs_mount *mp = dp->i_mount; return xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, - XFS_DATA_FORK, &xfs_dir2_block_buf_ops); + XFS_DATA_FORK, &xfs_dir3_block_buf_ops); +} + +static void +xfs_dir3_block_init( + struct xfs_mount *mp, + struct xfs_buf *bp, + struct xfs_inode *dp) +{ + struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; + + bp->b_ops = &xfs_dir3_block_buf_ops; + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + memset(hdr3, 0, sizeof(*hdr3)); + hdr3->magic = cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + hdr3->blkno = cpu_to_be64(bp->b_bn); + hdr3->owner = cpu_to_be64(dp->i_ino); + uuid_copy(&hdr3->uuid, &mp->m_sb.sb_uuid); + return; + + } + hdr3->magic = cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); } static void @@ -121,7 +176,7 @@ xfs_dir2_block_need_space( struct xfs_dir2_data_unused *enddup = NULL; *compact = 0; - bf = hdr->bestfree; + bf = xfs_dir3_data_bestfree_p(hdr); /* * If there are stale entries we'll use one for the leaf. @@ -303,7 +358,7 @@ xfs_dir2_block_addname( mp = dp->i_mount; /* Read the (one and only) directory block into bp. */ - error = xfs_dir2_block_read(tp, dp, &bp); + error = xfs_dir3_block_read(tp, dp, &bp); if (error) return error; @@ -531,7 +586,7 @@ xfs_dir2_block_getdents( if (xfs_dir2_dataptr_to_db(mp, *offset) > mp->m_dirdatablk) return 0; - error = xfs_dir2_block_read(NULL, dp, &bp); + error = xfs_dir3_block_read(NULL, dp, &bp); if (error) return error; @@ -546,7 +601,7 @@ xfs_dir2_block_getdents( * Set up values for the loop. */ btp = xfs_dir2_block_tail_p(mp, hdr); - ptr = (char *)(hdr + 1); + ptr = (char *)xfs_dir3_data_entry_p(hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); /* @@ -711,7 +766,7 @@ xfs_dir2_block_lookup_int( tp = args->trans; mp = dp->i_mount; - error = xfs_dir2_block_read(tp, dp, &bp); + error = xfs_dir3_block_read(tp, dp, &bp); if (error) return error; @@ -974,9 +1029,12 @@ xfs_dir2_leaf_to_block( * These will show up in the leaf bests table. */ while (dp->i_d.di_size > mp->m_dirblksize) { + int hdrsz; + + hdrsz = xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); bestsp = xfs_dir2_leaf_bests_p(ltp); if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) == - mp->m_dirblksize - (uint)sizeof(*hdr)) { + mp->m_dirblksize - hdrsz) { if ((error = xfs_dir2_leaf_trim_data(args, lbp, (xfs_dir2_db_t)(be32_to_cpu(ltp->bestcount) - 1)))) @@ -1014,8 +1072,8 @@ xfs_dir2_leaf_to_block( /* * Start converting it to block form. */ - dbp->b_ops = &xfs_dir2_block_buf_ops; - hdr->magic = cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); + xfs_dir3_block_init(mp, dbp, dp); + needlog = 1; needscan = 0; /* @@ -1137,16 +1195,16 @@ xfs_dir2_sf_to_block( return error; } /* - * Initialize the data block. + * Initialize the data block, then convert it to block format. */ - error = xfs_dir2_data_init(args, blkno, &bp); + error = xfs_dir3_data_init(args, blkno, &bp); if (error) { kmem_free(sfp); return error; } - bp->b_ops = &xfs_dir2_block_buf_ops; + xfs_dir3_block_init(mp, bp, dp); hdr = bp->b_addr; - hdr->magic = cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); + /* * Compute size of block "tail" area. */ @@ -1156,7 +1214,7 @@ xfs_dir2_sf_to_block( * The whole thing is initialized to free by the init routine. * Say we're using the leaf and tail area. */ - dup = (xfs_dir2_data_unused_t *)(hdr + 1); + dup = xfs_dir3_data_unused_p(hdr); needlog = needscan = 0; xfs_dir2_data_use_free(tp, bp, dup, mp->m_dirblksize - i, i, &needlog, &needscan); @@ -1178,8 +1236,7 @@ xfs_dir2_sf_to_block( /* * Create entry for . */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + XFS_DIR2_DATA_DOT_OFFSET); + dep = xfs_dir3_data_dot_entry_p(hdr); dep->inumber = cpu_to_be64(dp->i_ino); dep->namelen = 1; dep->name[0] = '.'; @@ -1192,8 +1249,7 @@ xfs_dir2_sf_to_block( /* * Create entry for .. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + XFS_DIR2_DATA_DOTDOT_OFFSET); + dep = xfs_dir3_data_dotdot_entry_p(hdr); dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); dep->namelen = 2; dep->name[0] = dep->name[1] = '.'; @@ -1203,7 +1259,7 @@ xfs_dir2_sf_to_block( blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, (char *)dep - (char *)hdr)); - offset = XFS_DIR2_DATA_FIRST_OFFSET; + offset = xfs_dir3_data_first_offset(hdr); /* * Loop over existing entries, stuff them in. */ diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index ffcf177..8484ec4 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -65,10 +66,11 @@ __xfs_dir2_data_check( mp = bp->b_target->bt_mount; hdr = bp->b_addr; - bf = hdr->bestfree; - p = (char *)(hdr + 1); + bf = xfs_dir3_data_bestfree_p(hdr); + p = (char *)xfs_dir3_data_entry_p(hdr); switch (hdr->magic) { + case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC): btp = xfs_dir2_block_tail_p(mp, hdr); lep = xfs_dir2_block_leaf_p(btp); @@ -148,7 +150,8 @@ __xfs_dir2_data_check( (char *)dep - (char *)hdr); count++; lastfree = 0; - if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) { + if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { addr = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, (xfs_dir2_data_aoff_t) ((char *)dep - (char *)hdr)); @@ -168,7 +171,8 @@ __xfs_dir2_data_check( * Need to have seen all the entries and all the bestfree slots. */ XFS_WANT_CORRUPTED_RETURN(freeseen == 7); - if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) { + if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { for (i = stale = 0; i < be32_to_cpu(btp->count); i++) { if (lep[i].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) @@ -216,7 +220,8 @@ xfs_dir2_data_reada_verify( switch (hdr->magic) { case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC): - bp->b_ops = &xfs_dir2_block_buf_ops; + case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): + bp->b_ops = &xfs_dir3_block_buf_ops; bp->b_ops->verify_read(bp); return; case cpu_to_be32(XFS_DIR2_DATA_MAGIC): @@ -288,12 +293,15 @@ xfs_dir2_data_freefind( { xfs_dir2_data_free_t *dfp; /* bestfree entry */ xfs_dir2_data_aoff_t off; /* offset value needed */ + struct xfs_dir2_data_free *bf; #if defined(DEBUG) && defined(__KERNEL__) int matched; /* matched the value */ int seenzero; /* saw a 0 bestfree entry */ #endif off = (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr); + bf = xfs_dir3_data_bestfree_p(hdr); + #if defined(DEBUG) && defined(__KERNEL__) /* * Validate some consistency in the bestfree table. @@ -301,9 +309,10 @@ xfs_dir2_data_freefind( * one we're looking for it has to be exact. */ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); - for (dfp = &hdr->bestfree[0], seenzero = matched = 0; - dfp < &hdr->bestfree[XFS_DIR2_DATA_FD_COUNT]; + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); + for (dfp = &bf[0], seenzero = matched = 0; + dfp < &bf[XFS_DIR2_DATA_FD_COUNT]; dfp++) { if (!dfp->offset) { ASSERT(!dfp->length); @@ -319,7 +328,7 @@ xfs_dir2_data_freefind( else ASSERT(be16_to_cpu(dfp->offset) + be16_to_cpu(dfp->length) <= off); ASSERT(matched || be16_to_cpu(dfp->length) >= be16_to_cpu(dup->length)); - if (dfp > &hdr->bestfree[0]) + if (dfp > &bf[0]) ASSERT(be16_to_cpu(dfp[-1].length) >= be16_to_cpu(dfp[0].length)); } #endif @@ -328,14 +337,12 @@ xfs_dir2_data_freefind( * it can't be there since they're sorted. */ if (be16_to_cpu(dup->length) < - be16_to_cpu(hdr->bestfree[XFS_DIR2_DATA_FD_COUNT - 1].length)) + be16_to_cpu(bf[XFS_DIR2_DATA_FD_COUNT - 1].length)) return NULL; /* * Look at the three bestfree entries for our guy. */ - for (dfp = &hdr->bestfree[0]; - dfp < &hdr->bestfree[XFS_DIR2_DATA_FD_COUNT]; - dfp++) { + for (dfp = &bf[0]; dfp < &bf[XFS_DIR2_DATA_FD_COUNT]; dfp++) { if (!dfp->offset) return NULL; if (be16_to_cpu(dfp->offset) == off) @@ -359,11 +366,12 @@ xfs_dir2_data_freeinsert( xfs_dir2_data_free_t *dfp; /* bestfree table pointer */ xfs_dir2_data_free_t new; /* new bestfree entry */ -#ifdef __KERNEL__ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); -#endif - dfp = hdr->bestfree; + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); + + dfp = xfs_dir3_data_bestfree_p(hdr); new.length = dup->length; new.offset = cpu_to_be16((char *)dup - (char *)hdr); @@ -400,32 +408,36 @@ xfs_dir2_data_freeremove( xfs_dir2_data_free_t *dfp, /* bestfree entry pointer */ int *loghead) /* out: log data header */ { -#ifdef __KERNEL__ + struct xfs_dir2_data_free *bf; + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); -#endif + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); + /* * It's the first entry, slide the next 2 up. */ - if (dfp == &hdr->bestfree[0]) { - hdr->bestfree[0] = hdr->bestfree[1]; - hdr->bestfree[1] = hdr->bestfree[2]; + bf = xfs_dir3_data_bestfree_p(hdr); + if (dfp == &bf[0]) { + bf[0] = bf[1]; + bf[1] = bf[2]; } /* * It's the second entry, slide the 3rd entry up. */ - else if (dfp == &hdr->bestfree[1]) - hdr->bestfree[1] = hdr->bestfree[2]; + else if (dfp == &bf[1]) + bf[1] = bf[2]; /* * Must be the last entry. */ else - ASSERT(dfp == &hdr->bestfree[2]); + ASSERT(dfp == &bf[2]); /* * Clear the 3rd entry, must be zero now. */ - hdr->bestfree[2].length = 0; - hdr->bestfree[2].offset = 0; + bf[2].length = 0; + bf[2].offset = 0; *loghead = 1; } @@ -441,23 +453,26 @@ xfs_dir2_data_freescan( xfs_dir2_block_tail_t *btp; /* block tail */ xfs_dir2_data_entry_t *dep; /* active data entry */ xfs_dir2_data_unused_t *dup; /* unused data entry */ + struct xfs_dir2_data_free *bf; char *endp; /* end of block's data */ char *p; /* current entry pointer */ -#ifdef __KERNEL__ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); -#endif + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); + /* * Start by clearing the table. */ - memset(hdr->bestfree, 0, sizeof(hdr->bestfree)); + bf = xfs_dir3_data_bestfree_p(hdr); + memset(bf, 0, sizeof(*bf) * XFS_DIR2_DATA_FD_COUNT); *loghead = 1; /* * Set up pointers. */ - p = (char *)(hdr + 1); - if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) { + p = (char *)xfs_dir3_data_entry_p(hdr); + if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { btp = xfs_dir2_block_tail_p(mp, hdr); endp = (char *)xfs_dir2_block_leaf_p(btp); } else @@ -493,7 +508,7 @@ xfs_dir2_data_freescan( * Give back the buffer for the created block. */ int /* error */ -xfs_dir2_data_init( +xfs_dir3_data_init( xfs_da_args_t *args, /* directory operation args */ xfs_dir2_db_t blkno, /* logical dir block number */ struct xfs_buf **bpp) /* output block buffer */ @@ -502,6 +517,7 @@ xfs_dir2_data_init( xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_inode_t *dp; /* incore directory inode */ xfs_dir2_data_unused_t *dup; /* unused entry pointer */ + struct xfs_dir2_data_free *bf; int error; /* error return value */ int i; /* bestfree index */ xfs_mount_t *mp; /* filesystem mount point */ @@ -524,21 +540,34 @@ xfs_dir2_data_init( * Initialize the header. */ hdr = bp->b_addr; - hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); - hdr->bestfree[0].offset = cpu_to_be16(sizeof(*hdr)); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; + + memset(hdr3, 0, sizeof(*hdr3)); + hdr3->magic = cpu_to_be32(XFS_DIR3_DATA_MAGIC); + hdr3->blkno = cpu_to_be64(bp->b_bn); + hdr3->owner = cpu_to_be64(dp->i_ino); + uuid_copy(&hdr3->uuid, &mp->m_sb.sb_uuid); + + } else + hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); + + bf = xfs_dir3_data_bestfree_p(hdr); + bf[0].offset = cpu_to_be16(xfs_dir3_data_entry_offset(hdr)); for (i = 1; i < XFS_DIR2_DATA_FD_COUNT; i++) { - hdr->bestfree[i].length = 0; - hdr->bestfree[i].offset = 0; + bf[i].length = 0; + bf[i].offset = 0; } /* * Set up an unused entry for the block's body. */ - dup = (xfs_dir2_data_unused_t *)(hdr + 1); + dup = xfs_dir3_data_unused_p(hdr); dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); - t = mp->m_dirblksize - (uint)sizeof(*hdr); - hdr->bestfree[0].length = cpu_to_be16(t); + t = mp->m_dirblksize - (uint)xfs_dir3_data_entry_offset(hdr); + bf[0].length = cpu_to_be16(t); dup->length = cpu_to_be16(t); *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16((char *)dup - (char *)hdr); /* @@ -562,7 +591,8 @@ xfs_dir2_data_log_entry( xfs_dir2_data_hdr_t *hdr = bp->b_addr; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); xfs_trans_log_buf(tp, bp, (uint)((char *)dep - (char *)hdr), (uint)((char *)(xfs_dir2_data_entry_tag_p(dep) + 1) - @@ -580,9 +610,10 @@ xfs_dir2_data_log_header( xfs_dir2_data_hdr_t *hdr = bp->b_addr; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - xfs_trans_log_buf(tp, bp, 0, sizeof(*hdr) - 1); + xfs_trans_log_buf(tp, bp, 0, xfs_dir3_data_entry_offset(hdr) - 1); } /* @@ -597,7 +628,8 @@ xfs_dir2_data_log_unused( xfs_dir2_data_hdr_t *hdr = bp->b_addr; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); /* * Log the first part of the unused entry. @@ -635,6 +667,7 @@ xfs_dir2_data_make_free( xfs_dir2_data_unused_t *newdup; /* new unused entry */ xfs_dir2_data_unused_t *postdup; /* unused entry after us */ xfs_dir2_data_unused_t *prevdup; /* unused entry before us */ + struct xfs_dir2_data_free *bf; mp = tp->t_mountp; hdr = bp->b_addr; @@ -647,7 +680,8 @@ xfs_dir2_data_make_free( else { xfs_dir2_block_tail_t *btp; /* block tail */ - ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); btp = xfs_dir2_block_tail_p(mp, hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); } @@ -655,7 +689,7 @@ xfs_dir2_data_make_free( * If this isn't the start of the block, then back up to * the previous entry and see if it's free. */ - if (offset > sizeof(*hdr)) { + if (offset > xfs_dir3_data_entry_offset(hdr)) { __be16 *tagp; /* tag just before us */ tagp = (__be16 *)((char *)hdr + offset) - 1; @@ -681,6 +715,7 @@ xfs_dir2_data_make_free( * Previous and following entries are both free, * merge everything into a single free entry. */ + bf = xfs_dir3_data_bestfree_p(hdr); if (prevdup && postdup) { xfs_dir2_data_free_t *dfp2; /* another bestfree pointer */ @@ -695,7 +730,7 @@ xfs_dir2_data_make_free( * since the third bestfree is there, there might be more * entries. */ - needscan = (hdr->bestfree[2].length != 0); + needscan = (bf[2].length != 0); /* * Fix up the new big freespace. */ @@ -711,10 +746,10 @@ xfs_dir2_data_make_free( * Remove entry 1 first then entry 0. */ ASSERT(dfp && dfp2); - if (dfp == &hdr->bestfree[1]) { - dfp = &hdr->bestfree[0]; + if (dfp == &bf[1]) { + dfp = &bf[0]; ASSERT(dfp2 == dfp); - dfp2 = &hdr->bestfree[1]; + dfp2 = &bf[1]; } xfs_dir2_data_freeremove(hdr, dfp2, needlogp); xfs_dir2_data_freeremove(hdr, dfp, needlogp); @@ -722,7 +757,7 @@ xfs_dir2_data_make_free( * Now insert the new entry. */ dfp = xfs_dir2_data_freeinsert(hdr, prevdup, needlogp); - ASSERT(dfp == &hdr->bestfree[0]); + ASSERT(dfp == &bf[0]); ASSERT(dfp->length == prevdup->length); ASSERT(!dfp[1].length); ASSERT(!dfp[2].length); @@ -751,7 +786,7 @@ xfs_dir2_data_make_free( */ else { needscan = be16_to_cpu(prevdup->length) > - be16_to_cpu(hdr->bestfree[2].length); + be16_to_cpu(bf[2].length); } } /* @@ -779,7 +814,7 @@ xfs_dir2_data_make_free( */ else { needscan = be16_to_cpu(newdup->length) > - be16_to_cpu(hdr->bestfree[2].length); + be16_to_cpu(bf[2].length); } } /* @@ -818,10 +853,12 @@ xfs_dir2_data_use_free( xfs_dir2_data_unused_t *newdup; /* new unused entry */ xfs_dir2_data_unused_t *newdup2; /* another new unused entry */ int oldlen; /* old unused entry's length */ + struct xfs_dir2_data_free *bf; hdr = bp->b_addr; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); ASSERT(be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG); ASSERT(offset >= (char *)dup - (char *)hdr); ASSERT(offset + len <= (char *)dup + be16_to_cpu(dup->length) - (char *)hdr); @@ -831,7 +868,8 @@ xfs_dir2_data_use_free( */ dfp = xfs_dir2_data_freefind(hdr, dup); oldlen = be16_to_cpu(dup->length); - ASSERT(dfp || oldlen <= be16_to_cpu(hdr->bestfree[2].length)); + bf = xfs_dir3_data_bestfree_p(hdr); + ASSERT(dfp || oldlen <= be16_to_cpu(bf[2].length)); /* * Check for alignment with front and back of the entry. */ @@ -845,7 +883,7 @@ xfs_dir2_data_use_free( */ if (matchfront && matchback) { if (dfp) { - needscan = (hdr->bestfree[2].offset != 0); + needscan = (bf[2].offset != 0); if (!needscan) xfs_dir2_data_freeremove(hdr, dfp, needlogp); } @@ -875,7 +913,7 @@ xfs_dir2_data_use_free( * that means we don't know if there was a better * choice for the last slot, or not. Rescan. */ - needscan = dfp == &hdr->bestfree[2]; + needscan = dfp == &bf[2]; } } /* @@ -902,7 +940,7 @@ xfs_dir2_data_use_free( * that means we don't know if there was a better * choice for the last slot, or not. Rescan. */ - needscan = dfp == &hdr->bestfree[2]; + needscan = dfp == &bf[2]; } } /* @@ -930,7 +968,7 @@ xfs_dir2_data_use_free( * the 2 new will work. */ if (dfp) { - needscan = (hdr->bestfree[2].length != 0); + needscan = (bf[2].length != 0); if (!needscan) { xfs_dir2_data_freeremove(hdr, dfp, needlogp); xfs_dir2_data_freeinsert(hdr, newdup, needlogp); diff --git a/fs/xfs/xfs_dir2_format.h b/fs/xfs/xfs_dir2_format.h index 0727098..845979a 100644 --- a/fs/xfs/xfs_dir2_format.h +++ b/fs/xfs/xfs_dir2_format.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -36,6 +37,37 @@ #define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F: free index blocks */ /* + * Directory Version 3 With CRCs. + * + * The tree formats are the same as for version 2 directories. The difference + * is in the block header and dirent formats. In many cases the v3 structures + * use v2 definitions as they are no different and this makes code sharing much + * easier. + * + * Also, the xfs_dir3_*() functions handle both v2 and v3 formats - if the + * format is v2 then they switch to the existing v2 code, or the format is v3 + * they implement the v3 functionality. This means the existing dir2 is a mix of + * xfs_dir2/xfs_dir3 calls and functions. The xfs_dir3 functions are called + * where there is a difference in the formats, otherwise the code is unchanged. + * + * Where it is possible, the code decides what to do based on the magic numbers + * in the blocks rather than feature bits in the superblock. This means the code + * is as independent of the external XFS code as possible as doesn't require + * passing struct xfs_mount pointers into places where it isn't really + * necessary. + * + * Version 3 includes: + * + * - a larger block header for CRC and identification purposes and so the + * offsets of all the structures inside the blocks are different. + * + * - new magic numbers to be able to detect the v2/v3 types on the fly. + */ + +#define XFS_DIR3_BLOCK_MAGIC 0x58444233 /* XDB3: single block dirs */ +#define XFS_DIR3_DATA_MAGIC 0x58444433 /* XDD3: multiblock dirs */ + +/* * Byte offset in data block and shortform entry. */ typedef __uint16_t xfs_dir2_data_off_t; @@ -226,6 +258,38 @@ typedef struct xfs_dir2_data_hdr { } xfs_dir2_data_hdr_t; /* + * define a structure for all the verification fields we are adding to the + * directory block structures. This will be used in several structures. + * The magic number must be the first entry to align with all the dir2 + * structures so we determine how to decode them just by the magic number. + */ +struct xfs_dir3_blk_hdr { + __be32 magic; /* magic number */ + __be32 crc; /* CRC of block */ + __be64 blkno; /* first block of the buffer */ + __be64 lsn; /* sequence number of last write */ + uuid_t uuid; /* filesystem we belong to */ + __be64 owner; /* inode that owns the block */ +}; + +struct xfs_dir3_data_hdr { + struct xfs_dir3_blk_hdr hdr; + xfs_dir2_data_free_t best_free[XFS_DIR2_DATA_FD_COUNT]; +}; + +#define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) + +static inline struct xfs_dir2_data_free * +xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) +{ + if (hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { + struct xfs_dir3_data_hdr *hdr3 = (struct xfs_dir3_data_hdr *)hdr; + return hdr3->best_free; + } + return hdr->bestfree; +} + +/* * Active entry in a data block. * * Aligned to 8 bytes. After the variable length name field there is a @@ -280,6 +344,85 @@ xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) be16_to_cpu(dup->length) - sizeof(__be16)); } +static inline struct xfs_dir2_data_unused * +xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) +{ + if (hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { + return (struct xfs_dir2_data_unused *) + ((char *)hdr + sizeof(struct xfs_dir3_data_hdr)); + } + return (struct xfs_dir2_data_unused *) + ((char *)hdr + sizeof(struct xfs_dir2_data_hdr)); +} + +static inline size_t +xfs_dir3_data_hdr_size(bool dir3) +{ + if (dir3) + return sizeof(struct xfs_dir3_data_hdr); + return sizeof(struct xfs_dir2_data_hdr); +} + +static inline size_t +xfs_dir3_data_entry_offset(struct xfs_dir2_data_hdr *hdr) +{ + bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + return xfs_dir3_data_hdr_size(dir3); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); +} + +/* + * Offsets of . and .. in data space (always block 0) + */ +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) +{ + return xfs_dir3_data_entry_offset(hdr); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_dotdot_offset(struct xfs_dir2_data_hdr *hdr) +{ + return xfs_dir3_data_dot_offset(hdr) + xfs_dir2_data_entsize(1); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_first_offset(struct xfs_dir2_data_hdr *hdr) +{ + return xfs_dir3_data_dotdot_offset(hdr) + xfs_dir2_data_entsize(2); +} + +/* + * location of . and .. in data space (always block 0) + */ +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_dot_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_dot_offset(hdr)); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_dotdot_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_dotdot_offset(hdr)); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_first_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_first_offset(hdr)); +} + /* * Leaf block structures. * diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 60cd2fa..ef163f0 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -149,6 +149,7 @@ xfs_dir2_block_to_leaf( int needlog; /* need to log block header */ int needscan; /* need to rescan bestfree */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_data_free *bf; trace_xfs_dir2_block_to_leaf(args); @@ -177,6 +178,7 @@ xfs_dir2_block_to_leaf( xfs_dir2_data_check(dp, dbp); btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); + bf = xfs_dir3_data_bestfree_p(hdr); /* * Set the counts in the leaf header. */ @@ -212,7 +214,7 @@ xfs_dir2_block_to_leaf( ltp = xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount = cpu_to_be32(1); bestsp = xfs_dir2_leaf_bests_p(ltp); - bestsp[0] = hdr->bestfree[0].length; + bestsp[0] = bf[0].length; /* * Log the data header and leaf bests table. */ @@ -544,7 +546,7 @@ xfs_dir2_leaf_addname( /* * Initialize the block. */ - if ((error = xfs_dir2_data_init(args, use_block, &dbp))) { + if ((error = xfs_dir3_data_init(args, use_block, &dbp))) { xfs_trans_brelse(tp, lbp); return error; } diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 5980f9b..985d70b 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1588,7 +1588,7 @@ xfs_dir2_node_addname_int( if (unlikely((error = xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, &dbno)) || - (error = xfs_dir2_data_init(args, dbno, &dbp)))) + (error = xfs_dir3_data_init(args, dbno, &dbp)))) return error; /* diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 7da79f6..e6f2e0a 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -30,7 +30,7 @@ extern int xfs_dir_cilookup_result(struct xfs_da_args *args, const unsigned char *name, int len); /* xfs_dir2_block.c */ -extern const struct xfs_buf_ops xfs_dir2_block_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_block_buf_ops; extern int xfs_dir2_block_addname(struct xfs_da_args *args); extern int xfs_dir2_block_getdents(struct xfs_inode *dp, void *dirent, @@ -61,7 +61,7 @@ xfs_dir2_data_freeinsert(struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_data_unused *dup, int *loghead); extern void xfs_dir2_data_freescan(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr, int *loghead); -extern int xfs_dir2_data_init(struct xfs_da_args *args, xfs_dir2_db_t blkno, +extern int xfs_dir3_data_init(struct xfs_da_args *args, xfs_dir2_db_t blkno, struct xfs_buf **bpp); extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_buf *bp, struct xfs_dir2_data_entry *dep); diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 1b9fc3e..b975622 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -278,7 +278,7 @@ xfs_dir2_block_to_sf( * Set up to loop over the block's entries. */ btp = xfs_dir2_block_tail_p(mp, hdr); - ptr = (char *)(hdr + 1); + ptr = (char *)xfs_dir3_data_entry_p(hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); sfep = xfs_dir2_sf_firstentry(sfp); /* -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2898129E1E for ; Wed, 3 Apr 2013 00:12:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CFE918F804C for ; Tue, 2 Apr 2013 22:12:04 -0700 (PDT) X-ASG-Debug-ID: 1364965921-04bdf0542d18eab0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 9nXHkzXI29YNQxPD for ; Tue, 02 Apr 2013 22:12:02 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkAKAJm4W1F5LBrj/2dsb2JhbAA5CoMHwGUEAYEHF3SCHwEBBScvMwgYMTkDGxmIE8FbjV0fgRKDUgOndoMfKA Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:42:01 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzM-0000M5-OT for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:12:00 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFzH-0005CA-KH for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 18/22] xfs: add CRC protection to remote attributes Date: Wed, 3 Apr 2013 16:11:28 +1100 X-ASG-Orig-Subj: [PATCH 18/22] xfs: add CRC protection to remote attributes Message-Id: <1364965892-19623-19-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965921 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There are two ways of doing this - the first is to add a CRC to the remote attribute entry in the attribute block. The second is to treat them similar to the remote symlink, where each fragment has it's own header and identifies fragment location in the attribute. The problem with the CRC in the remote attr entry is that we cannot identify the owner of the metadata from the metadata blocks themselves, or where the blocks fit into the remote attribute. The down side to this approach is that we never know when the attribute has been read from disk or not and so we have to verify it every time it is read, and we must calculate it during the create transaction and log it. We do not log CRCs for any other metadata, and so this creates a unique set of coherency problems that, in general, are best avoided. Adding an identifying header to each allocated block allows us to identify each fragment and where in the attribute it is located. It enables us to rebuild the remote attribute from just the raw blocks containing the attribute. It also provides us to do per-block CRCs verification at IO time rather than during the transaction context that creates it or every time it is read into a user buffer. Hence it avoids all the problems that an external, logged CRC has, and provides all the benefits of self identifying metadata. The only complexity is that we have to add a header per fragment, and we don't know how many fragments will be needed prior to allocations. If we take the symlink example, the header is 56 bytes and hence for a 4k block size filesystem, in the worst case 16 headers requires 1 extra block for the 64k attribute data. For 512 byte filesystems the worst case is an extra block for every 9 fragments (i.e. 16 extra blocks in the worse case). This will be very rare and so it's not really a major concern. Because allocation is done in two steps - the first finds a hole large enough in the attribute file, the second does the allocation - we only need to find a hole big enough for a worst case allocation. We only need to allocate enough extra blocks for number of headers required by the fragments, and we can calculate that as we go.... Hence it really only makes sense to use the same model as for symlinks - it doesn't add that much complexity, does not require an attribute tree format change, and does not require logging calculated CRC values. Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr_remote.c | 324 ++++++++++++++++++++++++++++++++++++++-------- fs/xfs/xfs_attr_remote.h | 19 +++ 2 files changed, 292 insertions(+), 51 deletions(-) diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index d0d67e9..53da46b 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -37,63 +38,232 @@ #include "xfs_attr_remote.h" #include "xfs_trans_space.h" #include "xfs_trace.h" - +#include "xfs_cksum.h" +#include "xfs_buf_item.h" #define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ /* + * Each contiguous block has a header, so it is not just a simple attribute + * length to FSB conversion. + */ +static int +xfs_attr3_rmt_blocks( + struct xfs_mount *mp, + int attrlen) +{ + int fsblocks = 0; + int len = attrlen; + + do { + fsblocks++; + len -= XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize); + } while (len > 0); + + return fsblocks; +} + +static bool +xfs_attr3_rmt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (rmt->rm_magic != cpu_to_be32(XFS_ATTR3_RMT_MAGIC)) + return false; + if (!uuid_equal(&rmt->rm_uuid, &mp->m_sb.sb_uuid)) + return false; + if (bp->b_bn != be64_to_cpu(rmt->rm_blkno)) + return false; + if (be32_to_cpu(rmt->rm_offset) + + be32_to_cpu(rmt->rm_bytes) >= MAXPATHLEN) + return false; + if (rmt->rm_owner == 0) + return false; + + return true; +} + +static void +xfs_attr3_rmt_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_ATTR3_RMT_CRC_OFF) || + !xfs_attr3_rmt_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_attr3_rmt_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_attr3_rmt_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (bip) { + struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; + rmt->rm_lsn = cpu_to_be64(bip->bli_item.li_lsn); + } + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_ATTR3_RMT_CRC_OFF); +} + +const struct xfs_buf_ops xfs_attr3_rmt_buf_ops = { + .verify_read = xfs_attr3_rmt_read_verify, + .verify_write = xfs_attr3_rmt_write_verify, +}; + +static int +xfs_attr3_rmt_hdr_set( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return 0; + + rmt->rm_magic = cpu_to_be32(XFS_ATTR3_RMT_MAGIC); + rmt->rm_offset = cpu_to_be32(offset); + rmt->rm_bytes = cpu_to_be32(size); + uuid_copy(&rmt->rm_uuid, &mp->m_sb.sb_uuid); + rmt->rm_owner = cpu_to_be64(ino); + rmt->rm_blkno = cpu_to_be64(bp->b_bn); + bp->b_ops = &xfs_attr3_rmt_buf_ops; + + return sizeof(struct xfs_attr3_rmt_hdr); +} + +/* + * Checking of the remote attribute header is split into two parts. the verifier + * does CRC, location and bounds checking, the unpacking function checks the + * attribute parameters and owner. + */ +static bool +xfs_attr3_rmt_hdr_ok( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; + + if (offset != be32_to_cpu(rmt->rm_offset)) + return false; + if (size != be32_to_cpu(rmt->rm_bytes)) + return false; + if (ino != be64_to_cpu(rmt->rm_owner)) + return false; + + /* ok */ + return true; + +} + +/* * Read the value associated with an attribute from the out-of-line buffer * that we stored it in. */ int -xfs_attr_rmtval_get(xfs_da_args_t *args) +xfs_attr_rmtval_get( + struct xfs_da_args *args) { - xfs_bmbt_irec_t map[ATTR_RMTVALUE_MAPSIZE]; - xfs_mount_t *mp; - xfs_daddr_t dblkno; - void *dst; - xfs_buf_t *bp; - int nmap, error, tmp, valuelen, blkcnt, i; - xfs_dablk_t lblkno; + struct xfs_bmbt_irec map[ATTR_RMTVALUE_MAPSIZE]; + struct xfs_mount *mp = args->dp->i_mount; + struct xfs_buf *bp; + xfs_daddr_t dblkno; + xfs_dablk_t lblkno = args->rmtblkno; + void *dst = args->value; + int valuelen = args->valuelen; + int nmap; + int error; + int blkcnt; + int i; + int offset = 0; trace_xfs_attr_rmtval_get(args); ASSERT(!(args->flags & ATTR_KERNOVAL)); - mp = args->dp->i_mount; - dst = args->value; - valuelen = args->valuelen; - lblkno = args->rmtblkno; while (valuelen > 0) { nmap = ATTR_RMTVALUE_MAPSIZE; error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, map, &nmap, XFS_BMAPI_ATTRFORK); if (error) - return(error); + return error; ASSERT(nmap >= 1); for (i = 0; (i < nmap) && (valuelen > 0); i++) { + int byte_cnt; + char *src; + ASSERT((map[i].br_startblock != DELAYSTARTBLOCK) && (map[i].br_startblock != HOLESTARTBLOCK)); dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock); blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount); error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, - dblkno, blkcnt, 0, &bp, NULL); + dblkno, blkcnt, 0, &bp, + &xfs_attr3_rmt_buf_ops); if (error) - return(error); + return error; + + byte_cnt = min_t(int, valuelen, BBTOB(bp->b_length)); + byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, byte_cnt); - tmp = min_t(int, valuelen, BBTOB(bp->b_length)); - xfs_buf_iomove(bp, 0, tmp, dst, XBRW_READ); + src = bp->b_addr; + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (!xfs_attr3_rmt_hdr_ok(mp, args->dp->i_ino, + offset, byte_cnt, bp)) { + xfs_alert(mp, +"remote attribute header does not match required off/len/owner (0x%x/Ox%x,0x%llx)", + offset, byte_cnt, args->dp->i_ino); + xfs_buf_relse(bp); + return EFSCORRUPTED; + + } + + src += sizeof(struct xfs_attr3_rmt_hdr); + } + + memcpy(dst, src, byte_cnt); xfs_buf_relse(bp); - dst += tmp; - valuelen -= tmp; + + offset += byte_cnt; + dst += byte_cnt; + valuelen -= byte_cnt; lblkno += map[i].br_blockcount; } } ASSERT(valuelen == 0); - return(0); + return 0; } /* @@ -101,35 +271,49 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) * that we have defined for it. */ int -xfs_attr_rmtval_set(xfs_da_args_t *args) +xfs_attr_rmtval_set( + struct xfs_da_args *args) { - xfs_mount_t *mp; - xfs_fileoff_t lfileoff; - xfs_inode_t *dp; - xfs_bmbt_irec_t map; - xfs_daddr_t dblkno; - void *src; - xfs_buf_t *bp; - xfs_dablk_t lblkno; - int blkcnt, valuelen, nmap, error, tmp, committed; + struct xfs_inode *dp = args->dp; + struct xfs_mount *mp = dp->i_mount; + struct xfs_bmbt_irec map; + struct xfs_buf *bp; + xfs_daddr_t dblkno; + xfs_dablk_t lblkno; + xfs_fileoff_t lfileoff = 0; + void *src = args->value; + int blkcnt; + int valuelen; + int nmap; + int error; + int hdrcnt = 0; + bool crcs = xfs_sb_version_hascrc(&mp->m_sb); + int offset = 0; trace_xfs_attr_rmtval_set(args); - dp = args->dp; - mp = dp->i_mount; - src = args->value; - /* * Find a "hole" in the attribute address space large enough for - * us to drop the new attribute's value into. + * us to drop the new attribute's value into. Because CRC enable + * attributes have headers, we can't just do a straight byte to FSB + * conversion. We calculate the worst case block count in this case + * and we may not need that many, so we have to handle this when + * allocating the blocks below. */ - blkcnt = XFS_B_TO_FSB(mp, args->valuelen); - lfileoff = 0; + if (!crcs) + blkcnt = XFS_B_TO_FSB(mp, args->valuelen); + else + blkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); + error = xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, XFS_ATTR_FORK); - if (error) { - return(error); - } + if (error) + return error; + + /* Start with the attribute data. We'll allocate the rest afterwards. */ + if (crcs) + blkcnt = XFS_B_TO_FSB(mp, args->valuelen); + args->rmtblkno = lblkno = (xfs_dablk_t)lfileoff; args->rmtblkcnt = blkcnt; @@ -137,6 +321,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) * Roll through the "value", allocating blocks on disk as required. */ while (blkcnt > 0) { + int committed; + /* * Allocate a single extent, up to the size of the value. */ @@ -170,6 +356,27 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) (map.br_startblock != HOLESTARTBLOCK)); lblkno += map.br_blockcount; blkcnt -= map.br_blockcount; + hdrcnt++; + + /* + * If we have enough blocks for the attribute data, calculate + * how many extra blocks we need for headers. We might run + * through this multiple times in the case that the additional + * headers in the blocks needed for the data fragments spills + * into requiring more blocks. e.g. for 512 byte blocks, we'll + * spill for another block every 9 headers we require in this + * loop. + */ + + if (crcs && blkcnt == 0) { + int total_len; + + total_len = args->valuelen + + hdrcnt * sizeof(struct xfs_attr3_rmt_hdr); + blkcnt = XFS_B_TO_FSB(mp, total_len); + blkcnt -= args->rmtblkcnt; + args->rmtblkcnt += blkcnt; + } /* * Start the next trans in the chain. @@ -188,7 +395,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) lblkno = args->rmtblkno; valuelen = args->valuelen; while (valuelen > 0) { - int buflen; + int byte_cnt; + char *buf; /* * Try to remember where we decided to put the value. @@ -210,24 +418,38 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) bp = xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, 0); if (!bp) return ENOMEM; + bp->b_ops = &xfs_attr3_rmt_buf_ops; + + byte_cnt = BBTOB(bp->b_length); + byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, byte_cnt); + if (valuelen < byte_cnt) { + byte_cnt = valuelen; + } + + buf = bp->b_addr; + buf += xfs_attr3_rmt_hdr_set(mp, dp->i_ino, offset, + byte_cnt, bp); + memcpy(buf, src, byte_cnt); - buflen = BBTOB(bp->b_length); - tmp = min_t(int, valuelen, buflen); - xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); - if (tmp < buflen) - xfs_buf_zero(bp, tmp, buflen - tmp); + if (byte_cnt < BBTOB(bp->b_length)) + xfs_buf_zero(bp, byte_cnt, + BBTOB(bp->b_length) - byte_cnt); error = xfs_bwrite(bp); /* GROT: NOTE: synchronous write */ xfs_buf_relse(bp); if (error) return error; - src += tmp; - valuelen -= tmp; + + src += byte_cnt; + valuelen -= byte_cnt; + offset += byte_cnt; + hdrcnt--; lblkno += map.br_blockcount; } ASSERT(valuelen == 0); - return(0); + ASSERT(hdrcnt == 0); + return 0; } /* @@ -306,7 +528,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) ASSERT(committed); args->trans = NULL; xfs_bmap_cancel(args->flist); - return(error); + return error; } /* diff --git a/fs/xfs/xfs_attr_remote.h b/fs/xfs/xfs_attr_remote.h index 2a34b9a..0ca8d9a 100644 --- a/fs/xfs/xfs_attr_remote.h +++ b/fs/xfs/xfs_attr_remote.h @@ -18,6 +18,25 @@ #ifndef __XFS_ATTR_REMOTE_H__ #define __XFS_ATTR_REMOTE_H__ +#define XFS_ATTR3_RMT_MAGIC 0x5841524d /* XARM */ + +struct xfs_attr3_rmt_hdr { + __be32 rm_magic; + __be32 rm_offset; + __be32 rm_bytes; + __be32 rm_crc; + uuid_t rm_uuid; + __be64 rm_owner; + __be64 rm_blkno; + __be64 rm_lsn; +}; + +#define XFS_ATTR3_RMT_CRC_OFF offsetof(struct xfs_attr3_rmt_hdr, rm_crc) + +#define XFS_ATTR3_RMT_BUF_SPACE(mp, bufsize) \ + ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ + sizeof(struct xfs_attr3_rmt_hdr) : 0)) + int xfs_attr_rmtval_get(struct xfs_da_args *args); int xfs_attr_rmtval_set(struct xfs_da_args *args); int xfs_attr_rmtval_remove(struct xfs_da_args *args); -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1FD4929E1D for ; Wed, 3 Apr 2013 00:12:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0F4038F8054 for ; Tue, 2 Apr 2013 22:12:05 -0700 (PDT) X-ASG-Debug-ID: 1364965917-04cb6c1e79196b30003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 1PuVr9yeFcqi1Z1y for ; Tue, 02 Apr 2013 22:12:02 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkAKAJm4W1F5LBrj/2dsb2JhbABDgwfAZQQBgQcXdIIfAQEFGg0vMwgYMTkDGxmIE8FbjUwwgRKDUgOndoMfKA Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:57 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFz7-0000LU-Em for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:45 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFz7-0005Bc-A0 for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:45 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 11/22] xfs: add CRC checking to dir2 free blocks Date: Wed, 3 Apr 2013 16:11:21 +1100 X-ASG-Orig-Subj: [PATCH 11/22] xfs: add CRC checking to dir2 free blocks Message-Id: <1364965892-19623-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965921 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words From: Dave Chinner This addition follows the same pattern as the dir2 block CRCs, but with a few differences. The main difference is that the free block header is different between the v2 and v3 formats, so an "in-core" free block header has been added and _todisk/_from_disk functions used to abstract the differences in structure format from the code. This is similar to the on-disk superblock versus the in-core superblock setup. The in-core strucutre is populated when the buffer is read from disk, all the in memory checks and modifications are done on the in-core version of the structure which is written back to the buffer before the buffer is logged. Signed-off-by: Dave Chinner --- fs/xfs/xfs_dir2_format.h | 55 +++++- fs/xfs/xfs_dir2_leaf.c | 15 +- fs/xfs/xfs_dir2_node.c | 474 +++++++++++++++++++++++++++++++--------------- 3 files changed, 382 insertions(+), 162 deletions(-) diff --git a/fs/xfs/xfs_dir2_format.h b/fs/xfs/xfs_dir2_format.h index 845979a..ec5044a 100644 --- a/fs/xfs/xfs_dir2_format.h +++ b/fs/xfs/xfs_dir2_format.h @@ -66,6 +66,7 @@ #define XFS_DIR3_BLOCK_MAGIC 0x58444233 /* XDB3: single block dirs */ #define XFS_DIR3_DATA_MAGIC 0x58444433 /* XDD3: multiblock dirs */ +#define XFS_DIR3_FREE_MAGIC 0x58444633 /* XDF3: free index blocks */ /* * Byte offset in data block and shortform entry. @@ -663,19 +664,65 @@ typedef struct xfs_dir2_free { /* unused entries are -1 */ } xfs_dir2_free_t; -static inline int xfs_dir2_free_max_bests(struct xfs_mount *mp) +struct xfs_dir3_free_hdr { + struct xfs_dir3_blk_hdr hdr; + __be32 firstdb; /* db of first entry */ + __be32 nvalid; /* count of valid entries */ + __be32 nused; /* count of used entries */ +}; + +struct xfs_dir3_free { + struct xfs_dir3_free_hdr hdr; + __be16 bests[]; /* best free counts */ + /* unused entries are -1 */ +}; + +#define XFS_DIR3_FREE_CRC_OFF offsetof(struct xfs_dir3_free, hdr.hdr.crc) + +/* + * In core version of the free block header, abstracted away from on-disk format + * differences. Use this in the code, and convert to/from the disk version using + * xfs_dir3_free_hdr_from_disk/xfs_dir3_free_hdr_to_disk. + */ +struct xfs_dir3_icfree_hdr { + __uint32_t magic; + __uint32_t firstdb; + __uint32_t nvalid; + __uint32_t nused; + +}; + +void xfs_dir3_free_hdr_from_disk(struct xfs_dir3_icfree_hdr *to, + struct xfs_dir2_free *from); + +static inline int +xfs_dir3_free_hdr_size(struct xfs_mount *mp) { - return (mp->m_dirblksize - sizeof(struct xfs_dir2_free_hdr)) / + if (xfs_sb_version_hascrc(&mp->m_sb)) + return sizeof(struct xfs_dir3_free_hdr); + return sizeof(struct xfs_dir2_free_hdr); +} + +static inline int +xfs_dir3_free_max_bests(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - xfs_dir3_free_hdr_size(mp)) / sizeof(xfs_dir2_data_off_t); } +static inline __be16 * +xfs_dir3_free_bests_p(struct xfs_mount *mp, struct xfs_dir2_free *free) +{ + return (__be16 *)((char *)free + xfs_dir3_free_hdr_size(mp)); +} + /* * Convert data space db to the corresponding free db. */ static inline xfs_dir2_db_t xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir2_free_max_bests(mp); + return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); } /* @@ -684,7 +731,7 @@ xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) static inline int xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) { - return db % xfs_dir2_free_max_bests(mp); + return db % xfs_dir3_free_max_bests(mp); } /* diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index ef163f0..979735b 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -1881,6 +1881,7 @@ xfs_dir2_node_to_leaf( xfs_mount_t *mp; /* filesystem mount point */ int rval; /* successful free trim? */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir3_icfree_hdr freehdr; /* * There's more than a leaf level in the btree, so there must @@ -1938,15 +1939,15 @@ xfs_dir2_node_to_leaf( if (error) return error; free = fbp->b_addr; - ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); - ASSERT(!free->hdr.firstdb); + xfs_dir3_free_hdr_from_disk(&freehdr, free); + + ASSERT(!freehdr.firstdb); /* * Now see if the leafn and free data will fit in a leaf1. * If not, release the buffer and give up. */ - if (xfs_dir2_leaf_size(&leaf->hdr, be32_to_cpu(free->hdr.nvalid)) > - mp->m_dirblksize) { + if (xfs_dir2_leaf_size(&leaf->hdr, freehdr.nvalid) > mp->m_dirblksize) { xfs_trans_brelse(tp, fbp); return 0; } @@ -1967,12 +1968,12 @@ xfs_dir2_node_to_leaf( * Set up the leaf tail from the freespace block. */ ltp = xfs_dir2_leaf_tail_p(mp, leaf); - ltp->bestcount = free->hdr.nvalid; + ltp->bestcount = cpu_to_be32(freehdr.nvalid); /* * Set up the leaf bests table. */ - memcpy(xfs_dir2_leaf_bests_p(ltp), free->bests, - be32_to_cpu(ltp->bestcount) * sizeof(xfs_dir2_data_off_t)); + memcpy(xfs_dir2_leaf_bests_p(ltp), xfs_dir3_free_bests_p(mp, free), + freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); xfs_dir2_leaf_log_tail(tp, lbp); xfs_dir2_leaf_check(dp, lbp); diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 985d70b..0fe39b9 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -32,6 +33,8 @@ #include "xfs_dir2_priv.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_buf_item.h" +#include "xfs_cksum.h" /* * Function declarations. @@ -55,44 +58,78 @@ static int xfs_dir2_leafn_remove(xfs_da_args_t *args, struct xfs_buf *bp, static int xfs_dir2_node_addname_int(xfs_da_args_t *args, xfs_da_state_blk_t *fblk); -static void -xfs_dir2_free_verify( +static bool +xfs_dir3_free_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_dir2_free_hdr *hdr = bp->b_addr; - int block_ok = 0; - block_ok = hdr->magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC); - if (!block_ok) { - XFS_CORRUPTION_ERROR("xfs_dir2_free_verify magic", - XFS_ERRLEVEL_LOW, mp, hdr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; + + if (hdr3->magic != cpu_to_be32(XFS_DIR3_FREE_MAGIC)) + return false; + if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(hdr3->blkno) != bp->b_bn) + return false; + } else { + if (hdr->magic != cpu_to_be32(XFS_DIR2_FREE_MAGIC)) + return false; } + + /* XXX: should bounds check the xfs_dir3_icfree_hdr here */ + + return true; } static void -xfs_dir2_free_read_verify( +xfs_dir3_free_read_verify( struct xfs_buf *bp) { - xfs_dir2_free_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_DIR3_FREE_CRC_OFF)) || + !xfs_dir3_free_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } static void -xfs_dir2_free_write_verify( +xfs_dir3_free_write_verify( struct xfs_buf *bp) { - xfs_dir2_free_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; + + if (!xfs_dir3_free_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_FREE_CRC_OFF); } -static const struct xfs_buf_ops xfs_dir2_free_buf_ops = { - .verify_read = xfs_dir2_free_read_verify, - .verify_write = xfs_dir2_free_write_verify, +static const struct xfs_buf_ops xfs_dir3_free_buf_ops = { + .verify_read = xfs_dir3_free_read_verify, + .verify_write = xfs_dir3_free_write_verify, }; static int -__xfs_dir2_free_read( +__xfs_dir3_free_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, @@ -100,7 +137,7 @@ __xfs_dir2_free_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, - XFS_DATA_FORK, &xfs_dir2_free_buf_ops); + XFS_DATA_FORK, &xfs_dir3_free_buf_ops); } int @@ -110,7 +147,7 @@ xfs_dir2_free_read( xfs_dablk_t fbno, struct xfs_buf **bpp) { - return __xfs_dir2_free_read(tp, dp, fbno, -1, bpp); + return __xfs_dir3_free_read(tp, dp, fbno, -1, bpp); } static int @@ -120,7 +157,94 @@ xfs_dir2_free_try_read( xfs_dablk_t fbno, struct xfs_buf **bpp) { - return __xfs_dir2_free_read(tp, dp, fbno, -2, bpp); + return __xfs_dir3_free_read(tp, dp, fbno, -2, bpp); +} + + +void +xfs_dir3_free_hdr_from_disk( + struct xfs_dir3_icfree_hdr *to, + struct xfs_dir2_free *from) +{ + if (from->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)) { + to->magic = be32_to_cpu(from->hdr.magic); + to->firstdb = be32_to_cpu(from->hdr.firstdb); + to->nvalid = be32_to_cpu(from->hdr.nvalid); + to->nused = be32_to_cpu(from->hdr.nused); + } else { + struct xfs_dir3_free_hdr *hdr3 = (struct xfs_dir3_free_hdr *)from; + + to->magic = be32_to_cpu(hdr3->hdr.magic); + to->firstdb = be32_to_cpu(hdr3->firstdb); + to->nvalid = be32_to_cpu(hdr3->nvalid); + to->nused = be32_to_cpu(hdr3->nused); + } + + ASSERT(to->magic == XFS_DIR2_FREE_MAGIC || + to->magic == XFS_DIR3_FREE_MAGIC); +} + +static void +xfs_dir3_free_hdr_to_disk( + struct xfs_dir2_free *to, + struct xfs_dir3_icfree_hdr *from) +{ + ASSERT(from->magic == XFS_DIR2_FREE_MAGIC || + from->magic == XFS_DIR3_FREE_MAGIC); + + if (from->magic == XFS_DIR2_FREE_MAGIC) { + to->hdr.magic = cpu_to_be32(from->magic); + to->hdr.firstdb = cpu_to_be32(from->firstdb); + to->hdr.nvalid = cpu_to_be32(from->nvalid); + to->hdr.nused = cpu_to_be32(from->nused); + } else { + struct xfs_dir3_free_hdr *hdr3 = (struct xfs_dir3_free_hdr *)to; + + hdr3->hdr.magic = cpu_to_be32(from->magic); + hdr3->firstdb = cpu_to_be32(from->firstdb); + hdr3->nvalid = cpu_to_be32(from->nvalid); + hdr3->nused = cpu_to_be32(from->nused); + } +} + +static int +xfs_dir3_free_get_buf( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dir2_db_t fbno, + struct xfs_buf **bpp) +{ + struct xfs_mount *mp = dp->i_mount; + struct xfs_buf *bp; + int error; + struct xfs_dir3_icfree_hdr hdr; + + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, fbno), + -1, &bp, XFS_DATA_FORK); + if (error) + return error; + + bp->b_ops = &xfs_dir3_free_buf_ops; + + /* + * Initialize the new block to be empty, and remember + * its first slot as our empty slot. + */ + hdr.magic = XFS_DIR2_FREE_MAGIC; + hdr.firstdb = 0; + hdr.nused = 0; + hdr.nvalid = 0; + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dir3_free_hdr *hdr3 = bp->b_addr; + + hdr.magic = XFS_DIR3_FREE_MAGIC; + hdr3->hdr.blkno = cpu_to_be64(bp->b_bn); + hdr3->hdr.owner = cpu_to_be64(dp->i_ino); + uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_uuid); + } + xfs_dir3_free_hdr_to_disk(bp->b_addr, &hdr); + *bpp = bp; + return 0; } /* @@ -134,13 +258,16 @@ xfs_dir2_free_log_bests( int last) /* last entry to log */ { xfs_dir2_free_t *free; /* freespace structure */ + __be16 *bests; free = bp->b_addr; - ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); + bests = xfs_dir3_free_bests_p(tp->t_mountp, free); + ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || + free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); xfs_trans_log_buf(tp, bp, - (uint)((char *)&free->bests[first] - (char *)free), - (uint)((char *)&free->bests[last] - (char *)free + - sizeof(free->bests[0]) - 1)); + (uint)((char *)&bests[first] - (char *)free), + (uint)((char *)&bests[last] - (char *)free + + sizeof(bests[0]) - 1)); } /* @@ -154,9 +281,9 @@ xfs_dir2_free_log_header( xfs_dir2_free_t *free; /* freespace structure */ free = bp->b_addr; - ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); - xfs_trans_log_buf(tp, bp, (uint)((char *)&free->hdr - (char *)free), - (uint)(sizeof(xfs_dir2_free_hdr_t) - 1)); + ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || + free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); + xfs_trans_log_buf(tp, bp, 0, xfs_dir3_free_hdr_size(tp->t_mountp) - 1); } /* @@ -183,6 +310,7 @@ xfs_dir2_leaf_to_node( xfs_dir2_data_off_t off; /* freespace entry value */ __be16 *to; /* pointer to freespace entry */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir3_icfree_hdr freehdr; trace_xfs_dir2_leaf_to_node(args); @@ -199,43 +327,43 @@ xfs_dir2_leaf_to_node( /* * Get the buffer for the new freespace block. */ - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, fdb), -1, &fbp, - XFS_DATA_FORK); + error = xfs_dir3_free_get_buf(tp, dp, fdb, &fbp); if (error) return error; - fbp->b_ops = &xfs_dir2_free_buf_ops; free = fbp->b_addr; + xfs_dir3_free_hdr_from_disk(&freehdr, free); leaf = lbp->b_addr; ltp = xfs_dir2_leaf_tail_p(mp, leaf); - /* - * Initialize the freespace block header. - */ - free->hdr.magic = cpu_to_be32(XFS_DIR2_FREE_MAGIC); - free->hdr.firstdb = 0; - ASSERT(be32_to_cpu(ltp->bestcount) <= (uint)dp->i_d.di_size / mp->m_dirblksize); - free->hdr.nvalid = ltp->bestcount; + ASSERT(be32_to_cpu(ltp->bestcount) <= + (uint)dp->i_d.di_size / mp->m_dirblksize); + /* * Copy freespace entries from the leaf block to the new block. * Count active entries. */ - for (i = n = 0, from = xfs_dir2_leaf_bests_p(ltp), to = free->bests; - i < be32_to_cpu(ltp->bestcount); i++, from++, to++) { + from = xfs_dir2_leaf_bests_p(ltp); + to = xfs_dir3_free_bests_p(mp, free); + for (i = n = 0; i < be32_to_cpu(ltp->bestcount); i++, from++, to++) { if ((off = be16_to_cpu(*from)) != NULLDATAOFF) n++; *to = cpu_to_be16(off); } - free->hdr.nused = cpu_to_be32(n); - - lbp->b_ops = &xfs_dir2_leafn_buf_ops; - leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); /* - * Log everything. + * Now initialize the freespace block header. */ - xfs_dir2_leaf_log_header(tp, lbp); + freehdr.nused = n; + freehdr.nvalid = be32_to_cpu(ltp->bestcount); + + xfs_dir3_free_hdr_to_disk(fbp->b_addr, &freehdr); + xfs_dir2_free_log_bests(tp, fbp, 0, freehdr.nvalid - 1); xfs_dir2_free_log_header(tp, fbp); - xfs_dir2_free_log_bests(tp, fbp, 0, be32_to_cpu(free->hdr.nvalid) - 1); + + /* convert the leaf to a leafnode */ + leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); + lbp->b_ops = &xfs_dir2_leafn_buf_ops; + xfs_dir2_leaf_log_header(tp, lbp); xfs_dir2_leafn_check(dp, lbp); return 0; } @@ -354,6 +482,23 @@ xfs_dir2_leafn_check( } ASSERT(be16_to_cpu(leaf->hdr.stale) == stale); } + +static void +xfs_dir2_free_hdr_check( + struct xfs_mount *mp, + struct xfs_buf *bp, + xfs_dir2_db_t db) +{ + struct xfs_dir3_icfree_hdr hdr; + + xfs_dir3_free_hdr_from_disk(&hdr, bp->b_addr); + + ASSERT((hdr.firstdb % xfs_dir3_free_max_bests(mp)) == 0); + ASSERT(hdr.firstdb <= db); + ASSERT(db < hdr.firstdb + hdr.nvalid); +} +#else +#define xfs_dir2_free_hdr_check(mp, dp, db) #endif /* DEBUG */ /* @@ -424,7 +569,8 @@ xfs_dir2_leafn_lookup_for_addname( curbp = state->extrablk.bp; curfdb = state->extrablk.blkno; free = curbp->b_addr; - ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); + ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || + free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); } length = xfs_dir2_data_entsize(args->namelen); /* @@ -451,6 +597,8 @@ xfs_dir2_leafn_lookup_for_addname( * in hand, take a look at it. */ if (newdb != curdb) { + __be16 *bests; + curdb = newdb; /* * Convert the data block to the free block @@ -473,13 +621,8 @@ xfs_dir2_leafn_lookup_for_addname( if (error) return error; free = curbp->b_addr; - ASSERT(be32_to_cpu(free->hdr.magic) == - XFS_DIR2_FREE_MAGIC); - ASSERT((be32_to_cpu(free->hdr.firstdb) % - xfs_dir2_free_max_bests(mp)) == 0); - ASSERT(be32_to_cpu(free->hdr.firstdb) <= curdb); - ASSERT(curdb < be32_to_cpu(free->hdr.firstdb) + - be32_to_cpu(free->hdr.nvalid)); + + xfs_dir2_free_hdr_check(mp, curbp, curdb); } /* * Get the index for our entry. @@ -488,8 +631,8 @@ xfs_dir2_leafn_lookup_for_addname( /* * If it has room, return it. */ - if (unlikely(free->bests[fi] == - cpu_to_be16(NULLDATAOFF))) { + bests = xfs_dir3_free_bests_p(mp, free); + if (unlikely(bests[fi] == cpu_to_be16(NULLDATAOFF))) { XFS_ERROR_REPORT("xfs_dir2_leafn_lookup_int", XFS_ERRLEVEL_LOW, mp); if (curfdb != newfdb) @@ -497,7 +640,7 @@ xfs_dir2_leafn_lookup_for_addname( return XFS_ERROR(EFSCORRUPTED); } curfdb = newfdb; - if (be16_to_cpu(free->bests[fi]) >= length) + if (be16_to_cpu(bests[fi]) >= length) goto out; } } @@ -511,6 +654,12 @@ out: state->extrablk.bp = curbp; state->extrablk.index = fi; state->extrablk.blkno = curfdb; + + /* + * Important: this magic number is not in the buffer - it's for + * buffer type information and therefore only the free/data type + * matters here, not whether CRCs are enabled or not. + */ state->extrablk.magic = XFS_DIR2_FREE_MAGIC; } else { state->extravalid = 0; @@ -898,7 +1047,7 @@ xfs_dir2_leafn_rebalance( } static int -xfs_dir2_data_block_free( +xfs_dir3_data_block_free( xfs_da_args_t *args, struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_free *free, @@ -909,57 +1058,66 @@ xfs_dir2_data_block_free( { struct xfs_trans *tp = args->trans; int logfree = 0; + __be16 *bests; + struct xfs_dir3_icfree_hdr freehdr; - if (!hdr) { - /* One less used entry in the free table. */ - be32_add_cpu(&free->hdr.nused, -1); - xfs_dir2_free_log_header(tp, fbp); + xfs_dir3_free_hdr_from_disk(&freehdr, free); + bests = xfs_dir3_free_bests_p(tp->t_mountp, free); + if (hdr) { /* - * If this was the last entry in the table, we can trim the - * table size back. There might be other entries at the end - * referring to non-existent data blocks, get those too. + * Data block is not empty, just set the free entry to the new + * value. */ - if (findex == be32_to_cpu(free->hdr.nvalid) - 1) { - int i; /* free entry index */ + bests[findex] = cpu_to_be16(longest); + xfs_dir2_free_log_bests(tp, fbp, findex, findex); + return 0; + } - for (i = findex - 1; i >= 0; i--) { - if (free->bests[i] != cpu_to_be16(NULLDATAOFF)) - break; - } - free->hdr.nvalid = cpu_to_be32(i + 1); - logfree = 0; - } else { - /* Not the last entry, just punch it out. */ - free->bests[findex] = cpu_to_be16(NULLDATAOFF); - logfree = 1; - } - /* - * If there are no useful entries left in the block, - * get rid of the block if we can. - */ - if (!free->hdr.nused) { - int error; + /* One less used entry in the free table. */ + freehdr.nused--; - error = xfs_dir2_shrink_inode(args, fdb, fbp); - if (error == 0) { - fbp = NULL; - logfree = 0; - } else if (error != ENOSPC || args->total != 0) - return error; - /* - * It's possible to get ENOSPC if there is no - * space reservation. In this case some one - * else will eventually get rid of this block. - */ + /* + * If this was the last entry in the table, we can trim the table size + * back. There might be other entries at the end referring to + * non-existent data blocks, get those too. + */ + if (findex == freehdr.nvalid - 1) { + int i; /* free entry index */ + + for (i = findex - 1; i >= 0; i--) { + if (bests[i] != cpu_to_be16(NULLDATAOFF)) + break; } + freehdr.nvalid = i + 1; + logfree = 0; } else { + /* Not the last entry, just punch it out. */ + bests[findex] = cpu_to_be16(NULLDATAOFF); + logfree = 1; + } + + xfs_dir3_free_hdr_to_disk(free, &freehdr); + xfs_dir2_free_log_header(tp, fbp); + + /* + * If there are no useful entries left in the block, get rid of the + * block if we can. + */ + if (!freehdr.nused) { + int error; + + error = xfs_dir2_shrink_inode(args, fdb, fbp); + if (error == 0) { + fbp = NULL; + logfree = 0; + } else if (error != ENOSPC || args->total != 0) + return error; /* - * Data block is not empty, just set the free entry to the new - * value. + * It's possible to get ENOSPC if there is no + * space reservation. In this case some one + * else will eventually get rid of this block. */ - free->bests[findex] = cpu_to_be16(longest); - logfree = 1; } /* Log the free entry that changed, unless we got rid of it. */ @@ -1062,10 +1220,14 @@ xfs_dir2_leafn_remove( if (error) return error; free = fbp->b_addr; - ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); - ASSERT(be32_to_cpu(free->hdr.firstdb) == - xfs_dir2_free_max_bests(mp) * - (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); +#ifdef DEBUG + { + struct xfs_dir3_icfree_hdr freehdr; + xfs_dir3_free_hdr_from_disk(&freehdr, free); + ASSERT(freehdr.firstdb == xfs_dir3_free_max_bests(mp) * + (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); + } +#endif /* * Calculate which entry we need to fix. */ @@ -1096,7 +1258,7 @@ xfs_dir2_leafn_remove( * If we got rid of the data block, we can eliminate that entry * in the free block. */ - error = xfs_dir2_data_block_free(args, hdr, free, + error = xfs_dir3_data_block_free(args, hdr, free, fdb, findex, fbp, longest); if (error) return error; @@ -1447,6 +1609,8 @@ xfs_dir2_node_addname_int( int needscan; /* need to rescan data frees */ __be16 *tagp; /* data entry tag pointer */ xfs_trans_t *tp; /* transaction pointer */ + __be16 *bests; + struct xfs_dir3_icfree_hdr freehdr; dp = args->dp; mp = dp->i_mount; @@ -1464,36 +1628,37 @@ xfs_dir2_node_addname_int( */ ifbno = fblk->blkno; free = fbp->b_addr; - ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); findex = fblk->index; + bests = xfs_dir3_free_bests_p(mp, free); + xfs_dir3_free_hdr_from_disk(&freehdr, free); + /* * This means the free entry showed that the data block had * space for our entry, so we remembered it. * Use that data block. */ if (findex >= 0) { - ASSERT(findex < be32_to_cpu(free->hdr.nvalid)); - ASSERT(be16_to_cpu(free->bests[findex]) != NULLDATAOFF); - ASSERT(be16_to_cpu(free->bests[findex]) >= length); - dbno = be32_to_cpu(free->hdr.firstdb) + findex; - } - /* - * The data block looked at didn't have enough room. - * We'll start at the beginning of the freespace entries. - */ - else { + ASSERT(findex < freehdr.nvalid); + ASSERT(be16_to_cpu(bests[findex]) != NULLDATAOFF); + ASSERT(be16_to_cpu(bests[findex]) >= length); + dbno = freehdr.firstdb + findex; + } else { + /* + * The data block looked at didn't have enough room. + * We'll start at the beginning of the freespace entries. + */ dbno = -1; findex = 0; } - } - /* - * Didn't come in with a freespace block, so don't have a data block. - */ - else { + } else { + /* + * Didn't come in with a freespace block, so no data block. + */ ifbno = dbno = -1; fbp = NULL; findex = 0; } + /* * If we don't have a data block yet, we're going to scan the * freespace blocks looking for one. Figure out what the @@ -1547,20 +1712,26 @@ xfs_dir2_node_addname_int( if (!fbp) continue; free = fbp->b_addr; - ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); findex = 0; } /* * Look at the current free entry. Is it good enough? + * + * The bests initialisation should be where the bufer is read in + * the above branch. But gcc is too stupid to realise that bests + * and the freehdr are actually initialised if they are placed + * there, so we have to do it here to avoid warnings. Blech. */ - if (be16_to_cpu(free->bests[findex]) != NULLDATAOFF && - be16_to_cpu(free->bests[findex]) >= length) - dbno = be32_to_cpu(free->hdr.firstdb) + findex; + bests = xfs_dir3_free_bests_p(mp, free); + xfs_dir3_free_hdr_from_disk(&freehdr, free); + if (be16_to_cpu(bests[findex]) != NULLDATAOFF && + be16_to_cpu(bests[findex]) >= length) + dbno = freehdr.firstdb + findex; else { /* * Are we done with the freeblock? */ - if (++findex == be32_to_cpu(free->hdr.nvalid)) { + if (++findex == freehdr.nvalid) { /* * Drop the block. */ @@ -1614,11 +1785,11 @@ xfs_dir2_node_addname_int( * If there wasn't a freespace block, the read will * return a NULL fbp. Allocate and initialize a new one. */ - if( fbp == NULL ) { - if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, - &fbno))) { + if (!fbp) { + error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, + &fbno); + if (error) return error; - } if (unlikely(xfs_dir2_db_to_fdb(mp, dbno) != fbno)) { xfs_alert(mp, @@ -1646,27 +1817,24 @@ xfs_dir2_node_addname_int( /* * Get a buffer for the new block. */ - error = xfs_da_get_buf(tp, dp, - xfs_dir2_db_to_da(mp, fbno), - -1, &fbp, XFS_DATA_FORK); + error = xfs_dir3_free_get_buf(tp, dp, fbno, &fbp); if (error) return error; - fbp->b_ops = &xfs_dir2_free_buf_ops; + free = fbp->b_addr; + bests = xfs_dir3_free_bests_p(mp, free); + xfs_dir3_free_hdr_from_disk(&freehdr, free); /* - * Initialize the new block to be empty, and remember - * its first slot as our empty slot. + * Remember the first slot as our empty slot. */ - free = fbp->b_addr; - free->hdr.magic = cpu_to_be32(XFS_DIR2_FREE_MAGIC); - free->hdr.firstdb = cpu_to_be32( - (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * - xfs_dir2_free_max_bests(mp)); + freehdr.firstdb = (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * + xfs_dir3_free_max_bests(mp); free->hdr.nvalid = 0; free->hdr.nused = 0; } else { free = fbp->b_addr; - ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); + bests = xfs_dir3_free_bests_p(mp, free); + xfs_dir3_free_hdr_from_disk(&freehdr, free); } /* @@ -1677,20 +1845,21 @@ xfs_dir2_node_addname_int( * If it's after the end of the current entries in the * freespace block, extend that table. */ - if (findex >= be32_to_cpu(free->hdr.nvalid)) { - ASSERT(findex < xfs_dir2_free_max_bests(mp)); - free->hdr.nvalid = cpu_to_be32(findex + 1); + if (findex >= freehdr.nvalid) { + ASSERT(findex < xfs_dir3_free_max_bests(mp)); + freehdr.nvalid = findex + 1; /* * Tag new entry so nused will go up. */ - free->bests[findex] = cpu_to_be16(NULLDATAOFF); + bests[findex] = cpu_to_be16(NULLDATAOFF); } /* * If this entry was for an empty data block * (this should always be true) then update the header. */ - if (free->bests[findex] == cpu_to_be16(NULLDATAOFF)) { - be32_add_cpu(&free->hdr.nused, 1); + if (bests[findex] == cpu_to_be16(NULLDATAOFF)) { + freehdr.nused++; + xfs_dir3_free_hdr_to_disk(fbp->b_addr, &freehdr); xfs_dir2_free_log_header(tp, fbp); } /* @@ -1699,7 +1868,7 @@ xfs_dir2_node_addname_int( * change again. */ hdr = dbp->b_addr; - free->bests[findex] = hdr->bestfree[0].length; + bests[findex] = hdr->bestfree[0].length; logfree = 1; } /* @@ -1758,8 +1927,9 @@ xfs_dir2_node_addname_int( /* * If the freespace entry is now wrong, update it. */ - if (be16_to_cpu(free->bests[findex]) != be16_to_cpu(hdr->bestfree[0].length)) { - free->bests[findex] = hdr->bestfree[0].length; + bests = xfs_dir3_free_bests_p(mp, free); /* gcc is so stupid */ + if (be16_to_cpu(bests[findex]) != be16_to_cpu(hdr->bestfree[0].length)) { + bests[findex] = hdr->bestfree[0].length; logfree = 1; } /* @@ -1995,6 +2165,7 @@ xfs_dir2_node_trim_free( xfs_dir2_free_t *free; /* freespace structure */ xfs_mount_t *mp; /* filesystem mount point */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir3_icfree_hdr freehdr; dp = args->dp; mp = dp->i_mount; @@ -2012,11 +2183,12 @@ xfs_dir2_node_trim_free( if (!bp) return 0; free = bp->b_addr; - ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); + xfs_dir3_free_hdr_from_disk(&freehdr, free); + /* * If there are used entries, there's nothing to do. */ - if (be32_to_cpu(free->hdr.nused) > 0) { + if (freehdr.nused > 0) { xfs_trans_brelse(tp, bp); *rvalp = 0; return 0; -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6FB3E29E2A for ; Wed, 3 Apr 2013 00:12:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BAC37AC002 for ; Tue, 2 Apr 2013 22:12:13 -0700 (PDT) X-ASG-Debug-ID: 1364965917-04cb6c1e79196b30004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Hhcdg1Gm0KKDKuXQ for ; Tue, 02 Apr 2013 22:12:04 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkIKAJm4W1F5LBrj/2dsb2JhbAA5CoMHNsAvBAGBBxd0gh8BAQUaAQIKLzMIGBgZOQMbGYgTwVuNXRAPgRIcgzYDjAGHJIRlhViKFIMfKIEuAR8E Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:41:57 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzH-0000Lr-Lr for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:55 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFzH-0005C3-HA for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 16/22] xfs: add CRCs to attr leaf blocks Date: Wed, 3 Apr 2013 16:11:26 +1100 X-ASG-Orig-Subj: [PATCH 16/22] xfs: add CRCs to attr leaf blocks Message-Id: <1364965892-19623-17-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965923 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr.c | 125 ++-- fs/xfs/xfs_attr_leaf.c | 1739 +++++++++++++++++++++++++++--------------------- fs/xfs/xfs_attr_leaf.h | 122 +++- fs/xfs/xfs_da_btree.c | 34 +- fs/xfs/xfs_da_btree.h | 5 +- 5 files changed, 1177 insertions(+), 848 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index e03128c..de4093f 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -819,7 +819,7 @@ xfs_attr_inactive(xfs_inode_t *dp) error = 0; goto out; } - error = xfs_attr_root_inactive(&trans, dp); + error = xfs_attr3_root_inactive(&trans, dp); if (error) goto out; @@ -905,7 +905,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) */ dp = args->dp; args->blkno = 0; - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return error; @@ -913,14 +913,14 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Look up the given attribute in the leaf block. Figure out if * the given flags produce an error or call for an atomic rename. */ - retval = xfs_attr_leaf_lookup_int(bp, args); + retval = xfs_attr3_leaf_lookup_int(bp, args); if ((args->flags & ATTR_REPLACE) && (retval == ENOATTR)) { xfs_trans_brelse(args->trans, bp); - return(retval); + return retval; } else if (retval == EEXIST) { if (args->flags & ATTR_CREATE) { /* pure create op */ xfs_trans_brelse(args->trans, bp); - return(retval); + return retval; } trace_xfs_attr_leaf_replace(args); @@ -936,7 +936,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Add the attribute to the leaf block, transitioning to a Btree * if required. */ - retval = xfs_attr_leaf_add(bp, args); + retval = xfs_attr3_leaf_add(bp, args); if (retval == ENOSPC) { /* * Promote the attribute list to the Btree format, then @@ -944,7 +944,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * can manage its own transactions. */ xfs_bmap_init(args->flist, args->firstblock); - error = xfs_attr_leaf_to_node(args); + error = xfs_attr3_leaf_to_node(args); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, &committed); @@ -1009,7 +1009,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * In a separate transaction, set the incomplete flag on the * "old" attr and clear the incomplete flag on the "new" attr. */ - error = xfs_attr_leaf_flipflags(args); + error = xfs_attr3_leaf_flipflags(args); if (error) return(error); @@ -1031,19 +1031,19 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Read in the block containing the "old" attr, then * remove the "old" attr from that block (neat, huh!) */ - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return error; - xfs_attr_leaf_remove(bp, args); + xfs_attr3_leaf_remove(bp, args); /* * If the result is small enough, shrink it all into the inode. */ if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { xfs_bmap_init(args->flist, args->firstblock); - error = xfs_attr_leaf_to_shortform(bp, args, forkoff); + error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { error = xfs_bmap_finish(&args->trans, @@ -1075,9 +1075,9 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) /* * Added a "remote" value, just clear the incomplete flag. */ - error = xfs_attr_leaf_clearflag(args); + error = xfs_attr3_leaf_clearflag(args); } - return(error); + return error; } /* @@ -1100,24 +1100,24 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) */ dp = args->dp; args->blkno = 0; - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return error; - error = xfs_attr_leaf_lookup_int(bp, args); + error = xfs_attr3_leaf_lookup_int(bp, args); if (error == ENOATTR) { xfs_trans_brelse(args->trans, bp); - return(error); + return error; } - xfs_attr_leaf_remove(bp, args); + xfs_attr3_leaf_remove(bp, args); /* * If the result is small enough, shrink it all into the inode. */ if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { xfs_bmap_init(args->flist, args->firstblock); - error = xfs_attr_leaf_to_shortform(bp, args, forkoff); + error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1127,7 +1127,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) ASSERT(committed); args->trans = NULL; xfs_bmap_cancel(args->flist); - return(error); + return error; } /* @@ -1137,7 +1137,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) if (committed) xfs_trans_ijoin(args->trans, dp, 0); } - return(0); + return 0; } /* @@ -1155,21 +1155,21 @@ xfs_attr_leaf_get(xfs_da_args_t *args) trace_xfs_attr_leaf_get(args); args->blkno = 0; - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return error; - error = xfs_attr_leaf_lookup_int(bp, args); + error = xfs_attr3_leaf_lookup_int(bp, args); if (error != EEXIST) { xfs_trans_brelse(args->trans, bp); - return(error); + return error; } - error = xfs_attr_leaf_getvalue(bp, args); + error = xfs_attr3_leaf_getvalue(bp, args); xfs_trans_brelse(args->trans, bp); if (!error && (args->rmtblkno > 0) && !(args->flags & ATTR_KERNOVAL)) { error = xfs_attr_rmtval_get(args); } - return(error); + return error; } /* @@ -1184,11 +1184,11 @@ xfs_attr_leaf_list(xfs_attr_list_context_t *context) trace_xfs_attr_leaf_list(context); context->cursor->blkno = 0; - error = xfs_attr_leaf_read(NULL, context->dp, 0, -1, &bp); + error = xfs_attr3_leaf_read(NULL, context->dp, 0, -1, &bp); if (error) return XFS_ERROR(error); - error = xfs_attr_leaf_list_int(bp, context); + error = xfs_attr3_leaf_list_int(bp, context); xfs_trans_brelse(NULL, bp); return XFS_ERROR(error); } @@ -1257,7 +1257,7 @@ restart: args->rmtblkcnt = 0; } - retval = xfs_attr_leaf_add(blk->bp, state->args); + retval = xfs_attr3_leaf_add(blk->bp, state->args); if (retval == ENOSPC) { if (state->path.active == 1) { /* @@ -1267,7 +1267,7 @@ restart: */ xfs_da_state_free(state); xfs_bmap_init(args->flist, args->firstblock); - error = xfs_attr_leaf_to_node(args); + error = xfs_attr3_leaf_to_node(args); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1369,7 +1369,7 @@ restart: * In a separate transaction, set the incomplete flag on the * "old" attr and clear the incomplete flag on the "new" attr. */ - error = xfs_attr_leaf_flipflags(args); + error = xfs_attr3_leaf_flipflags(args); if (error) goto out; @@ -1408,7 +1408,7 @@ restart: */ blk = &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); - error = xfs_attr_leaf_remove(blk->bp, args); + error = xfs_attr3_leaf_remove(blk->bp, args); xfs_da3_fixhashpath(state, &state->path); /* @@ -1449,7 +1449,7 @@ restart: /* * Added a "remote" value, just clear the incomplete flag. */ - error = xfs_attr_leaf_clearflag(args); + error = xfs_attr3_leaf_clearflag(args); if (error) goto out; } @@ -1523,7 +1523,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) * Mark the attribute as INCOMPLETE, then bunmapi() the * remote value. */ - error = xfs_attr_leaf_setflag(args); + error = xfs_attr3_leaf_setflag(args); if (error) goto out; error = xfs_attr_rmtval_remove(args); @@ -1544,7 +1544,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) */ blk = &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); - retval = xfs_attr_leaf_remove(blk->bp, args); + retval = xfs_attr3_leaf_remove(blk->bp, args); xfs_da3_fixhashpath(state, &state->path); /* @@ -1590,13 +1590,13 @@ xfs_attr_node_removename(xfs_da_args_t *args) ASSERT(state->path.blk[0].bp); state->path.blk[0].bp = NULL; - error = xfs_attr_leaf_read(args->trans, args->dp, 0, -1, &bp); + error = xfs_attr3_leaf_read(args->trans, args->dp, 0, -1, &bp); if (error) goto out; if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { xfs_bmap_init(args->flist, args->firstblock); - error = xfs_attr_leaf_to_shortform(bp, args, forkoff); + error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { error = xfs_bmap_finish(&args->trans, @@ -1768,7 +1768,7 @@ xfs_attr_node_get(xfs_da_args_t *args) /* * Get the value, local or "remote" */ - retval = xfs_attr_leaf_getvalue(blk->bp, args); + retval = xfs_attr3_leaf_getvalue(blk->bp, args); if (!retval && (args->rmtblkno > 0) && !(args->flags & ATTR_KERNOVAL)) { retval = xfs_attr_rmtval_get(args); @@ -1793,7 +1793,9 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) attrlist_cursor_kern_t *cursor; xfs_attr_leafblock_t *leaf; xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; + struct xfs_attr3_icleaf_hdr leafhdr; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_node_entry *btree; int error, i; struct xfs_buf *bp; @@ -1814,22 +1816,28 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) if ((error != 0) && (error != EFSCORRUPTED)) return(error); if (bp) { + struct xfs_attr_leaf_entry *entries; + node = bp->b_addr; switch (be16_to_cpu(node->hdr.info.magic)) { case XFS_DA_NODE_MAGIC: + case XFS_DA3_NODE_MAGIC: trace_xfs_attr_list_wrong_blk(context); xfs_trans_brelse(NULL, bp); bp = NULL; break; case XFS_ATTR_LEAF_MAGIC: + case XFS_ATTR3_LEAF_MAGIC: leaf = bp->b_addr; - if (cursor->hashval > be32_to_cpu(leaf->entries[ - be16_to_cpu(leaf->hdr.count)-1].hashval)) { + xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); + entries = xfs_attr3_leaf_entryp(leaf); + if (cursor->hashval > be32_to_cpu( + entries[leafhdr.count - 1].hashval)) { trace_xfs_attr_list_wrong_blk(context); xfs_trans_brelse(NULL, bp); bp = NULL; - } else if (cursor->hashval <= - be32_to_cpu(leaf->entries[0].hashval)) { + } else if (cursor->hashval <= be32_to_cpu( + entries[0].hashval)) { trace_xfs_attr_list_wrong_blk(context); xfs_trans_brelse(NULL, bp); bp = NULL; @@ -1851,27 +1859,31 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) if (bp == NULL) { cursor->blkno = 0; for (;;) { + __uint16_t magic; + error = xfs_da3_node_read(NULL, context->dp, cursor->blkno, -1, &bp, XFS_ATTR_FORK); if (error) return(error); node = bp->b_addr; - if (node->hdr.info.magic == - cpu_to_be16(XFS_ATTR_LEAF_MAGIC)) + magic = be16_to_cpu(node->hdr.info.magic); + if (magic == XFS_ATTR_LEAF_MAGIC || + magic == XFS_ATTR3_LEAF_MAGIC) break; - if (unlikely(node->hdr.info.magic != - cpu_to_be16(XFS_DA_NODE_MAGIC))) { + if (magic != XFS_DA_NODE_MAGIC && + magic != XFS_DA3_NODE_MAGIC) { XFS_CORRUPTION_ERROR("xfs_attr_node_list(3)", XFS_ERRLEVEL_LOW, context->dp->i_mount, node); xfs_trans_brelse(NULL, bp); - return(XFS_ERROR(EFSCORRUPTED)); + return XFS_ERROR(EFSCORRUPTED); } + + xfs_da3_node_hdr_from_disk(&nodehdr, node); btree = xfs_da3_node_tree_p(node); - for (i = 0; i < be16_to_cpu(node->hdr.count); - btree++, i++) { + for (i = 0; i < nodehdr.count; btree++, i++) { if (cursor->hashval <= be32_to_cpu(btree->hashval)) { cursor->blkno = be32_to_cpu(btree->before); @@ -1880,9 +1892,9 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) break; } } - if (i == be16_to_cpu(node->hdr.count)) { + if (i == nodehdr.count) { xfs_trans_brelse(NULL, bp); - return(0); + return 0; } xfs_trans_brelse(NULL, bp); } @@ -1896,22 +1908,23 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) */ for (;;) { leaf = bp->b_addr; - error = xfs_attr_leaf_list_int(bp, context); + error = xfs_attr3_leaf_list_int(bp, context); if (error) { xfs_trans_brelse(NULL, bp); return error; } - if (context->seen_enough || leaf->hdr.info.forw == 0) + xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); + if (context->seen_enough || leafhdr.forw == 0) break; - cursor->blkno = be32_to_cpu(leaf->hdr.info.forw); + cursor->blkno = leafhdr.forw; xfs_trans_brelse(NULL, bp); - error = xfs_attr_leaf_read(NULL, context->dp, cursor->blkno, -1, + error = xfs_attr3_leaf_read(NULL, context->dp, cursor->blkno, -1, &bp); if (error) return error; } xfs_trans_brelse(NULL, bp); - return(0); + return 0; } diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 54b0dc8..9c18451 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -39,6 +40,9 @@ #include "xfs_attr_leaf.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_buf_item.h" +#include "xfs_cksum.h" + /* * xfs_attr_leaf.c @@ -53,77 +57,213 @@ /* * Routines used for growing the Btree. */ -STATIC int xfs_attr_leaf_create(xfs_da_args_t *args, xfs_dablk_t which_block, - struct xfs_buf **bpp); -STATIC int xfs_attr_leaf_add_work(struct xfs_buf *leaf_buffer, - xfs_da_args_t *args, int freemap_index); -STATIC void xfs_attr_leaf_compact(struct xfs_da_args *args, - struct xfs_buf *leaf_buffer); -STATIC void xfs_attr_leaf_rebalance(xfs_da_state_t *state, +STATIC int xfs_attr3_leaf_create(struct xfs_da_args *args, + xfs_dablk_t which_block, struct xfs_buf **bpp); +STATIC int xfs_attr3_leaf_add_work(struct xfs_buf *leaf_buffer, + struct xfs_attr3_icleaf_hdr *ichdr, + struct xfs_da_args *args, int freemap_index); +STATIC void xfs_attr3_leaf_compact(struct xfs_da_args *args, + struct xfs_attr3_icleaf_hdr *ichdr, + struct xfs_buf *leaf_buffer); +STATIC void xfs_attr3_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_da_state_blk_t *blk2); -STATIC int xfs_attr_leaf_figure_balance(xfs_da_state_t *state, - xfs_da_state_blk_t *leaf_blk_1, - xfs_da_state_blk_t *leaf_blk_2, - int *number_entries_in_blk1, - int *number_usedbytes_in_blk1); +STATIC int xfs_attr3_leaf_figure_balance(xfs_da_state_t *state, + xfs_da_state_blk_t *leaf_blk_1, + struct xfs_attr3_icleaf_hdr *ichdr1, + xfs_da_state_blk_t *leaf_blk_2, + struct xfs_attr3_icleaf_hdr *ichdr2, + int *number_entries_in_blk1, + int *number_usedbytes_in_blk1); /* * Routines used for shrinking the Btree. */ -STATIC int xfs_attr_node_inactive(xfs_trans_t **trans, xfs_inode_t *dp, +STATIC int xfs_attr3_node_inactive(xfs_trans_t **trans, xfs_inode_t *dp, struct xfs_buf *bp, int level); -STATIC int xfs_attr_leaf_inactive(xfs_trans_t **trans, xfs_inode_t *dp, +STATIC int xfs_attr3_leaf_inactive(xfs_trans_t **trans, xfs_inode_t *dp, struct xfs_buf *bp); -STATIC int xfs_attr_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp, +STATIC int xfs_attr3_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp, xfs_dablk_t blkno, int blkcnt); /* * Utility routines. */ -STATIC void xfs_attr_leaf_moveents(xfs_attr_leafblock_t *src_leaf, - int src_start, - xfs_attr_leafblock_t *dst_leaf, - int dst_start, int move_count, - xfs_mount_t *mp); +STATIC void xfs_attr3_leaf_moveents(struct xfs_attr_leafblock *src_leaf, + struct xfs_attr3_icleaf_hdr *src_ichdr, int src_start, + struct xfs_attr_leafblock *dst_leaf, + struct xfs_attr3_icleaf_hdr *dst_ichdr, int dst_start, + int move_count, struct xfs_mount *mp); STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); -static void -xfs_attr_leaf_verify( +void +xfs_attr3_leaf_hdr_from_disk( + struct xfs_attr3_icleaf_hdr *to, + struct xfs_attr_leafblock *from) +{ + int i; + + ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) || + from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)); + + if (from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) { + struct xfs_attr3_leaf_hdr *hdr3 = (struct xfs_attr3_leaf_hdr *)from; + + to->forw = be32_to_cpu(hdr3->info.hdr.forw); + to->back = be32_to_cpu(hdr3->info.hdr.back); + to->magic = be16_to_cpu(hdr3->info.hdr.magic); + to->count = be16_to_cpu(hdr3->count); + to->usedbytes = be16_to_cpu(hdr3->usedbytes); + to->firstused = be16_to_cpu(hdr3->firstused); + to->holes = hdr3->holes; + + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + to->freemap[i].base = be16_to_cpu(hdr3->freemap[i].base); + to->freemap[i].size = be16_to_cpu(hdr3->freemap[i].size); + } + return; + } + to->forw = be32_to_cpu(from->hdr.info.forw); + to->back = be32_to_cpu(from->hdr.info.back); + to->magic = be16_to_cpu(from->hdr.info.magic); + to->count = be16_to_cpu(from->hdr.count); + to->usedbytes = be16_to_cpu(from->hdr.usedbytes); + to->firstused = be16_to_cpu(from->hdr.firstused); + to->holes = from->hdr.holes; + + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + to->freemap[i].base = be16_to_cpu(from->hdr.freemap[i].base); + to->freemap[i].size = be16_to_cpu(from->hdr.freemap[i].size); + } +} + +void +xfs_attr3_leaf_hdr_to_disk( + struct xfs_attr_leafblock *to, + struct xfs_attr3_icleaf_hdr *from) +{ + int i; + + ASSERT(from->magic == XFS_ATTR_LEAF_MAGIC || + from->magic == XFS_ATTR3_LEAF_MAGIC); + + if (from->magic == XFS_ATTR3_LEAF_MAGIC) { + struct xfs_attr3_leaf_hdr *hdr3 = (struct xfs_attr3_leaf_hdr *)to; + + hdr3->info.hdr.forw = cpu_to_be32(from->forw); + hdr3->info.hdr.back = cpu_to_be32(from->back); + hdr3->info.hdr.magic = cpu_to_be16(from->magic); + hdr3->count = cpu_to_be16(from->count); + hdr3->usedbytes = cpu_to_be16(from->usedbytes); + hdr3->firstused = cpu_to_be16(from->firstused); + hdr3->holes = from->holes; + hdr3->pad1 = 0; + + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + hdr3->freemap[i].base = cpu_to_be16(from->freemap[i].base); + hdr3->freemap[i].size = cpu_to_be16(from->freemap[i].size); + } + return; + } + to->hdr.info.forw = cpu_to_be32(from->forw); + to->hdr.info.back = cpu_to_be32(from->back); + to->hdr.info.magic = cpu_to_be16(from->magic); + to->hdr.count = cpu_to_be16(from->count); + to->hdr.usedbytes = cpu_to_be16(from->usedbytes); + to->hdr.firstused = cpu_to_be16(from->firstused); + to->hdr.holes = from->holes; + to->hdr.pad1 = 0; + + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + to->hdr.freemap[i].base = cpu_to_be16(from->freemap[i].base); + to->hdr.freemap[i].size = cpu_to_be16(from->freemap[i].size); + } +} + +static bool +xfs_attr3_leaf_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_attr_leaf_hdr *hdr = bp->b_addr; - int block_ok = 0; + struct xfs_attr_leafblock *leaf = bp->b_addr; + struct xfs_attr3_icleaf_hdr ichdr; - block_ok = hdr->info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC); - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_node_hdr *hdr3 = bp->b_addr; + + if (ichdr.magic != XFS_ATTR3_LEAF_MAGIC) + return false; + + if (!uuid_equal(&hdr3->info.uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn) + return false; + } else { + if (ichdr.magic != XFS_ATTR_LEAF_MAGIC) + return false; } + if (ichdr.count == 0) + return false; + + /* XXX: need to range check rest of attr header values */ + /* XXX: hash order check? */ + + return true; } static void -xfs_attr_leaf_read_verify( +xfs_attr3_leaf_write_verify( struct xfs_buf *bp) { - xfs_attr_leaf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + struct xfs_attr3_leaf_hdr *hdr3 = bp->b_addr; + + if (!xfs_attr3_leaf_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_ATTR3_LEAF_CRC_OFF); } +/* + * leaf/node format detection on trees is sketchy, so a node read can be done on + * leaf level blocks when detection identifies the tree as a node format tree + * incorrectly. In this case, we need to swap the verifier to match the correct + * format of the block being read. + */ static void -xfs_attr_leaf_write_verify( - struct xfs_buf *bp) +xfs_attr3_leaf_read_verify( + struct xfs_buf *bp) { - xfs_attr_leaf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_ATTR3_LEAF_CRC_OFF)) || + !xfs_attr3_leaf_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } -const struct xfs_buf_ops xfs_attr_leaf_buf_ops = { - .verify_read = xfs_attr_leaf_read_verify, - .verify_write = xfs_attr_leaf_write_verify, +const struct xfs_buf_ops xfs_attr3_leaf_buf_ops = { + .verify_read = xfs_attr3_leaf_read_verify, + .verify_write = xfs_attr3_leaf_write_verify, }; int -xfs_attr_leaf_read( +xfs_attr3_leaf_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, @@ -131,7 +271,7 @@ xfs_attr_leaf_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, - XFS_ATTR_FORK, &xfs_attr_leaf_buf_ops); + XFS_ATTR_FORK, &xfs_attr3_leaf_buf_ops); } /*======================================================================== @@ -559,7 +699,7 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) } ASSERT(blkno == 0); - error = xfs_attr_leaf_create(args, blkno, &bp); + error = xfs_attr3_leaf_create(args, blkno, &bp); if (error) { error = xfs_da_shrink_inode(args, 0, bp); bp = NULL; @@ -588,9 +728,9 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) nargs.hashval = xfs_da_hashname(sfe->nameval, sfe->namelen); nargs.flags = XFS_ATTR_NSP_ONDISK_TO_ARGS(sfe->flags); - error = xfs_attr_leaf_lookup_int(bp, &nargs); /* set a->index */ + error = xfs_attr3_leaf_lookup_int(bp, &nargs); /* set a->index */ ASSERT(error == ENOATTR); - error = xfs_attr_leaf_add(bp, &nargs); + error = xfs_attr3_leaf_add(bp, &nargs); ASSERT(error != ENOSPC); if (error) goto out; @@ -803,7 +943,7 @@ xfs_attr_shortform_allfit( continue; /* don't copy partial entries */ if (!(entry->flags & XFS_ATTR_LOCAL)) return(0); - name_loc = xfs_attr_leaf_name_local(leaf, i); + name_loc = xfs_attr3_leaf_name_local(leaf, i); if (name_loc->namelen >= XFS_ATTR_SF_ENTSIZE_MAX) return(0); if (be16_to_cpu(name_loc->valuelen) >= XFS_ATTR_SF_ENTSIZE_MAX) @@ -823,29 +963,34 @@ xfs_attr_shortform_allfit( * Convert a leaf attribute list to shortform attribute list */ int -xfs_attr_leaf_to_shortform( - struct xfs_buf *bp, - xfs_da_args_t *args, - int forkoff) +xfs_attr3_leaf_to_shortform( + struct xfs_buf *bp, + struct xfs_da_args *args, + int forkoff) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_local_t *name_loc; - xfs_da_args_t nargs; - xfs_inode_t *dp; - char *tmpbuffer; - int error, i; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_local *name_loc; + struct xfs_da_args nargs; + struct xfs_inode *dp = args->dp; + char *tmpbuffer; + int error; + int i; trace_xfs_attr_leaf_to_sf(args); - dp = args->dp; tmpbuffer = kmem_alloc(XFS_LBSIZE(dp->i_mount), KM_SLEEP); - ASSERT(tmpbuffer != NULL); + if (!tmpbuffer) + return ENOMEM; - ASSERT(bp != NULL); memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(dp->i_mount)); + leaf = (xfs_attr_leafblock_t *)tmpbuffer; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + entry = xfs_attr3_leaf_entryp(leaf); + + /* XXX (dgc): buffer is about to be marked stale - why zero it? */ memset(bp->b_addr, 0, XFS_LBSIZE(dp->i_mount)); /* @@ -875,14 +1020,14 @@ xfs_attr_leaf_to_shortform( nargs.whichfork = XFS_ATTR_FORK; nargs.trans = args->trans; nargs.op_flags = XFS_DA_OP_OKNOENT; - entry = &leaf->entries[0]; - for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { + + for (i = 0; i < ichdr.count; entry++, i++) { if (entry->flags & XFS_ATTR_INCOMPLETE) continue; /* don't copy partial entries */ if (!entry->nameidx) continue; ASSERT(entry->flags & XFS_ATTR_LOCAL); - name_loc = xfs_attr_leaf_name_local(leaf, i); + name_loc = xfs_attr3_leaf_name_local(leaf, i); nargs.name = name_loc->nameval; nargs.namelen = name_loc->namelen; nargs.value = &name_loc->nameval[nargs.namelen]; @@ -895,43 +1040,50 @@ xfs_attr_leaf_to_shortform( out: kmem_free(tmpbuffer); - return(error); + return error; } /* * Convert from using a single leaf to a root node and a leaf. */ int -xfs_attr_leaf_to_node(xfs_da_args_t *args) +xfs_attr3_leaf_to_node( + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_da_intnode_t *node; - xfs_inode_t *dp; - struct xfs_buf *bp1, *bp2; - xfs_dablk_t blkno; - int error; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr icleafhdr; + struct xfs_attr_leaf_entry *entries; struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr icnodehdr; + struct xfs_da_intnode *node; + struct xfs_inode *dp = args->dp; + struct xfs_mount *mp = dp->i_mount; + struct xfs_buf *bp1 = NULL; + struct xfs_buf *bp2 = NULL; + xfs_dablk_t blkno; + int error; trace_xfs_attr_leaf_to_node(args); - dp = args->dp; - bp1 = bp2 = NULL; error = xfs_da_grow_inode(args, &blkno); if (error) goto out; - error = xfs_attr_leaf_read(args->trans, args->dp, 0, -1, &bp1); + error = xfs_attr3_leaf_read(args->trans, dp, 0, -1, &bp1); if (error) goto out; - bp2 = NULL; - error = xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp2, - XFS_ATTR_FORK); + error = xfs_da_get_buf(args->trans, dp, blkno, -1, &bp2, XFS_ATTR_FORK); if (error) goto out; + + /* copy leaf to new buffer, update identifiers */ bp2->b_ops = bp1->b_ops; - memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(dp->i_mount)); - bp1 = NULL; - xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(dp->i_mount) - 1); + memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp)); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_blkinfo *hdr3 = bp2->b_addr; + hdr3->blkno = cpu_to_be64(bp2->b_bn); + } + xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(mp) - 1); /* * Set up the new root node. @@ -940,17 +1092,22 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) if (error) goto out; node = bp1->b_addr; + xfs_da3_node_hdr_from_disk(&icnodehdr, node); + btree = xfs_da3_node_tree_p(node); + leaf = bp2->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + xfs_attr3_leaf_hdr_from_disk(&icleafhdr, leaf); + entries = xfs_attr3_leaf_entryp(leaf); + /* both on-disk, don't endian-flip twice */ - btree = xfs_da3_node_tree_p(node); - btree[0].hashval = leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; + btree[0].hashval = entries[icleafhdr.count - 1].hashval; btree[0].before = cpu_to_be32(blkno); - node->hdr.count = cpu_to_be16(1); - xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(dp->i_mount) - 1); + icnodehdr.count = 1; + xfs_da3_node_hdr_to_disk(node, &icnodehdr); + xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(mp) - 1); error = 0; out: - return(error); + return error; } @@ -963,52 +1120,62 @@ out: * or a leaf in a node attribute list. */ STATIC int -xfs_attr_leaf_create( - xfs_da_args_t *args, - xfs_dablk_t blkno, - struct xfs_buf **bpp) +xfs_attr3_leaf_create( + struct xfs_da_args *args, + xfs_dablk_t blkno, + struct xfs_buf **bpp) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_hdr_t *hdr; - xfs_inode_t *dp; - struct xfs_buf *bp; - int error; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_inode *dp = args->dp; + struct xfs_mount *mp = dp->i_mount; + struct xfs_buf *bp; + int error; trace_xfs_attr_leaf_create(args); - dp = args->dp; - ASSERT(dp != NULL); error = xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp, XFS_ATTR_FORK); if (error) - return(error); - bp->b_ops = &xfs_attr_leaf_buf_ops; + return error; + bp->b_ops = &xfs_attr3_leaf_buf_ops; leaf = bp->b_addr; - memset((char *)leaf, 0, XFS_LBSIZE(dp->i_mount)); - hdr = &leaf->hdr; - hdr->info.magic = cpu_to_be16(XFS_ATTR_LEAF_MAGIC); - hdr->firstused = cpu_to_be16(XFS_LBSIZE(dp->i_mount)); - if (!hdr->firstused) { - hdr->firstused = cpu_to_be16( - XFS_LBSIZE(dp->i_mount) - XFS_ATTR_LEAF_NAME_ALIGN); - } + memset(leaf, 0, XFS_LBSIZE(mp)); - hdr->freemap[0].base = cpu_to_be16(sizeof(xfs_attr_leaf_hdr_t)); - hdr->freemap[0].size = cpu_to_be16(be16_to_cpu(hdr->firstused) - - sizeof(xfs_attr_leaf_hdr_t)); + memset(&ichdr, 0, sizeof(ichdr)); + ichdr.firstused = XFS_LBSIZE(mp); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_blkinfo *hdr3 = bp->b_addr; + + ichdr.magic = XFS_ATTR3_LEAF_MAGIC; + + hdr3->blkno = cpu_to_be64(bp->b_bn); + hdr3->owner = cpu_to_be64(dp->i_ino); + uuid_copy(&hdr3->uuid, &mp->m_sb.sb_uuid); + + ichdr.freemap[0].base = sizeof(struct xfs_attr3_leaf_hdr); + } else { + ichdr.magic = XFS_ATTR_LEAF_MAGIC; + ichdr.freemap[0].base = sizeof(struct xfs_attr_leaf_hdr); + } + ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base; - xfs_trans_log_buf(args->trans, bp, 0, XFS_LBSIZE(dp->i_mount) - 1); + xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); + xfs_trans_log_buf(args->trans, bp, 0, XFS_LBSIZE(mp) - 1); *bpp = bp; - return(0); + return 0; } /* * Split the leaf node, rebalance, then add the new entry. */ int -xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, - xfs_da_state_blk_t *newblk) +xfs_attr3_leaf_split( + struct xfs_da_state *state, + struct xfs_da_state_blk *oldblk, + struct xfs_da_state_blk *newblk) { xfs_dablk_t blkno; int error; @@ -1022,7 +1189,7 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, error = xfs_da_grow_inode(state->args, &blkno); if (error) return(error); - error = xfs_attr_leaf_create(state->args, blkno, &newblk->bp); + error = xfs_attr3_leaf_create(state->args, blkno, &newblk->bp); if (error) return(error); newblk->blkno = blkno; @@ -1032,7 +1199,7 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * Rebalance the entries across the two leaves. * NOTE: rebalance() currently depends on the 2nd block being empty. */ - xfs_attr_leaf_rebalance(state, oldblk, newblk); + xfs_attr3_leaf_rebalance(state, oldblk, newblk); error = xfs_da3_blk_link(state, oldblk, newblk); if (error) return(error); @@ -1046,10 +1213,10 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, */ if (state->inleaf) { trace_xfs_attr_leaf_add_old(state->args); - error = xfs_attr_leaf_add(oldblk->bp, state->args); + error = xfs_attr3_leaf_add(oldblk->bp, state->args); } else { trace_xfs_attr_leaf_add_new(state->args); - error = xfs_attr_leaf_add(newblk->bp, state->args); + error = xfs_attr3_leaf_add(newblk->bp, state->args); } /* @@ -1064,22 +1231,23 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * Add a name to the leaf attribute list structure. */ int -xfs_attr_leaf_add( +xfs_attr3_leaf_add( struct xfs_buf *bp, struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_hdr_t *hdr; - xfs_attr_leaf_map_t *map; - int tablesize, entsize, sum, tmp, i; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + int tablesize; + int entsize; + int sum; + int tmp; + int i; trace_xfs_attr_leaf_add(args); leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT((args->index >= 0) - && (args->index <= be16_to_cpu(leaf->hdr.count))); - hdr = &leaf->hdr; + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + ASSERT(args->index >= 0 && args->index <= ichdr.count); entsize = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, args->trans->t_mountp->m_sb.sb_blocksize, NULL); @@ -1087,25 +1255,23 @@ xfs_attr_leaf_add( * Search through freemap for first-fit on new name length. * (may need to figure in size of entry struct too) */ - tablesize = (be16_to_cpu(hdr->count) + 1) - * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t); - map = &hdr->freemap[XFS_ATTR_LEAF_MAPSIZE-1]; - for (sum = 0, i = XFS_ATTR_LEAF_MAPSIZE-1; i >= 0; map--, i--) { - if (tablesize > be16_to_cpu(hdr->firstused)) { - sum += be16_to_cpu(map->size); + tablesize = (ichdr.count + 1) * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf); + for (sum = 0, i = XFS_ATTR_LEAF_MAPSIZE - 1; i >= 0; i--) { + if (tablesize > ichdr.firstused) { + sum += ichdr.freemap[i].size; continue; } - if (!map->size) + if (!ichdr.freemap[i].size) continue; /* no space in this map */ tmp = entsize; - if (be16_to_cpu(map->base) < be16_to_cpu(hdr->firstused)) + if (ichdr.freemap[i].base < ichdr.firstused) tmp += sizeof(xfs_attr_leaf_entry_t); - if (be16_to_cpu(map->size) >= tmp) { - tmp = xfs_attr_leaf_add_work(bp, args, i); - return(tmp); + if (ichdr.freemap[i].size >= tmp) { + tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, i); + goto out_log_hdr; } - sum += be16_to_cpu(map->size); + sum += ichdr.freemap[i].size; } /* @@ -1113,82 +1279,90 @@ xfs_attr_leaf_add( * and we don't have enough freespace, then compaction will do us * no good and we should just give up. */ - if (!hdr->holes && (sum < entsize)) - return(XFS_ERROR(ENOSPC)); + if (!ichdr.holes && sum < entsize) + return XFS_ERROR(ENOSPC); /* * Compact the entries to coalesce free space. * This may change the hdr->count via dropping INCOMPLETE entries. */ - xfs_attr_leaf_compact(args, bp); + xfs_attr3_leaf_compact(args, &ichdr, bp); /* * After compaction, the block is guaranteed to have only one * free region, in freemap[0]. If it is not big enough, give up. */ - if (be16_to_cpu(hdr->freemap[0].size) - < (entsize + sizeof(xfs_attr_leaf_entry_t))) - return(XFS_ERROR(ENOSPC)); + if (ichdr.freemap[0].size < (entsize + sizeof(xfs_attr_leaf_entry_t))) { + tmp = ENOSPC; + goto out_log_hdr; + } + + tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, 0); - return(xfs_attr_leaf_add_work(bp, args, 0)); +out_log_hdr: + xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); + xfs_trans_log_buf(args->trans, bp, + XFS_DA_LOGRANGE(leaf, &leaf->hdr, + xfs_attr3_leaf_hdr_size(leaf))); + return tmp; } /* * Add a name to a leaf attribute list structure. */ STATIC int -xfs_attr_leaf_add_work( - struct xfs_buf *bp, - xfs_da_args_t *args, - int mapindex) +xfs_attr3_leaf_add_work( + struct xfs_buf *bp, + struct xfs_attr3_icleaf_hdr *ichdr, + struct xfs_da_args *args, + int mapindex) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_hdr_t *hdr; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_local_t *name_loc; - xfs_attr_leaf_name_remote_t *name_rmt; - xfs_attr_leaf_map_t *map; - xfs_mount_t *mp; - int tmp, i; + struct xfs_attr_leafblock *leaf; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_local *name_loc; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_attr_leaf_map *map; + struct xfs_mount *mp; + int tmp; + int i; trace_xfs_attr_leaf_add_work(args); leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - hdr = &leaf->hdr; - ASSERT((mapindex >= 0) && (mapindex < XFS_ATTR_LEAF_MAPSIZE)); - ASSERT((args->index >= 0) && (args->index <= be16_to_cpu(hdr->count))); + ASSERT(mapindex >= 0 && mapindex < XFS_ATTR_LEAF_MAPSIZE); + ASSERT(args->index >= 0 && args->index <= ichdr->count); /* * Force open some space in the entry array and fill it in. */ - entry = &leaf->entries[args->index]; - if (args->index < be16_to_cpu(hdr->count)) { - tmp = be16_to_cpu(hdr->count) - args->index; + entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; + if (args->index < ichdr->count) { + tmp = ichdr->count - args->index; tmp *= sizeof(xfs_attr_leaf_entry_t); - memmove((char *)(entry+1), (char *)entry, tmp); + memmove(entry + 1, entry, tmp); xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry))); } - be16_add_cpu(&hdr->count, 1); + ichdr->count++; /* * Allocate space for the new string (at the end of the run). */ - map = &hdr->freemap[mapindex]; mp = args->trans->t_mountp; - ASSERT(be16_to_cpu(map->base) < XFS_LBSIZE(mp)); - ASSERT((be16_to_cpu(map->base) & 0x3) == 0); - ASSERT(be16_to_cpu(map->size) >= + ASSERT(ichdr->freemap[mapindex].base < XFS_LBSIZE(mp)); + ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); + ASSERT(ichdr->freemap[mapindex].size >= xfs_attr_leaf_newentsize(args->namelen, args->valuelen, mp->m_sb.sb_blocksize, NULL)); - ASSERT(be16_to_cpu(map->size) < XFS_LBSIZE(mp)); - ASSERT((be16_to_cpu(map->size) & 0x3) == 0); - be16_add_cpu(&map->size, - -xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, &tmp)); - entry->nameidx = cpu_to_be16(be16_to_cpu(map->base) + - be16_to_cpu(map->size)); + ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); + ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); + + ichdr->freemap[mapindex].size -= + xfs_attr_leaf_newentsize(args->namelen, args->valuelen, + mp->m_sb.sb_blocksize, &tmp); + + entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + + ichdr->freemap[mapindex].size); entry->hashval = cpu_to_be32(args->hashval); entry->flags = tmp ? XFS_ATTR_LOCAL : 0; entry->flags |= XFS_ATTR_NSP_ARGS_TO_ONDISK(args->flags); @@ -1203,7 +1377,7 @@ xfs_attr_leaf_add_work( XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); ASSERT((args->index == 0) || (be32_to_cpu(entry->hashval) >= be32_to_cpu((entry-1)->hashval))); - ASSERT((args->index == be16_to_cpu(hdr->count)-1) || + ASSERT((args->index == ichdr->count - 1) || (be32_to_cpu(entry->hashval) <= be32_to_cpu((entry+1)->hashval))); /* @@ -1214,14 +1388,14 @@ xfs_attr_leaf_add_work( * as part of this transaction (a split operation for example). */ if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf, args->index); + name_loc = xfs_attr3_leaf_name_local(leaf, args->index); name_loc->namelen = args->namelen; name_loc->valuelen = cpu_to_be16(args->valuelen); memcpy((char *)name_loc->nameval, args->name, args->namelen); memcpy((char *)&name_loc->nameval[args->namelen], args->value, be16_to_cpu(name_loc->valuelen)); } else { - name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); name_rmt->namelen = args->namelen; memcpy((char *)name_rmt->name, args->name, args->namelen); entry->flags |= XFS_ATTR_INCOMPLETE; @@ -1232,44 +1406,41 @@ xfs_attr_leaf_add_work( args->rmtblkcnt = XFS_B_TO_FSB(mp, args->valuelen); } xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), + XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), xfs_attr_leaf_entsize(leaf, args->index))); /* * Update the control info for this leaf node */ - if (be16_to_cpu(entry->nameidx) < be16_to_cpu(hdr->firstused)) { - /* both on-disk, don't endian-flip twice */ - hdr->firstused = entry->nameidx; - } - ASSERT(be16_to_cpu(hdr->firstused) >= - ((be16_to_cpu(hdr->count) * sizeof(*entry)) + sizeof(*hdr))); - tmp = (be16_to_cpu(hdr->count)-1) * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t); - map = &hdr->freemap[0]; + if (be16_to_cpu(entry->nameidx) < ichdr->firstused) + ichdr->firstused = be16_to_cpu(entry->nameidx); + + ASSERT(ichdr->firstused >= ichdr->count * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf)); + tmp = (ichdr->count - 1) * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf); + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; map++, i++) { - if (be16_to_cpu(map->base) == tmp) { - be16_add_cpu(&map->base, sizeof(xfs_attr_leaf_entry_t)); - be16_add_cpu(&map->size, - -((int)sizeof(xfs_attr_leaf_entry_t))); + if (ichdr->freemap[i].base == tmp) { + ichdr->freemap[i].base += sizeof(xfs_attr_leaf_entry_t); + ichdr->freemap[i].size -= sizeof(xfs_attr_leaf_entry_t); } } - be16_add_cpu(&hdr->usedbytes, xfs_attr_leaf_entsize(leaf, args->index)); - xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, hdr, sizeof(*hdr))); - return(0); + ichdr->usedbytes += xfs_attr_leaf_entsize(leaf, args->index); + return 0; } /* * Garbage collect a leaf attribute list block by copying it to a new buffer. */ STATIC void -xfs_attr_leaf_compact( +xfs_attr3_leaf_compact( struct xfs_da_args *args, + struct xfs_attr3_icleaf_hdr *ichdr_d, struct xfs_buf *bp) { xfs_attr_leafblock_t *leaf_s, *leaf_d; - xfs_attr_leaf_hdr_t *hdr_s, *hdr_d; + struct xfs_attr3_icleaf_hdr ichdr_s; struct xfs_trans *trans = args->trans; struct xfs_mount *mp = trans->t_mountp; char *tmpbuffer; @@ -1286,34 +1457,69 @@ xfs_attr_leaf_compact( */ leaf_s = (xfs_attr_leafblock_t *)tmpbuffer; leaf_d = bp->b_addr; - hdr_s = &leaf_s->hdr; - hdr_d = &leaf_d->hdr; - hdr_d->info = hdr_s->info; /* struct copy */ - hdr_d->firstused = cpu_to_be16(XFS_LBSIZE(mp)); - /* handle truncation gracefully */ - if (!hdr_d->firstused) { - hdr_d->firstused = cpu_to_be16( - XFS_LBSIZE(mp) - XFS_ATTR_LEAF_NAME_ALIGN); - } - hdr_d->usedbytes = 0; - hdr_d->count = 0; - hdr_d->holes = 0; - hdr_d->freemap[0].base = cpu_to_be16(sizeof(xfs_attr_leaf_hdr_t)); - hdr_d->freemap[0].size = cpu_to_be16(be16_to_cpu(hdr_d->firstused) - - sizeof(xfs_attr_leaf_hdr_t)); + ichdr_s = *ichdr_d; /* struct copy */ + ichdr_d->firstused = XFS_LBSIZE(mp); + ichdr_d->usedbytes = 0; + ichdr_d->count = 0; + ichdr_d->holes = 0; + ichdr_d->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_s); + ichdr_d->freemap[0].size = ichdr_d->firstused - ichdr_d->freemap[0].base; /* * Copy all entry's in the same (sorted) order, * but allocate name/value pairs packed and in sequence. */ - xfs_attr_leaf_moveents(leaf_s, 0, leaf_d, 0, - be16_to_cpu(hdr_s->count), mp); + xfs_attr3_leaf_moveents(leaf_s, &ichdr_s, 0, leaf_d, ichdr_d, 0, + ichdr_s.count, mp); + /* + * this logs the entire buffer, but the caller must write the header + * back to the buffer when it is finished modifying it. + */ xfs_trans_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); kmem_free(tmpbuffer); } /* + * Compare two leaf blocks "order". + * Return 0 unless leaf2 should go before leaf1. + */ +static int +xfs_attr3_leaf_order( + struct xfs_buf *leaf1_bp, + struct xfs_attr3_icleaf_hdr *leaf1hdr, + struct xfs_buf *leaf2_bp, + struct xfs_attr3_icleaf_hdr *leaf2hdr) +{ + struct xfs_attr_leaf_entry *entries1; + struct xfs_attr_leaf_entry *entries2; + + entries1 = xfs_attr3_leaf_entryp(leaf1_bp->b_addr); + entries2 = xfs_attr3_leaf_entryp(leaf2_bp->b_addr); + if (leaf1hdr->count > 0 && leaf2hdr->count > 0 && + ((be32_to_cpu(entries2[0].hashval) < + be32_to_cpu(entries1[0].hashval)) || + (be32_to_cpu(entries2[leaf2hdr->count - 1].hashval) < + be32_to_cpu(entries1[leaf1hdr->count - 1].hashval)))) { + return 1; + } + return 0; +} + +int +xfs_attr_leaf_order( + struct xfs_buf *leaf1_bp, + struct xfs_buf *leaf2_bp) +{ + struct xfs_attr3_icleaf_hdr ichdr1; + struct xfs_attr3_icleaf_hdr ichdr2; + + xfs_attr3_leaf_hdr_from_disk(&ichdr1, leaf1_bp->b_addr); + xfs_attr3_leaf_hdr_from_disk(&ichdr2, leaf2_bp->b_addr); + return xfs_attr3_leaf_order(leaf1_bp, &ichdr1, leaf2_bp, &ichdr2); +} + +/* * Redistribute the attribute list entries between two leaf nodes, * taking into account the size of the new entry. * @@ -1326,14 +1532,23 @@ xfs_attr_leaf_compact( * the "new" and "old" values can end up in different blocks. */ STATIC void -xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2) +xfs_attr3_leaf_rebalance( + struct xfs_da_state *state, + struct xfs_da_state_blk *blk1, + struct xfs_da_state_blk *blk2) { - xfs_da_args_t *args; - xfs_da_state_blk_t *tmp_blk; - xfs_attr_leafblock_t *leaf1, *leaf2; - xfs_attr_leaf_hdr_t *hdr1, *hdr2; - int count, totallen, max, space, swap; + struct xfs_da_args *args; + struct xfs_attr_leafblock *leaf1; + struct xfs_attr_leafblock *leaf2; + struct xfs_attr3_icleaf_hdr ichdr1; + struct xfs_attr3_icleaf_hdr ichdr2; + struct xfs_attr_leaf_entry *entries1; + struct xfs_attr_leaf_entry *entries2; + int count; + int totallen; + int max; + int space; + int swap; /* * Set up environment. @@ -1342,9 +1557,9 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, ASSERT(blk2->magic == XFS_ATTR_LEAF_MAGIC); leaf1 = blk1->bp->b_addr; leaf2 = blk2->bp->b_addr; - ASSERT(leaf1->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(leaf2->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(leaf2->hdr.count == 0); + xfs_attr3_leaf_hdr_from_disk(&ichdr1, leaf1); + xfs_attr3_leaf_hdr_from_disk(&ichdr2, leaf2); + ASSERT(ichdr2.count == 0); args = state->args; trace_xfs_attr_leaf_rebalance(args); @@ -1356,16 +1571,23 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * second block, this code should never set "swap". */ swap = 0; - if (xfs_attr_leaf_order(blk1->bp, blk2->bp)) { + if (xfs_attr3_leaf_order(blk1->bp, &ichdr1, blk2->bp, &ichdr2)) { + struct xfs_da_state_blk *tmp_blk; + struct xfs_attr3_icleaf_hdr tmp_ichdr; + tmp_blk = blk1; blk1 = blk2; blk2 = tmp_blk; + + /* struct copies to swap them rather than reconverting */ + tmp_ichdr = ichdr1; + ichdr1 = ichdr2; + ichdr2 = tmp_ichdr; + leaf1 = blk1->bp->b_addr; leaf2 = blk2->bp->b_addr; swap = 1; } - hdr1 = &leaf1->hdr; - hdr2 = &leaf2->hdr; /* * Examine entries until we reduce the absolute difference in @@ -1375,41 +1597,39 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * "inleaf" is true if the new entry should be inserted into blk1. * If "swap" is also true, then reverse the sense of "inleaf". */ - state->inleaf = xfs_attr_leaf_figure_balance(state, blk1, blk2, - &count, &totallen); + state->inleaf = xfs_attr3_leaf_figure_balance(state, blk1, &ichdr1, + blk2, &ichdr2, + &count, &totallen); if (swap) state->inleaf = !state->inleaf; /* * Move any entries required from leaf to leaf: */ - if (count < be16_to_cpu(hdr1->count)) { + if (count < ichdr1.count) { /* * Figure the total bytes to be added to the destination leaf. */ /* number entries being moved */ - count = be16_to_cpu(hdr1->count) - count; - space = be16_to_cpu(hdr1->usedbytes) - totallen; + count = ichdr1.count - count; + space = ichdr1.usedbytes - totallen; space += count * sizeof(xfs_attr_leaf_entry_t); /* * leaf2 is the destination, compact it if it looks tight. */ - max = be16_to_cpu(hdr2->firstused) - - sizeof(xfs_attr_leaf_hdr_t); - max -= be16_to_cpu(hdr2->count) * sizeof(xfs_attr_leaf_entry_t); + max = ichdr2.firstused - xfs_attr3_leaf_hdr_size(leaf1); + max -= ichdr2.count * sizeof(xfs_attr_leaf_entry_t); if (space > max) - xfs_attr_leaf_compact(args, blk2->bp); + xfs_attr3_leaf_compact(args, &ichdr2, blk2->bp); /* * Move high entries from leaf1 to low end of leaf2. */ - xfs_attr_leaf_moveents(leaf1, be16_to_cpu(hdr1->count) - count, - leaf2, 0, count, state->mp); + xfs_attr3_leaf_moveents(leaf1, &ichdr1, ichdr1.count - count, + leaf2, &ichdr2, 0, count, state->mp); - xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); - xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); - } else if (count > be16_to_cpu(hdr1->count)) { + } else if (count > ichdr1.count) { /* * I assert that since all callers pass in an empty * second buffer, this code should never execute. @@ -1420,36 +1640,37 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * Figure the total bytes to be added to the destination leaf. */ /* number entries being moved */ - count -= be16_to_cpu(hdr1->count); - space = totallen - be16_to_cpu(hdr1->usedbytes); + count -= ichdr1.count; + space = totallen - ichdr1.usedbytes; space += count * sizeof(xfs_attr_leaf_entry_t); /* * leaf1 is the destination, compact it if it looks tight. */ - max = be16_to_cpu(hdr1->firstused) - - sizeof(xfs_attr_leaf_hdr_t); - max -= be16_to_cpu(hdr1->count) * sizeof(xfs_attr_leaf_entry_t); + max = ichdr1.firstused - xfs_attr3_leaf_hdr_size(leaf1); + max -= ichdr1.count * sizeof(xfs_attr_leaf_entry_t); if (space > max) - xfs_attr_leaf_compact(args, blk1->bp); + xfs_attr3_leaf_compact(args, &ichdr1, blk1->bp); /* * Move low entries from leaf2 to high end of leaf1. */ - xfs_attr_leaf_moveents(leaf2, 0, leaf1, - be16_to_cpu(hdr1->count), count, state->mp); - - xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); - xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); + xfs_attr3_leaf_moveents(leaf2, &ichdr2, 0, leaf1, &ichdr1, + ichdr1.count, count, state->mp); } + xfs_attr3_leaf_hdr_to_disk(leaf1, &ichdr1); + xfs_attr3_leaf_hdr_to_disk(leaf2, &ichdr2); + xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); + xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); + /* * Copy out last hashval in each block for B-tree code. */ - blk1->hashval = be32_to_cpu( - leaf1->entries[be16_to_cpu(leaf1->hdr.count)-1].hashval); - blk2->hashval = be32_to_cpu( - leaf2->entries[be16_to_cpu(leaf2->hdr.count)-1].hashval); + entries1 = xfs_attr3_leaf_entryp(leaf1); + entries2 = xfs_attr3_leaf_entryp(leaf2); + blk1->hashval = be32_to_cpu(entries1[ichdr1.count - 1].hashval); + blk2->hashval = be32_to_cpu(entries2[ichdr2.count - 1].hashval); /* * Adjust the expected index for insertion. @@ -1463,12 +1684,12 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * inserting. The index/blkno fields refer to the "old" entry, * while the index2/blkno2 fields refer to the "new" entry. */ - if (blk1->index > be16_to_cpu(leaf1->hdr.count)) { + if (blk1->index > ichdr1.count) { ASSERT(state->inleaf == 0); - blk2->index = blk1->index - be16_to_cpu(leaf1->hdr.count); + blk2->index = blk1->index - ichdr1.count; args->index = args->index2 = blk2->index; args->blkno = args->blkno2 = blk2->blkno; - } else if (blk1->index == be16_to_cpu(leaf1->hdr.count)) { + } else if (blk1->index == ichdr1.count) { if (state->inleaf) { args->index = blk1->index; args->blkno = blk1->blkno; @@ -1480,8 +1701,7 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * is already stored in blkno2/index2, so don't * overwrite it overwise we corrupt the tree. */ - blk2->index = blk1->index - - be16_to_cpu(leaf1->hdr.count); + blk2->index = blk1->index - ichdr1.count; args->index = blk2->index; args->blkno = blk2->blkno; if (!state->extravalid) { @@ -1509,42 +1729,40 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * GROT: Do a double-split for this case? */ STATIC int -xfs_attr_leaf_figure_balance(xfs_da_state_t *state, - xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2, - int *countarg, int *usedbytesarg) +xfs_attr3_leaf_figure_balance( + struct xfs_da_state *state, + struct xfs_da_state_blk *blk1, + struct xfs_attr3_icleaf_hdr *ichdr1, + struct xfs_da_state_blk *blk2, + struct xfs_attr3_icleaf_hdr *ichdr2, + int *countarg, + int *usedbytesarg) { - xfs_attr_leafblock_t *leaf1, *leaf2; - xfs_attr_leaf_hdr_t *hdr1, *hdr2; - xfs_attr_leaf_entry_t *entry; - int count, max, index, totallen, half; - int lastdelta, foundit, tmp; - - /* - * Set up environment. - */ - leaf1 = blk1->bp->b_addr; - leaf2 = blk2->bp->b_addr; - hdr1 = &leaf1->hdr; - hdr2 = &leaf2->hdr; - foundit = 0; - totallen = 0; + struct xfs_attr_leafblock *leaf1 = blk1->bp->b_addr; + struct xfs_attr_leafblock *leaf2 = blk2->bp->b_addr; + struct xfs_attr_leaf_entry *entry; + int count; + int max; + int index; + int totallen = 0; + int half; + int lastdelta; + int foundit = 0; + int tmp; /* * Examine entries until we reduce the absolute difference in * byte usage between the two blocks to a minimum. */ - max = be16_to_cpu(hdr1->count) + be16_to_cpu(hdr2->count); - half = (max+1) * sizeof(*entry); - half += be16_to_cpu(hdr1->usedbytes) + - be16_to_cpu(hdr2->usedbytes) + - xfs_attr_leaf_newentsize( - state->args->namelen, - state->args->valuelen, - state->blocksize, NULL); + max = ichdr1->count + ichdr2->count; + half = (max + 1) * sizeof(*entry); + half += ichdr1->usedbytes + ichdr2->usedbytes + + xfs_attr_leaf_newentsize(state->args->namelen, + state->args->valuelen, + state->blocksize, NULL); half /= 2; lastdelta = state->blocksize; - entry = &leaf1->entries[0]; + entry = xfs_attr3_leaf_entryp(leaf1); for (count = index = 0; count < max; entry++, index++, count++) { #define XFS_ATTR_ABS(A) (((A) < 0) ? -(A) : (A)) @@ -1567,9 +1785,9 @@ xfs_attr_leaf_figure_balance(xfs_da_state_t *state, /* * Wrap around into the second block if necessary. */ - if (count == be16_to_cpu(hdr1->count)) { + if (count == ichdr1->count) { leaf1 = leaf2; - entry = &leaf1->entries[0]; + entry = xfs_attr3_leaf_entryp(leaf1); index = 0; } @@ -1600,7 +1818,7 @@ xfs_attr_leaf_figure_balance(xfs_da_state_t *state, *countarg = count; *usedbytesarg = totallen; - return(foundit); + return foundit; } /*======================================================================== @@ -1619,14 +1837,20 @@ xfs_attr_leaf_figure_balance(xfs_da_state_t *state, * GROT: allow for INCOMPLETE entries in calculation. */ int -xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) +xfs_attr3_leaf_toosmall( + struct xfs_da_state *state, + int *action) { - xfs_attr_leafblock_t *leaf; - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *info; - int count, bytes, forward, error, retval, i; - xfs_dablk_t blkno; - struct xfs_buf *bp; + struct xfs_attr_leafblock *leaf; + struct xfs_da_state_blk *blk; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_buf *bp; + xfs_dablk_t blkno; + int bytes; + int forward; + int error; + int retval; + int i; trace_xfs_attr_leaf_toosmall(state->args); @@ -1636,13 +1860,11 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) * to coalesce with a sibling. */ blk = &state->path.blk[ state->path.active-1 ]; - info = blk->bp->b_addr; - ASSERT(info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - leaf = (xfs_attr_leafblock_t *)info; - count = be16_to_cpu(leaf->hdr.count); - bytes = sizeof(xfs_attr_leaf_hdr_t) + - count * sizeof(xfs_attr_leaf_entry_t) + - be16_to_cpu(leaf->hdr.usedbytes); + leaf = blk->bp->b_addr; + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + bytes = xfs_attr3_leaf_hdr_size(leaf) + + ichdr.count * sizeof(xfs_attr_leaf_entry_t) + + ichdr.usedbytes; if (bytes > (state->blocksize >> 1)) { *action = 0; /* blk over 50%, don't try to join */ return(0); @@ -1654,12 +1876,12 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) * coalesce it with a sibling block. We choose (arbitrarily) * to merge with the forward block unless it is NULL. */ - if (count == 0) { + if (ichdr.count == 0) { /* * Make altpath point to the block we want to keep and * path point to the block we want to drop (this one). */ - forward = (info->forw != 0); + forward = (ichdr.forw != 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); @@ -1670,7 +1892,7 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) } else { *action = 2; } - return(0); + return 0; } /* @@ -1681,28 +1903,28 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) * to shrink an attribute list over time. */ /* start with smaller blk num */ - forward = (be32_to_cpu(info->forw) < be32_to_cpu(info->back)); + forward = ichdr.forw < ichdr.back; for (i = 0; i < 2; forward = !forward, i++) { + struct xfs_attr3_icleaf_hdr ichdr2; if (forward) - blkno = be32_to_cpu(info->forw); + blkno = ichdr.forw; else - blkno = be32_to_cpu(info->back); + blkno = ichdr.back; if (blkno == 0) continue; - error = xfs_attr_leaf_read(state->args->trans, state->args->dp, + error = xfs_attr3_leaf_read(state->args->trans, state->args->dp, blkno, -1, &bp); if (error) return(error); - leaf = (xfs_attr_leafblock_t *)info; - count = be16_to_cpu(leaf->hdr.count); - bytes = state->blocksize - (state->blocksize>>2); - bytes -= be16_to_cpu(leaf->hdr.usedbytes); - leaf = bp->b_addr; - count += be16_to_cpu(leaf->hdr.count); - bytes -= be16_to_cpu(leaf->hdr.usedbytes); - bytes -= count * sizeof(xfs_attr_leaf_entry_t); - bytes -= sizeof(xfs_attr_leaf_hdr_t); + xfs_attr3_leaf_hdr_from_disk(&ichdr2, bp->b_addr); + + bytes = state->blocksize - (state->blocksize >> 2) - + ichdr.usedbytes - ichdr2.usedbytes - + ((ichdr.count + ichdr2.count) * + sizeof(xfs_attr_leaf_entry_t)) - + xfs_attr3_leaf_hdr_size(leaf); + xfs_trans_brelse(state->args->trans, bp); if (bytes >= 0) break; /* fits with at least 25% to spare */ @@ -1741,32 +1963,35 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) * If two leaves are 37% full, when combined they will leave 25% free. */ int -xfs_attr_leaf_remove( - struct xfs_buf *bp, - xfs_da_args_t *args) +xfs_attr3_leaf_remove( + struct xfs_buf *bp, + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_hdr_t *hdr; - xfs_attr_leaf_map_t *map; - xfs_attr_leaf_entry_t *entry; - int before, after, smallest, entsize; - int tablesize, tmp, i; - xfs_mount_t *mp; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_mount *mp = args->trans->t_mountp; + int before; + int after; + int smallest; + int entsize; + int tablesize; + int tmp; + int i; trace_xfs_attr_leaf_remove(args); leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - hdr = &leaf->hdr; - mp = args->trans->t_mountp; - ASSERT((be16_to_cpu(hdr->count) > 0) - && (be16_to_cpu(hdr->count) < (XFS_LBSIZE(mp)/8))); - ASSERT((args->index >= 0) - && (args->index < be16_to_cpu(hdr->count))); - ASSERT(be16_to_cpu(hdr->firstused) >= - ((be16_to_cpu(hdr->count) * sizeof(*entry)) + sizeof(*hdr))); - entry = &leaf->entries[args->index]; - ASSERT(be16_to_cpu(entry->nameidx) >= be16_to_cpu(hdr->firstused)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + + ASSERT(ichdr.count > 0 && ichdr.count < XFS_LBSIZE(mp) / 8); + ASSERT(args->index >= 0 && args->index < ichdr.count); + ASSERT(ichdr.firstused >= ichdr.count * sizeof(*entry) + + xfs_attr3_leaf_hdr_size(leaf)); + + entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; + + ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); /* @@ -1775,30 +2000,28 @@ xfs_attr_leaf_remove( * find smallest free region in case we need to replace it, * adjust any map that borders the entry table, */ - tablesize = be16_to_cpu(hdr->count) * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t); - map = &hdr->freemap[0]; - tmp = be16_to_cpu(map->size); + tablesize = ichdr.count * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf); + tmp = ichdr.freemap[0].size; before = after = -1; smallest = XFS_ATTR_LEAF_MAPSIZE - 1; entsize = xfs_attr_leaf_entsize(leaf, args->index); - for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; map++, i++) { - ASSERT(be16_to_cpu(map->base) < XFS_LBSIZE(mp)); - ASSERT(be16_to_cpu(map->size) < XFS_LBSIZE(mp)); - if (be16_to_cpu(map->base) == tablesize) { - be16_add_cpu(&map->base, - -((int)sizeof(xfs_attr_leaf_entry_t))); - be16_add_cpu(&map->size, sizeof(xfs_attr_leaf_entry_t)); + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + ASSERT(ichdr.freemap[i].base < XFS_LBSIZE(mp)); + ASSERT(ichdr.freemap[i].size < XFS_LBSIZE(mp)); + if (ichdr.freemap[i].base == tablesize) { + ichdr.freemap[i].base -= sizeof(xfs_attr_leaf_entry_t); + ichdr.freemap[i].size += sizeof(xfs_attr_leaf_entry_t); } - if ((be16_to_cpu(map->base) + be16_to_cpu(map->size)) - == be16_to_cpu(entry->nameidx)) { + if (ichdr.freemap[i].base + ichdr.freemap[i].size == + be16_to_cpu(entry->nameidx)) { before = i; - } else if (be16_to_cpu(map->base) - == (be16_to_cpu(entry->nameidx) + entsize)) { + } else if (ichdr.freemap[i].base == + (be16_to_cpu(entry->nameidx) + entsize)) { after = i; - } else if (be16_to_cpu(map->size) < tmp) { - tmp = be16_to_cpu(map->size); + } else if (ichdr.freemap[i].size < tmp) { + tmp = ichdr.freemap[i].size; smallest = i; } } @@ -1809,36 +2032,30 @@ xfs_attr_leaf_remove( */ if ((before >= 0) || (after >= 0)) { if ((before >= 0) && (after >= 0)) { - map = &hdr->freemap[before]; - be16_add_cpu(&map->size, entsize); - be16_add_cpu(&map->size, - be16_to_cpu(hdr->freemap[after].size)); - hdr->freemap[after].base = 0; - hdr->freemap[after].size = 0; + ichdr.freemap[before].size += entsize; + ichdr.freemap[before].size += ichdr.freemap[after].size; + ichdr.freemap[after].base = 0; + ichdr.freemap[after].size = 0; } else if (before >= 0) { - map = &hdr->freemap[before]; - be16_add_cpu(&map->size, entsize); + ichdr.freemap[before].size += entsize; } else { - map = &hdr->freemap[after]; - /* both on-disk, don't endian flip twice */ - map->base = entry->nameidx; - be16_add_cpu(&map->size, entsize); + ichdr.freemap[after].base = be16_to_cpu(entry->nameidx); + ichdr.freemap[after].size += entsize; } } else { /* * Replace smallest region (if it is smaller than free'd entry) */ - map = &hdr->freemap[smallest]; - if (be16_to_cpu(map->size) < entsize) { - map->base = cpu_to_be16(be16_to_cpu(entry->nameidx)); - map->size = cpu_to_be16(entsize); + if (ichdr.freemap[smallest].size < entsize) { + ichdr.freemap[smallest].base = be16_to_cpu(entry->nameidx); + ichdr.freemap[smallest].size = entsize; } } /* * Did we remove the first entry? */ - if (be16_to_cpu(entry->nameidx) == be16_to_cpu(hdr->firstused)) + if (be16_to_cpu(entry->nameidx) == ichdr.firstused) smallest = 1; else smallest = 0; @@ -1846,20 +2063,20 @@ xfs_attr_leaf_remove( /* * Compress the remaining entries and zero out the removed stuff. */ - memset(xfs_attr_leaf_name(leaf, args->index), 0, entsize); - be16_add_cpu(&hdr->usedbytes, -entsize); + memset(xfs_attr3_leaf_name(leaf, args->index), 0, entsize); + ichdr.usedbytes -= entsize; xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), + XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), entsize)); - tmp = (be16_to_cpu(hdr->count) - args->index) - * sizeof(xfs_attr_leaf_entry_t); - memmove((char *)entry, (char *)(entry+1), tmp); - be16_add_cpu(&hdr->count, -1); + tmp = (ichdr.count - args->index) * sizeof(xfs_attr_leaf_entry_t); + memmove(entry, entry + 1, tmp); + ichdr.count--; xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry))); - entry = &leaf->entries[be16_to_cpu(hdr->count)]; - memset((char *)entry, 0, sizeof(xfs_attr_leaf_entry_t)); + XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(xfs_attr_leaf_entry_t))); + + entry = &xfs_attr3_leaf_entryp(leaf)[ichdr.count]; + memset(entry, 0, sizeof(xfs_attr_leaf_entry_t)); /* * If we removed the first entry, re-find the first used byte @@ -1869,130 +2086,130 @@ xfs_attr_leaf_remove( */ if (smallest) { tmp = XFS_LBSIZE(mp); - entry = &leaf->entries[0]; - for (i = be16_to_cpu(hdr->count)-1; i >= 0; entry++, i--) { - ASSERT(be16_to_cpu(entry->nameidx) >= - be16_to_cpu(hdr->firstused)); + entry = xfs_attr3_leaf_entryp(leaf); + for (i = ichdr.count - 1; i >= 0; entry++, i--) { + ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); if (be16_to_cpu(entry->nameidx) < tmp) tmp = be16_to_cpu(entry->nameidx); } - hdr->firstused = cpu_to_be16(tmp); - if (!hdr->firstused) { - hdr->firstused = cpu_to_be16( - tmp - XFS_ATTR_LEAF_NAME_ALIGN); - } + ichdr.firstused = tmp; + if (!ichdr.firstused) + ichdr.firstused = tmp - XFS_ATTR_LEAF_NAME_ALIGN; } else { - hdr->holes = 1; /* mark as needing compaction */ + ichdr.holes = 1; /* mark as needing compaction */ } + xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, hdr, sizeof(*hdr))); + XFS_DA_LOGRANGE(leaf, &leaf->hdr, + xfs_attr3_leaf_hdr_size(leaf))); /* * Check if leaf is less than 50% full, caller may want to * "join" the leaf with a sibling if so. */ - tmp = sizeof(xfs_attr_leaf_hdr_t); - tmp += be16_to_cpu(leaf->hdr.count) * sizeof(xfs_attr_leaf_entry_t); - tmp += be16_to_cpu(leaf->hdr.usedbytes); - return(tmp < mp->m_attr_magicpct); /* leaf is < 37% full */ + tmp = ichdr.usedbytes + xfs_attr3_leaf_hdr_size(leaf) + + ichdr.count * sizeof(xfs_attr_leaf_entry_t); + + return tmp < mp->m_attr_magicpct; /* leaf is < 37% full */ } /* * Move all the attribute list entries from drop_leaf into save_leaf. */ void -xfs_attr_leaf_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, - xfs_da_state_blk_t *save_blk) +xfs_attr3_leaf_unbalance( + struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk, + struct xfs_da_state_blk *save_blk) { - xfs_attr_leafblock_t *drop_leaf, *save_leaf, *tmp_leaf; - xfs_attr_leaf_hdr_t *drop_hdr, *save_hdr, *tmp_hdr; - xfs_mount_t *mp; - char *tmpbuffer; + struct xfs_attr_leafblock *drop_leaf = drop_blk->bp->b_addr; + struct xfs_attr_leafblock *save_leaf = save_blk->bp->b_addr; + struct xfs_attr3_icleaf_hdr drophdr; + struct xfs_attr3_icleaf_hdr savehdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_mount *mp = state->mp; trace_xfs_attr_leaf_unbalance(state->args); - /* - * Set up environment. - */ - mp = state->mp; - ASSERT(drop_blk->magic == XFS_ATTR_LEAF_MAGIC); - ASSERT(save_blk->magic == XFS_ATTR_LEAF_MAGIC); drop_leaf = drop_blk->bp->b_addr; save_leaf = save_blk->bp->b_addr; - ASSERT(drop_leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(save_leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - drop_hdr = &drop_leaf->hdr; - save_hdr = &save_leaf->hdr; + xfs_attr3_leaf_hdr_from_disk(&drophdr, drop_leaf); + xfs_attr3_leaf_hdr_from_disk(&savehdr, save_leaf); + entry = xfs_attr3_leaf_entryp(drop_leaf); /* * Save last hashval from dying block for later Btree fixup. */ - drop_blk->hashval = be32_to_cpu( - drop_leaf->entries[be16_to_cpu(drop_leaf->hdr.count)-1].hashval); + drop_blk->hashval = be32_to_cpu(entry[drophdr.count - 1].hashval); /* * Check if we need a temp buffer, or can we do it in place. * Note that we don't check "leaf" for holes because we will * always be dropping it, toosmall() decided that for us already. */ - if (save_hdr->holes == 0) { + if (savehdr.holes == 0) { /* * dest leaf has no holes, so we add there. May need * to make some room in the entry array. */ - if (xfs_attr_leaf_order(save_blk->bp, drop_blk->bp)) { - xfs_attr_leaf_moveents(drop_leaf, 0, save_leaf, 0, - be16_to_cpu(drop_hdr->count), mp); + if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, + drop_blk->bp, &drophdr)) { + xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + save_leaf, &savehdr, 0, + drophdr.count, mp); } else { - xfs_attr_leaf_moveents(drop_leaf, 0, save_leaf, - be16_to_cpu(save_hdr->count), - be16_to_cpu(drop_hdr->count), mp); + xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + save_leaf, &savehdr, + savehdr.count, drophdr.count, mp); } } else { /* * Destination has holes, so we make a temporary copy * of the leaf and add them both to that. */ - tmpbuffer = kmem_alloc(state->blocksize, KM_SLEEP); - ASSERT(tmpbuffer != NULL); - memset(tmpbuffer, 0, state->blocksize); - tmp_leaf = (xfs_attr_leafblock_t *)tmpbuffer; - tmp_hdr = &tmp_leaf->hdr; - tmp_hdr->info = save_hdr->info; /* struct copy */ - tmp_hdr->count = 0; - tmp_hdr->firstused = cpu_to_be16(state->blocksize); - if (!tmp_hdr->firstused) { - tmp_hdr->firstused = cpu_to_be16( - state->blocksize - XFS_ATTR_LEAF_NAME_ALIGN); - } - tmp_hdr->usedbytes = 0; - if (xfs_attr_leaf_order(save_blk->bp, drop_blk->bp)) { - xfs_attr_leaf_moveents(drop_leaf, 0, tmp_leaf, 0, - be16_to_cpu(drop_hdr->count), mp); - xfs_attr_leaf_moveents(save_leaf, 0, tmp_leaf, - be16_to_cpu(tmp_leaf->hdr.count), - be16_to_cpu(save_hdr->count), mp); + struct xfs_attr_leafblock *tmp_leaf; + struct xfs_attr3_icleaf_hdr tmphdr; + + tmp_leaf = kmem_alloc(state->blocksize, KM_SLEEP); + memset(tmp_leaf, 0, state->blocksize); + memset(&tmphdr, 0, sizeof(tmphdr)); + + tmphdr.magic = savehdr.magic; + tmphdr.forw = savehdr.forw; + tmphdr.back = savehdr.back; + tmphdr.firstused = state->blocksize; + if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, + drop_blk->bp, &drophdr)) { + xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + tmp_leaf, &tmphdr, 0, + drophdr.count, mp); + xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, + tmp_leaf, &tmphdr, tmphdr.count, + savehdr.count, mp); } else { - xfs_attr_leaf_moveents(save_leaf, 0, tmp_leaf, 0, - be16_to_cpu(save_hdr->count), mp); - xfs_attr_leaf_moveents(drop_leaf, 0, tmp_leaf, - be16_to_cpu(tmp_leaf->hdr.count), - be16_to_cpu(drop_hdr->count), mp); + xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, + tmp_leaf, &tmphdr, 0, + savehdr.count, mp); + xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + tmp_leaf, &tmphdr, tmphdr.count, + drophdr.count, mp); } - memcpy((char *)save_leaf, (char *)tmp_leaf, state->blocksize); - kmem_free(tmpbuffer); + memcpy(save_leaf, tmp_leaf, state->blocksize); + savehdr = tmphdr; /* struct copy */ + kmem_free(tmp_leaf); } + xfs_attr3_leaf_hdr_to_disk(save_leaf, &savehdr); xfs_trans_log_buf(state->args->trans, save_blk->bp, 0, state->blocksize - 1); /* * Copy out last hashval in each block for B-tree code. */ - save_blk->hashval = be32_to_cpu( - save_leaf->entries[be16_to_cpu(save_leaf->hdr.count)-1].hashval); + entry = xfs_attr3_leaf_entryp(save_leaf); + save_blk->hashval = be32_to_cpu(entry[savehdr.count - 1].hashval); } /*======================================================================== @@ -2013,31 +2230,33 @@ xfs_attr_leaf_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, * Don't change the args->value unless we find the attribute. */ int -xfs_attr_leaf_lookup_int( - struct xfs_buf *bp, - xfs_da_args_t *args) +xfs_attr3_leaf_lookup_int( + struct xfs_buf *bp, + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_local_t *name_loc; - xfs_attr_leaf_name_remote_t *name_rmt; - int probe, span; - xfs_dahash_t hashval; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_entry *entries; + struct xfs_attr_leaf_name_local *name_loc; + struct xfs_attr_leaf_name_remote *name_rmt; + xfs_dahash_t hashval; + int probe; + int span; trace_xfs_attr_leaf_lookup(args); leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(be16_to_cpu(leaf->hdr.count) - < (XFS_LBSIZE(args->dp->i_mount)/8)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + entries = xfs_attr3_leaf_entryp(leaf); + ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); /* * Binary search. (note: small blocks will skip this loop) */ hashval = args->hashval; - probe = span = be16_to_cpu(leaf->hdr.count) / 2; - for (entry = &leaf->entries[probe]; span > 4; - entry = &leaf->entries[probe]) { + probe = span = ichdr.count / 2; + for (entry = &entries[probe]; span > 4; entry = &entries[probe]) { span /= 2; if (be32_to_cpu(entry->hashval) < hashval) probe += span; @@ -2046,35 +2265,31 @@ xfs_attr_leaf_lookup_int( else break; } - ASSERT((probe >= 0) && - (!leaf->hdr.count - || (probe < be16_to_cpu(leaf->hdr.count)))); - ASSERT((span <= 4) || (be32_to_cpu(entry->hashval) == hashval)); + ASSERT(probe >= 0 && (!ichdr.count || probe < ichdr.count)); + ASSERT(span <= 4 || be32_to_cpu(entry->hashval) == hashval); /* * Since we may have duplicate hashval's, find the first matching * hashval in the leaf. */ - while ((probe > 0) && (be32_to_cpu(entry->hashval) >= hashval)) { + while (probe > 0 && be32_to_cpu(entry->hashval) >= hashval) { entry--; probe--; } - while ((probe < be16_to_cpu(leaf->hdr.count)) && - (be32_to_cpu(entry->hashval) < hashval)) { + while (probe < ichdr.count && + be32_to_cpu(entry->hashval) < hashval) { entry++; probe++; } - if ((probe == be16_to_cpu(leaf->hdr.count)) || - (be32_to_cpu(entry->hashval) != hashval)) { + if (probe == ichdr.count || be32_to_cpu(entry->hashval) != hashval) { args->index = probe; - return(XFS_ERROR(ENOATTR)); + return XFS_ERROR(ENOATTR); } /* * Duplicate keys may be present, so search all of them for a match. */ - for ( ; (probe < be16_to_cpu(leaf->hdr.count)) && - (be32_to_cpu(entry->hashval) == hashval); + for (; probe < ichdr.count && (be32_to_cpu(entry->hashval) == hashval); entry++, probe++) { /* * GROT: Add code to remove incomplete entries. @@ -2088,21 +2303,22 @@ xfs_attr_leaf_lookup_int( continue; } if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf, probe); + name_loc = xfs_attr3_leaf_name_local(leaf, probe); if (name_loc->namelen != args->namelen) continue; - if (memcmp(args->name, (char *)name_loc->nameval, args->namelen) != 0) + if (memcmp(args->name, name_loc->nameval, + args->namelen) != 0) continue; if (!xfs_attr_namesp_match(args->flags, entry->flags)) continue; args->index = probe; - return(XFS_ERROR(EEXIST)); + return XFS_ERROR(EEXIST); } else { - name_rmt = xfs_attr_leaf_name_remote(leaf, probe); + name_rmt = xfs_attr3_leaf_name_remote(leaf, probe); if (name_rmt->namelen != args->namelen) continue; - if (memcmp(args->name, (char *)name_rmt->name, - args->namelen) != 0) + if (memcmp(args->name, name_rmt->name, + args->namelen) != 0) continue; if (!xfs_attr_namesp_match(args->flags, entry->flags)) continue; @@ -2110,11 +2326,11 @@ xfs_attr_leaf_lookup_int( args->rmtblkno = be32_to_cpu(name_rmt->valueblk); args->rmtblkcnt = XFS_B_TO_FSB(args->dp->i_mount, be32_to_cpu(name_rmt->valuelen)); - return(XFS_ERROR(EEXIST)); + return XFS_ERROR(EEXIST); } } args->index = probe; - return(XFS_ERROR(ENOATTR)); + return XFS_ERROR(ENOATTR); } /* @@ -2122,40 +2338,40 @@ xfs_attr_leaf_lookup_int( * list structure. */ int -xfs_attr_leaf_getvalue( - struct xfs_buf *bp, - xfs_da_args_t *args) +xfs_attr3_leaf_getvalue( + struct xfs_buf *bp, + struct xfs_da_args *args) { - int valuelen; - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_local_t *name_loc; - xfs_attr_leaf_name_remote_t *name_rmt; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_local *name_loc; + struct xfs_attr_leaf_name_remote *name_rmt; + int valuelen; leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(be16_to_cpu(leaf->hdr.count) - < (XFS_LBSIZE(args->dp->i_mount)/8)); - ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); + ASSERT(args->index < ichdr.count); - entry = &leaf->entries[args->index]; + entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf, args->index); + name_loc = xfs_attr3_leaf_name_local(leaf, args->index); ASSERT(name_loc->namelen == args->namelen); ASSERT(memcmp(args->name, name_loc->nameval, args->namelen) == 0); valuelen = be16_to_cpu(name_loc->valuelen); if (args->flags & ATTR_KERNOVAL) { args->valuelen = valuelen; - return(0); + return 0; } if (args->valuelen < valuelen) { args->valuelen = valuelen; - return(XFS_ERROR(ERANGE)); + return XFS_ERROR(ERANGE); } args->valuelen = valuelen; memcpy(args->value, &name_loc->nameval[args->namelen], valuelen); } else { - name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); ASSERT(name_rmt->namelen == args->namelen); ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0); valuelen = be32_to_cpu(name_rmt->valuelen); @@ -2163,15 +2379,15 @@ xfs_attr_leaf_getvalue( args->rmtblkcnt = XFS_B_TO_FSB(args->dp->i_mount, valuelen); if (args->flags & ATTR_KERNOVAL) { args->valuelen = valuelen; - return(0); + return 0; } if (args->valuelen < valuelen) { args->valuelen = valuelen; - return(XFS_ERROR(ERANGE)); + return XFS_ERROR(ERANGE); } args->valuelen = valuelen; } - return(0); + return 0; } /*======================================================================== @@ -2184,13 +2400,21 @@ xfs_attr_leaf_getvalue( */ /*ARGSUSED*/ STATIC void -xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, - xfs_attr_leafblock_t *leaf_d, int start_d, - int count, xfs_mount_t *mp) +xfs_attr3_leaf_moveents( + struct xfs_attr_leafblock *leaf_s, + struct xfs_attr3_icleaf_hdr *ichdr_s, + int start_s, + struct xfs_attr_leafblock *leaf_d, + struct xfs_attr3_icleaf_hdr *ichdr_d, + int start_d, + int count, + struct xfs_mount *mp) { - xfs_attr_leaf_hdr_t *hdr_s, *hdr_d; - xfs_attr_leaf_entry_t *entry_s, *entry_d; - int desti, tmp, i; + struct xfs_attr_leaf_entry *entry_s; + struct xfs_attr_leaf_entry *entry_d; + int desti; + int tmp; + int i; /* * Check for nothing to do. @@ -2201,45 +2425,41 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, /* * Set up environment. */ - ASSERT(leaf_s->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(leaf_d->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - hdr_s = &leaf_s->hdr; - hdr_d = &leaf_d->hdr; - ASSERT((be16_to_cpu(hdr_s->count) > 0) && - (be16_to_cpu(hdr_s->count) < (XFS_LBSIZE(mp)/8))); - ASSERT(be16_to_cpu(hdr_s->firstused) >= - ((be16_to_cpu(hdr_s->count) - * sizeof(*entry_s))+sizeof(*hdr_s))); - ASSERT(be16_to_cpu(hdr_d->count) < (XFS_LBSIZE(mp)/8)); - ASSERT(be16_to_cpu(hdr_d->firstused) >= - ((be16_to_cpu(hdr_d->count) - * sizeof(*entry_d))+sizeof(*hdr_d))); - - ASSERT(start_s < be16_to_cpu(hdr_s->count)); - ASSERT(start_d <= be16_to_cpu(hdr_d->count)); - ASSERT(count <= be16_to_cpu(hdr_s->count)); + ASSERT(ichdr_s->magic == XFS_ATTR_LEAF_MAGIC || + ichdr_s->magic == XFS_ATTR3_LEAF_MAGIC); + ASSERT(ichdr_s->magic == ichdr_d->magic); + ASSERT(ichdr_s->count > 0 && ichdr_s->count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr_s->firstused >= (ichdr_s->count * sizeof(*entry_s)) + + xfs_attr3_leaf_hdr_size(leaf_s)); + ASSERT(ichdr_d->count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr_d->firstused >= (ichdr_d->count * sizeof(*entry_d)) + + xfs_attr3_leaf_hdr_size(leaf_d)); + + ASSERT(start_s < ichdr_s->count); + ASSERT(start_d <= ichdr_d->count); + ASSERT(count <= ichdr_s->count); + /* * Move the entries in the destination leaf up to make a hole? */ - if (start_d < be16_to_cpu(hdr_d->count)) { - tmp = be16_to_cpu(hdr_d->count) - start_d; + if (start_d < ichdr_d->count) { + tmp = ichdr_d->count - start_d; tmp *= sizeof(xfs_attr_leaf_entry_t); - entry_s = &leaf_d->entries[start_d]; - entry_d = &leaf_d->entries[start_d + count]; - memmove((char *)entry_d, (char *)entry_s, tmp); + entry_s = &xfs_attr3_leaf_entryp(leaf_d)[start_d]; + entry_d = &xfs_attr3_leaf_entryp(leaf_d)[start_d + count]; + memmove(entry_d, entry_s, tmp); } /* * Copy all entry's in the same (sorted) order, * but allocate attribute info packed and in sequence. */ - entry_s = &leaf_s->entries[start_s]; - entry_d = &leaf_d->entries[start_d]; + entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; + entry_d = &xfs_attr3_leaf_entryp(leaf_d)[start_d]; desti = start_d; for (i = 0; i < count; entry_s++, entry_d++, desti++, i++) { - ASSERT(be16_to_cpu(entry_s->nameidx) - >= be16_to_cpu(hdr_s->firstused)); + ASSERT(be16_to_cpu(entry_s->nameidx) >= ichdr_s->firstused); tmp = xfs_attr_leaf_entsize(leaf_s, start_s + i); #ifdef GROT /* @@ -2248,36 +2468,34 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, * off for 6.2, should be revisited later. */ if (entry_s->flags & XFS_ATTR_INCOMPLETE) { /* skip partials? */ - memset(xfs_attr_leaf_name(leaf_s, start_s + i), 0, tmp); - be16_add_cpu(&hdr_s->usedbytes, -tmp); - be16_add_cpu(&hdr_s->count, -1); + memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp); + ichdr_s->usedbytes -= tmp; + ichdr_s->count -= 1; entry_d--; /* to compensate for ++ in loop hdr */ desti--; if ((start_s + i) < offset) result++; /* insertion index adjustment */ } else { #endif /* GROT */ - be16_add_cpu(&hdr_d->firstused, -tmp); + ichdr_d->firstused -= tmp; /* both on-disk, don't endian flip twice */ entry_d->hashval = entry_s->hashval; - /* both on-disk, don't endian flip twice */ - entry_d->nameidx = hdr_d->firstused; + entry_d->nameidx = cpu_to_be16(ichdr_d->firstused); entry_d->flags = entry_s->flags; ASSERT(be16_to_cpu(entry_d->nameidx) + tmp <= XFS_LBSIZE(mp)); - memmove(xfs_attr_leaf_name(leaf_d, desti), - xfs_attr_leaf_name(leaf_s, start_s + i), tmp); + memmove(xfs_attr3_leaf_name(leaf_d, desti), + xfs_attr3_leaf_name(leaf_s, start_s + i), tmp); ASSERT(be16_to_cpu(entry_s->nameidx) + tmp <= XFS_LBSIZE(mp)); - memset(xfs_attr_leaf_name(leaf_s, start_s + i), 0, tmp); - be16_add_cpu(&hdr_s->usedbytes, -tmp); - be16_add_cpu(&hdr_d->usedbytes, tmp); - be16_add_cpu(&hdr_s->count, -1); - be16_add_cpu(&hdr_d->count, 1); - tmp = be16_to_cpu(hdr_d->count) - * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t); - ASSERT(be16_to_cpu(hdr_d->firstused) >= tmp); + memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp); + ichdr_s->usedbytes -= tmp; + ichdr_d->usedbytes += tmp; + ichdr_s->count -= 1; + ichdr_d->count += 1; + tmp = ichdr_d->count * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf_d); + ASSERT(ichdr_d->firstused >= tmp); #ifdef GROT } #endif /* GROT */ @@ -2286,71 +2504,40 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, /* * Zero out the entries we just copied. */ - if (start_s == be16_to_cpu(hdr_s->count)) { + if (start_s == ichdr_s->count) { tmp = count * sizeof(xfs_attr_leaf_entry_t); - entry_s = &leaf_s->entries[start_s]; + entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; ASSERT(((char *)entry_s + tmp) <= ((char *)leaf_s + XFS_LBSIZE(mp))); - memset((char *)entry_s, 0, tmp); + memset(entry_s, 0, tmp); } else { /* * Move the remaining entries down to fill the hole, * then zero the entries at the top. */ - tmp = be16_to_cpu(hdr_s->count) - count; - tmp *= sizeof(xfs_attr_leaf_entry_t); - entry_s = &leaf_s->entries[start_s + count]; - entry_d = &leaf_s->entries[start_s]; - memmove((char *)entry_d, (char *)entry_s, tmp); + tmp = (ichdr_s->count - count) - sizeof(xfs_attr_leaf_entry_t); + entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s + count]; + entry_d = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; + memmove(entry_d, entry_s, tmp); tmp = count * sizeof(xfs_attr_leaf_entry_t); - entry_s = &leaf_s->entries[be16_to_cpu(hdr_s->count)]; + entry_s = &xfs_attr3_leaf_entryp(leaf_s)[ichdr_s->count]; ASSERT(((char *)entry_s + tmp) <= ((char *)leaf_s + XFS_LBSIZE(mp))); - memset((char *)entry_s, 0, tmp); + memset(entry_s, 0, tmp); } /* * Fill in the freemap information */ - hdr_d->freemap[0].base = cpu_to_be16(sizeof(xfs_attr_leaf_hdr_t)); - be16_add_cpu(&hdr_d->freemap[0].base, be16_to_cpu(hdr_d->count) * - sizeof(xfs_attr_leaf_entry_t)); - hdr_d->freemap[0].size = cpu_to_be16(be16_to_cpu(hdr_d->firstused) - - be16_to_cpu(hdr_d->freemap[0].base)); - hdr_d->freemap[1].base = 0; - hdr_d->freemap[2].base = 0; - hdr_d->freemap[1].size = 0; - hdr_d->freemap[2].size = 0; - hdr_s->holes = 1; /* leaf may not be compact */ -} - -/* - * Compare two leaf blocks "order". - * Return 0 unless leaf2 should go before leaf1. - */ -int -xfs_attr_leaf_order( - struct xfs_buf *leaf1_bp, - struct xfs_buf *leaf2_bp) -{ - xfs_attr_leafblock_t *leaf1, *leaf2; - - leaf1 = leaf1_bp->b_addr; - leaf2 = leaf2_bp->b_addr; - ASSERT((leaf1->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)) && - (leaf2->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC))); - if ((be16_to_cpu(leaf1->hdr.count) > 0) && - (be16_to_cpu(leaf2->hdr.count) > 0) && - ((be32_to_cpu(leaf2->entries[0].hashval) < - be32_to_cpu(leaf1->entries[0].hashval)) || - (be32_to_cpu(leaf2->entries[ - be16_to_cpu(leaf2->hdr.count)-1].hashval) < - be32_to_cpu(leaf1->entries[ - be16_to_cpu(leaf1->hdr.count)-1].hashval)))) { - return(1); - } - return(0); + ichdr_d->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_d); + ichdr_d->freemap[0].base += ichdr_d->count * sizeof(xfs_attr_leaf_entry_t); + ichdr_d->freemap[0].size = ichdr_d->firstused - ichdr_d->freemap[0].base; + ichdr_d->freemap[1].base = 0; + ichdr_d->freemap[2].base = 0; + ichdr_d->freemap[1].size = 0; + ichdr_d->freemap[2].size = 0; + ichdr_s->holes = 1; /* leaf may not be compact */ } /* @@ -2361,15 +2548,16 @@ xfs_attr_leaf_lasthash( struct xfs_buf *bp, int *count) { - xfs_attr_leafblock_t *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entries; - leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, bp->b_addr); + entries = xfs_attr3_leaf_entryp(bp->b_addr); if (count) - *count = be16_to_cpu(leaf->hdr.count); - if (!leaf->hdr.count) - return(0); - return be32_to_cpu(leaf->entries[be16_to_cpu(leaf->hdr.count)-1].hashval); + *count = ichdr.count; + if (!ichdr.count) + return 0; + return be32_to_cpu(entries[ichdr.count - 1].hashval); } /* @@ -2379,20 +2567,21 @@ xfs_attr_leaf_lasthash( STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) { + struct xfs_attr_leaf_entry *entries; xfs_attr_leaf_name_local_t *name_loc; xfs_attr_leaf_name_remote_t *name_rmt; int size; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - if (leaf->entries[index].flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf, index); + entries = xfs_attr3_leaf_entryp(leaf); + if (entries[index].flags & XFS_ATTR_LOCAL) { + name_loc = xfs_attr3_leaf_name_local(leaf, index); size = xfs_attr_leaf_entsize_local(name_loc->namelen, be16_to_cpu(name_loc->valuelen)); } else { - name_rmt = xfs_attr_leaf_name_remote(leaf, index); + name_rmt = xfs_attr3_leaf_name_remote(leaf, index); size = xfs_attr_leaf_entsize_remote(name_rmt->namelen); } - return(size); + return size; } /* @@ -2417,35 +2606,40 @@ xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local) *local = 0; } } - return(size); + return size; } /* * Copy out attribute list entries for attr_list(), for leaf attribute lists. */ int -xfs_attr_leaf_list_int( - struct xfs_buf *bp, - xfs_attr_list_context_t *context) +xfs_attr3_leaf_list_int( + struct xfs_buf *bp, + struct xfs_attr_list_context *context) { - attrlist_cursor_kern_t *cursor; - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - int retval, i; + struct attrlist_cursor_kern *cursor; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entries; + struct xfs_attr_leaf_entry *entry; + int retval; + int i; + + trace_xfs_attr_list_leaf(context); - ASSERT(bp != NULL); leaf = bp->b_addr; + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + entries = xfs_attr3_leaf_entryp(leaf); + cursor = context->cursor; cursor->initted = 1; - trace_xfs_attr_list_leaf(context); - /* * Re-find our place in the leaf block if this is a new syscall. */ if (context->resynch) { - entry = &leaf->entries[0]; - for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { + entry = &entries[0]; + for (i = 0; i < ichdr.count; entry++, i++) { if (be32_to_cpu(entry->hashval) == cursor->hashval) { if (cursor->offset == context->dupcnt) { context->dupcnt = 0; @@ -2458,12 +2652,12 @@ xfs_attr_leaf_list_int( break; } } - if (i == be16_to_cpu(leaf->hdr.count)) { + if (i == ichdr.count) { trace_xfs_attr_list_notfound(context); - return(0); + return 0; } } else { - entry = &leaf->entries[0]; + entry = &entries[0]; i = 0; } context->resynch = 0; @@ -2472,7 +2666,7 @@ xfs_attr_leaf_list_int( * We have found our place, start copying out the new attributes. */ retval = 0; - for ( ; (i < be16_to_cpu(leaf->hdr.count)); entry++, i++) { + for (; i < ichdr.count; entry++, i++) { if (be32_to_cpu(entry->hashval) != cursor->hashval) { cursor->hashval = be32_to_cpu(entry->hashval); cursor->offset = 0; @@ -2483,7 +2677,7 @@ xfs_attr_leaf_list_int( if (entry->flags & XFS_ATTR_LOCAL) { xfs_attr_leaf_name_local_t *name_loc = - xfs_attr_leaf_name_local(leaf, i); + xfs_attr3_leaf_name_local(leaf, i); retval = context->put_listent(context, entry->flags, @@ -2495,7 +2689,7 @@ xfs_attr_leaf_list_int( return retval; } else { xfs_attr_leaf_name_remote_t *name_rmt = - xfs_attr_leaf_name_remote(leaf, i); + xfs_attr3_leaf_name_remote(leaf, i); int valuelen = be32_to_cpu(name_rmt->valuelen); @@ -2535,7 +2729,7 @@ xfs_attr_leaf_list_int( cursor->offset++; } trace_xfs_attr_list_leaf_end(context); - return(retval); + return retval; } @@ -2547,14 +2741,16 @@ xfs_attr_leaf_list_int( * Clear the INCOMPLETE flag on an entry in a leaf block. */ int -xfs_attr_leaf_clearflag(xfs_da_args_t *args) +xfs_attr3_leaf_clearflag( + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_remote_t *name_rmt; - struct xfs_buf *bp; - int error; + struct xfs_attr_leafblock *leaf; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_buf *bp; + int error; #ifdef DEBUG + struct xfs_attr3_icleaf_hdr ichdr; xfs_attr_leaf_name_local_t *name_loc; int namelen; char *name; @@ -2564,23 +2760,25 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) /* * Set up the operation. */ - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return(error); leaf = bp->b_addr; - ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); - ASSERT(args->index >= 0); - entry = &leaf->entries[ args->index ]; + entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; ASSERT(entry->flags & XFS_ATTR_INCOMPLETE); #ifdef DEBUG + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + ASSERT(args->index < ichdr.count); + ASSERT(args->index >= 0); + if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf, args->index); + name_loc = xfs_attr3_leaf_name_local(leaf, args->index); namelen = name_loc->namelen; name = (char *)name_loc->nameval; } else { - name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); namelen = name_rmt->namelen; name = (char *)name_rmt->name; } @@ -2595,7 +2793,7 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) if (args->rmtblkno) { ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0); - name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); name_rmt->valuelen = cpu_to_be32(args->valuelen); xfs_trans_log_buf(args->trans, bp, @@ -2612,34 +2810,41 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) * Set the INCOMPLETE flag on an entry in a leaf block. */ int -xfs_attr_leaf_setflag(xfs_da_args_t *args) +xfs_attr3_leaf_setflag( + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_remote_t *name_rmt; - struct xfs_buf *bp; + struct xfs_attr_leafblock *leaf; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_buf *bp; int error; +#ifdef DEBUG + struct xfs_attr3_icleaf_hdr ichdr; +#endif trace_xfs_attr_leaf_setflag(args); /* * Set up the operation. */ - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return(error); leaf = bp->b_addr; - ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); +#ifdef DEBUG + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + ASSERT(args->index < ichdr.count); ASSERT(args->index >= 0); - entry = &leaf->entries[ args->index ]; +#endif + entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; ASSERT((entry->flags & XFS_ATTR_INCOMPLETE) == 0); entry->flags |= XFS_ATTR_INCOMPLETE; xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); if ((entry->flags & XFS_ATTR_LOCAL) == 0) { - name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); name_rmt->valueblk = 0; name_rmt->valuelen = 0; xfs_trans_log_buf(args->trans, bp, @@ -2660,14 +2865,20 @@ xfs_attr_leaf_setflag(xfs_da_args_t *args) * Note that they could be in different blocks, or in the same block. */ int -xfs_attr_leaf_flipflags(xfs_da_args_t *args) +xfs_attr3_leaf_flipflags( + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf1, *leaf2; - xfs_attr_leaf_entry_t *entry1, *entry2; - xfs_attr_leaf_name_remote_t *name_rmt; - struct xfs_buf *bp1, *bp2; + struct xfs_attr_leafblock *leaf1; + struct xfs_attr_leafblock *leaf2; + struct xfs_attr_leaf_entry *entry1; + struct xfs_attr_leaf_entry *entry2; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_buf *bp1; + struct xfs_buf *bp2; int error; #ifdef DEBUG + struct xfs_attr3_icleaf_hdr ichdr1; + struct xfs_attr3_icleaf_hdr ichdr2; xfs_attr_leaf_name_local_t *name_loc; int namelen1, namelen2; char *name1, *name2; @@ -2678,7 +2889,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) /* * Read the block containing the "old" attr */ - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp1); + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp1); if (error) return error; @@ -2686,7 +2897,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) * Read the block containing the "new" attr, if it is different */ if (args->blkno2 != args->blkno) { - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno2, + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno2, -1, &bp2); if (error) return error; @@ -2695,31 +2906,35 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) } leaf1 = bp1->b_addr; - ASSERT(args->index < be16_to_cpu(leaf1->hdr.count)); - ASSERT(args->index >= 0); - entry1 = &leaf1->entries[ args->index ]; + entry1 = &xfs_attr3_leaf_entryp(leaf1)[args->index]; leaf2 = bp2->b_addr; - ASSERT(args->index2 < be16_to_cpu(leaf2->hdr.count)); - ASSERT(args->index2 >= 0); - entry2 = &leaf2->entries[ args->index2 ]; + entry2 = &xfs_attr3_leaf_entryp(leaf2)[args->index2]; #ifdef DEBUG + xfs_attr3_leaf_hdr_from_disk(&ichdr1, leaf1); + ASSERT(args->index < ichdr1.count); + ASSERT(args->index >= 0); + + xfs_attr3_leaf_hdr_from_disk(&ichdr2, leaf2); + ASSERT(args->index2 < ichdr2.count); + ASSERT(args->index2 >= 0); + if (entry1->flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf1, args->index); + name_loc = xfs_attr3_leaf_name_local(leaf1, args->index); namelen1 = name_loc->namelen; name1 = (char *)name_loc->nameval; } else { - name_rmt = xfs_attr_leaf_name_remote(leaf1, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index); namelen1 = name_rmt->namelen; name1 = (char *)name_rmt->name; } if (entry2->flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf2, args->index2); + name_loc = xfs_attr3_leaf_name_local(leaf2, args->index2); namelen2 = name_loc->namelen; name2 = (char *)name_loc->nameval; } else { - name_rmt = xfs_attr_leaf_name_remote(leaf2, args->index2); + name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2); namelen2 = name_rmt->namelen; name2 = (char *)name_rmt->name; } @@ -2736,7 +2951,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) XFS_DA_LOGRANGE(leaf1, entry1, sizeof(*entry1))); if (args->rmtblkno) { ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0); - name_rmt = xfs_attr_leaf_name_remote(leaf1, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); name_rmt->valuelen = cpu_to_be32(args->valuelen); xfs_trans_log_buf(args->trans, bp1, @@ -2747,7 +2962,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) xfs_trans_log_buf(args->trans, bp2, XFS_DA_LOGRANGE(leaf2, entry2, sizeof(*entry2))); if ((entry2->flags & XFS_ATTR_LOCAL) == 0) { - name_rmt = xfs_attr_leaf_name_remote(leaf2, args->index2); + name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2); name_rmt->valueblk = 0; name_rmt->valuelen = 0; xfs_trans_log_buf(args->trans, bp2, @@ -2759,7 +2974,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) */ error = xfs_trans_roll(&args->trans, args->dp); - return(error); + return error; } /*======================================================================== @@ -2771,12 +2986,14 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) * We're doing a depth-first traversal in order to invalidate everything. */ int -xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp) +xfs_attr3_root_inactive( + struct xfs_trans **trans, + struct xfs_inode *dp) { - xfs_da_blkinfo_t *info; - xfs_daddr_t blkno; - struct xfs_buf *bp; - int error; + struct xfs_da_blkinfo *info; + struct xfs_buf *bp; + xfs_daddr_t blkno; + int error; /* * Read block 0 to see what we have to work with. @@ -2786,38 +3003,44 @@ xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp) */ error = xfs_da3_node_read(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK); if (error) - return(error); - blkno = XFS_BUF_ADDR(bp); + return error; + blkno = bp->b_bn; /* * Invalidate the tree, even if the "tree" is only a single leaf block. * This is a depth-first traversal! */ info = bp->b_addr; - if (info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)) { - error = xfs_attr_node_inactive(trans, dp, bp, 1); - } else if (info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)) { - error = xfs_attr_leaf_inactive(trans, dp, bp); - } else { + switch (info->magic) { + case cpu_to_be16(XFS_DA_NODE_MAGIC): + case cpu_to_be16(XFS_DA3_NODE_MAGIC): + error = xfs_attr3_node_inactive(trans, dp, bp, 1); + break; + case cpu_to_be16(XFS_ATTR_LEAF_MAGIC): + case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC): + error = xfs_attr3_leaf_inactive(trans, dp, bp); + break; + default: error = XFS_ERROR(EIO); xfs_trans_brelse(*trans, bp); + break; } if (error) - return(error); + return error; /* * Invalidate the incore copy of the root block. */ error = xfs_da_get_buf(*trans, dp, 0, blkno, &bp, XFS_ATTR_FORK); if (error) - return(error); + return error; xfs_trans_binval(*trans, bp); /* remove from cache */ /* * Commit the invalidate and start the next transaction. */ error = xfs_trans_roll(trans, dp); - return (error); + return error; } /* @@ -2825,7 +3048,7 @@ xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp) * We're doing a depth-first traversal in order to invalidate everything. */ STATIC int -xfs_attr_node_inactive( +xfs_attr3_node_inactive( struct xfs_trans **trans, struct xfs_inode *dp, struct xfs_buf *bp, @@ -2835,25 +3058,25 @@ xfs_attr_node_inactive( xfs_da_intnode_t *node; xfs_dablk_t child_fsb; xfs_daddr_t parent_blkno, child_blkno; - int error, count, i; + int error, i; struct xfs_buf *child_bp; struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr ichdr; /* * Since this code is recursive (gasp!) we must protect ourselves. */ if (level > XFS_DA_NODE_MAXDEPTH) { xfs_trans_brelse(*trans, bp); /* no locks for later trans */ - return(XFS_ERROR(EIO)); + return XFS_ERROR(EIO); } node = bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - parent_blkno = XFS_BUF_ADDR(bp); /* save for re-read later */ - count = be16_to_cpu(node->hdr.count); - if (!count) { + xfs_da3_node_hdr_from_disk(&ichdr, node); + parent_blkno = bp->b_bn; + if (!ichdr.count) { xfs_trans_brelse(*trans, bp); - return(0); + return 0; } btree = xfs_da3_node_tree_p(node); child_fsb = be32_to_cpu(btree[0].before); @@ -2864,7 +3087,7 @@ xfs_attr_node_inactive( * over the leaves removing all of them. If this is higher up * in the tree, recurse downward. */ - for (i = 0; i < count; i++) { + for (i = 0; i < ichdr.count; i++) { /* * Read the subsidiary block to see what we have to work with. * Don't do this in a transaction. This is a depth-first @@ -2883,18 +3106,24 @@ xfs_attr_node_inactive( * Invalidate the subtree, however we have to. */ info = child_bp->b_addr; - if (info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)) { - error = xfs_attr_node_inactive(trans, dp, - child_bp, level+1); - } else if (info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)) { - error = xfs_attr_leaf_inactive(trans, dp, - child_bp); - } else { + switch (info->magic) { + case cpu_to_be16(XFS_DA_NODE_MAGIC): + case cpu_to_be16(XFS_DA3_NODE_MAGIC): + error = xfs_attr3_node_inactive(trans, dp, + child_bp, level + 1); + break; + case cpu_to_be16(XFS_ATTR_LEAF_MAGIC): + case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC): + error = xfs_attr3_leaf_inactive(trans, dp, + child_bp); + break; + default: error = XFS_ERROR(EIO); xfs_trans_brelse(*trans, child_bp); + break; } if (error) - return(error); + return error; /* * Remove the subsidiary block from the cache @@ -2903,7 +3132,7 @@ xfs_attr_node_inactive( error = xfs_da_get_buf(*trans, dp, 0, child_blkno, &child_bp, XFS_ATTR_FORK); if (error) - return(error); + return error; xfs_trans_binval(*trans, child_bp); } @@ -2911,12 +3140,12 @@ xfs_attr_node_inactive( * If we're not done, re-read the parent to get the next * child block number. */ - if ((i+1) < count) { + if (i + 1 < ichdr.count) { error = xfs_da3_node_read(*trans, dp, 0, parent_blkno, &bp, XFS_ATTR_FORK); if (error) - return(error); - child_fsb = be32_to_cpu(btree[i+1].before); + return error; + child_fsb = be32_to_cpu(btree[i + 1].before); xfs_trans_brelse(*trans, bp); } /* @@ -2924,10 +3153,10 @@ xfs_attr_node_inactive( */ error = xfs_trans_roll(trans, dp); if (error) - return (error); + return error; } - return(0); + return 0; } /* @@ -2937,29 +3166,35 @@ xfs_attr_node_inactive( * caught holding something that the logging code wants to flush to disk. */ STATIC int -xfs_attr_leaf_inactive( - struct xfs_trans **trans, - struct xfs_inode *dp, - struct xfs_buf *bp) +xfs_attr3_leaf_inactive( + struct xfs_trans **trans, + struct xfs_inode *dp, + struct xfs_buf *bp) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_remote_t *name_rmt; - xfs_attr_inactive_list_t *list, *lp; - int error, count, size, tmp, i; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_attr_inactive_list *list; + struct xfs_attr_inactive_list *lp; + int error; + int count; + int size; + int tmp; + int i; leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); /* * Count the number of "remote" value extents. */ count = 0; - entry = &leaf->entries[0]; - for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { + entry = xfs_attr3_leaf_entryp(leaf); + for (i = 0; i < ichdr.count; entry++, i++) { if (be16_to_cpu(entry->nameidx) && ((entry->flags & XFS_ATTR_LOCAL) == 0)) { - name_rmt = xfs_attr_leaf_name_remote(leaf, i); + name_rmt = xfs_attr3_leaf_name_remote(leaf, i); if (name_rmt->valueblk) count++; } @@ -2970,24 +3205,24 @@ xfs_attr_leaf_inactive( */ if (count == 0) { xfs_trans_brelse(*trans, bp); - return(0); + return 0; } /* * Allocate storage for a list of all the "remote" value extents. */ size = count * sizeof(xfs_attr_inactive_list_t); - list = (xfs_attr_inactive_list_t *)kmem_alloc(size, KM_SLEEP); + list = kmem_alloc(size, KM_SLEEP); /* * Identify each of the "remote" value extents. */ lp = list; - entry = &leaf->entries[0]; - for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { + entry = xfs_attr3_leaf_entryp(leaf); + for (i = 0; i < ichdr.count; entry++, i++) { if (be16_to_cpu(entry->nameidx) && ((entry->flags & XFS_ATTR_LOCAL) == 0)) { - name_rmt = xfs_attr_leaf_name_remote(leaf, i); + name_rmt = xfs_attr3_leaf_name_remote(leaf, i); if (name_rmt->valueblk) { lp->valueblk = be32_to_cpu(name_rmt->valueblk); lp->valuelen = XFS_B_TO_FSB(dp->i_mount, @@ -3003,15 +3238,15 @@ xfs_attr_leaf_inactive( */ error = 0; for (lp = list, i = 0; i < count; i++, lp++) { - tmp = xfs_attr_leaf_freextent(trans, dp, + tmp = xfs_attr3_leaf_freextent(trans, dp, lp->valueblk, lp->valuelen); if (error == 0) error = tmp; /* save only the 1st errno */ } - kmem_free((xfs_caddr_t)list); - return(error); + kmem_free(list); + return error; } /* @@ -3019,14 +3254,20 @@ xfs_attr_leaf_inactive( * invalidate any buffers that are incore/in transactions. */ STATIC int -xfs_attr_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp, - xfs_dablk_t blkno, int blkcnt) +xfs_attr3_leaf_freextent( + struct xfs_trans **trans, + struct xfs_inode *dp, + xfs_dablk_t blkno, + int blkcnt) { - xfs_bmbt_irec_t map; - xfs_dablk_t tblkno; - int tblkcnt, dblkcnt, nmap, error; - xfs_daddr_t dblkno; - xfs_buf_t *bp; + struct xfs_bmbt_irec map; + struct xfs_buf *bp; + xfs_dablk_t tblkno; + xfs_daddr_t dblkno; + int tblkcnt; + int dblkcnt; + int nmap; + int error; /* * Roll through the "value", invalidating the attribute value's diff --git a/fs/xfs/xfs_attr_leaf.h b/fs/xfs/xfs_attr_leaf.h index 77de139..f9d7846 100644 --- a/fs/xfs/xfs_attr_leaf.h +++ b/fs/xfs/xfs_attr_leaf.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2000,2002-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -89,7 +90,7 @@ typedef struct xfs_attr_leaf_hdr { /* constant-structure header block */ typedef struct xfs_attr_leaf_entry { /* sorted on key, not name */ __be32 hashval; /* hash value of name */ - __be16 nameidx; /* index into buffer of name/value */ + __be16 nameidx; /* index into buffer of name/value */ __u8 flags; /* LOCAL/ROOT/SECURE/INCOMPLETE flag */ __u8 pad2; /* unused pad byte */ } xfs_attr_leaf_entry_t; @@ -115,6 +116,54 @@ typedef struct xfs_attr_leafblock { } xfs_attr_leafblock_t; /* + * CRC enabled leaf structures. Called "version 3" structures to match the + * version number of the directory and dablk structures for this feature, and + * attr2 is already taken by the variable inode attribute fork size feature. + */ +struct xfs_attr3_leaf_hdr { + struct xfs_da3_blkinfo info; + __be16 count; + __be16 usedbytes; + __be16 firstused; + __u8 holes; + __u8 pad1; + struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE]; +}; + +#define XFS_ATTR3_LEAF_CRC_OFF (offsetof(struct xfs_attr3_leaf_hdr, info.crc)) + +struct xfs_attr3_leafblock { + struct xfs_attr3_leaf_hdr hdr; + struct xfs_attr_leaf_entry entries[1]; + + /* + * The rest of the block contains the following structures after the + * leaf entries, growing from the bottom up. The variables are never + * referenced, the locations accessed purely from helper functions. + * + * struct xfs_attr_leaf_name_local + * struct xfs_attr_leaf_name_remote + */ +}; + +/* + * incore, neutral version of the attribute leaf header + */ +struct xfs_attr3_icleaf_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t usedbytes; + __uint16_t firstused; + __u8 holes; + struct { + __uint16_t base; + __uint16_t size; + } freemap[XFS_ATTR_LEAF_MAPSIZE]; +}; + +/* * Flags used in the leaf_entry[i].flags field. * NOTE: the INCOMPLETE bit must not collide with the flags bits specified * on the system call, they are "or"ed together for various operations. @@ -147,26 +196,43 @@ typedef struct xfs_attr_leafblock { */ #define XFS_ATTR_LEAF_NAME_ALIGN ((uint)sizeof(xfs_dablk_t)) +static inline int +xfs_attr3_leaf_hdr_size(struct xfs_attr_leafblock *leafp) +{ + if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) + return sizeof(struct xfs_attr3_leaf_hdr); + return sizeof(struct xfs_attr_leaf_hdr); +} + +static inline struct xfs_attr_leaf_entry * +xfs_attr3_leaf_entryp(xfs_attr_leafblock_t *leafp) +{ + if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) + return &((struct xfs_attr3_leafblock *)leafp)->entries[0]; + return &leafp->entries[0]; +} + /* * Cast typed pointers for "local" and "remote" name/value structs. */ -static inline xfs_attr_leaf_name_remote_t * -xfs_attr_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) +static inline char * +xfs_attr3_leaf_name(xfs_attr_leafblock_t *leafp, int idx) { - return (xfs_attr_leaf_name_remote_t *) - &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; + struct xfs_attr_leaf_entry *entries = xfs_attr3_leaf_entryp(leafp); + + return &((char *)leafp)[be16_to_cpu(entries[idx].nameidx)]; } -static inline xfs_attr_leaf_name_local_t * -xfs_attr_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) +static inline xfs_attr_leaf_name_remote_t * +xfs_attr3_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) { - return (xfs_attr_leaf_name_local_t *) - &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; + return (xfs_attr_leaf_name_remote_t *)xfs_attr3_leaf_name(leafp, idx); } -static inline char *xfs_attr_leaf_name(xfs_attr_leafblock_t *leafp, int idx) +static inline xfs_attr_leaf_name_local_t * +xfs_attr3_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) { - return &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; + return (xfs_attr_leaf_name_local_t *)xfs_attr3_leaf_name(leafp, idx); } /* @@ -221,37 +287,37 @@ int xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes); /* * Internal routines when attribute fork size == XFS_LBSIZE(mp). */ -int xfs_attr_leaf_to_node(struct xfs_da_args *args); -int xfs_attr_leaf_to_shortform(struct xfs_buf *bp, +int xfs_attr3_leaf_to_node(struct xfs_da_args *args); +int xfs_attr3_leaf_to_shortform(struct xfs_buf *bp, struct xfs_da_args *args, int forkoff); -int xfs_attr_leaf_clearflag(struct xfs_da_args *args); -int xfs_attr_leaf_setflag(struct xfs_da_args *args); -int xfs_attr_leaf_flipflags(xfs_da_args_t *args); +int xfs_attr3_leaf_clearflag(struct xfs_da_args *args); +int xfs_attr3_leaf_setflag(struct xfs_da_args *args); +int xfs_attr3_leaf_flipflags(struct xfs_da_args *args); /* * Routines used for growing the Btree. */ -int xfs_attr_leaf_split(struct xfs_da_state *state, +int xfs_attr3_leaf_split(struct xfs_da_state *state, struct xfs_da_state_blk *oldblk, struct xfs_da_state_blk *newblk); -int xfs_attr_leaf_lookup_int(struct xfs_buf *leaf, +int xfs_attr3_leaf_lookup_int(struct xfs_buf *leaf, struct xfs_da_args *args); -int xfs_attr_leaf_getvalue(struct xfs_buf *bp, struct xfs_da_args *args); -int xfs_attr_leaf_add(struct xfs_buf *leaf_buffer, +int xfs_attr3_leaf_getvalue(struct xfs_buf *bp, struct xfs_da_args *args); +int xfs_attr3_leaf_add(struct xfs_buf *leaf_buffer, struct xfs_da_args *args); -int xfs_attr_leaf_remove(struct xfs_buf *leaf_buffer, +int xfs_attr3_leaf_remove(struct xfs_buf *leaf_buffer, struct xfs_da_args *args); -int xfs_attr_leaf_list_int(struct xfs_buf *bp, +int xfs_attr3_leaf_list_int(struct xfs_buf *bp, struct xfs_attr_list_context *context); /* * Routines used for shrinking the Btree. */ -int xfs_attr_leaf_toosmall(struct xfs_da_state *state, int *retval); -void xfs_attr_leaf_unbalance(struct xfs_da_state *state, +int xfs_attr3_leaf_toosmall(struct xfs_da_state *state, int *retval); +void xfs_attr3_leaf_unbalance(struct xfs_da_state *state, struct xfs_da_state_blk *drop_blk, struct xfs_da_state_blk *save_blk); -int xfs_attr_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp); +int xfs_attr3_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp); /* * Utility routines. @@ -261,10 +327,12 @@ int xfs_attr_leaf_order(struct xfs_buf *leaf1_bp, struct xfs_buf *leaf2_bp); int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local); -int xfs_attr_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, +int xfs_attr3_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp); +void xfs_attr3_leaf_hdr_from_disk(struct xfs_attr3_icleaf_hdr *to, + struct xfs_attr_leafblock *from); -extern const struct xfs_buf_ops xfs_attr_leaf_buf_ops; +extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; #endif /* __XFS_ATTR_LEAF_H__ */ diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 2274994..2b7c9f6 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -143,14 +143,14 @@ xfs_da3_node_hdr_from_disk( to->forw = be32_to_cpu(hdr3->info.hdr.forw); to->back = be32_to_cpu(hdr3->info.hdr.back); to->magic = be16_to_cpu(hdr3->info.hdr.magic); - to->count = be16_to_cpu(hdr3->count); + to->count = be16_to_cpu(hdr3->__count); to->level = be16_to_cpu(hdr3->__level); return; } to->forw = be32_to_cpu(from->hdr.info.forw); to->back = be32_to_cpu(from->hdr.info.back); to->magic = be16_to_cpu(from->hdr.info.magic); - to->count = be16_to_cpu(from->hdr.count); + to->count = be16_to_cpu(from->hdr.__count); to->level = be16_to_cpu(from->hdr.__level); } @@ -168,14 +168,14 @@ xfs_da3_node_hdr_to_disk( hdr3->info.hdr.forw = cpu_to_be32(from->forw); hdr3->info.hdr.back = cpu_to_be32(from->back); hdr3->info.hdr.magic = cpu_to_be16(from->magic); - hdr3->count = cpu_to_be16(from->count); + hdr3->__count = cpu_to_be16(from->count); hdr3->__level = cpu_to_be16(from->level); return; } to->hdr.info.forw = cpu_to_be32(from->forw); to->hdr.info.back = cpu_to_be32(from->back); to->hdr.info.magic = cpu_to_be16(from->magic); - to->hdr.count = cpu_to_be16(from->count); + to->hdr.__count = cpu_to_be16(from->count); to->hdr.__level = cpu_to_be16(from->level); } @@ -270,7 +270,7 @@ xfs_da3_node_read_verify( break; return; case XFS_ATTR_LEAF_MAGIC: - bp->b_ops = &xfs_attr_leaf_buf_ops; + bp->b_ops = &xfs_attr3_leaf_buf_ops; bp->b_ops->verify_read(bp); return; case XFS_DIR2_LEAFN_MAGIC: @@ -401,7 +401,7 @@ xfs_da3_split( */ switch (oldblk->magic) { case XFS_ATTR_LEAF_MAGIC: - error = xfs_attr_leaf_split(state, oldblk, newblk); + error = xfs_attr3_leaf_split(state, oldblk, newblk); if ((error != 0) && (error != ENOSPC)) { return(error); /* GROT: attr is inconsistent */ } @@ -416,12 +416,12 @@ xfs_da3_split( if (state->inleaf) { state->extraafter = 0; /* before newblk */ trace_xfs_attr_leaf_split_before(state->args); - error = xfs_attr_leaf_split(state, oldblk, + error = xfs_attr3_leaf_split(state, oldblk, &state->extrablk); } else { state->extraafter = 1; /* after newblk */ trace_xfs_attr_leaf_split_after(state->args); - error = xfs_attr_leaf_split(state, newblk, + error = xfs_attr3_leaf_split(state, newblk, &state->extrablk); } if (error) @@ -961,12 +961,12 @@ xfs_da3_join( */ switch (drop_blk->magic) { case XFS_ATTR_LEAF_MAGIC: - error = xfs_attr_leaf_toosmall(state, &action); + error = xfs_attr3_leaf_toosmall(state, &action); if (error) return(error); if (action == 0) return(0); - xfs_attr_leaf_unbalance(state, drop_blk, save_blk); + xfs_attr3_leaf_unbalance(state, drop_blk, save_blk); break; case XFS_DIR2_LEAFN_MAGIC: error = xfs_dir2_leafn_toosmall(state, &action); @@ -1022,7 +1022,8 @@ xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level) if (level == 1) { ASSERT(magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || - magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) || + magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)); } else { ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); @@ -1479,7 +1480,9 @@ xfs_da3_node_lookup_int( curr = blk->bp->b_addr; blk->magic = be16_to_cpu(curr->magic); - if (blk->magic == XFS_ATTR_LEAF_MAGIC) { + if (blk->magic == XFS_ATTR_LEAF_MAGIC || + blk->magic == XFS_ATTR3_LEAF_MAGIC) { + blk->magic = XFS_ATTR_LEAF_MAGIC; blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL); break; } @@ -1559,7 +1562,7 @@ xfs_da3_node_lookup_int( retval = xfs_dir2_leafn_lookup_int(blk->bp, args, &blk->index, state); } else if (blk->magic == XFS_ATTR_LEAF_MAGIC) { - retval = xfs_attr_leaf_lookup_int(blk->bp, args); + retval = xfs_attr3_leaf_lookup_int(blk->bp, args); blk->index = args->index; args->blkno = blk->blkno; } else { @@ -1871,7 +1874,8 @@ xfs_da3_path_shift( info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) || info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || - info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) || + info->magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)); /* @@ -1893,6 +1897,7 @@ xfs_da3_path_shift( blkno = be32_to_cpu(btree[blk->index].before); break; case XFS_ATTR_LEAF_MAGIC: + case XFS_ATTR3_LEAF_MAGIC: blk->magic = XFS_ATTR_LEAF_MAGIC; ASSERT(level == path->active-1); blk->index = 0; @@ -2625,6 +2630,7 @@ xfs_da_read_buf( XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && (magic != XFS_DA3_NODE_MAGIC) && (magic != XFS_ATTR_LEAF_MAGIC) && + (magic != XFS_ATTR3_LEAF_MAGIC) && (magic != XFS_DIR2_LEAF1_MAGIC) && (magic != XFS_DIR3_LEAF1_MAGIC) && (magic != XFS_DIR2_LEAFN_MAGIC) && diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 6bedb3c..0e8182c 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -55,6 +55,7 @@ typedef struct xfs_da_blkinfo { * magic numbers without modification for both v2 and v3 nodes. */ #define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */ +#define XFS_ATTR3_LEAF_MAGIC 0x3bee /* magic number: attribute leaf blks */ #define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */ #define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ @@ -85,13 +86,13 @@ struct xfs_da3_blkinfo { typedef struct xfs_da_node_hdr { struct xfs_da_blkinfo info; /* block type, links, etc. */ - __be16 count; /* count of active entries */ + __be16 __count; /* count of active entries */ __be16 __level; /* level above leaves (leaf == 0) */ } xfs_da_node_hdr_t; struct xfs_da3_node_hdr { struct xfs_da3_blkinfo info; /* block type, links, etc. */ - __be16 count; /* count of active entries */ + __be16 __count; /* count of active entries */ __be16 __level; /* level above leaves (leaf == 0) */ __be32 __pad32; }; -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5E10529E13 for ; Wed, 3 Apr 2013 00:12:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4CD788F804C for ; Tue, 2 Apr 2013 22:12:46 -0700 (PDT) X-ASG-Debug-ID: 1364965963-04cb6c1e79196c70001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id MJ8F3W2FR2ioWyii for ; Tue, 02 Apr 2013 22:12:44 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:42:12 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzW-0000MJ-Ru for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:12:10 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFzH-0005CR-On for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 22/22] xfs: implement extended feature masks Date: Wed, 3 Apr 2013 16:11:32 +1100 X-ASG-Orig-Subj: [PATCH 22/22] xfs: implement extended feature masks Message-Id: <1364965892-19623-23-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965963 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The version 5 superblock has extended feature masks for compatible, incompatible and read-only compatible feature sets. Implement the masking and mount-time checking for these feature masks. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 19 +++++++++++++ fs/xfs/xfs_mount.c | 48 +++++++++++++++++++++++++++---- fs/xfs/xfs_sb.h | 70 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 129 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 5303b3d..35ac504 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3959,6 +3959,25 @@ xlog_recover( return error; } + /* + * Version 5 superblock log feature mask validation. We know the + * log is dirty so check if there are any unknown log features + * in what we need to recover. If there are unknown features + * (e.g. unsupported transactions, then simply reject the + * attempt at recovery before touching anything. + */ + if (XFS_SB_VERSION_NUM(&log->l_mp->m_sb) == XFS_SB_VERSION_5 && + xfs_sb_has_incompat_log_feature(&log->l_mp->m_sb, + XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN)) { + xfs_warn(log->l_mp, +"Superblock has unknown incompatible log features (0x%x) enabled.\n" +"The log can not be fully and/or safely recovered by this kernel.\n" +"Please recover the log on a kernel that supports the unknown features.", + (log->l_mp->m_sb.sb_features_log_incompat & + XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN)); + return EINVAL; + } + xfs_notice(log->l_mp, "Starting recovery (logdev: %s)", log->l_mp->m_logname ? log->l_mp->m_logname : "internal"); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 140136c..f6bfbd7 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -114,7 +114,9 @@ static const struct { { offsetof(xfs_sb_t, sb_features_compat), 0 }, { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, { offsetof(xfs_sb_t, sb_features_incompat), 0 }, + { offsetof(xfs_sb_t, sb_features_log_incompat), 0 }, { offsetof(xfs_sb_t, sb_crc), 0 }, + { offsetof(xfs_sb_t, sb_pad), 0 }, { offsetof(xfs_sb_t, sb_pquotino), 0 }, { offsetof(xfs_sb_t, sb_lsn), 0 }, { sizeof(xfs_sb_t), 0 } @@ -334,14 +336,45 @@ xfs_mount_validate_sb( } /* - * Do not allow Version 5 superblocks to mount right now, even though - * support is in place. We need to implement the proper feature masks - * first. + * Version 5 superblock feature mask validation. Reject combinations the + * kernel cannot support up front before checking anything else. */ if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) { xfs_alert(mp, - "Version 5 superblock detected. Experimental support not yet enabled!"); - return XFS_ERROR(EINVAL); +"Version 5 superblock detected. This kernel has EXPERIMENTAL support enabled!\n" +"Use of these features in this kernel is at your own risk!"); + + if (xfs_sb_has_compat_feature(sbp, + XFS_SB_FEAT_COMPAT_UNKNOWN)) { + xfs_warn(mp, +"Superblock has unknown compatible features (0x%x) enabled.\n" +"Using a more recent kernel is recommended.", + (sbp->sb_features_compat & + XFS_SB_FEAT_COMPAT_UNKNOWN)); + } + + if (xfs_sb_has_ro_compat_feature(sbp, + XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) { + xfs_alert(mp, +"Superblock has unknown read-only compatible features (0x%x) enabled.", + (sbp->sb_features_ro_compat & + XFS_SB_FEAT_RO_COMPAT_UNKNOWN)); + if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { + xfs_warn(mp, +"Attempted to mount read-only compatible filesystem read-write.\n" +"Filesystem can only be safely mounted read only."); + return XFS_ERROR(EINVAL); + } + } + if (xfs_sb_has_incompat_feature(sbp, + XFS_SB_FEAT_INCOMPAT_UNKNOWN)) { + xfs_warn(mp, +"Superblock has unknown incompatible features (0x%x) enabled.\n" +"Filesystem can not be safely mounted by this kernel.", + (sbp->sb_features_incompat & + XFS_SB_FEAT_INCOMPAT_UNKNOWN)); + return XFS_ERROR(EINVAL); + } } if (unlikely( @@ -580,6 +613,9 @@ xfs_sb_from_disk( to->sb_features_compat = be32_to_cpu(from->sb_features_compat); to->sb_features_ro_compat = be32_to_cpu(from->sb_features_ro_compat); to->sb_features_incompat = be32_to_cpu(from->sb_features_incompat); + to->sb_features_log_incompat = + be32_to_cpu(from->sb_features_log_incompat); + to->sb_pad = 0; to->sb_pquotino = be64_to_cpu(from->sb_pquotino); to->sb_lsn = be64_to_cpu(from->sb_lsn); } @@ -786,7 +822,7 @@ reread: if (bp->b_error) { error = bp->b_error; if (loud) - xfs_warn(mp, "SB validate failed"); + xfs_warn(mp, "SB validate failed with error %d.", error); goto release_buf; } diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index 457fefa..2de58a8 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -168,8 +168,10 @@ typedef struct xfs_sb { __uint32_t sb_features_compat; __uint32_t sb_features_ro_compat; __uint32_t sb_features_incompat; + __uint32_t sb_features_log_incompat; __uint32_t sb_crc; /* superblock crc */ + __uint32_t sb_pad; xfs_ino_t sb_pquotino; /* project quota inode */ xfs_lsn_t sb_lsn; /* last write sequence */ @@ -250,8 +252,10 @@ typedef struct xfs_dsb { __be32 sb_features_compat; __be32 sb_features_ro_compat; __be32 sb_features_incompat; + __be32 sb_features_log_incompat; __le32 sb_crc; /* superblock crc */ + __be32 sb_pad; __be64 sb_pquotino; /* project quota inode */ __be64 sb_lsn; /* last write sequence */ @@ -276,7 +280,8 @@ typedef enum { XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, - XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, XFS_SBS_CRC, + XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, + XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, XFS_SBS_PQUOTINO, XFS_SBS_LSN, XFS_SBS_FIELDCOUNT } xfs_sb_field_t; @@ -306,6 +311,7 @@ typedef enum { #define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) #define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) #define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) +#define XFS_SB_FEATURES_LOG_INCOMPAT XFS_SB_MVAL(FEATURES_LOG_INCOMPAT) #define XFS_SB_CRC XFS_SB_MVAL(CRC) #define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO) #define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) @@ -316,7 +322,8 @@ typedef enum { XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ XFS_SB_BAD_FEATURES2 | XFS_SB_FEATURES_COMPAT | \ - XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | XFS_SB_PQUOTINO) + XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | \ + XFS_SB_FEATURES_LOG_INCOMPAT | XFS_SB_PQUOTINO) /* @@ -552,6 +559,65 @@ static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; } + +/* + * Extended v5 superblock feature masks. These are to be used for new v5 + * superblock features only. + * + * Compat features are new features that old kernels will not notice or affect + * and so can mount read-write without issues. + * + * RO-Compat (read only) are features that old kernels can read but will break + * if they write. Hence only read-only mounts of such filesystems are allowed on + * kernels that don't support the feature bit. + * + * InCompat features are features which old kernels will not understand and so + * must not mount. + * + * Log-InCompat features are for changes to log formats or new transactions that + * can't be replayed on older kernels. The fields are set when the filesystem is + * mounted, and a clean unmount clears the fields. + */ +#define XFS_SB_FEAT_COMPAT_ALL 0 +#define XFS_SB_FEAT_COMPAT_UNKNOWN ~XFS_SB_FEAT_COMPAT_ALL +static inline bool +xfs_sb_has_compat_feature( + struct xfs_sb *sbp, + __uint32_t feature) +{ + return (sbp->sb_features_compat & feature) != 0; +} + +#define XFS_SB_FEAT_RO_COMPAT_ALL 0 +#define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL +static inline bool +xfs_sb_has_ro_compat_feature( + struct xfs_sb *sbp, + __uint32_t feature) +{ + return (sbp->sb_features_ro_compat & feature) != 0; +} + +#define XFS_SB_FEAT_INCOMPAT_ALL 0 +#define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL +static inline bool +xfs_sb_has_incompat_feature( + struct xfs_sb *sbp, + __uint32_t feature) +{ + return (sbp->sb_features_incompat & feature) != 0; +} + +#define XFS_SB_FEAT_INCOMPAT_LOG_ALL 0 +#define XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_LOG_ALL +static inline bool +xfs_sb_has_incompat_log_feature( + struct xfs_sb *sbp, + __uint32_t feature) +{ + return (sbp->sb_features_log_incompat & feature) != 0; +} + /* * end of superblock version macros */ -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5B68929E21 for ; Wed, 3 Apr 2013 00:12:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BF524AC002 for ; Tue, 2 Apr 2013 22:12:48 -0700 (PDT) X-ASG-Debug-ID: 1364965963-04cb6c1e79196c70002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id XKcFKfgjqtZqbdtg for ; Tue, 02 Apr 2013 22:12:45 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:42:12 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzW-0000MI-PT for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:12:10 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFzH-0005CF-LN for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 19/22] xfs: add buffer types to directory and attribute buffers Date: Wed, 3 Apr 2013 16:11:29 +1100 X-ASG-Orig-Subj: [PATCH 19/22] xfs: add buffer types to directory and attribute buffers Message-Id: <1364965892-19623-20-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965965 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Add buffer types to the buffer log items so that log recovery can validate the buffers and calculate CRCs correctly after the buffers are recovered. Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr_leaf.c | 9 +- fs/xfs/xfs_attr_remote.h | 2 + fs/xfs/xfs_buf_item.h | 18 +++- fs/xfs/xfs_da_btree.c | 46 ++++++++- fs/xfs/xfs_da_btree.h | 2 + fs/xfs/xfs_dir2_block.c | 12 ++- fs/xfs/xfs_dir2_data.c | 8 +- fs/xfs/xfs_dir2_leaf.c | 26 ++++- fs/xfs/xfs_dir2_node.c | 15 ++- fs/xfs/xfs_dir2_priv.h | 2 + fs/xfs/xfs_log_recover.c | 254 ++++++++++++++++++++++++++++++++-------------- fs/xfs/xfs_trans.h | 2 + fs/xfs/xfs_trans_buf.c | 17 ++++ 13 files changed, 323 insertions(+), 90 deletions(-) diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index a1cb746..7feaf3c 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -271,8 +271,13 @@ xfs_attr3_leaf_read( xfs_daddr_t mappedbno, struct xfs_buf **bpp) { - return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, + int err; + + err = xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, XFS_ATTR_FORK, &xfs_attr3_leaf_buf_ops); + if (!err && tp) + xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_ATTR_LEAF_BUF); + return err; } /*======================================================================== @@ -1078,6 +1083,7 @@ xfs_attr3_leaf_to_node( goto out; /* copy leaf to new buffer, update identifiers */ + xfs_trans_buf_set_type(args->trans, bp2, XFS_BLF_ATTR_LEAF_BUF); bp2->b_ops = bp1->b_ops; memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp)); if (xfs_sb_version_hascrc(&mp->m_sb)) { @@ -1140,6 +1146,7 @@ xfs_attr3_leaf_create( if (error) return error; bp->b_ops = &xfs_attr3_leaf_buf_ops; + xfs_trans_buf_set_type(args->trans, bp, XFS_BLF_ATTR_LEAF_BUF); leaf = bp->b_addr; memset(leaf, 0, XFS_LBSIZE(mp)); diff --git a/fs/xfs/xfs_attr_remote.h b/fs/xfs/xfs_attr_remote.h index 0ca8d9a..c7cca60 100644 --- a/fs/xfs/xfs_attr_remote.h +++ b/fs/xfs/xfs_attr_remote.h @@ -37,6 +37,8 @@ struct xfs_attr3_rmt_hdr { ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ sizeof(struct xfs_attr3_rmt_hdr) : 0)) +extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; + int xfs_attr_rmtval_get(struct xfs_da_args *args); int xfs_attr_rmtval_set(struct xfs_da_args *args); int xfs_attr_rmtval_remove(struct xfs_da_args *args); diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 09cab4e..640adcf 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -50,6 +50,14 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_AGI_BUF (1<<8) #define XFS_BLF_DINO_BUF (1<<9) #define XFS_BLF_SYMLINK_BUF (1<<10) +#define XFS_BLF_DIR_BLOCK_BUF (1<<11) +#define XFS_BLF_DIR_DATA_BUF (1<<12) +#define XFS_BLF_DIR_FREE_BUF (1<<13) +#define XFS_BLF_DIR_LEAF1_BUF (1<<14) +#define XFS_BLF_DIR_LEAFN_BUF (1<<15) +#define XFS_BLF_DA_NODE_BUF (1<<16) +#define XFS_BLF_ATTR_LEAF_BUF (1<<17) +#define XFS_BLF_ATTR_RMT_BUF (1<<18) #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -60,7 +68,15 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_AGFL_BUF | \ XFS_BLF_AGI_BUF | \ XFS_BLF_DINO_BUF | \ - XFS_BLF_SYMLINK_BUF) + XFS_BLF_SYMLINK_BUF | \ + XFS_BLF_DIR_BLOCK_BUF | \ + XFS_BLF_DIR_DATA_BUF | \ + XFS_BLF_DIR_FREE_BUF | \ + XFS_BLF_DIR_LEAF1_BUF | \ + XFS_BLF_DIR_LEAFN_BUF | \ + XFS_BLF_DA_NODE_BUF | \ + XFS_BLF_ATTR_LEAF_BUF | \ + XFS_BLF_ATTR_RMT_BUF) #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 2b7c9f6..a78865e 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -292,7 +292,6 @@ const struct xfs_buf_ops xfs_da3_node_buf_ops = { .verify_write = xfs_da3_node_write_verify, }; - int xfs_da3_node_read( struct xfs_trans *tp, @@ -302,8 +301,35 @@ xfs_da3_node_read( struct xfs_buf **bpp, int which_fork) { - return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, + int err; + + err = xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, which_fork, &xfs_da3_node_buf_ops); + if (!err && tp) { + struct xfs_da_blkinfo *info = (*bpp)->b_addr; + int type; + + switch (be16_to_cpu(info->magic)) { + case XFS_DA3_NODE_MAGIC: + case XFS_DA_NODE_MAGIC: + type = XFS_BLF_DA_NODE_BUF; + break; + case XFS_ATTR_LEAF_MAGIC: + case XFS_ATTR3_LEAF_MAGIC: + type = XFS_BLF_ATTR_LEAF_BUF; + break; + case XFS_DIR2_LEAFN_MAGIC: + case XFS_DIR3_LEAFN_MAGIC: + type = XFS_BLF_DIR_LEAFN_BUF; + break; + default: + type = 0; + ASSERT(0); + break; + } + xfs_trans_buf_set_type(tp, *bpp, type); + } + return err; } /*======================================================================== @@ -334,6 +360,8 @@ xfs_da3_node_create( error = xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); if (error) return(error); + bp->b_ops = &xfs_da3_node_buf_ops; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DA_NODE_BUF); node = bp->b_addr; if (xfs_sb_version_hascrc(&mp->m_sb)) { @@ -352,7 +380,6 @@ xfs_da3_node_create( xfs_trans_log_buf(tp, bp, XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); - bp->b_ops = &xfs_da3_node_buf_ops; *bpp = bp; return(0); } @@ -563,6 +590,12 @@ xfs_da3_root_split( btree = xfs_da3_node_tree_p(oldroot); size = (int)((char *)&btree[nodehdr.count] - (char *)oldroot); level = nodehdr.level; + + /* + * we are about to copy oldroot to bp, so set up the type + * of bp while we know exactly what it will be. + */ + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DA_NODE_BUF); } else { struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir2_leaf_entry *ents; @@ -575,6 +608,12 @@ xfs_da3_root_split( leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); size = (int)((char *)&ents[leafhdr.count] - (char *)leaf); level = 0; + + /* + * we are about to copy oldroot to bp, so set up the type + * of bp while we know exactly what it will be. + */ + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAFN_BUF); } /* @@ -1090,6 +1129,7 @@ xfs_da3_root_join( */ memcpy(root_blk->bp->b_addr, bp->b_addr, state->blocksize); root_blk->bp->b_ops = bp->b_ops; + xfs_trans_buf_copy_type(root_blk->bp, bp); if (oldroothdr.magic == XFS_DA3_NODE_MAGIC) { struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr; da3->blkno = cpu_to_be64(root_blk->bp->b_bn); diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 0e8182c..6fb3371 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -301,6 +301,8 @@ int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp, int which_fork); +extern const struct xfs_buf_ops xfs_da3_node_buf_ops; + /* * Utility routines. */ diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index d2e445f..58816ec 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -132,20 +132,26 @@ xfs_dir3_block_read( struct xfs_buf **bpp) { struct xfs_mount *mp = dp->i_mount; + int err; - return xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, + err = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, XFS_DATA_FORK, &xfs_dir3_block_buf_ops); + if (!err && tp) + xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_BLOCK_BUF); + return err; } static void xfs_dir3_block_init( struct xfs_mount *mp, + struct xfs_trans *tp, struct xfs_buf *bp, struct xfs_inode *dp) { struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; bp->b_ops = &xfs_dir3_block_buf_ops; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_BLOCK_BUF); if (xfs_sb_version_hascrc(&mp->m_sb)) { memset(hdr3, 0, sizeof(*hdr3)); @@ -1080,7 +1086,7 @@ xfs_dir2_leaf_to_block( /* * Start converting it to block form. */ - xfs_dir3_block_init(mp, dbp, dp); + xfs_dir3_block_init(mp, tp, dbp, dp); needlog = 1; needscan = 0; @@ -1209,7 +1215,7 @@ xfs_dir2_sf_to_block( kmem_free(sfp); return error; } - xfs_dir3_block_init(mp, bp, dp); + xfs_dir3_block_init(mp, tp, bp, dp); hdr = bp->b_addr; /* diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 78320df..5e0c711 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -301,8 +301,13 @@ xfs_dir3_data_read( xfs_daddr_t mapped_bno, struct xfs_buf **bpp) { - return xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp, + int err; + + err = xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp, XFS_DATA_FORK, &xfs_dir3_data_buf_ops); + if (!err && tp) + xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_DATA_BUF); + return err; } int @@ -571,6 +576,7 @@ xfs_dir3_data_init( if (error) return error; bp->b_ops = &xfs_dir3_data_buf_ops; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_DATA_BUF); /* * Initialize the header. diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index acdc50e..209962e 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -279,7 +279,7 @@ xfs_dir3_leafn_write_verify( __write_verify(bp, XFS_DIR2_LEAFN_MAGIC); } -static const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops = { +const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops = { .verify_read = xfs_dir3_leaf1_read_verify, .verify_write = xfs_dir3_leaf1_write_verify, }; @@ -297,8 +297,13 @@ xfs_dir3_leaf_read( xfs_daddr_t mappedbno, struct xfs_buf **bpp) { - return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, + int err; + + err = xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, XFS_DATA_FORK, &xfs_dir3_leaf1_buf_ops); + if (!err && tp) + xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_LEAF1_BUF); + return err; } int @@ -309,8 +314,13 @@ xfs_dir3_leafn_read( xfs_daddr_t mappedbno, struct xfs_buf **bpp) { - return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, + int err; + + err = xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, XFS_DATA_FORK, &xfs_dir3_leafn_buf_ops); + if (!err && tp) + xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_LEAFN_BUF); + return err; } /* @@ -319,6 +329,7 @@ xfs_dir3_leafn_read( static void xfs_dir3_leaf_init( struct xfs_mount *mp, + struct xfs_trans *tp, struct xfs_buf *bp, xfs_ino_t owner, __uint16_t type) @@ -353,8 +364,11 @@ xfs_dir3_leaf_init( ltp = xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount = 0; bp->b_ops = &xfs_dir3_leaf1_buf_ops; - } else + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAF1_BUF); + } else { bp->b_ops = &xfs_dir3_leafn_buf_ops; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAFN_BUF); + } } int @@ -379,7 +393,7 @@ xfs_dir3_leaf_get_buf( if (error) return error; - xfs_dir3_leaf_init(mp, bp, dp->i_ino, magic); + xfs_dir3_leaf_init(mp, tp, bp, dp->i_ino, magic); xfs_dir3_leaf_log_header(tp, bp); if (magic == XFS_DIR2_LEAF1_MAGIC) xfs_dir3_leaf_log_tail(tp, bp); @@ -475,6 +489,7 @@ xfs_dir2_block_to_leaf( * Fix up the block header, make it a data block. */ dbp->b_ops = &xfs_dir3_data_buf_ops; + xfs_trans_buf_set_type(tp, dbp, XFS_BLF_DIR_DATA_BUF); if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); else @@ -2183,6 +2198,7 @@ xfs_dir2_node_to_leaf( xfs_dir3_leaf_compact(args, &leafhdr, lbp); lbp->b_ops = &xfs_dir3_leaf1_buf_ops; + xfs_trans_buf_set_type(tp, lbp, XFS_BLF_DIR_LEAF1_BUF); leafhdr.magic = (leafhdr.magic == XFS_DIR2_LEAFN_MAGIC) ? XFS_DIR2_LEAF1_MAGIC : XFS_DIR3_LEAF1_MAGIC; diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 876991f..d2e19fb 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -147,7 +147,7 @@ xfs_dir3_free_write_verify( xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_FREE_CRC_OFF); } -static const struct xfs_buf_ops xfs_dir3_free_buf_ops = { +const struct xfs_buf_ops xfs_dir3_free_buf_ops = { .verify_read = xfs_dir3_free_read_verify, .verify_write = xfs_dir3_free_write_verify, }; @@ -161,8 +161,15 @@ __xfs_dir3_free_read( xfs_daddr_t mappedbno, struct xfs_buf **bpp) { - return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, + int err; + + err = xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, XFS_DATA_FORK, &xfs_dir3_free_buf_ops); + + /* try read returns without an error or *bpp if it lands in a hole */ + if (!err && tp && *bpp) + xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_FREE_BUF); + return err; } int @@ -249,6 +256,7 @@ xfs_dir3_free_get_buf( if (error) return error; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_FREE_BUF); bp->b_ops = &xfs_dir3_free_buf_ops; /* @@ -396,6 +404,7 @@ xfs_dir2_leaf_to_node( else leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); lbp->b_ops = &xfs_dir3_leafn_buf_ops; + xfs_trans_buf_set_type(tp, lbp, XFS_BLF_DIR_LEAFN_BUF); xfs_dir3_leaf_log_header(tp, lbp); xfs_dir3_leaf_check(mp, lbp); return 0; @@ -807,6 +816,7 @@ xfs_dir2_leafn_lookup_for_entry( (char *)curbp->b_addr); state->extrablk.magic = XFS_DIR2_DATA_MAGIC; curbp->b_ops = &xfs_dir3_data_buf_ops; + xfs_trans_buf_set_type(tp, curbp, XFS_BLF_DIR_DATA_BUF); if (cmp == XFS_CMP_EXACT) return XFS_ERROR(EEXIST); } @@ -821,6 +831,7 @@ xfs_dir2_leafn_lookup_for_entry( state->extrablk.blkno = curdb; state->extrablk.magic = XFS_DIR2_DATA_MAGIC; curbp->b_ops = &xfs_dir3_data_buf_ops; + xfs_trans_buf_set_type(tp, curbp, XFS_BLF_DIR_DATA_BUF); } else { /* If the curbp is not the CI match block, drop it */ if (state->extrablk.bp != curbp) diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 932565d..7cf573c 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -49,6 +49,7 @@ extern int xfs_dir2_leaf_to_block(struct xfs_da_args *args, #endif extern const struct xfs_buf_ops xfs_dir3_data_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_free_buf_ops; extern int __xfs_dir3_data_check(struct xfs_inode *dp, struct xfs_buf *bp); extern int xfs_dir3_data_read(struct xfs_trans *tp, struct xfs_inode *dp, @@ -77,6 +78,7 @@ extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_buf *bp, xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); /* xfs_dir2_leaf.c */ +extern const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops; extern const struct xfs_buf_ops xfs_dir3_leafn_buf_ops; extern int xfs_dir3_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp, diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index d1292fd..00727bc 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -45,7 +45,14 @@ #include "xfs_cksum.h" #include "xfs_trace.h" #include "xfs_icache.h" + +/* Need all the magic numbers and buffer ops structures from these headers */ #include "xfs_symlink.h" +#include "xfs_da_btree.h" +#include "xfs_dir2_format.h" +#include "xfs_dir2_priv.h" +#include "xfs_attr_leaf.h" +#include "xfs_attr_remote.h" STATIC int xlog_find_zeroed( @@ -1860,81 +1867,30 @@ xlog_recover_do_inode_buffer( } /* - * Perform a 'normal' buffer recovery. Each logged region of the - * buffer should be copied over the corresponding region in the - * given buffer. The bitmap in the buf log format structure indicates - * where to place the logged data. + * Validate the recovered buffer is of the correct type and attach the + * appropriate buffer operations to them for writeback. Magic numbers are in a + * few places: + * the first 16 bits of the buffer (inode buffer, dquot buffer), + * the first 32 bits of the buffer (most blocks), + * inside a struct xfs_da_blkinfo at the start of the buffer. */ -STATIC void -xlog_recover_do_reg_buffer( +static void +xlog_recovery_validate_buf_type( struct xfs_mount *mp, - xlog_recover_item_t *item, struct xfs_buf *bp, xfs_buf_log_format_t *buf_f) { - int i; - int bit; - int nbits; - int error; - - trace_xfs_log_recover_buf_reg_buf(mp->m_log, buf_f); - - bit = 0; - i = 1; /* 0 is the buf format structure */ - while (1) { - bit = xfs_next_bit(buf_f->blf_data_map, - buf_f->blf_map_size, bit); - if (bit == -1) - break; - nbits = xfs_contig_bits(buf_f->blf_data_map, - buf_f->blf_map_size, bit); - ASSERT(nbits > 0); - ASSERT(item->ri_buf[i].i_addr != NULL); - ASSERT(item->ri_buf[i].i_len % XFS_BLF_CHUNK == 0); - ASSERT(BBTOB(bp->b_io_length) >= - ((uint)bit << XFS_BLF_SHIFT) + (nbits << XFS_BLF_SHIFT)); - - /* - * Do a sanity check if this is a dquot buffer. Just checking - * the first dquot in the buffer should do. XXXThis is - * probably a good thing to do for other buf types also. - */ - error = 0; - if (buf_f->blf_flags & - (XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) { - if (item->ri_buf[i].i_addr == NULL) { - xfs_alert(mp, - "XFS: NULL dquot in %s.", __func__); - goto next; - } - if (item->ri_buf[i].i_len < sizeof(xfs_disk_dquot_t)) { - xfs_alert(mp, - "XFS: dquot too small (%d) in %s.", - item->ri_buf[i].i_len, __func__); - goto next; - } - error = xfs_qm_dqcheck(mp, item->ri_buf[i].i_addr, - -1, 0, XFS_QMOPT_DOWARN, - "dquot_buf_recover"); - if (error) - goto next; - } - - memcpy(xfs_buf_offset(bp, - (uint)bit << XFS_BLF_SHIFT), /* dest */ - item->ri_buf[i].i_addr, /* source */ - nbits<ri_total); - + struct xfs_da_blkinfo *info = bp->b_addr; + __uint32_t magic32; + __uint16_t magic16; + __uint16_t magicda; + + magic32 = be32_to_cpu(*(__be32 *)bp->b_addr); + magic16 = be16_to_cpu(*(__be16*)bp->b_addr); + magicda = be16_to_cpu(info->magic); switch (buf_f->blf_flags & XFS_BLF_TYPE_MASK) { case XFS_BLF_BTREE_BUF: - switch (be32_to_cpu(*(__be32 *)bp->b_addr)) { + switch (magic32) { case XFS_ABTB_CRC_MAGIC: case XFS_ABTC_CRC_MAGIC: case XFS_ABTB_MAGIC: @@ -1956,7 +1912,7 @@ xlog_recover_do_reg_buffer( } break; case XFS_BLF_AGF_BUF: - if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_AGF_MAGIC)) { + if (magic32 != XFS_AGF_MAGIC) { xfs_warn(mp, "Bad AGF block magic!"); ASSERT(0); break; @@ -1966,7 +1922,7 @@ xlog_recover_do_reg_buffer( case XFS_BLF_AGFL_BUF: if (!xfs_sb_version_hascrc(&mp->m_sb)) break; - if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_AGFL_MAGIC)) { + if (magic32 != XFS_AGFL_MAGIC) { xfs_warn(mp, "Bad AGFL block magic!"); ASSERT(0); break; @@ -1974,7 +1930,7 @@ xlog_recover_do_reg_buffer( bp->b_ops = &xfs_agfl_buf_ops; break; case XFS_BLF_AGI_BUF: - if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_AGI_MAGIC)) { + if (magic32 != XFS_AGI_MAGIC) { xfs_warn(mp, "Bad AGI block magic!"); ASSERT(0); break; @@ -1984,7 +1940,7 @@ xlog_recover_do_reg_buffer( case XFS_BLF_UDQUOT_BUF: case XFS_BLF_PDQUOT_BUF: case XFS_BLF_GDQUOT_BUF: - if (*(__be16 *)bp->b_addr != cpu_to_be16(XFS_DQUOT_MAGIC)) { + if (magic16 != XFS_DQUOT_MAGIC) { xfs_warn(mp, "Bad DQUOT block magic!"); ASSERT(0); break; @@ -1996,7 +1952,7 @@ xlog_recover_do_reg_buffer( * we get here with inode allocation buffers, not buffers that * track unlinked list changes. */ - if (*(__be16 *)bp->b_addr != cpu_to_be16(XFS_DINODE_MAGIC)) { + if (magic16 != XFS_DINODE_MAGIC) { xfs_warn(mp, "Bad INODE block magic!"); ASSERT(0); break; @@ -2004,19 +1960,169 @@ xlog_recover_do_reg_buffer( bp->b_ops = &xfs_inode_buf_ops; break; case XFS_BLF_SYMLINK_BUF: - if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_SYMLINK_MAGIC)) { + if (magic32 != XFS_SYMLINK_MAGIC) { xfs_warn(mp, "Bad symlink block magic!"); ASSERT(0); break; } bp->b_ops = &xfs_symlink_buf_ops; break; + case XFS_BLF_DIR_BLOCK_BUF: + if (magic32 != XFS_DIR2_BLOCK_MAGIC && + magic32 != XFS_DIR3_BLOCK_MAGIC) { + xfs_warn(mp, "Bad dir block magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_dir3_block_buf_ops; + break; + case XFS_BLF_DIR_DATA_BUF: + if (magic32 != XFS_DIR2_DATA_MAGIC && + magic32 != XFS_DIR3_DATA_MAGIC) { + xfs_warn(mp, "Bad dir data magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_dir3_data_buf_ops; + break; + case XFS_BLF_DIR_FREE_BUF: + if (magic32 != XFS_DIR2_FREE_MAGIC && + magic32 != XFS_DIR3_FREE_MAGIC) { + xfs_warn(mp, "Bad dir3 free magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_dir3_free_buf_ops; + break; + case XFS_BLF_DIR_LEAF1_BUF: + if (magicda != XFS_DIR2_LEAF1_MAGIC && + magicda != XFS_DIR3_LEAF1_MAGIC) { + xfs_warn(mp, "Bad dir leaf1 magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_dir3_leaf1_buf_ops; + break; + case XFS_BLF_DIR_LEAFN_BUF: + if (magicda != XFS_DIR2_LEAFN_MAGIC && + magicda != XFS_DIR3_LEAFN_MAGIC) { + xfs_warn(mp, "Bad dir leafn magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_dir3_leafn_buf_ops; + break; + case XFS_BLF_DA_NODE_BUF: + if (magicda != XFS_DA_NODE_MAGIC && + magicda != XFS_DA3_NODE_MAGIC) { + xfs_warn(mp, "Bad da node magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_da3_node_buf_ops; + break; + case XFS_BLF_ATTR_LEAF_BUF: + if (magicda != XFS_ATTR_LEAF_MAGIC && + magicda != XFS_ATTR3_LEAF_MAGIC) { + xfs_warn(mp, "Bad attr leaf magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_attr3_leaf_buf_ops; + break; + case XFS_BLF_ATTR_RMT_BUF: + if (!xfs_sb_version_hascrc(&mp->m_sb)) + break; + if (magicda != XFS_ATTR3_RMT_MAGIC) { + xfs_warn(mp, "Bad attr remote magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_attr3_rmt_buf_ops; + break; default: break; } } /* + * Perform a 'normal' buffer recovery. Each logged region of the + * buffer should be copied over the corresponding region in the + * given buffer. The bitmap in the buf log format structure indicates + * where to place the logged data. + */ +STATIC void +xlog_recover_do_reg_buffer( + struct xfs_mount *mp, + xlog_recover_item_t *item, + struct xfs_buf *bp, + xfs_buf_log_format_t *buf_f) +{ + int i; + int bit; + int nbits; + int error; + + trace_xfs_log_recover_buf_reg_buf(mp->m_log, buf_f); + + bit = 0; + i = 1; /* 0 is the buf format structure */ + while (1) { + bit = xfs_next_bit(buf_f->blf_data_map, + buf_f->blf_map_size, bit); + if (bit == -1) + break; + nbits = xfs_contig_bits(buf_f->blf_data_map, + buf_f->blf_map_size, bit); + ASSERT(nbits > 0); + ASSERT(item->ri_buf[i].i_addr != NULL); + ASSERT(item->ri_buf[i].i_len % XFS_BLF_CHUNK == 0); + ASSERT(BBTOB(bp->b_io_length) >= + ((uint)bit << XFS_BLF_SHIFT) + (nbits << XFS_BLF_SHIFT)); + + /* + * Do a sanity check if this is a dquot buffer. Just checking + * the first dquot in the buffer should do. XXXThis is + * probably a good thing to do for other buf types also. + */ + error = 0; + if (buf_f->blf_flags & + (XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) { + if (item->ri_buf[i].i_addr == NULL) { + xfs_alert(mp, + "XFS: NULL dquot in %s.", __func__); + goto next; + } + if (item->ri_buf[i].i_len < sizeof(xfs_disk_dquot_t)) { + xfs_alert(mp, + "XFS: dquot too small (%d) in %s.", + item->ri_buf[i].i_len, __func__); + goto next; + } + error = xfs_qm_dqcheck(mp, item->ri_buf[i].i_addr, + -1, 0, XFS_QMOPT_DOWARN, + "dquot_buf_recover"); + if (error) + goto next; + } + + memcpy(xfs_buf_offset(bp, + (uint)bit << XFS_BLF_SHIFT), /* dest */ + item->ri_buf[i].i_addr, /* source */ + nbits<ri_total); + + xlog_recovery_validate_buf_type(mp, bp, buf_f); + +} + +/* * Do some primitive error checking on ondisk dquot data structures. */ int diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 1b04fe5..fa78a3f 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -507,6 +507,8 @@ void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, uint); +void xfs_trans_buf_copy_type(struct xfs_buf *dst_bp, + struct xfs_buf *src_bp); void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 8a0f6af..40871bf 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -768,6 +768,9 @@ xfs_trans_buf_set_type( { struct xfs_buf_log_item *bip = bp->b_fspriv; + if (!tp) + return; + ASSERT(bp->b_transp == tp); ASSERT(bip != NULL); ASSERT(atomic_read(&bip->bli_refcount) > 0); @@ -777,6 +780,20 @@ xfs_trans_buf_set_type( bip->__bli_format.blf_flags |= type; } +void +xfs_trans_buf_copy_type( + struct xfs_buf *dst_bp, + struct xfs_buf *src_bp) +{ + struct xfs_buf_log_item *sbip = src_bp->b_fspriv; + struct xfs_buf_log_item *dbip = dst_bp->b_fspriv; + uint type; + + type = sbip->__bli_format.blf_flags & XFS_BLF_TYPE_MASK; + dbip->__bli_format.blf_flags &= ~XFS_BLF_TYPE_MASK; + dbip->__bli_format.blf_flags |= type; +} + /* * Similar to xfs_trans_inode_buf(), this marks the buffer as a cluster of * dquots. However, unlike in inode buffer recovery, dquot buffers get -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1CA2A29E25 for ; Wed, 3 Apr 2013 00:12:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7FE2FAC002 for ; Tue, 2 Apr 2013 22:12:50 -0700 (PDT) X-ASG-Debug-ID: 1364965963-04cb6c1e79196c70003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 6NWmBH37hfqrmXfc for ; Tue, 02 Apr 2013 22:12:47 -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: Aj0KANm5W1F5LBrj/2dsb2JhbABDgwfAZQSBCBd0gh8BAQUnLzMIGDE5AxsZiBPBXY1pE4RkA5MliUeLCoMfKIEv Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:42:16 +1030 Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzR-0000Lx-WA for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:12:06 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFzH-0005CN-Nj for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 21/22] xfs: add CRC checks to the superblock Date: Wed, 3 Apr 2013 16:11:31 +1100 X-ASG-Orig-Subj: [PATCH 21/22] xfs: add CRC checks to the superblock Message-Id: <1364965892-19623-22-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965967 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner With the addition of CRCs, there is such a wide and varied change to the on disk format that it makes sense to bump the superblock version number rather than try to use feature bits for all the new functionality. This commit introduces all the new superblock fields needed for all the new functionality: feature masks similar to ext4, separate project quota inodes, a LSN field for recovery and the CRC field. This commit does not bump the superblock version number, however. That will be done as a separate commit at the end of the series after all the new functionality is present so we switch it all on in one commit. This means that we can slowly introduce the changes without them being active and hence maintain bisectability of the tree. This patch is based on a patch originally written by myself back from SGI days, which was subsequently modified by Christoph Hellwig. There is relatively little of that patch remaining, but the history of the patch still should be acknowledged here. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 8 ++++ fs/xfs/xfs_mount.c | 108 +++++++++++++++++++++++++++++++++++++++------- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_sb.h | 100 +++++++++++++++++++++++++++++------------- 4 files changed, 172 insertions(+), 45 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 8628507..5303b3d 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2040,6 +2040,14 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_attr3_rmt_buf_ops; break; + case XFS_BLFT_SB_BUF: + if (magic32 != XFS_SB_MAGIC) { + xfs_warn(mp, "Bad SB block magic!"); + ASSERT(0); + break; + } + bp->b_ops = &xfs_sb_buf_ops; + break; default: xfs_warn(mp, "Unknown buffer type %d!", xfs_blft_from_flags(buf_f)); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 3806088..140136c 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -43,6 +43,8 @@ #include "xfs_utils.h" #include "xfs_trace.h" #include "xfs_icache.h" +#include "xfs_cksum.h" +#include "xfs_buf_item.h" #ifdef HAVE_PERCPU_SB @@ -109,6 +111,12 @@ static const struct { { offsetof(xfs_sb_t, sb_logsunit), 0 }, { offsetof(xfs_sb_t, sb_features2), 0 }, { offsetof(xfs_sb_t, sb_bad_features2), 0 }, + { offsetof(xfs_sb_t, sb_features_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_incompat), 0 }, + { offsetof(xfs_sb_t, sb_crc), 0 }, + { offsetof(xfs_sb_t, sb_pquotino), 0 }, + { offsetof(xfs_sb_t, sb_lsn), 0 }, { sizeof(xfs_sb_t), 0 } }; @@ -319,11 +327,23 @@ xfs_mount_validate_sb( return XFS_ERROR(EWRONGFS); } + if (!xfs_sb_good_version(sbp)) { xfs_warn(mp, "bad version"); return XFS_ERROR(EWRONGFS); } + /* + * Do not allow Version 5 superblocks to mount right now, even though + * support is in place. We need to implement the proper feature masks + * first. + */ + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) { + xfs_alert(mp, + "Version 5 superblock detected. Experimental support not yet enabled!"); + return XFS_ERROR(EINVAL); + } + if (unlikely( sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) { xfs_warn(mp, @@ -557,6 +577,11 @@ xfs_sb_from_disk( to->sb_logsunit = be32_to_cpu(from->sb_logsunit); to->sb_features2 = be32_to_cpu(from->sb_features2); to->sb_bad_features2 = be32_to_cpu(from->sb_bad_features2); + to->sb_features_compat = be32_to_cpu(from->sb_features_compat); + to->sb_features_ro_compat = be32_to_cpu(from->sb_features_ro_compat); + to->sb_features_incompat = be32_to_cpu(from->sb_features_incompat); + to->sb_pquotino = be64_to_cpu(from->sb_pquotino); + to->sb_lsn = be64_to_cpu(from->sb_lsn); } /* @@ -612,13 +637,12 @@ xfs_sb_to_disk( } } -static void +static int xfs_sb_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_sb sb; - int error; xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); @@ -626,16 +650,46 @@ xfs_sb_verify( * Only check the in progress field for the primary superblock as * mkfs.xfs doesn't clear it from secondary superblocks. */ - error = xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR); - if (error) - xfs_buf_ioerror(bp, error); + return xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR); } +/* + * If the superblock has the CRC feature bit set or the CRC field is non-null, + * check that the CRC is valid. We check the CRC field is non-null because a + * single bit error could clear the feature bit and unused parts of the + * superblock are supposed to be zero. Hence a non-null crc field indicates that + * we've potentially lost a feature bit and we should check it anyway. + */ static void xfs_sb_read_verify( struct xfs_buf *bp) { - xfs_sb_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); + int error; + + /* + * open code the version check to avoid needing to convert the entire + * superblock from disk order just to check the version number + */ + if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC) && + (((be16_to_cpu(dsb->sb_versionnum) & XFS_SB_VERSION_NUMBITS) == + XFS_SB_VERSION_5) || + dsb->sb_crc != 0)) { + + if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), + offsetof(struct xfs_sb, sb_crc))) { + error = EFSCORRUPTED; + goto out_error; + } + } + error = xfs_sb_verify(bp); + +out_error: + if (error) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, error); + } } /* @@ -648,11 +702,10 @@ static void xfs_sb_quiet_read_verify( struct xfs_buf *bp) { - struct xfs_sb sb; + struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); - xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); - if (sb.sb_magicnum == XFS_SB_MAGIC) { + if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC)) { /* XFS filesystem, verify noisily! */ xfs_sb_read_verify(bp); return; @@ -663,9 +716,27 @@ xfs_sb_quiet_read_verify( static void xfs_sb_write_verify( - struct xfs_buf *bp) + struct xfs_buf *bp) { - xfs_sb_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + int error; + + error = xfs_sb_verify(bp); + if (error) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, error); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_SBP(bp)->sb_lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_sb, sb_crc)); } const struct xfs_buf_ops xfs_sb_buf_ops = { @@ -687,7 +758,8 @@ int xfs_readsb(xfs_mount_t *mp, int flags) { unsigned int sector_size; - xfs_buf_t *bp; + struct xfs_buf *bp; + struct xfs_sb *sbp = &mp->m_sb; int error; int loud = !(flags & XFS_MFSI_QUIET); @@ -726,10 +798,10 @@ reread: /* * We must be able to do sector-sized and sector-aligned IO. */ - if (sector_size > mp->m_sb.sb_sectsize) { + if (sector_size > sbp->sb_sectsize) { if (loud) xfs_warn(mp, "device supports %u byte sectors (not %u)", - sector_size, mp->m_sb.sb_sectsize); + sector_size, sbp->sb_sectsize); error = ENOSYS; goto release_buf; } @@ -738,15 +810,18 @@ reread: * If device sector size is smaller than the superblock size, * re-read the superblock so the buffer is correctly sized. */ - if (sector_size < mp->m_sb.sb_sectsize) { + if (sector_size < sbp->sb_sectsize) { xfs_buf_relse(bp); - sector_size = mp->m_sb.sb_sectsize; + sector_size = sbp->sb_sectsize; goto reread; } /* Initialize per-cpu counters */ xfs_icsb_reinit_counters(mp); + /* no need to be quiet anymore, so reset the buf ops */ + bp->b_ops = &xfs_sb_buf_ops; + mp->m_sb_bp = bp; xfs_buf_unlock(bp); return 0; @@ -1633,6 +1708,7 @@ xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) ASSERT((1LL << f) & XFS_SB_MOD_BITS); first = xfs_sb_info[f].offset; + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); xfs_trans_log_buf(tp, bp, first, last); } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 687c171..b004cec 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -391,6 +391,7 @@ extern void xfs_set_low_space_thresholds(struct xfs_mount *); #endif /* __KERNEL__ */ +extern void xfs_sb_calc_crc(struct xfs_buf *); extern void xfs_mod_sb(struct xfs_trans *, __int64_t); extern int xfs_initialize_perag(struct xfs_mount *, xfs_agnumber_t, xfs_agnumber_t *); diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index a05b451..457fefa 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -32,6 +32,7 @@ struct xfs_mount; #define XFS_SB_VERSION_2 2 /* 6.2 - attributes */ #define XFS_SB_VERSION_3 3 /* 6.2 - new inode version */ #define XFS_SB_VERSION_4 4 /* 6.2+ - bitmask version */ +#define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */ #define XFS_SB_VERSION_NUMBITS 0x000f #define XFS_SB_VERSION_ALLFBITS 0xfff0 #define XFS_SB_VERSION_SASHFBITS 0xf000 @@ -161,6 +162,18 @@ typedef struct xfs_sb { */ __uint32_t sb_bad_features2; + /* version 5 superblock fields start here */ + + /* feature masks */ + __uint32_t sb_features_compat; + __uint32_t sb_features_ro_compat; + __uint32_t sb_features_incompat; + + __uint32_t sb_crc; /* superblock crc */ + + xfs_ino_t sb_pquotino; /* project quota inode */ + xfs_lsn_t sb_lsn; /* last write sequence */ + /* must be padded to 64 bit alignment */ } xfs_sb_t; @@ -229,7 +242,19 @@ typedef struct xfs_dsb { * for features2 bits. Easiest just to mark it bad and not use * it for anything else. */ - __be32 sb_bad_features2; + __be32 sb_bad_features2; + + /* version 5 superblock fields start here */ + + /* feature masks */ + __be32 sb_features_compat; + __be32 sb_features_ro_compat; + __be32 sb_features_incompat; + + __le32 sb_crc; /* superblock crc */ + + __be64 sb_pquotino; /* project quota inode */ + __be64 sb_lsn; /* last write sequence */ /* must be padded to 64 bit alignment */ } xfs_dsb_t; @@ -250,7 +275,9 @@ typedef enum { XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN, XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, - XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, + XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, + XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, XFS_SBS_CRC, + XFS_SBS_PQUOTINO, XFS_SBS_LSN, XFS_SBS_FIELDCOUNT } xfs_sb_field_t; @@ -276,6 +303,11 @@ typedef enum { #define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) #define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2) #define XFS_SB_BAD_FEATURES2 XFS_SB_MVAL(BAD_FEATURES2) +#define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) +#define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) +#define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) +#define XFS_SB_CRC XFS_SB_MVAL(CRC) +#define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO) #define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) #define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1) #define XFS_SB_MOD_BITS \ @@ -283,7 +315,8 @@ typedef enum { XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ - XFS_SB_BAD_FEATURES2) + XFS_SB_BAD_FEATURES2 | XFS_SB_FEATURES_COMPAT | \ + XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | XFS_SB_PQUOTINO) /* @@ -325,6 +358,8 @@ static inline int xfs_sb_good_version(xfs_sb_t *sbp) return 1; } + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) + return 1; return 0; } @@ -365,7 +400,7 @@ static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) { return sbp->sb_versionnum == XFS_SB_VERSION_2 || sbp->sb_versionnum == XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); } @@ -373,7 +408,7 @@ static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) { if (sbp->sb_versionnum == XFS_SB_VERSION_1) sbp->sb_versionnum = XFS_SB_VERSION_2; - else if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + else if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; else sbp->sb_versionnum = XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; @@ -382,7 +417,7 @@ static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) { return sbp->sb_versionnum == XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); } @@ -396,13 +431,13 @@ static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp) static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); } static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) { - if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; else sbp->sb_versionnum = xfs_sb_version_tonew(sbp->sb_versionnum) | @@ -411,13 +446,14 @@ static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT)); } static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); } @@ -429,38 +465,42 @@ static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp) static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)); } static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT)); } static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT)); } static inline int xfs_sb_version_hassector(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); } static inline int xfs_sb_version_hasasciici(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); } static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT)); } /* @@ -475,14 +515,16 @@ static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp) { - return xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); } static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp) { - return xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)); } static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) @@ -500,14 +542,14 @@ static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp) static inline int xfs_sb_version_hasprojid32bit(xfs_sb_t *sbp) { - return xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)); } static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) { - return (xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_CRCBIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; } /* -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5346F29E21 for ; Wed, 3 Apr 2013 00:12:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 342E630407E for ; Tue, 2 Apr 2013 22:12:52 -0700 (PDT) X-ASG-Debug-ID: 1364965963-04cb6c1e79196c70004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 02Ivj5NzDFfQzO0N for ; Tue, 02 Apr 2013 22:12: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: Aj8KANm5W1F5LBrj/2dsb2JhbABDgwfAZQQBgQcXdIIfAQEFJy8zCBgxOQMbGYgTwV2NfIESg1IDp3aDHyg Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:42:17 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzR-0000Ls-MU for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:12:05 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFzH-0005C6-JA for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 17/22] xfs: split remote attribute code out Date: Wed, 3 Apr 2013 16:11:27 +1100 X-ASG-Orig-Subj: [PATCH 17/22] xfs: split remote attribute code out Message-Id: <1364965892-19623-18-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965969 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Adding CRC support to remote attributes adds a significant amount of remote attribute specific code. Split the existing remote attribute code out into it's own file so that all the relevant remote attribute code is in a single, easy to find place. Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 1 + fs/xfs/xfs_attr.c | 298 +---------------------------------------- fs/xfs/xfs_attr.h | 1 - fs/xfs/xfs_attr_leaf.c | 1 + fs/xfs/xfs_attr_remote.c | 328 ++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_attr_remote.h | 25 ++++ 6 files changed, 356 insertions(+), 298 deletions(-) create mode 100644 fs/xfs/xfs_attr_remote.c create mode 100644 fs/xfs/xfs_attr_remote.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 062f25c..6313b69 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -58,6 +58,7 @@ xfs-y += xfs_alloc.o \ xfs_alloc_btree.o \ xfs_attr.o \ xfs_attr_leaf.o \ + xfs_attr_remote.o \ xfs_bmap.o \ xfs_bmap_btree.o \ xfs_btree.o \ diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index de4093f..449a240 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -35,6 +35,7 @@ #include "xfs_bmap.h" #include "xfs_attr.h" #include "xfs_attr_leaf.h" +#include "xfs_attr_remote.h" #include "xfs_quota.h" #include "xfs_trans_space.h" #include "xfs_vnodeops.h" @@ -73,13 +74,6 @@ STATIC int xfs_attr_node_list(xfs_attr_list_context_t *context); STATIC int xfs_attr_fillstate(xfs_da_state_t *state); STATIC int xfs_attr_refillstate(xfs_da_state_t *state); -/* - * Routines to manipulate out-of-line attribute values. - */ -STATIC int xfs_attr_rmtval_set(xfs_da_args_t *args); -STATIC int xfs_attr_rmtval_remove(xfs_da_args_t *args); - -#define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ STATIC int xfs_attr_name_to_xname( @@ -1926,293 +1920,3 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) xfs_trans_brelse(NULL, bp); return 0; } - - -/*======================================================================== - * External routines for manipulating out-of-line attribute values. - *========================================================================*/ - -/* - * Read the value associated with an attribute from the out-of-line buffer - * that we stored it in. - */ -int -xfs_attr_rmtval_get(xfs_da_args_t *args) -{ - xfs_bmbt_irec_t map[ATTR_RMTVALUE_MAPSIZE]; - xfs_mount_t *mp; - xfs_daddr_t dblkno; - void *dst; - xfs_buf_t *bp; - int nmap, error, tmp, valuelen, blkcnt, i; - xfs_dablk_t lblkno; - - trace_xfs_attr_rmtval_get(args); - - ASSERT(!(args->flags & ATTR_KERNOVAL)); - - mp = args->dp->i_mount; - dst = args->value; - valuelen = args->valuelen; - lblkno = args->rmtblkno; - while (valuelen > 0) { - nmap = ATTR_RMTVALUE_MAPSIZE; - error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, - args->rmtblkcnt, map, &nmap, - XFS_BMAPI_ATTRFORK); - if (error) - return(error); - ASSERT(nmap >= 1); - - for (i = 0; (i < nmap) && (valuelen > 0); i++) { - ASSERT((map[i].br_startblock != DELAYSTARTBLOCK) && - (map[i].br_startblock != HOLESTARTBLOCK)); - dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock); - blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount); - error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, - dblkno, blkcnt, 0, &bp, NULL); - if (error) - return(error); - - tmp = min_t(int, valuelen, BBTOB(bp->b_length)); - xfs_buf_iomove(bp, 0, tmp, dst, XBRW_READ); - xfs_buf_relse(bp); - dst += tmp; - valuelen -= tmp; - - lblkno += map[i].br_blockcount; - } - } - ASSERT(valuelen == 0); - return(0); -} - -/* - * Write the value associated with an attribute into the out-of-line buffer - * that we have defined for it. - */ -STATIC int -xfs_attr_rmtval_set(xfs_da_args_t *args) -{ - xfs_mount_t *mp; - xfs_fileoff_t lfileoff; - xfs_inode_t *dp; - xfs_bmbt_irec_t map; - xfs_daddr_t dblkno; - void *src; - xfs_buf_t *bp; - xfs_dablk_t lblkno; - int blkcnt, valuelen, nmap, error, tmp, committed; - - trace_xfs_attr_rmtval_set(args); - - dp = args->dp; - mp = dp->i_mount; - src = args->value; - - /* - * Find a "hole" in the attribute address space large enough for - * us to drop the new attribute's value into. - */ - blkcnt = XFS_B_TO_FSB(mp, args->valuelen); - lfileoff = 0; - error = xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, - XFS_ATTR_FORK); - if (error) { - return(error); - } - args->rmtblkno = lblkno = (xfs_dablk_t)lfileoff; - args->rmtblkcnt = blkcnt; - - /* - * Roll through the "value", allocating blocks on disk as required. - */ - while (blkcnt > 0) { - /* - * Allocate a single extent, up to the size of the value. - */ - xfs_bmap_init(args->flist, args->firstblock); - nmap = 1; - error = xfs_bmapi_write(args->trans, dp, (xfs_fileoff_t)lblkno, - blkcnt, - XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - args->firstblock, args->total, &map, &nmap, - args->flist); - if (!error) { - error = xfs_bmap_finish(&args->trans, args->flist, - &committed); - } - if (error) { - ASSERT(committed); - args->trans = NULL; - xfs_bmap_cancel(args->flist); - return(error); - } - - /* - * bmap_finish() may have committed the last trans and started - * a new one. We need the inode to be in all transactions. - */ - if (committed) - xfs_trans_ijoin(args->trans, dp, 0); - - ASSERT(nmap == 1); - ASSERT((map.br_startblock != DELAYSTARTBLOCK) && - (map.br_startblock != HOLESTARTBLOCK)); - lblkno += map.br_blockcount; - blkcnt -= map.br_blockcount; - - /* - * Start the next trans in the chain. - */ - error = xfs_trans_roll(&args->trans, dp); - if (error) - return (error); - } - - /* - * Roll through the "value", copying the attribute value to the - * already-allocated blocks. Blocks are written synchronously - * so that we can know they are all on disk before we turn off - * the INCOMPLETE flag. - */ - lblkno = args->rmtblkno; - valuelen = args->valuelen; - while (valuelen > 0) { - int buflen; - - /* - * Try to remember where we decided to put the value. - */ - xfs_bmap_init(args->flist, args->firstblock); - nmap = 1; - error = xfs_bmapi_read(dp, (xfs_fileoff_t)lblkno, - args->rmtblkcnt, &map, &nmap, - XFS_BMAPI_ATTRFORK); - if (error) - return(error); - ASSERT(nmap == 1); - ASSERT((map.br_startblock != DELAYSTARTBLOCK) && - (map.br_startblock != HOLESTARTBLOCK)); - - dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), - blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); - - bp = xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, 0); - if (!bp) - return ENOMEM; - - buflen = BBTOB(bp->b_length); - tmp = min_t(int, valuelen, buflen); - xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); - if (tmp < buflen) - xfs_buf_zero(bp, tmp, buflen - tmp); - - error = xfs_bwrite(bp); /* GROT: NOTE: synchronous write */ - xfs_buf_relse(bp); - if (error) - return error; - src += tmp; - valuelen -= tmp; - - lblkno += map.br_blockcount; - } - ASSERT(valuelen == 0); - return(0); -} - -/* - * Remove the value associated with an attribute by deleting the - * out-of-line buffer that it is stored on. - */ -STATIC int -xfs_attr_rmtval_remove(xfs_da_args_t *args) -{ - xfs_mount_t *mp; - xfs_bmbt_irec_t map; - xfs_buf_t *bp; - xfs_daddr_t dblkno; - xfs_dablk_t lblkno; - int valuelen, blkcnt, nmap, error, done, committed; - - trace_xfs_attr_rmtval_remove(args); - - mp = args->dp->i_mount; - - /* - * Roll through the "value", invalidating the attribute value's - * blocks. - */ - lblkno = args->rmtblkno; - valuelen = args->rmtblkcnt; - while (valuelen > 0) { - /* - * Try to remember where we decided to put the value. - */ - nmap = 1; - error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, - args->rmtblkcnt, &map, &nmap, - XFS_BMAPI_ATTRFORK); - if (error) - return(error); - ASSERT(nmap == 1); - ASSERT((map.br_startblock != DELAYSTARTBLOCK) && - (map.br_startblock != HOLESTARTBLOCK)); - - dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), - blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); - - /* - * If the "remote" value is in the cache, remove it. - */ - bp = xfs_incore(mp->m_ddev_targp, dblkno, blkcnt, XBF_TRYLOCK); - if (bp) { - xfs_buf_stale(bp); - xfs_buf_relse(bp); - bp = NULL; - } - - valuelen -= map.br_blockcount; - - lblkno += map.br_blockcount; - } - - /* - * Keep de-allocating extents until the remote-value region is gone. - */ - lblkno = args->rmtblkno; - blkcnt = args->rmtblkcnt; - done = 0; - while (!done) { - xfs_bmap_init(args->flist, args->firstblock); - error = xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt, - XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - 1, args->firstblock, args->flist, - &done); - if (!error) { - error = xfs_bmap_finish(&args->trans, args->flist, - &committed); - } - if (error) { - ASSERT(committed); - args->trans = NULL; - xfs_bmap_cancel(args->flist); - return(error); - } - - /* - * bmap_finish() may have committed the last trans and started - * a new one. We need the inode to be in all transactions. - */ - if (committed) - xfs_trans_ijoin(args->trans, args->dp, 0); - - /* - * Close out trans and start the next one in the chain. - */ - error = xfs_trans_roll(&args->trans, args->dp); - if (error) - return (error); - } - return(0); -} diff --git a/fs/xfs/xfs_attr.h b/fs/xfs/xfs_attr.h index e920d68..de8dd58 100644 --- a/fs/xfs/xfs_attr.h +++ b/fs/xfs/xfs_attr.h @@ -140,7 +140,6 @@ typedef struct xfs_attr_list_context { * Overall external interface routines. */ int xfs_attr_inactive(struct xfs_inode *dp); -int xfs_attr_rmtval_get(struct xfs_da_args *args); int xfs_attr_list_int(struct xfs_attr_list_context *); #endif /* __XFS_ATTR_H__ */ diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 9c18451..a1cb746 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -32,6 +32,7 @@ #include "xfs_alloc.h" #include "xfs_btree.h" #include "xfs_attr_sf.h" +#include "xfs_attr_remote.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c new file mode 100644 index 0000000..d0d67e9 --- /dev/null +++ b/fs/xfs/xfs_attr_remote.c @@ -0,0 +1,328 @@ +/* + * Copyright (c) 2000-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 + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_types.h" +#include "xfs_bit.h" +#include "xfs_log.h" +#include "xfs_trans.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_error.h" +#include "xfs_da_btree.h" +#include "xfs_bmap_btree.h" +#include "xfs_dinode.h" +#include "xfs_inode.h" +#include "xfs_alloc.h" +#include "xfs_inode_item.h" +#include "xfs_bmap.h" +#include "xfs_attr.h" +#include "xfs_attr_leaf.h" +#include "xfs_attr_remote.h" +#include "xfs_trans_space.h" +#include "xfs_trace.h" + + +#define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ + +/* + * Read the value associated with an attribute from the out-of-line buffer + * that we stored it in. + */ +int +xfs_attr_rmtval_get(xfs_da_args_t *args) +{ + xfs_bmbt_irec_t map[ATTR_RMTVALUE_MAPSIZE]; + xfs_mount_t *mp; + xfs_daddr_t dblkno; + void *dst; + xfs_buf_t *bp; + int nmap, error, tmp, valuelen, blkcnt, i; + xfs_dablk_t lblkno; + + trace_xfs_attr_rmtval_get(args); + + ASSERT(!(args->flags & ATTR_KERNOVAL)); + + mp = args->dp->i_mount; + dst = args->value; + valuelen = args->valuelen; + lblkno = args->rmtblkno; + while (valuelen > 0) { + nmap = ATTR_RMTVALUE_MAPSIZE; + error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, + args->rmtblkcnt, map, &nmap, + XFS_BMAPI_ATTRFORK); + if (error) + return(error); + ASSERT(nmap >= 1); + + for (i = 0; (i < nmap) && (valuelen > 0); i++) { + ASSERT((map[i].br_startblock != DELAYSTARTBLOCK) && + (map[i].br_startblock != HOLESTARTBLOCK)); + dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock); + blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount); + error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, + dblkno, blkcnt, 0, &bp, NULL); + if (error) + return(error); + + tmp = min_t(int, valuelen, BBTOB(bp->b_length)); + xfs_buf_iomove(bp, 0, tmp, dst, XBRW_READ); + xfs_buf_relse(bp); + dst += tmp; + valuelen -= tmp; + + lblkno += map[i].br_blockcount; + } + } + ASSERT(valuelen == 0); + return(0); +} + +/* + * Write the value associated with an attribute into the out-of-line buffer + * that we have defined for it. + */ +int +xfs_attr_rmtval_set(xfs_da_args_t *args) +{ + xfs_mount_t *mp; + xfs_fileoff_t lfileoff; + xfs_inode_t *dp; + xfs_bmbt_irec_t map; + xfs_daddr_t dblkno; + void *src; + xfs_buf_t *bp; + xfs_dablk_t lblkno; + int blkcnt, valuelen, nmap, error, tmp, committed; + + trace_xfs_attr_rmtval_set(args); + + dp = args->dp; + mp = dp->i_mount; + src = args->value; + + /* + * Find a "hole" in the attribute address space large enough for + * us to drop the new attribute's value into. + */ + blkcnt = XFS_B_TO_FSB(mp, args->valuelen); + lfileoff = 0; + error = xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, + XFS_ATTR_FORK); + if (error) { + return(error); + } + args->rmtblkno = lblkno = (xfs_dablk_t)lfileoff; + args->rmtblkcnt = blkcnt; + + /* + * Roll through the "value", allocating blocks on disk as required. + */ + while (blkcnt > 0) { + /* + * Allocate a single extent, up to the size of the value. + */ + xfs_bmap_init(args->flist, args->firstblock); + nmap = 1; + error = xfs_bmapi_write(args->trans, dp, (xfs_fileoff_t)lblkno, + blkcnt, + XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, + args->firstblock, args->total, &map, &nmap, + args->flist); + if (!error) { + error = xfs_bmap_finish(&args->trans, args->flist, + &committed); + } + if (error) { + ASSERT(committed); + args->trans = NULL; + xfs_bmap_cancel(args->flist); + return(error); + } + + /* + * bmap_finish() may have committed the last trans and started + * a new one. We need the inode to be in all transactions. + */ + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); + + ASSERT(nmap == 1); + ASSERT((map.br_startblock != DELAYSTARTBLOCK) && + (map.br_startblock != HOLESTARTBLOCK)); + lblkno += map.br_blockcount; + blkcnt -= map.br_blockcount; + + /* + * Start the next trans in the chain. + */ + error = xfs_trans_roll(&args->trans, dp); + if (error) + return (error); + } + + /* + * Roll through the "value", copying the attribute value to the + * already-allocated blocks. Blocks are written synchronously + * so that we can know they are all on disk before we turn off + * the INCOMPLETE flag. + */ + lblkno = args->rmtblkno; + valuelen = args->valuelen; + while (valuelen > 0) { + int buflen; + + /* + * Try to remember where we decided to put the value. + */ + xfs_bmap_init(args->flist, args->firstblock); + nmap = 1; + error = xfs_bmapi_read(dp, (xfs_fileoff_t)lblkno, + args->rmtblkcnt, &map, &nmap, + XFS_BMAPI_ATTRFORK); + if (error) + return(error); + ASSERT(nmap == 1); + ASSERT((map.br_startblock != DELAYSTARTBLOCK) && + (map.br_startblock != HOLESTARTBLOCK)); + + dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), + blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); + + bp = xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, 0); + if (!bp) + return ENOMEM; + + buflen = BBTOB(bp->b_length); + tmp = min_t(int, valuelen, buflen); + xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); + if (tmp < buflen) + xfs_buf_zero(bp, tmp, buflen - tmp); + + error = xfs_bwrite(bp); /* GROT: NOTE: synchronous write */ + xfs_buf_relse(bp); + if (error) + return error; + src += tmp; + valuelen -= tmp; + + lblkno += map.br_blockcount; + } + ASSERT(valuelen == 0); + return(0); +} + +/* + * Remove the value associated with an attribute by deleting the + * out-of-line buffer that it is stored on. + */ +int +xfs_attr_rmtval_remove(xfs_da_args_t *args) +{ + xfs_mount_t *mp; + xfs_bmbt_irec_t map; + xfs_buf_t *bp; + xfs_daddr_t dblkno; + xfs_dablk_t lblkno; + int valuelen, blkcnt, nmap, error, done, committed; + + trace_xfs_attr_rmtval_remove(args); + + mp = args->dp->i_mount; + + /* + * Roll through the "value", invalidating the attribute value's + * blocks. + */ + lblkno = args->rmtblkno; + valuelen = args->rmtblkcnt; + while (valuelen > 0) { + /* + * Try to remember where we decided to put the value. + */ + nmap = 1; + error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, + args->rmtblkcnt, &map, &nmap, + XFS_BMAPI_ATTRFORK); + if (error) + return(error); + ASSERT(nmap == 1); + ASSERT((map.br_startblock != DELAYSTARTBLOCK) && + (map.br_startblock != HOLESTARTBLOCK)); + + dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), + blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); + + /* + * If the "remote" value is in the cache, remove it. + */ + bp = xfs_incore(mp->m_ddev_targp, dblkno, blkcnt, XBF_TRYLOCK); + if (bp) { + xfs_buf_stale(bp); + xfs_buf_relse(bp); + bp = NULL; + } + + valuelen -= map.br_blockcount; + + lblkno += map.br_blockcount; + } + + /* + * Keep de-allocating extents until the remote-value region is gone. + */ + lblkno = args->rmtblkno; + blkcnt = args->rmtblkcnt; + done = 0; + while (!done) { + xfs_bmap_init(args->flist, args->firstblock); + error = xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt, + XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, + 1, args->firstblock, args->flist, + &done); + if (!error) { + error = xfs_bmap_finish(&args->trans, args->flist, + &committed); + } + if (error) { + ASSERT(committed); + args->trans = NULL; + xfs_bmap_cancel(args->flist); + return(error); + } + + /* + * bmap_finish() may have committed the last trans and started + * a new one. We need the inode to be in all transactions. + */ + if (committed) + xfs_trans_ijoin(args->trans, args->dp, 0); + + /* + * Close out trans and start the next one in the chain. + */ + error = xfs_trans_roll(&args->trans, args->dp); + if (error) + return (error); + } + return(0); +} + diff --git a/fs/xfs/xfs_attr_remote.h b/fs/xfs/xfs_attr_remote.h new file mode 100644 index 0000000..2a34b9a --- /dev/null +++ b/fs/xfs/xfs_attr_remote.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_ATTR_REMOTE_H__ +#define __XFS_ATTR_REMOTE_H__ + +int xfs_attr_rmtval_get(struct xfs_da_args *args); +int xfs_attr_rmtval_set(struct xfs_da_args *args); +int xfs_attr_rmtval_remove(struct xfs_da_args *args); + +#endif /* __XFS_ATTR_REMOTE_H__ */ -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C880E29E21 for ; Wed, 3 Apr 2013 00:12:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 64974AC002 for ; Tue, 2 Apr 2013 22:12:55 -0700 (PDT) X-ASG-Debug-ID: 1364965966-04bdf0542b18eb70002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id pTm0bEWJIiOyRhqB for ; Tue, 02 Apr 2013 22:12: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: AkAKANm5W1F5LBrj/2dsb2JhbABDgwfAZQQBgQcXdIIfAQEFGg0vMwgYMTkDGxmIE8FdjUwwgRKDUgOgXocYgx8o Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:42:17 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzR-0000M6-Pp for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:12:05 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFzH-0005CK-MR for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 20/22] xfs: buffer type overruns blf_flags field Date: Wed, 3 Apr 2013 16:11:30 +1100 X-ASG-Orig-Subj: [PATCH 20/22] xfs: buffer type overruns blf_flags field Message-Id: <1364965892-19623-21-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965969 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The buffer type passed to log recvoery in the buffer log item overruns the blf_flags field. I had assumed that flags field was a 32 bit value, and it turns out it is a unisgned short. Therefore having 19 flags doesn't really work. Convert the buffer type field to numeric value, and use the top 5 bits of the flags field for it. We currently have 17 types of buffers, so using 5 bits gives us plenty of room for expansion in future.... Signed-off-by: Dave Chinner --- fs/xfs/xfs_alloc.c | 4 +- fs/xfs/xfs_attr_leaf.c | 6 +-- fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_btree.c | 8 ++-- fs/xfs/xfs_buf_item.h | 92 ++++++++++++++++++++++++++-------------------- fs/xfs/xfs_da_btree.c | 12 +++--- fs/xfs/xfs_dir2_block.c | 4 +- fs/xfs/xfs_dir2_data.c | 4 +- fs/xfs/xfs_dir2_leaf.c | 12 +++--- fs/xfs/xfs_dir2_node.c | 10 ++--- fs/xfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_log_recover.c | 38 ++++++++++--------- fs/xfs/xfs_trans.h | 4 -- fs/xfs/xfs_trans_buf.c | 42 ++++++++++++++------- 14 files changed, 134 insertions(+), 106 deletions(-) diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 40d3d57..5673bcf 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -2099,7 +2099,7 @@ xfs_alloc_log_agf( trace_xfs_agf(tp->t_mountp, XFS_BUF_TO_AGF(bp), fields, _RET_IP_); - xfs_trans_buf_set_type(tp, bp, XFS_BLF_AGF_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_AGF_BUF); xfs_btree_offsets(fields, offsets, XFS_AGF_NUM_BITS, &first, &last); xfs_trans_log_buf(tp, bp, (uint)first, (uint)last); @@ -2179,7 +2179,7 @@ xfs_alloc_put_freelist( xfs_alloc_log_agf(tp, agbp, logflags); - xfs_trans_buf_set_type(tp, agflbp, XFS_BLF_AGFL_BUF); + xfs_trans_buf_set_type(tp, agflbp, XFS_BLFT_AGFL_BUF); xfs_trans_log_buf(tp, agflbp, startoff, startoff + sizeof(xfs_agblock_t) - 1); return 0; diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 7feaf3c..5e708dc 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -276,7 +276,7 @@ xfs_attr3_leaf_read( err = xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, XFS_ATTR_FORK, &xfs_attr3_leaf_buf_ops); if (!err && tp) - xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_ATTR_LEAF_BUF); + xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_ATTR_LEAF_BUF); return err; } @@ -1083,7 +1083,7 @@ xfs_attr3_leaf_to_node( goto out; /* copy leaf to new buffer, update identifiers */ - xfs_trans_buf_set_type(args->trans, bp2, XFS_BLF_ATTR_LEAF_BUF); + xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF); bp2->b_ops = bp1->b_ops; memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp)); if (xfs_sb_version_hascrc(&mp->m_sb)) { @@ -1146,7 +1146,7 @@ xfs_attr3_leaf_create( if (error) return error; bp->b_ops = &xfs_attr3_leaf_buf_ops; - xfs_trans_buf_set_type(args->trans, bp, XFS_BLF_ATTR_LEAF_BUF); + xfs_trans_buf_set_type(args->trans, bp, XFS_BLFT_ATTR_LEAF_BUF); leaf = bp->b_addr; memset(leaf, 0, XFS_LBSIZE(mp)); diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 2844724..8904284 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1338,7 +1338,7 @@ xfs_bmap_local_to_extents_init_fn( ASSERT(0); bp->b_ops = &xfs_bmbt_buf_ops; memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); - xfs_trans_buf_set_type(tp, bp, XFS_BLF_BTREE_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_BTREE_BUF); } /* diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index ec77036..8804b8a 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -1282,7 +1282,7 @@ xfs_btree_log_keys( XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); if (bp) { - xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_key_offset(cur, first), xfs_btree_key_offset(cur, last + 1) - 1); @@ -1307,7 +1307,7 @@ xfs_btree_log_recs( XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); - xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_rec_offset(cur, first), xfs_btree_rec_offset(cur, last + 1) - 1); @@ -1332,7 +1332,7 @@ xfs_btree_log_ptrs( struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); int level = xfs_btree_get_level(block); - xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_ptr_offset(cur, first, level), xfs_btree_ptr_offset(cur, last + 1, level) - 1); @@ -1407,7 +1407,7 @@ xfs_btree_log_block( (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? loffsets : soffsets, nbits, &first, &last); - xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, first, last); } else { xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 640adcf..2573d2a 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -39,45 +39,6 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_PDQUOT_BUF (1<<3) #define XFS_BLF_GDQUOT_BUF (1<<4) -/* - * all buffers now need flags to tell recovery where the magic number - * is so that it can verify and calculate the CRCs on the buffer correctly - * once the changes have been replayed into the buffer. - */ -#define XFS_BLF_BTREE_BUF (1<<5) -#define XFS_BLF_AGF_BUF (1<<6) -#define XFS_BLF_AGFL_BUF (1<<7) -#define XFS_BLF_AGI_BUF (1<<8) -#define XFS_BLF_DINO_BUF (1<<9) -#define XFS_BLF_SYMLINK_BUF (1<<10) -#define XFS_BLF_DIR_BLOCK_BUF (1<<11) -#define XFS_BLF_DIR_DATA_BUF (1<<12) -#define XFS_BLF_DIR_FREE_BUF (1<<13) -#define XFS_BLF_DIR_LEAF1_BUF (1<<14) -#define XFS_BLF_DIR_LEAFN_BUF (1<<15) -#define XFS_BLF_DA_NODE_BUF (1<<16) -#define XFS_BLF_ATTR_LEAF_BUF (1<<17) -#define XFS_BLF_ATTR_RMT_BUF (1<<18) - -#define XFS_BLF_TYPE_MASK \ - (XFS_BLF_UDQUOT_BUF | \ - XFS_BLF_PDQUOT_BUF | \ - XFS_BLF_GDQUOT_BUF | \ - XFS_BLF_BTREE_BUF | \ - XFS_BLF_AGF_BUF | \ - XFS_BLF_AGFL_BUF | \ - XFS_BLF_AGI_BUF | \ - XFS_BLF_DINO_BUF | \ - XFS_BLF_SYMLINK_BUF | \ - XFS_BLF_DIR_BLOCK_BUF | \ - XFS_BLF_DIR_DATA_BUF | \ - XFS_BLF_DIR_FREE_BUF | \ - XFS_BLF_DIR_LEAF1_BUF | \ - XFS_BLF_DIR_LEAFN_BUF | \ - XFS_BLF_DA_NODE_BUF | \ - XFS_BLF_ATTR_LEAF_BUF | \ - XFS_BLF_ATTR_RMT_BUF) - #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 #define BIT_TO_WORD_SHIFT 5 @@ -101,6 +62,55 @@ typedef struct xfs_buf_log_format { } xfs_buf_log_format_t; /* + * All buffers now need to tell recovery where the magic number + * is so that it can verify and calculate the CRCs on the buffer correctly + * once the changes have been replayed into the buffer. + * + * The type value is held in the upper 5 bits of the blf_flags field, which is + * an unsigned 16 bit field. Hence we need to shift it 11 bits up and down. + */ +#define XFS_BLFT_BITS 5 +#define XFS_BLFT_SHIFT 11 +#define XFS_BLFT_MASK (((1 << XFS_BLFT_BITS) - 1) << XFS_BLFT_SHIFT) + +enum xfs_blft { + XFS_BLFT_UNKNOWN_BUF = 0, + XFS_BLFT_UDQUOT_BUF, + XFS_BLFT_PDQUOT_BUF, + XFS_BLFT_GDQUOT_BUF, + XFS_BLFT_BTREE_BUF, + XFS_BLFT_AGF_BUF, + XFS_BLFT_AGFL_BUF, + XFS_BLFT_AGI_BUF, + XFS_BLFT_DINO_BUF, + XFS_BLFT_SYMLINK_BUF, + XFS_BLFT_DIR_BLOCK_BUF, + XFS_BLFT_DIR_DATA_BUF, + XFS_BLFT_DIR_FREE_BUF, + XFS_BLFT_DIR_LEAF1_BUF, + XFS_BLFT_DIR_LEAFN_BUF, + XFS_BLFT_DA_NODE_BUF, + XFS_BLFT_ATTR_LEAF_BUF, + XFS_BLFT_ATTR_RMT_BUF, + XFS_BLFT_SB_BUF, + XFS_BLFT_MAX_BUF = (1 << XFS_BLFT_BITS), +}; + +static inline void +xfs_blft_to_flags(struct xfs_buf_log_format *blf, enum xfs_blft type) +{ + ASSERT(type > XFS_BLFT_UNKNOWN_BUF && type < XFS_BLFT_MAX_BUF); + blf->blf_flags &= ~XFS_BLFT_MASK; + blf->blf_flags |= ((type << XFS_BLFT_SHIFT) & XFS_BLFT_MASK); +} + +static inline __uint16_t +xfs_blft_from_flags(struct xfs_buf_log_format *blf) +{ + return (blf->blf_flags & XFS_BLFT_MASK) >> XFS_BLFT_SHIFT; +} + +/* * buf log item flags */ #define XFS_BLI_HOLD 0x01 @@ -153,6 +163,10 @@ void xfs_buf_attach_iodone(struct xfs_buf *, void xfs_buf_iodone_callbacks(struct xfs_buf *); void xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *); +void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, + enum xfs_blft); +void xfs_trans_buf_copy_type(struct xfs_buf *dst_bp, struct xfs_buf *src_bp); + #endif /* __KERNEL__ */ #endif /* __XFS_BUF_ITEM_H__ */ diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index a78865e..504e58f 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -312,15 +312,15 @@ xfs_da3_node_read( switch (be16_to_cpu(info->magic)) { case XFS_DA3_NODE_MAGIC: case XFS_DA_NODE_MAGIC: - type = XFS_BLF_DA_NODE_BUF; + type = XFS_BLFT_DA_NODE_BUF; break; case XFS_ATTR_LEAF_MAGIC: case XFS_ATTR3_LEAF_MAGIC: - type = XFS_BLF_ATTR_LEAF_BUF; + type = XFS_BLFT_ATTR_LEAF_BUF; break; case XFS_DIR2_LEAFN_MAGIC: case XFS_DIR3_LEAFN_MAGIC: - type = XFS_BLF_DIR_LEAFN_BUF; + type = XFS_BLFT_DIR_LEAFN_BUF; break; default: type = 0; @@ -361,7 +361,7 @@ xfs_da3_node_create( if (error) return(error); bp->b_ops = &xfs_da3_node_buf_ops; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DA_NODE_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF); node = bp->b_addr; if (xfs_sb_version_hascrc(&mp->m_sb)) { @@ -595,7 +595,7 @@ xfs_da3_root_split( * we are about to copy oldroot to bp, so set up the type * of bp while we know exactly what it will be. */ - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DA_NODE_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF); } else { struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir2_leaf_entry *ents; @@ -613,7 +613,7 @@ xfs_da3_root_split( * we are about to copy oldroot to bp, so set up the type * of bp while we know exactly what it will be. */ - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAFN_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAFN_BUF); } /* diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 58816ec..e59f5fc 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -137,7 +137,7 @@ xfs_dir3_block_read( err = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, XFS_DATA_FORK, &xfs_dir3_block_buf_ops); if (!err && tp) - xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_BLOCK_BUF); + xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_BLOCK_BUF); return err; } @@ -151,7 +151,7 @@ xfs_dir3_block_init( struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; bp->b_ops = &xfs_dir3_block_buf_ops; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_BLOCK_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_BLOCK_BUF); if (xfs_sb_version_hascrc(&mp->m_sb)) { memset(hdr3, 0, sizeof(*hdr3)); diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 5e0c711..c293023 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -306,7 +306,7 @@ xfs_dir3_data_read( err = xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp, XFS_DATA_FORK, &xfs_dir3_data_buf_ops); if (!err && tp) - xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_DATA_BUF); + xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_DATA_BUF); return err; } @@ -576,7 +576,7 @@ xfs_dir3_data_init( if (error) return error; bp->b_ops = &xfs_dir3_data_buf_ops; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_DATA_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_DATA_BUF); /* * Initialize the header. diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 209962e..54627af 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -302,7 +302,7 @@ xfs_dir3_leaf_read( err = xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, XFS_DATA_FORK, &xfs_dir3_leaf1_buf_ops); if (!err && tp) - xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_LEAF1_BUF); + xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_LEAF1_BUF); return err; } @@ -319,7 +319,7 @@ xfs_dir3_leafn_read( err = xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, XFS_DATA_FORK, &xfs_dir3_leafn_buf_ops); if (!err && tp) - xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_LEAFN_BUF); + xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_LEAFN_BUF); return err; } @@ -364,10 +364,10 @@ xfs_dir3_leaf_init( ltp = xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount = 0; bp->b_ops = &xfs_dir3_leaf1_buf_ops; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAF1_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAF1_BUF); } else { bp->b_ops = &xfs_dir3_leafn_buf_ops; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAFN_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAFN_BUF); } } @@ -489,7 +489,7 @@ xfs_dir2_block_to_leaf( * Fix up the block header, make it a data block. */ dbp->b_ops = &xfs_dir3_data_buf_ops; - xfs_trans_buf_set_type(tp, dbp, XFS_BLF_DIR_DATA_BUF); + xfs_trans_buf_set_type(tp, dbp, XFS_BLFT_DIR_DATA_BUF); if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); else @@ -2198,7 +2198,7 @@ xfs_dir2_node_to_leaf( xfs_dir3_leaf_compact(args, &leafhdr, lbp); lbp->b_ops = &xfs_dir3_leaf1_buf_ops; - xfs_trans_buf_set_type(tp, lbp, XFS_BLF_DIR_LEAF1_BUF); + xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAF1_BUF); leafhdr.magic = (leafhdr.magic == XFS_DIR2_LEAFN_MAGIC) ? XFS_DIR2_LEAF1_MAGIC : XFS_DIR3_LEAF1_MAGIC; diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index d2e19fb..a094555 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -168,7 +168,7 @@ __xfs_dir3_free_read( /* try read returns without an error or *bpp if it lands in a hole */ if (!err && tp && *bpp) - xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_FREE_BUF); + xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_FREE_BUF); return err; } @@ -256,7 +256,7 @@ xfs_dir3_free_get_buf( if (error) return error; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_FREE_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_FREE_BUF); bp->b_ops = &xfs_dir3_free_buf_ops; /* @@ -404,7 +404,7 @@ xfs_dir2_leaf_to_node( else leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); lbp->b_ops = &xfs_dir3_leafn_buf_ops; - xfs_trans_buf_set_type(tp, lbp, XFS_BLF_DIR_LEAFN_BUF); + xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAFN_BUF); xfs_dir3_leaf_log_header(tp, lbp); xfs_dir3_leaf_check(mp, lbp); return 0; @@ -816,7 +816,7 @@ xfs_dir2_leafn_lookup_for_entry( (char *)curbp->b_addr); state->extrablk.magic = XFS_DIR2_DATA_MAGIC; curbp->b_ops = &xfs_dir3_data_buf_ops; - xfs_trans_buf_set_type(tp, curbp, XFS_BLF_DIR_DATA_BUF); + xfs_trans_buf_set_type(tp, curbp, XFS_BLFT_DIR_DATA_BUF); if (cmp == XFS_CMP_EXACT) return XFS_ERROR(EEXIST); } @@ -831,7 +831,7 @@ xfs_dir2_leafn_lookup_for_entry( state->extrablk.blkno = curdb; state->extrablk.magic = XFS_DIR2_DATA_MAGIC; curbp->b_ops = &xfs_dir3_data_buf_ops; - xfs_trans_buf_set_type(tp, curbp, XFS_BLF_DIR_DATA_BUF); + xfs_trans_buf_set_type(tp, curbp, XFS_BLFT_DIR_DATA_BUF); } else { /* If the curbp is not the CI match block, drop it */ if (state->extrablk.bp != curbp) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 3039f82..c8f5ae1 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1487,7 +1487,7 @@ xfs_ialloc_log_agi( /* * Log the allocation group inode header buffer. */ - xfs_trans_buf_set_type(tp, bp, XFS_BLF_AGI_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_AGI_BUF); xfs_trans_log_buf(tp, bp, first, last); } diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 00727bc..8628507 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1888,8 +1888,8 @@ xlog_recovery_validate_buf_type( magic32 = be32_to_cpu(*(__be32 *)bp->b_addr); magic16 = be16_to_cpu(*(__be16*)bp->b_addr); magicda = be16_to_cpu(info->magic); - switch (buf_f->blf_flags & XFS_BLF_TYPE_MASK) { - case XFS_BLF_BTREE_BUF: + switch (xfs_blft_from_flags(buf_f)) { + case XFS_BLFT_BTREE_BUF: switch (magic32) { case XFS_ABTB_CRC_MAGIC: case XFS_ABTC_CRC_MAGIC: @@ -1911,7 +1911,7 @@ xlog_recovery_validate_buf_type( break; } break; - case XFS_BLF_AGF_BUF: + case XFS_BLFT_AGF_BUF: if (magic32 != XFS_AGF_MAGIC) { xfs_warn(mp, "Bad AGF block magic!"); ASSERT(0); @@ -1919,7 +1919,7 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_agf_buf_ops; break; - case XFS_BLF_AGFL_BUF: + case XFS_BLFT_AGFL_BUF: if (!xfs_sb_version_hascrc(&mp->m_sb)) break; if (magic32 != XFS_AGFL_MAGIC) { @@ -1929,7 +1929,7 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_agfl_buf_ops; break; - case XFS_BLF_AGI_BUF: + case XFS_BLFT_AGI_BUF: if (magic32 != XFS_AGI_MAGIC) { xfs_warn(mp, "Bad AGI block magic!"); ASSERT(0); @@ -1937,9 +1937,9 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_agi_buf_ops; break; - case XFS_BLF_UDQUOT_BUF: - case XFS_BLF_PDQUOT_BUF: - case XFS_BLF_GDQUOT_BUF: + case XFS_BLFT_UDQUOT_BUF: + case XFS_BLFT_PDQUOT_BUF: + case XFS_BLFT_GDQUOT_BUF: if (magic16 != XFS_DQUOT_MAGIC) { xfs_warn(mp, "Bad DQUOT block magic!"); ASSERT(0); @@ -1947,7 +1947,7 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_dquot_buf_ops; break; - case XFS_BLF_DINO_BUF: + case XFS_BLFT_DINO_BUF: /* * we get here with inode allocation buffers, not buffers that * track unlinked list changes. @@ -1959,7 +1959,7 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_inode_buf_ops; break; - case XFS_BLF_SYMLINK_BUF: + case XFS_BLFT_SYMLINK_BUF: if (magic32 != XFS_SYMLINK_MAGIC) { xfs_warn(mp, "Bad symlink block magic!"); ASSERT(0); @@ -1967,7 +1967,7 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_symlink_buf_ops; break; - case XFS_BLF_DIR_BLOCK_BUF: + case XFS_BLFT_DIR_BLOCK_BUF: if (magic32 != XFS_DIR2_BLOCK_MAGIC && magic32 != XFS_DIR3_BLOCK_MAGIC) { xfs_warn(mp, "Bad dir block magic!"); @@ -1976,7 +1976,7 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_dir3_block_buf_ops; break; - case XFS_BLF_DIR_DATA_BUF: + case XFS_BLFT_DIR_DATA_BUF: if (magic32 != XFS_DIR2_DATA_MAGIC && magic32 != XFS_DIR3_DATA_MAGIC) { xfs_warn(mp, "Bad dir data magic!"); @@ -1985,7 +1985,7 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_dir3_data_buf_ops; break; - case XFS_BLF_DIR_FREE_BUF: + case XFS_BLFT_DIR_FREE_BUF: if (magic32 != XFS_DIR2_FREE_MAGIC && magic32 != XFS_DIR3_FREE_MAGIC) { xfs_warn(mp, "Bad dir3 free magic!"); @@ -1994,7 +1994,7 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_dir3_free_buf_ops; break; - case XFS_BLF_DIR_LEAF1_BUF: + case XFS_BLFT_DIR_LEAF1_BUF: if (magicda != XFS_DIR2_LEAF1_MAGIC && magicda != XFS_DIR3_LEAF1_MAGIC) { xfs_warn(mp, "Bad dir leaf1 magic!"); @@ -2003,7 +2003,7 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_dir3_leaf1_buf_ops; break; - case XFS_BLF_DIR_LEAFN_BUF: + case XFS_BLFT_DIR_LEAFN_BUF: if (magicda != XFS_DIR2_LEAFN_MAGIC && magicda != XFS_DIR3_LEAFN_MAGIC) { xfs_warn(mp, "Bad dir leafn magic!"); @@ -2012,7 +2012,7 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_dir3_leafn_buf_ops; break; - case XFS_BLF_DA_NODE_BUF: + case XFS_BLFT_DA_NODE_BUF: if (magicda != XFS_DA_NODE_MAGIC && magicda != XFS_DA3_NODE_MAGIC) { xfs_warn(mp, "Bad da node magic!"); @@ -2021,7 +2021,7 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_da3_node_buf_ops; break; - case XFS_BLF_ATTR_LEAF_BUF: + case XFS_BLFT_ATTR_LEAF_BUF: if (magicda != XFS_ATTR_LEAF_MAGIC && magicda != XFS_ATTR3_LEAF_MAGIC) { xfs_warn(mp, "Bad attr leaf magic!"); @@ -2030,7 +2030,7 @@ xlog_recovery_validate_buf_type( } bp->b_ops = &xfs_attr3_leaf_buf_ops; break; - case XFS_BLF_ATTR_RMT_BUF: + case XFS_BLFT_ATTR_RMT_BUF: if (!xfs_sb_version_hascrc(&mp->m_sb)) break; if (magicda != XFS_ATTR3_RMT_MAGIC) { @@ -2041,6 +2041,8 @@ xlog_recovery_validate_buf_type( bp->b_ops = &xfs_attr3_rmt_buf_ops; break; default: + xfs_warn(mp, "Unknown buffer type %d!", + xfs_blft_from_flags(buf_f)); break; } } diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index fa78a3f..cd29f61 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -505,10 +505,6 @@ void xfs_trans_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); -void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, - uint); -void xfs_trans_buf_copy_type(struct xfs_buf *dst_bp, - struct xfs_buf *src_bp); void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 40871bf..73a5fa4 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -659,7 +659,7 @@ xfs_trans_binval( ASSERT(XFS_BUF_ISSTALE(bp)); ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); ASSERT(!(bip->__bli_format.blf_flags & XFS_BLF_INODE_BUF)); - ASSERT(!(bip->__bli_format.blf_flags & XFS_BLF_TYPE_MASK)); + ASSERT(!(bip->__bli_format.blf_flags & XFS_BLFT_MASK)); ASSERT(bip->__bli_format.blf_flags & XFS_BLF_CANCEL); ASSERT(bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY); ASSERT(tp->t_flags & XFS_TRANS_DIRTY); @@ -672,7 +672,7 @@ xfs_trans_binval( bip->bli_flags &= ~(XFS_BLI_INODE_BUF | XFS_BLI_LOGGED | XFS_BLI_DIRTY); bip->__bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; bip->__bli_format.blf_flags |= XFS_BLF_CANCEL; - bip->__bli_format.blf_flags &= ~XFS_BLF_TYPE_MASK; + bip->__bli_format.blf_flags &= ~XFS_BLFT_MASK; for (i = 0; i < bip->bli_format_count; i++) { memset(bip->bli_formats[i].blf_data_map, 0, (bip->bli_formats[i].blf_map_size * sizeof(uint))); @@ -704,7 +704,7 @@ xfs_trans_inode_buf( ASSERT(atomic_read(&bip->bli_refcount) > 0); bip->bli_flags |= XFS_BLI_INODE_BUF; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DINO_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DINO_BUF); } /* @@ -729,7 +729,7 @@ xfs_trans_stale_inode_buf( bip->bli_flags |= XFS_BLI_STALE_INODE; bip->bli_item.li_cb = xfs_buf_iodone; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DINO_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DINO_BUF); } /* @@ -753,7 +753,7 @@ xfs_trans_inode_alloc_buf( ASSERT(atomic_read(&bip->bli_refcount) > 0); bip->bli_flags |= XFS_BLI_INODE_ALLOC_BUF; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DINO_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DINO_BUF); } /* @@ -764,7 +764,7 @@ void xfs_trans_buf_set_type( struct xfs_trans *tp, struct xfs_buf *bp, - uint type) + enum xfs_blft type) { struct xfs_buf_log_item *bip = bp->b_fspriv; @@ -774,10 +774,8 @@ xfs_trans_buf_set_type( ASSERT(bp->b_transp == tp); ASSERT(bip != NULL); ASSERT(atomic_read(&bip->bli_refcount) > 0); - ASSERT((type & XFS_BLF_TYPE_MASK) != 0); - bip->__bli_format.blf_flags &= ~XFS_BLF_TYPE_MASK; - bip->__bli_format.blf_flags |= type; + xfs_blft_to_flags(&bip->__bli_format, type); } void @@ -787,11 +785,10 @@ xfs_trans_buf_copy_type( { struct xfs_buf_log_item *sbip = src_bp->b_fspriv; struct xfs_buf_log_item *dbip = dst_bp->b_fspriv; - uint type; + enum xfs_blft type; - type = sbip->__bli_format.blf_flags & XFS_BLF_TYPE_MASK; - dbip->__bli_format.blf_flags &= ~XFS_BLF_TYPE_MASK; - dbip->__bli_format.blf_flags |= type; + type = xfs_blft_from_flags(&sbip->__bli_format); + xfs_blft_to_flags(&dbip->__bli_format, type); } /* @@ -811,9 +808,28 @@ xfs_trans_dquot_buf( xfs_buf_t *bp, uint type) { + struct xfs_buf_log_item *bip = bp->b_fspriv; + ASSERT(type == XFS_BLF_UDQUOT_BUF || type == XFS_BLF_PDQUOT_BUF || type == XFS_BLF_GDQUOT_BUF); + bip->__bli_format.blf_flags |= type; + + switch (type) { + case XFS_BLF_UDQUOT_BUF: + type = XFS_BLFT_UDQUOT_BUF; + break; + case XFS_BLF_PDQUOT_BUF: + type = XFS_BLFT_PDQUOT_BUF; + break; + case XFS_BLF_GDQUOT_BUF: + type = XFS_BLFT_GDQUOT_BUF; + break; + default: + type = XFS_BLFT_UNKNOWN_BUF; + break; + } + xfs_trans_buf_set_type(tp, bp, type); } -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:12:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0ACC929E2B for ; Wed, 3 Apr 2013 00:12:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9A16BAC006 for ; Tue, 2 Apr 2013 22:12:52 -0700 (PDT) X-ASG-Debug-ID: 1364965966-04bdf0542b18eb70001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id sIZV9lxMQkvkA4zS for ; Tue, 02 Apr 2013 22:12:46 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:42:11 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzM-0000Ln-I2 for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:12:00 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFz7-0005Bl-Cp for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:45 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 13/22] xfs: add CRC checking to dir2 leaf blocks Date: Wed, 3 Apr 2013 16:11:23 +1100 X-ASG-Orig-Subj: [PATCH 13/22] xfs: add CRC checking to dir2 leaf blocks Message-Id: <1364965892-19623-14-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965966 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner This addition follows the same pattern as the dir2 block CRCs. Seeing as both LEAF1 and LEAFN types need to changed at the same time, this is a pretty large amount of change. leaf block headers neeed to be abstracted away from the on-disk structures (struct xfs_dir3_icleaf_hdr), as do the base leaf entry locations. This header abstract allows the in-core header and leaf entry location to be passed around instead of the leaf block itself. This saves a lot of converting individual variables from on-disk format to host format where they are used, so there's a good chance that the compiler will be able to produce much more optimal code as it's not having to byteswap variables all over the place. Signed-off-by: Dave Chinner --- fs/xfs/xfs_da_btree.c | 45 ++- fs/xfs/xfs_da_btree.h | 23 ++ fs/xfs/xfs_dir2_block.c | 19 +- fs/xfs/xfs_dir2_format.h | 60 +++- fs/xfs/xfs_dir2_leaf.c | 793 +++++++++++++++++++++++++++++----------------- fs/xfs/xfs_dir2_node.c | 465 +++++++++++++++------------ fs/xfs/xfs_dir2_priv.h | 32 +- 7 files changed, 918 insertions(+), 519 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 4d7696a..2f23b14 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -139,7 +139,8 @@ xfs_da_node_read_verify( bp->b_ops->verify_read(bp); return; case XFS_DIR2_LEAFN_MAGIC: - bp->b_ops = &xfs_dir2_leafn_buf_ops; + case XFS_DIR3_LEAFN_MAGIC: + bp->b_ops = &xfs_dir3_leafn_buf_ops; bp->b_ops->verify_read(bp); return; default: @@ -396,11 +397,18 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, size = (int)((char *)&oldroot->btree[be16_to_cpu(oldroot->hdr.count)] - (char *)oldroot); } else { - ASSERT(oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; + leaf = (xfs_dir2_leaf_t *)oldroot; - size = (int)((char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] - - (char *)leaf); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + + ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || + leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); + size = (int)((char *)&ents[leafhdr.count] - (char *)leaf); } + /* XXX: can't just copy CRC headers from one block to another */ memcpy(node, oldroot, size); xfs_trans_log_buf(tp, bp, 0, size - 1); @@ -424,7 +432,8 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, node->hdr.count = cpu_to_be16(2); #ifdef DEBUG - if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { + if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { ASSERT(blk1->blkno >= mp->m_dirleafblk && blk1->blkno < mp->m_dirfreeblk); ASSERT(blk2->blkno >= mp->m_dirleafblk && @@ -782,6 +791,7 @@ xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level) if (level == 1) { ASSERT(magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); } else ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); @@ -1565,6 +1575,7 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, info = blk->bp->b_addr; ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); blk->magic = be16_to_cpu(info->magic); if (blk->magic == XFS_DA_NODE_MAGIC) { @@ -1584,12 +1595,13 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, NULL); break; case XFS_DIR2_LEAFN_MAGIC: + case XFS_DIR3_LEAFN_MAGIC: + blk->magic = XFS_DIR2_LEAFN_MAGIC; blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, NULL); break; default: - ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC || - blk->magic == XFS_DIR2_LEAFN_MAGIC); + ASSERT(0); break; } } @@ -1833,10 +1845,16 @@ xfs_da_swap_lastblock( /* * Get values from the moved block. */ - if (dead_info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { + if (dead_info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + dead_info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; + dead_leaf2 = (xfs_dir2_leaf_t *)dead_info; + xfs_dir3_leaf_hdr_from_disk(&leafhdr, dead_leaf2); + ents = xfs_dir3_leaf_ents_p(dead_leaf2); dead_level = 0; - dead_hash = be32_to_cpu(dead_leaf2->ents[be16_to_cpu(dead_leaf2->hdr.count) - 1].hashval); + dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval); } else { ASSERT(dead_info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); dead_node = (xfs_da_intnode_t *)dead_info; @@ -2281,10 +2299,17 @@ xfs_da_read_buf( XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && (magic != XFS_ATTR_LEAF_MAGIC) && (magic != XFS_DIR2_LEAF1_MAGIC) && + (magic != XFS_DIR3_LEAF1_MAGIC) && (magic != XFS_DIR2_LEAFN_MAGIC) && + (magic != XFS_DIR3_LEAFN_MAGIC) && (magic1 != XFS_DIR2_BLOCK_MAGIC) && + (magic1 != XFS_DIR3_BLOCK_MAGIC) && (magic1 != XFS_DIR2_DATA_MAGIC) && - (free->hdr.magic != cpu_to_be32(XFS_DIR2_FREE_MAGIC)), + (magic1 != XFS_DIR3_DATA_MAGIC) && + (free->hdr.magic != + cpu_to_be32(XFS_DIR2_FREE_MAGIC)) && + (free->hdr.magic != + cpu_to_be32(XFS_DIR3_FREE_MAGIC)), mp, XFS_ERRTAG_DA_READ_BUF, XFS_RANDOM_DA_READ_BUF))) { trace_xfs_da_btree_corrupt(bp, _RET_IP_); diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index ee5170c..0854b95 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -47,6 +47,29 @@ typedef struct xfs_da_blkinfo { } xfs_da_blkinfo_t; /* + * CRC enabled directory structure types + * + * The headers change size for the additional verification information, but + * otherwise the tree layouts and contents are unchanged. + */ +#define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */ +#define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ + +struct xfs_da3_blkinfo { + /* + * the node link manipulation code relies on the fact that the first + * element of this structure is the struct xfs_da_blkinfo so it can + * ignore the differences in the rest of the structures. + */ + struct xfs_da_blkinfo hdr; + __be32 crc; /* CRC of block */ + __be64 blkno; /* first block of the buffer */ + __be64 lsn; /* sequence number of last write */ + uuid_t uuid; /* filesystem we belong to */ + __be64 owner; /* inode that owns the block */ +}; + +/* * This is the structure of the root and intermediate nodes in the Btree. * The leaf nodes are defined above. * diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 7ec87c2..d2e445f 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -1013,6 +1013,8 @@ xfs_dir2_leaf_to_block( __be16 *tagp; /* end of entry (tag) */ int to; /* block/leaf to index */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; trace_xfs_dir2_leaf_to_block(args); @@ -1020,8 +1022,12 @@ xfs_dir2_leaf_to_block( tp = args->trans; mp = dp->i_mount; leaf = lbp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); ltp = xfs_dir2_leaf_tail_p(mp, leaf); + + ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC || + leafhdr.magic == XFS_DIR3_LEAF1_MAGIC); /* * If there are data blocks other than the first one, take this * opportunity to remove trailing empty data blocks that may have @@ -1058,7 +1064,7 @@ xfs_dir2_leaf_to_block( * Size of the "leaf" area in the block. */ size = (uint)sizeof(xfs_dir2_block_tail_t) + - (uint)sizeof(*lep) * (be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale)); + (uint)sizeof(*lep) * (leafhdr.count - leafhdr.stale); /* * Look at the last data entry. */ @@ -1087,18 +1093,17 @@ xfs_dir2_leaf_to_block( * Initialize the block tail. */ btp = xfs_dir2_block_tail_p(mp, hdr); - btp->count = cpu_to_be32(be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale)); + btp->count = cpu_to_be32(leafhdr.count - leafhdr.stale); btp->stale = 0; xfs_dir2_block_log_tail(tp, dbp); /* * Initialize the block leaf area. We compact out stale entries. */ lep = xfs_dir2_block_leaf_p(btp); - for (from = to = 0; from < be16_to_cpu(leaf->hdr.count); from++) { - if (leaf->ents[from].address == - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + for (from = to = 0; from < leafhdr.count; from++) { + if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) continue; - lep[to++] = leaf->ents[from]; + lep[to++] = ents[from]; } ASSERT(to == be32_to_cpu(btp->count)); xfs_dir2_block_log_leaf(tp, dbp, 0, be32_to_cpu(btp->count) - 1); diff --git a/fs/xfs/xfs_dir2_format.h b/fs/xfs/xfs_dir2_format.h index 0ac0950..7b986d3 100644 --- a/fs/xfs/xfs_dir2_format.h +++ b/fs/xfs/xfs_dir2_format.h @@ -470,6 +470,21 @@ typedef struct xfs_dir2_leaf_hdr { __be16 stale; /* count of stale entries */ } xfs_dir2_leaf_hdr_t; +struct xfs_dir3_leaf_hdr { + struct xfs_da3_blkinfo info; /* header for da routines */ + __be16 count; /* count of entries */ + __be16 stale; /* count of stale entries */ + __be32 pad; +}; + +struct xfs_dir3_icleaf_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t stale; +}; + /* * Leaf block entry. */ @@ -489,23 +504,50 @@ typedef struct xfs_dir2_leaf_tail { * Leaf block. */ typedef struct xfs_dir2_leaf { - xfs_dir2_leaf_hdr_t hdr; /* leaf header */ - xfs_dir2_leaf_entry_t ents[]; /* entries */ + xfs_dir2_leaf_hdr_t hdr; /* leaf header */ + xfs_dir2_leaf_entry_t __ents[]; /* entries */ } xfs_dir2_leaf_t; -/* - * DB blocks here are logical directory block numbers, not filesystem blocks. - */ +struct xfs_dir3_leaf { + struct xfs_dir3_leaf_hdr hdr; /* leaf header */ + struct xfs_dir2_leaf_entry __ents[]; /* entries */ +}; + +#define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) + +static inline int +xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) + return sizeof(struct xfs_dir3_leaf_hdr); + return sizeof(struct xfs_dir2_leaf_hdr); +} -static inline int xfs_dir2_max_leaf_ents(struct xfs_mount *mp) +static inline int +xfs_dir3_max_leaf_ents(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) { - return (mp->m_dirblksize - (uint)sizeof(struct xfs_dir2_leaf_hdr)) / + return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size(lp)) / (uint)sizeof(struct xfs_dir2_leaf_entry); } /* * Get address of the bestcount field in the single-leaf block. */ +static inline struct xfs_dir2_leaf_entry * +xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp; + return lp3->__ents; + } + return lp->__ents; +} + +/* + * Get address of the bestcount field in the single-leaf block. + */ static inline struct xfs_dir2_leaf_tail * xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) { @@ -524,6 +566,10 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) } /* + * DB blocks here are logical directory block numbers, not filesystem blocks. + */ + +/* * Convert dataptr to byte in file space */ static inline xfs_dir2_off_t diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index c7dca95..acdc50e 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -33,77 +34,263 @@ #include "xfs_dir2_priv.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_buf_item.h" +#include "xfs_cksum.h" /* * Local function declarations. */ -#ifdef DEBUG -static void xfs_dir2_leaf_check(struct xfs_inode *dp, struct xfs_buf *bp); -#else -#define xfs_dir2_leaf_check(dp, bp) -#endif static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, struct xfs_buf **lbpp, int *indexp, struct xfs_buf **dbpp); -static void xfs_dir2_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *bp, +static void xfs_dir3_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *bp, int first, int last); -static void xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp); +static void xfs_dir3_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp); -static void -xfs_dir2_leaf_verify( +/* + * Check the internal consistency of a leaf1 block. + * Pop an assert if something is wrong. + */ +#ifdef DEBUG +#define xfs_dir3_leaf_check(mp, bp) \ +do { \ + if (!xfs_dir3_leaf1_check((mp), (bp))) \ + ASSERT(0); \ +} while (0); + +STATIC bool +xfs_dir3_leaf1_check( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dir2_leaf *leaf = bp->b_addr; + struct xfs_dir3_icleaf_hdr leafhdr; + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + + if (leafhdr.magic == XFS_DIR3_LEAF1_MAGIC) { + struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; + if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) + return false; + } else if (leafhdr.magic != XFS_DIR2_LEAF1_MAGIC) + return false; + + return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); +} +#else +#define xfs_dir3_leaf_check(mp, bp) +#endif + +void +xfs_dir3_leaf_hdr_from_disk( + struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from) +{ + if (from->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + from->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { + to->forw = be32_to_cpu(from->hdr.info.forw); + to->back = be32_to_cpu(from->hdr.info.back); + to->magic = be16_to_cpu(from->hdr.info.magic); + to->count = be16_to_cpu(from->hdr.count); + to->stale = be16_to_cpu(from->hdr.stale); + } else { + struct xfs_dir3_leaf_hdr *hdr3 = (struct xfs_dir3_leaf_hdr *)from; + + to->forw = be32_to_cpu(hdr3->info.hdr.forw); + to->back = be32_to_cpu(hdr3->info.hdr.back); + to->magic = be16_to_cpu(hdr3->info.hdr.magic); + to->count = be16_to_cpu(hdr3->count); + to->stale = be16_to_cpu(hdr3->stale); + } + + ASSERT(to->magic == XFS_DIR2_LEAF1_MAGIC || + to->magic == XFS_DIR3_LEAF1_MAGIC || + to->magic == XFS_DIR2_LEAFN_MAGIC || + to->magic == XFS_DIR3_LEAFN_MAGIC); +} + +void +xfs_dir3_leaf_hdr_to_disk( + struct xfs_dir2_leaf *to, + struct xfs_dir3_icleaf_hdr *from) +{ + ASSERT(from->magic == XFS_DIR2_LEAF1_MAGIC || + from->magic == XFS_DIR3_LEAF1_MAGIC || + from->magic == XFS_DIR2_LEAFN_MAGIC || + from->magic == XFS_DIR3_LEAFN_MAGIC); + + if (from->magic == XFS_DIR2_LEAF1_MAGIC || + from->magic == XFS_DIR2_LEAFN_MAGIC) { + to->hdr.info.forw = cpu_to_be32(from->forw); + to->hdr.info.back = cpu_to_be32(from->back); + to->hdr.info.magic = cpu_to_be16(from->magic); + to->hdr.count = cpu_to_be16(from->count); + to->hdr.stale = cpu_to_be16(from->stale); + } else { + struct xfs_dir3_leaf_hdr *hdr3 = (struct xfs_dir3_leaf_hdr *)to; + + hdr3->info.hdr.forw = cpu_to_be32(from->forw); + hdr3->info.hdr.back = cpu_to_be32(from->back); + hdr3->info.hdr.magic = cpu_to_be16(from->magic); + hdr3->count = cpu_to_be16(from->count); + hdr3->stale = cpu_to_be16(from->stale); + } +} + +bool +xfs_dir3_leaf_check_int( + struct xfs_mount *mp, + struct xfs_dir3_icleaf_hdr *hdr, + struct xfs_dir2_leaf *leaf) +{ + struct xfs_dir2_leaf_entry *ents; + xfs_dir2_leaf_tail_t *ltp; + int stale; + int i; + + ents = xfs_dir3_leaf_ents_p(leaf); + ltp = xfs_dir2_leaf_tail_p(mp, leaf); + + /* + * This value is not restrictive enough. + * Should factor in the size of the bests table as well. + * We can deduce a value for that from di_size. + */ + if (hdr->count > xfs_dir3_max_leaf_ents(mp, leaf)) + return false; + + /* Leaves and bests don't overlap in leaf format. */ + if ((hdr->magic == XFS_DIR2_LEAF1_MAGIC || + hdr->magic == XFS_DIR3_LEAF1_MAGIC) && + (char *)&ents[hdr->count] > (char *)xfs_dir2_leaf_bests_p(ltp)) + return false; + + /* Check hash value order, count stale entries. */ + for (i = stale = 0; i < hdr->count; i++) { + if (i + 1 < hdr->count) { + if (be32_to_cpu(ents[i].hashval) > + be32_to_cpu(ents[i + 1].hashval)) + return false; + } + if (ents[i].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + stale++; + } + if (hdr->stale != stale) + return false; + return true; +} + +static bool +xfs_dir3_leaf_verify( struct xfs_buf *bp, - __be16 magic) + __uint16_t magic) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dir2_leaf *leaf = bp->b_addr; + struct xfs_dir3_icleaf_hdr leafhdr; + + ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; + + if ((magic == XFS_DIR2_LEAF1_MAGIC && + leafhdr.magic != XFS_DIR3_LEAF1_MAGIC) || + (magic == XFS_DIR2_LEAFN_MAGIC && + leafhdr.magic != XFS_DIR3_LEAFN_MAGIC)) + return false; + + if (!uuid_equal(&leaf3->info.uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) + return false; + } else { + if (leafhdr.magic != magic) + return false; + } + return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); +} + +static void +__read_verify( + struct xfs_buf *bp, + __uint16_t magic) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_DIR3_LEAF_CRC_OFF)) || + !xfs_dir3_leaf_verify(bp, magic)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +__write_verify( + struct xfs_buf *bp, + __uint16_t magic) { struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_dir2_leaf_hdr *hdr = bp->b_addr; - int block_ok = 0; + struct xfs_buf_log_item *bip = bp->b_fspriv; + struct xfs_dir3_leaf_hdr *hdr3 = bp->b_addr; - block_ok = hdr->info.magic == magic; - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + if (!xfs_dir3_leaf_verify(bp, magic)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + return; } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_LEAF_CRC_OFF); } static void -xfs_dir2_leaf1_read_verify( +xfs_dir3_leaf1_read_verify( struct xfs_buf *bp) { - xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); + __read_verify(bp, XFS_DIR2_LEAF1_MAGIC); } static void -xfs_dir2_leaf1_write_verify( +xfs_dir3_leaf1_write_verify( struct xfs_buf *bp) { - xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); + __write_verify(bp, XFS_DIR2_LEAF1_MAGIC); } -void -xfs_dir2_leafn_read_verify( +static void +xfs_dir3_leafn_read_verify( struct xfs_buf *bp) { - xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + __read_verify(bp, XFS_DIR2_LEAFN_MAGIC); } -void -xfs_dir2_leafn_write_verify( +static void +xfs_dir3_leafn_write_verify( struct xfs_buf *bp) { - xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + __write_verify(bp, XFS_DIR2_LEAFN_MAGIC); } -static const struct xfs_buf_ops xfs_dir2_leaf1_buf_ops = { - .verify_read = xfs_dir2_leaf1_read_verify, - .verify_write = xfs_dir2_leaf1_write_verify, +static const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops = { + .verify_read = xfs_dir3_leaf1_read_verify, + .verify_write = xfs_dir3_leaf1_write_verify, }; -const struct xfs_buf_ops xfs_dir2_leafn_buf_ops = { - .verify_read = xfs_dir2_leafn_read_verify, - .verify_write = xfs_dir2_leafn_write_verify, +const struct xfs_buf_ops xfs_dir3_leafn_buf_ops = { + .verify_read = xfs_dir3_leafn_read_verify, + .verify_write = xfs_dir3_leafn_write_verify, }; static int -xfs_dir2_leaf_read( +xfs_dir3_leaf_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, @@ -111,11 +298,11 @@ xfs_dir2_leaf_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, - XFS_DATA_FORK, &xfs_dir2_leaf1_buf_ops); + XFS_DATA_FORK, &xfs_dir3_leaf1_buf_ops); } int -xfs_dir2_leafn_read( +xfs_dir3_leafn_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, @@ -123,7 +310,81 @@ xfs_dir2_leafn_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, - XFS_DATA_FORK, &xfs_dir2_leafn_buf_ops); + XFS_DATA_FORK, &xfs_dir3_leafn_buf_ops); +} + +/* + * Initialize a new leaf block, leaf1 or leafn magic accepted. + */ +static void +xfs_dir3_leaf_init( + struct xfs_mount *mp, + struct xfs_buf *bp, + xfs_ino_t owner, + __uint16_t type) +{ + struct xfs_dir2_leaf *leaf = bp->b_addr; + + ASSERT(type == XFS_DIR2_LEAF1_MAGIC || type == XFS_DIR2_LEAFN_MAGIC); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; + + memset(leaf3, 0, sizeof(*leaf3)); + + leaf3->info.hdr.magic = (type == XFS_DIR2_LEAF1_MAGIC) + ? cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) + : cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); + leaf3->info.blkno = cpu_to_be64(bp->b_bn); + leaf3->info.owner = cpu_to_be64(owner); + uuid_copy(&leaf3->info.uuid, &mp->m_sb.sb_uuid); + } else { + memset(leaf, 0, sizeof(*leaf)); + leaf->hdr.info.magic = cpu_to_be16(type); + } + + /* + * If it's a leaf-format directory initialize the tail. + * Caller is responsible for initialising the bests table. + */ + if (type == XFS_DIR2_LEAF1_MAGIC) { + struct xfs_dir2_leaf_tail *ltp; + + ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp->bestcount = 0; + bp->b_ops = &xfs_dir3_leaf1_buf_ops; + } else + bp->b_ops = &xfs_dir3_leafn_buf_ops; +} + +int +xfs_dir3_leaf_get_buf( + xfs_da_args_t *args, + xfs_dir2_db_t bno, + struct xfs_buf **bpp, + __uint16_t magic) +{ + struct xfs_inode *dp = args->dp; + struct xfs_trans *tp = args->trans; + struct xfs_mount *mp = dp->i_mount; + struct xfs_buf *bp; + int error; + + ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); + ASSERT(bno >= XFS_DIR2_LEAF_FIRSTDB(mp) && + bno < XFS_DIR2_FREE_FIRSTDB(mp)); + + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, + XFS_DATA_FORK); + if (error) + return error; + + xfs_dir3_leaf_init(mp, bp, dp->i_ino, magic); + xfs_dir3_leaf_log_header(tp, bp); + if (magic == XFS_DIR2_LEAF1_MAGIC) + xfs_dir3_leaf_log_tail(tp, bp); + *bpp = bp; + return 0; } /* @@ -150,6 +411,8 @@ xfs_dir2_block_to_leaf( int needscan; /* need to rescan bestfree */ xfs_trans_t *tp; /* transaction pointer */ struct xfs_dir2_data_free *bf; + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; trace_xfs_dir2_block_to_leaf(args); @@ -169,27 +432,34 @@ xfs_dir2_block_to_leaf( /* * Initialize the leaf block, get a buffer for it. */ - if ((error = xfs_dir2_leaf_init(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC))) { + error = xfs_dir3_leaf_get_buf(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC); + if (error) return error; - } - ASSERT(lbp != NULL); + leaf = lbp->b_addr; hdr = dbp->b_addr; xfs_dir3_data_check(dp, dbp); btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); bf = xfs_dir3_data_bestfree_p(hdr); + ents = xfs_dir3_leaf_ents_p(leaf); + /* * Set the counts in the leaf header. + * + * XXX: are these actually logged, or just gathered by chance? */ - leaf->hdr.count = cpu_to_be16(be32_to_cpu(btp->count)); - leaf->hdr.stale = cpu_to_be16(be32_to_cpu(btp->stale)); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + leafhdr.count = be32_to_cpu(btp->count); + leafhdr.stale = be32_to_cpu(btp->stale); + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + /* * Could compact these but I think we always do the conversion * after squeezing out stale entries. */ - memcpy(leaf->ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir2_leaf_log_ents(tp, lbp, 0, be16_to_cpu(leaf->hdr.count) - 1); + memcpy(ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t)); + xfs_dir3_leaf_log_ents(tp, lbp, 0, leafhdr.count - 1); needscan = 0; needlog = 1; /* @@ -224,15 +494,16 @@ xfs_dir2_block_to_leaf( */ if (needlog) xfs_dir2_data_log_header(tp, dbp); - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(mp, lbp); xfs_dir3_data_check(dp, dbp); - xfs_dir2_leaf_log_bests(tp, lbp, 0, 0); + xfs_dir3_leaf_log_bests(tp, lbp, 0, 0); return 0; } STATIC void -xfs_dir2_leaf_find_stale( - struct xfs_dir2_leaf *leaf, +xfs_dir3_leaf_find_stale( + struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int index, int *lowstale, int *highstale) @@ -241,7 +512,7 @@ xfs_dir2_leaf_find_stale( * Find the first stale entry before our index, if any. */ for (*lowstale = index - 1; *lowstale >= 0; --*lowstale) { - if (leaf->ents[*lowstale].address == + if (ents[*lowstale].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) break; } @@ -251,10 +522,8 @@ xfs_dir2_leaf_find_stale( * Stop if the result would require moving more entries than using * lowstale. */ - for (*highstale = index; - *highstale < be16_to_cpu(leaf->hdr.count); - ++*highstale) { - if (leaf->ents[*highstale].address == + for (*highstale = index; *highstale < leafhdr->count; ++*highstale) { + if (ents[*highstale].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) break; if (*lowstale >= 0 && index - *lowstale <= *highstale - index) @@ -263,8 +532,9 @@ xfs_dir2_leaf_find_stale( } struct xfs_dir2_leaf_entry * -xfs_dir2_leaf_find_entry( - xfs_dir2_leaf_t *leaf, /* leaf structure */ +xfs_dir3_leaf_find_entry( + struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int index, /* leaf table position */ int compact, /* need to compact leaves */ int lowstale, /* index of prev stale leaf */ @@ -272,7 +542,7 @@ xfs_dir2_leaf_find_entry( int *lfloglow, /* low leaf logging index */ int *lfloghigh) /* high leaf logging index */ { - if (!leaf->hdr.stale) { + if (!leafhdr->stale) { xfs_dir2_leaf_entry_t *lep; /* leaf entry table pointer */ /* @@ -280,18 +550,16 @@ xfs_dir2_leaf_find_entry( * * If there are no stale entries, just insert a hole at index. */ - lep = &leaf->ents[index]; - if (index < be16_to_cpu(leaf->hdr.count)) + lep = &ents[index]; + if (index < leafhdr->count) memmove(lep + 1, lep, - (be16_to_cpu(leaf->hdr.count) - index) * - sizeof(*lep)); + (leafhdr->count - index) * sizeof(*lep)); /* * Record low and high logging indices for the leaf. */ *lfloglow = index; - *lfloghigh = be16_to_cpu(leaf->hdr.count); - be16_add_cpu(&leaf->hdr.count, 1); + *lfloghigh = leafhdr->count++; return lep; } @@ -305,16 +573,17 @@ xfs_dir2_leaf_find_entry( * entries before and after our insertion point. */ if (compact == 0) - xfs_dir2_leaf_find_stale(leaf, index, &lowstale, &highstale); + xfs_dir3_leaf_find_stale(leafhdr, ents, index, + &lowstale, &highstale); /* * If the low one is better, use it. */ if (lowstale >= 0 && - (highstale == be16_to_cpu(leaf->hdr.count) || + (highstale == leafhdr->count || index - lowstale - 1 < highstale - index)) { ASSERT(index - lowstale - 1 >= 0); - ASSERT(leaf->ents[lowstale].address == + ASSERT(ents[lowstale].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); /* @@ -322,37 +591,34 @@ xfs_dir2_leaf_find_entry( * for the new entry. */ if (index - lowstale - 1 > 0) { - memmove(&leaf->ents[lowstale], - &leaf->ents[lowstale + 1], + memmove(&ents[lowstale], &ents[lowstale + 1], (index - lowstale - 1) * - sizeof(xfs_dir2_leaf_entry_t)); + sizeof(xfs_dir2_leaf_entry_t)); } *lfloglow = MIN(lowstale, *lfloglow); *lfloghigh = MAX(index - 1, *lfloghigh); - be16_add_cpu(&leaf->hdr.stale, -1); - return &leaf->ents[index - 1]; + leafhdr->stale--; + return &ents[index - 1]; } /* * The high one is better, so use that one. */ ASSERT(highstale - index >= 0); - ASSERT(leaf->ents[highstale].address == - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); + ASSERT(ents[highstale].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); /* * Copy entries down to cover the stale entry and make room for the * new entry. */ if (highstale - index > 0) { - memmove(&leaf->ents[index + 1], - &leaf->ents[index], + memmove(&ents[index + 1], &ents[index], (highstale - index) * sizeof(xfs_dir2_leaf_entry_t)); } *lfloglow = MIN(index, *lfloglow); *lfloghigh = MAX(highstale, *lfloghigh); - be16_add_cpu(&leaf->hdr.stale, -1); - return &leaf->ents[index]; + leafhdr->stale--; + return &ents[index]; } /* @@ -390,6 +656,8 @@ xfs_dir2_leaf_addname( xfs_trans_t *tp; /* transaction pointer */ xfs_dir2_db_t use_block; /* data block number */ struct xfs_dir2_data_free *bf; /* bestfree table */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; trace_xfs_dir2_leaf_addname(args); @@ -397,7 +665,7 @@ xfs_dir2_leaf_addname( tp = args->trans; mp = dp->i_mount; - error = xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + error = xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); if (error) return error; @@ -410,16 +678,19 @@ xfs_dir2_leaf_addname( index = xfs_dir2_leaf_search_hash(args, lbp); leaf = lbp->b_addr; ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); length = xfs_dir2_data_entsize(args->namelen); + /* * See if there are any entries with the same hash value * and space in their block for the new entry. * This is good because it puts multiple same-hash value entries * in a data block, improving the lookup of those entries. */ - for (use_block = -1, lep = &leaf->ents[index]; - index < be16_to_cpu(leaf->hdr.count) && be32_to_cpu(lep->hashval) == args->hashval; + for (use_block = -1, lep = &ents[index]; + index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval; index++, lep++) { if (be32_to_cpu(lep->address) == XFS_DIR2_NULL_DATAPTR) continue; @@ -452,7 +723,7 @@ xfs_dir2_leaf_addname( * How many bytes do we need in the leaf block? */ needbytes = 0; - if (!leaf->hdr.stale) + if (!leafhdr.stale) needbytes += sizeof(xfs_dir2_leaf_entry_t); if (use_block == -1) needbytes += sizeof(xfs_dir2_data_off_t); @@ -467,16 +738,15 @@ xfs_dir2_leaf_addname( * If we don't have enough free bytes but we can make enough * by compacting out stale entries, we'll do that. */ - if ((char *)bestsp - (char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] < - needbytes && be16_to_cpu(leaf->hdr.stale) > 1) { + if ((char *)bestsp - (char *)&ents[leafhdr.count] < needbytes && + leafhdr.stale > 1) compact = 1; - } + /* * Otherwise if we don't have enough free bytes we need to * convert to node form. */ - else if ((char *)bestsp - (char *)&leaf->ents[be16_to_cpu( - leaf->hdr.count)] < needbytes) { + else if ((char *)bestsp - (char *)&ents[leafhdr.count] < needbytes) { /* * Just checking or no space reservation, give up. */ @@ -524,15 +794,15 @@ xfs_dir2_leaf_addname( * point later. */ if (compact) { - xfs_dir2_leaf_compact_x1(lbp, &index, &lowstale, &highstale, - &lfloglow, &lfloghigh); + xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale, + &highstale, &lfloglow, &lfloghigh); } /* * There are stale entries, so we'll need log-low and log-high * impossibly bad values later. */ - else if (be16_to_cpu(leaf->hdr.stale)) { - lfloglow = be16_to_cpu(leaf->hdr.count); + else if (leafhdr.stale) { + lfloglow = leafhdr.count; lfloghigh = -1; } /* @@ -564,14 +834,14 @@ xfs_dir2_leaf_addname( memmove(&bestsp[0], &bestsp[1], be32_to_cpu(ltp->bestcount) * sizeof(bestsp[0])); be32_add_cpu(<p->bestcount, 1); - xfs_dir2_leaf_log_tail(tp, lbp); - xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); } /* * If we're filling in a previously empty block just log it. */ else - xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); + xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); hdr = dbp->b_addr; bf = xfs_dir3_data_bestfree_p(hdr); bestsp[use_block] = bf[0].length; @@ -632,10 +902,10 @@ xfs_dir2_leaf_addname( if (be16_to_cpu(bestsp[use_block]) != be16_to_cpu(bf[0].length)) { bestsp[use_block] = bf[0].length; if (!grown) - xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); + xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); } - lep = xfs_dir2_leaf_find_entry(leaf, index, compact, lowstale, + lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale, highstale, &lfloglow, &lfloghigh); /* @@ -647,82 +917,40 @@ xfs_dir2_leaf_addname( /* * Log the leaf fields and give up the buffers. */ - xfs_dir2_leaf_log_header(tp, lbp); - xfs_dir2_leaf_log_ents(tp, lbp, lfloglow, lfloghigh); - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, lbp); + xfs_dir3_leaf_log_ents(tp, lbp, lfloglow, lfloghigh); + xfs_dir3_leaf_check(mp, lbp); xfs_dir3_data_check(dp, dbp); return 0; } -#ifdef DEBUG -/* - * Check the internal consistency of a leaf1 block. - * Pop an assert if something is wrong. - */ -STATIC void -xfs_dir2_leaf_check( - struct xfs_inode *dp, /* incore directory inode */ - struct xfs_buf *bp) /* leaf's buffer */ -{ - int i; /* leaf index */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ - xfs_dir2_leaf_tail_t *ltp; /* leaf tail pointer */ - xfs_mount_t *mp; /* filesystem mount point */ - int stale; /* count of stale leaves */ - - leaf = bp->b_addr; - mp = dp->i_mount; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); - /* - * This value is not restrictive enough. - * Should factor in the size of the bests table as well. - * We can deduce a value for that from di_size. - */ - ASSERT(be16_to_cpu(leaf->hdr.count) <= xfs_dir2_max_leaf_ents(mp)); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); - /* - * Leaves and bests don't overlap. - */ - ASSERT((char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] <= - (char *)xfs_dir2_leaf_bests_p(ltp)); - /* - * Check hash value order, count stale entries. - */ - for (i = stale = 0; i < be16_to_cpu(leaf->hdr.count); i++) { - if (i + 1 < be16_to_cpu(leaf->hdr.count)) - ASSERT(be32_to_cpu(leaf->ents[i].hashval) <= - be32_to_cpu(leaf->ents[i + 1].hashval)); - if (leaf->ents[i].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) - stale++; - } - ASSERT(be16_to_cpu(leaf->hdr.stale) == stale); -} -#endif /* DEBUG */ - /* * Compact out any stale entries in the leaf. * Log the header and changed leaf entries, if any. */ void -xfs_dir2_leaf_compact( +xfs_dir3_leaf_compact( xfs_da_args_t *args, /* operation arguments */ + struct xfs_dir3_icleaf_hdr *leafhdr, struct xfs_buf *bp) /* leaf buffer */ { int from; /* source leaf index */ xfs_dir2_leaf_t *leaf; /* leaf structure */ int loglow; /* first leaf entry to log */ int to; /* target leaf index */ + struct xfs_dir2_leaf_entry *ents; leaf = bp->b_addr; - if (!leaf->hdr.stale) { + if (!leafhdr->stale) return; - } + /* * Compress out the stale entries in place. */ - for (from = to = 0, loglow = -1; from < be16_to_cpu(leaf->hdr.count); from++) { - if (leaf->ents[from].address == - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + ents = xfs_dir3_leaf_ents_p(leaf); + for (from = to = 0, loglow = -1; from < leafhdr->count; from++) { + if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) continue; /* * Only actually copy the entries that are different. @@ -730,19 +958,21 @@ xfs_dir2_leaf_compact( if (from > to) { if (loglow == -1) loglow = to; - leaf->ents[to] = leaf->ents[from]; + ents[to] = ents[from]; } to++; } /* * Update and log the header, log the leaf entries. */ - ASSERT(be16_to_cpu(leaf->hdr.stale) == from - to); - be16_add_cpu(&leaf->hdr.count, -(be16_to_cpu(leaf->hdr.stale))); - leaf->hdr.stale = 0; - xfs_dir2_leaf_log_header(args->trans, bp); + ASSERT(leafhdr->stale == from - to); + leafhdr->count -= leafhdr->stale; + leafhdr->stale = 0; + + xfs_dir3_leaf_hdr_to_disk(leaf, leafhdr); + xfs_dir3_leaf_log_header(args->trans, bp); if (loglow != -1) - xfs_dir2_leaf_log_ents(args->trans, bp, loglow, to - 1); + xfs_dir3_leaf_log_ents(args->trans, bp, loglow, to - 1); } /* @@ -754,8 +984,9 @@ xfs_dir2_leaf_compact( * and leaf logging indices. */ void -xfs_dir2_leaf_compact_x1( - struct xfs_buf *bp, /* leaf buffer */ +xfs_dir3_leaf_compact_x1( + struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int *indexp, /* insertion index */ int *lowstalep, /* out: stale entry before us */ int *highstalep, /* out: stale entry after us */ @@ -766,22 +997,20 @@ xfs_dir2_leaf_compact_x1( int highstale; /* stale entry at/after index */ int index; /* insertion index */ int keepstale; /* source index of kept stale */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ int lowstale; /* stale entry before index */ int newindex=0; /* new insertion index */ int to; /* destination copy index */ - leaf = bp->b_addr; - ASSERT(be16_to_cpu(leaf->hdr.stale) > 1); + ASSERT(leafhdr->stale > 1); index = *indexp; - xfs_dir2_leaf_find_stale(leaf, index, &lowstale, &highstale); + xfs_dir3_leaf_find_stale(leafhdr, ents, index, &lowstale, &highstale); /* * Pick the better of lowstale and highstale. */ if (lowstale >= 0 && - (highstale == be16_to_cpu(leaf->hdr.count) || + (highstale == leafhdr->count || index - lowstale <= highstale - index)) keepstale = lowstale; else @@ -790,15 +1019,14 @@ xfs_dir2_leaf_compact_x1( * Copy the entries in place, removing all the stale entries * except keepstale. */ - for (from = to = 0; from < be16_to_cpu(leaf->hdr.count); from++) { + for (from = to = 0; from < leafhdr->count; from++) { /* * Notice the new value of index. */ if (index == from) newindex = to; if (from != keepstale && - leaf->ents[from].address == - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) { + ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) { if (from == to) *lowlogp = to; continue; @@ -812,7 +1040,7 @@ xfs_dir2_leaf_compact_x1( * Copy only the entries that have moved. */ if (from > to) - leaf->ents[to] = leaf->ents[from]; + ents[to] = ents[from]; to++; } ASSERT(from > to); @@ -826,8 +1054,8 @@ xfs_dir2_leaf_compact_x1( /* * Adjust the leaf header values. */ - be16_add_cpu(&leaf->hdr.count, -(from - to)); - leaf->hdr.stale = cpu_to_be16(1); + leafhdr->count -= from - to; + leafhdr->stale = 1; /* * Remember the low/high stale value only in the "right" * direction. @@ -835,8 +1063,8 @@ xfs_dir2_leaf_compact_x1( if (lowstale >= newindex) lowstale = -1; else - highstale = be16_to_cpu(leaf->hdr.count); - *highlogp = be16_to_cpu(leaf->hdr.count) - 1; + highstale = leafhdr->count; + *highlogp = leafhdr->count - 1; *lowstalep = lowstale; *highstalep = highstale; } @@ -1229,69 +1457,12 @@ xfs_dir2_leaf_getdents( return error; } -/* - * Initialize a new leaf block, leaf1 or leafn magic accepted. - */ -int -xfs_dir2_leaf_init( - xfs_da_args_t *args, /* operation arguments */ - xfs_dir2_db_t bno, /* directory block number */ - struct xfs_buf **bpp, /* out: leaf buffer */ - int magic) /* magic number for block */ -{ - struct xfs_buf *bp; /* leaf buffer */ - xfs_inode_t *dp; /* incore directory inode */ - int error; /* error return code */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ - xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ - xfs_mount_t *mp; /* filesystem mount point */ - xfs_trans_t *tp; /* transaction pointer */ - - dp = args->dp; - ASSERT(dp != NULL); - tp = args->trans; - mp = dp->i_mount; - ASSERT(bno >= XFS_DIR2_LEAF_FIRSTDB(mp) && - bno < XFS_DIR2_FREE_FIRSTDB(mp)); - /* - * Get the buffer for the block. - */ - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, - XFS_DATA_FORK); - if (error) - return error; - - /* - * Initialize the header. - */ - leaf = bp->b_addr; - leaf->hdr.info.magic = cpu_to_be16(magic); - leaf->hdr.info.forw = 0; - leaf->hdr.info.back = 0; - leaf->hdr.count = 0; - leaf->hdr.stale = 0; - xfs_dir2_leaf_log_header(tp, bp); - /* - * If it's a leaf-format directory initialize the tail. - * In this case our caller has the real bests table to copy into - * the block. - */ - if (magic == XFS_DIR2_LEAF1_MAGIC) { - bp->b_ops = &xfs_dir2_leaf1_buf_ops; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); - ltp->bestcount = 0; - xfs_dir2_leaf_log_tail(tp, bp); - } else - bp->b_ops = &xfs_dir2_leafn_buf_ops; - *bpp = bp; - return 0; -} /* * Log the bests entries indicated from a leaf1 block. */ static void -xfs_dir2_leaf_log_bests( +xfs_dir3_leaf_log_bests( xfs_trans_t *tp, /* transaction pointer */ struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ @@ -1299,11 +1470,12 @@ xfs_dir2_leaf_log_bests( { __be16 *firstb; /* pointer to first entry */ __be16 *lastb; /* pointer to last entry */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf = bp->b_addr; xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ - leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)); + ltp = xfs_dir2_leaf_tail_p(tp->t_mountp, leaf); firstb = xfs_dir2_leaf_bests_p(ltp) + first; lastb = xfs_dir2_leaf_bests_p(ltp) + last; @@ -1315,7 +1487,7 @@ xfs_dir2_leaf_log_bests( * Log the leaf entries indicated from a leaf1 or leafn block. */ void -xfs_dir2_leaf_log_ents( +xfs_dir3_leaf_log_ents( xfs_trans_t *tp, /* transaction pointer */ struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ @@ -1323,13 +1495,17 @@ xfs_dir2_leaf_log_ents( { xfs_dir2_leaf_entry_t *firstlep; /* pointer to first entry */ xfs_dir2_leaf_entry_t *lastlep; /* pointer to last entry */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf = bp->b_addr; + struct xfs_dir2_leaf_entry *ents; - leaf = bp->b_addr; ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || - leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - firstlep = &leaf->ents[first]; - lastlep = &leaf->ents[last]; + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); + + ents = xfs_dir3_leaf_ents_p(leaf); + firstlep = &ents[first]; + lastlep = &ents[last]; xfs_trans_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), (uint)((char *)lastlep - (char *)leaf + sizeof(*lastlep) - 1)); } @@ -1338,34 +1514,38 @@ xfs_dir2_leaf_log_ents( * Log the header of the leaf1 or leafn block. */ void -xfs_dir2_leaf_log_header( +xfs_dir3_leaf_log_header( struct xfs_trans *tp, struct xfs_buf *bp) { - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf = bp->b_addr; - leaf = bp->b_addr; ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || - leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); + xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), - (uint)(sizeof(leaf->hdr) - 1)); + xfs_dir3_leaf_hdr_size(leaf)); } /* * Log the tail of the leaf1 block. */ STATIC void -xfs_dir2_leaf_log_tail( +xfs_dir3_leaf_log_tail( struct xfs_trans *tp, struct xfs_buf *bp) { - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf = bp->b_addr; xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ - xfs_mount_t *mp; /* filesystem mount point */ + struct xfs_mount *mp = tp->t_mountp; + + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - mp = tp->t_mountp; - leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); ltp = xfs_dir2_leaf_tail_p(mp, leaf); xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), (uint)(mp->m_dirblksize - 1)); @@ -1389,6 +1569,7 @@ xfs_dir2_leaf_lookup( xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_leaf_entry *ents; trace_xfs_dir2_leaf_lookup(args); @@ -1400,12 +1581,14 @@ xfs_dir2_leaf_lookup( } tp = args->trans; dp = args->dp; - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(dp->i_mount, lbp); leaf = lbp->b_addr; + ents = xfs_dir3_leaf_ents_p(leaf); /* * Get to the leaf entry and contained data entry address. */ - lep = &leaf->ents[index]; + lep = &ents[index]; + /* * Point to the data entry. */ @@ -1449,18 +1632,23 @@ xfs_dir2_leaf_lookup_int( xfs_trans_t *tp; /* transaction pointer */ xfs_dir2_db_t cidb = -1; /* case match data block no. */ enum xfs_dacmp cmp; /* name compare result */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; dp = args->dp; tp = args->trans; mp = dp->i_mount; - error = xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + error = xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); if (error) return error; *lbpp = lbp; leaf = lbp->b_addr; - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(mp, lbp); + ents = xfs_dir3_leaf_ents_p(leaf); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + /* * Look for the first leaf entry with our hash value. */ @@ -1469,9 +1657,9 @@ xfs_dir2_leaf_lookup_int( * Loop over all the entries with the right hash value * looking to match the name. */ - for (lep = &leaf->ents[index]; index < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(lep->hashval) == args->hashval; - lep++, index++) { + for (lep = &ents[index]; + index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval; + lep++, index++) { /* * Skip over stale leaf entries. */ @@ -1576,6 +1764,8 @@ xfs_dir2_leaf_removename( xfs_dir2_data_off_t oldbest; /* old value of best free */ xfs_trans_t *tp; /* transaction pointer */ struct xfs_dir2_data_free *bf; /* bestfree table */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; trace_xfs_dir2_leaf_removename(args); @@ -1590,12 +1780,14 @@ xfs_dir2_leaf_removename( mp = dp->i_mount; leaf = lbp->b_addr; hdr = dbp->b_addr; - bf = xfs_dir3_data_bestfree_p(hdr); xfs_dir3_data_check(dp, dbp); + bf = xfs_dir3_data_bestfree_p(hdr); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); /* * Point to the leaf entry, use that to point to the data entry. */ - lep = &leaf->ents[index]; + lep = &ents[index]; db = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); dep = (xfs_dir2_data_entry_t *) ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); @@ -1613,10 +1805,13 @@ xfs_dir2_leaf_removename( /* * We just mark the leaf entry stale by putting a null in it. */ - be16_add_cpu(&leaf->hdr.stale, 1); - xfs_dir2_leaf_log_header(tp, lbp); + leafhdr.stale++; + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, lbp); + lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir2_leaf_log_ents(tp, lbp, index, index); + xfs_dir3_leaf_log_ents(tp, lbp, index, index); + /* * Scan the freespace in the data block again if necessary, * log the data block header if necessary. @@ -1631,7 +1826,7 @@ xfs_dir2_leaf_removename( */ if (be16_to_cpu(bf[0].length) != oldbest) { bestsp[db] = bf[0].length; - xfs_dir2_leaf_log_bests(tp, lbp, db, db); + xfs_dir3_leaf_log_bests(tp, lbp, db, db); } xfs_dir3_data_check(dp, dbp); /* @@ -1649,7 +1844,7 @@ xfs_dir2_leaf_removename( */ if (error == ENOSPC && args->total == 0) error = 0; - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(mp, lbp); return error; } dbp = NULL; @@ -1672,8 +1867,8 @@ xfs_dir2_leaf_removename( memmove(&bestsp[db - i], bestsp, (be32_to_cpu(ltp->bestcount) - (db - i)) * sizeof(*bestsp)); be32_add_cpu(<p->bestcount, -(db - i)); - xfs_dir2_leaf_log_tail(tp, lbp); - xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); } else bestsp[db] = cpu_to_be16(NULLDATAOFF); } @@ -1683,7 +1878,7 @@ xfs_dir2_leaf_removename( else if (db != mp->m_dirdatablk) dbp = NULL; - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(mp, lbp); /* * See if we can convert to block form. */ @@ -1706,6 +1901,7 @@ xfs_dir2_leaf_replace( xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_leaf_entry *ents; trace_xfs_dir2_leaf_replace(args); @@ -1717,10 +1913,11 @@ xfs_dir2_leaf_replace( } dp = args->dp; leaf = lbp->b_addr; + ents = xfs_dir3_leaf_ents_p(leaf); /* * Point to the leaf entry, get data address from it. */ - lep = &leaf->ents[index]; + lep = &ents[index]; /* * Point to the data entry. */ @@ -1734,7 +1931,7 @@ xfs_dir2_leaf_replace( dep->inumber = cpu_to_be64(args->inumber); tp = args->trans; xfs_dir2_data_log_entry(tp, dbp, dep); - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(dp->i_mount, lbp); xfs_trans_brelse(tp, lbp); return 0; } @@ -1756,17 +1953,22 @@ xfs_dir2_leaf_search_hash( xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ int mid=0; /* current leaf index */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; leaf = lbp->b_addr; + ents = xfs_dir3_leaf_ents_p(leaf); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + #ifndef __KERNEL__ - if (!leaf->hdr.count) + if (!leafhdr.count) return 0; #endif /* * Note, the table cannot be empty, so we have to go through the loop. * Binary search the leaf entries looking for our hash value. */ - for (lep = leaf->ents, low = 0, high = be16_to_cpu(leaf->hdr.count) - 1, + for (lep = ents, low = 0, high = leafhdr.count - 1, hashwant = args->hashval; low <= high; ) { mid = (low + high) >> 1; @@ -1852,23 +2054,29 @@ xfs_dir2_leaf_trim_data( bestsp = xfs_dir2_leaf_bests_p(ltp); be32_add_cpu(<p->bestcount, -1); memmove(&bestsp[1], &bestsp[0], be32_to_cpu(ltp->bestcount) * sizeof(*bestsp)); - xfs_dir2_leaf_log_tail(tp, lbp); - xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); return 0; } static inline size_t -xfs_dir2_leaf_size( - struct xfs_dir2_leaf_hdr *hdr, +xfs_dir3_leaf_size( + struct xfs_dir3_icleaf_hdr *hdr, int counts) { - int entries; + int entries; + int hdrsize; + + entries = hdr->count - hdr->stale; + if (hdr->magic == XFS_DIR2_LEAF1_MAGIC || + hdr->magic == XFS_DIR2_LEAFN_MAGIC) + hdrsize = sizeof(struct xfs_dir2_leaf_hdr); + else + hdrsize = sizeof(struct xfs_dir3_leaf_hdr); - entries = be16_to_cpu(hdr->count) - be16_to_cpu(hdr->stale); - return sizeof(xfs_dir2_leaf_hdr_t) + - entries * sizeof(xfs_dir2_leaf_entry_t) + - counts * sizeof(xfs_dir2_data_off_t) + - sizeof(xfs_dir2_leaf_tail_t); + return hdrsize + entries * sizeof(xfs_dir2_leaf_entry_t) + + counts * sizeof(xfs_dir2_data_off_t) + + sizeof(xfs_dir2_leaf_tail_t); } /* @@ -1892,6 +2100,7 @@ xfs_dir2_node_to_leaf( xfs_mount_t *mp; /* filesystem mount point */ int rval; /* successful free trim? */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir3_icfree_hdr freehdr; /* @@ -1942,7 +2151,11 @@ xfs_dir2_node_to_leaf( return 0; lbp = state->path.blk[0].bp; leaf = lbp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + + ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || + leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); + /* * Read the freespace block. */ @@ -1958,36 +2171,40 @@ xfs_dir2_node_to_leaf( * Now see if the leafn and free data will fit in a leaf1. * If not, release the buffer and give up. */ - if (xfs_dir2_leaf_size(&leaf->hdr, freehdr.nvalid) > mp->m_dirblksize) { + if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > mp->m_dirblksize) { xfs_trans_brelse(tp, fbp); return 0; } /* * If the leaf has any stale entries in it, compress them out. - * The compact routine will log the header. */ - if (be16_to_cpu(leaf->hdr.stale)) - xfs_dir2_leaf_compact(args, lbp); - else - xfs_dir2_leaf_log_header(tp, lbp); + if (leafhdr.stale) + xfs_dir3_leaf_compact(args, &leafhdr, lbp); - lbp->b_ops = &xfs_dir2_leaf1_buf_ops; - leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAF1_MAGIC); + lbp->b_ops = &xfs_dir3_leaf1_buf_ops; + leafhdr.magic = (leafhdr.magic == XFS_DIR2_LEAFN_MAGIC) + ? XFS_DIR2_LEAF1_MAGIC + : XFS_DIR3_LEAF1_MAGIC; /* * Set up the leaf tail from the freespace block. */ ltp = xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount = cpu_to_be32(freehdr.nvalid); + /* * Set up the leaf bests table. */ memcpy(xfs_dir2_leaf_bests_p(ltp), xfs_dir3_free_bests_p(mp, free), freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); - xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); - xfs_dir2_leaf_log_tail(tp, lbp); - xfs_dir2_leaf_check(dp, lbp); + + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, lbp); + xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_check(mp, lbp); + /* * Get rid of the freespace block. */ diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index abf617d..e9421cb 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -41,14 +41,6 @@ */ static int xfs_dir2_leafn_add(struct xfs_buf *bp, xfs_da_args_t *args, int index); -#ifdef DEBUG -static void xfs_dir2_leafn_check(struct xfs_inode *dp, struct xfs_buf *bp); -#else -#define xfs_dir2_leafn_check(dp, bp) -#endif -static void xfs_dir2_leafn_moveents(xfs_da_args_t *args, struct xfs_buf *bp_s, - int start_s, struct xfs_buf *bp_d, - int start_d, int count); static void xfs_dir2_leafn_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_da_state_blk_t *blk2); @@ -58,6 +50,39 @@ static int xfs_dir2_leafn_remove(xfs_da_args_t *args, struct xfs_buf *bp, static int xfs_dir2_node_addname_int(xfs_da_args_t *args, xfs_da_state_blk_t *fblk); +/* + * Check internal consistency of a leafn block. + */ +#ifdef DEBUG +#define xfs_dir3_leaf_check(mp, bp) \ +do { \ + if (!xfs_dir3_leafn_check((mp), (bp))) \ + ASSERT(0); \ +} while (0); + +static bool +xfs_dir3_leafn_check( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dir2_leaf *leaf = bp->b_addr; + struct xfs_dir3_icleaf_hdr leafhdr; + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + + if (leafhdr.magic == XFS_DIR3_LEAFN_MAGIC) { + struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; + if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) + return false; + } else if (leafhdr.magic != XFS_DIR2_LEAFN_MAGIC) + return false; + + return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); +} +#else +#define xfs_dir3_leaf_check(mp, bp) +#endif + static bool xfs_dir3_free_verify( struct xfs_buf *bp) @@ -360,11 +385,19 @@ xfs_dir2_leaf_to_node( xfs_dir2_free_log_bests(tp, fbp, 0, freehdr.nvalid - 1); xfs_dir2_free_log_header(tp, fbp); - /* convert the leaf to a leafnode */ - leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); - lbp->b_ops = &xfs_dir2_leafn_buf_ops; - xfs_dir2_leaf_log_header(tp, lbp); - xfs_dir2_leafn_check(dp, lbp); + /* + * Converting the leaf to a leafnode is just a matter of changing the + * magic number and the ops. Do the change directly to the buffer as + * it's less work (and less code) than decoding the header to host + * format and back again. + */ + if (leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)) + leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); + else + leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); + lbp->b_ops = &xfs_dir3_leafn_buf_ops; + xfs_dir3_leaf_log_header(tp, lbp); + xfs_dir3_leaf_check(mp, lbp); return 0; } @@ -388,6 +421,8 @@ xfs_dir2_leafn_add( int lowstale; /* previous stale entry */ xfs_mount_t *mp; /* filesystem mount point */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; trace_xfs_dir2_leafn_add(args, index); @@ -395,6 +430,8 @@ xfs_dir2_leafn_add( mp = dp->i_mount; tp = args->trans; leaf = bp->b_addr; + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); /* * Quick check just to make sure we are not going to index @@ -410,15 +447,15 @@ xfs_dir2_leafn_add( * a compact. */ - if (be16_to_cpu(leaf->hdr.count) == xfs_dir2_max_leaf_ents(mp)) { - if (!leaf->hdr.stale) + if (leafhdr.count == xfs_dir3_max_leaf_ents(mp, leaf)) { + if (!leafhdr.stale) return XFS_ERROR(ENOSPC); - compact = be16_to_cpu(leaf->hdr.stale) > 1; + compact = leafhdr.stale > 1; } else compact = 0; - ASSERT(index == 0 || be32_to_cpu(leaf->ents[index - 1].hashval) <= args->hashval); - ASSERT(index == be16_to_cpu(leaf->hdr.count) || - be32_to_cpu(leaf->ents[index].hashval) >= args->hashval); + ASSERT(index == 0 || be32_to_cpu(ents[index - 1].hashval) <= args->hashval); + ASSERT(index == leafhdr.count || + be32_to_cpu(ents[index].hashval) >= args->hashval); if (args->op_flags & XFS_DA_OP_JUSTCHECK) return 0; @@ -427,62 +464,35 @@ xfs_dir2_leafn_add( * Compact out all but one stale leaf entry. Leaves behind * the entry closest to index. */ - if (compact) { - xfs_dir2_leaf_compact_x1(bp, &index, &lowstale, &highstale, - &lfloglow, &lfloghigh); - } - /* - * Set impossible logging indices for this case. - */ - else if (leaf->hdr.stale) { - lfloglow = be16_to_cpu(leaf->hdr.count); + if (compact) + xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale, + &highstale, &lfloglow, &lfloghigh); + else if (leafhdr.stale) { + /* + * Set impossible logging indices for this case. + */ + lfloglow = leafhdr.count; lfloghigh = -1; } /* * Insert the new entry, log everything. */ - lep = xfs_dir2_leaf_find_entry(leaf, index, compact, lowstale, + lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale, highstale, &lfloglow, &lfloghigh); lep->hashval = cpu_to_be32(args->hashval); lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, args->blkno, args->index)); - xfs_dir2_leaf_log_header(tp, bp); - xfs_dir2_leaf_log_ents(tp, bp, lfloglow, lfloghigh); - xfs_dir2_leafn_check(dp, bp); + + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, bp); + xfs_dir3_leaf_log_ents(tp, bp, lfloglow, lfloghigh); + xfs_dir3_leaf_check(mp, bp); return 0; } #ifdef DEBUG -/* - * Check internal consistency of a leafn block. - */ -void -xfs_dir2_leafn_check( - struct xfs_inode *dp, - struct xfs_buf *bp) -{ - int i; /* leaf index */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ - xfs_mount_t *mp; /* filesystem mount point */ - int stale; /* count of stale leaves */ - - leaf = bp->b_addr; - mp = dp->i_mount; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - ASSERT(be16_to_cpu(leaf->hdr.count) <= xfs_dir2_max_leaf_ents(mp)); - for (i = stale = 0; i < be16_to_cpu(leaf->hdr.count); i++) { - if (i + 1 < be16_to_cpu(leaf->hdr.count)) { - ASSERT(be32_to_cpu(leaf->ents[i].hashval) <= - be32_to_cpu(leaf->ents[i + 1].hashval)); - } - if (leaf->ents[i].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) - stale++; - } - ASSERT(be16_to_cpu(leaf->hdr.stale) == stale); -} - static void xfs_dir2_free_hdr_check( struct xfs_mount *mp, @@ -510,15 +520,18 @@ xfs_dir2_leafn_lasthash( struct xfs_buf *bp, /* leaf buffer */ int *count) /* count of entries in leaf */ { - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf = bp->b_addr; + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); - leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); if (count) - *count = be16_to_cpu(leaf->hdr.count); - if (!leaf->hdr.count) + *count = leafhdr.count; + if (!leafhdr.count) return 0; - return be32_to_cpu(leaf->ents[be16_to_cpu(leaf->hdr.count) - 1].hashval); + return be32_to_cpu(ents[leafhdr.count - 1].hashval); } /* @@ -547,16 +560,19 @@ xfs_dir2_leafn_lookup_for_addname( xfs_dir2_db_t newdb; /* new data block number */ xfs_dir2_db_t newfdb; /* new free block number */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; dp = args->dp; tp = args->trans; mp = dp->i_mount; leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); -#ifdef __KERNEL__ - ASSERT(be16_to_cpu(leaf->hdr.count) > 0); -#endif - xfs_dir2_leafn_check(dp, bp); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + + xfs_dir3_leaf_check(mp, bp); + ASSERT(leafhdr.count > 0); + /* * Look up the hash value in the leaf entries. */ @@ -576,9 +592,9 @@ xfs_dir2_leafn_lookup_for_addname( /* * Loop over leaf entries with the right hash value. */ - for (lep = &leaf->ents[index]; index < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(lep->hashval) == args->hashval; - lep++, index++) { + for (lep = &ents[index]; + index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval; + lep++, index++) { /* * Skip stale leaf entries. */ @@ -694,16 +710,19 @@ xfs_dir2_leafn_lookup_for_entry( xfs_dir2_db_t newdb; /* new data block number */ xfs_trans_t *tp; /* transaction pointer */ enum xfs_dacmp cmp; /* comparison result */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; dp = args->dp; tp = args->trans; mp = dp->i_mount; leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); -#ifdef __KERNEL__ - ASSERT(be16_to_cpu(leaf->hdr.count) > 0); -#endif - xfs_dir2_leafn_check(dp, bp); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + + xfs_dir3_leaf_check(mp, bp); + ASSERT(leafhdr.count > 0); + /* * Look up the hash value in the leaf entries. */ @@ -718,9 +737,9 @@ xfs_dir2_leafn_lookup_for_entry( /* * Loop over leaf entries with the right hash value. */ - for (lep = &leaf->ents[index]; index < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(lep->hashval) == args->hashval; - lep++, index++) { + for (lep = &ents[index]; + index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval; + lep++, index++) { /* * Skip stale leaf entries. */ @@ -792,8 +811,7 @@ xfs_dir2_leafn_lookup_for_entry( return XFS_ERROR(EEXIST); } } - ASSERT(index == be16_to_cpu(leaf->hdr.count) || - (args->op_flags & XFS_DA_OP_OKNOENT)); + ASSERT(index == leafhdr.count || (args->op_flags & XFS_DA_OP_OKNOENT)); if (curbp) { if (args->cmpresult == XFS_CMP_DIFFERENT) { /* Giving back last used data block. */ @@ -838,52 +856,50 @@ xfs_dir2_leafn_lookup_int( * Log entries and headers. Stale entries are preserved. */ static void -xfs_dir2_leafn_moveents( - xfs_da_args_t *args, /* operation arguments */ - struct xfs_buf *bp_s, /* source leaf buffer */ - int start_s, /* source leaf index */ - struct xfs_buf *bp_d, /* destination leaf buffer */ - int start_d, /* destination leaf index */ - int count) /* count of leaves to copy */ +xfs_dir3_leafn_moveents( + xfs_da_args_t *args, /* operation arguments */ + struct xfs_buf *bp_s, /* source */ + struct xfs_dir3_icleaf_hdr *shdr, + struct xfs_dir2_leaf_entry *sents, + int start_s,/* source leaf index */ + struct xfs_buf *bp_d, /* destination */ + struct xfs_dir3_icleaf_hdr *dhdr, + struct xfs_dir2_leaf_entry *dents, + int start_d,/* destination leaf index */ + int count) /* count of leaves to copy */ { - xfs_dir2_leaf_t *leaf_d; /* destination leaf structure */ - xfs_dir2_leaf_t *leaf_s; /* source leaf structure */ - int stale; /* count stale leaves copied */ - xfs_trans_t *tp; /* transaction pointer */ + int stale; + xfs_trans_t *tp = args->trans; trace_xfs_dir2_leafn_moveents(args, start_s, start_d, count); /* * Silently return if nothing to do. */ - if (count == 0) { + if (count == 0) return; - } - tp = args->trans; - leaf_s = bp_s->b_addr; - leaf_d = bp_d->b_addr; + /* * If the destination index is not the end of the current * destination leaf entries, open up a hole in the destination * to hold the new entries. */ - if (start_d < be16_to_cpu(leaf_d->hdr.count)) { - memmove(&leaf_d->ents[start_d + count], &leaf_d->ents[start_d], - (be16_to_cpu(leaf_d->hdr.count) - start_d) * - sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir2_leaf_log_ents(tp, bp_d, start_d + count, - count + be16_to_cpu(leaf_d->hdr.count) - 1); + if (start_d < dhdr->count) { + memmove(&dents[start_d + count], &dents[start_d], + (dhdr->count - start_d) * sizeof(xfs_dir2_leaf_entry_t)); + xfs_dir3_leaf_log_ents(tp, bp_d, start_d + count, + count + dhdr->count - 1); } /* * If the source has stale leaves, count the ones in the copy range * so we can update the header correctly. */ - if (leaf_s->hdr.stale) { + if (shdr->stale) { int i; /* temp leaf index */ for (i = start_s, stale = 0; i < start_s + count; i++) { - if (leaf_s->ents[i].address == - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + if (sents[i].address == + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) stale++; } } else @@ -891,29 +907,27 @@ xfs_dir2_leafn_moveents( /* * Copy the leaf entries from source to destination. */ - memcpy(&leaf_d->ents[start_d], &leaf_s->ents[start_s], + memcpy(&dents[start_d], &sents[start_s], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir2_leaf_log_ents(tp, bp_d, start_d, start_d + count - 1); + xfs_dir3_leaf_log_ents(tp, bp_d, start_d, start_d + count - 1); + /* * If there are source entries after the ones we copied, * delete the ones we copied by sliding the next ones down. */ - if (start_s + count < be16_to_cpu(leaf_s->hdr.count)) { - memmove(&leaf_s->ents[start_s], &leaf_s->ents[start_s + count], + if (start_s + count < shdr->count) { + memmove(&sents[start_s], &sents[start_s + count], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir2_leaf_log_ents(tp, bp_s, start_s, start_s + count - 1); + xfs_dir3_leaf_log_ents(tp, bp_s, start_s, start_s + count - 1); } + /* * Update the headers and log them. */ - be16_add_cpu(&leaf_s->hdr.count, -(count)); - be16_add_cpu(&leaf_s->hdr.stale, -(stale)); - be16_add_cpu(&leaf_d->hdr.count, count); - be16_add_cpu(&leaf_d->hdr.stale, stale); - xfs_dir2_leaf_log_header(tp, bp_s); - xfs_dir2_leaf_log_header(tp, bp_d); - xfs_dir2_leafn_check(args->dp, bp_s); - xfs_dir2_leafn_check(args->dp, bp_d); + shdr->count -= count; + shdr->stale -= stale; + dhdr->count += count; + dhdr->stale += stale; } /* @@ -922,21 +936,25 @@ xfs_dir2_leafn_moveents( */ int /* sort order */ xfs_dir2_leafn_order( - struct xfs_buf *leaf1_bp, /* leaf1 buffer */ - struct xfs_buf *leaf2_bp) /* leaf2 buffer */ + struct xfs_buf *leaf1_bp, /* leaf1 buffer */ + struct xfs_buf *leaf2_bp) /* leaf2 buffer */ { - xfs_dir2_leaf_t *leaf1; /* leaf1 structure */ - xfs_dir2_leaf_t *leaf2; /* leaf2 structure */ - - leaf1 = leaf1_bp->b_addr; - leaf2 = leaf2_bp->b_addr; - ASSERT(leaf1->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - ASSERT(leaf2->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - if (be16_to_cpu(leaf1->hdr.count) > 0 && - be16_to_cpu(leaf2->hdr.count) > 0 && - (be32_to_cpu(leaf2->ents[0].hashval) < be32_to_cpu(leaf1->ents[0].hashval) || - be32_to_cpu(leaf2->ents[be16_to_cpu(leaf2->hdr.count) - 1].hashval) < - be32_to_cpu(leaf1->ents[be16_to_cpu(leaf1->hdr.count) - 1].hashval))) + struct xfs_dir2_leaf *leaf1 = leaf1_bp->b_addr; + struct xfs_dir2_leaf *leaf2 = leaf2_bp->b_addr; + struct xfs_dir2_leaf_entry *ents1; + struct xfs_dir2_leaf_entry *ents2; + struct xfs_dir3_icleaf_hdr hdr1; + struct xfs_dir3_icleaf_hdr hdr2; + + xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); + xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); + ents1 = xfs_dir3_leaf_ents_p(leaf1); + ents2 = xfs_dir3_leaf_ents_p(leaf2); + + if (hdr1.count > 0 && hdr2.count > 0 && + (be32_to_cpu(ents2[0].hashval) < be32_to_cpu(ents1[0].hashval) || + be32_to_cpu(ents2[hdr2.count - 1].hashval) < + be32_to_cpu(ents1[hdr1.count - 1].hashval))) return 1; return 0; } @@ -965,6 +983,10 @@ xfs_dir2_leafn_rebalance( #endif int oldsum; /* old total leaf count */ int swap; /* swapped leaf blocks */ + struct xfs_dir2_leaf_entry *ents1; + struct xfs_dir2_leaf_entry *ents2; + struct xfs_dir3_icleaf_hdr hdr1; + struct xfs_dir3_icleaf_hdr hdr2; args = state->args; /* @@ -979,11 +1001,17 @@ xfs_dir2_leafn_rebalance( } leaf1 = blk1->bp->b_addr; leaf2 = blk2->bp->b_addr; - oldsum = be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count); + xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); + xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); + ents1 = xfs_dir3_leaf_ents_p(leaf1); + ents2 = xfs_dir3_leaf_ents_p(leaf2); + + oldsum = hdr1.count + hdr2.count; #ifdef DEBUG - oldstale = be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale); + oldstale = hdr1.stale + hdr2.stale; #endif mid = oldsum >> 1; + /* * If the old leaf count was odd then the new one will be even, * so we need to divide the new count evenly. @@ -991,10 +1019,10 @@ xfs_dir2_leafn_rebalance( if (oldsum & 1) { xfs_dahash_t midhash; /* middle entry hash value */ - if (mid >= be16_to_cpu(leaf1->hdr.count)) - midhash = be32_to_cpu(leaf2->ents[mid - be16_to_cpu(leaf1->hdr.count)].hashval); + if (mid >= hdr1.count) + midhash = be32_to_cpu(ents2[mid - hdr1.count].hashval); else - midhash = be32_to_cpu(leaf1->ents[mid].hashval); + midhash = be32_to_cpu(ents1[mid].hashval); isleft = args->hashval <= midhash; } /* @@ -1008,30 +1036,42 @@ xfs_dir2_leafn_rebalance( * Calculate moved entry count. Positive means left-to-right, * negative means right-to-left. Then move the entries. */ - count = be16_to_cpu(leaf1->hdr.count) - mid + (isleft == 0); + count = hdr1.count - mid + (isleft == 0); if (count > 0) - xfs_dir2_leafn_moveents(args, blk1->bp, - be16_to_cpu(leaf1->hdr.count) - count, blk2->bp, 0, count); + xfs_dir3_leafn_moveents(args, blk1->bp, &hdr1, ents1, + hdr1.count - count, blk2->bp, + &hdr2, ents2, 0, count); else if (count < 0) - xfs_dir2_leafn_moveents(args, blk2->bp, 0, blk1->bp, - be16_to_cpu(leaf1->hdr.count), count); - ASSERT(be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count) == oldsum); - ASSERT(be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale) == oldstale); + xfs_dir3_leafn_moveents(args, blk2->bp, &hdr2, ents2, 0, + blk1->bp, &hdr1, ents1, + hdr1.count, count); + + ASSERT(hdr1.count + hdr2.count == oldsum); + ASSERT(hdr1.stale + hdr2.stale == oldstale); + + /* log the changes made when moving the entries */ + xfs_dir3_leaf_hdr_to_disk(leaf1, &hdr1); + xfs_dir3_leaf_hdr_to_disk(leaf2, &hdr2); + xfs_dir3_leaf_log_header(args->trans, blk1->bp); + xfs_dir3_leaf_log_header(args->trans, blk2->bp); + + xfs_dir3_leaf_check(args->dp->i_mount, blk1->bp); + xfs_dir3_leaf_check(args->dp->i_mount, blk2->bp); + /* * Mark whether we're inserting into the old or new leaf. */ - if (be16_to_cpu(leaf1->hdr.count) < be16_to_cpu(leaf2->hdr.count)) + if (hdr1.count < hdr2.count) state->inleaf = swap; - else if (be16_to_cpu(leaf1->hdr.count) > be16_to_cpu(leaf2->hdr.count)) + else if (hdr1.count > hdr2.count) state->inleaf = !swap; else - state->inleaf = - swap ^ (blk1->index <= be16_to_cpu(leaf1->hdr.count)); + state->inleaf = swap ^ (blk1->index <= hdr1.count); /* * Adjust the expected index for insertion. */ if (!state->inleaf) - blk2->index = blk1->index - be16_to_cpu(leaf1->hdr.count); + blk2->index = blk1->index - hdr1.count; /* * Finally sanity check just to make sure we are not returning a @@ -1153,6 +1193,8 @@ xfs_dir2_leafn_remove( int needscan; /* need to rescan data frees */ xfs_trans_t *tp; /* transaction pointer */ struct xfs_dir2_data_free *bf; /* bestfree table */ + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; trace_xfs_dir2_leafn_remove(args, index); @@ -1160,11 +1202,14 @@ xfs_dir2_leafn_remove( tp = args->trans; mp = dp->i_mount; leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + /* * Point to the entry we're removing. */ - lep = &leaf->ents[index]; + lep = &ents[index]; + /* * Extract the data block and offset from the entry. */ @@ -1172,14 +1217,18 @@ xfs_dir2_leafn_remove( ASSERT(dblk->blkno == db); off = xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address)); ASSERT(dblk->index == off); + /* * Kill the leaf entry by marking it stale. * Log the leaf block changes. */ - be16_add_cpu(&leaf->hdr.stale, 1); - xfs_dir2_leaf_log_header(tp, bp); + leafhdr.stale++; + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, bp); + lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir2_leaf_log_ents(tp, bp, index, index); + xfs_dir3_leaf_log_ents(tp, bp, index, index); + /* * Make the data entry free. Keep track of the longest freespace * in the data block in case it changes. @@ -1267,15 +1316,13 @@ xfs_dir2_leafn_remove( return error; } - xfs_dir2_leafn_check(dp, bp); + xfs_dir3_leaf_check(mp, bp); /* * Return indication of whether this leaf block is empty enough * to justify trying to join it with a neighbor. */ - *rval = - ((uint)sizeof(leaf->hdr) + - (uint)sizeof(leaf->ents[0]) * - (be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale))) < + *rval = (xfs_dir3_leaf_hdr_size(leaf) + + (uint)sizeof(ents[0]) * (leafhdr.count - leafhdr.stale)) < mp->m_dir_magicpct; return 0; } @@ -1308,11 +1355,11 @@ xfs_dir2_leafn_split( /* * Initialize the new leaf block. */ - error = xfs_dir2_leaf_init(args, xfs_dir2_da_to_db(mp, blkno), - &newblk->bp, XFS_DIR2_LEAFN_MAGIC); - if (error) { + error = xfs_dir3_leaf_get_buf(args, xfs_dir2_da_to_db(mp, blkno), + &newblk->bp, XFS_DIR2_LEAFN_MAGIC); + if (error) return error; - } + newblk->blkno = blkno; newblk->magic = XFS_DIR2_LEAFN_MAGIC; /* @@ -1336,8 +1383,8 @@ xfs_dir2_leafn_split( */ oldblk->hashval = xfs_dir2_leafn_lasthash(oldblk->bp, NULL); newblk->hashval = xfs_dir2_leafn_lasthash(newblk->bp, NULL); - xfs_dir2_leafn_check(args->dp, oldblk->bp); - xfs_dir2_leafn_check(args->dp, newblk->bp); + xfs_dir3_leaf_check(mp, oldblk->bp); + xfs_dir3_leaf_check(mp, newblk->bp); return error; } @@ -1366,6 +1413,8 @@ xfs_dir2_leafn_toosmall( xfs_da_blkinfo_t *info; /* leaf block header */ xfs_dir2_leaf_t *leaf; /* leaf structure */ int rval; /* result from path_shift */ + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; /* * Check for the degenerate case of the block being over 50% full. @@ -1374,10 +1423,12 @@ xfs_dir2_leafn_toosmall( */ blk = &state->path.blk[state->path.active - 1]; info = blk->bp->b_addr; - ASSERT(info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); leaf = (xfs_dir2_leaf_t *)info; - count = be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); - bytes = (uint)sizeof(leaf->hdr) + count * (uint)sizeof(leaf->ents[0]); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + + count = leafhdr.count - leafhdr.stale; + bytes = xfs_dir3_leaf_hdr_size(leaf) + count * sizeof(ents[0]); if (bytes > (state->blocksize >> 1)) { /* * Blk over 50%, don't try to join. @@ -1396,7 +1447,7 @@ xfs_dir2_leafn_toosmall( * Make altpath point to the block we want to keep and * path point to the block we want to drop (this one). */ - forward = (info->forw != 0); + forward = (leafhdr.forw != 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); error = xfs_da_path_shift(state, &state->altpath, forward, 0, &rval); @@ -1412,15 +1463,17 @@ xfs_dir2_leafn_toosmall( * We prefer coalescing with the lower numbered sibling so as * to shrink a directory over time. */ - forward = be32_to_cpu(info->forw) < be32_to_cpu(info->back); + forward = leafhdr.forw < leafhdr.back; for (i = 0, bp = NULL; i < 2; forward = !forward, i++) { - blkno = forward ? be32_to_cpu(info->forw) : be32_to_cpu(info->back); + struct xfs_dir3_icleaf_hdr hdr2; + + blkno = forward ? leafhdr.forw : leafhdr.back; if (blkno == 0) continue; /* * Read the sibling leaf block. */ - error = xfs_dir2_leafn_read(state->args->trans, state->args->dp, + error = xfs_dir3_leafn_read(state->args->trans, state->args->dp, blkno, -1, &bp); if (error) return error; @@ -1428,13 +1481,15 @@ xfs_dir2_leafn_toosmall( /* * Count bytes in the two blocks combined. */ - leaf = (xfs_dir2_leaf_t *)info; - count = be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); + count = leafhdr.count - leafhdr.stale; bytes = state->blocksize - (state->blocksize >> 2); + leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - count += be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); - bytes -= count * (uint)sizeof(leaf->ents[0]); + xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + count += hdr2.count - hdr2.stale; + bytes -= count * sizeof(ents[0]); + /* * Fits with at least 25% to spare. */ @@ -1481,34 +1536,52 @@ xfs_dir2_leafn_unbalance( xfs_da_args_t *args; /* operation arguments */ xfs_dir2_leaf_t *drop_leaf; /* dead leaf structure */ xfs_dir2_leaf_t *save_leaf; /* surviving leaf structure */ + struct xfs_dir3_icleaf_hdr shdr; + struct xfs_dir3_icleaf_hdr dhdr; + struct xfs_dir2_leaf_entry *sents; + struct xfs_dir2_leaf_entry *dents; args = state->args; ASSERT(drop_blk->magic == XFS_DIR2_LEAFN_MAGIC); ASSERT(save_blk->magic == XFS_DIR2_LEAFN_MAGIC); drop_leaf = drop_blk->bp->b_addr; save_leaf = save_blk->bp->b_addr; - ASSERT(drop_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - ASSERT(save_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + + xfs_dir3_leaf_hdr_from_disk(&shdr, save_leaf); + xfs_dir3_leaf_hdr_from_disk(&dhdr, drop_leaf); + sents = xfs_dir3_leaf_ents_p(save_leaf); + dents = xfs_dir3_leaf_ents_p(drop_leaf); + /* * If there are any stale leaf entries, take this opportunity * to purge them. */ - if (drop_leaf->hdr.stale) - xfs_dir2_leaf_compact(args, drop_blk->bp); - if (save_leaf->hdr.stale) - xfs_dir2_leaf_compact(args, save_blk->bp); + if (dhdr.stale) + xfs_dir3_leaf_compact(args, &dhdr, drop_blk->bp); + if (shdr.stale) + xfs_dir3_leaf_compact(args, &shdr, save_blk->bp); + /* * Move the entries from drop to the appropriate end of save. */ - drop_blk->hashval = be32_to_cpu(drop_leaf->ents[be16_to_cpu(drop_leaf->hdr.count) - 1].hashval); + drop_blk->hashval = be32_to_cpu(dents[dhdr.count - 1].hashval); if (xfs_dir2_leafn_order(save_blk->bp, drop_blk->bp)) - xfs_dir2_leafn_moveents(args, drop_blk->bp, 0, save_blk->bp, 0, - be16_to_cpu(drop_leaf->hdr.count)); + xfs_dir3_leafn_moveents(args, drop_blk->bp, &dhdr, dents, 0, + save_blk->bp, &shdr, sents, 0, + dhdr.count); else - xfs_dir2_leafn_moveents(args, drop_blk->bp, 0, save_blk->bp, - be16_to_cpu(save_leaf->hdr.count), be16_to_cpu(drop_leaf->hdr.count)); - save_blk->hashval = be32_to_cpu(save_leaf->ents[be16_to_cpu(save_leaf->hdr.count) - 1].hashval); - xfs_dir2_leafn_check(args->dp, save_blk->bp); + xfs_dir3_leafn_moveents(args, drop_blk->bp, &dhdr, dents, 0, + save_blk->bp, &shdr, sents, + shdr.count, dhdr.count); + save_blk->hashval = be32_to_cpu(sents[shdr.count - 1].hashval); + + /* log the changes made when moving the entries */ + xfs_dir3_leaf_hdr_to_disk(save_leaf, &shdr); + xfs_dir3_leaf_hdr_to_disk(drop_leaf, &dhdr); + xfs_dir3_leaf_log_header(args->trans, save_blk->bp); + xfs_dir3_leaf_log_header(args->trans, drop_blk->bp); + + xfs_dir3_leaf_check(args->dp->i_mount, save_blk->bp); } /* @@ -2113,13 +2186,15 @@ xfs_dir2_node_replace( * and locked it. But paranoia is good. */ if (rval == EEXIST) { + struct xfs_dir2_leaf_entry *ents; /* * Find the leaf entry. */ blk = &state->path.blk[state->path.active - 1]; ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC); leaf = blk->bp->b_addr; - lep = &leaf->ents[blk->index]; + ents = xfs_dir3_leaf_ents_p(leaf); + lep = &ents[blk->index]; ASSERT(state->extravalid); /* * Point to the data entry. diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 910e644..932565d 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -77,24 +77,25 @@ extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_buf *bp, xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); /* xfs_dir2_leaf.c */ -extern const struct xfs_buf_ops xfs_dir2_leafn_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_leafn_buf_ops; -extern int xfs_dir2_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp, +extern int xfs_dir3_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, xfs_daddr_t mappedbno, struct xfs_buf **bpp); extern int xfs_dir2_block_to_leaf(struct xfs_da_args *args, struct xfs_buf *dbp); extern int xfs_dir2_leaf_addname(struct xfs_da_args *args); -extern void xfs_dir2_leaf_compact(struct xfs_da_args *args, - struct xfs_buf *bp); -extern void xfs_dir2_leaf_compact_x1(struct xfs_buf *bp, int *indexp, +extern void xfs_dir3_leaf_compact(struct xfs_da_args *args, + struct xfs_dir3_icleaf_hdr *leafhdr, struct xfs_buf *bp); +extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int *indexp, int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); extern int xfs_dir2_leaf_getdents(struct xfs_inode *dp, void *dirent, size_t bufsize, xfs_off_t *offset, filldir_t filldir); -extern int xfs_dir2_leaf_init(struct xfs_da_args *args, xfs_dir2_db_t bno, - struct xfs_buf **bpp, int magic); -extern void xfs_dir2_leaf_log_ents(struct xfs_trans *tp, struct xfs_buf *bp, +extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t bno, + struct xfs_buf **bpp, __uint16_t magic); +extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_buf *bp, int first, int last); -extern void xfs_dir2_leaf_log_header(struct xfs_trans *tp, +extern void xfs_dir3_leaf_log_header(struct xfs_trans *tp, struct xfs_buf *bp); extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); @@ -104,11 +105,18 @@ extern int xfs_dir2_leaf_search_hash(struct xfs_da_args *args, extern int xfs_dir2_leaf_trim_data(struct xfs_da_args *args, struct xfs_buf *lbp, xfs_dir2_db_t db); extern struct xfs_dir2_leaf_entry * -xfs_dir2_leaf_find_entry(struct xfs_dir2_leaf *leaf, int index, int compact, - int lowstale, int highstale, - int *lfloglow, int *lfloghigh); +xfs_dir3_leaf_find_entry(struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int index, int compact, + int lowstale, int highstale, int *lfloglow, int *lfloghigh); extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); +extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from); +extern void xfs_dir3_leaf_hdr_to_disk(struct xfs_dir2_leaf *to, + struct xfs_dir3_icleaf_hdr *from); +extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, + struct xfs_dir3_icleaf_hdr *hdr, struct xfs_dir2_leaf *leaf); + /* xfs_dir2_node.c */ extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, struct xfs_buf *lbp); -- 1.7.10.4 From dave@fromorbit.com Wed Apr 3 00:13:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7E4A529E38 for ; Wed, 3 Apr 2013 00:12:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 27531AC005 for ; Tue, 2 Apr 2013 22:12:57 -0700 (PDT) X-ASG-Debug-ID: 1364965969-04bdf0542b18eb80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id aP0gwbqqZVOwRImH for ; Tue, 02 Apr 2013 22:12: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: AkAKANm5W1F5LBrj/2dsb2JhbABDgwfAZQQBgQcXdIIfAQEFGgEMLzMIGDE5AxsZiBPBXY18gRKDUgOTJZRRgx8o Received: from ppp121-44-26-227.lns20.syd6.internode.on.net (HELO dastard) ([121.44.26.227]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Apr 2013 15:42:11 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UNFzR-0000Lz-Ln for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:12:05 +1100 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UNFzH-0005Bw-Fa for xfs@oss.sgi.com; Wed, 03 Apr 2013 16:11:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 15/22] xfs: add CRCs to dir2/da node blocks Date: Wed, 3 Apr 2013 16:11:25 +1100 X-ASG-Orig-Subj: [PATCH 15/22] xfs: add CRCs to dir2/da node blocks Message-Id: <1364965892-19623-16-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1364965969 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr.c | 33 +- fs/xfs/xfs_attr_leaf.c | 29 +- fs/xfs/xfs_bmap.c | 1 + fs/xfs/xfs_da_btree.c | 1395 +++++++++++++++++++++++++++++------------------- fs/xfs/xfs_da_btree.h | 106 +++- fs/xfs/xfs_dir2_node.c | 26 +- fs/xfs/xfs_trace.c | 2 +- 7 files changed, 972 insertions(+), 620 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 8886838..e03128c 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -15,7 +15,6 @@ * 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_types.h" @@ -25,6 +24,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_error.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_attr_sf.h" @@ -35,7 +35,6 @@ #include "xfs_bmap.h" #include "xfs_attr.h" #include "xfs_attr_leaf.h" -#include "xfs_error.h" #include "xfs_quota.h" #include "xfs_trans_space.h" #include "xfs_vnodeops.h" @@ -1236,7 +1235,7 @@ restart: * Search to see if name already exists, and get back a pointer * to where it should go. */ - error = xfs_da_node_lookup_int(state, &retval); + error = xfs_da3_node_lookup_int(state, &retval); if (error) goto out; blk = &state->path.blk[ state->path.active-1 ]; @@ -1307,7 +1306,7 @@ restart: * in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields. */ xfs_bmap_init(args->flist, args->firstblock); - error = xfs_da_split(state); + error = xfs_da3_split(state); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, &committed); @@ -1329,7 +1328,7 @@ restart: /* * Addition succeeded, update Btree hashvals. */ - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); } /* @@ -1400,7 +1399,7 @@ restart: state->blocksize = state->mp->m_sb.sb_blocksize; state->node_ents = state->mp->m_attr_node_ents; state->inleaf = 0; - error = xfs_da_node_lookup_int(state, &retval); + error = xfs_da3_node_lookup_int(state, &retval); if (error) goto out; @@ -1410,14 +1409,14 @@ restart: blk = &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); error = xfs_attr_leaf_remove(blk->bp, args); - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); /* * Check to see if the tree needs to be collapsed. */ if (retval && (state->path.active > 1)) { xfs_bmap_init(args->flist, args->firstblock); - error = xfs_da_join(state); + error = xfs_da3_join(state); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1495,7 +1494,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) /* * Search to see if name exists, and get back a pointer to it. */ - error = xfs_da_node_lookup_int(state, &retval); + error = xfs_da3_node_lookup_int(state, &retval); if (error || (retval != EEXIST)) { if (error == 0) error = retval; @@ -1546,14 +1545,14 @@ xfs_attr_node_removename(xfs_da_args_t *args) blk = &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); retval = xfs_attr_leaf_remove(blk->bp, args); - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); /* * Check to see if the tree needs to be collapsed. */ if (retval && (state->path.active > 1)) { xfs_bmap_init(args->flist, args->firstblock); - error = xfs_da_join(state); + error = xfs_da3_join(state); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, &committed); @@ -1699,7 +1698,7 @@ xfs_attr_refillstate(xfs_da_state_t *state) ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk = path->blk, level = 0; level < path->active; blk++, level++) { if (blk->disk_blkno) { - error = xfs_da_node_read(state->args->trans, + error = xfs_da3_node_read(state->args->trans, state->args->dp, blk->blkno, blk->disk_blkno, &blk->bp, XFS_ATTR_FORK); @@ -1718,7 +1717,7 @@ xfs_attr_refillstate(xfs_da_state_t *state) ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk = path->blk, level = 0; level < path->active; blk++, level++) { if (blk->disk_blkno) { - error = xfs_da_node_read(state->args->trans, + error = xfs_da3_node_read(state->args->trans, state->args->dp, blk->blkno, blk->disk_blkno, &blk->bp, XFS_ATTR_FORK); @@ -1758,7 +1757,7 @@ xfs_attr_node_get(xfs_da_args_t *args) /* * Search to see if name exists, and get back a pointer to it. */ - error = xfs_da_node_lookup_int(state, &retval); + error = xfs_da3_node_lookup_int(state, &retval); if (error) { retval = error; } else if (retval == EEXIST) { @@ -1810,7 +1809,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) */ bp = NULL; if (cursor->blkno > 0) { - error = xfs_da_node_read(NULL, context->dp, cursor->blkno, -1, + error = xfs_da3_node_read(NULL, context->dp, cursor->blkno, -1, &bp, XFS_ATTR_FORK); if ((error != 0) && (error != EFSCORRUPTED)) return(error); @@ -1852,7 +1851,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) if (bp == NULL) { cursor->blkno = 0; for (;;) { - error = xfs_da_node_read(NULL, context->dp, + error = xfs_da3_node_read(NULL, context->dp, cursor->blkno, -1, &bp, XFS_ATTR_FORK); if (error) @@ -1870,7 +1869,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) xfs_trans_brelse(NULL, bp); return(XFS_ERROR(EFSCORRUPTED)); } - btree = node->btree; + btree = xfs_da3_node_tree_p(node); for (i = 0; i < be16_to_cpu(node->hdr.count); btree++, i++) { if (cursor->hashval diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index aa4765f..54b0dc8 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -910,6 +910,7 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) struct xfs_buf *bp1, *bp2; xfs_dablk_t blkno; int error; + struct xfs_da_node_entry *btree; trace_xfs_attr_leaf_to_node(args); @@ -935,16 +936,16 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) /* * Set up the new root node. */ - error = xfs_da_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); + error = xfs_da3_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); if (error) goto out; node = bp1->b_addr; leaf = bp2->b_addr; ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); /* both on-disk, don't endian-flip twice */ - node->btree[0].hashval = - leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; - node->btree[0].before = cpu_to_be32(blkno); + btree = xfs_da3_node_tree_p(node); + btree[0].hashval = leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; + btree[0].before = cpu_to_be32(blkno); node->hdr.count = cpu_to_be16(1); xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(dp->i_mount) - 1); error = 0; @@ -1032,7 +1033,7 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * NOTE: rebalance() currently depends on the 2nd block being empty. */ xfs_attr_leaf_rebalance(state, oldblk, newblk); - error = xfs_da_blk_link(state, oldblk, newblk); + error = xfs_da3_blk_link(state, oldblk, newblk); if (error) return(error); @@ -1660,7 +1661,7 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) */ forward = (info->forw != 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); - error = xfs_da_path_shift(state, &state->altpath, forward, + error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); if (error) return(error); @@ -1717,10 +1718,10 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) */ memcpy(&state->altpath, &state->path, sizeof(state->path)); if (blkno < blk->blkno) { - error = xfs_da_path_shift(state, &state->altpath, forward, + error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); } else { - error = xfs_da_path_shift(state, &state->path, forward, + error = xfs_da3_path_shift(state, &state->path, forward, 0, &retval); } if (error) @@ -2783,7 +2784,7 @@ xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp) * the extents in reverse order the extent containing * block 0 must still be there. */ - error = xfs_da_node_read(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK); + error = xfs_da3_node_read(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK); if (error) return(error); blkno = XFS_BUF_ADDR(bp); @@ -2836,6 +2837,7 @@ xfs_attr_node_inactive( xfs_daddr_t parent_blkno, child_blkno; int error, count, i; struct xfs_buf *child_bp; + struct xfs_da_node_entry *btree; /* * Since this code is recursive (gasp!) we must protect ourselves. @@ -2853,7 +2855,8 @@ xfs_attr_node_inactive( xfs_trans_brelse(*trans, bp); return(0); } - child_fsb = be32_to_cpu(node->btree[0].before); + btree = xfs_da3_node_tree_p(node); + child_fsb = be32_to_cpu(btree[0].before); xfs_trans_brelse(*trans, bp); /* no locks for later trans */ /* @@ -2868,7 +2871,7 @@ xfs_attr_node_inactive( * traversal of the tree so we may deal with many blocks * before we come back to this one. */ - error = xfs_da_node_read(*trans, dp, child_fsb, -2, &child_bp, + error = xfs_da3_node_read(*trans, dp, child_fsb, -2, &child_bp, XFS_ATTR_FORK); if (error) return(error); @@ -2909,11 +2912,11 @@ xfs_attr_node_inactive( * child block number. */ if ((i+1) < count) { - error = xfs_da_node_read(*trans, dp, 0, parent_blkno, + error = xfs_da3_node_read(*trans, dp, 0, parent_blkno, &bp, XFS_ATTR_FORK); if (error) return(error); - child_fsb = be32_to_cpu(node->btree[i+1].before); + child_fsb = be32_to_cpu(btree[i+1].before); xfs_trans_brelse(*trans, bp); } /* diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 0fcb7f4..2844724 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -25,6 +25,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" +#include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 2f23b14..2274994 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -38,6 +39,8 @@ #include "xfs_attr_leaf.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_cksum.h" +#include "xfs_buf_item.h" /* * xfs_da_btree.c @@ -52,69 +55,195 @@ /* * Routines used for growing the Btree. */ -STATIC int xfs_da_root_split(xfs_da_state_t *state, +STATIC int xfs_da3_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *existing_root, xfs_da_state_blk_t *new_child); -STATIC int xfs_da_node_split(xfs_da_state_t *state, +STATIC int xfs_da3_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *existing_blk, xfs_da_state_blk_t *split_blk, xfs_da_state_blk_t *blk_to_add, int treelevel, int *result); -STATIC void xfs_da_node_rebalance(xfs_da_state_t *state, +STATIC void xfs_da3_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *node_blk_1, xfs_da_state_blk_t *node_blk_2); -STATIC void xfs_da_node_add(xfs_da_state_t *state, +STATIC void xfs_da3_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *old_node_blk, xfs_da_state_blk_t *new_node_blk); /* * Routines used for shrinking the Btree. */ -STATIC int xfs_da_root_join(xfs_da_state_t *state, +STATIC int xfs_da3_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk); -STATIC int xfs_da_node_toosmall(xfs_da_state_t *state, int *retval); -STATIC void xfs_da_node_remove(xfs_da_state_t *state, +STATIC int xfs_da3_node_toosmall(xfs_da_state_t *state, int *retval); +STATIC void xfs_da3_node_remove(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk); -STATIC void xfs_da_node_unbalance(xfs_da_state_t *state, +STATIC void xfs_da3_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *src_node_blk, xfs_da_state_blk_t *dst_node_blk); /* * Utility routines. */ -STATIC uint xfs_da_node_lasthash(struct xfs_buf *bp, int *count); -STATIC int xfs_da_node_order(struct xfs_buf *node1_bp, - struct xfs_buf *node2_bp); -STATIC int xfs_da_blk_unlink(xfs_da_state_t *state, +STATIC int xfs_da3_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, xfs_da_state_blk_t *save_blk); -STATIC void xfs_da_state_kill_altpath(xfs_da_state_t *state); -static void -xfs_da_node_verify( + +kmem_zone_t *xfs_da_state_zone; /* anchor for state struct zone */ + +/* + * Allocate a dir-state structure. + * We don't put them on the stack since they're large. + */ +xfs_da_state_t * +xfs_da_state_alloc(void) +{ + return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS); +} + +/* + * Kill the altpath contents of a da-state structure. + */ +STATIC void +xfs_da_state_kill_altpath(xfs_da_state_t *state) +{ + int i; + + for (i = 0; i < state->altpath.active; i++) + state->altpath.blk[i].bp = NULL; + state->altpath.active = 0; +} + +/* + * Free a da-state structure. + */ +void +xfs_da_state_free(xfs_da_state_t *state) +{ + xfs_da_state_kill_altpath(state); +#ifdef DEBUG + memset((char *)state, 0, sizeof(*state)); +#endif /* DEBUG */ + kmem_zone_free(xfs_da_state_zone, state); +} + +void +xfs_da3_node_hdr_from_disk( + struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from) +{ + ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || + from->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); + + if (from->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { + struct xfs_da3_node_hdr *hdr3 = (struct xfs_da3_node_hdr *)from; + + to->forw = be32_to_cpu(hdr3->info.hdr.forw); + to->back = be32_to_cpu(hdr3->info.hdr.back); + to->magic = be16_to_cpu(hdr3->info.hdr.magic); + to->count = be16_to_cpu(hdr3->count); + to->level = be16_to_cpu(hdr3->__level); + return; + } + to->forw = be32_to_cpu(from->hdr.info.forw); + to->back = be32_to_cpu(from->hdr.info.back); + to->magic = be16_to_cpu(from->hdr.info.magic); + to->count = be16_to_cpu(from->hdr.count); + to->level = be16_to_cpu(from->hdr.__level); +} + +void +xfs_da3_node_hdr_to_disk( + struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from) +{ + ASSERT(from->magic == XFS_DA_NODE_MAGIC || + from->magic == XFS_DA3_NODE_MAGIC); + + if (from->magic == XFS_DA3_NODE_MAGIC) { + struct xfs_da3_node_hdr *hdr3 = (struct xfs_da3_node_hdr *)to; + + hdr3->info.hdr.forw = cpu_to_be32(from->forw); + hdr3->info.hdr.back = cpu_to_be32(from->back); + hdr3->info.hdr.magic = cpu_to_be16(from->magic); + hdr3->count = cpu_to_be16(from->count); + hdr3->__level = cpu_to_be16(from->level); + return; + } + to->hdr.info.forw = cpu_to_be32(from->forw); + to->hdr.info.back = cpu_to_be32(from->back); + to->hdr.info.magic = cpu_to_be16(from->magic); + to->hdr.count = cpu_to_be16(from->count); + to->hdr.__level = cpu_to_be16(from->level); +} + +static bool +xfs_da3_node_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_da_node_hdr *hdr = bp->b_addr; - int block_ok = 0; - - block_ok = hdr->info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC); - block_ok = block_ok && - be16_to_cpu(hdr->level) > 0 && - be16_to_cpu(hdr->count) > 0 ; - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + struct xfs_da_intnode *hdr = bp->b_addr; + struct xfs_da3_icnode_hdr ichdr; + + xfs_da3_node_hdr_from_disk(&ichdr, hdr); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_node_hdr *hdr3 = bp->b_addr; + + if (ichdr.magic != XFS_DA3_NODE_MAGIC) + return false; + + if (!uuid_equal(&hdr3->info.uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn) + return false; + } else { + if (ichdr.magic != XFS_DA_NODE_MAGIC) + return false; } + if (ichdr.level == 0) + return false; + if (ichdr.level > XFS_DA_NODE_MAXDEPTH) + return false; + if (ichdr.count == 0) + return false; + + /* + * we don't know if the node is for and attribute or directory tree, + * so only fail if the count is outside both bounds + */ + if (ichdr.count > mp->m_dir_node_ents && + ichdr.count > mp->m_attr_node_ents) + return false; + + /* XXX: hash order check? */ + return true; } static void -xfs_da_node_write_verify( +xfs_da3_node_write_verify( struct xfs_buf *bp) { - xfs_da_node_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + struct xfs_da3_node_hdr *hdr3 = bp->b_addr; + + if (!xfs_da3_node_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DA3_NODE_CRC_OFF); } /* @@ -124,16 +253,22 @@ xfs_da_node_write_verify( * format of the block being read. */ static void -xfs_da_node_read_verify( +xfs_da3_node_read_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_da_blkinfo *info = bp->b_addr; switch (be16_to_cpu(info->magic)) { + case XFS_DA3_NODE_MAGIC: + if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_DA3_NODE_CRC_OFF)) + break; + /* fall through */ case XFS_DA_NODE_MAGIC: - xfs_da_node_verify(bp); - break; + if (!xfs_da3_node_verify(bp)) + break; + return; case XFS_ATTR_LEAF_MAGIC: bp->b_ops = &xfs_attr_leaf_buf_ops; bp->b_ops->verify_read(bp); @@ -144,21 +279,22 @@ xfs_da_node_read_verify( bp->b_ops->verify_read(bp); return; default: - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - mp, info); - xfs_buf_ioerror(bp, EFSCORRUPTED); break; } + + /* corrupt block */ + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); } -const struct xfs_buf_ops xfs_da_node_buf_ops = { - .verify_read = xfs_da_node_read_verify, - .verify_write = xfs_da_node_write_verify, +const struct xfs_buf_ops xfs_da3_node_buf_ops = { + .verify_read = xfs_da3_node_read_verify, + .verify_write = xfs_da3_node_write_verify, }; int -xfs_da_node_read( +xfs_da3_node_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, @@ -167,7 +303,7 @@ xfs_da_node_read( int which_fork) { return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, - which_fork, &xfs_da_node_buf_ops); + which_fork, &xfs_da3_node_buf_ops); } /*======================================================================== @@ -178,33 +314,45 @@ xfs_da_node_read( * Create the initial contents of an intermediate node. */ int -xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, - struct xfs_buf **bpp, int whichfork) +xfs_da3_node_create( + struct xfs_da_args *args, + xfs_dablk_t blkno, + int level, + struct xfs_buf **bpp, + int whichfork) { - xfs_da_intnode_t *node; - struct xfs_buf *bp; - int error; - xfs_trans_t *tp; + struct xfs_da_intnode *node; + struct xfs_trans *tp = args->trans; + struct xfs_mount *mp = tp->t_mountp; + struct xfs_da3_icnode_hdr ichdr = {0}; + struct xfs_buf *bp; + int error; trace_xfs_da_node_create(args); + ASSERT(level <= XFS_DA_NODE_MAXDEPTH); - tp = args->trans; error = xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); if (error) return(error); - ASSERT(bp != NULL); node = bp->b_addr; - node->hdr.info.forw = 0; - node->hdr.info.back = 0; - node->hdr.info.magic = cpu_to_be16(XFS_DA_NODE_MAGIC); - node->hdr.info.pad = 0; - node->hdr.count = 0; - node->hdr.level = cpu_to_be16(level); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_node_hdr *hdr3 = bp->b_addr; + + ichdr.magic = XFS_DA3_NODE_MAGIC; + hdr3->info.blkno = cpu_to_be64(bp->b_bn); + hdr3->info.owner = cpu_to_be64(args->dp->i_ino); + uuid_copy(&hdr3->info.uuid, &mp->m_sb.sb_uuid); + } else { + ichdr.magic = XFS_DA_NODE_MAGIC; + } + ichdr.level = level; + + xfs_da3_node_hdr_to_disk(node, &ichdr); xfs_trans_log_buf(tp, bp, - XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); + XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); - bp->b_ops = &xfs_da_node_buf_ops; + bp->b_ops = &xfs_da3_node_buf_ops; *bpp = bp; return(0); } @@ -214,12 +362,18 @@ xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, * intermediate nodes, rebalance, etc. */ int /* error */ -xfs_da_split(xfs_da_state_t *state) +xfs_da3_split( + struct xfs_da_state *state) { - xfs_da_state_blk_t *oldblk, *newblk, *addblk; - xfs_da_intnode_t *node; - struct xfs_buf *bp; - int max, action, error, i; + struct xfs_da_state_blk *oldblk; + struct xfs_da_state_blk *newblk; + struct xfs_da_state_blk *addblk; + struct xfs_da_intnode *node; + struct xfs_buf *bp; + int max; + int action; + int error; + int i; trace_xfs_da_split(state->args); @@ -281,7 +435,7 @@ xfs_da_split(xfs_da_state_t *state) addblk = newblk; break; case XFS_DA_NODE_MAGIC: - error = xfs_da_node_split(state, oldblk, newblk, addblk, + error = xfs_da3_node_split(state, oldblk, newblk, addblk, max - i, &action); addblk->bp = NULL; if (error) @@ -299,7 +453,7 @@ xfs_da_split(xfs_da_state_t *state) /* * Update the btree to show the new hashval for this child. */ - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); } if (!addblk) return(0); @@ -309,7 +463,7 @@ xfs_da_split(xfs_da_state_t *state) */ ASSERT(state->path.active == 0); oldblk = &state->path.blk[0]; - error = xfs_da_root_split(state, oldblk, addblk); + error = xfs_da3_root_split(state, oldblk, addblk); if (error) { addblk->bp = NULL; return(error); /* GROT: dir is inconsistent */ @@ -320,8 +474,10 @@ xfs_da_split(xfs_da_state_t *state) * just got bumped because of the addition of a new root node. * There might be three blocks involved if a double split occurred, * and the original block 0 could be at any position in the list. + * + * Note: the info structures being modified here for both v2 and v3 da + * headers, so we can do this linkage just using the v2 structures. */ - node = oldblk->bp->b_addr; if (node->hdr.info.forw) { if (be32_to_cpu(node->hdr.info.forw) == addblk->blkno) { @@ -360,18 +516,25 @@ xfs_da_split(xfs_da_state_t *state) * the EOF, extending the inode in process. */ STATIC int /* error */ -xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2) +xfs_da3_root_split( + struct xfs_da_state *state, + struct xfs_da_state_blk *blk1, + struct xfs_da_state_blk *blk2) { - xfs_da_intnode_t *node, *oldroot; - xfs_da_args_t *args; - xfs_dablk_t blkno; - struct xfs_buf *bp; - int error, size; - xfs_inode_t *dp; - xfs_trans_t *tp; - xfs_mount_t *mp; - xfs_dir2_leaf_t *leaf; + struct xfs_da_intnode *node; + struct xfs_da_intnode *oldroot; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_args *args; + struct xfs_buf *bp; + struct xfs_inode *dp; + struct xfs_trans *tp; + struct xfs_mount *mp; + struct xfs_dir2_leaf *leaf; + xfs_dablk_t blkno; + int level; + int error; + int size; trace_xfs_da_root_split(state->args); @@ -380,22 +543,26 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * to a free space somewhere. */ args = state->args; - ASSERT(args != NULL); error = xfs_da_grow_inode(args, &blkno); if (error) - return(error); + return error; + dp = args->dp; tp = args->trans; mp = state->mp; error = xfs_da_get_buf(tp, dp, blkno, -1, &bp, args->whichfork); if (error) - return(error); - ASSERT(bp != NULL); + return error; node = bp->b_addr; oldroot = blk1->bp->b_addr; - if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)) { - size = (int)((char *)&oldroot->btree[be16_to_cpu(oldroot->hdr.count)] - - (char *)oldroot); + if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || + oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { + struct xfs_da3_icnode_hdr nodehdr; + + xfs_da3_node_hdr_from_disk(&nodehdr, oldroot); + btree = xfs_da3_node_tree_p(oldroot); + size = (int)((char *)&btree[nodehdr.count] - (char *)oldroot); + level = nodehdr.level; } else { struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir2_leaf_entry *ents; @@ -407,9 +574,22 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); size = (int)((char *)&ents[leafhdr.count] - (char *)leaf); + level = 0; } - /* XXX: can't just copy CRC headers from one block to another */ + + /* + * we can copy most of the information in the node from one block to + * another, but for CRC enabled headers we have to make sure that the + * block specific identifiers are kept intact. We update the buffer + * directly for this. + */ memcpy(node, oldroot, size); + if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) || + oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_da3_intnode *node3 = (struct xfs_da3_intnode *)node; + + node3->hdr.info.blkno = cpu_to_be64(bp->b_bn); + } xfs_trans_log_buf(tp, bp, 0, size - 1); bp->b_ops = blk1->bp->b_ops; @@ -419,17 +599,21 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, /* * Set up the new root node. */ - error = xfs_da_node_create(args, + error = xfs_da3_node_create(args, (args->whichfork == XFS_DATA_FORK) ? mp->m_dirleafblk : 0, - be16_to_cpu(node->hdr.level) + 1, &bp, args->whichfork); + level + 1, &bp, args->whichfork); if (error) - return(error); + return error; + node = bp->b_addr; - node->btree[0].hashval = cpu_to_be32(blk1->hashval); - node->btree[0].before = cpu_to_be32(blk1->blkno); - node->btree[1].hashval = cpu_to_be32(blk2->hashval); - node->btree[1].before = cpu_to_be32(blk2->blkno); - node->hdr.count = cpu_to_be16(2); + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree = xfs_da3_node_tree_p(node); + btree[0].hashval = cpu_to_be32(blk1->hashval); + btree[0].before = cpu_to_be32(blk1->blkno); + btree[1].hashval = cpu_to_be32(blk2->hashval); + btree[1].before = cpu_to_be32(blk2->blkno); + nodehdr.count = 2; + xfs_da3_node_hdr_to_disk(node, &nodehdr); #ifdef DEBUG if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || @@ -443,30 +627,34 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, /* Header is already logged by xfs_da_node_create */ xfs_trans_log_buf(tp, bp, - XFS_DA_LOGRANGE(node, node->btree, - sizeof(xfs_da_node_entry_t) * 2)); + XFS_DA_LOGRANGE(node, btree, sizeof(xfs_da_node_entry_t) * 2)); - return(0); + return 0; } /* * Split the node, rebalance, then add the new entry. */ STATIC int /* error */ -xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, - xfs_da_state_blk_t *newblk, - xfs_da_state_blk_t *addblk, - int treelevel, int *result) +xfs_da3_node_split( + struct xfs_da_state *state, + struct xfs_da_state_blk *oldblk, + struct xfs_da_state_blk *newblk, + struct xfs_da_state_blk *addblk, + int treelevel, + int *result) { - xfs_da_intnode_t *node; - xfs_dablk_t blkno; - int newcount, error; - int useextra; + struct xfs_da_intnode *node; + struct xfs_da3_icnode_hdr nodehdr; + xfs_dablk_t blkno; + int newcount; + int error; + int useextra; trace_xfs_da_node_split(state->args); node = oldblk->bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); + xfs_da3_node_hdr_from_disk(&nodehdr, node); /* * With V2 dirs the extra block is data or freespace. @@ -476,7 +664,7 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, /* * Do we have to split the node? */ - if ((be16_to_cpu(node->hdr.count) + newcount) > state->node_ents) { + if (nodehdr.count + newcount > state->node_ents) { /* * Allocate a new node, add to the doubly linked chain of * nodes, then move some of our excess entries into it. @@ -485,14 +673,14 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, if (error) return(error); /* GROT: dir is inconsistent */ - error = xfs_da_node_create(state->args, blkno, treelevel, + error = xfs_da3_node_create(state->args, blkno, treelevel, &newblk->bp, state->args->whichfork); if (error) return(error); /* GROT: dir is inconsistent */ newblk->blkno = blkno; newblk->magic = XFS_DA_NODE_MAGIC; - xfs_da_node_rebalance(state, oldblk, newblk); - error = xfs_da_blk_link(state, oldblk, newblk); + xfs_da3_node_rebalance(state, oldblk, newblk); + error = xfs_da3_blk_link(state, oldblk, newblk); if (error) return(error); *result = 1; @@ -504,7 +692,7 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * Insert the new entry(s) into the correct block * (updating last hashval in the process). * - * xfs_da_node_add() inserts BEFORE the given index, + * xfs_da3_node_add() inserts BEFORE the given index, * and as a result of using node_lookup_int() we always * point to a valid entry (not after one), but a split * operation always results in a new block whose hashvals @@ -513,22 +701,23 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * If we had double-split op below us, then add the extra block too. */ node = oldblk->bp->b_addr; - if (oldblk->index <= be16_to_cpu(node->hdr.count)) { + xfs_da3_node_hdr_from_disk(&nodehdr, node); + if (oldblk->index <= nodehdr.count) { oldblk->index++; - xfs_da_node_add(state, oldblk, addblk); + xfs_da3_node_add(state, oldblk, addblk); if (useextra) { if (state->extraafter) oldblk->index++; - xfs_da_node_add(state, oldblk, &state->extrablk); + xfs_da3_node_add(state, oldblk, &state->extrablk); state->extravalid = 0; } } else { newblk->index++; - xfs_da_node_add(state, newblk, addblk); + xfs_da3_node_add(state, newblk, addblk); if (useextra) { if (state->extraafter) newblk->index++; - xfs_da_node_add(state, newblk, &state->extrablk); + xfs_da3_node_add(state, newblk, &state->extrablk); state->extravalid = 0; } } @@ -543,33 +732,53 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * NOTE: if blk2 is empty, then it will get the upper half of blk1. */ STATIC void -xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2) +xfs_da3_node_rebalance( + struct xfs_da_state *state, + struct xfs_da_state_blk *blk1, + struct xfs_da_state_blk *blk2) { - xfs_da_intnode_t *node1, *node2, *tmpnode; - xfs_da_node_entry_t *btree_s, *btree_d; - int count, tmp; - xfs_trans_t *tp; + struct xfs_da_intnode *node1; + struct xfs_da_intnode *node2; + struct xfs_da_intnode *tmpnode; + struct xfs_da_node_entry *btree1; + struct xfs_da_node_entry *btree2; + struct xfs_da_node_entry *btree_s; + struct xfs_da_node_entry *btree_d; + struct xfs_da3_icnode_hdr nodehdr1; + struct xfs_da3_icnode_hdr nodehdr2; + struct xfs_trans *tp; + int count; + int tmp; + int swap = 0; trace_xfs_da_node_rebalance(state->args); node1 = blk1->bp->b_addr; node2 = blk2->bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr1, node1); + xfs_da3_node_hdr_from_disk(&nodehdr2, node2); + btree1 = xfs_da3_node_tree_p(node1); + btree2 = xfs_da3_node_tree_p(node2); + /* * Figure out how many entries need to move, and in which direction. * Swap the nodes around if that makes it simpler. */ - if ((be16_to_cpu(node1->hdr.count) > 0) && (be16_to_cpu(node2->hdr.count) > 0) && - ((be32_to_cpu(node2->btree[0].hashval) < be32_to_cpu(node1->btree[0].hashval)) || - (be32_to_cpu(node2->btree[be16_to_cpu(node2->hdr.count)-1].hashval) < - be32_to_cpu(node1->btree[be16_to_cpu(node1->hdr.count)-1].hashval)))) { + if (nodehdr1.count > 0 && nodehdr2.count > 0 && + ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) || + (be32_to_cpu(btree2[nodehdr2.count - 1].hashval) < + be32_to_cpu(btree1[nodehdr1.count - 1].hashval)))) { tmpnode = node1; node1 = node2; node2 = tmpnode; + xfs_da3_node_hdr_from_disk(&nodehdr1, node1); + xfs_da3_node_hdr_from_disk(&nodehdr2, node2); + btree1 = xfs_da3_node_tree_p(node1); + btree2 = xfs_da3_node_tree_p(node2); + swap = 1; } - ASSERT(node1->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - ASSERT(node2->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - count = (be16_to_cpu(node1->hdr.count) - be16_to_cpu(node2->hdr.count)) / 2; + + count = (nodehdr1.count - nodehdr2.count) / 2; if (count == 0) return; tp = state->args->trans; @@ -580,10 +789,11 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, /* * Move elements in node2 up to make a hole. */ - if ((tmp = be16_to_cpu(node2->hdr.count)) > 0) { + tmp = nodehdr2.count; + if (tmp > 0) { tmp *= (uint)sizeof(xfs_da_node_entry_t); - btree_s = &node2->btree[0]; - btree_d = &node2->btree[count]; + btree_s = &btree2[0]; + btree_d = &btree2[count]; memmove(btree_d, btree_s, tmp); } @@ -591,12 +801,12 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * Move the req'd B-tree elements from high in node1 to * low in node2. */ - be16_add_cpu(&node2->hdr.count, count); + nodehdr2.count += count; tmp = count * (uint)sizeof(xfs_da_node_entry_t); - btree_s = &node1->btree[be16_to_cpu(node1->hdr.count) - count]; - btree_d = &node2->btree[0]; + btree_s = &btree1[nodehdr1.count- count]; + btree_d = &btree2[0]; memcpy(btree_d, btree_s, tmp); - be16_add_cpu(&node1->hdr.count, -count); + nodehdr1.count -= count; } else { /* * Move the req'd B-tree elements from low in node2 to @@ -604,49 +814,60 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, */ count = -count; tmp = count * (uint)sizeof(xfs_da_node_entry_t); - btree_s = &node2->btree[0]; - btree_d = &node1->btree[be16_to_cpu(node1->hdr.count)]; + btree_s = &btree2[0]; + btree_d = &btree1[nodehdr1.count]; memcpy(btree_d, btree_s, tmp); - be16_add_cpu(&node1->hdr.count, count); + nodehdr1.count += count; + xfs_trans_log_buf(tp, blk1->bp, XFS_DA_LOGRANGE(node1, btree_d, tmp)); /* * Move elements in node2 down to fill the hole. */ - tmp = be16_to_cpu(node2->hdr.count) - count; + tmp = nodehdr2.count - count; tmp *= (uint)sizeof(xfs_da_node_entry_t); - btree_s = &node2->btree[count]; - btree_d = &node2->btree[0]; + btree_s = &btree2[count]; + btree_d = &btree2[0]; memmove(btree_d, btree_s, tmp); - be16_add_cpu(&node2->hdr.count, -count); + nodehdr2.count -= count; } /* * Log header of node 1 and all current bits of node 2. */ + xfs_da3_node_hdr_to_disk(node1, &nodehdr1); xfs_trans_log_buf(tp, blk1->bp, - XFS_DA_LOGRANGE(node1, &node1->hdr, sizeof(node1->hdr))); + XFS_DA_LOGRANGE(node1, &node1->hdr, + xfs_da3_node_hdr_size(node1))); + + xfs_da3_node_hdr_to_disk(node2, &nodehdr2); xfs_trans_log_buf(tp, blk2->bp, XFS_DA_LOGRANGE(node2, &node2->hdr, - sizeof(node2->hdr) + - sizeof(node2->btree[0]) * be16_to_cpu(node2->hdr.count))); + xfs_da3_node_hdr_size(node2) + + (sizeof(btree2[0]) * nodehdr2.count))); /* * Record the last hashval from each block for upward propagation. * (note: don't use the swapped node pointers) */ - node1 = blk1->bp->b_addr; - node2 = blk2->bp->b_addr; - blk1->hashval = be32_to_cpu(node1->btree[be16_to_cpu(node1->hdr.count)-1].hashval); - blk2->hashval = be32_to_cpu(node2->btree[be16_to_cpu(node2->hdr.count)-1].hashval); + if (swap) { + node1 = blk1->bp->b_addr; + node2 = blk2->bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr1, node1); + xfs_da3_node_hdr_from_disk(&nodehdr2, node2); + btree1 = xfs_da3_node_tree_p(node1); + btree2 = xfs_da3_node_tree_p(node2); + } + blk1->hashval = be32_to_cpu(btree1[nodehdr1.count - 1].hashval); + blk2->hashval = be32_to_cpu(btree2[nodehdr2.count - 1].hashval); /* * Adjust the expected index for insertion. */ - if (blk1->index >= be16_to_cpu(node1->hdr.count)) { - blk2->index = blk1->index - be16_to_cpu(node1->hdr.count); - blk1->index = be16_to_cpu(node1->hdr.count) + 1; /* make it invalid */ + if (blk1->index >= nodehdr1.count) { + blk2->index = blk1->index - nodehdr1.count; + blk1->index = nodehdr1.count + 1; /* make it invalid */ } } @@ -654,18 +875,23 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * Add a new entry to an intermediate node. */ STATIC void -xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, - xfs_da_state_blk_t *newblk) +xfs_da3_node_add( + struct xfs_da_state *state, + struct xfs_da_state_blk *oldblk, + struct xfs_da_state_blk *newblk) { - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - int tmp; + struct xfs_da_intnode *node; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_node_entry *btree; + int tmp; trace_xfs_da_node_add(state->args); node = oldblk->bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - ASSERT((oldblk->index >= 0) && (oldblk->index <= be16_to_cpu(node->hdr.count))); + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree = xfs_da3_node_tree_p(node); + + ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count); ASSERT(newblk->blkno != 0); if (state->args->whichfork == XFS_DATA_FORK) ASSERT(newblk->blkno >= state->mp->m_dirleafblk && @@ -675,23 +901,25 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * We may need to make some room before we insert the new node. */ tmp = 0; - btree = &node->btree[ oldblk->index ]; - if (oldblk->index < be16_to_cpu(node->hdr.count)) { - tmp = (be16_to_cpu(node->hdr.count) - oldblk->index) * (uint)sizeof(*btree); - memmove(btree + 1, btree, tmp); + if (oldblk->index < nodehdr.count) { + tmp = (nodehdr.count - oldblk->index) * (uint)sizeof(*btree); + memmove(&btree[oldblk->index + 1], &btree[oldblk->index], tmp); } - btree->hashval = cpu_to_be32(newblk->hashval); - btree->before = cpu_to_be32(newblk->blkno); + btree[oldblk->index].hashval = cpu_to_be32(newblk->hashval); + btree[oldblk->index].before = cpu_to_be32(newblk->blkno); xfs_trans_log_buf(state->args->trans, oldblk->bp, - XFS_DA_LOGRANGE(node, btree, tmp + sizeof(*btree))); - be16_add_cpu(&node->hdr.count, 1); + XFS_DA_LOGRANGE(node, &btree[oldblk->index], + tmp + sizeof(*btree))); + + nodehdr.count += 1; + xfs_da3_node_hdr_to_disk(node, &nodehdr); xfs_trans_log_buf(state->args->trans, oldblk->bp, - XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); + XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); /* * Copy the last hash value from the oldblk to propagate upwards. */ - oldblk->hashval = be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1 ].hashval); + oldblk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval); } /*======================================================================== @@ -703,14 +931,16 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * possibly deallocating that block, etc... */ int -xfs_da_join(xfs_da_state_t *state) +xfs_da3_join( + struct xfs_da_state *state) { - xfs_da_state_blk_t *drop_blk, *save_blk; - int action, error; + struct xfs_da_state_blk *drop_blk; + struct xfs_da_state_blk *save_blk; + int action = 0; + int error; trace_xfs_da_join(state->args); - action = 0; drop_blk = &state->path.blk[ state->path.active-1 ]; save_blk = &state->altpath.blk[ state->path.active-1 ]; ASSERT(state->path.blk[0].magic == XFS_DA_NODE_MAGIC); @@ -751,18 +981,18 @@ xfs_da_join(xfs_da_state_t *state) * Remove the offending node, fixup hashvals, * check for a toosmall neighbor. */ - xfs_da_node_remove(state, drop_blk); - xfs_da_fixhashpath(state, &state->path); - error = xfs_da_node_toosmall(state, &action); + xfs_da3_node_remove(state, drop_blk); + xfs_da3_fixhashpath(state, &state->path); + error = xfs_da3_node_toosmall(state, &action); if (error) return(error); if (action == 0) return 0; - xfs_da_node_unbalance(state, drop_blk, save_blk); + xfs_da3_node_unbalance(state, drop_blk, save_blk); break; } - xfs_da_fixhashpath(state, &state->altpath); - error = xfs_da_blk_unlink(state, drop_blk, save_blk); + xfs_da3_fixhashpath(state, &state->altpath); + error = xfs_da3_blk_unlink(state, drop_blk, save_blk); xfs_da_state_kill_altpath(state); if (error) return(error); @@ -777,9 +1007,9 @@ xfs_da_join(xfs_da_state_t *state) * we only have one entry in the root, make the child block * the new root. */ - xfs_da_node_remove(state, drop_blk); - xfs_da_fixhashpath(state, &state->path); - error = xfs_da_root_join(state, &state->path.blk[0]); + xfs_da3_node_remove(state, drop_blk); + xfs_da3_fixhashpath(state, &state->path); + error = xfs_da3_root_join(state, &state->path.blk[0]); return(error); } @@ -793,8 +1023,10 @@ xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level) ASSERT(magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - } else - ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); + } else { + ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || + magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); + } ASSERT(!blkinfo->forw); ASSERT(!blkinfo->back); } @@ -807,52 +1039,60 @@ xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level) * the old root to block 0 as the new root node. */ STATIC int -xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) +xfs_da3_root_join( + struct xfs_da_state *state, + struct xfs_da_state_blk *root_blk) { - xfs_da_intnode_t *oldroot; - xfs_da_args_t *args; - xfs_dablk_t child; - struct xfs_buf *bp; - int error; + struct xfs_da_intnode *oldroot; + struct xfs_da_args *args; + xfs_dablk_t child; + struct xfs_buf *bp; + struct xfs_da3_icnode_hdr oldroothdr; + struct xfs_da_node_entry *btree; + int error; trace_xfs_da_root_join(state->args); - args = state->args; - ASSERT(args != NULL); ASSERT(root_blk->magic == XFS_DA_NODE_MAGIC); + + args = state->args; oldroot = root_blk->bp->b_addr; - ASSERT(oldroot->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - ASSERT(!oldroot->hdr.info.forw); - ASSERT(!oldroot->hdr.info.back); + xfs_da3_node_hdr_from_disk(&oldroothdr, oldroot); + ASSERT(oldroothdr.forw == 0); + ASSERT(oldroothdr.back == 0); /* * If the root has more than one child, then don't do anything. */ - if (be16_to_cpu(oldroot->hdr.count) > 1) - return(0); + if (oldroothdr.count > 1) + return 0; /* * Read in the (only) child block, then copy those bytes into * the root block's buffer and free the original child block. */ - child = be32_to_cpu(oldroot->btree[0].before); + btree = xfs_da3_node_tree_p(oldroot); + child = be32_to_cpu(btree[0].before); ASSERT(child != 0); - error = xfs_da_node_read(args->trans, args->dp, child, -1, &bp, + error = xfs_da3_node_read(args->trans, args->dp, child, -1, &bp, args->whichfork); if (error) - return(error); - ASSERT(bp != NULL); - xfs_da_blkinfo_onlychild_validate(bp->b_addr, - be16_to_cpu(oldroot->hdr.level)); + return error; + xfs_da_blkinfo_onlychild_validate(bp->b_addr, oldroothdr.level); /* * This could be copying a leaf back into the root block in the case of * there only being a single leaf block left in the tree. Hence we have * to update the b_ops pointer as well to match the buffer type change - * that could occur. + * that could occur. For dir3 blocks we also need to update the block + * number in the buffer header. */ memcpy(root_blk->bp->b_addr, bp->b_addr, state->blocksize); root_blk->bp->b_ops = bp->b_ops; + if (oldroothdr.magic == XFS_DA3_NODE_MAGIC) { + struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr; + da3->blkno = cpu_to_be64(root_blk->bp->b_bn); + } xfs_trans_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); error = xfs_da_shrink_inode(args, child, bp); return(error); @@ -868,14 +1108,21 @@ xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) * If nothing can be done, return 0. */ STATIC int -xfs_da_node_toosmall(xfs_da_state_t *state, int *action) +xfs_da3_node_toosmall( + struct xfs_da_state *state, + int *action) { - xfs_da_intnode_t *node; - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *info; - int count, forward, error, retval, i; - xfs_dablk_t blkno; - struct xfs_buf *bp; + struct xfs_da_intnode *node; + struct xfs_da_state_blk *blk; + struct xfs_da_blkinfo *info; + xfs_dablk_t blkno; + struct xfs_buf *bp; + struct xfs_da3_icnode_hdr nodehdr; + int count; + int forward; + int error; + int retval; + int i; trace_xfs_da_node_toosmall(state->args); @@ -886,10 +1133,9 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) */ blk = &state->path.blk[ state->path.active-1 ]; info = blk->bp->b_addr; - ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); node = (xfs_da_intnode_t *)info; - count = be16_to_cpu(node->hdr.count); - if (count > (state->node_ents >> 1)) { + xfs_da3_node_hdr_from_disk(&nodehdr, node); + if (nodehdr.count > (state->node_ents >> 1)) { *action = 0; /* blk over 50%, don't try to join */ return(0); /* blk over 50%, don't try to join */ } @@ -900,14 +1146,14 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) * coalesce it with a sibling block. We choose (arbitrarily) * to merge with the forward block unless it is NULL. */ - if (count == 0) { + if (nodehdr.count == 0) { /* * Make altpath point to the block we want to keep and * path point to the block we want to drop (this one). */ forward = (info->forw != 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); - error = xfs_da_path_shift(state, &state->altpath, forward, + error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); if (error) return(error); @@ -926,35 +1172,34 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) * We prefer coalescing with the lower numbered sibling so as * to shrink a directory over time. */ + count = state->node_ents; + count -= state->node_ents >> 2; + count -= nodehdr.count; + /* start with smaller blk num */ - forward = (be32_to_cpu(info->forw) < be32_to_cpu(info->back)); + forward = nodehdr.forw < nodehdr.back; for (i = 0; i < 2; forward = !forward, i++) { if (forward) - blkno = be32_to_cpu(info->forw); + blkno = nodehdr.forw; else - blkno = be32_to_cpu(info->back); + blkno = nodehdr.back; if (blkno == 0) continue; - error = xfs_da_node_read(state->args->trans, state->args->dp, + error = xfs_da3_node_read(state->args->trans, state->args->dp, blkno, -1, &bp, state->args->whichfork); if (error) return(error); - ASSERT(bp != NULL); - node = (xfs_da_intnode_t *)info; - count = state->node_ents; - count -= state->node_ents >> 2; - count -= be16_to_cpu(node->hdr.count); node = bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - count -= be16_to_cpu(node->hdr.count); + xfs_da3_node_hdr_from_disk(&nodehdr, node); xfs_trans_brelse(state->args->trans, bp); - if (count >= 0) + + if (count - nodehdr.count >= 0) break; /* fits with at least 25% to spare */ } if (i >= 2) { *action = 0; - return(0); + return 0; } /* @@ -963,28 +1208,42 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) */ memcpy(&state->altpath, &state->path, sizeof(state->path)); if (blkno < blk->blkno) { - error = xfs_da_path_shift(state, &state->altpath, forward, + error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); - if (error) { - return(error); - } - if (retval) { - *action = 0; - return(0); - } } else { - error = xfs_da_path_shift(state, &state->path, forward, + error = xfs_da3_path_shift(state, &state->path, forward, 0, &retval); - if (error) { - return(error); - } - if (retval) { - *action = 0; - return(0); - } + } + if (error) + return error; + if (retval) { + *action = 0; + return 0; } *action = 1; - return(0); + return 0; +} + +/* + * Pick up the last hashvalue from an intermediate node. + */ +STATIC uint +xfs_da3_node_lasthash( + struct xfs_buf *bp, + int *count) +{ + struct xfs_da_intnode *node; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; + + node = bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr, node); + if (count) + *count = nodehdr.count; + if (!nodehdr.count) + return 0; + btree = xfs_da3_node_tree_p(node); + return be32_to_cpu(btree[nodehdr.count - 1].hashval); } /* @@ -992,13 +1251,16 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) * when we stop making changes, return. */ void -xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_state_path_t *path) +xfs_da3_fixhashpath( + struct xfs_da_state *state, + struct xfs_da_state_path *path) { - xfs_da_state_blk_t *blk; - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - xfs_dahash_t lasthash=0; - int level, count; + struct xfs_da_state_blk *blk; + struct xfs_da_intnode *node; + struct xfs_da_node_entry *btree; + xfs_dahash_t lasthash=0; + int level; + int count; trace_xfs_da_fixhashpath(state->args); @@ -1016,23 +1278,26 @@ xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_state_path_t *path) return; break; case XFS_DA_NODE_MAGIC: - lasthash = xfs_da_node_lasthash(blk->bp, &count); + lasthash = xfs_da3_node_lasthash(blk->bp, &count); if (count == 0) return; break; } for (blk--, level--; level >= 0; blk--, level--) { + struct xfs_da3_icnode_hdr nodehdr; + node = blk->bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - btree = &node->btree[ blk->index ]; + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree = xfs_da3_node_tree_p(node); if (be32_to_cpu(btree->hashval) == lasthash) break; blk->hashval = lasthash; - btree->hashval = cpu_to_be32(lasthash); + btree[blk->index].hashval = cpu_to_be32(lasthash); xfs_trans_log_buf(state->args->trans, blk->bp, - XFS_DA_LOGRANGE(node, btree, sizeof(*btree))); + XFS_DA_LOGRANGE(node, &btree[blk->index], + sizeof(*btree))); - lasthash = be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1].hashval); + lasthash = be32_to_cpu(btree[nodehdr.count - 1].hashval); } } @@ -1040,104 +1305,119 @@ xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_state_path_t *path) * Remove an entry from an intermediate node. */ STATIC void -xfs_da_node_remove(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk) +xfs_da3_node_remove( + struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk) { - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - int tmp; + struct xfs_da_intnode *node; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_node_entry *btree; + int index; + int tmp; trace_xfs_da_node_remove(state->args); node = drop_blk->bp->b_addr; - ASSERT(drop_blk->index < be16_to_cpu(node->hdr.count)); + xfs_da3_node_hdr_from_disk(&nodehdr, node); + ASSERT(drop_blk->index < nodehdr.count); ASSERT(drop_blk->index >= 0); /* * Copy over the offending entry, or just zero it out. */ - btree = &node->btree[drop_blk->index]; - if (drop_blk->index < (be16_to_cpu(node->hdr.count)-1)) { - tmp = be16_to_cpu(node->hdr.count) - drop_blk->index - 1; + index = drop_blk->index; + btree = xfs_da3_node_tree_p(node); + if (index < nodehdr.count - 1) { + tmp = nodehdr.count - index - 1; tmp *= (uint)sizeof(xfs_da_node_entry_t); - memmove(btree, btree + 1, tmp); + memmove(&btree[index], &btree[index + 1], tmp); xfs_trans_log_buf(state->args->trans, drop_blk->bp, - XFS_DA_LOGRANGE(node, btree, tmp)); - btree = &node->btree[be16_to_cpu(node->hdr.count)-1]; + XFS_DA_LOGRANGE(node, &btree[index], tmp)); + index = nodehdr.count - 1; } - memset((char *)btree, 0, sizeof(xfs_da_node_entry_t)); + memset(&btree[index], 0, sizeof(xfs_da_node_entry_t)); xfs_trans_log_buf(state->args->trans, drop_blk->bp, - XFS_DA_LOGRANGE(node, btree, sizeof(*btree))); - be16_add_cpu(&node->hdr.count, -1); + XFS_DA_LOGRANGE(node, &btree[index], sizeof(btree[index]))); + nodehdr.count -= 1; + xfs_da3_node_hdr_to_disk(node, &nodehdr); xfs_trans_log_buf(state->args->trans, drop_blk->bp, - XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); + XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); /* * Copy the last hash value from the block to propagate upwards. */ - btree--; - drop_blk->hashval = be32_to_cpu(btree->hashval); + drop_blk->hashval = be32_to_cpu(btree[index - 1].hashval); } /* - * Unbalance the btree elements between two intermediate nodes, + * Unbalance the elements between two intermediate nodes, * move all Btree elements from one node into another. */ STATIC void -xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, - xfs_da_state_blk_t *save_blk) +xfs_da3_node_unbalance( + struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk, + struct xfs_da_state_blk *save_blk) { - xfs_da_intnode_t *drop_node, *save_node; - xfs_da_node_entry_t *btree; - int tmp; - xfs_trans_t *tp; + struct xfs_da_intnode *drop_node; + struct xfs_da_intnode *save_node; + struct xfs_da_node_entry *dbtree; + struct xfs_da_node_entry *sbtree; + struct xfs_da3_icnode_hdr dhdr; + struct xfs_da3_icnode_hdr shdr; + struct xfs_trans *tp; + int sindex; + int tmp; trace_xfs_da_node_unbalance(state->args); drop_node = drop_blk->bp->b_addr; save_node = save_blk->bp->b_addr; - ASSERT(drop_node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - ASSERT(save_node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); + xfs_da3_node_hdr_from_disk(&dhdr, drop_node); + xfs_da3_node_hdr_from_disk(&shdr, save_node); + dbtree = xfs_da3_node_tree_p(drop_node); + sbtree = xfs_da3_node_tree_p(save_node); tp = state->args->trans; /* * If the dying block has lower hashvals, then move all the * elements in the remaining block up to make a hole. */ - if ((be32_to_cpu(drop_node->btree[0].hashval) < be32_to_cpu(save_node->btree[ 0 ].hashval)) || - (be32_to_cpu(drop_node->btree[be16_to_cpu(drop_node->hdr.count)-1].hashval) < - be32_to_cpu(save_node->btree[be16_to_cpu(save_node->hdr.count)-1].hashval))) - { - btree = &save_node->btree[be16_to_cpu(drop_node->hdr.count)]; - tmp = be16_to_cpu(save_node->hdr.count) * (uint)sizeof(xfs_da_node_entry_t); - memmove(btree, &save_node->btree[0], tmp); - btree = &save_node->btree[0]; + if ((be32_to_cpu(dbtree[0].hashval) < be32_to_cpu(sbtree[ 0 ].hashval)) || + (be32_to_cpu(dbtree[dhdr.count - 1].hashval) < + be32_to_cpu(sbtree[shdr.count - 1].hashval))) { + /* XXX: check this - is memmove dst correct? */ + tmp = shdr.count * (uint)sizeof(xfs_da_node_entry_t); + memmove(&sbtree[dhdr.count], &sbtree[0], tmp); + + sindex = 0; xfs_trans_log_buf(tp, save_blk->bp, - XFS_DA_LOGRANGE(save_node, btree, - (be16_to_cpu(save_node->hdr.count) + be16_to_cpu(drop_node->hdr.count)) * - sizeof(xfs_da_node_entry_t))); + XFS_DA_LOGRANGE(save_node, &sbtree[0], + (shdr.count + dhdr.count) * + sizeof(xfs_da_node_entry_t))); } else { - btree = &save_node->btree[be16_to_cpu(save_node->hdr.count)]; + sindex = shdr.count; xfs_trans_log_buf(tp, save_blk->bp, - XFS_DA_LOGRANGE(save_node, btree, - be16_to_cpu(drop_node->hdr.count) * - sizeof(xfs_da_node_entry_t))); + XFS_DA_LOGRANGE(save_node, &sbtree[sindex], + dhdr.count * sizeof(xfs_da_node_entry_t))); } /* * Move all the B-tree elements from drop_blk to save_blk. */ - tmp = be16_to_cpu(drop_node->hdr.count) * (uint)sizeof(xfs_da_node_entry_t); - memcpy(btree, &drop_node->btree[0], tmp); - be16_add_cpu(&save_node->hdr.count, be16_to_cpu(drop_node->hdr.count)); + tmp = dhdr.count * (uint)sizeof(xfs_da_node_entry_t); + memcpy(&sbtree[sindex], &dbtree[0], tmp); + shdr.count += dhdr.count; + xfs_da3_node_hdr_to_disk(save_node, &shdr); xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, &save_node->hdr, - sizeof(save_node->hdr))); + xfs_da3_node_hdr_size(save_node))); /* * Save the last hashval in the remaining block for upward propagation. */ - save_blk->hashval = be32_to_cpu(save_node->btree[be16_to_cpu(save_node->hdr.count)-1].hashval); + save_blk->hashval = be32_to_cpu(sbtree[shdr.count - 1].hashval); } /*======================================================================== @@ -1156,16 +1436,24 @@ xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, * pruned depth-first tree search. */ int /* error */ -xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) +xfs_da3_node_lookup_int( + struct xfs_da_state *state, + int *result) { - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *curr; - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - xfs_dablk_t blkno; - int probe, span, max, error, retval; - xfs_dahash_t hashval, btreehashval; - xfs_da_args_t *args; + struct xfs_da_state_blk *blk; + struct xfs_da_blkinfo *curr; + struct xfs_da_intnode *node; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_args *args; + xfs_dablk_t blkno; + xfs_dahash_t hashval; + xfs_dahash_t btreehashval; + int probe; + int span; + int max; + int error; + int retval; args = state->args; @@ -1181,7 +1469,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) * Read the next node down in the tree. */ blk->blkno = blkno; - error = xfs_da_node_read(args->trans, args->dp, blkno, + error = xfs_da3_node_read(args->trans, args->dp, blkno, -1, &blk->bp, args->whichfork); if (error) { blk->blkno = 0; @@ -1190,66 +1478,73 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) } curr = blk->bp->b_addr; blk->magic = be16_to_cpu(curr->magic); - ASSERT(blk->magic == XFS_DA_NODE_MAGIC || - blk->magic == XFS_DIR2_LEAFN_MAGIC || - blk->magic == XFS_ATTR_LEAF_MAGIC); + + if (blk->magic == XFS_ATTR_LEAF_MAGIC) { + blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL); + break; + } + + if (blk->magic == XFS_DIR2_LEAFN_MAGIC || + blk->magic == XFS_DIR3_LEAFN_MAGIC) { + blk->magic = XFS_DIR2_LEAFN_MAGIC; + blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, NULL); + break; + } + + blk->magic = XFS_DA_NODE_MAGIC; + /* * Search an intermediate node for a match. */ - if (blk->magic == XFS_DA_NODE_MAGIC) { - node = blk->bp->b_addr; - max = be16_to_cpu(node->hdr.count); - blk->hashval = be32_to_cpu(node->btree[max-1].hashval); + node = blk->bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree = xfs_da3_node_tree_p(node); - /* - * Binary search. (note: small blocks will skip loop) - */ - probe = span = max / 2; - hashval = args->hashval; - for (btree = &node->btree[probe]; span > 4; - btree = &node->btree[probe]) { - span /= 2; - btreehashval = be32_to_cpu(btree->hashval); - if (btreehashval < hashval) - probe += span; - else if (btreehashval > hashval) - probe -= span; - else - break; - } - ASSERT((probe >= 0) && (probe < max)); - ASSERT((span <= 4) || (be32_to_cpu(btree->hashval) == hashval)); + max = nodehdr.count; + blk->hashval = be32_to_cpu(btree[max - 1].hashval); - /* - * Since we may have duplicate hashval's, find the first - * matching hashval in the node. - */ - while ((probe > 0) && (be32_to_cpu(btree->hashval) >= hashval)) { - btree--; - probe--; - } - while ((probe < max) && (be32_to_cpu(btree->hashval) < hashval)) { - btree++; - probe++; - } + /* + * Binary search. (note: small blocks will skip loop) + */ + probe = span = max / 2; + hashval = args->hashval; + while (span > 4) { + span /= 2; + btreehashval = be32_to_cpu(btree[probe].hashval); + if (btreehashval < hashval) + probe += span; + else if (btreehashval > hashval) + probe -= span; + else + break; + } + ASSERT((probe >= 0) && (probe < max)); + ASSERT((span <= 4) || + (be32_to_cpu(btree[probe].hashval) == hashval)); - /* - * Pick the right block to descend on. - */ - if (probe == max) { - blk->index = max-1; - blkno = be32_to_cpu(node->btree[max-1].before); - } else { - blk->index = probe; - blkno = be32_to_cpu(btree->before); - } - } else if (blk->magic == XFS_ATTR_LEAF_MAGIC) { - blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL); - break; - } else if (blk->magic == XFS_DIR2_LEAFN_MAGIC) { - blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, NULL); - break; + /* + * Since we may have duplicate hashval's, find the first + * matching hashval in the node. + */ + while (probe > 0 && + be32_to_cpu(btree[probe].hashval) >= hashval) { + probe--; + } + while (probe < max && + be32_to_cpu(btree[probe].hashval) < hashval) { + probe++; + } + + /* + * Pick the right block to descend on. + */ + if (probe == max) { + blk->index = max - 1; + blkno = be32_to_cpu(btree[max - 1].before); + } else { + blk->index = probe; + blkno = be32_to_cpu(btree[probe].before); } } @@ -1273,7 +1568,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) } if (((retval == ENOENT) || (retval == ENOATTR)) && (blk->hashval == args->hashval)) { - error = xfs_da_path_shift(state, &state->path, 1, 1, + error = xfs_da3_path_shift(state, &state->path, 1, 1, &retval); if (error) return(error); @@ -1295,16 +1590,52 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) *========================================================================*/ /* + * Compare two intermediate nodes for "order". + */ +STATIC int +xfs_da3_node_order( + struct xfs_buf *node1_bp, + struct xfs_buf *node2_bp) +{ + struct xfs_da_intnode *node1; + struct xfs_da_intnode *node2; + struct xfs_da_node_entry *btree1; + struct xfs_da_node_entry *btree2; + struct xfs_da3_icnode_hdr node1hdr; + struct xfs_da3_icnode_hdr node2hdr; + + node1 = node1_bp->b_addr; + node2 = node2_bp->b_addr; + xfs_da3_node_hdr_from_disk(&node1hdr, node1); + xfs_da3_node_hdr_from_disk(&node2hdr, node2); + btree1 = xfs_da3_node_tree_p(node1); + btree2 = xfs_da3_node_tree_p(node2); + + if (node1hdr.count > 0 && node2hdr.count > 0 && + ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) || + (be32_to_cpu(btree2[node2hdr.count - 1].hashval) < + be32_to_cpu(btree1[node1hdr.count - 1].hashval)))) { + return 1; + } + return 0; +} + +/* * Link a new block into a doubly linked list of blocks (of whatever type). */ int /* error */ -xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, - xfs_da_state_blk_t *new_blk) +xfs_da3_blk_link( + struct xfs_da_state *state, + struct xfs_da_state_blk *old_blk, + struct xfs_da_state_blk *new_blk) { - xfs_da_blkinfo_t *old_info, *new_info, *tmp_info; - xfs_da_args_t *args; - int before=0, error; - struct xfs_buf *bp; + struct xfs_da_blkinfo *old_info; + struct xfs_da_blkinfo *new_info; + struct xfs_da_blkinfo *tmp_info; + struct xfs_da_args *args; + struct xfs_buf *bp; + int before = 0; + int error; /* * Set up environment. @@ -1316,9 +1647,6 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, ASSERT(old_blk->magic == XFS_DA_NODE_MAGIC || old_blk->magic == XFS_DIR2_LEAFN_MAGIC || old_blk->magic == XFS_ATTR_LEAF_MAGIC); - ASSERT(old_blk->magic == be16_to_cpu(old_info->magic)); - ASSERT(new_blk->magic == be16_to_cpu(new_info->magic)); - ASSERT(old_blk->magic == new_blk->magic); switch (old_blk->magic) { case XFS_ATTR_LEAF_MAGIC: @@ -1328,7 +1656,7 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, before = xfs_dir2_leafn_order(old_blk->bp, new_blk->bp); break; case XFS_DA_NODE_MAGIC: - before = xfs_da_node_order(old_blk->bp, new_blk->bp); + before = xfs_da3_node_order(old_blk->bp, new_blk->bp); break; } @@ -1343,14 +1671,14 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, new_info->forw = cpu_to_be32(old_blk->blkno); new_info->back = old_info->back; if (old_info->back) { - error = xfs_da_node_read(args->trans, args->dp, + error = xfs_da3_node_read(args->trans, args->dp, be32_to_cpu(old_info->back), -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp != NULL); tmp_info = bp->b_addr; - ASSERT(be16_to_cpu(tmp_info->magic) == be16_to_cpu(old_info->magic)); + ASSERT(tmp_info->magic == old_info->magic); ASSERT(be32_to_cpu(tmp_info->forw) == old_blk->blkno); tmp_info->forw = cpu_to_be32(new_blk->blkno); xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1); @@ -1364,7 +1692,7 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, new_info->forw = old_info->forw; new_info->back = cpu_to_be32(old_blk->blkno); if (old_info->forw) { - error = xfs_da_node_read(args->trans, args->dp, + error = xfs_da3_node_read(args->trans, args->dp, be32_to_cpu(old_info->forw), -1, &bp, args->whichfork); if (error) @@ -1385,59 +1713,20 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, } /* - * Compare two intermediate nodes for "order". - */ -STATIC int -xfs_da_node_order( - struct xfs_buf *node1_bp, - struct xfs_buf *node2_bp) -{ - xfs_da_intnode_t *node1, *node2; - - node1 = node1_bp->b_addr; - node2 = node2_bp->b_addr; - ASSERT(node1->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC) && - node2->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - if ((be16_to_cpu(node1->hdr.count) > 0) && (be16_to_cpu(node2->hdr.count) > 0) && - ((be32_to_cpu(node2->btree[0].hashval) < - be32_to_cpu(node1->btree[0].hashval)) || - (be32_to_cpu(node2->btree[be16_to_cpu(node2->hdr.count)-1].hashval) < - be32_to_cpu(node1->btree[be16_to_cpu(node1->hdr.count)-1].hashval)))) { - return(1); - } - return(0); -} - -/* - * Pick up the last hashvalue from an intermediate node. - */ -STATIC uint -xfs_da_node_lasthash( - struct xfs_buf *bp, - int *count) -{ - xfs_da_intnode_t *node; - - node = bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - if (count) - *count = be16_to_cpu(node->hdr.count); - if (!node->hdr.count) - return(0); - return be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1].hashval); -} - -/* * Unlink a block from a doubly linked list of blocks. */ STATIC int /* error */ -xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, - xfs_da_state_blk_t *save_blk) +xfs_da3_blk_unlink( + struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk, + struct xfs_da_state_blk *save_blk) { - xfs_da_blkinfo_t *drop_info, *save_info, *tmp_info; - xfs_da_args_t *args; - struct xfs_buf *bp; - int error; + struct xfs_da_blkinfo *drop_info; + struct xfs_da_blkinfo *save_info; + struct xfs_da_blkinfo *tmp_info; + struct xfs_da_args *args; + struct xfs_buf *bp; + int error; /* * Set up environment. @@ -1449,8 +1738,6 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, ASSERT(save_blk->magic == XFS_DA_NODE_MAGIC || save_blk->magic == XFS_DIR2_LEAFN_MAGIC || save_blk->magic == XFS_ATTR_LEAF_MAGIC); - ASSERT(save_blk->magic == be16_to_cpu(save_info->magic)); - ASSERT(drop_blk->magic == be16_to_cpu(drop_info->magic)); ASSERT(save_blk->magic == drop_blk->magic); ASSERT((be32_to_cpu(save_info->forw) == drop_blk->blkno) || (be32_to_cpu(save_info->back) == drop_blk->blkno)); @@ -1464,7 +1751,7 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, trace_xfs_da_unlink_back(args); save_info->back = drop_info->back; if (drop_info->back) { - error = xfs_da_node_read(args->trans, args->dp, + error = xfs_da3_node_read(args->trans, args->dp, be32_to_cpu(drop_info->back), -1, &bp, args->whichfork); if (error) @@ -1481,7 +1768,7 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, trace_xfs_da_unlink_forward(args); save_info->forw = drop_info->forw; if (drop_info->forw) { - error = xfs_da_node_read(args->trans, args->dp, + error = xfs_da3_node_read(args->trans, args->dp, be32_to_cpu(drop_info->forw), -1, &bp, args->whichfork); if (error) @@ -1509,15 +1796,22 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, * the new bottom and the root. */ int /* error */ -xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, - int forward, int release, int *result) +xfs_da3_path_shift( + struct xfs_da_state *state, + struct xfs_da_state_path *path, + int forward, + int release, + int *result) { - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *info; - xfs_da_intnode_t *node; - xfs_da_args_t *args; - xfs_dablk_t blkno=0; - int level, error; + struct xfs_da_state_blk *blk; + struct xfs_da_blkinfo *info; + struct xfs_da_intnode *node; + struct xfs_da_args *args; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; + xfs_dablk_t blkno = 0; + int level; + int error; trace_xfs_da_path_shift(state->args); @@ -1532,16 +1826,17 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, ASSERT((path->active > 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); level = (path->active-1) - 1; /* skip bottom layer in path */ for (blk = &path->blk[level]; level >= 0; blk--, level--) { - ASSERT(blk->bp != NULL); node = blk->bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - if (forward && (blk->index < be16_to_cpu(node->hdr.count)-1)) { + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree = xfs_da3_node_tree_p(node); + + if (forward && (blk->index < nodehdr.count - 1)) { blk->index++; - blkno = be32_to_cpu(node->btree[blk->index].before); + blkno = be32_to_cpu(btree[blk->index].before); break; } else if (!forward && (blk->index > 0)) { blk->index--; - blkno = be32_to_cpu(node->btree[blk->index].before); + blkno = be32_to_cpu(btree[blk->index].before); break; } } @@ -1567,47 +1862,58 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, * Read the next child block. */ blk->blkno = blkno; - error = xfs_da_node_read(args->trans, args->dp, blkno, -1, + error = xfs_da3_node_read(args->trans, args->dp, blkno, -1, &blk->bp, args->whichfork); if (error) return(error); - ASSERT(blk->bp != NULL); info = blk->bp->b_addr; ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || + info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) || info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - blk->magic = be16_to_cpu(info->magic); - if (blk->magic == XFS_DA_NODE_MAGIC) { + + + /* + * Note: we flatten the magic number to a single type so we + * don't have to compare against crc/non-crc types elsewhere. + */ + switch (be16_to_cpu(info->magic)) { + case XFS_DA_NODE_MAGIC: + case XFS_DA3_NODE_MAGIC: + blk->magic = XFS_DA_NODE_MAGIC; node = (xfs_da_intnode_t *)info; - blk->hashval = be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1].hashval); + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree = xfs_da3_node_tree_p(node); + blk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval); if (forward) blk->index = 0; else - blk->index = be16_to_cpu(node->hdr.count)-1; - blkno = be32_to_cpu(node->btree[blk->index].before); - } else { + blk->index = nodehdr.count - 1; + blkno = be32_to_cpu(btree[blk->index].before); + break; + case XFS_ATTR_LEAF_MAGIC: + blk->magic = XFS_ATTR_LEAF_MAGIC; ASSERT(level == path->active-1); blk->index = 0; - switch(blk->magic) { - case XFS_ATTR_LEAF_MAGIC: - blk->hashval = xfs_attr_leaf_lasthash(blk->bp, - NULL); - break; - case XFS_DIR2_LEAFN_MAGIC: - case XFS_DIR3_LEAFN_MAGIC: - blk->magic = XFS_DIR2_LEAFN_MAGIC; - blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, - NULL); - break; - default: - ASSERT(0); - break; - } + blk->hashval = xfs_attr_leaf_lasthash(blk->bp, + NULL); + break; + case XFS_DIR2_LEAFN_MAGIC: + case XFS_DIR3_LEAFN_MAGIC: + blk->magic = XFS_DIR2_LEAFN_MAGIC; + ASSERT(level == path->active-1); + blk->index = 0; + blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, + NULL); + break; + default: + ASSERT(0); + break; } } *result = 0; - return(0); + return 0; } @@ -1794,22 +2100,36 @@ xfs_da_grow_inode( * a bmap btree split to do that. */ STATIC int -xfs_da_swap_lastblock( - xfs_da_args_t *args, - xfs_dablk_t *dead_blknop, - struct xfs_buf **dead_bufp) +xfs_da3_swap_lastblock( + struct xfs_da_args *args, + xfs_dablk_t *dead_blknop, + struct xfs_buf **dead_bufp) { - xfs_dablk_t dead_blkno, last_blkno, sib_blkno, par_blkno; - struct xfs_buf *dead_buf, *last_buf, *sib_buf, *par_buf; - xfs_fileoff_t lastoff; - xfs_inode_t *ip; - xfs_trans_t *tp; - xfs_mount_t *mp; - int error, w, entno, level, dead_level; - xfs_da_blkinfo_t *dead_info, *sib_info; - xfs_da_intnode_t *par_node, *dead_node; - xfs_dir2_leaf_t *dead_leaf2; - xfs_dahash_t dead_hash; + struct xfs_da_blkinfo *dead_info; + struct xfs_da_blkinfo *sib_info; + struct xfs_da_intnode *par_node; + struct xfs_da_intnode *dead_node; + struct xfs_dir2_leaf *dead_leaf2; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr par_hdr; + struct xfs_inode *ip; + struct xfs_trans *tp; + struct xfs_mount *mp; + struct xfs_buf *dead_buf; + struct xfs_buf *last_buf; + struct xfs_buf *sib_buf; + struct xfs_buf *par_buf; + xfs_dahash_t dead_hash; + xfs_fileoff_t lastoff; + xfs_dablk_t dead_blkno; + xfs_dablk_t last_blkno; + xfs_dablk_t sib_blkno; + xfs_dablk_t par_blkno; + int error; + int w; + int entno; + int level; + int dead_level; trace_xfs_da_swap_lastblock(args); @@ -1833,7 +2153,7 @@ xfs_da_swap_lastblock( * Read the last block in the btree space. */ last_blkno = (xfs_dablk_t)lastoff - mp->m_dirblkfsbs; - error = xfs_da_node_read(tp, ip, last_blkno, -1, &last_buf, w); + error = xfs_da3_node_read(tp, ip, last_blkno, -1, &last_buf, w); if (error) return error; /* @@ -1856,17 +2176,22 @@ xfs_da_swap_lastblock( dead_level = 0; dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval); } else { - ASSERT(dead_info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); + struct xfs_da3_icnode_hdr deadhdr; + + ASSERT(dead_info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || + dead_info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); dead_node = (xfs_da_intnode_t *)dead_info; - dead_level = be16_to_cpu(dead_node->hdr.level); - dead_hash = be32_to_cpu(dead_node->btree[be16_to_cpu(dead_node->hdr.count) - 1].hashval); + xfs_da3_node_hdr_from_disk(&deadhdr, dead_node); + btree = xfs_da3_node_tree_p(dead_node); + dead_level = deadhdr.level; + dead_hash = be32_to_cpu(btree[deadhdr.count - 1].hashval); } sib_buf = par_buf = NULL; /* * If the moved block has a left sibling, fix up the pointers. */ if ((sib_blkno = be32_to_cpu(dead_info->back))) { - error = xfs_da_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); + error = xfs_da3_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); if (error) goto done; sib_info = sib_buf->b_addr; @@ -1888,7 +2213,7 @@ xfs_da_swap_lastblock( * If the moved block has a right sibling, fix up the pointers. */ if ((sib_blkno = be32_to_cpu(dead_info->forw))) { - error = xfs_da_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); + error = xfs_da3_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); if (error) goto done; sib_info = sib_buf->b_addr; @@ -1912,31 +2237,31 @@ xfs_da_swap_lastblock( * Walk down the tree looking for the parent of the moved block. */ for (;;) { - error = xfs_da_node_read(tp, ip, par_blkno, -1, &par_buf, w); + error = xfs_da3_node_read(tp, ip, par_blkno, -1, &par_buf, w); if (error) goto done; par_node = par_buf->b_addr; - if (unlikely(par_node->hdr.info.magic != - cpu_to_be16(XFS_DA_NODE_MAGIC) || - (level >= 0 && level != be16_to_cpu(par_node->hdr.level) + 1))) { + xfs_da3_node_hdr_from_disk(&par_hdr, par_node); + if (level >= 0 && level != par_hdr.level + 1) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(4)", XFS_ERRLEVEL_LOW, mp); error = XFS_ERROR(EFSCORRUPTED); goto done; } - level = be16_to_cpu(par_node->hdr.level); + level = par_hdr.level; + btree = xfs_da3_node_tree_p(par_node); for (entno = 0; - entno < be16_to_cpu(par_node->hdr.count) && - be32_to_cpu(par_node->btree[entno].hashval) < dead_hash; + entno < par_hdr.count && + be32_to_cpu(btree[entno].hashval) < dead_hash; entno++) continue; - if (unlikely(entno == be16_to_cpu(par_node->hdr.count))) { + if (entno == par_hdr.count) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(5)", XFS_ERRLEVEL_LOW, mp); error = XFS_ERROR(EFSCORRUPTED); goto done; } - par_blkno = be32_to_cpu(par_node->btree[entno].before); + par_blkno = be32_to_cpu(btree[entno].before); if (level == dead_level + 1) break; xfs_trans_brelse(tp, par_buf); @@ -1948,13 +2273,13 @@ xfs_da_swap_lastblock( */ for (;;) { for (; - entno < be16_to_cpu(par_node->hdr.count) && - be32_to_cpu(par_node->btree[entno].before) != last_blkno; + entno < par_hdr.count && + be32_to_cpu(btree[entno].before) != last_blkno; entno++) continue; - if (entno < be16_to_cpu(par_node->hdr.count)) + if (entno < par_hdr.count) break; - par_blkno = be32_to_cpu(par_node->hdr.info.forw); + par_blkno = par_hdr.forw; xfs_trans_brelse(tp, par_buf); par_buf = NULL; if (unlikely(par_blkno == 0)) { @@ -1963,27 +2288,27 @@ xfs_da_swap_lastblock( error = XFS_ERROR(EFSCORRUPTED); goto done; } - error = xfs_da_node_read(tp, ip, par_blkno, -1, &par_buf, w); + error = xfs_da3_node_read(tp, ip, par_blkno, -1, &par_buf, w); if (error) goto done; par_node = par_buf->b_addr; - if (unlikely( - be16_to_cpu(par_node->hdr.level) != level || - par_node->hdr.info.magic != cpu_to_be16(XFS_DA_NODE_MAGIC))) { + xfs_da3_node_hdr_from_disk(&par_hdr, par_node); + if (par_hdr.level != level) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(7)", XFS_ERRLEVEL_LOW, mp); error = XFS_ERROR(EFSCORRUPTED); goto done; } + btree = xfs_da3_node_tree_p(par_node); entno = 0; } /* * Update the parent entry pointing to the moved block. */ - par_node->btree[entno].before = cpu_to_be32(dead_blkno); + btree[entno].before = cpu_to_be32(dead_blkno); xfs_trans_log_buf(tp, par_buf, - XFS_DA_LOGRANGE(par_node, &par_node->btree[entno].before, - sizeof(par_node->btree[entno].before))); + XFS_DA_LOGRANGE(par_node, &btree[entno].before, + sizeof(btree[entno].before))); *dead_blknop = last_blkno; *dead_bufp = last_buf; return 0; @@ -2025,14 +2350,15 @@ xfs_da_shrink_inode( * Remove extents. If we get ENOSPC for a dir we have to move * the last block to the place we want to kill. */ - if ((error = xfs_bunmapi(tp, dp, dead_blkno, count, - xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, - 0, args->firstblock, args->flist, - &done)) == ENOSPC) { + error = xfs_bunmapi(tp, dp, dead_blkno, count, + xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, + 0, args->firstblock, args->flist, &done); + if (error == ENOSPC) { if (w != XFS_DATA_FORK) break; - if ((error = xfs_da_swap_lastblock(args, &dead_blkno, - &dead_buf))) + error = xfs_da3_swap_lastblock(args, &dead_blkno, + &dead_buf); + if (error) break; } else { break; @@ -2297,6 +2623,7 @@ xfs_da_read_buf( magic1 = be32_to_cpu(hdr->magic); if (unlikely( XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && + (magic != XFS_DA3_NODE_MAGIC) && (magic != XFS_ATTR_LEAF_MAGIC) && (magic != XFS_DIR2_LEAF1_MAGIC) && (magic != XFS_DIR3_LEAF1_MAGIC) && @@ -2367,41 +2694,3 @@ out_free: return -1; return mappedbno; } - -kmem_zone_t *xfs_da_state_zone; /* anchor for state struct zone */ - -/* - * Allocate a dir-state structure. - * We don't put them on the stack since they're large. - */ -xfs_da_state_t * -xfs_da_state_alloc(void) -{ - return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS); -} - -/* - * Kill the altpath contents of a da-state structure. - */ -STATIC void -xfs_da_state_kill_altpath(xfs_da_state_t *state) -{ - int i; - - for (i = 0; i < state->altpath.active; i++) - state->altpath.blk[i].bp = NULL; - state->altpath.active = 0; -} - -/* - * Free a da-state structure. - */ -void -xfs_da_state_free(xfs_da_state_t *state) -{ - xfs_da_state_kill_altpath(state); -#ifdef DEBUG - memset((char *)state, 0, sizeof(*state)); -#endif /* DEBUG */ - kmem_zone_free(xfs_da_state_zone, state); -} diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 0854b95..6bedb3c 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2000,2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -20,7 +21,6 @@ struct xfs_bmap_free; struct xfs_inode; -struct xfs_mount; struct xfs_trans; struct zone; @@ -50,8 +50,11 @@ typedef struct xfs_da_blkinfo { * CRC enabled directory structure types * * The headers change size for the additional verification information, but - * otherwise the tree layouts and contents are unchanged. + * otherwise the tree layouts and contents are unchanged. Hence the da btree + * code can use the struct xfs_da_blkinfo for manipulating the tree links and + * magic numbers without modification for both v2 and v3 nodes. */ +#define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */ #define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */ #define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ @@ -80,19 +83,76 @@ struct xfs_da3_blkinfo { */ #define XFS_DA_NODE_MAXDEPTH 5 /* max depth of Btree */ +typedef struct xfs_da_node_hdr { + struct xfs_da_blkinfo info; /* block type, links, etc. */ + __be16 count; /* count of active entries */ + __be16 __level; /* level above leaves (leaf == 0) */ +} xfs_da_node_hdr_t; + +struct xfs_da3_node_hdr { + struct xfs_da3_blkinfo info; /* block type, links, etc. */ + __be16 count; /* count of active entries */ + __be16 __level; /* level above leaves (leaf == 0) */ + __be32 __pad32; +}; + +#define XFS_DA3_NODE_CRC_OFF (offsetof(struct xfs_da3_node_hdr, info.crc)) + +typedef struct xfs_da_node_entry { + __be32 hashval; /* hash value for this descendant */ + __be32 before; /* Btree block before this key */ +} xfs_da_node_entry_t; + typedef struct xfs_da_intnode { - struct xfs_da_node_hdr { /* constant-structure header block */ - xfs_da_blkinfo_t info; /* block type, links, etc. */ - __be16 count; /* count of active entries */ - __be16 level; /* level above leaves (leaf == 0) */ - } hdr; - struct xfs_da_node_entry { - __be32 hashval; /* hash value for this descendant */ - __be32 before; /* Btree block before this key */ - } btree[1]; /* variable sized array of keys */ + struct xfs_da_node_hdr hdr; + struct xfs_da_node_entry __btree[]; } xfs_da_intnode_t; -typedef struct xfs_da_node_hdr xfs_da_node_hdr_t; -typedef struct xfs_da_node_entry xfs_da_node_entry_t; + +struct xfs_da3_intnode { + struct xfs_da3_node_hdr hdr; + struct xfs_da_node_entry __btree[]; +}; + +/* + * In-core version of the node header to abstract the differences in the v2 and + * v3 disk format of the headers. Callers need to convert to/from disk format as + * appropriate. + */ +struct xfs_da3_icnode_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t level; +}; + +extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); +extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); + +static inline int +xfs_da3_node_hdr_size(struct xfs_da_intnode *dap) +{ + if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) + return sizeof(struct xfs_da3_node_hdr); + return sizeof(struct xfs_da_node_hdr); +} + +static inline struct xfs_da_node_entry * +xfs_da3_node_tree_p(struct xfs_da_intnode *dap) +{ + if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { + struct xfs_da3_intnode *dap3 = (struct xfs_da3_intnode *)dap; + return dap3->__btree; + } + return dap->__btree; +} + +extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); +extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); #define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize @@ -214,29 +274,29 @@ struct xfs_nameops { /* * Routines used for growing the Btree. */ -int xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, - struct xfs_buf **bpp, int whichfork); -int xfs_da_split(xfs_da_state_t *state); +int xfs_da3_node_create(struct xfs_da_args *args, xfs_dablk_t blkno, + int level, struct xfs_buf **bpp, int whichfork); +int xfs_da3_split(xfs_da_state_t *state); /* * Routines used for shrinking the Btree. */ -int xfs_da_join(xfs_da_state_t *state); -void xfs_da_fixhashpath(xfs_da_state_t *state, - xfs_da_state_path_t *path_to_to_fix); +int xfs_da3_join(xfs_da_state_t *state); +void xfs_da3_fixhashpath(struct xfs_da_state *state, + struct xfs_da_state_path *path_to_to_fix); /* * Routines used for finding things in the Btree. */ -int xfs_da_node_lookup_int(xfs_da_state_t *state, int *result); -int xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, +int xfs_da3_node_lookup_int(xfs_da_state_t *state, int *result); +int xfs_da3_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, int forward, int release, int *result); /* * Utility routines. */ -int xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, +int xfs_da3_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, xfs_da_state_blk_t *new_blk); -int xfs_da_node_read(struct xfs_trans *tp, struct xfs_inode *dp, +int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp, int which_fork); diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index e9421cb..876991f 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1367,7 +1367,7 @@ xfs_dir2_leafn_split( * block into the leaves. */ xfs_dir2_leafn_rebalance(state, oldblk, newblk); - error = xfs_da_blk_link(state, oldblk, newblk); + error = xfs_da3_blk_link(state, oldblk, newblk); if (error) { return error; } @@ -1449,7 +1449,7 @@ xfs_dir2_leafn_toosmall( */ forward = (leafhdr.forw != 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); - error = xfs_da_path_shift(state, &state->altpath, forward, 0, + error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &rval); if (error) return error; @@ -1511,10 +1511,10 @@ xfs_dir2_leafn_toosmall( */ memcpy(&state->altpath, &state->path, sizeof(state->path)); if (blkno < blk->blkno) - error = xfs_da_path_shift(state, &state->altpath, forward, 0, + error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &rval); else - error = xfs_da_path_shift(state, &state->path, forward, 0, + error = xfs_da3_path_shift(state, &state->path, forward, 0, &rval); if (error) { return error; @@ -1610,7 +1610,7 @@ xfs_dir2_node_addname( * Look up the name. We're not supposed to find it, but * this gives us the insertion point. */ - error = xfs_da_node_lookup_int(state, &rval); + error = xfs_da3_node_lookup_int(state, &rval); if (error) rval = error; if (rval != ENOENT) { @@ -1636,7 +1636,7 @@ xfs_dir2_node_addname( * It worked, fix the hash values up the btree. */ if (!(args->op_flags & XFS_DA_OP_JUSTCHECK)) - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); } else { /* * It didn't work, we need to split the leaf block. @@ -1648,7 +1648,7 @@ xfs_dir2_node_addname( /* * Split the leaf block and insert the new entry. */ - rval = xfs_da_split(state); + rval = xfs_da3_split(state); } done: xfs_da_state_free(state); @@ -2026,7 +2026,7 @@ xfs_dir2_node_addname_int( /* * Lookup an entry in a node-format directory. - * All the real work happens in xfs_da_node_lookup_int. + * All the real work happens in xfs_da3_node_lookup_int. * The only real output is the inode number of the entry. */ int /* error */ @@ -2051,7 +2051,7 @@ xfs_dir2_node_lookup( /* * Fill in the path to the entry in the cursor. */ - error = xfs_da_node_lookup_int(state, &rval); + error = xfs_da3_node_lookup_int(state, &rval); if (error) rval = error; else if (rval == ENOENT && args->cmpresult == XFS_CMP_CASE) { @@ -2106,7 +2106,7 @@ xfs_dir2_node_removename( /* * Look up the entry we're deleting, set up the cursor. */ - error = xfs_da_node_lookup_int(state, &rval); + error = xfs_da3_node_lookup_int(state, &rval); if (error) rval = error; /* @@ -2130,12 +2130,12 @@ xfs_dir2_node_removename( /* * Fix the hash values up the btree. */ - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); /* * If we need to join leaf blocks, do it. */ if (rval && state->path.active > 1) - error = xfs_da_join(state); + error = xfs_da3_join(state); /* * If no errors so far, try conversion to leaf format. */ @@ -2177,7 +2177,7 @@ xfs_dir2_node_replace( /* * Lookup the entry to change in the btree. */ - error = xfs_da_node_lookup_int(state, &rval); + error = xfs_da3_node_lookup_int(state, &rval); if (error) { rval = error; } diff --git a/fs/xfs/xfs_trace.c b/fs/xfs/xfs_trace.c index 624bedd..b6e3897 100644 --- a/fs/xfs/xfs_trace.c +++ b/fs/xfs/xfs_trace.c @@ -22,7 +22,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" @@ -30,6 +29,7 @@ #include "xfs_inode.h" #include "xfs_btree.h" #include "xfs_mount.h" +#include "xfs_da_btree.h" #include "xfs_ialloc.h" #include "xfs_itable.h" #include "xfs_alloc.h" -- 1.7.10.4 From zhaohongjiang37@gmail.com Wed Apr 3 01:09:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 45C627FCA for ; Wed, 3 Apr 2013 01:09:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 30ECE304081 for ; Tue, 2 Apr 2013 23:09:39 -0700 (PDT) X-ASG-Debug-ID: 1364969377-04cb6c1e7919b020001-NocioJ Received: from mail-pa0-f44.google.com (mail-pa0-f44.google.com [209.85.220.44]) by cuda.sgi.com with ESMTP id 4nSPTF2dBLqFDgbh (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 02 Apr 2013 23:09:37 -0700 (PDT) X-Barracuda-Envelope-From: zhaohongjiang37@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.44 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.44] Received: by mail-pa0-f44.google.com with SMTP id bi5so719957pad.3 for ; Tue, 02 Apr 2013 23:09:37 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.44] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.44] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:content-type:content-transfer-encoding; bh=5CmWAkSkKyisQwmXj+SGMupTHnsq6on/Onx5EkGEShY=; b=wofzNLGcOgqJCWiW4N4KVJOIRG8Ox9L6f5Q5qSLJqwDuFrjL8AL4oNCuBRUaPcsR9u 7p9CMfsyR9ITBIVmD/Hztw7WXvPQxCxun15If4OEM/kGTCUMXe0FBKa60sX1p5U7ZzCQ o3irHg7dCfryT6rAXbMBEROD6PIlEeAr5JzD8bwFC4m5LK0izeVaJvOt26hbgTHM90Cu 3A/Y1sqCp4/owH+du81R3areXtPkCyHSLVifO7LPpVazATEpdeisOI997Y9m9QpfrJ+r 4JyDiikJqGC3dpE4o4bm/3BykxkFrDSLZa1h04Wl3bQdPRWUZYoJ1lq6AgeNYQijuudn bRnw== X-Received: by 10.68.143.197 with SMTP id sg5mr597626pbb.101.1364969377256; Tue, 02 Apr 2013 23:09:37 -0700 (PDT) Received: from [192.168.204.180] ([218.17.215.175]) by mx.google.com with ESMTPS id tm1sm4675359pbc.11.2013.04.02.23.09.16 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 02 Apr 2013 23:09:36 -0700 (PDT) Message-ID: <515BC786.3070102@gmail.com> Date: Wed, 03 Apr 2013 14:09:10 +0800 From: Zhao Hongjiang User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: david@fromorbit.com CC: xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH] xfstests: Check concurrently of readdir and read on the same directory fd Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfstests: Check concurrently of readdir and read on the same directory fd Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pa0-f44.google.com[209.85.220.44] X-Barracuda-Start-Time: 1364969377 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Zhao Hongjiang Check if there are two threads,one keeps calling read() or lseek(), and the other calling readdir(), both on the same directory fd. Based on a testcase from Li Zefan . http://marc.info/?l=linux-kernel&m=136123703211869&w=2 Signed-off-by: Zhao Hongjiang --- src/Makefile | 2 +- src/t_readdir_1.c | 46 +++++++++++++++++++++++++++++ src/t_readdir_2.c | 57 ++++++++++++++++++++++++++++++++++++ tests/generic/308 | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/308.out | 2 + tests/generic/group | 1 + 6 files changed, 183 insertions(+), 1 deletions(-) create mode 100644 src/t_readdir_1.c create mode 100644 src/t_readdir_2.c create mode 100755 tests/generic/308 create mode 100644 tests/generic/308.out diff --git a/src/Makefile b/src/Makefile index f7362a2..8d8e97f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -18,7 +18,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ stale_handle pwrite_mmap_blocked t_dir_offset2 seek_sanity_test \ - seek_copy_test + seek_copy_test t_readdir_1 t_readdir_2 SUBDIRS = diff --git a/src/t_readdir_1.c b/src/t_readdir_1.c new file mode 100644 index 0000000..2d46b29 --- /dev/null +++ b/src/t_readdir_1.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + int fd; + int ret; + DIR *dir; + struct dirent *ptr; + + dir = opendir(argv[1]); + + fd = dirfd(dir); + if (fd < 0) { + perror("Failed to get dirfd!"); + exit(EXIT_FAILURE); + } + ret = fork(); + + if (ret == 0) { + char buf[100]; + + while(1) + read(fd, buf, 100); + + } else { + while (1) { + int ret2 = lseek(fd, 0, SEEK_SET); + if (ret2 == -1) { + perror("Seek failed!"); + exit(EXIT_FAILURE); + } + while ((ptr = readdir(dir))) + ; + } + } + + closedir(dir); + exit(EXIT_SUCCESS); +} diff --git a/src/t_readdir_2.c b/src/t_readdir_2.c new file mode 100644 index 0000000..7ec3a50 --- /dev/null +++ b/src/t_readdir_2.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + int fd; + int ret; + DIR *dir; + struct dirent *ptr; + + dir = opendir(argv[1]); + + fd = dirfd(dir); + if (fd < 0) { + perror("Failed to get dirfd!"); + exit(EXIT_FAILURE); + } + ret = fork(); + + if (ret == 0) { + int ret1, i; + static int array[11] = {0, 1, 2, 3, 1023, 1024, 1025, 4095, + 4096, 4097, 0x7fffffff}; + + while(1) { + for(i = 0; i < 11; i++) { + ret1 = lseek(fd, array[i++], SEEK_SET); + if (ret1 == -1) { + perror("Seek failed!"); + exit(EXIT_FAILURE); + } + } + + off_t pos = lseek(fd, 0, SEEK_CUR); + lseek(fd, pos, SEEK_SET); + } + } else { + while (1) { + int ret2 = lseek(fd, 0, SEEK_SET); + if (ret2 == -1) { + perror("Seek failed!"); + exit(EXIT_FAILURE); + } + while ((ptr = readdir(dir))) + ; + } + } + + closedir(dir); + exit(EXIT_SUCCESS); +} diff --git a/tests/generic/308 b/tests/generic/308 new file mode 100755 index 0000000..38d4903 --- /dev/null +++ b/tests/generic/308 @@ -0,0 +1,76 @@ +#! /bin/bash +# FS QA Test No. 308 +# +#Check if there are two threads,one keeps calling read() or lseek(), and +#the other calling readdir(), both on the same directory fd. +# +# Based on a testcase from Li Zefan . +# +# http://marc.info/?l=linux-kernel&m=136123703211869&w=2 +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 HuaWei. 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 +#----------------------------------------------------------------------- +# +# creator +owner=zhaohongjiang@huawei.com + +seq=`basename $0` +echo "QA output created by $seq" + +status=1 # failure is the default! + +_cleanup() +{ + rm -rf $TEST_DIR/tmp +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +mkdir $TEST_DIR/tmp +for n in {1..4096}; do + touch $TEST_DIR/tmp/$n +done + +_test_read() +{ + src/t_readdir_1 $TEST_DIR/tmp & + sleep 100 + killall src/t_readdir_1 +} + +_test_lseek() +{ + src/t_readdir_2 $TEST_DIR/tmp & + sleep 100 + killall src/t_readdir_2 +} + +_test_read +_test_lseek + +# success, all done +echo "*** done" +rm -f $seq.full +status=0 +exit diff --git a/tests/generic/308.out b/tests/generic/308.out new file mode 100644 index 0000000..904ad4d --- /dev/null +++ b/tests/generic/308.out @@ -0,0 +1,2 @@ +QA output created by 308 +*** done diff --git a/tests/generic/group b/tests/generic/group index 450e942..a924086 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -109,3 +109,4 @@ 299 auto aio enospc rw stress 300 auto aio enospc preallocrw stress 306 auto quick rw +308 auto -- 1.7.1 From rrparsons@centurylink.net Wed Apr 3 01:38:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 26A9B7FD3 for ; Wed, 3 Apr 2013 01:38:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0B512304066 for ; Tue, 2 Apr 2013 23:38:03 -0700 (PDT) X-ASG-Debug-ID: 1364971082-04cb6c1e7819d560001-NocioJ Received: from mailrelay.embarq.synacor.com (mailrelay.embarq.synacor.com [208.47.184.3]) by cuda.sgi.com with ESMTP id GIw1uoq7fCZWS85x for ; Tue, 02 Apr 2013 23:38:03 -0700 (PDT) X-Barracuda-Envelope-From: rrparsons@centurylink.net X-Barracuda-Apparent-Source-IP: 208.47.184.3 X_CMAE_Category: 0,0 Undefined,Undefined X-CNFS-Analysis: v=2.0 cv=aanjbGUt c=1 sm=0 a=NLUQQuSinlwA:10 a=FKkrIqjQGGEA:10 a=YTHtZiAxaJsA:10 a=I_5RNyk1AAAA:8 a=K-v-2zaBAAAA:8 a=WOITpsj1bp9mm91DNfoA:9 a=QEXdDO2ut3YA:10 a=h9Pb0FXbX8gLhhg5tVAA:9 a=_W_S_7VecoQA:10 a=Hhc/OnKmOS1xKI2oHPQhqg==:117 X-CM-Score: 0 X-Scanned-by: Cloudmark Authority Engine Received: from [10.50.3.117] ([10.50.3.117:40705] helo=md43.embarq.synacor.com) by mailrelay.embarq.synacor.com (envelope-from ) (ecelerity 2.2.3.49 r(42060/42061)) with ESMTP id 88/60-30947-A4ECB515; Wed, 03 Apr 2013 02:38:02 -0400 Date: Wed, 3 Apr 2013 02:38:02 -0400 (EDT) From: "Mr. Zhang Yong " Message-ID: <1536247543.71465.1364971082090.JavaMail.root@md43.embarq.synacor.com> Subject: ;, MIME-Version: 1.0 X-ASG-Orig-Subj: ;, Content-Type: multipart/alternative; boundary="----=_Part_71464_1281145195.1364971082088" X-Originating-IP: [101.62.193.228] X-Mailer: Zimbra 6.0.5_GA_2328.RHEL5_64 (zclient/6.0.5_GA_2328.RHEL5_64) X-Barracuda-Connect: mailrelay.embarq.synacor.com[208.47.184.3] X-Barracuda-Start-Time: 1364971083 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127032 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; ------=_Part_71464_1281145195.1364971082088 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit -- -- ;,,hi I have a proposal for you.. ------=_Part_71464_1281145195.1364971082088 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit -- --
;,,hi I have a proposal for you.. ------=_Part_71464_1281145195.1364971082088-- From aysen@ucretsizseo.com Wed Apr 3 04:24:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 159B37FBD for ; Wed, 3 Apr 2013 04:24:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DFA79304064 for ; Wed, 3 Apr 2013 02:24:10 -0700 (PDT) X-ASG-Debug-ID: 1364981048-04cbb01fb91a53b0001-NocioJ Received: from fieldseo.com (mail.fieldseo.com [46.249.58.42]) by cuda.sgi.com with ESMTP id RQoB1BiygbJliryO for ; Wed, 03 Apr 2013 02:24:08 -0700 (PDT) X-Barracuda-Envelope-From: aysen@ucretsizseo.com X-Barracuda-Apparent-Source-IP: 46.249.58.42 Date: Wed, 3 Apr 2013 09:22:24 +0000 To: xfs@oss.sgi.com From: Aysen Celik Subject: =?UTF-8?Q?=C3=9Ccretsiz_Link_De=C4=9Fi=C5=9Fimi?= X-Priority: 3 X-ASG-Orig-Subj: =?UTF-8?Q?=C3=9Ccretsiz_Link_De=C4=9Fi=C5=9Fimi?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_d87fce7646129c50cb2a26c47229780e" X-Barracuda-Connect: mail.fieldseo.com[46.249.58.42] X-Barracuda-Start-Time: 1364981048 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.66 X-Barracuda-Spam-Status: No, SCORE=2.66 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_MID, URIBL_SC_SURBL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 HTML_MESSAGE BODY: HTML included in message 2.52 URIBL_SC_SURBL Contains an URL listed in the SC SURBL blocklist [URIs: turkishseo.net] Message-Id: <20130403092410.ABFD1106CF57@cuda.sgi.com> --b1_d87fce7646129c50cb2a26c47229780e Content-Type: text/plain; charset = "UTF-8" Content-Transfer-Encoding: 8bit Sevgili Webmaster, turkishseo.net sitesinin site yöneticisi olarak, sizi, bizimle karşılıklı link deÄŸiÅŸtirmeye davet ediyorum. Tüm hafta boyunca gerçek içeriÄŸe sahip, gerçek sitelerden, gerçek trafik oluÅŸturmak adına eÅŸsiz ve gerçek linkler toplamak için çalışacağız! Neden bizimle link deÄŸiÅŸimi yapmalısınız? A. Tamamen ücretsizdir. B. DiÄŸer SEO web sitelerine oranla Alexa Trafik Rank açısından son derece üstün puanlara sahibiz. C. Birçok baÅŸlık için Google’ın en üst sıralamalarına sahibiz. D. İçerik açısından son derece zenginiz ve bununla gurur duyuyoruz! Bu link deÄŸiÅŸimini mümkün olduÄŸunca içerikle baÄŸlantılı tutmak istiyorum. Bu yüzden link verebileceÄŸiniz çeÅŸitli iç sayfalar da bulunduruyorum. Unutmayın, iyi iliÅŸkiye sahip linkler gönderen siteler aynı ÅŸekilde yüksek kaliteli ve iliÅŸkili linkler alacaklardır. Lütfen siteniz olan oss.sgi.com için size ne ÅŸekilde link deÄŸiÅŸim teklifleri sunabileceÄŸimi söyleyin: Üç-yollu/Direkt DeÄŸiÅŸimler İçerik ile birlikte iliÅŸkili sitelerden linkler Yüksek PR ve/veya İçerik Backlinkleri Sizin sunacağınız herhangi baÅŸka bir teklif… Bu tamamen sizin ne sunabileceÄŸinize baÄŸlı olarak geliÅŸecektir. Biz ücretsiz, adil ve dürüst link deÄŸiÅŸimlerini tüm katılımcılarımıza sunuyoruz. Aysen Celik - turkishseo.net --b1_d87fce7646129c50cb2a26c47229780e Content-Type: text/html; charset = "UTF-8" Content-Transfer-Encoding: 8bit Sevgili Webmaster,

turkishseo.net sitesinin site yöneticisi olarak, sizi, bizimle karşılıklı link deÄŸiÅŸtirmeye davet ediyorum. Tüm hafta boyunca gerçek içeriÄŸe sahip, gerçek sitelerden, gerçek trafik oluÅŸturmak adına eÅŸsiz ve gerçek linkler toplamak için çalışacağız!

Neden bizimle link değişimi yapmalısınız?

A. Tamamen ücretsizdir.
B. DiÄŸer SEO web sitelerine oranla Alexa Trafik Rank açısından son derece üstün puanlara sahibiz.
C. Birçok baÅŸlık için Google’ın en üst sıralamalarına sahibiz.
D. İçerik açısından son derece zenginiz ve bununla gurur duyuyoruz!

Bu link deÄŸiÅŸimini mümkün olduÄŸunca içerikle baÄŸlantılı tutmak istiyorum. Bu yüzden link verebileceÄŸiniz çeÅŸitli iç sayfalar da bulunduruyorum. Unutmayın, iyi iliÅŸkiye sahip linkler gönderen siteler aynı ÅŸekilde yüksek kaliteli ve iliÅŸkili linkler alacaklardır.

Lütfen siteniz olan oss.sgi.com için size ne ÅŸekilde link deÄŸiÅŸim teklifleri sunabileceÄŸimi söyleyin:

Üç-yollu/Direkt DeÄŸiÅŸimler
İçerik ile birlikte iliÅŸkili sitelerden linkler
Yüksek PR ve/veya İçerik Backlinkleri
Sizin sunacağınız herhangi baÅŸka bir teklif…

Bu tamamen sizin ne sunabileceÄŸinize baÄŸlı olarak geliÅŸecektir. Biz ücretsiz, adil ve dürüst link deÄŸiÅŸimlerini tüm katılımcılarımıza sunuyoruz.

Aysen Celik - turkishseo.net --b1_d87fce7646129c50cb2a26c47229780e-- From axboe@kernel.dk Wed Apr 3 06:41:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 311717FB0 for ; Wed, 3 Apr 2013 06:41:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7EF94AC003 for ; Wed, 3 Apr 2013 04:41:50 -0700 (PDT) X-ASG-Debug-ID: 1364989308-04cb6c1e771b8100001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id iKZWB9cMHWbl2wf9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 03 Apr 2013 04:41:48 -0700 (PDT) X-Barracuda-Envelope-From: axboe@kernel.dk X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from kernel.dk ([54.225.238.116]) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1UNM4Y-0005hG-9j; Wed, 03 Apr 2013 11:41:46 +0000 Received: from localhost (87-104-106-3-dynamic-customer.profibernet.dk [87.104.106.3]) by kernel.dk (Postfix) with ESMTPA id 8B2C820C51; Wed, 3 Apr 2013 11:41:45 +0000 (UTC) Date: Wed, 3 Apr 2013 13:41:42 +0200 From: Jens Axboe To: CAI Qian Cc: Dave Chinner , xfs@oss.sgi.com, LKML , psusi@ubuntu.com Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Message-ID: <20130403114142.GP4667@kernel.dk> X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] References: <1462091996.435156.1364882416199.JavaMail.root@redhat.com> <247719576.438259.1364882929749.JavaMail.root@redhat.com> <20130402070537.GP6369@dastard> <20130402071937.GC3670@kernel.dk> <20130402073035.GD3670@kernel.dk> <14055702.547701.1364891947331.JavaMail.root@redhat.com> <20130402090047.GF3670@kernel.dk> <985125161.581860.1364895066584.JavaMail.root@redhat.com> <20130402094834.GA4667@kernel.dk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130402094834.GA4667@kernel.dk> X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1364989308 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127051 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 02 2013, Jens Axboe wrote: > On Tue, Apr 02 2013, CAI Qian wrote: > > > > > > ----- Original Message ----- > > > From: "Jens Axboe" > > > To: "CAI Qian" > > > Cc: "Dave Chinner" , xfs@oss.sgi.com, "LKML" > > > Sent: Tuesday, April 2, 2013 5:00:47 PM > > > Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] > > > > > > On Tue, Apr 02 2013, CAI Qian wrote: > > > > > > > > > > > > ----- Original Message ----- > > > > > From: "Jens Axboe" > > > > > To: "Dave Chinner" > > > > > Cc: "CAI Qian" , xfs@oss.sgi.com, "LKML" > > > > > > > > > > Sent: Tuesday, April 2, 2013 3:30:35 PM > > > > > Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 > > > > > running xfstests case #78] > > > > > > > > > > On Tue, Apr 02 2013, Jens Axboe wrote: > > > > > > On Tue, Apr 02 2013, Dave Chinner wrote: > > > > > > > [Added jens Axboe to CC] > > > > > > > > > > > > > > On Tue, Apr 02, 2013 at 02:08:49AM -0400, CAI Qian wrote: > > > > > > > > Saw on almost all the servers range from x64, ppc64 and s390x with > > > > > > > > kernel > > > > > > > > 3.9-rc5 and xfsprogs-3.1.10. Never caught this in 3.9-rc4, so looks > > > > > > > > like > > > > > > > > something new broke this. Log is here with sysrq debug info. > > > > > > > > http://people.redhat.com/qcai/stable/log > > > > > > > > > > > > CAI Qian, can you try and back the below out and test again? > > > > > > > > > > Nevermind, it's clearly that one. The below should improve the > > > > > situation, but it's not pretty. A better fix would be to allow > > > > > auto-deletion even if PART_NO_SCAN is set. > > > > Jens, when compiled the mainline (up to fefcdbe) with this patch, > > > > it error-ed out, > > > > > > Looks like I sent the wrong one, updated below. > > The patch works well. Thanks! > > Thanks for testing! I don't particularly like this stuff in loop, > though. It's quite nasty and depends on other behaviour. It would be > prettier if we just had rescan_partitions() do the right thing, and only > drop partitions and not rescan if NO_PART_SCAN is set. > > Ala the below, dropping the loop change and implementing that change in > the core code. Phillip, can you check whether this does the right thing > for your bug too? Phillip? I'm going to revert the loop change asap, so if you want this fixed for 3.10, it's about that time to test it out. -- Jens Axboe From kdhall@binghamton.edu Wed Apr 3 09:26:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 95C7E7FAB for ; Wed, 3 Apr 2013 09:26:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 581258F8049 for ; Wed, 3 Apr 2013 07:26:08 -0700 (PDT) X-ASG-Debug-ID: 1364999165-04bdf0542a1ba310001-NocioJ Received: from mail-ve0-f175.google.com (mail-ve0-f175.google.com [209.85.128.175]) by cuda.sgi.com with ESMTP id dbcFjULMN5eSYCU9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 03 Apr 2013 07:26:06 -0700 (PDT) X-Barracuda-Envelope-From: kdhall@binghamton.edu X-Barracuda-Apparent-Source-IP: 209.85.128.175 Received: by mail-ve0-f175.google.com with SMTP id pb11so1699958veb.6 for ; Wed, 03 Apr 2013 07:26:05 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding:x-gm-message-state; bh=Jb+JRdxFXVc8KCw+WE/siq/Fsobj+nnMg5psrtUAOmY=; b=gINbHjYyVi4BaXokf/dam8kMiuNBrl/rQSPzIYCr9zwf5LhV8tXWzTBnatZaTuACF0 QiNmnYmsSeLHqIl0ZxUme4RNWDyJAr9vS3GYlcupbxnreexNKJWKSUBzic+V/BlLcopu E03NjI3MbBSSvvuFQXnvpQsUmheZBIdmaWAThML9vBPx2O7AI3vvgjLDFvryXz47pyFI k3bF+bN9GG/UhosRIoZBdSFoVja/BXwQBezF1wbaWBju9YXFDRxfyycBj+12LQ/6KCPO 2pY/2LYHfCiHTfWYNYxhM2slfUes+btxs89OJ9q9j3279FphOKwExFAp/AWHDvhEERFg tfHg== X-Received: by 10.220.222.72 with SMTP id if8mr1341197vcb.61.1364999165252; Wed, 03 Apr 2013 07:26:05 -0700 (PDT) Received: from [128.226.118.196] (omega.cs.binghamton.edu. [128.226.118.196]) by mx.google.com with ESMTPS id e8sm6396569vdt.7.2013.04.03.07.25.56 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 03 Apr 2013 07:26:03 -0700 (PDT) Message-ID: <515C3BF3.60601@binghamton.edu> Date: Wed, 03 Apr 2013 10:25:55 -0400 From: Dave Hall User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20121215 Icedove/3.0.11 MIME-Version: 1.0 To: Dave Chinner CC: stan@hardwarefreak.com, "xfs@oss.sgi.com" Subject: Re: xfs_fsr, sunit, and swidth References: <5141C1FC.4060209@hardwarefreak.com> <5141C8C1.2080903@hardwarefreak.com> <5141E5CF.10101@binghamton.edu> <5142AE40.6040408@hardwarefreak.com> <20130315114538.GF6369@dastard> <5143F94C.1020708@hardwarefreak.com> <20130316072126.GG6369@dastard> <515082C3.2000006@binghamton.edu> <515361B5.8050603@hardwarefreak.com> <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> X-ASG-Orig-Subj: Re: xfs_fsr, sunit, and swidth In-Reply-To: <20130331012231.GJ6369@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Gm-Message-State: ALoCoQluTsTZ/rnLQYoUArMi+XoB4/Q72ZptwbTCNxS+irMTZpBPKcqbbLZ+xJF5Y4rDE/qN1NY4 X-Barracuda-Connect: mail-ve0-f175.google.com[209.85.128.175] X-Barracuda-Start-Time: 1364999166 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127064 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- So, assuming entropy has reached critical mass and that there is no easy fix for this physical file system, what would happen if I replicated this data to a new disk array? When I say 'replicate', I'm not talking about xfs_dump. I'm talking about running a series of cp -al/rsync operations (or maybe rsync with --link-dest) that will precisely reproduce the linked data on my current array. All of the inodes would be re-allocated. There wouldn't be any (or at least not many) deletes. I am hoping that if I do this the inode fragmentation will be significantly reduced on the target as compared to the source. Of course over time it may re-fragment, but with two arrays I can always wipe one and reload it. -Dave Dave Hall Binghamton University kdhall@binghamton.edu 607-760-2328 (Cell) 607-777-4641 (Office) On 03/30/2013 09:22 PM, Dave Chinner wrote: > On Fri, Mar 29, 2013 at 03:59:46PM -0400, Dave Hall wrote: > >> Dave, Stan, >> >> Here is the link for perf top -U: http://pastebin.com/JYLXYWki. >> The ag report is at http://pastebin.com/VzziSa4L. Interestingly, >> the backups ran fast a couple times this week. Once under 9 hours. >> Today it looks like it's running long again. >> > 12.38% [xfs] [k] xfs_btree_get_rec > 11.65% [xfs] [k] _xfs_buf_find > 11.29% [xfs] [k] xfs_btree_increment > 7.88% [xfs] [k] xfs_inobt_get_rec > 5.40% [kernel] [k] intel_idle > 4.13% [xfs] [k] xfs_btree_get_block > 4.09% [xfs] [k] xfs_dialloc > 3.21% [xfs] [k] xfs_btree_readahead > 2.00% [xfs] [k] xfs_btree_rec_offset > 1.50% [xfs] [k] xfs_btree_rec_addr > > Inode allocation searches, looking for an inode near to the parent > directory. > > Whatthis indicates is that you have lots of sparsely allocated inode > chunks on disk. i.e. each 64 indoe chunk has some free inodes in it, > and some used inodes. This is Likely due to random removal of inodes > as you delete old backups and link counts drop to zero. Because we > only index inodes on "allocated chunks", finding a chunk that has a > free inode can be like finding a needle in a haystack. There are > heuristics used to stop searches from consuming too much CPU, but it > still can be quite slow when you repeatedly hit those paths.... > > I don't have an answer that will magically speed things up for > you right now... > > Cheers, > > Dave. > From psusi@ubuntu.com Wed Apr 3 10:41:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 700E67FAB for ; Wed, 3 Apr 2013 10:41:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DB96AAC001 for ; Wed, 3 Apr 2013 08:41:25 -0700 (PDT) X-ASG-Debug-ID: 1365003680-04cbb01fba1cbd80001-NocioJ Received: from cdptpa-omtalb.mail.rr.com (cdptpa-omtalb.mail.rr.com [75.180.132.120]) by cuda.sgi.com with ESMTP id iGVZ85ljtGyGWlsY for ; Wed, 03 Apr 2013 08:41:20 -0700 (PDT) X-Barracuda-Envelope-From: psusi@ubuntu.com X-Barracuda-Apparent-Source-IP: 75.180.132.120 X-Authority-Analysis: v=2.0 cv=cYNQXw/M c=1 sm=0 a=/DbS/tiKggfTkRRHPZEB4g==:17 a=Qsx_du5GiBkA:10 a=z55uD49gxukA:10 a=COy8bEXE5_QA:10 a=S1A5HrydsesA:10 a=8nJEP1OIZ-IA:10 a=fxJcL_dCAAAA:8 a=p-BZX3ACu3QA:10 a=QfKxxUxMAAAA:8 a=Ifx0Yg7Le1XTJ8Na8y0A:9 a=wPNLvfGTeEIA:10 a=p2QX66BWMCoQJul2:21 a=EQP6CXc1MalLaWHl:21 a=/DbS/tiKggfTkRRHPZEB4g==:117 X-Cloudmark-Score: 0 X-Authenticated-User: X-Originating-IP: 67.78.168.186 Received: from [67.78.168.186] ([67.78.168.186:50544] helo=[10.1.1.236]) by cdptpa-oedge03.mail.rr.com (envelope-from ) (ecelerity 2.2.3.46 r()) with ESMTP id 16/EF-11869-E9D4C515; Wed, 03 Apr 2013 15:41:20 +0000 Message-ID: <515C4D9D.10103@ubuntu.com> Date: Wed, 03 Apr 2013 11:41:17 -0400 From: Phillip Susi User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20130307 Thunderbird/17.0.4 MIME-Version: 1.0 To: Jens Axboe CC: CAI Qian , Dave Chinner , xfs@oss.sgi.com, LKML Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] References: <1462091996.435156.1364882416199.JavaMail.root@redhat.com> <247719576.438259.1364882929749.JavaMail.root@redhat.com> <20130402070537.GP6369@dastard> <20130402071937.GC3670@kernel.dk> <20130402073035.GD3670@kernel.dk> <14055702.547701.1364891947331.JavaMail.root@redhat.com> <20130402090047.GF3670@kernel.dk> <985125161.581860.1364895066584.JavaMail.root@redhat.com> <20130402094834.GA4667@kernel.dk> <20130403114142.GP4667@kernel.dk> X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] In-Reply-To: <20130403114142.GP4667@kernel.dk> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cdptpa-omtalb.mail.rr.com[75.180.132.120] X-Barracuda-Start-Time: 1365003680 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127068 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 4/3/2013 7:41 AM, Jens Axboe wrote: >> Thanks for testing! I don't particularly like this stuff in >> loop, though. It's quite nasty and depends on other behaviour. It >> would be prettier if we just had rescan_partitions() do the right >> thing, and only drop partitions and not rescan if NO_PART_SCAN is >> set. >> >> Ala the below, dropping the loop change and implementing that >> change in the core code. Phillip, can you check whether this does >> the right thing for your bug too? > > Phillip? I'm going to revert the loop change asap, so if you want > this fixed for 3.10, it's about that time to test it out. I have not tested it yet, but I am pretty sure it won't work. It looks like the patch changes the BLKRRPART path to go ahead and remove existing partitions when GENHD_FL_NO_PARTSCAN is set. loop doesn't issue the BLKRRPART ioctl when !LO_FLAGS_PARTSCAN so this won't help. I think loop needs to set GENHD_FL_NO_PARTSCAN and then issue the ioctl regardless of the LO_FLAGS_PARTSCAN flag to get the partitions to be removed. I will try to test tonight. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.17 (MingW32) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBAgAGBQJRXE2dAAoJEJrBOlT6nu75PM0IAIxVmuHdxLPtdtUNPqkU2a1r QanHb6F43qSbd7l37XlwYgzUlybVlntf1yvKGzh29g3QM0603sFqV1o+mbXd5LI3 b+I5QrQJh90Vou9oVSAxz1Ps/AlZvxVIDv8bRwNhpXcMmaj0EN5R+6pU5L7KU2BU GFsvajssedFh3XnNskgkR3XlqevI7U7A8VqLRsswl7FJVu7R1s45xP/sQgBWgiUS P5viykwhje4OTKmu0D7bFKrOVx6O3gK7IHzdOwwT9aWRxuxL+Y9yfBF9nx/xZXkc I2G09w852KgYDVYUHgW3IfuRo4F+4Y7Mw0Klu4XX5OmEXhselIqhwwTmEKMvEns= =OLri -----END PGP SIGNATURE----- From halim.md1950@gmail.com Wed Apr 3 10:52:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.6 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HK_SCAM_S7,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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E970E7FB2 for ; Wed, 3 Apr 2013 10:52:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D1A378F8054 for ; Wed, 3 Apr 2013 08:52:29 -0700 (PDT) X-ASG-Debug-ID: 1365004347-04cbb01fba1cd560001-NocioJ Received: from relay.th.com (relay.th.com [203.107.129.16]) by cuda.sgi.com with ESMTP id 6w0nRXsXi68eMTcv for ; Wed, 03 Apr 2013 08:52:28 -0700 (PDT) X-Barracuda-Envelope-From: halim.md1950@gmail.com X-Barracuda-Apparent-Source-IP: 203.107.129.16 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqQRAKlPXFHLa56i/2dsb2JhbABDgnMBE4NaqxCQXoI7FnSCEgEFAwEtOVICBSECEQ8FJBaFXAEBBYImAQoBEZ9XhluGLoFJT4dFChmBDQEOAYhygSOQKjJhA4U0g0SEbIkGAY9vgRyDGA Received: from mail.flowco.co.th ([203.107.158.162]) by relay.th.com with ESMTP; 03 Apr 2013 22:52:26 +0700 Received: from localhost (localhost [127.0.0.1]) by mail.flowco.co.th (Postfix) with ESMTP id 7C2CB423BB; Wed, 3 Apr 2013 22:52:41 +0700 (ICT) X-Virus-Scanned: amavisd-new at flowco.co.th Received: from mail.flowco.co.th ([127.0.0.1]) by localhost (mail.flowco.co.th [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id i7r28aJlBVYN; Wed, 3 Apr 2013 22:52:41 +0700 (ICT) Received: from PC-201303151923.Belkin (unknown [218.88.71.105]) by mail.flowco.co.th (Postfix) with ESMTPSA id 4107746B10; Wed, 3 Apr 2013 22:52:34 +0700 (ICT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Subject: Reply if you are interested To: Recipients X-ASG-Orig-Subj: Reply if you are interested From: "Mr.Muhammad Halim Khaddam" Date: Wed, 03 Apr 2013 23:52:16 +0800 Reply-To: halim.oil@syvip.com Message-Id: <20130403155235.4107746B10@mail.flowco.co.th> X-Barracuda-Connect: relay.th.com[203.107.129.16] X-Barracuda-Start-Time: 1365004348 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127070 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address Business proposal worth 13,700,000 USD I am a syrian citizen, want to = relocate out of Syria with my family. From rjohnston@sgi.com Wed Apr 3 12:40:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LOTS_OF_MONEY,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 7EADD7F5D for ; Wed, 3 Apr 2013 12:40:47 -0500 (CDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by relay3.corp.sgi.com (Postfix) with ESMTP id AC806AC001; Wed, 3 Apr 2013 10:40:43 -0700 (PDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id 74C5CAA89602; Wed, 3 Apr 2013 12:40:43 -0500 (CDT) Message-Id: <20130403173245.376605011@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Wed, 03 Apr 2013 12:31:49 -0500 From: rjohnston@sgi.com To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org Subject: [PATCH] cleanup duplicates in all tests Content-Disposition: inline; filename=xfstests-cleanup-duplicates-in-tests.patch There are duplicate blank lines, comment hash and lines containing duplicate seqres= declarations, remove them. Signed-off-by: Rich Johnston --- tests/btrfs/254 | 3 --- tests/btrfs/264 | 4 ---- tests/btrfs/265 | 3 --- tests/btrfs/276 | 3 --- tests/btrfs/284 | 3 --- tests/btrfs/307 | 3 --- tests/ext4/271 | 2 -- tests/ext4/301 | 2 -- tests/ext4/302 | 2 -- tests/ext4/303 | 2 -- tests/ext4/304 | 2 -- tests/generic/001 | 2 -- tests/generic/002 | 2 -- tests/generic/005 | 2 -- tests/generic/006 | 2 -- tests/generic/007 | 2 -- tests/generic/010 | 2 -- tests/generic/011 | 2 -- tests/generic/013 | 3 --- tests/generic/014 | 2 -- tests/generic/015 | 2 -- tests/generic/020 | 4 ---- tests/generic/053 | 2 -- tests/generic/062 | 4 ---- tests/generic/068 | 4 ---- tests/generic/069 | 2 -- tests/generic/070 | 2 -- tests/generic/074 | 3 --- tests/generic/075 | 3 --- tests/generic/076 | 2 -- tests/generic/077 | 2 -- tests/generic/079 | 2 -- tests/generic/083 | 5 ----- tests/generic/088 | 2 -- tests/generic/089 | 4 ---- tests/generic/091 | 2 -- tests/generic/093 | 2 -- tests/generic/097 | 2 -- tests/generic/099 | 4 ---- tests/generic/100 | 3 --- tests/generic/105 | 2 -- tests/generic/112 | 3 --- tests/generic/113 | 3 --- tests/generic/117 | 2 -- tests/generic/120 | 3 --- tests/generic/123 | 3 --- tests/generic/124 | 2 -- tests/generic/125 | 2 -- tests/generic/126 | 2 -- tests/generic/127 | 3 --- tests/generic/128 | 2 -- tests/generic/129 | 2 -- tests/generic/130 | 2 -- tests/generic/131 | 2 -- tests/generic/132 | 3 --- tests/generic/133 | 2 -- tests/generic/135 | 4 ---- tests/generic/141 | 2 -- tests/generic/169 | 2 -- tests/generic/184 | 2 -- tests/generic/192 | 2 -- tests/generic/193 | 6 ------ tests/generic/198 | 2 -- tests/generic/204 | 2 -- tests/generic/207 | 2 -- tests/generic/208 | 2 -- tests/generic/209 | 2 -- tests/generic/210 | 2 -- tests/generic/211 | 2 -- tests/generic/212 | 2 -- tests/generic/213 | 2 -- tests/generic/214 | 3 --- tests/generic/215 | 2 -- tests/generic/219 | 2 -- tests/generic/221 | 2 -- tests/generic/223 | 2 -- tests/generic/224 | 2 -- tests/generic/225 | 3 --- tests/generic/226 | 2 -- tests/generic/228 | 2 -- tests/generic/230 | 2 -- tests/generic/231 | 2 -- tests/generic/232 | 2 -- tests/generic/233 | 2 -- tests/generic/234 | 2 -- tests/generic/235 | 2 -- tests/generic/236 | 2 -- tests/generic/237 | 2 -- tests/generic/239 | 2 -- tests/generic/240 | 2 -- tests/generic/241 | 2 -- tests/generic/245 | 3 --- tests/generic/246 | 2 -- tests/generic/247 | 2 -- tests/generic/248 | 2 -- tests/generic/249 | 2 -- tests/generic/251 | 3 --- tests/generic/255 | 2 -- tests/generic/256 | 3 --- tests/generic/257 | 2 -- tests/generic/258 | 2 -- tests/generic/260 | 3 --- tests/generic/263 | 2 -- tests/generic/269 | 2 -- tests/generic/270 | 2 -- tests/generic/273 | 2 -- tests/generic/274 | 2 -- tests/generic/275 | 2 -- tests/generic/277 | 2 -- tests/generic/280 | 2 -- tests/generic/285 | 2 -- tests/generic/286 | 2 -- tests/generic/288 | 3 --- tests/generic/294 | 2 -- tests/generic/299 | 2 -- tests/generic/300 | 2 -- tests/shared/051 | 6 ------ tests/shared/218 | 2 -- tests/shared/243 | 2 -- tests/shared/272 | 2 -- tests/shared/289 | 2 -- tests/shared/298 | 2 -- tests/shared/305 | 2 -- tests/udf/098 | 2 -- tests/udf/101 | 2 -- tests/udf/102 | 2 -- tests/xfs/003 | 2 -- tests/xfs/004 | 3 --- tests/xfs/008 | 2 -- tests/xfs/009 | 3 --- tests/xfs/012 | 2 -- tests/xfs/016 | 2 -- tests/xfs/017 | 2 -- tests/xfs/018 | 3 --- tests/xfs/019 | 2 -- tests/xfs/021 | 2 -- tests/xfs/022 | 2 -- tests/xfs/023 | 2 -- tests/xfs/024 | 2 -- tests/xfs/025 | 2 -- tests/xfs/026 | 2 -- tests/xfs/027 | 2 -- tests/xfs/028 | 3 --- tests/xfs/029 | 2 -- tests/xfs/030 | 3 --- tests/xfs/031 | 2 -- tests/xfs/033 | 2 -- tests/xfs/034 | 2 -- tests/xfs/035 | 2 -- tests/xfs/036 | 2 -- tests/xfs/037 | 2 -- tests/xfs/038 | 2 -- tests/xfs/039 | 2 -- tests/xfs/040 | 2 -- tests/xfs/041 | 2 -- tests/xfs/042 | 2 -- tests/xfs/043 | 2 -- tests/xfs/044 | 3 --- tests/xfs/045 | 3 --- tests/xfs/046 | 2 -- tests/xfs/047 | 5 ----- tests/xfs/048 | 2 -- tests/xfs/049 | 2 -- tests/xfs/050 | 5 ----- tests/xfs/052 | 2 -- tests/xfs/054 | 2 -- tests/xfs/055 | 2 -- tests/xfs/056 | 2 -- tests/xfs/057 | 10 ---------- tests/xfs/058 | 2 -- tests/xfs/059 | 2 -- tests/xfs/060 | 2 -- tests/xfs/061 | 2 -- tests/xfs/063 | 2 -- tests/xfs/064 | 3 --- tests/xfs/065 | 3 --- tests/xfs/066 | 2 -- tests/xfs/067 | 2 -- tests/xfs/071 | 3 --- tests/xfs/072 | 2 -- tests/xfs/073 | 3 --- tests/xfs/078 | 3 --- tests/xfs/080 | 2 -- tests/xfs/081 | 3 --- tests/xfs/082 | 2 -- tests/xfs/084 | 2 -- tests/xfs/085 | 2 -- tests/xfs/086 | 2 -- tests/xfs/087 | 2 -- tests/xfs/090 | 3 --- tests/xfs/092 | 2 -- tests/xfs/094 | 2 -- tests/xfs/095 | 2 -- tests/xfs/096 | 4 ---- tests/xfs/103 | 3 --- tests/xfs/104 | 2 -- tests/xfs/106 | 3 --- tests/xfs/107 | 3 --- tests/xfs/108 | 2 -- tests/xfs/109 | 2 -- tests/xfs/110 | 2 -- tests/xfs/111 | 2 -- tests/xfs/114 | 7 ------- tests/xfs/115 | 5 ----- tests/xfs/116 | 3 --- tests/xfs/118 | 3 --- tests/xfs/119 | 2 -- tests/xfs/121 | 2 -- tests/xfs/122 | 2 -- tests/xfs/134 | 3 --- tests/xfs/136 | 3 --- tests/xfs/137 | 2 -- tests/xfs/138 | 2 -- tests/xfs/139 | 2 -- tests/xfs/140 | 2 -- tests/xfs/142 | 2 -- tests/xfs/143 | 2 -- tests/xfs/144 | 2 -- tests/xfs/145 | 2 -- tests/xfs/146 | 2 -- tests/xfs/147 | 2 -- tests/xfs/148 | 3 --- tests/xfs/149 | 2 -- tests/xfs/150 | 2 -- tests/xfs/151 | 2 -- tests/xfs/152 | 2 -- tests/xfs/153 | 2 -- tests/xfs/154 | 2 -- tests/xfs/155 | 2 -- tests/xfs/156 | 2 -- tests/xfs/157 | 2 -- tests/xfs/158 | 2 -- tests/xfs/159 | 2 -- tests/xfs/160 | 2 -- tests/xfs/161 | 2 -- tests/xfs/162 | 2 -- tests/xfs/163 | 3 --- tests/xfs/164 | 4 ---- tests/xfs/165 | 4 ---- tests/xfs/166 | 2 -- tests/xfs/167 | 2 -- tests/xfs/168 | 2 -- tests/xfs/170 | 2 -- tests/xfs/171 | 2 -- tests/xfs/172 | 2 -- tests/xfs/173 | 2 -- tests/xfs/174 | 2 -- tests/xfs/175 | 2 -- tests/xfs/176 | 3 --- tests/xfs/177 | 3 --- tests/xfs/178 | 2 -- tests/xfs/179 | 2 -- tests/xfs/180 | 2 -- tests/xfs/181 | 2 -- tests/xfs/182 | 2 -- tests/xfs/183 | 2 -- tests/xfs/185 | 3 --- tests/xfs/186 | 3 --- tests/xfs/187 | 3 --- tests/xfs/188 | 2 -- tests/xfs/189 | 3 --- tests/xfs/190 | 2 -- tests/xfs/191 | 2 -- tests/xfs/194 | 2 -- tests/xfs/195 | 2 -- tests/xfs/196 | 2 -- tests/xfs/197 | 2 -- tests/xfs/199 | 2 -- tests/xfs/200 | 3 --- tests/xfs/201 | 5 ----- tests/xfs/202 | 2 -- tests/xfs/203 | 2 -- tests/xfs/205 | 2 -- tests/xfs/206 | 2 -- tests/xfs/216 | 2 -- tests/xfs/217 | 2 -- tests/xfs/220 | 3 --- tests/xfs/222 | 2 -- tests/xfs/227 | 2 -- tests/xfs/229 | 2 -- tests/xfs/238 | 2 -- tests/xfs/242 | 3 --- tests/xfs/244 | 2 -- tests/xfs/250 | 2 -- tests/xfs/252 | 2 -- tests/xfs/253 | 2 -- tests/xfs/259 | 2 -- tests/xfs/261 | 2 -- tests/xfs/262 | 3 --- tests/xfs/266 | 2 -- tests/xfs/267 | 2 -- tests/xfs/268 | 2 -- tests/xfs/278 | 3 --- tests/xfs/279 | 2 -- tests/xfs/281 | 2 -- tests/xfs/282 | 2 -- tests/xfs/283 | 2 -- tests/xfs/287 | 2 -- tests/xfs/290 | 2 -- tests/xfs/291 | 2 -- tests/xfs/292 | 2 -- tests/xfs/293 | 2 -- tests/xfs/295 | 2 -- tests/xfs/296 | 2 -- tests/xfs/297 | 2 -- 305 files changed, 722 deletions(-) Index: b/tests/btrfs/254 =================================================================== --- a/tests/btrfs/254 +++ b/tests/btrfs/254 @@ -24,9 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/btrfs/264 =================================================================== --- a/tests/btrfs/264 +++ b/tests/btrfs/264 @@ -24,9 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -123,7 +120,6 @@ _fill_blk() wait $! } - # Append a random size to the files # arg1 : FS in question _append_file() Index: b/tests/btrfs/265 =================================================================== --- a/tests/btrfs/265 +++ b/tests/btrfs/265 @@ -23,9 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/btrfs/276 =================================================================== --- a/tests/btrfs/276 +++ b/tests/btrfs/276 @@ -27,9 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/btrfs/284 =================================================================== --- a/tests/btrfs/284 +++ b/tests/btrfs/284 @@ -23,9 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here="`pwd`" tmp=/tmp/$$ Index: b/tests/btrfs/307 =================================================================== --- a/tests/btrfs/307 +++ b/tests/btrfs/307 @@ -24,9 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "== QA output created by $seq" here=`pwd` Index: b/tests/ext4/271 =================================================================== --- a/tests/ext4/271 +++ b/tests/ext4/271 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/ext4/301 =================================================================== --- a/tests/ext4/301 +++ b/tests/ext4/301 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/ext4/302 =================================================================== --- a/tests/ext4/302 +++ b/tests/ext4/302 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/ext4/303 =================================================================== --- a/tests/ext4/303 +++ b/tests/ext4/303 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/ext4/304 =================================================================== --- a/tests/ext4/304 +++ b/tests/ext4/304 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/001 =================================================================== --- a/tests/generic/001 +++ b/tests/generic/001 @@ -33,8 +33,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" # get standard environment, filters and checks Index: b/tests/generic/002 =================================================================== --- a/tests/generic/002 +++ b/tests/generic/002 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" # get standard environment, filters and checks Index: b/tests/generic/005 =================================================================== --- a/tests/generic/005 +++ b/tests/generic/005 @@ -34,8 +34,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/006 =================================================================== --- a/tests/generic/006 +++ b/tests/generic/006 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/007 =================================================================== --- a/tests/generic/007 +++ b/tests/generic/007 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/010 =================================================================== --- a/tests/generic/010 +++ b/tests/generic/010 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/011 =================================================================== --- a/tests/generic/011 +++ b/tests/generic/011 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" out="" Index: b/tests/generic/013 =================================================================== --- a/tests/generic/013 +++ b/tests/generic/013 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -91,7 +89,6 @@ _do_test() _check_test_fs } - # real QA test starts here _supported_fs generic _supported_os IRIX Linux Index: b/tests/generic/014 =================================================================== --- a/tests/generic/014 +++ b/tests/generic/014 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/015 =================================================================== --- a/tests/generic/015 +++ b/tests/generic/015 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/020 =================================================================== --- a/tests/generic/020 +++ b/tests/generic/020 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -79,7 +77,6 @@ _attr_list() fi } - # real QA test starts here _supported_fs generic _supported_os Linux @@ -167,7 +164,6 @@ OCTAL_SIZE=`echo "obase=8; $MAX_ATTRVAL_ _attr -q -g "long_attr" $testfile | od -t x1 | sed -e "s/^0*$OCTAL_SIZE$/ATTRSIZE/" _attr -r "long_attr" $testfile >/dev/null - echo "*** set/get/remove really long names (expect failure)" short="XXXXXXXXXX" long="$short$short$short$short$short$short$short$short$short$short" Index: b/tests/generic/053 =================================================================== --- a/tests/generic/053 +++ b/tests/generic/053 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/062 =================================================================== --- a/tests/generic/062 +++ b/tests/generic/062 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -142,7 +140,6 @@ for nsp in $ATTR_MODES; do done done - # # Test the directory descent code # @@ -174,7 +171,6 @@ echo echo "*** directory descent without following symlinks" getfattr -h -P -R -m '.' -e hex $SCRATCH_MNT | _sort_getfattr_output - # # Test the backup/restore code # Index: b/tests/generic/068 =================================================================== --- a/tests/generic/068 +++ b/tests/generic/068 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -46,7 +44,6 @@ _cleanup() trap "_cleanup" 0 1 2 3 15 - # get standard environment, filters and checks . ./common/rc . ./common/filter @@ -71,7 +68,6 @@ _scratch_mount touch $tmp.running - # start fsstress loop in a background block { STRESS_DIR="$SCRATCH_MNT/fsstress_test_dir" Index: b/tests/generic/069 =================================================================== --- a/tests/generic/069 +++ b/tests/generic/069 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/070 =================================================================== --- a/tests/generic/070 +++ b/tests/generic/070 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/074 =================================================================== --- a/tests/generic/074 +++ b/tests/generic/074 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -108,7 +106,6 @@ _process_args() done } - # real QA test starts here rm -f $seqres.full Index: b/tests/generic/075 =================================================================== --- a/tests/generic/075 +++ b/tests/generic/075 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -123,7 +121,6 @@ _process_args() done } - # real QA test starts here _supported_fs generic _supported_os IRIX Linux Index: b/tests/generic/076 =================================================================== --- a/tests/generic/076 +++ b/tests/generic/076 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/077 =================================================================== --- a/tests/generic/077 +++ b/tests/generic/077 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/079 =================================================================== --- a/tests/generic/079 +++ b/tests/generic/079 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/083 =================================================================== --- a/tests/generic/083 +++ b/tests/generic/083 @@ -31,11 +29,8 @@ #----------------------------------------------------------------------- # - seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/088 =================================================================== --- a/tests/generic/088 +++ b/tests/generic/088 @@ -26,8 +26,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/089 =================================================================== --- a/tests/generic/089 +++ b/tests/generic/089 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" mtab_output=$TEST_DIR/mtab_output Index: b/tests/generic/091 =================================================================== --- a/tests/generic/091 +++ b/tests/generic/091 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/093 =================================================================== --- a/tests/generic/093 +++ b/tests/generic/093 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq here=`pwd` tmp=/tmp/$$ Index: b/tests/generic/097 =================================================================== --- a/tests/generic/097 +++ b/tests/generic/097 @@ -30,8 +30,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/099 =================================================================== --- a/tests/generic/099 +++ b/tests/generic/099 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -236,7 +234,6 @@ chacl o::---,g::---,u:$acl2:rwx,u::---,m echo "Expect to PASS as should match on user" $runas -u $acl2 -g $acl2 ./file1 2>&1 - #------------------------------------------------------- echo "" @@ -272,7 +269,6 @@ _acl_list file3 cd .. umask 022 - #------------------------------------------------------- echo "" Index: b/tests/generic/100 =================================================================== --- a/tests/generic/100 +++ b/tests/generic/100 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -78,7 +76,6 @@ cd $testdir tar -xRvf $TEMP_DIR/$TAR_FILE >>$seqres.full 2>&1 cd $here - # use diff -qr to compare ls -R -l ${testdir}${POPULATED_DIR} >>$seqres.full 2>&1 diff -qr $POPULATED_DIR ${testdir}${POPULATED_DIR} Index: b/tests/generic/105 =================================================================== --- a/tests/generic/105 +++ b/tests/generic/105 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/112 =================================================================== --- a/tests/generic/112 +++ b/tests/generic/112 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -121,7 +119,6 @@ _process_args() done } - # real QA test starts here _supported_fs generic _supported_os Linux Index: b/tests/generic/113 =================================================================== --- a/tests/generic/113 +++ b/tests/generic/113 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -76,7 +74,6 @@ _do_test() rm -f $_files } - # real QA test starts here _supported_fs generic _supported_os Linux Index: b/tests/generic/117 =================================================================== --- a/tests/generic/117 +++ b/tests/generic/117 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/120 =================================================================== --- a/tests/generic/120 +++ b/tests/generic/120 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -94,7 +92,6 @@ echo "*** writing to file ***" echo "asdf" >> $SCRATCH_MNT/testfile2 _compare_access_times $SCRATCH_MNT/testfile2 "writing file" - umount $SCRATCH_MNT # success, all done Index: b/tests/generic/123 =================================================================== --- a/tests/generic/123 +++ b/tests/generic/123 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -77,5 +75,4 @@ _user_do "mv $my_test_subdir/data_cohere cat $my_test_subdir/data_coherency.txt - exit Index: b/tests/generic/124 =================================================================== --- a/tests/generic/124 +++ b/tests/generic/124 @@ -28,8 +28,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/125 =================================================================== --- a/tests/generic/125 +++ b/tests/generic/125 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/126 =================================================================== --- a/tests/generic/126 +++ b/tests/generic/126 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/127 =================================================================== --- a/tests/generic/127 +++ b/tests/generic/127 @@ -28,8 +28,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -121,7 +119,6 @@ FSX_ARGS="-f $FSX_ARGS" _fsx_std_nommap _fsx_std_mmap - status=0 _cleanup exit Index: b/tests/generic/128 =================================================================== --- a/tests/generic/128 +++ b/tests/generic/128 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/129 =================================================================== --- a/tests/generic/129 +++ b/tests/generic/129 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/130 =================================================================== --- a/tests/generic/130 +++ b/tests/generic/130 @@ -33,8 +33,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/131 =================================================================== --- a/tests/generic/131 +++ b/tests/generic/131 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/132 =================================================================== --- a/tests/generic/132 +++ b/tests/generic/132 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/133 =================================================================== --- a/tests/generic/133 +++ b/tests/generic/133 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/135 =================================================================== --- a/tests/generic/135 +++ b/tests/generic/135 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -61,8 +59,6 @@ _umount_mount() cd "$CWD" } - - _umount_mount cd $SCRATCH_MNT Index: b/tests/generic/141 =================================================================== --- a/tests/generic/141 +++ b/tests/generic/141 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/169 =================================================================== --- a/tests/generic/169 +++ b/tests/generic/169 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/184 =================================================================== --- a/tests/generic/184 +++ b/tests/generic/184 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq - silence is golden" here=`pwd` Index: b/tests/generic/192 =================================================================== --- a/tests/generic/192 +++ b/tests/generic/192 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/193 =================================================================== --- a/tests/generic/193 +++ b/tests/generic/193 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -70,13 +68,11 @@ _supported_os Linux _require_user _need_to_be_root - # # make sure we have a normal umask set # umask 022 - # # Test the ATTR_UID case # @@ -127,7 +123,6 @@ su ${qa_user} -c "chgrp ${qa_user} test. _cleanup_files - # # Test the ATTR_MODE case # @@ -230,7 +225,6 @@ echo -n "after: "; stat -c '%A' test.${ _cleanup_files - # # Test ATTR_*TIMES_SET # Index: b/tests/generic/198 =================================================================== --- a/tests/generic/198 +++ b/tests/generic/198 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/204 =================================================================== --- a/tests/generic/204 +++ b/tests/generic/204 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/207 =================================================================== --- a/tests/generic/207 +++ b/tests/generic/207 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/208 =================================================================== --- a/tests/generic/208 +++ b/tests/generic/208 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/209 =================================================================== --- a/tests/generic/209 +++ b/tests/generic/209 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/210 =================================================================== --- a/tests/generic/210 +++ b/tests/generic/210 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/211 =================================================================== --- a/tests/generic/211 +++ b/tests/generic/211 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/212 =================================================================== --- a/tests/generic/212 +++ b/tests/generic/212 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/213 =================================================================== --- a/tests/generic/213 +++ b/tests/generic/213 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" _cleanup() Index: b/tests/generic/214 =================================================================== --- a/tests/generic/214 +++ b/tests/generic/214 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" _cleanup() @@ -146,7 +144,6 @@ $XFS_IO_PROG -F -f \ -c "pwrite 1136718 104115" \ $TEST_DIR/test214-7 | _filter_xfs_io_unique - # success, all done status=0 exit Index: b/tests/generic/215 =================================================================== --- a/tests/generic/215 +++ b/tests/generic/215 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" _cleanup() Index: b/tests/generic/219 =================================================================== --- a/tests/generic/219 +++ b/tests/generic/219 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/221 =================================================================== --- a/tests/generic/221 +++ b/tests/generic/221 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/223 =================================================================== --- a/tests/generic/223 +++ b/tests/generic/223 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/224 =================================================================== --- a/tests/generic/224 +++ b/tests/generic/224 @@ -29,8 +29,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/225 =================================================================== --- a/tests/generic/225 +++ b/tests/generic/225 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -55,7 +53,6 @@ rm -f $seqres.full fiemapfile=$SCRATCH_MNT/$seq.fiemap fiemaplog=$SCRATCH_MNT/$seq.log - [ -x $here/src/fiemap-tester ] || _notrun "fiemap-tester not built" seed=`date +%s` Index: b/tests/generic/226 =================================================================== --- a/tests/generic/226 +++ b/tests/generic/226 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/228 =================================================================== --- a/tests/generic/228 +++ b/tests/generic/228 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" _cleanup() Index: b/tests/generic/230 =================================================================== --- a/tests/generic/230 +++ b/tests/generic/230 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/231 =================================================================== --- a/tests/generic/231 +++ b/tests/generic/231 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/232 =================================================================== --- a/tests/generic/232 +++ b/tests/generic/232 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/233 =================================================================== --- a/tests/generic/233 +++ b/tests/generic/233 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/234 =================================================================== --- a/tests/generic/234 +++ b/tests/generic/234 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/235 =================================================================== --- a/tests/generic/235 +++ b/tests/generic/235 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/236 =================================================================== --- a/tests/generic/236 +++ b/tests/generic/236 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" _cleanup() Index: b/tests/generic/237 =================================================================== --- a/tests/generic/237 +++ b/tests/generic/237 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/239 =================================================================== --- a/tests/generic/239 +++ b/tests/generic/239 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/240 =================================================================== --- a/tests/generic/240 +++ b/tests/generic/240 @@ -30,8 +30,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/241 =================================================================== --- a/tests/generic/241 +++ b/tests/generic/241 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/245 =================================================================== --- a/tests/generic/245 +++ b/tests/generic/245 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -59,7 +57,6 @@ _filter_directory_not_empty() trap "_cleanup ; exit \$status" 0 1 2 3 15 - mkdir $dir mkdir $dir/aa Index: b/tests/generic/246 =================================================================== --- a/tests/generic/246 +++ b/tests/generic/246 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/247 =================================================================== --- a/tests/generic/247 +++ b/tests/generic/247 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/248 =================================================================== --- a/tests/generic/248 +++ b/tests/generic/248 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/249 =================================================================== --- a/tests/generic/249 +++ b/tests/generic/249 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/251 =================================================================== --- a/tests/generic/251 +++ b/tests/generic/251 @@ -23,11 +23,8 @@ # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #----------------------------------------------------------------------- - seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/255 =================================================================== --- a/tests/generic/255 +++ b/tests/generic/255 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/256 =================================================================== --- a/tests/generic/256 +++ b/tests/generic/256 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -54,7 +52,6 @@ _require_user testfile=$TEST_DIR/256.$$ - # _fill_fs() # # Fills a file system by repeatedly creating files in the given folder Index: b/tests/generic/257 =================================================================== --- a/tests/generic/257 +++ b/tests/generic/257 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/258 =================================================================== --- a/tests/generic/258 +++ b/tests/generic/258 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/260 =================================================================== --- a/tests/generic/260 +++ b/tests/generic/260 @@ -21,11 +21,8 @@ # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #----------------------------------------------------------------------- - seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/263 =================================================================== --- a/tests/generic/263 +++ b/tests/generic/263 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/269 =================================================================== --- a/tests/generic/269 +++ b/tests/generic/269 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/270 =================================================================== --- a/tests/generic/270 +++ b/tests/generic/270 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/273 =================================================================== --- a/tests/generic/273 +++ b/tests/generic/273 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/274 =================================================================== --- a/tests/generic/274 +++ b/tests/generic/274 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/275 =================================================================== --- a/tests/generic/275 +++ b/tests/generic/275 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/277 =================================================================== --- a/tests/generic/277 +++ b/tests/generic/277 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" status=1 # failure is the default! Index: b/tests/generic/280 =================================================================== --- a/tests/generic/280 +++ b/tests/generic/280 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/285 =================================================================== --- a/tests/generic/285 +++ b/tests/generic/285 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/286 =================================================================== --- a/tests/generic/286 +++ b/tests/generic/286 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/288 =================================================================== --- a/tests/generic/288 +++ b/tests/generic/288 @@ -21,11 +21,8 @@ # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #----------------------------------------------------------------------- - seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" status=0 Index: b/tests/generic/294 =================================================================== --- a/tests/generic/294 +++ b/tests/generic/294 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/299 =================================================================== --- a/tests/generic/299 +++ b/tests/generic/299 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/generic/300 =================================================================== --- a/tests/generic/300 +++ b/tests/generic/300 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/shared/051 =================================================================== --- a/tests/shared/051 +++ b/tests/shared/051 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq here=`pwd` tmp=/tmp/$$ @@ -230,7 +228,6 @@ chacl o::---,g::---,u:$acl2:rwx,u::---,m echo "Expect to PASS as should match on user" $runas -u $acl2 -g $acl2 ./file1 2>&1 - #------------------------------------------------------- echo "" @@ -266,7 +263,6 @@ chacl -l file3 | _acl_filter_id cd .. umask 022 - #------------------------------------------------------- echo "" @@ -283,7 +279,6 @@ chacl -l file1 | _acl_filter_id chacl -l acldir | _acl_filter_id chacl -l acldir/file2 | _acl_filter_id - #------------------------------------------------------- echo "" @@ -307,7 +302,6 @@ echo "Change #2..." $runas -u 12345 -g 54321 -- `which chacl` -r u::---,g::---,o::--- root find root -print | xargs chacl -l - #------------------------------------------------------- echo "" Index: b/tests/shared/218 =================================================================== --- a/tests/shared/218 +++ b/tests/shared/218 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/shared/243 =================================================================== --- a/tests/shared/243 +++ b/tests/shared/243 @@ -43,8 +43,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/shared/272 =================================================================== --- a/tests/shared/272 +++ b/tests/shared/272 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/shared/289 =================================================================== --- a/tests/shared/289 +++ b/tests/shared/289 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/shared/298 =================================================================== --- a/tests/shared/298 +++ b/tests/shared/298 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" status=1 # failure is the default! Index: b/tests/shared/305 =================================================================== --- a/tests/shared/305 +++ b/tests/shared/305 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/udf/098 =================================================================== --- a/tests/udf/098 +++ b/tests/udf/098 @@ -31,8 +31,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/udf/101 =================================================================== --- a/tests/udf/101 +++ b/tests/udf/101 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/udf/102 =================================================================== --- a/tests/udf/102 +++ b/tests/udf/102 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/003 =================================================================== --- a/tests/xfs/003 +++ b/tests/xfs/003 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" # get standard environment, filters and checks Index: b/tests/xfs/004 =================================================================== --- a/tests/xfs/004 +++ b/tests/xfs/004 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -54,7 +52,6 @@ _populate_scratch() _scratch_mount # and then remount } - # get standard environment, filters and checks . ./common/rc . ./common/filter Index: b/tests/xfs/008 =================================================================== --- a/tests/xfs/008 +++ b/tests/xfs/008 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/009 =================================================================== --- a/tests/xfs/009 +++ b/tests/xfs/009 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -185,6 +183,5 @@ EOF _filesize $out - status=0 exit Index: b/tests/xfs/012 =================================================================== --- a/tests/xfs/012 +++ b/tests/xfs/012 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/016 =================================================================== --- a/tests/xfs/016 +++ b/tests/xfs/016 @@ -37,8 +37,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/017 =================================================================== --- a/tests/xfs/017 +++ b/tests/xfs/017 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/018 =================================================================== --- a/tests/xfs/018 +++ b/tests/xfs/018 @@ -25,8 +25,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -58,7 +56,6 @@ _require_v2log # link correct .out file _link_out_file $seq.op $seqfull.op - echo "*** init FS" umount $SCRATCH_DEV >/dev/null 2>&1 Index: b/tests/xfs/019 =================================================================== --- a/tests/xfs/019 +++ b/tests/xfs/019 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/021 =================================================================== --- a/tests/xfs/021 +++ b/tests/xfs/021 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/022 =================================================================== --- a/tests/xfs/022 +++ b/tests/xfs/022 @@ -28,8 +28,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/023 =================================================================== --- a/tests/xfs/023 +++ b/tests/xfs/023 @@ -26,8 +26,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/024 =================================================================== --- a/tests/xfs/024 +++ b/tests/xfs/024 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/025 =================================================================== --- a/tests/xfs/025 +++ b/tests/xfs/025 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/026 =================================================================== --- a/tests/xfs/026 +++ b/tests/xfs/026 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/027 =================================================================== --- a/tests/xfs/027 +++ b/tests/xfs/027 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/028 =================================================================== --- a/tests/xfs/028 +++ b/tests/xfs/028 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -73,6 +71,5 @@ _dump_inventory _do_invutil -F _dump_inventory - # success, all done exit Index: b/tests/xfs/029 =================================================================== --- a/tests/xfs/029 +++ b/tests/xfs/029 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/030 =================================================================== --- a/tests/xfs/030 +++ b/tests/xfs/030 @@ -25,8 +25,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -105,7 +103,6 @@ _scratch_mkfs_xfs $DSIZE | _filter_mkfs _check_ag 0 _check_ag -1 - # success, all done status=0 exit Index: b/tests/xfs/031 =================================================================== --- a/tests/xfs/031 +++ b/tests/xfs/031 @@ -25,8 +25,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/033 =================================================================== --- a/tests/xfs/033 +++ b/tests/xfs/033 @@ -25,8 +25,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/034 =================================================================== --- a/tests/xfs/034 +++ b/tests/xfs/034 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/035 =================================================================== --- a/tests/xfs/035 +++ b/tests/xfs/035 @@ -25,8 +25,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/036 =================================================================== --- a/tests/xfs/036 +++ b/tests/xfs/036 @@ -25,8 +25,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/037 =================================================================== --- a/tests/xfs/037 +++ b/tests/xfs/037 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/038 =================================================================== --- a/tests/xfs/038 +++ b/tests/xfs/038 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/039 =================================================================== --- a/tests/xfs/039 +++ b/tests/xfs/039 @@ -25,8 +25,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/040 =================================================================== --- a/tests/xfs/040 +++ b/tests/xfs/040 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/041 =================================================================== --- a/tests/xfs/041 +++ b/tests/xfs/041 @@ -26,8 +26,6 @@ set +x seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/042 =================================================================== --- a/tests/xfs/042 +++ b/tests/xfs/042 @@ -27,8 +27,6 @@ set +x seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/043 =================================================================== --- a/tests/xfs/043 +++ b/tests/xfs/043 @@ -27,8 +27,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/044 =================================================================== --- a/tests/xfs/044 +++ b/tests/xfs/044 @@ -28,8 +28,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -109,7 +107,6 @@ _unexpected() exit } - # real QA test starts here # _require_scratch Index: b/tests/xfs/045 =================================================================== --- a/tests/xfs/045 +++ b/tests/xfs/045 @@ -21,12 +21,9 @@ # #----------------------------------------------------------------------- # -# seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/046 =================================================================== --- a/tests/xfs/046 +++ b/tests/xfs/046 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/047 =================================================================== --- a/tests/xfs/047 +++ b/tests/xfs/047 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/048 =================================================================== --- a/tests/xfs/048 +++ b/tests/xfs/048 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/049 =================================================================== --- a/tests/xfs/049 +++ b/tests/xfs/049 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" _cleanup() Index: b/tests/xfs/050 =================================================================== --- a/tests/xfs/050 +++ b/tests/xfs/050 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -46,12 +44,10 @@ _cleanup() } trap "_cleanup; exit \$status" 0 1 2 3 15 - # real QA test starts here _supported_fs xfs _supported_os Linux IRIX - cp /dev/null $seqres.full chmod a+rwx $seqres.full # arbitrary users will write here @@ -63,7 +59,6 @@ bhard=500 isoft=4 ihard=10 - _filter_report() { tr -s '[:space:]' | \ Index: b/tests/xfs/052 =================================================================== --- a/tests/xfs/052 +++ b/tests/xfs/052 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/054 =================================================================== --- a/tests/xfs/054 +++ b/tests/xfs/054 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/055 =================================================================== --- a/tests/xfs/055 +++ b/tests/xfs/055 @@ -25,8 +25,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/056 =================================================================== --- a/tests/xfs/056 +++ b/tests/xfs/056 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/057 =================================================================== --- a/tests/xfs/057 +++ b/tests/xfs/057 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -47,11 +45,3 @@ _supported_os IRIX status=0 exit - - - - - - - - Index: b/tests/xfs/058 =================================================================== --- a/tests/xfs/058 +++ b/tests/xfs/058 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/059 =================================================================== --- a/tests/xfs/059 +++ b/tests/xfs/059 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/060 =================================================================== --- a/tests/xfs/060 +++ b/tests/xfs/060 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/061 =================================================================== --- a/tests/xfs/061 +++ b/tests/xfs/061 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/063 =================================================================== --- a/tests/xfs/063 +++ b/tests/xfs/063 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/064 =================================================================== --- a/tests/xfs/064 +++ b/tests/xfs/064 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -38,7 +36,6 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 . ./common/filter . ./common/dump - _ls_size_filter() { # Index: b/tests/xfs/065 =================================================================== --- a/tests/xfs/065 +++ b/tests/xfs/065 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -194,7 +192,6 @@ while [ $i -le $num_dumps ]; do let i=$i+1 done - # success, all done status=0 exit Index: b/tests/xfs/066 =================================================================== --- a/tests/xfs/066 +++ b/tests/xfs/066 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/067 =================================================================== --- a/tests/xfs/067 +++ b/tests/xfs/067 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/071 =================================================================== --- a/tests/xfs/071 +++ b/tests/xfs/071 @@ -24,8 +24,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" rm -f $seqres.full Index: b/tests/xfs/072 =================================================================== --- a/tests/xfs/072 +++ b/tests/xfs/072 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" _cleanup() Index: b/tests/xfs/073 =================================================================== --- a/tests/xfs/073 +++ b/tests/xfs/073 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -125,7 +123,6 @@ _verify_copy() rm -f $target } - # real QA test starts here _supported_fs xfs _supported_os Linux Index: b/tests/xfs/078 =================================================================== --- a/tests/xfs/078 +++ b/tests/xfs/078 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -122,7 +120,6 @@ _grow_loop 168024b 1376452608 2048 1 _grow_loop 168024b 1376452608 512 1 16m _grow_loop 168024b 688230400 1024 1 - # Other corner cases suggested by dgc # also the following doesn't check if the filesystem is consistent. # - grow 1TB by 1.5TB (control) Index: b/tests/xfs/080 =================================================================== --- a/tests/xfs/080 +++ b/tests/xfs/080 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/081 =================================================================== --- a/tests/xfs/081 +++ b/tests/xfs/081 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -61,7 +59,6 @@ _require_v2log echo "*** init FS" umount $SCRATCH_DEV >/dev/null 2>&1 - # do a simple quota test to ensure DQUOT data is happening export MOUNT_OPTIONS="-o quota,gquota" Index: b/tests/xfs/082 =================================================================== --- a/tests/xfs/082 +++ b/tests/xfs/082 @@ -25,8 +25,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/084 =================================================================== --- a/tests/xfs/084 +++ b/tests/xfs/084 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/085 =================================================================== --- a/tests/xfs/085 +++ b/tests/xfs/085 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/086 =================================================================== --- a/tests/xfs/086 +++ b/tests/xfs/086 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/087 =================================================================== --- a/tests/xfs/087 +++ b/tests/xfs/087 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/090 =================================================================== --- a/tests/xfs/090 +++ b/tests/xfs/090 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -114,7 +112,6 @@ realtime_mmap_unaligned() _check_scratch_fs } - _create_scratch realtime_direct_aligned 0 Index: b/tests/xfs/092 =================================================================== --- a/tests/xfs/092 +++ b/tests/xfs/092 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/094 =================================================================== --- a/tests/xfs/094 +++ b/tests/xfs/094 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/095 =================================================================== --- a/tests/xfs/095 +++ b/tests/xfs/095 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/096 =================================================================== --- a/tests/xfs/096 +++ b/tests/xfs/096 @@ -26,8 +26,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -130,7 +128,6 @@ cat >$tmp.seq.params <$seqres.full Index: b/tests/xfs/119 =================================================================== --- a/tests/xfs/119 +++ b/tests/xfs/119 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/121 =================================================================== --- a/tests/xfs/121 +++ b/tests/xfs/121 @@ -28,8 +28,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/122 =================================================================== --- a/tests/xfs/122 +++ b/tests/xfs/122 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/134 =================================================================== --- a/tests/xfs/134 +++ b/tests/xfs/134 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -88,7 +86,6 @@ fi src/feature -p $SCRATCH_DEV [ $? -ne 0 ] && _notrun "Installed kernel does not support project quotas" - mkdir $dir $XFS_IO_PROG -r -c "chproj -R 1" -c "chattr -R +P" $dir Index: b/tests/xfs/136 =================================================================== --- a/tests/xfs/136 +++ b/tests/xfs/136 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -132,7 +130,6 @@ _print_inode_a() _scratch_mount } - _test_add_eas() { _print_inode Index: b/tests/xfs/137 =================================================================== --- a/tests/xfs/137 +++ b/tests/xfs/137 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/138 =================================================================== --- a/tests/xfs/138 +++ b/tests/xfs/138 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/139 =================================================================== --- a/tests/xfs/139 +++ b/tests/xfs/139 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/140 =================================================================== --- a/tests/xfs/140 +++ b/tests/xfs/140 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/142 =================================================================== --- a/tests/xfs/142 +++ b/tests/xfs/142 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/143 =================================================================== --- a/tests/xfs/143 +++ b/tests/xfs/143 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/144 =================================================================== --- a/tests/xfs/144 +++ b/tests/xfs/144 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/145 =================================================================== --- a/tests/xfs/145 +++ b/tests/xfs/145 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/146 =================================================================== --- a/tests/xfs/146 +++ b/tests/xfs/146 @@ -25,8 +25,6 @@ seqfull=$0 seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/147 =================================================================== --- a/tests/xfs/147 +++ b/tests/xfs/147 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/148 =================================================================== --- a/tests/xfs/148 +++ b/tests/xfs/148 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -106,7 +104,6 @@ _scratch_mkfs_xfs $DSIZE | _filter_mkfs _check_ag 0 _check_ag -1 - # success, all done status=0 exit Index: b/tests/xfs/149 =================================================================== --- a/tests/xfs/149 +++ b/tests/xfs/149 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/150 =================================================================== --- a/tests/xfs/150 +++ b/tests/xfs/150 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/151 =================================================================== --- a/tests/xfs/151 +++ b/tests/xfs/151 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/152 =================================================================== --- a/tests/xfs/152 +++ b/tests/xfs/152 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/153 =================================================================== --- a/tests/xfs/153 +++ b/tests/xfs/153 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/154 =================================================================== --- a/tests/xfs/154 +++ b/tests/xfs/154 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/155 =================================================================== --- a/tests/xfs/155 +++ b/tests/xfs/155 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/156 =================================================================== --- a/tests/xfs/156 +++ b/tests/xfs/156 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/157 =================================================================== --- a/tests/xfs/157 +++ b/tests/xfs/157 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/158 =================================================================== --- a/tests/xfs/158 +++ b/tests/xfs/158 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/159 =================================================================== --- a/tests/xfs/159 +++ b/tests/xfs/159 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/160 =================================================================== --- a/tests/xfs/160 +++ b/tests/xfs/160 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/161 =================================================================== --- a/tests/xfs/161 +++ b/tests/xfs/161 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/162 =================================================================== --- a/tests/xfs/162 +++ b/tests/xfs/162 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/163 =================================================================== --- a/tests/xfs/163 +++ b/tests/xfs/163 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -62,7 +60,6 @@ _require_scratch _scratch_mkfs_xfs >/dev/null 2>&1 _dmapi_scratch_mount - qa_file=$SCRATCH_MNT/dmapi_hole_file touch $qa_file Index: b/tests/xfs/164 =================================================================== --- a/tests/xfs/164 +++ b/tests/xfs/164 @@ -30,8 +30,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -53,7 +51,6 @@ _filter_io() # # 1: [128..199]: 212280..212351 0 (212280..212351) 72 10000 # -# _filter_bmap() { awk '$3 ~ /hole/ { print $1, $2, $3; next } @@ -61,7 +58,6 @@ _filter_bmap() {print $1, $2}' >> $seqres.full } - # get standard environment, filters and checks . ./common/rc . ./common/filter Index: b/tests/xfs/165 =================================================================== --- a/tests/xfs/165 +++ b/tests/xfs/165 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -51,7 +49,6 @@ _filter_io() # < 1: [8..79]: 6552..6623 0 (6552..6623) 72 # > 1: [8..79]: 202544..202615 0 (202544..202615) 72 # -# _filter_bmap() { awk '$3 ~ /hole/ { print $1, $2, $3; next } @@ -81,7 +78,6 @@ end=`expr 10 \* $len` # write the initial file $XFS_IO_PROG -f -c "pwrite 0 ${end}k" $testfile | _filter_io - off=0 while [ $off -le $end ] do Index: b/tests/xfs/166 =================================================================== --- a/tests/xfs/166 +++ b/tests/xfs/166 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/167 =================================================================== --- a/tests/xfs/167 +++ b/tests/xfs/167 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/168 =================================================================== --- a/tests/xfs/168 +++ b/tests/xfs/168 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/170 =================================================================== --- a/tests/xfs/170 +++ b/tests/xfs/170 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/171 =================================================================== --- a/tests/xfs/171 +++ b/tests/xfs/171 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/172 =================================================================== --- a/tests/xfs/172 +++ b/tests/xfs/172 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/173 =================================================================== --- a/tests/xfs/173 +++ b/tests/xfs/173 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/174 =================================================================== --- a/tests/xfs/174 +++ b/tests/xfs/174 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/175 =================================================================== --- a/tests/xfs/175 +++ b/tests/xfs/175 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/176 =================================================================== --- a/tests/xfs/176 +++ b/tests/xfs/176 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/177 =================================================================== --- a/tests/xfs/177 +++ b/tests/xfs/177 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -81,7 +79,6 @@ _scratch_mount "-o dmapi,mtpt=$SCRATCH_M echo "Start bulkstat_unlink_test_modified" $here/src/bulkstat_unlink_test_modified 10 1000 1 $SCRATCH_MNT/bulkstat - # success, all done status=0 exit Index: b/tests/xfs/178 =================================================================== --- a/tests/xfs/178 +++ b/tests/xfs/178 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/179 =================================================================== --- a/tests/xfs/179 +++ b/tests/xfs/179 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/180 =================================================================== --- a/tests/xfs/180 +++ b/tests/xfs/180 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/181 =================================================================== --- a/tests/xfs/181 +++ b/tests/xfs/181 @@ -28,8 +28,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" _cleanup() Index: b/tests/xfs/182 =================================================================== --- a/tests/xfs/182 +++ b/tests/xfs/182 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/183 =================================================================== --- a/tests/xfs/183 +++ b/tests/xfs/183 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/185 =================================================================== --- a/tests/xfs/185 +++ b/tests/xfs/185 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -51,7 +49,6 @@ _require_scratch _scratch_mkfs_xfs -b size=512 >/dev/null 2>&1 _dmapi_scratch_mount - cat > $tmp.dmapi-param <&1 | _filter_scratch - # success, all done echo "*** done" rm -f $seqres.full Index: b/tests/xfs/201 =================================================================== --- a/tests/xfs/201 +++ b/tests/xfs/201 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -43,8 +41,6 @@ do_pwrite() xfs_io -d -f $file -c "pwrite $offset $length" >/dev/null } - - _cleanup() { umount $SCRATCH_MNT Index: b/tests/xfs/202 =================================================================== --- a/tests/xfs/202 +++ b/tests/xfs/202 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/203 =================================================================== --- a/tests/xfs/203 +++ b/tests/xfs/203 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/205 =================================================================== --- a/tests/xfs/205 +++ b/tests/xfs/205 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/206 =================================================================== --- a/tests/xfs/206 +++ b/tests/xfs/206 @@ -29,8 +29,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/216 =================================================================== --- a/tests/xfs/216 +++ b/tests/xfs/216 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/217 =================================================================== --- a/tests/xfs/217 +++ b/tests/xfs/217 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/220 =================================================================== --- a/tests/xfs/220 +++ b/tests/xfs/220 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -68,7 +66,6 @@ xfs_quota -x -c off $SCRATCH_DEV # and unmount (this used to crash) umount $SCRATCH_DEV - # create scratch filesystem _scratch_mkfs_xfs >/dev/null 2>&1 Index: b/tests/xfs/222 =================================================================== --- a/tests/xfs/222 +++ b/tests/xfs/222 @@ -27,8 +27,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/227 =================================================================== --- a/tests/xfs/227 +++ b/tests/xfs/227 @@ -29,8 +29,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/229 =================================================================== --- a/tests/xfs/229 +++ b/tests/xfs/229 @@ -30,8 +30,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/238 =================================================================== --- a/tests/xfs/238 +++ b/tests/xfs/238 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/242 =================================================================== --- a/tests/xfs/242 +++ b/tests/xfs/242 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` @@ -57,7 +55,6 @@ _test_io_zero() [ $(_test_io_zero) -eq 0 ] && _notrun "zero command not supported" - testfile=$TEST_DIR/242.$$ _test_generic_punch resvsp unresvsp zero 'bmap -p' _filter_bmap $testfile Index: b/tests/xfs/244 =================================================================== --- a/tests/xfs/244 +++ b/tests/xfs/244 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/250 =================================================================== --- a/tests/xfs/250 +++ b/tests/xfs/250 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/252 =================================================================== --- a/tests/xfs/252 +++ b/tests/xfs/252 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/253 =================================================================== --- a/tests/xfs/253 +++ b/tests/xfs/253 @@ -34,8 +34,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/259 =================================================================== --- a/tests/xfs/259 +++ b/tests/xfs/259 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" status=1 # failure is the default! Index: b/tests/xfs/261 =================================================================== --- a/tests/xfs/261 +++ b/tests/xfs/261 @@ -27,8 +27,6 @@ seq=$(basename $0) seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by ${seq}" here=$(pwd) Index: b/tests/xfs/262 =================================================================== --- a/tests/xfs/262 +++ b/tests/xfs/262 @@ -28,8 +28,6 @@ seq=$(basename $0) seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=$(pwd) @@ -71,7 +69,6 @@ _supported_os Linux _require_quota _require_scratch - # Make sure the hard limits reported are what was set. # It is entirely too clever... # It exploits the fact that we've set the soft and hard limits to Index: b/tests/xfs/266 =================================================================== --- a/tests/xfs/266 +++ b/tests/xfs/266 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/267 =================================================================== --- a/tests/xfs/267 +++ b/tests/xfs/267 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/268 =================================================================== --- a/tests/xfs/268 +++ b/tests/xfs/268 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/278 =================================================================== --- a/tests/xfs/278 +++ b/tests/xfs/278 @@ -5,7 +5,6 @@ # at the first run. See also commit 198b747f255346bca64408875763b6ca0ed3d57d # from xfsprogs tree. # -# #----------------------------------------------------------------------- # Copyright (c) 2011 Red Hat, Inc. All Rights Reserved. # @@ -26,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/279 =================================================================== --- a/tests/xfs/279 +++ b/tests/xfs/279 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/281 =================================================================== --- a/tests/xfs/281 +++ b/tests/xfs/281 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/282 =================================================================== --- a/tests/xfs/282 +++ b/tests/xfs/282 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/283 =================================================================== --- a/tests/xfs/283 +++ b/tests/xfs/283 @@ -26,8 +26,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/287 =================================================================== --- a/tests/xfs/287 +++ b/tests/xfs/287 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" tmp=/tmp/$$ here=`pwd` Index: b/tests/xfs/290 =================================================================== --- a/tests/xfs/290 +++ b/tests/xfs/290 @@ -28,8 +28,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/291 =================================================================== --- a/tests/xfs/291 +++ b/tests/xfs/291 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/292 =================================================================== --- a/tests/xfs/292 +++ b/tests/xfs/292 @@ -24,8 +24,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/293 =================================================================== --- a/tests/xfs/293 +++ b/tests/xfs/293 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/295 =================================================================== --- a/tests/xfs/295 +++ b/tests/xfs/295 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/296 =================================================================== --- a/tests/xfs/296 +++ b/tests/xfs/296 @@ -23,8 +23,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` Index: b/tests/xfs/297 =================================================================== --- a/tests/xfs/297 +++ b/tests/xfs/297 @@ -25,8 +25,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` From tinguely@sgi.com Wed Apr 3 14:12:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C312B7F52 for ; Wed, 3 Apr 2013 14:12:09 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9D3CE304067; Wed, 3 Apr 2013 12:12:06 -0700 (PDT) Message-ID: <515C7F09.2080201@sgi.com> Date: Wed, 03 Apr 2013 14:12:09 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed References: <1364958561-12440-1-git-send-email-david@fromorbit.com> In-Reply-To: <1364958561-12440-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/02/13 22:09, Dave Chinner wrote: > From: Dave Chinner > > Filesystems are occasionally being shut down with this error: > > xfs_trans_ail_delete_bulk: attempting to delete a log item that is > not in the AIL. > > It was diagnosed to be related to the EFI/EFD commit order when the > EFI and EFD are in different checkpoints and the EFD is committed > before the EFI here: > > http://oss.sgi.com/archives/xfs/2013-01/msg00082.html > > The real problem is that a single bit cannot fully describe the > states that the EFI/EFD processing can be in. These completion > states are: > > EFI EFI in AIL EFD Result > committed/unpinned Yes committed OK > committed/pinned No committed Shutdown > uncommitted No committed Shutdown > > > Note that the "result" field is what should happen, not what does > happen. The current logic is broken and handles the first two cases > correctly by luck. That is, the code will free the EFI if the > XFS_EFI_COMMITTED bit is*not* set, rather than if it is set. The > inverted logic "works" because if both EFI and EFD are committed, > then the first __xfs_efi_release() call clears the XFS_EFI_COMMITTED > bit, and the second frees the EFI item. Hence as long as > xfs_efi_item_committed() has been called, everything appears to be > fine. > > It is the third case where the logic fails - where > xfs_efd_item_committed() is called before xfs_efi_item_committed(), > and that results in the EFI being freed before it has been > committed. That is the bug that triggered the shutdown, d hence > keeping track of whether the EFI has been committed or not is > insufficient to correctly order the EFI/EFD operations w.r.t. the > AIL. > I think the exist xfs_efi routines are working correctly. the xfs_trans_committed_bulk() for the efi does the IOP_COMMITTED (sets the XFS_EFI_COMMITTED bit), add the entry to the AIL and then an IOP_UNPIN() which clears the XFS_EFI_COMMITTED since it is set, it should not release the efi and remove the entry from the AIL. It also correctly detects if the EFD is committed before the EFI by shutting down the filesystem. This patch seems to paper over why the EFD will come before the EFI. The CIL commits are in the correct order - protected by the xlog_wait() but the callbacks are out of order. My previous patch fixed the callback from happening out of sequence. --Mark. From treestem@gmail.com Wed Apr 3 14:33:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7B04B7F3F for ; Wed, 3 Apr 2013 14:33:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 679BF8F8049 for ; Wed, 3 Apr 2013 12:33:13 -0700 (PDT) X-ASG-Debug-ID: 1365017592-04cbb01fb91e50e0001-NocioJ Received: from mail-ve0-f172.google.com (mail-ve0-f172.google.com [209.85.128.172]) by cuda.sgi.com with ESMTP id Jk5yEXcJlS9sy9KT (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 03 Apr 2013 12:33:12 -0700 (PDT) X-Barracuda-Envelope-From: treestem@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.172] Received: by mail-ve0-f172.google.com with SMTP id oz10so2051665veb.3 for ; Wed, 03 Apr 2013 12:33:11 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=a8PtY9q2GS+0EqB2NbSX+kdsrYpNSJntR5DjNMz9tis=; b=MlkWZusGzJHPK8xYFizbeZdrdV2ebOLhLYnuYzmLcGxcKbqH1707XrofmA2aHtP/6m XBYhuX+/rG4z/wmDN4U/KQkyg3ArplZShLn3jlvEss3Rl5Tz4c5tdJUcQnzyLGe80+af VR+c7982+M7AODupBvMH8oaK0GiTejF34oD2PQ21rmIf0gW0WILLskBlawU75KTbsCDU 53LeKWkE+Ee6ZWA/HSn1/tdb1TL3DXPLBmAMpdj1sNifuClT9htfPLvJaH+aMRfVHyG1 vZgrCt98v9k0CM3uSBGKa5gXcCsK28iPd6AQ95WRvYgoGqfWigFU27oskzJNnfHpXqp2 41RQ== MIME-Version: 1.0 X-Received: by 10.58.75.46 with SMTP id z14mr2320884vev.52.1365017591770; Wed, 03 Apr 2013 12:33:11 -0700 (PDT) Received: by 10.220.119.204 with HTTP; Wed, 3 Apr 2013 12:33:11 -0700 (PDT) Date: Wed, 3 Apr 2013 15:33:11 -0400 Message-ID: Subject: xfs_iomap_write_unwritten stuck in congestion_wait? From: Peter Watkins X-ASG-Orig-Subj: xfs_iomap_write_unwritten stuck in congestion_wait? To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ve0-f172.google.com[209.85.128.172] X-Barracuda-Start-Time: 1365017592 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, Wondering if anyone has a suggestion for when xfs_iomap_write_unwritten gets into congestion_wait. In this case the system has almost half of normal zone pages in NR_WRITEBACK with pretty much everybody held up in either congestion_wait or balance_dirty_pages. Since there are some free pages, seems like we'd be better off just using a little more memory to finish this IO and in turn reduce pages under write-back and add to free memory, rather than holding up here. So maybe PF_MEMALLOC? It also looks like this path allocates log vectors with KM_SLEEP but lv_buf's with KM_SLEEP|KM_NOFS. Why is that? PID: 7011 TASK: ffff880226282040 CPU: 2 COMMAND: "xfsconvertd/2" #0 [ffff88022629b550] schedule at ffffffff814f5862 #1 [ffff88022629b618] schedule_timeout at ffffffff814f66a2 #2 [ffff88022629b6c8] io_schedule_timeout at ffffffff814f532f #3 [ffff88022629b6f8] congestion_wait at ffffffff81137450 #4 [ffff88022629b758] throttle_vm_writeout at ffffffff81128c78 #5 [ffff88022629b798] shrink_zone at ffffffff8112ea3b #6 [ffff88022629b848] do_try_to_free_pages at ffffffff8112ecfe #7 [ffff88022629b8d8] try_to_free_pages at ffffffff8112f30d #8 [ffff88022629b988] __alloc_pages_nodemask at ffffffff81126797 #9 [ffff88022629ba98] kmem_getpages at ffffffff8115db12 #10 [ffff88022629bac8] fallback_alloc at ffffffff8115e72a #11 [ffff88022629bb48] ____cache_alloc_node at ffffffff8115e4a9 #12 [ffff88022629bba8] __kmalloc at ffffffff8115f0d9 #13 [ffff88022629bbf8] kmem_alloc at ffffffffa02d69f7 #14 [ffff88022629bc38] xfs_log_commit_cil at ffffffffa02c3ebd #15 [ffff88022629bcb8] _xfs_trans_commit at ffffffffa02cfe99 #16 [ffff88022629bd18] xfs_iomap_write_unwritten at ffffffffa02bce01 #17 [ffff88022629be18] xfs_end_io at ffffffffa02d72bb #18 [ffff88022629be38] worker_thread at ffffffff8108c6a0 #19 [ffff88022629bee8] kthread at ffffffff81091ca6 #20 [ffff88022629bf48] kernel_thread at ffffffff8100c14a Apologies in advance, this is an older kernel (2.6.32-279) but has many more recent patches (thank-you!) -Peter From eflorac@intellique.com Wed Apr 3 14:40:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AD92D7F5F for ; Wed, 3 Apr 2013 14:40:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8632E8F804B for ; Wed, 3 Apr 2013 12:40:40 -0700 (PDT) X-ASG-Debug-ID: 1365018035-04bdf0542c1e2530001-NocioJ Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id 5Ts8nmeEkKq8aSJg for ; Wed, 03 Apr 2013 12:40:36 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.3 Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id C2A1CA62A4; Wed, 3 Apr 2013 21:40:30 +0200 (CEST) Date: Wed, 3 Apr 2013 21:40:17 +0200 From: Emmanuel Florac To: L Ox Cc: xfs@oss.sgi.com Subject: Re: 88TB filesystem going off-line without warning Message-ID: <20130403214017.117c8ec0@galadriel.home> X-ASG-Orig-Subj: Re: 88TB filesystem going off-line without warning In-Reply-To: References: Organization: Intellique X-Mailer: Claws Mail 3.7.8 (GTK+ 2.24.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1365018035 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Tue, 2 Apr 2013 11:44:15 -0700 vous =C3=A9criviez: > Apr 2 07:50:28 node24 kernel: Filesystem dm-6: I/O Error Detected. > Shutting down filesystem: dm-6 "IO Error" means there's probably a problem with underlying hardware (bad controller, cable or disk drive). You should start with fixing the hardware problem. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From sandeen@sandeen.net Wed Apr 3 14:47:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E32577F50 for ; Wed, 3 Apr 2013 14:47:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CD502AC002 for ; Wed, 3 Apr 2013 12:47:00 -0700 (PDT) X-ASG-Debug-ID: 1365018419-04cbb01fb81e6e20001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 2QitbJoQiXoydVfE for ; Wed, 03 Apr 2013 12:46:59 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id AEF3A63C5B55; Wed, 3 Apr 2013 14:46:58 -0500 (CDT) Message-ID: <515C8732.3000902@sandeen.net> Date: Wed, 03 Apr 2013 14:46:58 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130307 Thunderbird/17.0.4 MIME-Version: 1.0 To: Mark Tinguely CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed References: <1364958561-12440-1-git-send-email-david@fromorbit.com> <515C7F09.2080201@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed In-Reply-To: <515C7F09.2080201@sgi.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365018419 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 On 4/3/13 2:12 PM, Mark Tinguely wrote: > On 04/02/13 22:09, Dave Chinner wrote: >> From: Dave Chinner >> >> Filesystems are occasionally being shut down with this error: >> >> xfs_trans_ail_delete_bulk: attempting to delete a log item that is >> not in the AIL. >> >> It was diagnosed to be related to the EFI/EFD commit order when the >> EFI and EFD are in different checkpoints and the EFD is committed >> before the EFI here: >> >> http://oss.sgi.com/archives/xfs/2013-01/msg00082.html >> >> The real problem is that a single bit cannot fully describe the >> states that the EFI/EFD processing can be in. These completion >> states are: >> >> EFI EFI in AIL EFD Result >> committed/unpinned Yes committed OK >> committed/pinned No committed Shutdown >> uncommitted No committed Shutdown >> >> >> Note that the "result" field is what should happen, not what does >> happen. The current logic is broken and handles the first two cases >> correctly by luck. That is, the code will free the EFI if the >> XFS_EFI_COMMITTED bit is*not* set, rather than if it is set. The >> inverted logic "works" because if both EFI and EFD are committed, >> then the first __xfs_efi_release() call clears the XFS_EFI_COMMITTED >> bit, and the second frees the EFI item. Hence as long as >> xfs_efi_item_committed() has been called, everything appears to be >> fine. >> >> It is the third case where the logic fails - where >> xfs_efd_item_committed() is called before xfs_efi_item_committed(), >> and that results in the EFI being freed before it has been >> committed. That is the bug that triggered the shutdown, d hence >> keeping track of whether the EFI has been committed or not is >> insufficient to correctly order the EFI/EFD operations w.r.t. the >> AIL. >> > > I think the exist xfs_efi routines are working correctly. > > the xfs_trans_committed_bulk() for the efi does the IOP_COMMITTED > (sets the XFS_EFI_COMMITTED bit), add the entry to the AIL and then > an IOP_UNPIN() which clears the XFS_EFI_COMMITTED since it is set, it > should not release the efi and remove the entry from the AIL. It also > correctly detects if the EFD is committed before the EFI by shutting > down the filesystem. Well hang on, not everything can be cool in EFI-land here, if nothing else this: __xfs_efi_release( struct xfs_efi_log_item *efip) { struct xfs_ail *ailp = efip->efi_item.li_ailp; if (!test_and_clear_bit(XFS_EFI_COMMITTED, &efip->efi_flags)) { spin_lock(&ailp->xa_lock); /* xfs_trans_ail_delete() drops the AIL lock. */ xfs_trans_ail_delete(ailp, &efip->efi_item, SHUTDOWN_LOG_IO_ERROR); xfs_efi_item_free(efip); } } seems obviously broken. * test_and_clear_bit - Clear a bit and return its old value so it is saying if XFS_EFI_COMMITED was *not* set, free the efi. Which I think we must admit is broken. I have to get up to speed on this code, but it seems like at least this much above is quite obviously broken, and the previously proposed patch doesn't address it. Am I missing something? -Eric > This patch seems to paper over why the EFD will come before the EFI. > > The CIL commits are in the correct order - protected by the > xlog_wait() but the callbacks are out of order. > > My previous patch fixed the callback from happening out of sequence. > > --Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Wed Apr 3 15:36:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9F13F7CBF for ; Wed, 3 Apr 2013 15:36:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8B730304032 for ; Wed, 3 Apr 2013 13:36:24 -0700 (PDT) X-ASG-Debug-ID: 1365021383-04cb6c1e791f4df0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id HkTZL01OLaLbeFry for ; Wed, 03 Apr 2013 13:36:23 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 36F6C65690DB; Wed, 3 Apr 2013 15:36:23 -0500 (CDT) Message-ID: <515C92C6.8010506@sandeen.net> Date: Wed, 03 Apr 2013 15:36:22 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130307 Thunderbird/17.0.4 MIME-Version: 1.0 To: rjohnston@sgi.com CC: xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] cleanup duplicates in all tests References: <20130403173245.376605011@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] cleanup duplicates in all tests In-Reply-To: <20130403173245.376605011@sgi.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365021383 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127088 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 4/3/13 12:31 PM, rjohnston@sgi.com wrote: > There are duplicate blank lines, comment hash and lines > containing duplicate seqres= declarations, remove them. > > Signed-off-by: Rich Johnston > > --- > tests/btrfs/254 | 3 --- > tests/btrfs/264 | 4 ---- > tests/btrfs/265 | 3 --- > tests/btrfs/276 | 3 --- > tests/btrfs/284 | 3 --- nothing but dup line removal: $ egrep "^[-+][a-z]" bigpatch | sort | uniq -seqres=$RESULT_DIR/$seq and every file still has one left: $ for FILE in `guilt files`; do grep -c "seqres=$RESULT_DIR" $FILE; done | sort | uniq 1 Looks good to me! :) Reviewed-by: Eric Sandeen Thanks, -Eric From sandeen@sandeen.net Wed Apr 3 16:02:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B1DAB7CBF for ; Wed, 3 Apr 2013 16:02:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8038530405F for ; Wed, 3 Apr 2013 14:02:27 -0700 (PDT) X-ASG-Debug-ID: 1365022946-04bdf0542d1ec710001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id KsHisKiDLk5L1F4D for ; Wed, 03 Apr 2013 14:02:26 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0906461F8989; Wed, 3 Apr 2013 16:02:26 -0500 (CDT) Message-ID: <515C98E1.2010700@sandeen.net> Date: Wed, 03 Apr 2013 16:02:25 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130307 Thunderbird/17.0.4 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed References: <1364958561-12440-1-git-send-email-david@fromorbit.com> <515C7F09.2080201@sgi.com> <515C8732.3000902@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed In-Reply-To: <515C8732.3000902@sandeen.net> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365022946 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127090 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 4/3/13 2:46 PM, Eric Sandeen wrote: > On 4/3/13 2:12 PM, Mark Tinguely wrote: >> On 04/02/13 22:09, Dave Chinner wrote: >>> From: Dave Chinner >>> >>> Filesystems are occasionally being shut down with this error: >>> >>> xfs_trans_ail_delete_bulk: attempting to delete a log item that is >>> not in the AIL. >>> >>> It was diagnosed to be related to the EFI/EFD commit order when the >>> EFI and EFD are in different checkpoints and the EFD is committed >>> before the EFI here: >>> >>> http://oss.sgi.com/archives/xfs/2013-01/msg00082.html >>> >>> The real problem is that a single bit cannot fully describe the >>> states that the EFI/EFD processing can be in. These completion >>> states are: >>> >>> EFI EFI in AIL EFD Result >>> committed/unpinned Yes committed OK >>> committed/pinned No committed Shutdown >>> uncommitted No committed Shutdown >>> >>> >>> Note that the "result" field is what should happen, not what does >>> happen. The current logic is broken and handles the first two cases >>> correctly by luck. That is, the code will free the EFI if the >>> XFS_EFI_COMMITTED bit is*not* set, rather than if it is set. The >>> inverted logic "works" because if both EFI and EFD are committed, >>> then the first __xfs_efi_release() call clears the XFS_EFI_COMMITTED >>> bit, and the second frees the EFI item. Hence as long as >>> xfs_efi_item_committed() has been called, everything appears to be >>> fine. >>> >>> It is the third case where the logic fails - where >>> xfs_efd_item_committed() is called before xfs_efi_item_committed(), >>> and that results in the EFI being freed before it has been >>> committed. That is the bug that triggered the shutdown, d hence >>> keeping track of whether the EFI has been committed or not is >>> insufficient to correctly order the EFI/EFD operations w.r.t. the >>> AIL. >>> >> >> I think the exist xfs_efi routines are working correctly. >> >> the xfs_trans_committed_bulk() for the efi does the IOP_COMMITTED >> (sets the XFS_EFI_COMMITTED bit), add the entry to the AIL and then >> an IOP_UNPIN() which clears the XFS_EFI_COMMITTED since it is set, it >> should not release the efi and remove the entry from the AIL. It also >> correctly detects if the EFD is committed before the EFI by shutting >> down the filesystem. > > Well hang on, not everything can be cool in EFI-land here, if nothing > else this: > > __xfs_efi_release( > struct xfs_efi_log_item *efip) > { > struct xfs_ail *ailp = efip->efi_item.li_ailp; > > if (!test_and_clear_bit(XFS_EFI_COMMITTED, &efip->efi_flags)) { > spin_lock(&ailp->xa_lock); > /* xfs_trans_ail_delete() drops the AIL lock. */ > xfs_trans_ail_delete(ailp, &efip->efi_item, > SHUTDOWN_LOG_IO_ERROR); > xfs_efi_item_free(efip); > } > } > > seems obviously broken. > > * test_and_clear_bit - Clear a bit and return its old value > > so it is saying if XFS_EFI_COMMITED was *not* set, free the efi. > Which I think we must admit is broken. > > I have to get up to speed on this code, but it seems like at least > this much above is quite obviously broken, and the previously > proposed patch doesn't address it. Am I missing something? Or are you saying that it's working as designed, so that the first caller finds it set, clears it and does nothing, and the 2nd caller finds it unset, and frees it? help me out here ;) -Eric From akhavanarman@yahoo.com Wed Apr 3 16:32:01 2013 Return-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=FORGED_YAHOO_RCVD, 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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1BE237CBF for ; Wed, 3 Apr 2013 16:32:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 06F968F8049 for ; Wed, 3 Apr 2013 14:31:57 -0700 (PDT) X-ASG-Debug-ID: 1365024715-04cb6c1e791fb100001-NocioJ Received: from webserver-6 ([168.61.43.61]) by cuda.sgi.com with ESMTP id KV3GOQpa86zap3Fk for ; Wed, 03 Apr 2013 14:31:56 -0700 (PDT) X-Barracuda-Envelope-From: akhavanarman@yahoo.com X-Barracuda-Apparent-Source-IP: 168.61.43.61 Received: from emailcrm.cloudapp.net ([168.63.133.61]) by webserver-6 with Microsoft SMTPSVC(7.5.7601.17514); Wed, 3 Apr 2013 21:31:54 +0000 Date: Wed, 3 Apr 2013 21:31:53 +0000 X-Sender: akhavanarman@yahoo.com Errors-To: akhavanarman@yahoo.com To: xfs@oss.sgi.com From: Nick Robinson Reply-To: Nick Robinson Subject: mind treasures Message-ID: X-ASG-Orig-Subj: mind treasures X-Priority: 3 X-Mailer: oemPro X-Mailer-MsgId: eGZzQG9zcy5zZ2kuY29t X-Mailer-CSID: Nl83 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/html; charset="UTF-8" X-OriginalArrivalTime: 03 Apr 2013 21:31:54.0587 (UTC) FILETIME=[A97852B0:01CE30B2] X-Barracuda-Connect: UNKNOWN[168.61.43.61] X-Barracuda-Start-Time: 1365024715 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.01 X-Barracuda-Spam-Status: No, SCORE=2.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, FORGED_YAHOO_RCVD, FORGED_YAHOO_RCVD_2, HTML_MESSAGE, MIME_HTML_ONLY, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127092 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FORGED_YAHOO_RCVD 'From' yahoo.com does not match 'Received' headers 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.41 FORGED_YAHOO_RCVD_2 'From' yahoo.com does not match 'Received' headers 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963

Hello

Every so often, man steers clear of something but does not know that it benefits him and vice versa, from time to time he approaches someone or something, not knowing that it harms him, all the same God has blessed mankind with something by which he can tell between right and wrong. That huge blessing is called “intellect”. It’s appealing to know that the legitimacy of everything is identified by the use of intellect, but the legitimacy of intellect is undeniable and self-explanatory, and it’s not incumbent upon us to reason and argue about it. For instance when intellect proclaims that oppression is evil and kindness is good, we conclude that it’s legitimate and we need not to reason for it. Who do you think this sentence is quoted from?

“God sent his prophets to people one after another so that they plow men’s wisdom and dig out its treasures. “

The narrator of these words is not a poet but knows poetry. He is not a philosopher. He is a divine man. Now what do you think those buried treasures of human wisdom are? Or how do God’s prophets dig out those treasures of human’s wisdom?


visit us : http://shia.es --- From tinguely@sgi.com Wed Apr 3 16:45:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 682F47CBF for ; Wed, 3 Apr 2013 16:45:16 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2C114304059; Wed, 3 Apr 2013 14:45:16 -0700 (PDT) Message-ID: <515CA2EE.605@sgi.com> Date: Wed, 03 Apr 2013 16:45:18 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed References: <1364958561-12440-1-git-send-email-david@fromorbit.com> <515C7F09.2080201@sgi.com> <515C8732.3000902@sandeen.net> <515C98E1.2010700@sandeen.net> In-Reply-To: <515C98E1.2010700@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/03/13 16:02, Eric Sandeen wrote: > On 4/3/13 2:46 PM, Eric Sandeen wrote: >> On 4/3/13 2:12 PM, Mark Tinguely wrote: >>> On 04/02/13 22:09, Dave Chinner wrote: >>>> From: Dave Chinner >>>> >>>> Filesystems are occasionally being shut down with this error: >>>> >>>> xfs_trans_ail_delete_bulk: attempting to delete a log item that is >>>> not in the AIL. >>>> >>>> It was diagnosed to be related to the EFI/EFD commit order when the >>>> EFI and EFD are in different checkpoints and the EFD is committed >>>> before the EFI here: >>>> >>>> http://oss.sgi.com/archives/xfs/2013-01/msg00082.html >>>> >>>> The real problem is that a single bit cannot fully describe the >>>> states that the EFI/EFD processing can be in. These completion >>>> states are: >>>> >>>> EFI EFI in AIL EFD Result >>>> committed/unpinned Yes committed OK >>>> committed/pinned No committed Shutdown >>>> uncommitted No committed Shutdown >>>> >>>> >>>> Note that the "result" field is what should happen, not what does >>>> happen. The current logic is broken and handles the first two cases >>>> correctly by luck. That is, the code will free the EFI if the >>>> XFS_EFI_COMMITTED bit is*not* set, rather than if it is set. The >>>> inverted logic "works" because if both EFI and EFD are committed, >>>> then the first __xfs_efi_release() call clears the XFS_EFI_COMMITTED >>>> bit, and the second frees the EFI item. Hence as long as >>>> xfs_efi_item_committed() has been called, everything appears to be >>>> fine. >>>> >>>> It is the third case where the logic fails - where >>>> xfs_efd_item_committed() is called before xfs_efi_item_committed(), >>>> and that results in the EFI being freed before it has been >>>> committed. That is the bug that triggered the shutdown, d hence >>>> keeping track of whether the EFI has been committed or not is >>>> insufficient to correctly order the EFI/EFD operations w.r.t. the >>>> AIL. >>>> >>> >>> I think the exist xfs_efi routines are working correctly. >>> >>> the xfs_trans_committed_bulk() for the efi does the IOP_COMMITTED >>> (sets the XFS_EFI_COMMITTED bit), add the entry to the AIL and then >>> an IOP_UNPIN() which clears the XFS_EFI_COMMITTED since it is set, it >>> should not release the efi and remove the entry from the AIL. It also >>> correctly detects if the EFD is committed before the EFI by shutting >>> down the filesystem. >> >> Well hang on, not everything can be cool in EFI-land here, if nothing >> else this: >> >> __xfs_efi_release( >> struct xfs_efi_log_item *efip) >> { >> struct xfs_ail *ailp = efip->efi_item.li_ailp; >> >> if (!test_and_clear_bit(XFS_EFI_COMMITTED,&efip->efi_flags)) { >> spin_lock(&ailp->xa_lock); >> /* xfs_trans_ail_delete() drops the AIL lock. */ >> xfs_trans_ail_delete(ailp,&efip->efi_item, >> SHUTDOWN_LOG_IO_ERROR); >> xfs_efi_item_free(efip); >> } >> } >> >> seems obviously broken. >> >> * test_and_clear_bit - Clear a bit and return its old value >> >> so it is saying if XFS_EFI_COMMITED was *not* set, free the efi. >> Which I think we must admit is broken. >> >> I have to get up to speed on this code, but it seems like at least >> this much above is quite obviously broken, and the previously >> proposed patch doesn't address it. Am I missing something? > > Or are you saying that it's working as designed, so that the first > caller finds it set, clears it and does nothing, and the 2nd caller > finds it unset, and frees it? help me out here ;) > > -Eric > Yes. The order is IOP_COMMITTED and then IOP_UNPIN: The EFI IOP_COMMITTED: xfs_efi_item_committed( struct xfs_log_item *lip, xfs_lsn_t lsn) { struct xfs_efi_log_item *efip = EFI_ITEM(lip); set_bit(XFS_EFI_COMMITTED, &efip->efi_flags); return lsn; } then The EFI IOP_UNPIN() -> STATIC void xfs_efi_item_unpin( struct xfs_log_item *lip, int remove) { struct xfs_efi_log_item *efip = EFI_ITEM(lip); if (remove) { ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); if (lip->li_desc) xfs_trans_del_item(lip); xfs_efi_item_free(efip); return; } __xfs_efi_release(efip); } and the the EFD's IOP_COMMITED: STATIC xfs_lsn_t xfs_efi_item_committed( struct xfs_log_item *lip, xfs_lsn_t lsn) { struct xfs_efi_log_item *efip = EFI_ITEM(lip); set_bit(XFS_EFI_COMMITTED, &efip->efi_flags); return lsn; } The code makes sure the sequence EFI and then EFD are done in order. --Mark. From bpm@sgi.com Wed Apr 3 17:13:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B23887CBF for ; Wed, 3 Apr 2013 17:13:48 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 786278F804B; Wed, 3 Apr 2013 15:13:45 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 53BB2500B50; Wed, 3 Apr 2013 17:13:45 -0500 (CDT) Date: Wed, 3 Apr 2013 17:13:45 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 13/21] xfs: add CRC checking to dir2 data blocks Message-ID: <20130403221345.GB22182@sgi.com> References: <1363091454-8852-1-git-send-email-david@fromorbit.com> <1363091454-8852-14-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1363091454-8852-14-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) Dave, On Tue, Mar 12, 2013 at 11:30:46PM +1100, Dave Chinner wrote: > From: Dave Chinner > > This addition follows the same pattern as the dir2 block CRCs. > > Signed-off-by: Dave Chinner Just a few nits. > @@ -908,7 +908,7 @@ xfs_dir2_block_removename( > xfs_dir2_data_freescan(mp, hdr, &needlog); > if (needlog) > xfs_dir2_data_log_header(tp, bp); > - xfs_dir2_data_check(dp, bp); > + xfs_dir3_data_check(dp, bp); In this debug code, maybe it is better check the blocks after making the changes to them but before logging them? Not sure. > @@ -212,7 +221,7 @@ xfs_dir2_data_verify( > * format buffer or a data format buffer on readahead. > */ > static void > -xfs_dir2_data_reada_verify( > +xfs_dir3_data_reada_verify( > struct xfs_buf *bp) > { > struct xfs_mount *mp = bp->b_target->bt_mount; > @@ -225,7 +234,8 @@ xfs_dir2_data_reada_verify( > bp->b_ops->verify_read(bp); > return; > case cpu_to_be32(XFS_DIR2_DATA_MAGIC): > - xfs_dir2_data_verify(bp); > + case cpu_to_be32(XFS_DIR3_DATA_MAGIC): > + xfs_dir3_data_verify(bp); I think it might be a good idea to add a print in the situation where we have an error in readahead. It needn't be a forced shutdown. > diff --git a/fs/xfs/xfs_dir2_format.h b/fs/xfs/xfs_dir2_format.h > index bec058f..dfc8ccf 100644 > --- a/fs/xfs/xfs_dir2_format.h > +++ b/fs/xfs/xfs_dir2_format.h > @@ -283,7 +283,8 @@ struct xfs_dir3_data_hdr { > static inline struct xfs_dir2_data_free * > xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) Get rid of the tab. > @@ -204,8 +204,12 @@ xfs_dir2_block_to_leaf( > /* > * Fix up the block header, make it a data block. > */ > - dbp->b_ops = &xfs_dir2_data_buf_ops; > - hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); > + dbp->b_ops = &xfs_dir3_data_buf_ops; > + if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) > + hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); > + else > + hdr->magic = cpu_to_be32(XFS_DIR3_DATA_MAGIC); > + else { ASSERT(hdr->magic == XFS_DIR3_BLOCK_MAGIC)); hdr->magic = cpu_to_be32(XFS_DIR3_DATA_MAGIC); } Might be nice... Else, looks good. I'll switch over to reviewing your new rev. Regards, Ben From xfs@tlinx.org Wed Apr 3 17:53:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2040A7CBF for ; Wed, 3 Apr 2013 17: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 8172DAC001 for ; Wed, 3 Apr 2013 15:52:57 -0700 (PDT) X-ASG-Debug-ID: 1365029574-04cb6c1e77201760001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id PEExEuawF4fo1IYh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 03 Apr 2013 15:52:54 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r33MqpID007956 for ; Wed, 3 Apr 2013 15:52:53 -0700 Message-ID: <515CB2C1.1050109@tlinx.org> Date: Wed, 03 Apr 2013 15:52:49 -0700 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss Subject: xfsdump having problems dumping attributes again (cannot allocate memory) Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: xfsdump having problems dumping attributes again (cannot allocate memory) Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1365029574 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127098 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Note -- I might have more attributes than some as the disks are shared via samba w/windows and samba stores ACL and xattr info from windows in xfs's attrs... xfsdump: WARNING: could not get list of root attributes for nondir ino 3412893285: Cannot allocate memory (12) xfsdump: WARNING: could not get list of secure attributes for nondir ino 3412893285: Cannot allocate memory (12) xfsdump: WARNING: could not get list of non-root attributes for nondir ino 3412893290: Cannot allocate memory (12) xfsdump: WARNING: could not get list of root attributes for nondir ino 3412893290: Cannot allocate memory (12) xfsdump: WARNING: could not get list of secure attributes for nondir ino 3412893290: Cannot allocate memory (12) xfsdump: WARNING: could not get list of non-root attributes for nondir ino 3412894183: Cannot allocate memory (12) xfsdump: WARNING: could not get list of root attributes for nondir ino 3412894183: Cannot allocate memory (12) .... Linux Ishtar 3.8.2-Isht-Van #3 SMP PREEMPT Fri Mar 22 21:15:14 PDT 2013 x86_64 x86_64 x86_64 GNU/Linux xfs_repair version 3.1.10 12 cpus > cat /proc/meminfo MemTotal: 49489152 kB MemFree: 409956 kB Buffers: 1596 kB Cached: 17932136 kB SwapCached: 76204 kB Active: 19338740 kB Inactive: 19841616 kB Active(anon): 18934044 kB Inactive(anon): 2319988 kB Active(file): 404696 kB Inactive(file): 17521628 kB Unevictable: 24968 kB Mlocked: 24968 kB SwapTotal: 8393924 kB SwapFree: 8029584 kB Dirty: 84 kB Writeback: 0 kB AnonPages: 21196344 kB Mapped: 98256 kB Shmem: 3940 kB Slab: 7242232 kB SReclaimable: 6662800 kB SUnreclaim: 579432 kB KernelStack: 7216 kB PageTables: 78948 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 33138500 kB Committed_AS: 23870772 kB VmallocTotal: 34359738367 kB VmallocUsed: 425136 kB VmallocChunk: 34334089480 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 7652 kB DirectMap2M: 2076672 kB DirectMap1G: 48234496 kB Ishtar:tools/xfs/git/xfsdump> cat /proc/mounts rootfs / rootfs rw 0 0 /dev/root / xfs rw,noatime,nodiratime,attr2,inode64,noquota 0 0 devtmpfs /dev devtmpfs rw,relatime,size=24708844k,nr_inodes=6177211,mode=755 0 0 /dev/sdc6 /usr xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=64k,logbsize=256k,noquota 0 0 proc /proc proc rw,relatime 0 0 sysfs /sys sysfs rw,relatime 0 0 devpts /dev/pts devpts rw,relatime,gid=5,mode=620 0 0 tmpfs /run tmpfs rw,relatime,mode=755 0 0 debugfs /sys/kernel/debug debugfs rw,relatime 0 0 tmpfs /dev/shm tmpfs rw,relatime 0 0 tmpfs /sys/fs/cgroup tmpfs rw,nosuid,nodev,noexec,relatime,mode=755 0 0 cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0 cgroup /sys/fs/cgroup/debug cgroup rw,nosuid,nodev,noexec,relatime,debug 0 0 cgroup /sys/fs/cgroup/cpu cgroup rw,nosuid,nodev,noexec,relatime,cpu 0 0 cgroup /sys/fs/cgroup/cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct 0 0 cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0 cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0 cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0 cgroup /sys/fs/cgroup/net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_prio 0 0 securityfs /sys/kernel/security securityfs rw,relatime 0 0 /dev/sdc2 /var xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=128k,logbsize=256k,noquota 0 0 /dev/sdc3 /boot xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=2048k,noquota 0 0 /dev/sdc2 /tmp xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=128k,logbsize=256k,noquota 0 0 /dev/mapper/HnS-Sys /root2 xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=64k,logbsize=256k,sunit=128,swidth=1536,noquota 0 0 /dev/mapper/HnS-Sysvar /root2/var xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=128k,logbsize=256k,sunit=128,swidth=1536,noquota 0 0 /dev/mapper/HnS-Sysboot /root2/boot xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=2048k,logbsize=256k,sunit=128,swidth=1536,noquota 0 0 /dev/mapper/HnS-Home /home xfs rw,noatime,nodiratime,swalloc,attr2,largeio,nobarrier,inode64,allocsize=128k,logbsize=256k,sunit=128,swidth=1536,noquota 0 0 /dev/mapper/HnS-Share /Share xfs rw,noatime,nodiratime,swalloc,attr2,largeio,nobarrier,inode64,allocsize=1024k,logbsize=256k,sunit=128,swidth=1536,noquota 0 0 /dev/mapper/HnS-Home.diff /home.diff xfs rw,noatime,nodiratime,swalloc,attr2,largeio,nobarrier,inode64,logbsize=256k,sunit=128,swidth=1536,noquota 0 0 /dev/mapper/Media-Media /Media xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=32768k,logbsize=256k,sunit=128,swidth=1280,noquota 0 0 /dev/mapper/HnS-Squid_Cache /var/cache/squid xfs rw,noatime,nodiratime,swalloc,attr2,largeio,nobarrier,inode64,allocsize=64k,logbsize=256k,sunit=128,swidth=1280,noquota 0 0 /dev/mapper/Backups-Backups /backups xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=131072k,logbsize=256k,sunit=128,swidth=768,noquota 0 0 /dev/mapper/HnS-Media_Back /backups/Media xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=131072k,logbsize=256k,sunit=128,swidth=1280,noquota 0 0 /dev/mapper/HnS-Home /usr/share xfs rw,noatime,nodiratime,swalloc,attr2,largeio,nobarrier,inode64,allocsize=128k,logbsize=256k,sunit=128,swidth=1536,noquota 0 0 /dev/mapper/Media-Media /Media xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=32768k,logbsize=256k,sunit=128,swidth=1280,noquota 0 0 tmpfs /var/lock tmpfs rw,relatime,mode=755 0 0 tmpfs /var/run tmpfs rw,relatime,mode=755 0 0 tmpfs /media tmpfs rw,nosuid,nodev,relatime,mode=755 0 0 /dev/sdc2 /tmp xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=128k,logbsize=256k,noquota 0 0 /dev/mapper/HnS-Home /usr/share xfs rw,noatime,nodiratime,swalloc,attr2,largeio,nobarrier,inode64,allocsize=128k,logbsize=256k,sunit=128,swidth=1536,noquota 0 0 /dev/mapper/Media-Media /Media xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=32768k,logbsize=256k,sunit=128,swidth=1280,noquota 0 0 none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0 proc /var/lib/named/proc proc ro,nosuid,nodev,noexec,relatime 0 0 nfsd /proc/fs/nfsd nfsd rw,relatime 0 0 /etc/auto.misc /misc autofs rw,relatime,fd=6,pgrp=11123,timeout=600,minproto=5,maxproto=5,indirect 0 0 /etc/auto.smb /smb autofs rw,relatime,fd=12,pgrp=11123,timeout=600,minproto=5,maxproto=5,indirect 0 0 /etc/auto.net /net autofs rw,relatime,fd=18,pgrp=11123,timeout=600,minproto=5,maxproto=5,indirect 0 0 /etc/auto.homes /homes autofs rw,relatime,fd=24,pgrp=11123,timeout=600,minproto=5,maxproto=5,indirect 0 0 /dev/HnS/Home-2013.03.05-05.07.02 /home/.snapdir/@GMT-2013.03.05-05.07.02 xfs rw,relatime,attr2,inode64,logbsize=64k,sunit=128,swidth=1536,noquota 0 0 /dev/HnS/Home-2013.03.13-01.20.33 /home/.snapdir/@GMT-2013.03.13-01.20.33 xfs rw,relatime,attr2,inode64,logbsize=64k,sunit=128,swidth=1536,noquota 0 0 /dev/HnS/Home-2013.03.17-05.07.02 /home/.snapdir/@GMT-2013.03.17-05.07.02 xfs rw,relatime,attr2,inode64,logbsize=64k,sunit=128,swidth=1536,noquota 0 0 /dev/HnS/Home-2013.03.19-05.07.02 /home/.snapdir/@GMT-2013.03.19-05.07.02 xfs rw,relatime,attr2,inode64,logbsize=64k,sunit=128,swidth=1536,noquota 0 0 /dev/HnS/Home-2013.03.21-05.07.03 /home/.snapdir/@GMT-2013.03.21-05.07.03 xfs rw,relatime,attr2,inode64,logbsize=64k,sunit=128,swidth=1536,noquota 0 0 proc /var/empty/dev proc rw,relatime 0 0 gvfs-fuse-daemon /home/law/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=5013,group_id=201 0 0 /dev/sdc2 /tmp xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=128k,logbsize=256k,noquota 0 0 /dev/mapper/HnS-Home /usr/share xfs rw,noatime,nodiratime,swalloc,attr2,largeio,nobarrier,inode64,allocsize=128k,logbsize=256k,sunit=128,swidth=1536,noquota 0 0 /dev/mapper/Media-Media /Media xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=32768k,logbsize=256k,sunit=128,swidth=1280,noquota 0 0 gvfs-fuse-daemon /root/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=0,group_id=0 0 0 /dev/sdc2 /tmp xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=128k,logbsize=256k,noquota 0 0 /dev/mapper/HnS-Home /usr/share xfs rw,noatime,nodiratime,swalloc,attr2,largeio,nobarrier,inode64,allocsize=128k,logbsize=256k,sunit=128,swidth=1536,noquota 0 0 /dev/mapper/Media-Media /Media xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=32768k,logbsize=256k,sunit=128,swidth=1280,noquota 0 0 /dev/sdc2 /tmp xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=128k,logbsize=256k,noquota 0 0 /dev/mapper/HnS-Home /usr/share xfs rw,noatime,nodiratime,swalloc,attr2,largeio,nobarrier,inode64,allocsize=128k,logbsize=256k,sunit=128,swidth=1536,noquota 0 0 /dev/mapper/Media-Media /Media xfs rw,noatime,nodiratime,swalloc,attr2,largeio,inode64,allocsize=32768k,logbsize=256k,sunit=128,swidth=1280,noquota 0 0 /dev/HnS/Home-2013.03.25-05.07.06 /home/.snapdir/@GMT-2013.03.25-05.07.06 xfs rw,relatime,attr2,inode64,logbsize=64k,sunit=128,swidth=1536,noquota 0 0 /dev/HnS/Home-2013.03.26-05.07.03 /home/.snapdir/@GMT-2013.03.26-05.07.03 xfs rw,relatime,attr2,inode64,logbsize=64k,sunit=128,swidth=1536,noquota 0 0 /dev/HnS/Home-2013.03.27-05.07.18 /home/.snapdir/@GMT-2013.03.27-05.07.18 xfs rw,relatime,attr2,inode64,logbsize=64k,sunit=128,swidth=1536,noquota 0 0 /dev/HnS/Home-2013.03.29-21.00.11 /home/.snapdir/@GMT-2013.03.29-21.00.11 xfs rw,relatime,attr2,inode64,logbsize=64k,sunit=128,swidth=1536,noquota 0 0 /dev/HnS/Home-2013.03.31-05.07.03 /home/.snapdir/@GMT-2013.03.31-05.07.03 xfs ro,relatime,nouuid,norecovery,attr2,inode64,logbsize=64k,sunit=128,swidth=1536,noquota 0 0 /dev/HnS/Home-2013.03.30-05.07.04 /home/.snapdir/@GMT-2013.03.30-05.07.04 xfs rw,relatime,attr2,inode64,logbsize=64k,sunit=128,swidth=1536,noquota 0 0 /dev/HnS/Home-2013.04.03-14.41.10 /home/.snapdir/@GMT-2013.04.03-14.41.10 xfs ro,relatime,nouuid,norecovery,attr2,inode64,logbsize=64k,sunit=128,swidth=1536,noquota 0 0 > cat /proc/partitions major minor #blocks name 8 16 11717836800 sdb 8 17 11717836766 sdb1 8 0 23435673600 sda 8 1 23435673566 sda1 8 32 142344192 sdc 8 33 12699351 sdc1 8 34 8305605 sdc2 8 35 1060290 sdc3 8 36 1 sdc4 8 37 8393931 sdc5 8 38 15735636 sdc6 8 39 10490413 sdc7 8 40 83883366 sdc8 8 48 7811891200 sdd 8 49 7811891166 sdd1 254 0 7811887104 dm-0 254 1 11717832704 dm-1 254 2 1073741824 dm-2 254 3 1073741824 dm-3 254 6 8589934592 dm-6 254 7 134217728 dm-7 254 8 1610612736 dm-8 254 9 536870912 dm-9 254 12 12984320 dm-12 254 14 4194304 dm-14 254 15 29360128 dm-15 254 16 100663296 dm-16 254 19 38985728 dm-19 254 23 3158016 dm-23 254 25 2555904 dm-25 254 27 2097152 dm-27 254 5 1601536 dm-5 254 11 6733824 dm-11 254 22 3207168 dm-22 254 17 1519616 dm-17 254 4 1073741824 dm-4 254 18 1073741824 dm-18 254 10 1241088 dm-10 254 13 1073741824 dm-13 254 20 1073741824 dm-20 sudo xfs_info /Share meta-data=/dev/mapper/HnS-Share isize=256 agcount=4, agsize=100663280 blks = sectsz=512 attr=2 data = bsize=4096 blocks=402653120, imaxpct=5 = sunit=16 swidth=192 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=32768, version=2 = sectsz=512 sunit=16 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 lvm config? How do I include that? [1007383.689492] xfsdump: page allocation failure: order:4, mode:0x10c0d0 [1007383.689496] Pid: 29968, comm: xfsdump Not tainted 3.8.2-Isht-Van #3 [1007383.689499] Call Trace: [1007383.689508] [] warn_alloc_failed+0xe7/0x130 [1007383.689514] [] ? on_each_cpu_mask+0x42/0xb0 [1007383.689518] [] __alloc_pages_nodemask+0x7f5/0xb10 [1007383.689524] [] alloc_pages_current+0xb3/0x180 [1007383.689527] [] __get_free_pages+0x9/0x40 tive_anon:617752kB inactive_anon:285044kB active_file:8660kB inactive_file:20299 48kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:3325868kB man aged:3354316kB mlocked:0kB dirty:0kB writeback:0kB mapped:632kB shmem:12kB slab_ reclaimable:164284kB slab_unreclaimable:6852kB kernel_stack:328kB pagetables:157 2kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_u nreclaimable? no [1007383.493008] lowmem_reserve[]: 0 0 20916 20916 [1007383.493013] Node 1 Normal free:216420kB min:38964kB low:48704kB high:58444k B active_anon:3633180kB inactive_anon:1037492kB active_file:130260kB inactive_fi le:11115920kB unevictable:12220kB isolated(anon):0kB isolated(file):0kB present: 21417984kB managed:21352576kB mlocked:12220kB dirty:104kB writeback:0kB mapped:2 2788kB shmem:1568kB slab_reclaimable:4324888kB slab_unreclaimable:277036kB kerne l_stack:2968kB pagetables:27504kB unstable:0kB bounce:0kB free_cma:0kB writeback _tmp:0kB pages_scanned:0 all_unreclaimable? no [1007383.493022] lowmem_reserve[]: 0 0 0 0 [1007383.493027] Node 0 Normal: 33494*4kB (UEM) 5724*8kB (UEM) 1114*16kB (UEM) 3 [1007383.689531] [] kmalloc_order_trace+0x34/0xe0 [1007383.689534] [] __kmalloc+0x186/0x190 [1007383.689541] [] xfs_attrlist_by_handle+0x8c/0x110 [1007383.689544] [] xfs_file_ioctl+0x437/0xb60 [1007383.689550] [] ? local_clock+0x4f/0x60 [1007383.689554] [] ? lock_release_holdtime.part.21+0x124/0x170 [1007383.689558] [] ? lg_local_unlock+0x1e/0x60 [1007383.689563] [] ? mntput_no_expire+0x45/0x160 [1007383.689567] [] do_vfs_ioctl+0x91/0x530 [1007383.689571] [] ? ____fput+0x9/0x10 [1007383.689574] [] sys_ioctl+0x91/0xb0 [1007383.689579] [] ? trace_hardirqs_on_thunk+0x3a/0x3f [1007383.689584] [] system_call_fastpath+0x16/0x1b [1007383.689585] Mem-Info: [1007383.689587] Node 0 Normal per-cpu: [1007383.689590] CPU 0: hi: 186, btch: 31 usd: 0 [1007383.689592] CPU 1: hi: 186, btch: 31 usd: 0 [1007383.689594] CPU 2: hi: 186, btch: 31 usd: 0 [1007383.689596] CPU 3: hi: 186, btch: 31 usd: 0 [1007383.689597] CPU 4: hi: 186, btch: 31 usd: 0 [1007383.689599] CPU 5: hi: 186, btch: 31 usd: 0 [1007383.689601] CPU 6: hi: 186, btch: 31 usd: 0 [1007383.689603] CPU 7: hi: 186, btch: 31 usd: 0 [1007383.689605] CPU 8: hi: 186, btch: 31 usd: 0 [1007383.689606] CPU 9: hi: 186, btch: 31 usd: 0 [1007383.689608] CPU 10: hi: 186, btch: 31 usd: 0 [1007383.689610] CPU 11: hi: 186, btch: 31 usd: 0 [1007383.689611] Node 1 DMA per-cpu: [1007383.689613] CPU 0: hi: 0, btch: 1 usd: 0 [1007383.689615] CPU 1: hi: 0, btch: 1 usd: 0 [1007383.689617] CPU 2: hi: 0, btch: 1 usd: 0 [1007383.689618] CPU 3: hi: 0, btch: 1 usd: 0 [1007383.689620] CPU 4: hi: 0, btch: 1 usd: 0 [1007383.689622] CPU 5: hi: 0, btch: 1 usd: 0 [1007383.689624] CPU 6: hi: 0, btch: 1 usd: 0 [1007383.689625] CPU 7: hi: 0, btch: 1 usd: 0 [1007383.689627] CPU 8: hi: 0, btch: 1 usd: 0 [1007383.689629] CPU 9: hi: 0, btch: 1 usd: 0 [1007383.689631] CPU 10: hi: 0, btch: 1 usd: 0 [1007383.689632] CPU 11: hi: 0, btch: 1 usd: 0 [1007383.689633] Node 1 DMA32 per-cpu: [1007383.689636] CPU 0: hi: 186, btch: 31 usd: 0 [1007383.689638] CPU 1: hi: 186, btch: 31 usd: 0 [1007383.689639] CPU 2: hi: 186, btch: 31 usd: 0 [1007383.689641] CPU 3: hi: 186, btch: 31 usd: 0 [1007383.689643] CPU 4: hi: 186, btch: 31 usd: 0 [1007383.689645] CPU 5: hi: 186, btch: 31 usd: 0 [1007383.689647] CPU 6: hi: 186, btch: 31 usd: 0 [1007383.689648] CPU 7: hi: 186, btch: 31 usd: 0 [1007383.689650] CPU 8: hi: 186, btch: 31 usd: 0 [1007383.689652] CPU 9: hi: 186, btch: 31 usd: 0 [1007383.689653] CPU 10: hi: 186, btch: 31 usd: 0 [1007383.689655] CPU 11: hi: 186, btch: 31 usd: 0 [1007383.689656] Node 1 Normal per-cpu: [1007383.689659] CPU 0: hi: 186, btch: 31 usd: 0 [1007383.689660] CPU 1: hi: 186, btch: 31 usd: 0 [1007383.689662] CPU 2: hi: 186, btch: 31 usd: 0 [1007383.689664] CPU 3: hi: 186, btch: 31 usd: 0 [1007383.689666] CPU 4: hi: 186, btch: 31 usd: 0 [1007383.689667] CPU 5: hi: 186, btch: 31 usd: 0 [1007383.689669] CPU 6: hi: 186, btch: 31 usd: 0 [1007383.689671] CPU 7: hi: 186, btch: 31 usd: 0 [1007383.689673] CPU 8: hi: 186, btch: 31 usd: 0 [1007383.689674] CPU 9: hi: 186, btch: 31 usd: 0 [1007383.689676] CPU 10: hi: 186, btch: 31 usd: 0 [1007383.689678] CPU 11: hi: 186, btch: 31 usd: 0 [1007383.689682] active_anon:4733571 inactive_anon:579997 isolated_anon:0 [1007383.689682] active_file:101211 inactive_file:4310054 isolated_file:0 [1007383.689682] unevictable:6242 dirty:33 writeback:0 unstable:0 [1007383.689682] free:170040 slab_reclaimable:1674771 slab_unreclaimable:144935 [1007383.689682] mapped:24541 shmem:985 pagetables:19737 bounce:0 [1007383.689682] free_cma:0 [1007383.689685] Node 0 Normal free:206820kB min:45064kB low:56328kB high:67596kB active_anon:14683352kB inactive_anon:997452kB active_file:265924kB inactive_file:4103448kB unevictable:12748kB isolated(anon):0kB isolated(file):0kB present:24772608kB managed:24760764kB mlocked:12748kB dirty:28kB writeback:0kB mapped:74744kB shmem:2360kB slab_reclaimable:2209408kB slab_unreclaimable:295852kB kernel_stack:3920kB pagetables:49872kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [1007383.689692] lowmem_reserve[]: 0 0 0 0 [1007383.689695] Node 1 DMA free:15964kB min:28kB low:32kB high:40kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15708kB managed:15964kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:0kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? yes [1007383.689700] lowmem_reserve[]: 0 3247 24163 24163 [1007383.689703] Node 1 DMA32 free:234416kB min:6048kB low:7560kB high:9072kB active_anon:617752kB inactive_anon:285044kB active_file:8660kB inactive_file:2028580kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:3325868kB managed:3354316kB mlocked:0kB dirty:0kB writeback:0kB mapped:632kB shmem:12kB slab_reclaimable:164284kB slab_unreclaimable:6852kB kernel_stack:328kB pagetables:1572kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [1007383.689708] lowmem_reserve[]: 0 0 20916 20916 [1007383.689712] Node 1 Normal free:222960kB min:38964kB low:48704kB high:58444kB active_anon:3633180kB inactive_anon:1037492kB active_file:130260kB inactive_file:11108188kB unevictable:12220kB isolated(anon):0kB isolated(file):0kB present:21417984kB managed:21352576kB mlocked:12220kB dirty:104kB writeback:0kB mapped:22788kB shmem:1568kB slab_reclaimable:4325392kB slab_unreclaimable:277036kB kernel_stack:2968kB pagetables:27504kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [1007383.689717] lowmem_reserve[]: 0 0 0 0 [1007383.689720] Node 0 Normal: 34182*4kB (UEM) 5980*8kB (UEM) 1121*16kB (UEM) 41*32kB (UEM) 8*64kB (EMR) 1*128kB (R) 0*256kB 1*512kB (R) 1*1024kB (R) 1*2048kB (R) 0*4096kB = 208040kB [1007383.689735] Node 1 DMA: 1*4kB (U) 1*8kB (U) 1*16kB (U) 2*32kB (U) 2*64kB (U) 1*128kB (U) 1*256kB (U) 0*512kB 1*1024kB (U) 1*2048kB (R) 3*4096kB (M) = 15964kB [1007383.689748] Node 1 DMA32: 37794*4kB (UEM) 7663*8kB (UEM) 1333*16kB (UEMR) 21*32kB (M) 0*64kB 1*128kB (R) 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 234608kB [1007383.689759] Node 1 Normal: 15967*4kB (UEM) 3493*8kB (UEM) 7899*16kB (UEM) 73*32kB (UMR) 6*64kB (MR) 3*128kB (MR) 1*256kB (R) 1*512kB (R) 1*1024kB (R) 0*2048kB 0*4096kB = 223092kB [1007383.689773] 4432031 total pagecache pages [1007383.689775] 19051 pages in swap cache [1007383.689777] Swap cache stats: add 100742, delete 81691, find 7476793/7477983 [1007383.689778] Free swap = 8029584kB [1007383.689780] Total swap = 8393924kB [1007383.831121] 12582911 pages RAM [1007383.831125] 210623 pages reserved [1007383.831127] 3059864 pages shared [1007383.831128] 9542960 pages non-shared From david@fromorbit.com Wed Apr 3 20:14:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D41CA7CBF for ; Wed, 3 Apr 2013 20:14:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C0838304064 for ; Wed, 3 Apr 2013 18:14:27 -0700 (PDT) X-ASG-Debug-ID: 1365038065-04cb6c1e7720c500001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id JxTVFt8aQwGAFd3A for ; Wed, 03 Apr 2013 18:14:25 -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: AjgRADPTXFF5LaeV/2dsb2JhbABDgwc2gju5JIUZBAGBDBd0gh8BAQQBOhwjBQsIAxUDCSUPBSUDIROIDgUNwEYVjWeBHQeDQAOTJYNFkQyDHyg Received: from ppp121-45-167-149.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.149]) by ipmail04.adl6.internode.on.net with ESMTP; 04 Apr 2013 11:44:24 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UNYkw-0002qI-Tq; Thu, 04 Apr 2013 12:14:22 +1100 Date: Thu, 4 Apr 2013 12:14:22 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed Message-ID: <20130404011422.GV17758@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed References: <1364958561-12440-1-git-send-email-david@fromorbit.com> <515C7F09.2080201@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515C7F09.2080201@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: 1365038065 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127106 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Apr 03, 2013 at 02:12:09PM -0500, Mark Tinguely wrote: > On 04/02/13 22:09, Dave Chinner wrote: > >From: Dave Chinner > > > >Filesystems are occasionally being shut down with this error: > > > >xfs_trans_ail_delete_bulk: attempting to delete a log item that is > >not in the AIL. > > > >It was diagnosed to be related to the EFI/EFD commit order when the > >EFI and EFD are in different checkpoints and the EFD is committed > >before the EFI here: > > > >http://oss.sgi.com/archives/xfs/2013-01/msg00082.html > > > >The real problem is that a single bit cannot fully describe the > >states that the EFI/EFD processing can be in. These completion > >states are: > > > >EFI EFI in AIL EFD Result > >committed/unpinned Yes committed OK > >committed/pinned No committed Shutdown > >uncommitted No committed Shutdown > > > > > >Note that the "result" field is what should happen, not what does > >happen. The current logic is broken and handles the first two cases > >correctly by luck. That is, the code will free the EFI if the > >XFS_EFI_COMMITTED bit is*not* set, rather than if it is set. The > >inverted logic "works" because if both EFI and EFD are committed, > >then the first __xfs_efi_release() call clears the XFS_EFI_COMMITTED > >bit, and the second frees the EFI item. Hence as long as > >xfs_efi_item_committed() has been called, everything appears to be > >fine. > > > >It is the third case where the logic fails - where > >xfs_efd_item_committed() is called before xfs_efi_item_committed(), > >and that results in the EFI being freed before it has been > >committed. That is the bug that triggered the shutdown, d hence > >keeping track of whether the EFI has been committed or not is > >insufficient to correctly order the EFI/EFD operations w.r.t. the > >AIL. > > > > I think the exist xfs_efi routines are working correctly. Speaking as the person whose designed and wrote the current EFI/EFD code in question here, I think it is broken and only working by chance. Hint: there is no comment anywhere (code or commit message) that is works by a tricky piece of logic that first clears the committed bit and then frees the object when it is not set the second time through. I *always* write comments about tricky logic like this when it is intentional, so that when I look at it a couple of years later I know exactly why the logic is correct even though it appears wrong. No comments therefore means this logic was not the intended behaviour and therefore only working by chance. > the xfs_trans_committed_bulk() for the efi does the IOP_COMMITTED > (sets the XFS_EFI_COMMITTED bit), add the entry to the AIL and then > an IOP_UNPIN() which clears the XFS_EFI_COMMITTED since it is set, > it should not release the efi and remove the entry from the AIL. It > also correctly detects if the EFD is committed before the EFI by > shutting down the filesystem. But that behaviour is wrong - seeing the EFD before the EFI is not a bug, just an indication that we have interleaved checkpoints being committed concurrently. The fact that we've seen the EFD means when we can simply free the EFI once it has been committed. The AIL is where the ordering of journalled objects matter; the order in which iclog commit callbacks are run does not affect that. > This patch seems to paper over why the EFD will come before the EFI. > > The CIL commits are in the correct order - protected by the > xlog_wait() but the callbacks are out of order. The design is such that what is physically on disk is correctly ordered, but we don't care about the callback order as the AIL is where the *in-memory object order* is correctly established. > My previous patch fixed the callback from happening out of sequence. It may have, but it serialised all CIL checkpoints, not just the commit record order. That approach to fixing the bug is simply a non-starter. Why are you raising this now when you were silent about it 3 months ago when this bug was first being discussed and the EFI/EFD handling bug was initially raised? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 3 20:31:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5AD557CBF for ; Wed, 3 Apr 2013 20:31:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D935EAC005 for ; Wed, 3 Apr 2013 18:31:14 -0700 (PDT) X-ASG-Debug-ID: 1365039072-04cbb01fb72049a0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 7Es8zgEqEJ02gSyu for ; Wed, 03 Apr 2013 18:31:12 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjkRAJDWXFF5LaeV/2dsb2JhbABDgwc2gju5JIUZBAGBDBd0gh8BAQQBJxMcIwULCAMVAwklDwUlAyETiA4FDcBGFY1ngR0Hg0ADkyWDRZEMgx8o Received: from ppp121-45-167-149.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.149]) by ipmail04.adl6.internode.on.net with ESMTP; 04 Apr 2013 12:01:11 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UNZ1C-0002s4-QM; Thu, 04 Apr 2013 12:31:10 +1100 Date: Thu, 4 Apr 2013 12:31:10 +1100 From: Dave Chinner To: Mark Tinguely Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed Message-ID: <20130404013110.GW17758@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed References: <1364958561-12440-1-git-send-email-david@fromorbit.com> <515C7F09.2080201@sgi.com> <515C8732.3000902@sandeen.net> <515C98E1.2010700@sandeen.net> <515CA2EE.605@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515CA2EE.605@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: 1365039072 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127108 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Apr 03, 2013 at 04:45:18PM -0500, Mark Tinguely wrote: > On 04/03/13 16:02, Eric Sandeen wrote: > >On 4/3/13 2:46 PM, Eric Sandeen wrote: > >>On 4/3/13 2:12 PM, Mark Tinguely wrote: > >>>On 04/02/13 22:09, Dave Chinner wrote: > >>>>From: Dave Chinner > >>>> > >>>>Filesystems are occasionally being shut down with this error: > >>>> > >>>>xfs_trans_ail_delete_bulk: attempting to delete a log item that is > >>>>not in the AIL. > >>>> > >>>>It was diagnosed to be related to the EFI/EFD commit order when the > >>>>EFI and EFD are in different checkpoints and the EFD is committed > >>>>before the EFI here: > >>>> > >>>>http://oss.sgi.com/archives/xfs/2013-01/msg00082.html > >>>> > >>>>The real problem is that a single bit cannot fully describe the > >>>>states that the EFI/EFD processing can be in. These completion > >>>>states are: > >>>> > >>>>EFI EFI in AIL EFD Result > >>>>committed/unpinned Yes committed OK > >>>>committed/pinned No committed Shutdown > >>>>uncommitted No committed Shutdown > >>>> > >>>> > >>>>Note that the "result" field is what should happen, not what does > >>>>happen. The current logic is broken and handles the first two cases > >>>>correctly by luck. That is, the code will free the EFI if the > >>>>XFS_EFI_COMMITTED bit is*not* set, rather than if it is set. The > >>>>inverted logic "works" because if both EFI and EFD are committed, > >>>>then the first __xfs_efi_release() call clears the XFS_EFI_COMMITTED > >>>>bit, and the second frees the EFI item. Hence as long as > >>>>xfs_efi_item_committed() has been called, everything appears to be > >>>>fine. > >>>> > >>>>It is the third case where the logic fails - where > >>>>xfs_efd_item_committed() is called before xfs_efi_item_committed(), > >>>>and that results in the EFI being freed before it has been > >>>>committed. That is the bug that triggered the shutdown, d hence > >>>>keeping track of whether the EFI has been committed or not is > >>>>insufficient to correctly order the EFI/EFD operations w.r.t. the > >>>>AIL. > >>>> > >>> > >>>I think the exist xfs_efi routines are working correctly. > >>> > >>>the xfs_trans_committed_bulk() for the efi does the IOP_COMMITTED > >>>(sets the XFS_EFI_COMMITTED bit), add the entry to the AIL and then > >>>an IOP_UNPIN() which clears the XFS_EFI_COMMITTED since it is set, it > >>>should not release the efi and remove the entry from the AIL. It also > >>>correctly detects if the EFD is committed before the EFI by shutting > >>>down the filesystem. > >> > >>Well hang on, not everything can be cool in EFI-land here, if nothing > >>else this: > >> > >>__xfs_efi_release( > >> struct xfs_efi_log_item *efip) > >>{ > >> struct xfs_ail *ailp = efip->efi_item.li_ailp; > >> > >> if (!test_and_clear_bit(XFS_EFI_COMMITTED,&efip->efi_flags)) { > >> spin_lock(&ailp->xa_lock); > >> /* xfs_trans_ail_delete() drops the AIL lock. */ > >> xfs_trans_ail_delete(ailp,&efip->efi_item, > >> SHUTDOWN_LOG_IO_ERROR); > >> xfs_efi_item_free(efip); > >> } > >>} > >> > >>seems obviously broken. > >> > >> * test_and_clear_bit - Clear a bit and return its old value > >> > >>so it is saying if XFS_EFI_COMMITED was *not* set, free the efi. > >>Which I think we must admit is broken. > >> > >>I have to get up to speed on this code, but it seems like at least > >>this much above is quite obviously broken, and the previously > >>proposed patch doesn't address it. Am I missing something? > > > >Or are you saying that it's working as designed, so that the first > >caller finds it set, clears it and does nothing, and the 2nd caller > >finds it unset, and frees it? help me out here ;) > > > >-Eric > > > > Yes. The order is IOP_COMMITTED and then IOP_UNPIN: Batching means you can get: IOP_COMMITTED(a) IOP_COMMITTED(b) IOP_COMMITTED(c) ..... IOP_COMMITTED(6) AIL_INSERT(a) AIL_INSERT(b) AIL_INSERT(c) ..... AIL_INSERT(6) IOP_UNPIN(a) IOP_UNPIN(b) IOP_UNPIN(c) ..... IOP_UNPIN(6) So that means at minimum we have to handle the EFI committed/pinned case when the EFD is committed as well. This is what the commit b199c8a (xfs: Pull EFI/EFD handling out from under the AIL lock) did - it moved the COMMITTED bit from the EFI IOP_UNPIN() callback to the IOP_COMMITTED() callback. But then the IOP_UNPIN() callback has to handle the same case by freeing the EFI as well, and hence the XFS_EFI_COMMITTED() bit became a proxy reference count. Which doesn't handle the third case, which is the EFD being processed before the EFI, and hence we get a shutdown because the EFD is trying to remove the EFI from the AIL before it is inserted. > The code makes sure the sequence EFI and then EFD are done in order. No, it doesn't ensure they are done in order - it *works* when they are done in order. If it ensured they were done in order, then the EFD commit would not be allowed to proceed until the EFI wsa committed. The code does not do that, not does it need to. But it needs to handle the EFD being processed before the EFI... Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs@tlinx.org Wed Apr 3 22:39:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 537697CBF for ; Wed, 3 Apr 2013 22:39:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AC9E0AC006 for ; Wed, 3 Apr 2013 20:39:50 -0700 (PDT) X-ASG-Debug-ID: 1365046783-04cbb01fb720d830001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id yjDtUKEgQesunBGF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 03 Apr 2013 20:39:44 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r343dfR8024772 for ; Wed, 3 Apr 2013 20:39:43 -0700 Message-ID: <515CF5FB.30506@tlinx.org> Date: Wed, 03 Apr 2013 20:39:39 -0700 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss Subject: Re: xfsdump having problems dumping attributes again (cannot allocate memory) References: <515CB2C1.1050109@tlinx.org> X-ASG-Orig-Subj: Re: xfsdump having problems dumping attributes again (cannot allocate memory) In-Reply-To: <515CB2C1.1050109@tlinx.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1365046784 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127116 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- here's the complete output of a run -- it didn't have problems till it hit 978GB out of 1370GB (~70%)... xfsdump -b 1073741824 -l 0 -L Share - /Share | ( su -f -m backup -c " umask 007;nice -19 ionice -c3 mbuffer -s 512k -m 10M -q > Share/Share-130403-0-1222.dump " ) xfsdump: using file dump (drive_simple) strategy xfsdump: version 3.1.2 (dump format 3.0) xfsdump: WARNING: most recent level 0 dump was interrupted, but not resuming that dump since resume (-R) option not specified xfsdump: level 0 dump of Ishtar:/Share xfsdump: dump date: Wed Apr 3 12:22:32 2013 xfsdump: session id: f18b6ef2-097a-4f42-a08e-98e6a76bfb51 xfsdump: session label: "Share" xfsdump: ino map phase 1: constructing initial dump list xfsdump: ino map phase 2: skipping (no pruning necessary) xfsdump: ino map phase 3: skipping (only one dump stream) xfsdump: ino map construction complete xfsdump: estimated dump size: 1473013737344 bytes xfsdump: creating dump session media file 0 (media 0, file 0) xfsdump: dumping ino map xfsdump: dumping directories xfsdump: dumping non-directory files in @ 0.0 KiB/s, out @ 0.0 KiB/s, 975 GiB total, buffer 0% full xfsdump: WARNING: could not get list of non-root attributes for nondir ino 3309973288: Cannot allocate memory (12) non-root attributes for nondir ino 3412843308: Cannot allocate memory (12) root attributes for nondir ino 3412843308: Cannot allocate memory (12) non-root attributes for nondir ino 3412843504: Cannot allocate memory (12) non-root attributes for nondir ino 3412844330: Cannot allocate memory (12) root attributes for nondir ino 3412844330: Cannot allocate memory (12) root attributes for nondir ino 3412885294: Cannot allocate memory (12) non-root attributes for nondir ino 3412893285: Cannot allocate memory (12) root attributes for nondir ino 3412893285: Cannot allocate memory (12) secure attributes for nondir ino 3412893285: Cannot allocate memory (12) non-root attributes for nondir ino 3412893290: Cannot allocate memory (12) root attributes for nondir ino 3412893290: Cannot allocate memory (12) secure attributes for nondir ino 3412893290: Cannot allocate memory (12) non-root attributes for nondir ino 3412894183: Cannot allocate memory (12) root attributes for nondir ino 3412894183: Cannot allocate memory (12) secure attributes for nondir ino 3412894183: Cannot allocate memory (12) non-root attributes for nondir ino 3412894518: Cannot allocate memory (12) non-root attributes for nondir ino 3412894983: Cannot allocate memory (12) root attributes for nondir ino 3412894983: Cannot allocate memory (12) secure attributes for nondir ino 3412894983: Cannot allocate memory (12) non-root attributes for nondir ino 3412896516: Cannot allocate memory (12) root attributes for nondir ino 3412896516: Cannot allocate memory (12) secure attributes for nondir ino 3412896516: Cannot allocate memory (12) non-root attributes for nondir ino 3412896518: Cannot allocate memory (12) non-root attributes for nondir ino 3412896522: Cannot allocate memory (12) non-root attributes for nondir ino 3412896541: Cannot allocate memory (12) root attributes for nondir ino 3412896541: Cannot allocate memory (12) secure attributes for nondir ino 3412896541: Cannot allocate memory (12) non-root attributes for nondir ino 3412896553: Cannot allocate memory (12) root attributes for nondir ino 3412896553: Cannot allocate memory (12) secure attributes for nondir ino 3412896553: Cannot allocate memory (12) non-root attributes for nondir ino 3412902179: Cannot allocate memory (12) non-root attributes for nondir ino 3412902208: Cannot allocate memory (12) root attributes for nondir ino 3412902208: Cannot allocate memory (12) secure attributes for nondir ino 3412902208: Cannot allocate memory (12) non-root attributes for nondir ino 3412902837: Cannot allocate memory (12) non-root attributes for nondir ino 3412903713: Cannot allocate memory (12) non-root attributes for nondir ino 3412904756: Cannot allocate memory (12) non-root attributes for nondir ino 3412905059: Cannot allocate memory (12) non-root attributes for nondir ino 3412905243: Cannot allocate memory (12) non-root attributes for nondir ino 3412905245: Cannot allocate memory (12) root attributes for nondir ino 3412905245: Cannot allocate memory (12) secure attributes for nondir ino 3412905245: Cannot allocate memory (12) non-root attributes for nondir ino 3412905256: Cannot allocate memory (12) non-root attributes for nondir ino 3412906017: Cannot allocate memory (12) non-root attributes for nondir ino 3412906032: Cannot allocate memory (12) non-root attributes for nondir ino 3412906292: Cannot allocate memory (12) non-root attributes for nondir ino 3412906345: Cannot allocate memory (12) root attributes for nondir ino 3412906345: Cannot allocate memory (12) secure attributes for nondir ino 3412906345: Cannot allocate memory (12) non-root attributes for nondir ino 3412906346: Cannot allocate memory (12) non-root attributes for nondir ino 3412906348: Cannot allocate memory (12) non-root attributes for nondir ino 3412906355: Cannot allocate memory (12) non-root attributes for nondir ino 3412906359: Cannot allocate memory (12) non-root attributes for nondir ino 3412906526: Cannot allocate memory (12) non-root attributes for nondir ino 3412906581: Cannot allocate memory (12) non-root attributes for nondir ino 3412906760: Cannot allocate memory (12) non-root attributes for nondir ino 3412907059: Cannot allocate memory (12) root attributes for nondir ino 3412907059: Cannot allocate memory (12) non-root attributes for nondir ino 3412909572: Cannot allocate memory (12) root attributes for nondir ino 3412910106: Cannot allocate memory (12) non-root attributes for nondir ino 3412910107: Cannot allocate memory (12) root attributes for nondir ino 3412910107: Cannot allocate memory (12) secure attributes for nondir ino 3412910107: Cannot allocate memory (12) non-root attributes for nondir ino 3412910108: Cannot allocate memory (12) root attributes for nondir ino 3412910108: Cannot allocate memory (12) non-root attributes for nondir ino 3412910113: Cannot allocate memory (12) non-root attributes for nondir ino 3412910123: Cannot allocate memory (12) root attributes for nondir ino 3412910123: Cannot allocate memory (12) secure attributes for nondir ino 3412910123: Cannot allocate memory (12) non-root attributes for nondir ino 3412910124: Cannot allocate memory (12) root attributes for nondir ino 3412910124: Cannot allocate memory (12) secure attributes for nondir ino 3412910124: Cannot allocate memory (12) non-root attributes for nondir ino 3412910126: Cannot allocate memory (12) non-root attributes for nondir ino 3412910608: Cannot allocate memory (12) root attributes for nondir ino 3412910608: Cannot allocate memory (12) non-root attributes for nondir ino 3412910609: Cannot allocate memory (12) root attributes for nondir ino 3412910609: Cannot allocate memory (12) non-root attributes for nondir ino 3412911190: Cannot allocate memory (12) root attributes for nondir ino 3412911190: Cannot allocate memory (12) secure attributes for nondir ino 3412911190: Cannot allocate memory (12) non-root attributes for nondir ino 3412911191: Cannot allocate memory (12) root attributes for nondir ino 3412911191: Cannot allocate memory (12) secure attributes for nondir ino 3412911191: Cannot allocate memory (12) non-root attributes for nondir ino 3412911196: Cannot allocate memory (12) root attributes for nondir ino 3412911196: Cannot allocate memory (12) secure attributes for nondir ino 3412911196: Cannot allocate memory (12) non-root attributes for nondir ino 3412911198: Cannot allocate memory (12) root attributes for nondir ino 3412911198: Cannot allocate memory (12) secure attributes for nondir ino 3412911198: Cannot allocate memory (12) non-root attributes for nondir ino 3412911199: Cannot allocate memory (12) root attributes for nondir ino 3412911199: Cannot allocate memory (12) secure attributes for nondir ino 3412911199: Cannot allocate memory (12) non-root attributes for nondir ino 3412911200: Cannot allocate memory (12) root attributes for nondir ino 3412911200: Cannot allocate memory (12) secure attributes for nondir ino 3412911200: Cannot allocate memory (12) non-root attributes for nondir ino 3412911201: Cannot allocate memory (12) root attributes for nondir ino 3412911201: Cannot allocate memory (12) secure attributes for nondir ino 3412911201: Cannot allocate memory (12) non-root attributes for nondir ino 3412911202: Cannot allocate memory (12) root attributes for nondir ino 3412911202: Cannot allocate memory (12) secure attributes for nondir ino 3412911202: Cannot allocate memory (12) non-root attributes for nondir ino 3412911203: Cannot allocate memory (12) root attributes for nondir ino 3412911203: Cannot allocate memory (12) secure attributes for nondir ino 3412911203: Cannot allocate memory (12) non-root attributes for nondir ino 3412911213: Cannot allocate memory (12) root attributes for nondir ino 3412912238: Cannot allocate memory (12) non-root attributes for nondir ino 3412912254: Cannot allocate memory (12) root attributes for nondir ino 3412912254: Cannot allocate memory (12) non-root attributes for nondir ino 3412912686: Cannot allocate memory (12) non-root attributes for nondir ino 3412912688: Cannot allocate memory (12) non-root attributes for nondir ino 3412912692: Cannot allocate memory (12) root attributes for nondir ino 3412912692: Cannot allocate memory (12) non-root attributes for nondir ino 3412912910: Cannot allocate memory (12) root attributes for nondir ino 3412912910: Cannot allocate memory (12) non-root attributes for nondir ino 3412912921: Cannot allocate memory (12) root attributes for nondir ino 3412912921: Cannot allocate memory (12) secure attributes for nondir ino 3412912921: Cannot allocate memory (12) non-root attributes for nondir ino 3412915235: Cannot allocate memory (12) non-root attributes for nondir ino 3412916411: Cannot allocate memory (12) non-root attributes for nondir ino 3412918109: Cannot allocate memory (12) root attributes for nondir ino 3412918109: Cannot allocate memory (12) non-root attributes for nondir ino 3412918117: Cannot allocate memory (12) non-root attributes for nondir ino 3412918118: Cannot allocate memory (12) non-root attributes for nondir ino 3412918125: Cannot allocate memory (12) non-root attributes for nondir ino 3412918126: Cannot allocate memory (12) non-root attributes for nondir ino 3412920099: Cannot allocate memory (12) root attributes for nondir ino 3412920099: Cannot allocate memory (12) secure attributes for nondir ino 3412920099: Cannot allocate memory (12) non-root attributes for nondir ino 3412920100: Cannot allocate memory (12) non-root attributes for nondir ino 3412920335: Cannot allocate memory (12) non-root attributes for nondir ino 3412920923: Cannot allocate memory (12) root attributes for nondir ino 3412921382: Cannot allocate memory (12) non-root attributes for nondir ino 3412921654: Cannot allocate memory (12) non-root attributes for nondir ino 3412923690: Cannot allocate memory (12) root attributes for nondir ino 3412923690: Cannot allocate memory (12) secure attributes for nondir ino 3412923690: Cannot allocate memory (12) non-root attributes for nondir ino 3412923691: Cannot allocate memory (12) root attributes for nondir ino 3412923691: Cannot allocate memory (12) secure attributes for nondir ino 3412923691: Cannot allocate memory (12) non-root attributes for nondir ino 3412923692: Cannot allocate memory (12) non-root attributes for nondir ino 3412924421: Cannot allocate memory (12) root attributes for nondir ino 3412924421: Cannot allocate memory (12) secure attributes for nondir ino 3412924421: Cannot allocate memory (12) non-root attributes for nondir ino 3412924423: Cannot allocate memory (12) non-root attributes for nondir ino 3412925450: Cannot allocate memory (12) root attributes for nondir ino 3412925451: Cannot allocate memory (12) secure attributes for nondir ino 3412925451: Cannot allocate memory (12) root attributes for nondir ino 3412925454: Cannot allocate memory (12) secure attributes for nondir ino 3412925454: Cannot allocate memory (12) non-root attributes for nondir ino 3412925456: Cannot allocate memory (12) root attributes for nondir ino 3412925456: Cannot allocate memory (12) non-root attributes for nondir ino 3412925712: Cannot allocate memory (12) root attributes for nondir ino 3412925712: Cannot allocate memory (12) non-root attributes for nondir ino 3412928355: Cannot allocate memory (12) root attributes for nondir ino 3412928355: Cannot allocate memory (12) non-root attributes for nondir ino 3412932138: Cannot allocate memory (12) root attributes for nondir ino 3412932138: Cannot allocate memory (12) secure attributes for nondir ino 3412932138: Cannot allocate memory (12) root attributes for nondir ino 3412932142: Cannot allocate memory (12) secure attributes for nondir ino 3412932142: Cannot allocate memory (12) non-root attributes for nondir ino 3412932146: Cannot allocate memory (12) non-root attributes for nondir ino 3412932147: Cannot allocate memory (12) root attributes for nondir ino 3412932147: Cannot allocate memory (12) secure attributes for nondir ino 3412932147: Cannot allocate memory (12) non-root attributes for nondir ino 3412932148: Cannot allocate memory (12) root attributes for nondir ino 3412932148: Cannot allocate memory (12) non-root attributes for nondir ino 3412933717: Cannot allocate memory (12) non-root attributes for nondir ino 3412934419: Cannot allocate memory (12) non-root attributes for nondir ino 3412934422: Cannot allocate memory (12) root attributes for nondir ino 3412934422: Cannot allocate memory (12) non-root attributes for nondir ino 3412934423: Cannot allocate memory (12) root attributes for nondir ino 3412934423: Cannot allocate memory (12) secure attributes for nondir ino 3412934423: Cannot allocate memory (12) non-root attributes for nondir ino 3412934424: Cannot allocate memory (12) root attributes for nondir ino 3412934424: Cannot allocate memory (12) secure attributes for nondir ino 3412934424: Cannot allocate memory (12) non-root attributes for nondir ino 3412934433: Cannot allocate memory (12) root attributes for nondir ino 3412934433: Cannot allocate memory (12) non-root attributes for nondir ino 3412935967: Cannot allocate memory (12) root attributes for nondir ino 3412935967: Cannot allocate memory (12) secure attributes for nondir ino 3412935984: Cannot allocate memory (12) non-root attributes for nondir ino 3412935985: Cannot allocate memory (12) root attributes for nondir ino 3412935985: Cannot allocate memory (12) secure attributes for nondir ino 3412935985: Cannot allocate memory (12) non-root attributes for nondir ino 3412935986: Cannot allocate memory (12) root attributes for nondir ino 3412935986: Cannot allocate memory (12) non-root attributes for nondir ino 3412935987: Cannot allocate memory (12) non-root attributes for nondir ino 3412936513: Cannot allocate memory (12) root attributes for nondir ino 3412938510: Cannot allocate memory (12) non-root attributes for nondir ino 3412938511: Cannot allocate memory (12) root attributes for nondir ino 3412941368: Cannot allocate memory (12) non-root attributes for nondir ino 3412946985: Cannot allocate memory (12) root attributes for nondir ino 3412946985: Cannot allocate memory (12) secure attributes for nondir ino 3412946985: Cannot allocate memory (12) non-root attributes for nondir ino 3412946995: Cannot allocate memory (12) root attributes for nondir ino 3412948260: Cannot allocate memory (12) secure attributes for nondir ino 3412948260: Cannot allocate memory (12) non-root attributes for nondir ino 3412948261: Cannot allocate memory (12) non-root attributes for nondir ino 3412949045: Cannot allocate memory (12) root attributes for nondir ino 3412949045: Cannot allocate memory (12) root attributes for nondir ino 3412950535: Cannot allocate memory (12) secure attributes for nondir ino 3412950535: Cannot allocate memory (12) non-root attributes for nondir ino 3412950536: Cannot allocate memory (12) root attributes for nondir ino 3412950536: Cannot allocate memory (12) secure attributes for nondir ino 3412950536: Cannot allocate memory (12) non-root attributes for nondir ino 3412951869: Cannot allocate memory (12) root attributes for nondir ino 3412951869: Cannot allocate memory (12) non-root attributes for nondir ino 3412952117: Cannot allocate memory (12) root attributes for nondir ino 3412952117: Cannot allocate memory (12) secure attributes for nondir ino 3412952117: Cannot allocate memory (12) non-root attributes for nondir ino 3412953112: Cannot allocate memory (12) root attributes for nondir ino 3412953112: Cannot allocate memory (12) secure attributes for nondir ino 3412953112: Cannot allocate memory (12) non-root attributes for nondir ino 3412953113: Cannot allocate memory (12) root attributes for nondir ino 3412953113: Cannot allocate memory (12) non-root attributes for nondir ino 3412953146: Cannot allocate memory (12) root attributes for nondir ino 3412953146: Cannot allocate memory (12) secure attributes for nondir ino 3412953146: Cannot allocate memory (12) non-root attributes for nondir ino 3412953147: Cannot allocate memory (12) root attributes for nondir ino 3412953147: Cannot allocate memory (12) non-root attributes for nondir ino 3412953149: Cannot allocate memory (12) non-root attributes for nondir ino 3412953197: Cannot allocate memory (12) root attributes for nondir ino 3412953197: Cannot allocate memory (12) secure attributes for nondir ino 3412953197: Cannot allocate memory (12) non-root attributes for nondir ino 3412953198: Cannot allocate memory (12) root attributes for nondir ino 3412953198: Cannot allocate memory (12) secure attributes for nondir ino 3412953198: Cannot allocate memory (12) non-root attributes for nondir ino 3412953207: Cannot allocate memory (12) root attributes for nondir ino 3412953207: Cannot allocate memory (12) secure attributes for nondir ino 3412953207: Cannot allocate memory (12) non-root attributes for nondir ino 3412953208: Cannot allocate memory (12) root attributes for nondir ino 3412953208: Cannot allocate memory (12) secure attributes for nondir ino 3412953208: Cannot allocate memory (12) non-root attributes for nondir ino 3412953210: Cannot allocate memory (12) non-root attributes for nondir ino 3412953211: Cannot allocate memory (12) root attributes for nondir ino 3412953211: Cannot allocate memory (12) secure attributes for nondir ino 3412953211: Cannot allocate memory (12) non-root attributes for nondir ino 3412953212: Cannot allocate memory (12) root attributes for nondir ino 3412953212: Cannot allocate memory (12) secure attributes for nondir ino 3412953212: Cannot allocate memory (12) non-root attributes for nondir ino 3412953213: Cannot allocate memory (12) root attributes for nondir ino 3412953213: Cannot allocate memory (12) secure attributes for nondir ino 3412953213: Cannot allocate memory (12) non-root attributes for nondir ino 3412953214: Cannot allocate memory (12) root attributes for nondir ino 3412953214: Cannot allocate memory (12) root attributes for nondir ino 3412953388: Cannot allocate memory (12) secure attributes for nondir ino 3412953388: Cannot allocate memory (12) non-root attributes for nondir ino 3412953389: Cannot allocate memory (12) root attributes for nondir ino 3412953389: Cannot allocate memory (12) secure attributes for nondir ino 3412953389: Cannot allocate memory (12) non-root attributes for nondir ino 3412953390: Cannot allocate memory (12) root attributes for nondir ino 3412953390: Cannot allocate memory (12) secure attributes for nondir ino 3412953390: Cannot allocate memory (12) non-root attributes for nondir ino 3412953391: Cannot allocate memory (12) root attributes for nondir ino 3412953391: Cannot allocate memory (12) non-root attributes for nondir ino 3412953707: Cannot allocate memory (12) root attributes for nondir ino 3412953707: Cannot allocate memory (12) non-root attributes for nondir ino 3412953724: Cannot allocate memory (12) root attributes for nondir ino 3412953724: Cannot allocate memory (12) secure attributes for nondir ino 3412953724: Cannot allocate memory (12) non-root attributes for nondir ino 3412953726: Cannot allocate memory (12) root attributes for nondir ino 3412953726: Cannot allocate memory (12) secure attributes for nondir ino 3412953726: Cannot allocate memory (12) non-root attributes for nondir ino 3412953727: Cannot allocate memory (12) root attributes for nondir ino 3412953727: Cannot allocate memory (12) secure attributes for nondir ino 3412953727: Cannot allocate memory (12) non-root attributes for nondir ino 3412953856: Cannot allocate memory (12) root attributes for nondir ino 3412953856: Cannot allocate memory (12) secure attributes for nondir ino 3412953856: Cannot allocate memory (12) non-root attributes for nondir ino 3412953857: Cannot allocate memory (12) root attributes for nondir ino 3412953857: Cannot allocate memory (12) secure attributes for nondir ino 3412953857: Cannot allocate memory (12) non-root attributes for nondir ino 3412959056: Cannot allocate memory (12) root attributes for nondir ino 3412959056: Cannot allocate memory (12) secure attributes for nondir ino 3412959056: Cannot allocate memory (12) non-root attributes for nondir ino 3412959058: Cannot allocate memory (12) root attributes for nondir ino 3412959058: Cannot allocate memory (12) non-root attributes for nondir ino 3412959586: Cannot allocate memory (12) non-root attributes for nondir ino 3412959599: Cannot allocate memory (12) root attributes for nondir ino 3412959599: Cannot allocate memory (12) secure attributes for nondir ino 3412959599: Cannot allocate memory (12) non-root attributes for nondir ino 3412959600: Cannot allocate memory (12) non-root attributes for nondir ino 3412960286: Cannot allocate memory (12) non-root attributes for nondir ino 3412960314: Cannot allocate memory (12) non-root attributes for nondir ino 3412962569: Cannot allocate memory (12) root attributes for nondir ino 3412962569: Cannot allocate memory (12) secure attributes for nondir ino 3412962569: Cannot allocate memory (12) non-root attributes for nondir ino 3412962570: Cannot allocate memory (12) non-root attributes for nondir ino 3412962571: Cannot allocate memory (12) root attributes for nondir ino 3412962571: Cannot allocate memory (12) secure attributes for nondir ino 3412962571: Cannot allocate memory (12) non-root attributes for nondir ino 3412962587: Cannot allocate memory (12) root attributes for nondir ino 3412962587: Cannot allocate memory (12) secure attributes for nondir ino 3412962587: Cannot allocate memory (12) non-root attributes for nondir ino 3412962588: Cannot allocate memory (12) root attributes for nondir ino 3412962588: Cannot allocate memory (12) secure attributes for nondir ino 3412962588: Cannot allocate memory (12) non-root attributes for nondir ino 3412962589: Cannot allocate memory (12) non-root attributes for nondir ino 3412962632: Cannot allocate memory (12) non-root attributes for nondir ino 3412984323: Cannot allocate memory (12) root attributes for nondir ino 3412984323: Cannot allocate memory (12) non-root attributes for nondir ino 3412984580: Cannot allocate memory (12) non-root attributes for nondir ino 3412984582: Cannot allocate memory (12) non-root attributes for nondir ino 3412984583: Cannot allocate memory (12) non-root attributes for nondir ino 3412984611: Cannot allocate memory (12) root attributes for nondir ino 3412984611: Cannot allocate memory (12) non-root attributes for nondir ino 3412984619: Cannot allocate memory (12) non-root attributes for nondir ino 3412984625: Cannot allocate memory (12) non-root attributes for nondir ino 3412984636: Cannot allocate memory (12) root attributes for nondir ino 3412984832: Cannot allocate memory (12) non-root attributes for nondir ino 3412984860: Cannot allocate memory (12) non-root attributes for nondir ino 3412984862: Cannot allocate memory (12) root attributes for nondir ino 3412984862: Cannot allocate memory (12) non-root attributes for nondir ino 3412984873: Cannot allocate memory (12) non-root attributes for nondir ino 4302043464: Cannot allocate memory (12) root attributes for nondir ino 4302043464: Cannot allocate memory (12) root attributes for nondir ino 4312168721: Cannot allocate memory (12) root attributes for nondir ino 4343158051: Cannot allocate memory (12) secure attributes for nondir ino 4343158051: Cannot allocate memory (12) non-root attributes for nondir ino 4343158052: Cannot allocate memory (12) non-root attributes for nondir ino 4343166271: Cannot allocate memory (12) root attributes for nondir ino 4343166271: Cannot allocate memory (12) root attributes for nondir ino 4343208759: Cannot allocate memory (12) non-root attributes for nondir ino 4343932954: Cannot allocate memory (12) non-root attributes for nondir ino 4343932971: Cannot allocate memory (12) non-root attributes for nondir ino 4343932976: Cannot allocate memory (12) root attributes for nondir ino 4343932976: Cannot allocate memory (12) non-root attributes for nondir ino 4343932984: Cannot allocate memory (12) non-root attributes for nondir ino 4343932985: Cannot allocate memory (12) root attributes for nondir ino 4343932985: Cannot allocate memory (12) secure attributes for nondir ino 4343932985: Cannot allocate memory (12) non-root attributes for nondir ino 4343932986: Cannot allocate memory (12) non-root attributes for nondir ino 4343932987: Cannot allocate memory (12) root attributes for nondir ino 4343932987: Cannot allocate memory (12) non-root attributes for nondir ino 4343934465: Cannot allocate memory (12) root attributes for nondir ino 4343934465: Cannot allocate memory (12) non-root attributes for nondir ino 4343934483: Cannot allocate memory (12) root attributes for nondir ino 4343934514: Cannot allocate memory (12) non-root attributes for nondir ino 4343934526: Cannot allocate memory (12) root attributes for nondir ino 4343934526: Cannot allocate memory (12) root attributes for nondir ino 4344182554: Cannot allocate memory (12) non-root attributes for nondir ino 4344182555: Cannot allocate memory (12) root attributes for nondir ino 4344182555: Cannot allocate memory (12) secure attributes for nondir ino 4344182555: Cannot allocate memory (12) non-root attributes for nondir ino 4344182556: Cannot allocate memory (12) root attributes for nondir ino 4344182556: Cannot allocate memory (12) non-root attributes for nondir ino 4344182570: Cannot allocate memory (12) root attributes for nondir ino 4344182570: Cannot allocate memory (12) secure attributes for nondir ino 4344182570: Cannot allocate memory (12) non-root attributes for nondir ino 4344182588: Cannot allocate memory (12) root attributes for nondir ino 4344182588: Cannot allocate memory (12) secure attributes for nondir ino 4344182588: Cannot allocate memory (12) non-root attributes for nondir ino 4344182589: Cannot allocate memory (12) root attributes for nondir ino 4344182589: Cannot allocate memory (12) non-root attributes for nondir ino 4347574294: Cannot allocate memory (12) root attributes for nondir ino 4347574294: Cannot allocate memory (12) secure attributes for nondir ino 4347574294: Cannot allocate memory (12) non-root attributes for nondir ino 4347574297: Cannot allocate memory (12) root attributes for nondir ino 4347574297: Cannot allocate memory (12) non-root attributes for nondir ino 4353226027: Cannot allocate memory (12) root attributes for nondir ino 4353226027: Cannot allocate memory (12) secure attributes for nondir ino 4353226027: Cannot allocate memory (12) non-root attributes for nondir ino 4353232663: Cannot allocate memory (12) root attributes for nondir ino 4353232663: Cannot allocate memory (12) secure attributes for nondir ino 4353232663: Cannot allocate memory (12) root attributes for nondir ino 4353232664: Cannot allocate memory (12) non-root attributes for nondir ino 4353232666: Cannot allocate memory (12) non-root attributes for nondir ino 4355146291: Cannot allocate memory (12) root attributes for nondir ino 4355146291: Cannot allocate memory (12) secure attributes for nondir ino 4355146291: Cannot allocate memory (12) non-root attributes for nondir ino 4367519239: Cannot allocate memory (12) non-root attributes for nondir ino 4378111507: Cannot allocate memory (12) root attributes for nondir ino 4378111507: Cannot allocate memory (12) secure attributes for nondir ino 4378111507: Cannot allocate memory (12) non-root attributes for nondir ino 4378111517: Cannot allocate memory (12) root attributes for nondir ino 4378111517: Cannot allocate memory (12) non-root attributes for nondir ino 4390462721: Cannot allocate memory (12) non-root attributes for nondir ino 4390462733: Cannot allocate memory (12) root attributes for nondir ino 4390462733: Cannot allocate memory (12) secure attributes for nondir ino 4390462733: Cannot allocate memory (12) root attributes for nondir ino 4390462735: Cannot allocate memory (12) non-root attributes for nondir ino 4393612032: Cannot allocate memory (12) root attributes for nondir ino 4393612032: Cannot allocate memory (12) secure attributes for nondir ino 4393612032: Cannot allocate memory (12) xfsdump: WARNING: could not get list of non-root attributes for nondir ino 4393612033: Cannot allocate memory (12) in @ 0.0 KiB/s, out @ 0.0 KiB/s, 1370 GiB total, buffer 0% full xfsdump: ending media file xfsdump: media file size 1472039936288 bytes xfsdump: dump size (non-dir files) : 1471490476960 bytes xfsdump: dump complete: 19641 seconds elapsed xfsdump: Dump Status: SUCCESS summary: 1371 GiByte in 5 h 27 min 71.5 MiB/s From david@fromorbit.com Wed Apr 3 22:52:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3801F7CBF for ; Wed, 3 Apr 2013 22:52:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 249F88F8050 for ; Wed, 3 Apr 2013 20:52:42 -0700 (PDT) X-ASG-Debug-ID: 1365047560-04cb6c1e78218d50001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GZv8mpwTyBJjvzhH for ; Wed, 03 Apr 2013 20:52:40 -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: AjkUAMz3XFF5LaeV/2dsb2JhbABDgwaCdLkphRkEAYELF3SCHwEBBTocIxAIAw4KCSUPBSUDIROIE8BCFY1ngR0Hgl9hA5Mlg0WRDIMfKA Received: from ppp121-45-167-149.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.149]) by ipmail04.adl6.internode.on.net with ESMTP; 04 Apr 2013 14:22:39 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UNbE5-00037x-Ue; Thu, 04 Apr 2013 14:52:37 +1100 Date: Thu, 4 Apr 2013 14:52:37 +1100 From: Dave Chinner To: Linda Walsh Cc: xfs-oss Subject: Re: xfsdump having problems dumping attributes again (cannot allocate memory) Message-ID: <20130404035237.GA12011@dastard> X-ASG-Orig-Subj: Re: xfsdump having problems dumping attributes again (cannot allocate memory) References: <515CB2C1.1050109@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515CB2C1.1050109@tlinx.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: 1365047560 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127118 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 03, 2013 at 03:52:49PM -0700, Linda Walsh wrote: > > Note -- I might have more attributes than some as the disks are shared via samba > w/windows > and samba stores ACL and xattr info from windows in xfs's attrs... > > > xfsdump: WARNING: could not get list of root attributes for nondir ino > 3412893285: Cannot allocate memory (12) .... > [1007383.689492] xfsdump: page allocation failure: order:4, mode:0x10c0d0 .... > [1007383.689531] [] kmalloc_order_trace+0x34/0xe0 > [1007383.689534] [] __kmalloc+0x186/0x190 > [1007383.689541] [] xfs_attrlist_by_handle+0x8c/0x110 > [1007383.689544] [] xfs_file_ioctl+0x437/0xb60 So it's the attribute handle interfaces that need the vmalloc treatment here, just like has been done for all the other attribute interfaces.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 3 23:00:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0ABE47CBF for ; Wed, 3 Apr 2013 23:00:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E766A30404E for ; Wed, 3 Apr 2013 21:00:44 -0700 (PDT) X-ASG-Debug-ID: 1365048042-04cbb01fba20ef70001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id NfNHYJo6a7iytoFw for ; Wed, 03 Apr 2013 21:00: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: AjoUAAL6XFF5LaeV/2dsb2JhbABDgwaCdLkphRkEAYELF3SCHwEBBAE6HA8UBQsIAw4KCSUPBSUDIROIDgXAQRWNTBuBHQeCX2EDlmqJdIcYgx8ogS4 Received: from ppp121-45-167-149.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.149]) by ipmail04.adl6.internode.on.net with ESMTP; 04 Apr 2013 14:30:42 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UNbLt-000398-PA; Thu, 04 Apr 2013 15:00:41 +1100 Date: Thu, 4 Apr 2013 15:00:41 +1100 From: Dave Chinner To: Peter Watkins Cc: xfs@oss.sgi.com Subject: Re: xfs_iomap_write_unwritten stuck in congestion_wait? Message-ID: <20130404040041.GB12011@dastard> X-ASG-Orig-Subj: Re: xfs_iomap_write_unwritten stuck in congestion_wait? References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1365048042 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127118 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 03, 2013 at 03:33:11PM -0400, Peter Watkins wrote: > Hello, > > Wondering if anyone has a suggestion for when > xfs_iomap_write_unwritten gets into congestion_wait. Do less IO? > In this case the system has almost half of normal zone pages in > NR_WRITEBACK with pretty much everybody held up in either > congestion_wait or balance_dirty_pages. Which is excessive - how are you getting to the point of having that many pages under IO at once? Writeback depth is limited by the IO elevator queue depths, so this shouldn't happen unless you've been tweaking block device parameters (i.e. nr_requests/max_sectors_kb)... > Since there are some free pages, seems like we'd be better off just > using a little more memory to finish this IO and in turn reduce pages > under write-back and add to free memory, rather than holding up here. > So maybe PF_MEMALLOC? Definitely not. Unwritten extent conversion can require hundreds of kilobytes of memory to complete, so all this will do is trigger even further exhaustion of memory reserves before we block on IO. > It also looks like this path allocates log vectors with KM_SLEEP but > lv_buf's with KM_SLEEP|KM_NOFS. Why is that? The transaction commit is copying the changes made into separate buffers to insert into the CIL for a later checkpoint to write to disk. This is normal behaviour - we can sleep there, but we cannot allow memory reclaim to recurse into the filesystem (for obvious reasons). Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Wed Apr 3 23:10:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7DC957CBF for ; Wed, 3 Apr 2013 23:10:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 14936AC006 for ; Wed, 3 Apr 2013 21:10:53 -0700 (PDT) X-ASG-Debug-ID: 1365048650-04cbb01fba20fac0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id UaYx6W2ZHN5igrDk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 03 Apr 2013 21:10:51 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r344AnoF010282 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 4 Apr 2013 04:10:50 GMT Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r344AmT0028780 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 4 Apr 2013 04:10:49 GMT Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59]) by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r344Am3u010987 for ; Wed, 3 Apr 2013 23:10:48 -0500 Received: from [192.168.1.102] (/114.248.203.73) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Apr 2013 21:10:48 -0700 Message-ID: <515CFD42.70109@oracle.com> Date: Thu, 04 Apr 2013 12:10:42 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH]xfs: Remove the obsolete XLOG_CIL_HARD_SPACE_LIMIT() macros Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH]xfs: Remove the obsolete XLOG_CIL_HARD_SPACE_LIMIT() macros Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1365048651 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127118 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- There is no more users of this Macro, so it's time to kill it dead. Signed-off-by: Jie Liu --- fs/xfs/xfs_log_priv.h | 1 - 1 file changed, 1 deletion(-) diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 16d8d12..b9ea262 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -468,7 +468,6 @@ struct xfs_cil { * threshold, yet give us plenty of space for aggregation on large logs. */ #define XLOG_CIL_SPACE_LIMIT(log) (log->l_logsize >> 3) -#define XLOG_CIL_HARD_SPACE_LIMIT(log) (3 * (log->l_logsize >> 4)) /* * ticket grant locks, queues and accounting have their own cachlines -- 1.7.9.5 From david@fromorbit.com Wed Apr 3 23:35:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A8DA67CBF for ; Wed, 3 Apr 2013 23:35:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3E7E2AC005 for ; Wed, 3 Apr 2013 21:35:24 -0700 (PDT) X-ASG-Debug-ID: 1365050121-04cbb01fb82117b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id l2gWQ8AowlkP9EAs for ; Wed, 03 Apr 2013 21:35:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjkUABkCXVF5LaeV/2dsb2JhbABDgwaCdLkphRkEAYELF3SCHwEBBAE6HCMFCwgDGAklDwUlAyETiA4FwDQVjWeBHQeCX2EDlmqRDIMfKA Received: from ppp121-45-167-149.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.149]) by ipmail04.adl6.internode.on.net with ESMTP; 04 Apr 2013 15:05:21 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UNbtQ-0003CL-JO; Thu, 04 Apr 2013 15:35:20 +1100 Date: Thu, 4 Apr 2013 15:35:15 +1100 From: Dave Chinner To: L Ox Cc: xfs@oss.sgi.com Subject: Re: 88TB filesystem going off-line without warning Message-ID: <20130404043515.GC12011@dastard> X-ASG-Orig-Subj: Re: 88TB filesystem going off-line without warning References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1365050121 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127120 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 02, 2013 at 11:44:15AM -0700, L Ox wrote: > Hi, > > We have a new Linux/XFS deployment (about a month old) and randomly without > warning the XFS filesystem will go off-line. We are running Scientific > Linux release 5.9 with the latest updates. > > # uname -a > Linux node24 2.6.18-348.3.1.el5 #1 SMP Mon Mar 11 15:43:13 EDT 2013 x86_64 > x86_64 x86_64 GNU/Linux > > # cat /etc/redhat-release > Scientific Linux release 5.9 (Boron) > > Here are the errors we see in /var/log/messages after the initial off-line > event: > > -- snip -- > > Apr 2 07:50:28 node24 kernel: xfs_iunlink_remove: xfs_inotobp() returned > an error 22 on dm-6. Returning error. > Apr 2 07:50:28 node24 kernel: xfs_inactive: xfs_ifree() returned an error > = 22 on dm-6 #define EINVAL 22 /* Invalid argument */ That tends to imply a corrupt inode number in the unlinked list chain. > Here are the messages after I umount/xfs_repair/mount the filesystem: What did xfs_repair detect/fix? > # xfs_repair /dev/mapper/vol_d24-root > Phase 1 - find and verify superblock... ..... > Phase 6 - check inode connectivity... > - resetting contents of realtime bitmap and summary inodes > - traversing filesystem ... > - traversal finished ... > - moving disconnected inodes to lost+found ... > disconnected inode 202102936036, moving to lost+found > disconnected inode 215350040250, moving to lost+found > disconnected inode 215350208634, moving to lost+found > disconnected inode 271016406074, moving to lost+found Some inodes that had been unlinked from the directory structure but not freed. They were probably on an unlinked inode list that couldn't be walked. > Any ideas? If the problem is a one off, there isn't anything that can be done. If you can reproduce it, try to narrow it down to the simplest case you can... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Apr 4 00:05:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 95B7F7CBF for ; Thu, 4 Apr 2013 00:05:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2E295AC005 for ; Wed, 3 Apr 2013 22:05:15 -0700 (PDT) X-ASG-Debug-ID: 1365051914-04bdf0542b213210001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id S34VfUbWMpU7Exsv for ; Wed, 03 Apr 2013 22:05:15 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9192F65690DC; Thu, 4 Apr 2013 00:05:14 -0500 (CDT) Message-ID: <515D0A09.5030808@sandeen.net> Date: Thu, 04 Apr 2013 00:05:13 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130307 Thunderbird/17.0.4 MIME-Version: 1.0 To: Dave Chinner CC: Linda Walsh , xfs-oss Subject: [PATCH] xfs: xfs: fallback to vmalloc for large buffers in xfs_attrlist_by_handle References: <515CB2C1.1050109@tlinx.org> <20130404035237.GA12011@dastard> X-ASG-Orig-Subj: [PATCH] xfs: xfs: fallback to vmalloc for large buffers in xfs_attrlist_by_handle In-Reply-To: <20130404035237.GA12011@dastard> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365051914 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127122 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/3/13 10:52 PM, Dave Chinner wrote: > On Wed, Apr 03, 2013 at 03:52:49PM -0700, Linda Walsh wrote: >> >> Note -- I might have more attributes than some as the disks are shared via samba >> w/windows >> and samba stores ACL and xattr info from windows in xfs's attrs... >> >> >> xfsdump: WARNING: could not get list of root attributes for nondir ino >> 3412893285: Cannot allocate memory (12) > > .... >> [1007383.689492] xfsdump: page allocation failure: order:4, mode:0x10c0d0 > .... >> [1007383.689531] [] kmalloc_order_trace+0x34/0xe0 >> [1007383.689534] [] __kmalloc+0x186/0x190 >> [1007383.689541] [] xfs_attrlist_by_handle+0x8c/0x110 >> [1007383.689544] [] xfs_file_ioctl+0x437/0xb60 > > So it's the attribute handle interfaces that need the vmalloc > treatment here, just like has been done for all the other attribute > interfaces.... Like this? From: Eric Sandeen xfs: fallback to vmalloc for large buffers in xfs_attrlist_by_handle Shamelessly copied from dchinner's: ad650f5b xfs: fallback to vmalloc for large buffers in xfs_attrmulti_attr_get xfsdump uses for a large buffer for extended attributes, which has a kmalloc'd shadow buffer in the kernel. This can fail after the system has been running for some time as it is a high order allocation. Add a fallback to vmalloc so that it doesn't require contiguous memory and so won't randomly fail while xfsdump is running. Signed-off-by: Eric Sandeen --- built & tested by running through xfstests ./check -g dump diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index d681e34..5e99968 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -422,9 +422,12 @@ xfs_attrlist_by_handle( if (IS_ERR(dentry)) return PTR_ERR(dentry); - kbuf = kzalloc(al_hreq.buflen, GFP_KERNEL); - if (!kbuf) - goto out_dput; + kbuf = kmem_zalloc(al_hreq.buflen, KM_SLEEP | KM_MAYFAIL); + if (!kbuf) { + kbuf = kmem_zalloc_large(al_hreq.buflen); + if (!kbuf) + goto out_dput; + } cursor = (attrlist_cursor_kern_t *)&al_hreq.pos; error = -xfs_attr_list(XFS_I(dentry->d_inode), kbuf, al_hreq.buflen, @@ -436,7 +439,10 @@ xfs_attrlist_by_handle( error = -EFAULT; out_kfree: - kfree(kbuf); + if (is_vmalloc_addr(kbuf)) + kmem_free_large(kbuf); + else + kmem_free(kbuf); out_dput: dput(dentry); return error; From mc05@mc-electronic.com Thu Apr 4 01:25:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_FONT_FACE_BAD, 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 E057B7F37 for ; Thu, 4 Apr 2013 01:25:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0791E304043 for ; Wed, 3 Apr 2013 23:25:31 -0700 (PDT) X-ASG-Debug-ID: 1365056718-04bdf0542a219190001-NocioJ Received: from smtp.chinaemail.cn (smtp.chinaemail.cn [218.5.74.238]) by cuda.sgi.com with ESMTP id J2VboETiv9ZpGlDL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 03 Apr 2013 23:25:20 -0700 (PDT) X-Barracuda-Envelope-From: mc05@mc-electronic.com X-Barracuda-Apparent-Source-IP: 218.5.74.238 Received: from s158d.chinaemail.cn (unknown [121.14.57.156]) by smtp.chinaemail.cn (Postfix) with ESMTP id 0E1C6190521 for ; Thu, 4 Apr 2013 14:25:14 +0800 (CST) Received: from LB-201106092302 (unknown [58.61.138.92]) (Authenticated sender: mc05@mc-electronic.com) by s158d.chinaemail.cn (Bossmail) with ESMTP id 0458E3D23CA for ; Thu, 4 Apr 2013 14:22:49 +0800 (CST) Date: Thu, 4 Apr 2013 14:13:51 +0800 From: mc05 To: xfs Reply-To: mc05 Subject: LED flash case for iphone4/4s/5 Disposition-Notification-To: mc05 X-ASG-Orig-Subj: LED flash case for iphone4/4s/5 X-Priority: 3 X-Has-Attach: no X-Mailer: Foxmail 7.0.1.88[cn] Mime-Version: 1.0 Message-ID: <2013040411220484346527@mc-electronic.com> Content-Type: multipart/related; boundary="----=_001_NextPart204125412821_=----" X-MID: 2030975388.4060154754.57.1365056572.667026.23001 X-Rate: Yes X-Real-From: mc05@mc-electronic.com X-Rcpt: ,xfs@oss.sgi.com, X-Barracuda-Connect: smtp.chinaemail.cn[218.5.74.238] X-Barracuda-Start-Time: 1365056719 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.61 X-Barracuda-Spam-Status: No, SCORE=0.61 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127128 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word This is a multi-part message in MIME format. ------=_001_NextPart204125412821_=---- Content-Type: multipart/alternative; boundary="----=_002_NextPart168582047313_=----" ------=_002_NextPart168582047313_=---- Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 RGVhciBNYW5hZ2VyLA0KDQpXZSBhcmUgTSZDIEVsZWN0cm9uaWNzIGZyb20gQ2hpbmEsIGFyZSBw cm9mZXNzaW9uYWwgaW4gYWNjZXNzb3JpZXMgZm9yIEFwcGxlIGFuZCBTYW1zdW5nLiBIZXJlIEkg d2lsbCByZWNvbW1lbmQgb3VyIGhvdCBzZWxsaW5nICBhbmQgdmVyeSBmdW4gcHJvZHVjdC0tTEVE IGZsYXNoIGNhc2UgZm9yIGlwaG9uZS4gRGV0YWlsZWQgaW5mbywgcGxzIHNlZSBiZWxvdyBwaWN0 dXJlLg0KDQpBbnkgcXVlc3Rpb25zLCBkbyBub3QgaGVzaXRhdGUgdG8gY29udGFjdCBtZS4NCg0K QmVzdCB3aXNoZXMsDQoNCg0KDQpNJkMgRWxlY3Ryb25pY3MgDQotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkNvbXBhbnkg TmFtZTogTSZDIGVsZWN0cm9uaWNzIENvLixMdGQNCldlYjpodHRwOi8vd3d3Lm1jLWVsZWN0cm9u aWMuY29tDQpBZGQ6IE1pbnpoaSBTdC4gLCBMb25naHVhIERpc3RyaWN0ICwgU2hlbnpoZW4gNTE4 MDE5o6xDTi4NCk9mZmljZTogODYuNzU1LjI5MzY5NDQ5DQpGYXg6ODYuNzU1LjIyMTQxNzk5 ------=_002_NextPart168582047313_=---- Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: quoted-printable
Dear Manager,
 
We are M&C Electronics from China, are professional in accessorie= s for=20 Apple and Samsung. Here I will recommend our hot selling  and very fu= n=20 product--LED flash case for iphone. Detailed info, pls see below picture.<= /DIV>
Any questions, do not hesitate to contact me.
 
Best wishes,

M&C=20 Electronics
-------------------------------------------------------------= -----

Company Name: M&C electronics Co.,Ltd=

Web:http://www.mc-electronic.com<= /SPAN>

Add: Minzhi St. , Longhua District&n= bsp;, Shenzhen=20 518019=A3=ACCN.

Office: 86.755.29369449

Fax:86.755.22141799

=
------=_002_NextPart168582047313_=------ ------=_001_NextPart204125412821_=---- Content-Type: image/jpeg; name="CatchBAC5(03-09-(04-04-11-21-40).jpg" Content-Transfer-Encoding: base64 Content-ID: <_Foxmail.0@8A9BE26E-F886-43D9-AB92-98395291F929> /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAMUAmcDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+/iii igBvy+v/AI8f8aN6+v6H/CvFvjp4k1nwf8HPif4r8OXB03XfD3gLxbrOj3q20dy1pqemaLe3djee Rc293a3Btp447gwXNpdWpEJMisAAfzd+I/7Tfxr0P/glj8Of2jtN8bNp/wAZdf8ABvwU1fV/GFv4 c0a7nluvGHizw7pPiK8t/C02mXWiz3F3p2pXgtbW10s2n2sD+z8f6GK+o4W4SzPi3F5Pg8unhaNX O+LOHuD8H9bliIqOZcRVHTwuJrrD4bEzpYCg7PETUZ4pK/LhJWV/osi4Zx2fvBLCVcLT+vcSZXwv R9tOprmObrEPDTapUqn+z0/q7WIkv30XJKhRr8rP2LyG6H8V/wAefSlyPUfmK/CjVvjp+0BqUf7L 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 sHv+n+FGwe/6f4U+igBmwe/6f4UbB7/p/hT6KAGbB7/p/hRsHv8Ap/hT6KAGbB7/AKf4UbB7/p/h T6KAIyqjqT/n8KCqjqT/AJ/CpKKAI9ijjOPxA/pS7B7/AKf4U+igBmwe/wCn+FLsA6Fh+P8A9anU UAM2D3/T/CjYPf8AT/Cn0UAN2+7fnRt92/OnUUAM2D3/AE/wpdv+03506igBu33b86TYPf8AT/Cn 0UAM2D3/AE/wpdv+03506igBmwe/6f4UbB7/AKf4U+igBmwe/wCn+FGwe/6f4U+igBmwe/6f4UbB 7/p/hT6KAGbB7/p/hRsHv+n+FPooAj2p/e/UUYTpuP8An3xipKKAI9qf3v1H+FG1PX9RUlFADNg9 /wBP8KNg9/0/wp9FADNg9/0/wo2D3/T/AAp9FADNg9/0/wAKNg9/0/wp9FADNg9/0/wo2D3/AE/w p9FADNg9/wBP8KNg9/0/wp9FADNg9/0/wo2D3/T/AAp9FAEe1P736j/Cjan979RUlFAEexGyMk/5 +lAjQZwe/PT/AD/SpKKBcse39f0v6uyHbHnrz/n2x+NP2qOpP+fpzT6KAsuy+5Ee1P736ijan979 RUlFAxu33b86QAHgM3H+fSn0UAR7VPGWO336UbVPQ/5+nWpKKAGbB7/p/hRsHv8Ap/hT6KAGbB7/ AKf4UnlL6t/30akooAj8tRzlhj/aNKqqowo27flH6fn2p9FABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//2Q== ------=_001_NextPart204125412821_=------ From mc05@mc-electronic.com Thu Apr 4 01:32:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 978AD7F37 for ; Thu, 4 Apr 2013 01:32:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A3D80AC004 for ; Wed, 3 Apr 2013 23:32:48 -0700 (PDT) X-ASG-Debug-ID: 1365057160-04cbb01fb721ac20001-w1Z2WR Received: from smtp.chinaemail.cn (smtp.chinaemail.cn [218.5.74.238]) by cuda.sgi.com with ESMTP id 5VwYHRPYfopEYD8y (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 03 Apr 2013 23:32:41 -0700 (PDT) X-Barracuda-Envelope-From: mc05@mc-electronic.com X-Barracuda-Apparent-Source-IP: 218.5.74.238 Received: from s158d.chinaemail.cn (unknown [121.14.57.156]) by smtp.chinaemail.cn (Postfix) with ESMTP id 060921904C1 for ; Thu, 4 Apr 2013 14:32:36 +0800 (CST) Received: from LB-201106092302 (unknown [58.61.138.92]) (Authenticated sender: mc05@mc-electronic.com) by s158d.chinaemail.cn (Bossmail) with ESMTP id 588303D23D0 for ; Thu, 4 Apr 2013 14:30:10 +0800 (CST) Date: Thu, 4 Apr 2013 14:13:51 +0800 From: mc05 To: linux-xfs Reply-To: mc05 Subject: LED flash case for iphone4/4s/5 Disposition-Notification-To: mc05 X-ASG-Orig-Subj: LED flash case for iphone4/4s/5 X-Priority: 3 X-Has-Attach: no X-Mailer: Foxmail 7.0.1.88[cn] Mime-Version: 1.0 Message-ID: <2013040411220484346527@mc-electronic.com> Content-Type: multipart/related; boundary="----=_001_NextPart204125412821_=----" X-MID: 2030975388.1646402032.60.1365057014.692063.23001 X-Rate: Yes X-Real-From: mc05@mc-electronic.com X-Rcpt: ,linux-xfs@oss.sgi.com, X-Barracuda-Connect: smtp.chinaemail.cn[218.5.74.238] X-Barracuda-Start-Time: 1365057161 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.61 X-Barracuda-Spam-Status: No, SCORE=0.61 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127128 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word This is a multi-part message in MIME format. ------=_001_NextPart204125412821_=---- Content-Type: multipart/alternative; boundary="----=_002_NextPart168582047313_=----" ------=_002_NextPart168582047313_=---- Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 RGVhciBNYW5hZ2VyLA0KDQpXZSBhcmUgTSZDIEVsZWN0cm9uaWNzIGZyb20gQ2hpbmEsIGFyZSBw cm9mZXNzaW9uYWwgaW4gYWNjZXNzb3JpZXMgZm9yIEFwcGxlIGFuZCBTYW1zdW5nLiBIZXJlIEkg d2lsbCByZWNvbW1lbmQgb3VyIGhvdCBzZWxsaW5nICBhbmQgdmVyeSBmdW4gcHJvZHVjdC0tTEVE IGZsYXNoIGNhc2UgZm9yIGlwaG9uZS4gRGV0YWlsZWQgaW5mbywgcGxzIHNlZSBiZWxvdyBwaWN0 dXJlLg0KDQpBbnkgcXVlc3Rpb25zLCBkbyBub3QgaGVzaXRhdGUgdG8gY29udGFjdCBtZS4NCg0K QmVzdCB3aXNoZXMsDQoNCg0KDQpNJkMgRWxlY3Ryb25pY3MgDQotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkNvbXBhbnkg TmFtZTogTSZDIGVsZWN0cm9uaWNzIENvLixMdGQNCldlYjpodHRwOi8vd3d3Lm1jLWVsZWN0cm9u aWMuY29tDQpBZGQ6IE1pbnpoaSBTdC4gLCBMb25naHVhIERpc3RyaWN0ICwgU2hlbnpoZW4gNTE4 MDE5o6xDTi4NCk9mZmljZTogODYuNzU1LjI5MzY5NDQ5DQpGYXg6ODYuNzU1LjIyMTQxNzk5 ------=_002_NextPart168582047313_=---- Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: quoted-printable
Dear Manager,
 
We are M&C Electronics from China, are professional in accessorie= s for=20 Apple and Samsung. Here I will recommend our hot selling  and very fu= n=20 product--LED flash case for iphone. Detailed info, pls see below picture.<= /DIV>
Any questions, do not hesitate to contact me.
 
Best wishes,

M&C=20 Electronics
-------------------------------------------------------------= -----

Company Name: M&C electronics Co.,Ltd=

Web:http://www.mc-electronic.com<= /SPAN>

Add: Minzhi St. , Longhua District&n= bsp;, Shenzhen=20 518019=A3=ACCN.

Office: 86.755.29369449

Fax:86.755.22141799

=
------=_002_NextPart168582047313_=------ ------=_001_NextPart204125412821_=---- Content-Type: image/jpeg; name="CatchBAC5(03-09-(04-04-11-21-40).jpg" Content-Transfer-Encoding: base64 Content-ID: <_Foxmail.0@8A9BE26E-F886-43D9-AB92-98395291F929> /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAMUAmcDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+/iii igBvy+v/AI8f8aN6+v6H/CvFvjp4k1nwf8HPif4r8OXB03XfD3gLxbrOj3q20dy1pqemaLe3djee Rc293a3Btp447gwXNpdWpEJMisAAfzd+I/7Tfxr0P/glj8Of2jtN8bNp/wAZdf8ABvwU1fV/GFv4 c0a7nluvGHizw7pPiK8t/C02mXWiz3F3p2pXgtbW10s2n2sD+z8f6GK+o4W4SzPi3F5Pg8unhaNX O+LOHuD8H9bliIqOZcRVHTwuJrrD4bEzpYCg7PETUZ4pK/LhJWV/osi4Zx2fvBLCVcLT+vcSZXwv R9tOprmObrEPDTapUqn+z0/q7WIkv30XJKhRr8rP2LyG6H8V/wAefSlyPUfmK/CjVvjp+0BqUf7L 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 sHv+n+FGwe/6f4U+igBmwe/6f4UbB7/p/hT6KAGbB7/p/hRsHv8Ap/hT6KAGbB7/AKf4UbB7/p/h T6KAIyqjqT/n8KCqjqT/AJ/CpKKAI9ijjOPxA/pS7B7/AKf4U+igBmwe/wCn+FLsA6Fh+P8A9anU UAM2D3/T/CjYPf8AT/Cn0UAN2+7fnRt92/OnUUAM2D3/AE/wpdv+03506igBu33b86TYPf8AT/Cn 0UAM2D3/AE/wpdv+03506igBmwe/6f4UbB7/AKf4U+igBmwe/wCn+FGwe/6f4U+igBmwe/6f4UbB 7/p/hT6KAGbB7/p/hRsHv+n+FPooAj2p/e/UUYTpuP8An3xipKKAI9qf3v1H+FG1PX9RUlFADNg9 /wBP8KNg9/0/wp9FADNg9/0/wo2D3/T/AAp9FADNg9/0/wAKNg9/0/wp9FADNg9/0/wo2D3/AE/w p9FADNg9/wBP8KNg9/0/wp9FADNg9/0/wo2D3/T/AAp9FAEe1P736j/Cjan979RUlFAEexGyMk/5 +lAjQZwe/PT/AD/SpKKBcse39f0v6uyHbHnrz/n2x+NP2qOpP+fpzT6KAsuy+5Ee1P736ijan979 RUlFAxu33b86QAHgM3H+fSn0UAR7VPGWO336UbVPQ/5+nWpKKAGbB7/p/hRsHv8Ap/hT6KAGbB7/ AKf4UnlL6t/30akooAj8tRzlhj/aNKqqowo27flH6fn2p9FABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//2Q== ------=_001_NextPart204125412821_=------ From xfs@tlinx.org Thu Apr 4 01:57:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0AE577F37 for ; Thu, 4 Apr 2013 01:57:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B14F830404E for ; Wed, 3 Apr 2013 23:57:27 -0700 (PDT) X-ASG-Debug-ID: 1365058645-04bdf0542d21bac0001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id kNrZcBJJR74TJc1H (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 03 Apr 2013 23:57:25 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id r346vDL5012244; Wed, 3 Apr 2013 23:57:16 -0700 Message-ID: <515D2447.8060809@tlinx.org> Date: Wed, 03 Apr 2013 23:57:11 -0700 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: Eric Sandeen CC: Dave Chinner , xfs-oss Subject: Re: [PATCH] xfs: xfs: fallback to vmalloc for large buffers in xfs_attrlist_by_handle References: <515CB2C1.1050109@tlinx.org> <20130404035237.GA12011@dastard> <515D0A09.5030808@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH] xfs: xfs: fallback to vmalloc for large buffers in xfs_attrlist_by_handle In-Reply-To: <515D0A09.5030808@sandeen.net> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1365058645 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127130 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Even if I could reboot immediately, the last dump took 5 hours to run, My system's boot situation has been complicated by opensuse moving to systemd and moving all of the early boot utils (udev, mount, etc). to /usr, expecting /usr to already be mounted by the time the rootfs init is called on disk. Dinosaur that I am, I still boot from disk, but with the utils needed to mount any file systems no longer on the root partition, my booting has become an exercise involving bailing wire and ductape, but the new kernel w/the patch is already on my /boot partition... its the coming back up and getting /usr mounted before the "official boot" starts that is tricky... i.e. will test as soon as practical... ;^) Eric Sandeen wrote: > On 4/3/13 10:52 PM, Dave Chinner wrote: >> On Wed, Apr 03, 2013 at 03:52:49PM -0700, Linda Walsh wrote: >>> Note -- I might have more attributes than some as the disks are shared via samba >>> w/windows >>> and samba stores ACL and xattr info from windows in xfs's attrs... >>> >>> >>> xfsdump: WARNING: could not get list of root attributes for nondir ino >>> 3412893285: Cannot allocate memory (12) >> .... >>> [1007383.689492] xfsdump: page allocation failure: order:4, mode:0x10c0d0 >> .... >>> [1007383.689531] [] kmalloc_order_trace+0x34/0xe0 >>> [1007383.689534] [] __kmalloc+0x186/0x190 >>> [1007383.689541] [] xfs_attrlist_by_handle+0x8c/0x110 >>> [1007383.689544] [] xfs_file_ioctl+0x437/0xb60 >> So it's the attribute handle interfaces that need the vmalloc >> treatment here, just like has been done for all the other attribute >> interfaces.... > > Like this? > > From: Eric Sandeen > > xfs: fallback to vmalloc for large buffers in xfs_attrlist_by_handle > > Shamelessly copied from dchinner's: > ad650f5b xfs: fallback to vmalloc for large buffers in xfs_attrmulti_attr_get > > xfsdump uses for a large buffer for extended attributes, which has a > kmalloc'd shadow buffer in the kernel. This can fail after the > system has been running for some time as it is a high order > allocation. Add a fallback to vmalloc so that it doesn't require > contiguous memory and so won't randomly fail while xfsdump is > running. > > Signed-off-by: Eric Sandeen > --- > > built & tested by running through xfstests ./check -g dump > > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index d681e34..5e99968 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -422,9 +422,12 @@ xfs_attrlist_by_handle( > if (IS_ERR(dentry)) > return PTR_ERR(dentry); > > - kbuf = kzalloc(al_hreq.buflen, GFP_KERNEL); > - if (!kbuf) > - goto out_dput; > + kbuf = kmem_zalloc(al_hreq.buflen, KM_SLEEP | KM_MAYFAIL); > + if (!kbuf) { > + kbuf = kmem_zalloc_large(al_hreq.buflen); > + if (!kbuf) > + goto out_dput; > + } > > cursor = (attrlist_cursor_kern_t *)&al_hreq.pos; > error = -xfs_attr_list(XFS_I(dentry->d_inode), kbuf, al_hreq.buflen, > @@ -436,7 +439,10 @@ xfs_attrlist_by_handle( > error = -EFAULT; > > out_kfree: > - kfree(kbuf); > + if (is_vmalloc_addr(kbuf)) > + kmem_free_large(kbuf); > + else > + kmem_free(kbuf); > out_dput: > dput(dentry); > return error; > > > From jeff.liu@oracle.com Thu Apr 4 03:07:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9F0827F37 for ; Thu, 4 Apr 2013 03:07:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6C2F0304064 for ; Thu, 4 Apr 2013 01:07:22 -0700 (PDT) X-ASG-Debug-ID: 1365062841-04bdf0542c222630001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 5iEylzY1OauM0a3f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 04 Apr 2013 01:07:21 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r3487KeX014492 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 4 Apr 2013 08:07:20 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3487Jbt014401 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 4 Apr 2013 08:07:20 GMT Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r3487JpF013659 for ; Thu, 4 Apr 2013 03:07:19 -0500 Received: from [192.168.1.102] (/114.248.195.214) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 04 Apr 2013 01:07:19 -0700 Message-ID: <515D34B2.9050807@oracle.com> Date: Thu, 04 Apr 2013 16:07:14 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH] xfs: Update xfs_log_commit_cil() comments Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: Update xfs_log_commit_cil() comments Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1365062841 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127134 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs_log_commit_iclog() function has been removed by commits 93b8a585: xfs: remove the deprecated nodelaylog option Beginning from Linux 3.3, only delayed logging is supported so that we call xfs_log_commit_cil() at xfs_trans_commit() only, remove the useless comments so. Signed-off-by: Jie Liu --- fs/xfs/xfs_log_cil.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index ddc4529..e3d0b85 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -668,10 +668,6 @@ xlog_cil_push_foreground( * transaction to the checkpoint context so we carry the busy extents through * to checkpoint completion, and then unlock all the items in the transaction. * - * For more specific information about the order of operations in - * xfs_log_commit_cil() please refer to the comments in - * xfs_trans_commit_iclog(). - * * Called with the context lock already held in read mode to lock out * background commit, returns without it held once background commits are * allowed again. -- 1.7.9.5 From h.flora2012@gmail.com Thu Apr 4 04:19:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLY,HTML_MESSAGE,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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 932367F3F for ; Thu, 4 Apr 2013 04:19:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7EFEB8F804B for ; Thu, 4 Apr 2013 02:18:58 -0700 (PDT) X-ASG-Debug-ID: 1365067133-04cbb01fba229a90001-NocioJ Received: from mail-ie0-f171.google.com (mail-ie0-f171.google.com [209.85.223.171]) by cuda.sgi.com with ESMTP id 7EOIRHLOf9gVcOBq (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 04 Apr 2013 02:18:54 -0700 (PDT) X-Barracuda-Envelope-From: h.flora2012@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.171 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] Received: by mail-ie0-f171.google.com with SMTP id e14so2786277iej.30 for ; Thu, 04 Apr 2013 02:18:53 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:sender:date:x-google-sender-auth:message-id :subject:from:to:content-type; bh=eDccAZKOxstUewnUUHh80s1rRKbyVTzsUKPaBN/vUMQ=; b=UVjM5w3UzxJhcbyE6I7nFF6t0K07LIbKAp5huc9tSLuZ5lrGbdWbKphVvgpNy57iyT OKK2SlUmB92guRuUJIUliB8UPAzDZ+eQhz49ZOPTtWITeTYnLS/NFRDYQCkCerMWhE1u c74oqoHZNxEXW9UHZN4wysDbxlCP8CgAteexXBq5jse3K6HBmD+cWSTIn4snB5/nxf3O 04S0yoUt2zEvkRdU27CmAX33wbq4IzHuOAFIQj+pgpRBJ+UXvAFqFgHeiVxK2Tt5K1Fq eiN9pso8gL/lWjgn1oqZNNNyeg13EfX1AxuUiWK/TdN8SAjDNNZS1OmWHjHstgBL/97V 9KCw== MIME-Version: 1.0 X-Received: by 10.50.132.36 with SMTP id or4mr3562299igb.24.1365067133709; Thu, 04 Apr 2013 02:18:53 -0700 (PDT) Sender: h.flora2012@gmail.com Received: by 10.43.93.201 with HTTP; Thu, 4 Apr 2013 02:18:53 -0700 (PDT) Date: Thu, 4 Apr 2013 02:18:53 -0700 X-Google-Sender-Auth: HySkQfE1GVjNRPY64aNvMG1NgFU Message-ID: Subject: 2013 USA, California Human Right Foundation Conference!!!!! From: Lillian Christian X-ASG-Orig-Subj: 2013 USA, California Human Right Foundation Conference!!!!! To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=047d7b3a9b4c99c11904d98575a8 X-Barracuda-Connect: mail-ie0-f171.google.com[209.85.223.171] X-Barracuda-Start-Time: 1365067134 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.46 X-Barracuda-Spam-Status: No, SCORE=0.46 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127140 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.46 PLING_PLING Subject has lots of exclamation marks --047d7b3a9b4c99c11904d98575a8 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Dear Colleagues, On behalf of California Human Right Foundation CHRF USA, It is a great privilege for us to invite you to the global Congress meeting against Economic Crisis, Child Protection & HIV/AIDS Treatment, Prostitution, Sex Work and forced Labor. The aims of the conference are to bring together researchers and practitioners in an effort to lay the ground work for future collaborative research, advocacy, and program development as well as to educate social service, health care, and criminal justice professionals on human trafficking and the needs and risks of those victimized by the commercial sex industry. The global Congress meeting against Economic Crisis, Child Protection & HIV/AIDS Treatment, Prostitution, Sex Work and forced Labor, is scheduled to take place from June 20th =96 23rd 2013 in California the United States and in Madrid Spain, from 26th =96 30th of June 2013. The global congress = is hosted by the Campaign against Child Labor Coalition and sponsored by (The Bill & Melinda Gates Foundation, The William J. Clinton Foundation and other benevolent donors worldwide. Objectives of the Conference are. 1. To educate people the effect of child trafficking 2. To serve as a resource to the public and advocates by providing valuable information about other initiatives working to address human Trafficking sex trafficking 3. To provide rehabilitation services to victims. 4. To encourage policy at local and national levels that will contribute to reducing human trafficking 5. To provide insight in the activities in the field of science and policy interface; 6. To build a platform of knowledge at an international level; For more information contact the conference organizing committee via e-mail: Olivia.alexander@contractor.net Sincerely, Mrs Lillian Christian E-mail: info.lillianchristian@gmail.com --047d7b3a9b4c99c11904d98575a8 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Dear Colleagues,


=A0=A0=A0=A0=A0=A0=A0=A0 On behalf of Californi= a Human Right Foundation CHRF USA, It is a great privilege for us to invite you to=20 the global Congress meeting against Economic Crisis, Child Protection=20 & HIV/AIDS Treatment, Prostitution, Sex Work and forced Labor. The=20 aims of the conference are to bring together researchers and=20 practitioners in an effort to lay the ground work for future=20 collaborative research, advocacy, and program development as well as to=20 educate social service, health care, and criminal justice professionals=20 on human trafficking and the needs and risks of those victimized by the=20 commercial sex industry.

The global Congress meeting against=20 Economic Crisis, Child Protection & HIV/AIDS Treatment,=20 Prostitution, Sex Work and forced Labor, is scheduled to take place from June 20th =96 23rd 2013 in California the United States and in Madrid=20 Spain, from=A0 26th =96 30th of June 2013. The global congress is hosted by= =20 the Campaign against Child Labor Coalition and sponsored by (The Bill=20 & Melinda Gates Foundation, The William J. Clinton Foundation and=20 other benevolent donors worldwide.

Objectives of the Conference are.=

1. To educate people the effect of child trafficking
2. To serve as a resource to the public and advocates by providing=20 valuable information about other initiatives working to address human=20 Trafficking sex trafficking
3. To provide rehabilitation services to vic= tims.
4. To encourage policy at local and national levels that will cont= ribute to reducing human trafficking
5. To provide insight in the activ= ities in the field of science and policy interface;
6. To build a platform of knowledge at an international level;

For m= ore information contact the conference organizing committee via e-mail: Olivia.alexander@contractor= .net

Sincerely,
Mrs Lillian Christian
E-mail: info.lillianchristian@gmail.com
--047d7b3a9b4c99c11904d98575a8-- From rjohnston@sgi.com Thu Apr 4 06:59:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 478297F3F for ; Thu, 4 Apr 2013 06:59:39 -0500 (CDT) Received: from xmail.sgi.com (pv-excas3-dc21.corp.sgi.com [137.38.102.206]) by relay3.corp.sgi.com (Postfix) with ESMTP id B5A94AC003; Thu, 4 Apr 2013 04:59:35 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Thu, 4 Apr 2013 06:59:35 -0500 Message-ID: <515D6B3C.5070104@sgi.com> Date: Thu, 4 Apr 2013 06:59:56 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: CC: , Subject: Re: [PATCH] cleanup duplicates in all tests References: <20130403173245.376605011@sgi.com> In-Reply-To: <20130403173245.376605011@sgi.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks for the review Eric, this patch has been committed. --Rich commit 0efd4f4d483a725212f531bc2ed964de2766b1cd Author: Rich Johnston Date: Wed Apr 3 17:31:49 2013 +0000 xfstests: cleanup duplicates in all tests There are duplicate blank lines, comment hash and lines containing duplicate seqres= declarations, remove them. From mirsert@getmehosted.com Thu Apr 4 08:03:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 535957F37 for ; Thu, 4 Apr 2013 08:03:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 40ED4304064 for ; Thu, 4 Apr 2013 06:03:37 -0700 (PDT) X-ASG-Debug-ID: 1365080614-04cbb01fb823d280001-NocioJ Received: from cp1.ithosting.su (hosting4.itsoft.ru [193.106.92.90]) by cuda.sgi.com with ESMTP id ZrJ1d9JG6MUrBj0E (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 04 Apr 2013 06:03:36 -0700 (PDT) X-Barracuda-Envelope-From: mirsert@getmehosted.com X-Barracuda-Apparent-Source-IP: 193.106.92.90 Received: from [123.129.117.215] (helo=Unknown) by cp1.ithosting.su with esmtpa (Exim 4.80.1 (FreeBSD)) (envelope-from ) id 1UNjpD-000AYu-6O; Thu, 04 Apr 2013 17:03:32 +0400 Message-ID: <962A01AB43DD41CFB8E0EC9E0321D29D@sknyc> Reply-To: =?windows-1251?B?w+7x8fLw7unt4OTn7vA=?= From: =?windows-1251?B?w+7x8fLw7unt4OTn7vA=?= To: , , , , Subject: =?windows-1251?B?8fXl7Pss7vLu4fDg5uD++ejlIODw9ejy5ery?= =?windows-1251?B?8/Dt++Ug8OX45e3o/w==?= Date: Thu, 4 Apr 2013 15:03:41 +0200 X-ASG-Orig-Subj: =?windows-1251?B?8fXl7Pss7vLu4fDg5uD++ejlIODw9ejy5ery?= =?windows-1251?B?8/Dt++Ug8OX45e3o/w==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0A41_01CE3145.985031E0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cp1.ithosting.su X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [26 6] / [26 6] X-AntiAbuse: Sender Address Domain - getmehosted.com X-Barracuda-Connect: hosting4.itsoft.ru[193.106.92.90] X-Barracuda-Start-Time: 1365080615 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127154 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=_NextPart_000_0A41_01CE3145.985031E0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =EF=F0=EE=F4=E8=EB=FC=ED=FB=F5 =F1=EF=E5=F6= =E8=E0=EB=E8=F1=F2=EE=E2 =EF=EE=F1=E5=F2=E8=F2=FC =EC=E5=F0=EE=EF=F0=E8=FF= =F2=E8=E5 =EF=EE =F2=E5=EC=E0=F2=E8=EA=E5: =C2=C2=CE=C4 =C2 =DD=CA=D1=CF=CB=D3=C0=D2=C0=D6=C8=DE =CE=C1=DA=C5=CA=D2=C0= =CA=C0=CF=C8=D2=C0=CB=DC=CD=CE=C3=CE =D1=D2=D0-=C2=C0. =C0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =E2=EE=EF=F0=EE=F1=FB, =EA=EE=F2=EE=F0=FB=E5= =E1=F3=E4=F3=F2 =EE=E1=F1=F3=E6=E4=E0=F2=FC=F1=FF: - =D1=EE=F1=F2=E0=E2 =E8=F1=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=EE=E9 =E4=EE=EA= =F3=EC=E5=ED=F2=E0=F6=E8=E8 =EF=F0=E8 =F1=E4=E0=F7=E5 =EE=E1=FA=E5=EA=F2=E0= . - =CE=F1=ED=EE=E2=ED=FB=E5 =EE=F8=E8=E1=EA=E8, =E2=EB=E8=FF=FE=F9=E8=E5 =ED= =E0 =F1=F0=EE=EA=E8 =E2=E2=EE=E4=E0 =EE=E1=FA=E5=EA=F2=E0 =ED=E5=E4=E2=E8= =E6=E8=EC=EE=F1=F2=E8 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =CD=EE=F0=EC=E0=F2=E8=E2=ED=FB=E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB, =F0=E5=E3= =EB=E0=EC=E5=ED=F2=E8=F0=F3=FE=F9=E8=E5 =EF=EE=F0=FF=E4=EE=EA =E2=E2=EE=E4= =E0 =E7=E0=EA=EE=ED=F7=E5=ED=ED=EE=E3=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2= =E2=EE=EC =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =C0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED=FB=E9 =F0=E5=E3=EB=E0=EC=E5=ED= =F2: =C2=FB=E4=E0=F7=E0 =F0=E0=E7=F0=E5=F8=E5=ED=E8=E9 =ED=E0 =E2=E2=EE=E4= =EE=E1=FA=E5=EA=F2=EE=E2 =EA=E0=EF=E8=F2=E0=EB=FC=ED=EE=E3=EE =F1=F2=F0=EE= =E8=F2=E5=EB=FC=F1=F2=E2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =CF=F0=EE=F6=E5=E4=F3=F0=E0 =E2=FB=E4=E0=F7=E8 =E7=E0=EA=EB=FE=F7=E5=ED= =E8=FF =EE =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =EF=EE=F1=F2=F0=EE=E5=ED=ED= =EE=E3=EE =EE=E1=FA=E5=EA=F2=E0 =EF=F0=EE=E5=EA=F2=ED=EE=E9 =E4=EE=EA=F3=EC= =E5=ED=F2=E0=F6=E8=E8 =E8 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF=EC =F2=E5=F5=ED=E8= =F7=E5=F1=EA=E8=F5 =F0=E5=E3=EB=E0=EC=E5=ED=F2=EE=E2. - =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =D1=ED=E8=CF =E8 =E4=F0=F3=E3=E8=F5 =ED=EE= =F0=EC=E0=F2=E8=E2=EE=E2 =EF=F0=E8 =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8= =E8 =E8 =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E5. =E8 =E4=F0=F3=E3=E8=E5 =F2=E5=EC=FB =CF=F0=EE=E3=F0=E0=EC=EC=E0 =EF=EE=E4=E3=EE=F2=EE=E2=EB=E5=ED=E0 =EB=F3=F7= =F8=E8=EC=E8 =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2=E0=EC=E8 (=EF=F0=EE=F4=E5=F1=F1= =E8=EE=ED=E0=EB=E0=EC=E8) =E2 =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=EE=E9 =EE=F2= =F0=E0=F1=EB=E8! =D4=EE=F0=EC=E0=F2 =F1=E5=EC=E8=ED=E0=F0=E0 =EF=F0=E5=E4=EF=EE=EB=E0=E3=E0= =E5=F2 =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=FC =EF=F0=FF=EC=EE=E3=EE =E4=E8=E0=EB= =EE=E3=E0 =F1 =E4=EE=EA=EB=E0=E4=F7=E8=EA=EE=EC, =F7=F2=EE =EF=EE=E7=E2=EE= =EB=FF=E5=F2 =EA=E0=E6=E4=EE=EC=F3 =F1=EB=F3=F8=E0=F2=E5=EB=FE =EF=EE=EB=F3= =F7=E8=F2=FC =ED=E5=EE=E1=F5=EE=E4=E8=EC=F3=FE =EA=EE=ED=F1=F3=EB=FC=F2=E0= =F6=E8=FE, =F1=E2=FF=E7=E0=ED=ED=F3=FE =F1 =E2=E2=EE=E4=EE=EC =E2 =FD=EA=F1= =EF=EB=F3=E0=F2=E0=F6=E8=FE =EA=EE=ED=EA=F0=E5=F2=ED=EE=E3=EE =E7=E0=EA=EE= =ED=F7=E5=ED=ED=EE=E3=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=EE=EC =EE=E1= =FA=E5=EA=F2=E0. =CD=E0 =F1=E5=EC=E8=ED=E0=F0=E5 =E2=FB=F1=F2=F3=EF=E0=FE=F2 =F1 =E4=EE=EA= =EB=E0=E4=E0=EC=E8 =EF=F0=E5=E4=F1=F2=E0=E2=E8=F2=E5=EB=E8 =F1=EB=F3=E6=E1= , =EE=F2=E2=E5=F7=E0=FE=F9=E8=F5 =E7=E0 =F1=EE=E3=EB=E0=F1=EE=E2=E0=ED=E8= =E5 =E2=E2=EE=E4=E0 =EE=E1=FA=E5=EA=F2=EE=E2 =E2 =FD=EA=F1=EF=EB=F3=E0=F2= =E0=F6=E8=FE =E8 =F1=E0=EC=EE=F0=E5=E3=F3=EB=E8=F0=F3=E5=EC=FB=F5 =EE=F0=E3= =E0=ED=E8=E7=E0=F6=E8=E9; =E0 =F2=E0=EA=E6=E5 =FD=EA=F1=EF=E5=F0=F2=FB =E2= =EE=E1=EB=E0=F1=F2=E8 =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=FF =E8 =F1= =F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E0! =C4=E0=F2=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8= =FF: 08.04-09.04.2013, =E3=EE=F0.: =D1=C0=CD=CA=D2-=CF=C5=D2=C5=D0=C1=D3=D0= =C3 =C7=C0=CF=C8=D1=DC =CD=C0 =CA=D3=D0=D1: 8 * =F1=EF=E1 * 6=D7..2 . 47 * =F7=C7 =20 ------=_NextPart_000_0A41_01CE3145.985031E0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable

=CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =EF=F0=EE=F4=E8=EB=FC=ED=FB=F5 =F1=EF=E5= =F6=E8=E0=EB=E8=F1=F2=EE=E2 =EF=EE=F1=E5=F2=E8=F2=FC =EC=E5=F0=EE=EF=F0=E8= =FF=F2=E8=E5 =EF=EE =F2=E5=EC=E0=F2=E8=EA=E5:
=C2=C2=CE=C4 =C2= =DD=CA=D1=CF=CB=D3=C0=D2=C0=D6=C8=DE =CE=C1=DA=C5=CA=D2=C0 =CA=C0=CF=C8=D2= =C0=CB=DC=CD=CE=C3=CE =D1=D2=D0-=C2=C0.

=C0=EA=F2=F3= =E0=EB=FC=ED=FB=E5 =E2=EE=EF=F0=EE=F1=FB, =EA=EE=F2=EE=F0=FB=E5 =E1=F3=E4= =F3=F2 =EE=E1=F1=F3=E6=E4=E0=F2=FC=F1=FF:
- =D1=EE=F1=F2=E0=E2= =E8=F1=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6= =E8=E8 =EF=F0=E8 =F1=E4=E0=F7=E5 =EE=E1=FA=E5=EA=F2=E0.
- =CE= =F1=ED=EE=E2=ED=FB=E5 =EE=F8=E8=E1=EA=E8, =E2=EB=E8=FF=FE=F9=E8=E5 =ED=E0= =F1=F0=EE=EA=E8 =E2=E2=EE=E4=E0 =EE=E1=FA=E5=EA=F2=E0 =ED=E5=E4=E2=E8=E6= =E8=EC=EE=F1=F2=E8 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE.
= - =CD=EE=F0=EC=E0=F2=E8=E2=ED=FB=E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB, =F0=E5=E3= =EB=E0=EC=E5=ED=F2=E8=F0=F3=FE=F9=E8=E5 =EF=EE=F0=FF=E4=EE=EA =E2=E2=EE=E4= =E0 =E7=E0=EA=EE=ED=F7=E5=ED=ED=EE=E3=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2= =E2=EE=EC =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE.=
- =C0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED=FB=E9 =F0=E5=E3= =EB=E0=EC=E5=ED=F2: =C2=FB=E4=E0=F7=E0 =F0=E0=E7=F0=E5=F8=E5=ED=E8=E9 =ED= =E0 =E2=E2=EE=E4 =EE=E1=FA=E5=EA=F2=EE=E2 =EA=E0=EF=E8=F2=E0=EB=FC=ED=EE=E3= =EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0= =F6=E8=FE.
- =CF=F0=EE=F6=E5=E4=F3=F0=E0 =E2=FB=E4=E0=F7=E8 = =E7=E0=EA=EB=FE=F7=E5=ED=E8=FF =EE =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =EF= =EE=F1=F2=F0=EE=E5=ED=ED=EE=E3=EE =EE=E1=FA=E5=EA=F2=E0 =EF=F0=EE=E5=EA=F2= =ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8 =E8 =F2=F0=E5=E1=EE=E2=E0=ED= =E8=FF=EC =F2=E5=F5=ED=E8=F7=E5=F1=EA=E8=F5 =F0=E5=E3=EB=E0=EC=E5=ED=F2=EE= =E2.
- =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =D1=ED=E8=CF =E8 =E4=F0= =F3=E3=E8=F5 =ED=EE=F0=EC=E0=F2=E8=E2=EE=E2 =EF=F0=E8 =EF=F0=EE=E5=EA=F2=E8= =F0=EE=E2=E0=ED=E8=E8 =E8 =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E5.
=
=E8 =E4=F0=F3=E3=E8=E5 =F2=E5=EC=FB

=CF=F0=EE=E3= =F0=E0=EC=EC=E0 =EF=EE=E4=E3=EE=F2=EE=E2=EB=E5=ED=E0 =EB=F3=F7=F8=E8=EC=E8= =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2=E0=EC=E8 (=EF=F0=EE=F4=E5=F1=F1=E8=EE=ED=E0= =EB=E0=EC=E8) =E2 =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=EE=E9 =EE=F2=F0=E0=F1=EB= =E8!
=D4=EE=F0=EC=E0=F2 =F1=E5=EC=E8=ED=E0=F0=E0 =EF=F0=E5=E4= =EF=EE=EB=E0=E3=E0=E5=F2 =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=FC =EF=F0=FF=EC=EE= =E3=EE =E4=E8=E0=EB=EE=E3=E0 =F1 =E4=EE=EA=EB=E0=E4=F7=E8=EA=EE=EC, =F7=F2= =EE =EF=EE=E7=E2=EE=EB=FF=E5=F2 =EA=E0=E6=E4=EE=EC=F3 =F1=EB=F3=F8=E0=F2=E5= =EB=FE =EF=EE=EB=F3=F7=E8=F2=FC =ED=E5=EE=E1=F5=EE=E4=E8=EC=F3=FE =EA=EE=ED= =F1=F3=EB=FC=F2=E0=F6=E8=FE, =F1=E2=FF=E7=E0=ED=ED=F3=FE =F1 =E2=E2=EE=E4= =EE=EC =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =EA=EE=ED=EA=F0=E5=F2=ED=EE= =E3=EE =E7=E0=EA=EE=ED=F7=E5=ED=ED=EE=E3=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1= =F2=E2=EE=EC =EE=E1=FA=E5=EA=F2=E0.
=CD=E0 =F1=E5=EC=E8=ED=E0= =F0=E5 =E2=FB=F1=F2=F3=EF=E0=FE=F2 =F1 =E4=EE=EA=EB=E0=E4=E0=EC=E8 =EF=F0= =E5=E4=F1=F2=E0=E2=E8=F2=E5=EB=E8 =F1=EB=F3=E6=E1, =EE=F2=E2=E5=F7=E0=FE=F9= =E8=F5 =E7=E0 =F1=EE=E3=EB=E0=F1=EE=E2=E0=ED=E8=E5 =E2=E2=EE=E4=E0 =EE=E1= =FA=E5=EA=F2=EE=E2 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =E8 =F1=E0=EC= =EE=F0=E5=E3=F3=EB=E8=F0=F3=E5=EC=FB=F5 =EE=F0=E3=E0=ED=E8=E7=E0=F6=E8=E9= ; =E0 =F2=E0=EA=E6=E5 =FD=EA=F1=EF=E5=F0=F2=FB =E2 =EE=E1=EB=E0=F1=F2=E8 = =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=FF =E8 =F1=F2=F0=EE=E8=F2=E5=EB=FC= =F1=F2=E2=E0!

=C4=E0=F2=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF =EC= =E5=F0=EE=EF=F0=E8=FF=F2=E8=FF: 08.04-09.04.2013, =E3=EE=F0.: =D1=C0=CD=CA= =D2-=CF=C5=D2=C5=D0=C1=D3=D0=C3

=C7=C0=CF=C8=D1=DC =CD= =C0 =CA=D3=D0=D1:
8 * =F1=EF=E1 * 6=D7..2 = . 47 * =F7=C7

------=_NextPart_000_0A41_01CE3145.985031E0-- From treestem@gmail.com Thu Apr 4 10:50:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7A6CB7F37 for ; Thu, 4 Apr 2013 10:50:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 680EE304051 for ; Thu, 4 Apr 2013 08:50:20 -0700 (PDT) X-ASG-Debug-ID: 1365090616-04cbb01fba24e950001-NocioJ Received: from mail-ve0-f176.google.com (mail-ve0-f176.google.com [209.85.128.176]) by cuda.sgi.com with ESMTP id QGjH5gCNbyNaUzQt (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 04 Apr 2013 08:50:16 -0700 (PDT) X-Barracuda-Envelope-From: treestem@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.176 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.176] Received: by mail-ve0-f176.google.com with SMTP id ox1so2760389veb.35 for ; Thu, 04 Apr 2013 08:50:16 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.176] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.176] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=OFZg+39cVM2UI5v37C8WxYK/7fD/K/gevKL8fQysvHM=; b=ewBKVFDjseiG1dXbR04wjTXOUTUtbERZDiEltYnMF2a45WpJa/48Ew/d8w0mEVZkA0 Zz1vzRcGnQO4P22kxhbuN6YboVhNXonJaVhfRTA16tcA+vBERurQcodlBGgE6p9rHRwu Sx7+E1+xgy43SM19UW3JNY3uAUq32stcWaVmymi5iP0ezj0gw1DgC88HnFhkW5O3LZ/i C9UQjyEEYHvYm/FKUca7WkiAzA93rvqGLuB/YWjgXH+6V+3/Iou7CMQySiRd0El99Gc6 +A7IqLxjqaCpDHBKZFbTfteOy6pxSU4jaPXxYW/kOmr/gj5Jnrbmfl77f6BVUUKxWqU0 J4uA== MIME-Version: 1.0 X-Received: by 10.220.248.11 with SMTP id me11mr5137489vcb.26.1365090615988; Thu, 04 Apr 2013 08:50:15 -0700 (PDT) Received: by 10.220.119.204 with HTTP; Thu, 4 Apr 2013 08:50:15 -0700 (PDT) In-Reply-To: <20130404040041.GB12011@dastard> References: <20130404040041.GB12011@dastard> Date: Thu, 4 Apr 2013 11:50:15 -0400 Message-ID: Subject: Re: xfs_iomap_write_unwritten stuck in congestion_wait? From: Peter Watkins X-ASG-Orig-Subj: Re: xfs_iomap_write_unwritten stuck in congestion_wait? To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ve0-f176.google.com[209.85.128.176] X-Barracuda-Start-Time: 1365090616 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Apr 4, 2013 at 12:00 AM, Dave Chinner wrote: > On Wed, Apr 03, 2013 at 03:33:11PM -0400, Peter Watkins wrote: >> Hello, >> >> Wondering if anyone has a suggestion for when >> xfs_iomap_write_unwritten gets into congestion_wait. > > Do less IO? > >> In this case the system has almost half of normal zone pages in >> NR_WRITEBACK with pretty much everybody held up in either >> congestion_wait or balance_dirty_pages. > > Which is excessive - how are you getting to the point of having that > many pages under IO at once? Writeback depth is limited by the IO > elevator queue depths, so this shouldn't happen unless you've been > tweaking block device parameters (i.e. nr_requests/max_sectors_kb)... > >> Since there are some free pages, seems like we'd be better off just >> using a little more memory to finish this IO and in turn reduce pages >> under write-back and add to free memory, rather than holding up here. >> So maybe PF_MEMALLOC? > > Definitely not. Unwritten extent conversion can require hundreds of > kilobytes of memory to complete, so all this will do is trigger even > further exhaustion of memory reserves before we block on IO. > >> It also looks like this path allocates log vectors with KM_SLEEP but >> lv_buf's with KM_SLEEP|KM_NOFS. Why is that? > > The transaction commit is copying the changes made into separate > buffers to insert into the CIL for a later checkpoint to write to > disk. This is normal behaviour - we can sleep there, but we cannot > allow memory reclaim to recurse into the filesystem (for obvious > reasons). > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com Thanks for the help. There are other clues the VM system was rather quickly overwhelmed, i.e. it couldn't even get bdi flush threads started without sending threadd into congestion_wait. So indeed there is a big multi-threaded writer which starts all at once, and that can be smoothed out. And nr_requests is dialed up from 128 to 1024. Is anyone really able to resist that temptation? -Peter From bohdan_baida@creativiks.com Thu Apr 4 10:57:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 251607F37 for ; Thu, 4 Apr 2013 10:57:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 03C6E8F804B for ; Thu, 4 Apr 2013 08:57:36 -0700 (PDT) X-ASG-Debug-ID: 1365091051-04cb6c1e7925fdb0001-w1Z2WR Received: from u16546981.onlinehome-server.com (u16546981.onlinehome-server.com [74.208.147.32]) by cuda.sgi.com with ESMTP id YDRsDkOLU2X5qdAG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 04 Apr 2013 08:57:32 -0700 (PDT) X-Barracuda-Envelope-From: bohdan_baida@creativiks.com X-Barracuda-Apparent-Source-IP: 74.208.147.32 Received: from c-68-39-112-143.hsd1.nj.comcast.net (c-68-39-112-143.hsd1.nj.comcast.net [68.39.112.143]) by u16546981.onlinehome-server.com (Postfix) with ESMTPA id BD47F2C19 for ; Thu, 4 Apr 2013 11:43:08 -0400 (EDT) From: "Bohdan" Subject: Social network for 2D and 3D artists. To: "linux-xfs" X-ASG-Orig-Subj: Social network for 2D and 3D artists. Content-Type: multipart/alternative; boundary="xRiMRpUyNPtn=_Y817OxUT923MKNhZdKnb" MIME-Version: 1.0 Organization: bohdan_baida@creativiks.com Date: Thu, 4 Apr 2013 11:57:30 -0400 X-Barracuda-Connect: u16546981.onlinehome-server.com[74.208.147.32] X-Barracuda-Start-Time: 1365091052 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20130404155736.A76101296118@cuda.sgi.com> This is a multi-part message in MIME format --xRiMRpUyNPtn=_Y817OxUT923MKNhZdKnb Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =EF=BB=BFHello. My name is Bohdan. =20 I am creator of new network for all creative and talented people. 2D A= rtists, 3D Artists, Programmers, Writers, Designers Photographers and = a lot more=E2=80=A6 I would like to invite you to visit my web site, = this is very good and useful social network. Network with tutorials wh= ere you can sell or buy tutorial. Also this is freelancers network too= =2E And market place where you can sell your 3d Models and Images. This is very good network but very new, my web site is only 2 month ol= d and we don=E2=80=99t have too much content on it. If you are interes= ting be part of new creative network, be my guest. J Please register and help us to grow new and useful social network for = creative people. =20 If you have any questions or you need any help please feel free to ema= il me. =20 My website www.creativiks.com=20 =20 I hope to see you there. Thank you. =20 --xRiMRpUyNPtn=_Y817OxUT923MKNhZdKnb Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =EF=BB=BF<= HEAD>

Hello.

My name is Bohdan.

 

I am creator of new network for all creative and talented people. 2D= Artists, 3D Artists, Programmers, Writers, Designers Photographers an= d a lot more=E2=80=A6  I= would like to invite you to visit my web site, this is very good and = useful social network. Network with tutorials where you can sell or bu= y tutorial. Also this is freelancers network too. And market place whe= re you can sell your 3d Models and Images.

This is very good network but very new, my web site is only 2 month = old and we don=E2=80=99t have too much content on it. If you are inter= esting be part of new creative network, be my guest. J

Please register and help us to grow new and useful social network fo= r creative people.

  &nb= sp;           &= nbsp;      

If you have any questions or you need any help please feel free to e= mail me.

 

My website www.creativiks.com

 

I hope to see you there.

Thank you.

 

--xRiMRpUyNPtn=_Y817OxUT923MKNhZdKnb-- From bohdan_baida@creativiks.com Thu Apr 4 11:20:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 85EF37F37 for ; Thu, 4 Apr 2013 11:20:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2E0D6AC001 for ; Thu, 4 Apr 2013 09:20:12 -0700 (PDT) X-ASG-Debug-ID: 1365092407-04bdf0542c25f730001-NocioJ Received: from u16546981.onlinehome-server.com (u16546981.onlinehome-server.com [74.208.147.32]) by cuda.sgi.com with ESMTP id T1EdyeIKd4itrJ4d (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 04 Apr 2013 09:20:07 -0700 (PDT) X-Barracuda-Envelope-From: bohdan_baida@creativiks.com X-Barracuda-Apparent-Source-IP: 74.208.147.32 Received: from c-68-39-112-143.hsd1.nj.comcast.net (c-68-39-112-143.hsd1.nj.comcast.net [68.39.112.143]) by u16546981.onlinehome-server.com (Postfix) with ESMTPA id A4D852C35 for ; Thu, 4 Apr 2013 12:05:44 -0400 (EDT) From: "Bohdan" Subject: Social network for 2D and 3D artists. To: "xfs" X-ASG-Orig-Subj: Social network for 2D and 3D artists. Content-Type: multipart/alternative; boundary="SkhZVp5G62DJdW9XUoQIg3ClT=_VErvTxI" MIME-Version: 1.0 Organization: bohdan_baida@creativiks.com Date: Thu, 4 Apr 2013 12:20:05 -0400 X-Barracuda-Connect: u16546981.onlinehome-server.com[74.208.147.32] X-Barracuda-Start-Time: 1365092407 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20130404162011.E9546A42139@cuda.sgi.com> This is a multi-part message in MIME format --SkhZVp5G62DJdW9XUoQIg3ClT=_VErvTxI Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =EF=BB=BFHello. My name is Bohdan. =20 I am creator of new network for all creative and talented people. 2D A= rtists, 3D Artists, Programmers, Writers, Designers Photographers and = a lot more=E2=80=A6 I would like to invite you to visit my web site, = this is very good and useful social network. Network with tutorials wh= ere you can sell or buy tutorial. Also this is freelancers network too= =2E And market place where you can sell your 3d Models and Images. This is very good network but very new, my web site is only 2 month ol= d and we don=E2=80=99t have too much content on it. If you are interes= ting be part of new creative network, be my guest. J Please register and help us to grow new and useful social network for = creative people. =20 If you have any questions or you need any help please feel free to ema= il me. =20 My website www.creativiks.com=20 =20 I hope to see you there. Thank you. =20 --SkhZVp5G62DJdW9XUoQIg3ClT=_VErvTxI Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =EF=BB=BF<= HEAD>

Hello.

My name is Bohdan.

 

I am creator of new network for all creative and talented people. 2D= Artists, 3D Artists, Programmers, Writers, Designers Photographers an= d a lot more=E2=80=A6  I= would like to invite you to visit my web site, this is very good and = useful social network. Network with tutorials where you can sell or bu= y tutorial. Also this is freelancers network too. And market place whe= re you can sell your 3d Models and Images.

This is very good network but very new, my web site is only 2 month = old and we don=E2=80=99t have too much content on it. If you are inter= esting be part of new creative network, be my guest. J

Please register and help us to grow new and useful social network fo= r creative people.

  &nb= sp;           &= nbsp;      

If you have any questions or you need any help please feel free to e= mail me.

 

My website www.creativiks.com

 

I hope to see you there.

Thank you.

 

--SkhZVp5G62DJdW9XUoQIg3ClT=_VErvTxI-- From apache@rdlnx05.cloudapp.net Thu Apr 4 11:58:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 650737F37 for ; Thu, 4 Apr 2013 11:58:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 452708F8054 for ; Thu, 4 Apr 2013 09:58:52 -0700 (PDT) X-ASG-Debug-ID: 1365094729-04bdf0542d2649c0001-NocioJ Received: from mail.rdlnx05.cloudapp.net ([168.63.238.130]) by cuda.sgi.com with ESMTP id lABt4PwAl3a0daBA for ; Thu, 04 Apr 2013 09:58:50 -0700 (PDT) X-Barracuda-Envelope-From: apache@rdlnx05.cloudapp.net X-Barracuda-Apparent-Source-IP: 168.63.238.130 Received: by mail.rdlnx05.cloudapp.net (Postfix, from userid 48) id E5FAFE1D1F; Thu, 4 Apr 2013 16:58:48 +0000 (UTC) To: xfs@oss.sgi.com Subject: Re-validate your mailbox now. X-PHP-Originating-Script: 0:mailer.php X-ASG-Orig-Subj: Re-validate your mailbox now. From: Email Administrator Reply-To: Emailadministrator@administrator.com MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: <20130404165848.E5FAFE1D1F@mail.rdlnx05.cloudapp.net> Date: Thu, 4 Apr 2013 16:58:48 +0000 (UTC) X-Barracuda-Connect: UNKNOWN[168.63.238.130] X-Barracuda-Start-Time: 1365094729 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127169 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 Account User, Your mailbox has exceeded the limit of 30 GB, which is as set by your manager, you are currently at 30.9GB, very soon you will not be able to create new e-mail to send or receive again until you validate your mailbox.To re-validate your mailbox, click on the link below and follow the instruction for your upgrade. http://webhosting-elsalvador.com/ne/administrator_restore.htm Sincerely, Email Administrator. From david@fromorbit.com Thu Apr 4 15:25:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D46787F37 for ; Thu, 4 Apr 2013 15:25:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C2DBC304070 for ; Thu, 4 Apr 2013 13:25:55 -0700 (PDT) X-ASG-Debug-ID: 1365107152-04cbb01fb926f100001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id FLG4EOBaijMYS8Fa for ; Thu, 04 Apr 2013 13:25:53 -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: Av4TALbgXVF5LaeV/2dsb2JhbABDgwaCdbkshRkEAYEEF3SCHwEBBAE6HA8UBQsIAw4KCSUPBSUDIROIDgXBdBWNThuBHQeCX2EDlm2JdocYgx8ogS4 Received: from ppp121-45-167-149.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Apr 2013 06:55:52 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UNqjG-00052I-BQ; Fri, 05 Apr 2013 07:25:50 +1100 Date: Fri, 5 Apr 2013 07:25:50 +1100 From: Dave Chinner To: Peter Watkins Cc: xfs@oss.sgi.com Subject: Re: xfs_iomap_write_unwritten stuck in congestion_wait? Message-ID: <20130404202550.GE12011@dastard> X-ASG-Orig-Subj: Re: xfs_iomap_write_unwritten stuck in congestion_wait? References: <20130404040041.GB12011@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: 1365107152 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 04, 2013 at 11:50:15AM -0400, Peter Watkins wrote: > On Thu, Apr 4, 2013 at 12:00 AM, Dave Chinner wrote: > > On Wed, Apr 03, 2013 at 03:33:11PM -0400, Peter Watkins wrote: > >> Hello, > >> > >> Wondering if anyone has a suggestion for when > >> xfs_iomap_write_unwritten gets into congestion_wait. > > > > Do less IO? > > > >> In this case the system has almost half of normal zone pages in > >> NR_WRITEBACK with pretty much everybody held up in either > >> congestion_wait or balance_dirty_pages. > > > > Which is excessive - how are you getting to the point of having that > > many pages under IO at once? Writeback depth is limited by the IO > > elevator queue depths, so this shouldn't happen unless you've been > > tweaking block device parameters (i.e. nr_requests/max_sectors_kb)... > > > >> Since there are some free pages, seems like we'd be better off just > >> using a little more memory to finish this IO and in turn reduce pages > >> under write-back and add to free memory, rather than holding up here. > >> So maybe PF_MEMALLOC? > > > > Definitely not. Unwritten extent conversion can require hundreds of > > kilobytes of memory to complete, so all this will do is trigger even > > further exhaustion of memory reserves before we block on IO. > > > >> It also looks like this path allocates log vectors with KM_SLEEP but > >> lv_buf's with KM_SLEEP|KM_NOFS. Why is that? > > > > The transaction commit is copying the changes made into separate > > buffers to insert into the CIL for a later checkpoint to write to > > disk. This is normal behaviour - we can sleep there, but we cannot > > allow memory reclaim to recurse into the filesystem (for obvious > > reasons). > > > > Cheers, > > > > Dave. > > -- > > Dave Chinner > > david@fromorbit.com > > Thanks for the help. > > There are other clues the VM system was rather quickly overwhelmed, > i.e. it couldn't even get bdi flush threads started without sending > threadd into congestion_wait. Yeah, that's a sure sign that you'ev overloaded the system with dirty pages. > So indeed there is a big multi-threaded writer which starts all at > once, and that can be smoothed out. > > And nr_requests is dialed up from 128 to 1024. Is anyone really able > to resist that temptation? I haven't had to do this on a system to get decent write performance for years. And in general, the deepest IO parallelism you can get from SAS/SCSI/FC hardware devices is around 240 IOs, so going depper than that doesn't buy you a whole lot except for queuing up lots of IO and causing high IO latencie. FWIW, on HW RAID the BBWC is where all the significant IO aggregation and reordering takes place, not the IO elevator. The BBWC has a much bigger window for reordering than the elevator, and doesn't cause any nasty interactions with the VM by being large... Cheers, Dave. -- Dave Chinner david@fromorbit.com From psusi@ubuntu.com Thu Apr 4 15:31:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 60A2A7F37 for ; Thu, 4 Apr 2013 15:31:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2C2BE30404E for ; Thu, 4 Apr 2013 13:31:01 -0700 (PDT) X-ASG-Debug-ID: 1365107458-04bdf0542c27c1a0001-NocioJ Received: from cdptpa-omtalb.mail.rr.com (cdptpa-omtalb.mail.rr.com [75.180.132.120]) by cuda.sgi.com with ESMTP id RXzc47wBZAN6jAay for ; Thu, 04 Apr 2013 13:30:59 -0700 (PDT) X-Barracuda-Envelope-From: psusi@ubuntu.com X-Barracuda-Apparent-Source-IP: 75.180.132.120 X-Authority-Analysis: v=2.0 cv=XL2yuHdE c=1 sm=0 a=/DbS/tiKggfTkRRHPZEB4g==:17 a=Qsx_du5GiBkA:10 a=z55uD49gxukA:10 a=COy8bEXE5_QA:10 a=S1A5HrydsesA:10 a=fxJcL_dCAAAA:8 a=p-BZX3ACu3QA:10 a=B4b_7sLXiwL1hwJ14v4A:9 a=pILNOxqGKmIA:10 a=IVdq4P13A8TBZfKv:21 a=v7t9TdHflYM2TOe5:21 a=ImXnqaoifB7jbSX0JekA:9 a=QfKxxUxMAAAA:8 a=0Xpw0pVQFk0rD2PekuUA:9 a=/DbS/tiKggfTkRRHPZEB4g==:117 X-Cloudmark-Score: 0 X-Authenticated-User: X-Originating-IP: 67.78.168.186 Received: from [67.78.168.186] ([67.78.168.186:53735] helo=[10.1.1.236]) by cdptpa-oedge04.mail.rr.com (envelope-from ) (ecelerity 2.2.3.46 r()) with ESMTP id F4/3F-25887-103ED515; Thu, 04 Apr 2013 20:30:58 +0000 Message-ID: <515DE2FE.1080201@ubuntu.com> Date: Thu, 04 Apr 2013 16:30:54 -0400 From: Phillip Susi User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20130307 Thunderbird/17.0.4 MIME-Version: 1.0 To: Jens Axboe CC: CAI Qian , Dave Chinner , xfs@oss.sgi.com, LKML Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] References: <1462091996.435156.1364882416199.JavaMail.root@redhat.com> <247719576.438259.1364882929749.JavaMail.root@redhat.com> <20130402070537.GP6369@dastard> <20130402071937.GC3670@kernel.dk> <20130402073035.GD3670@kernel.dk> <14055702.547701.1364891947331.JavaMail.root@redhat.com> <20130402090047.GF3670@kernel.dk> <985125161.581860.1364895066584.JavaMail.root@redhat.com> <20130402094834.GA4667@kernel.dk> <20130403114142.GP4667@kernel.dk> <515C4D9D.10103@ubuntu.com> X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] In-Reply-To: <515C4D9D.10103@ubuntu.com> X-Enigmail-Version: 1.5.1 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="----enig2ASDWRAEQBRVKTGCVDNXI" X-Barracuda-Connect: cdptpa-omtalb.mail.rr.com[75.180.132.120] X-Barracuda-Start-Time: 1365107459 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 4880 and 3156) ------enig2ASDWRAEQBRVKTGCVDNXI Content-Type: multipart/mixed; boundary="------------090601000806040302040407" This is a multi-part message in MIME format. --------------090601000806040302040407 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable > I have not tested it yet, but I am pretty sure it won't work. It > looks like the patch changes the BLKRRPART path to go ahead and remove > existing partitions when GENHD_FL_NO_PARTSCAN is set. loop doesn't > issue the BLKRRPART ioctl when !LO_FLAGS_PARTSCAN so this won't help. > I think loop needs to set GENHD_FL_NO_PARTSCAN and then issue the > ioctl regardless of the LO_FLAGS_PARTSCAN flag to get the partitions > to be removed. I will try to test tonight. After testing, my initial thoughts appeared to have been correct. I had to modify the patch as follows. To test, simply do: truncate -s 10m img losetup /dev/loop0 img parted /dev/loop0 mklabel msdos mkpart primary ext2 1m 2m quit ls /dev/loop0* Note the /dev/loop0p1 node. Run losetup -d /dev/loop0 and see if it is still there. --------------090601000806040302040407 Content-Type: text/plain; charset=windows-1252; name="loop.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="loop.diff" diff --git a/block/ioctl.c b/block/ioctl.c index a31d91d..8b78b5a 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -155,7 +155,7 @@ static int blkdev_reread_part(struct block_device *bd= ev) struct gendisk *disk =3D bdev->bd_disk; int res; =20 - if (!disk_part_scan_enabled(disk) || bdev !=3D bdev->bd_contains) + if (bdev !=3D bdev->bd_contains) return -EINVAL; if (!capable(CAP_SYS_ADMIN)) return -EACCES; diff --git a/block/partition-generic.c b/block/partition-generic.c index 1cb4dec..0e7d637 100644 --- a/block/partition-generic.c +++ b/block/partition-generic.c @@ -430,6 +430,15 @@ rescan: disk->fops->revalidate_disk(disk); check_disk_size_change(disk, bdev); bdev->bd_invalidated =3D 0; + + /* + * If partition scanning is disabled, we are done. + */ + if (!disk_part_scan_enabled(disk)) { + kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE); + return 0; + } + if (!get_capacity(disk) || !(state =3D check_partition(disk, bdev))) return 0; if (IS_ERR(state)) { diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 8bc6d39..326fac9 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1039,11 +1039,9 @@ static int loop_clr_fd(struct loop_device *lo) lo->lo_state =3D Lo_unbound; /* This is safe: open() is still holding a reference. */ module_put(THIS_MODULE); - if (lo->lo_flags & LO_FLAGS_PARTSCAN && bdev) - ioctl_by_bdev(bdev, BLKRRPART, 0); + lo->lo_disk->flags |=3D GENHD_FL_NO_PART_SCAN; + ioctl_by_bdev(bdev, BLKRRPART, 0); lo->lo_flags =3D 0; - if (!part_shift) - lo->lo_disk->flags |=3D GENHD_FL_NO_PART_SCAN; mutex_unlock(&lo->lo_ctl_mutex); /* * Need not hold lo_ctl_mutex to fput backing file. --------------090601000806040302040407-- ------enig2ASDWRAEQBRVKTGCVDNXI Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.17 (MingW32) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBAgAGBQJRXeMBAAoJEJrBOlT6nu75C5QH+gOP9Mea7HorJ/XLfuoeMlWQ 4aTN0BeGDTfK39DzazN3NyAiftmKeqAzFI0g7YkR3CZzab+vG+0T6IcXFB/NYcwl 7+u+e/VcQecssvM0s614uMULaQ5Ou2MVE1inUjFNfIev1lu02l6pMv6m7yqp5fP1 ZJRx6VPhhNH+tZYrVaVNVwxJUMtoprRLpx3mXdWn4BGsd7J5mPBitJbY3o/gEsx/ dE6EZMOlFDBvsJ+YO4AsDdlif5s5T4geWC9L32zhDxdsedT6WMmyr302MQ0b6CZU 1Wxv71kL9gcDfXWkRwXtozfJV93avT1Kpa3Appb0648tQ/o90QzfSfBmN+2v3qM= =E2HM -----END PGP SIGNATURE----- ------enig2ASDWRAEQBRVKTGCVDNXI-- From qiyan.sun@teradata.com Thu Apr 4 16:44:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5137D7F37 for ; Thu, 4 Apr 2013 16:44:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2FC528F8049 for ; Thu, 4 Apr 2013 14:44:36 -0700 (PDT) X-ASG-Debug-ID: 1365111875-04cbb01fba2767c0001-NocioJ Received: from sam.nabble.com (sam.nabble.com [216.139.236.26]) by cuda.sgi.com with ESMTP id 4hpFzWnCXrAKI9WN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 04 Apr 2013 14:44:36 -0700 (PDT) X-Barracuda-Envelope-From: qiyan.sun@teradata.com X-Barracuda-Apparent-Source-IP: 216.139.236.26 Received: from tom.nabble.com ([192.168.236.105]) by sam.nabble.com with esmtp (Exim 4.72) (envelope-from ) id 1UNrxT-0007U3-PO for xfs@oss.sgi.com; Thu, 04 Apr 2013 14:44:35 -0700 Date: Thu, 4 Apr 2013 14:44:35 -0700 (PDT) From: qiyansun To: xfs@oss.sgi.com Message-ID: <1365111875631-34998.post@n7.nabble.com> In-Reply-To: <20100807100821.GC7362@dastard> References: <20100718012033.GA18888@dastard> <20100718235036.GC32635@dastard> <20100805062541.GC26402@dastard> <20100807100821.GC7362@dastard> Subject: Re: XFS hung on 2.6.33.3 kernel MIME-Version: 1.0 X-ASG-Orig-Subj: Re: XFS hung on 2.6.33.3 kernel Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sam.nabble.com[216.139.236.26] X-Barracuda-Start-Time: 1365111876 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127187 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, We ran into a similar situation described in this email thread on the 2.6.32.54 kernel using SLES11SP1. Are there any resolutions or patches available for this issue? Thanks, Qiyan -- View this message in context: http://xfs.9218.n7.nabble.com/XFS-hung-on-2-6-33-3-kernel-tp32292p34998.html Sent from the Xfs - General mailing list archive at Nabble.com. From tinguely@sgi.com Thu Apr 4 17:06:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 763707F37 for ; Thu, 4 Apr 2013 17:06:32 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 44AFB8F8052; Thu, 4 Apr 2013 15:06:28 -0700 (PDT) Message-ID: <515DF967.7000207@sgi.com> Date: Thu, 04 Apr 2013 17:06:31 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed References: <1364958561-12440-1-git-send-email-david@fromorbit.com> In-Reply-To: <1364958561-12440-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/02/13 22:09, Dave Chinner wrote: > From: Dave Chinner > > Filesystems are occasionally being shut down with this error: > > xfs_trans_ail_delete_bulk: attempting to delete a log item that is > not in the AIL. > > It was diagnosed to be related to the EFI/EFD commit order when the > EFI and EFD are in different checkpoints and the EFD is committed > before the EFI here: > > http://oss.sgi.com/archives/xfs/2013-01/msg00082.html > > The real problem is that a single bit cannot fully describe the > states that the EFI/EFD processing can be in. These completion > states are: > > EFI EFI in AIL EFD Result > committed/unpinned Yes committed OK > committed/pinned No committed Shutdown > uncommitted No committed Shutdown > > > Note that the "result" field is what should happen, not what does > happen. The current logic is broken and handles the first two cases > correctly by luck. That is, the code will free the EFI if the > XFS_EFI_COMMITTED bit is *not* set, rather than if it is set. The > inverted logic "works" because if both EFI and EFD are committed, > then the first __xfs_efi_release() call clears the XFS_EFI_COMMITTED > bit, and the second frees the EFI item. Hence as long as > xfs_efi_item_committed() has been called, everything appears to be > fine. > > It is the third case where the logic fails - where > xfs_efd_item_committed() is called before xfs_efi_item_committed(), > and that results in the EFI being freed before it has been > committed. That is the bug that triggered the shutdown, and hence > keeping track of whether the EFI has been committed or not is > insufficient to correctly order the EFI/EFD operations w.r.t. the > AIL. > > What we really want is this: the EFI is always placed into the > AIL before the last reference goes away. The only way to guarantee > that is that the EFI is not freed until after it has been unpinned > *and* the EFD has been committed. That is, restructure the logic so > that the only case that can occur is the first case. > > This can be done easily by replacing the XFS_EFI_COMMITTED with an > EFI reference count. The EFI is initialised with it's own count, and > that is not released until it is unpinned. However, there is a > complication to this method - the high level EFI/EFD code in > xfs_bmap_finish() does not hold direct references to the EFI > structure, and runs a transaction commit between the EFI and EFD > processing. Hence the EFI can be freed even before the EFD is > created using such a method. > > Further, log recovery uses the AIL for tracking EFI/EFDs that need > to be recovered, but it uses the AIL *differently* to the EFI > transaction commit. Hence log recovery never pins or unpins EFIs, so > we can't drop the EFI reference count indirectly to free the EFI. > > However, this doesn't prevent us from using a reference count here. > There is a 1:1 relationship between EFIs and EFDs, so when we > initialise the EFI we can take a reference count for the EFD as > well. This solves the xfs_bmap_finish() issue - the EFI will never > be freed until the EFD is processed. In terms of log recovery, > during the committing of the EFD we can look for the > XFS_EFI_RECOVERED bit being set and drop the EFI reference as well, > thereby ensuring everything works correctly there as well. Duh me, beside what our problem where the cil push callbacks are called out of order, there can be several xfs_trans_committed_bulk() running at the same time. Yep, the counter allows efi and efd to happen in any order and make sure the efi is entered into the AIL. Okay, the pass2 of recovery places the efi item into the AIL, and the second decrement on the counter when the XFS_EFI_RECOVERED bit gets the counter to zero in the recovery case because there is no unpin. Reviewed-by: Mark Tinguely This patch also prevents the only chance of detecting of out of sequence ctx callbacks. The out of sequence ctx callbacks *does* matter because the li_lsn is set by the ctx->start_lsn and the lowest li_lsn is used to move the tail. When the callbacks are out of order, it is possible for the larger lsn of the greater ctx sequence to move the log tail beyond a lower ctx sequence entries before the entries for the lower sequence ctx are moved into the AIL. --Mark. From david@fromorbit.com Thu Apr 4 19:45:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E6F9D7F37 for ; Thu, 4 Apr 2013 19:45:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5FD78AC003 for ; Thu, 4 Apr 2013 17:45:47 -0700 (PDT) X-ASG-Debug-ID: 1365122743-04cb6c1e79293f70001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id rd4fCv5PnAYHwcIa for ; Thu, 04 Apr 2013 17:45:44 -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: AgIUAJ0dXlF5LaeV/2dsb2JhbABDgwY2gj+5LIUZBAGBBRd0gh8BAQQBJxMcHAcFCwgDFQMJJQ8FJQMhEx6HcAUNwSkVjWmBHQeCX2EDjAOHJYNFhnmKFYMfKA Received: from ppp121-45-167-149.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.149]) by ipmail04.adl6.internode.on.net with ESMTP; 05 Apr 2013 11:15:42 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UNumi-0005Yy-Oc; Fri, 05 Apr 2013 11:45:40 +1100 Date: Fri, 5 Apr 2013 11:45:40 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed Message-ID: <20130405004540.GF12011@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed References: <1364958561-12440-1-git-send-email-david@fromorbit.com> <515DF967.7000207@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515DF967.7000207@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: 1365122743 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127199 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Apr 04, 2013 at 05:06:31PM -0500, Mark Tinguely wrote: > On 04/02/13 22:09, Dave Chinner wrote: > >From: Dave Chinner > > > >Filesystems are occasionally being shut down with this error: > > > >xfs_trans_ail_delete_bulk: attempting to delete a log item that is > >not in the AIL. > > > >It was diagnosed to be related to the EFI/EFD commit order when the > >EFI and EFD are in different checkpoints and the EFD is committed > >before the EFI here: > > > >http://oss.sgi.com/archives/xfs/2013-01/msg00082.html > > > >The real problem is that a single bit cannot fully describe the > >states that the EFI/EFD processing can be in. These completion > >states are: > > > >EFI EFI in AIL EFD Result > >committed/unpinned Yes committed OK > >committed/pinned No committed Shutdown > >uncommitted No committed Shutdown > > > > > >Note that the "result" field is what should happen, not what does > >happen. The current logic is broken and handles the first two cases > >correctly by luck. That is, the code will free the EFI if the > >XFS_EFI_COMMITTED bit is *not* set, rather than if it is set. The > >inverted logic "works" because if both EFI and EFD are committed, > >then the first __xfs_efi_release() call clears the XFS_EFI_COMMITTED > >bit, and the second frees the EFI item. Hence as long as > >xfs_efi_item_committed() has been called, everything appears to be > >fine. > > > >It is the third case where the logic fails - where > >xfs_efd_item_committed() is called before xfs_efi_item_committed(), > >and that results in the EFI being freed before it has been > >committed. That is the bug that triggered the shutdown, and hence > >keeping track of whether the EFI has been committed or not is > >insufficient to correctly order the EFI/EFD operations w.r.t. the > >AIL. > > > >What we really want is this: the EFI is always placed into the > >AIL before the last reference goes away. The only way to guarantee > >that is that the EFI is not freed until after it has been unpinned > >*and* the EFD has been committed. That is, restructure the logic so > >that the only case that can occur is the first case. > > > >This can be done easily by replacing the XFS_EFI_COMMITTED with an > >EFI reference count. The EFI is initialised with it's own count, and > >that is not released until it is unpinned. However, there is a > >complication to this method - the high level EFI/EFD code in > >xfs_bmap_finish() does not hold direct references to the EFI > >structure, and runs a transaction commit between the EFI and EFD > >processing. Hence the EFI can be freed even before the EFD is > >created using such a method. > > > >Further, log recovery uses the AIL for tracking EFI/EFDs that need > >to be recovered, but it uses the AIL *differently* to the EFI > >transaction commit. Hence log recovery never pins or unpins EFIs, so > >we can't drop the EFI reference count indirectly to free the EFI. > > > >However, this doesn't prevent us from using a reference count here. > >There is a 1:1 relationship between EFIs and EFDs, so when we > >initialise the EFI we can take a reference count for the EFD as > >well. This solves the xfs_bmap_finish() issue - the EFI will never > >be freed until the EFD is processed. In terms of log recovery, > >during the committing of the EFD we can look for the > >XFS_EFI_RECOVERED bit being set and drop the EFI reference as well, > >thereby ensuring everything works correctly there as well. > > Duh me, beside what our problem where the cil push callbacks are > called out of order, there can be several xfs_trans_committed_bulk() > running at the same time. I'm not sure that can actually happen - callback processing is supposed to be serialised by xlog_state_do_callback().... > Yep, the counter allows efi and efd to happen in any order and make > sure the efi is entered into the AIL. > > Okay, the pass2 of recovery places the efi item into the AIL, and > the second decrement on the counter when the XFS_EFI_RECOVERED bit > gets the counter to zero in the recovery case because there is no > unpin. > > Reviewed-by: Mark Tinguely Thank you. > This patch also prevents the only chance of detecting of out of > sequence ctx callbacks. I don't think the callbacks are being attached out of order. Like I said previously: if that were happening then the commit records are being written to the log in the wrong order and that is a *major* issue. As such, I've attached the informal proof that I just ran through to verify that the current code is ordering commit records and hence callbacks on iclogs correctly for multiple outstanding checkpoints. I don't see any obvious hole in the logic as the callbacks are attached to the iclog the commit record is written into and the commit records are strictly serialised and ordered... > The out of sequence ctx callbacks *does* > matter because the li_lsn is set by the ctx->start_lsn and the > lowest li_lsn is used to move the tail. When the callbacks are out > of order, it is possible for the larger lsn of the greater ctx > sequence to move the log tail beyond a lower ctx sequence entries > before the entries for the lower sequence ctx are moved into the > AIL. Assuming we are getting callbacks running out of order, this is only a problem if the AIL is empty at the time the out of order callbacks are run. If the AIL is not empty, then the tail of the log is derived directly from the LSN of the first item in the AIL and that LSN will be from an item committed from a previous checkpoint, not the current one that is runing out of order. Hence the tail of the log is not affected in this case. If the AIL is empty, then the tail LSN is determined by the lowest LSN of the iclogs being processed concurrently. This code in xlog_state_do_callback() is supposed to serialise and order the completion of multiple concurrent iclog completions: lowest_lsn = xlog_get_lowest_lsn(log); if (lowest_lsn && XFS_LSN_CMP(lowest_lsn, be64_to_cpu(iclog->ic_header.h_lsn)) < 0) { iclog = iclog->ic_next; continue; /* Leave this iclog for * another thread */ } IOWs, if the current iclog being checked for IO completion processing has a higher LSN than the lowest in all the iclogs that are not clean, then skip over it and check the next iclog. So, even if we have multiple concurrent iclogs in XLOG_STATE_DONE_SYNC/XLOG_STATE_DO_CALLBACK state, only the first that comes across the iclog with the lowest LSN in these states is supposed to run callbacks. And an iclog is considered in the xlog_get_lowest_lsn() calculation until it becomes dirty/active, which is a state transition that occurs *after* callbacks are run on the iclog. Further, once an iclog has been selected for callback processing, if it has callbacks on it, we do this: if (iclog->ic_callback) atomic64_set(&log->l_last_sync_lsn, be64_to_cpu(iclog->ic_header.h_lsn)); to set the tail of the log to match that of the current LSN of the iclog that is being processed. This is an "advance" update of the log tail that will be used until items are inserted into the AIL by callback processing (see xlog_assign_tail_lsn()). If there are not items to be placed into the AIL (i.e. it remains empty) then this ensures that the next log write still gets the tail LSN correct. And by this analysis, we should not be seeing concurrent execution of callbacks on different iclogs, nor should we be seeing out of order execution of callbacks on different iclogs. And because callbacks are ordered correctly by the CIL push code we shouldn't be seeing callbacks on a single iclog being run out of order either. IOWs, the tail LSN of the log should not be jumping around due to out of order iclog and/or callback processing. Unless there is a problem in xlog_state_do_callback() with serialising and ordering iclog IO completion processing, there shouldn't be a problem with out of order callback processing, either. Note that I haven't been through the iclog state machine in fine detail since 2007, so I'm going to need to spend a bit of time looking at it again to confirm this. I don't see any obvious problem at the moment, though.... Cheers, Dave. -- Dave Chinner david@fromorbit.com commit CIL operation: down_write(ctx lock) increment sequence switch ctxs spin_lock(cil lock) add old ctx to commit list spin_unlock(cil lock) up_write(ctx lock) write checkpoint to log spin_lock(cil lock) walk commiting list and wait for prior sequences to commit spin_unlock(cil lock) xfs_log_done() -> writes commit record, returns iclog, commit_lsn xfs_log_notify() -> attaches callback to iclog tail spin_lock(cil lock) ctx->commit_lsn = commit_lsn wake waiters spin_unlock(cil lock) release iclog spin_lock(cil lock) remove from committing list. spin_unlock(cil lock) Informal proof of sequence commit order correctness by induction: The initial context switching segment runs under an exclusive lock, and it means that S2 can not be started (and hence committed) until S1 is already in the committing list. So when S2 commits, if S1 has not yet written a commit record we have the initial condition of: commiting list: S2, commit_lsn = 0 S1, commit_lsn = 0 Now, if S2 writes it's checkpoint into the iclogs before S1 completes (e.g. S1 is a 10MB checkpoint, S2 is single inode core from a fsync) S2 enters the committing list check and sees: 528 restart: 529 spin_lock(&cil->xc_cil_lock); 530 list_for_each_entry(new_ctx, &cil->xc_committing, committing) { First entry is S2 531 /* 532 * Higher sequences will wait for this one so skip them. 533 * Don't wait for own own sequence, either. 534 */ 535 if (new_ctx->sequence >= ctx->sequence) 536 continue; new_ctx->sequence = S2, ctx->sequence = S2, so continue; Second entry is S1, so we see: new_ctx->sequence = S1, ctx->sequence = S2, so we now check the commit lsn: 537 if (!new_ctx->commit_lsn) { new_ctx->commit_lsn = 0, so we: 538 /* 539 * It is still being pushed! Wait for the push to 540 * complete, then start again from the beginning. 541 */ 542 xlog_wait(&cil->xc_commit_wait, &cil->xc_cil_lock); 543 goto restart; wait and restart once woken. 544 } 545 } 546 spin_unlock(&cil->xc_cil_lock); Eventually, S1 finishes writing the checkpoint, and enters the commit record loop: 528 restart: 529 spin_lock(&cil->xc_cil_lock); 530 list_for_each_entry(new_ctx, &cil->xc_committing, committing) { First entry is S2 531 /* 532 * Higher sequences will wait for this one so skip them. 533 * Don't wait for own own sequence, either. 534 */ 535 if (new_ctx->sequence >= ctx->sequence) 536 continue; new_ctx->sequence = S2, ctx->sequence = S1, so we continue. Second entry is S1, so again we continue, hit the end of list and drop out of the loop. At this point S1 writes the commit record, then attaches the callbacks to the *tail* of the iclog callback list. In doing this, it gets the commit_lsn of the commit record, so it does: ctx->commit_lsn = commit_lsn wakeup_all(&cil->xc_commit_wait); Which wakes up S2. S2 now does: _ 528 restart: 529 spin_lock(&cil->xc_cil_lock); 530 list_for_each_entry(new_ctx, &cil->xc_committing, committing) { First entry is S2 531 /* 532 * Higher sequences will wait for this one so skip them. 533 * Don't wait for own own sequence, either. 534 */ 535 if (new_ctx->sequence >= ctx->sequence) 536 continue; new_ctx->sequence = S2, ctx->sequence = S2, so we continue. Second entry is S1, so we now check the commit lsn: 537 if (!new_ctx->commit_lsn) { new_ctx->commit_lsn != 0, so again we continue, hit the end of list and fall through to the commit record write. This attaches the callback to the *tail* of the iclog callback list, so it ordered *after* the callbacks for S1. Hence the commit records appear to be correctly ordered by this code, as are the callbacks being attached to iclogs. So, for the case of S1, S2 the code is safe. For the case of S1, S2, S3, we have the same initial conditions: - S2 is not made active until S1 is on the commit list - S3 is not made active until S2 is on the commit list Hence if we have S1 still committing while S2 and S3 have completed their commits, the wait cycle looks like: S2: Sees S2, continue; Sees S1, sees commit_lsn == 0, waits S3: Sees S3, continue; Sees S2, sees commit_lsn == 0, waits S1: completes commit, Sees S3, continue; Sees S2, continue; Sees S1, continue; Writes commit record Attaches callbacks sets commit_lsn wakeup_all() S2: S3: wake, restart wake, restart [win wakeup race on cil lock] Sees S3, continue Sees S2, sees commit_lsn == 0, wait Sees S3, continue Sees S2, continue Sees S1, sees commit_lsn != 0, continue [lost wakeup race, spins on cil lock] [not woken until S2 already through] Sees S3, continue Sees S2, sees commit_lsn == 0, wait Writes commit record Attaches callbacks sets commit_lsn wakeup_all() S3: Sees S3, continue Sees S2, sees commit_lsn != 0, continue Sees S1, sees commit_lsn != 0, continue Writes commit record Attaches callbacks sets commit_lsn wakeup_all() And so the ordering of commit records and multiple callbacks on the same iclog are correct for S1, S2 and S3. So, for and arbitrary set of sequences {S1...Sn, S(n+1)}, the initial conditions are: - S2 is not made active until S1 is on the commit list .... - S(n+1) is not made active until Sn is on the commit list Hence if we have S1 still committing while Sn and S(n+1) have completed their commits, the wait cycle looks like: Sn: Sees Sn, continue; ..... Sees S1, sees commit_lsn == 0, waits S(n+1_: Sees S(n+1), continue; Sees Sn, sees commit_lsn == 0, waits S1: completes commit, Sees S(n+1), continue; Sees Sn, continue; ..... Sees S1, continue; Writes commit record Attaches callbacks sets commit_lsn wakeup_all() Sn: S(n+1): wake, restart wake, restart [win wakeup race on cil lock] Sees S(n+1), continue Sees Sn, sees commit_lsn == 0, wait Sees S(n+1), continue Sees Sn, continue ..... Sees S1, sees commit_lsn != 0, continue [lost wakeup race, spins on cil lock] [not woken until Sn already through] Sees S(n+1), continue Sees Sn, sees commit_lsn == 0, wait Writes commit record Attaches callbacks sets commit_lsn wakeup_all() S3: Sees S(n+1), continue Sees Sn, sees commit_lsn != 0, continue ..... Sees S1, sees commit_lsn != 0, continue Writes commit record Attaches callbacks sets commit_lsn wakeup_all() Hence by induction the ordering of commit records and multiple callbacks on the same iclog are correct for {S1...Sn, S(n+1)} QED From david@fromorbit.com Fri Apr 5 01:56:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C884F29DFE for ; Fri, 5 Apr 2013 01:56:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 44336AC006 for ; Thu, 4 Apr 2013 23:56:03 -0700 (PDT) X-ASG-Debug-ID: 1365144961-04cb6c1e782b04e0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id aV15lWiYBzNqQAic for ; Thu, 04 Apr 2013 23:56:01 -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: ApUUAAp1XlF5LaeV/2dsb2JhbABDgwY2gkC5MYUZBAGBBxd0gh8BAQU6HDMIAxgJJQ8FJQM0iBMNwRIVjWmBJBaDKgOWbZEOgx8o Received: from ppp121-45-167-149.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.149]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Apr 2013 17:25:57 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UO0Z2-0006CM-8o for xfs@oss.sgi.com; Fri, 05 Apr 2013 17:55:56 +1100 Date: Fri, 5 Apr 2013 17:55:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: Re: [PATCH 00/22] xfs: metadata CRCs, fourth version Message-ID: <20130405065556.GI12011@dastard> X-ASG-Orig-Subj: Re: [PATCH 00/22] xfs: metadata CRCs, fourth version References: <1364965892-19623-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1365144961 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127225 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 03, 2013 at 04:11:10PM +1100, Dave Chinner wrote: > Hi Folks, > > New CRC patchset. Previous versions: > > http://oss.sgi.com/archives/xfs/2013-01/msg00328.html > http://oss.sgi.com/archives/xfs/2013-02/msg00451.html > http://oss.sgi.com/archives/xfs/2013-03/msg00291.html > > This version is based on 3.9-rc4 + TOT xfsdev. 3.9-rc5 has loopback > bugs that make it useless for testing, so I've just kept my tree on > -rc4. > > New in this patch set: > > - numerous bug fixes > - cleanups to addresse Bens review comments > - logs entire inode allocation buffers > - reworks the buffer type tracking for log recovery > - fixes the endian issues reported by sparse > - splits out the symlink code rearrangement > - adds support for v5 superblock feature masks > - add mount warnings about CRC support being experimental > > Still to do: > > - Documentation (half written, not in series) So in finishing this off this afternoon, I realised that there is another aspect of inode modifications that isn't fully covered by the CRCs - the unlinked list modifications. That is because it happens under the covers directly to the inode buffer. This hasn't been detected so far, because the end result of this is that the CRC ends up still being valid. What happens is this: - last CRC is calculated with di_next_unlinked = NULLAGINO - xfs_iunlink() sets di_next_unlinked, invalidating the CRC - xfs_iunlink_remove() resets di_next_unlinked = NULLAGINO, making the CRC valid again. Then when all those mods are made: - inode reclaim flushes the inode, recalculating the CRC again, or: - xfs_ifree_cluster marks the inode XFS_ISTALE and it is not updated any further, leaving the CRC in a valid state. So, in all normal cases, the invalid CRC is not ever noticed as we don't verify the CRC for inode buffer operations. If we crash with an inode on the unlinked list or with transactions in the log that move it to/from the unlinked list, log replay will simply modify the buffer, similar to xfs_iunlink()/ xfs_iunlink_remove(), hence leaving us with an inode with a valid CRC again. This does need to be fixed, but I don't think it is a show stopper issue right now. As to how to fix it? I think that for version 3 inodes, I need to change the unlinked list handling to be logged in the core inode rather than as part of the buffer. Indeed, the di_next_unlinked field is already being logged in the inode core for version 3 inodes, so this is simply a code change that can be done without an on-disk format change or special new transactions. This is another reason I don't think this is a showstopper problem.... Comments? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 5 02:00:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A3AEF29DFE for ; Fri, 5 Apr 2013 02:00:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11A31AC00B for ; Fri, 5 Apr 2013 00:00:11 -0700 (PDT) X-ASG-Debug-ID: 1365145208-04cb6c1e772b0a60001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Rn2GrJmxV4PrhvAT for ; Fri, 05 Apr 2013 00:00:08 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AswUAAp1XlF5LaeV/2dsb2JhbAA5CoMGgna5MYFJg1AEAYEHF3SCHwEBBScTHBwXCBgMJQ8FJQM0GYd6wR8VjUofgRISg0ADjAOHJYNFhnWKGYMfKIEwJA Received: from ppp121-45-167-149.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.149]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Apr 2013 17:30:06 +1030 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UO0d4-0006D1-4d for xfs@oss.sgi.com; Fri, 05 Apr 2013 18:00:06 +1100 Date: Fri, 5 Apr 2013 18:00:06 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 23/22] xfs: add metadata CRC documentation Message-ID: <20130405070006.GJ12011@dastard> X-ASG-Orig-Subj: [PATCH 23/22] xfs: add metadata CRC documentation References: <1364965892-19623-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1365145208 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127225 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs: add metadata CRC documentation From: Dave Chinner Add some documentation about the self describing metadata and the code templates used to implement it. Signed-off-by: Dave Chinner --- .../filesystems/xfs-self-describing-metadata.txt | 352 ++++++++++++++++++++ 1 file changed, 352 insertions(+) diff --git a/Documentation/filesystems/xfs-self-describing-metadata.txt b/Documentation/filesystems/xfs-self-describing-metadata.txt new file mode 100644 index 0000000..da7edc9 --- /dev/null +++ b/Documentation/filesystems/xfs-self-describing-metadata.txt @@ -0,0 +1,352 @@ +XFS Self Describing Metadata +---------------------------- + +Introduction +------------ + +The largest scalability problem facing XFS is not one of algorithmic +scalability, but of verification of the filesystem structure. Scalabilty of the +structures and indexes on disk and the algorithms for iterating them are +adequate for supporting PB scale filesystems with billions of inodes, however it +is this very scalability that causes the verification problem. + +Almost all metadata on XFS is dynamically allocated. The only fixed location +metadata is the allocation group headers (SB, AGF, AGFL and AGI), while all +other metadata structures need to be discovered by walking the filesystem +structure in different ways. While this is already done by userspace tools for +validating and repairing the structure, there are limits to what they can +verify, and this in turn limits the supportable size of an XFS filesystem. + +For example, it is entirely possible to manually use xfs_db and a bit of +scripting to analyse the structure of a 100TB filesystem when trying to +determine the root cause of a corruption problem, but it is still mainly a +manual task of verifying that things like single bit errors or misplaced writes +weren't the ultimate cause of a corruption event. It may take a few hours to a +few days to perform such forensic analysis, so for at this scale root cause +analysis is entirely possible. + +However, if we scale the filesystem up to 1PB, we now have 10x as much metadata +to analyse and so that analysis blows out towards weeks/months of forensic work. +Most of the analysis work is slow and tedious, so as the amount of analysis goes +up, the more likely that the cause will be lost in the noise. Hence the primary +concern for supporting PB scale filesystems is minimising the time and effort +required for basic forensic analysis of the filesystem structure. + + +Self Describing Metadata +------------------------ + +One of the problems with the current metadata format is that apart from the +magic number in the metadata block, we have no other way of identifying what it +is supposed to be. We can't even identify if it is the right place. Put simply, +you can't look at a single metadata block in isolation and say "yes, it is +supposed to be there and the contents are valid". + +Hence most of the time spent on forensic analysis is spent doing basic +verification of metadata values, looking for values that are in range (and hence +not detected by automated verification checks) but are not correct. Finding and +understanding how things like cross linked block lists (e.g. sibling +pointers in a btree end up with loops in them) are the key to understanding what +went wrong, but it is impossible to tell what order the blocks were linked into +each other or written to disk after the fact. + +Hence we need to record more information into the metadata to allow us to +quickly determine if the metadata is intact and can be ignored for the purpose +of analysis. We can't protect against every possible type of error, but we can +ensure that common types of errors are easily detectable. Hence the concept of +self describing metadata. + +The first, fundamental requirement of self describing metadata is that the +metadata object contains some form of unique identifier in a well known +location. This allows us to identify the expected contents of the block and +hence parse and verify the metadata object. IF we can't independently identify +the type of metadata in the object, then the metadata doesn't describe itself +very well at all! + +Luckily, almost all XFS metadata has magic numbers embedded already - only the +AGFL, remote symlinks and remote attribute blocks do not contain identifying +magic numbers. Hence we can change the on-disk format of all these objects to +add more identifying information and detect this simply by changing the magic +numbers in the metadata objects. That is, if it has the current magic number, +the metadata isn't self identifying. If it contains a new magic number, it is +self identifying and we can do much more expansive automated verification of the +metadata object at runtime, during forensic analysis or repair. + +As a primary concern, self describing metadata needs to some form of overall +integrity checking. We cannot trust the metadata if we cannot verify that it has +not been changed as a result of external influences. Hence we need some form of +integrity check, and this is done by adding CRC32c validation to the metadata +block. If we can verify the block contains the metadata it was intended to +contain, a large amount of the manual verification work can be skipped. + +CRC32c was selected as metadata cannot be more than 64k in length in XFS and +hence a 32 bit CRC is more than sufficient to detect multi-bit errors in +metadata blocks. CRC32c is also now hardware accelerated on common CPUs so it is +fast. So while CRC32c is not the strongest of integrity checks that could be +used, it is more than sufficient for our needs and has relatively little +overhead. Adding support for larger integrity fields and/or algorithms does +really provide any extra value over CRC32c, but it does add a lot of complexity +and so there is no provision for changing the integrity checking mechanism. + +Self describing metadata needs to contain enough information so that the +metadata block can be verified as being in the correct place without needing to +look at any other metadata. This means it needs to contain location information. +Just adding a block number to the metadata is not sufficient to protect against +mis-directed writes - a write might be misdirected to the wrong LUN and so be +written to the "correct block" of the wrong filesystem. Hence location +information must contain a filesystem identifier as well as a block number. + +Another key information point in forensic analysis is knowing who the metadata +block belongs to. We already know it's type, it's location, that it's valid +and/or corrupted, and how long ago that it was last modified. Knowing the owner +of the block is important as it allows us to find other related metadata to +determine the scope of the corruption. For example, if we have a extent btree +object, we don't know what inode it belongs to and hence have to walk the entire +filesystem to find the owner of the block. Worse, the corruption could mean that +no owner can be found (i.e. it's an orphan block), and so without an owner field +in the metadata we have no idea of the scope of the corruption. If we have an +owner field in the metadata object, we can immediately do top down validation to +determine the scope of the problem. + +Different types of metadata have different owner identifiers. For example, +directory, attribute and extent tree blocks are all owned by an inode, whilst +freespace btree blocks are owned by an allocation group. Hence the size and +contents of the owner field are determined by the type of metadata object we are +looking at. For example, directories, extent maps and attributes are owned by +inodes, while freespace btree blocks are owned by a specific allocation group. +THe owner information can also identify misplaced writes (e.g. freespace btree +block written to the wrong AG). + +Self describing metadata also needs to contain some indication of when it was +written to the filesystem. One of the key information points when doing forensic +analysis is how recently the block was modified. Correlation of set of corrupted +metadata blocks based on modification times is important as it can indicate +whether the corruptions are related, whether there's been multiple corruption +events that lead to the eventual failure, and even whether there are corruptions +present that the run-time verification is not detecting. + +For example, we can determine whether a metadata object is supposed to be free +space or still allocated when it is still referenced by it's owner can be +determined by looking at when the free space btree block that contains the block +was last written compared to when the metadata object itself was last written. +If the free space block is more recent than the object and the objects owner, +then there is a very good chance that the block should have been removed from +it's owner. + +To provide this "written timestamp", each metadata block gets the Log Sequence +Number (LSN) of the most recent transaction it was modified on written into it. +This number will always increase over the life of the filesystem, and the only +thing that resets it is running xfs_repair on the filesystem. Further, by use of +the LSN we can tell if the corrupted metadata all belonged to the same log +checkpoint and hence have some idea of how much modification occurred between +the first and last instance of corrupt metadata on disk and, further, how much +modification occurred between the corruption being written and when it was +detected. + +Runtime Validation +------------------ + +Validation of self-describing metadata takes place at runtime in two places: + + - immediately after a successful read from disk + - immediately prior to write IO submission + +The verification is completely stateless - it is done independently of the +modification process, and seeks only to check that the metadata is what it says +it is and that the metadata fields are within bounds and internally consistent. +As such, we cannot catch all types of corruption that can occur within a block +as there may be certain limitations that operational state enforces of the +metadata, or there may be corruption of interblock relationships (e.g. corrupted +sibling pointer lists). Hence we still need stateful checking in the main code +body, but in general most of the per-field validation is handled by the +verifiers. + +For read verification, the caller needs to specify the expected type of metadata +that it should see, and the IO completion process verifies that the metadata +object matches what was expected. If the verification process fails, then it +marks the object being read as EFSCORRUPTED. The caller needs to catch this +error (same as for IO errors), and if it needs to take special action due to a +verification error it can do so by catching the EFSCORRUPTED error value. If we +need more discrimination of error type at higher levels, we can define new +error numbers for different errors as necessary. + +The first step in read verification is checking the magic number and determining +whether CRC validating is necessary. If it is, the CRC32c is caluclated and +compared against the value stored in the object itself. Once this is validated, +further checks are made against the location information, followed by extensive +object specific metadata validation. If any of these checks fail, then the +buffer is considered corrupt and the EFSCORRUPTED error is set appropriately. + +Write verification is the opposite of the read verification - first the object +is extensively verified and if it is OK we then update the LSN from the last +modification made to the object, After this, we calculate the CRC and insert it +into the object. Once this is done the write IO is allowed to continue. If any +error occurs during this process, the buffer is again marked with a EFSCORRUPTED +error for the higher layers to catch. + +Structures +---------- + +A typical on-disk structure needs to contain the following information: + +struct xfs_ondisk_hdr { + __be32 magic; /* magic number */ + __be32 crc; /* CRC, not logged */ + uuid_t uuid; /* filesystem identifier */ + __be64 owner; /* parent object */ + __be64 blkno; /* location on disk */ + __be64 lsn; /* last modification in log, not logged */ +}; + +Depending on the metadata, this information may be part of a header stucture +separate to the metadata contents, or may be distributed through an existing +structure. The latter occurs with metadata that already contains some of this +information, such as the superblock and AG headers. + +Other metadata may have different formats for the information, but the same +level of information is generally provided. For example: + + - short btree blocks have a 32 bit owner (ag number) and a 32 bit block + number for location. The two of these combined provide the same + information as @owner and @blkno in eh above structure, but using 8 + bytes less space on disk. + + - directory/attribute node blocks have a 16 bit magic number, and the + header that contains the magic number has other information in it as + well. hence the additional metadata headers change the overall format + of the metadata. + +A typical buffer read verifier is structured as follows: + +#define XFS_FOO_CRC_OFF offsetof(struct xfs_ondisk_hdr, crc) + +static void +xfs_foo_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_FOO_CRC_OFF)) || + !xfs_foo_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +The code ensures that the CRC is only checked if the filesystem has CRCs enabled +by checking the superblock of the feature bit, and then if the CRC verifies OK +(or is not needed) it then verifies the actual contents of the block. + +The verifier function will take a couple of different forms, depending on +whether the magic number can be used to determine the format of the block. In +the case it can't, the code will is structured as follows: + +static bool +xfs_foo_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_ondisk_hdr *hdr = bp->b_addr; + + if (hdr->magic != cpu_to_be32(XFS_FOO_MAGIC)) + return false; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) { + if (!uuid_equal(&hdr->uuid, &mp->m_sb.sb_uuid)) + return false; + if (bp->b_bn != be64_to_cpu(hdr->blkno)) + return false; + if (hdr->owner == 0) + return false; + } + + /* object specific verification checks here */ + + return true; +} + +If there are different magic numbers for the different formats, the verifier +will look like: + +static bool +xfs_foo_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_ondisk_hdr *hdr = bp->b_addr; + + if (hdr->magic == cpu_to_be32(XFS_FOO_CRC_MAGIC)) { + if (!uuid_equal(&hdr->uuid, &mp->m_sb.sb_uuid)) + return false; + if (bp->b_bn != be64_to_cpu(hdr->blkno)) + return false; + if (hdr->owner == 0) + return false; + } else if (hdr->magic != cpu_to_be32(XFS_FOO_MAGIC)) + return false; + + /* object specific verification checks here */ + + return true; +} + +Write verifiers are very similar to the read verifiers, they just do things in +the opposite order to the read verifiers. A typical write verifier: + +static void +xfs_foo_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_foo_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + + if (bip) { + struct xfs_ondisk_hdr *hdr = bp->b_addr; + hdr->lsn = cpu_to_be64(bip->bli_item.li_lsn); + } + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_FOO_CRC_OFF); +} + +This will verify the internal structure of the metadata before we go any +further, detecting corruptions that have occurred as the metadata has been +modified in memory. If the metadata verifies OK, and CRCs are enabled, we then +update the LSN field (when it was last modified) and calculate the CRC on the +metadata. Once this is done, we can issue the IO. + +Inodes and Dquots +----------------- + +Inodes and dquots are special snowflakes. They have per-object CRC and +self-identifiers, but they are packed so that there are multiple objects per +buffer. Hence we do not use per-buffer verifiers to do the work of per-object +verification and CRC calculations. The per-buffer verifiers simply perform basic +identification of the buffer - that they contain inodes or dquots, and that +there are magic numbers in all the expected spots. All further CRC and +verification checks are done when each inode is read from or written back to the +buffer. + +The structure of the verifiers and the identifiers checks is very similar to the +buffer code described above. The only difference is where they are called. For +example, inode read verification is done in xfs_iread() when the inode is first +read out of the buffer and the struct xfs_inode is instantiated. The inode is +already extensively verified during writeback in xfs_iflush_int, so the only +addition here add the LSN and CRC to the inode as it is copied back into the +buffer. + +XXX: inode unlinked list modification doesn't recalculate the inode CRC! None of +the unlinked list modifications check or update CRCs, neither during unlink nor +log recovery. So, it's gone unnoticed until now. This won't matter immediately - +repair will probably complain about it - but it needs to be fixed. + From Sebastian@imspositioning.com Fri Apr 5 04:20:56 2013 Return-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.7 required=5.0 tests=DATE_IN_PAST_06_12, DEAR_SOMETHING,HTML_MESSAGE,MIME_BASE64_TEXT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E5C3929DFE for ; Fri, 5 Apr 2013 04:20:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CDE1A8F804B for ; Fri, 5 Apr 2013 02:20:52 -0700 (PDT) X-ASG-Debug-ID: 1365153651-04cbb01fb92aaec0001-NocioJ Received: from mail.imspositioning.com (irker.arinity.org [199.193.255.250]) by cuda.sgi.com with ESMTP id zTDS9yqXD43w5Y6d for ; Fri, 05 Apr 2013 02:20:51 -0700 (PDT) X-Barracuda-Envelope-From: Sebastian@imspositioning.com X-Barracuda-Apparent-Source-IP: 199.193.255.250 X-AuthUser: Sebastian@imspositioning.com Received: from imspositioning.com ([122.118.12.32]:2735) by imspositioning.com with [XMail 1.27 ESMTP Server] id for from ; Fri, 5 Apr 2013 13:12:45 +0400 Date: Fri, 5 Apr 2013 06:15:31 +0800 From: "SD Machinery Taiwan" To: "xfs" Subject: SD Machinery Taiwan; Your only choice for the fully automation for Double Sides Turning machining lathe , Save time and Man =?utf-8?B?UG93ZXLigJRDb29wZXJhdGlvbg==?= wanted X-mailer: Foxmail 6, 14, 103, 24 [cn] X-ASG-Orig-Subj: SD Machinery Taiwan; Your only choice for the fully automation for Double Sides Turning machining lathe , Save time and Man =?utf-8?B?UG93ZXLigJRDb29wZXJhdGlvbg==?= wanted MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=====y6Z_BKUvr69I7qbPeRxPAm5IHVxT5w_XId_=====" Reply-To: machine@imstargeting.com X-Barracuda-Connect: irker.arinity.org[199.193.255.250] X-Barracuda-Start-Time: 1365153651 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.78 X-Barracuda-Spam-Status: No, SCORE=1.78 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_06_12, DATE_IN_PAST_06_12_2, HTML_MESSAGE, MIME_BASE64_TEXT, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 DATE_IN_PAST_06_12 Date: is 6 to 12 hours before Received: date 0.00 HTML_MESSAGE BODY: HTML included in message 0.52 MIME_BASE64_TEXT RAW: Message text disguised using base64 encoding 1.10 DATE_IN_PAST_06_12_2 DATE_IN_PAST_06_12_2 Message-Id: <20130405092052.87863106CF10@cuda.sgi.com> This is a multi-part message in MIME format --=====y6Z_BKUvr69I7qbPeRxPAm5IHVxT5w_XId_===== Content-Type: text/plain Content-Transfer-Encoding: base64 RGVhciBTaXI6DQogDQpHb29kIGRheXMNCiANClNEIG1hY2hpbmVyeSBwcm91ZGx5IHByZXNlbnRz IG91ciBUd2luIFR1cnJldHMsIFR3aW4gU3BpbmRsZXMgLFR3aW4gQ29udHJvbGxlcnMgTGF0aGUg U0RDLTQ1SCB3aXRoIEdhbnRyeSBSb2JvdCBBdXRvIExvYWRpbmcgU3lzdGVtIGZvciB5b3VyIERv dWJsZSBTaWRlcyBhdXRvbWF0aWNhbGx5IG1hY2hpbmluZyBwcm9jZXNzIA0KIA0KV2l0aCB0aGUg R2FudHJ5IFJvYm90IGFuZCBmZWVkaW5nIHRyYXkgTG9hZGluZyBzeXN0ZW0sIHlvdSBjYW4gc2F2 ZSBsb3RzIG1hbiBwb3dlciB3aXRoIGhpZ2hseSBwcmVjaXNpb24gdHVybmluZy4NCiANCkFsbCB5 b3UgaGF2ZSB0byBkbyBpcyB0byBwdXQgdGhlIHdvcmstcGllY2VzIG9uIHRoZSBmZWVkaW5nIHRy YXksIHRoZW4gcHVzaCB0aGUgc3RhcnQgYm90dG9tLCBhbmQgeW91IGFyZSBmcmVlIHRvIGhhbmRs ZSBvdmVyIHRoZSBvdGhlciB0aGluZ3MNClNhdmUgdGltZSBhbmQgbW9uZXkNCk9mIGNvdXJzZSwg c2F2ZSBsb3RzIG1hbiBwb3dlciBhbmQgb3RoZXIgY29zdCBmb3IgaGlyaW5nIHBlb3BsZQ0KIA0K UGxlYXNlIGNoZWNrIHRoZSBmb2xsb3dpbmcgaHlwZXJsaW5rIGZvciBtb3JlIGluZm9ybWF0aW9u DQogDQpNYWNoaW5lIGFjdGlvbiBNb3ZpZQ0KaHR0cDovL3lvdXR1LmJlL3dVNUVWWHFlZzFnDQog DQogDQpPbi1MaW5lIFBERiBicm9jaHVyZQ0KaHR0cDovL3lvdXR1LmJlLzhEWTNvN1hoTVE0DQog DQogDQogDQpUaGUgZm9sbG93aW5nIGlzIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBvdXIgVHdpbiBU dXJyZXQgTGF0aGUgDQoxLiAgICAgIE1heGltdW0gdHVybmluZyBkaWFtZXRlcjogMjIwIG1tDQoy LiAgICAgIFN3aW5nIG92ZXIgY3Jvc3Mgc2xpZGU6IDMzMCBtbQ0KMy4gICAgICBYIGF4aXMgdHJh dmVsOiAxMTUrNSBtbQ0KNC4gICAgICBaIGF4aXMgdHJhdmVsOiAxMzUgeCAyIG1tDQo1LiAgICAg IFNwaW5kbGUgbm9zZTogQTItNQ0KNi4gICAgICBTcGluZGxlIGJvcmU6IPggNDUgbW0NCjcuICAg ICAgVHVycmV0OiA4IFBvc2l0aW9ucyBoeWRyYXVsaWMgdHVycmV0DQo4LiAgICAgIENvbnRyb2xs ZXI6IFNZTlRFQ0ggOTAwDQo5LiAgICAgIE90aGVycw0KIA0KUmVnYXJkaW5nIHRoZSBhZnRlciBz ZXJ2aWNlLCBTRCBvZmZlciB5b3UgdGhlIGJlc3QgYW5kIG1vc3QgZHVyYWJsZSBtYWNoaW5lDQpZ b3UgYXJlIGZyZWUgZnJvbSB0aGUgYWZ0ZXIgc2VydmljZSANCiANCiANClNob3VsZCB5b3UgbmVl ZCBtb3JlIGluZm9ybWF0aW9uPw0KUGxlYXNlIGZlZWwgZnJlZSB0byBjb250YWN0IHVzDQogDQpT RCBNYWNoaW5lcnkgTWFya2V0aW5nIFRlYW0NCg== --=====y6Z_BKUvr69I7qbPeRxPAm5IHVxT5w_XId_===== Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PEhUTUwgeG1sbnM6byA9ICJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2Ui PjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVx dWl2PUNvbnRlbnQtVHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRlbnQ9Ik1TSFRNTCA4 LjAwLjYwMDEuMTkxMjAiPjwvSEVBRD4NCjxCT0RZIHNjcm9sbD15ZXM+PFNQQU4gbGFuZz1FTi1V Uz48Rk9OVCBmYWNlPUNhbGlicmk+DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgY2xh c3M9TXNvTm9ybWFsPjxTUEFOIGxhbmc9RU4tVVM+RGVhciBTaXI6PC9TUEFOPjwvUD4NCjxQIHN0 eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gbGFuZz1FTi1V Uz48bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNt IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIGxhbmc9RU4tVVM+R29vZCBkYXlzPC9TUEFOPjwv UD4NCjxQIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4g bGFuZz1FTi1VUz48L1NQQU4+Jm5ic3A7PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAw cHQiIGNsYXNzPU1zb05vcm1hbD48Qj48U1BBTiBzdHlsZT0iQkFDS0dST1VORDogeWVsbG93OyBD T0xPUjogI2MwMDAwMDsgRk9OVC1TSVpFOiAxNHB0OyBtc28tYmlkaS1mb250LXNpemU6IDE2LjBw dDsgbXNvLWhpZ2hsaWdodDogeWVsbG93IiBsYW5nPUVOLVVTPlNEIG1hY2hpbmVyeSBwcm91ZGx5 IHByZXNlbnRzIG91ciBUd2luIFR1cnJldHMsIFR3aW4gU3BpbmRsZXMgLFR3aW4gQ29udHJvbGxl cnMgTGF0aGUgU0RDLTQ1SCB3aXRoIEdhbnRyeSBSb2JvdCBBdXRvIExvYWRpbmcgU3lzdGVtIGZv ciB5b3VyIERvdWJsZSBTaWRlcyBhdXRvbWF0aWNhbGx5IG1hY2hpbmluZyBwcm9jZXNzPC9TUEFO PjwvQj48Qj48U1BBTiBzdHlsZT0iQ09MT1I6ICNjMDAwMDA7IEZPTlQtU0laRTogMTRwdDsgbXNv LWJpZGktZm9udC1zaXplOiAxNi4wcHQiIGxhbmc9RU4tVVM+IDxvOnA+PC9vOnA+PC9TUEFOPjwv Qj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxC PjxTUEFOIHN0eWxlPSJDT0xPUjogI2MwMDAwMDsgRk9OVC1TSVpFOiAxNHB0OyBtc28tYmlkaS1m b250LXNpemU6IDE2LjBwdCIgbGFuZz1FTi1VUz48bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L0I+ PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNzPU1zb05vcm1hbD48Qj48 U1BBTiBzdHlsZT0iQkFDS0dST1VORDogeWVsbG93OyBDT0xPUjogYmxhY2s7IEZPTlQtU0laRTog MTRwdDsgbXNvLWJpZGktZm9udC1zaXplOiAxNi4wcHQ7IG1zby1oaWdobGlnaHQ6IHllbGxvdyIg bGFuZz1FTi1VUz5XaXRoIHRoZSBHYW50cnkgUm9ib3QgYW5kIGZlZWRpbmcgdHJheSBMb2FkaW5n IHN5c3RlbSwgeW91IGNhbiBzYXZlIGxvdHMgbWFuIHBvd2VyIHdpdGggaGlnaGx5IHByZWNpc2lv biB0dXJuaW5nPC9TUEFOPjwvQj48Qj48U1BBTiBzdHlsZT0iQ09MT1I6IGJsYWNrOyBGT05ULVNJ WkU6IDE0cHQ7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTYuMHB0IiBsYW5nPUVOLVVTPi48bzpwPjwv bzpwPjwvU1BBTj48L0I+PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNz PU1zb05vcm1hbD48Qj48U1BBTiBzdHlsZT0iQ09MT1I6IGJsYWNrOyBGT05ULVNJWkU6IDE0cHQ7 IG1zby1iaWRpLWZvbnQtc2l6ZTogMTYuMHB0IiBsYW5nPUVOLVVTPjxvOnA+Jm5ic3A7PC9vOnA+ PC9TUEFOPjwvQj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgY2xhc3M9TXNv Tm9ybWFsPjxTUEFOIGxhbmc9RU4tVVM+QWxsIHlvdSBoYXZlIHRvIGRvIGlzIHRvIHB1dCB0aGUg d29yay1waWVjZXMgb24gdGhlIGZlZWRpbmcgdHJheSwgdGhlbiBwdXNoIHRoZSBzdGFydCBib3R0 b20sIGFuZCB5b3UgYXJlIGZyZWUgdG8gaGFuZGxlIG92ZXIgdGhlIG90aGVyIHRoaW5nczwvU1BB Tj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxT UEFOIGxhbmc9RU4tVVM+U2F2ZSB0aW1lIGFuZCBtb25leTwvU1BBTj48L1A+DQo8UCBzdHlsZT0i TUFSR0lOOiAwY20gMGNtIDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIGxhbmc9RU4tVVM+T2Yg Y291cnNlLCBzYXZlIGxvdHMgbWFuIHBvd2VyIGFuZCBvdGhlciBjb3N0IGZvciBoaXJpbmcgcGVv cGxlPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBjbGFzcz1Nc29O b3JtYWw+PFNQQU4gbGFuZz1FTi1VUz48L1NQQU4+Jm5ic3A7PC9QPg0KPFAgc3R5bGU9Ik1BUkdJ TjogMGNtIDBjbSAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiBsYW5nPUVOLVVTPlBsZWFzZSBj aGVjayB0aGUgZm9sbG93aW5nIGh5cGVybGluayBmb3IgbW9yZSBpbmZvcm1hdGlvbjwvU1BBTj48 L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFO IGxhbmc9RU4tVVM+PC9TUEFOPiZuYnNwOzwvUD48U1BBTiBsYW5nPUVOLVVTPg0KPFAgc3R5bGU9 Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiBsYW5nPUVOLVVTPk1h Y2hpbmUgYWN0aW9uIE1vdmllPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBjbSAwY20g MHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gbGFuZz1FTi1VUz48QSBocmVmPSJodHRwOi8veW91 dHUuYmUvd1U1RVZYcWVnMWciPmh0dHA6Ly95b3V0dS5iZS93VTVFVlhxZWcxZzwvQT48L1NQQU4+ PC9QPjwvU1BBTj4NCjxQIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBjbGFzcz1Nc29Ob3Jt YWw+PFNQQU4gbGFuZz1FTi1VUz48L1NQQU4+Jm5ic3A7PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjog MGNtIDBjbSAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiBsYW5nPUVOLVVTPjwvU1BBTj4mbmJz cDs8L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxT UEFOIGxhbmc9RU4tVVM+T24tTGluZSBQREYgYnJvY2h1cmU8L1NQQU4+PC9QPg0KPFAgc3R5bGU9 Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiBsYW5nPUVOLVVTPjxB IGhyZWY9Imh0dHA6Ly95b3V0dS5iZS84RFkzbzdYaE1RNCI+aHR0cDovL3lvdXR1LmJlLzhEWTNv N1hoTVE0PC9BPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgY2xh c3M9TXNvTm9ybWFsPjxTUEFOIGxhbmc9RU4tVVM+PG86cD4mbmJzcDs8L286cD48L1NQQU4+PC9Q Pg0KPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiBs YW5nPUVOLVVTPjwvU1BBTj4mbmJzcDs8L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBw dCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIGxhbmc9RU4tVVM+PG86cD4mbmJzcDs8L286cD48L1NQ QU4+PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNzPU1zb05vcm1hbD48 U1BBTiBsYW5nPUVOLVVTPlRoZSBmb2xsb3dpbmcgaXMgdGhlIHNwZWNpZmljYXRpb24gZm9yIG91 ciBUd2luIFR1cnJldCBMYXRoZSA8L1NQQU4+PC9QPg0KPFAgc3R5bGU9IlRFWFQtSU5ERU5UOiAt MThwdDsgTUFSR0lOOiAwY20gMGNtIDBwdCAxOHB0OyBtc28tcGFyYS1tYXJnaW4tbGVmdDogMGdk OyBtc28tbGlzdDogbDAgbGV2ZWwxIGxmbzEiIGNsYXNzPU1zb0xpc3RQYXJhZ3JhcGg+PFNQQU4g c3R5bGU9Im1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tYmlkaS1mb250LWZh bWlseTogQ2FsaWJyaSIgbGFuZz1FTi1VUz48U1BBTiBzdHlsZT0ibXNvLWxpc3Q6IElnbm9yZSI+ MS48U1BBTiBzdHlsZT0iRk9OVDogN3B0ICdUaW1lcyBOZXcgUm9tYW4nIj4mbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsgPC9TUEFOPjwvU1BBTj48L1NQQU4+PFNQQU4gbGFuZz1FTi1VUz5N YXhpbXVtIHR1cm5pbmcgZGlhbWV0ZXI6IDIyMCBtbTwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVY VC1JTkRFTlQ6IC0xOHB0OyBNQVJHSU46IDBjbSAwY20gMHB0IDE4cHQ7IG1zby1wYXJhLW1hcmdp bi1sZWZ0OiAwZ2Q7IG1zby1saXN0OiBsMCBsZXZlbDEgbGZvMSIgY2xhc3M9TXNvTGlzdFBhcmFn cmFwaD48U1BBTiBzdHlsZT0ibXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1i aWRpLWZvbnQtZmFtaWx5OiBDYWxpYnJpIiBsYW5nPUVOLVVTPjxTUEFOIHN0eWxlPSJtc28tbGlz dDogSWdub3JlIj4yLjxTUEFOIHN0eWxlPSJGT05UOiA3cHQgJ1RpbWVzIE5ldyBSb21hbiciPiZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L1NQQU4+PC9TUEFOPjwvU1BBTj48U1BBTiBs YW5nPUVOLVVTPlN3aW5nIG92ZXIgY3Jvc3Mgc2xpZGU6IDMzMCBtbTwvU1BBTj48L1A+DQo8UCBz dHlsZT0iVEVYVC1JTkRFTlQ6IC0xOHB0OyBNQVJHSU46IDBjbSAwY20gMHB0IDE4cHQ7IG1zby1w YXJhLW1hcmdpbi1sZWZ0OiAwZ2Q7IG1zby1saXN0OiBsMCBsZXZlbDEgbGZvMSIgY2xhc3M9TXNv TGlzdFBhcmFncmFwaD48U1BBTiBzdHlsZT0ibXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IENhbGli cmk7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiBDYWxpYnJpIiBsYW5nPUVOLVVTPjxTUEFOIHN0eWxl PSJtc28tbGlzdDogSWdub3JlIj4zLjxTUEFOIHN0eWxlPSJGT05UOiA3cHQgJ1RpbWVzIE5ldyBS b21hbiciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L1NQQU4+PC9TUEFOPjwvU1BB Tj48U1BBTiBsYW5nPUVOLVVTPlggYXhpcyB0cmF2ZWw6IDExNSs1IG1tPC9TUEFOPjwvUD4NCjxQ IHN0eWxlPSJURVhULUlOREVOVDogLTE4cHQ7IE1BUkdJTjogMGNtIDBjbSAwcHQgMThwdDsgbXNv LXBhcmEtbWFyZ2luLWxlZnQ6IDBnZDsgbXNvLWxpc3Q6IGwwIGxldmVsMSBsZm8xIiBjbGFzcz1N c29MaXN0UGFyYWdyYXBoPjxTUEFOIHN0eWxlPSJtc28tZmFyZWFzdC1mb250LWZhbWlseTogQ2Fs aWJyaTsgbXNvLWJpZGktZm9udC1mYW1pbHk6IENhbGlicmkiIGxhbmc9RU4tVVM+PFNQQU4gc3R5 bGU9Im1zby1saXN0OiBJZ25vcmUiPjQuPFNQQU4gc3R5bGU9IkZPTlQ6IDdwdCAnVGltZXMgTmV3 IFJvbWFuJyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvU1BBTj48L1NQQU4+PC9T UEFOPjxTUEFOIGxhbmc9RU4tVVM+WiBheGlzIHRyYXZlbDogMTM1IHggMiBtbTwvU1BBTj48L1A+ DQo8UCBzdHlsZT0iVEVYVC1JTkRFTlQ6IC0xOHB0OyBNQVJHSU46IDBjbSAwY20gMHB0IDE4cHQ7 IG1zby1wYXJhLW1hcmdpbi1sZWZ0OiAwZ2Q7IG1zby1saXN0OiBsMCBsZXZlbDEgbGZvMSIgY2xh c3M9TXNvTGlzdFBhcmFncmFwaD48U1BBTiBzdHlsZT0ibXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 IENhbGlicmk7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiBDYWxpYnJpIiBsYW5nPUVOLVVTPjxTUEFO IHN0eWxlPSJtc28tbGlzdDogSWdub3JlIj41LjxTUEFOIHN0eWxlPSJGT05UOiA3cHQgJ1RpbWVz IE5ldyBSb21hbiciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L1NQQU4+PC9TUEFO PjwvU1BBTj48U1BBTiBsYW5nPUVOLVVTPlNwaW5kbGUgbm9zZTogQTItNTwvU1BBTj48L1A+DQo8 UCBzdHlsZT0iVEVYVC1JTkRFTlQ6IC0xOHB0OyBNQVJHSU46IDBjbSAwY20gMHB0IDE4cHQ7IG1z by1wYXJhLW1hcmdpbi1sZWZ0OiAwZ2Q7IG1zby1saXN0OiBsMCBsZXZlbDEgbGZvMSIgY2xhc3M9 TXNvTGlzdFBhcmFncmFwaD48U1BBTiBzdHlsZT0ibXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IENh bGlicmk7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiBDYWxpYnJpIiBsYW5nPUVOLVVTPjxTUEFOIHN0 eWxlPSJtc28tbGlzdDogSWdub3JlIj42LjxTUEFOIHN0eWxlPSJGT05UOiA3cHQgJ1RpbWVzIE5l dyBSb21hbiciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L1NQQU4+PC9TUEFOPjwv U1BBTj48U1BBTiBsYW5nPUVOLVVTPlNwaW5kbGUgYm9yZTogw7ggNDUgbW08L1NQQU4+PC9QPg0K PFAgc3R5bGU9IlRFWFQtSU5ERU5UOiAtMThwdDsgTUFSR0lOOiAwY20gMGNtIDBwdCAxOHB0OyBt c28tcGFyYS1tYXJnaW4tbGVmdDogMGdkOyBtc28tbGlzdDogbDAgbGV2ZWwxIGxmbzEiIGNsYXNz PU1zb0xpc3RQYXJhZ3JhcGg+PFNQQU4gc3R5bGU9Im1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiBD YWxpYnJpOyBtc28tYmlkaS1mb250LWZhbWlseTogQ2FsaWJyaSIgbGFuZz1FTi1VUz48U1BBTiBz dHlsZT0ibXNvLWxpc3Q6IElnbm9yZSI+Ny48U1BBTiBzdHlsZT0iRk9OVDogN3B0ICdUaW1lcyBO ZXcgUm9tYW4nIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9TUEFOPjwvU1BBTj48 L1NQQU4+PFNQQU4gbGFuZz1FTi1VUz5UdXJyZXQ6IDggUG9zaXRpb25zIGh5ZHJhdWxpYyB0dXJy ZXQ8L1NQQU4+PC9QPg0KPFAgc3R5bGU9IlRFWFQtSU5ERU5UOiAtMThwdDsgTUFSR0lOOiAwY20g MGNtIDBwdCAxOHB0OyBtc28tcGFyYS1tYXJnaW4tbGVmdDogMGdkOyBtc28tbGlzdDogbDAgbGV2 ZWwxIGxmbzEiIGNsYXNzPU1zb0xpc3RQYXJhZ3JhcGg+PFNQQU4gc3R5bGU9Im1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tYmlkaS1mb250LWZhbWlseTogQ2FsaWJyaSIgbGFu Zz1FTi1VUz48U1BBTiBzdHlsZT0ibXNvLWxpc3Q6IElnbm9yZSI+OC48U1BBTiBzdHlsZT0iRk9O VDogN3B0ICdUaW1lcyBOZXcgUm9tYW4nIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsg PC9TUEFOPjwvU1BBTj48L1NQQU4+PFNQQU4gbGFuZz1FTi1VUz5Db250cm9sbGVyOiBTWU5URUNI IDkwMDwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1JTkRFTlQ6IC0xOHB0OyBNQVJHSU46IDBj bSAwY20gMHB0IDE4cHQ7IG1zby1wYXJhLW1hcmdpbi1sZWZ0OiAwZ2Q7IG1zby1saXN0OiBsMCBs ZXZlbDEgbGZvMSIgY2xhc3M9TXNvTGlzdFBhcmFncmFwaD48U1BBTiBzdHlsZT0ibXNvLWZhcmVh c3QtZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiBDYWxpYnJpIiBs YW5nPUVOLVVTPjxTUEFOIHN0eWxlPSJtc28tbGlzdDogSWdub3JlIj45LjxTUEFOIHN0eWxlPSJG T05UOiA3cHQgJ1RpbWVzIE5ldyBSb21hbiciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyA8L1NQQU4+PC9TUEFOPjwvU1BBTj48U1BBTiBsYW5nPUVOLVVTPk90aGVyczwvU1BBTj48L1A+ DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCAxOHB0OyBtc28tcGFyYS1tYXJnaW4tbGVm dDogMGdkIiBjbGFzcz1Nc29MaXN0UGFyYWdyYXBoPjxTUEFOIGxhbmc9RU4tVVM+PG86cD4mbmJz cDs8L286cD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNz PU1zb05vcm1hbD48U1BBTiBsYW5nPUVOLVVTPlJlZ2FyZGluZyB0aGUgYWZ0ZXIgc2VydmljZSwg U0Qgb2ZmZXIgeW91IHRoZSBiZXN0IGFuZCBtb3N0IGR1cmFibGUgbWFjaGluZTwvU1BBTj48L1A+ DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIGxh bmc9RU4tVVM+WW91IGFyZSBmcmVlIGZyb20gdGhlIGFmdGVyIHNlcnZpY2UgPC9TUEFOPjwvUD4N CjxQIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gbGFu Zz1FTi1VUz48bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAw Y20gMGNtIDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIGxhbmc9RU4tVVM+PG86cD4mbmJzcDs8 L286cD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiIGNsYXNzPU1z b05vcm1hbD48U1BBTiBsYW5nPUVOLVVTPlNob3VsZCB5b3UgbmVlZCBtb3JlIGluZm9ybWF0aW9u PzwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCIgY2xhc3M9TXNvTm9y bWFsPjxTUEFOIGxhbmc9RU4tVVM+UGxlYXNlIGZlZWwgZnJlZSB0byBjb250YWN0IHVzPC9TUEFO PjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQ QU4gbGFuZz1FTi1VUz48bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFS R0lOOiAwY20gMGNtIDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIGxhbmc9RU4tVVM+U0QgTWFj aGluZXJ5IE1hcmtldGluZyBUZWFtPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBjbSAw Y20gMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PC9GT05UPjwvU1BBTj48L1A+PC9CT0RZPjwvSFRNTD4N Cg== --=====y6Z_BKUvr69I7qbPeRxPAm5IHVxT5w_XId_=====-- From gzdroebv@ajsengineering.nl Fri Apr 5 05:43:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, LOTS_OF_MONEY,SUBJ_ALL_CAPS autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DBDB929DFE for ; Fri, 5 Apr 2013 05:43:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7044304070 for ; Fri, 5 Apr 2013 03:43:30 -0700 (PDT) X-ASG-Debug-ID: 1365158604-04cb6c1e772c32f0001-w1Z2WR Received: from vserver13.axc.nl (vserver13.axc.nl [159.253.0.21]) by cuda.sgi.com with ESMTP id OwrfJJP0Nx9OGkfg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 05 Apr 2013 03:43:25 -0700 (PDT) X-Barracuda-Envelope-From: gzdroebv@ajsengineering.nl X-Barracuda-Apparent-Source-IP: 159.253.0.21 Received: from apache by vserver13.axc.nl with local (Exim 4.76) (envelope-from ) id 1UO479-0008C4-SP for linux-xfs@oss.sgi.com; Fri, 05 Apr 2013 12:43:24 +0200 To: linux-xfs@oss.sgi.com Subject: JOB NOTIFICATION. X-PHP-Script: ajsengineering.nl/wp-content/themes/cleanple/images/cache//mailerxxx.php for 41.138.167.217 X-ASG-Orig-Subj: JOB NOTIFICATION. From: PHB BILLITON PLC Reply-To: bhpbilliton@rocketmail.com MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: Date: Fri, 05 Apr 2013 12:43:23 +0200 X-Barracuda-Connect: vserver13.axc.nl[159.253.0.21] X-Barracuda-Start-Time: 1365158605 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127239 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Attention; This offer is from BHP Billiton PLC United Kingdom., After evaluating your resume/CV Posted on our database, we are offering you the opportunity to work under 2 years renewable contract in the UK Oil pipeline project.In accordance with BHP standards, you must show a high degree of independence,ability to Work under pressure, highly motivated, ambitious and able to work with minimal supervision.For proper re-confirmation and verification of your Resume/CV, kindly re-submit your most Recent resume/CV immediately.BHP London Gas/pipeline project is scheduled to begin in June 2013 and the project will last for 6 years or more.The contract is valued at more than US 600 Trillion Euros and the framework of the London project covers all of the sectors in which our company is active, including upstream oil and gas, chemicals, gas-to-liquids, oil-to-liquids and coal-to-chemicals, electrical installation / technology etc. Under this contract, other multi-nationals will provide feasibility study,front-end engineering and design services as requested by BHP under pre-agreed terms and conditions.BHP Billiton will be working with British engineering group to provide exploration and development testing services in high- pressure,high-temperature(HP/HT)and deep water environments.The work will be done throughout EUROPE and serviced from BHP operations in London & Aberdeen,to optimize provision efficiencies. Our Benefits Includes: (a)Competitive allowances and compensation package as obtainable in theupstream construction Industries worldwide. (b) All contracts are meant to last for 24months (2years), and liable for upward review & renewal on expiration of the contract engagements. (c) £5,700.00 - £18,000.00 British Pounds Sterling per month, negotiable depending on qualifications and experiences will be paid (d) Medical health cares and check up services via our medical hospitals home & abroad.A swift response will be highly appreciated. Thank you, Faithfully Yours, BHP Billiton HR Dept Mr. James William Neat house Place Victoria London SW1V1BH Tel: (447035998534) Fax: (44 7092871465) From hpj@urpla.net Fri Apr 5 05:45:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EDB8629DFE for ; Fri, 5 Apr 2013 05:45:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 54218AC002 for ; Fri, 5 Apr 2013 03:45:22 -0700 (PDT) X-ASG-Debug-ID: 1365158718-04cbb01fb82b35b0001-NocioJ Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.186]) by cuda.sgi.com with ESMTP id VnfJr55uEhDniZgF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 05 Apr 2013 03:45:19 -0700 (PDT) X-Barracuda-Envelope-From: hpj@urpla.net X-Barracuda-Apparent-Source-IP: 212.227.126.186 Received: from lisa (p5B2A4B7A.dip0.t-ipconnect.de [91.42.75.122]) by mrelayeu.kundenserver.de (node=mreu1) with ESMTP (Nemesis) id 0MMJXF-1UGeYD3DSv-007iO9; Fri, 05 Apr 2013 12:45:09 +0200 Received: from localhost (localhost [127.0.0.1]) by tyrex.lisa.loc (Postfix) with ESMTP id 8C2651B971B00; Fri, 5 Apr 2013 12:45:08 +0200 (CEST) X-Virus-Scanned: amavisd-new at lisa.loc Received: from tyrex.lisa.loc ([127.0.0.1]) by localhost (tyrex.lisa.loc [127.0.0.1]) (amavisd-new, port 10024) with LMTP id KezJcTZqEENT; Fri, 5 Apr 2013 12:45:02 +0200 (CEST) From: Hans-Peter Jansen To: xfs@oss.sgi.com Cc: Dave Chinner Subject: Re: [PATCH 23/22] xfs: add metadata CRC documentation Date: Fri, 05 Apr 2013 12:45:02 +0200 X-ASG-Orig-Subj: Re: [PATCH 23/22] xfs: add metadata CRC documentation Message-ID: <23143019.xAQVWLRqiQ@xrated> User-Agent: KMail/4.10.2 (Linux/3.4.33-2.24-desktop; KDE/4.10.2; x86_64; ; ) In-Reply-To: <20130405070006.GJ12011@dastard> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <20130405070006.GJ12011@dastard> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:q4g9on319sK5naQ5DZx8SEUF8awL6HHkYqyI3ekC+Da 7/ZKV9S6L/8wUh8z4wbx63qg3CW32zj7XIhSmSIo4wIwuZ44HL Fh2DEz1SWc8ua06Tj0059YU4/FsmbCgSJ4CVDXOekWw4TCTHCg PX2ntrryAl9mtFuKcC/6xZbXgsIypqH8jUi+QyCQShxxPf0VPb xVozDvharnbD62GBNre9Q/Pe5ikEs2iMYe/KdQVjUis1qu1azY 0E72yNQ4PgNzD/Th8g8J0fO0i/6u02CgVT70WEknxADfqiPTrc rN0q04rV1yE4N+wYzkK9Hqbp6cIoG8Nsht2LTYDJs9nuNkQcg= = X-Barracuda-Connect: moutng.kundenserver.de[212.227.126.186] X-Barracuda-Start-Time: 1365158719 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127239 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Dave, On Freitag, 5. April 2013 18:00:06 Dave Chinner wrote: > xfs: add metadata CRC documentation > > From: Dave Chinner > > Add some documentation about the self describing metadata and the > code templates used to implement it. Nice text. This is the coolest addition to XFS since invention of sliced bread. One question arose from reading: since only the metadata is protected, any corruption of data blocks (file content) will still go unnoticed, does it? Allow me to propose some minor corrections (from the nitpick department..). > Signed-off-by: Dave Chinner > --- > .../filesystems/xfs-self-describing-metadata.txt | 352 ++++++++++++++++++++ > 1 file changed, 352 insertions(+) > > diff --git a/Documentation/filesystems/xfs-self-describing-metadata.txt b/Documentation/filesystems/xfs-self-describing-metadata.txt > new file mode 100644 > index 0000000..da7edc9 > --- /dev/null > +++ b/Documentation/filesystems/xfs-self-describing-metadata.txt > @@ -0,0 +1,352 @@ > +XFS Self Describing Metadata > +---------------------------- > + > +Introduction > +------------ > + > +The largest scalability problem facing XFS is not one of algorithmic > +scalability, but of verification of the filesystem structure. Scalabilty of the > +structures and indexes on disk and the algorithms for iterating them are > +adequate for supporting PB scale filesystems with billions of inodes, however it > +is this very scalability that causes the verification problem. > + > +Almost all metadata on XFS is dynamically allocated. The only fixed location > +metadata is the allocation group headers (SB, AGF, AGFL and AGI), while all > +other metadata structures need to be discovered by walking the filesystem > +structure in different ways. While this is already done by userspace tools for > +validating and repairing the structure, there are limits to what they can > +verify, and this in turn limits the supportable size of an XFS filesystem. > + > +For example, it is entirely possible to manually use xfs_db and a bit of > +scripting to analyse the structure of a 100TB filesystem when trying to > +determine the root cause of a corruption problem, but it is still mainly a > +manual task of verifying that things like single bit errors or misplaced writes > +weren't the ultimate cause of a corruption event. It may take a few hours to a > +few days to perform such forensic analysis, so for at this scale root cause > +analysis is entirely possible. > + > +However, if we scale the filesystem up to 1PB, we now have 10x as much metadata > +to analyse and so that analysis blows out towards weeks/months of forensic work. > +Most of the analysis work is slow and tedious, so as the amount of analysis goes > +up, the more likely that the cause will be lost in the noise. Hence the primary > +concern for supporting PB scale filesystems is minimising the time and effort > +required for basic forensic analysis of the filesystem structure. > + > + > +Self Describing Metadata > +------------------------ > + > +One of the problems with the current metadata format is that apart from the > +magic number in the metadata block, we have no other way of identifying what it > +is supposed to be. We can't even identify if it is the right place. Put simply, > +you can't look at a single metadata block in isolation and say "yes, it is > +supposed to be there and the contents are valid". > + > +Hence most of the time spent on forensic analysis is spent doing basic > +verification of metadata values, looking for values that are in range (and hence > +not detected by automated verification checks) but are not correct. Finding and > +understanding how things like cross linked block lists (e.g. sibling > +pointers in a btree end up with loops in them) are the key to understanding what > +went wrong, but it is impossible to tell what order the blocks were linked into > +each other or written to disk after the fact. > + > +Hence we need to record more information into the metadata to allow us to > +quickly determine if the metadata is intact and can be ignored for the purpose > +of analysis. We can't protect against every possible type of error, but we can > +ensure that common types of errors are easily detectable. Hence the concept of > +self describing metadata. > + > +The first, fundamental requirement of self describing metadata is that the > +metadata object contains some form of unique identifier in a well known > +location. This allows us to identify the expected contents of the block and > +hence parse and verify the metadata object. IF we can't independently identify > +the type of metadata in the object, then the metadata doesn't describe itself > +very well at all! > + > +Luckily, almost all XFS metadata has magic numbers embedded already - only the > +AGFL, remote symlinks and remote attribute blocks do not contain identifying > +magic numbers. Hence we can change the on-disk format of all these objects to > +add more identifying information and detect this simply by changing the magic > +numbers in the metadata objects. That is, if it has the current magic number, > +the metadata isn't self identifying. If it contains a new magic number, it is > +self identifying and we can do much more expansive automated verification of the > +metadata object at runtime, during forensic analysis or repair. > + > +As a primary concern, self describing metadata needs to some form of overall ^^ scratch that > +integrity checking. We cannot trust the metadata if we cannot verify that it has > +not been changed as a result of external influences. Hence we need some form of > +integrity check, and this is done by adding CRC32c validation to the metadata > +block. If we can verify the block contains the metadata it was intended to > +contain, a large amount of the manual verification work can be skipped. > + > +CRC32c was selected as metadata cannot be more than 64k in length in XFS and > +hence a 32 bit CRC is more than sufficient to detect multi-bit errors in > +metadata blocks. CRC32c is also now hardware accelerated on common CPUs so it is > +fast. So while CRC32c is not the strongest of integrity checks that could be ^ possible (perhaps) > +used, it is more than sufficient for our needs and has relatively little > +overhead. Adding support for larger integrity fields and/or algorithms does n't > +really provide any extra value over CRC32c, but it does add a lot of complexity > +and so there is no provision for changing the integrity checking mechanism. > + > +Self describing metadata needs to contain enough information so that the > +metadata block can be verified as being in the correct place without needing to > +look at any other metadata. This means it needs to contain location information. > +Just adding a block number to the metadata is not sufficient to protect against > +mis-directed writes - a write might be misdirected to the wrong LUN and so be > +written to the "correct block" of the wrong filesystem. Hence location > +information must contain a filesystem identifier as well as a block number. > + > +Another key information point in forensic analysis is knowing who the metadata > +block belongs to. We already know it's type, it's location, that it's valid shouldn't this spelled: its its > +and/or corrupted, and how long ago that it was last modified. Knowing the owner > +of the block is important as it allows us to find other related metadata to > +determine the scope of the corruption. For example, if we have a extent btree > +object, we don't know what inode it belongs to and hence have to walk the entire > +filesystem to find the owner of the block. Worse, the corruption could mean that > +no owner can be found (i.e. it's an orphan block), and so without an owner field > +in the metadata we have no idea of the scope of the corruption. If we have an > +owner field in the metadata object, we can immediately do top down validation to > +determine the scope of the problem. > + > +Different types of metadata have different owner identifiers. For example, > +directory, attribute and extent tree blocks are all owned by an inode, whilst > +freespace btree blocks are owned by an allocation group. Hence the size and > +contents of the owner field are determined by the type of metadata object we are > +looking at. For example, directories, extent maps and attributes are owned by > +inodes, while freespace btree blocks are owned by a specific allocation group. > +THe owner information can also identify misplaced writes (e.g. freespace btree The > +block written to the wrong AG). > + > +Self describing metadata also needs to contain some indication of when it was > +written to the filesystem. One of the key information points when doing forensic > +analysis is how recently the block was modified. Correlation of set of corrupted > +metadata blocks based on modification times is important as it can indicate > +whether the corruptions are related, whether there's been multiple corruption > +events that lead to the eventual failure, and even whether there are corruptions > +present that the run-time verification is not detecting. > + > +For example, we can determine whether a metadata object is supposed to be free > +space or still allocated when it is still referenced by it's owner can be its > +determined by looking at when the free space btree block that contains the block > +was last written compared to when the metadata object itself was last written. > +If the free space block is more recent than the object and the objects owner, > +then there is a very good chance that the block should have been removed from > +it's owner. > + > +To provide this "written timestamp", each metadata block gets the Log Sequence > +Number (LSN) of the most recent transaction it was modified on written into it. > +This number will always increase over the life of the filesystem, and the only > +thing that resets it is running xfs_repair on the filesystem. Further, by use of > +the LSN we can tell if the corrupted metadata all belonged to the same log > +checkpoint and hence have some idea of how much modification occurred between > +the first and last instance of corrupt metadata on disk and, further, how much > +modification occurred between the corruption being written and when it was > +detected. > + > +Runtime Validation > +------------------ > + > +Validation of self-describing metadata takes place at runtime in two places: > + > + - immediately after a successful read from disk > + - immediately prior to write IO submission > + > +The verification is completely stateless - it is done independently of the > +modification process, and seeks only to check that the metadata is what it says > +it is and that the metadata fields are within bounds and internally consistent. > +As such, we cannot catch all types of corruption that can occur within a block > +as there may be certain limitations that operational state enforces of the > +metadata, or there may be corruption of interblock relationships (e.g. corrupted > +sibling pointer lists). Hence we still need stateful checking in the main code > +body, but in general most of the per-field validation is handled by the > +verifiers. > + > +For read verification, the caller needs to specify the expected type of metadata > +that it should see, and the IO completion process verifies that the metadata > +object matches what was expected. If the verification process fails, then it > +marks the object being read as EFSCORRUPTED. The caller needs to catch this > +error (same as for IO errors), and if it needs to take special action due to a > +verification error it can do so by catching the EFSCORRUPTED error value. If we > +need more discrimination of error type at higher levels, we can define new > +error numbers for different errors as necessary. > + > +The first step in read verification is checking the magic number and determining > +whether CRC validating is necessary. If it is, the CRC32c is caluclated and cu > +compared against the value stored in the object itself. Once this is validated, > +further checks are made against the location information, followed by extensive > +object specific metadata validation. If any of these checks fail, then the > +buffer is considered corrupt and the EFSCORRUPTED error is set appropriately. > + > +Write verification is the opposite of the read verification - first the object > +is extensively verified and if it is OK we then update the LSN from the last > +modification made to the object, After this, we calculate the CRC and insert it > +into the object. Once this is done the write IO is allowed to continue. If any > +error occurs during this process, the buffer is again marked with a EFSCORRUPTED > +error for the higher layers to catch. > + > +Structures > +---------- > + > +A typical on-disk structure needs to contain the following information: > + > +struct xfs_ondisk_hdr { > + __be32 magic; /* magic number */ > + __be32 crc; /* CRC, not logged */ > + uuid_t uuid; /* filesystem identifier */ > + __be64 owner; /* parent object */ > + __be64 blkno; /* location on disk */ > + __be64 lsn; /* last modification in log, not logged */ > +}; > + > +Depending on the metadata, this information may be part of a header stucture structure > +separate to the metadata contents, or may be distributed through an existing > +structure. The latter occurs with metadata that already contains some of this > +information, such as the superblock and AG headers. > + > +Other metadata may have different formats for the information, but the same > +level of information is generally provided. For example: > + > + - short btree blocks have a 32 bit owner (ag number) and a 32 bit block > + number for location. The two of these combined provide the same > + information as @owner and @blkno in eh above structure, but using 8 > + bytes less space on disk. > + > + - directory/attribute node blocks have a 16 bit magic number, and the > + header that contains the magic number has other information in it as > + well. hence the additional metadata headers change the overall format > + of the metadata. > + > +A typical buffer read verifier is structured as follows: > + > +#define XFS_FOO_CRC_OFF offsetof(struct xfs_ondisk_hdr, crc) > + > +static void > +xfs_foo_read_verify( > + struct xfs_buf *bp) > +{ > + struct xfs_mount *mp = bp->b_target->bt_mount; > + > + if ((xfs_sb_version_hascrc(&mp->m_sb) && > + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), > + XFS_FOO_CRC_OFF)) || > + !xfs_foo_verify(bp)) { > + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); > + xfs_buf_ioerror(bp, EFSCORRUPTED); > + } > +} > + > +The code ensures that the CRC is only checked if the filesystem has CRCs enabled > +by checking the superblock of the feature bit, and then if the CRC verifies OK > +(or is not needed) it then verifies the actual contents of the block. ^^^^ scratch then perhaps > + > +The verifier function will take a couple of different forms, depending on > +whether the magic number can be used to determine the format of the block. In > +the case it can't, the code will is structured as follows: > + > +static bool > +xfs_foo_verify( > + struct xfs_buf *bp) > +{ > + struct xfs_mount *mp = bp->b_target->bt_mount; > + struct xfs_ondisk_hdr *hdr = bp->b_addr; > + > + if (hdr->magic != cpu_to_be32(XFS_FOO_MAGIC)) > + return false; > + > + if (!xfs_sb_version_hascrc(&mp->m_sb)) { > + if (!uuid_equal(&hdr->uuid, &mp->m_sb.sb_uuid)) > + return false; > + if (bp->b_bn != be64_to_cpu(hdr->blkno)) > + return false; > + if (hdr->owner == 0) > + return false; > + } > + > + /* object specific verification checks here */ > + > + return true; > +} > + > +If there are different magic numbers for the different formats, the verifier > +will look like: > + > +static bool > +xfs_foo_verify( > + struct xfs_buf *bp) > +{ > + struct xfs_mount *mp = bp->b_target->bt_mount; > + struct xfs_ondisk_hdr *hdr = bp->b_addr; > + > + if (hdr->magic == cpu_to_be32(XFS_FOO_CRC_MAGIC)) { > + if (!uuid_equal(&hdr->uuid, &mp->m_sb.sb_uuid)) > + return false; > + if (bp->b_bn != be64_to_cpu(hdr->blkno)) > + return false; > + if (hdr->owner == 0) > + return false; > + } else if (hdr->magic != cpu_to_be32(XFS_FOO_MAGIC)) > + return false; > + > + /* object specific verification checks here */ > + > + return true; > +} > + > +Write verifiers are very similar to the read verifiers, they just do things in > +the opposite order to the read verifiers. A typical write verifier: > + > +static void > +xfs_foo_write_verify( > + struct xfs_buf *bp) > +{ > + struct xfs_mount *mp = bp->b_target->bt_mount; > + struct xfs_buf_log_item *bip = bp->b_fspriv; > + > + if (!xfs_foo_verify(bp)) { > + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); > + xfs_buf_ioerror(bp, EFSCORRUPTED); > + return; > + } > + > + if (!xfs_sb_version_hascrc(&mp->m_sb)) > + return; > + > + > + if (bip) { > + struct xfs_ondisk_hdr *hdr = bp->b_addr; > + hdr->lsn = cpu_to_be64(bip->bli_item.li_lsn); > + } > + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_FOO_CRC_OFF); > +} > + > +This will verify the internal structure of the metadata before we go any > +further, detecting corruptions that have occurred as the metadata has been > +modified in memory. If the metadata verifies OK, and CRCs are enabled, we then > +update the LSN field (when it was last modified) and calculate the CRC on the > +metadata. Once this is done, we can issue the IO. > + > +Inodes and Dquots > +----------------- > + > +Inodes and dquots are special snowflakes. They have per-object CRC and > +self-identifiers, but they are packed so that there are multiple objects per > +buffer. Hence we do not use per-buffer verifiers to do the work of per-object > +verification and CRC calculations. The per-buffer verifiers simply perform basic > +identification of the buffer - that they contain inodes or dquots, and that > +there are magic numbers in all the expected spots. All further CRC and > +verification checks are done when each inode is read from or written back to the > +buffer. > + > +The structure of the verifiers and the identifiers checks is very similar to the > +buffer code described above. The only difference is where they are called. For > +example, inode read verification is done in xfs_iread() when the inode is first > +read out of the buffer and the struct xfs_inode is instantiated. The inode is > +already extensively verified during writeback in xfs_iflush_int, so the only > +addition here add the LSN and CRC to the inode as it is copied back into the ^ is to > +buffer. > + > +XXX: inode unlinked list modification doesn't recalculate the inode CRC! None of > +the unlinked list modifications check or update CRCs, neither during unlink nor > +log recovery. So, it's gone unnoticed until now. This won't matter immediately - > +repair will probably complain about it - but it needs to be fixed. > + Cheers, Pete From dhoworth@mrc-lmb.cam.ac.uk Fri Apr 5 06:20:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 58CFB29DFE for ; Fri, 5 Apr 2013 06:20:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1755A304071 for ; Fri, 5 Apr 2013 04:20:55 -0700 (PDT) X-ASG-Debug-ID: 1365160853-04bdf0542b2c22d0001-NocioJ Received: from ppsw-51.csi.cam.ac.uk (ppsw-51.csi.cam.ac.uk [131.111.8.151]) by cuda.sgi.com with ESMTP id oKvMaPVcQw1Xh3Am for ; Fri, 05 Apr 2013 04:20:53 -0700 (PDT) X-Barracuda-Envelope-From: dhoworth@mrc-lmb.cam.ac.uk X-Barracuda-Apparent-Source-IP: 131.111.8.151 X-Cam-AntiVirus: no malware found X-Cam-SpamDetails: not scanned X-Cam-ScannerInfo: http://www.ucs.cam.ac.uk/email/scanner/ Received: from nat.mrc-lmb.cam.ac.uk ([131.111.85.79]:47518 helo=mail.lmb.internal) by ppsw-51.csi.cam.ac.uk (ppsw.cam.ac.uk [131.111.8.138]:25) with esmtp id 1UO4hQ-0008Ss-Yn (Exim 4.72) for xfs@oss.sgi.com (return-path ); Fri, 05 Apr 2013 12:20:52 +0100 Received: from cpepc210-3.lmb.internal ([10.21.64.91]) by mail.lmb.internal with esmtp (Exim 4.63) (envelope-from ) id 1UO4hQ-00045f-A8 for xfs@oss.sgi.com; Fri, 05 Apr 2013 12:20:52 +0100 Message-ID: <515EB398.1090502@mrc-lmb.cam.ac.uk> Date: Fri, 05 Apr 2013 12:20:56 +0100 From: Dave Howorth Organization: MRC Laboratory for Molecular Biology User-Agent: Thunderbird 1.5.0.10 (X11/20060911) MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: [PATCH 23/22] xfs: add metadata CRC documentation References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <20130405070006.GJ12011@dastard> <23143019.xAQVWLRqiQ@xrated> X-ASG-Orig-Subj: Re: [PATCH 23/22] xfs: add metadata CRC documentation In-Reply-To: <23143019.xAQVWLRqiQ@xrated> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ppsw-51.csi.cam.ac.uk[131.111.8.151] X-Barracuda-Start-Time: 1365160853 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127242 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Most illuminating, thank you :) Allow me to add a few more nitpicks. Hans-Peter Jansen wrote: > Hi Dave, > > On Freitag, 5. April 2013 18:00:06 Dave Chinner wrote: >> xfs: add metadata CRC documentation >> >> From: Dave Chinner >> >> Add some documentation about the self describing metadata and the >> code templates used to implement it. > > Nice text. This is the coolest addition to XFS since invention of sliced bread. > > One question arose from reading: since only the metadata is protected, any > corruption of data blocks (file content) will still go unnoticed, does it? > > Allow me to propose some minor corrections (from the nitpick department..). > >> Signed-off-by: Dave Chinner >> --- >> .../filesystems/xfs-self-describing-metadata.txt | 352 ++++++++++++++++++++ >> 1 file changed, 352 insertions(+) >> >> diff --git a/Documentation/filesystems/xfs-self-describing-metadata.txt b/Documentation/filesystems/xfs-self-describing-metadata.txt >> new file mode 100644 >> index 0000000..da7edc9 >> --- /dev/null >> +++ b/Documentation/filesystems/xfs-self-describing-metadata.txt >> @@ -0,0 +1,352 @@ >> +XFS Self Describing Metadata >> +---------------------------- >> + >> +Introduction >> +------------ >> + >> +The largest scalability problem facing XFS is not one of algorithmic >> +scalability, but of verification of the filesystem structure. Scalabilty of the >> +structures and indexes on disk and the algorithms for iterating them are >> +adequate for supporting PB scale filesystems with billions of inodes, however it >> +is this very scalability that causes the verification problem. >> + >> +Almost all metadata on XFS is dynamically allocated. The only fixed location >> +metadata is the allocation group headers (SB, AGF, AGFL and AGI), while all >> +other metadata structures need to be discovered by walking the filesystem >> +structure in different ways. While this is already done by userspace tools for >> +validating and repairing the structure, there are limits to what they can >> +verify, and this in turn limits the supportable size of an XFS filesystem. >> + >> +For example, it is entirely possible to manually use xfs_db and a bit of >> +scripting to analyse the structure of a 100TB filesystem when trying to >> +determine the root cause of a corruption problem, but it is still mainly a >> +manual task of verifying that things like single bit errors or misplaced writes >> +weren't the ultimate cause of a corruption event. It may take a few hours to a >> +few days to perform such forensic analysis, so for at this scale root cause >> +analysis is entirely possible. >> + >> +However, if we scale the filesystem up to 1PB, we now have 10x as much metadata >> +to analyse and so that analysis blows out towards weeks/months of forensic work. >> +Most of the analysis work is slow and tedious, so as the amount of analysis goes >> +up, the more likely that the cause will be lost in the noise. Hence the primary >> +concern for supporting PB scale filesystems is minimising the time and effort >> +required for basic forensic analysis of the filesystem structure. >> + >> + >> +Self Describing Metadata >> +------------------------ >> + >> +One of the problems with the current metadata format is that apart from the >> +magic number in the metadata block, we have no other way of identifying what it >> +is supposed to be. We can't even identify if it is the right place. Put simply, >> +you can't look at a single metadata block in isolation and say "yes, it is >> +supposed to be there and the contents are valid". >> + >> +Hence most of the time spent on forensic analysis is spent doing basic >> +verification of metadata values, looking for values that are in range (and hence >> +not detected by automated verification checks) but are not correct. Finding and >> +understanding how things like cross linked block lists (e.g. sibling >> +pointers in a btree end up with loops in them) are the key to understanding what >> +went wrong, but it is impossible to tell what order the blocks were linked into >> +each other or written to disk after the fact. >> + >> +Hence we need to record more information into the metadata to allow us to >> +quickly determine if the metadata is intact and can be ignored for the purpose >> +of analysis. We can't protect against every possible type of error, but we can >> +ensure that common types of errors are easily detectable. Hence the concept of >> +self describing metadata. >> + >> +The first, fundamental requirement of self describing metadata is that the >> +metadata object contains some form of unique identifier in a well known >> +location. This allows us to identify the expected contents of the block and >> +hence parse and verify the metadata object. IF we can't independently identify >> +the type of metadata in the object, then the metadata doesn't describe itself >> +very well at all! >> + >> +Luckily, almost all XFS metadata has magic numbers embedded already - only the >> +AGFL, remote symlinks and remote attribute blocks do not contain identifying >> +magic numbers. Hence we can change the on-disk format of all these objects to >> +add more identifying information and detect this simply by changing the magic >> +numbers in the metadata objects. That is, if it has the current magic number, >> +the metadata isn't self identifying. If it contains a new magic number, it is >> +self identifying and we can do much more expansive automated verification of the >> +metadata object at runtime, during forensic analysis or repair. >> + >> +As a primary concern, self describing metadata needs to some form of overall > > ^^ scratch that > >> +integrity checking. We cannot trust the metadata if we cannot verify that it has >> +not been changed as a result of external influences. Hence we need some form of >> +integrity check, and this is done by adding CRC32c validation to the metadata >> +block. If we can verify the block contains the metadata it was intended to >> +contain, a large amount of the manual verification work can be skipped. >> + >> +CRC32c was selected as metadata cannot be more than 64k in length in XFS and >> +hence a 32 bit CRC is more than sufficient to detect multi-bit errors in >> +metadata blocks. CRC32c is also now hardware accelerated on common CPUs so it is >> +fast. So while CRC32c is not the strongest of integrity checks that could be > > ^ possible (perhaps) > >> +used, it is more than sufficient for our needs and has relatively little >> +overhead. Adding support for larger integrity fields and/or algorithms does > > n't > >> +really provide any extra value over CRC32c, but it does add a lot of complexity >> +and so there is no provision for changing the integrity checking mechanism. >> + >> +Self describing metadata needs to contain enough information so that the >> +metadata block can be verified as being in the correct place without needing to >> +look at any other metadata. This means it needs to contain location information. >> +Just adding a block number to the metadata is not sufficient to protect against >> +mis-directed writes - a write might be misdirected to the wrong LUN and so be >> +written to the "correct block" of the wrong filesystem. Hence location >> +information must contain a filesystem identifier as well as a block number. >> + >> +Another key information point in forensic analysis is knowing who the metadata >> +block belongs to. We already know it's type, it's location, that it's valid > > shouldn't this spelled: its its > >> +and/or corrupted, and how long ago that it was last modified. Knowing the owner >> +of the block is important as it allows us to find other related metadata to >> +determine the scope of the corruption. For example, if we have a extent btree >> +object, we don't know what inode it belongs to and hence have to walk the entire >> +filesystem to find the owner of the block. Worse, the corruption could mean that >> +no owner can be found (i.e. it's an orphan block), and so without an owner field >> +in the metadata we have no idea of the scope of the corruption. If we have an >> +owner field in the metadata object, we can immediately do top down validation to >> +determine the scope of the problem. >> + >> +Different types of metadata have different owner identifiers. For example, >> +directory, attribute and extent tree blocks are all owned by an inode, whilst >> +freespace btree blocks are owned by an allocation group. Hence the size and >> +contents of the owner field are determined by the type of metadata object we are >> +looking at. For example, directories, extent maps and attributes are owned by >> +inodes, while freespace btree blocks are owned by a specific allocation group. >> +THe owner information can also identify misplaced writes (e.g. freespace btree > > The > >> +block written to the wrong AG). >> + >> +Self describing metadata also needs to contain some indication of when it was >> +written to the filesystem. One of the key information points when doing forensic >> +analysis is how recently the block was modified. Correlation of set of corrupted >> +metadata blocks based on modification times is important as it can indicate >> +whether the corruptions are related, whether there's been multiple corruption >> +events that lead to the eventual failure, and even whether there are corruptions >> +present that the run-time verification is not detecting. >> + >> +For example, we can determine whether a metadata object is supposed to be free >> +space or still allocated when it is still referenced by it's owner can be > > its allocated. When > >> +determined by looking at when the free space btree block that contains the block >> +was last written compared to when the metadata object itself was last written. >> +If the free space block is more recent than the object and the objects owner, object's >> +then there is a very good chance that the block should have been removed from >> +it's owner. its >> + >> +To provide this "written timestamp", each metadata block gets the Log Sequence >> +Number (LSN) of the most recent transaction it was modified on written into it. >> +This number will always increase over the life of the filesystem, and the only >> +thing that resets it is running xfs_repair on the filesystem. Further, by use of >> +the LSN we can tell if the corrupted metadata all belonged to the same log >> +checkpoint and hence have some idea of how much modification occurred between >> +the first and last instance of corrupt metadata on disk and, further, how much >> +modification occurred between the corruption being written and when it was >> +detected. >> + >> +Runtime Validation >> +------------------ >> + >> +Validation of self-describing metadata takes place at runtime in two places: >> + >> + - immediately after a successful read from disk >> + - immediately prior to write IO submission >> + >> +The verification is completely stateless - it is done independently of the >> +modification process, and seeks only to check that the metadata is what it says >> +it is and that the metadata fields are within bounds and internally consistent. >> +As such, we cannot catch all types of corruption that can occur within a block >> +as there may be certain limitations that operational state enforces of the >> +metadata, or there may be corruption of interblock relationships (e.g. corrupted >> +sibling pointer lists). Hence we still need stateful checking in the main code >> +body, but in general most of the per-field validation is handled by the >> +verifiers. >> + >> +For read verification, the caller needs to specify the expected type of metadata >> +that it should see, and the IO completion process verifies that the metadata >> +object matches what was expected. If the verification process fails, then it >> +marks the object being read as EFSCORRUPTED. The caller needs to catch this >> +error (same as for IO errors), and if it needs to take special action due to a >> +verification error it can do so by catching the EFSCORRUPTED error value. If we >> +need more discrimination of error type at higher levels, we can define new >> +error numbers for different errors as necessary. >> + >> +The first step in read verification is checking the magic number and determining >> +whether CRC validating is necessary. If it is, the CRC32c is caluclated and > > cu > >> +compared against the value stored in the object itself. Once this is validated, >> +further checks are made against the location information, followed by extensive >> +object specific metadata validation. If any of these checks fail, then the >> +buffer is considered corrupt and the EFSCORRUPTED error is set appropriately. >> + >> +Write verification is the opposite of the read verification - first the object >> +is extensively verified and if it is OK we then update the LSN from the last >> +modification made to the object, After this, we calculate the CRC and insert it >> +into the object. Once this is done the write IO is allowed to continue. If any >> +error occurs during this process, the buffer is again marked with a EFSCORRUPTED >> +error for the higher layers to catch. >> + >> +Structures >> +---------- >> + >> +A typical on-disk structure needs to contain the following information: >> + >> +struct xfs_ondisk_hdr { >> + __be32 magic; /* magic number */ >> + __be32 crc; /* CRC, not logged */ >> + uuid_t uuid; /* filesystem identifier */ >> + __be64 owner; /* parent object */ >> + __be64 blkno; /* location on disk */ >> + __be64 lsn; /* last modification in log, not logged */ >> +}; >> + >> +Depending on the metadata, this information may be part of a header stucture > > structure > >> +separate to the metadata contents, or may be distributed through an existing >> +structure. The latter occurs with metadata that already contains some of this >> +information, such as the superblock and AG headers. >> + >> +Other metadata may have different formats for the information, but the same >> +level of information is generally provided. For example: >> + >> + - short btree blocks have a 32 bit owner (ag number) and a 32 bit block >> + number for location. The two of these combined provide the same >> + information as @owner and @blkno in eh above structure, but using 8 the >> + bytes less space on disk. >> + >> + - directory/attribute node blocks have a 16 bit magic number, and the >> + header that contains the magic number has other information in it as >> + well. hence the additional metadata headers change the overall format >> + of the metadata. >> + >> +A typical buffer read verifier is structured as follows: >> + >> +#define XFS_FOO_CRC_OFF offsetof(struct xfs_ondisk_hdr, crc) >> + >> +static void >> +xfs_foo_read_verify( >> + struct xfs_buf *bp) >> +{ >> + struct xfs_mount *mp = bp->b_target->bt_mount; >> + >> + if ((xfs_sb_version_hascrc(&mp->m_sb) && >> + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), >> + XFS_FOO_CRC_OFF)) || >> + !xfs_foo_verify(bp)) { >> + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); >> + xfs_buf_ioerror(bp, EFSCORRUPTED); >> + } >> +} >> + >> +The code ensures that the CRC is only checked if the filesystem has CRCs enabled >> +by checking the superblock of the feature bit, and then if the CRC verifies OK >> +(or is not needed) it then verifies the actual contents of the block. > > ^^^^ scratch then perhaps > >> + >> +The verifier function will take a couple of different forms, depending on >> +whether the magic number can be used to determine the format of the block. In >> +the case it can't, the code will is structured as follows: scratch will ^^^^ >> + >> +static bool >> +xfs_foo_verify( >> + struct xfs_buf *bp) >> +{ >> + struct xfs_mount *mp = bp->b_target->bt_mount; >> + struct xfs_ondisk_hdr *hdr = bp->b_addr; >> + >> + if (hdr->magic != cpu_to_be32(XFS_FOO_MAGIC)) >> + return false; >> + >> + if (!xfs_sb_version_hascrc(&mp->m_sb)) { >> + if (!uuid_equal(&hdr->uuid, &mp->m_sb.sb_uuid)) >> + return false; >> + if (bp->b_bn != be64_to_cpu(hdr->blkno)) >> + return false; >> + if (hdr->owner == 0) >> + return false; >> + } >> + >> + /* object specific verification checks here */ >> + >> + return true; >> +} >> + >> +If there are different magic numbers for the different formats, the verifier >> +will look like: >> + >> +static bool >> +xfs_foo_verify( >> + struct xfs_buf *bp) >> +{ >> + struct xfs_mount *mp = bp->b_target->bt_mount; >> + struct xfs_ondisk_hdr *hdr = bp->b_addr; >> + >> + if (hdr->magic == cpu_to_be32(XFS_FOO_CRC_MAGIC)) { >> + if (!uuid_equal(&hdr->uuid, &mp->m_sb.sb_uuid)) >> + return false; >> + if (bp->b_bn != be64_to_cpu(hdr->blkno)) >> + return false; >> + if (hdr->owner == 0) >> + return false; >> + } else if (hdr->magic != cpu_to_be32(XFS_FOO_MAGIC)) >> + return false; >> + >> + /* object specific verification checks here */ >> + >> + return true; >> +} >> + >> +Write verifiers are very similar to the read verifiers, they just do things in >> +the opposite order to the read verifiers. A typical write verifier: >> + >> +static void >> +xfs_foo_write_verify( >> + struct xfs_buf *bp) >> +{ >> + struct xfs_mount *mp = bp->b_target->bt_mount; >> + struct xfs_buf_log_item *bip = bp->b_fspriv; >> + >> + if (!xfs_foo_verify(bp)) { >> + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); >> + xfs_buf_ioerror(bp, EFSCORRUPTED); >> + return; >> + } >> + >> + if (!xfs_sb_version_hascrc(&mp->m_sb)) >> + return; >> + >> + >> + if (bip) { >> + struct xfs_ondisk_hdr *hdr = bp->b_addr; >> + hdr->lsn = cpu_to_be64(bip->bli_item.li_lsn); >> + } >> + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_FOO_CRC_OFF); >> +} >> + >> +This will verify the internal structure of the metadata before we go any >> +further, detecting corruptions that have occurred as the metadata has been >> +modified in memory. If the metadata verifies OK, and CRCs are enabled, we then >> +update the LSN field (when it was last modified) and calculate the CRC on the >> +metadata. Once this is done, we can issue the IO. >> + >> +Inodes and Dquots >> +----------------- >> + >> +Inodes and dquots are special snowflakes. They have per-object CRC and >> +self-identifiers, but they are packed so that there are multiple objects per >> +buffer. Hence we do not use per-buffer verifiers to do the work of per-object >> +verification and CRC calculations. The per-buffer verifiers simply perform basic >> +identification of the buffer - that they contain inodes or dquots, and that >> +there are magic numbers in all the expected spots. All further CRC and >> +verification checks are done when each inode is read from or written back to the >> +buffer. >> + >> +The structure of the verifiers and the identifiers checks is very similar to the >> +buffer code described above. The only difference is where they are called. For >> +example, inode read verification is done in xfs_iread() when the inode is first >> +read out of the buffer and the struct xfs_inode is instantiated. The inode is >> +already extensively verified during writeback in xfs_iflush_int, so the only >> +addition here add the LSN and CRC to the inode as it is copied back into the > ^ > is to > >> +buffer. >> + >> +XXX: inode unlinked list modification doesn't recalculate the inode CRC! None of >> +the unlinked list modifications check or update CRCs, neither during unlink nor >> +log recovery. So, it's gone unnoticed until now. This won't matter immediately - >> +repair will probably complain about it - but it needs to be fixed. >> + > > Cheers, > Pete Cheers, Dave From bfoster@redhat.com Fri Apr 5 06:37:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 61E7C29DFE for ; Fri, 5 Apr 2013 06:37:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CF686AC002 for ; Fri, 5 Apr 2013 04:37:42 -0700 (PDT) X-ASG-Debug-ID: 1365161861-04cbb01fb72b8810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id aQvLkOyOcePgAXng for ; Fri, 05 Apr 2013 04:37: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r35BbXJl011180 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Apr 2013 07:37:33 -0400 Received: from laptop.bfoster (vpn-54-53.rdu2.redhat.com [10.10.54.53]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r35BbVXQ026061 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 5 Apr 2013 07:37:32 -0400 Message-ID: <515EB6E4.7060508@redhat.com> Date: Fri, 05 Apr 2013 07:35:00 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 23/22] xfs: add metadata CRC documentation References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <20130405070006.GJ12011@dastard> X-ASG-Orig-Subj: Re: [PATCH 23/22] xfs: add metadata CRC documentation In-Reply-To: <20130405070006.GJ12011@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1365161861 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/05/2013 03:00 AM, Dave Chinner wrote: > xfs: add metadata CRC documentation > > From: Dave Chinner > > Add some documentation about the self describing metadata and the > code templates used to implement it. Thanks for the write up. Very nice read. A couple minor/random comments and a question to follow... > > Signed-off-by: Dave Chinner > --- > .../filesystems/xfs-self-describing-metadata.txt | 352 ++++++++++++++++++++ > 1 file changed, 352 insertions(+) > > diff --git a/Documentation/filesystems/xfs-self-describing-metadata.txt b/Documentation/filesystems/xfs-self-describing-metadata.txt > new file mode 100644 > index 0000000..da7edc9 > --- /dev/null > +++ b/Documentation/filesystems/xfs-self-describing-metadata.txt > @@ -0,0 +1,352 @@ > +XFS Self Describing Metadata > +---------------------------- > + > +Introduction > +------------ > + ... > + > + > +Self Describing Metadata > +------------------------ > + ... > + > +Different types of metadata have different owner identifiers. For example, > +directory, attribute and extent tree blocks are all owned by an inode, whilst > +freespace btree blocks are owned by an allocation group. Hence the size and > +contents of the owner field are determined by the type of metadata object we are > +looking at. For example, directories, extent maps and attributes are owned by > +inodes, while freespace btree blocks are owned by a specific allocation group. Looks like repetition from the sentence before last. > +THe owner information can also identify misplaced writes (e.g. freespace btree > +block written to the wrong AG). > + > +Self describing metadata also needs to contain some indication of when it was > +written to the filesystem. One of the key information points when doing forensic > +analysis is how recently the block was modified. Correlation of set of corrupted > +metadata blocks based on modification times is important as it can indicate > +whether the corruptions are related, whether there's been multiple corruption > +events that lead to the eventual failure, and even whether there are corruptions > +present that the run-time verification is not detecting. > + > +For example, we can determine whether a metadata object is supposed to be free > +space or still allocated when it is still referenced by it's owner can be > +determined by looking at when the free space btree block that contains the block I think you mean to drop the "can be determined" mid-sentence. > +was last written compared to when the metadata object itself was last written. > +If the free space block is more recent than the object and the objects owner, > +then there is a very good chance that the block should have been removed from > +it's owner. > + ... > + > +Runtime Validation > +------------------ > + ... > + > +The first step in read verification is checking the magic number and determining > +whether CRC validating is necessary. If it is, the CRC32c is caluclated and What do you mean by "determining whether CRC validating is necessary?" In other words, it's not always enabled but rather triggered by something else that elevates suspicion on the object? /me should probably use this to look at the code... ;) Brian > +compared against the value stored in the object itself. Once this is validated, > +further checks are made against the location information, followed by extensive > +object specific metadata validation. If any of these checks fail, then the > +buffer is considered corrupt and the EFSCORRUPTED error is set appropriately. > + > +Write verification is the opposite of the read verification - first the object > +is extensively verified and if it is OK we then update the LSN from the last > +modification made to the object, After this, we calculate the CRC and insert it > +into the object. Once this is done the write IO is allowed to continue. If any > +error occurs during this process, the buffer is again marked with a EFSCORRUPTED > +error for the higher layers to catch. > + > +Structures > +---------- > + > +A typical on-disk structure needs to contain the following information: > + > +struct xfs_ondisk_hdr { > + __be32 magic; /* magic number */ > + __be32 crc; /* CRC, not logged */ > + uuid_t uuid; /* filesystem identifier */ > + __be64 owner; /* parent object */ > + __be64 blkno; /* location on disk */ > + __be64 lsn; /* last modification in log, not logged */ > +}; > + > +Depending on the metadata, this information may be part of a header stucture > +separate to the metadata contents, or may be distributed through an existing > +structure. The latter occurs with metadata that already contains some of this > +information, such as the superblock and AG headers. > + > +Other metadata may have different formats for the information, but the same > +level of information is generally provided. For example: > + > + - short btree blocks have a 32 bit owner (ag number) and a 32 bit block > + number for location. The two of these combined provide the same > + information as @owner and @blkno in eh above structure, but using 8 > + bytes less space on disk. > + > + - directory/attribute node blocks have a 16 bit magic number, and the > + header that contains the magic number has other information in it as > + well. hence the additional metadata headers change the overall format > + of the metadata. > + > +A typical buffer read verifier is structured as follows: > + > +#define XFS_FOO_CRC_OFF offsetof(struct xfs_ondisk_hdr, crc) > + > +static void > +xfs_foo_read_verify( > + struct xfs_buf *bp) > +{ > + struct xfs_mount *mp = bp->b_target->bt_mount; > + > + if ((xfs_sb_version_hascrc(&mp->m_sb) && > + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), > + XFS_FOO_CRC_OFF)) || > + !xfs_foo_verify(bp)) { > + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); > + xfs_buf_ioerror(bp, EFSCORRUPTED); > + } > +} > + > +The code ensures that the CRC is only checked if the filesystem has CRCs enabled > +by checking the superblock of the feature bit, and then if the CRC verifies OK > +(or is not needed) it then verifies the actual contents of the block. > + > +The verifier function will take a couple of different forms, depending on > +whether the magic number can be used to determine the format of the block. In > +the case it can't, the code will is structured as follows: > + > +static bool > +xfs_foo_verify( > + struct xfs_buf *bp) > +{ > + struct xfs_mount *mp = bp->b_target->bt_mount; > + struct xfs_ondisk_hdr *hdr = bp->b_addr; > + > + if (hdr->magic != cpu_to_be32(XFS_FOO_MAGIC)) > + return false; > + > + if (!xfs_sb_version_hascrc(&mp->m_sb)) { > + if (!uuid_equal(&hdr->uuid, &mp->m_sb.sb_uuid)) > + return false; > + if (bp->b_bn != be64_to_cpu(hdr->blkno)) > + return false; > + if (hdr->owner == 0) > + return false; > + } > + > + /* object specific verification checks here */ > + > + return true; > +} > + > +If there are different magic numbers for the different formats, the verifier > +will look like: > + > +static bool > +xfs_foo_verify( > + struct xfs_buf *bp) > +{ > + struct xfs_mount *mp = bp->b_target->bt_mount; > + struct xfs_ondisk_hdr *hdr = bp->b_addr; > + > + if (hdr->magic == cpu_to_be32(XFS_FOO_CRC_MAGIC)) { > + if (!uuid_equal(&hdr->uuid, &mp->m_sb.sb_uuid)) > + return false; > + if (bp->b_bn != be64_to_cpu(hdr->blkno)) > + return false; > + if (hdr->owner == 0) > + return false; > + } else if (hdr->magic != cpu_to_be32(XFS_FOO_MAGIC)) > + return false; > + > + /* object specific verification checks here */ > + > + return true; > +} > + > +Write verifiers are very similar to the read verifiers, they just do things in > +the opposite order to the read verifiers. A typical write verifier: > + > +static void > +xfs_foo_write_verify( > + struct xfs_buf *bp) > +{ > + struct xfs_mount *mp = bp->b_target->bt_mount; > + struct xfs_buf_log_item *bip = bp->b_fspriv; > + > + if (!xfs_foo_verify(bp)) { > + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); > + xfs_buf_ioerror(bp, EFSCORRUPTED); > + return; > + } > + > + if (!xfs_sb_version_hascrc(&mp->m_sb)) > + return; > + > + > + if (bip) { > + struct xfs_ondisk_hdr *hdr = bp->b_addr; > + hdr->lsn = cpu_to_be64(bip->bli_item.li_lsn); > + } > + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_FOO_CRC_OFF); > +} > + > +This will verify the internal structure of the metadata before we go any > +further, detecting corruptions that have occurred as the metadata has been > +modified in memory. If the metadata verifies OK, and CRCs are enabled, we then > +update the LSN field (when it was last modified) and calculate the CRC on the > +metadata. Once this is done, we can issue the IO. > + > +Inodes and Dquots > +----------------- > + > +Inodes and dquots are special snowflakes. They have per-object CRC and > +self-identifiers, but they are packed so that there are multiple objects per > +buffer. Hence we do not use per-buffer verifiers to do the work of per-object > +verification and CRC calculations. The per-buffer verifiers simply perform basic > +identification of the buffer - that they contain inodes or dquots, and that > +there are magic numbers in all the expected spots. All further CRC and > +verification checks are done when each inode is read from or written back to the > +buffer. > + > +The structure of the verifiers and the identifiers checks is very similar to the > +buffer code described above. The only difference is where they are called. For > +example, inode read verification is done in xfs_iread() when the inode is first > +read out of the buffer and the struct xfs_inode is instantiated. The inode is > +already extensively verified during writeback in xfs_iflush_int, so the only > +addition here add the LSN and CRC to the inode as it is copied back into the > +buffer. > + > +XXX: inode unlinked list modification doesn't recalculate the inode CRC! None of > +the unlinked list modifications check or update CRCs, neither during unlink nor > +log recovery. So, it's gone unnoticed until now. This won't matter immediately - > +repair will probably complain about it - but it needs to be fixed. > + > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From list.xfs@jan-o-sch.net Fri Apr 5 07:08:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3B12929DFE for ; Fri, 5 Apr 2013 07:08:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 067A58F8065 for ; Fri, 5 Apr 2013 05:08:01 -0700 (PDT) X-ASG-Debug-ID: 1365163679-04bdf0542a2c6e10001-NocioJ Received: from mail.in8.de (brockman.in8.de [85.214.220.56]) by cuda.sgi.com with ESMTP id SVAGbWr8YVoVuYfw for ; Fri, 05 Apr 2013 05:08:00 -0700 (PDT) X-Barracuda-Envelope-From: list.xfs@jan-o-sch.net X-Barracuda-Apparent-Source-IP: 85.214.220.56 Received: from [172.24.1.213] (unknown [192.166.201.94]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.in8.de (Postfix) with ESMTPSA id 8EEFE6AC109; Fri, 5 Apr 2013 14:07:58 +0200 (CEST) Message-ID: <515EBE9E.3000905@jan-o-sch.net> Date: Fri, 05 Apr 2013 14:07:58 +0200 From: Jan Schmidt User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: add execution of a custom command to fsstress (-x and -X options) References: <1363863585-25598-1-git-send-email-list.xfs@jan-o-sch.net> <20130321195054.GO17758@dastard> <514B72B9.1010005@jan-o-sch.net> <20130321211218.GP17758@dastard> <514C0309.1000104@jan-o-sch.net> <20130324235135.GH6369@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: add execution of a custom command to fsstress (-x and -X options) In-Reply-To: <20130324235135.GH6369@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: brockman.in8.de[85.214.220.56] X-Barracuda-Start-Time: 1365163679 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, March 25, 2013 at 00:51 (+0100), Dave Chinner wrote: > On Fri, Mar 22, 2013 at 08:06:49AM +0100, Jan Schmidt wrote: >> On Thu, March 21, 2013 at 22:12 (+0100), Dave Chinner wrote:> On Thu, Mar 21, >> 2013 at 09:51:05PM +0100, Jan Schmidt wrote: >>>> >>>> >>>> On 21.03.2013 20:50, Dave Chinner wrote: >>>>> On Thu, Mar 21, 2013 at 11:59:45AM +0100, Jan Schmidt wrote: >>>>>> From: Jan Schmidt >>>>>> >>>>>> This patch adds execution of a custom command in the middle of all fsstress >>>>>> operations. Its intended use is the creation of snapshots in the middle of a >>>>>> test run. >>>>> >>>>> Why do you need fsstress to do this? Why can't you just run fsstress >>>>> in the background and run a loop creating periodic snapshots in the >>>>> control script? >>>> >>>> Because I want reproducible results. Same random seed should result in >>>> the very same snapshots being created. >>> >>> Why can't you run fsstress for N operations, run a snapshot, >>> then run it again for M operations? That will give you exactly the >>> same results, wouldn't it? >> >> As far as I have understood what fsstress does, the second run would generate >> different filenames, i.e. it would never rename / truncate / punch holes into / >> ... files created by the first run - it cannot even know that they exist. > > Yes, you are right. > >>>>> Also, did you intend that every process creates a snapshot? i.e. it >>>>> looks lik eif you run a 1000 processes, they'll all run a snapshot >>>>> operation at X operations? i.e. this will generate nproc * X >>>>> snapshots in a single run. This doesn't seem very wise to me.... >>>> >>>> Agreed, I haven't thought of running more than one process. For the sake >>>> of reproducibility, I wouldn't want multiple processes for my test case >>>> either. >>>> >>>> I'm not sure if there are other applications than snapshot creation for >>>> such a feature, so I cannot argue whether to have each process execute >>>> such a command or not. >>> >>> If such a feature is necessary, I'd suggest that implementing the >>> snapshot ioctl as just another operation directly into fsstress is >>> probably a better way to implement this functionality. That way you >>> can control the frequency via the command line in exactly the same >>> way as every other operation.... >> >> What I currently need is a function to make one reasonably weird snapshot. So my >> plan goes like this: do n weird operations, make a snapshot (this is going to be >> the base snapshot), do n weird operations (partly to the same files), make a >> second snapshot (this is going to be the incremental snapshot, I create that one >> myself after fsstress is done, currently). Having both snapshots with an equal >> number of modification operations isn't required, however at least a fair number >> of operations for each of them is desired. > > Ah, so you're wanting to test incremental backups based on > snapshots. Ok, that context puts it in a different light.... > >> Adding it as a normal fsstress operation would generate a whole lot of >> snapshots. I could, for like 50k operations, scale all the factors for each >> operation accordingly to get a single snapshot out of it. I still won't force it >> anywhere near the middle that way, though. Also, going from 50k operation to 60k >> operations gets cumbersome that way. > > *nod* > >> Plumbing that into fsstress the way I did is the only solution I could think of >> to reach the mentioned goals. If nobody else needs it, I can of course keep it >> local, here. However, I'd really like to make an xfstest out of it sooner or >> later - currently, we've no test at all for (btrfs) send and receive. > > For send/receive, you should probably start with some basic tests > that are easy to verify first. e.g. the equivalent of the basic > incremental xfsdump/restore tests like 064/065 which do well > defined, easy to verify operations to determine correct behaviour. That sounds like a good start. > I can see the value in adding a random variant in addition to these > basic tests, so I can see how having a predictable callout from > fsstress would be useful for incremental xfsdump/restore testing as > well. > > FWIW, what does you current callout execute? A shell script that > runs a bunch of other commands that ends with a btrfs send? It's basically just "btrfs subvol snapshot", but yeah, for more complex things I'd put a shell script there. > The biggest question I have about this is how to make it valuable > for more types of fsstress execution, especially concurrent > execution. I can't see a use (yet) for a per-process callout, but > I'm wondering if we should have some kind of "wait for all processes > to do N ops, then run the callout" style of synchronisation. > > I'm not sure what is best here as I don't know the full context of > what you are wanting to test (and how), but I think we can come up > with something better than "only works for single process > invocations". :) Well, in fact you do have the full context of what I'm wanting to test, as far as I can see it. I bet we could came up with a suggestion how to interpret something like the proposed -x switch in multi process context. However, I don't like to code for hypothetic situations I cannot really imagine a use case for. So, the best thing I came up with is a switch that can do something meaningful in single process applications of fsstress. I'm happy to code the rest of it, if a good suggestion comes up how this could be handled and how it could be useful to others as well. Thanks! -Jan From rjohnston@sgi.com Fri Apr 5 08:36:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 176B029E10 for ; Fri, 5 Apr 2013 08:36:08 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id B3BC78F8035; Fri, 5 Apr 2013 06:36:07 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 5 Apr 2013 08:36:07 -0500 Message-ID: <515ED35E.4040703@sgi.com> Date: Fri, 5 Apr 2013 08:36:30 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eryu Guan CC: Subject: Re: [PATCH 1/4] xfstests generic 308: check ctime updates for setfacl References: <1364813864-10820-1-git-send-email-eguan@redhat.com> <1364813864-10820-2-git-send-email-eguan@redhat.com> In-Reply-To: <1364813864-10820-2-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Looks good. Reviewed-by: Rich Johnston From rjohnston@sgi.com Fri Apr 5 08:38:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 82FFD29E10 for ; Fri, 5 Apr 2013 08:38:10 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5387630406B; Fri, 5 Apr 2013 06:38:07 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 5 Apr 2013 08:38:06 -0500 Message-ID: <515ED3D6.4020609@sgi.com> Date: Fri, 5 Apr 2013 08:38:30 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eryu Guan CC: Subject: Re: [PATCH 2/4] xfstests generic 309: test write to the last block of max file size on ext4 References: <1364813864-10820-1-git-send-email-eguan@redhat.com> <1364813864-10820-3-git-send-email-eguan@redhat.com> In-Reply-To: <1364813864-10820-3-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Looks good. Reviewed-by: Rich Johnston From rjohnston@sgi.com Fri Apr 5 08:38:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 97B7129E17 for ; Fri, 5 Apr 2013 08:38:22 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7950D8F8054; Fri, 5 Apr 2013 06:38:22 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 5 Apr 2013 08:38:22 -0500 Message-ID: <515ED3E4.8030201@sgi.com> Date: Fri, 5 Apr 2013 08:38:44 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eryu Guan CC: Subject: Re: [PATCH 3/4] xfstests ext4 310: test read /proc/fs/ext4//mb_groups while the fs is being unmounted References: <1364813864-10820-1-git-send-email-eguan@redhat.com> <1364813864-10820-4-git-send-email-eguan@redhat.com> In-Reply-To: <1364813864-10820-4-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Looks good. Reviewed-by: Rich Johnston From rjohnston@sgi.com Fri Apr 5 08:38:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E253B29E1B for ; Fri, 5 Apr 2013 08:38:26 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id C205230406B; Fri, 5 Apr 2013 06:38:26 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 5 Apr 2013 08:38:26 -0500 Message-ID: <515ED3E9.3010201@sgi.com> Date: Fri, 5 Apr 2013 08:38:49 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eryu Guan CC: Subject: Re: [PATCH 4/4] xfstests generic 311: test dir mtime and ctime are updated on rename References: <1364813864-10820-1-git-send-email-eguan@redhat.com> <1364813864-10820-5-git-send-email-eguan@redhat.com> In-Reply-To: <1364813864-10820-5-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Looks good. Reviewed-by: Rich Johnston From rjohnston@sgi.com Fri Apr 5 08:41:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 360CE29E10 for ; Fri, 5 Apr 2013 08:41:28 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 15A928F8052; Fri, 5 Apr 2013 06:41:28 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 5 Apr 2013 08:41:27 -0500 Message-ID: <515ED49E.6020406@sgi.com> Date: Fri, 5 Apr 2013 08:41:50 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eryu Guan CC: Subject: Re: [PATCH 0/4] xfstests: random regression tests References: <1364813864-10820-1-git-send-email-eguan@redhat.com> In-Reply-To: <1364813864-10820-1-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks for submitting this patchset, it has been committed. --Rich commit 797c82f0e22528df369cf198c2a9d6109e085838 Author: Eryu Guan Date: Mon Apr 1 10:57:44 2013 +0000 xfstests generic 309: test dir mtime and ctime are updated on rename Test directory mtime and ctime are updated when moving a file onto an existing file in the directory Regression test for commit: 0b23076 ext3: fix update of mtime and ctime on rename Signed-off-by: Eryu Guan Reviewed-by: Rich Johnston [rjohnston@sgi.com renumbered test to next in group sequence] Signed-off-by: Rich Johnston commit f7922730727844c6dee837bd1a64221342fef1d1 Author: Eryu Guan Date: Mon Apr 1 10:57:43 2013 +0000 xfstests ext4 305: test read /proc/fs/ext4//mb_groups while the fs is being unmounted Regression test for commit: 9559996 ext4: remove mb_groups before tearing down the buddy_cache Signed-off-by: Eryu Guan Reviewed-by: Rich Johnston [rjohnston@sgi.com renumbered test to next in group sequence] Signed-off-by: Rich Johnston commit 94e1e7e53a89d9a3387bee7dea60091afaf79704 Author: Eryu Guan Date: Mon Apr 1 10:57:42 2013 +0000 xfstests generic 308: test write to the last block of max file size on ext4 On unpatched ext4 if an extent exists which includes the block right before the maximum file offset, and the block for the maximum file offset is written, the kernel panics. On patched ext4, the write would get EFBIG since we lower s_maxbytes by one fs block. Regression test for commit: f17722f ext4: Fix max file size and logical block counting of extent format file Though it's an ext4 specific issue, it's no harm to run on all file systems, so put it in generic. Signed-off-by: Eryu Guan Reviewed-by: Rich Johnston [rjohnston@sgi.com renumbered test to next in group sequence] Signed-off-by: Rich Johnston commit 6422b818388c652183b6b517be1feac554f5f004 Author: Eryu Guan Date: Mon Apr 1 10:57:41 2013 +0000 xfstests generic 307: check ctime updates for setfacl Check if ctime is updated and written to disk after setfacl Regression test for the following extN commits c6ac12a ext4: update ctime when changing the file's permission by setfacl 30e2bab ext3: update ctime when changing the file's permission by setfacl 523825b ext2: update ctime when changing the file's permission by setfacl Signed-off-by: Eryu Guan Reviewed-by: Rich Johnston [rjohnston@sgi.com renumbered test to next in group sequence] Signed-off-by: Rich Johnston From rjohnston@sgi.com Fri Apr 5 09:54:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3F8CA29E1A for ; Fri, 5 Apr 2013 09:54:10 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2F1E0304071; Fri, 5 Apr 2013 07:54:06 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 5 Apr 2013 09:54:06 -0500 Message-ID: <515EE5A5.7070608@sgi.com> Date: Fri, 5 Apr 2013 09:54:29 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Zheng Liu CC: , Zheng Liu Subject: Re: [PATCH] xfstests: add _require_seek_data_hole to check seek data/hole References: <1364289252-7012-1-git-send-email-wenqing.lz@taobao.com> In-Reply-To: <1364289252-7012-1-git-send-email-wenqing.lz@taobao.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Looks reasonable, will you please rework this for TOT changes? tests 285 and 286 are now in the tests/generic directory and common.rc is now common/rc Thanks --Rich From rjohnston@sgi.com Fri Apr 5 09:57:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 97B4429E16 for ; Fri, 5 Apr 2013 09:57:48 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8740B304071; Fri, 5 Apr 2013 07:57:48 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 5 Apr 2013 09:57:48 -0500 Message-ID: <515EE683.9020308@sgi.com> Date: Fri, 5 Apr 2013 09:58:11 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Zheng Liu CC: , Zheng Liu Subject: Re: [PATCH] xfstests: check falloc in 285 References: <1364286957-29140-1-git-send-email-wenqing.lz@taobao.com> In-Reply-To: <1364286957-29140-1-git-send-email-wenqing.lz@taobao.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Zheng, Thanks again for submitting patches for xfstests. Will also rework this one for TOT changes, it loks good as well. Thanks --Rich From rjohnston@sgi.com Fri Apr 5 10:06:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D884C29E16 for ; Fri, 5 Apr 2013 10:06:05 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id B8F168F8059; Fri, 5 Apr 2013 08:06:02 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 5 Apr 2013 10:06:02 -0500 Message-ID: <515EE871.1060106@sgi.com> Date: Fri, 5 Apr 2013 10:06:25 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Zheng Liu CC: , , Eric Sandeen , Zheng Liu Subject: Re: [PATCH v3] xfstests: add a new test case for ext4 indirect-based file References: <1364119002-17350-1-git-send-email-wenqing.lz@taobao.com> In-Reply-To: <1364119002-17350-1-git-send-email-wenqing.lz@taobao.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Zheng, Another nice patch that needs to be reworked so that the test resides in the tests/generic directory. Don't worry about the test number, it will be adjusted to be the next in test group when committed. Thanks --Rich From rjohnston@sgi.com Fri Apr 5 12:28:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 34B3E29E24 for ; Fri, 5 Apr 2013 12:28:10 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9573430405F; Fri, 5 Apr 2013 10:28:06 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 5 Apr 2013 12:28:06 -0500 Message-ID: <515F09BD.606@sgi.com> Date: Fri, 5 Apr 2013 12:28:29 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Zhao Hongjiang CC: , , , Subject: Re: [PATCH] xfstests: Check concurrently of readdir and read on the same directory fd References: <515BC786.3070102@gmail.com> In-Reply-To: <515BC786.3070102@gmail.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Zhao, Thanks for submitting this test. Only two minor errors that will be corrected at commit time. 1. The new script used generate this test produces errors. No need to resubmit, this has already been fixed by commit 8575764a "xfstests: fix common source file path" QA output created by 310 +./tests/generic/310: line 43: ./common.rc: No such file or directory +./tests/generic/310: line 44: ./common.filter: No such file or directory +./tests/generic/310: line 47: _supported_fs: command not found +./tests/generic/310: line 48: _supported_os: command not found 2. Whitespace errors Warning: trailing whitespace in line 18 of src/t_readdir_2.c Warning: trailing whitespace in lines 18,28 of src/t_readdir_1.c space before tab in indent. tests/generic/310 perror("Seek failed!"); warning: 1 line adds whitespace errors. Reviewed-by: Rich Johnston From rjohnston@sgi.com Fri Apr 5 12:32:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 334FF29E24 for ; Fri, 5 Apr 2013 12:32:21 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id EF1C8304051; Fri, 5 Apr 2013 10:32:20 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 5 Apr 2013 12:32:20 -0500 Message-ID: <515F0ABB.804@sgi.com> Date: Fri, 5 Apr 2013 12:32:43 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Zhao Hongjiang CC: , , , Subject: Re: [PATCH] xfstests: Check concurrently of readdir and read on the same directory fd References: <515BC786.3070102@gmail.com> In-Reply-To: <515BC786.3070102@gmail.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Zhao, Thanks for submitting this test, it has been committed. --Rich commit bbaf78c01bc98b2afc3bb3d31eac38fc5d4b3b19 Author: Zhao Hongjiang Date: Wed Apr 3 06:09:10 2013 +0000 xfstests generic 310: check concurrently of readdir and read on the same directory fd Check if there are two threads,one keeps calling read() or lseek(), and the other calling readdir(), both on the same directory fd. Based on a testcase from Li Zefan . http://marc.info/?l=linux-kernel&m=136123703211869&w=2 Signed-off-by: Zhao Hongjiang Reviewed-by: Rich Johnston [rjohnston@sgi.com minor white space fixes and test renumbering] Signed-off-by: Rich Johnston From bounces@eml89.net Fri Apr 5 13:11:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.4 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,MIME_HTML_ONLY,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 C04BA29E28 for ; Fri, 5 Apr 2013 13:11:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4B865AC004 for ; Fri, 5 Apr 2013 11:11:44 -0700 (PDT) X-ASG-Debug-ID: 1365185501-04cb6c1e792f3280001-NocioJ Received: from w10-149-240.imv02.com (w10-149-240.imv02.com [178.32.149.240]) by cuda.sgi.com with ESMTP id DQOJBTL5DmK3NArI for ; Fri, 05 Apr 2013 11:11:41 -0700 (PDT) X-Barracuda-Envelope-From: bounces@eml89.net X-Barracuda-Apparent-Source-IP: 178.32.149.240 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=bst; d=eml89.net; h=To:Subject:Message-ID:Date:From:Reply-To:MIME-Version:List-Unsubscribe:Content-Type:Content-Transfer-Encoding; i=news@eml89.net; bh=52VezvVo7jIRImreuNadWObuZKw=; b=UFDeADUR0oIefoOT9MHVCnakLsKJUox5sEDUwX/JeSWoln1MGKxWta3CwkTao4xEuOS8BeQloA/5 yp54KvDO1w== DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=bst; d=eml89.net; b=pzIDDCDAVCaECo6tNLxXBTPG0ygdNwhQIZ611JVCmeo1EdyCcLUu/PY7WRkNn6xr03+Aq7NtNSHq OVA/ZcbsIg==; To: xfs@oss.sgi.com Subject: =?UTF-8?B?Vm90cmUgZmlsbSBwb3VyIHByw6lzZW50ZXIgdm90cmUgZW50cmVwcmlzZSwgZGlzY291bnQgMjAgcG91ciBjZW50?= Message-ID: X-ASG-Orig-Subj: =?UTF-8?B?Vm90cmUgZmlsbSBwb3VyIHByw6lzZW50ZXIgdm90cmUgZW50cmVwcmlzZSwgZGlzY291bnQgMjAgcG91ciBjZW50?= Date: Fri, 05 Apr 2013 20:04:09 +0200 From: "Video Inside" Reply-To: retour@eml89.net MIME-Version: 1.0 X-Mailer-LID: 136,137 List-Unsubscribe: X-Mailer-RecptId: 16568140 X-Mailer-SID: 473 X-Mailer-Sent-By: 7 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: w10-149-240.imv02.com[178.32.149.240] X-Barracuda-Start-Time: 1365185501 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127269 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.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 VideoInside
Si vous ne visualisez pas ce message correctement, accédez à la version en ligne
Réalisez un film de qualite à prix cassé
Vidéo de 2 minutes sur un site comprenant 4 à 8 questions, un montage, le titrage des questions et de l'interviewé.
Valoriser votre entreprise ou votre savoir-faire avec une vidéo de 2 minutes, comprenant de nombreux effets spéciaux.
Vidéo tournée avec un journaliste. Véritable animateur,
le journaliste valorisera vos offres ou votre entreprise.
Vos produits prennent forme et se modélisent en temps réel, avec des images de synthèse à couper le souffle.
* valable sur le site jusqu'au 31 janvier 2013 avec le code Promo FIRST

Pour se désabonner, suivez ce lien

From bpm@oss.sgi.com Fri Apr 5 13:29:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id E897329E28; Fri, 5 Apr 2013 13:29:45 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.9-rc1-18-g666d644 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: ff9a28f6c25d18a635abcab1f49db68108203dfb X-Git-Newrev: 666d644cd72a9ec58b353209ff191d7430f3b357 Message-Id: <20130405182945.E897329E28@oss.sgi.com> Date: Fri, 5 Apr 2013 13:29:45 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated 666d644 xfs: don't free EFIs before the EFDs are committed 3d6e036 xfs: Add ratelimited printk for different alert levels from ff9a28f6c25d18a635abcab1f49db68108203dfb (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 666d644cd72a9ec58b353209ff191d7430f3b357 Author: Dave Chinner Date: Wed Apr 3 14:09:21 2013 +1100 xfs: don't free EFIs before the EFDs are committed Filesystems are occasionally being shut down with this error: xfs_trans_ail_delete_bulk: attempting to delete a log item that is not in the AIL. It was diagnosed to be related to the EFI/EFD commit order when the EFI and EFD are in different checkpoints and the EFD is committed before the EFI here: http://oss.sgi.com/archives/xfs/2013-01/msg00082.html The real problem is that a single bit cannot fully describe the states that the EFI/EFD processing can be in. These completion states are: EFI EFI in AIL EFD Result committed/unpinned Yes committed OK committed/pinned No committed Shutdown uncommitted No committed Shutdown Note that the "result" field is what should happen, not what does happen. The current logic is broken and handles the first two cases correctly by luck. That is, the code will free the EFI if the XFS_EFI_COMMITTED bit is *not* set, rather than if it is set. The inverted logic "works" because if both EFI and EFD are committed, then the first __xfs_efi_release() call clears the XFS_EFI_COMMITTED bit, and the second frees the EFI item. Hence as long as xfs_efi_item_committed() has been called, everything appears to be fine. It is the third case where the logic fails - where xfs_efd_item_committed() is called before xfs_efi_item_committed(), and that results in the EFI being freed before it has been committed. That is the bug that triggered the shutdown, and hence keeping track of whether the EFI has been committed or not is insufficient to correctly order the EFI/EFD operations w.r.t. the AIL. What we really want is this: the EFI is always placed into the AIL before the last reference goes away. The only way to guarantee that is that the EFI is not freed until after it has been unpinned *and* the EFD has been committed. That is, restructure the logic so that the only case that can occur is the first case. This can be done easily by replacing the XFS_EFI_COMMITTED with an EFI reference count. The EFI is initialised with it's own count, and that is not released until it is unpinned. However, there is a complication to this method - the high level EFI/EFD code in xfs_bmap_finish() does not hold direct references to the EFI structure, and runs a transaction commit between the EFI and EFD processing. Hence the EFI can be freed even before the EFD is created using such a method. Further, log recovery uses the AIL for tracking EFI/EFDs that need to be recovered, but it uses the AIL *differently* to the EFI transaction commit. Hence log recovery never pins or unpins EFIs, so we can't drop the EFI reference count indirectly to free the EFI. However, this doesn't prevent us from using a reference count here. There is a 1:1 relationship between EFIs and EFDs, so when we initialise the EFI we can take a reference count for the EFD as well. This solves the xfs_bmap_finish() issue - the EFI will never be freed until the EFD is processed. In terms of log recovery, during the committing of the EFD we can look for the XFS_EFI_RECOVERED bit being set and drop the EFI reference as well, thereby ensuring everything works correctly there as well. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 3d6e036193bfa67a8a1cc1908fe910c7a014d183 Author: Rich Johnston Date: Wed Mar 27 09:26:49 2013 -0500 xfs: Add ratelimited printk for different alert levels Ratelimited printk will be useful in printing xfs messages which are otherwise not required to be printed always due to their high rate (to prevent kernel ring buffer from overflowing), while at the same time required to be printed. Signed-off-by: Raghavendra D Prabhu Reviewed-by: Rich Johnston Reviewed-by: Dave Chinner Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_extfree_item.c | 27 +++++++++++++-------------- fs/xfs/xfs_extfree_item.h | 14 +++++++++----- fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_log_recover.c | 1 + fs/xfs/xfs_message.h | 26 ++++++++++++++++++++++++++ 5 files changed, 50 insertions(+), 19 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Fri Apr 5 13:29:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 4468329E36; Fri, 5 Apr 2013 13:29:51 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.9-rc1-18-g666d644 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: ff9a28f6c25d18a635abcab1f49db68108203dfb X-Git-Newrev: 666d644cd72a9ec58b353209ff191d7430f3b357 Message-Id: <20130405182951.4468329E36@oss.sgi.com> Date: Fri, 5 Apr 2013 13:29:51 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated 666d644 xfs: don't free EFIs before the EFDs are committed 3d6e036 xfs: Add ratelimited printk for different alert levels from ff9a28f6c25d18a635abcab1f49db68108203dfb (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 666d644cd72a9ec58b353209ff191d7430f3b357 Author: Dave Chinner Date: Wed Apr 3 14:09:21 2013 +1100 xfs: don't free EFIs before the EFDs are committed Filesystems are occasionally being shut down with this error: xfs_trans_ail_delete_bulk: attempting to delete a log item that is not in the AIL. It was diagnosed to be related to the EFI/EFD commit order when the EFI and EFD are in different checkpoints and the EFD is committed before the EFI here: http://oss.sgi.com/archives/xfs/2013-01/msg00082.html The real problem is that a single bit cannot fully describe the states that the EFI/EFD processing can be in. These completion states are: EFI EFI in AIL EFD Result committed/unpinned Yes committed OK committed/pinned No committed Shutdown uncommitted No committed Shutdown Note that the "result" field is what should happen, not what does happen. The current logic is broken and handles the first two cases correctly by luck. That is, the code will free the EFI if the XFS_EFI_COMMITTED bit is *not* set, rather than if it is set. The inverted logic "works" because if both EFI and EFD are committed, then the first __xfs_efi_release() call clears the XFS_EFI_COMMITTED bit, and the second frees the EFI item. Hence as long as xfs_efi_item_committed() has been called, everything appears to be fine. It is the third case where the logic fails - where xfs_efd_item_committed() is called before xfs_efi_item_committed(), and that results in the EFI being freed before it has been committed. That is the bug that triggered the shutdown, and hence keeping track of whether the EFI has been committed or not is insufficient to correctly order the EFI/EFD operations w.r.t. the AIL. What we really want is this: the EFI is always placed into the AIL before the last reference goes away. The only way to guarantee that is that the EFI is not freed until after it has been unpinned *and* the EFD has been committed. That is, restructure the logic so that the only case that can occur is the first case. This can be done easily by replacing the XFS_EFI_COMMITTED with an EFI reference count. The EFI is initialised with it's own count, and that is not released until it is unpinned. However, there is a complication to this method - the high level EFI/EFD code in xfs_bmap_finish() does not hold direct references to the EFI structure, and runs a transaction commit between the EFI and EFD processing. Hence the EFI can be freed even before the EFD is created using such a method. Further, log recovery uses the AIL for tracking EFI/EFDs that need to be recovered, but it uses the AIL *differently* to the EFI transaction commit. Hence log recovery never pins or unpins EFIs, so we can't drop the EFI reference count indirectly to free the EFI. However, this doesn't prevent us from using a reference count here. There is a 1:1 relationship between EFIs and EFDs, so when we initialise the EFI we can take a reference count for the EFD as well. This solves the xfs_bmap_finish() issue - the EFI will never be freed until the EFD is processed. In terms of log recovery, during the committing of the EFD we can look for the XFS_EFI_RECOVERED bit being set and drop the EFI reference as well, thereby ensuring everything works correctly there as well. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 3d6e036193bfa67a8a1cc1908fe910c7a014d183 Author: Rich Johnston Date: Wed Mar 27 09:26:49 2013 -0500 xfs: Add ratelimited printk for different alert levels Ratelimited printk will be useful in printing xfs messages which are otherwise not required to be printed always due to their high rate (to prevent kernel ring buffer from overflowing), while at the same time required to be printed. Signed-off-by: Raghavendra D Prabhu Reviewed-by: Rich Johnston Reviewed-by: Dave Chinner Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_extfree_item.c | 27 +++++++++++++-------------- fs/xfs/xfs_extfree_item.h | 14 +++++++++----- fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_log_recover.c | 1 + fs/xfs/xfs_message.h | 26 ++++++++++++++++++++++++++ 5 files changed, 50 insertions(+), 19 deletions(-) hooks/post-receive -- XFS development tree From bpm@sgi.com Fri Apr 5 13:31:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 427BB29E28 for ; Fri, 5 Apr 2013 13:31:06 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1BBDF8F8040; Fri, 5 Apr 2013 11:31:06 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id DA60B500B4C; Fri, 5 Apr 2013 13:31:05 -0500 (CDT) Date: Fri, 5 Apr 2013 13:31:05 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't free EFIs before the EFDs are committed Message-ID: <20130405183105.GC22182@sgi.com> References: <1364958561-12440-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364958561-12440-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Wed, Apr 03, 2013 at 02:09:21PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Filesystems are occasionally being shut down with this error: > > xfs_trans_ail_delete_bulk: attempting to delete a log item that is > not in the AIL. > > It was diagnosed to be related to the EFI/EFD commit order when the > EFI and EFD are in different checkpoints and the EFD is committed > before the EFI here: > > http://oss.sgi.com/archives/xfs/2013-01/msg00082.html > > The real problem is that a single bit cannot fully describe the > states that the EFI/EFD processing can be in. These completion > states are: > > EFI EFI in AIL EFD Result > committed/unpinned Yes committed OK > committed/pinned No committed Shutdown > uncommitted No committed Shutdown > > > Note that the "result" field is what should happen, not what does > happen. The current logic is broken and handles the first two cases > correctly by luck. That is, the code will free the EFI if the > XFS_EFI_COMMITTED bit is *not* set, rather than if it is set. The > inverted logic "works" because if both EFI and EFD are committed, > then the first __xfs_efi_release() call clears the XFS_EFI_COMMITTED > bit, and the second frees the EFI item. Hence as long as > xfs_efi_item_committed() has been called, everything appears to be > fine. > > It is the third case where the logic fails - where > xfs_efd_item_committed() is called before xfs_efi_item_committed(), > and that results in the EFI being freed before it has been > committed. That is the bug that triggered the shutdown, and hence > keeping track of whether the EFI has been committed or not is > insufficient to correctly order the EFI/EFD operations w.r.t. the > AIL. > > What we really want is this: the EFI is always placed into the > AIL before the last reference goes away. The only way to guarantee > that is that the EFI is not freed until after it has been unpinned > *and* the EFD has been committed. That is, restructure the logic so > that the only case that can occur is the first case. > > This can be done easily by replacing the XFS_EFI_COMMITTED with an > EFI reference count. The EFI is initialised with it's own count, and > that is not released until it is unpinned. However, there is a > complication to this method - the high level EFI/EFD code in > xfs_bmap_finish() does not hold direct references to the EFI > structure, and runs a transaction commit between the EFI and EFD > processing. Hence the EFI can be freed even before the EFD is > created using such a method. > > Further, log recovery uses the AIL for tracking EFI/EFDs that need > to be recovered, but it uses the AIL *differently* to the EFI > transaction commit. Hence log recovery never pins or unpins EFIs, so > we can't drop the EFI reference count indirectly to free the EFI. > > However, this doesn't prevent us from using a reference count here. > There is a 1:1 relationship between EFIs and EFDs, so when we > initialise the EFI we can take a reference count for the EFD as > well. This solves the xfs_bmap_finish() issue - the EFI will never > be freed until the EFD is processed. In terms of log recovery, > during the committing of the EFD we can look for the > XFS_EFI_RECOVERED bit being set and drop the EFI reference as well, > thereby ensuring everything works correctly there as well. > > Signed-off-by: Dave Chinner Applied. Regards, Ben From bpm@sgi.com Fri Apr 5 13:32:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7B0F229E28 for ; Fri, 5 Apr 2013 13:32:26 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id EC03D8F8054; Fri, 5 Apr 2013 11:32:25 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B60B5500B4E; Fri, 5 Apr 2013 13:32:25 -0500 (CDT) Date: Fri, 5 Apr 2013 13:32:25 -0500 From: Ben Myers To: Rich Johnston Cc: xfs@oss.sgi.com, elder@kernel.org, Raghavendra D Prabhu Subject: Re: [v3 Repost] xfs: Add ratelimited printk for different alert levels Message-ID: <20130405183225.GD22182@sgi.com> References: <515339F7.8000505@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515339F7.8000505@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Wed, Mar 27, 2013 at 09:26:49AM -0500, Rich Johnston wrote: > Ratelimited printk will be useful in printing xfs messages which are otherwise > not required to be printed always due to their high rate (to prevent kernel ring > buffer from overflowing), while at the same time required to be printed. > > Signed-off-by: Raghavendra D Prabhu > Reviewed-by: Rich Johnston > Reviewed-by: Dave Chinner Applied. Thanks Raghavendra! From marco.stornelli@gmail.com Sat Apr 6 05:12:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A651D7F94 for ; Sat, 6 Apr 2013 05:12:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 50F47AC002 for ; Sat, 6 Apr 2013 03:12:06 -0700 (PDT) X-ASG-Debug-ID: 1365243123-04bdf0542b32cdf0001-NocioJ Received: from mail-ea0-f179.google.com (mail-ea0-f179.google.com [209.85.215.179]) by cuda.sgi.com with ESMTP id gvMG30esYQM9pWep (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 06 Apr 2013 03:12:04 -0700 (PDT) X-Barracuda-Envelope-From: marco.stornelli@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.179 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.179] Received: by mail-ea0-f179.google.com with SMTP id f15so1604271eak.10 for ; Sat, 06 Apr 2013 03:12:03 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.179] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.179] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:content-type:content-transfer-encoding; bh=PyXIc+TVefGKMutuIu2l+AdcSbTBVpqi+TwxzZMcTFs=; b=DAMwNNXSBDMfHGUW5oG4Xtkr6z22BZ2ldyiE4XfcMhauQol+ly+s/oX+hss1exQ9sz W9agS9oBnLnsGKNNud4y18laCPKeyY2XUb/m9NSnKln1VZVPOl21VweuYnMsVqngwgvJ P9LYP9EUfVlSUpx8IVj9yz67w+CnrOtwmDvQhwk1RcfBMjXZ5nQa7wtqK/Q1d+SQAx7L +WVSgzUMY0dB0JBeq1I4hz5C/cPV9dNFsyf5IoEx9uOwMqK5KaoKxco01h8Vvmsi41jM iDL6Rzu01h/jSqJXMnGuszVM1GqDxcifT+eFanVcA8U0w4SfHC+WGZ7+TTGFWjWsYIOc Vf3Q== X-Received: by 10.14.179.5 with SMTP id g5mr28202682eem.41.1365243123250; Sat, 06 Apr 2013 03:12:03 -0700 (PDT) Received: from [80.183.108.112] (host112-108-dynamic.183-80-r.retail.telecomitalia.it. [80.183.108.112]) by mx.google.com with ESMTPS id ca4sm20058510eeb.15.2013.04.06.03.11.56 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 06 Apr 2013 03:12:02 -0700 (PDT) Message-ID: <515FF344.8040705@gmail.com> Date: Sat, 06 Apr 2013 12:04:52 +0200 From: Marco Stornelli User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130329 Thunderbird/17.0.5 MIME-Version: 1.0 To: Linux FS Devel CC: Chris Mason , Steve French , Theodore Ts'o , Andreas Dilger , Miklos Szeredi , Alexander Viro , Anton Altaparmakov , Mark Fasheh , Joel Becker , Ben Myers , Alex Elder , xfs@oss.sgi.com, Matthew Wilcox , Marco Stornelli , Mike Snitzer , Alasdair G Kergon , linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, linux-ext4@vger.kernel.org, fuse-devel@lists.sourceforge.net, linux-fsdevel@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-mm@kvack.org, Jan Kara Subject: [PATCH 2/4] fsfreeze: manage kill signal when sb_start_write is called Content-Type: text/plain; charset=ISO-8859-15 X-ASG-Orig-Subj: [PATCH 2/4] fsfreeze: manage kill signal when sb_start_write is called Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ea0-f179.google.com[209.85.215.179] X-Barracuda-Start-Time: 1365243124 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127333 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 In every place where sb_start_write was called now we must manage the error code and return -EINTR. Signed-off-by: Marco Stornelli --- fs/btrfs/file.c | 9 +++++++-- fs/cifs/file.c | 4 +++- fs/ext4/mmp.c | 3 ++- fs/ext4/super.c | 4 +++- fs/fuse/file.c | 4 +++- fs/namespace.c | 8 ++++++-- fs/ntfs/file.c | 4 +++- fs/ocfs2/file.c | 4 +++- fs/open.c | 8 ++++++-- fs/splice.c | 4 +++- fs/xfs/xfs_file.c | 4 +++- include/linux/fs.h | 6 ++++-- mm/filemap.c | 4 +++- mm/filemap_xip.c | 4 +++- 14 files changed, 52 insertions(+), 18 deletions(-) diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index ade03e6..4891fda 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -329,7 +329,9 @@ static int __btrfs_run_defrag_inode(struct btrfs_fs_info *fs_info, range.len = (u64)-1; range.start = defrag->last_offset; - sb_start_write(fs_info->sb); + ret = sb_start_write(fs_info->sb); + if (ret) + goto cleanup; num_defrag = btrfs_defrag_file(inode, NULL, &range, defrag->transid, BTRFS_DEFRAG_BATCH); sb_end_write(fs_info->sb); @@ -1514,7 +1516,9 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, size_t count, ocount; bool sync = (file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host); - sb_start_write(inode->i_sb); + err = sb_start_write(inode->i_sb); + if (err) + goto out2; mutex_lock(&inode->i_mutex); @@ -1618,6 +1622,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, atomic_dec(&BTRFS_I(inode)->sync_writers); out: sb_end_write(inode->i_sb); +out2: current->backing_dev_info = NULL; return num_written ? num_written : err; } diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 7a0dd99..1613eb9 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -2520,7 +2520,9 @@ cifs_writev(struct kiocb *iocb, const struct iovec *iov, BUG_ON(iocb->ki_pos != pos); - sb_start_write(inode->i_sb); + rc = sb_start_write(inode->i_sb); + if (rc) + return rc; /* * We need to hold the sem to be sure nobody modifies lock list diff --git a/fs/ext4/mmp.c b/fs/ext4/mmp.c index f9b5515..dbdfc6d 100644 --- a/fs/ext4/mmp.c +++ b/fs/ext4/mmp.c @@ -48,7 +48,8 @@ static int write_mmp_block(struct super_block *sb, struct buffer_head *bh) * We protect against freezing so that we don't create dirty buffers * on frozen filesystem. */ - sb_start_write(sb); + if (sb_start_write(sb)) + return 1; ext4_mmp_csum_set(sb, mmp); mark_buffer_dirty(bh); lock_buffer(bh); diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 5d6d535..e6962be 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -2712,7 +2712,9 @@ static int ext4_run_li_request(struct ext4_li_request *elr) sb = elr->lr_super; ngroups = EXT4_SB(sb)->s_groups_count; - sb_start_write(sb); + ret = sb_start_write(sb); + if (ret) + return 1; for (group = elr->lr_next_group; group < ngroups; group++) { gdp = ext4_get_group_desc(sb, group, NULL); if (!gdp) { diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 34b80ba..57194eb 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -971,7 +971,9 @@ static ssize_t fuse_file_aio_write(struct kiocb *iocb, const struct iovec *iov, return err; count = ocount; - sb_start_write(inode->i_sb); + err = sb_start_write(inode->i_sb); + if (err) + return err; mutex_lock(&inode->i_mutex); /* We can write back this queue in page reclaim */ diff --git a/fs/namespace.c b/fs/namespace.c index d581e45..2d2b054 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -343,7 +343,9 @@ int mnt_want_write(struct vfsmount *m) { int ret; - sb_start_write(m->mnt_sb); + ret = sb_start_write(m->mnt_sb); + if (ret) + return ret; ret = __mnt_want_write(m); if (ret) sb_end_write(m->mnt_sb); @@ -403,7 +405,9 @@ int mnt_want_write_file(struct file *file) { int ret; - sb_start_write(file->f_path.mnt->mnt_sb); + ret = sb_start_write(file->f_path.mnt->mnt_sb); + if (ret) + return ret; ret = __mnt_want_write_file(file); if (ret) sb_end_write(file->f_path.mnt->mnt_sb); diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c index 5b2d4f0..a414c53 100644 --- a/fs/ntfs/file.c +++ b/fs/ntfs/file.c @@ -2129,7 +2129,9 @@ static ssize_t ntfs_file_aio_write(struct kiocb *iocb, const struct iovec *iov, BUG_ON(iocb->ki_pos != pos); - sb_start_write(inode->i_sb); + ret = sb_start_write(inode->i_sb); + if (ret) + return ret; mutex_lock(&inode->i_mutex); ret = ntfs_file_aio_write_nolock(iocb, iov, nr_segs, &iocb->ki_pos); mutex_unlock(&inode->i_mutex); diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 6474cb4..8b68176 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -2248,7 +2248,9 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, if (iocb->ki_left == 0) return 0; - sb_start_write(inode->i_sb); + ret = sb_start_write(inode->i_sb); + if (ret) + return ret; appending = file->f_flags & O_APPEND ? 1 : 0; direct_io = file->f_flags & O_DIRECT ? 1 : 0; diff --git a/fs/open.c b/fs/open.c index 6835446..4589d88 100644 --- a/fs/open.c +++ b/fs/open.c @@ -182,7 +182,9 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) if (IS_APPEND(inode)) goto out_putf; - sb_start_write(inode->i_sb); + error = sb_start_write(inode->i_sb); + if (error) + goto out_putf; error = locks_verify_truncate(inode, f.file, length); if (!error) error = security_path_truncate(&f.file->f_path); @@ -293,7 +295,9 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) if (!file->f_op->fallocate) return -EOPNOTSUPP; - sb_start_write(inode->i_sb); + ret = sb_start_write(inode->i_sb); + if (ret) + return ret; ret = file->f_op->fallocate(file, mode, offset, len); sb_end_write(inode->i_sb); return ret; diff --git a/fs/splice.c b/fs/splice.c index 29e394e..4b5c365 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -1000,7 +1000,9 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, }; ssize_t ret; - sb_start_write(inode->i_sb); + ret = sb_start_write(inode->i_sb); + if (ret) + return ret; pipe_lock(pipe); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index f03bf1a..6ba4c0d 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -775,7 +775,9 @@ xfs_file_aio_write( if (ocount == 0) return 0; - sb_start_write(inode->i_sb); + ret = sb_start_write(inode->i_sb); + if (ret) + return ret; if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { ret = -EIO; diff --git a/include/linux/fs.h b/include/linux/fs.h index 2bfb88d..03921d6 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1376,6 +1376,8 @@ static inline void sb_end_intwrite(struct super_block *sb) * sb_start_write - get write access to a superblock * @sb: the super we write to * + * It returns zero when no error occured, the error code otherwise. + * * When a process wants to write data or metadata to a file system (i.e. dirty * a page or an inode), it should embed the operation in a sb_start_write() - * sb_end_write() pair to get exclusion against file system freezing. This @@ -1391,9 +1393,9 @@ static inline void sb_end_intwrite(struct super_block *sb) * -> i_mutex (write path, truncate, directory ops, ...) * -> s_umount (freeze_super, thaw_super) */ -static inline void sb_start_write(struct super_block *sb) +static inline int sb_start_write(struct super_block *sb) { - __sb_start_write_wait(sb, SB_FREEZE_WRITE, false); + return __sb_start_write_wait(sb, SB_FREEZE_WRITE, true); } static inline int sb_start_write_trylock(struct super_block *sb) diff --git a/mm/filemap.c b/mm/filemap.c index e1979fd..b238671 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2528,7 +2528,9 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, BUG_ON(iocb->ki_pos != pos); - sb_start_write(inode->i_sb); + ret = sb_start_write(inode->i_sb); + if (ret) + return ret; mutex_lock(&inode->i_mutex); ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); mutex_unlock(&inode->i_mutex); diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c index a912da6..4cde643 100644 --- a/mm/filemap_xip.c +++ b/mm/filemap_xip.c @@ -404,7 +404,9 @@ xip_file_write(struct file *filp, const char __user *buf, size_t len, loff_t pos; ssize_t ret; - sb_start_write(inode->i_sb); + ret = sb_start_write(inode->i_sb); + if (ret) + return ret; mutex_lock(&inode->i_mutex); -- 1.7.3.4 From willy@parisc-linux.org Sat Apr 6 08:17:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 082DC7F94 for ; Sat, 6 Apr 2013 08:17:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CF6F98F8040 for ; Sat, 6 Apr 2013 06:17:10 -0700 (PDT) X-ASG-Debug-ID: 1365254225-04bdf0542a33af00001-NocioJ Received: from mail.parisc-linux.org (palinux.external.hp.com [192.25.206.14]) by cuda.sgi.com with ESMTP id e5C9PSznQKyTmMLZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 06 Apr 2013 06:17:06 -0700 (PDT) X-Barracuda-Envelope-From: willy@parisc-linux.org X-Barracuda-Apparent-Source-IP: 192.25.206.14 Received: by mail.parisc-linux.org (Postfix, from userid 26919) id 3575649400B; Sat, 6 Apr 2013 07:17:04 -0600 (MDT) Date: Sat, 6 Apr 2013 07:17:03 -0600 From: Matthew Wilcox To: Marco Stornelli Cc: Linux FS Devel , Chris Mason , Steve French , Theodore Ts'o , Andreas Dilger , Miklos Szeredi , Alexander Viro , Anton Altaparmakov , Mark Fasheh , Joel Becker , Ben Myers , Alex Elder , xfs@oss.sgi.com, Mike Snitzer , Alasdair G Kergon , linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, linux-ext4@vger.kernel.org, fuse-devel@lists.sourceforge.net, linux-ntfs-dev@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-mm@kvack.org, Jan Kara Subject: Re: [PATCH 2/4] fsfreeze: manage kill signal when sb_start_write is called Message-ID: <20130406131703.GC28744@parisc-linux.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] fsfreeze: manage kill signal when sb_start_write is called References: <515FF344.8040705@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515FF344.8040705@gmail.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: palinux.external.hp.com[192.25.206.14] X-Barracuda-Start-Time: 1365254226 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127345 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Apr 06, 2013 at 12:04:52PM +0200, Marco Stornelli wrote: > In every place where sb_start_write was called now we must manage > the error code and return -EINTR. If we must manage the error code, then these functions should be marked __must_check. -- Matthew Wilcox Intel Open Source Technology Centre "Bill, look, we understand that you're interested in selling us this operating system, but compare it to ours. We can't possibly take such a retrograde step." From marco.stornelli@gmail.com Sat Apr 6 10:03:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 612DE7F94 for ; Sat, 6 Apr 2013 10:03:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E56DEAC003 for ; Sat, 6 Apr 2013 08:03:38 -0700 (PDT) X-ASG-Debug-ID: 1365260616-04cbb01fb732a250001-NocioJ Received: from mail-ee0-f48.google.com (mail-ee0-f48.google.com [74.125.83.48]) by cuda.sgi.com with ESMTP id PPk1L4RB381oZILf (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 06 Apr 2013 08:03:37 -0700 (PDT) X-Barracuda-Envelope-From: marco.stornelli@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.83.48 Received: by mail-ee0-f48.google.com with SMTP id b15so1759715eek.21 for ; Sat, 06 Apr 2013 08:03:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=QFdgrfG/68tPuwSR4c3CUK5cEbug4Edyil57vi/7fdM=; b=jf7Olslb+1ODQlc0AJkmICQFBr9ub4k3ISCBlbGt0LEjYGuttYpnivDZXXaprz8yZf UHflFABtZZiOB+IjLVqGW7JgOWR+iqffuNdzfhaaV095lYFDKBtK3Sid2+GD/cxRapsV 1kmwxFQjNs5+knIvVpHQ4YdUVj4cHnWBEnQKLSNDPhr/yRMEsOSO7RIUoRFcXsTlNb5u YOXGggK52qmSCLLCa1fwC1rB4Ee8CLSiRIyrnbOi8JD2Tm0QY4+ZLIiiDSe+goqRz3Vl rLQC5uCfOVgihz1VPWBDnF+RPbTlnKc+yaQARv084voxmcj3l4PUm9G3IF3a6AgPvNVp ckLw== X-Received: by 10.14.39.5 with SMTP id c5mr21539689eeb.27.1365260616302; Sat, 06 Apr 2013 08:03:36 -0700 (PDT) Received: from [82.49.195.14] ([82.49.195.14]) by mx.google.com with ESMTPS id cd3sm11567882eeb.6.2013.04.06.08.03.29 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 06 Apr 2013 08:03:35 -0700 (PDT) Message-ID: <51603799.9070008@gmail.com> Date: Sat, 06 Apr 2013 16:56:25 +0200 From: Marco Stornelli User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130329 Thunderbird/17.0.5 MIME-Version: 1.0 To: Matthew Wilcox CC: Linux FS Devel , Chris Mason , Steve French , Theodore Ts'o , Andreas Dilger , Miklos Szeredi , Alexander Viro , Anton Altaparmakov , Mark Fasheh , Joel Becker , Ben Myers , Alex Elder , xfs@oss.sgi.com, Mike Snitzer , Alasdair G Kergon , linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, linux-ext4@vger.kernel.org, fuse-devel@lists.sourceforge.net, linux-ntfs-dev@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-mm@kvack.org, Jan Kara Subject: Re: [PATCH 2/4] fsfreeze: manage kill signal when sb_start_write is called References: <515FF344.8040705@gmail.com> <20130406131703.GC28744@parisc-linux.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] fsfreeze: manage kill signal when sb_start_write is called In-Reply-To: <20130406131703.GC28744@parisc-linux.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ee0-f48.google.com[74.125.83.48] X-Barracuda-Start-Time: 1365260617 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127353 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 Il 06/04/2013 15:17, Matthew Wilcox ha scritto: > On Sat, Apr 06, 2013 at 12:04:52PM +0200, Marco Stornelli wrote: >> In every place where sb_start_write was called now we must manage >> the error code and return -EINTR. > > If we must manage the error code, then these functions should be marked > __must_check. > Yep, good point. Marco From viro@ftp.linux.org.uk Sat Apr 6 16:50:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 63E5F7F55 for ; Sat, 6 Apr 2013 16:50:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4570D304039 for ; Sat, 6 Apr 2013 14:50:55 -0700 (PDT) X-ASG-Debug-ID: 1365285052-04bdf0542b3621f0001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id OhMjRbD8Vwpvu1Lh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Sat, 06 Apr 2013 14:50:53 -0700 (PDT) X-Barracuda-Envelope-From: viro@ftp.linux.org.uk X-Barracuda-Apparent-Source-IP: 195.92.253.2 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.76 #1 (Red Hat Linux)) id 1UOb0L-0008Oe-St; Sat, 06 Apr 2013 21:50:33 +0000 Date: Sat, 6 Apr 2013 22:50:33 +0100 From: Al Viro To: Marco Stornelli Cc: Linux FS Devel , Chris Mason , Steve French , Theodore Ts'o , Andreas Dilger , Miklos Szeredi , Anton Altaparmakov , Mark Fasheh , Joel Becker , Ben Myers , Alex Elder , xfs@oss.sgi.com, Matthew Wilcox , Mike Snitzer , Alasdair G Kergon , linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, linux-ext4@vger.kernel.org, fuse-devel@lists.sourceforge.net, linux-ntfs-dev@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-mm@kvack.org, Jan Kara Subject: Re: [PATCH 2/4] fsfreeze: manage kill signal when sb_start_write is called Message-ID: <20130406215033.GM4068@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: [PATCH 2/4] fsfreeze: manage kill signal when sb_start_write is called References: <515FF344.8040705@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515FF344.8040705@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1365285053 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127381 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Apr 06, 2013 at 12:04:52PM +0200, Marco Stornelli wrote: > In every place where sb_start_write was called now we must manage > the error code and return -EINTR. Now go and look for callers of mnt_want_write() ;-/ The really painful one is in do_last(), but kern_path_create() is not much better; mq_open() would be bad too, had it not been about something you are not going to freeze anyway... From msdt079@msn.com Sat Apr 6 17:00:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.2 required=5.0 tests=ADVANCE_FEE_3_NEW, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,HTML_MESSAGE,MSGID_FROM_MTA_HEADER autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 65A087F55 for ; Sat, 6 Apr 2013 17:00:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 50CE1304048 for ; Sat, 6 Apr 2013 15:00:43 -0700 (PDT) X-ASG-Debug-ID: 1365285642-04cbb01fb7346740001-w1Z2WR Received: from blu0-omc3-s36.blu0.hotmail.com (blu0-omc3-s36.blu0.hotmail.com [65.55.116.111]) by cuda.sgi.com with ESMTP id 0zLNjyDlCSbRKhzr for ; Sat, 06 Apr 2013 15:00:42 -0700 (PDT) X-Barracuda-Envelope-From: msdt079@msn.com X-Barracuda-Apparent-Source-IP: 65.55.116.111 Received: from BLU0-SMTP468 ([65.55.116.73]) by blu0-omc3-s36.blu0.hotmail.com with Microsoft SMTPSVC(6.0.3790.4675); Sat, 6 Apr 2013 15:00:42 -0700 X-EIP: [EG/lm7X9SVq1q9JibeZaTgeGFfH8TQ4I] X-Originating-Email: [msdt079@msn.com] Message-ID: Received: from user-PC ([41.203.239.80]) by BLU0-SMTP468.phx.gbl over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); Sat, 6 Apr 2013 15:00:40 -0700 From: "M . S" To: "linux-xfs@oss.sgi.com" Reply-To: mso_1414@kimo.com Date: Sat, 6 Apr 2013 21:40:50 +0100 Subject: Hello. MIME-Version: 1.0 X-ASG-Orig-Subj: Hello. Content-Type: multipart/alternative; boundary="_=aspNetEmail=_1baf5eef088f4e49a80bada3c2614642" X-Mailer: aspNetEmail ver 3.6.1.22 X-OriginalArrivalTime: 06 Apr 2013 22:00:41.0144 (UTC) FILETIME=[2DD14380:01CE3312] X-Barracuda-Connect: blu0-omc3-s36.blu0.hotmail.com[65.55.116.111] X-Barracuda-Start-Time: 1365285642 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.68 X-Barracuda-Spam-Status: No, SCORE=1.68 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, HTML_MESSAGE, MSGID_FROM_MTA_HEADER, SARE_FRAUD_X3, SARE_FRAUD_X3_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127381 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MSGID_FROM_MTA_HEADER Message-Id was added by a relay 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) 0.01 SARE_FRAUD_X3 Matches 3+ phrases commonly used in fraud spam 1.67 SARE_FRAUD_X3_2 Matches 3+ phrases commonly used in fraud spam --_=aspNetEmail=_1baf5eef088f4e49a80bada3c2614642 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hello=2E=0D=0A=26nbsp;=26nbsp;=26nbsp;=26nbsp;=26nbsp; I assume you and y= our family are in good health=2E =0D=0AI am the Foreign Operations Manage= r at one of the leading generation bank here in Burkina Faso West Africa=2E= =0D=0A=26nbsp;=26nbsp; This being a wide world in which it can be difficu= lt to make new acquaintances and because it is virtually impossible to kn= ow who is trustworthy and who can be believed, i have decided to repose c= onfidence in you after much fasting and prayer=2E=26nbsp;=26nbsp; It is o= nly because of this that I have decided to confide in you and to share wi= th you this confidential business=2E=0D=0A=26nbsp; In my bank; there resi= des an overdue and abandoned huge amount of money=2E=26nbsp; When the acc= ount holder suddenly passed on, he left no beneficiary who would be entit= led to the receipt of the amount=2E=26nbsp; For this reason, I have found= it expedient to transfer this currency to a trustworthy individual with = capacity to act as foreign business partner=2E=26nbsp; Thus i humbly requ= est your assistance to claim this amount=2E=0D=0A=26nbsp;=26nbsp;=26nbsp;= Upon the transfer of this amount in your account, you will take 45=25 as= your share from the total currency, 10=25 will be shared to Charity Orga= nizations in both country and 45=25 will be for me=2E =0D=0APlease if you= are really sure you can handle this project, contact me immediately for = details of the amount involved=2E=0D=0AI am looking forward to read from = you soon=2E =0D=0AThanks =0D=0AYour Good friend, --_=aspNetEmail=_1baf5eef088f4e49a80bada3c2614642 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable =0D=0A=0D=0A=0D=0A

Hello=2E
=26nbsp;=26nbsp;=26= nbsp;=26nbsp;=26nbsp; I assume you and your family are in good health=2E =
I am the Foreign Operations Manager at one of the leading generation = bank here in Burkina Faso West Africa=2E
=26nbsp;=26nbsp; This being a= wide world in which it can be difficult to make new acquaintances and be= cause it is virtually impossible to know who is trustworthy and who can b= e believed, i have decided to repose confidence in you after much fasting= and prayer=2E=26nbsp;=26nbsp; It is only because of this that I have dec= ided to confide in you and to share with you this confidential business=2E=

=0D=0A

=26nbsp; In my bank; there resides an overdue and abandoned = huge amount of money=2E=26nbsp; When the account holder suddenly passed o= n, he left no beneficiary who would be entitled to the receipt of the amo= unt=2E=26nbsp; For this reason, I have found it expedient to transfer thi= s currency to a trustworthy individual with capacity to act as foreign bu= siness partner=2E=26nbsp; Thus i humbly request your assistance to claim = this amount=2E

=0D=0A

=26nbsp;=26nbsp;=26nbsp; Upon the transfer of = this amount in your account, you will take 45=25 as your share from the t= otal currency, 10=25 will be shared to Charity Organizations in both coun= try and 45=25 will be for me=2E
Please if you are really sure you can= handle this project, contact me immediately for details of the amount in= volved=2E
I am looking forward to read from you soon=2E

=0D=0A

T= hanks
Your Good friend,

--_=aspNetEmail=_1baf5eef088f4e49a80bada3c2614642-- From eguan@redhat.com Sun Apr 7 05:39:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7530D7F5D for ; Sun, 7 Apr 2013 05:39:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0309DAC001 for ; Sun, 7 Apr 2013 03:39:17 -0700 (PDT) X-ASG-Debug-ID: 1365331156-04cb6c1e773a1000001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id whDNSTq93ZEhReE6 for ; Sun, 07 Apr 2013 03:39: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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r37AdG5a002182 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sun, 7 Apr 2013 06:39:16 -0400 Received: from localhost (dhcp-13-36.nay.redhat.com [10.66.13.36]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r37AdEoi003954; Sun, 7 Apr 2013 06:39:15 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 1/3] xfstests: remove comments about creator in new Date: Sun, 7 Apr 2013 18:39:05 +0800 X-ASG-Orig-Subj: [PATCH 1/3] xfstests: remove comments about creator in new Message-Id: <1365331147-15179-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1365331156 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 We have removed creator/owner info from each test case, remove the 'creator' comment in template too. Signed-off-by: Eryu Guan --- new | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/new b/new index 2bc1e8f..f712892 100755 --- a/new +++ b/new @@ -104,7 +104,7 @@ cat <$id # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #----------------------------------------------------------------------- # -# creator + seq=\`basename \$0\` seqres=\$RESULT_DIR/\$seq echo "QA output created by \$seq" -- 1.8.1.4 From eguan@redhat.com Sun Apr 7 05:39:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 02C767F5D for ; Sun, 7 Apr 2013 05:39:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8C737AC001 for ; Sun, 7 Apr 2013 03:39:22 -0700 (PDT) X-ASG-Debug-ID: 1365331161-04cbb01fba376f90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3wd2Bs3lO33Il9Su for ; Sun, 07 Apr 2013 03:39:21 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r37AdLsS020731 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sun, 7 Apr 2013 06:39:21 -0400 Received: from localhost (dhcp-13-36.nay.redhat.com [10.66.13.36]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r37AdJnA027746; Sun, 7 Apr 2013 06:39:20 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups Date: Sun, 7 Apr 2013 18:39:07 +0800 X-ASG-Orig-Subj: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups Message-Id: <1365331147-15179-3-git-send-email-eguan@redhat.com> In-Reply-To: <1365331147-15179-1-git-send-email-eguan@redhat.com> References: <1365331147-15179-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: 1365331161 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 1. add one space between # and test description 2. remove creator/owner info 3. fix common/rc and common/filter path so they can be sourced correctly 4. no need to remove $seq.full cause it's not used(or if verbose output is needed, $seqres.full should be used) Signed-off-by: Eryu Guan --- tests/generic/310 | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tests/generic/310 b/tests/generic/310 index ef51422..35baa23 100644 --- a/tests/generic/310 +++ b/tests/generic/310 @@ -1,8 +1,8 @@ #! /bin/bash # FS QA Test No. 310 # -#Check if there are two threads,one keeps calling read() or lseek(), and -#the other calling readdir(), both on the same directory fd. +# Check if there are two threads,one keeps calling read() or lseek(), and +# the other calling readdir(), both on the same directory fd. # # Based on a testcase from Li Zefan . # @@ -25,10 +25,9 @@ # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #----------------------------------------------------------------------- # -# creator -owner=zhaohongjiang@huawei.com seq=`basename $0` +seqres=$RESULT_DIR/$seq echo "QA output created by $seq" status=1 # failure is the default! @@ -40,8 +39,8 @@ _cleanup() trap "_cleanup; exit \$status" 0 1 2 3 15 # get standard environment, filters and checks -. ./common.rc -. ./common.filter +. ./common/rc +. ./common/filter # real QA test starts here _supported_fs generic @@ -71,6 +70,5 @@ _test_lseek # success, all done echo "*** done" -rm -f $seq.full status=0 exit -- 1.8.1.4 From eguan@redhat.com Sun Apr 7 05:39:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 143657F5E for ; Sun, 7 Apr 2013 05:39:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A00BBAC002 for ; Sun, 7 Apr 2013 03:39:22 -0700 (PDT) X-ASG-Debug-ID: 1365331158-04bdf0542c38c5c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wqDvvy3W4aK6SaLN for ; Sun, 07 Apr 2013 03:39:18 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r37AdIri020725 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sun, 7 Apr 2013 06:39:18 -0400 Received: from localhost (dhcp-13-36.nay.redhat.com [10.66.13.36]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r37AdH7v005915; Sun, 7 Apr 2013 06:39:17 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 2/3] xfstests: replace $seq.full with $seqres.full in ext4/305 and generic/308 Date: Sun, 7 Apr 2013 18:39:06 +0800 X-ASG-Orig-Subj: [PATCH 2/3] xfstests: replace $seq.full with $seqres.full in ext4/305 and generic/308 Message-Id: <1365331147-15179-2-git-send-email-eguan@redhat.com> In-Reply-To: <1365331147-15179-1-git-send-email-eguan@redhat.com> References: <1365331147-15179-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1365331158 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 We use $seqres.full to record verbose output now, replace $seq.full with $seqres.full in ext4/305 and generic/308. Signed-off-by: Eryu Guan --- tests/ext4/305 | 6 +++--- tests/generic/308 | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/ext4/305 b/tests/ext4/305 index bf9d9cd..eee461a 100644 --- a/tests/ext4/305 +++ b/tests/ext4/305 @@ -46,12 +46,12 @@ _supported_os Linux _require_scratch -rm -f $seq.full +rm -f $seqres.full echo "Silence is golden" DEV_BASENAME=$(basename $(readlink -f $SCRATCH_DEV)) -echo "Start test on device $SCRATCH_DEV, basename $DEV_BASENAME" >$seq.full -_scratch_mkfs >>$seq.full 2>&1 +echo "Start test on device $SCRATCH_DEV, basename $DEV_BASENAME" >$seqres.full +_scratch_mkfs >>$seqres.full 2>&1 while true;do mount $SCRATCH_DEV $SCRATCH_MNT diff --git a/tests/generic/308 b/tests/generic/308 index 0db093a..8037c08 100644 --- a/tests/generic/308 +++ b/tests/generic/308 @@ -45,7 +45,7 @@ testfile=$TEST_DIR/testfile.$seq _supported_fs generic _supported_os Linux -rm -f $seq.full +rm -f $seqres.full echo "Silence is golden" block_size=`stat -f -c %s $TEST_DIR` @@ -58,11 +58,11 @@ block_size=`stat -f -c %s $TEST_DIR` # Create a sparse file with an extent lays at one block before old s_maxbytes offset=$(((2**32 - 2) * $block_size)) -$XFS_IO_PROG -f -c "pwrite $offset $block_size" -c fsync $testfile >$seq.full 2>&1 +$XFS_IO_PROG -f -c "pwrite $offset $block_size" -c fsync $testfile >$seqres.full 2>&1 # Write to the block after the extent just created offset=$(((2**32 - 1) * $block_size)) -$XFS_IO_PROG -f -c "pwrite $offset $block_size" -c fsync $testfile >>$seq.full 2>&1 +$XFS_IO_PROG -f -c "pwrite $offset $block_size" -c fsync $testfile >>$seqres.full 2>&1 # Got here without hitting BUG_ON(), test passed status=0 -- 1.8.1.4 From shhuiw@gmail.com Sun Apr 7 07:00:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1FA097F69 for ; Sun, 7 Apr 2013 07:00:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0A1AB8F8035 for ; Sun, 7 Apr 2013 05:00:03 -0700 (PDT) X-ASG-Debug-ID: 1365336002-04cb6c1e783a6930001-NocioJ Received: from mail-oa0-f43.google.com (mail-oa0-f43.google.com [209.85.219.43]) by cuda.sgi.com with ESMTP id YoW997aNCgMnRAY0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 07 Apr 2013 05:00:03 -0700 (PDT) X-Barracuda-Envelope-From: shhuiw@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.219.43 X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.43] Received: by mail-oa0-f43.google.com with SMTP id l10so5326254oag.30 for ; Sun, 07 Apr 2013 05:00:02 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.43] X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.43] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; bh=Pk/zv6Zq791yrpu3eDIxG8/EBGLQHyRcrtcGvN9WivQ=; b=TbqzKSzuEYQm51rY77hj7c+iqlx4IRIEVHDx9yZldhqgjgq8lVYIFeTqDI/SonfC9N 4L9Z7eainh16Qr/7AMuV2CogAf5qym7+iQzGwdPBzocxU/aqevP5o5LdRSdQF6YOK/kn iHYsjIJNpddQ1EPHSJOlHZckxACuiidjrRU0FNtKtnN9uzVgYh8FP/h1g2oDi/hbtbHK RSw9q6xgo2DfEyD1fpT3uwDF/ARv7yMt4wl8e07fJ4MJ3WCpxT5Y+4slPDsJNYBot6Nd XVNL3RY88XHfLs6JrXV7+OhqklysuIHqZCcNxUknUtJfbAXwjJnbYGMu4WP/5x0dgN9y w3qw== X-Received: by 10.182.125.132 with SMTP id mq4mr1001364obb.79.1365336002569; Sun, 07 Apr 2013 05:00:02 -0700 (PDT) Received: from [192.168.1.104] ([122.70.27.85]) by mx.google.com with ESMTPS id qk4sm19735641obc.5.2013.04.07.05.00.01 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 07 Apr 2013 05:00:02 -0700 (PDT) Message-ID: <51615FBF.2020001@gmail.com> Date: Sun, 07 Apr 2013 19:59:59 +0800 From: Wang Sheng-Hui User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfstests Subject: xfstests 'make install' failed Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: xfstests 'make install' failed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-oa0-f43.google.com[209.85.219.43] X-Barracuda-Start-Time: 1365336003 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127437 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi, The testcases of xfstests have been reorganized into different subdirs to filesystems. But the 'install' section of Makefile still uses the old location of testcases. The 'install' of Makefile needs to be modified for the latest source code organization. Can someone share me one patch to make the install successful? Thanks, Sheng-Hui From schrepfer@fr.oleane.com Sun Apr 7 07:57:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=AXB_XMAILER_MIMEOLE_OL_E023A, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B8A837F50 for ; Sun, 7 Apr 2013 07:57:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A2AF98F8035 for ; Sun, 7 Apr 2013 05:57:36 -0700 (PDT) X-ASG-Debug-ID: 1365339453-04cb6c1e7a3aab80001-w1Z2WR Received: from smtp07.msg.oleane.net (smtp07.msg.oleane.net [62.161.4.7]) by cuda.sgi.com with ESMTP id c0NLqvKRhs4i6uiB for ; Sun, 07 Apr 2013 05:57:34 -0700 (PDT) X-Barracuda-Envelope-From: schrepfer@fr.oleane.com X-Barracuda-Apparent-Source-IP: 62.161.4.7 Received: from ipcyzzjh (hn.kd.ny.adsl [115.58.133.45] (may be forged)) (authenticated) by smtp07.msg.oleane.net (MTA) with ESMTP id r37CufWt014110; Sun, 7 Apr 2013 14:56:44 +0200 X-DKIM: Sendmail DKIM Filter v2.8.3 smtp07.msg.oleane.net r37CufWt014110 DKIM-Signature: v=1; a=rsa-sha1; c=simple/simple; d=fr.oleane.com; s=orange; t=1365339410; bh=JAd3dhlmQ+g+IabtPVV2PWzmols=; h=Message-ID:From:To:Subject:Date:MIME-Version:Content-Type; b=XATAud9WH3fKIc5C5hTcjWmrhckUPIpoJPtCCCA4DfFNSKjBth9f2EtX+GaGfFeZL HBXJRiQGZ80ciZP/Lareg6BiV0m+9+qLNg7iUsvOd2WjpsrGcGFptgVjfGZZbHtlAv 7cfiQz2QvW+qv+mpyjXTfdocsCfBJRu9Lj96Kinw= X-Oleane-Rep: REPA Message-ID: From: =?utf-8?B?6bKN5Yed5aSp?= To: <1019766498@qq.com> Subject: =?utf-8?B?5Lu75Yqh5YiG6YWN55qE5Y6f5YiZ44CB5YiG6YWN5pe255qE5oqX5ouS5aSE55CG44CB5YiG6YWN5pe2?= =?utf-8?B?55qE5o6n5Yi257Sn5bqmIGhp?= Date: Sun, 7 Apr 2013 20:56:46 +0800 X-ASG-Orig-Subj: =?utf-8?B?5Lu75Yqh5YiG6YWN55qE5Y6f5YiZ44CB5YiG6YWN5pe255qE5oqX5ouS5aSE55CG44CB5YiG6YWN5pe2?= =?utf-8?B?55qE5o6n5Yi257Sn5bqmIGhp?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_03B0_0101C557.158F71E0" 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-PMX-Spam: Probability=59% X-PFSI-Info: PMX 5.5.9.395186, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2013.4.7.123620 (no antivirus check) X-Orange-Auth: c2NocmVwZmVyQGZyLm9sZWFuZS5jb20= X-Barracuda-Connect: smtp07.msg.oleane.net[62.161.4.7] X-Barracuda-Start-Time: 1365339454 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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_SC0_MV0113c, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127441 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 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 This is a multi-part message in MIME format. ------=_NextPart_000_03B0_0101C557.158F71E0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0267_0101C557.158F71E0" ------=_NextPart_001_0267_0101C557.158F71E0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 5bCK5pWs55qE77yaMTAxOTc2NjQ5OO+8jA0K44CA44CA5ZCb5a2Q54ix6LSi77yM5Y+W55+l5pyJ 5Yiw44CCDQrjgIDjgIDpg73or7TmlL7lvIPkuobjgILkuLrku4DkuYjov5jopoHnlZnkuIvlm57l v4bjgILkuI3opoHlho3mnaXkuobjgIINCg0K6ZmE5Lu25pyJ5oiR5Lus5pyA5paw55qE6K++56iL 6K6h5YiS6KGo77yM5pWs6K+36L2s5Lqk55u45YWz6LSf6LSj5Lq677yMDQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICDpso3lh53lpKkNCg0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAyMDEzLTQtNyAgIDIwOjU2OjUyICA= ------=_NextPart_001_0267_0101C557.158F71E0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0 Zi04IiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA4LjAwLjYwMDEuMTg5OTkiPjwvSEVBRD4NCjxCT0RZPg0KPFA+PEZPTlQgDQpz aXplPTI+5bCK5pWs55qE77yaMTAxOTc2NjQ5OO+8jDxCUj7jgIDjgIDlkJvlrZDniLHotKLvvIzl j5bnn6XmnInliLDjgII8QlI+44CA44CA6YO96K+05pS+5byD5LqG44CC5Li65LuA5LmI6L+Y6KaB 55WZ5LiL5Zue5b+G44CC5LiN6KaB5YaN5p2l5LqG44CCPEJSPjxCUj7pmYTku7bmnInmiJHku6zm nIDmlrDnmoTor77nqIvorqHliJLooajvvIzmlazor7fovazkuqTnm7jlhbPotJ/otKPkurrvvIw8 QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0K6bKN5Yed5aSpPEJS PjxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsyMDEzLTQtNyZuYnNwOyZuYnNwOyANCjIwOjU2OjUyPC9GT05UPiZuYnNwOyA8L1A+ PC9CT0RZPjwvSFRNTD4NCg== ------=_NextPart_001_0267_0101C557.158F71E0-- ------=_NextPart_000_03B0_0101C557.158F71E0 Content-Type: application/octet-stream; name="From technology to management.xls" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="From technology to management.xls" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAQwAAAAAAAAAA EAAA/v///wAAAAD+////AAAAAEIAAAD///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////8J CBAAAAYFAJsgzQfJwAAABgMAAOEAAgCwBMEAAgAAAOIAAABcAHAABAABrl9vjyh1N2IgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIAAgCwBGEBAgAAAMABAAA9AQIA AQCcAAIADgAZAAIAAAASAAIAAAATAAIAAACvAQIAAAC8AQIAAAA9ABIA4AFpAARH+jI4AAAAAAAB AFgCQAACAAAAjQACAAAAIgACAAAADgACAAEAtwECAAAA2gACAAAAMQAUAPAAAAD/f5ABAAAAAIZu AgGLW1NPMQAUAPAAAAD/f5ABAAAAAIZuAgGLW1NPMQAUAPAAAAD/f5ABAAAAAIZuAgGLW1NPMQAU APAAAAD/f5ABAAAAAIZuAgGLW1NPMQAUAPAAAAD/f5ABAAAAAIZuAgGLW1NPMQAUAPAABAAMAJAB AAABAIZuAgGLW1NPMQAUAPAABAAkAJABAAABAIZuAgGLW1NPMQAUALQAAAD/f5ABAAAAAIZuAgGL W1NPMQAUAMgAAAD/f5ABAAAAAIZuAgGLW1NPMQAUALQAAwAUALwCAAAAAIZuAgGLW1NPMQAUABgB AQD/f7wCAAAAAIZuAgHRnlNPMQAUAMgAAQA+ALwCAAAAAIZuAgGLW1NPHgQrAAUAEwABIgDl/yIA IwAsACMAIwAwADsAIgDl/yIAXAAtACMALAAjACMAMAAeBDUABgAYAAEiAOX/IgAjACwAIwAjADAA OwBbAFIAZQBkAF0AIgDl/yIAXAAtACMALAAjACMAMAAeBDcABwAZAAEiAOX/IgAjACwAIwAjADAA LgAwADAAOwAiAOX/IgBcAC0AIwAsACMAIwAwAC4AMAAwAB4EQQAIAB4AASIA5f8iACMALAAjACMA MAAuADAAMAA7AFsAUgBlAGQAXQAiAOX/IgBcAC0AIwAsACMAIwAwAC4AMAAwAB4EaQAqADIAAV8A IAAiAOX/IgAqACAAIwAsACMAIwAwAF8AIAA7AF8AIAAiAOX/IgAqACAAXAAtACMALAAjACMAMABf ACAAOwBfACAAIgDl/yIAKgAgACIALQAiAF8AIAA7AF8AIABAAF8AIAAeBC4AKQApAABfICogIywj IzBfIDtfICogXC0jLCMjMF8gO18gKiAiLSJfIDtfIEBfIB4EeQAsADoAAV8AIAAiAOX/IgAqACAA IwAsACMAIwAwAC4AMAAwAF8AIAA7AF8AIAAiAOX/IgAqACAAXAAtACMALAAjACMAMAAuADAAMABf ACAAOwBfACAAIgDl/yIAKgAgACIALQAiAD8APwBfACAAOwBfACAAQABfACAAHgQ2ACsAMQAAXyAq ICMsIyMwLjAwXyA7XyAqIFwtIywjIzAuMDBfIDtfICogIi0iPz9fIDtfIEBfIB4EGgAXABUAAFwk IywjIzBfKTtcKFwkIywjIzBcKR4EHwAYABoAAFwkIywjIzBfKTtbUmVkXVwoXCQjLCMjMFwpHgQg ABkAGwAAXCQjLCMjMC4wMF8pO1woXCQjLCMjMC4wMFwpHgQlABoAIAAAXCQjLCMjMC4wMF8pO1tS ZWRdXChcJCMsIyMwLjAwXCkeBGUAsAAwAAFfAC0AIgDl/yIAKgAgACMALAAjACMAMABfAC0AOwBc AC0AIgDl/yIAKgAgACMALAAjACMAMABfAC0AOwBfAC0AIgDl/yIAKgAgACIALQAiAF8ALQA7AF8A LQBAAF8ALQAeBHUAsQA4AAFfAC0AIgDl/yIAKgAgACMALAAjACMAMAAuADAAMABfAC0AOwBcAC0A IgDl/yIAKgAgACMALAAjACMAMAAuADAAMABfAC0AOwBfAC0AIgDl/yIAKgAgACIALQAiAD8APwBf AC0AOwBfAC0AQABfAC0A4AAUAAAAAAD1/xAAAAAAAAAAAAAAAMAg4AAUAAEAAAD1/xAAAPQAAAAA AAAAAMAg4AAUAAEAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAIAAAD1/xAAAPQAAAAAAAAAAMAg4AAU AAIAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAD1/xAA APQAAAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAA AMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAA AAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQA AAAAAAAAAMAg4AAUAAAAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAAAAAABABAAAAAAAAAAAAAAAMAg 4AAUAAUACQD1/xAAAPgAAAAAAAAAAMAg4AAUAAUAAAD1/yAAAAAAAAAAAAAAAMAg4AAUAAYAAAD0 /wAAAPQAAAAAAAAAAMAg4AAUAAYAAAD1/xAAAPQAAAAAAAAAAMAg4AAUAAUAsQD1/xAAAPgAAAAA AAAAAMAg4AAUAAUAsAD1/xAAAPgAAAAAAAAAAMAg4AAUAAUAKwD1/xAAAPgAAAAAAAAAAMAg4AAU AAUAKQD1/xAAAPgAAAAAAAAAAMAg4AAUAAcAAAD0/wAAAPQAAAAAAAAAAMAg4AAUAAAAAAABABAA AEgAAAAAAAAABAkg4AAUAAkAAAABABAAAGgCAj4APgAABDEg4AAUAAoAAAAxASMAAHgAAgAAPgAA BDEg4AAUAAkAAAABABAAAGggAgAfPgAABDEg4AAUAAkAAAABABAAAGgCAD4AAAAABDEg4AAUAAsA AAABACIAAHgAAAAAAAAABDEg4AAUAAkAAAABABAAAGggAAAfAAAABDEg4AAUAAkAAAABACIAAHgA AAAAAAAABDEg4AAUAAUAAAARASAAAEgAAAAAAAAABAkg4AAUAAkAAAARASAAAGgCAD4AAAAABC4g 4AAUAAkAAAARASAAAGgAAAAAAAAABC4g4AAUAAkAAAARASAAAGggAAAfAAAABC4g4AAUAAkAAAAB ABAAAGgCAD4AAAAABAkg4AAUAAkAAAABABAAAGgAAAAAAAAABAkg4AAUAAkAAAABABAAAGggAAAf AAAABAkg4AAUAAwAAAABABAAAGgAAAAAAAAABAkg4AAUAAkAAAABABAAAGgCAD4AAAAABC4g4AAU AAkAAAABABAAAGgAAAAAAAAABC4g4AAUAAkAAAABABAAAGggAAAfAAAABC4g4AAUAAkAAAABABAA AGgCAD4AAAAABCkg4AAUAAkAAAABABAAAGgAAAAAAAAABCkg4AAUAAkAAAABABAAAGggAAAfAAAA BCkg4AAUAAkAAAAJABAAAGgAAAAAAAAABCkg4AAUAAAAAAABABEAAFgAAAAAAAAABAkg4AAUAAkA AAABABAAAGgCID4AAB8ABCkg4AAUAAkAAAABABAAAGgAIAAAAB8ABCkg4AAUAAkAAAABABAAAGgg IAAfAB8ABCkg4AAUAAkAAAABABAAAEgAAAAAAAAABAkgkwIEABCABf+TAgQAAIAA/5MCFwARAAkA AThexIlfAFMAaABlAGUAdAAxAJMCBAASgAj/kwIbABMACwABhY3+lKVjXwDOToBiL2dwjRFUoXsG dJMCBAAUgAT/kwIEABWAB/+TAgQAFoAD/5MCBAAXgAb/kwIEABiACf9gAQIAAACFABYAXTIAAAAA BwHOToBiL2dwjRFUoXsGdIwABABWAFYArgEEAAEAAQQXAAgAAQAAAAAAAADBAQgAwQEAACK+AQD8 AB8gwQAAAMEAAAAGAAEQMKViDVTmi8VgETAPAAEQMH9inlJVU01PETABTyAAGk4gAGZbIABgTiAA UX8vAAEQMPlXrYv5W2GMETABTxpOQwBFAE8ALwA7YM9+BnQBMBR40VM7YM9+BnQvAG9SO2ABMGxR +FM7YOVdLwCAYi9nO2DRdgEwFHjRU3mY7nbPfgZ0LwCnTsFUz34GdAEwMgABIAAgACAAIAAgACAA IAAgACAAIAAgACAALU7Vi+iQz34GdAEwFHjRUyiNz5HokM9+BnQBMFAATQBPAAj/eZjudqF7BnSe UmxRpFsJ/ztO+04BMKF7BnSXXE1PhHaAYi9nuk5YVC4AARAw+VetizmNKHURMDQAMwAwADAAQ1Ev AGVnAE5gjQBOLAANTo1RU2KYYgIwAJcoVwxUAE4qTghnhHYMVABO/osLek1iq04JZ2RrGE/gYCwA VVPscgBOuk42ZTmNIgABIAAgACAAIAAgACAAIAAgACAAIAAgADIAOAAwADAAQ1ECMAj/BVPsYkSN mWU5jQEwSFMQmQEwNoO5cAEw0VNoeUl7Cf8GAAEQMP6LC3rMgG9mETAtAAEAMAAwOWhuYxFi7E4a WXRezk6LThR40VOhewZ0qFTii4R2z36MmtFTsHMtTv1WAU8aTjkANQAlACAA5U4KToR2FHjRUy1O +ldCXDtOoXv9kC9mzk6AYi9n/YAPAAGbUtRrg486X4R25V0LegheLU7QY9Rid41lZ4R2OgAjAAEg ACAAIAAgAIhfGlkaUhpScI0KTqF7BnSXXE1PhHYUeNFTuk5YVNKJcoINTv2AbI9iYwz/x4+mXnNR 6GyAYi9nxn6Cghv/EwABIAAgACAAIACkix93Ll6pUgtOXlzvUy9m1k7sTnZeDU5wTiaNG/8dAAEg ACAAIAAgAOFRi06yTptSsk46Tgz/2V+XXyZxNFnCcJ2YDP/vUy9mCk74U3RTzFpIZYdzKllOTxv/ IAABIAAgACAAIAAMXhtnC05eXBpZ0GMPYcGJDP/vUy9m1k7sTnRTwE5ITv2QDU70iwz/DU4/YQ9h f2LFYiON+04b/xUAASAAIAAgACAACk74U6mLNlKaW+VdXE+hixJSDP/vU3RT4GXOTgtOS2Ib/y0A ASAAIAAgACAADU7ld1OQgllVTwZSPm3lXVxPDP+CWVVPhpj8W+JWH5YM//RmDU7ld1OQgllVT254 3U9gT4R24lYflg1O+lHuXRmV9IF/T7J162ANTipYdFPYjwsAAQ1O/YAJZ0hlvo8wUnRlU0/udgdo AjAtAAEgACAAIAAgAM5OAE4NVOpT+VuAYi9nH40jjYR2gGIvZ7pOWFRsj9hTOk75W2hRQW0Leh+N I42EdnmY7nbPfgZ0jFT5W9BnAE4TThpOhpjfVx+NI42EduiQ6JUrAAHPfgZ0DP8oV9mPKk5sj9hT hHbHjwt6LU4M/4BiL2e6TlhUgYmeW7Bz6lSbThWH2FMBMIGJjGPhY+pUm06hewZ0gGL9gAEwgllV T/lXe1HqgfFdhHaGmA8AAfxbm1JJey9mLGf+iwt6zZG5cKJjqIuEdoVRuVsCMAYAARAw/osLejZl ynYRMCkAATEALgAGUqtOsosIXgpOfnY6VxR40VOhewZ0+Veti4R2E04aTs9+jJoM/xqQx4+wczpX hHaSTqhSLl6pUmZbWFQGdAVucI0RVKF7BnSEdvBW0WAaAAEyAC4AO2DTfoxUBlKQZ4BiL2e6TlhU zk6AYi9ncI0RVKF7BnTHjwt6LU44XsGJhHbulZiYGQABMwAuAIxj4WOeW7Bzzk6AYi9ncI0RVKF7 BnSEdsePC3otToGJnluwc4R24FEqTmyP2FMrAAE0AC4Ahk7jic5OgGIvZ3CNEVShewZ0hHaUTipO fVlgTu9gCP/Tfpxn/FsRVAEw/H7CiWhRQFwBMFqAJnHNkblwATDRUyVjGE+/UgEwxpYdYH9eynYJ /w4AATUALgCMY+FjDk6GmPxbn2wakIR2uWXVbIBi510sAAE2AC4AjGPhY3CNCk6hewZ05V1cT5dc TU8OVACXgYmMY+FjhHbbVipOOGjDX6F7BnSAYv2ACP/udgdoDk6hixJSATDEfsd+Dk4GUj5t5V1c TwEwp2M2Ug5OEAABIAAgAKB+T1ABMIaY/FsOTsBvsVIJ/yAAIAAgACAAIAAYAAE3AC4Ahk7jiRBi n1KeW7Bzzk6AYi9ncI0RVKF7BnRsj9hThHbgUSpOc1EulYGJIH0qAAE4AC4ABlKrTrKLCF5wZUFT Kk6oVOKLeZjudoR2FHjRU6F7BnSEdkhoi09EjZllCP8han9nATBoiDxoATA3aItPJiAmIAn/DP8u XqlSZltYVDZSmlsiAAEgACAAQQBjAHQAaQBvAG4AIABQAGwAYQBuAAz/f0+XX2ZbWFTCU62LDlTe VjBS6oHxXYR2bFH4U/2AH1mIX31Znlv1jQ0AARAw/FsIXoB7y04RMFsARwBpAGwAZQBzAF0ADwAB ADAAMCAA/VZFlvt8337lXQt6CF5UgAhUGk8aT1hUBgABoCUTThpOzIBvZhr/LAABQVPgUXRe2JrR eYBiTIgaTs5OGk7MgG9mDP8wTsxbhHYUeNFToXsGdKhU4ovPfoyaDP8oV/1WhVHQZydZi1fldw1U AU8aTuVdXE/RjzEAMAB0Xgz/O04BYysAAYxUwlMOTsePGlkqTidZi1enTsFUhHYUeNFT5V1cTwz/ SFEOVMVi+07HjwBf0VPlXQt6CF4BMHmY7nbPfgZ0ATCnTsFUz34GdAEwsGWnTsFU/FtlUeiQKwAB O2DRdgEwFHjRU3mY7nahewZ06JA7YNF2SXtMgE1PAjAoV/tOFHjRU3mY7nahewZ0O2DRdh9n9JUM /xBin1LEfsd++l7LeoZOApAIVFNf9mXFYLVRhHYrAAEUeNFTQW0LeqF7BnQBMHmY7nahewZ0ATCA Yi9noXsGdFNP+3wCMHZeXE86Tjhow1/EfhBiWFRoUQt6wlMOToZOxpYQYqdOwVQAX9FT2FNpl3mY 7nYM/y0AAQ5OSQBCAE0AdpgWXKhU4ot+mO6VAE53jeVdXE+GTttWdF4uAGhRYpcfjSONhk7GlhBi p07BVABf0VOhewZ02FNpl3mY7nYoV9Bnp07BVL9+hHZ3UVNPQW0Lei0AAT2EMFeMVKhjTIjlXVxP DP/5W3RlKk6hewZ02FNpl3mY7naEdhBin1J3jTBShk7zgXNRzZGBiYR2XE8odQIwDlTIUw5OSQBC AE0AfpjulQhUXE8sABBin1I7TisAAfxbhk6fUv2AhpjfV/2Am1LQY0dTeZjudhUgFSCwZadOwVT8 W2VRQW0Leg5Oc17wU4R2+l6+ixv/KFf9VoVR0GcnWYtX5XcNVAFPGk7lXVxPH2f0lQz/KwABz36G U4ZO5YtsUfhTFHjRU6F7BnTOTg1OxIkDgzBSxIkDgxZThHZ0ZSpOx48Legz/n3HDfoxj4WMGXP1W RZZIUduPhHYUeNFToXsGdM9+jJoOTi1O/VYrAAEBTxpOnltFlsVgtVH4dtN+CFRlZ4Rn+l4UeNFT oXsGdFNP+3yEdrll1WwCMA5UlF7QZ+V3DVQakK+LbFH4U4R2gJD3iwz/5U5+mO6VhHarjv1O249l US0AAeWLbFH4U4R2gGIvZy1Ow187TvxbFHjRU6F7BnRTT/t8ATAUeNFTSQBUAMSJElIsAE0AQQBS AEsARQBUAEkATgBHAKF7BnRTT/t8hHZzXvBT+l6+i+VdXE8CMAkAAaAlFHjRU6F7BnSoVOKLz36M misAAc5Oi04UeNFToXsGdKhU4ovlXVxP5U5lZwz/XE86TnmY7nY7YNF2EGKfUoR2O04BY4ZOPGiX ZwFaFFwBMH9e3l0BWhtS5WWwZQEw0Gc1dVBb0XmAYsaWLAAB4lYUeHZ6QGIBMP1Wuk4akOFPSXtw ZUFTtlsBTxpOhHanTsFUxIkSUkFtC3pTT/t8vouhiwEw1YuMmkBcQW0Ler6LoYsBMOV3xouhewZ0 U0/7fL6LoYsBMCwAAS1O1YsaTqFSoXsGdFNP+3yzaAZ0ATAUeNFTSQBUAMSJElIBMBR40VN5mO52 oXsGdFNP+3y+i6GLATAUeNFTKI3PkaF7BnRTT/t8ATAUeNFT6X5IZaF7BnQZAAFTT/t8vouhiwEw FHjRU0sAUABJAFNP+3y+i6GLSXu5ZWKXhHahewZ0qFTii3mY7nYCMAoAAaAlFHjRU6F7BnT5V62L z36Mmhr/KwAB/mYoVwRUMFcaWSFrPk6eUhR40VMojc+RoXsGdAEwFHjRU3mY7nahewZ0ATCwZadO wVQAX9FTQW0LehhPFlMOTqF7BnQBMM5ON2jBVHCNEVTPkadOSXsrAAFsUQBf/osM/zpOcGVDU7Zb AU8aTtBjm0+GThR40VOhewZ0bFEAX/6LhHb5V62LDP86TnBlfna2WwFPGk7bj0yIhk4UeNFToXsG dIR2hVGtixv/zk6LTisAARR40VOhewZ0qFTii+VdXE/lTmVnDP9cTzpOeZjudjtg0XYQYp9ShHY7 TgFjjFsQYoZOcGVBUypOFHjRU6F7BnSoVOKLeZjudlNP+3yEdvpevosM/6dOLQABwVTEiRJSQW0L elNP+3y+i6GLATDVi4yaQFxBbQt6vouhiywA5XfGi6F7BnRTT/t8vouhiwEwLU7VixpOoVKhewZ0 U0/7fLNoBnQBMBR40VNJAFQAxIkSUgEwLQABFHjRU3mY7nahewZ0U0/7fL6LoYsBMBR40VMojc+R oXsGdFNP+3wBMBR40VPpfkhloXsGdFNP+3y+i6GLATAUeNFTSwBQAEkAU0/7fL6LoYtJe7llYpc+ AAz/LAABCWdAdzBOzFuEdhR40VOhewZ0qFTii89+jJoM/4ltylOEdkyIGk4FU+xiGpDhTwEwb4/2 TgEwtls1dQEwNXXhT9CPJYRGVQEwr4JHcgEwO1OXdWhWsGgBMBcAAaROGpDQj5OPSXsM/y5eqVLZ j5tOAU8aTvpey3rYmkhlATCMWwdZhHYUeNFToXsGAAEQMP6LC3onWbJ+ETALAAEATgEwSGiLTwZS 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 Xw4AATkAKQAJZ0hln2wakIR2nJaNeC8Apn7IVMyRl3oOAAExADAAKQBil/lbYpefbBqQf5BNUYR2 D1yoUlxPEAABMQAxACkAgllVT9l+dlGDW+iQ6JUGUj5tFHjRU+VdXE8PAAExADIAKQAUeNFTZ2JM iJtSOn8xWYR2n1PgVgZSkGccAAExADMAKQAUeNFToXsGdLpOWFQoVwZSPm3lXVxPLU65WxNmWFso V4R27pWYmAEwn1PgVoxUS1ENZyAAATEANAApANl+FHjRU4BiL2e6TlhUG1IgkD9hb2YBMM9j2H4/ YW9mDP8kXHZRL2ZzUY5OeZjudg5O4lYflk1SFJAiAAExADUAKQDudgdocVGrTg5O+06hUgZSTZEI /+52B2iEdnFRq04WUwEw7nYHaIR2f2L6ixZTATDudgdohHb7fN9+FlMBMBoAAftOoVIGUk2RhHaf UxlSATAGUk2R9mWEdpdi0mIEWQZ0ATAGUk2R9mWEdqdjNlInfaZeATAPAAEGUk2RDlSEdt+NKo4O TqdjNlIBMNN+nGfNU4iZCf8iAAExADYAKQDZfhR40VOAYi9nuk5YVHp69JUI/zRzUFuhewZ0ATCI Y0NnhHaUTipOn1MZUgEwcVGrTg5OwlMOTqF7BnQJ/yYAATEANwApADttqFIUb8N+IAAzADAAIAAG Up+UGv9RYktROG4PYhQgFCAKTi1OC04JTkJckk6oUgj/U0+Mmhr/oXsGdPlbuk4OTvlbi04hAAEM /wlOQlzSiXKCmltNTwz/7nYHaAtOvo8M/6djNlIOTt+NKo4M/z9hb2YOTu52B2hxUatODP/Tfpxn zVOImUl7Cf8lAAExADgAKQBIaItPFHioixr/FHjRU4BiL2eLV+JWH5aEdhBiWFQ4XquI649/YsVi J30lYIR2eZjudmhUH2cM/+WLgllVTwRZBnQf/yQAATEAOQApAEhoi08UeKiLGv/ZfohOFHjRU4Bi L2e6TlhUhHZ6evSVMFKVXhpZJ1kM/69ywE5ITjdohHYZle+L71PlTqVj11Mf/yAAATIAMAApAEho i08UeKiLGv/7TqFSC06+jw5UjFsQYpdfDU59WUZP4FY6Ti9msHgwUvBWvpbIUw5gSE4EWQZ0H/8a AAEyADEAKQBIaItPFHioixr/AE4qTrpOf2LFYhpZKk55mO52R5AwUkSNkG6yUYF6DmBITp5SFgAB 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 ACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEA IQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAh ACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEA IQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAh ACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEA IQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAh ACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEA/wABAgYA BAABACUA/QAKAAQAAgAmAL0AAAABAgYABAADACcAAQIGAAUAAQAlAP0ACgAFAAIAJgABAAAAAQIG AAUAAwAnAAECBgAGAAEAJQD9AAoABgACACYAAgAAAAECBgAGAAMAJwABAgYABwABACUA/QAKAAcA AgAmAAMAAAABAgYABwADACcAAQIGAAgAAQAlAP0ACgAIAAIAJgAEAAAAAQIGAAgAAwAnAAECBgAJ AAEAJQD9AAoACQACACYABQAAAAECBgAJAAMAJwABAgYACgABACUA/QAKAAoAAgAoAMAAAAABAgYA CgADACcAAQIGAAsAAQAlAP0ACgALAAIAKAC+AAAAAQIGAAsAAwAnAAECBgAMAAEAJQD9AAoADAAC ACgAvwAAAAECBgAMAAMAJwC+AAwADQABACUAJgAnAAMAAQIGAA4AAQApAP0ACgAOAAIAKgAGAAAA AQIGAA4AAwArAAECBgAPAAEALAD9AAoADwACAC0ABwAAAAECBgAPAAMALgABAgYAEAABACwA/QAK ABAAAgAtAAgAAAABAgYAEAADAC4AAQIGABEAAQAsAP0ACgARAAIALQAJAAAAAQIGABEAAwAuAAEC BgASAAEALAD9AAoAEgACAC0ACgAAAAECBgASAAMALgABAgYAEwABACwA/QAKABMAAgAtAAsAAAAB AgYAEwADAC4AAQIGABQAAQAsAP0ACgAUAAIALQAMAAAAAQIGABQAAwAuAAECBgAVAAEALAD9AAoA FQACAC0ADQAAAAECBgAVAAMALgABAgYAFgABACwA/QAKABYAAgAtAA4AAAABAgYAFgADAC4AAQIG ABcAAQAsAP0ACgAXAAIALQAPAAAAAQIGABcAAwAuAAECBgAYAAEALAD9AAoAGAACAC0AEAAAAAEC BgAYAAMALgABAgYAGQABACwA/QAKABkAAgAtABEAAAABAgYAGQADAC4AAQIGABoAAQAsAP0ACgAa AAIALQASAAAAAQIGABoAAwAuAL4ADAAbAAEALAAtAC4AAwABAgYAHAABACkA/QAKABwAAgAqABMA AAABAgYAHAADACsAAQIGAB0AAQAsAP0ACgAdAAIALQAUAAAAAQIGAB0AAwAuAAECBgAeAAEALAD9 AAoAHgACAC0AFQAAAAECBgAeAAMALgABAgYAHwABACwA/QAKAB8AAgAtABYAAAABAgYAHwADAC4A 1wBEAHYIAABsAhAAIgAQACACIgAiACIAIgAiACIAIgAiACIAEAAiACIAIgAiACIAIgAiACIAIgAi ACIAIgAiABAAIgAiACIACAIQACAAAQAEAIYBAAAAAEABDwAIAhAAIQABAAQAhgEAAAAAQAEPAAgC EAAiAAEABACGAQAAAABAAQ8ACAIQACMAAQAEAIYBAAAAAEABDwAIAhAAJAABAAQAhgEAAAAAQAEP AAgCEAAlAAEABACGAQAAAABAAQ8ACAIQACYAAQAEAIYBAAAAAEABDwAIAhAAJwABAAQAHQEAAAAA AAEPAAgCEAAoAAEABAAdAQAAAAAAAQ8ACAIQACkAAQAEAB0BAAAAAAABDwAIAhAAKgABAAQAHQEA AAAAAAEPAAgCEAArAAEABAAdAQAAAAAAAQ8ACAIQACwAAQAEAB0BAAAAAAABDwAIAhAALQABAAQA HQEAAAAAAAEPAAgCEAAuAAEABAAdAQAAAAAAAQ8ACAIQAC8AAQAEAB0BAAAAAAABDwAIAhAAMAAB AAQAHQEAAAAAAAEPAAgCEAAxAAEABAAdAQAAAAAAAQ8ACAIQADIAAQAEAB0BAAAAAAABDwAIAhAA MwABAAQAHQEAAAAAAAEPAAgCEAA0AAEABAAdAQAAAAAAAQ8ACAIQADUAAQAEAB0BAAAAAAABDwAI AhAANgABAAQAHQEAAAAAAAEPAAgCEAA3AAEABAAdAQAAAAAAAQ8ACAIQADgAAQAEAB0BAAAAAAAB DwAIAhAAOQABAAQAHQEAAAAAAAEPAAgCEAA6AAEABAAdAQAAAAAAAQ8ACAIQADsAAQAEAB0BAAAA AAABDwAIAhAAPAABAAQAHQEAAAAAAAEPAAgCEAA9AAEABAAdAQAAAAAAAQ8ACAIQAD4AAQAEAB0B AAAAAAABDwAIAhAAPwABAAQAHQEAAAAAAAEPAAECBgAgAAEALAD9AAoAIAACAC0AFwAAAAECBgAg AAMALgABAgYAIQABACwA/QAKACEAAgAtABgAAAABAgYAIQADAC4AAQIGACIAAQAsAP0ACgAiAAIA LQAZAAAAAQIGACIAAwAuAAECBgAjAAEALAD9AAoAIwACAC0AGgAAAAECBgAjAAMALgABAgYAJAAB ACwA/QAKACQAAgAtABsAAAABAgYAJAADAC4AAQIGACUAAQAsAP0ACgAlAAIALQAcAAAAAQIGACUA AwAuAAECBgAmAAEALAD9AAoAJgACAC0AHQAAAAECBgAmAAMALgC+AAwAJwABACwALQAuAAMAAQIG ACgAAQApAP0ACgAoAAIAKgAeAAAAAQIGACgAAwArAAECBgApAAEALAD9AAoAKQACAC0AHwAAAAEC BgApAAMALgC+AAwAKgABACwALQAuAAMAAQIGACsAAQAsAP0ACgArAAIALwAgAAAAAQIGACsAAwAu AAECBgAsAAEALAD9AAoALAACAC0AIQAAAAECBgAsAAMALgABAgYALQABACwA/QAKAC0AAgAtACIA AAABAgYALQADAC4AAQIGAC4AAQAsAP0ACgAuAAIALwAjAAAAAQIGAC4AAwAuAAECBgAvAAEALAD9 AAoALwACAC0AJAAAAAECBgAvAAMALgABAgYAMAABACwA/QAKADAAAgAtACUAAAABAgYAMAADAC4A AQIGADEAAQAsAP0ACgAxAAIALwAmAAAAAQIGADEAAwAuAAECBgAyAAEALAD9AAoAMgACAC0AJwAA AAECBgAyAAMALgABAgYAMwABACwA/QAKADMAAgAtACgAAAABAgYAMwADAC4AAQIGADQAAQAsAP0A CgA0AAIALQApAAAAAQIGADQAAwAuAAECBgA1AAEALAD9AAoANQACAC8AKgAAAAECBgA1AAMALgC+ AAwANgABACwALQAuAAMAAQIGADcAAQAsAP0ACgA3AAIALQArAAAAAQIGADcAAwAuAAECBgA4AAEA LAD9AAoAOAACAC0ALAAAAAECBgA4AAMALgABAgYAOQABACwA/QAKADkAAgAtAC0AAAABAgYAOQAD AC4AAQIGADoAAQAsAP0ACgA6AAIALwAuAAAAAQIGADoAAwAuAAECBgA7AAEALAD9AAoAOwACAC0A LwAAAAECBgA7AAMALgC+AAwAPAABACwALQAuAAMAAQIGAD0AAQAsAP0ACgA9AAIALwAwAAAAAQIG AD0AAwAuAAECBgA+AAEALAD9AAoAPgACAC0AMQAAAAECBgA+AAMALgABAgYAPwABACwA/QAKAD8A AgAtADIAAAABAgYAPwADAC4A1wBEAHgGAABsAiIAIgAiACIAIgAiACIAEAAiACIAEAAiACIAIgAi ACIAIgAiACIAIgAiACIAEAAiACIAIgAiACIAEAAiACIACAIQAEAAAQAEAB0BAAAAAAABDwAIAhAA QQABAAQAHQEAAAAAAAEPAAgCEABCAAEABAAdAQAAAAAAAQ8ACAIQAEMAAQAEAB0BAAAAAAABDwAI AhAARAABAAQAHQEAAAAAAAEPAAgCEABFAAEABAAdAQAAAAAAAQ8ACAIQAEYAAQAEAB0BAAAAAAAB DwAIAhAARwABAAQAHQEAAAAAAAEPAAgCEABIAAEABAAdAQAAAAAAAQ8ACAIQAEkAAQAEAB0BAAAA AAABDwAIAhAASgABAAQAHQEAAAAAAAEPAAgCEABLAAEABAAdAQAAAAAAAQ8ACAIQAEwAAQAEAB0B AAAAAAABDwAIAhAATQABAAQAHQEAAAAAAAEPAAgCEABOAAEABAAdAQAAAAAAAQ8ACAIQAE8AAQAE AB0BAAAAAAABDwAIAhAAUAABAAcAHQEAAAAAAAEPAAgCEABRAAEABwAdAQAAAAAAAQ8ACAIQAFIA AQAHAB0BAAAAAAABDwAIAhAAUwABAAcAHQEAAAAAAAEPAAgCEABUAAEABwAdAQAAAAAAAQ8ACAIQ AFUAAQAHAB0BAAAAAAABDwAIAhAAVgABAAcAHQEAAAAAAAEPAAgCEABXAAEABwAdAQAAAAAAAQ8A CAIQAFgAAQAHAB0BAAAAAAABDwAIAhAAWQABAAcAHQEAAAAAAAEPAAgCEABaAAEABwAdAQAAAAAA AQ8ACAIQAFsAAQAHAB0BAAAAAAABDwAIAhAAXAABAAcAHQEAAAAAAAEPAAgCEABdAAEABwAdAQAA AACAATAACAIQAF4AAQAHAB0BAAAAAAABDwAIAhAAXwABAAcAHQEAAAAAAAEPAAECBgBAAAEALAD9 AAoAQAACAC8AMwAAAAECBgBAAAMALgABAgYAQQABACwA/QAKAEEAAgAtADQAAAABAgYAQQADAC4A AQIGAEIAAQAsAP0ACgBCAAIALQA1AAAAAQIGAEIAAwAuAAECBgBDAAEALAD9AAoAQwACAC8ANgAA AAECBgBDAAMALgABAgYARAABACwA/QAKAEQAAgAtADcAAAABAgYARAADAC4AvgAMAEUAAQAsAC0A LgADAAECBgBGAAEAKQD9AAoARgACACoAOAAAAAECBgBGAAMAKwABAgYARwABACwA/QAKAEcAAgAv ADkAAAABAgYARwADAC4AAQIGAEgAAQAsAP0ACgBIAAIALwA6AAAAAQIGAEgAAwAuAL4ADABJAAEA LAAtAC4AAwABAgYASgABACwA/QAKAEoAAgAtADsAAAABAgYASgADAC4AAQIGAEsAAQAsAP0ACgBL AAIALQA8AAAAAQIGAEsAAwAuAAECBgBMAAEALAD9AAoATAACAC8APQAAAAECBgBMAAMALgABAgYA TQABACwA/QAKAE0AAgAtAD4AAAABAgYATQADAC4AAQIGAE4AAQAsAP0ACgBOAAIALQA/AAAAAQIG AE4AAwAuAAECBgBPAAEALAD9AAoATwACAC0AQAAAAAECBgBPAAMALgABAgYAUAABACwA/QAKAFAA AgAtAEEAAAABAgYAUAADAC4AAQIGAFEAAQAsAP0ACgBRAAIALQBCAAAAAQIGAFEAAwAuAAECBgBS AAEALAD9AAoAUgACAC0AQwAAAAECBgBSAAMALgABAgYAUwABACwA/QAKAFMAAgAtAEQAAAABAgYA UwADAC4AAQIGAFQAAQAsAP0ACgBUAAIALQBFAAAAAQIGAFQAAwAuAAECBgBVAAEALAD9AAoAVQAC AC0ARgAAAAECBgBVAAMALgC+AAwAVgABACwALQAuAAMAAQIGAFcAAQAsAP0ACgBXAAIALQBHAAAA AQIGAFcAAwAuAAECBgBYAAEALAD9AAoAWAACAC0ASAAAAAECBgBYAAMALgABAgYAWQABACwA/QAK AFkAAgAtAEkAAAABAgYAWQADAC4AAQIGAFoAAQAsAP0ACgBaAAIALQBKAAAAAQIGAFoAAwAuAAEC BgBbAAEALAD9AAoAWwACAC0ASwAAAAECBgBbAAMALgABAgYAXAABACwA/QAKAFwAAgAtAEwAAAAB AgYAXAADAC4AAQIGAFwABgAwAAECBgBdAAEALAD9AAoAXQACAC0ATQAAAAECBgBdAAMALgABAgYA XQAGABkAAQIGAF4AAQAsAP0ACgBeAAIALQBOAAAAAQIGAF4AAwAuAL4ADABfAAEALAAtAC4AAwDX AEQAjAYAAGwCIgAiACIAIgAiABAAIgAiACIAEAAiACIAIgAiACIAIgAiACIAIgAiACIAIgAQACIA IgAiACIAIgAsACwAIgAIAhAAYAABAAQAHQEAAAAAAAEPAAgCEABhAAEABAAdAQAAAAAAAQ8ACAIQ AGIAAQAEAB0BAAAAAAABDwAIAhAAYwABAAQAHQEAAAAAAAEPAAgCEABkAAEABAAdAQAAAAAAAQ8A CAIQAGUAAQAEAB0BAAAAAAABDwAIAhAAZgABAAQAHQEAAAAAAAEPAAgCEABnAAEABAAdAQAAAAAA AQ8ACAIQAGgAAQAEAB0BAAAAAAABDwAIAhAAaQABAAQAHQEAAAAAAAEPAAgCEABqAAEABAAdAQAA AAAAAQ8ACAIQAGsAAQAEAB0BAAAAAAABDwAIAhAAbAABAAQAHQEAAAAAAAEPAAgCEABtAAEABAAd AQAAAAAAAQ8ACAIQAG4AAQAEAB0BAAAAAAABDwAIAhAAbwABAAQAHQEAAAAAAAEPAAgCEABwAAEA BAAdAQAAAAAAAQ8ACAIQAHEAAQAEAB0BAAAAAAABDwAIAhAAcgABAAQAHQEAAAAAAAEPAAgCEABz AAEABAAdAQAAAAAAAQ8ACAIQAHQAAQAEAB0BAAAAAAABDwAIAhAAdQABAAQAHQEAAAAAAAEPAAgC EAB2AAEABAAdAQAAAAAAAQ8ACAIQAHcAAQAEAB0BAAAAAAABDwAIAhAAeAABAAQAHQEAAAAAAAEP AAgCEAB5AAEABAAdAQAAAAAAAQ8ACAIQAHoAAQAEAB0BAAAAAAABDwAIAhAAewABAAQAHQEAAAAA AAEPAAgCEAB8AAEABAAdAQAAAAAAAQ8ACAIQAH0AAQAEAB0BAAAAAAABDwAIAhAAfgABAAQAHQEA AAAAAAEPAAgCEAB/AAEABAAdAQAAAAAAAQ8AAQIGAGAAAQAsAP0ACgBgAAIALQBPAAAAAQIGAGAA AwAuAAECBgBhAAEALAD9AAoAYQACAC0AUAAAAAECBgBhAAMALgABAgYAYgABACwA/QAKAGIAAgAt AFEAAAABAgYAYgADAC4AAQIGAGMAAQAsAP0ACgBjAAIALQBSAAAAAQIGAGMAAwAuAAECBgBkAAEA LAD9AAoAZAACAC0AUwAAAAECBgBkAAMALgABAgYAZQABACwA/QAKAGUAAgAtAFQAAAABAgYAZQAD AC4AAQIGAGYAAQAsAP0ACgBmAAIALQBVAAAAAQIGAGYAAwAuAAECBgBnAAEALAD9AAoAZwACAC0A VgAAAAECBgBnAAMALgABAgYAaAABACwA/QAKAGgAAgAtAFcAAAABAgYAaAADAC4AAQIGAGkAAQAs AP0ACgBpAAIALQBYAAAAAQIGAGkAAwAuAAECBgBqAAEALAD9AAoAagACAC0AWQAAAAECBgBqAAMA LgABAgYAawABACwA/QAKAGsAAgAtAFoAAAABAgYAawADAC4AAQIGAGwAAQAsAP0ACgBsAAIALQBb AAAAAQIGAGwAAwAuAAECBgBtAAEALAD9AAoAbQACAC0AXAAAAAECBgBtAAMALgABAgYAbgABACwA /QAKAG4AAgAtAF0AAAABAgYAbgADAC4AAQIGAG8AAQAsAP0ACgBvAAIALQBeAAAAAQIGAG8AAwAu AAECBgBwAAEALAD9AAoAcAACAC0AXwAAAAECBgBwAAMALgABAgYAcQABACwA/QAKAHEAAgAtAGAA AAABAgYAcQADAC4AAQIGAHIAAQAsAP0ACgByAAIALQBhAAAAAQIGAHIAAwAuAAECBgBzAAEALAD9 AAoAcwACAC0AYgAAAAECBgBzAAMALgABAgYAdAABACwA/QAKAHQAAgAtAGMAAAABAgYAdAADAC4A vgAMAHUAAQAsAC0ALgADAAECBgB2AAEALAD9AAoAdgACAC0AZAAAAAECBgB2AAMALgABAgYAdwAB ACwA/QAKAHcAAgAtAGUAAAABAgYAdwADAC4AAQIGAHgAAQAsAP0ACgB4AAIALQBmAAAAAQIGAHgA AwAuAAECBgB5AAEALAD9AAoAeQACAC0AZwAAAAECBgB5AAMALgABAgYAegABACwA/QAKAHoAAgAt AGgAAAABAgYAegADAC4AAQIGAHsAAQAsAP0ACgB7AAIALQBpAAAAAQIGAHsAAwAuAAECBgB8AAEA LAD9AAoAfAACAC0AagAAAAECBgB8AAMALgABAgYAfQABACwA/QAKAH0AAgAtAGsAAAABAgYAfQAD AC4AAQIGAH4AAQAsAP0ACgB+AAIALQBsAAAAAQIGAH4AAwAuAAECBgB/AAEALAD9AAoAfwACAC0A bQAAAAECBgB/AAMALgDXAEQArgYAAGwCIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAi ACIAIgAiACIAEAAiACIAIgAiACIAIgAiACIAIgAIAhAAgAABAAQAHQEAAAAAAAEPAAgCEACBAAEA BAAdAQAAAAAAAQ8ACAIQAIIAAQAEAB0BAAAAAAABDwAIAhAAgwABAAQAHQEAAAAAAAEPAAgCEACE AAEABAAdAQAAAAAAAQ8ACAIQAIUAAQAEAB0BAAAAAAABDwAIAhAAhgABAAQAHQEAAAAAAAEPAAgC EACHAAEABAAdAQAAAAAAAQ8ACAIQAIgAAQAEAB0BAAAAAAABDwAIAhAAiQABAAQAHQEAAAAAAAEP AAgCEACKAAEABAAdAQAAAAAAAQ8ACAIQAIsAAQAEAB0BAAAAAAABDwAIAhAAjAABAAQAHQEAAAAA AAEPAAgCEACNAAEABAAdAQAAAAAAAQ8ACAIQAI4AAQAEAB0BAAAAAAABDwAIAhAAjwABAAQAHQEA AAAAAAEPAAgCEACQAAEABAAdAQAAAAAAAQ8ACAIQAJEAAQAEAB0BAAAAAAABDwAIAhAAkgABAAQA HQEAAAAAAAEPAAgCEACTAAEABAAdAQAAAAAAAQ8ACAIQAJQAAQAEAB0BAAAAAAABDwAIAhAAlQAB AAQAHQEAAAAAAAEPAAgCEACWAAEABAAdAQAAAAAAAQ8ACAIQAJcAAQAEAB0BAAAAAAABDwAIAhAA mAABAAQAHQEAAAAAAAEPAAgCEACZAAEABAAdAQAAAAAAAQ8ACAIQAJoAAQAEAB0BAAAAAAABDwAI AhAAmwABAAQAHQEAAAAAAAEPAAgCEACcAAEABAAdAQAAAAAAAQ8ACAIQAJ0AAQAEAB0BAAAAAAAB DwAIAhAAngABAAQAHQEAAAAAAAEPAAgCEACfAAEABAAdAQAAAAAAAQ8AAQIGAIAAAQAsAP0ACgCA AAIALQBuAAAAAQIGAIAAAwAuAAECBgCBAAEALAD9AAoAgQACAC0AbwAAAAECBgCBAAMALgABAgYA ggABACwA/QAKAIIAAgAtAHAAAAABAgYAggADAC4AAQIGAIMAAQAsAP0ACgCDAAIALQBxAAAAAQIG AIMAAwAuAAECBgCEAAEALAD9AAoAhAACAC0AcgAAAAECBgCEAAMALgABAgYAhQABACwA/QAKAIUA AgAtAHMAAAABAgYAhQADAC4AAQIGAIYAAQAsAP0ACgCGAAIALQB0AAAAAQIGAIYAAwAuAAECBgCH AAEALAD9AAoAhwACAC0AdQAAAAECBgCHAAMALgABAgYAiAABACwA/QAKAIgAAgAtAHYAAAABAgYA iAADAC4AAQIGAIkAAQAsAP0ACgCJAAIALQB3AAAAAQIGAIkAAwAuAL4ADACKAAEALAAtAC4AAwAB AgYAiwABACwA/QAKAIsAAgAtAHgAAAABAgYAiwADAC4AAQIGAIwAAQAsAP0ACgCMAAIALQB5AAAA AQIGAIwAAwAuAAECBgCNAAEALAD9AAoAjQACAC0AegAAAAECBgCNAAMALgABAgYAjgABACwA/QAK AI4AAgAtAHsAAAABAgYAjgADAC4AAQIGAI8AAQAsAP0ACgCPAAIALQB8AAAAAQIGAI8AAwAuAAEC BgCQAAEALAD9AAoAkAACAC0AfQAAAAECBgCQAAMALgABAgYAkQABACwA/QAKAJEAAgAtAH4AAAAB AgYAkQADAC4AAQIGAJIAAQAsAP0ACgCSAAIALQB/AAAAAQIGAJIAAwAuAAECBgCTAAEALAD9AAoA kwACAC0AgAAAAAECBgCTAAMALgABAgYAlAABACwA/QAKAJQAAgAtAIEAAAABAgYAlAADAC4AAQIG AJUAAQAsAP0ACgCVAAIALQCCAAAAAQIGAJUAAwAuAAECBgCWAAEALAD9AAoAlgACAC0AgwAAAAEC BgCWAAMALgABAgYAlwABACwA/QAKAJcAAgAtAIQAAAABAgYAlwADAC4AAQIGAJgAAQAsAP0ACgCY AAIALQCFAAAAAQIGAJgAAwAuAAECBgCZAAEALAD9AAoAmQACAC0AhgAAAAECBgCZAAMALgABAgYA mgABACwA/QAKAJoAAgAtAIcAAAABAgYAmgADAC4AAQIGAJsAAQAsAP0ACgCbAAIALQCIAAAAAQIG AJsAAwAuAAECBgCcAAEALAD9AAoAnAACAC0AiQAAAAECBgCcAAMALgABAgYAnQABACwA/QAKAJ0A AgAtAIoAAAABAgYAnQADAC4AAQIGAJ4AAQAsAP0ACgCeAAIALQCLAAAAAQIGAJ4AAwAuAAECBgCf AAEALAD9AAoAnwACAC0AjAAAAAECBgCfAAMALgDXAEQArgYAAGwCIgAiACIAIgAiACIAIgAiACIA IgAQACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAIAhAAoAABAAQAHQEA AAAAAAEPAAgCEAChAAEABAAdAQAAAAAAAQ8ACAIQAKIAAQAEAB0BAAAAAAABDwAIAhAAowABAAQA HQEAAAAAAAEPAAgCEACkAAEABAAdAQAAAAAAAQ8ACAIQAKUAAQAEAB0BAAAAAAABDwAIAhAApgAB AAQAHQEAAAAAAAEPAAgCEACnAAEABAAdAQAAAAAAAQ8ACAIQAKgAAQAEAB0BAAAAAAABDwAIAhAA qQABAAQAHQEAAAAAAAEPAAgCEACqAAEABAAdAQAAAAAAAQ8ACAIQAKsAAQAEAB0BAAAAAAABDwAI AhAArAABAAQAHQEAAAAAAAEPAAgCEACtAAEABAAdAQAAAAAAAQ8ACAIQAK4AAQAEAB0BAAAAAAAB DwAIAhAArwABAAQAHQEAAAAAAAEPAAgCEACwAAEABAAdAQAAAAAAAQ8ACAIQALEAAQAEAB0BAAAA AAABDwAIAhAAsgABAAQAHQEAAAAAAAEPAAgCEACzAAEABAAdAQAAAAAAAQ8ACAIQALQAAQAEAB0B AAAAAAABDwAIAhAAtQABAAQAHQEAAAAAAAEPAAgCEAC2AAEABAAdAQAAAAAAAQ8ACAIQALcAAQAE AB0BAAAAAAABDwAIAhAAuAABAAQAHQEAAAAAAAEPAAgCEAC5AAEABAAdAQAAAAAAAQ8ACAIQALoA AQAEAB0BAAAAAAABDwAIAhAAuwABAAQAHQEAAAAAAAEPAAgCEAC8AAEABAAdAQAAAAAAAQ8ACAIQ AL0AAQAEAB0BAAAAAAABDwAIAhAAvgABAAQAHQEAAAAAAAEPAAgCEAC/AAEABAAdAQAAAAAAAQ8A AQIGAKAAAQAsAP0ACgCgAAIALQCNAAAAAQIGAKAAAwAuAAECBgChAAEALAD9AAoAoQACAC0AjgAA AAECBgChAAMALgABAgYAogABACwA/QAKAKIAAgAtAI8AAAABAgYAogADAC4AAQIGAKMAAQAsAP0A CgCjAAIALQCQAAAAAQIGAKMAAwAuAAECBgCkAAEALAD9AAoApAACAC0AkQAAAAECBgCkAAMALgC+ AAwApQABACwALQAuAAMAAQIGAKYAAQAsAP0ACgCmAAIALQCSAAAAAQIGAKYAAwAuAAECBgCnAAEA LAD9AAoApwACAC0AkwAAAAECBgCnAAMALgABAgYAqAABACwA/QAKAKgAAgAtAJQAAAABAgYAqAAD AC4AAQIGAKkAAQAsAP0ACgCpAAIALQCVAAAAAQIGAKkAAwAuAAECBgCqAAEALAD9AAoAqgACAC0A lgAAAAECBgCqAAMALgABAgYAqwABACwA/QAKAKsAAgAtAJcAAAABAgYAqwADAC4AAQIGAKwAAQAs AP0ACgCsAAIALQCYAAAAAQIGAKwAAwAuAAECBgCtAAEALAD9AAoArQACAC0AmQAAAAECBgCtAAMA LgABAgYArgABACwA/QAKAK4AAgAtAJoAAAABAgYArgADAC4AAQIGAK8AAQAsAP0ACgCvAAIALQCb AAAAAQIGAK8AAwAuAAECBgCwAAEALAD9AAoAsAACAC0AnAAAAAECBgCwAAMALgABAgYAsQABACwA /QAKALEAAgAtAJ0AAAABAgYAsQADAC4AAQIGALIAAQAsAP0ACgCyAAIALQCeAAAAAQIGALIAAwAu AAECBgCzAAEALAD9AAoAswACAC0AnwAAAAECBgCzAAMALgABAgYAtAABACwA/QAKALQAAgAtAKAA AAABAgYAtAADAC4AAQIGALUAAQAsAP0ACgC1AAIALQChAAAAAQIGALUAAwAuAAECBgC2AAEALAD9 AAoAtgACAC0AogAAAAECBgC2AAMALgABAgYAtwABACwA/QAKALcAAgAtAKMAAAABAgYAtwADAC4A AQIGALgAAQAsAP0ACgC4AAIALQCkAAAAAQIGALgAAwAuAAECBgC5AAEALAD9AAoAuQACAC0ApQAA AAECBgC5AAMALgABAgYAugABACwA/QAKALoAAgAtAKYAAAABAgYAugADAC4AAQIGALsAAQAsAP0A CgC7AAIALQCnAAAAAQIGALsAAwAuAAECBgC8AAEALAD9AAoAvAACAC0AqAAAAAECBgC8AAMALgAB AgYAvQABACwA/QAKAL0AAgAtAKkAAAABAgYAvQADAC4AvgAMAL4AAQAsAC0ALgADAAECBgC/AAEA LAD9AAoAvwACAC0AqgAAAAECBgC/AAMALgDXAEQAnAYAAGwCIgAiACIAIgAiABAAIgAiACIAIgAi ACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAEAAIAhAAwAABAAQAHQEAAAAA AAEPAAgCEADBAAEABAAdAQAAAAAAAQ8ACAIQAMIAAQAEAB0BAAAAAAABDwAIAhAAwwABAAQAHQEA AAAAAAEPAAgCEADEAAEABAAdAQAAAAAAAQ8ACAIQAMUAAQAEAB0BAAAAAAABDwAIAhAAxgABAAQA HQEAAAAAAAEPAAgCEADHAAEABAAdAQAAAAAAAQ8ACAIQAMgAAQAEAB0BAAAAAAABDwAIAhAAyQAB AAQAHQEAAAAAAAEPAAgCEADKAAEABAAdAQAAAAAAAQ8ACAIQAMsAAQAEAB0BAAAAAAABDwAIAhAA zAABAAQAHQEAAAAAAAEPAAgCEADNAAEABAAdAQAAAAAAAQ8ACAIQAM4AAQAEAB0BAAAAAAABDwAI AhAAzwABAAQAHQEAAAAAAAEPAAgCEADQAAEABAAdAQAAAAAAAQ8ACAIQANEAAQAEAB0BAAAAAAAB DwAIAhAA0gABAAQAHQEAAAAAAAEPAAECBgDAAAEALAD9AAoAwAACAC0AqwAAAAECBgDAAAMALgAB AgYAwQABACwA/QAKAMEAAgAtAKwAAAABAgYAwQADAC4AAQIGAMIAAQAsAP0ACgDCAAIALQCtAAAA AQIGAMIAAwAuAAECBgDDAAEALAD9AAoAwwACAC0ArgAAAAECBgDDAAMALgABAgYAxAABACwA/QAK AMQAAgAtAK8AAAABAgYAxAADAC4AAQIGAMUAAQAsAP0ACgDFAAIALQCwAAAAAQIGAMUAAwAuAAEC BgDGAAEALAD9AAoAxgACAC0AsQAAAAECBgDGAAMALgABAgYAxwABACwA/QAKAMcAAgAtALIAAAAB AgYAxwADAC4AAQIGAMgAAQAsAP0ACgDIAAIALQCzAAAAAQIGAMgAAwAuAAECBgDJAAEALAD9AAoA yQACAC0AtAAAAAECBgDJAAMALgABAgYAygABACwA/QAKAMoAAgAtALUAAAABAgYAygADAC4AvgAM AMsAAQAsAC0ALgADAAECBgDMAAEALAD9AAoAzAACAC0AtgAAAAECBgDMAAMALgABAgYAzQABACwA /QAKAM0AAgAtALcAAAABAgYAzQADAC4AAQIGAM4AAQAsAP0ACgDOAAIALQC4AAAAAQIGAM4AAwAu AAECBgDPAAEALAD9AAoAzwACAC0AuQAAAAECBgDPAAMALgABAgYA0AABACwA/QAKANAAAgAtALoA AAABAgYA0AADAC4AAQIGANEAAQAsAP0ACgDRAAIALQC7AAAAAQIGANEAAwAuAL4ADADSAAEAMQAy ADMAAwDXACoA3gMAAGgBIgAiACIAIgAiACIAIgAiACIAIgAiABAAIgAiACIAIgAiACIAPgISALYG AAAAAEAAAAA8AAAAAAAAAB0ADwADAAAAAAAAAQAAAAAAAACZAAIAAAnvAAYACAA3AAAACgAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA/v8AAAUBAgAAAAAAAAAAAAAAAAAAAAAAAQAAAOCFn/L5T2gQq5EIACsns9kwAAAAqAAA AAcAAAABAAAAQAAAAAQAAABIAAAACAAAAFwAAAASAAAAcAAAAAwAAACIAAAADQAAAJQAAAATAAAA oAAAAAIAAACoAwAAHgAAAAwAAADOosjt08O7pwAAAAAeAAAADAAAAM6iyO3Tw7unAAAAAB4AAAAQ AAAATWljcm9zb2Z0IEV4Y2VsAEAAAACA2WhdiCPOAUAAAAAA3+4ffTPOAQMAAAAAAAAAAAAAAAAA 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 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7/ AAAFAQIAAAAAAAAAAAAAAAAAAAAAAAEAAAAC1c3VnC4bEJOXCAArLPmuMAAAANAAAAAJAAAAAQAA AFAAAAAPAAAAWAAAABcAAABsAAAACwAAAHQAAAAQAAAAfAAAABMAAACEAAAAFgAAAIwAAAANAAAA lAAAAAwAAACvAAAAAgAAAKgDAAAeAAAADAAAAM6iyO3W0Ln6AAAAAAMAAAAPJwsACwAAAAAAAAAL AAAAAAAAAAsAAAAAAAAACwAAAAAAAAAeEAAAAQAAAA8AAAC007y8yvXX38/yudzA7QAMEAAAAgAA AB4AAAAHAAAAuaTX97HtAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMA AAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAA ABIAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAA IAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAC0AAAAu AAAALwAAADAAAAAxAAAA/v///zMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAD+////OwAAADwA AAA9AAAAPgAAAD8AAABAAAAAQQAAAP7////9/////v////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////1IAbwBvAHQAIABF AG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUB //////////8CAAAAIAgCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAA AAAAVwBvAHIAawBiAG8AbwBrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAABIAAgH///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAFGMAAAAAAAAFAFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAACAQEAAAADAAAA/////wAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAADIAAAAAEAAAAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBtAG0A YQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAA4AAIB////////////////AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAAAAQAAAAAAAA ------=_NextPart_000_03B0_0101C557.158F71E0-- From sebastian.jucu@cbg.uvt.ro Sun Apr 7 15:18:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E22327F54 for ; Sun, 7 Apr 2013 15:18:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CDA778F8035 for ; Sun, 7 Apr 2013 13:18:25 -0700 (PDT) X-ASG-Debug-ID: 1365365899-04cb6c1e793d1dc0001-NocioJ Received: from hercules.uvt.ro (mail.uvt.ro [85.120.204.100]) by cuda.sgi.com with ESMTP id zJaQgXHNgo4vBrH5; Sun, 07 Apr 2013 13:18:20 -0700 (PDT) X-Barracuda-Envelope-From: sebastian.jucu@cbg.uvt.ro X-Barracuda-Apparent-Source-IP: 85.120.204.100 Received: from localhost (localhost.localdomain [127.0.0.1]) by hercules.uvt.ro (Postfix) with ESMTP id 507A7476F; Sun, 7 Apr 2013 23:18:10 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=uvt.ro; s=default; t=1365365891; bh=d5TMS132233GBwO/XOxVedo/BayWqOqpoORu5KDjjLU=; h=Date:From:Reply-To:Subject:To; b=Ull+m4bv/EbwSzRHQKTTfL9MQDdGi3Fk8hD9VIBj0PqBsqSXiJ0N0weq12z0C2FfZ ak/hoB1gsuI3eKt03SRW1qSim0MrvueXAUjrXteK0YgxzT6/L3x2vBnmgIjP4CNMyc F/NgI9na2eprQCtYXehLHa2Nx+TMPXXNnA4uNNis= X-Virus-Scanned: amavisd-new at hercules.uvt.ro Received: from hercules.uvt.ro ([127.0.0.1]) by localhost (hercules.uvt.ro [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ZqqpLcJ5UdKv; Sun, 7 Apr 2013 23:18:08 +0300 (EEST) Received: from hercules.uvt.ro (hercules.uvt.ro [85.120.204.100]) by hercules.uvt.ro (Postfix) with ESMTP id 83624474C; Sun, 7 Apr 2013 23:18:02 +0300 (EEST) Date: Sun, 07 Apr 2013 23:18:00 +0300 (EEST) From: WebMail =?utf-8?Q?J=C3=A4rjestelm=C3=A4nvalvoja?= Reply-To: WebMail =?utf-8?Q?J=C3=A4rjestelm=C3=A4nvalvoja?= Subject: =?utf-8?Q?S=C3=A4hk=C3=B6posti?= Alert Message-ID: <74342708-f949-4f49-a4ec-d94f9a2e1473@hercules.uvt.ro> X-ASG-Orig-Subj: =?utf-8?Q?S=C3=A4hk=C3=B6posti?= Alert Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Originating-IP: [116.202.131.111] X-Mailer: Zimbra 7.1.3_GA_3346 (zclient/7.1.3_GA_3346) To: undisclosed-recipients:; X-Barracuda-Connect: mail.uvt.ro[85.120.204.100] X-Barracuda-Start-Time: 1365365900 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127471 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.50 BSF_SC0_SA620a Custom Rule SA620a Postilaatikko on ylitt=C3=A4nyt varastointi rajan 2.GB M=C3=A4=C3=A4rittelee yll=C3=A4pito on t=C3=A4ll=C3=A4 hetkell=C3=A4 2.30GB= , ei voi l=C3=A4hett=C3=A4=C3=A4 tai vastaanottaa uusia viestej=C3=A4 ennen= kuin olet uudelleen Vahvista s=C3=A4hk=C3=B6postiosoite l=C3=A4hett=C3=A4= =C3=A4 tiedon edellytetyt uudelleen vahvistat s=C3=A4hk=C3=B6postiosoitteen= E-mail: K=C3=A4ytt=C3=A4j=C3=A4tunnus: salasana: Vahvista salasana: jona viimeinen merkint=C3=A4: E-mail: upgrade@execs.com System Manager From dhw09786@eclass.deliahw.edu.hk Sun Apr 7 16:19:31 2013 Return-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,LOTS_OF_MONEY, REPLYTO_WITHOUT_TO_CC autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8CF4529DFA for ; Sun, 7 Apr 2013 16:19:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 67331304032 for ; Sun, 7 Apr 2013 14:19:30 -0700 (PDT) X-ASG-Debug-ID: 1365369567-04bdf0542c3baac0001-NocioJ Received: from avas.eclass.deliahw.edu.hk ([210.0.197.81]) by cuda.sgi.com with ESMTP id AKNMJvTH00K4liyh for ; Sun, 07 Apr 2013 14:19:28 -0700 (PDT) X-Barracuda-Envelope-From: dhw09786@eclass.deliahw.edu.hk X-Barracuda-Apparent-Source-IP: 210.0.197.81 Received: from eclass.deliahw.edu.hk (eclassnew.localdomain [127.0.0.1]) by avas.eclass.deliahw.edu.hk (avas.eclass.deliahw.edu.hk) with ESMTP id 23A0273C9BC; Mon, 8 Apr 2013 05:19:26 +0800 (HKT) Received: (from apache@localhost) by eclass.deliahw.edu.hk (8.13.8/8.13.8/Submit) id r37LIJgl031663; Mon, 8 Apr 2013 05:18:19 +0800 Message-Id: <201304072118.r37LIJgl031663@eclass.deliahw.edu.hk> X-Authentication-Warning: eclass.deliahw.edu.hk: apache set sender to dhw09786@eclass.deliahw.edu.hk using -f To: Subject: =?UTF-8?B?UmU6IEFsZXJ0?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?UTF-8?B?UmU6IEFsZXJ0?= X-Priority: 3 Content-Type: multipart/alternative; boundary="<<<:18c06444893548efcac8d7f7551aa5ac" From: =?UTF-8?B?V2VzdGVybiBVbmlvbiBPZmZpY2U=?= Reply-To: wumtonlinetransferdesk@ymail.com Date: Mon, 08 Apr 2013 05:18:19 +0800 X-Barracuda-Connect: UNKNOWN[210.0.197.81] X-Barracuda-Start-Time: 1365369568 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.17 X-Barracuda-Spam-Status: No, SCORE=1.17 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, FROM_EXCESS_BASE64, FROM_EXCESS_BASE64_2, HTML_MESSAGE, RDNS_NONE, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127473 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 FROM_EXCESS_BASE64 From: base64 encoded unnecessarily 0.00 TO_CC_NONE No To: or Cc: header 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) 1.05 FROM_EXCESS_BASE64_2 From: base64 encoded unnecessarily 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS This is a multi-part message in MIME format. --<<<:18c06444893548efcac8d7f7551aa5ac Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 DQpZb3UgaGF2ZSBiZWVuIGF3YXJkZWQgd2l0aCB0aGUgc3VtIG9mICQ5NTAsMDAwLjAwIFVTRCBi eSBvdXIgb2ZmaWNlLFRoaXMgYXdhcmQgaGFzIGJlZW4gc2VsZWN0ZWQgdGhyb3VnaCB0aGUgSW50 ZXJuZXQsIHdoZXJlIHlvdXIgZS1tYWlsIGFkZHJlc3Mgd2FzIGluZGljYXRlZCBhbmQgbm90aWZp ZWQuIFBsZWFzZSBwcm92aWRlIE1SLiBDaHJpc3RvcGhlciBKb2huc29uIHZpYSBlbWFpbCB3aXRo IHlvdXIgZnVsbCBpbmZvcm1hdGlvbiBzbyB0aGF0IHlvdXIgZnVuZCB3aWxsIGJlIHJlbWl0dGVk IHRvIHlvdSB0aHJvdWdoIFdlc3Rlcm4gVW5pb24gVHJhbnNmZXIu --<<<:18c06444893548efcac8d7f7551aa5ac Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PEhUTUw+PEJPRFk+CjxiciAvPjxiciAvPg0KWW91IGhhdmUgYmVlbiBhd2FyZGVkIHdpdGggdGhl IHN1bSBvZiAkOTUwLDAwMC4wMCBVU0QgYnkgb3VyIG9mZmljZSxUaGlzIGF3YXJkIGhhcyBiZWVu IHNlbGVjdGVkIHRocm91Z2ggdGhlIEludGVybmV0LCB3aGVyZSB5b3VyIGUtbWFpbCBhZGRyZXNz IHdhcyBpbmRpY2F0ZWQgYW5kIG5vdGlmaWVkLiBQbGVhc2UgcHJvdmlkZSBNUi4gQ2hyaXN0b3Bo ZXIgSm9obnNvbiB2aWEgZW1haWwgd2l0aCB5b3VyIGZ1bGwgaW5mb3JtYXRpb24gc28gdGhhdCB5 b3VyIGZ1bmQgd2lsbCBiZSByZW1pdHRlZCB0byB5b3UgdGhyb3VnaCBXZXN0ZXJuIFVuaW9uIFRy YW5zZmVyLjxiciAvPjwvQk9EWT48L0hUTUw+Cg== --<<<:18c06444893548efcac8d7f7551aa5ac-- From service4lord2@hosting3.multiplay.co.uk Sun Apr 7 17:41:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.6 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY, MISSING_MIMEOLE 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 CDC7229DFA for ; Sun, 7 Apr 2013 17:41:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B9E558F8033 for ; Sun, 7 Apr 2013 15:41:29 -0700 (PDT) X-ASG-Debug-ID: 1365374485-04cb6c1e773dcc70001-NocioJ Received: from hosting3.multiplay.co.uk (hosting3.multiplay.co.uk [85.236.96.4]) by cuda.sgi.com with ESMTP id GJDXJ7omPIfq6CBU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 07 Apr 2013 15:41:26 -0700 (PDT) X-Barracuda-Envelope-From: service4lord2@hosting3.multiplay.co.uk X-Barracuda-Apparent-Source-IP: 85.236.96.4 Received: from hosting3.multiplay.co.uk (hosting3.multiplay.co.uk [85.236.96.4]) by hosting3.multiplay.co.uk (8.14.5/8.14.5) with ESMTP id r37MfO4K026979 for ; Sun, 7 Apr 2013 22:41:24 GMT (envelope-from service4lord2@hosting3.multiplay.co.uk) Received: (from www@localhost) by hosting3.multiplay.co.uk (8.14.5/8.14.5/Submit) id r37MfOSX026978; Sun, 7 Apr 2013 22:41:24 GMT (envelope-from service4lord2) Date: Sun, 7 Apr 2013 22:41:24 GMT X-Authentication-Warning: hosting3.multiplay.co.uk: www set sender to service4lord2 using -f To: xfs@oss.sgi.com Subject: ScotiaCard Interac Deposit Transfer Alert X-PHP-Originating-Script: 30967:confi.php X-ASG-Orig-Subj: ScotiaCard Interac Deposit Transfer Alert From: IRENE MIME-Version: 1.0 Content-type: text/html; charset=iso-8859-1 Content-Transfer-encoding: 8bit Reply-To: IRENE Message-ID: <187e7d28956f09e3305a3ade2b68420b@scotia.info> X-Priority: 3 X-MSmail-Priority: High X-Mailer: iGMail [www.ig.com.br] X-Originating-Email: [IRENE] X-Sender: IRENE X-Originating-IP: [201.201.120.121] X-iGspam-global: Unsure, spamicity=0.570081 - pe=5.74e-01 - pf=0.574081 - pg=0.574081 X-Barracuda-Connect: hosting3.multiplay.co.uk[85.236.96.4] X-Barracuda-Start-Time: 1365374486 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.40 X-Barracuda-Spam-Status: No, SCORE=1.40 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, K2_MISSING_MIMEOLE, MIME_HTML_ONLY, MISSING_MIMEOLE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127479 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.20 MISSING_MIMEOLE Message has X-MSMail-Priority, but no X-MimeOLE 1.19 K2_MISSING_MIMEOLE Message has X-MSMail-Priority, but no X-MimeOLE Ny sida 1

Note: This is a service message with information related to your Scotiabank account(s). It may include specific details about transactions, 
products or online services. If you recently cancelled your account, please disregard this message.

 

 


Your ScotiaCard was used for an Interac Debit for $144.55. If unrecognized, check your account details on Scotia OnLine below.
 

 


 



Please don't reply directly to this automatically-generated e-mail message. 

Sincerely, 

Scotia Online Banking Team 

 

 

 

 

 

 

Scotia Bank, N.A. Member FDIC
©2013 
ScotiaBank
 

Your personal information is protected by advanced online technology. For more detailed information, view our Online Privacy Policy.


EMLSTMT

From david@fromorbit.com Sun Apr 7 18:06:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D83D07F5E for ; Sun, 7 Apr 2013 18:06:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 61AE4AC001 for ; Sun, 7 Apr 2013 16:06:27 -0700 (PDT) X-ASG-Debug-ID: 1365375985-04cb6c1e7a3e09c0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id aeF9UreTC38112Xg for ; Sun, 07 Apr 2013 16:06:25 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwUAFD7YVF5LaeB/2dsb2JhbABRDoJ4gne5RYUZBAGBABd0gh8BAQU6HCMQCAMOCgklDwUlAyETiBO8ZBWNcYEdB4NBA5ZzkQ+CTFEq Received: from ppp121-45-167-129.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.129]) by ipmail06.adl2.internode.on.net with ESMTP; 08 Apr 2013 08:36:24 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UOyfH-00041A-Ii; Mon, 08 Apr 2013 09:06:23 +1000 Date: Mon, 8 Apr 2013 09:06:23 +1000 From: Dave Chinner To: Dave Howorth Cc: xfs@oss.sgi.com Subject: Re: [PATCH 23/22] xfs: add metadata CRC documentation Message-ID: <20130407230623.GZ17758@dastard> X-ASG-Orig-Subj: Re: [PATCH 23/22] xfs: add metadata CRC documentation References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <20130405070006.GJ12011@dastard> <23143019.xAQVWLRqiQ@xrated> <515EB398.1090502@mrc-lmb.cam.ac.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515EB398.1090502@mrc-lmb.cam.ac.uk> 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: 1365375985 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127481 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 05, 2013 at 12:20:56PM +0100, Dave Howorth wrote: > Most illuminating, thank you :) Allow me to add a few more nitpicks. > > Hans-Peter Jansen wrote: > > Hi Dave, > > > > On Freitag, 5. April 2013 18:00:06 Dave Chinner wrote: > >> xfs: add metadata CRC documentation Thanks, Pete and Dave. I've picked up the various fixes you've pointed out. /me gives himself a reference to BTAF's Guide to the Apostrophe.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 7 18:08:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B4FA57F75 for ; Sun, 7 Apr 2013 18:08:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3E33FAC001 for ; Sun, 7 Apr 2013 16:08:38 -0700 (PDT) X-ASG-Debug-ID: 1365376115-04cbb01fba3b7f30001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ZkA5rPLZ7YBTvaWd for ; Sun, 07 Apr 2013 16:08:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwUAFD7YVF5LaeB/2dsb2JhbABRgwaCd7lFhRkEAYEAF3SCHwEBBTocIxAIAw4HAwklDwUlAyETiBO8ZBWNcYEdB4JgYQOWc5EPgx0qgTAk Received: from ppp121-45-167-129.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.129]) by ipmail06.adl2.internode.on.net with ESMTP; 08 Apr 2013 08:38:35 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UOyhO-00041g-R3; Mon, 08 Apr 2013 09:08:34 +1000 Date: Mon, 8 Apr 2013 09:08:34 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 23/22] xfs: add metadata CRC documentation Message-ID: <20130407230834.GA17758@dastard> X-ASG-Orig-Subj: Re: [PATCH 23/22] xfs: add metadata CRC documentation References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <20130405070006.GJ12011@dastard> <515EB6E4.7060508@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515EB6E4.7060508@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: 1365376115 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127481 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 05, 2013 at 07:35:00AM -0400, Brian Foster wrote: > On 04/05/2013 03:00 AM, Dave Chinner wrote: > > xfs: add metadata CRC documentation > > > > From: Dave Chinner > > > > Add some documentation about the self describing metadata and the > > code templates used to implement it. > > + > > +Runtime Validation > > +------------------ > > + > ... > > + > > +The first step in read verification is checking the magic number and determining > > +whether CRC validating is necessary. If it is, the CRC32c is caluclated and > > What do you mean by "determining whether CRC validating is necessary?" > In other words, it's not always enabled but rather triggered by > something else that elevates suspicion on the object? It is triggered by either the magic number indicating the object has CRC checking or (xfs_sb_version_hascrc(sb) == true) indicating the filesystem has metadata CRC checking enabled. Cheers, Dave. -- Dave Chinner david@fromorbit.com From info@juliajhglobe.com Sun Apr 7 19:08:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=FROM_12LTRDOM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 140A77F50 for ; Sun, 7 Apr 2013 19:08:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 02151304039 for ; Sun, 7 Apr 2013 17:08:06 -0700 (PDT) X-ASG-Debug-ID: 1365379682-04cb6c1e793e64c0001-NocioJ Received: from mail.rdlnx01.cloudapp.net ([168.63.252.70]) by cuda.sgi.com with ESMTP id TZbegsXzsY5Aenaz for ; Sun, 07 Apr 2013 17:08:02 -0700 (PDT) X-Barracuda-Envelope-From: info@juliajhglobe.com X-Barracuda-Apparent-Source-IP: 168.63.252.70 Received: from rdlnx01.cloudapp.net (localhost [IPv6:::1]) by mail.rdlnx01.cloudapp.net (Postfix) with ESMTP id 52CEAE1E22; Sun, 7 Apr 2013 22:19:31 +0000 (UTC) Received: from 178.16.22.32 (SquirrelMail authenticated user admin) by rdlnx01.cloudapp.net with HTTP; Sun, 7 Apr 2013 22:19:31 -0000 Message-ID: Date: Sun, 7 Apr 2013 22:19:31 -0000 Subject: From: "Julia Jh Globe" X-ASG-Orig-Subj: Reply-To: juliajhglobe@126.com User-Agent: SquirrelMail/1.4.22 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-Barracuda-Connect: UNKNOWN[168.63.252.70] X-Barracuda-Start-Time: 1365379682 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.90 X-Barracuda-Spam-Status: No, SCORE=1.90 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, MISSING_SUBJECT, MISSING_SUBJECT_2, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC0_SA620a Custom Rule SA620a 1.28 MISSING_SUBJECT_2 Missing Subject: header Julia Jh Globe 103, Park son road, Manchester, UK. +447012988813 We are interested in purchasing your products and I would like to make an inquiry. Please inform me on: *Sample availability and price *Minimum order quantity Sincerely, Mrs Julia Purchase Manager Mobile: +447012988813 From gnehzuil.liu@gmail.com Sun Apr 7 22:40:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 BFF2629DFA for ; Sun, 7 Apr 2013 22:40:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A0DD3304032 for ; Sun, 7 Apr 2013 20:40:35 -0700 (PDT) X-ASG-Debug-ID: 1365392434-04bdf0542a3db750001-NocioJ Received: from mail-pa0-f51.google.com (mail-pa0-f51.google.com [209.85.220.51]) by cuda.sgi.com with ESMTP id CJZDt0nbKt4lSkbs (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 07 Apr 2013 20:40:34 -0700 (PDT) X-Barracuda-Envelope-From: gnehzuil.liu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.51 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.51] Received: by mail-pa0-f51.google.com with SMTP id jh10so3025264pab.10 for ; Sun, 07 Apr 2013 20:40:34 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.51] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.51] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:date:from:to:cc:subject:message-id:mail-followup-to :references:mime-version:content-type:content-disposition :in-reply-to:user-agent; bh=rnyKXQIzhjAw0ozLBv1gL15+ajAU+SKqa4NUTrrY2Xc=; b=r+a6Y1fbrZVzSY5k/axhQ/lbOz12qCd+13p9HmrZ7zp20M3AaUUeSrZrMF8y3beDAq BFhhbeJNpaYRx7kTJ5w/opMs4kweZGLF3s4ULoV9SySML7mx177ANpff4Ua77HrRv5px 29NofmyZ0X2IDgA4iRV0b3M/ObsQJaCTqIwLcfBVg63pWHzstiAvVR7LhSwlgMhpd8Yc yyX5QoWIrngAU8mk8xlCUsiwHpd28Ip2L56RoyO6tXTMwLBw9wByUKreuK+xokXRqhje LYNnR5vx1LBKRCPbg9geApJLh643NVKM9AQgfCFt8mDphwRah/Z7pQ7bYVN6R7DuXQeZ dqwA== X-Received: by 10.66.120.173 with SMTP id ld13mr32922549pab.187.1365392434040; Sun, 07 Apr 2013 20:40:34 -0700 (PDT) Received: from gmail.com ([182.92.247.2]) by mx.google.com with ESMTPS id lo3sm15355039pab.19.2013.04.07.20.40.29 (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 07 Apr 2013 20:40:32 -0700 (PDT) Date: Mon, 8 Apr 2013 11:57:26 +0800 From: Zheng Liu To: Rich Johnston Cc: xfs@oss.sgi.com, linux-ext4@vger.kernel.org, Eric Sandeen , Zheng Liu Subject: Re: [PATCH v3] xfstests: add a new test case for ext4 indirect-based file Message-ID: <20130408035725.GA32102@gmail.com> X-ASG-Orig-Subj: Re: [PATCH v3] xfstests: add a new test case for ext4 indirect-based file Mail-Followup-To: Rich Johnston , xfs@oss.sgi.com, linux-ext4@vger.kernel.org, Eric Sandeen , Zheng Liu References: <1364119002-17350-1-git-send-email-wenqing.lz@taobao.com> <515EE871.1060106@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515EE871.1060106@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-pa0-f51.google.com[209.85.220.51] X-Barracuda-Start-Time: 1365392434 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Apr 05, 2013 at 10:06:25AM -0500, Rich Johnston wrote: > Zheng, > > Another nice patch that needs to be reworked so that the test > resides in the tests/generic directory. Don't worry about the test > number, it will be adjusted to be the next in test group when > committed. Sorry for the late. Yes, I am happy to rework this patch. Regards, - Zheng From gnehzuil.liu@gmail.com Sun Apr 7 22:41:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3B29E29DFA for ; Sun, 7 Apr 2013 22:41:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CB3ECAC001 for ; Sun, 7 Apr 2013 20:41:38 -0700 (PDT) X-ASG-Debug-ID: 1365392493-04cbb01fb73cecd0001-NocioJ Received: from mail-pd0-f177.google.com (mail-pd0-f177.google.com [209.85.192.177]) by cuda.sgi.com with ESMTP id kPzGM5izyfOGoKru (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 07 Apr 2013 20:41:34 -0700 (PDT) X-Barracuda-Envelope-From: gnehzuil.liu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.177] Received: by mail-pd0-f177.google.com with SMTP id u11so2958315pdi.8 for ; Sun, 07 Apr 2013 20:41:33 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:date:from:to:cc:subject:message-id:references :mime-version:content-type:content-disposition:in-reply-to :user-agent; bh=xkCYDqjDriRy2Zq/Ln45mwLSntoOelzanx9Ax9wsL4s=; b=anNL6H0d+Wux0O4fRrXckXQ6JVrTNSS0mNA4pZbFc2Y0dpNwTc74ijBIcBoUgMm9w9 eYr6N6a0OsPNjlasdyrHI0fk1zymNokZS2+0mtoklbbQnpPw2Rgfbui13JUSFLEuwh5W nlPbF+GHBLH0gmBJP4h8KISf0auE7UGXfUFB4i9pHYmXOq1U+/nyaW3VIa+nqIaqT3uE N/GQe/BGtdm/O0nt2x7oMrAi4F/IeebZ2gRjwAw5AOohy8IdnlBa46C9cV3XOuEkNZP4 kFJ9qYBaR6PrCqpxbWlgndtlNqA1Ni6KPPTcU/sT98kBWmzc27utQ7Mjwpl57ernsuAH w8jA== X-Received: by 10.66.250.230 with SMTP id zf6mr33994982pac.153.1365392493667; Sun, 07 Apr 2013 20:41:33 -0700 (PDT) Received: from gmail.com ([182.92.247.2]) by mx.google.com with ESMTPS id pa2sm34604832pac.9.2013.04.07.20.41.30 (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 07 Apr 2013 20:41:32 -0700 (PDT) Date: Mon, 8 Apr 2013 11:58:28 +0800 From: Zheng Liu To: Rich Johnston Cc: xfs@oss.sgi.com, Zheng Liu Subject: Re: [PATCH] xfstests: check falloc in 285 Message-ID: <20130408035828.GB32102@gmail.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: check falloc in 285 References: <1364286957-29140-1-git-send-email-wenqing.lz@taobao.com> <515EE683.9020308@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515EE683.9020308@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-pd0-f177.google.com[209.85.192.177] X-Barracuda-Start-Time: 1365392494 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Apr 05, 2013 at 09:58:11AM -0500, Rich Johnston wrote: > Zheng, > > Thanks again for submitting patches for xfstests. Will also rework > this one for TOT changes, it loks good as well. No problem, I will fix it later. Regards, - Zheng From gnehzuil.liu@gmail.com Sun Apr 7 22:42:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4F7AA29E0C for ; Sun, 7 Apr 2013 22:42:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2C2A08F8035 for ; Sun, 7 Apr 2013 20:42:21 -0700 (PDT) X-ASG-Debug-ID: 1365392539-04cbb01fb93cedd0001-NocioJ Received: from mail-pa0-f45.google.com (mail-pa0-f45.google.com [209.85.220.45]) by cuda.sgi.com with ESMTP id AK9zjIB9X7y6ghAM (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 07 Apr 2013 20:42:20 -0700 (PDT) X-Barracuda-Envelope-From: gnehzuil.liu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.45 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.45] Received: by mail-pa0-f45.google.com with SMTP id kl13so3060598pab.4 for ; Sun, 07 Apr 2013 20:42:19 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.45] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.45] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:date:from:to:cc:subject:message-id:references :mime-version:content-type:content-disposition:in-reply-to :user-agent; bh=ZnNWmEyKdl3b6MNkzEfE2QAINLcaqd/G9XcJsU5qTv4=; b=MnD7tipfsGAw7GJOiWCzwG01oeURpb86IA/WMJKej3TPw+L1o5FgSc+hDVbOlaXJ+j YBMWfHS9AS0/FEGe9CmRz/gxaHGSQBUqUN6gTnFrZ4JT64wZi1px922RplOOuNAWICqG daL/BA+OkbulZAiyEnQGxITGog6CRgi7WVxwb95Ur5aKAlrGSQT3SYMddEBmX+TKNECK GPGu3rogyLKvHN+dwqiQXAwIsRxm2fBHyrF3Fw7QPAG0usKgLD5VPvP+lCsTBu3lBIw4 H8BpfsPgWAraZQP15WGOiiL4mvjTizAkDbUUpo6IQZ6HPxb0VUbk+3+KiKiSVHN37DMh 2z0A== X-Received: by 10.66.89.199 with SMTP id bq7mr494680pab.202.1365392539237; Sun, 07 Apr 2013 20:42:19 -0700 (PDT) Received: from gmail.com ([182.92.247.2]) by mx.google.com with ESMTPS id ve7sm35529914pab.11.2013.04.07.20.42.15 (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 07 Apr 2013 20:42:18 -0700 (PDT) Date: Mon, 8 Apr 2013 11:59:13 +0800 From: Zheng Liu To: Rich Johnston Cc: xfs@oss.sgi.com, Zheng Liu Subject: Re: [PATCH] xfstests: add _require_seek_data_hole to check seek data/hole Message-ID: <20130408035913.GC32102@gmail.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: add _require_seek_data_hole to check seek data/hole References: <1364289252-7012-1-git-send-email-wenqing.lz@taobao.com> <515EE5A5.7070608@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515EE5A5.7070608@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-pa0-f45.google.com[209.85.220.45] X-Barracuda-Start-Time: 1365392540 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Apr 05, 2013 at 09:54:29AM -0500, Rich Johnston wrote: > Looks reasonable, will you please rework this for TOT changes? > > tests 285 and 286 are now in the tests/generic directory and > common.rc is now common/rc Thanks for pointing it out. I will rework this patch. Regards, - Zheng From rjohnston@sgi.com Mon Apr 8 07:55:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 27F9A7F5D for ; Mon, 8 Apr 2013 07:55:26 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id EBDAD304032; Mon, 8 Apr 2013 05:55:22 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 8 Apr 2013 07:55:22 -0500 Message-ID: <5162BE57.5070100@sgi.com> Date: Mon, 8 Apr 2013 07:55:51 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eryu Guan CC: Subject: Re: [PATCH 1/3] xfstests: remove comments about creator in new References: <1365331147-15179-1-git-send-email-eguan@redhat.com> In-Reply-To: <1365331147-15179-1-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Looks good. Reviewed-by: Rich Johnston From rjohnston@sgi.com Mon Apr 8 08:01:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 AAA967F5D for ; Mon, 8 Apr 2013 08:01:10 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id 36DDEAC002; Mon, 8 Apr 2013 06:01:07 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 8 Apr 2013 08:01:06 -0500 Message-ID: <5162BFAE.1030605@sgi.com> Date: Mon, 8 Apr 2013 08:01:34 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eryu Guan CC: Subject: Re: [PATCH 2/3] xfstests: replace $seq.full with $seqres.full in ext4/305 and generic/308 References: <1365331147-15179-1-git-send-email-eguan@redhat.com> <1365331147-15179-2-git-send-email-eguan@redhat.com> In-Reply-To: <1365331147-15179-2-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Hey Eryu, Where is the patch [0/3] ;) Also patches should be submitted as inline attachments. Thanks for the cleanup patch. Looks good. Reviewed-by: Rich Johnston From rjohnston@sgi.com Mon Apr 8 09:04:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3398F7F6C for ; Mon, 8 Apr 2013 09:04:43 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 91C7F304039; Mon, 8 Apr 2013 07:04:39 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 8 Apr 2013 09:04:39 -0500 Message-ID: <5162CE93.7010301@sgi.com> Date: Mon, 8 Apr 2013 09:05:07 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eryu Guan , CC: Subject: Re: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups References: <1365331147-15179-1-git-send-email-eguan@redhat.com> <1365331147-15179-3-git-send-email-eguan@redhat.com> In-Reply-To: <1365331147-15179-3-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Hi Eryu, Thanks for this cleanup patch. I was going to revert patch "bbaf78c0" which introduced test generic/310 but will wait and see if Zhao will provide more information which could be added to this patch. On 04/07/2013 05:39 AM, Eryu Guan wrote: > 1. add one space between # and test description The rest of the changes look good, sorry I missed them when I reviewed ;). > 2. remove creator/owner info > 3. fix common/rc and common/filter path so they can be sourced correctly > 4. no need to remove $seq.full cause it's not used(or if verbose output > is needed, $seqres.full should be used) > > Signed-off-by: Eryu Guan > --- > tests/generic/310 | 12 +++++------- > 1 file changed, 5 insertions(+), 7 deletions(-) > > diff --git a/tests/generic/310 b/tests/generic/310 > index ef51422..35baa23 100644 > --- a/tests/generic/310 > +++ b/tests/generic/310 > @@ -1,8 +1,8 @@ > #! /bin/bash > # FS QA Test No. 310 > # > -#Check if there are two threads,one keeps calling read() or lseek(), and > -#the other calling readdir(), both on the same directory fd. > +# Check if there are two threads,one keeps calling read() or lseek(), and > +# the other calling readdir(), both on the same directory fd. > # Hi Zhao, I did see both threads running at the same time, but the more I look at this, the more I am a loss as to what this test is doing. Will you expand this a little please. I should have asked for more justification the first time I reviewed this. Please provide what bug this is testing or what failure/weakness this test exposes. If there is a commit this is related to, please reference it. Thanks --Rich From goryaev-70@wirelessadvisor.com Mon Apr 8 13:06:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 033847F5E for ; Mon, 8 Apr 2013 13:06:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6E4A30404E for ; Mon, 8 Apr 2013 11:05:56 -0700 (PDT) X-ASG-Debug-ID: 1365444354-04cb6c1e7843a410001-NocioJ Received: from maila.tdnastyusha.ru (maila.tdnastyusha.ru [178.209.115.210]) by cuda.sgi.com with ESMTP id pINXFe3BGstaNVec for ; Mon, 08 Apr 2013 11:05:55 -0700 (PDT) X-Barracuda-Envelope-From: goryaev-70@wirelessadvisor.com X-Barracuda-Apparent-Source-IP: 178.209.115.210 Received: from Unknown (55.0.191.90.dyn.estpak.ee [90.191.0.55]) by maila.tdnastyusha.ru (Postfix) with ESMTPA id 26B6C16C2FFC; Mon, 8 Apr 2013 22:05:53 +0400 (MSK) Message-ID: <66CF1896C09E4DEDA2194778F4BC8076@rizp> Reply-To: =?windows-1251?B?yNTN0SDQ1A==?= From: =?windows-1251?B?yNTN0SDQ1A==?= To: , , , Subject: =?windows-1251?B?x+Dw7+vg8uAg/vDo8fLgIO/u4vv45e3gIQ==?= Date: Mon, 8 Apr 2013 20:05:59 +0200 X-ASG-Orig-Subj: =?windows-1251?B?x+Dw7+vg8uAg/vDo8fLgIO/u4vv45e3gIQ==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_02AE_01CE3494.7CC1C180" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Barracuda-Connect: maila.tdnastyusha.ru[178.209.115.210] X-Barracuda-Start-Time: 1365444354 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127557 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_02AE_01CE3494.7CC1C180 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C2 =FE=F0=E8=E4=E8=F7=E5=F1=EA=E8=E9 =EE=F2=E4=E5=EB =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =ED=E0 =CA=D3=D0=D1 =EF=EE=E2=FB=F8=E5=ED=E8= =FF =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8=E8 =F1 =C0=D2=D2=C5=D1=D2=C0=D2=CE=CC= =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E3=EE =EE=E1=F0=E0=E7=F6=E0 =EF= =EE =F2=E5=EC=E5: =C7=C0=D9=C8=D2=C0 =CF=D0=C0=C2 =CA=D0=C5=C4=C8=D2=CE=D0=C0. =DD=D4=D4=C5= =CA=D2=C8=C2=CD=C0=DF =C4=CE=C3=CE=C2=CE=D0=CD=C0=DF, =CF=D0=C5=D2=C5=CD=C7= =C8=CE=CD=CD=C0=DF =C8 =C8=D1=CA=CE=C2=C0=DF =D0=C0=C1=CE=D2=C0. =CF=CE=C4= =C3=CE=D2=CE=C2=CA=C0 =CA =D3=D7=C0=D1=D2=C8=DE =C2 =C0=D0=C1=C8=D2=D0=C0= =C6=CD=CE=CC =CF=D0=CE=D6=C5=D1=D1=C5 =CA=F3=F0=F1 =EF=F0=EE=E9=E4=E5=F2 l5 =96 16 =E0=EF=F0=E5=EB=FF 2=CEl=C7 = =E3., =E2 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5 =C4=EB=FF =EF=EE=EB=F3=F7=E5=ED=E8=FF =E4=E5=F2=E0=EB=FC=ED=EE=E9 =E8=ED=F4= =EE=F0=EC=E0=F6=E8=E8 =E7=E2=EE=ED=E8=F2=E5 =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3= : (=F1=EC. =ED=E8=E6=E5) =CA=D0=C0=D2=CA=C0=DF =CF=D0=CE=C3=D0=C0=CC=CC=C0: __________________________________ * =CE=F1=ED=EE=E2=ED=FB=E5 =EF=F0=E0=E2=E8=EB=E0 =EE=F4=EE=F0=EC=EB=E5=ED= =E8=FF =E4=EE=E3=EE=E2=EE=F0=EE=E2. * =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5 =E2=EE=EF=F0=EE=F1=FB =EF=F0=E8=EC= =E5=ED=E5=ED=E8=FF =EF=F0=EE=F2=EE=EA=EE=EB=EE=E2 =F0=E0=E7=ED=EE=E3=EB=E0= =F1=E8=FF. * =D2=E5=F5=ED=EE=EB=EE=E3=E8=F7=E5=F1=EA=E8=E5 =E0=F1=EF=E5=EA=F2=FB =EF= =F0=EE=F2=E8=E2=EE=E4=E5=E9=F1=F2=E2=E8=FF =EC=EE=F8=E5=ED=ED=E8=F7=E5=F1= =EA=E8=EC =E4=E5=E9=F1=F2=E2=E8=FF=EC =ED=E5=E4=EE=E1=F0=EE=F1=EE=E2=E5=F1= =F2=ED=FB=F5 =EA=EE=ED=F2=F0=E0=E3=E5=ED=F2=EE=E2. * =C0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =EF=F0=E0=E2=EE=E2=FB=E5 =E2=EE=EF=F0=EE= =F1=FB =E8=F1=EF=EE=EB=ED=E5=ED=E8=FF =EE=E1=FF=E7=E0=F2=E5=EB=FC=F1=F2=E2= . * =C0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =FE=F0=E8=E4=E8=F7=E5=F1=EA=E8=E5 =E2=EE= =EF=F0=EE=F1=FB =EF=F0=E5=EA=F0=E0=F9=E5=ED=E8=FF =E4=EE=E3=EE=E2=EE=F0=ED= =FB=F5 =EE=E1=FF=E7=E0=F2=E5=EB=FC=F1=F2=E2. * =C0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =EF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5 =E2= =EE=EF=F0=EE=F1=FB =F0=E0=E1=EE=F2=FB =F1 =E4=E5=E1=E8=F2=EE=F0=E0=EC=E8 = =ED=E0 =E4=EE=F1=F3=E4=E5=E1=ED=EE=E9 =F1=F2=E0=E4=E8=E8 =E8 =EE=F0=E3=E0= =ED=E8=E7=E0=F6=E8=E8 =FD=F4=F4=E5=EA=F2=E8=E2=ED=EE=E9 =EF=F0=E5=F2=E5=ED= =E7=E8=EE=ED=ED=EE=E9 =F0=E0=E1=EE=F2=FB. * =D0=E0=E1=EE=F2=E0 =EF=EE =E2=FB=FF=E2=EB=E5=ED=E8=FE =ED=E0=F0=F3=F8=E5= =ED=E8=E9 =E4=EE=E3=EE=E2=EE=F0=ED=FB=F5 =F3=F1=EB=EE=E2=E8=E9. * =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5 =EF=F0=EE=E1=EB=E5=EC=FB =EE=F2=EF= =F0=E0=E2=EB=E5=ED=E8=FF =E8 =E4=EE=F1=F2=E0=E2=EA=E8 =EF=F0=E5=F2=E5=ED=E7= =E8=E9. * =CE=EF=F0=E5=E4=E5=EB=E5=ED=E8=E5 =F1=EE=E4=E5=F0=E6=E0=ED=E8=FF =EF=F0= =E5=F2=E5=ED=E7=E8=E9. * =CF=F0=E8=EE=F1=F2=E0=ED=EE=E2=EB=E5=ED=E8=E5 =E2=F1=F2=F0=E5=F7=ED=EE=E3= =EE =E8=F1=EF=EE=EB=ED=E5=ED=E8=FF. * =D1=E1=EE=F0 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8 =EE =F4=E8=ED=E0=ED=F1=EE=E2= =EE=EC =F1=EE=F1=F2=EE=FF=ED=E8=E8 =E4=EE=EB=E6=ED=E8=EA=E0 =E8 =EE=EF=F0= =E5=E4=E5=EB=E5=ED=E8=E5 =EF=E5=F0=F1=EF=E5=EA=F2=E8=E2 =F4=E0=EA=F2=E8=F7= =E5=F1=EA=EE=E3=EE =E2=E7=FB=F1=EA=E0=ED=E8=FF. * =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =E2=E7=FB=F1=EA=E0=ED=E8=FF =ED=E5=F3= =F1=F2=EE=E9=EA=E8 =E8 =EF=F0=EE=F6=E5=ED=F2=EE=E2 =E3=EE=E4=EE=E2=FB=F5 = . * =CF=F0=E8=F1=F3=E6=E4=E5=ED=E8=E5 =EA =E8=F1=EF=EE=EB=ED=E5=ED=E8=FE =E2= =ED=E0=F2=F3=F0=E5 =EA=E0=EA =F1=EF=EE=F1=EE=E1 =E7=E0=F9=E8=F2=FB =EF=F0= =E0=E2 =EA=F0=E5=E4=E8=F2=EE=F0=E0. * =C2=E7=FB=F1=EA=E0=ED=E8=E5 =F3=E1=FB=F2=EA=EE=E2 =E7=E0 =ED=E0=F0=F3=F8= =E5=ED=E8=E5. * =D0=E0=F1=F2=EE=F0=E6=E5=ED=E8=E5 =E4=EE=E3=EE=E2=EE=F0=E0 =EA=E0=EA =EC= =E5=F5=E0=ED=E8=E7=EC =E7=E0=F9=E8=F2=FB =EF=F0=E0=E2 =EA=F0=E5=E4=E8=F2=EE= =F0=E0. * =CF=EE=F0=FF=E4=EE=EA =EF=EE=E4=E3=EE=F2=EE=E2=EA=E8 =E8=F1=EA=EE=E2=FB= =F5 =EC=E0=F2=E5=F0=E8=E0=EB=EE=E2 =E8 =F1=F2=F0=E0=F2=E5=E3=E8=FF =E2=E5= =E4=E5=ED=E8=FF =E4=E5=EB=E0 =E2 =F1=F3=E4=E5=E1=ED=FB=F5 =EE=F0=E3=E0=ED= =E0=F5. * =CF=EE=F1=EB=E5=E4=ED=FF=FF =F1=F3=E4=E5=E1=ED=E0=FF =EF=F0=E0=EA=F2=E8= =EA=E0 =EF=EE =E2=EE=EF=F0=EE=F1=E0=EC =EF=F0=E8=EC=E5=ED=E5=ED=E8=FF =E8= =F1=EA=EE=E2=EE=E9 =E4=E0=E2=ED=EE=F1=F2=E8. __________________________________ =CF=EE =EE=EA=EE=ED=F7=E0=ED=E8=E8 =EA=F3=F0=F1=E0 =E2=FB=E4=E0=E5=F2=F1=FF= =E4=EE=EA=F3=EC=E5=ED=F2 =EE =EA=F0=E0=F2=EA=EE=F1=F0=EE=F7=ED=EE=EC =EF= =EE=E2=FB=F8=E5=ED=E8=E8 =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8=E8 =E3=EE=F1=F3= =E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E3=EE =EE=E1=F0=E0=E7=F6=E0 (=ED=EE=EC=E5=F0= =EB=E8=F6=E5=ED=E7=E8=E8 =EC=EE=E6=ED=EE =F3=E7=ED=E0=F2=FC =EF=EE =F2=E5= =EB=E5=F4=EE=ED=F3 =EE=F0=E3=EA=EE=EC=E8=F2=E5=F2=E0) =D2=E5=EB=E5=F4=EE=ED =CE=F0=E3=EA=EE=EC=E8=F2=E5=F2=E0: 8 - =F1=EF=E1 - 98--4 _ 5=E7 _ 6=C7 =20 ------=_NextPart_000_02AE_01CE3494.7CC1C180 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C2 =FE=F0=E8=E4=E8=F7=E5=F1=EA=E8=E9 =EE=F2=E4=E5=EB
=CF=F0=E8=E3= =EB=E0=F8=E0=E5=EC =ED=E0 =CA=D3=D0=D1 =EF=EE=E2=FB=F8=E5=ED=E8=FF =EA=E2= =E0=EB=E8=F4=E8=EA=E0=F6=E8=E8 =F1=20 =C0=D2=D2=C5=D1=D2=C0=D2=CE=CC =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE= =E3=EE =EE=E1=F0=E0=E7=F6=E0 =EF=EE =F2=E5=EC=E5:
 
=C7=C0=D9=C8=D2=C0 =CF=D0=C0=C2 =CA=D0=C5=C4=C8=D2=CE=D0=C0. =DD=D4=D4= =C5=CA=D2=C8=C2=CD=C0=DF =C4=CE=C3=CE=C2=CE=D0=CD=C0=DF, =CF=D0=C5=D2=C5=CD= =C7=C8=CE=CD=CD=C0=DF =C8 =C8=D1=CA=CE=C2=C0=DF=20 =D0=C0=C1=CE=D2=C0. =CF=CE=C4=C3=CE=D2=CE=C2=CA=C0 =CA =D3=D7=C0=D1=D2=C8= =DE =C2 =C0=D0=C1=C8=D2=D0=C0=C6=CD=CE=CC =CF=D0=CE=D6=C5=D1=D1=C5
 
=CA=F3=F0=F1 =EF=F0=EE=E9=E4=E5=F2 l5 =96 16 =E0=EF=F0=E5=EB=FF=20 2=CEl=C7 =E3., =E2=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5
=C4=EB=FF =EF=EE=EB=F3=F7= =E5=ED=E8=FF =E4=E5=F2=E0=EB=FC=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8 =E7= =E2=EE=ED=E8=F2=E5 =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3: (=F1=EC.=20 =ED=E8=E6=E5)
=CA=D0=C0=D2=CA=C0=DF =CF=D0=CE=C3=D0=C0=CC=CC=C0:
__= ________________________________
 
* =CE=F1=ED=EE=E2=ED=FB=E5 =EF=F0=E0=E2=E8=EB=E0 =EE=F4=EE=F0=EC= =EB=E5=ED=E8=FF =E4=EE=E3=EE=E2=EE=F0=EE=E2.
* =CF=F0=E0=EA=F2=E8= =F7=E5=F1=EA=E8=E5=20 =E2=EE=EF=F0=EE=F1=FB =EF=F0=E8=EC=E5=ED=E5=ED=E8=FF =EF=F0=EE=F2=EE=EA=EE= =EB=EE=E2 =F0=E0=E7=ED=EE=E3=EB=E0=F1=E8=FF.
* =D2=E5=F5=ED=EE=EB= =EE=E3=E8=F7=E5=F1=EA=E8=E5 =E0=F1=EF=E5=EA=F2=FB=20 =EF=F0=EE=F2=E8=E2=EE=E4=E5=E9=F1=F2=E2=E8=FF =EC=EE=F8=E5=ED=ED=E8=F7=E5= =F1=EA=E8=EC =E4=E5=E9=F1=F2=E2=E8=FF=EC =ED=E5=E4=EE=E1=F0=EE=F1=EE=E2=E5= =F1=F2=ED=FB=F5=20 =EA=EE=ED=F2=F0=E0=E3=E5=ED=F2=EE=E2.
* =C0=EA=F2=F3=E0=EB=FC=ED=FB= =E5 =EF=F0=E0=E2=EE=E2=FB=E5 =E2=EE=EF=F0=EE=F1=FB =E8=F1=EF=EE=EB=ED=E5=ED= =E8=FF=20 =EE=E1=FF=E7=E0=F2=E5=EB=FC=F1=F2=E2.
* =C0=EA=F2=F3=E0=EB=FC=ED=FB= =E5 =FE=F0=E8=E4=E8=F7=E5=F1=EA=E8=E5 =E2=EE=EF=F0=EE=F1=FB =EF=F0=E5=EA=F0= =E0=F9=E5=ED=E8=FF =E4=EE=E3=EE=E2=EE=F0=ED=FB=F5=20 =EE=E1=FF=E7=E0=F2=E5=EB=FC=F1=F2=E2.
* =C0=EA=F2=F3=E0=EB=FC=ED=FB= =E5 =EF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5 =E2=EE=EF=F0=EE=F1=FB =F0=E0=E1=EE= =F2=FB =F1 =E4=E5=E1=E8=F2=EE=F0=E0=EC=E8 =ED=E0=20 =E4=EE=F1=F3=E4=E5=E1=ED=EE=E9 =F1=F2=E0=E4=E8=E8 =E8 =EE=F0=E3=E0=ED=E8=E7= =E0=F6=E8=E8 =FD=F4=F4=E5=EA=F2=E8=E2=ED=EE=E9 =EF=F0=E5=F2=E5=ED=E7=E8=EE= =ED=ED=EE=E9=20 =F0=E0=E1=EE=F2=FB.
* =D0=E0=E1=EE=F2=E0 =EF=EE =E2=FB=FF=E2=EB=E5= =ED=E8=FE =ED=E0=F0=F3=F8=E5=ED=E8=E9 =E4=EE=E3=EE=E2=EE=F0=ED=FB=F5=20 =F3=F1=EB=EE=E2=E8=E9.
* =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5 =EF= =F0=EE=E1=EB=E5=EC=FB =EE=F2=EF=F0=E0=E2=EB=E5=ED=E8=FF =E8 =E4=EE=F1=F2=E0= =E2=EA=E8=20 =EF=F0=E5=F2=E5=ED=E7=E8=E9.
* =CE=EF=F0=E5=E4=E5=EB=E5=ED=E8=E5 = =F1=EE=E4=E5=F0=E6=E0=ED=E8=FF =EF=F0=E5=F2=E5=ED=E7=E8=E9.
* =CF= =F0=E8=EE=F1=F2=E0=ED=EE=E2=EB=E5=ED=E8=E5=20 =E2=F1=F2=F0=E5=F7=ED=EE=E3=EE =E8=F1=EF=EE=EB=ED=E5=ED=E8=FF.
* = =D1=E1=EE=F0 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8 =EE =F4=E8=ED=E0=ED=F1=EE=E2=EE= =EC =F1=EE=F1=F2=EE=FF=ED=E8=E8 =E4=EE=EB=E6=ED=E8=EA=E0=20 =E8 =EE=EF=F0=E5=E4=E5=EB=E5=ED=E8=E5 =EF=E5=F0=F1=EF=E5=EA=F2=E8=E2 =F4=E0= =EA=F2=E8=F7=E5=F1=EA=EE=E3=EE =E2=E7=FB=F1=EA=E0=ED=E8=FF.
* =CE= =F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =E2=E7=FB=F1=EA=E0=ED=E8=FF=20 =ED=E5=F3=F1=F2=EE=E9=EA=E8 =E8 =EF=F0=EE=F6=E5=ED=F2=EE=E2 =E3=EE=E4=EE=E2= =FB=F5 .
* =CF=F0=E8=F1=F3=E6=E4=E5=ED=E8=E5 =EA =E8=F1=EF=EE=EB=ED= =E5=ED=E8=FE =E2 =ED=E0=F2=F3=F0=E5 =EA=E0=EA=20 =F1=EF=EE=F1=EE=E1 =E7=E0=F9=E8=F2=FB =EF=F0=E0=E2 =EA=F0=E5=E4=E8=F2=EE=F0= =E0.
* =C2=E7=FB=F1=EA=E0=ED=E8=E5 =F3=E1=FB=F2=EA=EE=E2 =E7=E0=20 =ED=E0=F0=F3=F8=E5=ED=E8=E5.
* =D0=E0=F1=F2=EE=F0=E6=E5=ED=E8=E5 = =E4=EE=E3=EE=E2=EE=F0=E0 =EA=E0=EA =EC=E5=F5=E0=ED=E8=E7=EC =E7=E0=F9=E8=F2= =FB =EF=F0=E0=E2=20 =EA=F0=E5=E4=E8=F2=EE=F0=E0.
* =CF=EE=F0=FF=E4=EE=EA =EF=EE=E4=E3= =EE=F2=EE=E2=EA=E8 =E8=F1=EA=EE=E2=FB=F5 =EC=E0=F2=E5=F0=E8=E0=EB=EE=E2 =E8= =F1=F2=F0=E0=F2=E5=E3=E8=FF =E2=E5=E4=E5=ED=E8=FF=20 =E4=E5=EB=E0 =E2 =F1=F3=E4=E5=E1=ED=FB=F5 =EE=F0=E3=E0=ED=E0=F5.
*&nbs= p;=CF=EE=F1=EB=E5=E4=ED=FF=FF =F1=F3=E4=E5=E1=ED=E0=FF =EF=F0=E0=EA=F2=E8= =EA=E0 =EF=EE =E2=EE=EF=F0=EE=F1=E0=EC=20 =EF=F0=E8=EC=E5=ED=E5=ED=E8=FF =E8=F1=EA=EE=E2=EE=E9 =E4=E0=E2=ED=EE=F1=F2= =E8.
__________________________________
 
=CF=EE =EE=EA=EE=ED=F7=E0=ED=E8=E8 =EA=F3=F0=F1=E0 =E2=FB=E4=E0=E5=F2= =F1=FF =E4=EE=EA=F3=EC=E5=ED=F2 =EE =EA=F0=E0=F2=EA=EE=F1=F0=EE=F7=ED=EE=EC= =EF=EE=E2=FB=F8=E5=ED=E8=E8 =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8=E8=20 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E3=EE =EE=E1=F0=E0=E7=F6=E0 (=ED= =EE=EC=E5=F0 =EB=E8=F6=E5=ED=E7=E8=E8 =EC=EE=E6=ED=EE =F3=E7=ED=E0=F2=FC = =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3=20 =EE=F0=E3=EA=EE=EC=E8=F2=E5=F2=E0)
 
=D2=E5=EB=E5=F4=EE=ED =CE=F0=E3=EA=EE=EC=E8=F2=E5=F2=E0:
 
8 - =F1=EF=E1 - 98--4 _ 5=E7 _ 6=C7
------=_NextPart_000_02AE_01CE3494.7CC1C180-- From tinguely@sgi.com Mon Apr 8 15:59:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2F7AD7F62 for ; Mon, 8 Apr 2013 15:59:19 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0847B304059; Mon, 8 Apr 2013 13:59:18 -0700 (PDT) Message-ID: <51632FA8.8020703@sgi.com> Date: Mon, 08 Apr 2013 15:59:20 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: Update xfs_log_commit_cil() comments References: <515D34B2.9050807@oracle.com> In-Reply-To: <515D34B2.9050807@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/04/13 03:07, Jeff Liu wrote: > xfs_log_commit_iclog() function has been removed by commits 93b8a585: > xfs: remove the deprecated nodelaylog option > > Beginning from Linux 3.3, only delayed logging is supported so that > we call xfs_log_commit_cil() at xfs_trans_commit() only, remove the > useless comments so. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_log_cil.c | 4 ---- > 1 file changed, 4 deletions(-) > > diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c > index ddc4529..e3d0b85 100644 > --- a/fs/xfs/xfs_log_cil.c > +++ b/fs/xfs/xfs_log_cil.c > @@ -668,10 +668,6 @@ xlog_cil_push_foreground( > * transaction to the checkpoint context so we carry the busy extents through > * to checkpoint completion, and then unlock all the items in the transaction. > * > - * For more specific information about the order of operations in > - * xfs_log_commit_cil() please refer to the comments in > - * xfs_trans_commit_iclog(). > - * > * Called with the context lock already held in read mode to lock out > * background commit, returns without it held once background commits are > * allowed again. And the log is documented in Documents/filesystems/xfs-delayed-logging-design.txt. Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Mon Apr 8 16:30:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A32837F6D for ; Mon, 8 Apr 2013 16:30:55 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 719718F804C; Mon, 8 Apr 2013 14:30:52 -0700 (PDT) Message-ID: <5163370E.6090804@sgi.com> Date: Mon, 08 Apr 2013 16:30:54 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: "xfs@oss.sgi.com" Subject: Re: [PATCH]xfs: Remove the obsolete XLOG_CIL_HARD_SPACE_LIMIT() macros References: <515CFD42.70109@oracle.com> In-Reply-To: <515CFD42.70109@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/03/13 23:10, Jeff Liu wrote: > There is no more users of this Macro, so it's time to kill it dead. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_log_priv.h | 1 - > 1 file changed, 1 deletion(-) > > diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h > index 16d8d12..b9ea262 100644 > --- a/fs/xfs/xfs_log_priv.h > +++ b/fs/xfs/xfs_log_priv.h > @@ -468,7 +468,6 @@ struct xfs_cil { > * threshold, yet give us plenty of space for aggregation on large logs. > */ > #define XLOG_CIL_SPACE_LIMIT(log) (log->l_logsize>> 3) > -#define XLOG_CIL_HARD_SPACE_LIMIT(log) (3 * (log->l_logsize>> 4)) > > /* > * ticket grant locks, queues and accounting have their own cachlines Removed in commit: commit 4c2d542f2e786537db33b613d5199dc6d69a96da Author: Dave Chinner Date: Mon Apr 23 17:54:32 2012 +1000 xfs: Do background CIL flushes via a workqueue Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Mon Apr 8 16:47:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C8D767F74 for ; Mon, 8 Apr 2013 16:47:59 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6772F304043; Mon, 8 Apr 2013 14:47:56 -0700 (PDT) Message-ID: <51633B0E.4010602@sgi.com> Date: Mon, 08 Apr 2013 16:47:58 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu CC: Dave Chinner , "Michael L. Semon" , "xfs@oss.sgi.com" Subject: Re: [PATCH v2] xfs: fix assertion failure in xfs_vm_write_failed() References: <51469C90.1000001@oracle.com> <20130318233026.GS6369@dastard> <514800DB.5070306@oracle.com> <20130319192322.GB6369@dastard> <51491C5C.4040102@oracle.com> In-Reply-To: <51491C5C.4040102@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit >> >> Reviewed-by: Dave Chinner > > Thanks Dave for correcting me with detailed comments, the revised patch was shown as following. > > Regards, > -Jeff > > > In xfs_vm_write_failed(), we evaluate the block_offset of pos with PAGE_MASK > which is an unsigned long. That is fine on 64-bit platforms regardless of > whether the request pos is 32-bit or 64-bit. However, on 32-bit platforms > the value is 0xfffff000 and so the high 32 bits in it will be masked off with > (pos& PAGE_MASK) for a 64-bit pos. As a result, the evaluated block_offset is > incorrect which will cause this failure ASSERT(block_offset + from == pos); and > potentially pass the wrong block to xfs_vm_kill_delalloc_range(). > > In this case, we can get the following kernel Panic if the CONFIG_XFS_DEBUG is enabled: > > [ 68.700573] XFS: Assertion failed: block_offset + from == pos, file: fs/xfs/xfs_aops.c, line: 1504 > [ 68.700656] ------------[ cut here ]------------ > [ 68.700692] kernel BUG at fs/xfs/xfs_message.c:100! > [ 68.700742] invalid opcode: 0000 [#1] SMP > ........ > [ 68.701678] Pid: 4057, comm: mkfs.xfs Tainted: G O 3.9.0-rc2 #1 > [ 68.701722] EIP: 0060:[] EFLAGS: 00010282 CPU: 0 > [ 68.701783] EIP is at assfail+0x2b/0x30 [xfs] > [ 68.701819] EAX: 00000056 EBX: f6ef28a0 ECX: 00000007 EDX: f57d22a4 > [ 68.701852] ESI: 1c2fb000 EDI: 00000000 EBP: ea6b5d30 ESP: ea6b5d1c > [ 68.701895] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 > [ 68.701934] CR0: 8005003b CR2: 094f3ff4 CR3: 2bcb4000 CR4: 000006f0 > [ 68.701970] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 > [ 68.702011] DR6: ffff0ff0 DR7: 00000400 > [ 68.702046] Process mkfs.xfs (pid: 4057, ti=ea6b4000 task=ea5799e0 task.ti=ea6b4000) > [ 68.702086] Stack: > [ 68.702124] 00000000 f9525c48 f951fa80 f951f96b 000005e4 ea6b5d7c f9494b34 c19b0ea2 > [ 68.702445] 00000066 f3d6c620 c19b0ea2 00000000 e9a91458 00001000 00000000 00000000 > [ 68.702868] 00000000 c15c7e89 00000000 1c2fb000 00000000 00000000 1c2fb000 00000080 > [ 68.703192] Call Trace: > [ 68.703248] [] xfs_vm_write_failed+0x74/0x1b0 [xfs] > [ 68.703441] [] ? printk+0x4d/0x4f > [ 68.703496] [] xfs_vm_write_begin+0x10d/0x170 [xfs] > [ 68.703535] [] generic_file_buffered_write+0xdc/0x210 > [ 68.703583] [] xfs_file_buffered_aio_write+0xf9/0x190 [xfs] > [ 68.703629] [] xfs_file_aio_write+0xf3/0x160 [xfs] > [ 68.703668] [] do_sync_write+0x94/0xd0 > [ 68.703716] [] vfs_write+0x8f/0x160 > [ 68.703753] [] ? wait_on_retry_sync_kiocb+0x50/0x50 > [ 68.703794] [] sys_write+0x47/0x80 > [ 68.703830] [] sysenter_do_call+0x12/0x28 > ............. > [ 68.704203] EIP: [] assfail+0x2b/0x30 [xfs] SS:ESP 0068:ea6b5d1c > [ 68.706615] ---[ end trace cdd9af4f4ecab42f ]--- > [ 68.706687] Kernel panic - not syncing: Fatal exception > > 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. > > Thanks Dave Chinner for help finding and fixing this bug. > > Reported-by: Michael L. Semon > Reviewed-by: Dave Chinner > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_aops.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > Looks good. Reviewed-by: Mark Tinguely From david@fromorbit.com Mon Apr 8 18:07:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 651E67F4C for ; Mon, 8 Apr 2013 18:07:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 00466AC002 for ; Mon, 8 Apr 2013 16:07:37 -0700 (PDT) X-ASG-Debug-ID: 1365462456-04bdf0542b4431b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id QnrQSIIEBb4WLcZ2 for ; Mon, 08 Apr 2013 16:07:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Au0VACdNY1F5LPOF/2dsb2JhbABRgwaCd7lRhRoEAYELF3SCHwEBBAE6HCMFCwgDDgoJJQ8FJQMhE4gOBa1RkBwVjXGBHQeCYGEDlnORD4MdKg Received: from ppp121-44-243-133.lns20.syd7.internode.on.net (HELO dastard) ([121.44.243.133]) by ipmail06.adl6.internode.on.net with ESMTP; 09 Apr 2013 08:37:35 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UPL9y-00071O-2H; Tue, 09 Apr 2013 09:07:34 +1000 Date: Tue, 9 Apr 2013 09:07:34 +1000 From: Dave Chinner To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: xfstests should still make xfs as default? Message-ID: <20130408230733.GB17758@dastard> X-ASG-Orig-Subj: Re: xfstests should still make xfs as default? References: <20130327203231.GA26739@andromeda.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130327203231.GA26739@andromeda.usersys.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1365462456 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127577 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Wed, Mar 27, 2013 at 05:32:32PM -0300, Carlos Maiolino wrote: > Hi, working on xfstests after its new directory structures I noticed we should > use now something like: > > ./check xfs/ > > to run some tests, IMHO this is not intuitive and I was working on a patch to > make us able to use something just like the old way: > > ./check What do you do with duplicate test names? The main reason that the interface changed was to keep the changes to the test harness down to a minimum as it was just moving tests around. All that code needs to be revisited to support arbitrary test names, so there wasn't much point in doing a massive rework only to have to rework it again... But the question is: is the old way a sane way to specify tests in the brave new world? I'd much prefer that test specification is explict, and doesn't implicitly select tests. Indeed, if it implicitly selects tests (e.g. when there are duplicates it runs all duplicates) then we still need a method for running specific tests..... Note that what you are seeing is how the $have_test_arg code processes the test name. It requires that you tell it the directory so it knows where to look for the specific test. You could make it look in each test directory like get_group_list()/get_all_tests() do so we don't need to specify a directory. > But, since xfstests is becoming more generalist than xfs specific, I wonder if > we should still keep xfs as default. The default is whatever filesystem is on the $TEST_DEV, and I don't see that changing. i.e. what we set FSTYP to is the default. Note that get_group_list() and get_all_tests() specifically include the FSTYP directory, Cheers, Dave. -- Dave Chinner david@fromorbit.com From natalie@bestgoogleranking.com Mon Apr 8 19:38:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3B63B7F6D for ; Mon, 8 Apr 2013 19:38:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CA04AAC002 for ; Mon, 8 Apr 2013 17:38:48 -0700 (PDT) X-ASG-Debug-ID: 1365467922-04bdf0542d448570001-NocioJ Received: from pawan.saprock.com (mail.saprock.com [182.71.2.157]) by cuda.sgi.com with ESMTP id B9w0bfc8MgbVKNhl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 08 Apr 2013 17:38:45 -0700 (PDT) X-Barracuda-Envelope-From: natalie@bestgoogleranking.com X-Barracuda-Apparent-Source-IP: 182.71.2.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=bestgoogleranking.com; s=default; h=Content-Type:MIME-Version:Date:Subject:To:From; bh=IXFYMAbnEgGeLzvkevSYIP+v7nNFW5qN33sseqGO6Xw=; b=GOvZmSsQamBNTcFKlwxENNvkrWy5HeCreHX4NOGJTgdtcV6oD4p/G8YhaODZvGuWRa711fNY4Lt9O8/x1A3dfo+CcBJdd9vNEhzqipMNVHRXNytjgJ18O2vnGMBmoKtsqVfEzRS5B4ocOjXqDotk17zmnuo3Pf+/JRM8UY2V8Bc=; Received: from [180.215.180.219] (port=2612 helo=computer1) by pawan.saprock.com with esmtpa (Exim 4.80) (envelope-from ) id 1UPFDz-00026Z-6Q for xfs@oss.sgi.com; Mon, 08 Apr 2013 22:17:20 +0530 From: To: Subject: 1st Page Google Ranking Date: Mon, 8 Apr 2013 10:10:26 -0700 X-ASG-Orig-Subj: 1st Page Google Ranking MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_09D3_01CE3442.2711B1C0" X-Mailer: Microsoft Office Outlook, Build 11.0.5510 Thread-Index: Ac40e8jzTwyAXWYIRzW+Q+oWSXGB8g== X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - pawan.saprock.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - bestgoogleranking.com X-Get-Message-Sender-Via: pawan.saprock.com: authenticated_id: natalie@bestgoogleranking.com X-Barracuda-Connect: mail.saprock.com[182.71.2.157] X-Barracuda-Start-Time: 1365467924 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.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=BSF_SC5_SA210e, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MISSING_MID, NO_REAL_NAME, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127583 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 NO_REAL_NAME From: does not include a real name -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC5_SA210e Custom Rule SA210e Message-Id: <20130409003848.0A919A4211C@cuda.sgi.com> This is a multi-part message in MIME format. ------=_NextPart_000_09D3_01CE3442.2711B1C0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, Hope you are well. I am Marketing Manager with a reputable Internet marketing company. I was surfing through your website and realized that despite having a good design; it was not ranking on any of the search engines for most of the keywords pertaining to your domain. I was wondering if you would be interested in getting the Search Engine Optimization (SEO) done for your website. Let me know if you are interested, I would happy to send you our company & price details etc. I look forward to your mail. Yours sincerely, Natalie Marketing Manager Online Sales Department Email: natalie@bestgoogleranking.com Disclaimer: The CAN-SPAM Act of 2003 (Controlling the Assault of Non-Solicited Pornography and Marketing Act) establishes requirements for those who send commercial email, spells out penalties for spammers and companies whose products are advertised in spam if they violate the law, and gives consumers the right to ask mailers to stop spamming them. The above mail is in accordance to the Can Spam act of 2003: There are no deceptive subject lines and is a manual process through our efforts on World Wide Web. You can opt out by sending mail to: fidoya@gmail.com and we ensure you will not receive any such mails. ------=_NextPart_000_09D3_01CE3442.2711B1C0 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hi,

 

Hope you are = well. I am Marketing Manager with a reputable Internet marketing = company.

 

I was = surfing through your website and realized that despite having a good design; it was not = ranking on any of the search engines for most of the keywords pertaining to your domain. I was wondering if you would be interested in getting the Search = Engine Optimization (SEO) done for your website.

 

Let me know if you are interested, I would happy to send you our company & = price details etc…

 

I look forward to your mail.

 

Yours = sincerely,

Natalie =

Marketing = Manager

Online Sales Department

Email:= natalie@bestgoogleranking.c= om =             &= nbsp;  

 

 

Disclaimer: The CAN-SPAM Act of 2003 (Controlling the Assault = of Non-Solicited Pornography and Marketing Act) establishes requirements = for those who send commercial email, spells out penalties for spammers and = companies whose products are advertised in spam if they violate the law, and gives consumers the right to ask mailers to stop spamming them. The above mail = is in accordance to the Can Spam act of 2003: There are no deceptive subject = lines and is a manual process through our efforts on World Wide = Web.

You can opt = out by sending mail to: fidoya@gmail.com  and we ensure you = will not receive any such mails.

------=_NextPart_000_09D3_01CE3442.2711B1C0-- From eguan@redhat.com Tue Apr 9 00:29:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7A9C27F7E for ; Tue, 9 Apr 2013 00:29:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5A069304059 for ; Mon, 8 Apr 2013 22:29:20 -0700 (PDT) X-ASG-Debug-ID: 1365485359-04cb6c1e7a468d40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Q9soNCzVglGQ5yUY; Mon, 08 Apr 2013 22:29:19 -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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r395THwR009776 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 9 Apr 2013 01:29:17 -0400 Received: from localhost (dhcp12-135.nay.redhat.com [10.66.12.135] (may be forged)) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r395TEsh015679; Tue, 9 Apr 2013 01:29:16 -0400 Date: Tue, 9 Apr 2013 13:29:13 +0800 From: Eryu Guan To: Rich Johnston Cc: zhaohongjiang@huawei.com, xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups Message-ID: <20130409052913.GF2453@eguan-t400.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups References: <1365331147-15179-1-git-send-email-eguan@redhat.com> <1365331147-15179-3-git-send-email-eguan@redhat.com> <5162CE93.7010301@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5162CE93.7010301@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1365485359 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Apr 08, 2013 at 09:05:07AM -0500, Rich Johnston wrote: > Hi Eryu, > > Thanks for this cleanup patch. I was going to revert patch > "bbaf78c0" which introduced test generic/310 but will wait and see > if Zhao will provide more information which could be added to this > patch. Make sense, thanks for the review. > > > On 04/07/2013 05:39 AM, Eryu Guan wrote: > >1. add one space between # and test description > > The rest of the changes look good, sorry I missed them when I reviewed ;). > > >2. remove creator/owner info > >3. fix common/rc and common/filter path so they can be sourced correctly > >4. no need to remove $seq.full cause it's not used(or if verbose output > > is needed, $seqres.full should be used) > > > >Signed-off-by: Eryu Guan > >--- > > tests/generic/310 | 12 +++++------- > > 1 file changed, 5 insertions(+), 7 deletions(-) > > > >diff --git a/tests/generic/310 b/tests/generic/310 > >index ef51422..35baa23 100644 > >--- a/tests/generic/310 > >+++ b/tests/generic/310 > >@@ -1,8 +1,8 @@ > > #! /bin/bash > > # FS QA Test No. 310 > > # > >-#Check if there are two threads,one keeps calling read() or lseek(), and > >-#the other calling readdir(), both on the same directory fd. > >+# Check if there are two threads,one keeps calling read() or lseek(), and > >+# the other calling readdir(), both on the same directory fd. > > # > > Hi Zhao, > > I did see both threads running at the same time, but the more I look > at this, the more I am a loss as to what this test is doing. > > Will you expand this a little please. I should have asked for more > justification the first time I reviewed this. Please provide what > bug > this is testing or what failure/weakness this test exposes. If > there is a commit this is related to, please reference it. I didn't look into the test deeply but I found the test seems to run for hours on my 3.9-rc4 test box, not sure what goes wrong here. Thanks, Eryu > > Thanks > --Rich From zhaohongjiang37@gmail.com Tue Apr 9 01:17:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B4B7E7F6C for ; Tue, 9 Apr 2013 01:17:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A1F90304039 for ; Mon, 8 Apr 2013 23:17:14 -0700 (PDT) X-ASG-Debug-ID: 1365488230-04cb6c1e7846bf70001-NocioJ Received: from mail-pd0-f169.google.com (mail-pd0-f169.google.com [209.85.192.169]) by cuda.sgi.com with ESMTP id bBtwk0AHHswJCEXQ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 08 Apr 2013 23:17:10 -0700 (PDT) X-Barracuda-Envelope-From: zhaohongjiang37@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.169] Received: by mail-pd0-f169.google.com with SMTP id 10so3679170pdc.28 for ; Mon, 08 Apr 2013 23:17:10 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:content-type:content-transfer-encoding; bh=e3EU4f7C4o0QiixPlayB0G7+6TZGpry6QOMuu6cJ7z0=; b=STFaqjfQWW80DAogZeVzj0heA54LBkH3gVzEv/FwmZ0y19eJqVEpO2RvO6OyFwurwX seiSEhXVYAwfe3888gVMu6mfmCOVJAZi3NebWuR+ExAzWKCho1LPtQDt6zdN10sVlKg7 RI0jLDIHbgwEvbVxgW0HsGyCn8xkvT2oFtp35R36J+zL3n/ZQlYSEo79q01+/Pt860cf trch9C83cStbiSty/Ev6zPwQBaIrl/xCORUG3gw3SQql4NYXDGApU8P58Bakuijj3CB6 UWiLvPWfF2zvQGGHAX9NayYg7d4tlT0Dy7Gb2txLPt/dpviVBqL+il4SKks85nApnpmV pNyg== X-Received: by 10.66.6.231 with SMTP id e7mr23103669paa.218.1365488230177; Mon, 08 Apr 2013 23:17:10 -0700 (PDT) Received: from [192.168.204.180] ([218.17.215.175]) by mx.google.com with ESMTPS id ew5sm885569pbc.9.2013.04.08.23.17.06 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 08 Apr 2013 23:17:09 -0700 (PDT) Message-ID: <5163B257.4080809@gmail.com> Date: Tue, 09 Apr 2013 14:16:55 +0800 From: Zhao Hongjiang User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: rjohnston@sgi.com CC: eguan@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: Re: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pd0-f169.google.com[209.85.192.169] X-Barracuda-Start-Time: 1365488230 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 2013/4/8 22:05, Rich Johnston wrote: > Hi Eryu, > > Thanks for this cleanup patch. I was going to revert patch "bbaf78c0" which introduced test generic/310 but will wait and see if Zhao will provide more information which could be added to this patch. > > > On 04/07/2013 05:39 AM, Eryu Guan wrote: >> 1. add one space between # and test description > > The rest of the changes look good, sorry I missed them when I reviewed . > >> 2. remove creator/owner info >> 3. fix common/rc and common/filter path so they can be sourced correctly >> 4. no need to remove $seq.full cause it's not used(or if verbose output >> is needed, $seqres.full should be used) >> >> Signed-off-by: Eryu Guan >> --- >> tests/generic/310 | 12 +++++------- >> 1 file changed, 5 insertions(+), 7 deletions(-) >> >> diff --git a/tests/generic/310 b/tests/generic/310 >> index ef51422..35baa23 100644 >> --- a/tests/generic/310 >> +++ b/tests/generic/310 >> @@ -1,8 +1,8 @@ >> #! /bin/bash >> # FS QA Test No. 310 >> # >> -#Check if there are two threads,one keeps calling read() or lseek(), and >> -#the other calling readdir(), both on the same directory fd. >> +# Check if there are two threads,one keeps calling read() or lseek(), and >> +# the other calling readdir(), both on the same directory fd. >> # > > Hi Zhao, > > I did see both threads running at the same time, but the more I look at this, the more I am a loss as to what this test is doing. > > Will you expand this a little please. I should have asked for more justification the first time I reviewed this. Please provide what bug > this is testing or what failure/weakness this test exposes. If there is a commit this is related to, please reference it. > When I ran it on ext2, ext3 and ext4 which has dir_index feature disabled, I got something like this: EXT3-fs error (device loop1): ext3_readdir: bad entry in directory #34817: rec_len is \ smaller than minimal - offset=993, inode=0, rec_len=0, name_len=0 EXT3-fs error \ (device loop1): ext3_readdir: bad entry in directory #34817: rec_len is smaller than \ minimal - offset=1009, inode=0, rec_len=0, name_len=0 EXT3-fs error (device loop1): \ ext3_readdir: bad entry in directory #34817: rec_len is smaller than minimal - \ offset=993, inode=0, rec_len=0, name_len=0 EXT3-fs error (device loop1): \ ext3_readdir: bad entry in directory #34817: rec_len is smaller than minimal - \ offset=1009, inode=0, rec_len=0, name_len=0 ... If we configured errors=remount-ro, the filesystem will become read-only. And you can find more infomation in http://marc.info/?t=136123715300001&r=1&w=2 as i mentioned. If this message is needed i'll add it in the patch v2. Thanks --Zhao Hongjiang > Thanks > --Rich > > From david@fromorbit.com Tue Apr 9 01:40:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D1C797F86 for ; Tue, 9 Apr 2013 01:40:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4EF15AC004 for ; Mon, 8 Apr 2013 23:40:35 -0700 (PDT) X-ASG-Debug-ID: 1365489633-04cbb01fb744b8c0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id MF33UbQQwD0yM0Fm for ; Mon, 08 Apr 2013 23:40:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AggUAAu3Y1F5LPOF/2dsb2JhbABRgwaCeLldhRoEAYEQF3SCHwEBBTocIxAIAxgJJQ8FJQMhE4gTrW2QLxWNcIEdB4JgYQOWc5EOgx0q Received: from ppp121-44-243-133.lns20.syd7.internode.on.net (HELO dastard) ([121.44.243.133]) by ipmail06.adl2.internode.on.net with ESMTP; 09 Apr 2013 16:10:31 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UPSEI-0007lz-6a; Tue, 09 Apr 2013 16:40:30 +1000 Date: Tue, 9 Apr 2013 16:40:30 +1000 From: Dave Chinner To: Zhao Hongjiang Cc: rjohnston@sgi.com, eguan@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups Message-ID: <20130409064030.GF17758@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups References: <5163B257.4080809@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5163B257.4080809@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1365489633 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Tue, Apr 09, 2013 at 02:16:55PM +0800, Zhao Hongjiang wrote: > On 2013/4/8 22:05, Rich Johnston wrote: > > Hi Eryu, > > > > Thanks for this cleanup patch. I was going to revert patch "bbaf78c0" which introduced test generic/310 but will wait and see if Zhao will provide more information which could be added to this patch. > > > > > > On 04/07/2013 05:39 AM, Eryu Guan wrote: > >> 1. add one space between # and test description > > > > The rest of the changes look good, sorry I missed them when I reviewed . > > > >> 2. remove creator/owner info > >> 3. fix common/rc and common/filter path so they can be sourced correctly > >> 4. no need to remove $seq.full cause it's not used(or if verbose output > >> is needed, $seqres.full should be used) > >> > >> Signed-off-by: Eryu Guan > >> --- > >> tests/generic/310 | 12 +++++------- > >> 1 file changed, 5 insertions(+), 7 deletions(-) > >> > >> diff --git a/tests/generic/310 b/tests/generic/310 > >> index ef51422..35baa23 100644 > >> --- a/tests/generic/310 > >> +++ b/tests/generic/310 > >> @@ -1,8 +1,8 @@ > >> #! /bin/bash > >> # FS QA Test No. 310 > >> # > >> -#Check if there are two threads,one keeps calling read() or lseek(), and > >> -#the other calling readdir(), both on the same directory fd. > >> +# Check if there are two threads,one keeps calling read() or lseek(), and > >> +# the other calling readdir(), both on the same directory fd. > >> # > > > > Hi Zhao, > > > > I did see both threads running at the same time, but the more I > > look at this, the more I am a loss as to what this test is > > doing. > > > > Will you expand this a little please. I should have asked for > > more justification the first time I reviewed this. Please > > provide what bug this is testing or what failure/weakness this > > test exposes. If there is a commit this is related to, please > > reference it. > > > When I ran it on ext2, ext3 and ext4 which has dir_index feature > disabled, I got something like this: > > EXT3-fs error (device loop1): ext3_readdir: bad entry in directory > #34817: rec_len is \ smaller than minimal - offset=993, inode=0, > rec_len=0, name_len=0 EXT3-fs error \ (device loop1): > ext3_readdir: bad entry in directory #34817: rec_len is smaller > than \ minimal - offset=1009, inode=0, rec_len=0, name_len=0 > EXT3-fs error (device loop1): \ ext3_readdir: bad entry in > directory #34817: rec_len is smaller than minimal - \ offset=993, > inode=0, rec_len=0, name_len=0 EXT3-fs error (device loop1): \ > ext3_readdir: bad entry in directory #34817: rec_len is smaller > than minimal - \ offset=1009, inode=0, rec_len=0, name_len=0 ... > > If we configured errors=remount-ro, the filesystem will become > read-only. So what is the criteria for a test failure? The test body is only reading from the filesystem, so a ro,remount won't cause an obvious failure of the test. Perhaps the test should have more comments in it than "read this URL" to explain what it is doing and what constitutes a failure? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 9 01:50:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5B2637F8A for ; Tue, 9 Apr 2013 01:50:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 212AA8F8035 for ; Mon, 8 Apr 2013 23:50:04 -0700 (PDT) X-ASG-Debug-ID: 1365490200-04cbb01fba44c300001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id GkcdLDefVDf6gDlq for ; Mon, 08 Apr 2013 23:50:01 -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: AggUAF65Y1F5LPOF/2dsb2JhbABHCoMGgni5XoUaBAGBEBd0gh8BAQUnExwcFwgYDCUPBSUDNBmHeq1tkC8VjVEfgRISg0EDjAaHJoNHhnaKGIMdKoEwJA Received: from ppp121-44-243-133.lns20.syd7.internode.on.net (HELO dastard) ([121.44.243.133]) by ipmail06.adl2.internode.on.net with ESMTP; 09 Apr 2013 16:19:59 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UPSNS-0007n7-Nj for xfs@oss.sgi.com; Tue, 09 Apr 2013 16:49:58 +1000 Date: Tue, 9 Apr 2013 16:49:58 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH V2 23/22] xfs: add metadata CRC documentation Message-ID: <20130409064958.GG17758@dastard> X-ASG-Orig-Subj: [PATCH V2 23/22] xfs: add metadata CRC documentation References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <20130405070006.GJ12011@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130405070006.GJ12011@dastard> 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: 1365490200 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs: add metadata CRC documentation From: Dave Chinner Add some documentation about the self describing metadata and the code templates used to implement it. Signed-off-by: Dave Chinner --- V2: fix all the typos reported .../filesystems/xfs-self-describing-metadata.txt | 350 ++++++++++++++++++++ 1 file changed, 350 insertions(+) diff --git a/Documentation/filesystems/xfs-self-describing-metadata.txt b/Documentation/filesystems/xfs-self-describing-metadata.txt new file mode 100644 index 0000000..05aa455 --- /dev/null +++ b/Documentation/filesystems/xfs-self-describing-metadata.txt @@ -0,0 +1,350 @@ +XFS Self Describing Metadata +---------------------------- + +Introduction +------------ + +The largest scalability problem facing XFS is not one of algorithmic +scalability, but of verification of the filesystem structure. Scalabilty of the +structures and indexes on disk and the algorithms for iterating them are +adequate for supporting PB scale filesystems with billions of inodes, however it +is this very scalability that causes the verification problem. + +Almost all metadata on XFS is dynamically allocated. The only fixed location +metadata is the allocation group headers (SB, AGF, AGFL and AGI), while all +other metadata structures need to be discovered by walking the filesystem +structure in different ways. While this is already done by userspace tools for +validating and repairing the structure, there are limits to what they can +verify, and this in turn limits the supportable size of an XFS filesystem. + +For example, it is entirely possible to manually use xfs_db and a bit of +scripting to analyse the structure of a 100TB filesystem when trying to +determine the root cause of a corruption problem, but it is still mainly a +manual task of verifying that things like single bit errors or misplaced writes +weren't the ultimate cause of a corruption event. It may take a few hours to a +few days to perform such forensic analysis, so for at this scale root cause +analysis is entirely possible. + +However, if we scale the filesystem up to 1PB, we now have 10x as much metadata +to analyse and so that analysis blows out towards weeks/months of forensic work. +Most of the analysis work is slow and tedious, so as the amount of analysis goes +up, the more likely that the cause will be lost in the noise. Hence the primary +concern for supporting PB scale filesystems is minimising the time and effort +required for basic forensic analysis of the filesystem structure. + + +Self Describing Metadata +------------------------ + +One of the problems with the current metadata format is that apart from the +magic number in the metadata block, we have no other way of identifying what it +is supposed to be. We can't even identify if it is the right place. Put simply, +you can't look at a single metadata block in isolation and say "yes, it is +supposed to be there and the contents are valid". + +Hence most of the time spent on forensic analysis is spent doing basic +verification of metadata values, looking for values that are in range (and hence +not detected by automated verification checks) but are not correct. Finding and +understanding how things like cross linked block lists (e.g. sibling +pointers in a btree end up with loops in them) are the key to understanding what +went wrong, but it is impossible to tell what order the blocks were linked into +each other or written to disk after the fact. + +Hence we need to record more information into the metadata to allow us to +quickly determine if the metadata is intact and can be ignored for the purpose +of analysis. We can't protect against every possible type of error, but we can +ensure that common types of errors are easily detectable. Hence the concept of +self describing metadata. + +The first, fundamental requirement of self describing metadata is that the +metadata object contains some form of unique identifier in a well known +location. This allows us to identify the expected contents of the block and +hence parse and verify the metadata object. IF we can't independently identify +the type of metadata in the object, then the metadata doesn't describe itself +very well at all! + +Luckily, almost all XFS metadata has magic numbers embedded already - only the +AGFL, remote symlinks and remote attribute blocks do not contain identifying +magic numbers. Hence we can change the on-disk format of all these objects to +add more identifying information and detect this simply by changing the magic +numbers in the metadata objects. That is, if it has the current magic number, +the metadata isn't self identifying. If it contains a new magic number, it is +self identifying and we can do much more expansive automated verification of the +metadata object at runtime, during forensic analysis or repair. + +As a primary concern, self describing metadata needs some form of overall +integrity checking. We cannot trust the metadata if we cannot verify that it has +not been changed as a result of external influences. Hence we need some form of +integrity check, and this is done by adding CRC32c validation to the metadata +block. If we can verify the block contains the metadata it was intended to +contain, a large amount of the manual verification work can be skipped. + +CRC32c was selected as metadata cannot be more than 64k in length in XFS and +hence a 32 bit CRC is more than sufficient to detect multi-bit errors in +metadata blocks. CRC32c is also now hardware accelerated on common CPUs so it is +fast. So while CRC32c is not the strongest of possible integrity checks that +could be used, it is more than sufficient for our needs and has relatively +little overhead. Adding support for larger integrity fields and/or algorithms +does really provide any extra value over CRC32c, but it does add a lot of +complexity and so there is no provision for changing the integrity checking +mechanism. + +Self describing metadata needs to contain enough information so that the +metadata block can be verified as being in the correct place without needing to +look at any other metadata. This means it needs to contain location information. +Just adding a block number to the metadata is not sufficient to protect against +mis-directed writes - a write might be misdirected to the wrong LUN and so be +written to the "correct block" of the wrong filesystem. Hence location +information must contain a filesystem identifier as well as a block number. + +Another key information point in forensic analysis is knowing who the metadata +block belongs to. We already know the type, the location, that it is valid +and/or corrupted, and how long ago that it was last modified. Knowing the owner +of the block is important as it allows us to find other related metadata to +determine the scope of the corruption. For example, if we have a extent btree +object, we don't know what inode it belongs to and hence have to walk the entire +filesystem to find the owner of the block. Worse, the corruption could mean that +no owner can be found (i.e. it's an orphan block), and so without an owner field +in the metadata we have no idea of the scope of the corruption. If we have an +owner field in the metadata object, we can immediately do top down validation to +determine the scope of the problem. + +Different types of metadata have different owner identifiers. For example, +directory, attribute and extent tree blocks are all owned by an inode, whilst +freespace btree blocks are owned by an allocation group. Hence the size and +contents of the owner field are determined by the type of metadata object we are +looking at. The owner information can also identify misplaced writes (e.g. +freespace btree block written to the wrong AG). + +Self describing metadata also needs to contain some indication of when it was +written to the filesystem. One of the key information points when doing forensic +analysis is how recently the block was modified. Correlation of set of corrupted +metadata blocks based on modification times is important as it can indicate +whether the corruptions are related, whether there's been multiple corruption +events that lead to the eventual failure, and even whether there are corruptions +present that the run-time verification is not detecting. + +For example, we can determine whether a metadata object is supposed to be free +space or still allocated if it is still referenced by its owner by looking at +when the free space btree block that contains the block was last written +compared to when the metadata object itself was last written. If the free space +block is more recent than the object and the object's owner, then there is a +very good chance that the block should have been removed from the owner. + +To provide this "written timestamp", each metadata block gets the Log Sequence +Number (LSN) of the most recent transaction it was modified on written into it. +This number will always increase over the life of the filesystem, and the only +thing that resets it is running xfs_repair on the filesystem. Further, by use of +the LSN we can tell if the corrupted metadata all belonged to the same log +checkpoint and hence have some idea of how much modification occurred between +the first and last instance of corrupt metadata on disk and, further, how much +modification occurred between the corruption being written and when it was +detected. + +Runtime Validation +------------------ + +Validation of self-describing metadata takes place at runtime in two places: + + - immediately after a successful read from disk + - immediately prior to write IO submission + +The verification is completely stateless - it is done independently of the +modification process, and seeks only to check that the metadata is what it says +it is and that the metadata fields are within bounds and internally consistent. +As such, we cannot catch all types of corruption that can occur within a block +as there may be certain limitations that operational state enforces of the +metadata, or there may be corruption of interblock relationships (e.g. corrupted +sibling pointer lists). Hence we still need stateful checking in the main code +body, but in general most of the per-field validation is handled by the +verifiers. + +For read verification, the caller needs to specify the expected type of metadata +that it should see, and the IO completion process verifies that the metadata +object matches what was expected. If the verification process fails, then it +marks the object being read as EFSCORRUPTED. The caller needs to catch this +error (same as for IO errors), and if it needs to take special action due to a +verification error it can do so by catching the EFSCORRUPTED error value. If we +need more discrimination of error type at higher levels, we can define new +error numbers for different errors as necessary. + +The first step in read verification is checking the magic number and determining +whether CRC validating is necessary. If it is, the CRC32c is calculated and +compared against the value stored in the object itself. Once this is validated, +further checks are made against the location information, followed by extensive +object specific metadata validation. If any of these checks fail, then the +buffer is considered corrupt and the EFSCORRUPTED error is set appropriately. + +Write verification is the opposite of the read verification - first the object +is extensively verified and if it is OK we then update the LSN from the last +modification made to the object, After this, we calculate the CRC and insert it +into the object. Once this is done the write IO is allowed to continue. If any +error occurs during this process, the buffer is again marked with a EFSCORRUPTED +error for the higher layers to catch. + +Structures +---------- + +A typical on-disk structure needs to contain the following information: + +struct xfs_ondisk_hdr { + __be32 magic; /* magic number */ + __be32 crc; /* CRC, not logged */ + uuid_t uuid; /* filesystem identifier */ + __be64 owner; /* parent object */ + __be64 blkno; /* location on disk */ + __be64 lsn; /* last modification in log, not logged */ +}; + +Depending on the metadata, this information may be part of a header structure +separate to the metadata contents, or may be distributed through an existing +structure. The latter occurs with metadata that already contains some of this +information, such as the superblock and AG headers. + +Other metadata may have different formats for the information, but the same +level of information is generally provided. For example: + + - short btree blocks have a 32 bit owner (ag number) and a 32 bit block + number for location. The two of these combined provide the same + information as @owner and @blkno in eh above structure, but using 8 + bytes less space on disk. + + - directory/attribute node blocks have a 16 bit magic number, and the + header that contains the magic number has other information in it as + well. hence the additional metadata headers change the overall format + of the metadata. + +A typical buffer read verifier is structured as follows: + +#define XFS_FOO_CRC_OFF offsetof(struct xfs_ondisk_hdr, crc) + +static void +xfs_foo_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_FOO_CRC_OFF)) || + !xfs_foo_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +The code ensures that the CRC is only checked if the filesystem has CRCs enabled +by checking the superblock of the feature bit, and then if the CRC verifies OK +(or is not needed) it verifies the actual contents of the block. + +The verifier function will take a couple of different forms, depending on +whether the magic number can be used to determine the format of the block. In +the case it can't, the code is structured as follows: + +static bool +xfs_foo_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_ondisk_hdr *hdr = bp->b_addr; + + if (hdr->magic != cpu_to_be32(XFS_FOO_MAGIC)) + return false; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) { + if (!uuid_equal(&hdr->uuid, &mp->m_sb.sb_uuid)) + return false; + if (bp->b_bn != be64_to_cpu(hdr->blkno)) + return false; + if (hdr->owner == 0) + return false; + } + + /* object specific verification checks here */ + + return true; +} + +If there are different magic numbers for the different formats, the verifier +will look like: + +static bool +xfs_foo_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_ondisk_hdr *hdr = bp->b_addr; + + if (hdr->magic == cpu_to_be32(XFS_FOO_CRC_MAGIC)) { + if (!uuid_equal(&hdr->uuid, &mp->m_sb.sb_uuid)) + return false; + if (bp->b_bn != be64_to_cpu(hdr->blkno)) + return false; + if (hdr->owner == 0) + return false; + } else if (hdr->magic != cpu_to_be32(XFS_FOO_MAGIC)) + return false; + + /* object specific verification checks here */ + + return true; +} + +Write verifiers are very similar to the read verifiers, they just do things in +the opposite order to the read verifiers. A typical write verifier: + +static void +xfs_foo_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + if (!xfs_foo_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + + if (bip) { + struct xfs_ondisk_hdr *hdr = bp->b_addr; + hdr->lsn = cpu_to_be64(bip->bli_item.li_lsn); + } + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_FOO_CRC_OFF); +} + +This will verify the internal structure of the metadata before we go any +further, detecting corruptions that have occurred as the metadata has been +modified in memory. If the metadata verifies OK, and CRCs are enabled, we then +update the LSN field (when it was last modified) and calculate the CRC on the +metadata. Once this is done, we can issue the IO. + +Inodes and Dquots +----------------- + +Inodes and dquots are special snowflakes. They have per-object CRC and +self-identifiers, but they are packed so that there are multiple objects per +buffer. Hence we do not use per-buffer verifiers to do the work of per-object +verification and CRC calculations. The per-buffer verifiers simply perform basic +identification of the buffer - that they contain inodes or dquots, and that +there are magic numbers in all the expected spots. All further CRC and +verification checks are done when each inode is read from or written back to the +buffer. + +The structure of the verifiers and the identifiers checks is very similar to the +buffer code described above. The only difference is where they are called. For +example, inode read verification is done in xfs_iread() when the inode is first +read out of the buffer and the struct xfs_inode is instantiated. The inode is +already extensively verified during writeback in xfs_iflush_int, so the only +addition here is to add the LSN and CRC to the inode as it is copied back into +the buffer. + +XXX: inode unlinked list modification doesn't recalculate the inode CRC! None of +the unlinked list modifications check or update CRCs, neither during unlink nor +log recovery. So, it's gone unnoticed until now. This won't matter immediately - +repair will probably complain about it - but it needs to be fixed. + From david@fromorbit.com Tue Apr 9 01:55:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 733867F8D for ; Tue, 9 Apr 2013 01:55:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4939E8F804B for ; Mon, 8 Apr 2013 23:55:22 -0700 (PDT) X-ASG-Debug-ID: 1365490520-04bdf0542a462810001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id fRwfSiUZyv4A7qhI for ; Mon, 08 Apr 2013 23:55:20 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AggUAKe6Y1F5LPOF/2dsb2JhbABRgwaCeLlehRoEAYEQF3SCHwEBBTocIxAIAw4KCSUPBSUDIROIE61vkC8VjXCBHQeDQQOWc5EOgVWBSCo Received: from ppp121-44-243-133.lns20.syd7.internode.on.net (HELO dastard) ([121.44.243.133]) by ipmail06.adl2.internode.on.net with ESMTP; 09 Apr 2013 16:25:19 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UPSSd-0007oG-Cg; Tue, 09 Apr 2013 16:55:19 +1000 Date: Tue, 9 Apr 2013 16:55:19 +1000 From: Dave Chinner To: Phillip Susi Cc: Jens Axboe , CAI Qian , xfs@oss.sgi.com, LKML Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Message-ID: <20130409065519.GH17758@dastard> X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] References: <20130402070537.GP6369@dastard> <20130402071937.GC3670@kernel.dk> <20130402073035.GD3670@kernel.dk> <14055702.547701.1364891947331.JavaMail.root@redhat.com> <20130402090047.GF3670@kernel.dk> <985125161.581860.1364895066584.JavaMail.root@redhat.com> <20130402094834.GA4667@kernel.dk> <20130403114142.GP4667@kernel.dk> <515C4D9D.10103@ubuntu.com> <515DE2FE.1080201@ubuntu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <515DE2FE.1080201@ubuntu.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: 1365490520 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 04, 2013 at 04:30:54PM -0400, Phillip Susi wrote: > > I have not tested it yet, but I am pretty sure it won't work. It > > looks like the patch changes the BLKRRPART path to go ahead and remove > > existing partitions when GENHD_FL_NO_PARTSCAN is set. loop doesn't > > issue the BLKRRPART ioctl when !LO_FLAGS_PARTSCAN so this won't help. > > I think loop needs to set GENHD_FL_NO_PARTSCAN and then issue the > > ioctl regardless of the LO_FLAGS_PARTSCAN flag to get the partitions > > to be removed. I will try to test tonight. > > After testing, my initial thoughts appeared to have been correct. I had > to modify the patch as follows. To test, simply do: > > truncate -s 10m img > losetup /dev/loop0 img > parted /dev/loop0 > mklabel msdos > mkpart primary ext2 1m 2m > quit > ls /dev/loop0* > > Note the /dev/loop0p1 node. Run losetup -d /dev/loop0 and see if it is > still there. Jens, can we get one of these fixes merged quickly? xfstests is unusable on any kernel more recent than 3.9-rc4 because of these problems.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From axboe@kernel.dk Tue Apr 9 02:02:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 66B8E7F92 for ; Tue, 9 Apr 2013 02:02:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0A990AC003 for ; Tue, 9 Apr 2013 00:02:00 -0700 (PDT) X-ASG-Debug-ID: 1365490919-04bdf0542d4632d0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id ZArRnsG4uoaNxnpF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 09 Apr 2013 00:02:00 -0700 (PDT) X-Barracuda-Envelope-From: axboe@kernel.dk X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from kernel.dk ([54.225.238.116]) by bombadil.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1UPSZ3-0004DG-HO; Tue, 09 Apr 2013 07:01:57 +0000 Received: from localhost (87-104-106-3-dynamic-customer.profibernet.dk [87.104.106.3]) by kernel.dk (Postfix) with ESMTPA id BD569206DC; Tue, 9 Apr 2013 07:01:55 +0000 (UTC) Date: Tue, 9 Apr 2013 09:01:39 +0200 From: Jens Axboe To: Dave Chinner Cc: Phillip Susi , CAI Qian , xfs@oss.sgi.com, LKML Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Message-ID: <20130409070139.GS12244@kernel.dk> X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] References: <20130402071937.GC3670@kernel.dk> <20130402073035.GD3670@kernel.dk> <14055702.547701.1364891947331.JavaMail.root@redhat.com> <20130402090047.GF3670@kernel.dk> <985125161.581860.1364895066584.JavaMail.root@redhat.com> <20130402094834.GA4667@kernel.dk> <20130403114142.GP4667@kernel.dk> <515C4D9D.10103@ubuntu.com> <515DE2FE.1080201@ubuntu.com> <20130409065519.GH17758@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130409065519.GH17758@dastard> X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1365490919 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Tue, Apr 09 2013, Dave Chinner wrote: > On Thu, Apr 04, 2013 at 04:30:54PM -0400, Phillip Susi wrote: > > > I have not tested it yet, but I am pretty sure it won't work. It > > > looks like the patch changes the BLKRRPART path to go ahead and remove > > > existing partitions when GENHD_FL_NO_PARTSCAN is set. loop doesn't > > > issue the BLKRRPART ioctl when !LO_FLAGS_PARTSCAN so this won't help. > > > I think loop needs to set GENHD_FL_NO_PARTSCAN and then issue the > > > ioctl regardless of the LO_FLAGS_PARTSCAN flag to get the partitions > > > to be removed. I will try to test tonight. > > > > After testing, my initial thoughts appeared to have been correct. I had > > to modify the patch as follows. To test, simply do: > > > > truncate -s 10m img > > losetup /dev/loop0 img > > parted /dev/loop0 > > mklabel msdos > > mkpart primary ext2 1m 2m > > quit > > ls /dev/loop0* > > > > Note the /dev/loop0p1 node. Run losetup -d /dev/loop0 and see if it is > > still there. > > Jens, can we get one of these fixes merged quickly? xfstests is > unusable on any kernel more recent than 3.9-rc4 because of these > problems.... Yep, did the revert yesterday and it's going out today. -- Jens Axboe From david@fromorbit.com Tue Apr 9 02:08:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B50FA7F93 for ; Tue, 9 Apr 2013 02:08:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F279304053 for ; Tue, 9 Apr 2013 00:08:50 -0700 (PDT) X-ASG-Debug-ID: 1365491328-04bdf0542d463c60001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id E6lz5DWbDOdak2Ag for ; Tue, 09 Apr 2013 00:08:48 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AggUABq+Y1F5LPOF/2dsb2JhbABRgwaCeLlehRoEAYEQF3SCHwEBBTocIxAIAxgJJQ8FJQMhE4gTrXOQLxWNcIEdB4NBA5ZzkQ6BVYFIKg Received: from ppp121-44-243-133.lns20.syd7.internode.on.net (HELO dastard) ([121.44.243.133]) by ipmail06.adl2.internode.on.net with ESMTP; 09 Apr 2013 16:38:33 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UPSfQ-0007pp-JV; Tue, 09 Apr 2013 17:08:32 +1000 Date: Tue, 9 Apr 2013 17:08:32 +1000 From: Dave Chinner To: Jens Axboe Cc: Phillip Susi , CAI Qian , xfs@oss.sgi.com, LKML Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Message-ID: <20130409070832.GI17758@dastard> X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] References: <20130402073035.GD3670@kernel.dk> <14055702.547701.1364891947331.JavaMail.root@redhat.com> <20130402090047.GF3670@kernel.dk> <985125161.581860.1364895066584.JavaMail.root@redhat.com> <20130402094834.GA4667@kernel.dk> <20130403114142.GP4667@kernel.dk> <515C4D9D.10103@ubuntu.com> <515DE2FE.1080201@ubuntu.com> <20130409065519.GH17758@dastard> <20130409070139.GS12244@kernel.dk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130409070139.GS12244@kernel.dk> 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: 1365491328 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 09, 2013 at 09:01:39AM +0200, Jens Axboe wrote: > On Tue, Apr 09 2013, Dave Chinner wrote: > > On Thu, Apr 04, 2013 at 04:30:54PM -0400, Phillip Susi wrote: > > > > I have not tested it yet, but I am pretty sure it won't work. It > > > > looks like the patch changes the BLKRRPART path to go ahead and remove > > > > existing partitions when GENHD_FL_NO_PARTSCAN is set. loop doesn't > > > > issue the BLKRRPART ioctl when !LO_FLAGS_PARTSCAN so this won't help. > > > > I think loop needs to set GENHD_FL_NO_PARTSCAN and then issue the > > > > ioctl regardless of the LO_FLAGS_PARTSCAN flag to get the partitions > > > > to be removed. I will try to test tonight. > > > > > > After testing, my initial thoughts appeared to have been correct. I had > > > to modify the patch as follows. To test, simply do: > > > > > > truncate -s 10m img > > > losetup /dev/loop0 img > > > parted /dev/loop0 > > > mklabel msdos > > > mkpart primary ext2 1m 2m > > > quit > > > ls /dev/loop0* > > > > > > Note the /dev/loop0p1 node. Run losetup -d /dev/loop0 and see if it is > > > still there. > > > > Jens, can we get one of these fixes merged quickly? xfstests is > > unusable on any kernel more recent than 3.9-rc4 because of these > > problems.... > > Yep, did the revert yesterday and it's going out today. Great, I didn't see an update in the latest -rc, so I wanted to make sure it hadn't fallen through he cracks.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From zhaohongjiang37@gmail.com Tue Apr 9 02:26:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1BCEF29DFE for ; Tue, 9 Apr 2013 02:26:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E4A13304053 for ; Tue, 9 Apr 2013 00:26:27 -0700 (PDT) X-ASG-Debug-ID: 1365492386-04cbb01fb844e790001-NocioJ Received: from mail-pa0-f45.google.com (mail-pa0-f45.google.com [209.85.220.45]) by cuda.sgi.com with ESMTP id yATFo0hMzOYY0BnT (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 00:26:26 -0700 (PDT) X-Barracuda-Envelope-From: zhaohongjiang37@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.45 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.45] Received: by mail-pa0-f45.google.com with SMTP id kl13so3692694pab.18 for ; Tue, 09 Apr 2013 00:26:26 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.45] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.45] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=rRQcRQ5gpWZhXsLwNF8VccZO5jGozNA0ntzlcV5ylO0=; b=wIFthqX6IvD5Q2B1CXNmGF7nQRjqqBOT2DZZBXtLH9NvI/VN7Ns9u09Q1WGsKu9XZq xNaGzOCEH42sGkhGIFcJep4E2CWfVEVNqKKMc0NRKS5K+tyMV4zRfUASDl7EHfB8NaKm W1GMOyIYO3s3T1enzfgrfdv4/W6UaLO6Qje3q5qmE2A9OtABA8IButHvzYF1zg1edBbE E6Qh7jVKR+v47iGigXdRFlxxG/wLeJXc+RHG67ILdHev0rgrEenrLuLcf+zn9ePDmljE z0oPSdgGnp1kTREmljprT6kWYXhRRIFoYfxTSxym+ZYF9PB+HrSq4YRgeqhcbznK4iy7 iXlg== X-Received: by 10.68.197.67 with SMTP id is3mr1114935pbc.104.1365492386235; Tue, 09 Apr 2013 00:26:26 -0700 (PDT) Received: from [192.168.204.180] ([218.17.215.175]) by mx.google.com with ESMTPS id ew5sm1118383pbc.9.2013.04.09.00.26.19 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 09 Apr 2013 00:26:25 -0700 (PDT) Message-ID: <5163C27D.8000101@gmail.com> Date: Tue, 09 Apr 2013 15:25:49 +0800 From: Zhao Hongjiang User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: rjohnston@sgi.com, eguan@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups References: <5163B257.4080809@gmail.com> <20130409064030.GF17758@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups In-Reply-To: <20130409064030.GF17758@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pa0-f45.google.com[209.85.220.45] X-Barracuda-Start-Time: 1365492386 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127611 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 2013-4-9 14:40, Dave Chinner wrote: > On Tue, Apr 09, 2013 at 02:16:55PM +0800, Zhao Hongjiang wrote: >> On 2013/4/8 22:05, Rich Johnston wrote: >>> Hi Eryu, >>> >>> Thanks for this cleanup patch. I was going to revert patch "bbaf78c0" which introduced test generic/310 but will wait and see if Zhao will provide more information which could be added to this patch. >>> >>> >>> On 04/07/2013 05:39 AM, Eryu Guan wrote: >>>> 1. add one space between # and test description >>> >>> The rest of the changes look good, sorry I missed them when I reviewed . >>> >>>> 2. remove creator/owner info >>>> 3. fix common/rc and common/filter path so they can be sourced correctly >>>> 4. no need to remove $seq.full cause it's not used(or if verbose output >>>> is needed, $seqres.full should be used) >>>> >>>> Signed-off-by: Eryu Guan >>>> --- >>>> tests/generic/310 | 12 +++++------- >>>> 1 file changed, 5 insertions(+), 7 deletions(-) >>>> >>>> diff --git a/tests/generic/310 b/tests/generic/310 >>>> index ef51422..35baa23 100644 >>>> --- a/tests/generic/310 >>>> +++ b/tests/generic/310 >>>> @@ -1,8 +1,8 @@ >>>> #! /bin/bash >>>> # FS QA Test No. 310 >>>> # >>>> -#Check if there are two threads,one keeps calling read() or lseek(), and >>>> -#the other calling readdir(), both on the same directory fd. >>>> +# Check if there are two threads,one keeps calling read() or lseek(), and >>>> +# the other calling readdir(), both on the same directory fd. >>>> # >>> >>> Hi Zhao, >>> >>> I did see both threads running at the same time, but the more I >>> look at this, the more I am a loss as to what this test is >>> doing. >>> >>> Will you expand this a little please. I should have asked for >>> more justification the first time I reviewed this. Please >>> provide what bug this is testing or what failure/weakness this >>> test exposes. If there is a commit this is related to, please >>> reference it. >>> >> When I ran it on ext2, ext3 and ext4 which has dir_index feature >> disabled, I got something like this: >> >> EXT3-fs error (device loop1): ext3_readdir: bad entry in directory >> #34817: rec_len is \ smaller than minimal - offset=993, inode=0, >> rec_len=0, name_len=0 EXT3-fs error \ (device loop1): >> ext3_readdir: bad entry in directory #34817: rec_len is smaller >> than \ minimal - offset=1009, inode=0, rec_len=0, name_len=0 >> EXT3-fs error (device loop1): \ ext3_readdir: bad entry in >> directory #34817: rec_len is smaller than minimal - \ offset=993, >> inode=0, rec_len=0, name_len=0 EXT3-fs error (device loop1): \ >> ext3_readdir: bad entry in directory #34817: rec_len is smaller >> than minimal - \ offset=1009, inode=0, rec_len=0, name_len=0 ... >> >> If we configured errors=remount-ro, the filesystem will become >> read-only. > > So what is the criteria for a test failure? The test body is only > reading from the filesystem, so a ro,remount won't cause an obvious > failure of the test. There haven't a obvious criteria for a test failure, you should see it from dmesg while you run the test. > > Perhaps the test should have more comments in it than "read this > URL" to explain what it is doing and what constitutes a failure? Yes, i'll add more comments to explain it! Thanks, Zhao Hongjiang > > Cheers, > > Dave. > From david@fromorbit.com Tue Apr 9 02:33:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 819FC7F9B for ; Tue, 9 Apr 2013 02:33:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 080C8AC002 for ; Tue, 9 Apr 2013 00:33:40 -0700 (PDT) X-ASG-Debug-ID: 1365492819-04cb6c1e774713a0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id WXeI7mqpeic0vRkA for ; Tue, 09 Apr 2013 00:33:39 -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: AgcUALzDY1F5LPOF/2dsb2JhbABRgwaCeLlfhRoEAYEQF3SCHwEBBScTHDMIGAwlDwUNGAM0iAIDDq1qhkYNiV0VjDqBIxOBJBaDKwOVE4FgiXaBfYUbgx0qgS8 Received: from ppp121-44-243-133.lns20.syd7.internode.on.net (HELO dastard) ([121.44.243.133]) by ipmail06.adl2.internode.on.net with ESMTP; 09 Apr 2013 17:03:23 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UPT3S-0007tV-7X for xfs@oss.sgi.com; Tue, 09 Apr 2013 17:33:22 +1000 Date: Tue, 9 Apr 2013 17:33:22 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 24/22] xfs: Teach dquot recovery about CONFIG_XFS_QUOTA Message-ID: <20130409073322.GJ17758@dastard> X-ASG-Orig-Subj: [PATCH 24/22] xfs: Teach dquot recovery about CONFIG_XFS_QUOTA References: <1364965892-19623-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1365492819 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127611 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_SA620b Custom Rule SA620b From: Dave Chinner Fix a build error when CONFIG_XFS_QUOTA=n: fs/built-in.o: In function `xlog_recovery_validate_buf_type': /home/dave/src/build/x86-64/xfsdev/fs/xfs/xfs_log_recover.c:1948: undefined reference to `xfs_dquot_buf_ops' Reported-by: Michael L. Semon Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 35ac504..1b32239 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1940,12 +1940,18 @@ xlog_recovery_validate_buf_type( case XFS_BLFT_UDQUOT_BUF: case XFS_BLFT_PDQUOT_BUF: case XFS_BLFT_GDQUOT_BUF: +#ifdef CONFIG_XFS_QUOTA if (magic16 != XFS_DQUOT_MAGIC) { xfs_warn(mp, "Bad DQUOT block magic!"); ASSERT(0); break; } bp->b_ops = &xfs_dquot_buf_ops; +#else + xfs_alert(mp, + "Trying to recover dquots without QUOTA support built in!"); + ASSERT(0); +#endif break; case XFS_BLFT_DINO_BUF: /* From lczerner@redhat.com Tue Apr 9 04:14:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 17F0229DFA for ; Tue, 9 Apr 2013 04:14:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A59DBAC002 for ; Tue, 9 Apr 2013 02:14:49 -0700 (PDT) X-ASG-Debug-ID: 1365498888-04bdf0542d46e550001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id k7dwDIGBunLQ7yx2 for ; Tue, 09 Apr 2013 02:14:49 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r399EkYV006357 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 9 Apr 2013 05:14:46 -0400 Received: from localhost.localdomain.com (vpn1-7-40.ams2.redhat.com [10.36.7.40]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r399EXq0002868; Tue, 9 Apr 2013 05:14:44 -0400 From: Lukas Czerner To: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, Lukas Czerner , xfs@oss.sgi.com Subject: [PATCH v3 05/18] xfs: use ->invalidatepage() length argument Date: Tue, 9 Apr 2013 11:14:14 +0200 X-ASG-Orig-Subj: [PATCH v3 05/18] xfs: use ->invalidatepage() length argument Message-Id: <1365498867-27782-6-git-send-email-lczerner@redhat.com> In-Reply-To: <1365498867-27782-1-git-send-email-lczerner@redhat.com> References: <1365498867-27782-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1365498889 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 ->invalidatepage() aop now accepts range to invalidate so we can make use of it in xfs_vm_invalidatepage() Signed-off-by: Lukas Czerner Cc: xfs@oss.sgi.com --- fs/xfs/xfs_aops.c | 5 +++-- fs/xfs/xfs_trace.h | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e426796..e8018d3 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -826,8 +826,9 @@ xfs_vm_invalidatepage( unsigned int offset, unsigned int length) { - trace_xfs_invalidatepage(page->mapping->host, page, offset); - block_invalidatepage(page, offset, PAGE_CACHE_SIZE - offset); + trace_xfs_invalidatepage(page->mapping->host, page, offset, + length); + block_invalidatepage(page, offset, length); } /* diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 16a8129..91d6434 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -991,7 +991,46 @@ DEFINE_EVENT(xfs_page_class, name, \ TP_ARGS(inode, page, off)) DEFINE_PAGE_EVENT(xfs_writepage); DEFINE_PAGE_EVENT(xfs_releasepage); -DEFINE_PAGE_EVENT(xfs_invalidatepage); + +TRACE_EVENT(xfs_invalidatepage, + TP_PROTO(struct inode *inode, struct page *page, unsigned int off, + unsigned int len), + TP_ARGS(inode, page, off, len), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(pgoff_t, pgoff) + __field(loff_t, size) + __field(unsigned int, offset) + __field(unsigned int, length) + __field(int, delalloc) + __field(int, unwritten) + ), + TP_fast_assign( + int delalloc = -1, unwritten = -1; + + if (page_has_buffers(page)) + xfs_count_page_state(page, &delalloc, &unwritten); + __entry->dev = inode->i_sb->s_dev; + __entry->ino = XFS_I(inode)->i_ino; + __entry->pgoff = page_offset(page); + __entry->size = i_size_read(inode); + __entry->offset = off; + __entry->length = len; + __entry->delalloc = delalloc; + __entry->unwritten = unwritten; + ), + TP_printk("dev %d:%d ino 0x%llx pgoff 0x%lx size 0x%llx offset %x " + "length %x delalloc %d unwritten %d", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->pgoff, + __entry->size, + __entry->offset, + __entry->length, + __entry->delalloc, + __entry->unwritten) +) DECLARE_EVENT_CLASS(xfs_imap_class, TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count, -- 1.7.7.6 From naomi_2@stocklottrading.net Tue Apr 9 05:04:14 2013 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 436807F9F for ; Tue, 9 Apr 2013 05:04:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BF15A8F804B for ; Tue, 9 Apr 2013 03:04:09 -0700 (PDT) X-ASG-Debug-ID: 1365501841-04bdf0542c472370001-NocioJ Received: from mail-qa0-f51.google.com (mail-qa0-f51.google.com [209.85.216.51]) by cuda.sgi.com with ESMTP id wnVMx4NwHGGWvBbe (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 03:04:02 -0700 (PDT) X-Barracuda-Envelope-From: naomi_2@stocklottrading.net X-Barracuda-Apparent-Source-IP: 209.85.216.51 Received: by mail-qa0-f51.google.com with SMTP id i20so1273877qad.3 for ; Tue, 09 Apr 2013 03:04:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:content-type:x-gm-message-state; bh=3JjHjnmdlFmh2TiMgHSeeWaSVQmHu+z85LmZjY5RYKQ=; b=e+H1MSaPGVFKaTBiRNH0Cs6QzwDtLfr47rT9UBhDE33J9LjazH3xYVbZ+sybtE38kX G8Nl3BZAQviB2c1sOFkqJT93S41Oyz7XmtL6Su3fjlhb+nHS6R1MFgpqDERU/ShyiWVC yZZOKncsa3pc6mKEaNT0wk5NYas4EqZiWDftcFnjb6edMi6ltnGPzCBUNt2X5hxWTIaa OaHMdPG0L72DxsbOBSC4BIm4mvFUflPc0y8ESiZTHuquwYjsUW35PXufNpUxkQeEsQhq MJSyJflOv033WBrWhrgV9Uq97g+DFlaFIj0ZL2ekyYkplHW/C5URf0qqfjaHT3mDhY3l uhLQ== MIME-Version: 1.0 X-Received: by 10.49.131.133 with SMTP id om5mr19587789qeb.7.1365501835998; Tue, 09 Apr 2013 03:03:55 -0700 (PDT) Received: by 10.49.71.39 with HTTP; Tue, 9 Apr 2013 03:03:55 -0700 (PDT) In-Reply-To: References: Date: Tue, 9 Apr 2013 17:03:55 +0700 Message-ID: Subject: =?TIS-620?B?w9G6q9fpzcrUuaTp0sHXzco=?= =?TIS-620?B?zacgt9ihzcLo0qc=?= From: Stocklot Trading X-ASG-Orig-Subj: =?TIS-620?B?w9G6q9fpzcrUuaTp0sHXzco=?= =?TIS-620?B?zacgt9ihzcLo0qc=?= To: Stocklot Trading Content-Type: multipart/mixed; boundary=047d7bdc9d38e00ffe04d9eaabcb X-Gm-Message-State: ALoCoQnIgqREfbA+/3vsXLVxIcl1Ipr6+PTD902iSuJq4SyokPNP4deKQTi14xuOWPQA+rY/W3ko X-Barracuda-Connect: mail-qa0-f51.google.com[209.85.216.51] X-Barracuda-Start-Time: 1365501842 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: 2bc45f1b20080217d4941365a08b8856-4057-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 --047d7bdc9d38e00ffe04d9eaabcb Content-Type: multipart/related; boundary=047d7bdc9d38e00ffc04d9eaabca --047d7bdc9d38e00ffc04d9eaabca Content-Type: multipart/alternative; boundary=047d7bdc9d38e00ffb04d9eaabc9 --047d7bdc9d38e00ffb04d9eaabc9 Content-Type: text/plain; charset=TIS-620 Content-Transfer-Encoding: base64 W2ltYWdlOiBJbmxpbmUgaW1hZ2UgMV0NCg0KDQoqusPUydG3IMq16s2kxerNt+C3w7S01OmnIKjT odG0IMPRuqvX6c3K1Lmk6dK32KHNwujSpyDB183KzacqDQoq4rvDtMrop6LN4Mq5zaLNp6TYsyDh xdDK1Lmk6dK31eik2LO16c2nodLDotLCILXUtLXozeDD0iC30qfN1eDBxewNCmluZm9Ac3RvY2ts b3R0cmFkaW5nLm5ldCDLw9fNIOK3w8vS4MPSIDA4LTMzNjcyOTE0DQoNCioNCltpbWFnZTogSW5s aW5lIGltYWdlIDFdDQoqos26pNizICoNCirK08vD0bqh0sO11LS16M2hxdG6Kg0KKiAqDQoqqNKh t9XBIMq16s2kxerNt+C3w7S01OmnIKjTodG0Kg0KKiAoos3NwNHCy9Kh4MHF7LnV6cO6oce5odLD t9On0rmizae36NK5DQqo2LS7w9DKp6Ts4L7X6M2h0sO7w9Cq0srRwb7Rubjs4Lfo0rnR6bkpKg0K KiAqDQoqy9Kht+jSueTB6LXpzaeh0sPD0brN1eDBxewgocPYs9LhqOmnICBpbmZvQHN0b2NrbG90 dHJhZGluZy5uZXQqDQogICogKg0KDQoNCi0tIA0KKkZFRUwgRlJFRSBUTyBDT05UQUNUIFVTID4+ Pj4+Pj4+KiBpbmZvQHN0b2NrbG90dHJhZGluZy5uZXQNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKlN0b2NrbG90IFRyYWRpbmcg Q28uLCBMdGQqDQoqQ29udGFjdDogRGFtaWFuIEJhdW1sZXIqDQoqVGVsOiAwODQ3MjQxMDI4Kg0K KmluZm9Ac3RvY2tsb3R0cmFkaW5nLm5ldCoNCiogd3d3LnN0b2NrbG90dHJhZGluZy5uZXQNCg0K DQoqDQo= --047d7bdc9d38e00ffb04d9eaabc9 Content-Type: text/html; charset=TIS-620 Content-Transfer-Encoding: quoted-printable
3D"Inline


=BA=C3=D4=C9=D1=B7 = =CA=B5=EA=CD=A4=C5=EA=CD=B7=E0=B7=C3=B4=B4=D4=E9=A7 =A8=D3=A1=D1=B4 =C3=D1= =BA=AB=D7=E9=CD=CA=D4=B9=A4=E9=D2=B7=D8=A1=CD=C2=E8=D2=A7 =C1=D7=CD=CA=CD= =A7
=E2=BB=C3=B4=CA=E8=A7=A2=CD=E0=CA=B9=CD=A2=CD=A7=A4=D8=B3 =E1= =C5=D0=CA=D4=B9=A4=E9=D2=B7=D5=E8=A4=D8=B3=B5=E9=CD=A7=A1=D2=C3=A2=D2=C2 = =B5=D4=B4=B5=E8=CD=E0=C3=D2 =B7=D2=A7=CD=D5=E0=C1=C5=EC info@stocklottrading.net =CB=C3=D7=CD =E2=B7=C3=CB=D2=E0=C3= =D2 08-33672914

3D"Inline
=A2=CD=BA= =A4=D8=B3=A0
=CA=D3=CB=C3=D1=BA=A1=D2=C3=B5=D4=B4=B5=E8=CD=A1=C5=D1=BA<= /font>
=A8=D2=A1=B7=D5=C1=A0=CA=B5=EA=CD=A4= =C5=EA=CD=B7=E0=B7=C3=B4=B4=D4=E9=A7 =A8=D3=A1=D1=B4
=A0(=A2=CD=CD=C0=D1=C2=CB=D2=A1=E0=C1=C5=EC=B9=D5=E9= =C3=BA=A1=C7=B9=A1=D2=C3=B7=D3=A7=D2=B9=A2=CD=A7=B7=E8=D2=B9 =A0 =A8=D8=B4= =BB=C3=D0=CA=A7=A4=EC=E0=BE=D7=E8=CD=A1=D2=C3=BB=C3=D0=AA=D2=CA=D1=C1=BE=D1= =B9=B8=EC=E0=B7=E8=D2=B9=D1=E9=B9)
=CB=D2=A1=B7=E8=D2=B9=E4=C1=E8=B5=E9=CD=A7= =A1=D2=C3=C3=D1=BA=CD=D5=E0=C1=C5=EC =A1=C3=D8=B3=D2=E1=A8=E9=A7=A0= =A0inf= o@stocklottrading.net

<= /span>

--
FEEL= FREE TO CONTACT US >>>>>>>> info@stocklottrading.net
------------------= ---------------------------------------------------------------------------= ----------------------
Stocklot Trading Co.= , Ltd
Contact: Damian Baumler
Tel: 084724102= 8





--047d7bdc9d38e00ffb04d9eaabc9-- --047d7bdc9d38e00ffc04d9eaabca Content-Type: image/jpeg; name="Image ST.jpg" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: ii_13dd8f87a7a37f2c /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG BwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACZAMIDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8kfj5 8VdQk/aA+IU8jCS5TxPqajbCvGbuXivXP+CTf7Dnjz/gpp8bbbwH4alj06GC9a+8Q640Imi0OxUg PIwIwZWJCRofvMcnKq1fOnx40/R4Pjv41ghl8QhB4h1BUjR1MkjC7kAz6sTgfWv6pf8AggX/AME3 tO/4J/f8E8fDmn3cU8XjXx8kXibxNcbgJnnmjBht87VYJFCVGxslXeXnmqbJsfSf7In7Jfgj9iL4 J6b4G8C6dHY6XpgBuZtitdanOR81xcSYzJKx5JPTgdBXqquzA/I4xjHvVBbGC0Yost0+SMIGyFP9 K+WP+Cqn/BTbwF/wS2+Bd54u8UT6lrGv3Z8jw/4dtrtYp9aucZ25wdkKAgySYO0dAx4pFH1Jrvi6 w8K6Vc6hqt5ZaZYWzYe5u7hIIk92dyFH518k/GD/AIL0/sn/AAV8Rvpur/GjwpeapaSvFNaaT5l/ JEwGdp2Ltz+NfzJft6/8FP8A4m/8FCvHGqan8RvF/ii50uVy9l4bsp/s+jaem7ciLADhyvXfJuY+ oGBXzxYrYaaYJY21qG4GTEC67Y8jBIxQB/VRD/wdKfsh/a4op/GPiS0EpwHn8OTqg9ycnivV/hv/ AMF7P2Rfile2tppnx08FxX14wSK2v5ZLORmPb512/rX8gQsdE3oZZ/EMkmBu2upB/Gqt/wDYR50q nVEiciJIzKuZOcYPtQB/dR4Q+JehfEPTTeeHtZ0jxBbEArLpt3HdLgjgkoTj8cVf1a+FjpE1xPcR wRwwvJJIcBECqSWJPQACv4iPg78dPE/7KXiKS+8E+O/HvgzVIZEmzo2pNapK4wQZFQhJB04cEEdR X3/of/B0h8VfFP7FXxE+GHxJs5PF+seKfD11oWl+MrWddMvrE3ETRO86IpSZgrkqYxEQR3PNAXO8 /wCCfH7bVz+27/wcm+GviCHafTfEWqamNNQQbXjsYoDDbK3fKRLiv6RI3lk2EpIihf7hJJ9OnFfw w+FPiBJ8O9bsNW8LeJvFPh7VtMTFtqOmXb2lzFkYPlyRlWXPfBGa9Bf9vL40x2WIvjt8Zg8oUMH8 aX7Nyef+WvAFDYj+103DoyKI5n3dWMZAH6VI7MUICuGPGfLOB79K/ih0/wDbs+M9xYy3R+OXxxO+ drVGHjS/PygZJP73ge1O/wCG8viytwAvx4+OyiMcsfGN+M+wxLQO5/alDLdPfXCnf5SooTMJBLdz nHP0q0XboEcnP9w/4V/FHp37f/xsS8uYY/jn8bRFcLukc+ML5n2ryAD5vB9xTV/b1+MOHZ/jr8bW 81hsQ+Mb8svqSfNxSBs/tcjeSOJzLywyQMYOKabpvswkCrzz1yMetfIf/BDrxVf/ABM/4JWfAjXP EGt69rmt6t4b8y4vtTvXurq7cXFwC0kjksxAGASScBa+sU0O3E0bb7p/J+QLu+VfwpgS6pPcAKsE TP8AMu44J+XPsKszF8DaHGGyT5ZPH5V+M3/B3n8afFnwG+GnwJk8KeNvHPhiTVNd1b7UdE1iawa7 WO2tmUSGJl3BWPAOQNzV+HGsf8FBvjRqurPO/wAdfjXC5cu7t4wvvLQ+wEoAoC5/a8JmjyCk8hxu /wBUR+HSie4eOMlYZXbsNh/wr+J+/wD+ChHxoIujafHH45skKAmVvGN/85xnr5tSRftzfGX+zrZ7 n46/HKV7i2E7LH401AqnPQ5l9KAuf2uPNIWCqj5BGWMbbfesbxNPcDwXrLQQyicQXAjzGVwfLbB5 HPNfxezft/8AxkkeKGD42/HdxKMuw8Z3wPXj/lrTJP29PjDdWElm3xu+N/2Jt5lQ+L75mlLLht37 3kEcYPHNAM9/vfiNfG8mMl0C5c7v3I655oq94C+FPgu+8DaLPLH4ullmsIHdyclyY1JOe+TRWhnz f1/TPPf2Ef2a7z9pv/gs94X8GajazfYda+I9zPfbHGRFbXUtxJkjOFzEBnHOcd6/sKhmvWi3C1iV TllUvz7D2r+YP/g3GnsNV/4OAdWvLyeN44j4luLMLjLSecAuB7qxx9DX9OWiXa6dokk94RAhlZhu POCePxNZs0JxcagtuWFhGsj9VEwzn1zX8ln/AAcBftc+Iv2vP+Cl3xSurmO6Oh+CLhvBOgW/2pZI oY7SQpNLHj/ntMJJc9cOBniv61G1qBrYBSzbwQo65+U96/ho/aDk1XT/AI/eO01yeMatbeIL9Lv9 4d5m+0OH4/3s0AcqNI1a7maQW29C43DzFPsATmk/s3Uba9TzbYFwzBV89cHjp15qBNcElt5IkKoC WKngE/1qXwrfRWviSxmnaMxx+Yzf3R8hxmkMstoWttbCd7fEL42gyqCfTvmoX8Oajd3K2wsh5itv ZllDAAdcnOBVSXVUlkSaQlpGJIAf7nuaDqCW0ZjhkkEkn3pPM4HNAjU1bQdT1yV7gacwiZwBiYZP bue9RReH9RgRZX06PZFlVEkqgA+uCecVUW/WNFke48xwpwA5+Q+v1qGa/hNkwDu7FNgDMSQSeTQB cjt9QvFULZo5RMAq4xj1HNLNpOqQxsr2iA8K2HUn6YzTrjWoRpumxRSYcRCOYFsDg/oKqpqiveNm UKobOQev0/xoA1E8N6raeGpbP7GEeWYTFzcoNoA6Yz1qqnh3V96j7GuCMAeYox7k5qmt3BJdEOyM EYnL5IPvTrrVf9Y/nktIMAKeAfXFAF200DV3uprWGzc3Ea7pD5ykKPc5xTIPDuqidI/saEk87XHH OOTnFN0W/S0i1MNKZWngUeZnaoOeR7+lV4byGWUqZnAZxn5iOh7UAf2B/wDBAHTryL/gkN+zs7QR qsXhiQv8+SN11cFSPqMH2zX2Kv8AaLK5eBeRgKJBzXxz/wAG/wBf2q/8Ecf2fA88Xmf8I4ejZIxe XP8AXg19kz65biNylzbli2B83A+tMD8P/wDg9XXUJPhT+z8/2eMJFrespv8AOA3O1ra4GD7Bvy96 /n7TStRmmEDWayO7/d8xcE/nX79/8Hsd/DcfCT9nyBJRPIdd1l2ZT8q4t7PI/UV+A/iHUba01mQR kOm7d+7brwODSAfd6VrGpXTWwtFRnypjSRQDgY9e1Wdcs9QS3tLZbYq1varA581dobOT7E1jQ6sx umeJ1Ru7yNjj0FSS6ktqI1aZZDnfiNtwU/40AWP7B1dInZrXDDaQ3mKpA7DGeaS107UpI3hgtS0h dskTBiDjkdaq3mqfbpUdplZmPJbqBVq31aO28H+QrKJpbxyxzg7dg7/WgD9C/hv4C8dSfDvQGFja ANp1uQDfqCP3S9s0Vyfw/wDFehp4D0RX1Bd62EAb96x58taK25iORnXf8ES/jlZ/Bf8A4L6+GZBH pRsNd8V6voD3BUKkaXLzbZEYHGd0aAdsOcV/V3sS4tE3W6SZx8rIOD/9av4S/h74nm+Gnj7S/Emj au66t4cvotSsmMLA+dDIJIxnPdlAPsTX9o//AAT6/au0T9vD9k3wT8VdD1z7dZ+I9NR7yCMqn2K+ UbLmF1BJUrMHwp52lD0IJyuWe5AIFIKR7UPTbgCv5Kv+Dhn9ip/2Rv8AgqF8StUuLCUeFPiVLJ4w 8PztAFguGuX3XUKEDAMVwZV29doVuhFf1kXGlzTTRAajOkancUEYO8ema+df+Cm//BMXwZ/wVI/Z uvvAni2/m067jkF5oetwWqSXOhXajAkQHG9GACvHkb1A5BGaAP4zpNWjaQn7FYMirwixDP8A+uhL +O3sSGsbJZDlssnQHsfavoX/AIKHf8Epvip/wTI+LF1oHxHtLmLRbu5I0fxLZWjzaVrkZ3bWjlAw suFOYXIdcE4K4Y/Or6DFcXkEC6m7yzkja0BUooGQSM9/SkBNDryYixp2mSZcEsYMA+wz2qLWtXSV Ei+w2EZZtoaOHBxnmln8P2KWsUs2sNvDDKrAzbB/jTToNiYnmXVJG2n92HgKlsevPFAGneTR6ZdX Fsml2Cx25BaSaMMxyBgVmPqdvPbYNnAzTNmSRI8Yx2Udqn1fS7XUJVmm1nzLmdgZFELBUGP1NQf2 RZWkLt/a7pGilkBtzlm9AO2aALceurdRmKPStPSJRtB8n94w9SaSPxNHasEOl6SRgHc0OeKij0BI 4rRn1V0kuofOZRET5SdgTnrUVvpVrLdF31V1CKSjfZic/hnigCxpF1HPp9zOLSxMr3PzM8IKRIB0 A7ZqKXVlfUAFsdPKoCzfucLinx2sI02S1i1V3Vj5xCW3Dnpye2KrQaGjymF9RKIq7nYRFlU9QOO9 Ay8dVW4kleTTdPjRwoARNoIHtSf2vaTa5BLNZWqxxcpCke1HIPGfWq9lokN5NcMNXJjtohJLIIiQ B0wBnkipINEtI79ZE1eTzQAybrYgn8zxQI/r0/4IATI//BIX9nmPybRRceGW3BYwCcXVx/Pqfevs 8WtuQ6eXbFV5K+WOD718Yf8ABvlozp/wSC/Z+ne8M3l+GGKpsAC7ru5OPfHT8K+xjpdxEJWk1GU7 uR+7A2/40AfiN/wepSw2nwo/Z6CW8MivrmtttCDB/wBFtB2+o/L2r+f6PVxbs7nTdPbYNpd4ifm7 YFfvt/wesWslv8Hv2fXN7LIZNd1rZmPGA1rZgfqP/Hj6V+BOoeGLfRLhIn1ZjeocyBYyRGeuPc0D uQ6jq0VvaTRGzsxJMPveUN4Pt6VdknstL0vT/Lt7Se5lt/MkaSMEKT2xVCXTLT7A9wdWdp5iV2tb MN341JfaZbfYIVOrmR2AQR/ZyoUDnk0CD7aJTGv2Gzc53FxHgYp95rUSzELZWCoyn5TFuOcdvSkX SrZ5DGdZcyDrttztUdyTngVFaaBFPmVdUCwiUwiUxHnAzn2oA/RX4b+MLZfh3oAOieEiRp1v96OI N/ql65brRXwMnguwKKf7euDkf3G/xoq7+Rm0jBtzectFZXZYjZkRE4J7/Wv04/4Nvf8Ags9N/wAE 3PilqPw5+JD6o3wj8b3YmlmKFl8LX52p9twekLqFWb0CRt0Q5/M2bVJbG1it4LyR5RlWffwM88VE msXNqwEdxKZpjjInORx1PtUGh/dzpniqLxHBbT2UNzd2N3Cs0N3DIrQTxsAyurDhlYEEEdjU412f 7Q0a6ddYVQwJAAPtX8tP/BFf/g5B8bf8E4n0r4d+PBd+Pfg0s4jjtxIX1Pw0jdTZsxw0IJ3GBuOu woTmv6Rf2O/21Phx+3L4Cbxt8NfGOmeKfD9xFHlbd9txp77ctHPC3zxOCcEMMZHBNO4HWfGf4WeG fj74CvPCPjfwjZ+LPDmrxFb2w1GyW5tZV9Cp6HPcYNfjh+3X/wAGg/hr4geIm8Rfs/eILrwTcIGl k8O+JfMudPc4Y7be4XMsZOVAVxsUDrX7eXOof6MGhZNzEAbiKkM7Bgu6NmAG7DAHHc0AfxTftif8 ExPj5+w9qM5+Jvwq8W+HtMimWFNVS2N3pMzsMqqXkYMTn2DZrwW4kupm8uS0n2RYJG0gj61/eXql paaxYS2moRWtxa3IaKW3mCyRzKRjaynhgR2r8y/+Ckv/AAbDfs+/tc6Zeaz4Etz8G/Gd5KNs2ixb tGu5OgE1iCEVRySYPLYnqTzQB/LQy3AnMn2K4wy7RmMk5ol06+ubcxrZXski8MTEeDX17/wU3/4J CfHD/gmF4qebxnohu/B80/kad4p0hmn0q4yWVQ5+9BKQuTG/TcBuNfJaeJ7mHYkdzcNtUnIlIA9T SAk1Cwuri10+2h02+LJDtkyhBkbPOMdhVe5i1CRWCWVyUgwrHyyQtTW2rzxp5g1C6klYbSTIcY9B TH1mSKNl+0yAE7iu84NAFUpdTJGFt7sRREh9qEfhUg0y7DRxPZ6gNh2hFUjk9B9am07UJh4ZlRC2 XuiwIP8As8n3NPn14WlxNMtzch3UBRvORx1oAWwgvrCHUooNPnUyQqjB4SWXnJPtUCQ3kNyXksrt nIyGeM5A9fpT0125tNPZ3upC1wxZwrnc/pmnW2vXXnJIZ3AABGZN304oA/r5/wCCAd5Laf8ABHH9 n9Ba3UinwuW+VeSTeXP9OR7EV9j/ANqS24wbK8YkZIUBgPavjX/g35kQ/wDBIf8AZ28653TN4YcI gckMBd3PYdwOPwr7TYlpEJlUBBkgMBk0Afhh/wAHrVxdap8Iv2ffLsb5Fj1vWWJZOAfs9mQOO+Af yNfgPq/ny37XstnqBSXq7JtDt659K/oC/wCD165b/hVP7PwSUgDXNbBw+AT9ltMHj0BP51/PtLrk 0yMGuXMEZxzISHOOwNABBBdWUIuGsL0khtjMpKAd+3pUaSXbpFO1rceW3zBxGSGA9M9qfqHiGW4s Aolc+WuwDcSADxgfhV/UL46Vpumb7mSWSW1QrGTkRDPA9qAKEVtdvObiW0v2jk5XbGQrD+tTWlrP aaQ0D2F81xPOTGPLIHAHGO5pItbv9Ru5j9sbZANwBkIB9AKVPEV79qE5maV0O5GMhwpIwTQBqQ6X emJCdJ1fJA6RjFFWVvrllBN+SSP+e/8A9eirsYOTA+BIBCk02m+QGiDCNZizEkZyT2pmgeEbW78O S3UumozG48kbp2VsjkgCvoXSP2YtYv8AQNJjGu+HlaeBJZSu4naUB5yP0rW079mfUrLw1HbQ3/hp nS4kumkuA2zkYAGB1qvZSOV5nQV9T5pfwpYM8jDS9pVNu3ziUU+ueua9A/Zu+OXjf9kjxrB4s+Hu u674Q1u2KN9o0zUXjS52nIWaM5SZM/wSKy+1emRfsratDG7z634WDXH7wsN2cDoACKii/Zq1nU5p oRrXhlnt41kcRBisanuxxT9jIFmlB/aP1D/YY/4O50W1sdC/aI+GRkDFVbxR4QO4nG0K09lIwOc5 ZnSXHpH2r9av2Xf2/Pgf+2uto3wu8e+GPFXno8stpb3Zi1CPC8hraTbNgdzt2jHWv5WrT9mHVYru SZdf8HF40xGQGO0+p4q14M+ButfD34i6X4hstdittWsNzW95pMr20/mHuHjIYgHsePaj2Uuwf2pQ /mP7BxoenSKHMETbT1JJwfz609dDsRNGfIiLwcrkkla/A/8AYY/4LtftBfs6XVppPxJ1HR/i34Sh kCSyXpFvrtlGT95JwAk20dFkC/71fsp+yz+2h4K/bS+Hi+I/h/4u0TVLVMLf2jKYr/TXY/Kk0LfM jehIw3VSRzUShKJ0UcZSqu0Zano3xC+FPhj4n+G9Q0fxNoOneINK1ePyb2xv7dbm3u1/uvG+UYA4 IyOCARggGv5/P+C7X/Bsnp37Puga98Yf2ftIu77wrYwte654NikeW40RACWubQklpLdcZaM5dBkh mGFH9Ck0OqLMQk9gqnhdyMWNFzpl3dWsiTT2ziVCkgMWVIIwRz1HseKk6T+F9PANn/Y+l3L2cwF3 biV23nDE9h2pU8MWNxpTSnRxDk7fMM7/AC++O5r9i/8Agvf/AMEcpP2cfj7o/jn4eQaVafDnxnJI h09kKw6Pqn33jXHAhkB3Ip+6cqK+Atd/Zr1u0t47ebU9AJV/mKZKA55AB61oqTeqOCrj6VOThN2a PnKLwpY3Iigg0+aQzjYhV2J/2nPuR+FQR+EbO5llddNlFrbsA8hkYZ9s+tfSFh+zh4l1jRoru1v9 EitY52thK2Y92B834DpUjfs4avKYbG31fw9LFHIGZ1yUxnkkdzR7KRDzOj3Pm7SvB2nanreoCS1a KK3iWRIkdm6+5qyvhOwt40I0VpGHILXDAt9e1fRWn/szXmm6lfLFf6RealqQWFQgPlxYPcDvT5P2 WddBuZZ9Y8O28AkMSbWJdiOuOKfspB/adHuf0pf8EANKt7X/AII9fs+OII0dfC4YNnkFrm4LEH3J J/Gvr1tBtDMALTdnktk4H618tf8ABFfw1qHhf/gld8EdPF3ZzS2vhpI1JQ7D+/mOeOvGBX1ELPVc Rk3NoSrbj+7I3Vk9D0ITUoqS2Z+I/wDweq6RbR/CP9nsC2D7vEOsoApwfmtrTI/EgflX4Rap4Ksd Nv5Ym0mJjEoVttwx2nHX3Nf0Qf8AB2H8ItQ+KPw8+Be7UNNVLHxHqUgEikfKbaDp6n5a/G7xD+zP rWuahN5WpeFLZLyUyYYOZNvAw2B7dq0VOTVzkrY+lTk4Seq/4c+Zf+EOsz5KJpwbaCTvmIZ8/TtU tz4SsbcJGNJVpHOCXuWG2voi6/Zo1SyTzF1vwmpRSCG3FEVR9M5pIv2Y9Ymtorltd8MIs8IeJpww Vwe446U/ZSM/7TofzHzrb+GNPWWaZ9GzEqjAa5O0H8OeareH/BFvdaI+oXFoCZbxoY4jKVVQBnHH P519Mp+zFq0NnBCNe8LlB8zLEpLyN2xnt9aNE/Z4udL8OpaR3diJheNNNO8e5Ez1APTNHsZC/tSh 3PnOTR9EidkOkqSpwf3zUVqax4d1WDV7qMXmjsEmdQdp5wxoqGjt52fbXw+utOuPC2jT/v086ygQ E2zjcghXI/8Ar1PHLpc9ldxr9pnnZ8JGtswjhXvk9yRXT+CPGWo3PgbSUVd3lada5lmwcgopOAMV o+D/ABDdRfD26uBNaSG51aZZOMFU25GcdvavsYYanZadO3/BP44xnE2YRq1XztWlZLmXd2+z29Gc TqNzpCafGtul3NNHHzvt32j8e4+lT+GPDtja3mpS3ZuA19AqYjtyoAHbnqRXYJ8Q9TmhhiE6iIxn 5ZIAFAHTAqN/GniHUoYmkuo0jLFVeZFZj6jHpVLC0l0/r7zlnxTmbVlUa9ZL/wCROUNx4es9MeCG HUVissqB9mJ89j1JOPWk0q90vSJLWe5s7oTzBmQJC3Tpk12Mvjm/srKS2t9W852OSEhVY4znjrTb HW7u68f6CbvVZNQkUyswYBYovk46e9DwlPt/X3lx4qzCzvUl1fxauyv/ACfmcidVtL60kZ457awj kCsZLZizEn/HpXUfBf47+MP2eviPo3izwPfz6Lq9jeRKqhWWG+gDZMFwnR42HUHp1HQVa1fx3qqL HDJdiZd+8ZQEOwPBHHNV7zxvfbGAkkubgvuO9FYkn6d6HhKTVmv6+8VPi3M4SU6c2nfT3tv/ACVH 9Cn7F37bPh39sj4I2Hi6wiltdTglOn6rpwBd9PvVVTJGD/EhDBlburDuDXr6a/HIJCVmK5wg8o5a vx5/4IJftEar4Q/bF1fwRfTn+zvHGjmcwpGBGt7b4aM5HQmN5QfXA9K/Y+7mkFs3zIjbCS2fu8cY r5bH4dUazgtuh/UnAvEM85yeniq38Re7K3ddfmmn8+x4H/wUf+CNh+1X+xv498JSWctxfxae2o6c 4jz9nvYAZYWHuCMfQ1/Obp95pbzi6kh1GGMLlUWDIQkdWJ59eK/qrt4Bc6KkR3YlhK89eVI/rX81 fxkmv/h38U/GfhmGSGNNO8Q6hYnbEofbFdSKoJx6AV35RGM+aMuh8H4u4rE4J4fE4eTXNeLs7bWa 6Pu/wPLtI+w2/wAPrWySymjkfUJXMk0TMFjI64HcnNTW+oeH9Nnto4bdz9jibaq2bqXY9STjtXZL 8RdWW/O2aDbFiNQqKGA/vfUVHafErVoo5XbUdzylozmJcgen417X1Wl2/D/gn4p/rVmTbbnLX+93 /wC3X0OLtrvQ9PSGUpdQvP8AOrCBtxz34pJZdFRbeFhqEpTf5hNswLsRkKOPSum8HarNqus67dzS 3Al02wjMDFSdxLdB6CtE+MtX0uye8a+Mt1KxMUeFYpkcsBjg4pLC07Xt+H/BNanFGYRmk5yvp9pd VdfZ6J6n7rf8ElL+LUf+Cf8A8E3i8wJDoBGGjZAP30qgc96+j5/EdraStbqZjPuwR5TNgnvXiP8A wSuvpb3/AIJ6/Cee4Z/Mk0JS24Yz+9k/pX0BJclDtAkZiCQB3r4+srVJJd3+Z/XuRVJTy3Dzlu4Q f/kqPy1/4OZ9TspfhZ8KFmdldda1AxuYC2zEEIPH41+Tm/Rjq0MpF99mVcCQ27B5GxycDsa/XH/g 5f1Ce3+F/wAIY43hi+0a9dA+aMnHlQZ5/wA5r80vF/jG90vxdKkbxgxSmOExJubZtBJA7CvostoQ nQTkv6u/M/nrxKzzGYTPqtKjJpWWiaX2If3X3/4B5Ze2lnrUktvapKsUsbHe9qxJBOOmOPSteXT9 A03RtLluo72b+zowqx+QSGYdAR7HtXUf8LE1phHJDcZmd9g2RgOy54BJ7ZpE8SaqZ5HvdStbURtk 4hDspzzz6mu/6rS2t/X3nwc+Kcyck/aNLtzav/yX9DkL59MvdRghgt72aWc75PMtmUICenA7c1La +I9KtY0t7a0v3CXKttFuSpbdjPI/nXYHx3q2p6iCmtSW0IUbpDGu9hntx6UvgLxDd2Hh6WWC8l3y au2XfBkmUYxwRyKPqtO+39feVLirMFTblN6W05vXf3T81PGXiLUD4v1UhSAbybA8phj5zRV7x144 1Z/G2ssb9gWvpzjf0/eN7UV8VKWrP7Tw9O9KDaWy/JeR+i3i3wB4V03xJqlpZRazpui6Xe3Fpbp5 4LskUrIirz90KAOfSqs2keErbRLXTA+ttH5hnPlSKjEkcA960fiJ4e8Rx/EnXJ7/AEq0nmGp3Xlw C9ULDmdwN2OvNYGleHfEN7c3Utvp1jcXEUnlySx3AYwt2XJ4Lf4V91G1l7v4H8L4iU3Vm3V2k38S 3v5u+nf5Isr4T0G81IosutvsTCiW5ASPA4/Wo9G8JeH9R17ULfGttbaPbiRpBdAvM7HkgdABU48F +I9DW6/0G0kmcD792uSevQHsam0Dw74k0B9VYWVjNd6xbKg2TAeWFPJAPc+tVy7e7+Bj7aXLL970 SXveav17NkVt4c8L3M17Op1k2cEexFaYfM5/iPHb0plpofhXSbUPANbe5QHBMw+bI7e1V7zw74iu 3iil02IeWM7TdKCcngED/PWm6zoPiSS/jgbTbFbi7GI4xdKMDHQ46HFGm/L+ALnfuurv/fX+Zdk8 N6EFE8s+qwyvGqxfv1cJz8zYHftxWb4j0nQLSCb7FLqaCSaOOPdJhn3HBOR0rSg8Ea/prIDpunXN 3JygkvkAUY/hGcVmz+DfEWo3cSSadakpcRjbHcK4BU7snHAHbJoktPh/AdGXvJyq6L+8vyufWf8A wSM8D6L4c/4KX/DW0tZdeuL+3e7kdjcjyFAs5c716nkgYPtX7rvpFrdXZZ2uJJI48Mgc7cf41+TP /BBz9nvxH4s/aV8W/FS+0Gyh0Tw7aPpWnXBmyJ76fy2l2EcHy41APp5wr9aGk1JYHJhtgxXIXzMA H3PtXy+bzi8RaPRWP6d8IsJXo5Cqtd3dSTkvSyX5pkkmkwtCpf7QoQbtu/lQO3FfzcftOaF4b1T9 qr4iTW8evETeJNUneWW5VkRTdS4P146V/RD8X/iFL8KvhF4k8SXMdv8AZtC0q4vW/fYzsjJ6ntnF fzVX+l+N9bvtR1a8s7Dz9Qle8nRr9C/mSMXbIz13Ma6ckjrKVr7HznjViv3eFw8ZqMveesktNEv1 +4oeHPBVlqvhSW/F1JEj3b2ykuWk46nPYYPWrV54U8MWNjbpDcX5kJPmSNIWCZ6Y9881Jb+Fdf0f wRHYtY2xuJrprhvMvkVfmHA4qpceCPEtnpUct1p1kyCTewN0jAg8YABzXv2sl7v4H4JOcpTk1V0v p7yLmn6B4b0qwuliufEkpugIyFuVDTj1HHAzSHwR4VS7CSHX0eIbkUXIYp65Peqp0fXbm7gt00mC W8QbzFFODhO2fQUsHg/xLDazTzafD80hUK12qhiTx3zgGiyt8P4CU6l+b2tm/wC8tenfsfvz/wAE vtGsV/YF+DlpFJqDxPouYvMmywAlmPPryfyr6HXQraC4D77qRwAuzzCQfevn/wD4JY6XqVp+wP8A CFry3tFubfQtrpFOJFTM0vRu/GOnqa+gZGv1kPlWkQZz8zvMCo/DrXxOI/iy9X+Z/bHD3/Iqw2t/ 3cP/AElH5sf8HGXhHRbvwj8IpdTk1ALb6vqEkYjfcoxBCTkH8MV+Vl7Y+GdZ1K8vY5PECTSliXW4 XaoxgACv1I/4OTotTb4X/CsRWtotuur3/nzz3IUcwQ4AHUk88V+WaeAfEt3ZmP8AsyC1t41EhUXC qG9M56E+nvX0uV64aKt36eZ/NXii5LiKtJ1LaQW6VlyRvp5kMvhTw9Y6K95I2tSLbq0mw3YEszD7 oJ7Cprbwt4b0/wAMWd3djWjdahB56qtwDGGY8L0ycUmoeD/EmpQLZR2enJG8JQubgP8Ahx9etXry w8RzaXpUUGm25t9NtxbhluEwxX7zEmvRsv5fwPz2Vabik6urf8y2/Lcp3Pg7wvDDYx3Da1JNs8yT bMAznsB6AVYj0vQfOit7FdWWNWLhjOAQxHHP1FUtO8M+I3knki0y0aSdTuZ7sERjr1PTiodG8JeI tenYw2dqsMTbGYXag7vQZ/pQrdI/gKXNJPmqqy/vL8rnEzfsifBm6leW60K8nuZSWlkN+wMjnlm6 9zk0V0jeCtTjJU6NoZK8ZbUwGP196K+KnH3nof25ha0vYQ957L8j2T4EfC+L9pv9uLS/AcNyYI/E Xim5guZQ2GjgE0ryMvuFXjPAJFfRX7WP/BGL4h/s/wDw41PU/AFyfH/hgapPfIbVfK1W1hIOPMj6 SkAYLJj6c16x/wAEL/g83jj9q/4o/EC60rSxF4euLnTrWWO3B8qe4uXZ/mPRhGiHjkB/ev1eZLZA YikGI/mC7BhffpXr4zMKlKsoweiWp+NcI+HuAzXKJ18ZFxlObcZJ6pRdl5NN36bbPqfy13urweFL +ePUwNPukTYYbxWiuFP+64Dbj0qG18SRz+WZLp7iWUkrGsh/dr6sfr2r+lz4ufss/DL9oNJU8Z+B /C/iSWdBuuLvT42uQB0xMAJR+DCvlXxz/wAEC/gx4q1e/utDm17wlcFMw28FxHcWsTE/eKSIXK+2 8VtTzmEtKisePmvg5j6V3gpqr6vlf4pr/wAmPxP0vxLFidxf2sb3BG9vMCpEB6nHXsKm8Na7aTfE fS7g3lvDBBHKD5xLBcqRn6nNfqrrf/Bua/kGLTPifoywRyh0Fx4TV3YZz8zCcZ59qWw/4NymeZG1 P4pWPEpbNn4XVXYHqPmmIH5cV0/2nhtPf/BnzX/ENeIuZpYRq6a+Ons1buflEfE2j2Uj7LmA+Qzr uEpKtnvn2r2j9hH9jLxV+3N45j03wzb3Vh4aszt1fXpkaOzs1J7N0kk6hUXqepHNfrb8GP8Aghl8 EPhhdWl1rGlT+Nrq1BIXVdi2wb+8Io1XP/AmYV9WaN4X0n4a+E7bTNC0vS9J0+3cJBaWVrHb28W4 87UUBQfcDmuLEZytqS+Z9vw/4P1JSVXNpWX8qldv1dkl8m/kct+zR8EvCv7K3wd0XwJ4UhjtNI0S 2JLyEedcSscvPKe7uxJPpwBwAK7HUvFFo2mOq3MVxJKhVVQ/fOK0rmOGKN2aOIj+Lco5HvxXlH7Y P7W/gr9iz4STeLPFcsADHyNN0+JFN1q1yR8sEK/XG5uijk+leEuapK27Z+5znhsBhuaTUKdNeiSR 8if8F6f2z7L4Sfs8ad8LbC9Fv4k8ewI1/HHKQ9lpiNly3oJHHljPXBNfjvbeIrG4Tb51sYWbKsg+ eQj1PevVP2kP2p/Ef7TXxc1/xd4mtNJudV1+UfuhbhltIE4igTJzsRcDnknk5riZfF/2cQQ2+m6V JLCxBIslQFj6c9hX1+CwvsaajfXqfyFxnxN/beYzxKi+VaQ1XwrZ7aNvX5nNz+LrFpDK72jY4QPw vHQ4pZ9c0u8jtluL2182Vg8qQyFigz932PtW/wCF7i1sfCUmoz6TYy3TanJEhlVGQAD07DNTr4hs bS6bdpmlhhzvitUJYnr17V1JN9dz5iU6cZOKjK681/kY/gvxJp7z+KZUuPsym1SFHL4ThvzJqrB4 j0mVc/ao7toWL5eUkE9MAemc10WmeJ1N1HFHYaRHaxBpHT7EGMmTwCfWkPixfJuLf+zNEEIU7jHZ oGP4/jTtpuQ6kHNvlfTr2SWuh+9n/BKPxFZz/wDBOr4WXMcyyRrog+ZeQx8+bgevOa+hItXt7W3I aRA68lA2SM+vpXz9/wAEt5/M/YO+DkItreGFtBDlUjChSJZcADt619EbYhMyIkBdiN3yDJHfPqa+ IxH8WXq/zP7b4ef/AAlYa3/PuH/pKPy5/wCDmTxBBL8Nvg3D50INx4hvCys3ULFAfxr8vfH3im3v fiFqIF9G8chJ2B8KcADJ9gK/WH/g4u1EaR8PfhfObDTnWPV7/Z9ot1k/5YQ8j0HX8hX5W3Xjxbxg Dp+iETJlnWzCsy98V9NlS/2aOv8AV2fzR4pVF/rHWXK3ZR69XCHl5HPS+LbSGO3tLW9topgMFkkw APViP88U278RWz2rKlwvlyP5fnTNhWHqBW7rXjP7Rp7Nb6LoqRumYz9kCsQP4s+3WpJ7+Oy0TS3i s9FuZZIUmYzRhhJITg8cYUCvQ17n57emknyvfut/uMo+J4DFErXkThVCRxiX5un3yB29KPDWsadb /DpFuL2zaVdVaYLuKSHOBknuPatm41UyatdxrY6TKG2Z8q1Rc7ccAnoOvSk07X401Qt/ZemSxJLu UyW4MaE9sdyadnfczdSHI4qL6Pdf5eZ5/P4k8OtO5N/ECWPHmnjmiuhfXZ3dmOkeFwWOcG2jyKK+ Jn8TP7fwn8CHouvkj78/4J7f8FKtC/YV1nxj4M12G/1Lwvqfie81GbV9Ph/4mMMxfYfMjPyyRhUH 3TuGOAa/UX9m79q/4bftYeFVvvAPj3TvECGRhLEGEV7GeOJIHxImPdRmv50fH/2pPHviKG40+9Ek +s3UhiRlxEBcOCre/UVDoOtyeGPBSm1tprO/Ooy3EBtpRFLCmMKxYHOc17mIwVCq+ZSsz8G4f42z 3KofVqmHdampNRVuVpNt6SS2v3T9T+oH7DLMCI9QuVZl2bhGDgjvmnWfh77H9pc3M0s90ArSOASA OnFfzzfBP/gq9+0D8JdIZdJ+IPiC9srZliSDWPK1K1iX+4pmy2fp0r3zwf8A8HLXxP0ZvsWqfD7w p4iuIivmSwzy2krjHJ2qdo/LFeXUy+cdYyT+Z+oYHxCwtf3a1CrTfnG6+9f5H7NyaLcTEp/alxgf eUIv+RTJrKaQRRR6lOpYsHYAFmx29sV+V/h//g5I1lreU6h8FWjdXLuYNeQAAdc7u+Kh1L/g5N1e 71iBrD4OraWdsrl5L3XFOcr8gATrk1l9TqXt+p60uMcsUHPmlp/clf8AI/V6DSmitVhN1O+w5JPU /Wq82jiFxd3moyPBaqZD5m1I0/2iewAr8X/iF/wcN/HPxakcHhfwZ4W8KwEZ84I1/Kee3mkr+lfL fx3/AG5/i1+0TrM1v498c+INZtlXcNMjultrFGPrChCD8s1vTy6Un70kjwcy8R6FGL+q4apUlbty r79X+B+wv7ZH/BYr4YfAZNR0vw14oj8ceK41KrZaYRJp9mw6tPcqCuB/cQs+eMY5r8gf2o/2g/EH 7UPjK68Z+M/HWo63rThvsEENl5VlpcQ6RQR5wi+p6k8k15HbXk+oiRE0u6SGP5m2yKFIHc88d6m1 DVrm+s0C6fNtWJ0Uq6gLgcV7WFoYagrxd33PxnifPeIs6qKFenKFNfYitPm3dt/h5am1pngKL7BY TN4huVudRhNxI6RArCg6/iT2qK38I6RC8Cr4n1SWY5MjfY8nr+gqHVdXfTfDeni6WR7iO0WDYJFB yOv5etZkXiNdOWSZ7dYm8vARp18xj612+1pd1958b/ZeaS5n7OW/8q/y2/A6BPCdlF4eg0+31q4t Iprh7qW4mt8SE9MAdCeP1psXgjT44vtDeLb2KIAliLQF+P4QKwbbXbjUrgTPYXctvZplszKct2HX jipxqt6sqRy6XNtc5QDaoJP+Hel7el3X3sp5Pmqv+7l3furr6r0LtroGn6nqN5C3ivVEtbGBZnRb QB5ATgCrEfgTTWFrAniOa1VZCZWMBDAds/4Vn+HteXSW1jz0mU3caQJCjoXmZW+79Aajn1y5uL6V jaRs0bAshdQQT6+9HtaVt19//BCWV5nzWhTkkrfZW9l/d11bP6EP+CUWhRp+wR8Jrn+07rUvI0Qr HLKoXIM8ueP0/CvoSbSZGn8xtQnWPGNgAAz65r+ff4S/8Fivjp8CfAOj+BfDWs6bpeiaPbNa6dDN o9pPIqZZsb2UluWbk10Vr/wXF/aZ1GKKKDxPpT5+Vpk0Gy2hu+Pl6185VwE5VJSUlq+5/ReVce4b DYKjh6uGrc0IRT9xW0ik/teX/APq3/g5X0Y/8K6+FDT61eRiXW71Eg2KUkzDDwT2x/WvzC1jwdYa DqtzFdeIr6OX7kaJZ7hyBgfSu7/at/br+KP7bNpoFr49uhrEWg3gm05jp9taRwO+1ZXJiA3ZVAMH 0rzT4ieKjdeKbq4t4HSN3xFMzgHIAwVHrnpXs4FRo0VCbV15+p+PcbTxWbZvLGYWjNQklpKKurRi td+qfW4648FQa1ZGJvE2oJboPsyCS08vJP3vwxWjqnhmxM1jBH4gltLPT7UwhltgThenXuT3rA1X VvsU8s17DekeWpCNKocMerH0zVNtdOuWxe10qeRG2kEyqyYzgk+vNdXtqXdfefJrKM0nb93Ky/uq 2vyV/uN1PBdhCIbu78WX5aU4ZTaAKFJ4GQetHhvwEddt5tRvvEdzb2FndNHGEiByVIxx7g1QuJ7q ACafT5DIxDxojqCu1uSB6AYo0e5OnWCm6sLm8upb17hLYTgbFPIJx1PHSj2tK+/4sp5ZmfK37OV9 vgX4afiOm0Wwkmdo9bv2jYkqfsgGR2orBaXxNIxZfCGpFWORiNTxRXyEn7zP7KwsGqME10X5eh8T fH74m6u/xw8domr36oviHUCCJmJcNdyEE5NcpL8RNWaMRf2vegt97dcMSf14qP4/f8l38bf9h6+/ 9KJK5KudnpHZyfEHW7qyVLjXLxLaKQbYY5zjA6mrHh/xzqrDXbiLUb1Fe3QZEh3kbhgAk8VwlaGl f8gnUv8Armn/AKGKVxs6K8+Jmsy3MsS6vfjzSEKm5b8TnNJB4/1XzIYodSvQiZVt1yxAx35Ncd2N FO4WR2svxQ1ZnCjWdTLoMBROQo5+tU7vxxqpsWiN9clZ5VMn+kMWfB4zzXLUsf8ArF+tK4HeeJvi ZrkN/NHa6jdRxyEL5aXB2gY+tU7b4ga+QUXVrgO65d2uCVTHYDNchP8A69/94/zptO4HbzfFDX3j Ltrl5K0kfzHzSD16D0pn/CztYNsFbUZGRcYBckkg5GT9a4uii4Hcab8QtWtPCFxcNf3gY35kYCdh 5jFfryBTV+LOvPc7zrd8JcEY88kKPQVxrf8AHqn++38lqOi4HaWXxK1i2na5bUr3cFZV/fc89+Kj X4sa8lt5Q1e6KBfuiY5b0ya4+jsKVwO08OeOdRXxNp01zq9yqne0jeexx8p4Oen/ANemv8WdaknZ v7W1BkRy8aCZlQD04rkLf/W/8Bb+RplFwOx/4WTrM06ltY1BlC7gvnlQP1o/4WRrZn86HV7nzU4T dMcLnvz3rjqKdwOu1Px3qZF2ZtZ1C7uLlCu4zEjpz3rSv/Hur6doump/aV8ETT1CqkpRV546HJNe f1f13pZf9eqfzNK4HQD4jarcSpNPq1/MtvhR/pLA5PpzUkHxD1mGKSV9VvkwxUEXBL4A69a4yinc D9Ifh18QI5vh9oTya3q7O+n27MftuMkxLmivIfh1/wAk+0H/ALB1v/6KWitLnM5H/9k= --047d7bdc9d38e00ffc04d9eaabca Content-Type: image/png; name="image.png" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: ii_13dd8ef92718ec1f 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 6o65w5ZGHbSVosOJDzrvijan2n1Yxy5K92bu3v3yV+2p4ds6v0P3vdzeLN/N/vDXo+zhE39jk3e5 1F58crhtqzb46RZD7R908ipvRe3xds9z29u1377CJoMs7niRjfe2mmM37f9ja7hjnGE64qmfbmEn PyDtDNWvaZd7gt2rMg20Ofangd+wa6a1dCvWtbUn2aPT+9m1+15hM7xex9o9MgN+UF7WObcMtH3/ MCVq4oDBDhc/Z6PP6Fnwo33P1ncCKME3sXbt4DyvLAo89vqtVIFTUp0veH6sndnD7MlzN7UT/6qB FOBFK76Uu0z3PtDpnneW5wHvdjKYA9WoPUYuvUH1yWi29mTs8bt3nAfpARBqVCYEMsgFNV1ral+z qVPKBV5odUh9a50mX4gIFbv93saPPavw7j2ob6jie3fJIrqe/rsjbJC3ewZK7HLxOBt9ugru9K7d fOCudsnrmZDpgsZxI+zty76dBT93ifU6/cE87pH2p7f+YPvnLnvvbvvB8bfZDL5x+dFPel+pa9mO P7X/u+8k62Yv26WH/s4ejzT5tZQtAOrs7YBf2r/P2DXznXSznaiVYQhQIsAI3IASy2SrAupQ1c7K 28gyedV37K7bBtrW7ms24f6f2G9eU1wG9y2H2J2XHGbb2Bt25Xl32r/zOKWV37BLf7a53XftE3qT zLYd+Eu79QCB0R89ZGdc/Zy916q7DTu6nz16xyib3WOIPXTOgeIx1S696F6vA/tCy1vtbdecuaWN uHe8zRDqXtLlIHvytG9bd62h3HXv/5l993Q7RY/52WdvtrP12ZZqYMUmBHYmqnT8cjEBSrAdhKNC A5RoUL9frbwwhtm5ZWvrIQAoBQ1iYu9AQz6ZdzsqemeIF9RFmhgc7RVWtWPiTzj+EAM+8EYHCXMe X6ABoAWAhBuUlJVtVpSwts0KgTpwV6PvrFs4OBChq4fpyj5NJveUI/KNMkW5FeyEP1tQWFUhfwCT DlrdbU7gAIRg32qLHJTw8ulZp6AEoAPCAqAEBJ+NgRLEWSSwa7XK3F2gRCcJwYsF4MFj01yYinrh 94ni48+RXy3UDlCxfODfu4d8fX9KW9Xbq28ttN36dbU+/ZbbwgXv2k69DraO21fZVq1X2YJ3Zfqy qqPVr5fMonGvoSx7ts2VIOb6jOEpsCBowMds0jBmelhEzjz1V51OLtPh1YSIWzTmNuGf84zxmKjc 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 NX4rE/oPHvjb+MCxm8VPbntL7Krns8NbXy1+7RivDwOB3LbXyXHzmR25TOJHUqp3+8Q1ce2VC2PK G8/O9pyoZ9Oh9n6GUHHoLR//QNyjXSH2Pu/tcf7Kc2PBa2bHjOGT4qYTj4zp558rjrfFT1eeHiMf 1PKgs+k09ozP33RtXLlwhhwsMnPw+jjnjVcIQDo6kfdnf/TKuO205fHiz9wYb/rMcfHAx3aOV5+v ge9934/bXyrfDTLRv+2Tx8asyy9KE1Ge8cQXvjV2+7V8IrziWXHWd4+PWT//AVXLbw/Tv07Vd06G RLzppOPi3uNmx55nHR4XrD4n7t5navSMfEF5HhPTf0K6PeMLN10V799Bp9oZZLO36gGIdj/pj/GR 258Vb/l+NXPCrAAzLfltK57ZEc9kwd+jcof1DkzXO/BPavtf77dlHHPwtXHC8XPih9+ptnvt1kwe Zr0z586NOXofqNt9aqe9zz40fqy2XKi23Cw+Gzd85PiYc/GPY48jDor7PzIv3jfvN/Hh90+Jn52v zjK/GQkeDRqmbbNdPEMd3rr5H4mbrpofp7W8T7+eMjfeo/eHd8/vH3VN0muExQyKE7Mhe5/0+7hw 7je0rOsHmrV7a5z1O+2Ycpye2+Kd4/iLO2Lntz8n/uvw3ePYV14Uxx8zJy7/aZVNp2ZIOzvkZXhL 7VqgoIEdj42rfj4/vrPHnvGznLXdNU64ZEX8curu8eFfy9B67lFx0+kT46SXvSx+Kf5djvp+XPHd lfG8D/0ipm3Q7JoG5VN6ZEI9a4uYs2VbLB94dZx180nR8cWXxV6/Ul/R88w45jtnxCkP7Bcf/OVA zNtnm/jN+14dl+3z2Thg3rAsHV4YL33gS7HrF+bGlUe8RI4+fiWnlm+Kc3//SS2tOTJedbX2oV41 I04449Q45cHD472/iXjm/9kmfvexw+PXL/xqvOc5a+PSa6t7CwY8UlzW67lX8ytVONYTAy98fWz/ y3fHTu3HxDfj4rh3/6PigS+fHdv9S4XAbz1rs/S8jVNMaJpMzscjQAkG6gxsEIEGJWxuySyIFY7x FIMSlEB5gEo+8knHmXr37GV7eb9mpaVeVfZw6gckwNfWws6gRGZU/zC7gNA3CGFQAmHuOObEmO2w gEd5gtrU9yHgEdpetuG1ogYfyJtzU1WWHHUqwDMypRWH+ThSXkmP6dr1c7gdXvp6Vu0zAgW4T8BQ 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 vZ6bBS7add/BlhfJ8V2LOjvyawdYh/JSW1q9zDru3sW2FNdZa81kVmKGuWiBrV/8uc2d+oktmzvb 2guAVNdr9q1rbxt04F525K4f25COk+zwvsusw64rrP2gPnpBOlqHpmLruGNn+9OLb9kPr/+13fnA wyrX7Ovf/Ibt0n0nbVEqKSFEA6j5V5A/e71cCAY6Z96BEPbRsdcN6WO7Hz3KwVZl5WQ74tlRNq+X nHa98Kr1GrXO3ri0l2uDI11yH4ki4KwTjrKjxLPunka7+Sd97c/3Nmlv9ia7/+MbbW+VWX9uokh4 6YSNUihV2sc3Nto15420XlfdaPukAu+faRfug5899KLNveId2zj6aE8W98cFANP9i5xzgpQXX7MX jlvng8wZt5lde/5I6/3Dm2wIdao/14YfO8YO//dHvF3OekpKjNuHWJ9D7rQ+J3/fhZuddoz1koXE i8fr3uQQcMIvG2zERaOt1xW/sL1VVtSn9oOnbPax76icP8g6Q7MKaT1p7+AJpzJeYf1BeEbbB08I 7iwPeYWwjnCOpI1fNnx755QB5afxOiiOsgOMwMuOGap8ro6kjXpyDkWece55kC4lln9AwRdH8o28 cmEZPk+U/smPz14HX7QR1w70mDmJewLwpXWi3/NZlRQIbgUeAoMKI65Esx9lbeVjJl2iQJ541uYX FOCAa86ziopQSBCW/cGLxURYRmCCiY8JFBIQMyH86les9B9hCE7IB84xqyGh4pRRSiQB+ptp+1xY 5iQsIgiKdaMxC0JcrBVFUDPoZ0YhhD9p8DDND2VB9kecKxAECiKcsJxSIo0njHjInXeKH54Iy/Kj lEA5AeHTIpkRSJQSHpj5Qz1D8cDgnwE/ygj8RWSVEhGH8A9+soGHH8QuJOxagnPLoFB4bOuauPp0 CQeKCgcRAhLk7z+1I8cAFKGM4BjPl3xRNFCHpiUrkq3DFBbOLpmtywIk+EMpwTmUbzmRhG79y7IU AGy+UiKut9UfReptfXMRt90jsi6Vdyx4xOol+yOMf19EWf44DwsG8uY8d/1FGeXFRRrwAySRYR99 PNl+NuLn9tFHH/lW4SzjpE1Ythk/ZAu89JnIGPJBOcERS0uwyMLPP7fZs2f7Mg98TLnjWiVauHCB 58PSOQYrHLHoxMH2Yg04+G2pL7TvnnmODf/VTfb6G+Ptxlt/b/NWLNVkSIdoyrw7+XIu6V/pQzny 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 riglcITFjhzs6oFfCZS9AT4AHfmEiSYmm2z5xTpzHOeGaTnAn3XEHPllKYa2KCdwVNlSwJDB+F9e fsnOPPNMOZIe5QoJlBKAe6wTUAIwyG/LLjAAGs3IlBAHAJds5JtFrrvTTOXFt8yAe9kybVkrpUC9 HEfSZ8DDLwblMTBniQflRB9AOAPyiHflh+pLPXyWU+0Xig+sMAD4lWoL0C3hlNlGzunATfxoG8pF YYHjzhKBVpQs3D9bYtOOOFtuqXrXKz1WIUVaLlosC5FKfe9/fvwJ6yC/H9wrS0xQGrw/4QO76KJL 7W059OS3oxxjFkmZ1qG4wf7zsvOtetMaW7xitX38yWf22muvyZIz2YqUMrHQ4Lq4MFEIxTPRHbtl BUoingk/+CgvFBXZZ/mPzpnZ5rdGCiesJFbomYa1xKYzn7L5mjCqmDXLFt97nIdXDfi5vSs/IKtX PWqnyqoF3lUrVsg/2DC7/28/sl31nq1avrv9atI6q5x8o51x3SRb/f7Prd+pf7Qxr1xuJ8qiYLXS 1NR8xx5XPjz/1TpOum5Qrvw18jXGO4kcQEHBID2ukbk1m86wh5Ru/qK3bHi/ZHcxnl/lejm4nnSd fCNstPWqx/LVJzgf+VPOuz/t43mF7GKw22/4e15+Uo/X7ZhXrrf7VEaUV9x0mj38+UJbrB/t8Pyl 3byN2OKWJbS03fr1u9s1f1voZTzxnaTOtAvxfG/Uv6rqVLtbu9XMn/+G/bTXar9X2mH9+pPtoXd/ 6u2Gj7Wq9afaQ6ov72q1BmUf3rC3P0L/fvQenvbHP9rJypO8/TkNuc4miH/1qvftuiFD7PoP13k9 7jphtX/ztMPq1d+yR51nlVsFvTe8n6f1uimvKj0b7p/f4vtOUNzb9u67SZvXC9PWbd6otqTOfewX 76ssPc/Tf/6+LXtvuPU5+SEbO/ZK+xbx+mExsqrvCJsk6yPuASukP/170ga0KfHUO+6nqt9we1fl rlv3hJ2ueNryh2/M97TPnZNYTWBdwXuX3GfyLOf/VT7I9A3T/sSvP/6epP56Tp/dfqSt0i5Ba3e6 xF6YPl1tfr8dKx4sXHj2NdUn2O9fusp6SrmELxreHfhZFrph1x/Yy7Lerpg1yk5Q3mb97fKnP7AP 9S3/8pDVtlJr/RcsmGfLO59vr2q5GeEfvf22ffjn822A8ontQfucc69NHDvWPnr0QuvB86/ZzS69 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 5MCSA98XB/4f9F0gNMnnB3IAAAAASUVORK5CYII= --047d7bdc9d38e00ffc04d9eaabca-- --047d7bdc9d38e00ffe04d9eaabcb Content-Type: image/jpeg; name="ST TRADING.jpg" Content-Disposition: attachment; filename="ST TRADING.jpg" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hf4z9ono0 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG BwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAJEBCYDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8Rf8A hVmjR6DY3Tvqxmvd+EMsaBdrYHVDmurT9ivxNc+GNF1i38LeK72w8R2n27TJLUJOLuDfIhcbEJAD QyZyMjbz1GeL8ReMLix1a+tVnwVlIkZlXA5OFHpxX9CP/BKrxVofwx/4Jg/AjWE8NS674z8SeH5r W2sdHskk1PVI49SvR+8fgR2695JWWNScZyQD6OWYKOKqunOfLpe/3HmZpjZ4WiqlOPM27WPwt8H/ ALBvjLx5q+s6dpHhLxBquoaCgnv7e0uoZGtYiMh2wmOnp0wc9DViw/4J3/EXXPJTTvAfiy+urqOa SC1heOS4dYkDu3lhdxXayndjBzwTX686z/wRx+LepftXa38TdN8caH4M07xbdyPqOhw757m0spwF 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 UzeB/EQv9OtI5dYutQMUDi4AtI7lbi3ge9uVW5luWjlsSYjAv7seieAR8G/gN+1hrvwL+Jnwr8O+ OvHuv2nhDQnvNT8P2935VpbaPp0c8cF604k05mjiuAZLeGSWTzois0Hkgv8AmX49/aZ8XfFjQfEO heIPFWr32l+LvEr+NNatvIt41u9WaOSM3J2ICvyyyARriNQxwo4x2fhX9sDxl4U/aDtPirH4guLv xzp9pBZw6lqWi6ZqkeyC0S1iP2e6glhZ1hjUeYYy+Ru3bstRzOVSc5ac1r21Xwwb0eiTmp+sZ6rR JZqPLTjCOvK3a/T3pW9fdcXr9qN1u2/prxH4p+HviUftG+HLv4VeET/bfgix8c+GL6Gx0+OXwxB9 gsbyDT1YWfnMIY7iOHz7eW1afy2adZhIET5+/ba+BGtfs+fDX4EQeJvhlL4F13X/AAVc3upR6voE mm3dzL/buqhHkWRFd3+zC2AZsny/Kwdu2sK4/bV8e+DPi7qvxO0DxhrHhzxvrOlLo8l/o2m6fpSW tqLeOBEtIbaGOKzKRQRLG9skbRmNWQq3Nc98ev2ovFv7UGn+HovHuuDVJtKikmtf7O0PTtMkmkmS JJri6e2gia6uHW3hD3FwZJW8tcucVFVczi46aQvrfWKqL53UoXb1fLrrqXTlaMoy/mk16NQ+6zUt ForpLRWPpjw94Isf2dten+IWvfB/Rn8NP8GdL8SeH7q+8L20trqd99m0q0mmtRfW8+n3BW5vCZ2m tbkj5wvlTMk8fJfFX4+6J8KNO+G3xLi+F/wpu/HfxP8Ah4lxLLL4U05tC06+h1q+s5b2PRmgbTzN LaWccRXyBErPJKqCUhh4v4x/bD8c+N/hHpvgi+8TH/hG9L0ttBtbJNI0+3drQvZs32iaKFZZ3A0+ yVZJWaRY7dIw4TKnj/FfjtvG/h/w1pV9qmrXdr4N059I0n91DElnbtcz3TxqUUM+Z7mZtzkn58Z2 hQKqNvZ7S0/w/vLr1fNG62fL5IKfKqMYyXvWjft7saaXr70JPVfa82ek/t4aXouk/tG/atI8NeH9 Et9e8N+H/Ek2n6faC2sYLrUNGs724WGIHEcRmnkKxL8iKQqgKoA8fTU47gFpLHTNqjICWgGT25z0 rW+IXj7/AIWbqqanrmpa1f6jZaZZ6XE4jghVbaztYrS2jIRVB2QQxpuI3NtyxZiScO10Sxi0+Bnl 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 S3luba4Z1WCzhcSB7WMAlyMFvlJIIKKKAP/Z --047d7bdc9d38e00ffe04d9eaabcb-- From eflorac@intellique.com Tue Apr 9 05:17:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EF99B7F54 for ; Tue, 9 Apr 2013 05:17:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D5CFF8F804C for ; Tue, 9 Apr 2013 03:17:31 -0700 (PDT) X-ASG-Debug-ID: 1365502648-04cbb01fb7459320001-NocioJ Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id blGc1lCJsVXPSQDR for ; Tue, 09 Apr 2013 03:17:29 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.4 Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 54E2B4C8425 for ; Tue, 9 Apr 2013 12:17:25 +0200 (CEST) Date: Tue, 9 Apr 2013 12:17:26 +0200 From: Emmanuel Florac To: xfs@oss.sgi.com Subject: xfs_repair has been running for a very long time, no disk IO. Message-ID: <20130409121726.6342519e@harpe.intellique.com> X-ASG-Orig-Subj: xfs_repair has been running for a very long time, no disk IO. Organization: Intellique X-Mailer: Claws Mail 3.9.0 (GTK+ 2.24.10; i486-slackware-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1365502648 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127620 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On a quite badly mangled filesystem, xfs_repair (v. 3.1.4) seems to never end. It has run for 16 hours with absolutely no disk activity. Usually xfs_repair takes much less than one hour on a similar (9 TB) filesystem. I know I should try the latest version. What else can be wrong? What should I try? Last lines of output of the still running xfs_repair where it has been stuck since yesterday night: entry "Panel-2333" at block 3 offset 2464 in directory inode 2190114192 references non-existent inode 60238299 clearing inode number in entry at offset 2464... entry "Panel-2316" at block 3 offset 2512 in directory inode 2190114192 references non-existent inode 60238300 clearing inode number in entry at offset 2512... entry "Panel-2309" at block 3 offset 2560 in directory inode 2190114192 references non-existent inode 60238301 clearing inode number in entry at offset 2560... entry "Panel-2292" at block 3 offset 2608 in directory inode 2190114192 references non-existent inode 60238302 clearing inode number in entry at offset 2608... entry "Panel-2290" at block 3 offset 2656 in directory inode 2190114192 references non-existent inode 60238303 clearing inode number in entry at offset 2656... bad attribute format 1 in inode 2190120814, resetting value - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 Phase 5 - rebuild AG headers and trees... - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... -- ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From david@fromorbit.com Tue Apr 9 07:00:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A5CB67F6A for ; Tue, 9 Apr 2013 07:00:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4FB24AC002 for ; Tue, 9 Apr 2013 05:00:14 -0700 (PDT) X-ASG-Debug-ID: 1365508809-04bdf0542b47b670001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 5WF2LcvYcGbLEvKx for ; Tue, 09 Apr 2013 05:00:09 -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: AggUAOQBZFF5LMW7/2dsb2JhbABRgwaCeLlhhRoEAYERF3SCHwEBBAE6HCMQCAMYCSUPBSUDIROIDgWuLpA9FY1wgR0Hg0EDlnORDoMdKg Received: from ppp121-44-197-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.187]) by ipmail04.adl6.internode.on.net with ESMTP; 09 Apr 2013 21:30:08 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UPXDa-00004x-Al; Tue, 09 Apr 2013 22:00:06 +1000 Date: Tue, 9 Apr 2013 22:00:06 +1000 From: Dave Chinner To: Zhao Hongjiang Cc: rjohnston@sgi.com, eguan@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups Message-ID: <20130409120006.GK17758@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfstests generic 310: fix common file path and other cleanups References: <5163B257.4080809@gmail.com> <20130409064030.GF17758@dastard> <5163C27D.8000101@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5163C27D.8000101@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: 1365508809 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127625 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Tue, Apr 09, 2013 at 03:25:49PM +0800, Zhao Hongjiang wrote: > On 2013-4-9 14:40, Dave Chinner wrote: > > On Tue, Apr 09, 2013 at 02:16:55PM +0800, Zhao Hongjiang wrote: > >> On 2013/4/8 22:05, Rich Johnston wrote: > >>> Hi Eryu, > >>> > >>> Thanks for this cleanup patch. I was going to revert patch "bbaf78c0" which introduced test generic/310 but will wait and see if Zhao will provide more information which could be added to this patch. > >>> > >>> > >>> On 04/07/2013 05:39 AM, Eryu Guan wrote: > >>>> 1. add one space between # and test description > >>> > >>> The rest of the changes look good, sorry I missed them when I reviewed . > >>> > >>>> 2. remove creator/owner info > >>>> 3. fix common/rc and common/filter path so they can be sourced correctly > >>>> 4. no need to remove $seq.full cause it's not used(or if verbose output > >>>> is needed, $seqres.full should be used) > >>>> > >>>> Signed-off-by: Eryu Guan > >>>> --- > >>>> tests/generic/310 | 12 +++++------- > >>>> 1 file changed, 5 insertions(+), 7 deletions(-) > >>>> > >>>> diff --git a/tests/generic/310 b/tests/generic/310 > >>>> index ef51422..35baa23 100644 > >>>> --- a/tests/generic/310 > >>>> +++ b/tests/generic/310 > >>>> @@ -1,8 +1,8 @@ > >>>> #! /bin/bash > >>>> # FS QA Test No. 310 > >>>> # > >>>> -#Check if there are two threads,one keeps calling read() or lseek(), and > >>>> -#the other calling readdir(), both on the same directory fd. > >>>> +# Check if there are two threads,one keeps calling read() or lseek(), and > >>>> +# the other calling readdir(), both on the same directory fd. > >>>> # > >>> > >>> Hi Zhao, > >>> > >>> I did see both threads running at the same time, but the more I > >>> look at this, the more I am a loss as to what this test is > >>> doing. > >>> > >>> Will you expand this a little please. I should have asked for > >>> more justification the first time I reviewed this. Please > >>> provide what bug this is testing or what failure/weakness this > >>> test exposes. If there is a commit this is related to, please > >>> reference it. > >>> > >> When I ran it on ext2, ext3 and ext4 which has dir_index feature > >> disabled, I got something like this: > >> > >> EXT3-fs error (device loop1): ext3_readdir: bad entry in directory > >> #34817: rec_len is \ smaller than minimal - offset=993, inode=0, > >> rec_len=0, name_len=0 EXT3-fs error \ (device loop1): > >> ext3_readdir: bad entry in directory #34817: rec_len is smaller > >> than \ minimal - offset=1009, inode=0, rec_len=0, name_len=0 > >> EXT3-fs error (device loop1): \ ext3_readdir: bad entry in > >> directory #34817: rec_len is smaller than minimal - \ offset=993, > >> inode=0, rec_len=0, name_len=0 EXT3-fs error (device loop1): \ > >> ext3_readdir: bad entry in directory #34817: rec_len is smaller > >> than minimal - \ offset=1009, inode=0, rec_len=0, name_len=0 ... > >> > >> If we configured errors=remount-ro, the filesystem will become > >> read-only. > > > > So what is the criteria for a test failure? The test body is only > > reading from the filesystem, so a ro,remount won't cause an obvious > > failure of the test. > > There haven't a obvious criteria for a test failure, you should see it > from dmesg while you run the test. Which means for most cases (i.e. automated test harnesses), a test failure will go unnoticed. The test *must* detect failures if it is to be useful as a regression test. That's the whole point of a regression test harness - that you don't have to do any extra work to determine if a test has passed or failed as it is determined for you by the harness. > > Perhaps the test should have more comments in it than "read this > > URL" to explain what it is doing and what constitutes a failure? > > Yes, i'll add more comments to explain it! Given that there is a failure that can be captured, then I'd suggest that this needs to be captured as well... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 9 07:02:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 158B47F6A for ; Tue, 9 Apr 2013 07:02:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0284E304059 for ; Tue, 9 Apr 2013 05:02:47 -0700 (PDT) X-ASG-Debug-ID: 1365508962-04cb6c1e79487910001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id E8tmdrkSgBr3QLIy for ; Tue, 09 Apr 2013 05:02:42 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AggUAOQBZFF5LMW7/2dsb2JhbABRgwaCeLlhhRoEAYERF3SCHwEBBTocIxAIAw4KCSUPBSUDIROIE64ukD0VjXCBHQeDQQOWc4l2hxiDHSo Received: from ppp121-44-197-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.187]) by ipmail04.adl6.internode.on.net with ESMTP; 09 Apr 2013 21:32:41 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UPXG0-00005Z-B6; Tue, 09 Apr 2013 22:02:36 +1000 Date: Tue, 9 Apr 2013 22:02:36 +1000 From: Dave Chinner To: Emmanuel Florac Cc: xfs@oss.sgi.com Subject: Re: xfs_repair has been running for a very long time, no disk IO. Message-ID: <20130409120236.GL17758@dastard> X-ASG-Orig-Subj: Re: xfs_repair has been running for a very long time, no disk IO. References: <20130409121726.6342519e@harpe.intellique.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130409121726.6342519e@harpe.intellique.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: 1365508962 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127625 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 09, 2013 at 12:17:26PM +0200, Emmanuel Florac wrote: > > On a quite badly mangled filesystem, xfs_repair (v. 3.1.4) seems to > never end. It has run for 16 hours with absolutely no disk activity. > > Usually xfs_repair takes much less than one hour on a similar (9 TB) > filesystem. > > I know I should try the latest version. What else can be wrong? > What should I try? Either use the latest version, or use the -P option. Cheers, Dave. -- Dave Chinner david@fromorbit.com From eflorac@intellique.com Tue Apr 9 07:30:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E576A7FAA for ; Tue, 9 Apr 2013 07:30:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C48068F806F for ; Tue, 9 Apr 2013 05:30:17 -0700 (PDT) X-ASG-Debug-ID: 1365510613-04bdf0542d47e350001-NocioJ Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id X38I2BERHBSJwuY9 for ; Tue, 09 Apr 2013 05:30:14 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.4 Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 6073D4C851F; Tue, 9 Apr 2013 14:30:09 +0200 (CEST) Date: Tue, 9 Apr 2013 14:30:10 +0200 From: Emmanuel Florac To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: xfs_repair has been running for a very long time, no disk IO. Message-ID: <20130409143010.114f3fda@harpe.intellique.com> X-ASG-Orig-Subj: Re: xfs_repair has been running for a very long time, no disk IO. In-Reply-To: <20130409120236.GL17758@dastard> References: <20130409121726.6342519e@harpe.intellique.com> <20130409120236.GL17758@dastard> Organization: Intellique X-Mailer: Claws Mail 3.9.0 (GTK+ 2.24.10; i486-slackware-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1365510613 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127629 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Tue, 9 Apr 2013 22:02:36 +1000 Dave Chinner =E9crivait: > Either use the latest version, or use the -P option. >=20 Currently running the latest version (3.1.11-pre2). I'll wait for a while (it takes something like 10 minutes to reach the point at which it freezes over). I suppose -P makes it slower? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From yongtaofu@gmail.com Tue Apr 9 07:53:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7084A29DFA for ; Tue, 9 Apr 2013 07:53:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4ED25304053 for ; Tue, 9 Apr 2013 05:53:50 -0700 (PDT) X-ASG-Debug-ID: 1365512029-04cb6c1e7848cbd0001-NocioJ Received: from mail-ie0-f180.google.com (mail-ie0-f180.google.com [209.85.223.180]) by cuda.sgi.com with ESMTP id xAbocTzGHCkUIpR1 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 05:53:49 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.180 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.180] Received: by mail-ie0-f180.google.com with SMTP id a11so8222856iee.39 for ; Tue, 09 Apr 2013 05:53:49 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.180] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.180] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type:content-transfer-encoding; bh=Pk3jOGhs+bfdZVerwLbVOKSWhGmTZwb+LZKma8Oprwo=; b=Ix7bmBDpMdc5o7aNhJF3b+Uj65sICHHffsaOn78srh2cfBuLNgHVgmuJhHFc/7bEtn TVh/sl7psDCudAZCopnTNVpUJO2OdNDA5onIRUs0OUknAOVrbTPYrzGzZxjuGp7MAG+T E7HiBX9wSE7Q2D0OL9RX/E5cceh2+A/GyoL0EicaOwzsbhH13LPtPdYNrSHV93CR3WRE 3LY/twUUfrhwHdij0jBcx30P114Pwoh7h0u/5j+P7AwT7YUrn9h2doIaRpZ5/wc8oL/I b7TKE9G499mVhOT0ampsg/nAoCcgBfvQaG7I6b5qgm7w7lnMu9tecs23YHiJorxnmNM6 fnKw== MIME-Version: 1.0 X-Received: by 10.50.20.163 with SMTP id o3mr10114482ige.51.1365512029056; Tue, 09 Apr 2013 05:53:49 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 05:53:48 -0700 (PDT) Date: Tue, 9 Apr 2013 20:53:48 +0800 Message-ID: Subject: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: xfs@oss.sgi.com Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-ie0-f180.google.com[209.85.223.180] X-Barracuda-Start-Time: 1365512029 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127632 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 Dear xfs experts, I really need your help sincerely!!! In our production enviroment we run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs file system crash on some of the server frequently about every two weeks. Can you help to give me a direction about how to debug this issue and how to avoid it? Thank you very very much! uname -a Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux Every time the crash log is same, as following 038 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22. 1039 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22 1040 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02ee20a 1041 Apr 9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting down filesystem 1042 Apr 9 09:41:36 cqdx kernel: XFS (sdb): Please umount the filesystem and rectify the problem(s) 1043 Apr 9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. 1044 Apr 9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. 1045 Apr 9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. 1046 Apr 9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. --=20 =B7=FB=D3=C0=CC=CE From david@fromorbit.com Tue Apr 9 07:54:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3872729DFA for ; Tue, 9 Apr 2013 07:54:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 13E48304053 for ; Tue, 9 Apr 2013 05:54:08 -0700 (PDT) X-ASG-Debug-ID: 1365512045-04bdf0542c4809f0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id FIHSS04HFjMEEJdM for ; Tue, 09 Apr 2013 05:54:06 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwUAA8PZFF5LMW7/2dsb2JhbABRgwaCeLlhhRYEBAGBERd0gh8BAQUyASMjEAgDDgoJJQ8FJQMhE4gTri2QPxWNcIEdB4NBA5ZziXaHGIMdKg Received: from ppp121-44-197-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.187]) by ipmail04.adl6.internode.on.net with ESMTP; 09 Apr 2013 22:24:03 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UPY3m-0000Cv-I1; Tue, 09 Apr 2013 22:54:02 +1000 Date: Tue, 9 Apr 2013 22:54:02 +1000 From: Dave Chinner To: Emmanuel Florac Cc: xfs@oss.sgi.com Subject: Re: xfs_repair has been running for a very long time, no disk IO. Message-ID: <20130409125402.GO17758@dastard> X-ASG-Orig-Subj: Re: xfs_repair has been running for a very long time, no disk IO. References: <20130409121726.6342519e@harpe.intellique.com> <20130409120236.GL17758@dastard> <20130409143010.114f3fda@harpe.intellique.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20130409143010.114f3fda@harpe.intellique.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: 1365512045 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 09, 2013 at 02:30:10PM +0200, Emmanuel Florac wrote: > Le Tue, 9 Apr 2013 22:02:36 +1000 > Dave Chinner écrivait: > > > Either use the latest version, or use the -P option. > > > > Currently running the latest version (3.1.11-pre2). I'll wait for a > while (it takes something like 10 minutes to reach the point at which it > freezes over). I suppose -P makes it slower? Yes, it turns prefetching off, which is what usually what causes the hangs. Though 3.1.4 is pretty old, and I think a few prefetch hangs were fixed in 3.1.8.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From yongtaofu@gmail.com Tue Apr 9 08:03:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 BD59629DFA for ; Tue, 9 Apr 2013 08:03:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F4F7304066 for ; Tue, 9 Apr 2013 06:03:12 -0700 (PDT) X-ASG-Debug-ID: 1365512586-04cbb01fb74646c0001-NocioJ Received: from mail-ie0-f178.google.com (mail-ie0-f178.google.com [209.85.223.178]) by cuda.sgi.com with ESMTP id 4jH8sc80eadOk0nZ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 06:03:06 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] Received: by mail-ie0-f178.google.com with SMTP id bn7so8546339ieb.9 for ; Tue, 09 Apr 2013 06:03:06 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:content-type:content-transfer-encoding; bh=wsI5WslxB4cgzyCh5ud/7wYQKHqz6IT8r3lAL6u8osE=; b=nmWKelkPwcN6JB8gPPtI3oSAa22jqh7bYfNlv/WqdLkg71Z/+HyvC1rxKpiVVrnDKx PRSki4+y11xCNTKeIsFAfgTulGXgUQQTXgRn92SV3UmukpwxDWXy32H3MuFraXfwWOQt TwdFuY/FuKSNuhK3jEodC7SCEJzsaFGAfOrykpAjuXXblLrpE63GuXYmvbhOLFBtTytn ycWDogDAIVyL2tY2fk9mLCvSm5Ol7WT7UiK8c6yCfbVqsgN56DU96TVue/7X7r7SwMNg 1Sl0e9Dmk+Jj1Iqz3zGRMQOgYLyS+ZX0prSPA6ZZ9bNBC5ZGt2vR7/isGsrdBKm3axQ9 BTBA== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr10340501igx.11.1365512586244; Tue, 09 Apr 2013 06:03:06 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 06:03:06 -0700 (PDT) In-Reply-To: References: Date: Tue, 9 Apr 2013 21:03:06 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: xfs@oss.sgi.com, yongtaofu@gmail.com Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-ie0-f178.google.com[209.85.223.178] X-Barracuda-Start-Time: 1365512586 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127632 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 BTW xfs_info /dev/sdb meta-data=3D/dev/sdb isize=3D256 agcount=3D28, agsize=3D26= 8435440 blks =3D sectsz=3D512 attr=3D2 data =3D bsize=3D4096 blocks=3D7324303360, imax= pct=3D5 =3D sunit=3D16 swidth=3D160 blks naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 log =3Dinternal bsize=3D4096 blocks=3D521728, version= =3D2 =3D sectsz=3D512 sunit=3D16 blks, lazy-cou= nt=3D1 realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents=3D0 2013/4/9, =B7=FB=D3=C0=CC=CE : > Dear xfs experts, > I really need your help sincerely!!! In our production enviroment we > run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs file > system crash on some of the server frequently about every two weeks. > Can you help to give me a direction about how to debug this issue and > how to avoid it? Thank you very very much! > > uname -a > Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 > #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux > > Every time the crash log is same, as following > > 038 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > xfs_inotobp() returned error 22. > 1039 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree > returned error 22 > 1040 Apr 9 09:41:36 cqdx kernel: XFS (sdb): > xfs_do_force_shutdown(0x1) called from line 1184 of file > fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02ee20a > 1041 Apr 9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected. > Shutting down filesystem > 1042 Apr 9 09:41:36 cqdx kernel: XFS (sdb): Please umount the > filesystem and rectify the problem(s) > 1043 Apr 9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > returned. > 1044 Apr 9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > returned. > 1045 Apr 9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > returned. > 1046 Apr 9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE From yongtaofu@gmail.com Tue Apr 9 08:05:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 968D229DFA for ; Tue, 9 Apr 2013 08:05:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 70D88304067 for ; Tue, 9 Apr 2013 06:05:33 -0700 (PDT) X-ASG-Debug-ID: 1365512732-04cb6c1e7a48ddd0001-NocioJ Received: from mail-ia0-f182.google.com (mail-ia0-f182.google.com [209.85.210.182]) by cuda.sgi.com with ESMTP id v0lWqWj7N6f0G1su (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 06:05:32 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.182 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.182] Received: by mail-ia0-f182.google.com with SMTP id u20so1635884iag.13 for ; Tue, 09 Apr 2013 06:05:32 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.182] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.182] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:content-type:content-transfer-encoding; bh=8CdaTDl3KdsSteJGFhV8npgRzDrjKQ8sO58VWn0Xmtc=; b=H80fAyEEiCEirf+HOEgG7vGJWyRqx/jy6Zg//95Y6iL8sZeu+YGSkQ083EIpcs/Jt8 dp6DWYRI/cgb0z9aNBEIxXIaalsdJ5fz6sKwrB3NhvSUysPSo8Jqoe0XP2glRjwvaAuD +j+UwWK4RctvDTU0fLRH4i530VJKNWMbT+DkNjr9P28/UxWq2gnfoGGwJnGKTZu4iPT7 l23iDevSPnSzwg3oQc/GheMZhoEVL67faEFDnDTORmMVJtSovLY00AroeUfrhR4pCldI UdqMMk+lexT9bkJUodYFlxFhnpPd/9UQplmg0Ff2WopWT5FNLLjk9tYF2i2wJRU85Xk2 Ozzw== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr10058096igq.51.1365512732224; Tue, 09 Apr 2013 06:05:32 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 06:05:32 -0700 (PDT) In-Reply-To: References: Date: Tue, 9 Apr 2013 21:05:32 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: xfs@oss.sgi.com, yongtaofu@gmail.com Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-ia0-f182.google.com[209.85.210.182] X-Barracuda-Start-Time: 1365512732 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127632 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 Also I want to know why all the server, all crash with the same crash stack= ? Thank you, really need your help. 2013/4/9, =B7=FB=D3=C0=CC=CE : > BTW > xfs_info /dev/sdb > meta-data=3D/dev/sdb isize=3D256 agcount=3D28, agsize=3D= 268435440 > blks > =3D sectsz=3D512 attr=3D2 > data =3D bsize=3D4096 blocks=3D7324303360, im= axpct=3D5 > =3D sunit=3D16 swidth=3D160 blks > naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 > log =3Dinternal bsize=3D4096 blocks=3D521728, versio= n=3D2 > =3D sectsz=3D512 sunit=3D16 blks, lazy-c= ount=3D1 > realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents= =3D0 > > 2013/4/9, =B7=FB=D3=C0=CC=CE : >> Dear xfs experts, >> I really need your help sincerely!!! In our production enviroment we >> run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs file >> system crash on some of the server frequently about every two weeks. >> Can you help to give me a direction about how to debug this issue and >> how to avoid it? Thank you very very much! >> >> uname -a >> Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 >> #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux >> >> Every time the crash log is same, as following >> >> 038 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: >> xfs_inotobp() returned error 22. >> 1039 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree >> returned error 22 >> 1040 Apr 9 09:41:36 cqdx kernel: XFS (sdb): >> xfs_do_force_shutdown(0x1) called from line 1184 of file >> fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02ee20a >> 1041 Apr 9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected. >> Shutting down filesystem >> 1042 Apr 9 09:41:36 cqdx kernel: XFS (sdb): Please umount the >> filesystem and rectify the problem(s) >> 1043 Apr 9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> 1044 Apr 9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> 1045 Apr 9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> 1046 Apr 9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE From cmaiolino@redhat.com Tue Apr 9 09:04:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 47F0D29E11 for ; Tue, 9 Apr 2013 09:04:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 35945304067 for ; Tue, 9 Apr 2013 07:04:12 -0700 (PDT) X-ASG-Debug-ID: 1365516251-04cbb01fb7469450001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jIhHSeObBNxkIgmz for ; Tue, 09 Apr 2013 07:04:11 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r39E43Bx020350 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 9 Apr 2013 10:04:04 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-174.phx2.redhat.com [10.3.113.174]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r39E3xqT005309 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Tue, 9 Apr 2013 10:04:02 -0400 Date: Tue, 9 Apr 2013 11:03:59 -0300 From: Carlos Maiolino To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: xfstests should still make xfs as default? Message-ID: <20130409140358.GA27522@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: xfstests should still make xfs as default? References: <20130327203231.GA26739@andromeda.usersys.redhat.com> <20130408230733.GB17758@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130408230733.GB17758@dastard> 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: 1365516251 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 09, 2013 at 09:07:34AM +1000, Dave Chinner wrote: > On Wed, Mar 27, 2013 at 05:32:32PM -0300, Carlos Maiolino wrote: > > Hi, working on xfstests after its new directory structures I noticed we should > > use now something like: > > > > ./check xfs/ > > > > to run some tests, IMHO this is not intuitive and I was working on a patch to > > make us able to use something just like the old way: > > > > ./check > > What do you do with duplicate test names? > > The main reason that the interface changed was to keep the changes > to the test harness down to a minimum as it was just moving tests > around. All that code needs to be revisited to support arbitrary > test names, so there wasn't much point in doing a massive rework > only to have to rework it again... > > But the question is: is the old way a sane way to specify tests in > the brave new world? I'd much prefer that test specification is > explict, and doesn't implicitly select tests. Indeed, if it > implicitly selects tests (e.g. when there are duplicates it runs all > duplicates) then we still need a method for running specific > tests..... > > Note that what you are seeing is how the $have_test_arg code > processes the test name. It requires that you tell it the directory > so it knows where to look for the specific test. You could make it > look in each test directory like get_group_list()/get_all_tests() do > so we don't need to specify a directory. > > > But, since xfstests is becoming more generalist than xfs specific, I wonder if > > we should still keep xfs as default. > > The default is whatever filesystem is on the $TEST_DEV, and I don't > see that changing. i.e. what we set FSTYP to is the default. Note > that get_group_list() and get_all_tests() specifically include the > FSTYP directory, > Hi, this makes sense to me Dave, thanks to the explanation. We have some documentation which says xfstests will run tests for a xfs filesystem by default if no other fstype is specified, I'll change this into documentation then. Cheers, -- Carlos From bpm@sgi.com Tue Apr 9 09:52:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 44B337F58 for ; Tue, 9 Apr 2013 09:52:42 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1CAE48F8049; Tue, 9 Apr 2013 07:52:39 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id D247E500B50; Tue, 9 Apr 2013 09:52:38 -0500 (CDT) Date: Tue, 9 Apr 2013 09:52:38 -0500 From: Ben Myers To: =?utf-8?B?56ym5rC45rab?= Cc: xfs@oss.sgi.com Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 Message-ID: <20130409145238.GE22182@sgi.com> 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.20 (2009-06-14) Hey Yongtaofu, On Tue, Apr 09, 2013 at 09:05:32PM +0800, 符永涛 wrote: > Also I want to know why all the server, all crash with the same crash stack? > Thank you, really need your help. What you've posted so far looks like evidence of a forced shutdown and not a crash. Is there a crash in addition to this forced shutdown? If so, can you post the stack for that too? > > 2013/4/9, 符永涛 : > > BTW > > xfs_info /dev/sdb > > meta-data=/dev/sdb isize=256 agcount=28, agsize=268435440 > > blks > > = sectsz=512 attr=2 > > data = bsize=4096 blocks=7324303360, imaxpct=5 > > = sunit=16 swidth=160 blks > > naming =version 2 bsize=4096 ascii-ci=0 > > log =internal bsize=4096 blocks=521728, version=2 > > = sectsz=512 sunit=16 blks, lazy-count=1 > > realtime =none extsz=4096 blocks=0, rtextents=0 > > > > 2013/4/9, 符永涛 : > >> Dear xfs experts, > >> I really need your help sincerely!!! In our production enviroment we > >> run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs file > >> system crash on some of the server frequently about every two weeks. > >> Can you help to give me a direction about how to debug this issue and > >> how to avoid it? Thank you very very much! > >> > >> uname -a > >> Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 > >> #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux > >> > >> Every time the crash log is same, as following An initial guess is that somehow it is looking up a bad inode number, e.g. it is beyond the end of the filesystem and xfs_dilocate returns EINVAL. You could 'xfs_repair -n' to see what it finds (without modifying the filesystem) as a first step. > >> 038 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > >> xfs_inotobp() returned error 22. Were there any lines of output before this? In some codebases there are prints in xfs_inotobp that would help show what happened. > >> 1039 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree > >> returned error 22 > >> 1040 Apr 9 09:41:36 cqdx kernel: XFS (sdb): > >> xfs_do_force_shutdown(0x1) called from line 1184 of file > >> fs/xfs/xfs_vnodeops.c. Return address = 0xffffffffa02ee20a > >> 1041 Apr 9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected. > >> Shutting down filesystem > >> 1042 Apr 9 09:41:36 cqdx kernel: XFS (sdb): Please umount the > >> filesystem and rectify the problem(s) > >> 1043 Apr 9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > >> returned. > >> 1044 Apr 9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > >> returned. > >> 1045 Apr 9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > >> returned. > >> 1046 Apr 9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > >> returned. The error 5 (EIO) look scary but they are due to the forced shutdown, don't worry about them. Thanks, Ben From yongtaofu@gmail.com Tue Apr 9 10:00:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DC7657FA6 for ; Tue, 9 Apr 2013 10:00:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AA4018F8049 for ; Tue, 9 Apr 2013 08:00:42 -0700 (PDT) X-ASG-Debug-ID: 1365519640-04bdf0542d4904a0001-NocioJ Received: from mail-ie0-f177.google.com (mail-ie0-f177.google.com [209.85.223.177]) by cuda.sgi.com with ESMTP id Is2qvy5Gn1nMA5Bl (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 08:00:41 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] Received: by mail-ie0-f177.google.com with SMTP id tp5so8626902ieb.36 for ; Tue, 09 Apr 2013 08:00:40 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type:content-transfer-encoding; bh=sOuPeKX36X9b3PhW2QnIVNpjDYsMWFGZ78iWZugWS1c=; b=nlv9gibUjRBqrSef8J4kU+ewRXzeNHBUMrMftjS+VgrJATlP8ECWEnWHsEX1LvOeN4 NA7CSzlhLBWJgQ1LarTkcGD8r8KNkYJ76GBk1FSC1z5JctXep9gDyWOqDvzSojYSbzhm ck1DFJm+cGr8g+oeS//G4WYKP2yCOaKj445ex3nOckD4sD5Pyn4YHQM78giemH7KdwuU 3fkS6k7y/wdYQWyqoeF0Ipdprmnd4U1ZirfSjcqjLVYaVT8Co3kbGtvbvHp6AX4LKYJL Oy1/LcEEjw1tZP/cQn+rEJupUL1f601y9+OgNQSmg494IDQV2XN8smNI2RFxU26Q4kdE vl5w== MIME-Version: 1.0 X-Received: by 10.50.20.163 with SMTP id o3mr10448311ige.51.1365519640852; Tue, 09 Apr 2013 08:00:40 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 08:00:40 -0700 (PDT) In-Reply-To: <20130409145238.GE22182@sgi.com> References: <20130409145238.GE22182@sgi.com> Date: Tue, 9 Apr 2013 23:00:40 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Ben Myers Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-ie0-f177.google.com[209.85.223.177] X-Barracuda-Start-Time: 1365519641 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127640 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 No crash just force shutdown, thank you for replying to me. 2013/4/9, Ben Myers : > Hey Yongtaofu, > > On Tue, Apr 09, 2013 at 09:05:32PM +0800, =B7=FB=D3=C0=CC=CE wrote: >> Also I want to know why all the server, all crash with the same crash >> stack? >> Thank you, really need your help. > > What you've posted so far looks like evidence of a forced shutdown and no= t > a > crash. Is there a crash in addition to this forced shutdown? If so, can > you > post the stack for that too? > >> >> 2013/4/9, =B7=FB=D3=C0=CC=CE : >> > BTW >> > xfs_info /dev/sdb >> > meta-data=3D/dev/sdb isize=3D256 agcount=3D28, >> > agsize=3D268435440 >> > blks >> > =3D sectsz=3D512 attr=3D2 >> > data =3D bsize=3D4096 blocks=3D7324303360, >> > imaxpct=3D5 >> > =3D sunit=3D16 swidth=3D160 blks >> > naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 >> > log =3Dinternal bsize=3D4096 blocks=3D521728, ver= sion=3D2 >> > =3D sectsz=3D512 sunit=3D16 blks, >> > lazy-count=3D1 >> > realtime =3Dnone extsz=3D4096 blocks=3D0, rtextent= s=3D0 >> > >> > 2013/4/9, =B7=FB=D3=C0=CC=CE : >> >> Dear xfs experts, >> >> I really need your help sincerely!!! In our production enviroment we >> >> run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs file >> >> system crash on some of the server frequently about every two weeks. >> >> Can you help to give me a direction about how to debug this issue and >> >> how to avoid it? Thank you very very much! >> >> >> >> uname -a >> >> Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 >> >> #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux >> >> >> >> Every time the crash log is same, as following > > An initial guess is that somehow it is looking up a bad inode number, e.g= . > it > is beyond the end of the filesystem and xfs_dilocate returns EINVAL. > > You could 'xfs_repair -n' to see what it finds (without modifying the > filesystem) as a first step. > >> >> 038 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: >> >> xfs_inotobp() returned error 22. > > Were there any lines of output before this? In some codebases there are > prints > in xfs_inotobp that would help show what happened. > >> >> 1039 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree >> >> returned error 22 >> >> 1040 Apr 9 09:41:36 cqdx kernel: XFS (sdb): >> >> xfs_do_force_shutdown(0x1) called from line 1184 of file >> >> fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02ee20a >> >> 1041 Apr 9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected. >> >> Shutting down filesystem >> >> 1042 Apr 9 09:41:36 cqdx kernel: XFS (sdb): Please umount the >> >> filesystem and rectify the problem(s) >> >> 1043 Apr 9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> >> returned. >> >> 1044 Apr 9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> >> returned. >> >> 1045 Apr 9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> >> returned. >> >> 1046 Apr 9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> >> returned. > > The error 5 (EIO) look scary but they are due to the forced shutdown, don= 't > worry about them. > > Thanks, > Ben > --=20 =B7=FB=D3=C0=CC=CE From sandeen@sandeen.net Tue Apr 9 10:06:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B6A617FAF for ; Tue, 9 Apr 2013 10:06:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A529730406A for ; Tue, 9 Apr 2013 08:06:11 -0700 (PDT) X-ASG-Debug-ID: 1365519967-04cbb01fba46f4e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id MWbLlcqaBAlzqSGY for ; Tue, 09 Apr 2013 08:06:07 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id CF1D463BE65C; Tue, 9 Apr 2013 10:06:06 -0500 (CDT) Message-ID: <51642E5E.3040403@sandeen.net> Date: Tue, 09 Apr 2013 10:06:06 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?GB2312?B?t/vTwMzO?= CC: xfs@oss.sgi.com Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365519967 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127640 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/9/13 7:53 AM, ·ûÓÀÌÎ wrote: > Dear xfs experts, > I really need your help sincerely!!! In our production enviroment we > run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs file > system crash on some of the server frequently about every two weeks. > Can you help to give me a direction about how to debug this issue and > how to avoid it? Thank you very very much! So this happens reliably, but infrequently? (only every 2 weeks or so?) Can you provoke it any more often? > uname -a > Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 > #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux That's a RHEL6 kernel; I'm assuming that this is a RHEL clone w/o RH support? I agree with Ben that I'd like to see xfs_repair output. Since the fs has shut down, you should unmount, remount, and unmount again to replay the dirty log. Then do xfs_repair -n, and provide the output if it discovers any errors. Thanks, -Eric > Every time the crash log is same, as following > > 038 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > xfs_inotobp() returned error 22. > 1039 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree > returned error 22 > 1040 Apr 9 09:41:36 cqdx kernel: XFS (sdb): > xfs_do_force_shutdown(0x1) called from line 1184 of file > fs/xfs/xfs_vnodeops.c. Return address = 0xffffffffa02ee20a > 1041 Apr 9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected. > Shutting down filesystem > 1042 Apr 9 09:41:36 cqdx kernel: XFS (sdb): Please umount the > filesystem and rectify the problem(s) > 1043 Apr 9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > 1044 Apr 9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > 1045 Apr 9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > 1046 Apr 9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > From yongtaofu@gmail.com Tue Apr 9 10:07:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 85B9B7FB4 for ; Tue, 9 Apr 2013 10:07:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2F3D58F804C for ; Tue, 9 Apr 2013 08:07:50 -0700 (PDT) X-ASG-Debug-ID: 1365520068-04bdf0542d4915c0001-NocioJ Received: from mail-ia0-f172.google.com (mail-ia0-f172.google.com [209.85.210.172]) by cuda.sgi.com with ESMTP id RsRnH7gfAtNyP8dd (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 08:07:48 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.172] Received: by mail-ia0-f172.google.com with SMTP id k38so2688055iah.31 for ; Tue, 09 Apr 2013 08:07:48 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=c+OjNO5SDYrOw+HbFVtNAr+Y2mfBwPgnls1D3fZz2xY=; b=yfDThMZaRGSKWXPWVZ0NvDkzspF+NAsKLVzDcRv1SZfTh7qDdnDWhaScdkrTEpyDKw Bh5t39DTn6ZbHW+tPDkm9pxlnx7TIVXYmUTGKiIMXipiwdokfwhJsefS/iXGDALmZKfk MtFCeUPIccb/KbNcW4zptVgmbNtj9LpcKrIbsnyxCDR4wBJsnkgOD21rugB9+rdw3N2Y QMzmu3v6JwnMeOA2o4NxtRXAwF6z+OmsPuedoMLlm3ox3LGT6dfMvRYFtC3cO502GhKY zFymJSjmCg84Pr5Qz45Aoa4Jl3NM2LHPihDAa+oE8q7YtluKWSt/1926kyFPlzkh3DGW Ed3w== MIME-Version: 1.0 X-Received: by 10.43.5.1 with SMTP id oe1mr14311609icb.18.1365520067937; Tue, 09 Apr 2013 08:07:47 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 08:07:47 -0700 (PDT) In-Reply-To: <20130409145238.GE22182@sgi.com> References: <20130409145238.GE22182@sgi.com> Date: Tue, 9 Apr 2013 23:07:47 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Ben Myers Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=bcaec5101ccb959bb604d9eeeafc X-Barracuda-Connect: mail-ia0-f172.google.com[209.85.210.172] X-Barracuda-Start-Time: 1365520068 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.127640 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 --bcaec5101ccb959bb604d9eeeafc Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable before xfs force shutdown happens there seems no useful log in /var/log/messages Apr 9 10:38:08 cqdx smbd[4597]: Unable to connect to CUPS server localhost:631 - Connection refused Apr 9 10:38:08 cqdx smbd[3394]: [2013/04/09 10:38:08.944125, 0] printing/print_cups.c:468(cups_async_callback) Apr 9 10:38:08 cqdx smbd[3394]: failed to retrieve printer list: NT_STATUS_UNSUCCESSFUL Apr 9 10:51:09 cqdx smbd[5205]: [2013/04/09 10:51:09.723610, 0] printing/print_cups.c:109(cups_connect) Apr 9 10:51:09 cqdx smbd[5205]: Unable to connect to CUPS server localhost:631 - Connection refused Apr 9 10:51:09 cqdx smbd[3394]: [2013/04/09 10:51:09.724132, 0] printing/print_cups.c:468(cups_async_callback) Apr 9 10:51:09 cqdx smbd[3394]: failed to retrieve printer list: NT_STATUS_UNSUCCESSFUL Apr 9 11:01:30 cqdx kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22. Apr 9 11:01:30 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22 Apr 9 11:01:30 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02ee20a Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting down filesystem Apr 9 11:01:30 cqdx kernel: XFS (sdb): Please umount the filesystem and rectify the problem(s) Apr 9 11:01:51 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. Apr 9 11:02:21 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. Apr 9 11:02:51 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. Apr 9 11:03:21 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. Apr 9 11:03:51 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. Apr 9 11:03:57 cqdx init: tty (/dev/tty1) main process (3427) killed by TERM signal Apr 9 11:03:57 cqdx init: tty (/dev/tty2) main process (3429) killed by TERM signal 2013/4/9 Ben Myers > Hey Yongtaofu, > > On Tue, Apr 09, 2013 at 09:05:32PM +0800, =B7=FB=D3=C0=CC=CE wrote: > > Also I want to know why all the server, all crash with the same crash > stack? > > Thank you, really need your help. > > What you've posted so far looks like evidence of a forced shutdown and no= t > a > crash. Is there a crash in addition to this forced shutdown? If so, can > you > post the stack for that too? > > > > > 2013/4/9, =B7=FB=D3=C0=CC=CE : > > > BTW > > > xfs_info /dev/sdb > > > meta-data=3D/dev/sdb isize=3D256 agcount=3D28, > agsize=3D268435440 > > > blks > > > =3D sectsz=3D512 attr=3D2 > > > data =3D bsize=3D4096 blocks=3D7324303360= , > imaxpct=3D5 > > > =3D sunit=3D16 swidth=3D160 blks > > > naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 > > > log =3Dinternal bsize=3D4096 blocks=3D521728, ve= rsion=3D2 > > > =3D sectsz=3D512 sunit=3D16 blks, > lazy-count=3D1 > > > realtime =3Dnone extsz=3D4096 blocks=3D0, rtexten= ts=3D0 > > > > > > 2013/4/9, =B7=FB=D3=C0=CC=CE : > > >> Dear xfs experts, > > >> I really need your help sincerely!!! In our production enviroment we > > >> run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs fil= e > > >> system crash on some of the server frequently about every two weeks. > > >> Can you help to give me a direction about how to debug this issue an= d > > >> how to avoid it? Thank you very very much! > > >> > > >> uname -a > > >> Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 > > >> #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux > > >> > > >> Every time the crash log is same, as following > > An initial guess is that somehow it is looking up a bad inode number, e.g= . > it > is beyond the end of the filesystem and xfs_dilocate returns EINVAL. > > You could 'xfs_repair -n' to see what it finds (without modifying the > filesystem) as a first step. > > > >> 038 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > > >> xfs_inotobp() returned error 22. > > Were there any lines of output before this? In some codebases there are > prints > in xfs_inotobp that would help show what happened. > > > >> 1039 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree > > >> returned error 22 > > >> 1040 Apr 9 09:41:36 cqdx kernel: XFS (sdb): > > >> xfs_do_force_shutdown(0x1) called from line 1184 of file > > >> fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02ee20a > > >> 1041 Apr 9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected. > > >> Shutting down filesystem > > >> 1042 Apr 9 09:41:36 cqdx kernel: XFS (sdb): Please umount the > > >> filesystem and rectify the problem(s) > > >> 1043 Apr 9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > > >> returned. > > >> 1044 Apr 9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > > >> returned. > > >> 1045 Apr 9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > > >> returned. > > >> 1046 Apr 9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > > >> returned. > > The error 5 (EIO) look scary but they are due to the forced shutdown, don= 't > worry about them. > > Thanks, > Ben > --=20 =B7=FB=D3=C0=CC=CE --bcaec5101ccb959bb604d9eeeafc Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
before xfs force shutdown happens there seems no useful lo= g in /var/log/messages

Apr  9 10:38:08 cqdx smbd[4597]: &n= bsp; Unable to connect to CUPS server localhost:631 - Connection refusedApr  9 10:38:08 cqdx smbd[3394]: [2013/04/09 10:38:08.944125,  0= ] printing/print_cups.c:468(cups_async_callback)
Apr  9 10:38:08 cqdx smbd[3394]:   failed to retrieve printe= r list: NT_STATUS_UNSUCCESSFUL
Apr  9 10:51:09 cqdx smbd[5205]: [20= 13/04/09 10:51:09.723610,  0] printing/print_cups.c:109(cups_connect)<= br>Apr  9 10:51:09 cqdx smbd[5205]:   Unable to connect to C= UPS server localhost:631 - Connection refused
Apr  9 10:51:09 cqdx smbd[3394]: [2013/04/09 10:51:09.724132,  0]= printing/print_cups.c:468(cups_async_callback)
Apr  9 10:51:09 cqd= x smbd[3394]:   failed to retrieve printer list: NT_STATUS_UNSUCC= ESSFUL
Apr  9 11:01:30 cqdx kernel: XFS (sdb): xfs_iunlink_remove: = xfs_inotobp() returned error 22.
Apr  9 11:01:30 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree return= ed error 22
Apr  9 11:01:30 cqdx kernel: XFS (sdb): xfs_do_force_sh= utdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c.  Retu= rn address =3D 0xffffffffa02ee20a
Apr  9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting d= own filesystem
Apr  9 11:01:30 cqdx kernel: XFS (sdb): Please umoun= t the filesystem and rectify the problem(s)
Apr  9 11:01:51 cqdx ke= rnel: XFS (sdb): xfs_log_force: error 5 returned.
Apr  9 11:02:21 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
Apr  9 11:02:51 cqdx kernel: XFS (sdb): xfs_log_force: error 5 r= eturned.
Apr  9 11:03:21 cqdx kernel: XFS (sdb): xfs_log_force: err= or 5 returned.
Apr  9 11:03:51 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
Apr  9 11:03:57 cqdx init: tty (/dev/tty1) main process (3427) k= illed by TERM signal
Apr  9 11:03:57 cqdx init: tty (/dev/tty2) mai= n process (3429) killed by TERM signal



201= 3/4/9 Ben Myers <bpm@sgi.com>
Hey Yongtaofu,

On Tue, Apr 09, 2013 at 09:05:32PM +0800, =B7=FB=D3=C0=CC=CE wrote:
> Also I want to know why all the server, all crash with the same crash = stack?
> Thank you, really need your help.

What you've posted so far looks like evidence of a forced shutdow= n and not a
crash.  Is there a crash in addition to this forced shutdown?  If= so, can you
post the stack for that too?

>
> 2013/4/9, =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>:
> > BTW
> > xfs_info /dev/sdb
> > meta-data=3D/dev/sdb             &n= bsp; isize=3D256    agcount=3D28, agsize=3D268435440
> > blks
> >          =3D        =               sectsz=3D512   attr= =3D2
> > data     =3D             =           bsize=3D4096   blocks=3D7324303360,= imaxpct=3D5
> >          =3D        =               sunit=3D16     = swidth=3D160 blks
> > naming   =3Dversion 2           &nb= sp;  bsize=3D4096   ascii-ci=3D0
> > log      =3Dinternal         &= nbsp;     bsize=3D4096   blocks=3D521728, version=3D2
> >          =3D        =               sectsz=3D512   sunit= =3D16 blks, lazy-count=3D1
> > realtime =3Dnone              =     extsz=3D4096   blocks=3D0, rtextents=3D0
> >
> > 2013/4/9, =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>:
> >> Dear xfs experts,
> >> I really need your help sincerely!!! In our production enviro= ment we
> >> run glusterfs over top of xfs on Dell x720D(Raid 6). And the = xfs file
> >> system crash on some of the server frequently about every two= weeks.
> >> Can you help to give me a direction about how to debug this i= ssue and
> >> how to avoid it? Thank you very very much!
> >>
> >> uname -a
> >> Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6= .x86_64
> >> #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/= Linux
> >>
> >> Every time the crash log is same, as following

An initial guess is that somehow it is looking up a bad inode number,= e.g. it
is beyond the end of the filesystem and xfs_dilocate returns EINVAL.

You could 'xfs_repair -n' to see what it finds (without modifying t= he
filesystem) as a first step.

> >> 038 Apr  9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_= remove:
> >> xfs_inotobp() returned error 22.

Were there any lines of output before this?  In some codebases t= here are prints
in xfs_inotobp that would help show what happened.

> >> 1039 Apr  9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactiv= e: xfs_ifree
> >> returned error 22
> >> 1040 Apr  9 09:41:36 cqdx kernel: XFS (sdb):
> >> xfs_do_force_shutdown(0x1) called from line 1184 of file
> >> fs/xfs/xfs_vnodeops.c.  Return address =3D 0xffffffffa02= ee20a
> >> 1041 Apr  9 09:41:36 cqdx kernel: XFS (sdb): I/O Error D= etected.
> >> Shutting down filesystem
> >> 1042 Apr  9 09:41:36 cqdx kernel: XFS (sdb): Please umou= nt the
> >> filesystem and rectify the problem(s)
> >> 1043 Apr  9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
> >> returned.
> >> 1044 Apr  9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
> >> returned.
> >> 1045 Apr  9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
> >> returned.
> >> 1046 Apr  9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
> >> returned.

The error 5 (EIO) look scary but they are due to the forced shutdown,= don't
worry about them.

Thanks,
        Ben



--
=B7=FB=D3=C0=CC=CE
--bcaec5101ccb959bb604d9eeeafc-- From yongtaofu@gmail.com Tue Apr 9 10:10:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 710DB29E17 for ; Tue, 9 Apr 2013 10:10:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5E7838F8068 for ; Tue, 9 Apr 2013 08:10:09 -0700 (PDT) X-ASG-Debug-ID: 1365520207-04cb6c1e7a49a2a0001-NocioJ Received: from mail-ia0-f178.google.com (mail-ia0-f178.google.com [209.85.210.178]) by cuda.sgi.com with ESMTP id lTa5ItDGBJXEPFqK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 08:10:07 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.178] Received: by mail-ia0-f178.google.com with SMTP id f27so724917iae.37 for ; Tue, 09 Apr 2013 08:10:07 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=HxxlZTjOVKI/J70n6HLEQKFSF4+E6pYi7qNEbxMBwRQ=; b=JN7gI+DPMBPKrNMlxhP3YGQO57ux/TyFNp4DVcV48GRzuOaYv4yBUFJ574elldNurH hFsmrCPGuluWLRm49DxCTgGbaP6s5sFNgBz31xpY7PUCa7tM62D2LQxF3JTBFta1UZur J9Amcw4wGSDNwCEaLZuPO9842AblJrzSix+2dIJj2h79QdLQufPgoj6ODQP//LLn8PlW 2Mrfqi8Dj9R1Yi6dQr01sm+E3wbwL7PzU1cVLSMciAcO1ZwnWfZPZb2kUV4e/6Yg+wIb FZUVvk4qp3Q189tIW1L8xbTjULbUsc1nWKYj8iCAYzp7nS25OntgO4nsFOYdxRvKruov q+sg== MIME-Version: 1.0 X-Received: by 10.50.51.167 with SMTP id l7mr10298582igo.11.1365520203987; Tue, 09 Apr 2013 08:10:03 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 08:10:03 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> Date: Tue, 9 Apr 2013 23:10:03 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Ben Myers Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=14dae9340b5fb2378b04d9eef2d2 X-Barracuda-Connect: mail-ia0-f178.google.com[209.85.210.178] X-Barracuda-Start-Time: 1365520207 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127640 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 --14dae9340b5fb2378b04d9eef2d2 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Today 3 of our servers were impacted by the xfs shutdown. The logs are identical. 2013/4/9 =B7=FB=D3=C0=CC=CE > before xfs force shutdown happens there seems no useful log in > /var/log/messages > > Apr 9 10:38:08 cqdx smbd[4597]: Unable to connect to CUPS server > localhost:631 - Connection refused > Apr 9 10:38:08 cqdx smbd[3394]: [2013/04/09 10:38:08.944125, 0] > printing/print_cups.c:468(cups_async_callback) > Apr 9 10:38:08 cqdx smbd[3394]: failed to retrieve printer list: > NT_STATUS_UNSUCCESSFUL > Apr 9 10:51:09 cqdx smbd[5205]: [2013/04/09 10:51:09.723610, 0] > printing/print_cups.c:109(cups_connect) > Apr 9 10:51:09 cqdx smbd[5205]: Unable to connect to CUPS server > localhost:631 - Connection refused > Apr 9 10:51:09 cqdx smbd[3394]: [2013/04/09 10:51:09.724132, 0] > printing/print_cups.c:468(cups_async_callback) > Apr 9 10:51:09 cqdx smbd[3394]: failed to retrieve printer list: > NT_STATUS_UNSUCCESSFUL > Apr 9 11:01:30 cqdx kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() > returned error 22. > Apr 9 11:01:30 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree returned > error 22 > Apr 9 11:01:30 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called > from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D > 0xffffffffa02ee20a > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting down > filesystem > Apr 9 11:01:30 cqdx kernel: XFS (sdb): Please umount the filesystem and > rectify the problem(s) > Apr 9 11:01:51 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 9 11:02:21 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 9 11:02:51 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 9 11:03:21 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 9 11:03:51 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 9 11:03:57 cqdx init: tty (/dev/tty1) main process (3427) killed by > TERM signal > Apr 9 11:03:57 cqdx init: tty (/dev/tty2) main process (3429) killed by > TERM signal > > > > 2013/4/9 Ben Myers > >> Hey Yongtaofu, >> >> On Tue, Apr 09, 2013 at 09:05:32PM +0800, =B7=FB=D3=C0=CC=CE wrote: >> > Also I want to know why all the server, all crash with the same crash >> stack? >> > Thank you, really need your help. >> >> What you've posted so far looks like evidence of a forced shutdown and >> not a >> crash. Is there a crash in addition to this forced shutdown? If so, ca= n >> you >> post the stack for that too? >> >> > >> > 2013/4/9, =B7=FB=D3=C0=CC=CE : >> > > BTW >> > > xfs_info /dev/sdb >> > > meta-data=3D/dev/sdb isize=3D256 agcount=3D28, >> agsize=3D268435440 >> > > blks >> > > =3D sectsz=3D512 attr=3D2 >> > > data =3D bsize=3D4096 blocks=3D732430336= 0, >> imaxpct=3D5 >> > > =3D sunit=3D16 swidth=3D160 blks >> > > naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 >> > > log =3Dinternal bsize=3D4096 blocks=3D521728, v= ersion=3D2 >> > > =3D sectsz=3D512 sunit=3D16 blks, >> lazy-count=3D1 >> > > realtime =3Dnone extsz=3D4096 blocks=3D0, rtexte= nts=3D0 >> > > >> > > 2013/4/9, =B7=FB=D3=C0=CC=CE : >> > >> Dear xfs experts, >> > >> I really need your help sincerely!!! In our production enviroment w= e >> > >> run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs fi= le >> > >> system crash on some of the server frequently about every two weeks= . >> > >> Can you help to give me a direction about how to debug this issue a= nd >> > >> how to avoid it? Thank you very very much! >> > >> >> > >> uname -a >> > >> Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_6= 4 >> > >> #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux >> > >> >> > >> Every time the crash log is same, as following >> >> An initial guess is that somehow it is looking up a bad inode number, >> e.g. it >> is beyond the end of the filesystem and xfs_dilocate returns EINVAL. >> >> You could 'xfs_repair -n' to see what it finds (without modifying the >> filesystem) as a first step. >> >> > >> 038 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: >> > >> xfs_inotobp() returned error 22. >> >> Were there any lines of output before this? In some codebases there are >> prints >> in xfs_inotobp that would help show what happened. >> >> > >> 1039 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifre= e >> > >> returned error 22 >> > >> 1040 Apr 9 09:41:36 cqdx kernel: XFS (sdb): >> > >> xfs_do_force_shutdown(0x1) called from line 1184 of file >> > >> fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02ee20a >> > >> 1041 Apr 9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected. >> > >> Shutting down filesystem >> > >> 1042 Apr 9 09:41:36 cqdx kernel: XFS (sdb): Please umount the >> > >> filesystem and rectify the problem(s) >> > >> 1043 Apr 9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> > >> returned. >> > >> 1044 Apr 9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> > >> returned. >> > >> 1045 Apr 9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> > >> returned. >> > >> 1046 Apr 9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> > >> returned. >> >> The error 5 (EIO) look scary but they are due to the forced shutdown, >> don't >> worry about them. >> >> Thanks, >> Ben >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --14dae9340b5fb2378b04d9eef2d2 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Today 3 of our servers were impacted by the xfs shutdown. = The logs are identical.


2013/4/9 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com= >
before xfs force shutdown h= appens there seems no useful log in /var/log/messages

Apr  9 10= :38:08 cqdx smbd[4597]:   Unable to connect to CUPS server localh= ost:631 - Connection refused
Apr  9 10:38:08 cqdx smbd[3394]: [2013/04/09 10:38:08.944125,  0]= printing/print_cups.c:468(cups_async_callback)
Apr  9 10:38:08 cqdx smbd[3394]:   failed to retrieve printe= r list: NT_STATUS_UNSUCCESSFUL
Apr  9 10:51:09 cqdx smbd[5205]: [20= 13/04/09 10:51:09.723610,  0] printing/print_cups.c:109(cups_connect)<= br>Apr  9 10:51:09 cqdx smbd[5205]:   Unable to connect to C= UPS server localhost:631 - Connection refused
Apr  9 10:51:09 cqdx smbd[3394]: [2013/04/09 10:51:09.724132,  0]= printing/print_cups.c:468(cups_async_callback)
Apr  9 10:51:09 cqd= x smbd[3394]:   failed to retrieve printer list: NT_STATUS_UNSUCC= ESSFUL
Apr  9 11:01:30 cqdx kernel: XFS (sdb): xfs_iunlink_remove: = xfs_inotobp() returned error 22.
Apr  9 11:01:30 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree return= ed error 22
Apr  9 11:01:30 cqdx kernel: XFS (sdb): xfs_do_force_sh= utdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c.  Retu= rn address =3D 0xffffffffa02ee20a
Apr  9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting d= own filesystem
Apr  9 11:01:30 cqdx kernel: XFS (sdb): Please umoun= t the filesystem and rectify the problem(s)
Apr  9 11:01:51 cqdx ke= rnel: XFS (sdb): xfs_log_force: error 5 returned.
Apr  9 11:02:21 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
Apr  9 11:02:51 cqdx kernel: XFS (sdb): xfs_log_force: error 5 r= eturned.
Apr  9 11:03:21 cqdx kernel: XFS (sdb): xfs_log_force: err= or 5 returned.
Apr  9 11:03:51 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
Apr  9 11:03:57 cqdx init: tty (/dev/tty1) main process (3427) k= illed by TERM signal
Apr  9 11:03:57 cqdx init: tty (/dev/tty2) mai= n process (3429) killed by TERM signal



2013/4/9 Ben Myers <bpm@sgi.com>
Hey Yongtaofu,

On Tue, Apr 09, 2013 at 09:05:32PM +0800, =B7=FB=D3=C0=CC=CE wrote:
> Also I want to know why all the server, all crash with the same crash = stack?
> Thank you, really need your help.

What you've posted so far looks like evidence of a forced shutdow= n and not a
crash.  Is there a crash in addition to this forced shutdown?  If= so, can you
post the stack for that too?

>
> 2013/4/9, =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>:
> > BTW
> > xfs_info /dev/sdb
> > meta-data=3D/dev/sdb             &n= bsp; isize=3D256    agcount=3D28, agsize=3D268435440
> > blks
> >          =3D        =               sectsz=3D512   attr= =3D2
> > data     =3D             =           bsize=3D4096   blocks=3D7324303360,= imaxpct=3D5
> >          =3D        =               sunit=3D16     = swidth=3D160 blks
> > naming   =3Dversion 2           &nb= sp;  bsize=3D4096   ascii-ci=3D0
> > log      =3Dinternal         &= nbsp;     bsize=3D4096   blocks=3D521728, version=3D2
> >          =3D        =               sectsz=3D512   sunit= =3D16 blks, lazy-count=3D1
> > realtime =3Dnone              =     extsz=3D4096   blocks=3D0, rtextents=3D0
> >
> > 2013/4/9, =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>:
> >> Dear xfs experts,
> >> I really need your help sincerely!!! In our production enviro= ment we
> >> run glusterfs over top of xfs on Dell x720D(Raid 6). And the = xfs file
> >> system crash on some of the server frequently about every two= weeks.
> >> Can you help to give me a direction about how to debug this i= ssue and
> >> how to avoid it? Thank you very very much!
> >>
> >> uname -a
> >> Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6= .x86_64
> >> #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/= Linux
> >>
> >> Every time the crash log is same, as following

An initial guess is that somehow it is looking up a bad inode number,= e.g. it
is beyond the end of the filesystem and xfs_dilocate returns EINVAL.

You could 'xfs_repair -n' to see what it finds (without modifying t= he
filesystem) as a first step.

> >> 038 Apr  9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_= remove:
> >> xfs_inotobp() returned error 22.

Were there any lines of output before this?  In some codebases t= here are prints
in xfs_inotobp that would help show what happened.

> >> 1039 Apr  9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactiv= e: xfs_ifree
> >> returned error 22
> >> 1040 Apr  9 09:41:36 cqdx kernel: XFS (sdb):
> >> xfs_do_force_shutdown(0x1) called from line 1184 of file
> >> fs/xfs/xfs_vnodeops.c.  Return address =3D 0xffffffffa02= ee20a
> >> 1041 Apr  9 09:41:36 cqdx kernel: XFS (sdb): I/O Error D= etected.
> >> Shutting down filesystem
> >> 1042 Apr  9 09:41:36 cqdx kernel: XFS (sdb): Please umou= nt the
> >> filesystem and rectify the problem(s)
> >> 1043 Apr  9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
> >> returned.
> >> 1044 Apr  9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
> >> returned.
> >> 1045 Apr  9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
> >> returned.
> >> 1046 Apr  9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
> >> returned.

The error 5 (EIO) look scary but they are due to the forced shutdown,= don't
worry about them.

Thanks,
        Ben



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--14dae9340b5fb2378b04d9eef2d2-- From yongtaofu@gmail.com Tue Apr 9 10:19:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 980527FBF for ; Tue, 9 Apr 2013 10:19:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2603BAC003 for ; Tue, 9 Apr 2013 08:18:59 -0700 (PDT) X-ASG-Debug-ID: 1365520736-04bdf0542c492e70001-NocioJ Received: from mail-ie0-f177.google.com (mail-ie0-f177.google.com [209.85.223.177]) by cuda.sgi.com with ESMTP id atx6zKqcJ3zwVaji (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 08:18:56 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] Received: by mail-ie0-f177.google.com with SMTP id tp5so8330705ieb.8 for ; Tue, 09 Apr 2013 08:18:56 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=NKbE67Cv+6Ay4RokXhhe5TEW0eNiV1gpa2r7vn1wp2I=; b=tfIu4fx7hF2nH66V8+5mJEBgScUpIMO39FIdDsZTS4dWRi0HbYDZt5V9cH7W8SQRWa CpWWKC5gCVYYvnypt02eaRy+JcsvHjOY0TsD3fnwmYMaHH6EZBWEeA+XkO+rXnhrjqHi Xv2uDuqxdUUu+8kk0w1S6TUyxmzPSXBRVjteYbwkPX/hkYq7whBybdvFmtoown0EFJuY wYsslWEQ24IvSegQeWMxhsEHqWhVewcconeJPevCIDhbd3cFY3bOb9ebpK9hedG4bGZ3 Q/31nhj5GPWfXH9MfVPqHT2eIwcMjZ9jgCn37x0vVEF7MnMUWNwtLI607zlykxgWXEk7 7tyQ== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr10696307igx.11.1365520736375; Tue, 09 Apr 2013 08:18:56 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 08:18:56 -0700 (PDT) In-Reply-To: <51642E5E.3040403@sandeen.net> References: <51642E5E.3040403@sandeen.net> Date: Tue, 9 Apr 2013 23:18:56 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e0111e0746d28cd04d9ef12a1 X-Barracuda-Connect: mail-ie0-f177.google.com[209.85.223.177] X-Barracuda-Start-Time: 1365520736 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.127640 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 --089e0111e0746d28cd04d9ef12a1 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable The servers are back to service now and It's hard to run xfs_repair. It always happen bellow is the xfs_repair log when it happens on another server several days ago. -sh-4.1$ sudo xfs_repair -n /dev/glustervg/glusterlv Phase 1 - find and verify superblock=A1=AD Phase 2 - using internal log - scan filesystem freespace and inode maps=A1=AD agi unlinked bucket 0 is 4046848 in ag 0 (inode=3D4046848) agi unlinked bucket 5 is 2340485 in ag 0 (inode=3D2340485) agi unlinked bucket 6 is 2326854 in ag 0 (inode=3D2326854) agi unlinked bucket 8 is 1802120 in ag 0 (inode=3D1802120) agi unlinked bucket 14 is 495566 in ag 0 (inode=3D495566) agi unlinked bucket 16 is 5899536 in ag 0 (inode=3D5899536) agi unlinked bucket 19 is 4008211 in ag 0 (inode=3D4008211) agi unlinked bucket 21 is 4906965 in ag 0 (inode=3D4906965) agi unlinked bucket 23 is 2022231 in ag 0 (inode=3D2022231) agi unlinked bucket 24 is 1626200 in ag 0 (inode=3D1626200) agi unlinked bucket 25 is 938585 in ag 0 (inode=3D938585) agi unlinked bucket 30 is 4226526 in ag 0 (inode=3D4226526) agi unlinked bucket 34 is 4108962 in ag 0 (inode=3D4108962) agi unlinked bucket 37 is 1740389 in ag 0 (inode=3D1740389) agi unlinked bucket 39 is 247399 in ag 0 (inode=3D247399) agi unlinked bucket 40 is 6237864 in ag 0 (inode=3D6237864) agi unlinked bucket 43 is 3404331 in ag 0 (inode=3D3404331) agi unlinked bucket 45 is 2092717 in ag 0 (inode=3D2092717) agi unlinked bucket 48 is 4041008 in ag 0 (inode=3D4041008) agi unlinked bucket 50 is 1459762 in ag 0 (inode=3D1459762) agi unlinked bucket 56 is 852024 in ag 0 (inode=3D852024) - found root in ode chunk Phase 3 - for each AG=A1=AD - scan (but don't clear) agi unlinked lists=A1=AD - process known inodes and perform inode discovery=A1=AD - agno =3D 0 7f084d34e700: Badness in key lookup (length) bp=3D(bno 123696, len 16384 bytes) key=3D(bno 123696, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 247776, len 16384 bytes) key=3D(bno 247776, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 425984, len 16384 bytes) key=3D(bno 425984, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 469280, len 16384 bytes) key=3D(bno 469280, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 729856, len 16384 bytes) key=3D(bno 729856, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 813072, len 16384 bytes) key=3D(bno 813072, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 870176, len 16384 bytes) key=3D(bno 870176, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 901056, len 16384 bytes) key=3D(bno 901056, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 1011104, len 16384 bytes) key=3D(bno 1011104, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 1046336, len 16384 bytes) key=3D(bno 1046336, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 1163424, len 16384 bytes) key=3D(bno 1163424, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 1170240, len 16384 bytes) key=3D(bno 1170240, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 1702160, len 16384 bytes) key=3D(bno 1702160, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 2004096, len 16384 bytes) key=3D(bno 2004096, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 2020496, len 16384 bytes) key=3D(bno 2020496, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 2023408, len 16384 bytes) key=3D(bno 2023408, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 2054464, len 16384 bytes) key=3D(bno 2054464, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 2113232, len 16384 bytes) key=3D(bno 2113232, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 2453472, len 16384 bytes) key=3D(bno 2453472, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 2949760, len 16384 bytes) key=3D(bno 2949760, len 8192 bytes) 7f084d34e700: Badness in key lookup (length) bp=3D(bno 3118912, len 16384 bytes) key=3D(bno 3118912, len 8192 bytes) - agno =3D 1 - agno =3D 2 - agno =3D 3 - agno =3D 4 - agno =3D 5 - agno =3D 6 - agno =3D 7 - agno =3D 8 - agno =3D 9 - agno =3D 10 - agno =3D 11 - agno =3D 12 - agno =3D 13 - agno =3D 14 - agno =3D 15 - agno =3D 16 - agno =3D 17 - agno =3D 18 - agno =3D 19 - agno =3D 20 - agno =3D 21 - agno =3D 22 - agno =3D 23 - agno =3D 24 - agno =3D 25 - agno =3D 26 - agno =3D 27 - agno =3D 28 - agno =3D 29 - agno =3D 30 - process newly discovered in odes.. Phase 4 - check for duplicate blocks=A1=AD - setting up duplicate extent list=A1=AD - check for inodes claiming duplicate blocks=A1=AD - agno =3D 0 - agno =3D 1 - agno =3D 3 - agno =3D 9 - agno =3D 12 - agno =3D 14 - agno =3D 5 - agno =3D 19 - agno =3D 23 - agno =3D 24 - agno =3D 25 - agno =3D 26 - agno =3D 27 - agno =3D 28 - agno =3D 29 - agno =3D 30 - agno =3D 4 - agno =3D 2 - agno =3D 17 - agno =3D 6 - agno =3D 8 - agno =3D 16 - agno =3D 11 - agno =3D 10 - agno =3D 18 - agno =3D 13 - agno =3D 15 - agno =3D 20 - agno =3D 22 - agno =3D 21 - agno =3D 7 No modify flag set, skipping phase 5 Phase 6 - check inode connectivity=A1=AD - traversing filesystem =A1=AD - traversal finished =A1=AD - moving disconnected inodes to lost+found =A1=AD disconnected inode 6235944, would move to lost+found Phase 7 - verify link counts=A1=AD would have reset inode 6235944 nlinks from 0 to 1 No modify flag set, skipping filesystem flush and exiting.. =B5=DA=B6=FE=B2=BD repair=B5=C4log sh-4.1$ sudo xfs_repair /dev/glustervg/glusterlv Phase 1 - find and verify superblock=A1=AD Phase 2 - using internal log - zero log=A1=AD - scan filesystem freespace and inode maps=A1=AD agi unlinked bucket 0 is 4046848 in ag 0 (inode=3D4046848) agi unlinked bucket 5 is 2340485 in ag 0 (inode=3D2340485) agi unlinked bucket 6 is 2326854 in ag 0 (inode=3D2326854) agi unlinked bucket 8 is 1802120 in ag 0 (inode=3D1802120) agi unlinked bucket 14 is 495566 in ag 0 (inode=3D495566) agi unlinked bucket 16 is 5899536 in ag 0 (inode=3D5899536) agi unlinked bucket 19 is 4008211 in ag 0 (inode=3D4008211) agi unlinked bucket 21 is 4906965 in ag 0 (inode=3D4906965) agi unlinked bucket 23 is 2022231 in ag 0 (inode=3D2022231) agi unlinked bucket 24 is 1626200 in ag 0 (inode=3D1626200) agi unlinked bucket 25 is 938585 in ag 0 (inode=3D938585) agi unlinked bucket 30 is 4226526 in ag 0 (inode=3D4226526) agi unlinked bucket 34 is 4108962 in ag 0 (inode=3D4108962) agi unlinked bucket 37 is 1740389 in ag 0 (inode=3D1740389) agi unlinked bucket 39 is 247399 in ag 0 (inode=3D247399) agi unlinked bucket 40 is 6237864 in ag 0 (inode=3D6237864) agi unlinked bucket 43 is 3404331 in ag 0 (inode=3D3404331) agi unlinked bucket 45 is 2092717 in ag 0 (inode=3D2092717) agi unlinked bucket 48 is 4041008 in ag 0 (inode=3D4041008) agi unlinked bucket 50 is 1459762 in ag 0 (inode=3D1459762) agi unlinked bucket 56 is 852024 in ag 0 (inode=3D852024) - found root in ode chunk Phase 3 - for each AG=A1=AD - scan and clear agi unlinked lists=A1=AD - process known inodes and perform inode discovery=A1=AD - agno =3D 0 7f8220be6700: Badness in key lookup (length) bp=3D(bno 123696, len 16384 bytes) key=3D(bno 123696, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 247776, len 16384 bytes) key=3D(bno 247776, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 425984, len 16384 bytes) key=3D(bno 425984, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 469280, len 16384 bytes) key=3D(bno 469280, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 729856, len 16384 bytes) key=3D(bno 729856, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 813072, len 16384 bytes) key=3D(bno 813072, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 870176, len 16384 bytes) key=3D(bno 870176, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 901056, len 16384 bytes) key=3D(bno 901056, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 1011104, len 16384 bytes) key=3D(bno 1011104, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 1046336, len 16384 bytes) key=3D(bno 1046336, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 1163424, len 16384 bytes) key=3D(bno 1163424, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 1170240, len 16384 bytes) key=3D(bno 1170240, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 1702160, len 16384 bytes) key=3D(bno 1702160, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 2004096, len 16384 bytes) key=3D(bno 2004096, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 2020496, len 16384 bytes) key=3D(bno 2020496, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 2023408, len 16384 bytes) key=3D(bno 2023408, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 2054464, len 16384 bytes) key=3D(bno 2054464, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 2113232, len 16384 bytes) key=3D(bno 2113232, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 2453472, len 16384 bytes) key=3D(bno 2453472, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 2949760, len 16384 bytes) key=3D(bno 2949760, len 8192 bytes) 7f8220be6700: Badness in key lookup (length) bp=3D(bno 3118912, len 16384 bytes) key=3D(bno 3118912, len 8192 bytes) - agno =3D 1 - agno =3D 2 - agno =3D 3 - agno =3D 4 - agno =3D 5 - agno =3D 6 - agno =3D 7 - agno =3D 8 - agno =3D 9 - agno =3D 10 - agno =3D 11 - agno =3D 12 - agno =3D 13 - agno =3D 14 - agno =3D 15 - agno =3D 16 - agno =3D 17 - agno =3D 18 - agno =3D 19 - agno =3D 20 - agno =3D 21 - agno =3D 22 - agno =3D 23 - agno =3D 24 - agno =3D 25 - agno =3D 26 - agno =3D 27 - agno =3D 28 - agno =3D 29 - agno =3D 30 - process newly discovered in odes.. Phase 4 - check for duplicate blocks=A1=AD - setting up duplicate extent list=A1=AD - check for inodes claiming duplicate blocks=A1=AD - agno =3D 0 - agno =3D 4 - agno =3D 2 - agno =3D 3 - agno =3D 7 - agno =3D 18 - agno =3D 28 - agno =3D 6 - agno =3D 5 - agno =3D 1 - agno =3D 26 - agno =3D 8 - agno =3D 14 - agno =3D 17 - agno =3D 16 - agno =3D 10 - agno =3D 20 - agno =3D 13 - agno =3D 15 - agno =3D 11 - agno =3D 19 - agno =3D 22 - agno =3D 21 - agno =3D 23 - agno =3D 9 - agno =3D 12 - agno =3D 24 - agno =3D 27 - agno =3D 25 - agno =3D 29 - agno =3D 30 Phase 5 - rebuild AG headers and trees=A1=AD - reset superblock=A1=AD Phase 6 - check inode connectivity=A1=AD - resetting contents of realtime bitmap and summary in odes - traversing filesystem =A1=AD - traversal finished =A1=AD - moving disconnected inodes to lost+found =A1=AD disconnected inode 6235944, moving to lost+found Phase 7 - verify and correct link counts=A1=AD done sh-4.1$ . 2013/4/9 Eric Sandeen > On 4/9/13 7:53 AM, =B7=FB=D3=C0=CC=CE wrote: > > Dear xfs experts, > > I really need your help sincerely!!! In our production enviroment we > > run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs file > > system crash on some of the server frequently about every two weeks. > > Can you help to give me a direction about how to debug this issue and > > how to avoid it? Thank you very very much! > > So this happens reliably, but infrequently? (only every 2 weeks or so?) > > Can you provoke it any more often? > > > uname -a > > Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 > > #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux > > That's a RHEL6 kernel; I'm assuming that this is a RHEL clone w/o RH > support? > > I agree with Ben that I'd like to see xfs_repair output. > > Since the fs has shut down, you should unmount, remount, and unmount > again to replay the dirty log. Then do xfs_repair -n, and provide the > output > if it discovers any errors. > > Thanks, > -Eric > > > Every time the crash log is same, as following > > > > 038 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > > xfs_inotobp() returned error 22. > > 1039 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree > > returned error 22 > > 1040 Apr 9 09:41:36 cqdx kernel: XFS (sdb): > > xfs_do_force_shutdown(0x1) called from line 1184 of file > > fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02ee20a > > 1041 Apr 9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected. > > Shutting down filesystem > > 1042 Apr 9 09:41:36 cqdx kernel: XFS (sdb): Please umount the > > filesystem and rectify the problem(s) > > 1043 Apr 9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > 1044 Apr 9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > 1045 Apr 9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > 1046 Apr 9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > > > --=20 =B7=FB=D3=C0=CC=CE --089e0111e0746d28cd04d9ef12a1 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
The servers are back to service now and It's hard to r= un xfs_repair. It always happen bellow is the xfs_repair log when it happen= s on another server several days ago.
 -sh-4.1$ sudo xfs_repair -n= /dev/glustervg/glusterlv
Phase 1 - find and verify superblock…
Phase 2 - using internal lo= g
        - scan filesystem freespace= and inode maps…
agi unlinked bucket 0 is 4046848 in ag 0 (inode= =3D4046848)
agi unlinked bucket 5 is 2340485 in ag 0 (inode=3D2340485) agi unlinked bucket 6 is 2326854 in ag 0 (inode=3D2326854)
agi unlinked = bucket 8 is 1802120 in ag 0 (inode=3D1802120)
agi unlinked bucket 14 is = 495566 in ag 0 (inode=3D495566)
agi unlinked bucket 16 is 5899536 in ag = 0 (inode=3D5899536)
agi unlinked bucket 19 is 4008211 in ag 0 (inode=3D4008211)
agi unlinked= bucket 21 is 4906965 in ag 0 (inode=3D4906965)
agi unlinked bucket 23 i= s 2022231 in ag 0 (inode=3D2022231)
agi unlinked bucket 24 is 1626200 in= ag 0 (inode=3D1626200)
agi unlinked bucket 25 is 938585 in ag 0 (inode=3D938585)
agi unlinked b= ucket 30 is 4226526 in ag 0 (inode=3D4226526)
agi unlinked bucket 34 is = 4108962 in ag 0 (inode=3D4108962)
agi unlinked bucket 37 is 1740389 in a= g 0 (inode=3D1740389)
agi unlinked bucket 39 is 247399 in ag 0 (inode=3D247399)
agi unlinked b= ucket 40 is 6237864 in ag 0 (inode=3D6237864)
agi unlinked bucket 43 is = 3404331 in ag 0 (inode=3D3404331)
agi unlinked bucket 45 is 2092717 in a= g 0 (inode=3D2092717)
agi unlinked bucket 48 is 4041008 in ag 0 (inode=3D4041008)
agi unlinked= bucket 50 is 1459762 in ag 0 (inode=3D1459762)
agi unlinked bucket 56 i= s 852024 in ag 0 (inode=3D852024)
      &n= bsp; - found root in ode chunk
Phase 3 - for each AG…
        - scan (but don't clear) agi= unlinked lists…
        - pro= cess known inodes and perform inode discovery…
   =      - agno =3D 0
7f084d34e700: Badness in key looku= p (length)
bp=3D(bno 123696, len 16384 bytes) key=3D(bno 123696, len 819= 2 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 247776, len 16384= bytes) key=3D(bno 247776, len 8192 bytes)
7f084d34e700: Badness in key = lookup (length)
bp=3D(bno 425984, len 16384 bytes) key=3D(bno 425984, le= n 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 469280, len 16384= bytes) key=3D(bno 469280, len 8192 bytes)
7f084d34e700: Badness in key = lookup (length)
bp=3D(bno 729856, len 16384 bytes) key=3D(bno 729856, le= n 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 813072, len 16384= bytes) key=3D(bno 813072, len 8192 bytes)
7f084d34e700: Badness in key = lookup (length)
bp=3D(bno 870176, len 16384 bytes) key=3D(bno 870176, le= n 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 901056, len 16384= bytes) key=3D(bno 901056, len 8192 bytes)
7f084d34e700: Badness in key = lookup (length)
bp=3D(bno 1011104, len 16384 bytes) key=3D(bno 1011104, = len 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 1046336, len 1638= 4 bytes) key=3D(bno 1046336, len 8192 bytes)
7f084d34e700: Badness in ke= y lookup (length)
bp=3D(bno 1163424, len 16384 bytes) key=3D(bno 1163424= , len 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 1170240, len 1638= 4 bytes) key=3D(bno 1170240, len 8192 bytes)
7f084d34e700: Badness in ke= y lookup (length)
bp=3D(bno 1702160, len 16384 bytes) key=3D(bno 1702160= , len 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 2004096, len 1638= 4 bytes) key=3D(bno 2004096, len 8192 bytes)
7f084d34e700: Badness in ke= y lookup (length)
bp=3D(bno 2020496, len 16384 bytes) key=3D(bno 2020496= , len 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 2023408, len 1638= 4 bytes) key=3D(bno 2023408, len 8192 bytes)
7f084d34e700: Badness in ke= y lookup (length)
bp=3D(bno 2054464, len 16384 bytes) key=3D(bno 2054464= , len 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 2113232, len 1638= 4 bytes) key=3D(bno 2113232, len 8192 bytes)
7f084d34e700: Badness in ke= y lookup (length)
bp=3D(bno 2453472, len 16384 bytes) key=3D(bno 2453472= , len 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 2949760, len 1638= 4 bytes) key=3D(bno 2949760, len 8192 bytes)
7f084d34e700: Badness in ke= y lookup (length)
bp=3D(bno 3118912, len 16384 bytes) key=3D(bno 3118912= , len 8192 bytes)
        - agno =3D 1
  &nbs= p;     - agno =3D 2
     &n= bsp;  - agno =3D 3
        - agn= o =3D 4
        - agno =3D 5
 = ;       - agno =3D 6
   &nb= sp;    - agno =3D 7
      &= nbsp; - agno =3D 8
        - agno =3D= 9
        - agno =3D 10
        - agno =3D 11
  &nb= sp;     - agno =3D 12
     =    - agno =3D 13
        - = agno =3D 14
        - agno =3D 15
=         - agno =3D 16
  &nb= sp;     - agno =3D 17
     =    - agno =3D 18
        - = agno =3D 19
        - agno =3D 20
        - agno =3D 21
  &nb= sp;     - agno =3D 22
     =    - agno =3D 23
        - = agno =3D 24
        - agno =3D 25
=         - agno =3D 26
  &nb= sp;     - agno =3D 27
     =    - agno =3D 28
        - = agno =3D 29
        - agno =3D 30
        - process newly discovered in od= es..
Phase 4 - check for duplicate blocks…
   &= nbsp;    - setting up duplicate extent list…
 = ;       - check for inodes claiming duplicate= blocks…
        - agno =3D 0<= br>        - agno =3D 1
        - agno =3D 3
  &nbs= p;     - agno =3D 9
     &n= bsp;  - agno =3D 12
        - ag= no =3D 14
        - agno =3D 5
&nb= sp;       - agno =3D 19
   =      - agno =3D 23
     &nb= sp;  - agno =3D 24
        - agn= o =3D 25
        - agno =3D 26
        - agno =3D 27
  &nb= sp;     - agno =3D 28
     =    - agno =3D 29
        - = agno =3D 30
        - agno =3D 4
&= nbsp;       - agno =3D 2
   = ;     - agno =3D 17
     &n= bsp;  - agno =3D 6
        - agn= o =3D 8
        - agno =3D 16
        - agno =3D 11
  &nb= sp;     - agno =3D 10
     =    - agno =3D 18
        - = agno =3D 13
        - agno =3D 15
=         - agno =3D 20
  &nb= sp;     - agno =3D 22
     =    - agno =3D 21
        - = agno =3D 7
No modify flag set, skipping phase 5
Phase 6 - check inode connectivity…
     = ;   - traversing filesystem …
    &= nbsp;   - traversal finished …
    =     - moving disconnected inodes to lost+found …
d= isconnected inode 6235944, would move to lost+found
Phase 7 - verify link counts…
would have reset inode 6235944 nlin= ks from 0 to 1
No modify flag set, skipping filesystem flush and exiting= ..



=B5=DA=B6=FE=B2=BD
repair=B5=C4log

sh-4.1$ sudo= xfs_repair /dev/glustervg/glusterlv
Phase 1 - find and verify superblock…
Phase 2 - using internal lo= g
        - zero log…
 = ;       - scan filesystem freespace and inode= maps…
agi unlinked bucket 0 is 4046848 in ag 0 (inode=3D4046848)=
agi unlinked bucket 5 is 2340485 in ag 0 (inode=3D2340485)
agi unlinked bucket 6 is 2326854 in ag 0 (inode=3D2326854)
agi unlinked = bucket 8 is 1802120 in ag 0 (inode=3D1802120)
agi unlinked bucket 14 is = 495566 in ag 0 (inode=3D495566)
agi unlinked bucket 16 is 5899536 in ag = 0 (inode=3D5899536)
agi unlinked bucket 19 is 4008211 in ag 0 (inode=3D4008211)
agi unlinked= bucket 21 is 4906965 in ag 0 (inode=3D4906965)
agi unlinked bucket 23 i= s 2022231 in ag 0 (inode=3D2022231)
agi unlinked bucket 24 is 1626200 in= ag 0 (inode=3D1626200)
agi unlinked bucket 25 is 938585 in ag 0 (inode=3D938585)
agi unlinked b= ucket 30 is 4226526 in ag 0 (inode=3D4226526)
agi unlinked bucket 34 is = 4108962 in ag 0 (inode=3D4108962)
agi unlinked bucket 37 is 1740389 in a= g 0 (inode=3D1740389)
agi unlinked bucket 39 is 247399 in ag 0 (inode=3D247399)
agi unlinked b= ucket 40 is 6237864 in ag 0 (inode=3D6237864)
agi unlinked bucket 43 is = 3404331 in ag 0 (inode=3D3404331)
agi unlinked bucket 45 is 2092717 in a= g 0 (inode=3D2092717)
agi unlinked bucket 48 is 4041008 in ag 0 (inode=3D4041008)
agi unlinked= bucket 50 is 1459762 in ag 0 (inode=3D1459762)
agi unlinked bucket 56 i= s 852024 in ag 0 (inode=3D852024)
      &n= bsp; - found root in ode chunk
Phase 3 - for each AG…
        - scan and clear agi unlinked li= sts…
        - process known i= nodes and perform inode discovery…
     =    - agno =3D 0
7f8220be6700: Badness in key lookup (length)bp=3D(bno 123696, len 16384 bytes) key=3D(bno 123696, len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 247776, len 16384= bytes) key=3D(bno 247776, len 8192 bytes)
7f8220be6700: Badness in key = lookup (length)
bp=3D(bno 425984, len 16384 bytes) key=3D(bno 425984, le= n 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 469280, len 16384= bytes) key=3D(bno 469280, len 8192 bytes)
7f8220be6700: Badness in key = lookup (length)
bp=3D(bno 729856, len 16384 bytes) key=3D(bno 729856, le= n 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 813072, len 16384= bytes) key=3D(bno 813072, len 8192 bytes)
7f8220be6700: Badness in key = lookup (length)
bp=3D(bno 870176, len 16384 bytes) key=3D(bno 870176, le= n 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 901056, len 16384= bytes) key=3D(bno 901056, len 8192 bytes)
7f8220be6700: Badness in key = lookup (length)
bp=3D(bno 1011104, len 16384 bytes) key=3D(bno 1011104, = len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 1046336, len 1638= 4 bytes) key=3D(bno 1046336, len 8192 bytes)
7f8220be6700: Badness in ke= y lookup (length)
bp=3D(bno 1163424, len 16384 bytes) key=3D(bno 1163424= , len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 1170240, len 1638= 4 bytes) key=3D(bno 1170240, len 8192 bytes)
7f8220be6700: Badness in ke= y lookup (length)
bp=3D(bno 1702160, len 16384 bytes) key=3D(bno 1702160= , len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 2004096, len 1638= 4 bytes) key=3D(bno 2004096, len 8192 bytes)
7f8220be6700: Badness in ke= y lookup (length)
bp=3D(bno 2020496, len 16384 bytes) key=3D(bno 2020496= , len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 2023408, len 1638= 4 bytes) key=3D(bno 2023408, len 8192 bytes)
7f8220be6700: Badness in ke= y lookup (length)
bp=3D(bno 2054464, len 16384 bytes) key=3D(bno 2054464= , len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 2113232, len 1638= 4 bytes) key=3D(bno 2113232, len 8192 bytes)
7f8220be6700: Badness in ke= y lookup (length)
bp=3D(bno 2453472, len 16384 bytes) key=3D(bno 2453472= , len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 2949760, len 1638= 4 bytes) key=3D(bno 2949760, len 8192 bytes)
7f8220be6700: Badness in ke= y lookup (length)
bp=3D(bno 3118912, len 16384 bytes) key=3D(bno 3118912= , len 8192 bytes)
        - agno =3D 1
  &nbs= p;     - agno =3D 2
     &n= bsp;  - agno =3D 3
        - agn= o =3D 4
        - agno =3D 5
 = ;       - agno =3D 6
   &nb= sp;    - agno =3D 7
      &= nbsp; - agno =3D 8
        - agno =3D= 9
        - agno =3D 10
        - agno =3D 11
  &nb= sp;     - agno =3D 12
     =    - agno =3D 13
        - = agno =3D 14
        - agno =3D 15
=         - agno =3D 16
  &nb= sp;     - agno =3D 17
     =    - agno =3D 18
        - = agno =3D 19
        - agno =3D 20
        - agno =3D 21
  &nb= sp;     - agno =3D 22
     =    - agno =3D 23
        - = agno =3D 24
        - agno =3D 25
=         - agno =3D 26
  &nb= sp;     - agno =3D 27
     =    - agno =3D 28
        - = agno =3D 29
        - agno =3D 30
        - process newly discovered in od= es..
Phase 4 - check for duplicate blocks…
   &= nbsp;    - setting up duplicate extent list…
 = ;       - check for inodes claiming duplicate= blocks…
        - agno =3D 0<= br>        - agno =3D 4
        - agno =3D 2
  &nbs= p;     - agno =3D 3
     &n= bsp;  - agno =3D 7
        - agn= o =3D 18
        - agno =3D 28
&nb= sp;       - agno =3D 6
   &= nbsp;    - agno =3D 5
      = ;  - agno =3D 1
        - agno = =3D 26
        - agno =3D 8
        - agno =3D 14
  &nb= sp;     - agno =3D 17
     =    - agno =3D 16
        - = agno =3D 10
        - agno =3D 20
=         - agno =3D 13
  &nb= sp;     - agno =3D 15
     =    - agno =3D 11
        - = agno =3D 19
        - agno =3D 22
        - agno =3D 21
  &nb= sp;     - agno =3D 23
     =    - agno =3D 9
        - a= gno =3D 12
        - agno =3D 24
&= nbsp;       - agno =3D 27
  &nbs= p;     - agno =3D 25
     &= nbsp;  - agno =3D 29
        - a= gno =3D 30
Phase 5 - rebuild AG headers and trees…
        - reset superblock…
Ph= ase 6 - check inode connectivity…
     &= nbsp;  - resetting contents of realtime bitmap and summary in odes
=         - traversing filesystem …=
        - traversal finished &hellip= ;
        - moving disconnected inode= s to lost+found …
disconnected inode 6235944, moving to lost+found
Phase 7 - verify and co= rrect link counts…
done
sh-4.1$ .


2013/4/9 Eric Sandeen <sande= en@sandeen.net>
On 4/9/13 7:53 AM, =B7=FB= =D3=C0=CC=CE wrote:
> Dear xfs experts,
> I really need your help sincerely!!! In our production enviroment we > run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs file<= br> > system crash on some of the server frequently about every two weeks. > Can you help to give me a direction about how to debug this issue and<= br> > how to avoid it? Thank you very very much!

So this happens reliably, but infrequently? (only every 2 weeks or so= ?)

Can you provoke it any more often?

> uname -a
> Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 > #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux

That's a RHEL6 kernel; I'm assuming that this is a RHEL clone= w/o RH support?

I agree with Ben that I'd like to see xfs_repair output.

Since the fs has shut down, you should unmount, remount, and unmount
again to replay the dirty log.  Then do xfs_repair -n, and provide the= output
if it discovers any errors.

Thanks,
-Eric

> Every time the crash log is same, as following
>
> 038 Apr  9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > xfs_inotobp() returned error 22.
> 1039 Apr  9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_if= ree
> returned error 22
> 1040 Apr  9 09:41:36 cqdx kernel: XFS (sdb):
> xfs_do_force_shutdown(0x1) called from line 1184 of file
> fs/xfs/xfs_vnodeops.c.  Return address =3D 0xffffffffa02ee20a
> 1041 Apr  9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected.<= br> > Shutting down filesystem
> 1042 Apr  9 09:41:36 cqdx kernel: XFS (sdb): Please umount the > filesystem and rectify the problem(s)
> 1043 Apr  9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error= 5 returned.
> 1044 Apr  9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error= 5 returned.
> 1045 Apr  9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error= 5 returned.
> 1046 Apr  9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error= 5 returned.
>




--
=B7=FB=D3= =C0=CC=CE
--089e0111e0746d28cd04d9ef12a1-- From sandeen@sandeen.net Tue Apr 9 10:23:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5A1F729E17 for ; Tue, 9 Apr 2013 10:23:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 487508F8068 for ; Tue, 9 Apr 2013 08:23:42 -0700 (PDT) X-ASG-Debug-ID: 1365521021-04cb6c1e7849b690001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id s4nbTLdHZUkJSFv8 for ; Tue, 09 Apr 2013 08:23:41 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3723C63BE65C; Tue, 9 Apr 2013 10:23:41 -0500 (CDT) Message-ID: <5164327C.6060808@sandeen.net> Date: Tue, 09 Apr 2013 10:23:40 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?GB2312?B?t/vTwMzO?= CC: xfs@oss.sgi.com Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <51642E5E.3040403@sandeen.net> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365521021 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127641 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/9/13 10:18 AM, ·ûÓÀÌÎ wrote: > The servers are back to service now and It's hard to run xfs_repair. > It always happen bellow is the xfs_repair log when it happens on > another server several days ago. > -sh-4.1$ sudo xfs_repair -n /dev/glustervg/glusterlv Ok; just for what its worth, if you don't mount/umount first, you may be running repair -n with a dirty log, and it will find "more" corruption than it should, since the log is not replayed. I see that you included a non "-n" repair log as well, was that after a mount/umount? Just to be sure... Thanks, -Eric From yongtaofu@gmail.com Tue Apr 9 10:24:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B4A6729E17 for ; Tue, 9 Apr 2013 10:24:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5CC09AC003 for ; Tue, 9 Apr 2013 08:23:57 -0700 (PDT) X-ASG-Debug-ID: 1365521034-04bdf0542b4939b0001-NocioJ Received: from mail-ia0-f182.google.com (mail-ia0-f182.google.com [209.85.210.182]) by cuda.sgi.com with ESMTP id KKOYAXCdz3HWHKrk (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 08:23:54 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.182 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.182] Received: by mail-ia0-f182.google.com with SMTP id u20so1762605iag.13 for ; Tue, 09 Apr 2013 08:23:54 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.182] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.182] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=1l/bLoHz/hiSkPhwrFjGw3fADJHgRTlhEnVb8LfDab8=; b=etVq+m6p7axJ2QcHOWk71aoOcaEYT6fVGVZgsa1xNHSbS0uGYyWGjJBrPWMidr9Qnd MnQFyV9ftNWwWq0216G06Nis6Z7KcEPdv/DhnPpyOu0FesUj8O9ACiBI+H9We6DeGVrT Y86W8CX4fjsy3HQwQcjT83NgMq7t0RkLbXzC+RuyJtIg6QmMtHd9DMYcs2GUvLbnY+Do kMe+c4ZPBDSX5Al8mhOZFHBDTebtglpnKeUlTIX5r2gv5FqhygtYzZ4kiudhsrtdlimW PrSqxrL8z0DvjYuu/iID31M7WcV9Q+vzmKSiYtBFx6IYSOgOdvYmWdOuWVG8EhAKhsJi Q+gA== MIME-Version: 1.0 X-Received: by 10.50.20.163 with SMTP id o3mr10511275ige.51.1365521034370; Tue, 09 Apr 2013 08:23:54 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 08:23:54 -0700 (PDT) In-Reply-To: References: <51642E5E.3040403@sandeen.net> Date: Tue, 9 Apr 2013 23:23:54 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7bd75dec30364404d9ef247c X-Barracuda-Connect: mail-ia0-f182.google.com[209.85.210.182] X-Barracuda-Start-Time: 1365521034 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127641 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 --047d7bd75dec30364404d9ef247c Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable So my question is why xfs shutdown always happens? With same reason(xfs_iunlink_remove: xfs_inotobp() returned error 22 xfs_inactive: xfs_ifree returned error 22 xfs_do_force_shutdown). The server load is high and is it related? free -m total used free shared buffers cached Mem: 129016 128067 948 0 10 119905 -/+ buffers/cache: 8150 120865 Swap: 4093 0 4093 2013/4/9 =B7=FB=D3=C0=CC=CE > The servers are back to service now and It's hard to run xfs_repair. It > always happen bellow is the xfs_repair log when it happens on another > server several days ago. > -sh-4.1$ sudo xfs_repair -n /dev/glustervg/glusterlv > Phase 1 - find and verify superblock=A1=AD > Phase 2 - using internal log > - scan filesystem freespace and inode maps=A1=AD > agi unlinked bucket 0 is 4046848 in ag 0 (inode=3D4046848) > agi unlinked bucket 5 is 2340485 in ag 0 (inode=3D2340485) > agi unlinked bucket 6 is 2326854 in ag 0 (inode=3D2326854) > agi unlinked bucket 8 is 1802120 in ag 0 (inode=3D1802120) > agi unlinked bucket 14 is 495566 in ag 0 (inode=3D495566) > agi unlinked bucket 16 is 5899536 in ag 0 (inode=3D5899536) > agi unlinked bucket 19 is 4008211 in ag 0 (inode=3D4008211) > agi unlinked bucket 21 is 4906965 in ag 0 (inode=3D4906965) > agi unlinked bucket 23 is 2022231 in ag 0 (inode=3D2022231) > agi unlinked bucket 24 is 1626200 in ag 0 (inode=3D1626200) > agi unlinked bucket 25 is 938585 in ag 0 (inode=3D938585) > agi unlinked bucket 30 is 4226526 in ag 0 (inode=3D4226526) > agi unlinked bucket 34 is 4108962 in ag 0 (inode=3D4108962) > agi unlinked bucket 37 is 1740389 in ag 0 (inode=3D1740389) > agi unlinked bucket 39 is 247399 in ag 0 (inode=3D247399) > agi unlinked bucket 40 is 6237864 in ag 0 (inode=3D6237864) > agi unlinked bucket 43 is 3404331 in ag 0 (inode=3D3404331) > agi unlinked bucket 45 is 2092717 in ag 0 (inode=3D2092717) > agi unlinked bucket 48 is 4041008 in ag 0 (inode=3D4041008) > agi unlinked bucket 50 is 1459762 in ag 0 (inode=3D1459762) > agi unlinked bucket 56 is 852024 in ag 0 (inode=3D852024) > - found root in ode chunk > Phase 3 - for each AG=A1=AD > - scan (but don't clear) agi unlinked lists=A1=AD > - process known inodes and perform inode discovery=A1=AD > - agno =3D 0 > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 123696, len 16384 bytes) key=3D(bno 123696, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 247776, len 16384 bytes) key=3D(bno 247776, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 425984, len 16384 bytes) key=3D(bno 425984, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 469280, len 16384 bytes) key=3D(bno 469280, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 729856, len 16384 bytes) key=3D(bno 729856, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 813072, len 16384 bytes) key=3D(bno 813072, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 870176, len 16384 bytes) key=3D(bno 870176, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 901056, len 16384 bytes) key=3D(bno 901056, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 1011104, len 16384 bytes) key=3D(bno 1011104, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 1046336, len 16384 bytes) key=3D(bno 1046336, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 1163424, len 16384 bytes) key=3D(bno 1163424, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 1170240, len 16384 bytes) key=3D(bno 1170240, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 1702160, len 16384 bytes) key=3D(bno 1702160, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 2004096, len 16384 bytes) key=3D(bno 2004096, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 2020496, len 16384 bytes) key=3D(bno 2020496, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 2023408, len 16384 bytes) key=3D(bno 2023408, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 2054464, len 16384 bytes) key=3D(bno 2054464, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 2113232, len 16384 bytes) key=3D(bno 2113232, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 2453472, len 16384 bytes) key=3D(bno 2453472, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 2949760, len 16384 bytes) key=3D(bno 2949760, len 8192 bytes) > 7f084d34e700: Badness in key lookup (length) > bp=3D(bno 3118912, len 16384 bytes) key=3D(bno 3118912, len 8192 bytes) > - agno =3D 1 > - agno =3D 2 > - agno =3D 3 > - agno =3D 4 > - agno =3D 5 > - agno =3D 6 > - agno =3D 7 > - agno =3D 8 > - agno =3D 9 > - agno =3D 10 > - agno =3D 11 > - agno =3D 12 > - agno =3D 13 > - agno =3D 14 > - agno =3D 15 > - agno =3D 16 > - agno =3D 17 > - agno =3D 18 > - agno =3D 19 > - agno =3D 20 > - agno =3D 21 > - agno =3D 22 > - agno =3D 23 > - agno =3D 24 > - agno =3D 25 > - agno =3D 26 > - agno =3D 27 > - agno =3D 28 > - agno =3D 29 > - agno =3D 30 > - process newly discovered in odes.. > Phase 4 - check for duplicate blocks=A1=AD > - setting up duplicate extent list=A1=AD > - check for inodes claiming duplicate blocks=A1=AD > - agno =3D 0 > - agno =3D 1 > - agno =3D 3 > - agno =3D 9 > - agno =3D 12 > - agno =3D 14 > - agno =3D 5 > - agno =3D 19 > - agno =3D 23 > - agno =3D 24 > - agno =3D 25 > - agno =3D 26 > - agno =3D 27 > - agno =3D 28 > - agno =3D 29 > - agno =3D 30 > - agno =3D 4 > - agno =3D 2 > - agno =3D 17 > - agno =3D 6 > - agno =3D 8 > - agno =3D 16 > - agno =3D 11 > - agno =3D 10 > - agno =3D 18 > - agno =3D 13 > - agno =3D 15 > - agno =3D 20 > - agno =3D 22 > - agno =3D 21 > - agno =3D 7 > No modify flag set, skipping phase 5 > Phase 6 - check inode connectivity=A1=AD > - traversing filesystem =A1=AD > - traversal finished =A1=AD > - moving disconnected inodes to lost+found =A1=AD > disconnected inode 6235944, would move to lost+found > Phase 7 - verify link counts=A1=AD > would have reset inode 6235944 nlinks from 0 to 1 > No modify flag set, skipping filesystem flush and exiting.. > > > > =B5=DA=B6=FE=B2=BD > repair=B5=C4log > > sh-4.1$ sudo xfs_repair /dev/glustervg/glusterlv > Phase 1 - find and verify superblock=A1=AD > Phase 2 - using internal log > - zero log=A1=AD > - scan filesystem freespace and inode maps=A1=AD > agi unlinked bucket 0 is 4046848 in ag 0 (inode=3D4046848) > agi unlinked bucket 5 is 2340485 in ag 0 (inode=3D2340485) > agi unlinked bucket 6 is 2326854 in ag 0 (inode=3D2326854) > agi unlinked bucket 8 is 1802120 in ag 0 (inode=3D1802120) > agi unlinked bucket 14 is 495566 in ag 0 (inode=3D495566) > agi unlinked bucket 16 is 5899536 in ag 0 (inode=3D5899536) > agi unlinked bucket 19 is 4008211 in ag 0 (inode=3D4008211) > agi unlinked bucket 21 is 4906965 in ag 0 (inode=3D4906965) > agi unlinked bucket 23 is 2022231 in ag 0 (inode=3D2022231) > agi unlinked bucket 24 is 1626200 in ag 0 (inode=3D1626200) > agi unlinked bucket 25 is 938585 in ag 0 (inode=3D938585) > agi unlinked bucket 30 is 4226526 in ag 0 (inode=3D4226526) > agi unlinked bucket 34 is 4108962 in ag 0 (inode=3D4108962) > agi unlinked bucket 37 is 1740389 in ag 0 (inode=3D1740389) > agi unlinked bucket 39 is 247399 in ag 0 (inode=3D247399) > agi unlinked bucket 40 is 6237864 in ag 0 (inode=3D6237864) > agi unlinked bucket 43 is 3404331 in ag 0 (inode=3D3404331) > agi unlinked bucket 45 is 2092717 in ag 0 (inode=3D2092717) > agi unlinked bucket 48 is 4041008 in ag 0 (inode=3D4041008) > agi unlinked bucket 50 is 1459762 in ag 0 (inode=3D1459762) > agi unlinked bucket 56 is 852024 in ag 0 (inode=3D852024) > - found root in ode chunk > Phase 3 - for each AG=A1=AD > - scan and clear agi unlinked lists=A1=AD > - process known inodes and perform inode discovery=A1=AD > - agno =3D 0 > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 123696, len 16384 bytes) key=3D(bno 123696, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 247776, len 16384 bytes) key=3D(bno 247776, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 425984, len 16384 bytes) key=3D(bno 425984, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 469280, len 16384 bytes) key=3D(bno 469280, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 729856, len 16384 bytes) key=3D(bno 729856, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 813072, len 16384 bytes) key=3D(bno 813072, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 870176, len 16384 bytes) key=3D(bno 870176, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 901056, len 16384 bytes) key=3D(bno 901056, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 1011104, len 16384 bytes) key=3D(bno 1011104, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 1046336, len 16384 bytes) key=3D(bno 1046336, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 1163424, len 16384 bytes) key=3D(bno 1163424, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 1170240, len 16384 bytes) key=3D(bno 1170240, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 1702160, len 16384 bytes) key=3D(bno 1702160, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 2004096, len 16384 bytes) key=3D(bno 2004096, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 2020496, len 16384 bytes) key=3D(bno 2020496, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 2023408, len 16384 bytes) key=3D(bno 2023408, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 2054464, len 16384 bytes) key=3D(bno 2054464, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 2113232, len 16384 bytes) key=3D(bno 2113232, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 2453472, len 16384 bytes) key=3D(bno 2453472, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 2949760, len 16384 bytes) key=3D(bno 2949760, len 8192 bytes) > 7f8220be6700: Badness in key lookup (length) > bp=3D(bno 3118912, len 16384 bytes) key=3D(bno 3118912, len 8192 bytes) > - agno =3D 1 > - agno =3D 2 > - agno =3D 3 > - agno =3D 4 > - agno =3D 5 > - agno =3D 6 > - agno =3D 7 > - agno =3D 8 > - agno =3D 9 > - agno =3D 10 > - agno =3D 11 > - agno =3D 12 > - agno =3D 13 > - agno =3D 14 > - agno =3D 15 > - agno =3D 16 > - agno =3D 17 > - agno =3D 18 > - agno =3D 19 > - agno =3D 20 > - agno =3D 21 > - agno =3D 22 > - agno =3D 23 > - agno =3D 24 > - agno =3D 25 > - agno =3D 26 > - agno =3D 27 > - agno =3D 28 > - agno =3D 29 > - agno =3D 30 > - process newly discovered in odes.. > Phase 4 - check for duplicate blocks=A1=AD > - setting up duplicate extent list=A1=AD > - check for inodes claiming duplicate blocks=A1=AD > - agno =3D 0 > - agno =3D 4 > - agno =3D 2 > - agno =3D 3 > - agno =3D 7 > - agno =3D 18 > - agno =3D 28 > - agno =3D 6 > - agno =3D 5 > - agno =3D 1 > - agno =3D 26 > - agno =3D 8 > - agno =3D 14 > - agno =3D 17 > - agno =3D 16 > - agno =3D 10 > - agno =3D 20 > - agno =3D 13 > - agno =3D 15 > - agno =3D 11 > - agno =3D 19 > - agno =3D 22 > - agno =3D 21 > - agno =3D 23 > - agno =3D 9 > - agno =3D 12 > - agno =3D 24 > - agno =3D 27 > - agno =3D 25 > - agno =3D 29 > - agno =3D 30 > Phase 5 - rebuild AG headers and trees=A1=AD > - reset superblock=A1=AD > Phase 6 - check inode connectivity=A1=AD > - resetting contents of realtime bitmap and summary in odes > - traversing filesystem =A1=AD > - traversal finished =A1=AD > - moving disconnected inodes to lost+found =A1=AD > disconnected inode 6235944, moving to lost+found > Phase 7 - verify and correct link counts=A1=AD > done > sh-4.1$ . > > > 2013/4/9 Eric Sandeen > >> On 4/9/13 7:53 AM, =B7=FB=D3=C0=CC=CE wrote: >> > Dear xfs experts, >> > I really need your help sincerely!!! In our production enviroment we >> > run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs file >> > system crash on some of the server frequently about every two weeks. >> > Can you help to give me a direction about how to debug this issue and >> > how to avoid it? Thank you very very much! >> >> So this happens reliably, but infrequently? (only every 2 weeks or so?) >> >> Can you provoke it any more often? >> >> > uname -a >> > Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 >> > #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux >> >> That's a RHEL6 kernel; I'm assuming that this is a RHEL clone w/o RH >> support? >> >> I agree with Ben that I'd like to see xfs_repair output. >> >> Since the fs has shut down, you should unmount, remount, and unmount >> again to replay the dirty log. Then do xfs_repair -n, and provide the >> output >> if it discovers any errors. >> >> Thanks, >> -Eric >> >> > Every time the crash log is same, as following >> > >> > 038 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: >> > xfs_inotobp() returned error 22. >> > 1039 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree >> > returned error 22 >> > 1040 Apr 9 09:41:36 cqdx kernel: XFS (sdb): >> > xfs_do_force_shutdown(0x1) called from line 1184 of file >> > fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02ee20a >> > 1041 Apr 9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected. >> > Shutting down filesystem >> > 1042 Apr 9 09:41:36 cqdx kernel: XFS (sdb): Please umount the >> > filesystem and rectify the problem(s) >> > 1043 Apr 9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> > 1044 Apr 9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> > 1045 Apr 9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> > 1046 Apr 9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> > >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --047d7bd75dec30364404d9ef247c Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
So my question is why xfs shutdown always  happe= ns? With same reason(xfs_iunlink_remove: xfs_inotobp() returned error 22 xf= s_inactive: xfs_ifree returned error 22 xfs_do_force_shutdown).
T= he server load is high and is it related?
free -m
          &nbs= p;  total       used   &n= bsp;   free     shared    buff= ers     cached
Mem:     &nb= sp;  129016     128067    &nbs= p;   948          0&= nbsp;        10     = 119905
-/+ buffers/cache:       8150 =     120865
Swap:       = ;  4093          0 &= nbsp;     4093


2013/4/= 9 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
The servers are back to service now and It's hard to r= un xfs_repair. It always happen bellow is the xfs_repair log when it happen= s on another server several days ago.
 -sh-4.1$ sudo xfs_repair -n= /dev/glustervg/glusterlv
Phase 1 - find and verify superblock…
Phase 2 - using internal lo= g
        - scan filesystem freespace= and inode maps…
agi unlinked bucket 0 is 4046848 in ag 0 (inode= =3D4046848)
agi unlinked bucket 5 is 2340485 in ag 0 (inode=3D2340485) agi unlinked bucket 6 is 2326854 in ag 0 (inode=3D2326854)
agi unlinked = bucket 8 is 1802120 in ag 0 (inode=3D1802120)
agi unlinked bucket 14 is = 495566 in ag 0 (inode=3D495566)
agi unlinked bucket 16 is 5899536 in ag = 0 (inode=3D5899536)
agi unlinked bucket 19 is 4008211 in ag 0 (inode=3D4008211)
agi unlinked= bucket 21 is 4906965 in ag 0 (inode=3D4906965)
agi unlinked bucket 23 i= s 2022231 in ag 0 (inode=3D2022231)
agi unlinked bucket 24 is 1626200 in= ag 0 (inode=3D1626200)
agi unlinked bucket 25 is 938585 in ag 0 (inode=3D938585)
agi unlinked b= ucket 30 is 4226526 in ag 0 (inode=3D4226526)
agi unlinked bucket 34 is = 4108962 in ag 0 (inode=3D4108962)
agi unlinked bucket 37 is 1740389 in a= g 0 (inode=3D1740389)
agi unlinked bucket 39 is 247399 in ag 0 (inode=3D247399)
agi unlinked b= ucket 40 is 6237864 in ag 0 (inode=3D6237864)
agi unlinked bucket 43 is = 3404331 in ag 0 (inode=3D3404331)
agi unlinked bucket 45 is 2092717 in a= g 0 (inode=3D2092717)
agi unlinked bucket 48 is 4041008 in ag 0 (inode=3D4041008)
agi unlinked= bucket 50 is 1459762 in ag 0 (inode=3D1459762)
agi unlinked bucket 56 i= s 852024 in ag 0 (inode=3D852024)
      &n= bsp; - found root in ode chunk
Phase 3 - for each AG…
        - scan (but don't clear) agi= unlinked lists…
        - pro= cess known inodes and perform inode discovery…
   =      - agno =3D 0
7f084d34e700: Badness in key looku= p (length)
bp=3D(bno 123696, len 16384 bytes) key=3D(bno 123696, len 819= 2 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 247776, len 16384= bytes) key=3D(bno 247776, len 8192 bytes)
7f084d34e700: Badness in key = lookup (length)
bp=3D(bno 425984, len 16384 bytes) key=3D(bno 425984, le= n 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 469280, len 16384= bytes) key=3D(bno 469280, len 8192 bytes)
7f084d34e700: Badness in key = lookup (length)
bp=3D(bno 729856, len 16384 bytes) key=3D(bno 729856, le= n 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 813072, len 16384= bytes) key=3D(bno 813072, len 8192 bytes)
7f084d34e700: Badness in key = lookup (length)
bp=3D(bno 870176, len 16384 bytes) key=3D(bno 870176, le= n 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 901056, len 16384= bytes) key=3D(bno 901056, len 8192 bytes)
7f084d34e700: Badness in key = lookup (length)
bp=3D(bno 1011104, len 16384 bytes) key=3D(bno 1011104, = len 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 1046336, len 1638= 4 bytes) key=3D(bno 1046336, len 8192 bytes)
7f084d34e700: Badness in ke= y lookup (length)
bp=3D(bno 1163424, len 16384 bytes) key=3D(bno 1163424= , len 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 1170240, len 1638= 4 bytes) key=3D(bno 1170240, len 8192 bytes)
7f084d34e700: Badness in ke= y lookup (length)
bp=3D(bno 1702160, len 16384 bytes) key=3D(bno 1702160= , len 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 2004096, len 1638= 4 bytes) key=3D(bno 2004096, len 8192 bytes)
7f084d34e700: Badness in ke= y lookup (length)
bp=3D(bno 2020496, len 16384 bytes) key=3D(bno 2020496= , len 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 2023408, len 1638= 4 bytes) key=3D(bno 2023408, len 8192 bytes)
7f084d34e700: Badness in ke= y lookup (length)
bp=3D(bno 2054464, len 16384 bytes) key=3D(bno 2054464= , len 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 2113232, len 1638= 4 bytes) key=3D(bno 2113232, len 8192 bytes)
7f084d34e700: Badness in ke= y lookup (length)
bp=3D(bno 2453472, len 16384 bytes) key=3D(bno 2453472= , len 8192 bytes)
7f084d34e700: Badness in key lookup (length)
bp=3D(bno 2949760, len 1638= 4 bytes) key=3D(bno 2949760, len 8192 bytes)
7f084d34e700: Badness in ke= y lookup (length)
bp=3D(bno 3118912, len 16384 bytes) key=3D(bno 3118912= , len 8192 bytes)
        - agno =3D 1
  &nbs= p;     - agno =3D 2
     &n= bsp;  - agno =3D 3
        - agn= o =3D 4
        - agno =3D 5
 = ;       - agno =3D 6
   &nb= sp;    - agno =3D 7
      &= nbsp; - agno =3D 8
        - agno =3D= 9
        - agno =3D 10
        - agno =3D 11
  &nb= sp;     - agno =3D 12
     =    - agno =3D 13
        - = agno =3D 14
        - agno =3D 15
=         - agno =3D 16
  &nb= sp;     - agno =3D 17
     =    - agno =3D 18
        - = agno =3D 19
        - agno =3D 20
        - agno =3D 21
  &nb= sp;     - agno =3D 22
     =    - agno =3D 23
        - = agno =3D 24
        - agno =3D 25
=         - agno =3D 26
  &nb= sp;     - agno =3D 27
     =    - agno =3D 28
        - = agno =3D 29
        - agno =3D 30
        - process newly discovered in od= es..
Phase 4 - check for duplicate blocks…
   &= nbsp;    - setting up duplicate extent list…
 = ;       - check for inodes claiming duplicate= blocks…
        - agno =3D 0<= br>        - agno =3D 1
        - agno =3D 3
  &nbs= p;     - agno =3D 9
     &n= bsp;  - agno =3D 12
        - ag= no =3D 14
        - agno =3D 5
&nb= sp;       - agno =3D 19
   =      - agno =3D 23
     &nb= sp;  - agno =3D 24
        - agn= o =3D 25
        - agno =3D 26
        - agno =3D 27
  &nb= sp;     - agno =3D 28
     =    - agno =3D 29
        - = agno =3D 30
        - agno =3D 4
&= nbsp;       - agno =3D 2
   = ;     - agno =3D 17
     &n= bsp;  - agno =3D 6
        - agn= o =3D 8
        - agno =3D 16
        - agno =3D 11
  &nb= sp;     - agno =3D 10
     =    - agno =3D 18
        - = agno =3D 13
        - agno =3D 15
=         - agno =3D 20
  &nb= sp;     - agno =3D 22
     =    - agno =3D 21
        - = agno =3D 7
No modify flag set, skipping phase 5
Phase 6 - check inode connectivity…
     = ;   - traversing filesystem …
    &= nbsp;   - traversal finished …
    =     - moving disconnected inodes to lost+found …
d= isconnected inode 6235944, would move to lost+found
Phase 7 - verify link counts…
would have reset inode 6235944 nlin= ks from 0 to 1
No modify flag set, skipping filesystem flush and exiting= ..



=B5=DA=B6=FE=B2=BD
repair=B5=C4log

sh-4.1$ sudo= xfs_repair /dev/glustervg/glusterlv
Phase 1 - find and verify superblock…
Phase 2 - using internal lo= g
        - zero log…
 = ;       - scan filesystem freespace and inode= maps…
agi unlinked bucket 0 is 4046848 in ag 0 (inode=3D4046848)=
agi unlinked bucket 5 is 2340485 in ag 0 (inode=3D2340485)
agi unlinked bucket 6 is 2326854 in ag 0 (inode=3D2326854)
agi unlinked = bucket 8 is 1802120 in ag 0 (inode=3D1802120)
agi unlinked bucket 14 is = 495566 in ag 0 (inode=3D495566)
agi unlinked bucket 16 is 5899536 in ag = 0 (inode=3D5899536)
agi unlinked bucket 19 is 4008211 in ag 0 (inode=3D4008211)
agi unlinked= bucket 21 is 4906965 in ag 0 (inode=3D4906965)
agi unlinked bucket 23 i= s 2022231 in ag 0 (inode=3D2022231)
agi unlinked bucket 24 is 1626200 in= ag 0 (inode=3D1626200)
agi unlinked bucket 25 is 938585 in ag 0 (inode=3D938585)
agi unlinked b= ucket 30 is 4226526 in ag 0 (inode=3D4226526)
agi unlinked bucket 34 is = 4108962 in ag 0 (inode=3D4108962)
agi unlinked bucket 37 is 1740389 in a= g 0 (inode=3D1740389)
agi unlinked bucket 39 is 247399 in ag 0 (inode=3D247399)
agi unlinked b= ucket 40 is 6237864 in ag 0 (inode=3D6237864)
agi unlinked bucket 43 is = 3404331 in ag 0 (inode=3D3404331)
agi unlinked bucket 45 is 2092717 in a= g 0 (inode=3D2092717)
agi unlinked bucket 48 is 4041008 in ag 0 (inode=3D4041008)
agi unlinked= bucket 50 is 1459762 in ag 0 (inode=3D1459762)
agi unlinked bucket 56 i= s 852024 in ag 0 (inode=3D852024)
      &n= bsp; - found root in ode chunk
Phase 3 - for each AG…
        - scan and clear agi unlinked li= sts…
        - process known i= nodes and perform inode discovery…
     =    - agno =3D 0
7f8220be6700: Badness in key lookup (length)bp=3D(bno 123696, len 16384 bytes) key=3D(bno 123696, len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 247776, len 16384= bytes) key=3D(bno 247776, len 8192 bytes)
7f8220be6700: Badness in key = lookup (length)
bp=3D(bno 425984, len 16384 bytes) key=3D(bno 425984, le= n 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 469280, len 16384= bytes) key=3D(bno 469280, len 8192 bytes)
7f8220be6700: Badness in key = lookup (length)
bp=3D(bno 729856, len 16384 bytes) key=3D(bno 729856, le= n 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 813072, len 16384= bytes) key=3D(bno 813072, len 8192 bytes)
7f8220be6700: Badness in key = lookup (length)
bp=3D(bno 870176, len 16384 bytes) key=3D(bno 870176, le= n 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 901056, len 16384= bytes) key=3D(bno 901056, len 8192 bytes)
7f8220be6700: Badness in key = lookup (length)
bp=3D(bno 1011104, len 16384 bytes) key=3D(bno 1011104, = len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 1046336, len 1638= 4 bytes) key=3D(bno 1046336, len 8192 bytes)
7f8220be6700: Badness in ke= y lookup (length)
bp=3D(bno 1163424, len 16384 bytes) key=3D(bno 1163424= , len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 1170240, len 1638= 4 bytes) key=3D(bno 1170240, len 8192 bytes)
7f8220be6700: Badness in ke= y lookup (length)
bp=3D(bno 1702160, len 16384 bytes) key=3D(bno 1702160= , len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 2004096, len 1638= 4 bytes) key=3D(bno 2004096, len 8192 bytes)
7f8220be6700: Badness in ke= y lookup (length)
bp=3D(bno 2020496, len 16384 bytes) key=3D(bno 2020496= , len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 2023408, len 1638= 4 bytes) key=3D(bno 2023408, len 8192 bytes)
7f8220be6700: Badness in ke= y lookup (length)
bp=3D(bno 2054464, len 16384 bytes) key=3D(bno 2054464= , len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 2113232, len 1638= 4 bytes) key=3D(bno 2113232, len 8192 bytes)
7f8220be6700: Badness in ke= y lookup (length)
bp=3D(bno 2453472, len 16384 bytes) key=3D(bno 2453472= , len 8192 bytes)
7f8220be6700: Badness in key lookup (length)
bp=3D(bno 2949760, len 1638= 4 bytes) key=3D(bno 2949760, len 8192 bytes)
7f8220be6700: Badness in ke= y lookup (length)
bp=3D(bno 3118912, len 16384 bytes) key=3D(bno 3118912= , len 8192 bytes)
        - agno =3D 1
  &nbs= p;     - agno =3D 2
     &n= bsp;  - agno =3D 3
        - agn= o =3D 4
        - agno =3D 5
 = ;       - agno =3D 6
   &nb= sp;    - agno =3D 7
      &= nbsp; - agno =3D 8
        - agno =3D= 9
        - agno =3D 10
        - agno =3D 11
  &nb= sp;     - agno =3D 12
     =    - agno =3D 13
        - = agno =3D 14
        - agno =3D 15
=         - agno =3D 16
  &nb= sp;     - agno =3D 17
     =    - agno =3D 18
        - = agno =3D 19
        - agno =3D 20
        - agno =3D 21
  &nb= sp;     - agno =3D 22
     =    - agno =3D 23
        - = agno =3D 24
        - agno =3D 25
=         - agno =3D 26
  &nb= sp;     - agno =3D 27
     =    - agno =3D 28
        - = agno =3D 29
        - agno =3D 30
        - process newly discovered in od= es..
Phase 4 - check for duplicate blocks…
   &= nbsp;    - setting up duplicate extent list…
 = ;       - check for inodes claiming duplicate= blocks…
        - agno =3D 0<= br>        - agno =3D 4
        - agno =3D 2
  &nbs= p;     - agno =3D 3
     &n= bsp;  - agno =3D 7
        - agn= o =3D 18
        - agno =3D 28
&nb= sp;       - agno =3D 6
   &= nbsp;    - agno =3D 5
      = ;  - agno =3D 1
        - agno = =3D 26
        - agno =3D 8
        - agno =3D 14
  &nb= sp;     - agno =3D 17
     =    - agno =3D 16
        - = agno =3D 10
        - agno =3D 20
=         - agno =3D 13
  &nb= sp;     - agno =3D 15
     =    - agno =3D 11
        - = agno =3D 19
        - agno =3D 22
        - agno =3D 21
  &nb= sp;     - agno =3D 23
     =    - agno =3D 9
        - a= gno =3D 12
        - agno =3D 24
&= nbsp;       - agno =3D 27
  &nbs= p;     - agno =3D 25
     &= nbsp;  - agno =3D 29
        - a= gno =3D 30
Phase 5 - rebuild AG headers and trees…
        - reset superblock…
Ph= ase 6 - check inode connectivity…
     &= nbsp;  - resetting contents of realtime bitmap and summary in odes
=         - traversing filesystem …=
        - traversal finished &hellip= ;
        - moving disconnected inode= s to lost+found …
disconnected inode 6235944, moving to lost+found
Phase 7 - verify and co= rrect link counts…
done
sh-4.1$ .


2013/4/9 = Eric Sandeen <sandeen@sandeen.net>
On 4/9/13 7:53 AM, =B7=FB=D3=C0=CC=CE w= rote:
> Dear xfs experts,
> I really need your help sincerely!!! In our production enviroment we > run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs file<= br> > system crash on some of the server frequently about every two weeks. > Can you help to give me a direction about how to debug this issue and<= br> > how to avoid it? Thank you very very much!

So this happens reliably, but infrequently? (only every 2 weeks or so= ?)

Can you provoke it any more often?

> uname -a
> Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 > #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux

That's a RHEL6 kernel; I'm assuming that this is a RHEL clone= w/o RH support?

I agree with Ben that I'd like to see xfs_repair output.

Since the fs has shut down, you should unmount, remount, and unmount
again to replay the dirty log.  Then do xfs_repair -n, and provide the= output
if it discovers any errors.

Thanks,
-Eric

> Every time the crash log is same, as following
>
> 038 Apr  9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > xfs_inotobp() returned error 22.
> 1039 Apr  9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_if= ree
> returned error 22
> 1040 Apr  9 09:41:36 cqdx kernel: XFS (sdb):
> xfs_do_force_shutdown(0x1) called from line 1184 of file
> fs/xfs/xfs_vnodeops.c.  Return address =3D 0xffffffffa02ee20a
> 1041 Apr  9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected.<= br> > Shutting down filesystem
> 1042 Apr  9 09:41:36 cqdx kernel: XFS (sdb): Please umount the > filesystem and rectify the problem(s)
> 1043 Apr  9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error= 5 returned.
> 1044 Apr  9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error= 5 returned.
> 1045 Apr  9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error= 5 returned.
> 1046 Apr  9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error= 5 returned.
>




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--047d7bd75dec30364404d9ef247c-- From yongtaofu@gmail.com Tue Apr 9 10:25:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 475CB29E17 for ; Tue, 9 Apr 2013 10:25:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C329DAC003 for ; Tue, 9 Apr 2013 08:25:50 -0700 (PDT) X-ASG-Debug-ID: 1365521149-04cbb01fb84713a0001-NocioJ Received: from mail-ie0-f175.google.com (mail-ie0-f175.google.com [209.85.223.175]) by cuda.sgi.com with ESMTP id JJxjbvsVmKDn2tyu (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 08:25:49 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] Received: by mail-ie0-f175.google.com with SMTP id c12so8470606ieb.20 for ; Tue, 09 Apr 2013 08:25:49 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=aQJgWbl5h9WjyWs5sJC5Eacd6GUpc02zYPJrxNQQ81g=; b=Tm20luwUA648Ll4VQBF5xDhh3fDeG9aYCOcEXens8eMC2WLwWjSWiSj0zDZrtU9g7n DYHxLI2kb89lQx1bwg4DBnbRxuso4TfAYfNzp27J1xtnC/oeAxsNA0B82caEVzZPCj9g 1fADjzzPwW584DAUlfeuv8yPFKUU9g9xPgmDwW2TDuDnRqF8dZHWtv9rqpyRWVUCyVKp +9uC+CnuJZI/uCLKmD8f35yjacJg7zoGOPlq6YRXMkCjc6YFlBx4OhihOlLNYLQrmFWy Um0+DQ7WS3AxhNQSsN5Xndyc/Y1rpJwwck/wnVH3TxJ4gsINdWzvtJsbcHhhNtiVAIsv W/Hg== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr10714403igx.11.1365521149116; Tue, 09 Apr 2013 08:25:49 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 08:25:48 -0700 (PDT) In-Reply-To: <5164327C.6060808@sandeen.net> References: <51642E5E.3040403@sandeen.net> <5164327C.6060808@sandeen.net> Date: Tue, 9 Apr 2013 23:25:48 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e0111e07407255304d9ef2bf6 X-Barracuda-Connect: mail-ie0-f175.google.com[209.85.223.175] X-Barracuda-Start-Time: 1365521149 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127641 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 --089e0111e07407255304d9ef2bf6 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Yes it was executed after a mount/umount because it is configured in fstab and I reboot the system then it was mounted and then I umount it to run xfs_repair. 2013/4/9 Eric Sandeen > On 4/9/13 10:18 AM, =B7=FB=D3=C0=CC=CE wrote: > > The servers are back to service now and It's hard to run xfs_repair. > > It always happen bellow is the xfs_repair log when it happens on > > another server several days ago. > > > -sh-4.1$ sudo xfs_repair -n /dev/glustervg/glusterlv > > Ok; just for what its worth, if you don't mount/umount first, > you may be running repair -n with a dirty log, and it will > find "more" corruption than it should, since the log is not > replayed. > > I see that you included a non "-n" repair log as well, was > that after a mount/umount? Just to be sure... > > Thanks, > -Eric > > > --=20 =B7=FB=D3=C0=CC=CE --089e0111e07407255304d9ef2bf6 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Yes it was executed after a mount/umount because it is con= figured in fstab and I reboot the system then it was mounted and then I umo= unt it to run xfs_repair.


2013/4/9 Eric Sandeen <sandeen@sandeen.net>
On 4/9/13 10:18 AM, =B7=FB=D3=C0=CC=CE wrote:
> The servers are back to service now and It's hard to run xfs_repai= r.
> It always happen bellow is the xfs_repair log when it happens on
> another server several days ago.

>  -sh-4.1$ sudo xfs_repair -n /dev/glustervg/glusterlv

Ok; just for what its worth, if you don't mount/umount first,
you may be running repair -n with a dirty log, and it will
find "more" corruption than it should, since the log is not
replayed.

I see that you included a non "-n" repair log as well, was
that after a mount/umount?  Just to be sure...

Thanks,
-Eric





--
=B7=FB=D3=C0=CC=CE
--089e0111e07407255304d9ef2bf6-- From sandeen@sandeen.net Tue Apr 9 10:44:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1A1A57FBA for ; Tue, 9 Apr 2013 10:44:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 08A77304070 for ; Tue, 9 Apr 2013 08:44:10 -0700 (PDT) X-ASG-Debug-ID: 1365522250-04cb6c1e7a49d180001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id P4w3PXFTc5H0oOVB for ; Tue, 09 Apr 2013 08:44:10 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D38C463BE65C; Tue, 9 Apr 2013 10:44:09 -0500 (CDT) Message-ID: <51643749.5080800@sandeen.net> Date: Tue, 09 Apr 2013 10:44:09 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?GB2312?B?t/vTwMzO?= CC: xfs@oss.sgi.com Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <51642E5E.3040403@sandeen.net> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365522250 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127641 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/9/13 10:23 AM, ·ûÓÀÌÎ wrote: > So my question is why xfs shutdown always happens? With same > reason(xfs_iunlink_remove: xfs_inotobp() returned error 22 > xfs_inactive: xfs_ifree returned error 22 xfs_do_force_shutdown). > The server load is high and is it related? We don't know yet. :) I'd like to know what was passed to xfs_inotobp when it shut down, and what caused the EINVAL (22) return. Perhaps some tracing or systemtap scripts could to it. If you only hit this every few weeks, though, it's going to be difficult to catch. -Eric > free -m > total used free shared buffers cached > Mem: 129016 128067 948 0 10 119905 > -/+ buffers/cache: 8150 120865 > Swap: 4093 0 4093 > > From yongtaofu@gmail.com Tue Apr 9 10:48:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1B8187FC7 for ; Tue, 9 Apr 2013 10:48:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8CEDCAC003 for ; Tue, 9 Apr 2013 08:48:29 -0700 (PDT) X-ASG-Debug-ID: 1365522508-04cb6c1e7749d980001-NocioJ Received: from mail-ie0-f176.google.com (mail-ie0-f176.google.com [209.85.223.176]) by cuda.sgi.com with ESMTP id kAWAvVShPMKiMDeH (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 08:48:28 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.176 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.176] Received: by mail-ie0-f176.google.com with SMTP id x12so445634ief.35 for ; Tue, 09 Apr 2013 08:48:28 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.176] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.176] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=nGlN8oT1mPtHDsZbvWQ2GRtl+PjqIawEDi6G6ISGNmM=; b=ztiImyCS/8C3nbSXeC6sLfiIbgukzjf0ofhZnGNIfyhIpkG4CcHo3469JcETjPV3ho CXm99U+gQXoz5prMP6z72St9cT5lMIZFREfTQcWxTDJzvzmG38vakMMnEKvg+D0TXmt/ 7kTIuUjqskk5AnF1B9LvKlt5kQv0vXMFRF+HKrgav8PQFQOhVWh0+z1U5UQP8SksMZ4C F8E6+oLjGfPsGAupbUinI/pHdvH3017iV5996cz48Y80O486CE1U4pun3HfkLTnw1Td/ 8kcBVkIiZb3yMB6w8oZ0DFUFqi9eOh9AHKC8vndUITa5Dkkg7gdxEMARunyr/OnmsEq6 4I4g== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr10474940igq.51.1365522507841; Tue, 09 Apr 2013 08:48:27 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 08:48:27 -0700 (PDT) In-Reply-To: <51643749.5080800@sandeen.net> References: <51642E5E.3040403@sandeen.net> <51643749.5080800@sandeen.net> Date: Tue, 9 Apr 2013 23:48:27 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee70393f104d9ef7c81 X-Barracuda-Connect: mail-ie0-f176.google.com[209.85.223.176] X-Barracuda-Start-Time: 1365522508 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127644 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 --14dae9340ee70393f104d9ef7c81 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable I'll work on reproducing the issue, can you share some tracing script to me? Thank you. 2013/4/9 Eric Sandeen > On 4/9/13 10:23 AM, =B7=FB=D3=C0=CC=CE wrote: > > So my question is why xfs shutdown always happens? With same > > reason(xfs_iunlink_remove: xfs_inotobp() returned error 22 > > xfs_inactive: xfs_ifree returned error 22 xfs_do_force_shutdown). > > The server load is high and is it related? > > We don't know yet. :) > > I'd like to know what was passed to xfs_inotobp when it shut down, > and what caused the EINVAL (22) return. Perhaps some tracing > or systemtap scripts could to it. > > If you only hit this every few weeks, though, it's going to be > difficult to catch. > > -Eric > > > free -m > > total used free shared buffers cach= ed > > Mem: 129016 128067 948 0 10 1199= 05 > > -/+ buffers/cache: 8150 120865 > > Swap: 4093 0 4093 > > > > > > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee70393f104d9ef7c81 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
I'll work on reproducing the issue, can you share some= tracing script to me? Thank you.

<= br>
2013/4/9 Eric Sandeen <<= a href=3D"mailto:sandeen@sandeen.net" target=3D"_blank">sandeen@sandeen.net= >
On 4/9/13 10:23 AM, =B7=FB= =D3=C0=CC=CE wrote:
> So my question is why xfs shutdown always  happens? With same
> reason(xfs_iunlink_remove: xfs_inotobp() returned error 22
> xfs_inactive: xfs_ifree returned error 22 xfs_do_force_shutdown).
> The server load is high and is it related?

We don't know yet.  :)

I'd like to know what was passed to xfs_inotobp when it shut down,
and what caused the EINVAL (22) return.  Perhaps some tracing
or systemtap scripts could to it.

If you only hit this every few weeks, though, it's going to be
difficult to catch.

-Eric

> free -m
>              total     &n= bsp; used       free     shared    buffe= rs     cached
> Mem:        129016     128067   &nb= sp;    948          0     &nbs= p;   10     119905
> -/+ buffers/cache:       8150     120865
> Swap:         4093         &nb= sp;0       4093
>
>




--
=B7=FB=D3= =C0=CC=CE
--14dae9340ee70393f104d9ef7c81-- From yongtaofu@gmail.com Tue Apr 9 10:49:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9E7FD7FC7 for ; Tue, 9 Apr 2013 10:49:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 18622AC003 for ; Tue, 9 Apr 2013 08:49:03 -0700 (PDT) X-ASG-Debug-ID: 1365522541-04cb6c1e7949dab0001-NocioJ Received: from mail-ie0-f172.google.com (mail-ie0-f172.google.com [209.85.223.172]) by cuda.sgi.com with ESMTP id 4vlVH5JiyqBgDpYF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 08:49:02 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.172] Received: by mail-ie0-f172.google.com with SMTP id c10so8566129ieb.17 for ; Tue, 09 Apr 2013 08:49:01 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=k7MAGDwN+Eog0OGBIP0fZ2vpX/4MbkC0bMzcv0ssS10=; b=TG07ol9XM4VaXyDuQuE0IgZ34rjv+kh1jKtbDAQ8e75bt9T1JpNE9XxSHQlCSxTBdd +Pf+Dk1NOKLoMkRO95F4RJakCPHIxph/AIQug16Vk8mC6apHDeb9kjQE90Wrm594QjO0 fRN9ixAP/oDLjBTnx5VX4jWuNbly+/w2Rej03i79lwJvwo86JHKHW1iviS/fw6POsr/a ZDx/tAmIWAiUynkvEQwchpJACVOmYtY0h5VSFXbtFFAcnsVWnxVcEs/30fH24athCWQZ F5QOjvwxb9bVUYIKDf2sbeVrFlofG24RfYE3oxj1h6LWnEeQ6Dcu8mzVN7iRxqAAXaQH oOkw== MIME-Version: 1.0 X-Received: by 10.50.192.165 with SMTP id hh5mr10775581igc.89.1365522541679; Tue, 09 Apr 2013 08:49:01 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 08:49:01 -0700 (PDT) In-Reply-To: References: <51642E5E.3040403@sandeen.net> <51643749.5080800@sandeen.net> Date: Tue, 9 Apr 2013 23:49:01 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae934086508883604d9ef7e7c X-Barracuda-Connect: mail-ie0-f172.google.com[209.85.223.172] X-Barracuda-Start-Time: 1365522541 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127644 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 --14dae934086508883604d9ef7e7c Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Or some useful debug tips? 2013/4/9 =B7=FB=D3=C0=CC=CE > I'll work on reproducing the issue, can you share some tracing script to > me? Thank you. > > > 2013/4/9 Eric Sandeen > >> On 4/9/13 10:23 AM, =B7=FB=D3=C0=CC=CE wrote: >> > So my question is why xfs shutdown always happens? With same >> > reason(xfs_iunlink_remove: xfs_inotobp() returned error 22 >> > xfs_inactive: xfs_ifree returned error 22 xfs_do_force_shutdown). >> > The server load is high and is it related? >> >> We don't know yet. :) >> >> I'd like to know what was passed to xfs_inotobp when it shut down, >> and what caused the EINVAL (22) return. Perhaps some tracing >> or systemtap scripts could to it. >> >> If you only hit this every few weeks, though, it's going to be >> difficult to catch. >> >> -Eric >> >> > free -m >> > total used free shared buffers >> cached >> > Mem: 129016 128067 948 0 10 >> 119905 >> > -/+ buffers/cache: 8150 120865 >> > Swap: 4093 0 4093 >> > >> > >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --14dae934086508883604d9ef7e7c Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Or some useful debug tips?


2013/4/9 =B7=FB=D3=C0=CC=CE <yon= gtaofu@gmail.com>
I'll work on reproducin= g the issue, can you share some tracing script to me? Thank you.
<= div class=3D"gmail_extra">


2013/4/9 Eric San= deen <sandeen@sandeen.net>
On 4/9/13 10:23 AM, =B7=FB=D3=C0=CC=CE = wrote:
> So my question is why xfs shutdown always  happens? With same
> reason(xfs_iunlink_remove: xfs_inotobp() returned error 22
> xfs_inactive: xfs_ifree returned error 22 xfs_do_force_shutdown).
> The server load is high and is it related?

We don't know yet.  :)

I'd like to know what was passed to xfs_inotobp when it shut down,
and what caused the EINVAL (22) return.  Perhaps some tracing
or systemtap scripts could to it.

If you only hit this every few weeks, though, it's going to be
difficult to catch.

-Eric

> free -m
>              total     &n= bsp; used       free     shared    buffe= rs     cached
> Mem:        129016     128067   &nb= sp;    948          0     &nbs= p;   10     119905
> -/+ buffers/cache:       8150     120865
> Swap:         4093         &nb= sp;0       4093
>
>




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--14dae934086508883604d9ef7e7c-- From bfoster@redhat.com Tue Apr 9 11:01:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4D48C7FD8 for ; Tue, 9 Apr 2013 11:01:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0FBF08F8035 for ; Tue, 9 Apr 2013 09:01:10 -0700 (PDT) X-ASG-Debug-ID: 1365523269-04bdf0542d4990c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id W5kxP8JCNNoLTXTg for ; Tue, 09 Apr 2013 09:01:09 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r39G17T3010326 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 9 Apr 2013 12:01:07 -0400 Received: from laptop.bfoster (vpn-53-187.rdu2.redhat.com [10.10.53.187]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r39G16Ge025154 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 9 Apr 2013 12:01:06 -0400 Message-ID: <51643AAA.20802@redhat.com> Date: Tue, 09 Apr 2013 11:58:34 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <51642E5E.3040403@sandeen.net> <51643749.5080800@sandeen.net> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1365523269 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/09/2013 11:48 AM, 符永涛 wrote: > I'll work on reproducing the issue, can you share some tracing script to > me? Thank you. > Hi, We're interested in tracking this problem down and are working on a script that might help us gather more information. We still have some research to do there, so please be patient! We'll share it when ready. In the meantime, I think it would be helpful to take Eric's advice if this occurs again: - umount/remount to replay the XFS log. - umount and collect a metadump of the filesystem (xfs_metadump). We'd be interested to see this if you're willing/able to collect and share it (note that this covers the fs prior to repair). - capture the xfs_repair output and share that as well. Thanks. Brian > > 2013/4/9 Eric Sandeen > > > On 4/9/13 10:23 AM, 符永涛 wrote: > > So my question is why xfs shutdown always happens? With same > > reason(xfs_iunlink_remove: xfs_inotobp() returned error 22 > > xfs_inactive: xfs_ifree returned error 22 xfs_do_force_shutdown). > > The server load is high and is it related? > > We don't know yet. :) > > I'd like to know what was passed to xfs_inotobp when it shut down, > and what caused the EINVAL (22) return. Perhaps some tracing > or systemtap scripts could to it. > > If you only hit this every few weeks, though, it's going to be > difficult to catch. > > -Eric > > > free -m > > total used free shared buffers > cached > > Mem: 129016 128067 948 0 10 > 119905 > > -/+ buffers/cache: 8150 120865 > > Swap: 4093 0 4093 > > > > > > > > > -- > 符永涛 > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Tue Apr 9 12:10:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4679929E12 for ; Tue, 9 Apr 2013 12:10:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B975DAC002 for ; Tue, 9 Apr 2013 10:10:36 -0700 (PDT) X-ASG-Debug-ID: 1365527432-04cbb01fba47bc20001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id HXvzF3sAQZLHe9ZF for ; Tue, 09 Apr 2013 10:10:32 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3D8F463C5B50; Tue, 9 Apr 2013 12:10:32 -0500 (CDT) Message-ID: <51644B87.60400@sandeen.net> Date: Tue, 09 Apr 2013 12:10:31 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: xfs@oss.sgi.com Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <51642E5E.3040403@sandeen.net> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365527432 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127648 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/9/13 10:18 AM, 符永涛 wrote: > The servers are back to service now and It's hard to run xfs_repair. It always happen bellow is the xfs_repair log when it happens on another server several days ago. ... > 第二步 > repair的log > > sh-4.1$ sudo xfs_repair /dev/glustervg/glusterlv > Phase 1 - find and verify superblock… > Phase 2 - using internal log > - zero log… > - scan filesystem freespace and inode maps… > agi unlinked bucket 0 is 4046848 in ag 0 (inode=4046848) > agi unlinked bucket 5 is 2340485 in ag 0 (inode=2340485) > agi unlinked bucket 6 is 2326854 in ag 0 (inode=2326854) > agi unlinked bucket 8 is 1802120 in ag 0 (inode=1802120) > agi unlinked bucket 14 is 495566 in ag 0 (inode=495566) > agi unlinked bucket 16 is 5899536 in ag 0 (inode=5899536) > agi unlinked bucket 19 is 4008211 in ag 0 (inode=4008211) > agi unlinked bucket 21 is 4906965 in ag 0 (inode=4906965) > agi unlinked bucket 23 is 2022231 in ag 0 (inode=2022231) > agi unlinked bucket 24 is 1626200 in ag 0 (inode=1626200) > agi unlinked bucket 25 is 938585 in ag 0 (inode=938585) > agi unlinked bucket 30 is 4226526 in ag 0 (inode=4226526) > agi unlinked bucket 34 is 4108962 in ag 0 (inode=4108962) > agi unlinked bucket 37 is 1740389 in ag 0 (inode=1740389) > agi unlinked bucket 39 is 247399 in ag 0 (inode=247399) > agi unlinked bucket 40 is 6237864 in ag 0 (inode=6237864) > agi unlinked bucket 43 is 3404331 in ag 0 (inode=3404331) > agi unlinked bucket 45 is 2092717 in ag 0 (inode=2092717) > agi unlinked bucket 48 is 4041008 in ag 0 (inode=4041008) > agi unlinked bucket 50 is 1459762 in ag 0 (inode=1459762) > agi unlinked bucket 56 is 852024 in ag 0 (inode=852024) If this machine is still around in similar state, can you do a # find /path/to/mount -inum $INODE_NUMBER for the inode numbers above, and see what files they are? That might give us a clue about what operations were happening to them. Dumping the gluster xattrs on those files might also be interesting. Just guesses here, but it'd be a little more data. (if this is an old repair, maybe doing the same for your most recent incident would be best) Thanks, -Eric > - found root in ode chunk > Phase 3 - for each AG… > - scan and clear agi unlinked lists… > - process known inodes and perform inode discovery… > - agno = 0 > 7f8220be6700: Badness in key lookup (length) > bp=(bno 123696, len 16384 bytes) key=(bno 123696, len 8192 bytes) (FWIW the above warnings look like an xfs_repair bug, not related) -Eric From eflorac@intellique.com Tue Apr 9 12:51:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A1B7829E1D for ; Tue, 9 Apr 2013 12:51:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 46D08AC001 for ; Tue, 9 Apr 2013 10:51:46 -0700 (PDT) X-ASG-Debug-ID: 1365529898-04bdf0542a4a7a70001-NocioJ Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id BW6i6i8t2ifQ7EH6 for ; Tue, 09 Apr 2013 10:51:39 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.4 Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 675FA4C8495; Tue, 9 Apr 2013 19:51:34 +0200 (CEST) Date: Tue, 9 Apr 2013 19:51:36 +0200 From: Emmanuel Florac To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: xfs_repair has been running for a very long time, no disk IO. Message-ID: <20130409195136.5e16473d@harpe.intellique.com> X-ASG-Orig-Subj: Re: xfs_repair has been running for a very long time, no disk IO. In-Reply-To: <20130409125402.GO17758@dastard> References: <20130409121726.6342519e@harpe.intellique.com> <20130409120236.GL17758@dastard> <20130409143010.114f3fda@harpe.intellique.com> <20130409125402.GO17758@dastard> Organization: Intellique X-Mailer: Claws Mail 3.9.0 (GTK+ 2.24.10; i486-slackware-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1365529898 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127652 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Tue, 9 Apr 2013 22:54:02 +1000 Dave Chinner =E9crivait: > Yes, it turns prefetching off, which is what usually what causes the > hangs. Though 3.1.4 is pretty old, and I think a few prefetch hangs > were fixed in 3.1.8.... >=20 Actually 3.1.11-pre2 did it without -P. Thanks. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From service-client@enfr2-18.com Tue Apr 9 15:08:31 2013 Return-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.8 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,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 8FE1D7FAD for ; Tue, 9 Apr 2013 15:08:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7DE78304066 for ; Tue, 9 Apr 2013 13:08:28 -0700 (PDT) X-ASG-Debug-ID: 1365538104-04cbb01fb8490d60001-NocioJ Received: from s4.enfr2-18.com (s4.enfr2-18.com [37.59.170.22]) by cuda.sgi.com with ESMTP id KwwF57JEqB4EPcr1 for ; Tue, 09 Apr 2013 13:08:24 -0700 (PDT) X-Barracuda-Envelope-From: service-client@enfr2-18.com X-Barracuda-Apparent-Source-IP: 37.59.170.22 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=enfr2-18.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@enfr2-18.com; bh=1GX9/PmRmAMyK+A4gla/YvFX/Xev4gMhv5paQg54H1E=; b=RRfHYY/TF9CMK4AHwUopONySp7GEW159wrkhtNsMVTDA+wBALTmvecHVPgYBYzkWAHOZ85vib0lG hXprYeuH8hMsJvbGhm7gb/NdvRLBnDX7K7eZSXNIkvX/nbT1XlAkpb4/jRMwV4e+XyUBfX/0PKAw L4gaY8aGjSBdXjG8jq4= From: Profil Retenu X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 39802 X-EN-uuid: 218-021839802-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Profitez de votre nouveau camping car MIME-Version: 1.0 X-ASG-Orig-Subj: Profitez de votre nouveau camping car List-Unsubscribe: http://www.enfr2-18.com/DhD4v4DualblkyUBvL-aWPlRPMqhdjj8ayGj5f9gsNo.html, Content-Type: multipart/alternative; boundary=205bfc7435d586cdfbb82c402d5446c6 Message-ID: <0.0.56.C4E.1CE355DFD7E628C.0@s4.enfr2-18.com> Date: Tue, 9 Apr 2013 22:08:24 +0200 X-Barracuda-Connect: s4.enfr2-18.com[37.59.170.22] X-Barracuda-Start-Time: 1365538104 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.80 X-Barracuda-Spam-Status: No, SCORE=0.80 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_02, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127660 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_MOSTLY BODY: Multipart message mostly text/html MIME 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary --205bfc7435d586cdfbb82c402d5446c6 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --205bfc7435d586cdfbb82c402d5446c6 Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit Lucky Surf Camping car

LuckySurf Félicitations ,

Nous sommes heureux de vous inviter
à gagner votre camping car ou
un chèque de 30 000 euros en participant à notre jeu.
Gagnez votre camping car Confirmez vos coordonées
ou un chèque de 30 000 euros

Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From mlsemon35@gmail.com Tue Apr 9 17:16:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4724629DFA for ; Tue, 9 Apr 2013 17:16:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E0B1FAC001 for ; Tue, 9 Apr 2013 15:16:35 -0700 (PDT) X-ASG-Debug-ID: 1365545790-04bdf0542d4bf7b0001-NocioJ Received: from mail-vb0-f48.google.com (mail-vb0-f48.google.com [209.85.212.48]) by cuda.sgi.com with ESMTP id 2St3vS96Z2sewz3A (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 15:16:31 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.48 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.48] Received: by mail-vb0-f48.google.com with SMTP id p13so5129798vbe.35 for ; Tue, 09 Apr 2013 15:16:30 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.48] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.48] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=qftoizJR5BxMxazN1V3CFu0jDJF6YVSzIY6EJMbjlL0=; b=t0S0KPpSRQB3ZfsGaCA0bKb8ZV5uyfjfnouIo+7fuV45XS2VrZIQ/SIlu41NkInhOi 01Q6oyt+2gnwUppYIHe3u3mX+Ld1DQhvTs8In2FppA0pHrS+GzWLmk5vfyszYACExjHk anWJidPTbotcyevGQC1IptdMVvqq9g4wKAHT5/BRgAJxD32HfP2Jq3leTS7caGY/E/94 H4HPifOnKWjENrOVshBx93GsL6mcuQm+8HZHXvHJCBSj1I7jV468mmm7HZWuKiSpyDEe yjhntOh7Q+DgXD9Vv1zs5zO5BMN8m/ZEz7j7Xm5xY9tkHfC/Eiyn6Xq8Hg+E/UTariu3 BJYw== MIME-Version: 1.0 X-Received: by 10.52.183.36 with SMTP id ej4mr7711759vdc.95.1365545790443; Tue, 09 Apr 2013 15:16:30 -0700 (PDT) Received: by 10.52.237.199 with HTTP; Tue, 9 Apr 2013 15:16:30 -0700 (PDT) In-Reply-To: References: Date: Tue, 9 Apr 2013 18:16:30 -0400 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: "Michael L. Semon" X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: =?UTF-8?B?56ym5rC45rab?= Cc: "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=bcaec548a5f9c3978e04d9f4e719 X-Barracuda-Connect: mail-vb0-f48.google.com[209.85.212.48] X-Barracuda-Start-Time: 1365545791 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127668 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.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain --bcaec548a5f9c3978e04d9f4e719 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable A meager non-expert user question with full ignorance of glusterfs: Why are you having I/O errors once every two weeks? This looks like XFS behavior I've seen under 2 conditions: 1) when I test XFS on the device-mapper flakey object, using XFS without an external journal, and 2) when I try to press my hard-drive connectors against the motherboard while the PC is still running. Your error message looks more like the result of (2) than of (1). XFS behavior on flakey is not the best, and I wish it would recover in such situations. In Case (2), I'm fairly sure that the PC is confused on a hardware level because the drive light does not go out. Then again, seeing the behavior of other file systems that fight through the errors, maybe it's for the best. If you're fighting I/O errors, there is no winner, and it's best to get rid of the I/O error. OK, I'm off the soapbox and will quietly wait for a RAID expert like Dave or Stan to jump in and make me feel like a complete amateur... MIchael On Tue, Apr 9, 2013 at 9:03 AM, =B7=FB=D3=C0=CC=CE wr= ote: > BTW > xfs_info /dev/sdb > meta-data=3D/dev/sdb isize=3D256 agcount=3D28, agsize=3D= 268435440 > blks > =3D sectsz=3D512 attr=3D2 > data =3D bsize=3D4096 blocks=3D7324303360, im= axpct=3D5 > =3D sunit=3D16 swidth=3D160 blks > naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 > log =3Dinternal bsize=3D4096 blocks=3D521728, versio= n=3D2 > =3D sectsz=3D512 sunit=3D16 blks, lazy-c= ount=3D1 > realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents= =3D0 > > 2013/4/9, =B7=FB=D3=C0=CC=CE : > > Dear xfs experts, > > I really need your help sincerely!!! In our production enviroment we > > run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs file > > system crash on some of the server frequently about every two weeks. > > Can you help to give me a direction about how to debug this issue and > > how to avoid it? Thank you very very much! > > > > uname -a > > Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 > > #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux > > > > Every time the crash log is same, as following > > > > 038 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > > xfs_inotobp() returned error 22. > > 1039 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree > > returned error 22 > > 1040 Apr 9 09:41:36 cqdx kernel: XFS (sdb): > > xfs_do_force_shutdown(0x1) called from line 1184 of file > > fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02ee20a > > 1041 Apr 9 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected. > > Shutting down filesystem > > 1042 Apr 9 09:41:36 cqdx kernel: XFS (sdb): Please umount the > > filesystem and rectify the problem(s) > > 1043 Apr 9 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > > returned. > > 1044 Apr 9 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > > returned. > > 1045 Apr 9 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > > returned. > > 1046 Apr 9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > > returned. > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > -- > =B7=FB=D3=C0=CC=CE > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > --bcaec548a5f9c3978e04d9f4e719 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
A meager non-expert user question with full ignorance of g= lusterfs:=C2=A0 Why are you having I/O errors once every two weeks?

This = looks like XFS behavior I've seen under 2 conditions: 1) when I test XF= S on the device-mapper flakey object, using XFS without an external journal= , and 2) when I try to press my hard-drive connectors against the motherboa= rd while the PC is still running.=C2=A0 Your error message looks more like = the result of (2) than of (1).

XFS behavior on flakey is not the best= , and I wish it would recover in such situations.=C2=A0 In Case (2), I'= m fairly sure that the PC is confused on a hardware level because the drive= light does not go out.=C2=A0 Then again, seeing the behavior of other file= systems that fight through the errors, maybe it's for the best.=C2=A0 = If you're fighting I/O errors, there is no winner, and it's best to= get rid of the I/O error.

OK, I'm off the soapbox and will q= uietly wait for a RAID expert like Dave or Stan to jump in and make me feel= like a complete amateur...

MIchael

On Tue, Apr 9, 2013 at 9:03 AM, =E7=AC=A6=E6= =B0=B8=E6=B6=9B <yongtaofu@gmail.com> wrote:
BTW
xfs_info /dev/sdb
meta-data=3D/dev/sdb =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 isize= =3D256 =C2=A0 =C2=A0agcount=3D28, agsize=3D268435440 blks
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sectsz=3D512 =C2=A0 attr=3D2
data =C2=A0 =C2=A0 =3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 bsize=3D4096 =C2=A0 blocks=3D7324303360, imaxpct=3D5
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sunit=3D16 =C2=A0 =C2=A0 swidth= =3D160 blks
naming =C2=A0 =3Dversion 2 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= bsize=3D4096 =C2=A0 ascii-ci=3D0
log =C2=A0 =C2=A0 =C2=A0=3Dinternal =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 bsize=3D4096 =C2=A0 blocks=3D521728, version=3D2
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sectsz=3D512 =C2=A0 sunit=3D16 bl= ks, lazy-count=3D1
realtime =3Dnone =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 extsz=3D4096 =C2=A0 blocks=3D0, rtextents=3D0

2013/4/9, =E7=AC=A6=E6=B0=B8=E6=B6=9B <yongtaofu@gmail.com>:
> Dear xfs experts,
> I really need your help sincerely!!! In our production enviroment we > run glusterfs over top of xfs on Dell x720D(Raid 6). And the xfs file<= br> > system crash on some of the server frequently about every two weeks. > Can you help to give me a direction about how to debug this issue and<= br> > how to avoid it? Thank you very very much!
>
> uname -a
> Linux cqdx.miaoyan.cluster1.node11.qiyi.domain 2.6.32-279.el6.x86_64 > #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
>
> Every time the crash log is same, as following
>
> 038 Apr =C2=A09 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > xfs_inotobp() returned error 22.
> 1039 Apr =C2=A09 09:41:36 cqdx kernel: XFS (sdb): xfs_inactive: xfs_if= ree
> returned error 22
> 1040 Apr =C2=A09 09:41:36 cqdx kernel: XFS (sdb):
> xfs_do_force_shutdown(0x1) called from line 1184 of file
> fs/xfs/xfs_vnodeops.c. =C2=A0Return address =3D 0xffffffffa02ee20a
> 1041 Apr =C2=A09 09:41:36 cqdx kernel: XFS (sdb): I/O Error Detected.<= br> > Shutting down filesystem
> 1042 Apr =C2=A09 09:41:36 cqdx kernel: XFS (sdb): Please umount the > filesystem and rectify the problem(s)
> 1043 Apr =C2=A09 09:41:53 cqdx kernel: XFS (sdb): xfs_log_force: error= 5
> returned.
> 1044 Apr =C2=A09 09:42:23 cqdx kernel: XFS (sdb): xfs_log_force: error= 5
> returned.
> 1045 Apr =C2=A09 09:42:53 cqdx kernel: XFS (sdb): xfs_log_force: error= 5
> returned.
> 1046 Apr =C2=A09 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error= 5
> returned.
>
> --
> =E7=AC=A6=E6=B0=B8=E6=B6=9B
>


--
=E7=AC=A6=E6=B0=B8=E6=B6=9B

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

--bcaec548a5f9c3978e04d9f4e719-- From sandeen@sandeen.net Tue Apr 9 17:18:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 53C7829DFA for ; Tue, 9 Apr 2013 17:18:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 41B3E8F804C for ; Tue, 9 Apr 2013 15:18:30 -0700 (PDT) X-ASG-Debug-ID: 1365545908-04cbb01fba49bc10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id gNpWSQMmv517P7Bz for ; Tue, 09 Apr 2013 15:18:28 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D9E1E63BE65C; Tue, 9 Apr 2013 17:18:27 -0500 (CDT) Message-ID: <516493B3.5030106@sandeen.net> Date: Tue, 09 Apr 2013 17:18:27 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: "Michael L. Semon" CC: =?UTF-8?B?56ym5rC45rab?= , "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365545908 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127668 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 4/9/13 5:16 PM, Michael L. Semon wrote: > A meager non-expert user question with full ignorance of glusterfs: > Why are you having I/O errors once every two weeks? It's runtime errors or corruption, followed by fs shutdown, which then results in IO errors, because all IOs are rejected on the shutdown FS. But that's not always immediately obvious from the stream of resulting "I/O Error" messages ;) -Eric > This looks like XFS behavior I've seen under 2 conditions: 1) when I > test XFS on the device-mapper flakey object, using XFS without an > external journal, and 2) when I try to press my hard-drive connectors > against the motherboard while the PC is still running. Your error > message looks more like the result of (2) than of (1). > > XFS behavior on flakey is not the best, and I wish it would recover > in such situations. In Case (2), I'm fairly sure that the PC is > confused on a hardware level because the drive light does not go out. > Then again, seeing the behavior of other file systems that fight > through the errors, maybe it's for the best. If you're fighting I/O > errors, there is no winner, and it's best to get rid of the I/O > error. > > OK, I'm off the soapbox and will quietly wait for a RAID expert like > Dave or Stan to jump in and make me feel like a complete amateur... > > MIchael > > On Tue, Apr 9, 2013 at 9:03 AM, 符永涛 > wrote: > > BTW xfs_info /dev/sdb meta-data=/dev/sdb isize=256 > agcount=28, agsize=268435440 blks = sectsz=512 > attr=2 data = bsize=4096 > blocks=7324303360 , imaxpct=5 = > sunit=16 swidth=160 blks naming =version 2 > bsize=4096 ascii-ci=0 log =internal bsize=4096 > blocks=521728, version=2 = sectsz=512 > sunit=16 blks, lazy-count=1 realtime =none > extsz=4096 blocks=0, rtextents=0 > > 2013/4/9, 符永涛 >: >> Dear xfs experts, I really need your help sincerely!!! In our >> production enviroment we run glusterfs over top of xfs on Dell >> x720D(Raid 6). And the xfs file system crash on some of the server >> frequently about every two weeks. Can you help to give me a >> direction about how to debug this issue and how to avoid it? Thank >> you very very much! >> >> uname -a Linux cqdx.miaoyan.cluster1.node11.qiyi.domain >> 2.6.32-279.el6.x86_64 #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 >> x86_64 x86_64 GNU/Linux >> >> Every time the crash log is same, as following >> >> 038 Apr 9 09:41:36 cqdx kernel: XFS (sdb): xfs_iunlink_remove: >> xfs_inotobp() returned error 22. 1039 Apr 9 09:41:36 cqdx kernel: >> XFS (sdb): xfs_inactive: xfs_ifree returned error 22 1040 Apr 9 >> 09:41:36 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called >> from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = >> 0xffffffffa02ee20a 1041 Apr 9 09:41:36 cqdx kernel: XFS (sdb): I/O >> Error Detected. Shutting down filesystem 1042 Apr 9 09:41:36 cqdx >> kernel: XFS (sdb): Please umount the filesystem and rectify the >> problem(s) 1043 Apr 9 09:41:53 cqdx kernel: XFS (sdb): >> xfs_log_force: error 5 returned. 1044 Apr 9 09:42:23 cqdx kernel: >> XFS (sdb): xfs_log_force: error 5 returned. 1045 Apr 9 09:42:53 >> cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. 1046 Apr >> 9 09:43:23 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> >> -- 符永涛 >> > > > -- 符永涛 > > _______________________________________________ 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 bpm@sgi.com Tue Apr 9 17:48:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 093747FA5 for ; Tue, 9 Apr 2013 17:48:53 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id BFF5B8F804B; Tue, 9 Apr 2013 15:48:52 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 9CDB6500B4F; Tue, 9 Apr 2013 17:48:52 -0500 (CDT) Date: Tue, 9 Apr 2013 17:48:52 -0500 From: Ben Myers To: Eric Sandeen , "Michael L. Semon" , =?utf-8?B?56ym5rC45rab?= Cc: "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 Message-ID: <20130409224852.GF22182@sgi.com> References: <516493B3.5030106@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <516493B3.5030106@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hey, On Tue, Apr 09, 2013 at 05:18:27PM -0500, Eric Sandeen wrote: > On 4/9/13 5:16 PM, Michael L. Semon wrote: > > A meager non-expert user question with full ignorance of glusterfs: > > Why are you having I/O errors once every two weeks? > > It's runtime errors or corruption, followed by fs shutdown, which then > results in IO errors, because all IOs are rejected on the shutdown FS. > > But that's not always immediately obvious from the stream of resulting > "I/O Error" messages ;) The IO errors are maybe a bit excessive and scary. I can understand why some people might misinterpret those messages and assume it's a hardware problem. -Ben From david@fromorbit.com Tue Apr 9 18:31:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1E5277FB0 for ; Tue, 9 Apr 2013 18:31:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E0A4F8F8052 for ; Tue, 9 Apr 2013 16:31:00 -0700 (PDT) X-ASG-Debug-ID: 1365550255-04bdf0542b4c55f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 3NGt9DKFPPCgAByL for ; Tue, 09 Apr 2013 16:30:56 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjYSACOjZFF5LMW7/2dsb2JhbABRgwa8TIUcBAGBFBd0gh8BAQQBOhwVDgULCAMOCgklDwUlAyETiA4FvwoVjWKBHQeDQQOWeIl2hxqBVYFIKg Received: from ppp121-44-197-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.187]) by ipmail05.adl6.internode.on.net with ESMTP; 10 Apr 2013 09:00:55 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UPi05-0001eE-4Q; Wed, 10 Apr 2013 09:30:53 +1000 Date: Wed, 10 Apr 2013 09:30:53 +1000 From: Dave Chinner To: Ben Myers Cc: Eric Sandeen , "Michael L. Semon" , =?utf-8?B?56ym5rC45rab?= , "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 Message-ID: <20130409233053.GP17758@dastard> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <516493B3.5030106@sandeen.net> <20130409224852.GF22182@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130409224852.GF22182@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1365550255 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 09, 2013 at 05:48:52PM -0500, Ben Myers wrote: > Hey, > > On Tue, Apr 09, 2013 at 05:18:27PM -0500, Eric Sandeen wrote: > > On 4/9/13 5:16 PM, Michael L. Semon wrote: > > > A meager non-expert user question with full ignorance of glusterfs: > > > Why are you having I/O errors once every two weeks? > > > > It's runtime errors or corruption, followed by fs shutdown, which then > > results in IO errors, because all IOs are rejected on the shutdown FS. > > > > But that's not always immediately obvious from the stream of resulting > > "I/O Error" messages ;) > > The IO errors are maybe a bit excessive and scary. That's entirely the point. If we stay silent we get complaints about not telling people that there's something wrong. If the error messages are not excessive and scary, then people don't report them and so we never hear about problems that are occurring. > I can understand why some > people might misinterpret those messages and assume it's a hardware problem. Quite frankly, the biggest problem we have *always* had is that people don't bother to read their log files when something has gone wrong or selectively quote the logs when reporting the bug. This is the primary reason for the "how to report a bug" FAQ entry asking for the *full logs* to be posted in a bug report. Removing error messages because they are "noisy" is not the answer. Verbose error messages (especially corruption reports) are there mainly for the benefit of the developers, not the user. The user needs to know when a corruption has occurred, but we need to understand the what, how and why of the issue. It's far better to scare users by dumping all the relevant info into the log when an error occurs than to be sitting around scratching our heads going "WTF?" like we are right now because there isn't enough information in the logs to have even a basic clue of what is going wrong... Cheers, Dave. -- Dave Chinner david@fromorbit.com From fyostenmn@theaces.com Tue Apr 9 18:53:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 685B17FBA for ; Tue, 9 Apr 2013 18:53:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C3C50AC003 for ; Tue, 9 Apr 2013 16:53:32 -0700 (PDT) X-ASG-Debug-ID: 1365551607-04cb6c1e7a4c9690001-NocioJ Received: from debian.50.lenny.32.minimal (static.85-10-194-109.clients.your-server.de [85.10.194.109]) by cuda.sgi.com with ESMTP id sL5C4n4RZBVykh1r for ; Tue, 09 Apr 2013 16:53:27 -0700 (PDT) X-Barracuda-Envelope-From: fyostenmn@theaces.com X-Barracuda-Apparent-Source-IP: 85.10.194.109 Received: from Unknown (unknown [124.124.59.93]) by debian.50.lenny.32.minimal (Postfix) with ESMTPA id DF77551198F; Wed, 10 Apr 2013 03:53:22 +0400 (MSD) Message-ID: <527BC3796CBE4317BADA6E44F741F996@oowh> Reply-To: =?windows-1251?B?w+vg4u376SD96u7t7uzo8fI=?= From: =?windows-1251?B?w+vg4u376SD96u7t7uzo8fI=?= To: , , , , Subject: =?windows-1251?B?4/Dg5O7x8vDu6PLl6/zt++kg6u7k5erxIPD0?= =?windows-1251?B?IDIwMTI=?= Date: Wed, 10 Apr 2013 01:53:32 +0200 X-ASG-Orig-Subj: =?windows-1251?B?4/Dg5O7x8vDu6PLl6/zt++kg6u7k5erxIPD0?= =?windows-1251?B?IDIwMTI=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_26AB_01CE358E.345E3360" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Barracuda-Connect: static.85-10-194-109.clients.your-server.de[85.10.194.109] X-Barracuda-Start-Time: 1365551607 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.127676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=_NextPart_000_26AB_01CE358E.345E3360 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=E0=FF =F1=F2=F0=EE=E8=F2=E5=EB=FC= =ED=E0=FF =FD=EA=F1=EF=E5=F0=F2=E8=E7=E0 - 2l0I =CA=F3=F0=F1 =EE=E1=EB=E5=E3=F7=E8=F2 =EF=F0=EE=F6=E5=F1=F1 =EF=EE=EB=F3=F7= =E5=ED=E8=FF =F0=E0=E7=F0=E5=F8=E5=ED=E8=E9 =ED=E0 =F1=F2=F0=EE=E8=F2=E5=EB= =FC=F1=F2=E2=EE, =EF=EE=EC=EE=E6=E5=F2 =F1 =FD=F2=E0=EF=EE=EC =E2=E2=EE=E4= =E0 =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =E8 =F0= =E0=E7=F0=E0=E1=EE=F2=EA=E5 =EF=F0=EE=E5=EA=F2=ED=EE-=F1=EC=E5=F2=ED=EE=E9= =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8, =EF=EE=EC=EE=E6=E5=F2 =E8=E7=E1=E5= =E6=E0=F2=FC =F2=E8=EF=E8=F7=ED=FB=F5 =EE=F8=E8=E1=EE=EA =EF=F0=E8 =F0=E0= =E1=EE=F2=E5 =F1 =C5=E4=E8=ED=EE=E9 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED= =EE=E9 =FD=EA=F1=EF=E5=F0=F2=E8=E7=EE=E9. =CD=E0 =F1=E5=EC=E8=ED=E0=F0=E5 =F2=E0=EA=E6=E5 =E1=F3=E4=F3=F2 =EF=EE=E4= =F0=EE=E1=ED=EE =F0=E0=F1=F1=EC=EE=F2=F0=E5=ED=FB =F2=E5=EC=FB =F6=E5=ED=EE= =EE=E1=F0=E0=E7=EE=E2=E0=ED=E8=FF =E8 =F1=EC=E5=F2=ED=EE=E3=EE =E4=E5=EB=E0= , =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=FB=F5 =ED=EE=F0=EC =E8 =EF=F0=E0=E2=E8=EB= , =E8=E7=F3=F7=E5=ED=FB =F2=E5=F5=ED=E8=F7=E5=F1=EA=E8=E5 =F0=E5=E3=EB=E0= =EC=E5=ED=F2=FB =F2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0 =E2 =EE= =E1=EB=E0=F1=F2=E8 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =E8 =F1=F2=F0=EE=E8= =F2=E5=EB=FC=F1=F2=E2=E0. =C4=C0=D2=C0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8= =FF: =C75l- 6 =E0=EF=F0=E5=EB=FF 2l=CEI=E3., =CF=C5=D2=C5=D0=C1=D3=D0=C3= . =CA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=FB=E9 =EA=F3=F0=F1 =EF=EE =F2=E5= =EC=E0=EC: - =EE=E1=E7=EE=F0 =E0=EA=F2=F3=E0=EB=FC=ED=EE=E3=EE =E7=E0=EA=EE=ED=EE=E4= =E0=F2=E5=EB=FC=F1=F2=E2=E0: 337-=D4=C7 =EE=F2 28.11.2011; 224-=D4=C7 =EE= =F2 18 =E8=FE=EB=FF 2011 =E3=EE=E4=E0; N224-=D4=C7 =E8 243-=D4=C7 =EE=F2 = 18 =E8=FE=EB=FF 2011 =E3=EE=E4=E0 =E8 =E4=F0=F3=E3=E8=E5 =ED=EE=F0=EC=E0=F2= =E8=E2=ED=EE-=EF=F0=E0=E2=EE=E2=FB=E5 =E0=EA=F2=FB; - =EF=EE=F0=FF=E4=EE=EA =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2=E8=FF =F1=EB= =F3=E6=E1 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E3=EE =F1=F2=F0=EE=E8= =F2=E5=EB=FC=ED=EE=E3=EE =ED=E0=E4=E7=EE=F0=E0 =E8 =ED=E5=E3=EE=F1=F3=E4=E0= =F0=F1=F2=E2=E5=ED=ED=EE=E9 =FD=EA=F1=EF=E5=F0=F2=E8=E7=FB; - =E0=EB=E3=EE=F0=E8=F2=EC =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2=E8=FF =F1= =E3=EE=F1=F1=F2=F0=EE=E9=ED=E0=E4=E7=EE=F0=EE=EC =E8 =FD=EA=F1=EF=E5=F0=F2= =E8=E7=EE=E9; - =CF=EE=EB=F3=F7=E5=ED=E8=E5 =F0=E0=E7=F0=E5=F8=E5=ED=E8=FF =ED=E0 =F1=F2= =F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=EE, =E0 =E7=E0=F2=E5=EC =E8 =ED=E0 =E2=E2=EE= =E4 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =EE=E1=FA=E5=EA=F2=E0 =ED=E5= =E4=E2=E8=E6=E8=EC=EE=F1=F2=E8. - =EF=EE=F1=EB=E5=E4=ED=E8=E5 =E8=E7=EC=E5=ED=E5=ED=E8=FF =E2 =E3=F0=E0=E4= =EA=EE=E4=E5=EA=F1, =E2=F1=F2=F3=EF=E0=FE=F9=E8=E5 =E2 =F1=E8=EB=F3 01.04= .2012 =E3. - =F0=F3=EA=EE=E2=EE=E4=FF=F9=E8=E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB: =FD=EA=F1= =EF=E5=F0=F2=E8=E7=E0, =E3=EE=F1=F1=F2=F0=EE=E9=ED=E0=E4=E7=EE=F0; - =E0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED=E0=FF =EE=F2=E2=E5=F2=F1=F2=E2= =E5=ED=ED=EE=F1=F2=FC; =C2 =F1=E5=EC=E8=ED=E0=F0=E5 =EF=F0=E8=ED=E8=EC=E0=FE=F2 =F3=F7=E0=F1=F2=E8= =E5 =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2=FB =EF=F0=EE=F4=E8=EB=FC=ED=FB=F5 =F1=EB= =F3=E6=E1, =FE=F0=E8=F1=F2=FB =E8 =FD=EA=F1=EF=E5=F0=F2=FB. =CF=F0=EE=E3=F0=E0=EC=EC=E0, =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF, =F0=E0=F1= =EF=E8=F1=E0=ED=E8=E5: =E7 ------=_NextPart_000_26AB_01CE358E.345E3360 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable

=C3=EE=F1= =F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=E0=FF =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=E0=FF= =FD=EA=F1=EF=E5=F0=F2=E8=E7=E0 - 20I=C7

=CA=F3=F0=F1 =EE=E1= =EB=E5=E3=F7=E8=F2 =EF=F0=EE=F6=E5=F1=F1 =EF=EE=EB=F3=F7=E5=ED=E8=FF =F0=E0= =E7=F0=E5=F8=E5=ED=E8=E9 =ED=E0 =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=EE, = =EF=EE=EC=EE=E6=E5=F2 =F1 =FD=F2=E0=EF=EE=EC =E2=E2=EE=E4=E0 =EE=E1=FA=E5= =EA=F2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =E8 =F0=E0=E7=F0=E0=E1= =EE=F2=EA=E5 =EF=F0=EE=E5=EA=F2=ED=EE-=F1=EC=E5=F2=ED=EE=E9 =E4=EE=EA=F3=EC= =E5=ED=F2=E0=F6=E8=E8, =EF=EE=EC=EE=E6=E5=F2 =E8=E7=E1=E5=E6=E0=F2=FC =F2= =E8=EF=E8=F7=ED=FB=F5 =EE=F8=E8=E1=EE=EA =EF=F0=E8 =F0=E0=E1=EE=F2=E5 =F1= =C5=E4=E8=ED=EE=E9 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E9 =FD=EA=F1= =EF=E5=F0=F2=E8=E7=EE=E9.
=CD=E0 =F1=E5=EC=E8=ED=E0=F0=E5 =F2= =E0=EA=E6=E5 =E1=F3=E4=F3=F2 =EF=EE=E4=F0=EE=E1=ED=EE =F0=E0=F1=F1=EC=EE=F2= =F0=E5=ED=FB =F2=E5=EC=FB =F6=E5=ED=EE=EE=E1=F0=E0=E7=EE=E2=E0=ED=E8=FF =E8= =F1=EC=E5=F2=ED=EE=E3=EE =E4=E5=EB=E0, =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=FB= =F5 =ED=EE=F0=EC =E8 =EF=F0=E0=E2=E8=EB, =E8=E7=F3=F7=E5=ED=FB =F2=E5=F5=ED= =E8=F7=E5=F1=EA=E8=E5 =F0=E5=E3=EB=E0=EC=E5=ED=F2=FB =F2=E0=EC=EE=E6=E5=ED= =ED=EE=E3=EE =F1=EE=FE=E7=E0 =E2 =EE=E1=EB=E0=F1=F2=E8 =E1=E5=E7=EE=EF=E0= =F1=ED=EE=F1=F2=E8 =E8 =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E0.

=C4=C0=D2= =C0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=FF: l5 = - l6 =E0=EF=F0=E5=EB=FF 2=CEI=E7=E3., =CF=C5=D2=C5=D0=C1=D3=D0=C3.

<= p> =CA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=FB=E9 =EA=F3=F0=F1 =EF=EE =F2= =E5=EC=E0=EC:
- =EE=E1=E7=EE=F0 =E0=EA=F2=F3=E0=EB=FC=ED=EE=E3= =EE =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=E0: 337-=D4=C7 =EE=F2 2= 8.11.2011; 224-=D4=C7 =EE=F2 18 =E8=FE=EB=FF 2011 =E3=EE=E4=E0; N224-=D4=C7= =E8 243-=D4=C7 =EE=F2 18 =E8=FE=EB=FF 2011 =E3=EE=E4=E0 =E8 =E4=F0=F3=E3= =E8=E5 =ED=EE=F0=EC=E0=F2=E8=E2=ED=EE-=EF=F0=E0=E2=EE=E2=FB=E5 =E0=EA=F2=FB= ;
- =EF=EE=F0=FF=E4=EE=EA =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2= =E8=FF =F1=EB=F3=E6=E1 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E3=EE =F1= =F2=F0=EE=E8=F2=E5=EB=FC=ED=EE=E3=EE =ED=E0=E4=E7=EE=F0=E0 =E8 =ED=E5=E3=EE= =F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E9 =FD=EA=F1=EF=E5=F0=F2=E8=E7=FB; <= /div>
- =E0=EB=E3=EE=F0=E8=F2=EC =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2= =E8=FF =F1 =E3=EE=F1=F1=F2=F0=EE=E9=ED=E0=E4=E7=EE=F0=EE=EC =E8 =FD=EA=F1= =EF=E5=F0=F2=E8=E7=EE=E9;
- =CF=EE=EB=F3=F7=E5=ED=E8=E5 =F0=E0= =E7=F0=E5=F8=E5=ED=E8=FF =ED=E0 =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=EE, = =E0 =E7=E0=F2=E5=EC =E8 =ED=E0 =E2=E2=EE=E4 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0= =F6=E8=FE =EE=E1=FA=E5=EA=F2=E0 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8.
- =EF=EE=F1=EB=E5=E4=ED=E8=E5 =E8=E7=EC=E5=ED=E5=ED=E8=FF =E2 =E3= =F0=E0=E4=EA=EE=E4=E5=EA=F1, =E2=F1=F2=F3=EF=E0=FE=F9=E8=E5 =E2 =F1=E8=EB= =F3 01.04.2012 =E3.
- =F0=F3=EA=EE=E2=EE=E4=FF=F9=E8=E5 =E4=EE= =EA=F3=EC=E5=ED=F2=FB: =FD=EA=F1=EF=E5=F0=F2=E8=E7=E0, =E3=EE=F1=F1=F2=F0= =EE=E9=ED=E0=E4=E7=EE=F0;
- =E0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2= =E8=E2=ED=E0=FF =EE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE=F1=F2=FC;
=C2 =F1=E5=EC=E8=ED=E0=F0=E5 =EF=F0=E8=ED=E8=EC=E0=FE=F2 =F3=F7=E0=F1=F2= =E8=E5 =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2=FB =EF=F0=EE=F4=E8=EB=FC=ED=FB=F5 =F1= =EB=F3=E6=E1, =FE=F0=E8=F1=F2=FB =E8 =FD=EA=F1=EF=E5=F0=F2=FB.

=CF= =F0=EE=E3=F0=E0=EC=EC=E0, =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF, =F0=E0=F1=EF= =E8=F1=E0=ED=E8=E5: 8 =EA=EE=E4_=CF=E8=F2=E5=F0=E0 64^2 - 5.6 = ^ 7-9

------=_NextPart_000_26AB_01CE358E.345E3360-- From jake@comcast.net Tue Apr 9 20:34:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DC4457F92 for ; Tue, 9 Apr 2013 20:34:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2F225AC001 for ; Tue, 9 Apr 2013 18:34:58 -0700 (PDT) X-ASG-Debug-ID: 1365557691-04cbb01fb94a8dc0001-NocioJ Received: from newhermes.utelcom.ru (mail.utelcom.ru [195.209.228.68]) by cuda.sgi.com with ESMTP id xIpMuEUasnroRLwX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 09 Apr 2013 18:34:52 -0700 (PDT) X-Barracuda-Envelope-From: jake@comcast.net X-Barracuda-Apparent-Source-IP: 195.209.228.68 Received: from Unknown ([202.109.133.181]) (authenticated bits=0) by newhermes.utelcom.ru (8.14.4/8.14.4) with ESMTP id r3A1YG9b059754; Wed, 10 Apr 2013 05:34:40 +0400 (MSD) Message-ID: Reply-To: =?windows-1251?B?wv/35fHr4OIg0eXw4+Xl4uj3?= From: =?windows-1251?B?wv/35fHr4OIg0eXw4+Xl4uj3?= To: , , , , Subject: =?windows-1251?B?xOjw5ery7vDzIPHl8ugg9Ojr6ODr7uI=?= Date: Wed, 10 Apr 2013 03:33:15 +0200 X-ASG-Orig-Subj: =?windows-1251?B?xOjw5ery7vDzIPHl8ugg9Ojr6ODr7uI=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_02B8_01CE359C.22FF2580" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Barracuda-Connect: mail.utelcom.ru[195.209.228.68] X-Barracuda-Start-Time: 1365557692 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127682 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_02B8_01CE359C.22FF2580 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D0=E0=F1=F8=E8=F0=E8=F2=FC =F4=E8=EB=E8=E0=EB=FC=ED=F3=FE =F1=E5=F2=FC =E1= =E5=E7 =F3=E2=E5=EB=E8=F7=E5=ED=E8=FF =E7=E0=F2=F0=E0=F2?=20 =C3=F0=E0=EC=EE=F2=ED=EE=E5 =F3=EF=F0=E0=E2=EB=E5=ED=E8=E5, =EE=EF=F2=E8=EC= =E8=E7=E0=F6=E8=FF =EF=F0=EE=E4=E0=E6 =3D =F0=EE=F1=F2 =FD=F4=F4=E5=EA=F2= =E8=E2=ED=EE=F1=F2=E8 =E1=E8=E7=ED=E5=F1=E0!=20 =20 =D1=E5=EC=E8=ED=E0=F0-=EF=F0=E0=EA=F2=E8=EA=F3=EC: =20 =CC=E0=F1=F8=F2=E0=E1=ED=E0=FF =F4=E8=EB=E8=E0=EB=FC=ED=E0=FF =F1=E5=F2=FC= : =F3=EF=F0=E0=E2=EB=E5=ED=E8=E5 =E8 =F0=E0=E7=E2=E8=F2=E8=E5=20 23-24 =E0=EF=F0=E5=EB=FF 201=E7 =CC=EE=F1=EA=E2=E0=20 =20 =CC=FB =EF=F0=E8=E3=EB=E0=F8=E0=E5=EC =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=E5= =E9 =EF=F0=E8=ED=FF=F2=FC =F3=F7=E0=F1=F2=E8=E5 =F1 =F6=E5=EB=FC=FE =F0=E5= =F8=E8=F2=FC =F2=E5=EA=F3=F9=E8=E5 =E2=EE=EF=F0=EE=F1=FB =EF=EE =F3=EF=F0= =E0=E2=EB=E5=ED=E8=FE, =EE=EF=F2=E8=EC=E8=E7=E0=F6=E8=E8 =EF=F0=EE=E4=E0=E6= , =E2=FB=E1=EE=F0=F3 =EE=EF=F2=E8=EC=E0=EB=FC=ED=EE=E9 =EC=EE=E4=E5=EB=E8= =F0=E0=E7=E2=E8=F2=E8=FF, =EA=EE=EC=EC=F3=ED=E8=EA=E0=F6=E8=E8 =E2=F1=E5= =F5 =E7=E2=E5=ED=FC=E5=E2 =E8 =E4=F0. =20 =C2 =EF=F0=EE=E3=F0=E0=EC=EC=E5: =20 1. =CE=F6=E5=ED=EA=E0 =F0=FB=ED=EE=F7=ED=EE=E9 =F1=E8=F2=F3=E0=F6=E8=E8: = =EF=EE=E4=E3=EE=F2=EE=E2=EA=E0 =EA =EE=EF=F2=E8=EC=E8=E7=E0=F6=E8=E8. 2. =CE=F0=E3=E0=ED=E8=E7=E0=F6=E8=EE=ED=ED=E0=FF =F1=F2=F0=F3=EA=F2=F3=F0= =E0 =F3=EF=F0=E0=E2=EB=E5=ED=E8=FF =F4=E8=EB=E8=E0=EB=FC=ED=EE=E9 =F1=E5=F2= =FC=FE, =F4=F3=ED=EA=F6=E8=EE=ED=E0=EB=FC=ED=FB=E5 =F2=E8=EF=FB =F4=E8=EB= =E8=E0=EB=EE=E2. 3. =CF=EE=E4=E3=EE=F2=EE=E2=EA=E0 =EA =EE=F2=EA=F0=FB=F2=E8=FE, =E7=E0=EF= =F3=F1=EA =E8 =EE=F6=E5=ED=EA=E0 =E1=E8=E7=ED=E5=F1=E0 =F4=E8=EB=E8=E0=EB= =E0. 4. =DD=F4=F4=E5=EA=F2=E8=E2=ED=FB=E5 =EC=E5=F2=EE=E4=E8=EA=E8 =EC=E5=ED=E5= =E4=E6=EC=E5=ED=F2=E0 =EF=F0=E8 =F3=EF=F0=E0=E2=EB=E5=ED=E8=E8 =F4=E8=EB=E8= =E0=EB=E0=EC=E8.=20 5. =CE=EF=F2=E8=EC=E8=E7=E0=F6=E8=FF =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2= =E8=FF =D6=E5=ED=F2=F0=E0 =E8 =D4=E8=EB=E8=E0=EB=EE=E2.=20 =20 40-50% =E2=F0=E5=EC=E5=ED=E8 =EE=F2=E2=EE=E4=E8=F2=F1=FF =ED=E0 =FD=EA=F1= =EF=F0=E5=F1=F1-=EA=EE=ED=F1=F3=EB=FC=F2=E8=F0=EE=E2=E0=ED=E8=E5 =96 =F0=E5= =F8=E5=ED=E8=E5 =EA=E5=E9=F1=EE=E2 =E8 =E7=E0=E4=E0=F7 =F3=F7=E0=F1=F2=ED= =E8=EA=EE=E2 =F1=E5=EC=E8=ED=E0=F0=E0 =20 =D1=E5=EC=E8=ED=E0=F0 =EF=F0=EE=F5=EE=E4=E8=F2 =E2 71-=FB=E9 =F0=E0=E7. =CF= =EE=F1=EB=E5 =E2=ED=E5=E4=F0=E5=ED=E8=FF =EF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8= =F5 =ED=E0=E2=FB=EA=EE=E2 =E8 =E7=ED=E0=ED=E8=E9, =EF=EE=EB=F3=F7=E5=ED=ED= =FB=F5 =ED=E0 =E4=E0=ED=ED=EE=EC =F1=E5=EC=E8=ED=E0=F0=E5, =EA=EE=EB=E8=F7= =E5=F1=F2=E2=EE =EF=F0=EE=E1=EB=E5=EC=ED=FB=F5 =F1=E8=F2=F3=E0=F6=E8=E9 =E2= =F3=EF=F0=E0=E2=EB=E5=ED=E8=E8 =F4=E8=EB=E8=E0=EB=E0=EC=E8 =E1=EE=EB=FC=F8= =E8=ED=F1=F2=E2=E0 =ED=E0=F8=E8=F5 =EA=EB=E8=E5=ED=F2=EE=E2 =F1=EE=EA=F0=E0= =F2=E8=EB=EE=F1=FC =E1=EE=EB=E5=E5 =F7=E5=EC =ED=E0 50%! =C1=EE=EB=E5=E5 = 3500 =EA=EE=EC=EF=E0=ED=E8=E9 =E8=F1=EF=EE=EB=FC=E7=F3=FE=F2 =ED=E0=F8=E8= =F0=E5=F8=E5=ED=E8=FF. =20 =C2 =F0=E0=E7=E4=E0=F2=EE=F7=ED=EE=EC =EC=E0=F2=E5=F0=E8=E0=EB=E5 =EF=F0=E5= =E4=F1=F2=E0=E2=EB=E5=ED=FB =F0=E0=E1=EE=F7=E8=E5 =E4=EE=EA=F3=EC=E5=ED=F2= =FB: =EE=F2=F7=B8=F2=FB, =EF=EB=E0=ED=FB, =F3=ED=E8=EA=E0=EB=FC=ED=FB=E5 = =EF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5 =EC=E5=F2=EE=E4=E8=EA=E8, =EF=EE=E7=E2= =EE=EB=FF=FE=F9=E8=E5 =EE=EF=F2=E8=EC=E8=E7=E8=F0=EE=E2=E0=F2=FC =F4=E8=EB= =E8=E0=EB=FC=ED=F3=FE =F1=E5=F2=FC. =20 =CF=EE=E4=F0=EE=E1=ED=E5=E5 =EE =ED=E0=F8=E5=E9 =EA=EE=EC=EF=E0=ED=E8=E8,= =E4=E0=ED=ED=EE=EC =F1=E5=EC=E8=ED=E0=F0=E5 =E8 =E5=E3=EE =E0=E2=F2=EE=F0= =E5: - 925 - 338 -- 78 -- 41 =CD=E0=E4=E5=E6=E4=E0 =F1 10:00 =E4=EE 18:30 =EF=EE =EC=EE=F1=EA=EE=E2=F1=EA=EE=EC=F3 =E2=F0=E5= =EC=E5=ED=E8 ------=_NextPart_000_02B8_01CE359C.22FF2580 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable

=D0=E0=F1=F8=E8=F0=E8=F2=FC =F4=E8=EB=E8=E0=EB=FC=ED=F3=FE= =F1=E5=F2=FC =E1=E5=E7 =F3=E2=E5=EB=E8=F7=E5=ED=E8=FF =E7=E0=F2=F0=E0=F2= ?=20

=C3=F0=E0=EC=EE=F2=ED=EE=E5 =F3=EF=F0=E0=E2=EB=E5=ED=E8=E5= , =EE=EF=F2=E8=EC=E8=E7=E0=F6=E8=FF =EF=F0=EE=E4=E0=E6 =3D =F0=EE=F1=F2 =FD= =F4=F4=E5=EA=F2=E8=E2=ED=EE=F1=F2=E8=20 =E1=E8=E7=ED=E5=F1=E0!

 

=D1=E5=EC=E8=ED= =E0=F0-=EF=F0=E0=EA=F2=E8=EA=F3=EC:

 

 =CC=E0=F1=F8=F2=E0=E1=ED=E0=FF= =F4=E8=EB=E8=E0=EB=FC=ED=E0=FF =F1=E5=F2=FC:=20 =F3=EF=F0=E0=E2=EB=E5=ED=E8=E5 =E8 =F0=E0=E7=E2=E8=F2=E8=E5

23-24=20 =E0=EF=F0=E5=EB=FF 201=E7

=CC=EE=F1= =EA=E2=E0=20

 

=CC=FB =EF=F0=E8=E3=EB=E0=F8=E0=E5=EC =F0=F3=EA=EE=E2=EE=E4= =E8=F2=E5=EB=E5=E9 =EF=F0=E8=ED=FF=F2=FC =F3=F7=E0=F1=F2=E8=E5 =F1 =F6=E5= =EB=FC=FE =F0=E5=F8=E8=F2=FC =F2=E5=EA=F3=F9=E8=E5=20 =E2=EE=EF=F0=EE=F1=FB =EF=EE =F3=EF=F0=E0=E2=EB=E5=ED=E8=FE, =EE=EF=F2=E8= =EC=E8=E7=E0=F6=E8=E8 =EF=F0=EE=E4=E0=E6, =E2=FB=E1=EE=F0=F3 =EE=EF=F2=E8= =EC=E0=EB=FC=ED=EE=E9 =EC=EE=E4=E5=EB=E8 =F0=E0=E7=E2=E8=F2=E8=FF,=20 =EA=EE=EC=EC=F3=ED=E8=EA=E0=F6=E8=E8 =E2=F1=E5=F5 =E7=E2=E5=ED=FC=E5=E2 =E8= =E4=F0.

 

=C2=20 =EF=F0=EE=E3=F0=E0=EC=EC=E5:

 

1. =CE=F6= =E5=ED=EA=E0 =F0=FB=ED=EE=F7=ED=EE=E9=20 =F1=E8=F2=F3=E0=F6=E8=E8: =EF=EE=E4=E3=EE=F2=EE=E2=EA=E0 =EA =EE=EF=F2=E8= =EC=E8=E7=E0=F6=E8=E8.

2. =CE=F0= =E3=E0=ED=E8=E7=E0=F6=E8=EE=ED=ED=E0=FF=20 =F1=F2=F0=F3=EA=F2=F3=F0=E0 =F3=EF=F0=E0=E2=EB=E5=ED=E8=FF =F4=E8=EB=E8=E0= =EB=FC=ED=EE=E9 =F1=E5=F2=FC=FE, =F4=F3=ED=EA=F6=E8=EE=ED=E0=EB=FC=ED=FB=E5= =F2=E8=EF=FB=20 =F4=E8=EB=E8=E0=EB=EE=E2.

3. =CF=EE= =E4=E3=EE=F2=EE=E2=EA=E0 =EA=20 =EE=F2=EA=F0=FB=F2=E8=FE, =E7=E0=EF=F3=F1=EA =E8 =EE=F6=E5=ED=EA=E0 =E1=E8= =E7=ED=E5=F1=E0 =F4=E8=EB=E8=E0=EB=E0.

4. =DD=F4= =F4=E5=EA=F2=E8=E2=ED=FB=E5=20 =EC=E5=F2=EE=E4=E8=EA=E8 =EC=E5=ED=E5=E4=E6=EC=E5=ED=F2=E0 =EF=F0=E8 =F3=EF= =F0=E0=E2=EB=E5=ED=E8=E8 =F4=E8=EB=E8=E0=EB=E0=EC=E8. <= /SPAN>

5. =CE=EF= =F2=E8=EC=E8=E7=E0=F6=E8=FF=20 =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2=E8=FF =D6=E5=ED=F2=F0=E0 =E8 =D4=E8=EB= =E8=E0=EB=EE=E2.

 

40-50% = =E2=F0=E5=EC=E5=ED=E8=20 =EE=F2=E2=EE=E4=E8=F2=F1=FF =ED=E0 =FD=EA=F1=EF=F0=E5=F1=F1-=EA=EE=ED=F1=F3= =EB=FC=F2=E8=F0=EE=E2=E0=ED=E8=E5 =96 =F0=E5=F8=E5=ED=E8=E5 =EA=E5=E9=F1=EE= =E2 =E8 =E7=E0=E4=E0=F7 =F3=F7=E0=F1=F2=ED=E8=EA=EE=E2=20 =F1=E5=EC=E8=ED=E0=F0=E0

 

<= FONT=20 face=3DCalibri>=D1=E5=EC= =E8=ED=E0=F0 =EF=F0=EE=F5=EE=E4=E8=F2 =E2=20 71-=FB=E9 =F0=E0=E7. =CF=EE=F1=EB=E5 =E2=ED=E5=E4=F0=E5=ED=E8=FF =EF=F0=E0= =EA=F2=E8=F7=E5=F1=EA=E8=F5 =ED=E0=E2=FB=EA=EE=E2 =E8 =E7=ED=E0=ED=E8=E9,= =EF=EE=EB=F3=F7=E5=ED=ED=FB=F5 =ED=E0 =E4=E0=ED=ED=EE=EC=20 =F1=E5=EC=E8=ED=E0=F0=E5, =EA=EE=EB=E8=F7=E5=F1=F2=E2=EE =EF=F0= =EE=E1=EB=E5=EC=ED=FB=F5 =F1=E8=F2=F3=E0=F6=E8=E9 =E2=20 =F3=EF=F0=E0=E2=EB=E5=ED=E8=E8 =F4=E8=EB=E8=E0=EB=E0=EC=E8 =E1=EE=EB=FC=F8= =E8=ED=F1=F2=E2=E0 =ED=E0=F8=E8=F5 =EA=EB=E8=E5=ED=F2=EE=E2 =F1=EE=EA=F0=E0=F2=E8=EB=EE=F1=FC =E1= =EE=EB=E5=E5 =F7=E5=EC =ED=E0 50%!=20 =C1=EE=EB=E5=E5=20 3500 =EA=EE=EC=EF=E0=ED=E8=E9 =E8=F1=EF=EE=EB=FC=E7=F3=FE=F2 =ED=E0=F8=E8= =F0=E5=F8=E5=ED=E8=FF.

 

=C2 =F0= =E0=E7=E4=E0=F2=EE=F7=ED=EE=EC=20 =EC=E0=F2=E5=F0=E8=E0=EB=E5 =EF=F0=E5=E4=F1=F2=E0=E2=EB=E5=ED=FB =F0=E0=E1= =EE=F7=E8=E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB: =EE=F2=F7=B8=F2=FB, =EF=EB=E0=ED= =FB, =F3=ED=E8=EA=E0=EB=FC=ED=FB=E5 =EF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5=20 =EC=E5=F2=EE=E4=E8=EA=E8, =EF=EE=E7=E2=EE=EB=FF=FE=F9=E8=E5 =EE=EF=F2=E8=EC= =E8=E7=E8=F0=EE=E2=E0=F2=FC =F4=E8=EB=E8=E0=EB=FC=ED=F3=FE=20 =F1=E5=F2=FC.

 

=CF=EE=E4=F0=EE=E1=ED=E5=E5=20 =EE =ED=E0=F8=E5=E9 =EA=EE=EC=EF=E0=ED=E8=E8, =E4=E0=ED=ED=EE=EC =F1=E5=EC= =E8=ED=E0=F0=E5 =E8 =E5=E3=EE =E0=E2=F2=EE=F0=E5:

- 925 - 338 -- 78 -- 41 =20 =CD=E0=E4=E5= =E6=E4=E0

=F1=20 10:00 =E4=EE 18:30 =EF=EE =EC=EE=F1=EA=EE=E2=F1=EA=EE=EC=F3 =E2=F0=E5=EC=E5= =ED=E8

------=_NextPart_000_02B8_01CE359C.22FF2580-- From daviddonihue10001@gmail.com Tue Apr 9 22:53:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E4AD729DFA for ; Tue, 9 Apr 2013 22:53:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A35E68F8049 for ; Tue, 9 Apr 2013 20:53:22 -0700 (PDT) X-ASG-Debug-ID: 1365566001-04bdf0542b4d3800001-w1Z2WR Received: from mail-pd0-f171.google.com (mail-pd0-f171.google.com [209.85.192.171]) by cuda.sgi.com with ESMTP id gxmumZCtFlU5slfZ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 20:53:21 -0700 (PDT) X-Barracuda-Envelope-From: daviddonihue10001@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.171 X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.171] Received: by mail-pd0-f171.google.com with SMTP id z10so25589pdj.30 for ; Tue, 09 Apr 2013 20:53:21 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.171] X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.171] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:date:subject:message-id:mime-version:from:to :content-type; bh=XCEUis0F47iYx7zLdHvZJbPihidyPf9aC5nOd38EXRY=; b=DDKqghuAHyZnMDqSX9OhCJJUfGnd5kN4DmiuKS61dta/cSPNHNWsMz99Xr+QLLPOwJ 1HxI9mtLF588VKMFu0StCdQdRKFyL+Vg3nlxOtO2q1jvVNTXAfijZGeKP1fkISRYQXds +zADsI2KrqkCcTieZzrKQ4Rpigy1SZ6QB5mWQCfsPk9kuaNhXFEBaUP+Z6E5rXuS1Q8/ TGGNI1XojtpiGQg1TT5M+ugjSDmutPGg1gMy90yiC07J42DoeIFdRlLOvn0652QHswIw kfvJHFRIKr6A9vqrae5k2vffMYdPYbfFpaVonMTDTo2KnH34d+PYQlEDdzF/+HFlZLrB j33w== X-Received: by 10.66.219.136 with SMTP id po8mr1189452pac.53.1365566001073; Tue, 09 Apr 2013 20:53:21 -0700 (PDT) Received: from localhost.localdomain (108-90-121-38.lightspeed.irvnca.sbcglobal.net. [108.90.121.38]) by mx.google.com with ESMTPS id jk11sm4653609pbb.0.2013.04.09.20.53.19 (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 09 Apr 2013 20:53:20 -0700 (PDT) Date: Tue, 09 Apr 2013 20:51:34 -0700 Subject: NEED A MUSIC VIDEO? Budgets starting at $3500 for cool acts Message-ID: X-ASG-Orig-Subj: NEED A MUSIC VIDEO? Budgets starting at $3500 for cool acts MIME-Version: 1.0 (Generated by Pantomime 1.2.0) From: Super Rad Motion Picture Group To: linux-xfs@oss.sgi.com Content-Type: multipart/alternative; boundary="=_9f617e605351464344e2ddd34713f301" X-Barracuda-Connect: mail-pd0-f171.google.com[209.85.192.171] X-Barracuda-Start-Time: 1365566001 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127692 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 --=_9f617e605351464344e2ddd34713f301 Content-Type: text/plain; charset="us-ascii"; format="flowed" http://www.superradfilms.com/music-videos.html Donihue directed the underground mini-hit The Weathered Underground staring Brea Grant from Heroes as well as the upcoming film The Bang Bang Brokers. His past music videos include Computer Killer (featuring Gas Lamp Killer and Computer Jay) The Lashes, Sirens Sister, Rocket, Pinehurst Kids, Mar Mar, Rick Shaffer, Aaron Manino and many others. He has cut promos for Guitar Heroes Soundgarden launch party, Wii's Just dance campaign and many more. David Donihue 323 363 0562 info@superradfilms.com --=_9f617e605351464344e2ddd34713f301 Content-Type: text/html; charset="us-ascii"; format="flowed"



http://www.superradfilms.com/music-videos.html


Donihue directed the underground mini-hit The Weathered Underground staring Brea Grant from Heroes as well as the upcoming film The Bang Bang Brokers. His past music videos include Computer Killer (featuring Gas Lamp Killer and Computer Jay) The Lashes, Sirens Sister, Rocket, Pinehurst Kids, Mar Mar, Rick Shaffer, Aaron Manino and many others. He has cut promos for Guitar Heroes Soundgarden launch party, Wii's Just dance campaign and many more.




David Donihue

323 363 0562

info@superradfilms.com




--=_9f617e605351464344e2ddd34713f301-- From Eevans34@gatech.edu Wed Apr 10 00:04:55 2013 Return-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=HTML_MESSAGE,LOTS_OF_MONEY, MONEY_FORM_SHORT,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 77C547F9F for ; Wed, 10 Apr 2013 00:04:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 565D3304032 for ; Tue, 9 Apr 2013 22:04:55 -0700 (PDT) X-ASG-Debug-ID: 1365570289-04cbb01fb84b59f0001-NocioJ Received: from deliverator1.gatech.edu (deliverator1.gatech.edu [130.207.165.161]) by cuda.sgi.com with ESMTP id 2E5fnNhViChczwfp; Tue, 09 Apr 2013 22:04:49 -0700 (PDT) X-Barracuda-Envelope-From: Eevans34@gatech.edu X-Barracuda-Apparent-Source-IP: 130.207.165.161 Received: from deliverator1.gatech.edu (localhost [127.0.0.1]) by localhost (Postfix) with SMTP id B199535482D7; Wed, 10 Apr 2013 01:04:20 -0400 (EDT) Received: from mail2.gatech.edu (mail2.gatech.edu [130.207.185.162]) by deliverator1.gatech.edu (Postfix) with ESMTP id 141AE354836C; Wed, 10 Apr 2013 01:04:18 -0400 (EDT) Received: from [10.185.222.201] (unknown [83.170.68.155]) (Authenticated sender: Eevans34) by mail2.gatech.edu (Postfix) with ESMTPSA id 51EA3185DD3; Wed, 10 Apr 2013 01:03:25 -0400 (EDT) Content-Type: multipart/alternative; boundary="===============0477341930==" MIME-Version: 1.0 Subject: Bayford's Donation To: Recipients X-ASG-Orig-Subj: Bayford's Donation From: Gillian and Adrian Bayford Date: Wed, 10 Apr 2013 06:02:29 +0100 Reply-To: gillianandadrianbayford02@rogers.com X-Antivirus: avast! (VPS 130328-1, 03/28/2013), Outbound message X-Antivirus-Status: Clean Message-Id: <20130410050325.51EA3185DD3@mail2.gatech.edu> X-GT-AVAS-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2013.4.10.45715 X-GT-Spam-Details: Internal Mail X-GT-Spam-Rating: (0%) X-GT-True-Rating: (9%) X-Barracuda-Connect: deliverator1.gatech.edu[130.207.165.161] X-Barracuda-Start-Time: 1365570289 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH, BSF_SC7_SA578_CH, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127696 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address 0.50 BSF_SC7_SA578_CH Custom Rule SA578_CH You will not see this in a MIME-aware mail reader. --===============0477341930== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body My wife and i won =A3148.6 Million Pounds last year, and we have done lots = of charity donation to family and friends and we are also giving out =A31.5= million to 5lucky recipient, we are sending you this notice because you are= our second recipient, send Name, Country,Occupation,Phone for more instruc= tions. see HERE for review --===============0477341930== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body
My wife and i won =A3148.6 Million Pounds last year, and we hav= e done lots of charity donation to family and friends and we are also givin= g out =A31.5million to 5lucky recipient, we are sending you this notic= e because you are our second recipient, send Name, Country,Occupa= tion,Phone for more instructions.&n= bsp;see HERE=  for review
--===============0477341930==-- From yongtaofu@gmail.com Wed Apr 10 00:34:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5D9527F89 for ; Wed, 10 Apr 2013 00:34:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 389DE8F8052 for ; Tue, 9 Apr 2013 22:34:43 -0700 (PDT) X-ASG-Debug-ID: 1365572079-04cbb01fba4b7550001-NocioJ Received: from mail-ia0-f178.google.com (mail-ia0-f178.google.com [209.85.210.178]) by cuda.sgi.com with ESMTP id CwAe6HLzyVDQgEdg (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 22:34:39 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.178] Received: by mail-ia0-f178.google.com with SMTP id f27so80479iae.23 for ; Tue, 09 Apr 2013 22:34:39 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=juYyLYC7Avmw394UGtf77ApLkg9yG6BxOt9fo1W2Jeo=; b=WgZC3WuIgKHG1m8xJbeX3yWPlBCC2fvYn3rgtwVzAqBEiKKctndzBxpcLRsmWPJGIx Q09YYMBkT9vbYXZeZlugE6zw5gzkzxlPwwG6jk/Ls0tYFV+jb6DScjpa2WhlyWpyKuGS 6fr7k0V6msDw3dnhiScDgacJT/HLA6DAvKl0lz2JylC4jersT1ACWG45W9OWpNKro625 Zx/V4wOrYXO7eFKszLZsMYiMU+o3VkrqWYzGQIQA066u/1XhWkJdE/pTS+bY1cc4AUQI VqnaOeur8+i9yOHYfOPyId5b32eEJBFMVjMybUqMom5KSnVkCo60lzqse+lfIFrgtS/+ 6t3Q== MIME-Version: 1.0 X-Received: by 10.42.155.136 with SMTP id u8mr418394icw.26.1365572079603; Tue, 09 Apr 2013 22:34:39 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 22:34:39 -0700 (PDT) In-Reply-To: <51644B87.60400@sandeen.net> References: <51642E5E.3040403@sandeen.net> <51644B87.60400@sandeen.net> Date: Wed, 10 Apr 2013 13:34:39 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=90e6ba6e817ab8a8fc04d9fb06da X-Barracuda-Connect: mail-ia0-f178.google.com[209.85.210.178] X-Barracuda-Start-Time: 1365572079 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127698 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 --90e6ba6e817ab8a8fc04d9fb06da Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Here's the file info in lost+found: [ lost+found]# pwd /mnt/xfsd/lost+found [ lost+found]# ls -l =D7=DC=D3=C3=C1=BF 4 ---------T 1 root root 0 2=D4=C2 28 15:42 3097 ---------T 1 root root 0 2=D4=C2 28 15:16 6169 [root@10.15.136.67 lost+found]# sudo getfattr -m . -d -e hex 6169 [root@10.15.136.67 lost+found]# sudo getfattr -m . -d -e hex 3097 # file: 3097 trusted.afr.ec-data-client-2=3D0x000000000000000000000000 trusted.afr.ec-data-client-3=3D0x000000000000000000000000 trusted.afr.ec-data1-client-2=3D0x000000000000000000000000 trusted.afr.ec-data1-client-3=3D0x000000000000000000000000 trusted.gfid=3D0x2bb701d327c44bb0af78d69e89f192a4 trusted.glusterfs.dht.linkto=3D0x65632d64617461312d7265706c69636174652d3400 trusted.glusterfs.quota.b8e8b3ef-0268-40af-93b6-257c4c7ef17a.contri=3D0x000= 0000004249000 It seems they're some link files for glusterfs dht xlator. Thank you. 2013/4/10 Eric Sandeen > On 4/9/13 10:18 AM, =B7=FB=D3=C0=CC=CE wrote: > > The servers are back to service now and It's hard to run xfs_repair. It > always happen bellow is the xfs_repair log when it happens on another > server several days ago. > > ... > > > =B5=DA=B6=FE=B2=BD > > repair=B5=C4log > > > > sh-4.1$ sudo xfs_repair /dev/glustervg/glusterlv > > Phase 1 - find and verify superblock=A1=AD > > Phase 2 - using internal log > > - zero log=A1=AD > > - scan filesystem freespace and inode maps=A1=AD > > agi unlinked bucket 0 is 4046848 in ag 0 (inode=3D4046848) > > agi unlinked bucket 5 is 2340485 in ag 0 (inode=3D2340485) > > agi unlinked bucket 6 is 2326854 in ag 0 (inode=3D2326854) > > agi unlinked bucket 8 is 1802120 in ag 0 (inode=3D1802120) > > agi unlinked bucket 14 is 495566 in ag 0 (inode=3D495566) > > agi unlinked bucket 16 is 5899536 in ag 0 (inode=3D5899536) > > agi unlinked bucket 19 is 4008211 in ag 0 (inode=3D4008211) > > agi unlinked bucket 21 is 4906965 in ag 0 (inode=3D4906965) > > agi unlinked bucket 23 is 2022231 in ag 0 (inode=3D2022231) > > agi unlinked bucket 24 is 1626200 in ag 0 (inode=3D1626200) > > agi unlinked bucket 25 is 938585 in ag 0 (inode=3D938585) > > agi unlinked bucket 30 is 4226526 in ag 0 (inode=3D4226526) > > agi unlinked bucket 34 is 4108962 in ag 0 (inode=3D4108962) > > agi unlinked bucket 37 is 1740389 in ag 0 (inode=3D1740389) > > agi unlinked bucket 39 is 247399 in ag 0 (inode=3D247399) > > agi unlinked bucket 40 is 6237864 in ag 0 (inode=3D6237864) > > agi unlinked bucket 43 is 3404331 in ag 0 (inode=3D3404331) > > agi unlinked bucket 45 is 2092717 in ag 0 (inode=3D2092717) > > agi unlinked bucket 48 is 4041008 in ag 0 (inode=3D4041008) > > agi unlinked bucket 50 is 1459762 in ag 0 (inode=3D1459762) > > agi unlinked bucket 56 is 852024 in ag 0 (inode=3D852024) > > If this machine is still around in similar state, can you do a > > # find /path/to/mount -inum $INODE_NUMBER > > for the inode numbers above, and see what files they are? > That might give us a clue about what operations were happening > to them. Dumping the gluster xattrs on those files > might also be interesting. Just guesses here, but it'd be a > little more data. > > (if this is an old repair, maybe doing the same for your most > recent incident would be best) > > Thanks, > -Eric > > > - found root in ode chunk > > Phase 3 - for each AG=A1=AD > > - scan and clear agi unlinked lists=A1=AD > > - process known inodes and perform inode discovery=A1=AD > > - agno =3D 0 > > 7f8220be6700: Badness in key lookup (length) > > bp=3D(bno 123696, len 16384 bytes) key=3D(bno 123696, len 8192 bytes) > > (FWIW the above warnings look like an xfs_repair bug, not related) > > -Eric > > --=20 =B7=FB=D3=C0=CC=CE --90e6ba6e817ab8a8fc04d9fb06da Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Here's the file info in lost+found:

[= lost+found]# pwd
/mnt/xfsd/lost+found
[ lost+found]# ls -l
=D7=DC= =D3=C3=C1=BF 4
---------T 1 root root 0 2=D4=C2  28 15:42 3097
-= --------T 1 root root 0 2=D4=C2  28 15:16 6169
[root@10.15.136.67 lost+found]# su= do getfattr -m . -d -e hex 6169
[ro= ot@10.15.136.67 lost+found]# sudo getfattr -m . -d -e hex 3097
# fil= e: 3097
trusted.afr.ec-data-client-2=3D0x000000000000000000000000
trusted.afr.ec= -data-client-3=3D0x000000000000000000000000
trusted.afr.ec-data1-client-= 2=3D0x000000000000000000000000
trusted.afr.ec-data1-client-3=3D0x0000000= 00000000000000000
trusted.gfid=3D0x2bb701d327c44bb0af78d69e89f192a4
trusted.glusterfs.dht.= linkto=3D0x65632d64617461312d7265706c69636174652d3400
trusted.glusterfs.= quota.b8e8b3ef-0268-40af-93b6-257c4c7ef17a.contri=3D0x0000000004249000
<= br>
It seems they're some link files for glusterfs dht xlator.
Thank you.


2013/4/10 Eric Sandeen <sandeen@sandeen.net>
On 4/9/13 10:18 AM, =B7=FB= =D3=C0=CC=CE wrote:
> The servers are back to service now and It'= ;s hard to run xfs_repair. It always happen bellow is the xfs_repair log wh= en it happens on another server several days ago.

...

> =B5=DA=B6=FE=B2=BD
> repair=B5=C4log
>
> sh-4.1$ sudo xfs_repair /dev/glustervg/glusterlv
> Phase 1 - find and verify superblock…
> Phase 2 - using internal log
>         - zero log…
>         - scan filesystem freespace and inode maps= …
> agi unlinked bucket 0 is 4046848 in ag 0 (inode=3D4046848)
> agi unlinked bucket 5 is 2340485 in ag 0 (inode=3D2340485)
> agi unlinked bucket 6 is 2326854 in ag 0 (inode=3D2326854)
> agi unlinked bucket 8 is 1802120 in ag 0 (inode=3D1802120)
> agi unlinked bucket 14 is 495566 in ag 0 (inode=3D495566)
> agi unlinked bucket 16 is 5899536 in ag 0 (inode=3D5899536)
> agi unlinked bucket 19 is 4008211 in ag 0 (inode=3D4008211)
> agi unlinked bucket 21 is 4906965 in ag 0 (inode=3D4906965)
> agi unlinked bucket 23 is 2022231 in ag 0 (inode=3D2022231)
> agi unlinked bucket 24 is 1626200 in ag 0 (inode=3D1626200)
> agi unlinked bucket 25 is 938585 in ag 0 (inode=3D938585)
> agi unlinked bucket 30 is 4226526 in ag 0 (inode=3D4226526)
> agi unlinked bucket 34 is 4108962 in ag 0 (inode=3D4108962)
> agi unlinked bucket 37 is 1740389 in ag 0 (inode=3D1740389)
> agi unlinked bucket 39 is 247399 in ag 0 (inode=3D247399)
> agi unlinked bucket 40 is 6237864 in ag 0 (inode=3D6237864)
> agi unlinked bucket 43 is 3404331 in ag 0 (inode=3D3404331)
> agi unlinked bucket 45 is 2092717 in ag 0 (inode=3D2092717)
> agi unlinked bucket 48 is 4041008 in ag 0 (inode=3D4041008)
> agi unlinked bucket 50 is 1459762 in ag 0 (inode=3D1459762)
> agi unlinked bucket 56 is 852024 in ag 0 (inode=3D852024)

If this machine is still around in similar state, can you do a<= br>
# find /path/to/mount -inum $INODE_NUMBER

for the inode numbers above, and see what files they are?
That might give us a clue about what operations were happening
to them.  Dumping the gluster xattrs on those files
might also be interesting.  Just guesses here, but it'd be a
little more data.

(if this is an old repair, maybe doing the same for your most
recent incident would be best)

Thanks,
-Eric

>         - found root in ode chunk
> Phase 3 - for each AG…
>         - scan and clear agi unlinked lists&hellip= ;
>         - process known inodes and perform inode d= iscovery…
>         - agno =3D 0
> 7f8220be6700: Badness in key lookup (length)
> bp=3D(bno 123696, len 16384 bytes) key=3D(bno 123696, len 8192 bytes)<= br>
(FWIW the above warnings look like an xfs_repair bug, not related)
-Eric




--
=B7=FB=D3= =C0=CC=CE
--90e6ba6e817ab8a8fc04d9fb06da-- From yongtaofu@gmail.com Wed Apr 10 00:36:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EC7CF7F89 for ; Wed, 10 Apr 2013 00:36:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A86FF304064 for ; Tue, 9 Apr 2013 22:36:41 -0700 (PDT) X-ASG-Debug-ID: 1365572199-04bdf0542c4d9380001-NocioJ Received: from mail-ia0-f174.google.com (mail-ia0-f174.google.com [209.85.210.174]) by cuda.sgi.com with ESMTP id Z7PH69OVYNoZCxZy (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 22:36:39 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.174] Received: by mail-ia0-f174.google.com with SMTP id r13so81575iar.19 for ; Tue, 09 Apr 2013 22:36:39 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=mtRF9lS0kmm+qWz/3VIDX61XVyNfxC1KGv9Y8AZ4e/o=; b=M6KN3GeWoaDcC165sVnB/BdBHW+moSC9kQzo3syaeUe5gUw/uaNe7AIEOjnIYPlRph RqqnKdO/BDIFBTvpfwRMXEYvhVVEfzVm3kVhfWiVGa93bYpJEeXNb3sBdfrfg7zz07Ru eP90kxxlGNowoo/j/r5m71nP/u5kwty8AE5ZJDFk5Fv5v04foUyoiEMMjSTyBIuAvG6S K2XMBQEe5rZVJOhULLskuS+Apmmldixj+r98aO8mNHeJ3j5sj2ti9GQA0kcWhTXy4N7d /1H+ryBGaVb1rJEo+i4pa5hZUVZAIcrt7od/bw0NsQWx5iTGHBos0Z9eoKFMHXpi/LEi 6OIg== MIME-Version: 1.0 X-Received: by 10.50.20.163 with SMTP id o3mr495434ige.51.1365572199469; Tue, 09 Apr 2013 22:36:39 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 9 Apr 2013 22:36:39 -0700 (PDT) In-Reply-To: References: <51642E5E.3040403@sandeen.net> <51644B87.60400@sandeen.net> Date: Wed, 10 Apr 2013 13:36:39 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=047d7bd75decdda54504d9fb0dc3 X-Barracuda-Connect: mail-ia0-f174.google.com[209.85.210.174] X-Barracuda-Start-Time: 1365572199 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.127698 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 --047d7bd75decdda54504d9fb0dc3 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable [/mnt/xfsd/lost+found]# pwd /mnt/xfsd/lost+found [ /mnt/xfsd/lost+found]# ls -l total 0 -rw-r--r-- 1 root root 0 Feb 1 19:18 6235944 [ /mnt/xfsd/lost+found]# sudo getfattr -m . -d -e hex 6235944 [ /mnt/xfsd/lost+found]# 2013/4/10 =B7=FB=D3=C0=CC=CE > Here's the file info in lost+found: > > [ lost+found]# pwd > /mnt/xfsd/lost+found > [ lost+found]# ls -l > =D7=DC=D3=C3=C1=BF 4 > ---------T 1 root root 0 2=D4=C2 28 15:42 3097 > ---------T 1 root root 0 2=D4=C2 28 15:16 6169 > [root@10.15.136.67 lost+found]# sudo getfattr -m . -d -e hex 6169 > [root@10.15.136.67 lost+found]# sudo getfattr -m . -d -e hex 3097 > # file: 3097 > trusted.afr.ec-data-client-2=3D0x000000000000000000000000 > trusted.afr.ec-data-client-3=3D0x000000000000000000000000 > trusted.afr.ec-data1-client-2=3D0x000000000000000000000000 > trusted.afr.ec-data1-client-3=3D0x000000000000000000000000 > trusted.gfid=3D0x2bb701d327c44bb0af78d69e89f192a4 > trusted.glusterfs.dht.linkto=3D0x65632d64617461312d7265706c69636174652d34= 00 > > trusted.glusterfs.quota.b8e8b3ef-0268-40af-93b6-257c4c7ef17a.contri=3D0x0= 000000004249000 > > > It seems they're some link files for glusterfs dht xlator. > > Thank you. > > > 2013/4/10 Eric Sandeen > >> On 4/9/13 10:18 AM, =B7=FB=D3=C0=CC=CE wrote: >> > The servers are back to service now and It's hard to run xfs_repair. I= t >> always happen bellow is the xfs_repair log when it happens on another >> server several days ago. >> >> ... >> >> > =B5=DA=B6=FE=B2=BD >> > repair=B5=C4log >> > >> > sh-4.1$ sudo xfs_repair /dev/glustervg/glusterlv >> > Phase 1 - find and verify superblock=A1=AD >> > Phase 2 - using internal log >> > - zero log=A1=AD >> > - scan filesystem freespace and inode maps=A1=AD >> > agi unlinked bucket 0 is 4046848 in ag 0 (inode=3D4046848) >> > agi unlinked bucket 5 is 2340485 in ag 0 (inode=3D2340485) >> > agi unlinked bucket 6 is 2326854 in ag 0 (inode=3D2326854) >> > agi unlinked bucket 8 is 1802120 in ag 0 (inode=3D1802120) >> > agi unlinked bucket 14 is 495566 in ag 0 (inode=3D495566) >> > agi unlinked bucket 16 is 5899536 in ag 0 (inode=3D5899536) >> > agi unlinked bucket 19 is 4008211 in ag 0 (inode=3D4008211) >> > agi unlinked bucket 21 is 4906965 in ag 0 (inode=3D4906965) >> > agi unlinked bucket 23 is 2022231 in ag 0 (inode=3D2022231) >> > agi unlinked bucket 24 is 1626200 in ag 0 (inode=3D1626200) >> > agi unlinked bucket 25 is 938585 in ag 0 (inode=3D938585) >> > agi unlinked bucket 30 is 4226526 in ag 0 (inode=3D4226526) >> > agi unlinked bucket 34 is 4108962 in ag 0 (inode=3D4108962) >> > agi unlinked bucket 37 is 1740389 in ag 0 (inode=3D1740389) >> > agi unlinked bucket 39 is 247399 in ag 0 (inode=3D247399) >> > agi unlinked bucket 40 is 6237864 in ag 0 (inode=3D6237864) >> > agi unlinked bucket 43 is 3404331 in ag 0 (inode=3D3404331) >> > agi unlinked bucket 45 is 2092717 in ag 0 (inode=3D2092717) >> > agi unlinked bucket 48 is 4041008 in ag 0 (inode=3D4041008) >> > agi unlinked bucket 50 is 1459762 in ag 0 (inode=3D1459762) >> > agi unlinked bucket 56 is 852024 in ag 0 (inode=3D852024) >> >> If this machine is still around in similar state, can you do a >> >> # find /path/to/mount -inum $INODE_NUMBER >> >> for the inode numbers above, and see what files they are? >> That might give us a clue about what operations were happening >> to them. Dumping the gluster xattrs on those files >> might also be interesting. Just guesses here, but it'd be a >> little more data. >> >> (if this is an old repair, maybe doing the same for your most >> recent incident would be best) >> >> Thanks, >> -Eric >> >> > - found root in ode chunk >> > Phase 3 - for each AG=A1=AD >> > - scan and clear agi unlinked lists=A1=AD >> > - process known inodes and perform inode discovery=A1=AD >> > - agno =3D 0 >> > 7f8220be6700: Badness in key lookup (length) >> > bp=3D(bno 123696, len 16384 bytes) key=3D(bno 123696, len 8192 bytes) >> >> (FWIW the above warnings look like an xfs_repair bug, not related) >> >> -Eric >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --047d7bd75decdda54504d9fb0dc3 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
[/mnt/xfsd/lost+found]# pwd
/mnt/xfsd/lost+found
[ /= mnt/xfsd/lost+found]# ls -l
total 0
-rw-r--r-- 1 root root 0 Feb = ; 1 19:18 6235944
[ /mnt/xfsd/lost+found]# sudo getfattr -m . -d -e hex = 6235944
[ /mnt/xfsd/lost+found]#


2013/4/10 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com<= /a>>
Here's the file info in lost+found:

[= lost+found]# pwd
/mnt/xfsd/lost+found
[ lost+found]# ls -l
=D7=DC= =D3=C3=C1=BF 4
---------T 1 root root 0 2=D4=C2  28 15:42 3097
-= --------T 1 root root 0 2=D4=C2  28 15:16 6169
[root@10.15.136.67 lost+found]# sudo getfattr -m . -d -e hex 6169
[
root@10.15.136.67 lost+found]# sudo g= etfattr -m . -d -e hex 3097
# file: 3097
trusted.afr.ec-data-client-2=3D0x000000000000000000000000
trusted.afr.ec= -data-client-3=3D0x000000000000000000000000
trusted.afr.ec-data1-client-= 2=3D0x000000000000000000000000
trusted.afr.ec-data1-client-3=3D0x0000000= 00000000000000000
trusted.gfid=3D0x2bb701d327c44bb0af78d69e89f192a4
trusted.glusterfs.dht.= linkto=3D0x65632d64617461312d7265706c69636174652d3400
trusted.glusterfs.= quota.b8e8b3ef-0268-40af-93b6-257c4c7ef17a.contri=3D0x0000000004249000
<= br>
It seems they're some link files for glusterfs dht xlator.
Thank you.


2013/4/10 Eric Sandeen <sande= en@sandeen.net>
On 4/9/13 10:18 AM, =B7=FB=D3=C0=CC=CE = wrote:
> The servers are back to service now and It's hard to ru= n xfs_repair. It always happen bellow is the xfs_repair log when it happens= on another server several days ago.

...

> =B5=DA=B6=FE=B2=BD
> repair=B5=C4log
>
> sh-4.1$ sudo xfs_repair /dev/glustervg/glusterlv
> Phase 1 - find and verify superblock…
> Phase 2 - using internal log
>         - zero log…
>         - scan filesystem freespace and inode maps= …
> agi unlinked bucket 0 is 4046848 in ag 0 (inode=3D4046848)
> agi unlinked bucket 5 is 2340485 in ag 0 (inode=3D2340485)
> agi unlinked bucket 6 is 2326854 in ag 0 (inode=3D2326854)
> agi unlinked bucket 8 is 1802120 in ag 0 (inode=3D1802120)
> agi unlinked bucket 14 is 495566 in ag 0 (inode=3D495566)
> agi unlinked bucket 16 is 5899536 in ag 0 (inode=3D5899536)
> agi unlinked bucket 19 is 4008211 in ag 0 (inode=3D4008211)
> agi unlinked bucket 21 is 4906965 in ag 0 (inode=3D4906965)
> agi unlinked bucket 23 is 2022231 in ag 0 (inode=3D2022231)
> agi unlinked bucket 24 is 1626200 in ag 0 (inode=3D1626200)
> agi unlinked bucket 25 is 938585 in ag 0 (inode=3D938585)
> agi unlinked bucket 30 is 4226526 in ag 0 (inode=3D4226526)
> agi unlinked bucket 34 is 4108962 in ag 0 (inode=3D4108962)
> agi unlinked bucket 37 is 1740389 in ag 0 (inode=3D1740389)
> agi unlinked bucket 39 is 247399 in ag 0 (inode=3D247399)
> agi unlinked bucket 40 is 6237864 in ag 0 (inode=3D6237864)
> agi unlinked bucket 43 is 3404331 in ag 0 (inode=3D3404331)
> agi unlinked bucket 45 is 2092717 in ag 0 (inode=3D2092717)
> agi unlinked bucket 48 is 4041008 in ag 0 (inode=3D4041008)
> agi unlinked bucket 50 is 1459762 in ag 0 (inode=3D1459762)
> agi unlinked bucket 56 is 852024 in ag 0 (inode=3D852024)

If this machine is still around in similar state, can you do a<= br>
# find /path/to/mount -inum $INODE_NUMBER

for the inode numbers above, and see what files they are?
That might give us a clue about what operations were happening
to them.  Dumping the gluster xattrs on those files
might also be interesting.  Just guesses here, but it'd be a
little more data.

(if this is an old repair, maybe doing the same for your most
recent incident would be best)

Thanks,
-Eric

>         - found root in ode chunk
> Phase 3 - for each AG…
>         - scan and clear agi unlinked lists&hellip= ;
>         - process known inodes and perform inode d= iscovery…
>         - agno =3D 0
> 7f8220be6700: Badness in key lookup (length)
> bp=3D(bno 123696, len 16384 bytes) key=3D(bno 123696, len 8192 bytes)<= br>
(FWIW the above warnings look like an xfs_repair bug, not related)
-Eric




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--047d7bd75decdda54504d9fb0dc3-- From shhuiw@gmail.com Wed Apr 10 01:48:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 363747FB5 for ; Wed, 10 Apr 2013 01:48:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 131B030406A for ; Tue, 9 Apr 2013 23:48:16 -0700 (PDT) X-ASG-Debug-ID: 1365576494-04bdf0542d4ddae0001-NocioJ Received: from mail-qa0-f47.google.com (mail-qa0-f47.google.com [209.85.216.47]) by cuda.sgi.com with ESMTP id ixtmFBXMMzj52mCm (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 09 Apr 2013 23:48:14 -0700 (PDT) X-Barracuda-Envelope-From: shhuiw@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.47 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.47] Received: by mail-qa0-f47.google.com with SMTP id hu16so2148913qab.13 for ; Tue, 09 Apr 2013 23:48:14 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.47] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.47] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=wHr6gFMQe5mqYvS/MJJePWht9VDjC4o75vJAvZRvi2Y=; b=kZQRX/8RWSztU7G4TuE69saeBnd7UmksyYfRpC+mNvQNEnLaaZtUW41UKV9BsoPNkB sx3pJTAaYk8GIw7g2NaUbXvzE9WsTHeIvsn73wyNhKMgGeC/CxmaVQBcwenjMMMAADam RGPfRM2fXo8/p39rTLrW/CmtGrO1sbf8rk8TVkF+j7kvCyZ41zYxvy8YRft3Et5MZIai 1UaHscV4DfQY0NafgxWoHF+PsNX8q1EeERWVP8vlqiyFM1MTzRz72XsTnBgIG9WyCAhd uSrNQ5EXLOwOH7aJJfgqd9QldocPT2GxK0sTl7HxVhFEVfh2yhqBDgMK2lowM2xG9nU1 qCog== X-Received: by 10.224.97.135 with SMTP id l7mr1133062qan.27.1365576494083; Tue, 09 Apr 2013 23:48:14 -0700 (PDT) Received: from [9.115.120.152] ([202.108.130.138]) by mx.google.com with ESMTPS id h5sm29043943qai.9.2013.04.09.23.48.10 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 09 Apr 2013 23:48:13 -0700 (PDT) Message-ID: <51650B1F.7050704@gmail.com> Date: Wed, 10 Apr 2013 14:47:59 +0800 From: Wang Sheng-Hui User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: xfstests , Dave Chinner Subject: Re: xfstests 'make install' failed References: <51615FBF.2020001@gmail.com> X-ASG-Orig-Subj: Re: xfstests 'make install' failed In-Reply-To: <51615FBF.2020001@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-qa0-f47.google.com[209.85.216.47] X-Barracuda-Start-Time: 1365576494 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127702 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 2013年04月07日 19:59, Wang Sheng-Hui wrote: > Hi, > > The testcases of xfstests have been reorganized into different subdirs to filesystems. > But the 'install' section of Makefile still uses the old location of testcases. Is anyone working on this? I pulled the latest xfstests tree, but found no changes to the Makefile. > > The 'install' of Makefile needs to be modified for the latest source code organization. > > Can someone share me one patch to make the install successful? > > > Thanks, > Sheng-Hui From david@fromorbit.com Wed Apr 10 01:55:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EFB777FB9 for ; Wed, 10 Apr 2013 01:55:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6D9BAAC002 for ; Tue, 9 Apr 2013 23:55:57 -0700 (PDT) X-ASG-Debug-ID: 1365576949-04bdf0542b4de330001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id phMSGFHShkoK7GfI for ; Tue, 09 Apr 2013 23:55:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApUSAOcLZVF5LMW7/2dsb2JhbABRgwaCeGm4YoUcBAGBGBd0gh8BAQUjDwEjIxAIAxgCAgUhAgIPBSUDIROIE6wMklcVgQ6MVIEdB4IugRMDlniREIMdKg Received: from ppp121-44-197-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.187]) by ipmail05.adl6.internode.on.net with ESMTP; 10 Apr 2013 16:25:49 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UPowd-0002RT-My; Wed, 10 Apr 2013 16:55:47 +1000 Date: Wed, 10 Apr 2013 16:55:47 +1000 From: Dave Chinner To: Wang Sheng-Hui Cc: xfstests Subject: Re: xfstests 'make install' failed Message-ID: <20130410065547.GS17758@dastard> X-ASG-Orig-Subj: Re: xfstests 'make install' failed References: <51615FBF.2020001@gmail.com> <51650B1F.7050704@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <51650B1F.7050704@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: 1365576949 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127704 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 10, 2013 at 02:47:59PM +0800, Wang Sheng-Hui wrote: > On 2013年04月07日 19:59, Wang Sheng-Hui wrote: > >Hi, > > > >The testcases of xfstests have been reorganized into different subdirs to filesystems. > >But the 'install' section of Makefile still uses the old location of testcases. > > Is anyone working on this? > > I pulled the latest xfstests tree, but found no changes to the Makefile. Perhaps you'd like to send a patch to fix it? Cheers, Dave. -- Dave Chinner david@fromorbit.com From axboe@kernel.dk Wed Apr 10 02:24:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 30B9D7F99 for ; Wed, 10 Apr 2013 02:24:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 514A5AC004 for ; Wed, 10 Apr 2013 00:24:40 -0700 (PDT) X-ASG-Debug-ID: 1365578678-04bdf0542b4e0490001-NocioJ Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by cuda.sgi.com with ESMTP id gRJ75bF0vCVbskGB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 10 Apr 2013 00:24:38 -0700 (PDT) X-Barracuda-Envelope-From: axboe@kernel.dk X-Barracuda-Apparent-Source-IP: 205.233.59.134 Received: from kernel.dk ([54.225.238.116]) by merlin.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1UPpOX-0005k9-VO; Wed, 10 Apr 2013 07:24:38 +0000 Received: from localhost (87-104-106-3-dynamic-customer.profibernet.dk [87.104.106.3]) by kernel.dk (Postfix) with ESMTPA id 425B02027F; Wed, 10 Apr 2013 07:24:37 +0000 (UTC) Date: Wed, 10 Apr 2013 09:24:18 +0200 From: Jens Axboe To: Dave Chinner Cc: Phillip Susi , CAI Qian , xfs@oss.sgi.com, LKML Subject: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] Message-ID: <20130410072418.GW12244@kernel.dk> X-ASG-Orig-Subj: Re: Loopback device hung [was Re: xfs deadlock on 3.9-rc5 running xfstests case #78] References: <14055702.547701.1364891947331.JavaMail.root@redhat.com> <20130402090047.GF3670@kernel.dk> <985125161.581860.1364895066584.JavaMail.root@redhat.com> <20130402094834.GA4667@kernel.dk> <20130403114142.GP4667@kernel.dk> <515C4D9D.10103@ubuntu.com> <515DE2FE.1080201@ubuntu.com> <20130409065519.GH17758@dastard> <20130409070139.GS12244@kernel.dk> <20130409070832.GI17758@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130409070832.GI17758@dastard> X-Barracuda-Connect: merlin.infradead.org[205.233.59.134] X-Barracuda-Start-Time: 1365578678 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127706 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 09 2013, Dave Chinner wrote: > On Tue, Apr 09, 2013 at 09:01:39AM +0200, Jens Axboe wrote: > > On Tue, Apr 09 2013, Dave Chinner wrote: > > > On Thu, Apr 04, 2013 at 04:30:54PM -0400, Phillip Susi wrote: > > > > > I have not tested it yet, but I am pretty sure it won't work. It > > > > > looks like the patch changes the BLKRRPART path to go ahead and remove > > > > > existing partitions when GENHD_FL_NO_PARTSCAN is set. loop doesn't > > > > > issue the BLKRRPART ioctl when !LO_FLAGS_PARTSCAN so this won't help. > > > > > I think loop needs to set GENHD_FL_NO_PARTSCAN and then issue the > > > > > ioctl regardless of the LO_FLAGS_PARTSCAN flag to get the partitions > > > > > to be removed. I will try to test tonight. > > > > > > > > After testing, my initial thoughts appeared to have been correct. I had > > > > to modify the patch as follows. To test, simply do: > > > > > > > > truncate -s 10m img > > > > losetup /dev/loop0 img > > > > parted /dev/loop0 > > > > mklabel msdos > > > > mkpart primary ext2 1m 2m > > > > quit > > > > ls /dev/loop0* > > > > > > > > Note the /dev/loop0p1 node. Run losetup -d /dev/loop0 and see if it is > > > > still there. > > > > > > Jens, can we get one of these fixes merged quickly? xfstests is > > > unusable on any kernel more recent than 3.9-rc4 because of these > > > problems.... > > > > Yep, did the revert yesterday and it's going out today. > > Great, I didn't see an update in the latest -rc, so I wanted to make > sure it hadn't fallen through he cracks.... Got pushed out yesterday, it is now upstream. -- Jens Axboe From serko3@modbee.com Wed Apr 10 04:01:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 099887FBA for ; Wed, 10 Apr 2013 04:01:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C1706304066 for ; Wed, 10 Apr 2013 02:00:56 -0700 (PDT) X-ASG-Debug-ID: 1365584447-04bdf0542c4e83f0001-NocioJ Received: from u571.netangels.ru (u571.netangels.ru [193.107.238.62]) by cuda.sgi.com with ESMTP id tHKkCFrK0Zh8HTdY for ; Wed, 10 Apr 2013 02:00:48 -0700 (PDT) X-Barracuda-Envelope-From: serko3@modbee.com X-Barracuda-Apparent-Source-IP: 193.107.238.62 Received: from Unknown (unknown [120.192.27.118]) (Authenticated sender: info@doors-ural.ru) by u571.netangels.ru (Postfix) with ESMTPA id D18FFA37EB; Wed, 10 Apr 2013 15:00:39 +0600 (YEKT) Message-ID: <9C3124FCA3D74662BDB9A7E9BEDEF694@uwleyr> Reply-To: =?windows-1251?B?zOXt5eTm5fAg7+4g7+Xw8e7t4Ovz?= From: =?windows-1251?B?zOXt5eTm5fAg7+4g7+Xw8e7t4Ovz?= To: , , , Subject: =?windows-1251?B?z9DAytLI18XRysjJIMrT0NEuINLQ08TOwtvF?= =?windows-1251?B?IMrNyMbKyC4=?= Date: Wed, 10 Apr 2013 11:00:44 +0200 X-ASG-Orig-Subj: =?windows-1251?B?z9DAytLI18XRysjJIMrT0NEuINLQ08TOwtvF?= =?windows-1251?B?IMrNyMbKyC4=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_057E_01CE35DA.A5D586A0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Barracuda-Connect: u571.netangels.ru[193.107.238.62] X-Barracuda-Start-Time: 1365584448 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127712 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_057E_01CE35DA.A5D586A0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=D0=C0=CA=D2=C8=D7=C5=D1=CA=C8=C9 =CA=D3=D0=D1 ----------------- =D2 =D0 =D3 =C4 =CE =C2 =DB =C5 =CA =CD =C8 =C6 =CA =C8. =C7=C0=CF=CE=CB=CD=C5=CD=C8=C5, =C2=C5=C4=C5=CD=C8=C5, =D5=D0=C0= =CD=C5=CD=C8=C5. =CF=F0=EE=F2=E8=E2=EE=F0=E5=F7=E8=FF =D2=F0=F3=E4=EE=E2=EE=E3=EE= =CA=EE=E4=E5=EA=F1=E0 =D0=D4. ------------------------------------ =20 I7 =E0=EF=F0=E5=EB=FF 20l=C7 =E3=EE=E4=E0, =D1=E0=ED=EA=F2-=CF=E5= =F2=E5=F0=E1=F3=F0=E3 =D2=E5=EB.: { =CA=CE=C4 =D1=CF=C1 } 64^2 - O5 _ =C74= =20 =C7=C0=D7=C5=CC? =CD=E0=F3=F7=E8=F2=FC=F1=FF =E2=F1=E5=E3=E4=E0 =EF=F0=E0=E2=E8=EB=FC=ED=EE= =E7=E0=EF=EE=EB=ED=FF=F2=FC =F2=F0=F3=E4=EE=E2=FB=E5 =EA=ED=E8=E6=EA=E8. =CA=CE=CC=D3 =C1=D3=C4=C5=D2 =C8=CD=D2=C5=D0=C5=D1=CD=CE? =D0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FF=EC =E8 =F1=EE=F2=F0=F3=E4=ED=E8=EA=E0= =EC =EE=F2=E4=E5=EB=EE=E2 =EA=E0=E4=F0=EE=E2, =EC=E5=ED=E5=E4=E6=E5=F0=E0= =EC =EF=EE =EF=E5=F0=F1=EE=ED=E0=EB=F3. =CA=D3=D0=D1 =C2=C5=C4=C5=D2: =CE=EF=FB=F2=ED=FB=E9 =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FC =EA=E0=E4=F0=EE= =E2=EE=E3=EE =E4=E5=EF=E0=F0=F2=E0=EC=E5=ED=F2=E0, =FD=EA=F1=EF=E5=F0=F2 = =EF=EE =EF=EE=E4=E3=EE=F2=EE=E2=EA=E5 =EA=E0=E4=F0=EE=E2=EE=E9 =E4=EE=EA=F3= =EC=E5=ED=F2=E0=F6=E8=E8 =EA =EF=F0=EE=E2=E5=F0=EA=E0=EC =E3=EE=F1=F3=E4=E0= =F0=F1=F2=E2=E5=ED=ED=EE=E9 =E8=ED=F1=EF=E5=EA=F6=E8=E5=E9 =F2=F0=F3=E4=E0= . ***************************************************** =C4=EE=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=E0=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF= =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=FF=E5=F2=F1=FF =EF=EE =E7=E0=EF=F0=EE=F1=F3= . =CF=EE =E2=EE=EF=F0=EE=F1=E0=EC =F3=F7=E0=F1=F2=E8=FF =E8 =F0=E5=E3=E8=F1= =F2=F0=E0=F6=E8=E8 =EE=E1=F0=E0=F9=E0=E9=F2=E5=F1=FC =EF=EE =F2=E5=EB=E5=F4= =EE=ED=F3: 8 { =CA=CE=C4 =D1=CF=C1 } 64^2 - O5 _ =C74 =20 =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC, =CA=E8=F1=E5=EB=E5=E2=E0 =CD=E0=F2=E0=EB=FC=FF =C0=EB=E5=EA=F1=E0=ED=E4=F0= =EE=E2=ED=E0 =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FC =EE=F2=E4=E5=EB=E0 =EE=E1=F3=F7=E5=ED= =E8=FF ------=_NextPart_000_057E_01CE35DA.A5D586A0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CF=D0=C0=CA=D2=C8=D7=C5=D1=CA=C8=C9 =CA=D3=D0=D1
---------------= --

          =D2 =D0 =D3= =C4 =CE =C2 =DB=20 =C5   =CA =CD =C8 =C6 =CA=20 =C8.
          =C7=C0=CF=CE= =CB=CD=C5=CD=C8=C5,=20 =C2=C5=C4=C5=CD=C8=C5, =D5=D0=C0=CD=C5=CD=C8=C5.
   &nb= sp;     =20 =CF=F0=EE=F2=E8=E2=EE=F0=E5=F7=E8=FF =D2=F0=F3=E4=EE=E2=EE=E3=EE =CA=EE=E4= =E5=EA=F1=E0=20 =D0=D4.
         =20 ------------------------------------
     &nb= sp;   =20
          I7=20 =E0=EF=F0=E5=EB=FF 20l=C7 =E3=EE=E4=E0,=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
 
          =D2=E5=EB.:=20 { =CA=CE=C4 =D1=CF=C1 } 64^2 - O5 _ =C74
 
=C7=C0=D7=C5=CC?
=CD=E0=F3=F7=E8=F2=FC=F1=FF =E2=F1=E5=E3=E4=E0 =EF= =F0=E0=E2=E8=EB=FC=ED=EE =E7=E0=EF=EE=EB=ED=FF=F2=FC =F2=F0=F3=E4=EE=E2=FB= =E5 =EA=ED=E8=E6=EA=E8.
 
=CA=CE=CC=D3 =C1=D3=C4=C5=D2 =C8=CD=D2=C5=D0=C5=D1=CD=CE?
=D0=F3=EA= =EE=E2=EE=E4=E8=F2=E5=EB=FF=EC =E8 =F1=EE=F2=F0=F3=E4=ED=E8=EA=E0=EC =EE=F2= =E4=E5=EB=EE=E2 =EA=E0=E4=F0=EE=E2,=20 =EC=E5=ED=E5=E4=E6=E5=F0=E0=EC =EF=EE =EF=E5=F0=F1=EE=ED=E0=EB=F3.
 
=CA=D3=D0=D1 =C2=C5=C4=C5=D2:
=CE=EF=FB=F2=ED=FB=E9 =F0=F3=EA=EE=E2= =EE=E4=E8=F2=E5=EB=FC =EA=E0=E4=F0=EE=E2=EE=E3=EE =E4=E5=EF=E0=F0=F2=E0=EC= =E5=ED=F2=E0, =FD=EA=F1=EF=E5=F0=F2 =EF=EE=20 =EF=EE=E4=E3=EE=F2=EE=E2=EA=E5 =EA=E0=E4=F0=EE=E2=EE=E9 =E4=EE=EA=F3=EC=E5= =ED=F2=E0=F6=E8=E8 =EA =EF=F0=EE=E2=E5=F0=EA=E0=EC =E3=EE=F1=F3=E4=E0=F0=F1= =F2=E2=E5=ED=ED=EE=E9 =E8=ED=F1=EF=E5=EA=F6=E8=E5=E9=20 =F2=F0=F3=E4=E0.
 
*****************************************************
=C4=EE=EF=EE= =EB=ED=E8=F2=E5=EB=FC=ED=E0=FF=20 =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=FF=E5=F2=F1= =FF =EF=EE =E7=E0=EF=F0=EE=F1=F3.
 
=CF=EE =E2=EE=EF=F0=EE=F1=E0=EC =F3=F7=E0=F1=F2=E8=FF =E8 =F0=E5=E3=E8= =F1=F2=F0=E0=F6=E8=E8 =EE=E1=F0=E0=F9=E0=E9=F2=E5=F1=FC =EF=EE =F2=E5=EB=E5= =F4=EE=ED=F3:
8 { =CA=CE=C4 =D1=CF=C1 } 64^2 - O5 _ =C74
 
=D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC,
=CA=E8=F1=E5=EB=E5=E2=E0 =CD=E0=F2= =E0=EB=FC=FF =C0=EB=E5=EA=F1=E0=ED=E4=F0=EE=E2=ED=E0
=F0=F3=EA=EE=E2=EE= =E4=E8=F2=E5=EB=FC =EE=F2=E4=E5=EB=E0=20 =EE=E1=F3=F7=E5=ED=E8=FF
------=_NextPart_000_057E_01CE35DA.A5D586A0-- From eflorac@intellique.com Wed Apr 10 05:10:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 08EDE7F83 for ; Wed, 10 Apr 2013 05:10:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E958A304067 for ; Wed, 10 Apr 2013 03:10:32 -0700 (PDT) X-ASG-Debug-ID: 1365588629-04cbb01fb74cc750001-NocioJ Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id XjgLXGSLU27mfRAG for ; Wed, 10 Apr 2013 03:10:30 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.4 Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 419D94C83E1; Wed, 10 Apr 2013 12:10:25 +0200 (CEST) Date: Wed, 10 Apr 2013 12:10:25 +0200 From: Emmanuel Florac To: =?GB2312?Q?=B7=FB=D3=C0=CC=CE?= Cc: Ben Myers , xfs@oss.sgi.com Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 Message-ID: <20130410121025.78a42b22@harpe.intellique.com> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: References: <20130409145238.GE22182@sgi.com> Organization: Intellique X-Mailer: Claws Mail 3.9.0 (GTK+ 2.24.10; i486-slackware-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1365588629 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Tue, 9 Apr 2013 23:10:03 +0800 ·ûÓÀÌÎ ¨¦crivait: > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected. > > Shutting down filesystem This. I/O error detected. That means that at some point the underlying device (disk, RAID array, SAN volume) couldn't be reached. So this could very well be a case of a flakey drive, array, cable or SCSI driver. What's the storage setup here? -- ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From service-client@enfr2-18.com Wed Apr 10 05:21:53 2013 Return-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.7 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,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 7450E7F83 for ; Wed, 10 Apr 2013 05:21:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D4265AC001 for ; Wed, 10 Apr 2013 03:21:49 -0700 (PDT) X-ASG-Debug-ID: 1365589303-04cbb01fb74cd730001-NocioJ Received: from s4.enfr2-18.com (s4.enfr2-18.com [37.59.170.22]) by cuda.sgi.com with ESMTP id YfDTIWkcC5DYlByB for ; Wed, 10 Apr 2013 03:21:43 -0700 (PDT) X-Barracuda-Envelope-From: service-client@enfr2-18.com X-Barracuda-Apparent-Source-IP: 37.59.170.22 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=enfr2-18.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@enfr2-18.com; bh=C5S/+LzhGo+08rytH8f2bqtd7TcYoGaN9lBRZtTXnoE=; b=Pxk2XqEHfuyQBxhJsYAO3/jfMJcuiLhFjlhoRC/4zjkuqr7q05uwXsYbDwIimVY3FpzL6Pbd/rE8 cXaB4/eDf32lR0q+lskmFnWtFAqeRNnMXOfgmJ4jHT5NevG31UkQNX1JUTNewVz7Nr4inK3PX7/l Dca64VoXJ/MFRepLbD0= From: Hotels 5 etoiles à -80% X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 39505 X-EN-uuid: 218-021839505-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Sejours a moins de 99 euros !!! MIME-Version: 1.0 X-ASG-Orig-Subj: Sejours a moins de 99 euros !!! List-Unsubscribe: http://www.enfr2-18.com/DtYnik1JZfea0moeEJg6FREbKpkPTHrDpsIrE9BQ8pw.html, Content-Type: multipart/alternative; boundary=f20023760c16da362404e0dabaa5b66b Message-ID: <0.0.108.60E.1CE35D532826B50.0@s4.enfr2-18.com> Date: Wed, 10 Apr 2013 12:21:43 +0200 X-Barracuda-Connect: s4.enfr2-18.com[37.59.170.22] X-Barracuda-Start-Time: 1365589303 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.88 X-Barracuda-Spam-Status: No, SCORE=0.88 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127718 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_MOSTLY BODY: Multipart message mostly text/html MIME 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary 0.46 PLING_PLING Subject has lots of exclamation marks --f20023760c16da362404e0dabaa5b66b Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --f20023760c16da362404e0dabaa5b66b Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit  

VeryChic - Ventes Privées d'hôtels extraordinaires
Accédez au luxe - Hotels 5 étoiles à moins de 99€
Je découvre les offres
Barcelone - Grèce - Lisbonne - Rome - Sud de la france - ile Maurice - Maroc

Hôtels extraordinaires

Localisation idéale

Grâce à leur solide expérience en voyages de luxe, notre équipe d'experts sont de véritables dénicheurs de tendances des quatre coins du monde. Qu'il s'agisse de la toute dernière ouverture d'hôtel 5 étoiles à Shanghai ou du plus confidentiel des hôtels de la côte amalfitaine, soyez assuré que nous le testerons pour vous.

Nous sélectionnons des hôtels situés de façon idéale pour vous permettre de tout avoir à proximité et de gagner du temps. Avec VeryChic, vous vous trouverez au cœur de l'ambiance de Rio, imprégnés de l'histoire de Rome, ou plongés dans le calme voluptueux de l'Algavre.

Label de Qualité

La qualité de chacun de nos partenaires fait l'objet d'une évaluation personnelle, rigoureuse et régulière afin de vous garantir un service impeccable.

Absolument tout passe sous la loupe de nos experts: localisation, agréments, services, réputation, recommandations, évaluations, fréquentation et bien plus. Tous ces détails font partie des critères d'éligibilité au très sérieux label VeryChic.

Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From rjohnston@sgi.com Wed Apr 10 07:12:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B4F5F29DFE for ; Wed, 10 Apr 2013 07:12:29 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 86B80304048; Wed, 10 Apr 2013 05:12:23 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Wed, 10 Apr 2013 07:12:23 -0500 Message-ID: <51655746.5050409@sgi.com> Date: Wed, 10 Apr 2013 07:12:54 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eryu Guan CC: Subject: Re: [PATCH 1/3] xfstests: remove comments about creator in new References: <1365331147-15179-1-git-send-email-eguan@redhat.com> In-Reply-To: <1365331147-15179-1-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Eryu, Thanks for the patch, it has been committed. --Rich commit 17ecca6b12c066735ce344417adb5824310fc67a Author: Eryu Guan Date: Sun Apr 7 10:39:05 2013 +0000 xfstests: remove comments about creator in new From rjohnston@sgi.com Wed Apr 10 07:13:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F147B29DFE for ; Wed, 10 Apr 2013 07:13:45 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id D9BA28F806F; Wed, 10 Apr 2013 05:13:42 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Wed, 10 Apr 2013 07:13:42 -0500 Message-ID: <51655796.8000701@sgi.com> Date: Wed, 10 Apr 2013 07:14:14 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eryu Guan CC: Subject: Re: [PATCH 2/3] xfstests: replace $seq.full with $seqres.full in ext4/305 and generic/308 References: <1365331147-15179-1-git-send-email-eguan@redhat.com> <1365331147-15179-2-git-send-email-eguan@redhat.com> In-Reply-To: <1365331147-15179-2-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Eryu, Thanks for the patch, it has been committed. --Rich commit 2bfce6d36f9fb1cba6a0c677a82c08a6f305db62 Author: Eryu Guan Date: Sun Apr 7 10:39:06 2013 +0000 xfstests: replace $seq.full with $seqres.full in ext4/305 and generic/308 From david@fromorbit.com Wed Apr 10 07:52:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CB50029DFA for ; Wed, 10 Apr 2013 07:52:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4915DAC002 for ; Wed, 10 Apr 2013 05:52:47 -0700 (PDT) X-ASG-Debug-ID: 1365598364-04cbb01fb74da690001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id oXZ6NNCTNBC7DRye for ; Wed, 10 Apr 2013 05:52: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: ApYSAJtfZVF5LMW7/2dsb2JhbABQgwaCeGm4XIUcBAGBERd0gh8BAQUjDwEjIxAIAQIOCgICBSECAg8FDRgDIROIAgMOkFObBIhmDYldFYEOix6BJw8GgRcHgi4yYQOMCIkPgWGGeoJ8gX6FHIFVgUgqgS8 Received: from ppp121-44-197-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.187]) by ipmail05.adl6.internode.on.net with ESMTP; 10 Apr 2013 22:22:43 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UPuW2-0003BL-CA; Wed, 10 Apr 2013 22:52:42 +1000 Date: Wed, 10 Apr 2013 22:52:42 +1000 From: Dave Chinner To: Emmanuel Florac Cc: =?utf-8?B?56ym5rC45rab?= , Ben Myers , xfs@oss.sgi.com Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 Message-ID: <20130410125242.GB10481@dastard> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20130410121025.78a42b22@harpe.intellique.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: 1365598364 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127728 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 10, 2013 at 12:10:25PM +0200, Emmanuel Florac wrote: > Le Tue, 9 Apr 2013 23:10:03 +0800 > 符永涛 écrivait: > > > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected. > > > Shutting down filesystem > > This. I/O error detected. That means that at some point the underlying > device (disk, RAID array, SAN volume) couldn't be reached. So this > could very well be a case of a flakey drive, array, cable or SCSI > driver. You can't take that one line of output out of context and then say it's a hardware problem - that's a generic IO-error-causes-shutdown message, not an EIO from the storage stack. The EINVAL error that is reported before this is the cause of the shutdown, and that is from a corrupted unlinked list. EINVAL indicates that we are falling off the end of the unlinked list without finding the inode that we are trying to remove from the unlinked list. Debug kernels will assert fail at this point. What causes that problem is still unknown. Nobody has been able to isolate the reproducer, so progress is slow. If someone can give me a script that reprodcues it directly on XFS (i.e no gluster), then it won't take long to find the bug.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From mlsemon35@gmail.com Wed Apr 10 08:47:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4006F7F67 for ; Wed, 10 Apr 2013 08:47:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 227BB8F8084 for ; Wed, 10 Apr 2013 06:47:03 -0700 (PDT) X-ASG-Debug-ID: 1365601619-04cb6c32cb0e3c0001-NocioJ Received: from mail-gg0-f178.google.com (mail-gg0-f178.google.com [209.85.161.178]) by cuda.sgi.com with ESMTP id hNC2FTaztTSmGM1w (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 10 Apr 2013 06:46:59 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.161.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.161.178] Received: by mail-gg0-f178.google.com with SMTP id e5so45986ggh.37 for ; Wed, 10 Apr 2013 06:46:59 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.161.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.161.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; bh=vwhyszZ5f6H/Hh9pT1CmLJap3x0V/LKhGXGVE4qx0Y0=; b=RdHHn+QopA1K8dM4LxSPq21L8I/5iZNmJZ3xPbF1/b8hDIsr9qTAdyBLa7pz0dzKXC j1tZk33Abu0BqUzDTBPzplTYRqFWRoVpAiZfWY6FQGSMl4GaWxD2wkzEmzehYc5bPzNj Bv8MxsQ64oL4UBU39z6teZYXqGEgJ/j0FHkAdT5p/6JSI0hsylHqcEeY2PAwhHauopra 3DLYvtpSfjZmji4NhDp1M7qILf9zdR9nznku5zpyklDfdSOGwz42YK+aigxNOfDfqDNV PAPOEzxHvF3E+l1O7cuCrFTh9IR/xghxyvNd2tWNK9XOmtnK3TtEdd9MoNQ7I62MpeCh ZAZw== X-Received: by 10.236.57.4 with SMTP id n4mr1214641yhc.25.1365601619090; Wed, 10 Apr 2013 06:46:59 -0700 (PDT) Received: from [192.168.0.139] (rrcs-97-78-60-146.se.biz.rr.com. [97.78.60.146]) by mx.google.com with ESMTPS id 28sm56146yhd.5.2013.04.10.06.46.57 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 10 Apr 2013 06:46:58 -0700 (PDT) Message-ID: <51656D47.9010806@gmail.com> Date: Wed, 10 Apr 2013 09:46:47 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: New xfstests generic/308 causes XFS hang (high CPU use), at least on 32-bit Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: New xfstests generic/308 causes XFS hang (high CPU use), at least on 32-bit Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-gg0-f178.google.com[209.85.161.178] X-Barracuda-Start-Time: 1365601619 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127729 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi! On my 32-bit Pentium III PC, xfstests generic/308 uses xfs_io, and that xfs_io hangs the XFS file system without causing a crash. In other words, the FS cannot be umounted, xfs_io can't be killed, and shutdown is handled by magic SysRq keys. In this time, there is about 90% CPU usage from xfs_io (top) but zero disk I/O (iostat). The PC uses kernel 3.8-rc4 + Dave's CRC v4 patches + J. Liu's bitness patch. In lieu of an oops or error message--can't get one, can't find one--I've tried some different things. An attempt to work through the SysRq keys seemed to yield some clues. However, it seemed better to come back with tracers running and run the test again, so tracers are before the SysRq section, after my closing. The SysRq-induced crash is at the very end. BTW, For a "write to huge offset" test, I'm surprised that generic/308 ran on a bare partition instead of on a loopback device. Thanks! Michael === TRACE: `cat /sys/kernel/debug/tracing/trace_pipe` <...>-363 [000] ...1 1083.623178: xfs_getattr: dev 8:1 ino 0x102d424 <...>-363 [000] ...1 1083.624885: xfs_ilock: dev 8:1 ino 0x839d91 flags ILOCK_SHARED caller return_to_handler <...>-363 [000] ...1 1083.624904: xfs_iunlock: dev 8:1 ino 0x839d91 flags ILOCK_SHARED caller return_to_handler <...>-363 [000] ...1 1083.624922: xfs_ilock: dev 8:1 ino 0xb83901 flags ILOCK_SHARED caller return_to_handler <...>-363 [000] ...1 1083.624933: xfs_iunlock: dev 8:1 ino 0xb83901 flags ILOCK_SHARED caller return_to_handler <...>-363 [000] ...1 1083.624950: xfs_ilock: dev 8:1 ino 0x102d439 flags ILOCK_SHARED caller return_to_handler <...>-363 [000] ...1 1083.624961: xfs_iunlock: dev 8:1 ino 0x102d439 flags ILOCK_SHARED caller return_to_handler <...>-361 [000] ...1 1083.629648: xfs_readlink: dev 8:1 ino 0x100e96 <...>-361 [000] ...1 1083.629656: xfs_ilock: dev 8:1 ino 0x100e96 flags ILOCK_SHARED caller return_to_handler <...>-361 [000] ...1 1083.629663: xfs_iunlock: dev 8:1 ino 0x100e96 flags ILOCK_SHARED caller return_to_handler <...>-365 [000] ...1 1083.643594: xfs_getattr: dev 8:8 ino 0xfb4c0 <...>-365 [000] ...1 1083.643642: xfs_getattr: dev 8:8 ino 0xfb4c0 CPU:0 [LOST 34086 EVENTS] xfs_io-831 [000] ...1 1097.066232: xfs_writepage: dev 8:11 ino 0x5d4b pgoff 0xfffff000 size 0xfffffffffff offset 0 delalloc 1 unwritten 0 xfs_io-831 [000] ...1 1097.066253: xfs_writepage: dev 8:11 ino 0x5d4b pgoff 0xfffff000 size 0xfffffffffff offset 0 delalloc 1 unwritten 0 xfs_io-831 [000] ...1 1097.066274: xfs_writepage: dev 8:11 ino 0x5d4b pgoff 0xfffff000 size 0xfffffffffff offset 0 delalloc 1 unwritten 0 xfs_io-831 [000] ...1 1097.066295: xfs_writepage: dev 8:11 ino 0x5d4b pgoff 0xfffff000 size 0xfffffffffff offset 0 delalloc 1 unwritten 0 xfs_io-831 [000] ...1 1097.066316: xfs_writepage: dev 8:11 ino 0x5d4b pgoff 0xfffff000 size 0xfffffffffff offset 0 delalloc 1 unwritten 0 === MOSTLY-FAILED SHUTDOWN SESSION: `./check generic/308` and afermath XFS (sda11): Mounting Filesystem XFS (sda11): Ending clean mount generic/308 ^CSysRq : Terminate All Tasks [At this point, attempts to kill xfs_io and umount the FS both failed.] [This is the attempted SysRq-w capture...] SysRq : Show Blocked State task PC stack pid father SysRq : Show Regs Pid: 5882, comm: xfs_io Not tainted 3.9.0-rc4+ #7 EIP: 0060:[] EFLAGS: 00000246 CPU: 0 EIP is at write_cache_pages+0x196/0x380 EAX: 00000000 EBX: d7df98e0 ECX: 00000000 EDX: d7df98e0 ESI: 00000000 EDI: c1062760 EBP: cc1c9ea8 ESP: cc1c9e10 DS: 007b ES: 007b FS: 0000 GS: 00e0 SS: 0068 CR0: 8005003b CR2: 093ae008 CR3: 0b9c6000 CR4: 00000790 DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 DR6: ffff0ff0 DR7: 00000400 Process xfs_io (pid: 5882, ti=d7406000 task=cc1b1650 task.ti=cc1c8000) Stack: 00000002 0000000e 000000f1 00000001 00000001 00000002 c1062760 00000000 cc1c9ee8 ffffffff 00000000 00000001 cc1c9e7c c105c1b0 c106fe58 ffffffff ce81d9b0 00000000 00000000 00000001 00000000 d7df98e0 d7df54c0 00000000 Call Trace: [] ? global_dirtyable_memory+0x40/0x40 [] ? filemap_fault+0x60/0x370 [] ? anon_vma_interval_tree_insert+0x78/0x80 [] ? unlock_page+0x42/0x50 [] ? __do_fault+0x16f/0x3a0 [] generic_writepages+0x2f/0x50 [] xfs_vm_writepages+0x11/0x20 [] do_writepages+0x15/0x40 [] __filemap_fdatawrite_range+0x72/0x80 [] filemap_write_and_wait_range.part.33+0x35/0x70 [] filemap_write_and_wait_range+0x2e/0x40 [] xfs_file_fsync+0x42/0x1a0 [] ? xfs_dir_fsync+0xc0/0xc0 [] vfs_fsync+0x2f/0x50 [] do_fsync+0x29/0x50 [] sys_fsync+0xd/0x10 [] sysenter_do_call+0x12/0x26 Code: c4 8b 03 f6 c4 20 75 ad 8b 03 f6 c4 20 0f 85 cc 00 00 00 89 d8 e8 db fd ff ff 85 c0 74 a7 8b 4d 08 89 d8 8b 55 88 8b 7d 80 ff d7 <85> c0 89 45 84 0f 85 b3 01 00 00 8b 4d 88 c7 45 84 00 00 00 00 CPU#0: active: 0000000000000000 CPU#0: gen-PMC0 ctrl: 0000000000000000 CPU#0: gen-PMC0 count: 00002d000000ffff CPU#0: gen-PMC0 left: 0000000000000000 CPU#0: gen-PMC1 ctrl: 0000000000000000 CPU#0: gen-PMC1 count: 00002d0000000000 CPU#0: gen-PMC1 left: 0000000000000000 SysRq : Show State task PC stack pid father init S d7447ab8 0 1 0 0x00000000 d7447ad8 00000086 00000001 d7447ab8 c1135386 00000000 d7444000 d7447b00 c13def24 c13de2f8 d7447aa8 c119fe48 d7447b00 c13de2ec 00000000 d7447ae0 00000282 d7447b78 004c4b3d 00000000 ed878fb6 00003e56 00000282 ed878fb6 Call Trace: [] ? xfs_iext_bno_to_ext+0x86/0x170 [] ? timerqueue_add+0x58/0xc0 [] schedule+0x1d/0x50 [] schedule_hrtimeout_range_clock+0xbc/0x160 [] ? __hrtimer_init+0x120/0x120 [] schedule_hrtimeout_range+0x12/0x20 [] poll_schedule_timeout+0x29/0x60 [] do_select+0x4bd/0x5b0 [] ? poll_select_copy_remaining+0x110/0x110 [] ? sched_clock_local.constprop.3+0x3e/0x150 [] ? __enqueue_entity.constprop.51+0x69/0x70 [] ? check_preempt_wakeup+0xc7/0x160 [] ? check_preempt_curr+0x6c/0x80 [] ? wake_up_process+0x1a/0x30 [] ? wake_up_worker+0x19/0x20 [] ? insert_work+0x44/0x60 [] ? __queue_work+0x68/0x170 [] ? lookup_fast+0xa6/0x290 [] ? _copy_from_user+0x30/0xa0 [] core_sys_select+0x1aa/0x620 [] ? final_putname+0x18/0x40 [] ? user_path_at_empty+0x4a/0x80 [] ? __copy_to_user_ll+0x5d/0x70 [] ? copy_to_user+0x2c/0x40 [] ? cp_new_stat64+0xf2/0x110 [] ? ktime_get_ts+0x39/0xf0 [] ? poll_select_set_timeout+0x5e/0x80 [] sys_select+0x8a/0xd0 [] sysenter_do_call+0x12/0x26 kthreadd S c103d9cc 0 2 0 0x00000000 d7449f90 00000046 d7449f40 c103d9cc cc1b1cb0 00000000 d7444330 d7449f50 00000296 00000000 cc1b1cb0 d7449f84 c101e6f3 00000000 cc162440 00000000 0000171b 00800711 00000000 0000007b 0000007b c1036560 d7444330 d7444330 Call Trace: [] ? check_preempt_curr+0x6c/0x80 [] ? do_fork+0xc3/0x220 [] ? __kthread_parkme+0x60/0x60 [] schedule+0x1d/0x50 [] kthreadd+0xa5/0xb0 [] ret_from_kernel_thread+0x1b/0x28 [] ? kthread_stop+0x60/0x60 ksoftirqd/0 S c144a190 0 3 2 0x00000000 d744bf54 00000046 c1029991 c144a190 c1449f90 00000004 d7444660 d744bf00 00000001 00000046 00000000 d744bf50 c10253e7 c1307990 d7402420 00000000 d7444660 c13dcb00 d7444660 04208040 0137e61f 00000001 00000100 d7402420 Call Trace: [] ? run_timer_softirq+0x131/0x190 [] ? __do_softirq+0xd7/0x140 [] ? common_interrupt+0x30/0x35 [] schedule+0x1d/0x50 [] smpboot_thread_fn+0xca/0x120 [] ? lg_global_unlock+0x10/0x10 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 kworker/0:0H S c1317fc0 0 5 2 0x00000000 d7453f40 00000046 d7513b40 c1317fc0 d7453ef8 00000000 d7444cc0 00000000 d7513b98 d7453f10 c10dbdc6 00000001 d740f900 d7513b98 c13ddf64 d7453f48 c1031808 d7453f24 c10315cf c13ddf70 d7453f48 c10325d1 c13de0c0 00000000 Call Trace: [] ? xfs_buf_iodone_work+0x86/0xd0 [] ? process_one_work+0x138/0x2e0 [] ? start_worker+0x1f/0x30 [] ? manage_workers+0x211/0x2b0 [] schedule+0x1d/0x50 [] worker_thread+0x168/0x300 [] ? manage_workers+0x2b0/0x2b0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 kworker/u:0 S d7401f80 0 6 2 0x00000000 d7459f40 00000046 0000802a d7401f80 d7459efc 00000000 d7444ff0 d751e000 00000000 c144aa00 d7459f08 d75383c0 d7eaa700 d7401100 d7459f24 d74561c4 00000003 c144aa00 d75383c0 c144aa00 d7459f48 c10325d1 c144ab5c 00000000 Call Trace: [] ? manage_workers+0x211/0x2b0 [] schedule+0x1d/0x50 [] worker_thread+0x168/0x300 [] ? manage_workers+0x2b0/0x2b0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 kworker/u:0H S d744402c 0 7 2 0x00000000 d745bf40 00000046 c13de620 d744402c d745bf00 00000000 d7445320 00000000 3b9955db 00000000 d7444330 d745bf6c c1305dc8 d745bf1c c103d9cc d7444000 00000004 d7445320 d745bf30 00000096 d7447e94 d7447ec4 00000000 d745bf38 Call Trace: [] ? __schedule+0x188/0x3f0 [] ? check_preempt_curr+0x6c/0x80 [] schedule+0x1d/0x50 [] worker_thread+0x168/0x300 [] ? manage_workers+0x2b0/0x2b0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 khelper S 0000038b 0 8 2 0x00000000 d7461f38 00000046 c1040007 0000038b 00000000 00000000 d7445650 00000000 d7461f0c c10400e0 c13de620 d744567c d7445650 c13de620 c130c740 00000000 d7461f24 c103d20d 00000000 d7445650 d7445650 ffffffec d7461f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 kdevtmpfs S c103d9cc 0 9 2 0x00000000 d7463edc 00000046 d7463e8c c103d9cc d76bfcb0 00000004 d7445980 d7463ea0 00000092 d6d85c64 d6d85c88 00000000 d7463ea8 c103daab d7463ed0 c103d0e7 00000000 00000000 d6d85c94 00000003 00000001 00000296 d6d85c8c 00000000 Call Trace: [] ? check_preempt_curr+0x6c/0x80 [] ? default_wake_function+0xb/0x10 [] ? __wake_up_common+0x47/0x70 [] schedule+0x1d/0x50 [] devtmpfsd+0x2b4/0x2d0 [] ? default_wake_function+0xb/0x10 [] ? handle_remove+0x270/0x270 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 bdi-default S 00000000 0 10 2 0x00000000 d7465ee8 00000046 c13de620 00000000 00000002 00000000 d7445cb0 73cbeb43 e7585fd1 0000127b d7445cdc 73cc1279 00003da4 d7465ecc c1040007 00002736 00000000 c103fc09 0000127b ca636990 d7445cb0 ca6369bc ca636990 c1449780 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? __enqueue_entity.constprop.51+0x69/0x70 [] schedule+0x1d/0x50 [] schedule_timeout+0x9d/0x110 [] ? __internal_add_timer+0xc0/0xc0 [] bdi_forker_thread+0x263/0x360 [] ? wb_do_writeback+0x1b0/0x1b0 [] ? bdi_sched_wait+0x10/0x10 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 kblockd S 0000065a 0 11 2 0x00000000 d7487f38 00000046 c1040007 0000065a 00000000 00000000 d7484000 00000000 d7487f0c c10400e0 c13de620 d748402c d7484000 c13de620 c130c740 00000000 d7487f24 c103d20d 00000000 d7484000 d7484000 ffffffec d7487f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 ata_sff S 00000359 0 12 2 0x00000000 d74a5f38 00000046 c1040007 00000359 00000000 00000000 d7484330 00000000 d74a5f0c c10400e0 c13de620 d748435c d7484330 c13de620 c130c740 00000000 d74a5f24 c103d20d 00000000 d7484330 d7484330 ffffffec d74a5f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 khubd S d74a3ea6 0 13 2 0x00000000 d74a7ed8 00000046 c74b5cd0 d74a3ea6 c123e49b 00000000 d7484660 1a29e84a 00000003 c13de620 00000000 00000002 d74a7ec8 c103f01e 0fb29a2c 0cd6fd2c 00000000 0d04cc62 00000000 d7484660 00000400 c13de67c d74a7edc d7444034 Call Trace: [] ? hub_port_status+0xab/0x100 [] ? sched_clock_local.constprop.3+0x3e/0x150 [] schedule+0x1d/0x50 [] hub_thread+0xdf0/0xf50 [] ? pick_next_task_fair+0xd9/0x160 [] ? __schedule+0x188/0x3f0 [] ? check_preempt_curr+0x6c/0x80 [] ? default_wake_function+0xb/0x10 [] ? abort_exclusive_wait+0x60/0x60 [] ? usb_reset_device+0x5c0/0x5c0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 kswapd0 S 00000000 0 16 2 0x00000000 d74f5ee4 00000046 00000000 00000000 00000001 00000004 d7484cc0 d74f5eb0 c105fcc5 00000001 00000000 0000037a c13f4888 00000000 d74f5ec8 c10663ca 00000001 00000000 c13f4888 00000001 d74f5eec c1066477 00000001 00000000 Call Trace: [] ? zone_watermark_ok_safe+0x35/0x40 [] ? zone_balanced+0x2a/0x70 [] ? pgdat_balanced+0x67/0xc0 [] schedule+0x1d/0x50 [] kswapd+0x69a/0x6b0 [] ? abort_exclusive_wait+0x60/0x60 [] ? try_to_free_pages+0x5e0/0x5e0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 fsnotify_mark S 00000000 0 17 2 0x00000000 d7515f34 00000046 00000000 00000000 00000000 00000004 d7484ff0 8020000b 00000008 00400011 d6fba04c d7515f4c d6fba000 d7e9f740 d7401400 d6fb9e40 d7e9f720 d7401380 d7515f28 c1082bc8 d7e9f720 d6fb9e40 d7515f1c d7515f4c Call Trace: [] ? kmem_cache_free+0x98/0xb0 [] schedule+0x1d/0x50 [] fsnotify_mark_destroy+0xe7/0x120 [] ? abort_exclusive_wait+0x60/0x60 [] ? fsnotify_put_mark.part.2+0x20/0x20 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfsalloc S 00000595 0 18 2 0x00000000 d7517f38 00000046 c1040007 00000595 00000000 00000000 d7485320 00000000 d7517f0c c10400e0 c13de620 d748534c d7485320 c13de620 c130c740 00000000 d7517f24 c103d20d 00000000 d7485320 d7485320 ffffffec d7517f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs_mru_cache S 00000240 0 19 2 0x00000000 d7519f38 00000046 c1040007 00000240 00000000 00000000 d7485650 00000000 d7519f0c c10400e0 c13de620 d748567c d7485650 c13de620 c130c740 00000000 d7519f24 c103d20d 00000000 d7485650 d7485650 ffffffec d7519f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfslogd S 00000269 0 20 2 0x00000000 d751bf38 00000046 c1040007 00000269 00000000 00000000 d7485980 00000000 d751bf0c c10400e0 c13de620 d74859ac d7485980 c13de620 c130c740 00000000 d751bf24 c103d20d 00000000 d7485980 d7485980 ffffffec d751bf40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 crypto S 00000240 0 21 2 0x00000000 d751df38 00000046 c1040007 00000240 00000000 00000000 d7485cb0 00000000 d751df0c c10400e0 c13de620 d7485cdc d7485cb0 c13de620 c130c740 00000000 d751df24 c103d20d 00000000 d7485cb0 d7485cb0 ffffffec d751df40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 scsi_eh_0 S 00000000 0 30 2 0x00000000 d754df2c 00000046 00000086 00000000 00000000 00000004 d751f650 d754df10 00000246 00000000 d754df10 00000282 00000282 d75461f4 00000246 d7544000 00000001 d74d9444 00000003 00000246 00000286 00000000 00000246 d74d9400 Call Trace: [] schedule+0x1d/0x50 [] scsi_error_handler+0x3b/0x3b0 [] ? scsi_eh_ready_devs+0x650/0x650 [] ? scsi_eh_ready_devs+0x650/0x650 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 scsi_eh_1 S 00000000 0 31 2 0x00000000 d754ff2c 00000046 00000086 00000000 00000000 00000004 d751f320 d754ff10 00000246 00000000 d754ff10 00000282 00000282 d754a1f4 00000246 d7548000 00000001 d74d9844 00000003 00000246 00000286 00000000 00000246 d74d9800 Call Trace: [] schedule+0x1d/0x50 [] scsi_error_handler+0x3b/0x3b0 [] ? scsi_eh_ready_devs+0x650/0x650 [] ? scsi_eh_ready_devs+0x650/0x650 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 kworker/u:1 S c103bcdb 0 32 2 0x00000000 d7553f40 00000046 d7553f10 c103bcdb 00000000 00000000 d751eff0 d751e000 d753ff50 c144aa00 d7553f08 c1449780 c144aa24 d7553f18 c10296a5 c144aa24 00000200 d7553f34 00000082 00000000 00000082 c144aa00 00000000 00000001 Call Trace: [] ? async_run_entry_fn+0x9b/0x130 [] ? internal_add_timer+0x15/0x40 [] schedule+0x1d/0x50 [] worker_thread+0x168/0x300 [] ? manage_workers+0x2b0/0x2b0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 kpsmoused S 0000051f 0 34 2 0x00000000 d7557f38 00000046 c1040007 0000051f 00000000 00000000 d751e990 00000000 d7557f0c c10400e0 c13de620 d751e9bc d751e990 c13de620 c130c740 00000000 d7557f24 c103d20d 00000000 d751e990 d751e990 ffffffec d7557f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 deferwq S 000003c2 0 36 2 0x00000000 d755bf38 00000046 c1040007 000003c2 00000000 00000000 d751e330 00000000 d755bf0c c10400e0 c13de620 d751e35c d751e330 c13de620 c130c740 00000000 d755bf24 c103d20d 00000000 d751e330 d751e330 ffffffec d755bf40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-data/sda1 S 00000000 0 40 2 0x00000000 d758df38 00000046 c105e88b 00000000 00000000 00000000 d75b6000 c10d862e d5371974 d5371948 d758df08 c10d8901 d75757e0 d5371974 c13ddde0 d758df40 c1031808 c103d20d 00000000 d75b6000 d75b6000 ffffffec d758df40 00000000 Call Trace: [] ? mempool_free+0x2b/0x60 [] ? xfs_destroy_ioend+0x5e/0x70 [] ? xfs_end_io+0x31/0x100 [] ? process_one_work+0x138/0x2e0 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-conv/sda1 S 00000268 0 41 2 0x00000000 d758ff38 00000046 c1040007 00000268 00000000 00000000 d75b6330 00000000 d758ff0c c10400e0 c13de620 d75b635c d75b6330 c13de620 c130c740 00000000 d758ff24 c103d20d 00000000 d75b6330 d75b6330 ffffffec d758ff40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-cil/sda1 S 00000261 0 42 2 0x00000000 d7591f38 00000046 c1040007 00000261 00000000 00000000 d75b6660 00000000 d7591f0c c10400e0 c13de620 d75b668c d75b6660 c13de620 c130c740 00000000 d7591f24 c103d20d 00000000 d75b6660 d75b6660 ffffffec d7591f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 kworker/0:1H S c13ddf64 0 43 2 0x00000000 d7593f40 00000046 d7513b40 c13ddf64 d7593eec 00000000 d75b6990 c114b8c8 d7513b98 d7593f10 c10dbd8b c118aac8 d7575c00 d7513b98 c13ddf64 d7593f48 c1031808 c13ddf64 d7575c00 d7593f74 d75b6990 d75b007b c130007b 00000000 Call Trace: [] ? xfs_buf_iodone_callbacks+0x38/0xf0 [] ? xfs_buf_iodone_work+0x4b/0xd0 [] ? __blk_run_queue+0x28/0x40 [] ? process_one_work+0x138/0x2e0 [] ? kernel_init+0x5b/0x160 [] schedule+0x1d/0x50 [] worker_thread+0x168/0x300 [] ? manage_workers+0x2b0/0x2b0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfsaild/sda1 S d75d3ec0 0 44 2 0x00000000 d75d3f20 00000046 d75d3eb8 d75d3ec0 d75d3ec0 00000000 d75b6cc0 c1449780 0137a4d2 d75d3f00 c1449780 d75d3ee8 0137a4d2 d75d3f28 c13051d4 d7538f94 d75d3f20 0137a4c3 00000282 00000000 00200200 0137a4d2 c1449780 c1029680 Call Trace: [] ? schedule_timeout+0xa4/0x110 [] ? __internal_add_timer+0xc0/0xc0 [] schedule+0x1d/0x50 [] xfsaild+0x309/0x370 [] ? xfs_trans_ail_cursor_first+0xa0/0xa0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-data/sda2 S 0000065a 0 64 2 0x00000000 d773df38 00000046 c1040007 0000065a 00000000 00000000 d75b7980 00000000 d773df0c c10400e0 c13de620 d75b79ac d75b7980 c13de620 c130c740 00000000 d773df24 c103d20d 00000000 d75b7980 d75b7980 ffffffec d773df40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-conv/sda2 S 0000024b 0 65 2 0x00000000 d6d95f38 00000046 c1040007 0000024b 00000000 00000000 d75b7cb0 00000000 d6d95f0c c10400e0 c13de620 d75b7cdc d75b7cb0 c13de620 c130c740 00000000 d6d95f24 c103d20d 00000000 d75b7cb0 d75b7cb0 ffffffec d6d95f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-cil/sda2 S 0000025e 0 66 2 0x00000000 d6d99f38 00000046 c1040007 0000025e 00000000 00000000 d6d96000 00000000 d6d99f0c c10400e0 c13de620 d6d9602c d6d96000 c13de620 c130c740 00000000 d6d99f24 c103d20d 00000000 d6d96000 d6d96000 ffffffec d6d99f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfsaild/sda2 S d6de9ec0 0 67 2 0x00000000 d6de9f20 00000046 d6de9eb8 d6de9ec0 d6de9ec0 00000000 d6d96330 c1449780 0136d536 d6de9f00 c1449780 d6de9ee8 0136d536 d6de9f28 c13051d4 d75c4c94 d6de9f20 0136d527 00000282 00000000 00200200 0136d536 c1449780 c1029680 Call Trace: [] ? schedule_timeout+0xa4/0x110 [] ? __internal_add_timer+0xc0/0xc0 [] schedule+0x1d/0x50 [] xfsaild+0x309/0x370 [] ? xfs_trans_ail_cursor_first+0xa0/0xa0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-data/sda8 S 000003b5 0 68 2 0x00000000 d6debf38 00000046 c1040007 000003b5 00000000 00000000 d6d96660 00000000 d6debf0c c10400e0 c13de620 d6d9668c d6d96660 c13de620 c130c740 00000000 d6debf24 c103d20d 00000000 d6d96660 d6d96660 ffffffec d6debf40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-conv/sda8 S 00000242 0 69 2 0x00000000 d760bf38 00000046 c1040007 00000242 00000000 00000000 d6d96990 00000000 d760bf0c c10400e0 c13de620 d6d969bc d6d96990 c13de620 c130c740 00000000 d760bf24 c103d20d 00000000 d6d96990 d6d96990 ffffffec d760bf40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-cil/sda8 S 0000024a 0 70 2 0x00000000 d6c65f38 00000046 c1040007 0000024a 00000000 00000000 d6d96cc0 00000000 d6c65f0c c10400e0 c13de620 d6d96cec d6d96cc0 c13de620 c130c740 00000000 d6c65f24 c103d20d 00000000 d6d96cc0 d6d96cc0 ffffffec d6c65f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfsaild/sda8 S d6c61ec0 0 71 2 0x00000000 d6c61f20 00000046 d6c61eb8 d6c61ec0 d6c61ec0 00000000 d6d96ff0 c1449780 013621d5 d6c61f00 c1449780 d6c61ee8 013621d5 d6c61f28 c13051d4 d76036f4 d6c61f20 013621c6 00000282 00000000 00200200 013621d5 c1449780 c1029680 Call Trace: [] ? schedule_timeout+0xa4/0x110 [] ? __internal_add_timer+0xc0/0xc0 [] schedule+0x1d/0x50 [] xfsaild+0x309/0x370 [] ? xfs_trans_ail_cursor_first+0xa0/0xa0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-data/sda5 S 00000408 0 80 2 0x00000000 d6ed9f38 00000046 c1040007 00000408 00000000 00000000 d76becc0 00000000 d6ed9f0c c10400e0 c13de620 d76becec d76becc0 c13de620 c130c740 00000000 d6ed9f24 c103d20d 00000000 d76becc0 d76becc0 ffffffec d6ed9f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-conv/sda5 S 00000265 0 81 2 0x00000000 d6e1ff38 00000046 c1040007 00000265 00000000 00000000 d76beff0 00000000 d6e1ff0c c10400e0 c13de620 d76bf01c d76beff0 c13de620 c130c740 00000000 d6e1ff24 c103d20d 00000000 d76beff0 d76beff0 ffffffec d6e1ff40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-cil/sda5 S 00000257 0 82 2 0x00000000 d6807f38 00000046 c1040007 00000257 00000000 00000000 d76bf320 00000000 d6807f0c c10400e0 c13de620 d76bf34c d76bf320 c13de620 c130c740 00000000 d6807f24 c103d20d 00000000 d76bf320 d76bf320 ffffffec d6807f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfsaild/sda5 S c13de67c 0 83 2 0x00000000 d6e19f20 00000046 00000400 c13de67c d6e19edc 00000000 d76bf650 c13de654 d6e19ee4 c103f8f0 c13de620 d75b767c d6e19f00 c103ff19 526ac91f d6dca680 526ac91f d6dca680 d75b7650 d6e19f6c c1305dc8 d6e19f1c c103d9cc d75b7650 Call Trace: [] ? __dequeue_entity+0x20/0x40 [] ? pick_next_task_fair+0xd9/0x160 [] ? __schedule+0x188/0x3f0 [] ? check_preempt_curr+0x6c/0x80 [] schedule+0x1d/0x50 [] xfsaild+0x309/0x370 [] ? default_wake_function+0xb/0x10 [] ? xfs_trans_ail_cursor_first+0xa0/0xa0 [] ? xfs_trans_ail_cursor_first+0xa0/0xa0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 kworker/0:6 S cfa77ba0 0 8183 2 0x00000000 cba11f40 00000046 00000004 cfa77ba0 00000000 00000000 d3f7e990 cfa77ba0 c13e7030 c13ddde0 cba11f10 c11f83b0 cfa77ba0 c13e7030 c13ddde0 cba11f48 c1031808 c13ddde0 c7ca92a0 c13ddde0 cba11f48 c10325d1 c13ddf3c 00000000 Call Trace: [] ? console_callback+0x90/0x140 [] ? process_one_work+0x138/0x2e0 [] ? manage_workers+0x211/0x2b0 [] schedule+0x1d/0x50 [] worker_thread+0x168/0x300 [] ? manage_workers+0x2b0/0x2b0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 kworker/0:0 S c2059240 0 29212 2 0x00000000 c14a9f40 00000046 00000004 c2059240 00000000 00000000 ca637320 c2059240 c13e7030 c13ddde0 c14a9f10 c11f83b0 c2059240 c13e7030 c13ddde0 c14a9f48 c1031808 c13ddde0 d6d17720 c13ddde0 c14a9f48 c10325d1 c13ddf3c 00000000 Call Trace: [] ? console_callback+0x90/0x140 [] ? process_one_work+0x138/0x2e0 [] ? manage_workers+0x211/0x2b0 [] schedule+0x1d/0x50 [] worker_thread+0x168/0x300 [] ? manage_workers+0x2b0/0x2b0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 flush-8:0 S d7520854 0 4243 2 0x00000000 d6869f10 00000046 c108884e d7520854 c11993ab 00000000 ca636990 d75207dc 000022f7 00000064 d6869ef4 c1062d18 d6869ee4 000022f7 00000000 00000001 00000001 00000000 00000001 d75207dc d6869f10 c10a623d 000022f7 c1449780 Call Trace: [] ? drop_super+0xe/0x20 [] ? fprop_fraction_percpu+0x2b/0x90 [] ? bdi_dirty_limit+0x28/0xc0 [] ? over_bground_thresh+0x4d/0x70 [] schedule+0x1d/0x50 [] schedule_timeout+0x9d/0x110 [] ? __internal_add_timer+0xc0/0xc0 [] bdi_writeback_thread+0xd0/0xf0 [] ? wb_do_writeback+0x1b0/0x1b0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-data/sda11 S 000003c3 0 5705 2 0x00000000 d2ef5f38 00000046 c1040007 000003c3 00000000 00000000 c1722990 00000000 d2ef5f0c c10400e0 c13de620 c17229bc c1722990 c13de620 c130c740 00000000 d2ef5f24 c103d20d 00000000 c1722990 c1722990 ffffffec d2ef5f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-conv/sda11 S 0000025a 0 5706 2 0x00000000 d2f0df38 00000046 c1040007 0000025a 00000000 00000000 c1723cb0 00000000 d2f0df0c c10400e0 c13de620 c1723cdc c1723cb0 c13de620 c130c740 00000000 d2f0df24 c103d20d 00000000 c1723cb0 c1723cb0 ffffffec d2f0df40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs-cil/sda11 S 00000261 0 5707 2 0x00000000 d6989f38 00000046 c1040007 00000261 00000000 00000000 c1722000 00000000 d6989f0c c10400e0 c13de620 c172202c c1722000 c13de620 c130c740 00000000 d6989f24 c103d20d 00000000 c1722000 c1722000 ffffffec d6989f40 00000293 Call Trace: [] ? update_curr.constprop.48+0x67/0xb0 [] ? enqueue_task_fair+0x90/0x130 [] ? enqueue_task+0x1d/0x50 [] schedule+0x1d/0x50 [] rescuer_thread+0x151/0x1f0 [] ? worker_maybe_bind_and_lock.isra.34+0x80/0x80 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfsaild/sda11 S d6f65ec0 0 5708 2 0x00000000 d6f65f20 00000046 d6f65eb8 d6f65ec0 d6f65ec0 00000000 c1723980 c1449780 01360292 d6f65f00 c1449780 d6f65ee8 01360292 d6f65f28 c13051d4 c7ca95d4 d6f65f20 01360283 00000282 00000000 00200200 01360292 c1449780 c1029680 Call Trace: [] ? schedule_timeout+0xa4/0x110 [] ? __internal_add_timer+0xc0/0xc0 [] schedule+0x1d/0x50 [] xfsaild+0x309/0x370 [] ? xfs_trans_ail_cursor_first+0xa0/0xa0 [] kthread+0x8e/0xa0 [] ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 xfs_io R running 0 5882 1 0x00000004 cc1c9da0 c1003a78 00000031 00000001 00000000 cc1c9dcc c100390a cc1c9ddc 00000000 00000120 00000001 00000100 cc1c9dd4 d7df98e0 ffffffff ce81d9b0 cc1c9ea8 c1307990 d7df98e0 ffffffff 00000102 ffffffff ce81d9b0 cc1c9ea8 Call Trace: [] ? handle_irq+0x18/0x90 [] ? do_IRQ+0x3a/0xa0 [] ? common_interrupt+0x30/0x35 [] ? show_free_areas+0xe0/0x690 [] ? write_cache_pages+0x107/0x380 [] ? global_dirtyable_memory+0x40/0x40 [] ? filemap_fault+0x60/0x370 [] ? anon_vma_interval_tree_insert+0x78/0x80 [] ? unlock_page+0x42/0x50 [] ? __do_fault+0x16f/0x3a0 [] ? generic_writepages+0x2f/0x50 [] ? xfs_vm_writepages+0x11/0x20 [] ? do_writepages+0x15/0x40 [] ? __filemap_fdatawrite_range+0x72/0x80 [] ? filemap_write_and_wait_range.part.33+0x35/0x70 [] ? filemap_write_and_wait_range+0x2e/0x40 [] ? xfs_file_fsync+0x42/0x1a0 [] ? xfs_dir_fsync+0xc0/0xc0 [] ? vfs_fsync+0x2f/0x50 [] ? do_fsync+0x29/0x50 [] ? sys_fsync+0xd/0x10 [] ? sysenter_do_call+0x12/0x26 agetty S 00000000 0 5906 1 0x00000000 d6e23e94 00000082 ffffffff 00000000 d6e23edc 00000004 cc1b0000 00000009 d6e23eb4 d6e23e90 00000020 00000000 00000700 00000700 c00bf6e0 000000ff c00bf6d2 00000000 ca698400 00000007 d7608600 00000020 00000009 ffffff20 Call Trace: [] schedule+0x1d/0x50 [] schedule_timeout+0xcd/0x110 [] ? flush_work+0x9f/0xe0 [] n_tty_read+0x1bc/0x600 [] ? try_to_wake_up+0x90/0x90 [] ? is_ignored+0x40/0x40 [] tty_read+0x64/0xb0 [] ? is_ignored+0x40/0x40 [] ? do_tty_hangup+0x10/0x10 [] vfs_read+0x77/0x130 [] sys_read+0x42/0x90 [] sysenter_do_call+0x12/0x26 agetty S 00000000 0 5907 1 0x00000000 d6e5de94 00000082 ffffffff 00000000 d6e5dedc 00000004 cc1b0990 c108e6f4 d6e5deb4 d6e5de90 00000020 00000000 00000700 00000700 d76e02a0 000000ff 00000000 00000000 c2360800 00000007 d7608e00 00000020 ffffffff ffffff20 Call Trace: [] ? terminate_walk+0x24/0x60 [] schedule+0x1d/0x50 [] schedule_timeout+0xcd/0x110 [] ? flush_work+0x9f/0xe0 [] ? user_path_at_empty+0x4a/0x80 [] n_tty_read+0x1bc/0x600 [] ? try_to_wake_up+0x90/0x90 [] ? is_ignored+0x40/0x40 [] tty_read+0x64/0xb0 [] ? is_ignored+0x40/0x40 [] ? do_tty_hangup+0x10/0x10 [] vfs_read+0x77/0x130 [] sys_read+0x42/0x90 [] sysenter_do_call+0x12/0x26 agetty S 00000000 0 5908 1 0x00000000 ca6abe94 00000082 ffffffff 00000000 ca6abedc 00000004 d75b7650 c108e6f4 ca6abeb4 ca6abe90 00000020 00000000 00000700 00000700 d76e42a0 000000ff 00000000 00000000 d756b400 00000007 d6e53400 00000020 ffffffff ffffff20 Call Trace: [] ? terminate_walk+0x24/0x60 [] schedule+0x1d/0x50 [] schedule_timeout+0xcd/0x110 [] ? flush_work+0x9f/0xe0 [] ? user_path_at_empty+0x4a/0x80 [] n_tty_read+0x1bc/0x600 [] ? try_to_wake_up+0x90/0x90 [] ? is_ignored+0x40/0x40 [] tty_read+0x64/0xb0 [] ? is_ignored+0x40/0x40 [] ? do_tty_hangup+0x10/0x10 [] vfs_read+0x77/0x130 [] sys_read+0x42/0x90 [] sysenter_do_call+0x12/0x26 agetty S 00000000 0 5909 1 0x00000000 cd6e1e94 00000086 ffffffff 00000000 cd6e1edc 00000004 d75b6ff0 c108e6f4 cd6e1eb4 cd6e1e90 00000020 00000000 00000700 00000700 d6dd12a0 000000ff 00000000 00000000 c2361800 00000007 c2355c00 00000020 ffffffff ffffff20 Call Trace: [] ? terminate_walk+0x24/0x60 [] schedule+0x1d/0x50 [] schedule_timeout+0xcd/0x110 [] ? flush_work+0x9f/0xe0 [] ? user_path_at_empty+0x4a/0x80 [] n_tty_read+0x1bc/0x600 [] ? try_to_wake_up+0x90/0x90 [] ? is_ignored+0x40/0x40 [] tty_read+0x64/0xb0 [] ? is_ignored+0x40/0x40 [] ? do_tty_hangup+0x10/0x10 [] vfs_read+0x77/0x130 [] sys_read+0x42/0x90 [] sysenter_do_call+0x12/0x26 agetty S 00000000 0 5910 1 0x00000000 ca59be94 00000086 ffffffff 00000000 ca59bedc 00000004 d75b7320 c108e6f4 ca59beb4 ca59be90 00000020 00000000 00000700 00000700 d6dd02a0 000000ff 00000000 00000000 d6835800 00000007 d6e53a00 00000020 ffffffff ffffff20 Call Trace: [] ? terminate_walk+0x24/0x60 [] schedule+0x1d/0x50 [] schedule_timeout+0xcd/0x110 [] ? flush_work+0x9f/0xe0 [] ? user_path_at_empty+0x4a/0x80 [] n_tty_read+0x1bc/0x600 [] ? try_to_wake_up+0x90/0x90 [] ? is_ignored+0x40/0x40 [] tty_read+0x64/0xb0 [] ? is_ignored+0x40/0x40 [] ? do_tty_hangup+0x10/0x10 [] vfs_read+0x77/0x130 [] sys_read+0x42/0x90 [] sysenter_do_call+0x12/0x26 agetty S 00000000 0 5911 1 0x00000000 c282fe94 00000086 ffffffff 00000000 c282fedc 00000004 cc1b0cc0 c108e6f4 c282feb4 c282fe90 00000020 00000000 00000700 00000700 d6dd72a0 000000ff 00000000 00000000 d6835000 00000007 c2355e00 00000020 ffffffff ffffff20 Call Trace: [] ? terminate_walk+0x24/0x60 [] schedule+0x1d/0x50 [] schedule_timeout+0xcd/0x110 [] ? flush_work+0x9f/0xe0 [] ? user_path_at_empty+0x4a/0x80 [] n_tty_read+0x1bc/0x600 [] ? try_to_wake_up+0x90/0x90 [] ? is_ignored+0x40/0x40 [] tty_read+0x64/0xb0 [] ? is_ignored+0x40/0x40 [] ? do_tty_hangup+0x10/0x10 [] vfs_read+0x77/0x130 [] sys_read+0x42/0x90 [] sysenter_do_call+0x12/0x26 agetty S 00000000 0 5912 1 0x00000000 d6d67e94 00000086 ffffffff 00000000 d6d67edc 00000004 cc1b0ff0 c108e6f4 d6d67eb4 d6d67e90 00000020 00000000 00000700 00000700 d683a2a0 000000ff 00000000 00000000 d6fbcc00 00000007 d6e53200 00000020 ffffffff ffffff20 Call Trace: [] ? terminate_walk+0x24/0x60 [] schedule+0x1d/0x50 [] schedule_timeout+0xcd/0x110 [] ? flush_work+0x9f/0xe0 [] ? user_path_at_empty+0x4a/0x80 [] n_tty_read+0x1bc/0x600 [] ? try_to_wake_up+0x90/0x90 [] ? is_ignored+0x40/0x40 [] tty_read+0x64/0xb0 [] ? is_ignored+0x40/0x40 [] ? do_tty_hangup+0x10/0x10 [] vfs_read+0x77/0x130 [] sys_read+0x42/0x90 [] sysenter_do_call+0x12/0x26 agetty S 00000000 0 5913 1 0x00000000 d6e21e94 00000086 ffffffff 00000000 d6e21edc 00000004 cc1b1320 c108e6f4 d6e21eb4 d6e21e90 00000020 00000000 00000700 00000700 d74162a0 000000ff 00000000 00000000 d6834800 00000007 c2355a00 00000020 ffffffff ffffff20 Call Trace: [] ? terminate_walk+0x24/0x60 [] schedule+0x1d/0x50 [] schedule_timeout+0xcd/0x110 [] ? flush_work+0x9f/0xe0 [] ? user_path_at_empty+0x4a/0x80 [] n_tty_read+0x1bc/0x600 [] ? try_to_wake_up+0x90/0x90 [] ? is_ignored+0x40/0x40 [] tty_read+0x64/0xb0 [] ? is_ignored+0x40/0x40 [] ? do_tty_hangup+0x10/0x10 [] vfs_read+0x77/0x130 [] sys_read+0x42/0x90 [] sysenter_do_call+0x12/0x26 bash S c1087ab5 0 5914 1 0x00000000 d682be94 00000086 d682be3c c1087ab5 00000246 00000004 cc1b1980 00000001 d682a000 00000046 00000000 d682be90 c10253e7 00000016 0001c200 00000000 d682becc 00000004 00000000 d682be7c c119ca6a d682be84 00000096 00000034 Call Trace: [] ? file_free_rcu+0x25/0x30 [] ? __do_softirq+0xd7/0x140 [] ? radix_tree_lookup+0xa/0x10 [] schedule+0x1d/0x50 [] schedule_timeout+0xcd/0x110 [] ? flush_work+0x9f/0xe0 [] ? __uart_start+0x43/0x50 [] n_tty_read+0x1bc/0x600 [] ? irq_exit+0x2d/0x70 [] ? try_to_wake_up+0x90/0x90 [] ? is_ignored+0x40/0x40 [] tty_read+0x64/0xb0 [] ? is_ignored+0x40/0x40 [] ? do_tty_hangup+0x10/0x10 [] vfs_read+0x77/0x130 [] sys_read+0x42/0x90 [] sysenter_do_call+0x12/0x26 === FORCED CRASH SECTION SysRq : Emergency Sync SysRq : Emergency Remount R/O SysRq : Trigger a crash BUG: unable to handle kernel NULL pointer dereference at (null) IP: [] sysrq_handle_crash+0x12/0x20 *pde = 00000000 Oops: 0002 [#1] Pid: 4243, comm: flush-8:0 Not tainted 3.9.0-rc4+ #7 EIP: 0060:[] EFLAGS: 00010092 CPU: 0 EIP is at sysrq_handle_crash+0x12/0x20 EAX: 00000001 EBX: 00000001 ECX: 00000a31 EDX: c13e61d0 ESI: 00000092 EDI: 00000063 EBP: d7407e4c ESP: d7407e4c DS: 007b ES: 007b FS: 0000 GS: 00e0 SS: 0068 CR0: 8005003b CR2: 00000000 CR3: 0b9c6000 CR4: 00000790 DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 DR6: ffff0ff0 DR7: 00000400 Process flush-8:0 (pid: 4243, ti=d7406000 task=ca636990 task.ti=d6868000) Stack: d7407e70 c11edf63 c1391693 c13acacd c13e61d0 00000008 d753a400 0000002e c11edfb0 d7407e90 c11ee2c6 d3cd49f5 00000000 013de620 d7538548 d7538540 c11edfb0 d7407eb8 c125cdac 00000001 d7538540 d753a400 d7538558 c13e6000 Call Trace: [] __handle_sysrq+0xe3/0x130 [] ? __handle_sysrq+0x130/0x130 [] sysrq_filter+0x316/0x320 [] ? __handle_sysrq+0x130/0x130 [] input_to_handler+0x4c/0xe0 [] input_pass_values.part.13+0x132/0x150 [] input_handle_event+0x10f/0x550 [] input_event+0x34/0x40 [] atkbd_interrupt+0x5cd/0x6a0 [] ? ktime_get+0x54/0xf0 [] ? pit_next_event+0x22/0x30 [] serio_interrupt+0x21/0x50 [] i8042_interrupt+0x108/0x350 [] handle_irq_event_percpu+0x28/0x120 [] ? handle_simple_irq+0x60/0x60 [] handle_irq_event+0x1c/0x30 [] handle_level_irq+0x4f/0x90 [] ? do_IRQ+0x3a/0xa0 [] ? common_interrupt+0x30/0x35 [] ? show_free_areas+0x15b/0x690 [] ? xfs_vm_writepage+0x65/0x680 [] ? find_get_pages_tag+0x96/0x100 [] ? global_dirtyable_memory+0x40/0x40 [] ? __writepage+0xb/0x30 [] ? write_cache_pages+0x196/0x380 [] ? global_dirtyable_memory+0x40/0x40 [] ? __blk_run_queue+0x28/0x40 [] ? sched_clock_local.constprop.3+0x3e/0x150 [] ? generic_writepages+0x2f/0x50 [] ? xfs_vm_writepages+0x11/0x20 [] ? do_writepages+0x15/0x40 [] ? __writeback_single_inode+0x2c/0xe0 [] ? writeback_sb_inodes+0x177/0x2a0 [] ? wb_writeback+0xa4/0x1a0 [] ? wb_do_writeback+0x68/0x1b0 [] ? __internal_add_timer+0xc0/0xc0 [] ? bdi_writeback_thread+0x51/0xf0 [] ? wb_do_writeback+0x1b0/0x1b0 [] ? kthread+0x8e/0xa0 [] ? ret_from_kernel_thread+0x1b/0x28 [] ? __kthread_parkme+0x60/0x60 Code: ff ba 2a 00 00 00 b8 18 c5 38 c1 e8 79 17 e3 ff e9 a9 fe ff ff 66 90 66 90 55 b8 01 00 00 00 89 e5 a3 8c 84 43 c1 0f ae f8 89 f6 05 00 00 00 00 01 5d c3 90 8d 74 26 00 55 89 e5 56 53 9c 5b EIP: [] sysrq_handle_crash+0x12/0x20 SS:ESP 0068:d7407e4c CR2: 0000000000000000 ---[ end trace 84b20633264cbfa8 ]--- Kernel panic - not syncing: Fatal exception in interrupt From yongtaofu@gmail.com Wed Apr 10 08:52:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D743E7CBF for ; Wed, 10 Apr 2013 08:52:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 48BCDAC002 for ; Wed, 10 Apr 2013 06:52:24 -0700 (PDT) X-ASG-Debug-ID: 1365601939-04cb6c1e77510e80001-NocioJ Received: from mail-ie0-f169.google.com (mail-ie0-f169.google.com [209.85.223.169]) by cuda.sgi.com with ESMTP id ABcF0Jo6t5ZjfBR0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 10 Apr 2013 06:52:19 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] Received: by mail-ie0-f169.google.com with SMTP id ar20so103913iec.14 for ; Wed, 10 Apr 2013 06:52:19 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=x8mnk9KnW4Kp/vhcA+yqkkObi5fS9XysLJwvqQGQ/2I=; b=fePmgZiXXOEb7V6BTcznFUAQTxG91HdyJjHBlK6Q51B2wQ4Ag2EbdNb+ewzzD/7jqA puyg3y66QwhNO2fFaPa4F6tewxM/CsJYjT98fAoTGAY+dHM04wLJLjiAGk9Rq1A3b/5n 3Qs/+t7SwYfL++W/B/uWEFe3gB/UDTBjuehlhRORfRCjbDnfiuJcZEba+IDIu9jH0Xnm aQH7uHjV05ncLFMTKwESDDFAvuBw9es5EvCdrSuhc/eDlbInbm6Qqq+xAEY0RwU4jnU+ 9MNXMGw0JtFVZ7IJbLukz1u1FOzCcODl0Z0AOPpw8HMi5TnEX54epJfFaehlXz/6p2ee JEzg== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr13266489igq.51.1365601939616; Wed, 10 Apr 2013 06:52:19 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Wed, 10 Apr 2013 06:52:19 -0700 (PDT) In-Reply-To: <20130410121025.78a42b22@harpe.intellique.com> References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> Date: Wed, 10 Apr 2013 21:52:19 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Emmanuel Florac Cc: Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee78447c804da01fa81 X-Barracuda-Connect: mail-ie0-f169.google.com[209.85.223.169] X-Barracuda-Start-Time: 1365601939 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127732 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 --14dae9340ee78447c804da01fa81 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable The storage info is as following: RAID-6 SATA HDD Controller: PERC H710P Mini (Embedded) Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes 255 heads, 63 sectors/track, 3647334 cylinders Units =3D cylinders of 16065 * 512 =3D 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (30.0 TB/27.2 TiB) sd 0:2:1:0: [sdb] Write Protect is off sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08 sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA sd 0:2:1:0: [sdb] Attached SCSI disk *-storage description: RAID bus controller product: MegaRAID SAS 2208 [Thunderbolt] vendor: LSI Logic / Symbios Logic physical id: 0 bus info: pci@0000:02:00.0 logical name: scsi0 version: 01 width: 64 bits clock: 33MHz capabilities: storage pm pciexpress vpd msi msix bus_master cap_list rom configuration: driver=3Dmegaraid_sas latency=3D0 resources: irq:42 ioport:fc00(size=3D256) memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff memory:dc800000-dc81ffff(prefetchable) *-disk:0 description: SCSI Disk product: PERC H710P vendor: DELL physical id: 2.0.0 bus info: scsi@0:2.0.0 logical name: /dev/sda version: 3.13 serial: 0049d6ce1d9f2035180096fde490f648 size: 558GiB (599GB) capabilities: partitioned partitioned:dos configuration: ansiversion=3D5 signature=3D000aa336 *-disk:1 description: SCSI Disk product: PERC H710P vendor: DELL physical id: 2.1.0 bus info: scsi@0:2.1.0 logical name: /dev/sdb logical name: /mnt/xfsd version: 3.13 serial: 003366f71da22035180096fde490f648 size: 27TiB (30TB) configuration: ansiversion=3D5 mount.fstype=3Dxfs mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,swidt= h=3D1280,noquota state=3Dmounted Thank you. 2013/4/10 Emmanuel Florac > Le Tue, 9 Apr 2013 23:10:03 +0800 > =B7=FB=D3=C0=CC=CE =A8=A6crivait: > > > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected. > > > Shutting down filesystem > > This. I/O error detected. That means that at some point the underlying > device (disk, RAID array, SAN volume) couldn't be reached. So this > could very well be a case of a flakey drive, array, cable or SCSI > driver. > > What's the storage setup here? > > -- > ------------------------------------------------------------------------ > Emmanuel Florac | Direction technique > | Intellique > | > | +33 1 78 94 84 02 > ------------------------------------------------------------------------ > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee78447c804da01fa81 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
The storage info is as following:
RAID-6
SATA HD= D
Controller: PERC H710P Mini (Embedded)
Disk /dev/sdb: 30000.3 GB,= 30000346562560 bytes
255 heads, 63 sectors/track, 3647334 cylind= ers
Units =3D cylinders of 16065 * 512 =3D 8225280 bytes
Sector = size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/= optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

sd 0:2:1:0: [sdb] 58594426880 512-byte logical blo= cks: (30.0 TB/27.2 TiB)
sd 0:2:1:0: [sdb] Write Protect is off
sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08
sd 0:2:1:0: [sd= b] Write cache: enabled, read cache: enabled, doesn't support DPO or FU= A
sd 0:2:1:0: [sdb] Attached SCSI disk

*-storage               
       description: RAID bus controller
&n= bsp;      product: MegaRAID SAS 2208 [Thunderbolt]
       vendor: LSI Logic / Symbios Logic
&nbs= p;      physical id: 0
       = bus info: pci@0000:02:00.0
       logical nam= e: scsi0
       version: 01
  =      width: 64 bits
       clock: 33MHz
      &nbs= p;capabilities: storage pm pciexpress vpd msi msix bus_master cap_list rom<= /div>
       configuration: driver=3Dmegaraid_sas l= atency=3D0
       resources: irq:42 ioport:fc= 00(size=3D256) memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff memory:dc8= 00000-dc81ffff(prefetchable)
     *-disk:0
        &nb= sp; description: SCSI Disk
          pro= duct: PERC H710P
          vendor: DELL<= /div>
          physical id: 2.0.0
&= nbsp;         bus info: scsi@0:2.0.0
          logical name: /dev/sda
&n= bsp;         version: 3.13
    &nbs= p;     serial: 0049d6ce1d9f2035180096fde490f648
  =         size: 558GiB (599GB)
    &n= bsp;     capabilities: partitioned partitioned:dos
          configuration: ansiversion=3D5 sign= ature=3D000aa336
     *-disk:1
  &n= bsp;       description: SCSI Disk
    &n= bsp;     product: PERC H710P
       = ;   vendor: DELL
          physical= id: 2.1.0
          bus info: scsi@0:2.1.0
&n= bsp;         logical name: /dev/sdb
  &n= bsp;       logical name: /mnt/xfsd
    &= nbsp;     version: 3.13
        &nb= sp; serial: 003366f71da22035180096fde490f648
          size: 27TiB (30TB)
 =         configuration: ansiversion=3D5 mount.fstype=3D= xfs mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,s= width=3D1280,noquota state=3Dmounted

Thank you.


2013/4/10 Emmanuel Florac <ef= lorac@intellique.com>
Le Tue, 9 Apr 2013 23:10:03 +0800
=B7=FB=D3=C0=CC=CE <yongtaofu@gma= il.com> =A8=A6crivait:

> > Apr  9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected.<= br> > > Shutting down filesystem

This. I/O error detected. That means that at some point the underlyin= g
device (disk, RAID array, SAN volume) couldn't be reached. So this
could very well be a case of a flakey drive, array, cable or SCSI
driver.

What's the storage setup here?

--
------------------------------------------------------------------------ Emmanuel Florac     |   Direction technique
                    | &nb= sp; Intellique
                    | &nb= sp; <eflorac@intellique.com>
                    | &nb= sp; +33 1 78 94 84 02
------------------------------------------------------------------------



-- =B7=FB=D3=C0=CC=CE
--14dae9340ee78447c804da01fa81-- From mlsemon35@gmail.com Wed Apr 10 09:06:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9C0BE7F69 for ; Wed, 10 Apr 2013 09:06:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 209BEAC001 for ; Wed, 10 Apr 2013 07:06:16 -0700 (PDT) X-ASG-Debug-ID: 1365602774-04cb6c32cb10ec0001-NocioJ Received: from mail-yh0-f45.google.com (mail-yh0-f45.google.com [209.85.213.45]) by cuda.sgi.com with ESMTP id 8LYqvjqVIULrrTvR (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 10 Apr 2013 07:06:15 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.45 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.45] Received: by mail-yh0-f45.google.com with SMTP id 26so49608yhr.32 for ; Wed, 10 Apr 2013 07:06:14 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.45] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.45] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=W+eb6UcXPlo+IsJACbSK65VvddJkFBCqYPEXKY8ioM8=; b=Z9SEbUgwUVTO3D2OjHpGFS0S5Y3WdL/RIBpDbpJopDca+yZ9xqh0TpoCxqsFWLxpFz kBIzrvQ91mct2lNIYweX1be7fEz6BN8/EvGCsH0jdY1Anjckmuc5DNwp7z4Yuos6vSzn 1NBYj1SHaOEUSlH8/UgreM2LFGcR77INhlGOHsirFQwODF1NpdQ8IiVKoE7h3d6ADbQ6 ERa6vEgIlhKt7xa3IMF6HrlEWk/e35VFuP9L5mXuApJ4MQ2WBlNhAPytwwyTghK8pK6o NtYAst2z74ou6F15Rqq8KOSjAVskzOqWsmKhsExLYsV4z/lOWKMKSCgv2RUQ3C3mjufM OgDg== X-Received: by 10.236.86.105 with SMTP id v69mr1215692yhe.17.1365602774740; Wed, 10 Apr 2013 07:06:14 -0700 (PDT) Received: from [192.168.0.139] (rrcs-97-78-60-146.se.biz.rr.com. [97.78.60.146]) by mx.google.com with ESMTPS id t27sm67604yhm.20.2013.04.10.07.06.13 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 10 Apr 2013 07:06:14 -0700 (PDT) Message-ID: <516571CA.1020908@gmail.com> Date: Wed, 10 Apr 2013 10:06:02 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: New xfstests generic/308 causes XFS hang (high CPU use), at least on 32-bit References: <51656D47.9010806@gmail.com> X-ASG-Orig-Subj: Re: New xfstests generic/308 causes XFS hang (high CPU use), at least on 32-bit In-Reply-To: <51656D47.9010806@gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-yh0-f45.google.com[209.85.213.45] X-Barracuda-Start-Time: 1365602775 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127732 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 04/10/2013 09:46 AM, Michael L. Semon wrote: > The PC uses kernel 3.8-rc4 + Dave's CRC v4 patches + J. Liu's bitness > patch. Oops, that was supposed to be "kernel 3.9-rc4." Sorry. Michael From ZielinskiK@trocaire.edu Wed Apr 10 09:12:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B8D007F6C for ; Wed, 10 Apr 2013 09:12:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 555B6AC004 for ; Wed, 10 Apr 2013 07:12:09 -0700 (PDT) X-ASG-Debug-ID: 1365603122-04cb6c1e78513ad0001-w1Z2WR Received: from out15.sjc.mx.trendmicro.com (out15.sjc.mx.trendmicro.com [216.99.131.72]) by cuda.sgi.com with ESMTP id Sg1IWhX1jk1PBg0Z (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 10 Apr 2013 07:12:03 -0700 (PDT) X-Barracuda-Envelope-From: ZielinskiK@Trocaire.edu X-Barracuda-Apparent-Source-IP: 216.99.131.72 Received: from relay10.sjc.mx.trendmicro.com (unknown [10.30.239.136]) by out15.sjc.mx.trendmicro.com (Postfix) with ESMTP id 24B01980461; Wed, 10 Apr 2013 14:12:02 +0000 (UTC) Received: from Trocaire-EX01.Trocaire.local (unknown [208.83.121.203]) by relay10.sjc.mx.trendmicro.com (Postfix) with ESMTP id 2722898041E; Wed, 10 Apr 2013 14:10:37 +0000 (UTC) Received: from TROCAIRE-EX01.Trocaire.local ([10.1.100.17]) by trocaire-ex01 ([10.1.100.17]) with mapi id 14.02.0328.009; Wed, 10 Apr 2013 10:03:18 -0400 From: "Kerry A. Zielinski" Subject: Help Desk Thread-Topic: Help Desk X-ASG-Orig-Subj: Help Desk Thread-Index: Ac419CZybFggg7/UQBGM+JWlO/QSyQ== Date: Wed, 10 Apr 2013 14:03:17 +0000 Message-ID: <0FF47705B8B61E428F036AD82082CB66C05A87@trocaire-ex01> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [101.63.74.191] Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 To: undisclosed-recipients:; X-TM-Deliver-Signature: 0d0e01cafc08640a106d62f9d4a44f70 X-Barracuda-Connect: out15.sjc.mx.trendmicro.com[216.99.131.72] X-Barracuda-Start-Time: 1365603123 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.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.2.127732 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... Uw mailbox heeft overschreden Het Quota / Limit Zoals ingesteld door de beh= eerder, en u zult niet kunnen ontvangen of verzenden Mails Until You Re-Val= ideren. Om opnieuw valideren CLICK HERE From rjohnston@sgi.com Wed Apr 10 09:17:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B03867F8B for ; Wed, 10 Apr 2013 09:17:49 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 91FDA8F8054; Wed, 10 Apr 2013 07:17:49 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Wed, 10 Apr 2013 09:17:49 -0500 Message-ID: <516574AD.7060706@sgi.com> Date: Wed, 10 Apr 2013 09:18:21 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: "Michael L. Semon" CC: Subject: Re: New xfstests generic/308 causes XFS hang (high CPU use), at least on 32-bit References: <51656D47.9010806@gmail.com> <516571CA.1020908@gmail.com> In-Reply-To: <516571CA.1020908@gmail.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/10/2013 09:06 AM, Michael L. Semon wrote: > On 04/10/2013 09:46 AM, Michael L. Semon wrote: > >> The PC uses kernel 3.8-rc4 + Dave's CRC v4 patches + J. Liu's bitness >> patch. > > Oops, that was supposed to be "kernel 3.9-rc4." Sorry. > > Michael > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs Runs fine on all my 64 bit machines. I quickly ran a test using 3.9.0-rc1+ on a 32 bit machine. I am seeing the same xfs_io 100% CPU usage. Looks 32 bit specific. --Rich From mlsemon35@gmail.com Wed Apr 10 09:31:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 29AC429E0E for ; Wed, 10 Apr 2013 09:31:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 87C0BAC003 for ; Wed, 10 Apr 2013 07:31:19 -0700 (PDT) X-ASG-Debug-ID: 1365604277-04cbb01fb74e3000001-NocioJ Received: from mail-vc0-f178.google.com (mail-vc0-f178.google.com [209.85.220.178]) by cuda.sgi.com with ESMTP id nriY6qUnbCAohBq2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 10 Apr 2013 07:31:17 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.178] Received: by mail-vc0-f178.google.com with SMTP id hv10so418689vcb.23 for ; Wed, 10 Apr 2013 07:31:17 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=sJgu0HA0OUxQY0QD0yBQcMNM1cmWBpWfzSjxuf9UzrY=; b=Z+VbV7TLqcAKO6zj1vsqyvsq6whdbmPE5PtdzWeEeKBlG6knjK8taBcyGIv+zivhZ9 09BWZD4gbqDGFWDyArn85iWK9tKC+ga1BjgfGl/LWbhNJlSQlPkxw5oYzPzKQPWb5/k9 p+C35oY8c+wrw2hwiWEUoxfpJdF5hJgjavPMDw2rpekthlDzp46pkDYUGzslRaaXJdqv O1c7+70syM6lIi3YyNF08WiRWkO5xy1QxnFYsNI2tbwE8UWP73gB+Jv1zTWTv486+VXU jYPQF9la8jZ3VfjtLYO8q+Y+TZqeYxBCJXMbNeNfhfNw38eDdygHtpddgSuSDaEVb05q LOxg== MIME-Version: 1.0 X-Received: by 10.220.110.205 with SMTP id o13mr1714267vcp.22.1365604277478; Wed, 10 Apr 2013 07:31:17 -0700 (PDT) Received: by 10.52.237.199 with HTTP; Wed, 10 Apr 2013 07:31:17 -0700 (PDT) In-Reply-To: <516574AD.7060706@sgi.com> References: <51656D47.9010806@gmail.com> <516571CA.1020908@gmail.com> <516574AD.7060706@sgi.com> Date: Wed, 10 Apr 2013 10:31:17 -0400 Message-ID: Subject: Re: New xfstests generic/308 causes XFS hang (high CPU use), at least on 32-bit From: "Michael L. Semon" X-ASG-Orig-Subj: Re: New xfstests generic/308 causes XFS hang (high CPU use), at least on 32-bit To: Rich Johnston Cc: "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=047d7b3a8cd0dcf3a704da02850b X-Barracuda-Connect: mail-vc0-f178.google.com[209.85.220.178] X-Barracuda-Start-Time: 1365604277 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --047d7b3a8cd0dcf3a704da02850b Content-Type: text/plain; charset=ISO-8859-1 On casual glance, it looks like a test meant to test the end of 32-bit offsets, built to test a specific ext4 case, and it happened to strafe XFS on 32-bit in the process. It is unknown to me whether a script with 64-bit version of the numbers would have a bad effect. Michael On Wed, Apr 10, 2013 at 10:18 AM, Rich Johnston wrote: > On 04/10/2013 09:06 AM, Michael L. Semon wrote: > >> On 04/10/2013 09:46 AM, Michael L. Semon wrote: >> >> The PC uses kernel 3.8-rc4 + Dave's CRC v4 patches + J. Liu's bitness >>> patch. >>> >> >> Oops, that was supposed to be "kernel 3.9-rc4." Sorry. >> >> Michael >> >> ______________________________**_________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/**listinfo/xfs >> > > Runs fine on all my 64 bit machines. I quickly ran a test using > 3.9.0-rc1+ on a 32 bit machine. I am seeing the same xfs_io 100% CPU usage. > > Looks 32 bit specific. > > --Rich > > --047d7b3a8cd0dcf3a704da02850b Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
On casual glance, it looks like a test meant to test = the end of 32-bit offsets, built to test a specific ext4 case, and it happe= ned to strafe XFS on 32-bit in the process.=A0 It is unknown to me whether = a script with 64-bit version of the numbers would have a bad effect.

Michael


On Wed, Apr 10, 2013 at 10:18 AM, Rich Johnston <
= rjohnston@sgi.com> wrote:
On 04/10/2013 09:06 AM, Michael L. Semon wro= te:
On 04/10/2013 09:46 AM, Michael L. Semon wrote:

The PC uses kernel 3.8-rc4 + Dave's CRC v4 patches + J. Liu's bitne= ss
patch.

Oops, that was supposed to be "kernel 3.9-rc4." =A0Sorry.

Michael

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

Runs fine on all my 64 bit machines. =A0I quickly ran a test using 3.9.0-rc= 1+ on a 32 bit machine. =A0I am seeing the same xfs_io 100% CPU usage.

Looks 32 bit specific.

--Rich


--047d7b3a8cd0dcf3a704da02850b-- From bpm@sgi.com Wed Apr 10 12:46:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 989DD7FB3 for ; Wed, 10 Apr 2013 12:46:43 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id E9796AC001; Wed, 10 Apr 2013 10:46:39 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 4BBD0500B4B; Wed, 10 Apr 2013 12:46:39 -0500 (CDT) Date: Wed, 10 Apr 2013 12:46:39 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 13/22] xfs: add CRC checking to dir2 leaf blocks Message-ID: <20130410174639.GG22182@sgi.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-14-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-14-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, Comments below. Basically just some nits about asserts, comments, variable names, and looks like an off-by-one in xfs_dir3_leaf_log_header. I would like to know your plan for xfs_da_root_split and xfs_dir3_leaf_check_int. Nice find in xfs_dir2_block_to_leaf! That should be a separate patch. Regards, Ben On Wed, Apr 03, 2013 at 04:11:23PM +1100, Dave Chinner wrote: > From: Dave Chinner > > This addition follows the same pattern as the dir2 block CRCs. > Seeing as both LEAF1 and LEAFN types need to changed at the same > time, this is a pretty large amount of change. leaf block headers > neeed to be abstracted away from the on-disk structures (struct need > xfs_dir3_icleaf_hdr), as do the base leaf entry locations. > > This header abstract allows the in-core header and leaf entry > location to be passed around instead of the leaf block itself. This > saves a lot of converting individual variables from on-disk format > to host format where they are used, so there's a good chance that > the compiler will be able to produce much more optimal code as it's > not having to byteswap variables all over the place. > > Signed-off-by: Dave Chinner > --- ... > @@ -396,11 +397,18 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, > size = (int)((char *)&oldroot->btree[be16_to_cpu(oldroot->hdr.count)] - > (char *)oldroot); > } else { > - ASSERT(oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > + struct xfs_dir3_icleaf_hdr leafhdr; > + struct xfs_dir2_leaf_entry *ents; > + > leaf = (xfs_dir2_leaf_t *)oldroot; > - size = (int)((char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] - > - (char *)leaf); > + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); > + ents = xfs_dir3_leaf_ents_p(leaf); > + > + ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || > + leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); > + size = (int)((char *)&ents[leafhdr.count] - (char *)leaf); > } > + /* XXX: can't just copy CRC headers from one block to another */ What is your plan for resolving that? > @@ -2281,10 +2299,17 @@ xfs_da_read_buf( > XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && > (magic != XFS_ATTR_LEAF_MAGIC) && > (magic != XFS_DIR2_LEAF1_MAGIC) && > + (magic != XFS_DIR3_LEAF1_MAGIC) && > (magic != XFS_DIR2_LEAFN_MAGIC) && > + (magic != XFS_DIR3_LEAFN_MAGIC) && > (magic1 != XFS_DIR2_BLOCK_MAGIC) && > + (magic1 != XFS_DIR3_BLOCK_MAGIC) && Did this DIR3_BLOCK_MAGIC change sneak in from another patch? > (magic1 != XFS_DIR2_DATA_MAGIC) && > - (free->hdr.magic != cpu_to_be32(XFS_DIR2_FREE_MAGIC)), > + (magic1 != XFS_DIR3_DATA_MAGIC) && > + (free->hdr.magic != > + cpu_to_be32(XFS_DIR2_FREE_MAGIC)) && > + (free->hdr.magic != > + cpu_to_be32(XFS_DIR3_FREE_MAGIC)), Do DIRx_DATA_MAGIC and DIRx_FREE_MAGIC belong in a different patch? > /* > * Get address of the bestcount field in the single-leaf block. > */ > +static inline struct xfs_dir2_leaf_entry * > +xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) > +{ > + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || > + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { > + struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp; > + return lp3->__ents; > + } > + return lp->__ents; > +} > + > +/* > + * Get address of the bestcount field in the single-leaf block. > + */ I appreciate the addition of the comment. > +bool > +xfs_dir3_leaf_check_int( > + struct xfs_mount *mp, > + struct xfs_dir3_icleaf_hdr *hdr, > + struct xfs_dir2_leaf *leaf) > +{ > + struct xfs_dir2_leaf_entry *ents; > + xfs_dir2_leaf_tail_t *ltp; > + int stale; > + int i; > + > + ents = xfs_dir3_leaf_ents_p(leaf); > + ltp = xfs_dir2_leaf_tail_p(mp, leaf); > + > + /* > + * This value is not restrictive enough. > + * Should factor in the size of the bests table as well. > + * We can deduce a value for that from di_size. > + */ ^^^^^ That should probably be marked with a TODO. > +static bool > +xfs_dir3_leaf_verify( > struct xfs_buf *bp, > - __be16 magic) > + __uint16_t magic) > +{ > + struct xfs_mount *mp = bp->b_target->bt_mount; > + struct xfs_dir2_leaf *leaf = bp->b_addr; > + struct xfs_dir3_icleaf_hdr leafhdr; > + > + ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); Using v2 magics to choose between leaf1 and leafn is ok, but not as clear as using a non-version-specific #define or enum might be for this purpose. > @@ -169,27 +432,34 @@ xfs_dir2_block_to_leaf( > /* > * Initialize the leaf block, get a buffer for it. > */ > - if ((error = xfs_dir2_leaf_init(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC))) { > + error = xfs_dir3_leaf_get_buf(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC); > + if (error) > return error; > - } > - ASSERT(lbp != NULL); > + > leaf = lbp->b_addr; > hdr = dbp->b_addr; > xfs_dir3_data_check(dp, dbp); > btp = xfs_dir2_block_tail_p(mp, hdr); > blp = xfs_dir2_block_leaf_p(btp); > bf = xfs_dir3_data_bestfree_p(hdr); > + ents = xfs_dir3_leaf_ents_p(leaf); > + > /* > * Set the counts in the leaf header. > + * > + * XXX: are these actually logged, or just gathered by chance? Nice find. I'm not seeing where that header is being logged. Worth a separate patch. > void > -xfs_dir2_leaf_log_header( > +xfs_dir3_leaf_log_header( > struct xfs_trans *tp, > struct xfs_buf *bp) > { > - xfs_dir2_leaf_t *leaf; /* leaf structure */ > + struct xfs_dir2_leaf *leaf = bp->b_addr; > > - leaf = bp->b_addr; > ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || > - leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || > + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || > + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); > + > xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), > - (uint)(sizeof(leaf->hdr) - 1)); > + xfs_dir3_leaf_hdr_size(leaf)); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Should be xfs_dir3_leaf_hdr_size(leaf) - 1, I think. > @@ -1958,36 +2171,40 @@ xfs_dir2_node_to_leaf( > * Now see if the leafn and free data will fit in a leaf1. > * If not, release the buffer and give up. > */ > - if (xfs_dir2_leaf_size(&leaf->hdr, freehdr.nvalid) > mp->m_dirblksize) { > + if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > mp->m_dirblksize) { > xfs_trans_brelse(tp, fbp); > return 0; > } > > /* > * If the leaf has any stale entries in it, compress them out. > - * The compact routine will log the header. > */ > - if (be16_to_cpu(leaf->hdr.stale)) > - xfs_dir2_leaf_compact(args, lbp); > - else > - xfs_dir2_leaf_log_header(tp, lbp); > + if (leafhdr.stale) > + xfs_dir3_leaf_compact(args, &leafhdr, lbp); > > - lbp->b_ops = &xfs_dir2_leaf1_buf_ops; > - leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAF1_MAGIC); > + lbp->b_ops = &xfs_dir3_leaf1_buf_ops; > + leafhdr.magic = (leafhdr.magic == XFS_DIR2_LEAFN_MAGIC) > + ? XFS_DIR2_LEAF1_MAGIC > + : XFS_DIR3_LEAF1_MAGIC; An assert might be nice here: if (leafhdr.magic == XFS_DIR2_LEAFN_MAGIC) leafhdr.magic = XFS_DIR2_LEAF1_MAGIC; else { ASSERT(leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); leafhdr.magic = XFS_DIR3_LEAF1_MAGIC; } > static bool > xfs_dir3_free_verify( > struct xfs_buf *bp) > @@ -360,11 +385,19 @@ xfs_dir2_leaf_to_node( > xfs_dir2_free_log_bests(tp, fbp, 0, freehdr.nvalid - 1); > xfs_dir2_free_log_header(tp, fbp); > > - /* convert the leaf to a leafnode */ > - leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); > - lbp->b_ops = &xfs_dir2_leafn_buf_ops; > - xfs_dir2_leaf_log_header(tp, lbp); > - xfs_dir2_leafn_check(dp, lbp); > + /* > + * Converting the leaf to a leafnode is just a matter of changing the > + * magic number and the ops. Do the change directly to the buffer as > + * it's less work (and less code) than decoding the header to host > + * format and back again. > + */ > + if (leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)) > + leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); > + else > + leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); Here too might be a good spot for an assert in the else. > static void > xfs_dir2_free_hdr_check( > struct xfs_mount *mp, > @@ -510,15 +520,18 @@ xfs_dir2_leafn_lasthash( > struct xfs_buf *bp, /* leaf buffer */ > int *count) /* count of entries in leaf */ > { > - xfs_dir2_leaf_t *leaf; /* leaf structure */ > + struct xfs_dir2_leaf *leaf = bp->b_addr; > + struct xfs_dir2_leaf_entry *ents; > + struct xfs_dir3_icleaf_hdr leafhdr; > + > + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); > + ents = xfs_dir3_leaf_ents_p(leaf); > > - leaf = bp->b_addr; > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); Looks like this assert has gone missing. It was intentionally more specific than the one in xfs_dir3_leaf_hdr_from_disk, right? > @@ -547,16 +560,19 @@ xfs_dir2_leafn_lookup_for_addname( > xfs_dir2_db_t newdb; /* new data block number */ > xfs_dir2_db_t newfdb; /* new free block number */ > xfs_trans_t *tp; /* transaction pointer */ > + struct xfs_dir2_leaf_entry *ents; > + struct xfs_dir3_icleaf_hdr leafhdr; > > dp = args->dp; > tp = args->trans; > mp = dp->i_mount; > leaf = bp->b_addr; > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); Here the assert is also missing, but it looks like it is handled below in xfs_dir3_leaf_check. Maybe the above is similar. > -#ifdef __KERNEL__ > - ASSERT(be16_to_cpu(leaf->hdr.count) > 0); > -#endif > - xfs_dir2_leafn_check(dp, bp); > + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); > + ents = xfs_dir3_leaf_ents_p(leaf); > + > + xfs_dir3_leaf_check(mp, bp); ... > @@ -694,16 +710,19 @@ xfs_dir2_leafn_lookup_for_entry( > xfs_dir2_db_t newdb; /* new data block number */ > xfs_trans_t *tp; /* transaction pointer */ > enum xfs_dacmp cmp; /* comparison result */ > + struct xfs_dir2_leaf_entry *ents; > + struct xfs_dir3_icleaf_hdr leafhdr; > > dp = args->dp; > tp = args->trans; > mp = dp->i_mount; > leaf = bp->b_addr; > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); Again. But you've also got xfs_dir3_leaf_check below, so maybe the first one is the only issue. > -#ifdef __KERNEL__ > - ASSERT(be16_to_cpu(leaf->hdr.count) > 0); > -#endif > - xfs_dir2_leafn_check(dp, bp); > + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); > + ents = xfs_dir3_leaf_ents_p(leaf); > + > + xfs_dir3_leaf_check(mp, bp); ... > +xfs_dir3_leafn_moveents( > + xfs_da_args_t *args, /* operation arguments */ > + struct xfs_buf *bp_s, /* source */ > + struct xfs_dir3_icleaf_hdr *shdr, > + struct xfs_dir2_leaf_entry *sents, > + int start_s,/* source leaf index */ > + struct xfs_buf *bp_d, /* destination */ > + struct xfs_dir3_icleaf_hdr *dhdr, > + struct xfs_dir2_leaf_entry *dents, > + int start_d,/* destination leaf index */ > + int count) /* count of leaves to copy */ > { > - xfs_dir2_leaf_t *leaf_d; /* destination leaf structure */ > - xfs_dir2_leaf_t *leaf_s; /* source leaf structure */ > - int stale; /* count stale leaves copied */ > - xfs_trans_t *tp; /* transaction pointer */ > + int stale; I agree /* transaction pointer */ is a bit overkill but /* count stale leaves copied */ does help a new reader of this code. > @@ -922,21 +936,25 @@ xfs_dir2_leafn_moveents( > */ > int /* sort order */ > xfs_dir2_leafn_order( > - struct xfs_buf *leaf1_bp, /* leaf1 buffer */ > - struct xfs_buf *leaf2_bp) /* leaf2 buffer */ > + struct xfs_buf *leaf1_bp, /* leaf1 buffer */ > + struct xfs_buf *leaf2_bp) /* leaf2 buffer */ > { > - xfs_dir2_leaf_t *leaf1; /* leaf1 structure */ > - xfs_dir2_leaf_t *leaf2; /* leaf2 structure */ > - > - leaf1 = leaf1_bp->b_addr; > - leaf2 = leaf2_bp->b_addr; > - ASSERT(leaf1->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > - ASSERT(leaf2->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); These asserts are more specific than those in xfs_dir3_leaf_hdr_from_disk so they should probably stay and have dirv3 magic added. > @@ -1153,6 +1193,8 @@ xfs_dir2_leafn_remove( > int needscan; /* need to rescan data frees */ > xfs_trans_t *tp; /* transaction pointer */ > struct xfs_dir2_data_free *bf; /* bestfree table */ > + struct xfs_dir3_icleaf_hdr leafhdr; > + struct xfs_dir2_leaf_entry *ents; > > trace_xfs_dir2_leafn_remove(args, index); > > @@ -1160,11 +1202,14 @@ xfs_dir2_leafn_remove( > tp = args->trans; > mp = dp->i_mount; > leaf = bp->b_addr; > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); Another assert that is more specific than what it is replaced with, but you do have a leafn check, so that's something. > @@ -1366,6 +1413,8 @@ xfs_dir2_leafn_toosmall( > xfs_da_blkinfo_t *info; /* leaf block header */ Looks like you can get rid of the info pointer now. > @@ -1374,10 +1423,12 @@ xfs_dir2_leafn_toosmall( > */ > blk = &state->path.blk[state->path.active - 1]; > info = blk->bp->b_addr; > - ASSERT(info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); Another assert that is more specific than it's replacement. > @@ -1428,13 +1481,15 @@ xfs_dir2_leafn_toosmall( > /* > * Count bytes in the two blocks combined. > */ > - leaf = (xfs_dir2_leaf_t *)info; > - count = be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); > + count = leafhdr.count - leafhdr.stale; > bytes = state->blocksize - (state->blocksize >> 2); > + > leaf = bp->b_addr; > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > - count += be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); > - bytes -= count * (uint)sizeof(leaf->ents[0]); ^^^^^ I wonder why that (uint) was added. > @@ -1481,34 +1536,52 @@ xfs_dir2_leafn_unbalance( > xfs_da_args_t *args; /* operation arguments */ > xfs_dir2_leaf_t *drop_leaf; /* dead leaf structure */ > xfs_dir2_leaf_t *save_leaf; /* surviving leaf structure */ > + struct xfs_dir3_icleaf_hdr shdr; > + struct xfs_dir3_icleaf_hdr dhdr; > + struct xfs_dir2_leaf_entry *sents; > + struct xfs_dir2_leaf_entry *dents; As I read this I really had a hard time not thinking 'source' and 'dest' instead of 'save' and 'drop'. This would be more readable as the latter. > > args = state->args; > ASSERT(drop_blk->magic == XFS_DIR2_LEAFN_MAGIC); > ASSERT(save_blk->magic == XFS_DIR2_LEAFN_MAGIC); > drop_leaf = drop_blk->bp->b_addr; > save_leaf = save_blk->bp->b_addr; > - ASSERT(drop_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > - ASSERT(save_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); More specific assert than its replacement. > + > + xfs_dir3_leaf_hdr_from_disk(&shdr, save_leaf); > + xfs_dir3_leaf_hdr_from_disk(&dhdr, drop_leaf); > + sents = xfs_dir3_leaf_ents_p(save_leaf); > + dents = xfs_dir3_leaf_ents_p(drop_leaf); > + > /* > * If there are any stale leaf entries, take this opportunity > * to purge them. > */ > - if (drop_leaf->hdr.stale) > - xfs_dir2_leaf_compact(args, drop_blk->bp); > - if (save_leaf->hdr.stale) > - xfs_dir2_leaf_compact(args, save_blk->bp); > + if (dhdr.stale) > + xfs_dir3_leaf_compact(args, &dhdr, drop_blk->bp); > + if (shdr.stale) > + xfs_dir3_leaf_compact(args, &shdr, save_blk->bp); > + > /* > * Move the entries from drop to the appropriate end of save. > */ > - drop_blk->hashval = be32_to_cpu(drop_leaf->ents[be16_to_cpu(drop_leaf->hdr.count) - 1].hashval); > + drop_blk->hashval = be32_to_cpu(dents[dhdr.count - 1].hashval); > if (xfs_dir2_leafn_order(save_blk->bp, drop_blk->bp)) > - xfs_dir2_leafn_moveents(args, drop_blk->bp, 0, save_blk->bp, 0, > - be16_to_cpu(drop_leaf->hdr.count)); > + xfs_dir3_leafn_moveents(args, drop_blk->bp, &dhdr, dents, 0, > + save_blk->bp, &shdr, sents, 0, > + dhdr.count); > else > - xfs_dir2_leafn_moveents(args, drop_blk->bp, 0, save_blk->bp, > - be16_to_cpu(save_leaf->hdr.count), be16_to_cpu(drop_leaf->hdr.count)); > - save_blk->hashval = be32_to_cpu(save_leaf->ents[be16_to_cpu(save_leaf->hdr.count) - 1].hashval); > - xfs_dir2_leafn_check(args->dp, save_blk->bp); > + xfs_dir3_leafn_moveents(args, drop_blk->bp, &dhdr, dents, 0, > + save_blk->bp, &shdr, sents, > + shdr.count, dhdr.count); > + save_blk->hashval = be32_to_cpu(sents[shdr.count - 1].hashval); > + > + /* log the changes made when moving the entries */ > + xfs_dir3_leaf_hdr_to_disk(save_leaf, &shdr); > + xfs_dir3_leaf_hdr_to_disk(drop_leaf, &dhdr); > + xfs_dir3_leaf_log_header(args->trans, save_blk->bp); > + xfs_dir3_leaf_log_header(args->trans, drop_blk->bp); > + > + xfs_dir3_leaf_check(args->dp->i_mount, save_blk->bp); xfs_dir3_leaf_check(args->dp->i_mount, drop_block->bp); We used to check it in debug code. Might as well continue to do so. From palladia@alfagomma.it Wed Apr 10 13:09:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3B3AA7FC8 for ; Wed, 10 Apr 2013 13:09:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 22ACB304066 for ; Wed, 10 Apr 2013 11:09:46 -0700 (PDT) X-ASG-Debug-ID: 1365617336-04cbb057f7103f0001-w1Z2WR Received: from ks355437.kimsufi.com (ks355437.kimsufi.com [91.121.123.140]) by cuda.sgi.com with ESMTP id cd3zABKvgPcIY0Py for ; Wed, 10 Apr 2013 11:09:08 -0700 (PDT) X-Barracuda-Envelope-From: palladia@alfagomma.it X-Barracuda-Apparent-Source-IP: 91.121.123.140 Received: from [91.121.123.140] by ks355437.kimsufi.com id x9Iz5aDdmqca with SMTP; Wed, 10 Apr 2013 18:11:03 +0200 Date: Wed, 10 Apr 2013 18:11:03 +0200 From: X-Mailer: The Bat! (v3.07.2) Home X-Priority: 3 (Normal) Message-ID: <40793532.88484497403671@ks355437.kimsufi.com> To: Subject: Ordine 7484688. MIME-Version: 1.0 X-ASG-Orig-Subj: Ordine 7484688. Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ks355437.kimsufi.com[91.121.123.140] X-Barracuda-Start-Time: 1365617336 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.06 X-Barracuda-Spam-Status: No, SCORE=1.06 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074b, BSF_SC0_SA717, FORGED_MUA_THEBAT_CS, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127745 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.85 FORGED_MUA_THEBAT_CS Mail pretending to be from The Bat! (charset) 0.20 BSF_SC0_SA074b Custom Rule SA074b 0.00 BSF_SC0_SA717 Custom Rule BSF_SC0_SA717 Ciao, linux-xfs. La risposta alla tua domanda riguardo al profilo sul sito 04.04.2012. http://adelaidescakepopqueen.com/Richiesta.zip Ci auguriamo di poter collaborare in futuro. Tel./Fax.: +39 (11) 209-57-97 From ctia@sendconnection.com Wed Apr 10 13:15:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.4 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,MIME_HTML_ONLY,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 A68F37FC8 for ; Wed, 10 Apr 2013 13:15:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 95EDE8F8073 for ; Wed, 10 Apr 2013 11:15:51 -0700 (PDT) X-ASG-Debug-ID: 1365617735-04cb6c2c1f13af0001-NocioJ Received: from a.smtp.sendconnection.com (a.smtp.sendconnection.com [63.77.84.170]) by cuda.sgi.com with ESMTP id TCwpqDSBJegMciN5 for ; Wed, 10 Apr 2013 11:15:37 -0700 (PDT) X-Barracuda-Envelope-From: ctia@sendconnection.com X-Barracuda-Apparent-Source-IP: 63.77.84.170 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=ctia; d=sendconnection.com; h=MIME-Version:Content-Type:List-Unsubscribe:From:To:Subject:Message-ID:Date; i=CTIA@sendconnection.com; bh=boTr3yaqofYdpiVNqPdeL1bdLa8=; b=a98IUR/55B2CnBMgnkoWzeOIb5VR2uaXi4wksNOJd8y6UEtp2P9HjCPxHQJuWM0XQdLiHirLBM3n 6dEH098TS+xmzLC+RPIxbW7g5cEVvVpz4/CRiV4WecVTF5VirTiGPqz7ngBnyfqzygY1jKEdiRQF aSNU3p+pmdoPPWEC3Bc= MIME-Version: 1.0 Content-Type: text/html List-Unsubscribe: From: "CTIA" To: xfs@oss.sgi.com Subject: Crack the Code on Cybersecurity Today Message-ID: <0.0.D.74.1CE36176551D497.0@a.smtp.sendconnection.com> X-ASG-Orig-Subj: Crack the Code on Cybersecurity Today Date: Wed, 10 Apr 2013 14:15:35 -0400 X-Barracuda-Connect: a.smtp.sendconnection.com[63.77.84.170] X-Barracuda-Start-Time: 1365617737 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi 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, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127744 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.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 Crack the Code on Cybersecurity Today
Get a sneak preview from CTIA's VP of Technology & Cybersecurity.
= =0D=0A =0D=0A =0D=0A =0D=0A =0D=0A =0D=0A= =0D=0A = =0D=0A
CTIA 2013 Tackles America's Top Priority
CYBERSECURITYCybersecurity affects economic stability, national security, and our daily lives. 
The CTIA Mobile Cybersecurity Summit will tackle the threat facing America and highlight the importance of consumer Cybersafety.REGISTER NOW PROTECTING CYBERSPACECybersecurity Plenary Keynote: Listen to key industry and government leadership experts address the threats and countermeasures in today's mobile environment.Cybersecurity Sessions: 
Understand the current landscape and ensure successful cyberspace navigation with best practices, market trends and research from AT&T, Ericsson, Symantec and more.Hands-on 
Workshops: Participate in live training to prevent attacks and protect data at the Lessons Learned and Forensics workshops.Top Cybersecurity Experts: Learn from top thought leaders such 
as Ari Schwartz, Senior Internet Policy Advisor to the Secretary of Commerce, Department of Commerce, Ed Amoroso, Chief Security Officer, AT&T and Chris Doggett, Senior VP, North America, Kaspersky Lab.REDUCE THE CYBERTHREATGet a sneak preview from CTIA's VP of Technology & Cybersecurity: Make the most of CTIA 2013. Upgrade to the Super or VIP Pass for exclusive access to the VIP Club, Thought Leadership Conference and Partner Events with the most important people in the mobile space. UPGRADE MY PASS.
 

BONUS Cybersecurity Event at CTIA 2013: App-solutely Security

 
 

Hosted by:
151 Advisors

Join us for a half day educational event delivering a comprehensive overview of the "State of Mobile Security." Industry experts will dive into the issues, challenges and vulnerabilities faced by consumers, businesses, application vendors, device manufacturers and mobile operators, discussing how stakeholders can protect themselves and prepare for a security-conscious future. More details...

 
You have been selected to receive the following vendor information because you opted to receive it when you provided your email address to Ziff Davis Media




[ xfs@oss.sgi.com ]

The preceding is vendor information.

If you no longer wish to receive these notices you may indicate that here
http://www.sendconnection.com/r/km.asp?m=fKqXgfC&o=ffPfqg&j=YCPXn&t=2&e=xfs@oss.sgi.com
1087613




From tinguely@sgi.com Wed Apr 10 13:25:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1AA8C7FCA for ; Wed, 10 Apr 2013 13:25:12 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6E415AC005 for ; Wed, 10 Apr 2013 11:25:08 -0700 (PDT) Received: from eagdhcp-232-136.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-136.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r3AIPATV004587 for ; Wed, 10 Apr 2013 13:25:10 -0500 (CDT) (envelope-from tinguely@sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-136.americas.sgi.com (8.14.5/8.14.5/Submit) id r3AIPATF004586; Wed, 10 Apr 2013 13:25:10 -0500 (CDT) (envelope-from tinguely@sgi.com) X-Authentication-Warning: eagdhcp-232-136.americas.sgi.com: tinguely set sender to tinguely@sgi.com using -f Message-Id: <20130410182438.268267840@sgi.com> User-Agent: quilt/0.51-1 Date: Wed, 10 Apr 2013 13:24:24 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy Content-Disposition: inline; filename=xfs-reserve-parent-and-allocation-fields-in-inode.patch Reserve fields in new inode layout for parent pointer and allocation policy. ---- The inode will hold the parent information for the first link to a file. Information for the other links will be held in extended attribute entries. The "di_parino" is the inode of the parent directory. The directory information for this entry is located the parent directory with "di_paroff" offset. The di_parino/di_paroff concept code is running. ---- The "di_allocpolicy" will be used to remember the allocation policy associated with this inode. Signed-off-by: Mark Tinguely --- fs/xfs/xfs_dinode.h | 3 +++ fs/xfs/xfs_inode.c | 6 ++++++ fs/xfs/xfs_inode.h | 3 +++ 3 files changed, 12 insertions(+) Index: b/fs/xfs/xfs_dinode.h =================================================================== --- a/fs/xfs/xfs_dinode.h +++ b/fs/xfs/xfs_dinode.h @@ -76,6 +76,9 @@ typedef struct xfs_dinode { __be64 di_changecount; /* number of attribute changes */ __be64 di_lsn; /* flush sequence */ __be64 di_flags2; /* more random flags */ + __be64 di_parino; /* parent inode */ + __be32 di_paroff; /* offset into parent directory */ + __be32 di_allocpolicy; /* allocation policy number */ __u8 di_pad2[16]; /* more padding for future expansion */ /* fields only written to during inode creation */ Index: b/fs/xfs/xfs_inode.c =================================================================== --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -875,6 +875,9 @@ xfs_dinode_from_disk( to->di_flags2 = be64_to_cpu(from->di_flags2); to->di_ino = be64_to_cpu(from->di_ino); to->di_lsn = be64_to_cpu(from->di_lsn); + to->di_parino = be64_to_cpu(from->di_parino); + to->di_paroff = be32_to_cpu(from->di_paroff); + to->di_allocpolicy = be32_to_cpu(from->di_allocpolicy); memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); uuid_copy(&to->di_uuid, &from->di_uuid); } @@ -922,6 +925,9 @@ xfs_dinode_to_disk( to->di_flags2 = cpu_to_be64(from->di_flags2); to->di_ino = cpu_to_be64(from->di_ino); to->di_lsn = cpu_to_be64(from->di_lsn); + to->di_parino = cpu_to_be64(from->di_parino); + to->di_paroff = cpu_to_be32(from->di_paroff); + to->di_allocpolicy = cpu_to_be32(from->di_allocpolicy); memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); uuid_copy(&to->di_uuid, &from->di_uuid); } Index: b/fs/xfs/xfs_inode.h =================================================================== --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -159,6 +159,9 @@ typedef struct xfs_icdinode { __uint64_t di_changecount; /* number of attribute changes */ xfs_lsn_t di_lsn; /* flush sequence */ __uint64_t di_flags2; /* more random flags */ + xfs_ino_t di_parino; /* parent inode */ + __uint32_t di_paroff; /* offset into parent directory */ + __uint32_t di_allocpolicy; /* allocation policy number */ __uint8_t di_pad2[16]; /* more padding for future expansion */ /* fields only written to during inode creation */ From sandeen@sandeen.net Wed Apr 10 13:56:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F2CEB7FB1 for ; Wed, 10 Apr 2013 13:56:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DC4F630405F for ; Wed, 10 Apr 2013 11:56:13 -0700 (PDT) X-ASG-Debug-ID: 1365620172-04cbb057f616fb0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id eApOa26lD1c0ePzh for ; Wed, 10 Apr 2013 11:56:12 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id F2E2863C5B50; Wed, 10 Apr 2013 13:56:11 -0500 (CDT) Message-ID: <5165B5CB.2070203@sandeen.net> Date: Wed, 10 Apr 2013 13:56:11 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy References: <20130410182438.268267840@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy In-Reply-To: <20130410182438.268267840@sgi.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365620172 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127745 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/10/13 1:24 PM, Mark Tinguely wrote: > Reserve fields in new inode layout for parent pointer and > allocation policy. > ---- > The inode will hold the parent information for the first > link to a file. Information for the other links will be > held in extended attribute entries. > > The "di_parino" is the inode of the parent directory. The > directory information for this entry is located the parent > directory with "di_paroff" offset. > > The di_parino/di_paroff concept code is running. > ---- > The "di_allocpolicy" will be used to remember the allocation > policy associated with this inode. can you say more about this allocation policy? -Eric > Signed-off-by: Mark Tinguely > --- > fs/xfs/xfs_dinode.h | 3 +++ > fs/xfs/xfs_inode.c | 6 ++++++ > fs/xfs/xfs_inode.h | 3 +++ > 3 files changed, 12 insertions(+) > > Index: b/fs/xfs/xfs_dinode.h > =================================================================== > --- a/fs/xfs/xfs_dinode.h > +++ b/fs/xfs/xfs_dinode.h > @@ -76,6 +76,9 @@ typedef struct xfs_dinode { > __be64 di_changecount; /* number of attribute changes */ > __be64 di_lsn; /* flush sequence */ > __be64 di_flags2; /* more random flags */ > + __be64 di_parino; /* parent inode */ > + __be32 di_paroff; /* offset into parent directory */ > + __be32 di_allocpolicy; /* allocation policy number */ > __u8 di_pad2[16]; /* more padding for future expansion */ > > /* fields only written to during inode creation */ > Index: b/fs/xfs/xfs_inode.c > =================================================================== > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -875,6 +875,9 @@ xfs_dinode_from_disk( > to->di_flags2 = be64_to_cpu(from->di_flags2); > to->di_ino = be64_to_cpu(from->di_ino); > to->di_lsn = be64_to_cpu(from->di_lsn); > + to->di_parino = be64_to_cpu(from->di_parino); > + to->di_paroff = be32_to_cpu(from->di_paroff); > + to->di_allocpolicy = be32_to_cpu(from->di_allocpolicy); > memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); > uuid_copy(&to->di_uuid, &from->di_uuid); > } > @@ -922,6 +925,9 @@ xfs_dinode_to_disk( > to->di_flags2 = cpu_to_be64(from->di_flags2); > to->di_ino = cpu_to_be64(from->di_ino); > to->di_lsn = cpu_to_be64(from->di_lsn); > + to->di_parino = cpu_to_be64(from->di_parino); > + to->di_paroff = cpu_to_be32(from->di_paroff); > + to->di_allocpolicy = cpu_to_be32(from->di_allocpolicy); > memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); > uuid_copy(&to->di_uuid, &from->di_uuid); > } > Index: b/fs/xfs/xfs_inode.h > =================================================================== > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -159,6 +159,9 @@ typedef struct xfs_icdinode { > __uint64_t di_changecount; /* number of attribute changes */ > xfs_lsn_t di_lsn; /* flush sequence */ > __uint64_t di_flags2; /* more random flags */ > + xfs_ino_t di_parino; /* parent inode */ > + __uint32_t di_paroff; /* offset into parent directory */ > + __uint32_t di_allocpolicy; /* allocation policy number */ > __uint8_t di_pad2[16]; /* more padding for future expansion */ > > /* fields only written to during inode creation */ > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From rjohnston@sgi.com Wed Apr 10 14:39:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4B30F7FC8 for ; Wed, 10 Apr 2013 14:39:05 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id 45EA7AC001; Wed, 10 Apr 2013 12:39:01 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Wed, 10 Apr 2013 14:39:00 -0500 Message-ID: <5165BFF4.8020601@sgi.com> Date: Wed, 10 Apr 2013 14:39:32 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eric Sandeen CC: Mark Tinguely , Subject: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy References: <20130410182438.268267840@sgi.com> <5165B5CB.2070203@sandeen.net> In-Reply-To: <5165B5CB.2070203@sandeen.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/10/2013 01:56 PM, Eric Sandeen wrote: > On 4/10/13 1:24 PM, Mark Tinguely wrote: >> Reserve fields in new inode layout for parent pointer and >> allocation policy. >> ---- >> The inode will hold the parent information for the first >> link to a file. Information for the other links will be >> held in extended attribute entries. >> >> The "di_parino" is the inode of the parent directory. The >> directory information for this entry is located the parent >> directory with "di_paroff" offset. >> >> The di_parino/di_paroff concept code is running. >> ---- >> The "di_allocpolicy" will be used to remember the allocation >> policy associated with this inode. > > can you say more about this allocation policy? > > -Eric No its super secret information. ;) Its on my plate Eric, because Mark was making a change for parent ptrs, I asked him to request space for allocation policies also. I don't have all the details yet but here is a very high level concept. Identify allocation groups by names (or numbers -- preferably using names in user-visible areas), allowing many different areas. Placing the allocation policy outside of user programs is necessary for this to be successful. Current thoughts on proposed a layered allocation policies: Policy for the entire filesystem Policy attached to a directory (whose policy would be inherited by subdirectories when subdirectories are created) Policy for a single file The policy would define: where to place file data where to place metadata for the files. a prefered allocation group for placing file data (for directories). --Rich From bpm@sgi.com Wed Apr 10 14:52:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9DF6C7FCC for ; Wed, 10 Apr 2013 14:52:52 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 668F7304048; Wed, 10 Apr 2013 12:52:49 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 40DD6500B4B; Wed, 10 Apr 2013 14:52:49 -0500 (CDT) Date: Wed, 10 Apr 2013 14:52:49 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 14/22] xfs: shortform directory offsets change for dir3 format Message-ID: <20130410195249.GH22182@sgi.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-15-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-15-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Wed, Apr 03, 2013 at 04:11:24PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Because the header size for the CRC enabled directory blocks is > larger, the offset of the first entry into a directory block is > different to the dir2 format. The shortform directory stores the > dirent's offset so that it doesn't change when moving from shortform > to block form and back again, and hence it needs to take into > account the different header sizes to maintain the correct offsets. > > Signed-off-by: Dave Chinner Looks great. -Ben From tinguely@sgi.com Wed Apr 10 15:31:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 BB77D7FD6 for ; Wed, 10 Apr 2013 15:31:57 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6706F8F8052; Wed, 10 Apr 2013 13:31:51 -0700 (PDT) Message-ID: <5165CC39.2090108@sgi.com> Date: Wed, 10 Apr 2013 15:31:53 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Rich Johnston CC: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy References: <20130410182438.268267840@sgi.com> <5165B5CB.2070203@sandeen.net> <5165BFF4.8020601@sgi.com> In-Reply-To: <5165BFF4.8020601@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/10/13 14:39, Rich Johnston wrote: > On 04/10/2013 01:56 PM, Eric Sandeen wrote: >> On 4/10/13 1:24 PM, Mark Tinguely wrote: >>> Reserve fields in new inode layout for parent pointer and >>> allocation policy. >>> ---- >>> The inode will hold the parent information for the first >>> link to a file. Information for the other links will be >>> held in extended attribute entries. >>> >>> The "di_parino" is the inode of the parent directory. The >>> directory information for this entry is located the parent >>> directory with "di_paroff" offset. >>> >>> The di_parino/di_paroff concept code is running. >>> ---- >>> The "di_allocpolicy" will be used to remember the allocation >>> policy associated with this inode. >> >> can you say more about this allocation policy? >> >> -Eric > > No its super secret information. ;) > > Its on my plate Eric, because Mark was making a change for parent ptrs, > I asked him to request space for allocation policies also. > > I don't have all the details yet but here is a very high level concept. > > Identify allocation groups by names (or numbers -- preferably using names > in user-visible areas), allowing many different areas. Placing the > allocation > policy outside of user programs is necessary for this to be successful. > > Current thoughts on proposed a layered allocation policies: > > Policy for the entire filesystem > Policy attached to a directory (whose policy would be inherited by > subdirectories when subdirectories are created) > Policy for a single file > > The policy would define: > > where to place file data > where to place metadata for the files. > a prefered allocation group for placing file data (for directories). > > --Rich > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs The allocation policies is based on work by Dave: http://oss.sgi.com/archives/xfs/2009-02/msg00250.html --Mark. From sandeen@sandeen.net Wed Apr 10 15:40:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3CFBD7FDD for ; Wed, 10 Apr 2013 15:40:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1BC5830404E for ; Wed, 10 Apr 2013 13:40:31 -0700 (PDT) X-ASG-Debug-ID: 1365626429-04cb6c2c1d23670001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id jlpRPB1EG3vPeF1F for ; Wed, 10 Apr 2013 13:40:29 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B13DA63C5B50; Wed, 10 Apr 2013 15:40:29 -0500 (CDT) Message-ID: <5165CE3C.3020701@sandeen.net> Date: Wed, 10 Apr 2013 15:40:28 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Mark Tinguely CC: Rich Johnston , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy References: <20130410182438.268267840@sgi.com> <5165B5CB.2070203@sandeen.net> <5165BFF4.8020601@sgi.com> <5165CC39.2090108@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy In-Reply-To: <5165CC39.2090108@sgi.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365626429 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127749 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/10/13 3:31 PM, Mark Tinguely wrote: > On 04/10/13 14:39, Rich Johnston wrote: >> On 04/10/2013 01:56 PM, Eric Sandeen wrote: >>> On 4/10/13 1:24 PM, Mark Tinguely wrote: >>>> Reserve fields in new inode layout for parent pointer and >>>> allocation policy. >>>> ---- >>>> The inode will hold the parent information for the first >>>> link to a file. Information for the other links will be >>>> held in extended attribute entries. >>>> >>>> The "di_parino" is the inode of the parent directory. The >>>> directory information for this entry is located the parent >>>> directory with "di_paroff" offset. >>>> >>>> The di_parino/di_paroff concept code is running. >>>> ---- >>>> The "di_allocpolicy" will be used to remember the allocation >>>> policy associated with this inode. >>> >>> can you say more about this allocation policy? >>> >>> -Eric >> >> No its super secret information. ;) >> >> Its on my plate Eric, because Mark was making a change for parent ptrs, >> I asked him to request space for allocation policies also. >> >> I don't have all the details yet but here is a very high level concept. >> >> Identify allocation groups by names (or numbers -- preferably using names >> in user-visible areas), allowing many different areas. Placing the >> allocation >> policy outside of user programs is necessary for this to be successful. >> >> Current thoughts on proposed a layered allocation policies: >> >> Policy for the entire filesystem >> Policy attached to a directory (whose policy would be inherited by >> subdirectories when subdirectories are created) >> Policy for a single file >> >> The policy would define: >> >> where to place file data >> where to place metadata for the files. >> a prefered allocation group for placing file data (for directories). >> >> --Rich >> > > The allocation policies is based on work by Dave: > > http://oss.sgi.com/archives/xfs/2009-02/msg00250.html > > --Mark. > Great, thanks guys. I had forgotten about that TBH. Just wondered if you had it in the works, or reserving just in case, or . . . -Eric From service-client@enfr2-18.com Wed Apr 10 19:29:54 2013 Return-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.8 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,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 A14077FC7 for ; Wed, 10 Apr 2013 19:29:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 54902304032 for ; Wed, 10 Apr 2013 17:29:51 -0700 (PDT) X-ASG-Debug-ID: 1365640185-04bdf02d1d34f60001-NocioJ Received: from s4.enfr2-18.com (s4.enfr2-18.com [37.59.170.22]) by cuda.sgi.com with ESMTP id MU4uHIbDzJipQ8dh for ; Wed, 10 Apr 2013 17:29:46 -0700 (PDT) X-Barracuda-Envelope-From: service-client@enfr2-18.com X-Barracuda-Apparent-Source-IP: 37.59.170.22 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=enfr2-18.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@enfr2-18.com; bh=07uAgU+QCzYZ/bknNSbzVIEMqtQekfg7h9SdxHntkIg=; b=LpiClglKxE2NPMeyoEl/LPmzz9pQbUAhzj/7wQzvrswcgBJV5IGsMf9ebmpM0YpuCBN2uUGmufEe Bwutx2laTxsk8Z5oZ1CZecLOrF+RK/JSrtPHGjLgVXDInVjqeU6gqW8B6AKEnoTj5NpJ/5kk7w6N ECUQ5bToQev2XJ0tDNA= From: Bagages de Grandes Marques X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 39875 X-EN-uuid: 218-021839875-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Petits prix sur les bagages MIME-Version: 1.0 X-ASG-Orig-Subj: Petits prix sur les bagages List-Unsubscribe: http://www.enfr2-18.com/wUp8fSxGJlswOeGhVvm_o9B33hJGVTo0DgsuAnSRDyA.html, Content-Type: multipart/alternative; boundary=e08d2ecc403d6c1ff54fee8ca236c448 Message-ID: <0.0.10B.C4.1CE364BAABC4624.0@s4.enfr2-18.com> Date: Thu, 11 Apr 2013 02:29:45 +0200 X-Barracuda-Connect: s4.enfr2-18.com[37.59.170.22] X-Barracuda-Start-Time: 1365640186 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.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=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_02, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127765 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_MOSTLY BODY: Multipart message mostly text/html MIME 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary --e08d2ecc403d6c1ff54fee8ca236c448 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --e08d2ecc403d6c1ff54fee8ca236c448 Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit Festival des petits prix - jusqu'au 17 avril

Festival des petits prix
jusqu'au 17 avril
LA LIVRAISON EN 48H EST GRATUITE !
Les prix les plus bas du marché
VALISES RIGIDES VALISES SOUPLES SAC A ROULETTES SAC CABINE ACCESSOIRES
Festival des petits prix
► VALISES RIGIDES ► VALISES SOUPLES ► SAC À ROULETTES
jusqu à moins 70pourcent
jusqu à moins 70pourcent
sur des bagages de grandes marques
sur des bagages de grandes marques
► SAC CABINE ► PORTE-ORDINATEURS ► ACCESSOIRES
Valise + vanity Ensemble de 3 valises Sac à roulettes
NOS AVANTAGES CLIENT
Nos avantages clients Livraison 48H
GRATUITE
Nos avantages clients Echange & Retour
GRATUIT
Nos avantages clients GARANTIE
Voyage
Nos avantages clients Paiement
SÉCURISÉ
NOS MARQUES
Platinium, Travel One, Lulu Castagnette, Christophe Guillarmé, Corinne Cobson...
Voir toutes nos marques
Facebook Sur Facebook Twitter Sur Twitter Par mail Par mail Téléchargez l Application

Festival des petits prix

Jusqu’au 17 Avril profitez de notre opération Festival des petits prix et découvrez les meilleures offres du moment. Même après les soldes profitez des prix les plus bas du marché.
Pas encore de valise pour vos vacances, pas de panique vous trouverez celle qui vous conviendra. Vous bénéficierez également d’un large choix de vanity, de portes ordinateurs, d’accessoires de voyage...


Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From lambaax@multibase.com Wed Apr 10 20:34:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 09C497FC8 for ; Wed, 10 Apr 2013 20:34:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DB616304043 for ; Wed, 10 Apr 2013 18:34:41 -0700 (PDT) X-ASG-Debug-ID: 1365644079-04cbb057f739a90001-NocioJ Received: from testnrgdebian5.ru (savinanton.ru [176.9.219.84]) by cuda.sgi.com with ESMTP id 0xm4cYR3uYRe5I6G for ; Wed, 10 Apr 2013 18:34:40 -0700 (PDT) X-Barracuda-Envelope-From: lambaax@multibase.com X-Barracuda-Apparent-Source-IP: 176.9.219.84 Received: from Unknown (97-81-193-97.dhcp.hckr.nc.charter.com [97.81.193.97]) by testnrgdebian5.ru (Postfix) with ESMTPA id A91411B44CA6; Thu, 11 Apr 2013 05:34:37 +0400 (MSK) Message-ID: <0BB072C10FF54A769DF500B474C9E24C@koiul> Reply-To: =?windows-1251?B?0fTl8OAg7/Do7OXt5e3o/yDn4Oru7e7iIDk0?= =?windows-1251?B?LdTHIOggMjIzLdTH?= From: =?windows-1251?B?0fTl8OAg7/Do7OXt5e3o/yDn4Oru7e7iIDk0?= =?windows-1251?B?LdTHIOggMjIzLdTH?= To: , , , Subject: =?windows-1251?B?0uXs+zo=?= Date: Thu, 11 Apr 2013 03:35:03 +0200 X-ASG-Orig-Subj: =?windows-1251?B?0uXs+zo=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0BD4_01CE3665.8D602BD0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Barracuda-Connect: savinanton.ru[176.9.219.84] X-Barracuda-Start-Time: 1365644080 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127769 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_0BD4_01CE3665.8D602BD0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D5=EE=F2=E8=F2=E5 =F0=E0=E7=E1=E8=F0=E0=F2=FC=F1=FF =E2 =E3=EE=F1=E7=E0=EA= =F3=EF=EA=E0=F5? - =E2=EB=E0=E4=E5=F2=FC =F2=E5=F5=ED=EE=EB=EE=E3=E8=E5=E9 =FD=EB=E5=EA=F2= =F0=EE=ED=ED=FB=F5 =F2=EE=F0=E3=EE=E2 =ED=E0 =E3=EB=E0=E2=ED=FB=F5 =EF=EB= =EE=F9=E0=E4=EA=E0=F5 - =E7=ED=E0=F2=FC =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=EE =E2 =EE= =E1=EB=E0=F1=F2=E8 =F0=E0=E7=EC=E5=F9=E5=ED=E8=FF =E3=EE=F1=F3=E4=E0=F0=F1= =F2=E2=E5=ED=ED=EE=E3=EE =E8 =EC=F3=ED=E8=F6=E8=EF=E0=EB=FC=ED=EE=E3=EE =E7= =E0=EA=E0=E7=E0 - =F3=EC=E5=F2=FC =F0=E0=E7=E1=E8=F0=E0=F2=FC=F1=FF =E2 =F2=E5=F0=EC=E8=ED= =EE=EB=EE=E3=E8=E8 =E8 =F2=E0=EA=F2=E8=EA=E5 =FD=EB=E5=EA=F2=F0=EE=ED=ED=FB= =F5 =F2=EE=F0=E3=EE=E2 - =E8=E7=F3=F7=E8=F2=FC =D4=C7 =B94I8 =EE=F2 =CE7 =E4=E5=EA=E0=E1=F0=FF 2= OII =E3, 223-=D4=C7 =EE=F2 I8.O7.2=CEII=E3., =CF=F0=E8=EA=E0=E7=F3 =CC=DD= =D0 =EE=F2 =CE7.=CE6.2=CEII =E3., =B9 273 =E8 =E4=F0=F3=E3=E8=EC =ED=EE=F0= =EC=E0=F2=E8=E2=E0=EC =CB=F3=F7=F8=E8=E9 =EF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E9 =EA=F3=F0=F1 =EF=EE= =FD=EB.=F2=EE=F0=E3=E0=EC. =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3, = 24, 25 =E0=EF=F0., 2OI3 =E3=EE=E4=E0. =D2=E5=EB. =CE=F0=E3.=CA=EE=EC=E8=F2= =E5=F2=E0: +7 ( =EA=EE=E4_=D1=CF=E1 ) 6=D7 2 .. O7 . 7 6=20 ------=_NextPart_000_0BD4_01CE3665.8D602BD0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=D5=EE=F2=E8=F2=E5 =F0=E0=E7=E1=E8=F0=E0=F2=FC=F1=FF =E2 =E3=EE=F1=E7= =E0=EA=F3=EF=EA=E0=F5?
 
- =E2=EB=E0=E4=E5=F2=FC =F2=E5=F5=ED=EE=EB=EE=E3=E8=E5=E9 =FD=EB=E5=EA= =F2=F0=EE=ED=ED=FB=F5 =F2=EE=F0=E3=EE=E2 =ED=E0 =E3=EB=E0=E2=ED=FB=F5 =EF= =EB=EE=F9=E0=E4=EA=E0=F5
- =E7=ED=E0=F2=FC=20 =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=EE =E2 =EE=E1=EB=E0=F1=F2=E8= =F0=E0=E7=EC=E5=F9=E5=ED=E8=FF =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE= =E3=EE =E8 =EC=F3=ED=E8=F6=E8=EF=E0=EB=FC=ED=EE=E3=EE=20 =E7=E0=EA=E0=E7=E0
- =F3=EC=E5=F2=FC =F0=E0=E7=E1=E8=F0=E0=F2=FC=F1=FF= =E2 =F2=E5=F0=EC=E8=ED=EE=EB=EE=E3=E8=E8 =E8 =F2=E0=EA=F2=E8=EA=E5 =FD=EB= =E5=EA=F2=F0=EE=ED=ED=FB=F5 =F2=EE=F0=E3=EE=E2
-=20 =E8=E7=F3=F7=E8=F2=FC =D4=C7 =B94I8 =EE=F2 =CE7 =E4=E5=EA=E0=E1=F0=FF=20 2OII =E3,=20 223-=D4=C7 =EE=F2=20 I8.O7.2=CEII=E3.,=20 =CF=F0=E8=EA=E0=E7=F3 =CC=DD=D0 =EE=F2=20 =CE7.=CE6.2=CEII=20 =E3., =B9 273  =E8 =E4=F0=F3=E3=E8=EC =ED=EE=F0=EC=E0=F2=E8=E2=E0=EC=
 
=CB=F3=F7=F8=E8=E9 =EF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E9 =EA=F3=F0=F1= =EF=EE =FD=EB.=F2=EE=F0=E3=E0=EC. =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0= =E3,=20 24, 25 =E0=EF=F0.,=20 2OI3 =E3=EE=E4=E0. =D2=E5=EB. =CE=F0=E3.=CA=EE=EC=E8=F2=E5=F2=E0:=20 +7 ( =EA=EE=E4_=D1=CF=E1 ) 6=D7 2 .. O7 . 7 6
------=_NextPart_000_0BD4_01CE3665.8D602BD0-- From david@fromorbit.com Wed Apr 10 21:06:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4ECBD7FA4 for ; Wed, 10 Apr 2013 21:06:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0D35C8F8054 for ; Wed, 10 Apr 2013 19:06:12 -0700 (PDT) X-ASG-Debug-ID: 1365645969-04bdf02d1c3bf90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id DetGTQwzyXz75m2d for ; Wed, 10 Apr 2013 19:06:09 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArcTAKgZZlF5LMW7/2dsb2JhbABGCoMGgnu5ZIUcBAGBCxd0gh8BAQQBJxMcIwULCAMOCgklDwUlAyETiA4FvzQVjUUfgR0HgmBhA5M1g0qRD4MdKoEwJA Received: from ppp121-44-197-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.187]) by ipmail05.adl6.internode.on.net with ESMTP; 11 Apr 2013 11:36:08 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQ6tq-0004zI-Iv; Thu, 11 Apr 2013 12:06:06 +1000 Date: Thu, 11 Apr 2013 12:06:06 +1000 From: Dave Chinner To: Ben Myers Cc: xfs@oss.sgi.com Subject: Re: [PATCH 13/22] xfs: add CRC checking to dir2 leaf blocks Message-ID: <20130411020606.GE10481@dastard> X-ASG-Orig-Subj: Re: [PATCH 13/22] xfs: add CRC checking to dir2 leaf blocks References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-14-git-send-email-david@fromorbit.com> <20130410174639.GG22182@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130410174639.GG22182@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1365645969 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127772 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 10, 2013 at 12:46:39PM -0500, Ben Myers wrote: > > @@ -396,11 +397,18 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, > > size = (int)((char *)&oldroot->btree[be16_to_cpu(oldroot->hdr.count)] - > > (char *)oldroot); > > } else { > > - ASSERT(oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > + struct xfs_dir3_icleaf_hdr leafhdr; > > + struct xfs_dir2_leaf_entry *ents; > > + > > leaf = (xfs_dir2_leaf_t *)oldroot; > > - size = (int)((char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] - > > - (char *)leaf); > > + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); > > + ents = xfs_dir3_leaf_ents_p(leaf); > > + > > + ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || > > + leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); > > + size = (int)((char *)&ents[leafhdr.count] - (char *)leaf); > > } > > + /* XXX: can't just copy CRC headers from one block to another */ > > What is your plan for resolving that? It's fixed in a later patch when the da btree nodes have CRCs added to them. > > @@ -2281,10 +2299,17 @@ xfs_da_read_buf( > > XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && > > (magic != XFS_ATTR_LEAF_MAGIC) && > > (magic != XFS_DIR2_LEAF1_MAGIC) && > > + (magic != XFS_DIR3_LEAF1_MAGIC) && > > (magic != XFS_DIR2_LEAFN_MAGIC) && > > + (magic != XFS_DIR3_LEAFN_MAGIC) && > > (magic1 != XFS_DIR2_BLOCK_MAGIC) && > > + (magic1 != XFS_DIR3_BLOCK_MAGIC) && > > Did this DIR3_BLOCK_MAGIC change sneak in from another patch? ... > Do DIRx_DATA_MAGIC and DIRx_FREE_MAGIC belong in a different patch? Probably, though given that at this point in the series they'll never be set, it isn't actually a bug or anything that will break a bisection. Do I really need to move these back into 3 previous patches? Kind in mind that means I also need to do all these changes in the userspace patch series as well... > > +static bool > > +xfs_dir3_leaf_verify( > > struct xfs_buf *bp, > > - __be16 magic) > > + __uint16_t magic) > > +{ > > + struct xfs_mount *mp = bp->b_target->bt_mount; > > + struct xfs_dir2_leaf *leaf = bp->b_addr; > > + struct xfs_dir3_icleaf_hdr leafhdr; > > + > > + ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); > > Using v2 magics to choose between leaf1 and leafn is ok, but not as clear as > using a non-version-specific #define or enum might be for this purpose. The magic number passed in is actually used to validate the magic number in the block being verified. I don't see any point in inventing a new LEAF1/LEAFN identifier and then have to use that to determine what the correct magic number is when we can just pass in the magic number we expect.... Besides, we already use the magic numbers in this manner to identify block types in the struct xfs_da_state_blk that is passed through the da btree code, this is a pattern that is already well established. > > > @@ -169,27 +432,34 @@ xfs_dir2_block_to_leaf( > > /* > > * Initialize the leaf block, get a buffer for it. > > */ > > - if ((error = xfs_dir2_leaf_init(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC))) { > > + error = xfs_dir3_leaf_get_buf(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC); > > + if (error) > > return error; > > - } > > - ASSERT(lbp != NULL); > > + > > leaf = lbp->b_addr; > > hdr = dbp->b_addr; > > xfs_dir3_data_check(dp, dbp); > > btp = xfs_dir2_block_tail_p(mp, hdr); > > blp = xfs_dir2_block_leaf_p(btp); > > bf = xfs_dir3_data_bestfree_p(hdr); > > + ents = xfs_dir3_leaf_ents_p(leaf); > > + > > /* > > * Set the counts in the leaf header. > > + * > > + * XXX: are these actually logged, or just gathered by chance? > > Nice find. I'm not seeing where that header is being logged. Worth a separate > patch. I haven't fixed anything. I just added the comment as something to come back to. As it is, I can answer that question directly right now: they are gathered by chance by the xfs_dir2_leaf_log_ents() call a few lines below due to the fact that the first dirent is in the range covered by the first dirty bit of the logging regions (i.e. 0-127 bytes into the buffer). So there isn't a bug here, and the header is logged implicity rather than explicitly. As such, I don't think there's anything that needs to be put in a separate patch because there is no bug being fixed here. I have, however, removed the comment and put an explicit call to xfs_dir3_leaf_log_header() in there. > > void > > -xfs_dir2_leaf_log_header( > > +xfs_dir3_leaf_log_header( > > struct xfs_trans *tp, > > struct xfs_buf *bp) > > { > > - xfs_dir2_leaf_t *leaf; /* leaf structure */ > > + struct xfs_dir2_leaf *leaf = bp->b_addr; > > > > - leaf = bp->b_addr; > > ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || > > - leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || > > + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || > > + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); > > + > > xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), > > - (uint)(sizeof(leaf->hdr) - 1)); > > + xfs_dir3_leaf_hdr_size(leaf)); > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > Should be xfs_dir3_leaf_hdr_size(leaf) - 1, I think. Good catch. Fixed. (Not a bug, though, because of the 128 byte resolution of the dirty bit tracking. The dir2/dir3 leaf header size is 16/64 bytes, so we are always logging 128 bytes here regardless of the off-by-one.) > > @@ -1958,36 +2171,40 @@ xfs_dir2_node_to_leaf( > > * Now see if the leafn and free data will fit in a leaf1. > > * If not, release the buffer and give up. > > */ > > - if (xfs_dir2_leaf_size(&leaf->hdr, freehdr.nvalid) > mp->m_dirblksize) { > > + if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > mp->m_dirblksize) { > > xfs_trans_brelse(tp, fbp); > > return 0; > > } > > > > /* > > * If the leaf has any stale entries in it, compress them out. > > - * The compact routine will log the header. > > */ > > - if (be16_to_cpu(leaf->hdr.stale)) > > - xfs_dir2_leaf_compact(args, lbp); > > - else > > - xfs_dir2_leaf_log_header(tp, lbp); > > + if (leafhdr.stale) > > + xfs_dir3_leaf_compact(args, &leafhdr, lbp); > > > > - lbp->b_ops = &xfs_dir2_leaf1_buf_ops; > > - leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAF1_MAGIC); > > + lbp->b_ops = &xfs_dir3_leaf1_buf_ops; > > + leafhdr.magic = (leafhdr.magic == XFS_DIR2_LEAFN_MAGIC) > > + ? XFS_DIR2_LEAF1_MAGIC > > + : XFS_DIR3_LEAF1_MAGIC; > > An assert might be nice here: > > if (leafhdr.magic == XFS_DIR2_LEAFN_MAGIC) > leafhdr.magic = XFS_DIR2_LEAF1_MAGIC; > else { > ASSERT(leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); > leafhdr.magic = XFS_DIR3_LEAF1_MAGIC; > } No need, because 20 lines above is this: xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); Note that the *hdr_from_disk() functions all have asserts that validate the magic numbers of the blocks that passed to them. This code has an additional external assert because xfs_dir3_leaf_hdr_from_disk() converts both LEAF1 and LEAFN format blocks and hence we need to be explicit here that we expect LEAFN format. > > static bool > > xfs_dir3_free_verify( > > struct xfs_buf *bp) > > @@ -360,11 +385,19 @@ xfs_dir2_leaf_to_node( > > xfs_dir2_free_log_bests(tp, fbp, 0, freehdr.nvalid - 1); > > xfs_dir2_free_log_header(tp, fbp); > > > > - /* convert the leaf to a leafnode */ > > - leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); > > - lbp->b_ops = &xfs_dir2_leafn_buf_ops; > > - xfs_dir2_leaf_log_header(tp, lbp); > > - xfs_dir2_leafn_check(dp, lbp); > > + /* > > + * Converting the leaf to a leafnode is just a matter of changing the > > + * magic number and the ops. Do the change directly to the buffer as > > + * it's less work (and less code) than decoding the header to host > > + * format and back again. > > + */ > > + if (leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)) > > + leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); > > + else > > + leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); > > Here too might be a good spot for an assert in the else. We've already validated that we have a LEAF1 format node, so this code is just selecting the right LEAFN magic number. Adding an assert here doesn't add anything extra. > > static void > > xfs_dir2_free_hdr_check( > > struct xfs_mount *mp, > > @@ -510,15 +520,18 @@ xfs_dir2_leafn_lasthash( > > struct xfs_buf *bp, /* leaf buffer */ > > int *count) /* count of entries in leaf */ > > { > > - xfs_dir2_leaf_t *leaf; /* leaf structure */ > > + struct xfs_dir2_leaf *leaf = bp->b_addr; > > + struct xfs_dir2_leaf_entry *ents; > > + struct xfs_dir3_icleaf_hdr leafhdr; > > + > > + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); > > + ents = xfs_dir3_leaf_ents_p(leaf); > > > > - leaf = bp->b_addr; > > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > Looks like this assert has gone missing. It was intentionally more specific > than the one in xfs_dir3_leaf_hdr_from_disk, right? Yup, fixed. > > > @@ -547,16 +560,19 @@ xfs_dir2_leafn_lookup_for_addname( > > xfs_dir2_db_t newdb; /* new data block number */ > > xfs_dir2_db_t newfdb; /* new free block number */ > > xfs_trans_t *tp; /* transaction pointer */ > > + struct xfs_dir2_leaf_entry *ents; > > + struct xfs_dir3_icleaf_hdr leafhdr; > > > > dp = args->dp; > > tp = args->trans; > > mp = dp->i_mount; > > leaf = bp->b_addr; > > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > Here the assert is also missing, but it looks like it is handled below in > xfs_dir3_leaf_check. Maybe the above is similar. Yup, handled by xfs_dir3_leaf_check(). > > @@ -694,16 +710,19 @@ xfs_dir2_leafn_lookup_for_entry( > > xfs_dir2_db_t newdb; /* new data block number */ > > xfs_trans_t *tp; /* transaction pointer */ > > enum xfs_dacmp cmp; /* comparison result */ > > + struct xfs_dir2_leaf_entry *ents; > > + struct xfs_dir3_icleaf_hdr leafhdr; > > > > dp = args->dp; > > tp = args->trans; > > mp = dp->i_mount; > > leaf = bp->b_addr; > > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > Again. But you've also got xfs_dir3_leaf_check below, so maybe the first one is > the only issue. *nod* > > +xfs_dir3_leafn_moveents( > > + xfs_da_args_t *args, /* operation arguments */ > > + struct xfs_buf *bp_s, /* source */ > > + struct xfs_dir3_icleaf_hdr *shdr, > > + struct xfs_dir2_leaf_entry *sents, > > + int start_s,/* source leaf index */ > > + struct xfs_buf *bp_d, /* destination */ > > + struct xfs_dir3_icleaf_hdr *dhdr, > > + struct xfs_dir2_leaf_entry *dents, > > + int start_d,/* destination leaf index */ > > + int count) /* count of leaves to copy */ > > { > > - xfs_dir2_leaf_t *leaf_d; /* destination leaf structure */ > > - xfs_dir2_leaf_t *leaf_s; /* source leaf structure */ > > - int stale; /* count stale leaves copied */ > > - xfs_trans_t *tp; /* transaction pointer */ > > + int stale; > > I agree > /* transaction pointer */ > is a bit overkill but > /* count stale leaves copied */ > does help a new reader of this code. I figured it redundant with the comment where stale is counted: /* * If the source has stale leaves, count the ones in the copy range * so we can update the header correctly. */ Added it back, anyway. > > > @@ -922,21 +936,25 @@ xfs_dir2_leafn_moveents( > > */ > > int /* sort order */ > > xfs_dir2_leafn_order( > > - struct xfs_buf *leaf1_bp, /* leaf1 buffer */ > > - struct xfs_buf *leaf2_bp) /* leaf2 buffer */ > > + struct xfs_buf *leaf1_bp, /* leaf1 buffer */ > > + struct xfs_buf *leaf2_bp) /* leaf2 buffer */ > > { > > - xfs_dir2_leaf_t *leaf1; /* leaf1 structure */ > > - xfs_dir2_leaf_t *leaf2; /* leaf2 structure */ > > - > > - leaf1 = leaf1_bp->b_addr; > > - leaf2 = leaf2_bp->b_addr; > > - ASSERT(leaf1->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > - ASSERT(leaf2->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > These asserts are more specific than those in xfs_dir3_leaf_hdr_from_disk so > they should probably stay and have dirv3 magic added. Right, but there's higher layer validation of the magic numbers via xfs_dir3_leaf_check before/after this function is called, so the checking here is mostly redundant.... > > > @@ -1153,6 +1193,8 @@ xfs_dir2_leafn_remove( > > int needscan; /* need to rescan data frees */ > > xfs_trans_t *tp; /* transaction pointer */ > > struct xfs_dir2_data_free *bf; /* bestfree table */ > > + struct xfs_dir3_icleaf_hdr leafhdr; > > + struct xfs_dir2_leaf_entry *ents; > > > > trace_xfs_dir2_leafn_remove(args, index); > > > > @@ -1160,11 +1202,14 @@ xfs_dir2_leafn_remove( > > tp = args->trans; > > mp = dp->i_mount; > > leaf = bp->b_addr; > > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > Another assert that is more specific than what it is replaced with, but you do > have a leafn check, so that's something. Right, the leaf block is fully checked in the function, so this is covered. > > @@ -1366,6 +1413,8 @@ xfs_dir2_leafn_toosmall( > > xfs_da_blkinfo_t *info; /* leaf block header */ > > Looks like you can get rid of the info pointer now. Done. > > > @@ -1374,10 +1423,12 @@ xfs_dir2_leafn_toosmall( > > */ > > blk = &state->path.blk[state->path.active - 1]; > > info = blk->bp->b_addr; > > - ASSERT(info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > Another assert that is more specific than it's replacement. added a xfs_dir3_leaf_check() call. > > > @@ -1428,13 +1481,15 @@ xfs_dir2_leafn_toosmall( > > /* > > * Count bytes in the two blocks combined. > > */ > > - leaf = (xfs_dir2_leaf_t *)info; > > - count = be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); > > + count = leafhdr.count - leafhdr.stale; > > bytes = state->blocksize - (state->blocksize >> 2); > > + > > leaf = bp->b_addr; > > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > - count += be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); > > - bytes -= count * (uint)sizeof(leaf->ents[0]); > ^^^^^ > I wonder why that (uint) was added. sizeof() returns a size_t. A compiler/lint probably once complained about type mismatches. > > > @@ -1481,34 +1536,52 @@ xfs_dir2_leafn_unbalance( > > xfs_da_args_t *args; /* operation arguments */ > > xfs_dir2_leaf_t *drop_leaf; /* dead leaf structure */ > > xfs_dir2_leaf_t *save_leaf; /* surviving leaf structure */ > > + struct xfs_dir3_icleaf_hdr shdr; > > + struct xfs_dir3_icleaf_hdr dhdr; > > + struct xfs_dir2_leaf_entry *sents; > > + struct xfs_dir2_leaf_entry *dents; > > As I read this I really had a hard time not thinking 'source' and 'dest' > instead of 'save' and 'drop'. This would be more readable as the latter. Fixed. > > > > > args = state->args; > > ASSERT(drop_blk->magic == XFS_DIR2_LEAFN_MAGIC); > > ASSERT(save_blk->magic == XFS_DIR2_LEAFN_MAGIC); > > drop_leaf = drop_blk->bp->b_addr; > > save_leaf = save_blk->bp->b_addr; > > - ASSERT(drop_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > - ASSERT(save_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > More specific assert than its replacement. At the end, save_leaf is fully checked. And drop_leaf is now fully validated by the preivous call to xfs_dir2_leafn_toosmall(). So the asserts are redundant... > We used to check it in debug code. Might as well continue to do so. And we do ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 10 22:01:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 168E87FC6 for ; Wed, 10 Apr 2013 22:01:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 037A8304039 for ; Wed, 10 Apr 2013 20:01:00 -0700 (PDT) X-ASG-Debug-ID: 1365649258-04cbb057f83f490001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id aj4RLQ1nKlDPJtXh for ; Wed, 10 Apr 2013 20:00:59 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArgTAFImZlF5LMW7/2dsb2JhbABQgwY2gkW5ZYUcBAGBAhd0gh8BAQU6HCMQCAMYCSUPBSUDIROIEw2/HhWNZIEdB4JgYQOWf5EPgx0q Received: from ppp121-44-197-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.187]) by ipmail05.adl6.internode.on.net with ESMTP; 11 Apr 2013 12:30:58 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQ7kv-00054m-LS; Thu, 11 Apr 2013 13:00:57 +1000 Date: Thu, 11 Apr 2013 13:00:57 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy Message-ID: <20130411030057.GF10481@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy References: <20130410182438.268267840@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130410182438.268267840@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1365649258 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127776 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 10, 2013 at 01:24:24PM -0500, Mark Tinguely wrote: > Reserve fields in new inode layout for parent pointer and > allocation policy. Not without a design review - there is no way we are going to blindly reserve space in any on-disk structure without first having a solid design, published proof-of-concept code and agreement that the format changes being proposed are the right way to proceed. Where are the design docs/code for these features? > ---- > The inode will hold the parent information for the first > link to a file. Information for the other links will be > held in extended attribute entries. > > The "di_parino" is the inode of the parent directory. The > directory information for this entry is located the parent > directory with "di_paroff" offset. > > The di_parino/di_paroff concept code is running. How does it handle hard links? (i.e. multiple parents) Also, inode number is not enough for unique identification of the parent - generation number is also required. FWIW, lets go back to the (was almost finished) parent pointer code from 2009: http://oss.sgi.com/archives/xfs/2009-01/msg01068.html That uses xattrs to store parent information - inode #, generation #, and a counter - for each parent. It requires a counter because you can have the same inode hard linked into the same parent directory multiple times: typedef struct xfs_parent_eaname_rec { __be64 p_ino; __be32 p_gen; __be32 p_cnt; } xfs_parent_eaname_rec_t; And a transaction appended to the the inode create, link, rename and remove operations to manage the xattrs so all cases involving hard links work just fine. Indeed, the single di_parino/di_paroff concept was one of the original designs considered because of it's simplicity, but it was rejected because of that very simplicity - it cannot handle common use cases involving hardlinks. Release early, release often? > ---- > The "di_allocpolicy" will be used to remember the allocation > policy associated with this inode. This is exactly what we have padding in the inode for - so that future additions to the on-disk inode can be added via feature bits to indicate the fields are present. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 10 22:29:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 736637FD1 for ; Wed, 10 Apr 2013 22:29:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E6267AC001 for ; Wed, 10 Apr 2013 20:29:08 -0700 (PDT) X-ASG-Debug-ID: 1365650943-04cb6c2c1d3fd40001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 9tnUY128tt3Z7pHs for ; Wed, 10 Apr 2013 20:29:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AroTAGotZlF5LMW7/2dsb2JhbABGCoMGNoJFuWaFHAQBgQIXdIIfAQEEATocIwULCAMYCSUPBSUDIROIDgUNvxoVjUUQD4EYBQeDQQOWf5EPgx0qgS8 Received: from ppp121-44-197-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.187]) by ipmail05.adl6.internode.on.net with ESMTP; 11 Apr 2013 12:58:46 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQ8Bo-00057b-FT; Thu, 11 Apr 2013 13:28:44 +1000 Date: Thu, 11 Apr 2013 13:28:44 +1000 From: Dave Chinner To: Mark Tinguely Cc: Rich Johnston , Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy Message-ID: <20130411032844.GG10481@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy References: <20130410182438.268267840@sgi.com> <5165B5CB.2070203@sandeen.net> <5165BFF4.8020601@sgi.com> <5165CC39.2090108@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5165CC39.2090108@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1365650943 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127777 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 10, 2013 at 03:31:53PM -0500, Mark Tinguely wrote: > On 04/10/13 14:39, Rich Johnston wrote: > >On 04/10/2013 01:56 PM, Eric Sandeen wrote: > >>On 4/10/13 1:24 PM, Mark Tinguely wrote: > >>>The "di_allocpolicy" will be used to remember the allocation > >>>policy associated with this inode. > >> > >>can you say more about this allocation policy? > >> > >>-Eric > > > >No its super secret information. ;) > > > >Its on my plate Eric, because Mark was making a change for parent ptrs, > >I asked him to request space for allocation policies also. > > > >I don't have all the details yet but here is a very high level concept. The on-disk format is a low level detail that falls out at the bottom of the design/implementation/review cycle. It doesn't get defined by high level concepts... > >Identify allocation groups by names (or numbers -- preferably using names > >in user-visible areas), allowing many different areas. Placing the > >allocation > >policy outside of user programs is necessary for this to be successful. > > > >Current thoughts on proposed a layered allocation policies: > > > >Policy for the entire filesystem > >Policy attached to a directory (whose policy would be inherited by > >subdirectories when subdirectories are created) > >Policy for a single file > > > >The policy would define: > > > >where to place file data > >where to place metadata for the files. > >a prefered allocation group for placing file data (for directories). Which is a summary of what this code: > The allocation policies is based on work by Dave: > > http://oss.sgi.com/archives/xfs/2009-02/msg00250.html started with and was building on. What I was trying to get to in that patch series was an arbitrarily extensible allocation policy infrastructure, and that patch set was proof-of-concept code I used to flesh out ideas. Yes, it used 32 bits in the inode, but keep in mind that changed several times in the patch set as I implemented new stuff and changed heirarchies, definitions and concepts mid-patchset. But it isn't a reference design - it was a research vehicle..... Indeed, the patch set is an exact demonstration of the functionality required by the on-disk format not being properly understood until the functionality has at been fully implemented in a POC. And I hadn't got anywhere near that with the above patch set. As it is, I think that an extended attribute is be a better place for allocation policy information. An xattr is far easier to modify from userspace, and allows arbitrary allocator primitives being exposed to policy control. That was the problem with the above patch set - it didn't expose policy controls individually - it exposed them as a defined set, and only the sets defined by the kernel were possible. As such, direct control of locality is simply not possible with the above patch set. Having an attribute format that defines all the different control parameters allows userspace to define complex policies that match the specific storage topology of the system the policy is designed for. This is impossible to express in a standard kernel with the approach I was taking in the above patch set, and i was already thinking about xattr based primitives to allow fine-grained exposure of the allocation primitives I'd abstracted out of the kernel code... IOWs, We need to have agreement on design and implementation direction of a feature before we consider what the on-disk format is going to be, so reserving space on disk is extremely premature at this point.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From info3@sdhfindustrial.com Wed Apr 10 22:42:34 2013 Return-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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4024B7F50 for ; Wed, 10 Apr 2013 22:42:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CA73CAC001 for ; Wed, 10 Apr 2013 20:42:33 -0700 (PDT) X-ASG-Debug-ID: 1365651749-04bdf02d1f42700001-NocioJ Received: from smtp.chinaemail.cn (smtp.chinaemail.cn [218.5.74.238]) by cuda.sgi.com with ESMTP id 2Arz2bLGY6iEOPCH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 10 Apr 2013 20:42:30 -0700 (PDT) X-Barracuda-Envelope-From: info3@sdhfindustrial.com X-Barracuda-Apparent-Source-IP: 218.5.74.238 Received: from s406k.chinaemail.cn (unknown [118.244.204.93]) by smtp.chinaemail.cn (Postfix) with ESMTP id 812F819084D for ; Thu, 11 Apr 2013 11:42:28 +0800 (CST) Received: from 20100406-004 (unknown [111.226.170.0]) (Authenticated sender: info3@sdhfindustrial.com) by s406k.chinaemail.cn (Bossmail) with ESMTP id E7ECE4FA13 for ; Thu, 11 Apr 2013 11:42:22 +0800 (CST) From: "info3@sdhfindustrial.com" Subject: Nitrogen Fertilizer To: xfs@oss.sgi.com X-ASG-Orig-Subj: Nitrogen Fertilizer MIME-Version: 1.0 Reply-To: info3@sdhfindustrial.com Date: Thu, 11 Apr 2013 11:42:33 +0800 Priority: urgent X-Priority: 2 Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline X-MID: 1995754589.3214766151.80.1365651743.58280.6541 Message-Id: <20130411034222.E7ECE4FA13@s406k.chinaemail.cn> X-Rate: Yes X-Real-From: info3@sdhfindustrial.com X-Rcpt: ,xfs@oss.sgi.com, X-Mop-Send: ,info@sdhfindustrial.com, X-Barracuda-Connect: smtp.chinaemail.cn[218.5.74.238] X-Barracuda-Start-Time: 1365651750 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127777 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 rmpHTMLEdit

Dear&= nbsp;purchasing manager,= We are specializing in exporting fertilizer .
,Compound F= ertilizer,Nitrogen Fertilizer= ,= Organic Fertilizer,Other&nbs= p;Fertilizers,Phosphate Fertilizer,= Plant Food,Potassium F= ertilizer,Urea ect Look forward to = ;receiving your early inquiry.
Thanks&Regards

Carrie
Sales Manager 
<= /SPAN>

SHANDONG HUIFENG INDUST= RIAL LIMITED

Tel: +86-531-88348535=
E-mail:info3@sdhfindustrial.com
Add: NO.161 Jiefang Road Jina= n Shandong CHINA

From kvic45@gmail.com Thu Apr 11 00:25:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 760207FE0 for ; Thu, 11 Apr 2013 00:25:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 35344304043 for ; Wed, 10 Apr 2013 22:25:28 -0700 (PDT) X-ASG-Debug-ID: 1365657924-04bdf02d1f490d0001-NocioJ Received: from mail-we0-f176.google.com (mail-we0-f176.google.com [74.125.82.176]) by cuda.sgi.com with ESMTP id T8xFQpzLTAMGX5tR (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 10 Apr 2013 22:25:25 -0700 (PDT) X-Barracuda-Envelope-From: kvic45@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.176 Received: by mail-we0-f176.google.com with SMTP id s43so948093wey.35 for ; Wed, 10 Apr 2013 22:25:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=v1MmiYPMH5e9TSoWT8Y280czXqIOsRNutqhb4ee73LA=; b=RnGdn3qSeQGmQpEFttOglH/XOmJzMyzVQIMhipzmeiHXjbwELBLUEewZYH52y5BCAb BES4t5Odf5cKouuc3hrGN0E/kY7m/q2ZNfm6B/eezKb8rd4+dweZGv519nKSoev2Qtdu 495Wp3CE8kZz5XVfjGAFCUN/pW+vE8LQpox1K6Qu6rXtwyjd58Qd94WqGQzbTrpnkSnc Wesd8u5E4lrwLHKJonKX+n/GE5GEohpVXxYQS9ttQgH2p8Hm9lRLAZD0GSsGh7kNkKwo Jg6UQywPUQD2rQqsODRkf+QYnAmqYqAi7B3a+W6LNy4bytyi/z2gLZEWO+E7f0Sfigwk yLlQ== MIME-Version: 1.0 X-Received: by 10.194.109.35 with SMTP id hp3mr7927562wjb.15.1365657924600; Wed, 10 Apr 2013 22:25:24 -0700 (PDT) Received: by 10.216.102.197 with HTTP; Wed, 10 Apr 2013 22:25:24 -0700 (PDT) Date: Thu, 11 Apr 2013 13:25:24 +0800 Message-ID: Subject: xfs_repair breaks with assertion From: Victor K X-ASG-Orig-Subj: xfs_repair breaks with assertion To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e010d85747b098304da0f03ec X-Barracuda-Connect: mail-we0-f176.google.com[74.125.82.176] X-Barracuda-Start-Time: 1365657925 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127785 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 --089e010d85747b098304da0f03ec Content-Type: text/plain; charset=UTF-8 Hello, I'm trying to repair an XFS file system on our mdadm raid6 array after sudden system failure. Running xfs_repair /dev/md1 the first time resulted in suggestion to mount/unmount to replay log, but mounting would not work. After running xfs_repair -v -L -P /dev/md1 this happens: (lots of output on stderr, moving to Phase 3, then more output - not sure if it is relevant, the log file is ~170Mb in size), then stops and prints the only line on stdout: xfs_repair: dinode.c:768: process_bmbt_reclist_int: Assertion `i < *numrecs' failed. Aborted After inserting a printf before the assert, I get the following: i = 0, *numrecs = -570425343 for printf( "%d, %d") or i= 0, *numrecs = 3724541953 for printf("%ld, %ld) - makes me wonder if it's signed/unsigned int related both trips on if(i>*numrecs) conditional The filesystem size is 10Tb (7x2Tb disks in raid6) and it is about 8Tb full. xfsprogs version is 3.1.10 compiled from git source this morning. The system is Ubuntu 12.04.2 with kernel version 3.8.5. When I try to run xfs_metadump, it crashes: *** glibc detected *** xfs_db: double free or corruption (!prev): 0x0000000000da800 0 *** ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7f3d9501cb96] xfs_db[0x417383] xfs_db[0x41a941] xfs_db[0x419030] xfs_db[0x41a85c] xfs_db[0x419030] xfs_db[0x41b89e] xfs_db[0x4050c0] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f3d94fbf76d] xfs_db[0x4051c5] ======= Memory map: ======== 00400000-0046e000 r-xp 00000000 08:81 1837319 /usr/sbin/ xfs_db 0066d000-0066e000 r--p 0006d000 08:81 1837319 /usr/sbin/ xfs_db 0066e000-0066f000 rw-p 0006e000 08:81 1837319 /usr/sbin/ xfs_db 0066f000-00682000 rw-p 00000000 00:00 0 00d63000-00dc4000 rw-p 00000000 00:00 0 [heap] 7f3d94d88000-7f3d94d9d000 r-xp 00000000 08:81 2363486 /lib/x86_64-linux-gnu/libgcc_s.so.1 7f3d94d9d000-7f3d94f9c000 ---p 00015000 08:81 2363486 /lib/x86_64-linux-gnu/libgcc_s.so.1 7f3d94f9c000-7f3d94f9d000 r--p 00014000 08:81 2363486 /lib/x86_64-linux-gnu/libgcc_s.so.1 7f3d94f9d000-7f3d94f9e000 rw-p 00015000 08:81 2363486 /lib/x86_64-linux-gnu/libgcc_s.so.1 7f3d94f9e000-7f3d95153000 r-xp 00000000 08:81 2423054 /lib/x86_64-linux-gnu/libc-2.15.so 7f3d95153000-7f3d95352000 ---p 001b5000 08:81 2423054 /lib/x86_64-linux-gnu/libc-2.15.so 7f3d95352000-7f3d95356000 r--p 001b4000 08:81 2423054 /lib/x86_64-linux-gnu/libc-2.15.so 7f3d95356000-7f3d95358000 rw-p 001b8000 08:81 2423054 /lib/x86_64-linux-gnu/libc-2.15.so 7f3d95358000-7f3d9535d000 rw-p 00000000 00:00 0 7f3d9535d000-7f3d95375000 r-xp 00000000 08:81 2423056 /lib/x86_64-linux-gnu/libpthread-2.15.so 7f3d95375000-7f3d95574000 ---p 00018000 08:81 2423056 /lib/x86_64-linux-gnu/libpthread-2.15.so 7f3d95574000-7f3d95575000 r--p 00017000 08:81 2423056 /lib/x86_64-linux-gnu/libpthread-2.15.so 7f3d95575000-7f3d95576000 rw-p 00018000 08:81 2423056 /lib/x86_64-linux-gnu/libpthread-2.15.so 7f3d95576000-7f3d9557a000 rw-p 00000000 00:00 0 7f3d9557a000-7f3d9557e000 r-xp 00000000 08:81 2359972 /lib/x86_64-linux-gnu/libuuid.so.1.3.0 7f3d9557e000-7f3d9577d000 ---p 00004000 08:81 2359972 /lib/x86_64-linux-gnu/libuuid.so.1.3.0 7f3d9577d000-7f3d9577e000 r--p 00003000 08:81 2359972 /lib/x86_64-linux-gnu/libuuid.so.1.3.0 7f3d9577e000-7f3d9577f000 rw-p 00004000 08:81 2359972 /lib/x86_64-linux-gnu/libuuid.so.1.3.0 7f3d9577f000-7f3d957a1000 r-xp 00000000 08:81 2423068 /lib/x86_64-linux-gnu/ld-2.15.so 7f3d957ba000-7f3d957fb000 rw-p 00000000 00:00 0 7f3d957fb000-7f3d95985000 r--p 00000000 08:81 1967430 /usr/lib/locale/locale-archive 7f3d95985000-7f3d95989000 rw-p 00000000 00:00 0 7f3d9599d000-7f3d959a1000 rw-p 00000000 00:00 0 7f3d959a1000-7f3d959a2000 r--p 00022000 08:81 2423068 /lib/x86_64-linux-gnu/ld-2.15.so 7f3d959a2000-7f3d959a4000 rw-p 00023000 08:81 2423068 /lib/x86_64-linux-gnu/ld-2.15.so 7fffa80d8000-7fffa80f9000 rw-p 00000000 00:00 0 [stack] 7fffa8170000-7fffa8171000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] Aborted It produces a file of size 4325376 bytes - not sure if it's right, as I read about sizes of 80Mb for the dump file. If I try now (after running xfs_repair -L) to mount the fs read-only, it mounts but says some directories have structures that need cleaning, so the dirs are inaccessible. Any suggestion on how to possibly fix this? Thanks! Victor --089e010d85747b098304da0f03ec Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hello,

I'm trying to repair an XFS file s= ystem on our mdadm raid6 array after sudden system failure.
Running xfs_repair /dev/md1 the first time resulted in suggestion to mount= /unmount to replay log, but mounting would not work. After running xfs_repa= ir -v -L -P /dev/md1 this happens:
(lots of output on stderr, moving to Phase 3, then more output -= not sure if it is relevant, the log file is ~170Mb in size), then stops an= d prints the only line on stdout:

xfs_repair: dinode.c:768: process_bmbt_reclist_int: Assertion `i < = *numrecs' failed.
Aborted

Afte= r inserting a printf before the assert, I get the following:

i =3D 0, *numrecs =3D -570425343 =C2=A0for printf( &qu= ot;%d, %d")
or
i=3D 0, *numrecs = =3D 3724541953 =C2=A0for printf("%ld, %ld) - makes me wonder if it'= ;s signed/unsigned int related

both trips on if(i>*numrecs) condi= tional

The filesystem size is 10Tb (7x= 2Tb disks in raid6) and it is about 8Tb full.

xfsprogs version is 3.1.10 compiled from git source this morning= .

The system is Ubuntu 12.04.2 with ke= rnel version 3.8.5.

When I try to run = xfs_metadump, it crashes:
*** glibc detected *** xfs_db: double free or corruption (!= prev): 0x0000000000da800
0 ***
=3D=3D=3D=3D=3D=3D=3D Ba= cktrace: =3D=3D=3D=3D=3D=3D=3D=3D=3D
/lib/x86_64-linux-gnu/libc.s= o.6(+0x7eb96)[0x7f3d9501cb96]
xfs_db[0x417383]
xfs_db[0x41a941]
xfs_db[0x419030]=
xfs_db[0x41a85c]
xfs_db[0x419030]
xfs_db[0x4= 1b89e]
xfs_db[0x4050c0]
/lib/x86_64-linux-gnu/libc.so.6= (__libc_start_main+0xed)[0x7f3d94fbf76d]
xfs_db[0x4051c5]
=3D=3D=3D=3D=3D=3D=3D Memory map: =3D=3D=3D= =3D=3D=3D=3D=3D
00400000-0046e000 r-xp 00000000 08:81 1837319 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0/usr/sbin/
xfs_db
0066d000-0066e000= r--p 0006d000 08:81 1837319 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/usr/sbin/
xfs_db
0066e000-0066f000 rw-p 0006e000 08:81 1837319 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0/usr/sbin/
xfs_db
0066f000-006820= 00 rw-p 00000000 00:00 0
00d63000-00dc4000 rw-p 00000000 00:00 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[heap]
7f3d94d88000-7f3d94d9d000 r-xp 00000000 08:81 2363486 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gn= u/libgcc_s.so.1
7f3d94d9d000-7f3d94f9c000 ---p 00015000 08:81 236= 3486 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/= lib/x86_64-linux-gnu/libgcc_s.so.1
7f3d94f9c000-7f3d94f9d000 r--p 00014000 08:81 2363486 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gn= u/libgcc_s.so.1
7f3d94f9d000-7f3d94f9e000 rw-p 00015000 08:81 236= 3486 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/= lib/x86_64-linux-gnu/libgcc_s.so.1
7f3d94f9e000-7f3d95153000 r-xp 00000000 08:81 2423054 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gn= u/libc-2.15.so
7f3d95153000-7= f3d95352000 ---p 001b5000 08:81 2423054 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gnu/libc-2.15.so
7f3d95352000-7f3d95356000 r--p 001b4000 08:81 2423054 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gn= u/libc-2.15.so
7f3d95356000-7= f3d95358000 rw-p 001b8000 08:81 2423054 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gnu/libc-2.15.so
7f3d95358000-7f3d9535d000 rw-p 00000000 00:00 0
7f3d9535d000= -7f3d95375000 r-xp 00000000 08:81 2423056 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gnu/libpthread-2.15.so =C2=A0
7f3d95375000-7f3d95574000 ---p 00018000 08:81 2423056 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gn= u/libpthread-2.15.so =C2=A0
=
7f3d95574000-7f3d95575000 r--p 00017000 08:81 2423056 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gn= u/libpthread-2.15.so =C2=A0
7f3d95575000-7f3d95576000 rw-p 00018000 08:81 2423056 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gn= u/libpthread-2.15.so =C2=A0
=
7f3d95576000-7f3d9557a000 rw-p 00000000 00:00 0
7f3d9557a000-7f3d9557e000 r-xp 00000000 08:81 2359972 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gn= u/libuuid.so.1.3.0
7f3d9557e000-7f3d9577d000 ---p 00004000 08:81 = 2359972 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0/lib/x86_64-linux-gnu/libuuid.so.1.3.0
7f3d9577d000-7f3d9577e000 r--p 00003000 08:81 2359972 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gn= u/libuuid.so.1.3.0
7f3d9577e000-7f3d9577f000 rw-p 00004000 08:81 = 2359972 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0/lib/x86_64-linux-gnu/libuuid.so.1.3.0
7f3d9577f000-7f3d957a1000 r-xp 00000000 08:81 2423068 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gn= u/ld-2.15.so
7f3d957ba000-7f3d9= 57fb000 rw-p 00000000 00:00 0
7f3d957fb000-7f3d95985000 r--p 0000= 0000 08:81 1967430 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0/usr/lib/locale/locale-archive
7f3d95985000-7f3d95989000 rw-p 00000000 00:00 0
7f3d9599d000= -7f3d959a1000 rw-p 00000000 00:00 0
7f3d959a1000-7f3d959a2000 r--= p 00022000 08:81 2423068 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gnu/ld-= 2.15.so
7f3d959a2000-7f3d959a4000 rw-p 00023000 08:81 2423068 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/lib/x86_64-linux-gn= u/ld-2.15.so
7fffa80d8000-7fffa= 80f9000 rw-p 00000000 00:00 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[stack]
7fffa8170000-7fffa8171000 r-xp 00000000 00:00 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[vdso]=
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[vsyscall]
Aborted

It produces a file of size=C2=A04325376 bytes - not sure if it&#= 39;s right, as I read about sizes of 80Mb for the dump file.

If I try now (after running xfs_repair -L) to mount = the fs read-only, it mounts but says some directories have structures that = need cleaning, so the dirs are inaccessible.

Any suggestion on how to possibly fix this?=

Thanks!
Victor
<= div style>

--089e010d85747b098304da0f03ec-- From david@fromorbit.com Thu Apr 11 01:25:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6EE887FE0 for ; Thu, 11 Apr 2013 01:25:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 45E468F8050 for ; Wed, 10 Apr 2013 23:25:22 -0700 (PDT) X-ASG-Debug-ID: 1365661519-04cbb057f84b350001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id jHX5hskbPQtSrzqO for ; Wed, 10 Apr 2013 23:25:20 -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: ArYTAMZWZlF5LJ67/2dsb2JhbABQgwaCe7llhRwEAYEBF3SCHwEBBAEnExwjBQsIAxUDCSUPBSUDIROIDgW/IRWNNi6BHQeDQQOWf4l2hxmDHSqBMCQ Received: from ppp121-44-158-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.187]) by ipmail07.adl2.internode.on.net with ESMTP; 11 Apr 2013 15:55:16 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQAwd-0005Pb-7h; Thu, 11 Apr 2013 16:25:15 +1000 Date: Thu, 11 Apr 2013 16:25:15 +1000 From: Dave Chinner To: Victor K Cc: xfs@oss.sgi.com Subject: Re: xfs_repair breaks with assertion Message-ID: <20130411062515.GH10481@dastard> X-ASG-Orig-Subj: Re: xfs_repair breaks with assertion 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: 1365661519 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127789 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 11, 2013 at 01:25:24PM +0800, Victor K wrote: > Hello, > > I'm trying to repair an XFS file system on our mdadm raid6 array after > sudden system failure. > Running xfs_repair /dev/md1 the first time resulted in suggestion to > mount/unmount to replay log, but mounting would not work. After running > xfs_repair -v -L -P /dev/md1 this happens: > (lots of output on stderr, moving to Phase 3, then more output - not sure > if it is relevant, the log file is ~170Mb in size), then stops and prints > the only line on stdout: Oh dear. A log file that big indicates that something *bad* has happened to the array. i.e that it has most likely been put back together wrong. Before going any further with xfs_repair, please verify that the array has been put back together correctly.... > xfs_repair: dinode.c:768: process_bmbt_reclist_int: Assertion `i < > *numrecs' failed. > Aborted > > After inserting a printf before the assert, I get the following: > > i = 0, *numrecs = -570425343 for printf( "%d, %d") > or > i= 0, *numrecs = 3724541953 for printf("%ld, %ld) - makes me wonder if > it's signed/unsigned int related numrecs is way out of the normal range, so that's probably what is triggering it. i.e this in process_exinode(): numrecs = XFS_DFORK_NEXTENTS(dip, whichfork); is where the bad number is coming from, and that implies a corrupted inode. it's a __be32 on disk, the kernel considers it a xfs_extnum_t in memory which is a int32_t because: #define NULLEXTNUM ((xfs_extnum_t)-1) So, negative numbers on disk are invalid. .... The patch below should fix the assert failure. > If I try now (after running xfs_repair -L) to mount the fs read-only, it > mounts but says some directories have structures that need cleaning, so the > dirs are inaccessible. > > Any suggestion on how to possibly fix this? I suspect you've damaged it beyond repair now. If the array was put back together incorrectly in the first place (which is likely given the damage being reported), then you've made the problem a whole lot worse by writing to it in an attempt to repair it. I'd suggest that you make sure the array is correctly repaired/ordered/reocvered before doing anything else, then running xfs_repair on what is left and hoping for the best. Even after repair is finished, you'll need to go through all the data with a fine toothed comb to work out what has been lost, corrupted or overwritten with zeros or other stuff. I suspect you'll be reaching for the backup tapes long before you get that far, though... Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs_repair: validate on-disk extent count better From: Dave Chinner When scanning a btree format inode, we trust the extent count to be in range. However, values of the range 2^31 <= cnt < 2^32 are invalid and can cause problems with signed range checks. This results in assert failures which validating the extent count such as: xfs_repair: dinode.c:768: process_bmbt_reclist_int: Assertion `i < *numrecs' failed. Validate the extent count is at least within the positive range of a singed 32 bit integer before using it. Signed-off-by: Dave Chinner --- repair/dinode.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index 5a2da39..239bb7b 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -1293,7 +1293,7 @@ process_exinode( xfs_bmbt_rec_t *rp; xfs_dfiloff_t first_key; xfs_dfiloff_t last_key; - int numrecs; + int32_t numrecs; int ret; lino = XFS_AGINO_TO_INO(mp, agno, ino); @@ -1302,6 +1302,15 @@ process_exinode( numrecs = XFS_DFORK_NEXTENTS(dip, whichfork); /* + * We've already decided on the maximum number of extents on the inode, + * and numrecs may be corrupt. Hence make sure we only allow numrecs to + * be in the range of valid on-disk numbers, which is: + * 0 < numrecs < 2^31 - 1 + */ + if (numrecs < 0) + numrecs = *nex; + + /* * XXX - if we were going to fix up the btree record, * we'd do it right here. For now, if there's a problem, * we'll bail out and presumably clear the inode. @@ -2038,11 +2047,23 @@ process_inode_data_fork( { xfs_ino_t lino = XFS_AGINO_TO_INO(mp, agno, ino); int err = 0; + int nex; + + /* + * extent count on disk is only valid for positive values. The kernel + * uses negative values in memory. hence if we see negative numbers + * here, trash it! + */ + nex = be32_to_cpu(dino->di_nextents); + if (nex < 0) + *nextents = 1; + else + *nextents = nex; - *nextents = be32_to_cpu(dino->di_nextents); if (*nextents > be64_to_cpu(dino->di_nblocks)) *nextents = 1; + if (dino->di_format != XFS_DINODE_FMT_LOCAL && type != XR_INO_RTDATA) *dblkmap = blkmap_alloc(*nextents, XFS_DATA_FORK); *nextents = 0; From kvic45@gmail.com Thu Apr 11 01:34:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 02EC67FE2 for ; Thu, 11 Apr 2013 01:34:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E28E7304032 for ; Wed, 10 Apr 2013 23:34:35 -0700 (PDT) X-ASG-Debug-ID: 1365662073-04cbb057f54bc60001-NocioJ Received: from mail-wi0-f173.google.com (mail-wi0-f173.google.com [209.85.212.173]) by cuda.sgi.com with ESMTP id PNuQHkpA7hQU4V7W (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 10 Apr 2013 23:34:34 -0700 (PDT) X-Barracuda-Envelope-From: kvic45@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.173 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.173] Received: by mail-wi0-f173.google.com with SMTP id ez12so191547wid.12 for ; Wed, 10 Apr 2013 23:34:33 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.173] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.173] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=83I0kNYNQhbSNKIL7y/w8J2Di+a5OzMxavddIVcn8hg=; b=XZgAseAaulxym7iV4Fur3RTNoztr+P4qktRHIfHnzvzLhwzNn+GLg/GCDCfWLDImAn 8kIcoB0sj9T8D5eXcxEFJTahX4GMP9WsduHRgESsZrnZg1Imb/ledayYQkkHosLTKGmh 5AypxNflt8f6v6RKe0jqM0r8iSwtbVbd3Omyp572JBWpYH5Ny30WAxbm/25CpCjA8z1X dY6vkZ+BAnR/r6+Qif0nbT7dgPWnBqEPBxNZDoe33yGmBOCTVU8jbdhhVKGE6VcaTgYu oOZvZ/j74sH/dQz0N67mQL4+MpB0lIlI6jBRdHlk9FtUUoKXTk3dl007Q6a5dJPAX18H cPyw== MIME-Version: 1.0 X-Received: by 10.180.92.229 with SMTP id cp5mr15518519wib.20.1365662072997; Wed, 10 Apr 2013 23:34:32 -0700 (PDT) Received: by 10.216.102.197 with HTTP; Wed, 10 Apr 2013 23:34:32 -0700 (PDT) In-Reply-To: <20130411062515.GH10481@dastard> References: <20130411062515.GH10481@dastard> Date: Thu, 11 Apr 2013 14:34:32 +0800 Message-ID: Subject: Re: xfs_repair breaks with assertion From: Victor K X-ASG-Orig-Subj: Re: xfs_repair breaks with assertion To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=f46d043c094ebe8cca04da0ffa16 X-Barracuda-Connect: mail-wi0-f173.google.com[209.85.212.173] X-Barracuda-Start-Time: 1365662073 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127789 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 --f46d043c094ebe8cca04da0ffa16 Content-Type: text/plain; charset=UTF-8 > Running xfs_repair /dev/md1 the first time resulted in suggestion to > > mount/unmount to replay log, but mounting would not work. After running > > xfs_repair -v -L -P /dev/md1 this happens: > > (lots of output on stderr, moving to Phase 3, then more output - not sure > > if it is relevant, the log file is ~170Mb in size), then stops and prints > > the only line on stdout: > > Oh dear. A log file that big indicates that something *bad* has > happened to the array. i.e that it has most likely been put back > together wrong. > > Before going any further with xfs_repair, please verify that the > array has been put back together correctly.... > > The raid array did not suffer, at least, not according to mdadm; it is now happily recovering the one disk that officially failed, but the whole thing assembled without a problem There was a similar crash several weeks ago on this same array, but had ext4 system back then. I was able to save some of the latest stuff, and decided to move to xfs as something more reliable. I suspect now I should also had replaced the disk controller then. > > xfs_repair: dinode.c:768: process_bmbt_reclist_int: Assertion `i < > > *numrecs' failed. > > Aborted > > > > After inserting a printf before the assert, I get the following: > > > > i = 0, *numrecs = -570425343 for printf( "%d, %d") > > or > > i= 0, *numrecs = 3724541953 for printf("%ld, %ld) - makes me wonder if > > it's signed/unsigned int related > > numrecs is way out of the normal range, so that's probably what is > triggering it. > > i.e this in process_exinode(): > > numrecs = XFS_DFORK_NEXTENTS(dip, whichfork); > > is where the bad number is coming from, and that implies a corrupted > inode. it's a __be32 on disk, the kernel considers it a xfs_extnum_t > in memory which is a int32_t because: > > #define NULLEXTNUM ((xfs_extnum_t)-1) > > So, negative numbers on disk are invalid. > .... > > The patch below should fix the assert failure. > > I'll try it - don't really have other options at the moment > > If I try now (after running xfs_repair -L) to mount the fs read-only, it > > mounts but says some directories have structures that need cleaning, so > the > > dirs are inaccessible. > > > > Any suggestion on how to possibly fix this? > > I suspect you've damaged it beyond repair now. > > If the array was put back together incorrectly in the first place > (which is likely given the damage being reported), then > you've made the problem a whole lot worse by writing to it in an > attempt to repair it. > > I'd suggest that you make sure the array is correctly > repaired/ordered/reocvered before doing anything else, then > running xfs_repair on what is left and hoping for the best. Even after > repair is finished, you'll need to go through all the data with a > fine toothed comb to work out what has been lost, corrupted or > overwritten with zeros or other stuff. > > I suspect you'll be reaching for the backup tapes long before you > get that far, though... > Well, we'll see how it goes. Thanks for the patch and the quick reply! Sincerely, Victor > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > > xfs_repair: validate on-disk extent count better > > From: Dave Chinner > > When scanning a btree format inode, we trust the extent count to be > in range. However, values of the range 2^31 <= cnt < 2^32 are > invalid and can cause problems with signed range checks. This > results in assert failures which validating the extent count such > as: > > xfs_repair: dinode.c:768: process_bmbt_reclist_int: Assertion `i < > *numrecs' failed. > > Validate the extent count is at least within the positive range of a > singed 32 bit integer before using it. > > Signed-off-by: Dave Chinner > --- > repair/dinode.c | 25 +++++++++++++++++++++++-- > 1 file changed, 23 insertions(+), 2 deletions(-) > > diff --git a/repair/dinode.c b/repair/dinode.c > index 5a2da39..239bb7b 100644 > --- a/repair/dinode.c > +++ b/repair/dinode.c > @@ -1293,7 +1293,7 @@ process_exinode( > xfs_bmbt_rec_t *rp; > xfs_dfiloff_t first_key; > xfs_dfiloff_t last_key; > - int numrecs; > + int32_t numrecs; > int ret; > > lino = XFS_AGINO_TO_INO(mp, agno, ino); > @@ -1302,6 +1302,15 @@ process_exinode( > numrecs = XFS_DFORK_NEXTENTS(dip, whichfork); > > /* > + * We've already decided on the maximum number of extents on the > inode, > + * and numrecs may be corrupt. Hence make sure we only allow > numrecs to > + * be in the range of valid on-disk numbers, which is: > + * 0 < numrecs < 2^31 - 1 > + */ > + if (numrecs < 0) > + numrecs = *nex; > + > + /* > * XXX - if we were going to fix up the btree record, > * we'd do it right here. For now, if there's a problem, > * we'll bail out and presumably clear the inode. > @@ -2038,11 +2047,23 @@ process_inode_data_fork( > { > xfs_ino_t lino = XFS_AGINO_TO_INO(mp, agno, ino); > int err = 0; > + int nex; > + > + /* > + * extent count on disk is only valid for positive values. The > kernel > + * uses negative values in memory. hence if we see negative numbers > + * here, trash it! > + */ > + nex = be32_to_cpu(dino->di_nextents); > + if (nex < 0) > + *nextents = 1; > + else > + *nextents = nex; > > - *nextents = be32_to_cpu(dino->di_nextents); > if (*nextents > be64_to_cpu(dino->di_nblocks)) > *nextents = 1; > > + > if (dino->di_format != XFS_DINODE_FMT_LOCAL && type != > XR_INO_RTDATA) > *dblkmap = blkmap_alloc(*nextents, XFS_DATA_FORK); > *nextents = 0; > --f46d043c094ebe8cca04da0ffa16 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
> Running xfs_repair= /dev/md1 the first time resulted in suggestion to
> mount/unmount to replay log, but mounting would not work. After runnin= g
> xfs_repair -v -L -P /dev/md1 this happens:
> (lots of output on stderr, moving to Phase 3, then more output - not s= ure
> if it is relevant, the log file is ~170Mb in size), then stops and pri= nts
> the only line on stdout:

Oh dear. A log file that big indicates that something *bad* has
happened to the array. i.e that it has most likely been put back
together wrong.

Before going any further with xfs_repair, please verify that the
array has been put back together correctly....


The raid= array did not suffer, at least, not according to mdadm; it is now happily = recovering the one disk that officially failed, but the whole thing assembl= ed without a problem
There was a similar crash several weeks ago on this same array, = but had ext4 system back then.
I was able to save some of t= he latest stuff, and decided to move to xfs as something more reliable.
I suspect now I should also had replaced the disk controller the= n.
=C2=A0
> xfs_repair: dinode.c:768: process_bmbt_reclist_int: Assertion `i <<= br> > *numrecs' failed.
> Aborted
>
> After inserting a printf before the assert, I get the following:
>
> i =3D 0, *numrecs =3D -570425343 =C2=A0for printf( "%d, %d")=
> or
> i=3D 0, *numrecs =3D 3724541953 =C2=A0for printf("%ld, %ld) - mak= es me wonder if
> it's signed/unsigned int related

numrecs is way out of the normal range, so that's probably what i= s
triggering it.

i.e this in process_exinode():

=C2=A0 =C2=A0 =C2=A0 =C2=A0 numrecs =3D XFS_DFORK_NEXTENTS(dip, whichfork);=

is where the bad number is coming from, and that implies a corrupted
inode. it's a __be32 on disk, the kernel considers it a xfs_extnum_t in memory which is a int32_t because:

#define NULLEXTNUM =C2=A0 =C2=A0 =C2=A0((xfs_extnum_t)-1)

So, negative numbers on disk are invalid.
....

The patch below should fix the assert failure.


I'll= try it - don't really have other options at the moment
=C2=A0
> If I try now (after running xfs_repair -L) to mount the fs read-only, = it
> mounts but says some directories have structures that need cleaning, s= o the
> dirs are inaccessible.
>
> Any suggestion on how to possibly fix this?

I suspect you've damaged it beyond repair now.

If the array was put back together incorrectly in the first place
(which is likely given the damage being reported), then
you've made the problem a whole lot worse by writing to it in an
attempt to repair it.

I'd suggest that you make sure the array is correctly
repaired/ordered/reocvered before doing anything else, then
running xfs_repair on what is left and hoping for the best. Even after
repair is finished, you'll need to go through all the data with a
fine toothed comb to work out what has been lost, corrupted or
overwritten with zeros or other stuff.

I suspect you'll be reaching for the backup tapes long before you
get that far, though...


Well, we'll see how it goes.

Thanks for the patch and the quick reply!

Sincerely,
Victor
=C2=A0

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com


xfs_repair: validate on-disk extent count better

From: Dave Chinner <dchinner@redh= at.com>

When scanning a btree format inode, we trust the extent count to be
in range. =C2=A0However, values of the range 2^31 <=3D cnt < 2^32 are=
invalid and can cause problems with signed range checks. This
results in assert failures which validating the extent count such
as:

xfs_repair: dinode.c:768: process_bmbt_reclist_int: Assertion `i < *numr= ecs' failed.

Validate the extent count is at least within the positive range of a<= br> singed 32 bit integer before using it.

Signed-off-by: Dave Chinner <dchi= nner@redhat.com>
---
=C2=A0repair/dinode.c | =C2=A0 25 +++++++++++++++++++++++--
=C2=A01 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/repair/dinode.c b/repair/dinode.c
index 5a2da39..239bb7b 100644
--- a/repair/dinode.c
+++ b/repair/dinode.c
@@ -1293,7 +1293,7 @@ process_exinode(
=C2=A0 =C2=A0 =C2=A0 =C2=A0 xfs_bmbt_rec_t =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0*rp;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 xfs_dfiloff_t =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 first_key;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 xfs_dfiloff_t =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 last_key;
- =C2=A0 =C2=A0 =C2=A0 int =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 numrecs;
+ =C2=A0 =C2=A0 =C2=A0 int32_t =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 numrecs;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 ret;

=C2=A0 =C2=A0 =C2=A0 =C2=A0 lino =3D XFS_AGINO_TO_INO(mp, agno, ino);
@@ -1302,6 +1302,15 @@ process_exinode(
=C2=A0 =C2=A0 =C2=A0 =C2=A0 numrecs =3D XFS_DFORK_NEXTENTS(dip, whichfork);=

=C2=A0 =C2=A0 =C2=A0 =C2=A0 /*
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0* We've already decided on the maximum num= ber of extents on the inode,
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0* and numrecs may be corrupt. Hence make sure = we only allow numrecs to
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0* be in the range of valid on-disk numbers, wh= ich is:
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0* =C2=A0 =C2=A0 =C2=A00 < numrecs < 2^31= - 1
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0*/
+ =C2=A0 =C2=A0 =C2=A0 if (numrecs < 0)
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 numrecs =3D *nex;
+
+ =C2=A0 =C2=A0 =C2=A0 /*
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* XXX - if we were going to fix up the bt= ree record,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* we'd do it right here. =C2=A0For no= w, if there's a problem,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* we'll bail out and presumably clear= the inode.
@@ -2038,11 +2047,23 @@ process_inode_data_fork(
=C2=A0{
=C2=A0 =C2=A0 =C2=A0 =C2=A0 xfs_ino_t =C2=A0 =C2=A0 =C2=A0 lino =3D XFS_AGI= NO_TO_INO(mp, agno, ino);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 e= rr =3D 0;
+ =C2=A0 =C2=A0 =C2=A0 int =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 nex; +
+ =C2=A0 =C2=A0 =C2=A0 /*
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0* extent count on disk is only valid for posit= ive values. The kernel
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0* uses negative values in memory. hence if we = see negative numbers
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0* here, trash it!
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0*/
+ =C2=A0 =C2=A0 =C2=A0 nex =3D be32_to_cpu(dino->di_nextents);
+ =C2=A0 =C2=A0 =C2=A0 if (nex < 0)
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *nextents =3D 1;
+ =C2=A0 =C2=A0 =C2=A0 else
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *nextents =3D nex;

- =C2=A0 =C2=A0 =C2=A0 *nextents =3D be32_to_cpu(dino->di_nextents);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (*nextents > be64_to_cpu(dino->di_nblo= cks))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *nextents =3D 1;
+
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (dino->di_format !=3D XFS_DINODE_FMT_LOCA= L && type !=3D XR_INO_RTDATA)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *dblkmap =3D blkmap= _alloc(*nextents, XFS_DATA_FORK);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 *nextents =3D 0;

--f46d043c094ebe8cca04da0ffa16-- From david@fromorbit.com Thu Apr 11 02:02:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 22DC37FA1 for ; Thu, 11 Apr 2013 02:02:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AAD2CAC001 for ; Thu, 11 Apr 2013 00:02:04 -0700 (PDT) X-ASG-Debug-ID: 1365663722-04bdf02d1d4fc40001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id R0G19H7O15ETy7rE for ; Thu, 11 Apr 2013 00:02:03 -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: ArYTAC5fZlF5LJ67/2dsb2JhbABQgwaCe7llhRwEAYEAF3SCHwEBBAE6HCMFCwgDGAklDwUlAyETiA4FvysVjVUPgR0Hg0EDln+JdocZgx0qgS8BHgY Received: from ppp121-44-158-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.187]) by ipmail07.adl2.internode.on.net with ESMTP; 11 Apr 2013 16:32:02 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQBWD-0005Tg-G7; Thu, 11 Apr 2013 17:02:01 +1000 Date: Thu, 11 Apr 2013 17:02:01 +1000 From: Dave Chinner To: Victor K Cc: xfs@oss.sgi.com Subject: Re: xfs_repair breaks with assertion Message-ID: <20130411070201.GI10481@dastard> X-ASG-Orig-Subj: Re: xfs_repair breaks with assertion References: <20130411062515.GH10481@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: 1365663722 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127792 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Thu, Apr 11, 2013 at 02:34:32PM +0800, Victor K wrote: > > Running xfs_repair /dev/md1 the first time resulted in suggestion to > > > > mount/unmount to replay log, but mounting would not work. After running > > > xfs_repair -v -L -P /dev/md1 this happens: > > > (lots of output on stderr, moving to Phase 3, then more output - not sure > > > if it is relevant, the log file is ~170Mb in size), then stops and prints > > > the only line on stdout: > > > > Oh dear. A log file that big indicates that something *bad* has > > happened to the array. i.e that it has most likely been put back > > together wrong. > > > > Before going any further with xfs_repair, please verify that the > > array has been put back together correctly.... > > > > > The raid array did not suffer, at least, not according to mdadm; it is now > happily recovering the one disk that officially failed, but the whole thing > assembled without a problem Yeah, we see this often enough that all I can say is this: don't trust what mdadm is telling you. Validate it by hand. Massive corruption does not occur when everything is put back together correctly. > There was a similar crash several weeks ago on this same array, but had > ext4 system back then. > I was able to save some of the latest stuff, and decided to move to xfs as > something more reliable. If the storage below the filesystem is unreliable, then changing filesystems won't magically fix the problem. > I suspect now I should also had replaced the disk controller then. Well, that depends on whether it is the problem or not. if you are not using hardware raid, then disk controller problems rarely result in massive corruption of filesystems. A busted block here or there, but they generally do not cause entire disks to suddenly becoe corrupted. I'd still be looking to a RAID reassembly problem than a filesystem or a storage hardware issue... Cheers, Dave. -- Dave Chinner david@fromorbit.com From service-client@enfr2-18.com Thu Apr 11 02:32:38 2013 Return-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.8 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,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 66E2C7F4C for ; Thu, 11 Apr 2013 02:32:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CA18CAC002 for ; Thu, 11 Apr 2013 00:32:37 -0700 (PDT) X-ASG-Debug-ID: 1365665553-04cbb057f74fa50001-NocioJ Received: from s4.enfr2-18.com (s4.enfr2-18.com [37.59.170.22]) by cuda.sgi.com with ESMTP id gdiuXl0gx85hCtkv for ; Thu, 11 Apr 2013 00:32:33 -0700 (PDT) X-Barracuda-Envelope-From: service-client@enfr2-18.com X-Barracuda-Apparent-Source-IP: 37.59.170.22 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=enfr2-18.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@enfr2-18.com; bh=gpBD2uYA2AC7BxZbS6XtjYsIm9/pw/zZS8jmyerfDIA=; b=E4YSTtnUEmOX/ytJYps4V3bcLxcqCvbPpATbwpTBT9mnH5ctXH3F8uzZZ3Ef9uAqIdzPckhMNPu9 GmmoVbV5f7KCD12tJpZZT9ze4fJeLCvk9zR+IfM6sBjV1z976CQQQJ4Y2e+5NdL2Ewlr65A3EeWH 6dOJ4qitSBEigh7rWoc= From: Sexy Avenue X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 39649 X-EN-uuid: 218-021839649-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Prix casses, stocks limites : depechez vous ! MIME-Version: 1.0 X-ASG-Orig-Subj: Prix casses, stocks limites : depechez vous ! List-Unsubscribe: http://www.enfr2-18.com/s716zM3GIsdtQT1shJaIwBz8WiA8CuUXq2FwnJ56eu4.html, Content-Type: multipart/alternative; boundary=a6a69abafc18de98e8c6d3f89bfdd04e Message-ID: <0.0.125.F2D.1CE3686BB243A5E.0@s4.enfr2-18.com> Date: Thu, 11 Apr 2013 09:32:33 +0200 X-Barracuda-Connect: s4.enfr2-18.com[37.59.170.22] X-Barracuda-Start-Time: 1365665553 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.80 X-Barracuda-Spam-Status: No, SCORE=0.80 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_02, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127793 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_MOSTLY BODY: Multipart message mostly text/html MIME 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary --a6a69abafc18de98e8c6d3f89bfdd04e Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --a6a69abafc18de98e8c6d3f89bfdd04e Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit Vente privée de plugs jusqu'à -50% !

  Une semaine seulement pour se faire plaisir à mini prix , je fonce !
SexyAvenue.com
Lingerie Sextoys Bien-être Aphrodisiaques Librairie/jeux DVD
S.Avenue
Ventes privées
Découvrez notre vente en cours !
Les Plugs Jusqu à -50%
 Du 10 au 17 Mars à partir de 9H00
Accédez à la vente
Offre valable dans la limite des stocks disponibles jusqu'au 17/04/2013 9H00.
Notre offre est réservée aux adultes.

Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From service-client@enfr2-18.com Thu Apr 11 02:51:41 2013 Return-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.7 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,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 D1A2B7F86 for ; Thu, 11 Apr 2013 02:51:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A315C304039 for ; Thu, 11 Apr 2013 00:51:41 -0700 (PDT) X-ASG-Debug-ID: 1365666698-04cbb057f8513b0001-NocioJ Received: from s4.enfr2-18.com (s4.enfr2-18.com [37.59.170.22]) by cuda.sgi.com with ESMTP id 44OAaqHvy4A1Gdch for ; Thu, 11 Apr 2013 00:51:39 -0700 (PDT) X-Barracuda-Envelope-From: service-client@enfr2-18.com X-Barracuda-Apparent-Source-IP: 37.59.170.22 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=enfr2-18.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@enfr2-18.com; bh=beclR7IvODJed/l5KIAOtUH0vUh+h8MfA0cDjvRt2EE=; b=K4wI+yZaaBd72HgKVLGwyJCmP1e04boBP8vfEy8ZG0TOLJ+GSi5+xfPd2yEUkHdXHfAcBUFdO7HV reVCxsgVVhR6lujzvxsQjBGOnMeAiI+izKzP1BSofg4sdYgdUTOiNzl+nX+/7UNEFjKJaqF7u/9k hph572S/WR3oTEVy+8s= From: AFPA X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 39708 X-EN-uuid: 218-021839708-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Decouvrez les formations en alternance MIME-Version: 1.0 X-ASG-Orig-Subj: Decouvrez les formations en alternance List-Unsubscribe: http://www.enfr2-18.com/5zxrx3TZ7LqWdgP2FBaCeQN6vIYGKIuXZkOOvytX-wg.html, Content-Type: multipart/alternative; boundary=3e4e3580651403dad8cd339044b31125 Message-ID: <0.0.F1.136.1CE368965DC5128.0@s4.enfr2-18.com> Date: Thu, 11 Apr 2013 09:51:38 +0200 X-Barracuda-Connect: s4.enfr2-18.com[37.59.170.22] X-Barracuda-Start-Time: 1365666698 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.41 X-Barracuda-Spam-Status: No, SCORE=0.41 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127796 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_MOSTLY BODY: Multipart message mostly text/html MIME 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary --3e4e3580651403dad8cd339044b31125 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --3e4e3580651403dad8cd339044b31125 Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit Optez pour les formations en Alternance de l'AFPA

D?couvrez les formations en alternance AFPA d?s maintenant

Découvrez Alternance + Pro

1 formation1 diplôme1 expérience


Les formations + PRO vous forment
dans les secteurs qui recrutent

Devenez des professionnels qualifiés
avec un diplôme de qualité

Les formations de l´AFPA sont reconnues
par les employeurs

Cliquez-ici pour d?couvrir les avantages des formations AFPA + PRO Pour découvrir les avantages
des formations AFPA + Pro

Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From david@fromorbit.com Thu Apr 11 04:45:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 77A687FB8 for ; Thu, 11 Apr 2013 04:45:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 54AE630405F for ; Thu, 11 Apr 2013 02:45:15 -0700 (PDT) X-ASG-Debug-ID: 1365673513-04bdf02d205e900001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id DMqZIYXQVUcerLOU for ; Thu, 11 Apr 2013 02:45:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq4TAOOEZlF5LJ67/2dsb2JhbABQgwaCe7llhRwEgQEXdIIyJgEjOyQ0BSUDNIgTnG+hVxWNZIE6gysDln+RD4MdKg Received: from ppp121-44-158-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.187]) by ipmail07.adl2.internode.on.net with ESMTP; 11 Apr 2013 19:15:13 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQE48-0005n5-CY for xfs@oss.sgi.com; Thu, 11 Apr 2013 19:45:12 +1000 Date: Thu, 11 Apr 2013 19:45:12 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: xfstests: heads up about coreutils v8.20+ related failures Message-ID: <20130411094512.GL10481@dastard> X-ASG-Orig-Subj: xfstests: heads up about coreutils v8.20+ related failures MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit 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: 1365673513 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127801 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Folks, Debian unstable just transistined to coreutils v8.20 recently, ad this has caused a bunch of tests to fail due to golden output mismatches. A while back, various GNU projects have decided to use the gcc quote method, which means that the longstanding format of output messages has changed to what gcc has been using for some time. This is the typical sort of diff you'll see in a failure: -mv: cannot move `TEST_DIR/test-mv/ab/aa/' to `TEST_DIR/test-mv/aa': File exists +mv: cannot move 'TEST_DIR/test-mv/ab/aa/' to 'TEST_DIR/test-mv/aa': File exists It's subtle, but the difference is `...' vs '...'.(*) What this means is that we are going to have to add filters to all the coreutils output in xfstests to convert the quotes to a common format for the golden output. I'm not going to get to this in the next couple of weeks (travel to LF collab summit/LSFMM next week), so someone else might want to have a look at this in the mean time... Cheers, Dave. (*) Well, it's even more subtle than that, because I've had problems with GCC quotes for years - they simply don't don't copy-n-paste very well, even when all terminals and machines are using the same locale and UTF-8 aware applications: v8.13 $ LC_ALL=en_AU.UTF-8 mv a /etc mv: cannot move `a' to `/etc/a': Permission denied v8.20: $ LC_ALL=en_AU.UTF-8 mv a /etc mv: cannot move ¿a¿ to ¿/etc/a¿: Permission denied Yeah, the quotes from v8.20 didn't paste as quotes. gcc has displayed this behaviour for years, and now coreutils will behave the same. Welcome to the wonderful new world of screwed up quotes in bug reports.... -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Thu Apr 11 04:55:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AD5E57FBA for ; Thu, 11 Apr 2013 04:55:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4867BAC001 for ; Thu, 11 Apr 2013 02:55:48 -0700 (PDT) X-ASG-Debug-ID: 1365674147-04bdf02d1c5f970001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id VSyuo0wz1jXejvgj for ; Thu, 11 Apr 2013 02:55:47 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id BD6FA6C162 for ; Thu, 11 Apr 2013 04:55:46 -0500 (CDT) Message-ID: <516688A9.8050506@hardwarefreak.com> Date: Thu, 11 Apr 2013 04:55:53 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: xfs_repair breaks with assertion References: <20130411062515.GH10481@dastard> X-ASG-Orig-Subj: Re: xfs_repair breaks with assertion In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1365674147 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 4/11/2013 1:34 AM, Victor K wrote: > The raid array did not suffer, at least, not according to mdadm; it is now > happily recovering the one disk that officially failed, but the whole thing > assembled without a problem > There was a similar crash several weeks ago on this same array, but had > ext4 system back then. > I was able to save some of the latest stuff, and decided to move to xfs as > something more reliable. > I suspect now I should also had replaced the disk controller then. Rebuilds are *supposed* to be transparent to the filesystem but this is not always the case. Sometimes due to bugs. In fact we just recently saw an LVM bug wherein a pvmove operation was not transparent, and hosed up an XFS. This is but one of many reasons I prefer hardware based RAID and volume management. It isolates these functions and RAID memory structures from the kernel, and thus prevents such bugs from causing problems. This may/not be the source of your apparent XFS corruption. We don't have enough (log) data to ascertain the cause at this point. Running repair on an 8/10TB filesystem while md is rebuilding the underlying RAID6 array isn't something I'd put a lot of trust in. Wait until the rebuild is finished and then run a non-destructive repair. Compare the results to the previous repair. -- Stan From jack@suse.cz Thu Apr 11 06:45:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7E7697FB4 for ; Thu, 11 Apr 2013 06:45:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4E5E930405F for ; Thu, 11 Apr 2013 04:45:00 -0700 (PDT) X-ASG-Debug-ID: 1365680698-04bdf02d1c69f10001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id RAYI6AZGVL4JTV6U for ; Thu, 11 Apr 2013 04:44:58 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 73E4AA398E; Thu, 11 Apr 2013 13:44:57 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id 9366F2068D; Thu, 11 Apr 2013 13:44:56 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: tinguely@sgi.com, Jan Kara , Dave Chinner Subject: [PATCH] xfs: Avoid pathological backwards allocation Date: Thu, 11 Apr 2013 13:44:51 +0200 X-ASG-Orig-Subj: [PATCH] xfs: Avoid pathological backwards allocation Message-Id: <1365680691-5330-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1365680698 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127801 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Writing a large file using direct IO in 16 MB chunks sometimes results in a pathological allocation pattern where 16 MB chunks of large free extent are allocated to a file in a reversed order. So extents of a file look for example as: ext logical physical expected length flags 0 0 13 4550656 1 4550656 188136807 4550668 12562432 2 17113088 200699240 200699238 622592 3 17735680 182046055 201321831 4096 4 17739776 182041959 182050150 4096 5 17743872 182037863 182046054 4096 6 17747968 182033767 182041958 4096 7 17752064 182029671 182037862 4096 ... 6757 45400064 154381644 154389835 4096 6758 45404160 154377548 154385739 4096 6759 45408256 252951571 154381643 73728 eof This happens because XFS_ALLOCTYPE_THIS_BNO allocation fails (the last extent in the file cannot be further extended) so we fall back to XFS_ALLOCTYPE_NEAR_BNO allocation which picks end of a large free extent as the best place to continue the file. Since the chunk at the end of the free extent again cannot be further extended, this behavior repeats until the whole free extent is consumed in a reversed order. For data allocations this backward allocation isn't beneficial so make xfs_alloc_compute_diff() pick start of a free extent instead of its end for them. That avoids the backward allocation pattern. Based on idea by Dave Chinner . CC: Dave Chinner Signed-off-by: Jan Kara --- fs/xfs/xfs_alloc.c | 22 ++++++++++++++++------ 1 files changed, 16 insertions(+), 6 deletions(-) BTW, I've tested With this patch applied I really cannot reproduce the problematic allocation pattern anymore. diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 0ad2325..64c6247 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -173,6 +173,7 @@ xfs_alloc_compute_diff( xfs_agblock_t wantbno, /* target starting block */ xfs_extlen_t wantlen, /* target length */ xfs_extlen_t alignment, /* target alignment */ + char userdata, /* are we allocating data? */ xfs_agblock_t freebno, /* freespace's starting block */ xfs_extlen_t freelen, /* freespace's length */ xfs_agblock_t *newbnop) /* result: best start block from free */ @@ -187,7 +188,12 @@ xfs_alloc_compute_diff( ASSERT(freelen >= wantlen); freeend = freebno + freelen; wantend = wantbno + wantlen; - if (freebno >= wantbno) { + /* + * We want to allocate from the start of a free extent if it is past + * the desired block or if we are allocating user data and the free + * extent is before desired block. + */ + if (freebno >= wantbno || (userdata && freeend < wantend)) { if ((newbno1 = roundup(freebno, alignment)) >= freeend) newbno1 = NULLAGBLOCK; } else if (freeend >= wantend && alignment > 1) { @@ -772,7 +778,8 @@ xfs_alloc_find_best_extent( xfs_alloc_fix_len(args); sdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, *sbnoa, + args->alignment, + args->userdata, *sbnoa, *slena, &new); /* @@ -943,7 +950,8 @@ restart: if (args->len < blen) continue; ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, ltbnoa, ltlena, <new); + args->alignment, args->userdata, ltbnoa, + ltlena, <new); if (ltnew != NULLAGBLOCK && (args->len > blen || ltdiff < bdiff)) { bdiff = ltdiff; @@ -1095,7 +1103,8 @@ restart: args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, ltbnoa, ltlena, <new); + args->alignment, args->userdata, ltbnoa, + ltlena, <new); error = xfs_alloc_find_best_extent(args, &bno_cur_lt, &bno_cur_gt, @@ -1111,7 +1120,8 @@ restart: args->len = XFS_EXTLEN_MIN(gtlena, args->maxlen); xfs_alloc_fix_len(args); gtdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, gtbnoa, gtlena, >new); + args->alignment, args->userdata, gtbnoa, + gtlena, >new); error = xfs_alloc_find_best_extent(args, &bno_cur_gt, &bno_cur_lt, @@ -1170,7 +1180,7 @@ restart: } rlen = args->len; (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, - ltbnoa, ltlena, <new); + args->userdata, ltbnoa, ltlena, <new); ASSERT(ltnew >= ltbno); ASSERT(ltnew + rlen <= ltbnoa + ltlena); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); -- 1.7.1 From david@fromorbit.com Thu Apr 11 07:50:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D424B7F96 for ; Thu, 11 Apr 2013 07:50:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C12438F8089 for ; Thu, 11 Apr 2013 05:50:08 -0700 (PDT) X-ASG-Debug-ID: 1365684605-04cbb057f66e660001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id VJikFITxRzMFyraR for ; Thu, 11 Apr 2013 05:50:06 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArYTADywZlF5LJ67/2dsb2JhbABQgwaCe7llhRwEAYEDF3SCHwEBBAE6HCMFCwgDDgoJJQ8FJQMhExuHcwW+BxWNZIEdB4JgYQOTNYNKkQ+DHSo Received: from ppp121-44-158-187.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.187]) by ipmail06.adl2.internode.on.net with ESMTP; 11 Apr 2013 22:20:04 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQGx1-00067V-A1; Thu, 11 Apr 2013 22:50:03 +1000 Date: Thu, 11 Apr 2013 22:50:03 +1000 From: Dave Chinner To: Jan Kara Cc: xfs@oss.sgi.com, tinguely@sgi.com, Dave Chinner Subject: Re: [PATCH] xfs: Avoid pathological backwards allocation Message-ID: <20130411125003.GA31207@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Avoid pathological backwards allocation References: <1365680691-5330-1-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1365680691-5330-1-git-send-email-jack@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: 1365684605 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 11, 2013 at 01:44:51PM +0200, Jan Kara wrote: > Writing a large file using direct IO in 16 MB chunks sometimes results > in a pathological allocation pattern where 16 MB chunks of large free > extent are allocated to a file in a reversed order. So extents of a file > look for example as: > > ext logical physical expected length flags > 0 0 13 4550656 > 1 4550656 188136807 4550668 12562432 > 2 17113088 200699240 200699238 622592 > 3 17735680 182046055 201321831 4096 > 4 17739776 182041959 182050150 4096 > 5 17743872 182037863 182046054 4096 > 6 17747968 182033767 182041958 4096 > 7 17752064 182029671 182037862 4096 > ... > 6757 45400064 154381644 154389835 4096 > 6758 45404160 154377548 154385739 4096 > 6759 45408256 252951571 154381643 73728 eof > > This happens because XFS_ALLOCTYPE_THIS_BNO allocation fails (the last > extent in the file cannot be further extended) so we fall back to > XFS_ALLOCTYPE_NEAR_BNO allocation which picks end of a large free > extent as the best place to continue the file. Since the chunk at the > end of the free extent again cannot be further extended, this behavior > repeats until the whole free extent is consumed in a reversed order. > > For data allocations this backward allocation isn't beneficial so make > xfs_alloc_compute_diff() pick start of a free extent instead of its end > for them. That avoids the backward allocation pattern. > > Based on idea by Dave Chinner . Can you add a reference to the previous discussion thread here? I had to go back and read it to remind myself of how we ended up with this solution, so I think that we need to capture that information in this commit message somehow. A url to an archive (such as on oss.sgi.com) is probably the simplest way to do this. > CC: Dave Chinner > Signed-off-by: Jan Kara > --- > fs/xfs/xfs_alloc.c | 22 ++++++++++++++++------ > 1 files changed, 16 insertions(+), 6 deletions(-) > > BTW, I've tested With this patch applied I really cannot reproduce the > problematic allocation pattern anymore. > > diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c > index 0ad2325..64c6247 100644 > --- a/fs/xfs/xfs_alloc.c > +++ b/fs/xfs/xfs_alloc.c > @@ -173,6 +173,7 @@ xfs_alloc_compute_diff( > xfs_agblock_t wantbno, /* target starting block */ > xfs_extlen_t wantlen, /* target length */ > xfs_extlen_t alignment, /* target alignment */ > + char userdata, /* are we allocating data? */ > xfs_agblock_t freebno, /* freespace's starting block */ > xfs_extlen_t freelen, /* freespace's length */ > xfs_agblock_t *newbnop) /* result: best start block from free */ > @@ -187,7 +188,12 @@ xfs_alloc_compute_diff( > ASSERT(freelen >= wantlen); > freeend = freebno + freelen; > wantend = wantbno + wantlen; > - if (freebno >= wantbno) { > + /* > + * We want to allocate from the start of a free extent if it is past > + * the desired block or if we are allocating user data and the free > + * extent is before desired block. > + */ I think this probably needs a little more detail as to why we we do this for user data. i.e. to carve from the front edge of the free extent to allow for contiguous allocation from the remaining free space if the file grows in the short term. > + if (freebno >= wantbno || (userdata && freeend < wantend)) { > if ((newbno1 = roundup(freebno, alignment)) >= freeend) > newbno1 = NULLAGBLOCK; So this is the meat of the change. We have this: freebno freeend +---------------------------------+ +-----+ prev +----------+ wantbno wantend and for user data this will now return: freebno freeend +---------------------------------+ +-----+ +--------+ prev +----------+ newbno1 wantbno wantend I wondered for a minute about how alignment affected the extent returned by taking this different branch, but I'm the behaviour is no different compared to carving an aligned chunk from the rear of the free extent. If the extent is short, we get the same result whether we try to carve it from the front or rear of the free space. OK, what if we have: freebno freeend +---------------------------------+ +----------+ wantbno wantend The existing code treats that the same as wantbno > freeend case above, so we should treat it the same and carve from the front edge. So the (freeend < wantend) check is sane, as is "<" for the comparison. If the watned range fits within the freespace block, then we should still carve that from the end of the freespace extent as that was what was wanted. IOWs, the code change looks good, and as such: Reviewed-by: Dave Chinner However, I think this probably needs to sit in the dev tree for a little while before we release it on the world. I don't think that pushing this for 3.10 is wise as we need a bit of time to determine if there are unintended side effects from this change under accelerated aging workloads first. I'd like to be conservative on this as the allocation primitives being touched are devilishly complex and getting this wrong will have permanent impact on filesystems... Cheers, Dave. -- Dave Chinner david@fromorbit.com From smile@echna.ne.jp Thu Apr 11 08:14:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=FREEMAIL_FORGED_REPLYTO autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1DE1D7F8E for ; Thu, 11 Apr 2013 08:14:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BD273AC001 for ; Thu, 11 Apr 2013 06:14:24 -0700 (PDT) X-ASG-Debug-ID: 1365686061-04bdf02d2072640001-NocioJ Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.171]) by cuda.sgi.com with ESMTP id Hsk95xTf46c7qkRJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 06:14:22 -0700 (PDT) X-Barracuda-Envelope-From: smile@echna.ne.jp X-Barracuda-Apparent-Source-IP: 212.227.126.171 Received: from icpu244.kundenserver.de (infong386.kundenserver.de [212.227.109.185]) by mrelayeu.kundenserver.de (node=mreu4) with ESMTP (Nemesis) id 0MWtPb-1U6EAY04Yl-00Y4Zp; Thu, 11 Apr 2013 15:14:21 +0200 Received: from 210.186.113.74 (IP may be forged by CGI script) by icpu244.kundenserver.de with HTTP id 4A0MT7-1UbBSu43jM-011wbT; Thu, 11 Apr 2013 15:14:20 +0200 X-Sender-Info: <150526359@icpu244.kundenserver.de> Date: Thu, 11 Apr 2013 15:14:20 +0200 Message-Id: <4A0MT7-1UbBSu43jM-011wbT@icpu244.kundenserver.de> Precedence: bulk To: xfs@oss.sgi.com Subject: 2% Loan Offer From: LOAN FIRM X-ASG-Orig-Subj: 2% Loan Offer Reply-To: firstgoldenterprise@yahoo.com.ph MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit X-Provags-ID: V02:K0:vdkJ3Rbzpuxw5tQrizIujnyJuKXccTKZtC+Hi3HEmaf F0U4DxWcwsZGgl1Lt3kPrgM3VTy2fiWfGlq7G3iGFiETGZecOC dPWeuuE0cd3ARWUFsv0CNWaLUOv2Rx+dzBFGB52KgKrHhkTETs yhyhVRR5NGLAON11X5SfTc12ofDNQ69lrCq1H9dUgyFUlLECYM n9rV85E4IX9KUjmvjL3nUx9uTDk5VnFE9jw0IXaR7HfkKsCvmA fq4wrh1dwZ/X7NQDLo2Yx+Ko6Ms4aMBRPxxLR0VdJApCrAC6rK vayIeb0LXfJjCm0+emJuD8bpbZGSLXaNY0sqqmlMwbvZT5U76i 7uP+0ChGm5x+7EdEEMn6eywl4QrOp2S5G6XTdeJ7WxL1qq68Ij gG64MCuGQeDgL21gUOdiy7Yt/lixaIoMfkMxkxUqpe+bRaA2fZ TKiuV X-Barracuda-Connect: moutng.kundenserver.de[212.227.126.171] X-Barracuda-Start-Time: 1365686062 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA298e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 BSF_SC7_SA298e Custom Rule SA298e We offer loans at 2% rate to meet the needs of borrowers nationwide. Complete the borrowers Information Below to Apply if you interested. Full Name: Purpose for Loan: Amount Applying For: Valid Phone Number: Loan Term/Duration: Thank You, First Gold Enterprise From shhuiw@gmail.com Thu Apr 11 08:27:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C74F77FB0 for ; Thu, 11 Apr 2013 08:27:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5F6DCAC001 for ; Thu, 11 Apr 2013 06:27:13 -0700 (PDT) X-ASG-Debug-ID: 1365686831-04bdf02d1d73db0001-NocioJ Received: from mail-pb0-f48.google.com (mail-pb0-f48.google.com [209.85.160.48]) by cuda.sgi.com with ESMTP id 8VCxUL6zotzqud9w (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 06:27:11 -0700 (PDT) X-Barracuda-Envelope-From: shhuiw@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.48 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.48] Received: by mail-pb0-f48.google.com with SMTP id xb4so851526pbc.35 for ; Thu, 11 Apr 2013 06:27:11 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.48] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.48] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; bh=wSspiQhEb1IEphX5jap7NcxRyumcTIXj0Rt1bsis7xI=; b=aRug/Yk4JWEolcdQL8oJclYHcvXXcpnlkMbJRrTyxjOOwgpbA+uVAkNxdb0PeGcoKH d9eEkkLm20kTt4it7HuEQK4GeEfONcBcpDN1DiUrSQXOayZlq3PgqOSahPEQBNepAFXr R7euUTaQFUDCyoQebI/Y7KwoE2CzHtYuw/qzQuRkUY55pUw2lGMyT+ao8XIF6n5h11Sf bxH80L4cDGDWI9QibrCob6OxPk3kNJs11oYJww0nLJ9MWzshmzCJu20t0vVkh/MgHxWJ XLRwoYRkvU+/w3FxMX7C5NVMm/zFDEfd+na5QpLkStOZorLyQYO/0dMIjTB22/GfvyM9 Xx6Q== X-Received: by 10.66.248.163 with SMTP id yn3mr9662170pac.96.1365686831476; Thu, 11 Apr 2013 06:27:11 -0700 (PDT) Received: from [192.168.1.104] ([122.70.27.61]) by mx.google.com with ESMTPS id mt13sm4248481pbc.15.2013.04.11.06.27.09 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 11 Apr 2013 06:27:10 -0700 (PDT) Message-ID: <5166BA24.1060809@gmail.com> Date: Thu, 11 Apr 2013 21:27:00 +0800 From: Wang Sheng-Hui User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner , xfstests Subject: [PATCH] xfstests: make install support common/ and tests/ dirs Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: [PATCH] xfstests: make install support common/ and tests/ dirs Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pb0-f48.google.com[209.85.160.48] X-Barracuda-Start-Time: 1365686831 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127810 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 xfstests have some change on the organization of the testcases and common* files: * The common* scripts have been reorganized into the common/ dir. * The testcases have been reorganized into sub test dirs under tests/. * The run.* scripts have been removed. This patch uses the simple way to make install support above changes: Make up one Makefile for each newly created subdirs, which can control 'make install' separately. Signed-off-by: Wang Sheng-Hui --- Makefile | 11 +++++------ common/Makefile | 17 +++++++++++++++++ tests/Makefile | 23 +++++++++++++++++++++++ tests/btrfs/Makefile | 21 +++++++++++++++++++++ tests/ext4/Makefile | 21 +++++++++++++++++++++ tests/generic/Makefile | 21 +++++++++++++++++++++ tests/shared/Makefile | 21 +++++++++++++++++++++ tests/udf/Makefile | 21 +++++++++++++++++++++ tests/xfs/Makefile | 21 +++++++++++++++++++++ 9 files changed, 171 insertions(+), 6 deletions(-) create mode 100644 common/Makefile create mode 100644 tests/Makefile create mode 100644 tests/btrfs/Makefile create mode 100644 tests/ext4/Makefile create mode 100644 tests/generic/Makefile create mode 100644 tests/shared/Makefile create mode 100644 tests/udf/Makefile create mode 100644 tests/xfs/Makefile diff --git a/Makefile b/Makefile index 6edd55c..95e3e5d 100644 --- a/Makefile +++ b/Makefile @@ -52,12 +52,15 @@ LDIRT += $(SRCTAR) endif LIB_SUBDIRS = include lib -TOOL_SUBDIRS = ltp src m4 +TOOL_SUBDIRS = ltp src m4 common ifeq ($(HAVE_DMAPI), true) TOOL_SUBDIRS += dmapi endif -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) +# all the tests have been put into tests/ +TESTS_SUBDIR = tests + +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_SUBDIR) default: include/builddefs $(DMAPI_MAKEFILE) $(TESTS) ifeq ($(HAVE_BUILDDEFS), no) @@ -91,12 +94,8 @@ depend: include/builddefs $(addsuffix -depend,$(SUBDIRS)) install: default $(addsuffix -install,$(SUBDIRS)) $(INSTALL) -m 755 -d $(PKG_LIB_DIR) $(INSTALL) -m 755 check $(PKG_LIB_DIR) - $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) - $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) $(INSTALL) -m 644 group $(PKG_LIB_DIR) $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) - $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) - $(INSTALL) -m 644 common* $(PKG_LIB_DIR) # Nothing. install-dev install-lib: diff --git a/common/Makefile b/common/Makefile new file mode 100644 index 0000000..649f55f --- /dev/null +++ b/common/Makefile @@ -0,0 +1,17 @@ +# +# Copyright (c) 2003-2006 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = .. +include $(TOPDIR)/include/builddefs + +# current ../common dir +COMMON_SUBDIR = common + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/$(COMMON_SUBDIR) + $(INSTALL) -m 644 * $(PKG_LIB_DIR)/$(COMMON_SUBDIR) + +install-dev install-lib: diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..50e6bb3 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,23 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = .. +include $(TOPDIR)/include/builddefs + +# current ../tests dir +TESTS_SUBDIR = tests +export TESTS_SUBDIR + +TESTS_SUBDIRS = btrfs ext4 generic shared udf xfs + +include $(BUILDRULES) + +install: $(addsuffix -install,$(TESTS_SUBDIRS)) + $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/$(TESTS_SUBDIR) + +# Nothing. +install-dev install-lib: + +%-install: + $(MAKE) $(MAKEOPTS) -C $* install diff --git a/tests/btrfs/Makefile b/tests/btrfs/Makefile new file mode 100644 index 0000000..35ec6ec --- /dev/null +++ b/tests/btrfs/Makefile @@ -0,0 +1,21 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +# ../tests/btrfs dir +BTRFS_SUBDIR = btrfs +TARGET_SUBDIR = $(PKG_LIB_DIR)/$(TESTS_SUBDIR)/$(BTRFS_SUBDIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_SUBDIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_SUBDIR) + $(INSTALL) -m 644 group $(TARGET_SUBDIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_SUBDIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/ext4/Makefile b/tests/ext4/Makefile new file mode 100644 index 0000000..94b683b --- /dev/null +++ b/tests/ext4/Makefile @@ -0,0 +1,21 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +# ../tests/ext4 dir +EXT4_SUBDIR = ext4 +TARGET_SUBDIR = $(PKG_LIB_DIR)/$(TESTS_SUBDIR)/$(EXT4_SUBDIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_SUBDIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_SUBDIR) + $(INSTALL) -m 644 group $(TARGET_SUBDIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_SUBDIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/generic/Makefile b/tests/generic/Makefile new file mode 100644 index 0000000..4858b1d --- /dev/null +++ b/tests/generic/Makefile @@ -0,0 +1,21 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +# ../tests/generic dir +GENERIC_SUBDIR = generic +TARGET_SUBDIR = $(PKG_LIB_DIR)/$(TESTS_SUBDIR)/$(GENERIC_SUBDIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_SUBDIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_SUBDIR) + $(INSTALL) -m 644 group $(TARGET_SUBDIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_SUBDIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/shared/Makefile b/tests/shared/Makefile new file mode 100644 index 0000000..d2d980e --- /dev/null +++ b/tests/shared/Makefile @@ -0,0 +1,21 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +# ../tests/shared dir +SHARED_SUBDIR = shared +TARGET_SUBDIR = $(PKG_LIB_DIR)/$(TESTS_SUBDIR)/$(SHARED_SUBDIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_SUBDIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_SUBDIR) + $(INSTALL) -m 644 group $(TARGET_SUBDIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_SUBDIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/udf/Makefile b/tests/udf/Makefile new file mode 100644 index 0000000..bf01eef --- /dev/null +++ b/tests/udf/Makefile @@ -0,0 +1,21 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +# ../tests/udf dir +UDF_SUBDIR = udf +TARGET_SUBDIR = $(PKG_LIB_DIR)/$(TESTS_SUBDIR)/$(UDF_SUBDIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_SUBDIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_SUBDIR) + $(INSTALL) -m 644 group $(TARGET_SUBDIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_SUBDIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/xfs/Makefile b/tests/xfs/Makefile new file mode 100644 index 0000000..e6d1b32 --- /dev/null +++ b/tests/xfs/Makefile @@ -0,0 +1,21 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +# ../tests/xfs dir +XFS_SUBDIR = xfs +TARGET_SUBDIR = $(PKG_LIB_DIR)/$(TESTS_SUBDIR)/$(XFS_SUBDIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_SUBDIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_SUBDIR) + $(INSTALL) -m 644 group $(TARGET_SUBDIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_SUBDIR) + +# Nothing. +install-dev install-lib: -- 1.7.12.4 From tinguely@sgi.com Thu Apr 11 08:54:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9F1EE7F92 for ; Thu, 11 Apr 2013 08:54:20 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6BE8330405F; Thu, 11 Apr 2013 06:54:17 -0700 (PDT) Message-ID: <5166C08C.8000200@sgi.com> Date: Thu, 11 Apr 2013 08:54:20 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy References: <20130410182438.268267840@sgi.com> <20130411030057.GF10481@dastard> In-Reply-To: <20130411030057.GF10481@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/10/13 22:00, Dave Chinner wrote: > On Wed, Apr 10, 2013 at 01:24:24PM -0500, Mark Tinguely wrote: >> Reserve fields in new inode layout for parent pointer and >> allocation policy. > > Not without a design review - there is no way we are going to > blindly reserve space in any on-disk structure without first having > a solid design, published proof-of-concept code and agreement that > the format changes being proposed are the right way to proceed. > > Where are the design docs/code for these features? Then you might want to bump the pad size. > >> ---- >> The inode will hold the parent information for the first >> link to a file. Information for the other links will be >> held in extended attribute entries. >> >> The "di_parino" is the inode of the parent directory. The >> directory information for this entry is located the parent >> directory with "di_paroff" offset. >> >> The di_parino/di_paroff concept code is running. > > How does it handle hard links? (i.e. multiple parents) As I stated, the hard links will use extended attribute entries. > > Also, inode number is not enough for unique identification of the > parent - generation number is also required. Per the 2005 XFS features meeting, the inode and directory offset will uniquely describe a link - (thank-you to Glen Overby for that observation). The concept code just using one link verifies this fact. Using the inode/offset as the identifier is compact and also gives information to the file name. > > FWIW, lets go back to the (was almost finished) parent pointer > code from 2009: > > http://oss.sgi.com/archives/xfs/2009-01/msg01068.html yep, read it, studied it, plan to use parts of it but only where needed. > > That uses xattrs to store parent information - inode #, generation > #, and a counter - for each parent. It requires a counter because > you can have the same inode hard linked into the same parent > directory multiple times: > > typedef struct xfs_parent_eaname_rec { > __be64 p_ino; > __be32 p_gen; > __be32 p_cnt; > } xfs_parent_eaname_rec_t; > > And a transaction appended to the the inode create, link, rename and > remove operations to manage the xattrs so all cases involving hard > links work just fine. > > Indeed, the single di_parino/di_paroff concept was one of the > original designs considered because of it's simplicity, but it was > rejected because of that very simplicity - it cannot handle common > use cases involving hardlinks. According to Geoffrey's notes, the hybrid approach was discussed too. The single link case will save all the EA operations for the majority of the inodes. > > Release early, release often? No, trust but verify. > >> ---- >> The "di_allocpolicy" will be used to remember the allocation >> policy associated with this inode. > > This is exactly what we have padding in the inode for - so that > future additions to the on-disk inode can be added via feature bits > to indicate the fields are present. > > Cheers, > > Dave. --Mark From rjohnston@sgi.com Thu Apr 11 10:28:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0666F7F3F for ; Thu, 11 Apr 2013 10:28:33 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id 58036AC004; Thu, 11 Apr 2013 08:28:29 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Thu, 11 Apr 2013 10:28:28 -0500 Message-ID: <5166D6BE.4050907@sgi.com> Date: Thu, 11 Apr 2013 10:29:02 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Wang Sheng-Hui CC: Dave Chinner , xfstests Subject: Re: [PATCH] xfstests: make install support common/ and tests/ dirs References: <5166BA24.1060809@gmail.com> In-Reply-To: <5166BA24.1060809@gmail.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Wang Sheng-Hui, The patch to Makefile would not apply. This is what I used to review. diff --git a/Makefile b/Makefile index 6edd55c..73214ab 100644 --- a/Makefile +++ b/Makefile @@ -52,12 +52,15 @@ LDIRT += $(SRCTAR) endif LIB_SUBDIRS = include lib -TOOL_SUBDIRS = ltp src m4 +TOOL_SUBDIRS = ltp src m4 common ifeq ($(HAVE_DMAPI), true) TOOL_SUBDIRS += dmapi endif -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) +# all the tests have been put into tests/ +TESTS_SUBDIR = tests + +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_SUBDIR) default: include/builddefs $(DMAPI_MAKEFILE) $(TESTS) ifeq ($(HAVE_BUILDDEFS), no) @@ -91,12 +94,7 @@ depend: include/builddefs $(addsuffix -depend,$(SUBDIRS)) install: default $(addsuffix -install,$(SUBDIRS)) $(INSTALL) -m 755 -d $(PKG_LIB_DIR) $(INSTALL) -m 755 check $(PKG_LIB_DIR) - $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) - $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) - $(INSTALL) -m 644 group $(PKG_LIB_DIR) $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) - $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) - $(INSTALL) -m 644 common* $(PKG_LIB_DIR) # Nothing. install-dev install-lib: Here is your original: > diff --git a/Makefile b/Makefile > index 6edd55c..95e3e5d 100644 > --- a/Makefile > +++ b/Makefile > @@ -52,12 +52,15 @@ LDIRT += $(SRCTAR) > endif > > LIB_SUBDIRS = include lib > -TOOL_SUBDIRS = ltp src m4 > +TOOL_SUBDIRS = ltp src m4 common > ifeq ($(HAVE_DMAPI), true) > TOOL_SUBDIRS += dmapi > endif > > -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) > +# all the tests have been put into tests/ > +TESTS_SUBDIR = tests > + > +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_SUBDIR) > > default: include/builddefs $(DMAPI_MAKEFILE) $(TESTS) > ifeq ($(HAVE_BUILDDEFS), no) > @@ -91,12 +94,8 @@ depend: include/builddefs $(addsuffix > -depend,$(SUBDIRS)) > install: default $(addsuffix -install,$(SUBDIRS)) > $(INSTALL) -m 755 -d $(PKG_LIB_DIR) > $(INSTALL) -m 755 check $(PKG_LIB_DIR) > - $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) > - $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) > $(INSTALL) -m 644 group $(PKG_LIB_DIR) oops somehow the above line was not deleted > $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) > - $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) > - $(INSTALL) -m 644 common* $(PKG_LIB_DIR) > > # Nothing. > install-dev install-lib: The rest of the patch looked good. If you agree with my slight mod then I will put my Reviewed-by and commit it. Thanks --Rich From bpm@sgi.com Thu Apr 11 11:16:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 58AD77F51 for ; Thu, 11 Apr 2013 11:16:58 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 196458F8040; Thu, 11 Apr 2013 09:16:54 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 96D04500B4B; Thu, 11 Apr 2013 11:16:54 -0500 (CDT) Date: Thu, 11 Apr 2013 11:16:54 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 13/22] xfs: add CRC checking to dir2 leaf blocks Message-ID: <20130411161654.GT30652@sgi.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-14-git-send-email-david@fromorbit.com> <20130410174639.GG22182@sgi.com> <20130411020606.GE10481@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130411020606.GE10481@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hey, On Thu, Apr 11, 2013 at 12:06:06PM +1000, Dave Chinner wrote: > On Wed, Apr 10, 2013 at 12:46:39PM -0500, Ben Myers wrote: > > > @@ -396,11 +397,18 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, > > > size = (int)((char *)&oldroot->btree[be16_to_cpu(oldroot->hdr.count)] - > > > (char *)oldroot); > > > } else { > > > - ASSERT(oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > > + struct xfs_dir3_icleaf_hdr leafhdr; > > > + struct xfs_dir2_leaf_entry *ents; > > > + > > > leaf = (xfs_dir2_leaf_t *)oldroot; > > > - size = (int)((char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] - > > > - (char *)leaf); > > > + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); > > > + ents = xfs_dir3_leaf_ents_p(leaf); > > > + > > > + ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || > > > + leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); > > > + size = (int)((char *)&ents[leafhdr.count] - (char *)leaf); > > > } > > > + /* XXX: can't just copy CRC headers from one block to another */ > > > > What is your plan for resolving that? > > It's fixed in a later patch when the da btree nodes have CRCs > added to them. I'll keep my eyes peeled for it. > > > @@ -2281,10 +2299,17 @@ xfs_da_read_buf( > > > XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && > > > (magic != XFS_ATTR_LEAF_MAGIC) && > > > (magic != XFS_DIR2_LEAF1_MAGIC) && > > > + (magic != XFS_DIR3_LEAF1_MAGIC) && > > > (magic != XFS_DIR2_LEAFN_MAGIC) && > > > + (magic != XFS_DIR3_LEAFN_MAGIC) && > > > (magic1 != XFS_DIR2_BLOCK_MAGIC) && > > > + (magic1 != XFS_DIR3_BLOCK_MAGIC) && > > > > Did this DIR3_BLOCK_MAGIC change sneak in from another patch? > ... > > Do DIRx_DATA_MAGIC and DIRx_FREE_MAGIC belong in a different patch? > > Probably, though given that at this point in the series they'll > never be set, it isn't actually a bug or anything that will break a > bisection. Do I really need to move these back into 3 previous > patches? Nah, I just want to make sure I understand what happened there. > Kind in mind that means I also need to do all these changes in the > userspace patch series as well... > > > > +static bool > > > +xfs_dir3_leaf_verify( > > > struct xfs_buf *bp, > > > - __be16 magic) > > > + __uint16_t magic) > > > +{ > > > + struct xfs_mount *mp = bp->b_target->bt_mount; > > > + struct xfs_dir2_leaf *leaf = bp->b_addr; > > > + struct xfs_dir3_icleaf_hdr leafhdr; > > > + > > > + ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); > > > > Using v2 magics to choose between leaf1 and leafn is ok, but not as clear as > > using a non-version-specific #define or enum might be for this purpose. > > The magic number passed in is actually used to validate the > magic number in the block being verified. I don't see any point in > inventing a new LEAF1/LEAFN identifier and then have to use that to > determine what the correct magic number is when we can just pass in > the magic number we expect.... > > Besides, we already use the magic numbers in this manner to identify > block types in the struct xfs_da_state_blk that is passed through > the da btree code, this is a pattern that is already well > established. *nod* > > > @@ -169,27 +432,34 @@ xfs_dir2_block_to_leaf( > > > /* > > > * Initialize the leaf block, get a buffer for it. > > > */ > > > - if ((error = xfs_dir2_leaf_init(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC))) { > > > + error = xfs_dir3_leaf_get_buf(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC); > > > + if (error) > > > return error; > > > - } > > > - ASSERT(lbp != NULL); > > > + > > > leaf = lbp->b_addr; > > > hdr = dbp->b_addr; > > > xfs_dir3_data_check(dp, dbp); > > > btp = xfs_dir2_block_tail_p(mp, hdr); > > > blp = xfs_dir2_block_leaf_p(btp); > > > bf = xfs_dir3_data_bestfree_p(hdr); > > > + ents = xfs_dir3_leaf_ents_p(leaf); > > > + > > > /* > > > * Set the counts in the leaf header. > > > + * > > > + * XXX: are these actually logged, or just gathered by chance? > > > > Nice find. I'm not seeing where that header is being logged. Worth a separate > > patch. > > I haven't fixed anything. I just added the comment as something to > come back to. As it is, I can answer that question directly right > now: they are gathered by chance by the xfs_dir2_leaf_log_ents() > call a few lines below due to the fact that the first dirent is in > the range covered by the first dirty bit of the logging regions > (i.e. 0-127 bytes into the buffer). > > So there isn't a bug here, and the header is logged implicity rather > than explicitly. As such, I don't think there's anything that needs > to be put in a separate patch because there is no bug being fixed > here. > > I have, however, removed the comment and put an explicit call to > xfs_dir3_leaf_log_header() in there. Thanks for adding the call. I prefer that it be done explicitly. I'll spin up a patch for it if you don't want to. > > > void > > > -xfs_dir2_leaf_log_header( > > > +xfs_dir3_leaf_log_header( > > > struct xfs_trans *tp, > > > struct xfs_buf *bp) > > > { > > > - xfs_dir2_leaf_t *leaf; /* leaf structure */ > > > + struct xfs_dir2_leaf *leaf = bp->b_addr; > > > > > > - leaf = bp->b_addr; > > > ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || > > > - leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > > + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || > > > + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || > > > + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); > > > + > > > xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), > > > - (uint)(sizeof(leaf->hdr) - 1)); > > > + xfs_dir3_leaf_hdr_size(leaf)); > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > > > Should be xfs_dir3_leaf_hdr_size(leaf) - 1, I think. > > Good catch. Fixed. > > (Not a bug, though, because of the 128 byte resolution of the dirty > bit tracking. The dir2/dir3 leaf header size is 16/64 bytes, so we > are always logging 128 bytes here regardless of the off-by-one.) Depends upon your definition of bug. When using this interface I'm not sure what assumptions one should be allowed to make about the resolution of dirty bit tracking underneath. > > > @@ -1374,10 +1423,12 @@ xfs_dir2_leafn_toosmall( > > > */ > > > blk = &state->path.blk[state->path.active - 1]; > > > info = blk->bp->b_addr; > > > - ASSERT(info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > > > Another assert that is more specific than it's replacement. > > added a xfs_dir3_leaf_check() call. ... > > > @@ -1481,34 +1536,52 @@ xfs_dir2_leafn_unbalance( ... > > > args = state->args; > > > ASSERT(drop_blk->magic == XFS_DIR2_LEAFN_MAGIC); > > > ASSERT(save_blk->magic == XFS_DIR2_LEAFN_MAGIC); > > > drop_leaf = drop_blk->bp->b_addr; > > > save_leaf = save_blk->bp->b_addr; > > > - ASSERT(drop_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > > - ASSERT(save_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); > > > > More specific assert than its replacement. > > At the end, save_leaf is fully checked. And drop_leaf is now fully > validated by the preivous call to xfs_dir2_leafn_toosmall(). > So the asserts are redundant... Ah, because you just added a dir3_leaf_check to dir2_leafn_toosmall. Works for me. Regards, Ben From yongtaofu@gmail.com Thu Apr 11 14:11:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 90A4C7F37 for ; Thu, 11 Apr 2013 14:11:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 770ED304048 for ; Thu, 11 Apr 2013 12:11:24 -0700 (PDT) X-ASG-Debug-ID: 1365707481-04cbb057f69c8c0001-NocioJ Received: from mail-ie0-f181.google.com (mail-ie0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id k4btSbqohmj26L3r (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 12:11:21 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] Received: by mail-ie0-f181.google.com with SMTP id 17so2500972iea.12 for ; Thu, 11 Apr 2013 12:11:21 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=pivlyUeDRyICDNUGD1usuB6hWtrcnHANtdhZipVAYBA=; b=Q2GqUamwyLPoXFfqNiCPJSVECQ4HTWFn0XgSmFTLwlG4KlXVIET3dSgQLLfwyrE5oN 2H/GUmTXTyi7ubNpYu2FlGv/Jj728YXz0TfIuLmB2LiNE7VnF0VeGBeOyRJcyfuCaS2y b/JMSeGjbMCpVK3Egeq2KjEvlg4zFBCa4inwq3VdytjKxT4D/AkhzrrrdtCKm/XYgROL 9VIMnwdfnIyUTgD3TPZ+FBEyt7IQBTpnkRhMsvXBPfQehDAOSq0MWGX8rOPnz7ljIKlO VnTjOANoFPW2RTF6QQuDmCjMu3fkFCi2ROH2lEE17s0xFyFaQGJ0X+ToNYg1I/+2ISQT svgw== MIME-Version: 1.0 X-Received: by 10.50.51.167 with SMTP id l7mr16918071igo.11.1365707481259; Thu, 11 Apr 2013 12:11:21 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Thu, 11 Apr 2013 12:11:20 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> Date: Fri, 12 Apr 2013 03:11:20 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Emmanuel Florac Cc: Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340b5f49a6b604da1a8d68 X-Barracuda-Connect: mail-ie0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1365707481 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127833 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 --14dae9340b5f49a6b604da1a8d68 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable It happens tonight again on one of our servers, how to debug the root cause? Thank you. Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22. Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22 Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02ee20a Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting down filesystem Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem and rectify the problem(s) Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. xfs_repair -n Phase 7 - verify link counts... would have reset inode 20021 nlinks from 0 to 1 would have reset inode 20789 nlinks from 0 to 1 would have reset inode 35125 nlinks from 0 to 1 would have reset inode 35637 nlinks from 0 to 1 would have reset inode 36149 nlinks from 0 to 1 would have reset inode 38197 nlinks from 0 to 1 would have reset inode 39477 nlinks from 0 to 1 would have reset inode 54069 nlinks from 0 to 1 would have reset inode 62261 nlinks from 0 to 1 would have reset inode 63029 nlinks from 0 to 1 would have reset inode 72501 nlinks from 0 to 1 would have reset inode 79925 nlinks from 0 to 1 would have reset inode 81205 nlinks from 0 to 1 would have reset inode 84789 nlinks from 0 to 1 would have reset inode 87861 nlinks from 0 to 1 would have reset inode 90663 nlinks from 0 to 1 would have reset inode 91189 nlinks from 0 to 1 would have reset inode 95541 nlinks from 0 to 1 would have reset inode 98101 nlinks from 0 to 1 would have reset inode 101173 nlinks from 0 to 1 would have reset inode 113205 nlinks from 0 to 1 would have reset inode 114741 nlinks from 0 to 1 would have reset inode 126261 nlinks from 0 to 1 would have reset inode 140597 nlinks from 0 to 1 would have reset inode 144693 nlinks from 0 to 1 would have reset inode 147765 nlinks from 0 to 1 would have reset inode 152885 nlinks from 0 to 1 would have reset inode 161333 nlinks from 0 to 1 would have reset inode 161845 nlinks from 0 to 1 would have reset inode 167477 nlinks from 0 to 1 would have reset inode 172341 nlinks from 0 to 1 would have reset inode 191797 nlinks from 0 to 1 would have reset inode 204853 nlinks from 0 to 1 would have reset inode 205365 nlinks from 0 to 1 would have reset inode 215349 nlinks from 0 to 1 would have reset inode 215861 nlinks from 0 to 1 would have reset inode 216373 nlinks from 0 to 1 would have reset inode 217397 nlinks from 0 to 1 would have reset inode 224309 nlinks from 0 to 1 would have reset inode 225589 nlinks from 0 to 1 would have reset inode 234549 nlinks from 0 to 1 would have reset inode 234805 nlinks from 0 to 1 would have reset inode 249653 nlinks from 0 to 1 would have reset inode 250677 nlinks from 0 to 1 would have reset inode 252469 nlinks from 0 to 1 would have reset inode 261429 nlinks from 0 to 1 would have reset inode 265013 nlinks from 0 to 1 would have reset inode 266805 nlinks from 0 to 1 would have reset inode 267317 nlinks from 0 to 1 would have reset inode 268853 nlinks from 0 to 1 would have reset inode 272437 nlinks from 0 to 1 would have reset inode 273205 nlinks from 0 to 1 would have reset inode 274229 nlinks from 0 to 1 would have reset inode 278325 nlinks from 0 to 1 would have reset inode 278837 nlinks from 0 to 1 would have reset inode 281397 nlinks from 0 to 1 would have reset inode 292661 nlinks from 0 to 1 would have reset inode 300853 nlinks from 0 to 1 would have reset inode 302901 nlinks from 0 to 1 would have reset inode 305205 nlinks from 0 to 1 would have reset inode 314165 nlinks from 0 to 1 would have reset inode 315189 nlinks from 0 to 1 would have reset inode 320309 nlinks from 0 to 1 would have reset inode 324917 nlinks from 0 to 1 would have reset inode 328245 nlinks from 0 to 1 would have reset inode 335925 nlinks from 0 to 1 would have reset inode 339253 nlinks from 0 to 1 would have reset inode 339765 nlinks from 0 to 1 would have reset inode 348213 nlinks from 0 to 1 would have reset inode 360501 nlinks from 0 to 1 would have reset inode 362037 nlinks from 0 to 1 would have reset inode 366389 nlinks from 0 to 1 would have reset inode 385845 nlinks from 0 to 1 would have reset inode 390709 nlinks from 0 to 1 would have reset inode 409141 nlinks from 0 to 1 would have reset inode 413237 nlinks from 0 to 1 would have reset inode 414773 nlinks from 0 to 1 would have reset inode 417845 nlinks from 0 to 1 would have reset inode 436021 nlinks from 0 to 1 would have reset inode 439349 nlinks from 0 to 1 would have reset inode 447029 nlinks from 0 to 1 would have reset inode 491317 nlinks from 0 to 1 would have reset inode 494133 nlinks from 0 to 1 would have reset inode 495413 nlinks from 0 to 1 would have reset inode 501301 nlinks from 0 to 1 would have reset inode 506421 nlinks from 0 to 1 would have reset inode 508469 nlinks from 0 to 1 would have reset inode 508981 nlinks from 0 to 1 would have reset inode 511797 nlinks from 0 to 1 would have reset inode 513077 nlinks from 0 to 1 would have reset inode 517941 nlinks from 0 to 1 would have reset inode 521013 nlinks from 0 to 1 would have reset inode 522805 nlinks from 0 to 1 would have reset inode 523317 nlinks from 0 to 1 would have reset inode 525621 nlinks from 0 to 1 would have reset inode 527925 nlinks from 0 to 1 would have reset inode 535605 nlinks from 0 to 1 would have reset inode 541749 nlinks from 0 to 1 would have reset inode 573493 nlinks from 0 to 1 would have reset inode 578613 nlinks from 0 to 1 would have reset inode 583029 nlinks from 0 to 1 would have reset inode 585525 nlinks from 0 to 1 would have reset inode 586293 nlinks from 0 to 1 would have reset inode 586805 nlinks from 0 to 1 would have reset inode 591413 nlinks from 0 to 1 would have reset inode 594485 nlinks from 0 to 1 would have reset inode 596277 nlinks from 0 to 1 would have reset inode 603189 nlinks from 0 to 1 would have reset inode 613429 nlinks from 0 to 1 would have reset inode 617781 nlinks from 0 to 1 would have reset inode 621877 nlinks from 0 to 1 would have reset inode 623925 nlinks from 0 to 1 would have reset inode 625205 nlinks from 0 to 1 would have reset inode 626741 nlinks from 0 to 1 would have reset inode 639541 nlinks from 0 to 1 would have reset inode 640053 nlinks from 0 to 1 would have reset inode 640565 nlinks from 0 to 1 would have reset inode 645173 nlinks from 0 to 1 would have reset inode 652853 nlinks from 0 to 1 would have reset inode 656181 nlinks from 0 to 1 would have reset inode 659253 nlinks from 0 to 1 would have reset inode 663605 nlinks from 0 to 1 would have reset inode 667445 nlinks from 0 to 1 would have reset inode 680757 nlinks from 0 to 1 would have reset inode 691253 nlinks from 0 to 1 would have reset inode 691765 nlinks from 0 to 1 would have reset inode 697653 nlinks from 0 to 1 would have reset inode 700469 nlinks from 0 to 1 would have reset inode 707893 nlinks from 0 to 1 would have reset inode 716853 nlinks from 0 to 1 would have reset inode 722229 nlinks from 0 to 1 would have reset inode 722741 nlinks from 0 to 1 would have reset inode 723765 nlinks from 0 to 1 would have reset inode 731957 nlinks from 0 to 1 would have reset inode 742965 nlinks from 0 to 1 would have reset inode 743477 nlinks from 0 to 1 would have reset inode 745781 nlinks from 0 to 1 would have reset inode 746293 nlinks from 0 to 1 would have reset inode 774453 nlinks from 0 to 1 would have reset inode 778805 nlinks from 0 to 1 would have reset inode 785013 nlinks from 0 to 1 would have reset inode 785973 nlinks from 0 to 1 would have reset inode 791349 nlinks from 0 to 1 would have reset inode 796981 nlinks from 0 to 1 would have reset inode 803381 nlinks from 0 to 1 would have reset inode 806965 nlinks from 0 to 1 would have reset inode 811798 nlinks from 0 to 1 would have reset inode 812310 nlinks from 0 to 1 would have reset inode 813078 nlinks from 0 to 1 would have reset inode 813607 nlinks from 0 to 1 would have reset inode 814183 nlinks from 0 to 1 would have reset inode 822069 nlinks from 0 to 1 would have reset inode 828469 nlinks from 0 to 1 would have reset inode 830005 nlinks from 0 to 1 would have reset inode 832053 nlinks from 0 to 1 would have reset inode 832565 nlinks from 0 to 1 would have reset inode 836661 nlinks from 0 to 1 would have reset inode 841013 nlinks from 0 to 1 would have reset inode 841525 nlinks from 0 to 1 would have reset inode 845365 nlinks from 0 to 1 would have reset inode 846133 nlinks from 0 to 1 would have reset inode 847157 nlinks from 0 to 1 would have reset inode 852533 nlinks from 0 to 1 would have reset inode 857141 nlinks from 0 to 1 would have reset inode 863271 nlinks from 0 to 1 would have reset inode 866855 nlinks from 0 to 1 would have reset inode 887861 nlinks from 0 to 1 would have reset inode 891701 nlinks from 0 to 1 would have reset inode 894773 nlinks from 0 to 1 would have reset inode 900149 nlinks from 0 to 1 would have reset inode 902197 nlinks from 0 to 1 would have reset inode 906293 nlinks from 0 to 1 would have reset inode 906805 nlinks from 0 to 1 would have reset inode 909877 nlinks from 0 to 1 would have reset inode 925493 nlinks from 0 to 1 would have reset inode 949543 nlinks from 0 to 1 would have reset inode 955175 nlinks from 0 to 1 would have reset inode 963623 nlinks from 0 to 1 would have reset inode 967733 nlinks from 0 to 1 would have reset inode 968231 nlinks from 0 to 1 would have reset inode 982069 nlinks from 0 to 1 would have reset inode 1007413 nlinks from 0 to 1 would have reset inode 1011509 nlinks from 0 to 1 would have reset inode 1014069 nlinks from 0 to 1 would have reset inode 1014581 nlinks from 0 to 1 would have reset inode 1022005 nlinks from 0 to 1 would have reset inode 1022517 nlinks from 0 to 1 would have reset inode 1023029 nlinks from 0 to 1 would have reset inode 1025333 nlinks from 0 to 1 would have reset inode 1043765 nlinks from 0 to 1 would have reset inode 1044789 nlinks from 0 to 1 would have reset inode 1049397 nlinks from 0 to 1 would have reset inode 1050933 nlinks from 0 to 1 would have reset inode 1051445 nlinks from 0 to 1 would have reset inode 1054261 nlinks from 0 to 1 would have reset inode 1060917 nlinks from 0 to 1 would have reset inode 1063477 nlinks from 0 to 1 would have reset inode 1076021 nlinks from 0 to 1 would have reset inode 1081141 nlinks from 0 to 1 would have reset inode 1086261 nlinks from 0 to 1 would have reset inode 1097269 nlinks from 0 to 1 would have reset inode 1099829 nlinks from 0 to 1 would have reset inode 1100853 nlinks from 0 to 1 would have reset inode 1101877 nlinks from 0 to 1 would have reset inode 1126709 nlinks from 0 to 1 would have reset inode 1134389 nlinks from 0 to 1 would have reset inode 1141045 nlinks from 0 to 1 would have reset inode 1141557 nlinks from 0 to 1 would have reset inode 1142581 nlinks from 0 to 1 would have reset inode 1148469 nlinks from 0 to 1 would have reset inode 1153333 nlinks from 0 to 1 would have reset inode 1181749 nlinks from 0 to 1 would have reset inode 1192245 nlinks from 0 to 1 would have reset inode 1198133 nlinks from 0 to 1 would have reset inode 1203765 nlinks from 0 to 1 would have reset inode 1221429 nlinks from 0 to 1 would have reset inode 1223989 nlinks from 0 to 1 would have reset inode 1235509 nlinks from 0 to 1 would have reset inode 1239349 nlinks from 0 to 1 would have reset inode 1240885 nlinks from 0 to 1 would have reset inode 1241397 nlinks from 0 to 1 would have reset inode 1241909 nlinks from 0 to 1 would have reset inode 1242421 nlinks from 0 to 1 would have reset inode 1244981 nlinks from 0 to 1 would have reset inode 1246517 nlinks from 0 to 1 would have reset inode 1253429 nlinks from 0 to 1 would have reset inode 1271861 nlinks from 0 to 1 would have reset inode 1274677 nlinks from 0 to 1 would have reset inode 1277749 nlinks from 0 to 1 would have reset inode 1278773 nlinks from 0 to 1 would have reset inode 1286709 nlinks from 0 to 1 would have reset inode 1288245 nlinks from 0 to 1 would have reset inode 1299765 nlinks from 0 to 1 would have reset inode 1302325 nlinks from 0 to 1 would have reset inode 1304885 nlinks from 0 to 1 would have reset inode 1305397 nlinks from 0 to 1 would have reset inode 1307509 nlinks from 0 to 1 would have reset inode 1309493 nlinks from 0 to 1 would have reset inode 1310517 nlinks from 0 to 1 would have reset inode 1311029 nlinks from 0 to 1 would have reset inode 1312053 nlinks from 0 to 1 would have reset inode 1316917 nlinks from 0 to 1 would have reset inode 1317941 nlinks from 0 to 1 would have reset inode 1320821 nlinks from 0 to 1 would have reset inode 1322805 nlinks from 0 to 1 would have reset inode 1332789 nlinks from 0 to 1 would have reset inode 1336373 nlinks from 0 to 1 would have reset inode 1345653 nlinks from 0 to 1 would have reset inode 1354549 nlinks from 0 to 1 would have reset inode 1361973 nlinks from 0 to 1 would have reset inode 1369909 nlinks from 0 to 1 would have reset inode 1372981 nlinks from 0 to 1 would have reset inode 1388853 nlinks from 0 to 1 would have reset inode 1402933 nlinks from 0 to 1 would have reset inode 1403445 nlinks from 0 to 1 would have reset inode 1420085 nlinks from 0 to 1 would have reset inode 1452853 nlinks from 0 to 1 would have reset inode 1456437 nlinks from 0 to 1 would have reset inode 1457973 nlinks from 0 to 1 would have reset inode 1459253 nlinks from 0 to 1 would have reset inode 1467957 nlinks from 0 to 1 would have reset inode 1471541 nlinks from 0 to 1 would have reset inode 1476661 nlinks from 0 to 1 would have reset inode 1479733 nlinks from 0 to 1 would have reset inode 1483061 nlinks from 0 to 1 would have reset inode 1484085 nlinks from 0 to 1 would have reset inode 1486133 nlinks from 0 to 1 would have reset inode 1489461 nlinks from 0 to 1 would have reset inode 1490037 nlinks from 0 to 1 would have reset inode 1492021 nlinks from 0 to 1 would have reset inode 1493557 nlinks from 0 to 1 would have reset inode 1494069 nlinks from 0 to 1 would have reset inode 1496885 nlinks from 0 to 1 would have reset inode 1498421 nlinks from 0 to 1 would have reset inode 1498933 nlinks from 0 to 1 would have reset inode 1499957 nlinks from 0 to 1 would have reset inode 1506101 nlinks from 0 to 1 would have reset inode 1507637 nlinks from 0 to 1 would have reset inode 1510453 nlinks from 0 to 1 would have reset inode 1514293 nlinks from 0 to 1 would have reset inode 1517365 nlinks from 0 to 1 would have reset inode 1520693 nlinks from 0 to 1 would have reset inode 1521973 nlinks from 0 to 1 would have reset inode 1530421 nlinks from 0 to 1 would have reset inode 1530933 nlinks from 0 to 1 would have reset inode 1537333 nlinks from 0 to 1 would have reset inode 1538357 nlinks from 0 to 1 would have reset inode 1548853 nlinks from 0 to 1 would have reset inode 1553973 nlinks from 0 to 1 would have reset inode 1557301 nlinks from 0 to 1 would have reset inode 1564213 nlinks from 0 to 1 would have reset inode 1564725 nlinks from 0 to 1 would have reset inode 1576501 nlinks from 0 to 1 would have reset inode 1580597 nlinks from 0 to 1 would have reset inode 1584693 nlinks from 0 to 1 would have reset inode 1586485 nlinks from 0 to 1 would have reset inode 1589301 nlinks from 0 to 1 would have reset inode 1589813 nlinks from 0 to 1 would have reset inode 1592629 nlinks from 0 to 1 would have reset inode 1595701 nlinks from 0 to 1 would have reset inode 1601077 nlinks from 0 to 1 would have reset inode 1623861 nlinks from 0 to 1 would have reset inode 1626677 nlinks from 0 to 1 would have reset inode 1627701 nlinks from 0 to 1 would have reset inode 1633333 nlinks from 0 to 1 would have reset inode 1639221 nlinks from 0 to 1 would have reset inode 1649205 nlinks from 0 to 1 would have reset inode 1686325 nlinks from 0 to 1 would have reset inode 1690677 nlinks from 0 to 1 would have reset inode 1693749 nlinks from 0 to 1 would have reset inode 1704757 nlinks from 0 to 1 would have reset inode 1707061 nlinks from 0 to 1 would have reset inode 1709109 nlinks from 0 to 1 would have reset inode 1719349 nlinks from 0 to 1 would have reset inode 1737013 nlinks from 0 to 1 would have reset inode 1741365 nlinks from 0 to 1 would have reset inode 1747509 nlinks from 0 to 1 would have reset inode 1770805 nlinks from 0 to 1 would have reset inode 1780789 nlinks from 0 to 1 would have reset inode 1793589 nlinks from 0 to 1 would have reset inode 1795125 nlinks from 0 to 1 would have reset inode 1800757 nlinks from 0 to 1 would have reset inode 1801269 nlinks from 0 to 1 would have reset inode 1802549 nlinks from 0 to 1 would have reset inode 1804085 nlinks from 0 to 1 would have reset inode 1817141 nlinks from 0 to 1 would have reset inode 1821749 nlinks from 0 to 1 would have reset inode 1832757 nlinks from 0 to 1 would have reset inode 1836341 nlinks from 0 to 1 would have reset inode 1856309 nlinks from 0 to 1 would have reset inode 1900597 nlinks from 0 to 1 would have reset inode 1902901 nlinks from 0 to 1 would have reset inode 1912373 nlinks from 0 to 1 would have reset inode 1943093 nlinks from 0 to 1 would have reset inode 1944373 nlinks from 0 to 1 would have reset inode 1954101 nlinks from 0 to 1 would have reset inode 1955893 nlinks from 0 to 1 would have reset inode 1961781 nlinks from 0 to 1 would have reset inode 1974325 nlinks from 0 to 1 would have reset inode 1978677 nlinks from 0 to 1 would have reset inode 1981237 nlinks from 0 to 1 would have reset inode 1992245 nlinks from 0 to 1 would have reset inode 2000949 nlinks from 0 to 1 would have reset inode 2002229 nlinks from 0 to 1 would have reset inode 2004789 nlinks from 0 to 1 would have reset inode 2005301 nlinks from 0 to 1 would have reset inode 2011189 nlinks from 0 to 1 would have reset inode 2012981 nlinks from 0 to 1 would have reset inode 2015285 nlinks from 0 to 1 would have reset inode 2018869 nlinks from 0 to 1 would have reset inode 2028341 nlinks from 0 to 1 would have reset inode 2028853 nlinks from 0 to 1 would have reset inode 2030901 nlinks from 0 to 1 would have reset inode 2032181 nlinks from 0 to 1 would have reset inode 2032693 nlinks from 0 to 1 would have reset inode 2040117 nlinks from 0 to 1 would have reset inode 2053685 nlinks from 0 to 1 would have reset inode 2083893 nlinks from 0 to 1 would have reset inode 2087221 nlinks from 0 to 1 would have reset inode 2095925 nlinks from 0 to 1 would have reset inode 2098741 nlinks from 0 to 1 would have reset inode 2100533 nlinks from 0 to 1 would have reset inode 2101301 nlinks from 0 to 1 would have reset inode 2123573 nlinks from 0 to 1 would have reset inode 2132789 nlinks from 0 to 1 would have reset inode 2133813 nlinks from 0 to 1 2013/4/10 =B7=FB=D3=C0=CC=CE > The storage info is as following: > RAID-6 > SATA HDD > Controller: PERC H710P Mini (Embedded) > Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes > 255 heads, 63 sectors/track, 3647334 cylinders > Units =3D cylinders of 16065 * 512 =3D 8225280 bytes > Sector size (logical/physical): 512 bytes / 512 bytes > I/O size (minimum/optimal): 512 bytes / 512 bytes > Disk identifier: 0x00000000 > > sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (30.0 TB/27.2 TiB) > sd 0:2:1:0: [sdb] Write Protect is off > sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08 > sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enabled, doesn't > support DPO or FUA > sd 0:2:1:0: [sdb] Attached SCSI disk > > *-storage > description: RAID bus controller > product: MegaRAID SAS 2208 [Thunderbolt] > vendor: LSI Logic / Symbios Logic > physical id: 0 > bus info: pci@0000:02:00.0 > logical name: scsi0 > version: 01 > width: 64 bits > clock: 33MHz > capabilities: storage pm pciexpress vpd msi msix bus_master > cap_list rom > configuration: driver=3Dmegaraid_sas latency=3D0 > resources: irq:42 ioport:fc00(size=3D256) memory:dd7fc000-dd7fffff > memory:dd780000-dd7bffff memory:dc800000-dc81ffff(prefetchable) > *-disk:0 > description: SCSI Disk > product: PERC H710P > vendor: DELL > physical id: 2.0.0 > bus info: scsi@0:2.0.0 > logical name: /dev/sda > version: 3.13 > serial: 0049d6ce1d9f2035180096fde490f648 > size: 558GiB (599GB) > capabilities: partitioned partitioned:dos > configuration: ansiversion=3D5 signature=3D000aa336 > *-disk:1 > description: SCSI Disk > product: PERC H710P > vendor: DELL > physical id: 2.1.0 > bus info: scsi@0:2.1.0 > logical name: /dev/sdb > logical name: /mnt/xfsd > version: 3.13 > serial: 003366f71da22035180096fde490f648 > size: 27TiB (30TB) > configuration: ansiversion=3D5 mount.fstype=3Dxfs > mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,swi= dth=3D1280,noquota > state=3Dmounted > > Thank you. > > > 2013/4/10 Emmanuel Florac > >> Le Tue, 9 Apr 2013 23:10:03 +0800 >> =B7=FB=D3=C0=CC=CE =A8=A6crivait: >> >> > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected. >> > > Shutting down filesystem >> >> This. I/O error detected. That means that at some point the underlying >> device (disk, RAID array, SAN volume) couldn't be reached. So this >> could very well be a case of a flakey drive, array, cable or SCSI >> driver. >> >> What's the storage setup here? >> >> -- >> ------------------------------------------------------------------------ >> Emmanuel Florac | Direction technique >> | Intellique >> | >> | +33 1 78 94 84 02 >> ------------------------------------------------------------------------ >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --14dae9340b5f49a6b604da1a8d68 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
It happens tonight again on one of our servers, how t= o debug the root cause? Thank you.

Apr 12 02:32:10 cqdx kernel: XFS = (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22.
Apr 12 02:32= :10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22
Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called f= rom line 1184 of file fs/xfs/xfs_vnodeops.c.  Return address =3D 0xfff= fffffa02ee20a
Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected= . Shutting down filesystem
Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem and re= ctify the problem(s)
Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5 returned.
Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_fo= rce: error 5 returned.
Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned.Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned.
xfs_repair -n


Phase 7 - verify link counts...
would have reset inode 20021 nlinks from 0 to 1
would have reset inode 2= 0789 nlinks from 0 to 1
would have reset inode 35125 nlinks from 0 to 1<= br>would have reset inode 35637 nlinks from 0 to 1
would have reset inod= e 36149 nlinks from 0 to 1
would have reset inode 38197 nlinks from 0 to 1
would have reset inode 3= 9477 nlinks from 0 to 1
would have reset inode 54069 nlinks from 0 to 1<= br>would have reset inode 62261 nlinks from 0 to 1
would have reset inod= e 63029 nlinks from 0 to 1
would have reset inode 72501 nlinks from 0 to 1
would have reset inode 7= 9925 nlinks from 0 to 1
would have reset inode 81205 nlinks from 0 to 1<= br>would have reset inode 84789 nlinks from 0 to 1
would have reset inod= e 87861 nlinks from 0 to 1
would have reset inode 90663 nlinks from 0 to 1
would have reset inode 9= 1189 nlinks from 0 to 1
would have reset inode 95541 nlinks from 0 to 1<= br>would have reset inode 98101 nlinks from 0 to 1
would have reset inod= e 101173 nlinks from 0 to 1
would have reset inode 113205 nlinks from 0 to 1
would have reset inode = 114741 nlinks from 0 to 1
would have reset inode 126261 nlinks from 0 to= 1
would have reset inode 140597 nlinks from 0 to 1
would have reset = inode 144693 nlinks from 0 to 1
would have reset inode 147765 nlinks from 0 to 1
would have reset inode = 152885 nlinks from 0 to 1
would have reset inode 161333 nlinks from 0 to= 1
would have reset inode 161845 nlinks from 0 to 1
would have reset = inode 167477 nlinks from 0 to 1
would have reset inode 172341 nlinks from 0 to 1
would have reset inode = 191797 nlinks from 0 to 1
would have reset inode 204853 nlinks from 0 to= 1
would have reset inode 205365 nlinks from 0 to 1
would have reset = inode 215349 nlinks from 0 to 1
would have reset inode 215861 nlinks from 0 to 1
would have reset inode = 216373 nlinks from 0 to 1
would have reset inode 217397 nlinks from 0 to= 1
would have reset inode 224309 nlinks from 0 to 1
would have reset = inode 225589 nlinks from 0 to 1
would have reset inode 234549 nlinks from 0 to 1
would have reset inode = 234805 nlinks from 0 to 1
would have reset inode 249653 nlinks from 0 to= 1
would have reset inode 250677 nlinks from 0 to 1
would have reset = inode 252469 nlinks from 0 to 1
would have reset inode 261429 nlinks from 0 to 1
would have reset inode = 265013 nlinks from 0 to 1
would have reset inode 266805 nlinks from 0 to= 1
would have reset inode 267317 nlinks from 0 to 1
would have reset = inode 268853 nlinks from 0 to 1
would have reset inode 272437 nlinks from 0 to 1
would have reset inode = 273205 nlinks from 0 to 1
would have reset inode 274229 nlinks from 0 to= 1
would have reset inode 278325 nlinks from 0 to 1
would have reset = inode 278837 nlinks from 0 to 1
would have reset inode 281397 nlinks from 0 to 1
would have reset inode = 292661 nlinks from 0 to 1
would have reset inode 300853 nlinks from 0 to= 1
would have reset inode 302901 nlinks from 0 to 1
would have reset = inode 305205 nlinks from 0 to 1
would have reset inode 314165 nlinks from 0 to 1
would have reset inode = 315189 nlinks from 0 to 1
would have reset inode 320309 nlinks from 0 to= 1
would have reset inode 324917 nlinks from 0 to 1
would have reset = inode 328245 nlinks from 0 to 1
would have reset inode 335925 nlinks from 0 to 1
would have reset inode = 339253 nlinks from 0 to 1
would have reset inode 339765 nlinks from 0 to= 1
would have reset inode 348213 nlinks from 0 to 1
would have reset = inode 360501 nlinks from 0 to 1
would have reset inode 362037 nlinks from 0 to 1
would have reset inode = 366389 nlinks from 0 to 1
would have reset inode 385845 nlinks from 0 to= 1
would have reset inode 390709 nlinks from 0 to 1
would have reset = inode 409141 nlinks from 0 to 1
would have reset inode 413237 nlinks from 0 to 1
would have reset inode = 414773 nlinks from 0 to 1
would have reset inode 417845 nlinks from 0 to= 1
would have reset inode 436021 nlinks from 0 to 1
would have reset = inode 439349 nlinks from 0 to 1
would have reset inode 447029 nlinks from 0 to 1
would have reset inode = 491317 nlinks from 0 to 1
would have reset inode 494133 nlinks from 0 to= 1
would have reset inode 495413 nlinks from 0 to 1
would have reset = inode 501301 nlinks from 0 to 1
would have reset inode 506421 nlinks from 0 to 1
would have reset inode = 508469 nlinks from 0 to 1
would have reset inode 508981 nlinks from 0 to= 1
would have reset inode 511797 nlinks from 0 to 1
would have reset = inode 513077 nlinks from 0 to 1
would have reset inode 517941 nlinks from 0 to 1
would have reset inode = 521013 nlinks from 0 to 1
would have reset inode 522805 nlinks from 0 to= 1
would have reset inode 523317 nlinks from 0 to 1
would have reset = inode 525621 nlinks from 0 to 1
would have reset inode 527925 nlinks from 0 to 1
would have reset inode = 535605 nlinks from 0 to 1
would have reset inode 541749 nlinks from 0 to= 1
would have reset inode 573493 nlinks from 0 to 1
would have reset = inode 578613 nlinks from 0 to 1
would have reset inode 583029 nlinks from 0 to 1
would have reset inode = 585525 nlinks from 0 to 1
would have reset inode 586293 nlinks from 0 to= 1
would have reset inode 586805 nlinks from 0 to 1
would have reset = inode 591413 nlinks from 0 to 1
would have reset inode 594485 nlinks from 0 to 1
would have reset inode = 596277 nlinks from 0 to 1
would have reset inode 603189 nlinks from 0 to= 1
would have reset inode 613429 nlinks from 0 to 1
would have reset = inode 617781 nlinks from 0 to 1
would have reset inode 621877 nlinks from 0 to 1
would have reset inode = 623925 nlinks from 0 to 1
would have reset inode 625205 nlinks from 0 to= 1
would have reset inode 626741 nlinks from 0 to 1
would have reset = inode 639541 nlinks from 0 to 1
would have reset inode 640053 nlinks from 0 to 1
would have reset inode = 640565 nlinks from 0 to 1
would have reset inode 645173 nlinks from 0 to= 1
would have reset inode 652853 nlinks from 0 to 1
would have reset = inode 656181 nlinks from 0 to 1
would have reset inode 659253 nlinks from 0 to 1
would have reset inode = 663605 nlinks from 0 to 1
would have reset inode 667445 nlinks from 0 to= 1
would have reset inode 680757 nlinks from 0 to 1
would have reset = inode 691253 nlinks from 0 to 1
would have reset inode 691765 nlinks from 0 to 1
would have reset inode = 697653 nlinks from 0 to 1
would have reset inode 700469 nlinks from 0 to= 1
would have reset inode 707893 nlinks from 0 to 1
would have reset = inode 716853 nlinks from 0 to 1
would have reset inode 722229 nlinks from 0 to 1
would have reset inode = 722741 nlinks from 0 to 1
would have reset inode 723765 nlinks from 0 to= 1
would have reset inode 731957 nlinks from 0 to 1
would have reset = inode 742965 nlinks from 0 to 1
would have reset inode 743477 nlinks from 0 to 1
would have reset inode = 745781 nlinks from 0 to 1
would have reset inode 746293 nlinks from 0 to= 1
would have reset inode 774453 nlinks from 0 to 1
would have reset = inode 778805 nlinks from 0 to 1
would have reset inode 785013 nlinks from 0 to 1
would have reset inode = 785973 nlinks from 0 to 1
would have reset inode 791349 nlinks from 0 to= 1
would have reset inode 796981 nlinks from 0 to 1
would have reset = inode 803381 nlinks from 0 to 1
would have reset inode 806965 nlinks from 0 to 1
would have reset inode = 811798 nlinks from 0 to 1
would have reset inode 812310 nlinks from 0 to= 1
would have reset inode 813078 nlinks from 0 to 1
would have reset = inode 813607 nlinks from 0 to 1
would have reset inode 814183 nlinks from 0 to 1
would have reset inode = 822069 nlinks from 0 to 1
would have reset inode 828469 nlinks from 0 to= 1
would have reset inode 830005 nlinks from 0 to 1
would have reset = inode 832053 nlinks from 0 to 1
would have reset inode 832565 nlinks from 0 to 1
would have reset inode = 836661 nlinks from 0 to 1
would have reset inode 841013 nlinks from 0 to= 1
would have reset inode 841525 nlinks from 0 to 1
would have reset = inode 845365 nlinks from 0 to 1
would have reset inode 846133 nlinks from 0 to 1
would have reset inode = 847157 nlinks from 0 to 1
would have reset inode 852533 nlinks from 0 to= 1
would have reset inode 857141 nlinks from 0 to 1
would have reset = inode 863271 nlinks from 0 to 1
would have reset inode 866855 nlinks from 0 to 1
would have reset inode = 887861 nlinks from 0 to 1
would have reset inode 891701 nlinks from 0 to= 1
would have reset inode 894773 nlinks from 0 to 1
would have reset = inode 900149 nlinks from 0 to 1
would have reset inode 902197 nlinks from 0 to 1
would have reset inode = 906293 nlinks from 0 to 1
would have reset inode 906805 nlinks from 0 to= 1
would have reset inode 909877 nlinks from 0 to 1
would have reset = inode 925493 nlinks from 0 to 1
would have reset inode 949543 nlinks from 0 to 1
would have reset inode = 955175 nlinks from 0 to 1
would have reset inode 963623 nlinks from 0 to= 1
would have reset inode 967733 nlinks from 0 to 1
would have reset = inode 968231 nlinks from 0 to 1
would have reset inode 982069 nlinks from 0 to 1
would have reset inode = 1007413 nlinks from 0 to 1
would have reset inode 1011509 nlinks from 0 = to 1
would have reset inode 1014069 nlinks from 0 to 1
would have res= et inode 1014581 nlinks from 0 to 1
would have reset inode 1022005 nlinks from 0 to 1
would have reset inode= 1022517 nlinks from 0 to 1
would have reset inode 1023029 nlinks from 0= to 1
would have reset inode 1025333 nlinks from 0 to 1
would have re= set inode 1043765 nlinks from 0 to 1
would have reset inode 1044789 nlinks from 0 to 1
would have reset inode= 1049397 nlinks from 0 to 1
would have reset inode 1050933 nlinks from 0= to 1
would have reset inode 1051445 nlinks from 0 to 1
would have re= set inode 1054261 nlinks from 0 to 1
would have reset inode 1060917 nlinks from 0 to 1
would have reset inode= 1063477 nlinks from 0 to 1
would have reset inode 1076021 nlinks from 0= to 1
would have reset inode 1081141 nlinks from 0 to 1
would have re= set inode 1086261 nlinks from 0 to 1
would have reset inode 1097269 nlinks from 0 to 1
would have reset inode= 1099829 nlinks from 0 to 1
would have reset inode 1100853 nlinks from 0= to 1
would have reset inode 1101877 nlinks from 0 to 1
would have re= set inode 1126709 nlinks from 0 to 1
would have reset inode 1134389 nlinks from 0 to 1
would have reset inode= 1141045 nlinks from 0 to 1
would have reset inode 1141557 nlinks from 0= to 1
would have reset inode 1142581 nlinks from 0 to 1
would have re= set inode 1148469 nlinks from 0 to 1
would have reset inode 1153333 nlinks from 0 to 1
would have reset inode= 1181749 nlinks from 0 to 1
would have reset inode 1192245 nlinks from 0= to 1
would have reset inode 1198133 nlinks from 0 to 1
would have re= set inode 1203765 nlinks from 0 to 1
would have reset inode 1221429 nlinks from 0 to 1
would have reset inode= 1223989 nlinks from 0 to 1
would have reset inode 1235509 nlinks from 0= to 1
would have reset inode 1239349 nlinks from 0 to 1
would have re= set inode 1240885 nlinks from 0 to 1
would have reset inode 1241397 nlinks from 0 to 1
would have reset inode= 1241909 nlinks from 0 to 1
would have reset inode 1242421 nlinks from 0= to 1
would have reset inode 1244981 nlinks from 0 to 1
would have re= set inode 1246517 nlinks from 0 to 1
would have reset inode 1253429 nlinks from 0 to 1
would have reset inode= 1271861 nlinks from 0 to 1
would have reset inode 1274677 nlinks from 0= to 1
would have reset inode 1277749 nlinks from 0 to 1
would have re= set inode 1278773 nlinks from 0 to 1
would have reset inode 1286709 nlinks from 0 to 1
would have reset inode= 1288245 nlinks from 0 to 1
would have reset inode 1299765 nlinks from 0= to 1
would have reset inode 1302325 nlinks from 0 to 1
would have re= set inode 1304885 nlinks from 0 to 1
would have reset inode 1305397 nlinks from 0 to 1
would have reset inode= 1307509 nlinks from 0 to 1
would have reset inode 1309493 nlinks from 0= to 1
would have reset inode 1310517 nlinks from 0 to 1
would have re= set inode 1311029 nlinks from 0 to 1
would have reset inode 1312053 nlinks from 0 to 1
would have reset inode= 1316917 nlinks from 0 to 1
would have reset inode 1317941 nlinks from 0= to 1
would have reset inode 1320821 nlinks from 0 to 1
would have re= set inode 1322805 nlinks from 0 to 1
would have reset inode 1332789 nlinks from 0 to 1
would have reset inode= 1336373 nlinks from 0 to 1
would have reset inode 1345653 nlinks from 0= to 1
would have reset inode 1354549 nlinks from 0 to 1
would have re= set inode 1361973 nlinks from 0 to 1
would have reset inode 1369909 nlinks from 0 to 1
would have reset inode= 1372981 nlinks from 0 to 1
would have reset inode 1388853 nlinks from 0= to 1
would have reset inode 1402933 nlinks from 0 to 1
would have re= set inode 1403445 nlinks from 0 to 1
would have reset inode 1420085 nlinks from 0 to 1
would have reset inode= 1452853 nlinks from 0 to 1
would have reset inode 1456437 nlinks from 0= to 1
would have reset inode 1457973 nlinks from 0 to 1
would have re= set inode 1459253 nlinks from 0 to 1
would have reset inode 1467957 nlinks from 0 to 1
would have reset inode= 1471541 nlinks from 0 to 1
would have reset inode 1476661 nlinks from 0= to 1
would have reset inode 1479733 nlinks from 0 to 1
would have re= set inode 1483061 nlinks from 0 to 1
would have reset inode 1484085 nlinks from 0 to 1
would have reset inode= 1486133 nlinks from 0 to 1
would have reset inode 1489461 nlinks from 0= to 1
would have reset inode 1490037 nlinks from 0 to 1
would have re= set inode 1492021 nlinks from 0 to 1
would have reset inode 1493557 nlinks from 0 to 1
would have reset inode= 1494069 nlinks from 0 to 1
would have reset inode 1496885 nlinks from 0= to 1
would have reset inode 1498421 nlinks from 0 to 1
would have re= set inode 1498933 nlinks from 0 to 1
would have reset inode 1499957 nlinks from 0 to 1
would have reset inode= 1506101 nlinks from 0 to 1
would have reset inode 1507637 nlinks from 0= to 1
would have reset inode 1510453 nlinks from 0 to 1
would have re= set inode 1514293 nlinks from 0 to 1
would have reset inode 1517365 nlinks from 0 to 1
would have reset inode= 1520693 nlinks from 0 to 1
would have reset inode 1521973 nlinks from 0= to 1
would have reset inode 1530421 nlinks from 0 to 1
would have re= set inode 1530933 nlinks from 0 to 1
would have reset inode 1537333 nlinks from 0 to 1
would have reset inode= 1538357 nlinks from 0 to 1
would have reset inode 1548853 nlinks from 0= to 1
would have reset inode 1553973 nlinks from 0 to 1
would have re= set inode 1557301 nlinks from 0 to 1
would have reset inode 1564213 nlinks from 0 to 1
would have reset inode= 1564725 nlinks from 0 to 1
would have reset inode 1576501 nlinks from 0= to 1
would have reset inode 1580597 nlinks from 0 to 1
would have re= set inode 1584693 nlinks from 0 to 1
would have reset inode 1586485 nlinks from 0 to 1
would have reset inode= 1589301 nlinks from 0 to 1
would have reset inode 1589813 nlinks from 0= to 1
would have reset inode 1592629 nlinks from 0 to 1
would have re= set inode 1595701 nlinks from 0 to 1
would have reset inode 1601077 nlinks from 0 to 1
would have reset inode= 1623861 nlinks from 0 to 1
would have reset inode 1626677 nlinks from 0= to 1
would have reset inode 1627701 nlinks from 0 to 1
would have re= set inode 1633333 nlinks from 0 to 1
would have reset inode 1639221 nlinks from 0 to 1
would have reset inode= 1649205 nlinks from 0 to 1
would have reset inode 1686325 nlinks from 0= to 1
would have reset inode 1690677 nlinks from 0 to 1
would have re= set inode 1693749 nlinks from 0 to 1
would have reset inode 1704757 nlinks from 0 to 1
would have reset inode= 1707061 nlinks from 0 to 1
would have reset inode 1709109 nlinks from 0= to 1
would have reset inode 1719349 nlinks from 0 to 1
would have re= set inode 1737013 nlinks from 0 to 1
would have reset inode 1741365 nlinks from 0 to 1
would have reset inode= 1747509 nlinks from 0 to 1
would have reset inode 1770805 nlinks from 0= to 1
would have reset inode 1780789 nlinks from 0 to 1
would have re= set inode 1793589 nlinks from 0 to 1
would have reset inode 1795125 nlinks from 0 to 1
would have reset inode= 1800757 nlinks from 0 to 1
would have reset inode 1801269 nlinks from 0= to 1
would have reset inode 1802549 nlinks from 0 to 1
would have re= set inode 1804085 nlinks from 0 to 1
would have reset inode 1817141 nlinks from 0 to 1
would have reset inode= 1821749 nlinks from 0 to 1
would have reset inode 1832757 nlinks from 0= to 1
would have reset inode 1836341 nlinks from 0 to 1
would have re= set inode 1856309 nlinks from 0 to 1
would have reset inode 1900597 nlinks from 0 to 1
would have reset inode= 1902901 nlinks from 0 to 1
would have reset inode 1912373 nlinks from 0= to 1
would have reset inode 1943093 nlinks from 0 to 1
would have re= set inode 1944373 nlinks from 0 to 1
would have reset inode 1954101 nlinks from 0 to 1
would have reset inode= 1955893 nlinks from 0 to 1
would have reset inode 1961781 nlinks from 0= to 1
would have reset inode 1974325 nlinks from 0 to 1
would have re= set inode 1978677 nlinks from 0 to 1
would have reset inode 1981237 nlinks from 0 to 1
would have reset inode= 1992245 nlinks from 0 to 1
would have reset inode 2000949 nlinks from 0= to 1
would have reset inode 2002229 nlinks from 0 to 1
would have re= set inode 2004789 nlinks from 0 to 1
would have reset inode 2005301 nlinks from 0 to 1
would have reset inode= 2011189 nlinks from 0 to 1
would have reset inode 2012981 nlinks from 0= to 1
would have reset inode 2015285 nlinks from 0 to 1
would have re= set inode 2018869 nlinks from 0 to 1
would have reset inode 2028341 nlinks from 0 to 1
would have reset inode= 2028853 nlinks from 0 to 1
would have reset inode 2030901 nlinks from 0= to 1
would have reset inode 2032181 nlinks from 0 to 1
would have re= set inode 2032693 nlinks from 0 to 1
would have reset inode 2040117 nlinks from 0 to 1
would have reset inode= 2053685 nlinks from 0 to 1
would have reset inode 2083893 nlinks from 0= to 1
would have reset inode 2087221 nlinks from 0 to 1
would have re= set inode 2095925 nlinks from 0 to 1
would have reset inode 2098741 nlinks from 0 to 1
would have reset inode= 2100533 nlinks from 0 to 1
would have reset inode 2101301 nlinks from 0= to 1
would have reset inode 2123573 nlinks from 0 to 1
would have re= set inode 2132789 nlinks from 0 to 1
would have reset inode 2133813 nlinks from 0 to 1





2013/4= /10 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
The storage info is as foll= owing:
RAID-6
SATA HDD
Controller: PERC H710P Mini (Embedded)
Disk /dev/sdb: 30000.3 GB, 30000= 346562560 bytes
255 heads, 63 sectors/track, 3647334 cylinders
Units =3D cylinders of 16065 * 512 =3D 8225280 bytes
Sector = size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/= optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

sd 0:2:1:0: [sdb] 58594426880 512-byte logical blo= cks: (30.0 TB/27.2 TiB)
sd 0:2:1:0: [sdb] Write Protect is off
sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08
sd 0:2:1:0: [sd= b] Write cache: enabled, read cache: enabled, doesn't support DPO or FU= A
sd 0:2:1:0: [sdb] Attached SCSI disk

*-storage               
       description: RAID bus controller
&n= bsp;      product: MegaRAID SAS 2208 [Thunderbolt]
       vendor: LSI Logic / Symbios Logic
&nbs= p;      physical id: 0
       = bus info: pci@0000:02:00.0
       logical nam= e: scsi0
       version: 01
  =      width: 64 bits
       clock: 33MHz
      &nbs= p;capabilities: storage pm pciexpress vpd msi msix bus_master cap_list rom<= /div>
       configuration: driver=3Dmegaraid_sas l= atency=3D0
       resources: irq:42 ioport:fc= 00(size=3D256) memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff memory:dc8= 00000-dc81ffff(prefetchable)
     *-disk:0
        &nb= sp; description: SCSI Disk
          pro= duct: PERC H710P
          vendor: DELL<= /div>
          physical id: 2.0.0
&= nbsp;         bus info: scsi@0:2.0.0
          logical name: /dev/sda
&n= bsp;         version: 3.13
    &nbs= p;     serial: 0049d6ce1d9f2035180096fde490f648
  =         size: 558GiB (599GB)
    &n= bsp;     capabilities: partitioned partitioned:dos
          configuration: ansiversion=3D5 sign= ature=3D000aa336
     *-disk:1
  &n= bsp;       description: SCSI Disk
    &n= bsp;     product: PERC H710P
       = ;   vendor: DELL
          physical= id: 2.1.0
          bus info: scsi@0:2.1.0
&n= bsp;         logical name: /dev/sdb
  &n= bsp;       logical name: /mnt/xfsd
    &= nbsp;     version: 3.13
        &nb= sp; serial: 003366f71da22035180096fde490f648
          size: 27TiB (30TB)
 =         configuration: ansiversion=3D5 mount.fstype=3D= xfs mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,s= width=3D1280,noquota state=3Dmounted

Thank you.
<= div>


2013/4/10 Emmanuel= Florac <eflorac@intellique.com>
Le Tue, 9 Apr 2013 23:10:03 +0800
=B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com> =A8=A6crivait:

> > Apr  9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected.<= br> > > Shutting down filesystem

This. I/O error detected. That means that at some point the underlyin= g
device (disk, RAID array, SAN volume) couldn't be reached. So this
could very well be a case of a flakey drive, array, cable or SCSI
driver.

What's the storage setup here?

--
------------------------------------------------------------------------ Emmanuel Florac     |   Direction technique
                    | &nb= sp; Intellique
                    | &nb= sp; <eflorac= @intellique.com>
                    | &nb= sp; +33 1 78 94 84 02
------------------------------------------------------------------------



--
=B7=FB=D3=C0= =CC=CE



--
=B7=FB=D3=C0=CC=CE
--14dae9340b5f49a6b604da1a8d68-- From moises@iga.pt Thu Apr 11 14:23:08 2013 Return-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=OBFU_TEXT_ATTACH autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 42B5B7F37 for ; Thu, 11 Apr 2013 14:23:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A1FEBAC004 for ; Thu, 11 Apr 2013 12:23:04 -0700 (PDT) X-ASG-Debug-ID: 1365708180-04cb6c2c1ea1580001-NocioJ Received: from mail.iga.pt (145.172.18.212.rev.vodafone.pt [212.18.172.145]) by cuda.sgi.com with ESMTP id EZtcrBqITk1uBgpC (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 11 Apr 2013 12:23:01 -0700 (PDT) X-Barracuda-Envelope-From: moises@iga.pt X-Barracuda-Apparent-Source-IP: 212.18.172.145 Received: from jianecha-d24fb7 (219.138.236.181) by mail.iga.pt (192.168.0.53) with Microsoft SMTP Server id 8.3.298.1; Thu, 11 Apr 2013 20:22:57 +0100 From: 9 Subject: =?GB2312?B?YdSxuaTOtMzhx7AzMMjVzajWqsbz0rW8tNfU0NDA69aw?= To: X-ASG-Orig-Subj: =?GB2312?B?YdSxuaTOtMzhx7AzMMjVzajWqsbz0rW8tNfU0NDA69aw?= MIME-Version: 1.0 Date: Fri, 12 Apr 2013 03:23:00 +0800 Content-Type: application/octet-stream; name="=?GB2312?B?YcrU08PG2rncwO0udHh0?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?GB2312?B?YcrU08PG2rncwO0udHh0?=" Message-ID: <91e3f7f4-9afb-4a3b-96b4-b3a0d4e29170@srv-exc.iga.local> X-Barracuda-Connect: 145.172.18.212.rev.vodafone.pt[212.18.172.145] X-Barracuda-Start-Time: 1365708181 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.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_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127835 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 DQoNCg0KICAgICAgICAgICAgICAgIKG2wM22r7rPzay3qKG3oaKhtsnnu+Gxo8/Vt6iht6Gioba5 pMnLsaPP1cz1wP2ht8q1stnTprbUDQoNCiAgICAgICAgICAgICAgICAgICAgst/C1NPr09DQp7X3 uNq199C9oaK94rnNtMfNy7ywzqW8zc7KzOLUsbmktKbA7by8x8kNCg0KDQogICAgICAgICAgICAg ICAgICAgMjAxM8TqNNTCMTAtLTExyNWjqMnPuqOjqSChoiAyMDEzxOo01MIxMy0tMTTI1aOot/DJ vaOpDQoNCiAgICAgICAgICAgICAgICAgICAyMDEzxOo01MIyNi0tMjfI1aOoye7b2qOpIKGiIDIw MTPE6jXUwjQtLTXI1SAgo6i2q924o6kNCg0KICAgICAgICAgICAgICAgICAgIDIwMTPE6jXUwjEw LS0xMcjVo6jJz7qjo6kgoaIgMjAxM8TqNdTCMTctLTE4yNWjqLnj1t2jqQ0KDQogICAgICAgICAg ICAgICAgICAgMjAxM8TqNdTCMjQtLTI1yNWjqLGxvqmjqSChoiAyMDEzxOo21MIxLS0yyNUgIKOo s8m2vKOpDQqppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWp pamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlDQqhvtb3sOy1pc67 ob/QwiC/xiDF4CDTlg0KDQqhvtGn1LG21M/zob+2rcrCs6Shotfcvq3A7aGiuLHX3L6twO2hosjL wabXytS019y84C++rcDtL9eo1LG8sMjLysLQ0NX+udzA7cjL1LGhormku+G4ybK/oaK3qM7xDQog ICAgICAgICAgICDIy9SxvLDP4LnYudzA7cjL1LGhos/gudjCycqmtcihow0KDQqhvrfRPT09PdPD ob8yNTAw1KovMszsL8jLKLD8wKjF4NG1oaLF4NG1vcyyxKGiwb3M7M7nss2hotLUvLDJz8/Czuey 6LXjtcgpICANCqmlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWp pamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaUNCqHxv84gs8wg sbMgvrCjug0KDQoyMDA4xOrS1MC0o6zO0rn6z8i687P2zKihosq1yqnBy6G2wM22r7rPzay3qKG3 oaKhtsDNtq/V+dLptfe94tbZssO3qKG3oaKhtsDNtq/V+dLpy763qL3iys2jqMj9DQqjqaG3oaKh tsnnu+Gxo8/Vt6iht6Gioba5pMnLsaPP1cz1wP2ht6Oo0N7V/bC4o6m1yLeowsm3qLnmoaMNCg0K wM22r7rPzay3qLXEyrXKqaOsv82528nP0qrH89PDyMu1pc671NrAzbav08O5pLncwO23vcPm1/a1 vaGwvqvPuLuvobGjrLfx1PK9q8TR0tTWpMP3wM22r9XfobCyuw0Kus+48aGisrvKpMjOuaTX96Gi 0c/W2Mqn1rChotHP1tjOpbzNzqW55qGxo6y4/MTR0tS9+NDQus+3qNPQ0Ke1xKGwtfe42rX30L2h or3iuc20x83LobGju8jnufvTww0KyMu1pc67x7/Q0LbUwM22r9XfvfjQ0LX3uNq199C9oaK94rnN tMfNy6OsxMfDtNPDyMu1pc67vavD5sHZvt6087XExeKzpbfnz9WjrMbkudzA7ciozf7Ssr2ryty1 vQ0K0c++/rXEzPTVvaOhDQoNCsvm18Whtrmkycuxo8/VzPXA/aG3tcTQ3rjEus2htsnnu+Gxo8/V t6iht7XEs/bMqKOs08PIy7Wlzru1xNPDuaSzybG+sdjIu7340ruyvczhuN+jrMjnus7U2rrPt6gN CrXEu/m0ocnPo6y55re208O5pLncwO2jrLz1ydmyu7HY0qq1xLPJsb7Wp7P2o6zKx7njtPPTw8jL taXOu8bI1NrDvL3etcTOyszio6HLq7e90K3JzNK71sKyu7LOvNMNCsnnu+Gxo8/Vo6zKx7fx09DQ p6O/t6LJ+rmkycvKwrnKo6zI57rO09DQp9OmttSjrMurt729+NDQy73ByyzKx7fxsbu3qMLJyM+/ ySy1sdbQtObU2sTE0Km358/Vo78NCg0KzqrBy7nmsdzJz8r208O5pLfnz9WjrLK7ydnG89K1ssnT w8HLobDAzc7xxcnHsqGx08O5pMSjyr2ju7Wry+bWrrb4wLS1xNPDuaS53MDt17S/9si01L3AtNS9 u+zC0g0KLMvm1q7S/beitcS3qMLJt+fP1c7KzOLSstS9wLTUvbi01NMhobDAzc7xxcnHsqGxs8nO qs/Wvde2zrXEyMi147uwzOLWrtK7o6HU2qG2wM22r7rPzay3qKG3oaKhtg0Kyee74bGjz9W3qKG3 z8KjrKGwwM3O8cXJx7Khsb2rus7IpbrOtNOjrMTct/GhsNLstdiyzrGjobGjrMTct/G55rHc0rvQ qcP0uNC1xLeowsm358/Vo7/Azc7xxcnHsg0K08O5pMSjyr3W0KOs06a4w8jnus7A7cuzuPe3vbnY z7WjrMjnus63wLe2t6jCybfnz9WjrMjnus7GvbriuPe3vcD70uajvw0KDQrOqrDv1vq547TzxvPS tcHLveK5+rzSz+C52LeowsnV/rLfo6zVxs7V0K2199SxuaS52M+1tcS8vMfJ0tS8sLfAt7bAzbav 1fnS6aOs09DQp7X31fvTw7mkveG5uaOsDQrN6snGudzA7crWts6jrL21tc3Tw7mkt6jCybfnz9W6 zbPJsb61yM7KzOKjrMzY0fvO0rn6ye7az7ncwO3WrrXAtcTWqsP7wM22r7eo0+vUsbmkudjPtbnc wO3KtdW9DQrXqLzS1tPTwOmmwM/Kptb3vbKhsKG2wM22r7rPzay3qKG3oaKhtsnnu+Gxo8/Vt6ih t6Gioba5pMnLsaPP1cz1wP2ht8q1stnTprbUst/C1NPr09DQp7X3uNq199C9DQqhor3iuc20x83L vLDOpbzNzsrM4tSxuaS0psDtvLzHyaGxuN+8ttHQzNa74aGju7bTrcbzysLStbWlzru7/byr1+nW r8/gudjIy9Sxss6809HQzNbRp8+wo6zS1LDvDQrW+sbz0rXT0NCnt8C3treowsm358/VsqK94r72 yrW8ysDNtq/Tw7mkzsrM4qOhDQqppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWp pamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppaml DQqh8SC/ziCzzCC08yC42aO6o6i31s/tMjC24Lj2vq215LC4wP2jqQ0KDQrSu6Gi1dDGuMjr1rDT 68rU08PG2rncwO2y38LUDQoxLsDNtq/V38bb1anTpsa4o6zKwrrzsbvG89K1veK5zaOs1NrW2bLD xtq85KOswM22r9Xfv8nE3Nf3s/bIw8bz0rW068rWsru8sLXEv7mx57nbteOjrMbz0rW4w8jnDQq6 zrvY06a78tXf1NrI1bOj1tCyycihxMTQqbfAt7ay38LUo78NCjIuxvPStcrHt/HQ6NKq0+u3qMjL tPqx7aGitq3KwrOkoaLX3L6twO2hotfcssOhoteo1rC5ybarx6m2qcDNtq+6z82so6yyu8ep09C6 zrfnz9Wjvw0KMy7I57n7wM22r9Xfvei5ys3P0dO78r7cvvjHqbapwM22r7rPzay1xKOs08PIy7Wl zrvI57rO06a21KO/IA0KNC7I69awuvO12jI1zOzHqbapus/NrNPQzt6358/Vo6zKssO0yrG68s6q 1+680cqxvOTHqcrwwM22r7rPzayjvw0KNS7K1NPDxtrX7rrzMczstMfNy9SxuaSjrMbz0rXF4rOl tcS4xcLKt8ezo7jfo6zG89K1uMPI57rOzerJxsrU08PG2rXEveK5zcH3s8yjrLLFsdzD4rC4vP6w 3Mvfo78NCjYuytTTw8ba0tShsLK7yqTIzrmk1/ehsc6q08m94rnNwM22r9Xfyse38bTm1Nq358/V o6y4w8jnus67r73io78NCjcuxvPStdLUobCyu7f7us+42s67zPW8/qGisru3+7rPwrzTw8z1vP6h orK7us+48aGxveK5zcDNtq/V39L9t6LV+dLpo6zG89K1uMPM4bmpxMTQqdakvt2jrLLFyLcNCrGj waLT2rK7sNzWrrXYo78NCg0Ktv6hosjnus7T0NCntfe42rX30L0NCjguxvPStc2os6O4+b7dvq3T qtDo0qq2+LX31fvUsbmktcS42s67u/K12LXjo6y1q8rH1LG5pL/JzOGz9rG7xsi94rP9sqLL98Xi vq28w7K5s6WjrMbz0rXI1bOj1tANCrjDyOe6ztf2o6yyxcTcu6+94rfnz9W78rHcw+KwuLz+sNzL 36O/DQo5LsDNtq+6z82s1Ly2qLXEuNrOu8q1vMrJz7eiyfqx5Luvo6y1q8O709Cw7MDtz+C52MrW 0PijrNSxuaS1vdDCuNrOu9K7ts7KsbzkuvOjrMi00qrH87vWuLS1vdStDQq42s67o6zN+c35s8nB oqOsxMfDtMbz0rW4w8jnus6/ubHnoaK4w8jnus7UpLfAo78NCjEwLryo0KfEv7Hqsru6z7eous/A 7bXEo6zN+c35srvE3Nf3zqq64sG/wM22r9Xfyse38aGwyqTIzrmk1/ehsbXE0sC+3aOsxvPStbjD 1PXR+cnotqi8qNCnxL+x6iwNCrLFxNzX986quuLBv7Hq17yjvw0KMTEu1LG5pMjPzay8qNCnv7y6 y73hufujrLWrysfG89K11NqhsLv509qyu8qkyM65pNf3tvi197jatffQvaGiveK5zbTHzcuhsbXE sLi8/tbQu7nKx7Dcy98sxMfDtA0KxvPStbjDyOe6zr+5see78sjVs6PW0NT10fnX9qOsssXE3LHc w+Kw3Mvft+fP1aO/DQoxMi7G89K1uPm+3byo0Ke/vLrLveG5+7/bvPXUsbmkvKjQp72xvfCjrLrc tuDKsbrysbvIz7aot8e3qL/Lv9u5pNfKLMbz0rW4w8jnus6/ubHnu/LI1bOj1tDU9dH5DQrX9qOs ssXE3LuvveK358/Vu/Kx3MPisNzL36O/DQoxMy7UsbmksrvKpMjOuaTX96OsxvPStcTct/G199X7 xuS42s67o6y197jauvPE3LfxtaW3vb21tc3G5NC9s+qjv8jnus6y2df3o6yyxcTctfe42r210L2j vw0KMTQuxa7WsLmk0N2y+rzZzeqxz7rzo6zN+c351K242s670tG+rdPQxuTL+82sysK4utTwo6zF rtawuaTN+c35sru908rc0MK42s67o6zOqrTLt6LJ+sDNtq/V+dLpLA0KxvPStbjDyOe6ztf2o6yy xcTcu6+94rDcy9+1xLfnz9Wjvw0KDQrI/aGiyOe6ztPQ0Ke94rnNtMfNyw0KMTUuyrXQ0MSpzrvM 1Myt1sajrNLUxKnOu8XFw/vOqtPJveK5zdSxuaSjrNbZssO7+rm5zfnN+cjPtqjG89K1t8e3qL3i uc3UsbmkLMTHw7TG89K1yNWzo9bQuMPI5w0Kus7X9qOsssWx3MPisLi8/rDcy9+jrLHcw+LWp7i2 vq28w7K5s6W78sXis6W98KO/DQoxNi7S1KGw1+nWr7zcubm199X7LM7eus/KyrjazruwssXFobHO qtPJveK5zdSxuaSjrMrHt8ezo7f7us+zo8DttcTX9reoo6y1q835zfmxu9bZssO7+rm5yM+2qMbz DQrStbfHt6i94rnNo6zG89K1uMPI57rO1/ajrLLFsdzD4rC4vP6w3Mvfo78NCjE3Lsbz0rXT68DN tq/V39Ctycy94rP9wM22r7rPzayyosrpw+bUvLao1qe4tsrKtbG1xL6tvMOyubOlyv227izKwrrz wM22r9Xf17fM1r6tvMOyubOltcSy7rbusr8NCrfWo6zW2bLDu/q5ubrcv8nE3Nans9bAzbav1d+1 xMvfx/OjrMbz0rXI1bOj1tC4w8jnus60tNbGoaLK1byv1qS+3aOsssWx3MPisLi8/rDcy9+jvw0K MTguxeDRtbf+zvHG2s60tb3G2qOstvjAzbavus8gzay1vcbao6zG89K11tXWucDNtq+6z82stcSj rNbZssPG2rzkzfnN+bG7yM+2qMr009rM4cewt8e3qL3is/3AzQ0Ktq+6z82so6zG89K1uMPI57rO 1/ajrLLFsdzD4rC4vP6w3Mvfo78NCjE5LtSxuaTOtMzhx7AzMMjVzajWqsbz0rW8tNfU0NDA69aw o6zKx7fxubmzycDNILav1d/OpbeoveKz/aO/xvPStbjDyOe6ztf2o6yyxcTcvbW1zbfnz9WzybG+ o78NCrbU09rAzbav1d+1xLTH1rC7t73ao6zT0MTE0Kmx2NDr16LS4rXEt+fP1b/Y1sa146O/DQoy MC7Azbavus8gzay1vcbauvOjrL6ts6Oz9s/WuMPW1da5tcTN/LzHsOzA7dbV1rnK1tD4o6y4w9D4 x6m1xM38vMew7MDt0PjHqcrW0PijrL6tuf3Su7bOyrG85LrzDQrG89K1ssXM4bP2srmw7M/gudjK 1tD4o6y1q8rH1LG5pMi0zOGz9sXis6XSqsfzo6zG89K1t+fP1bfHs6O086O7xMfDtMbz0rW4w8jn us7X9qOsssXIt7Gjueax3MnPDQrK9rDcy9+358/Vo78NCjIxLqG2veKz/cDNILavus/NrM2o1qrK 6aG3yOe5+7Htyvayu7Wxo6zN+c35s8nOqsDNtq/V37Ty06652cu+tcTT0MGm1qS+3aOsxvPStbjD yOe6zsrp0LSjrLLFsdwNCsPisLi8/rDcy9+2+LPQtaO3qMLJ1PDIzqO/DQoyMi7ExNCpx+nQzs/C yvTT2rfHt6i94rnN1LG5pKOs0Ouz0LWjxMTQqbeoIMLJ1PDIzqOsysez0LWjMcTqMbj21MK5pNfK tcS+rbzDsrmzpbu5yscxxOoyuPbUwrmkDQrXyrXExeKzpb3wo6y0+s2o1qq98MrHt/HSqrPQtaOj rMDNtq/V38Tct/HSqsfzu9a4tMDNtq+52M+1o78NCg0Ky8Shosjnus7T0NCntKbA7c6lvM3Opbnm 1LG5pA0KMjMutKa31qGiveK5zcDNtq/V36OszfnN+dPJ09rAzbav1d++3L74x6nK1bjDzagg1qrK 6bb4tbzWwsbz0rW1xLSmt9ahor3iuc3Q0M6qsbvIz7aozqrO3tCnu/K3xw0Kt6jQ0M6qo6zEx8O0 xvPStdTayNWzo9bQuMPI57rO1/ajrLLFsdzD4rC4vP6w3Mvfo78NCjI0LrbU09rOpbzNzqW55rXE tvHS4s7KzOLUsbmko6zL+8PHzfnN+b7cvvjM4b27obYgvOzM1srpobe78rfxyM/OpbzNzqW55rXE ysLKtaOsxvPStbjDyOe6zrS01sYNCqGiytW8r9akvt2jrLLFsdzD4rC4vP6w3Mvftviz0LWjt6jC ydTwyM6jvw0KMjUuyOe6zr340NDOpbzN1LG5pLXEysLKtbX3sumhotakvt25zLaoo6y21NPazqW8 zdSxuaSjrLK/w8W+rcDt06bXotLixMTQqcjVs6PPuL3azsrM4qO/DQoyNi621NPazqW8zdSxuaSj rMrCt6K688qyw7TKsbzktKbA7aOsyOe6zsrp0LShts6lvM3OpbnmtKa31s2o1qrK6aG3o78NCjI3 LtT10fnA7b3iobDRz9bYzqW3tNPDyMu1pc67tcS55tXC1sa2yLXEobEsyOe6ztTaobazzbejzPXA /aG31tDP6s+4w/fIt86lvM3OpbnmtcShsNK7sOPOpbe0obENCqGiobC9z9bYzqW3tKGxvLChsNHP 1tjOpbe0obGjvw0KMjgu1rHP37K/w8W+rcDtycPX1L/azbe0x83L1LG5pKOs1tmyw7v6ubnN+c35 yM+2qMbz0rW3x7eoveK5zdSxuaSjrMTHw7TG89K1yNWzo9bQuMPI57rO1/YsssWx3A0Kw+KwuLz+ sNzL36OssdzD4taxz9++rcDt1L3IqLSmt9bUsbmko78NCjI5LsDNtq/V37K7tMe2+LHwoaLO3rnK v/W5pLmko6zItNb31cWxu8bz0rW/2s23veIguc2jrM35zfm1w7W91tmyw7v6ubm1xNans9ajrMTH w7TG89K1yNWzo9bQuMMNCsjnus7X9qOsssWx3MPisLi8/rDcy9+jvw0KMzAuyOe6zr3ntqihsNbY tPPL8LqmobGjrKGw1ti088vwuqahscrHt/Gx2NDrzOXP1s6q1OyzydaxvdO1xL6tvMPL8Mqno78N CjMxLrLJ08OhsMK80vTCvM/zobG3vcq9tLTWxqGisaPB9LXE1qS+3aOst6jUusrHt/GyydDFo7vG 89K1xNqyv09Bz7XNs7vyRVJQz7XNs8nPtcTXysHPxNy38df3zqoNCtakvt3KudPDo7u159fT08q8 /qGiyta7+rbM0MXE3Lfx1/fOqtakvt3KudPDo78NCg0KzuWhornm1cLWxrbIoaKhttSxuaTK1rLh obfXq9C0st/C1NPrt+fP1dOmttQNCjMyLsjnus7Uy9PDuebVwtbGtsihoqG21LG5pMrWsuGht9Sk t8DAzbav08O5pLfnz9Wjvw0KMzMu08PIy7WlzrvQ6NKqxMTQqbnm1cLWxrbIo7/Usbmkytay4bjD sPy6rMTE0KnE2sjdo78NCjM0LtbGtsi55tXCoaLUsbmkytay4bXEs6O8+7fnz9XOyszi09DExNCp o6zI57rOu6+94qO/DQozNS7WxraouebVwtbGtsihotSxuaTK1rLhtcS3qLaos8zQ8sq1zvGy2df3 vLzHyaO7DQozNi63x7n609DG89K1yOe6ztfpvajWsLmktPqx7bTzu+GjrLLFyLexo8Px1vezzNDy us+3qKO/DQozNy7I57rO1KS3wLnm1cLWxrbIzqW3tLeowsm3qLnmtcS55raoy/m0+MC0tcS358/V o78NCg0KwfmhoqG2yee74bGjz9W3qKG3yrXO8bLZ1/ey38LUvLC358/Vt8C3tg0KMzgu08PIy7Wl zruyu7DswO3J57GjoaLNz8e3yeexo7fRu/Kyu9fjtu69ycTJyeexo6Os09DKssO0t6jCydTwyM6j vw0KMzkuytTTw8bavOSjrMrHt/Gx2NDrvcnEycnnu+Gxo8/Vo78NCjQwLsjr1rDKscDNtq/V38e/ wdKyu7LOvNPJ57Gjo6zA69awyrHSqsfzsrm9ybvy1qe4ts/WvfCjrMjnus60psDto78NCjQxLtSx uaSyu9S40uLC8snnsaO78tSxuaTX1NS4vbW1zc22saO7+cr9o6yyotPrtaXOu8ep09DQrdLptcTH 6b/2z8KjrLjD0K3S6crHt/HT0NCno78NCjQyLtLytdrI/be9tcTU8MjOtviy+sn60r3BxrfR08O1 xKOsxNy38bGoz/qjvw0KNDMuxvPStdCt1vq0x9aw1LG5pMatyKHKp9K1saPP1b3wo6zT0Mqyw7S3 qMLJt+fP1aO/DQo0NC7KssO0x+m/9s/Cv8nS1M/tytzJ+tP9vfLM+aO/zqW8zcn60/3V38Tct/HP 7crcsvq82aOsxNy38bG7veK5zaO/DQo0NS7Tw8jLtaXOu7K7s/a+36G2wOvWsNakw/eht7XEo6zT 0Mqyw7S3qMLJ1PDIzqO/DQoNCsbfoaKhtrmkycuxo8/VzPXA/aG3yrXO8bLZ1/ey38LUvLC358/V t8C3tg0KNDYuyvTT2rmkycu3ts6ntcTH6dDO09DExNCpo7+yu7XDyM+2qM6quaTJy7XEx+nQztPQ xMTQqaO/DQo0Ny7U9dH5wO294snPz8Kw4M2+1tCjv9T10fm/2NbGxtq85LXEt+fP1aO/DQo0OC7S 8rmk1/fQ6NKq06az6rrIvsa1vNbCy8DN9qOsxNy38cjPtqjOqrmkycujvw0KNDkuuaTJy9SxuaS9 6LnKvty++Li0uaSjrMjnus60psDto78NCjUwLrmkycvUsbmkvei5yr7cvvjF5LrP1/bJy7LQvPi2 qKOsyOe6zrSmwO2jvw0KNTEu0tG+rcjPtqjOqrmkycu1xNawuaTRz9bYzqW8zc6lueajrMbz0rXE 3LfxveKz/brPzayjvw0KNTIuttTT2rXayP3Iy9Tss8m1xLmkIMnLysK5yqOsyOfS8rXayP3Iy9L9 t6K1xL27zajKwrnK1tCjrM7St73Lvrv6ytzJy6OsyOe6zrSmwO2jv8rcuqbIy8Tct/HSqg0Kx/O5 pMnLtP3T9tPW0qrH87XayP23vbXEyMvJ7cnLuqbF4rOlo78NCjUzLrWlzrvE3Lfx0tTJzNK1saPP 1cDtxeK/7s/uzOa0+tawuaS5pMnLxeKzpbT90/ajvw0KNTQut6LJ+rmkycvKwrnKuvOjrMbz0rXT 68DNtq/V38u9z8K6zb3io6zHqbaptcSyubOl0K3S6crHt/HT0NCno78NCg0KsMuhosDNzvHFycey yrXO8bLZ1/ey38LUvLC358/Vt8C3tg0KNTUu0MK3qM/CwM3O8cXJx7LD5sHZtcTW99Kqt+fP1dPQ xMTQqaO/DQo1Ni7Stc7xzeKw/NPrwM3O8cXJx7LI57rOu6631qO/DQo1Ny7Tw7mktaXOu8jnus65 5rHczay5pM2ss+q358/Vo78NCjU4LtPDuaS1pc67yOe6ztDQyrm21MXJx7LUsbmktcTNy7u5u/LN y7u7yKijvw0KNTku08O5pLWlzrvI57rO17e+v8XJx7LUsbmktcTL8MqnxeKzpdTwyM6jvw0KNjAu 1PXR+bnmtqjFycey1LG5pLXEtMfWsLPM0PK6zcDr1rDU8MjOo78NCjYxLsjnus60psDtzqW3tNPD uaS1pc67uebVwtbGtsi1xMXJx7LUsbmko78NCjYyLtPDuaS1pc67yOe6ztOmttTFyceyus/X99X5 0um6zcDNtq/V+dLpo78NCqmlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWp pamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaUNCqHx ob7K2l+/zl/XqF+80l+96V/J3KG/18pfye5fwM1ftq9ft6hf16hfvNJf1tNf08Bf6aYgIA0KDQq5 +sTa1vjD+8DNtq+3qNPr1LG5pLnYz7W53MDtyrXVvdeovNINCsDNtq/W2bLD1LGhosDNtq/V+dLp sLi8/tSkt8DTprbU16i80g0Kufq80sjLwabXytS0udzA7cqm18q48cjP1qTF4NG1tbzKpg0Kufq8 0sDNtq+52M+10K2198qm18q48cjP1qTF4NG1tbzKpg0KufrE2rXa0rvF+rOrtbyhorSrsqWhosq1 yqmhsLn6vNLAzbavt6jT68bz0rXQvbPqvKjQp9PQu/rV+7rPobG1xM/I0NDV36O7ufrE2tSttLTQ zaGiyrXVvdDNoaK5yw0KzsrQzbXExeDRtcqmoaMNCg0KobDAzcLJzago1tC5+im5y87K1tDQxKGx ytfPr7nLzsqjrMnPuqOzyc2owsnKpsrCzvHL+c2218q6z7vvyMuju7zmyM7W0LuqtLTKwLzNxeDR tc34oaLKsbT6ueK7qg0KudzA7dGn1Lqhosnu29rN4snMzbbXysbz0rXQrbvhoaK549bdytDAzbav saPVz9Gnu+Ghornj1t3K0MjLwabXytS0ytCzobf+zvHW0NDEoaK547aryqHIy8Gm18rUtA0KudzA 7dCtu+Ghos/juNu5pNK119y74aGi1tDJvbTz0aehotXjva2089GntcgxMDC24LzSxeAg0bW5q8u+ oaLQ0NK10K274aGi09C52Lv6ubm1xMep1Ly9ssqmoaLM2A0Kxri5y87KoaMNCg0K1tPAz8qmvqvN qMDNtq/V/rLft6jCybeouea6zcDNtq/W2bLDoaLL38vPs8zQ8qOsycOzpMDNtq/Tw7mkt+fP1bXE 09DQp9Skt8DT68DNtq/V+dLpsLi8/rXEvqvXvA0K06a21KOsycbT2rDRwM22r7eowsm3qLnm0+vG 89K1yMvBptfK1LS53MDt09C7+tX7us+jrM2oz/7G89K1wM22r9X50um3wLe2u/rWxrXEubm9qLrN wM22r9PDuaS53A0KwO3M5c+1tcTQ3tX9zerJxqGj1tPAz8qmvq2zo9Tav827p7DsuavP1rOhoaLF 4NG1z9azoc6qv827p6Gi0afUsby0yrHG8LLdoaLJ87LpoaLQ3rjEz+C52NbGtsihog0Kus/NrKGi zsTK6aOsu/K31s72vt/M5bC4vP61xNOmttTLvMK3o7vW08DPyqa2wLW9tcTP1rOhtcTXqNK1uaa1 16Osw7+0zra80661w7njtPO/zbunoaLRp9Sxt6LX1A0KxNrQxLXEusPGwNPrMTAwJbXE0MW3/qOh DQoNCtbTwM/KptT4yM7XqNawwM22r9bZssPUsaOs1Pi78aGwuePW3crQ08XQ48DNtq/W2bLD1LGh sbPGusWjrMnzxdDAzbav1fkg0umwuLz+NDAwtuDX2qO7tPrA7cDNtq8NCtX50uk1MDC24Nfao6yy ztPru/LW97PW0L2z6ryo0KfXydGvz+7EvzIwtuC49qOsyfOy6c3qycY0MDC24LzSxvPStbXEyMvB ptfK1LS53MDtuebVwtbGtsiho7j2yMsNCrOkxtq1o8jOMzC24LzSo6jA27zGMjAwtuC80qOpxvPS tbXEyMvBptfK1LS53MDtt6ggwsm5y87Ko7vS1NbTwM/KpsHsz861xNeovNK2087po6yzpMbazqrG 89K1zOENCrmpwM22r7eos6PE6rnLzsq8sLj31tbXqM/u18nRr7f+zvGjrL/Nu6fC+tLitsi437Tv OTUloaMNCg0KMjAwNMTqv6rKvNbTwM/Kpsirufq497XY0bK9ssDNtq+3qKGiwM22r7nYz7W/zrPM o6zK3NLmxvPStbTvMzAwMDC80qOs1rG908rc0ubRp9SxNzAwMDC24MjLo6zF4A0K0bW12LXjyea8 sDIwtuC49sqhu+Gzx8rQvLDR2LqjtdjH+LTzs8fK0KGj1tPAz8qmvau/3dTvtcTAzbav1f6y37eo uebI3MjryrW8yrncwO2wuMD9tbHW0KOsvavIyw0KwabXytS0udzA7dPrwM22r7eo09C7+rXY1fu6 z9Ta0rvG8KO7v86zzMTayN04MCXOqtXmyrWwuMD9oaIyMCXOqrHYsbi1xNbYteO3qMz1o7vRp9Sx ss7T68zWwtuhog0Ku6W2r6Osv86zzMn6tq/T0Miko6zJ7sjrx7Oz9qOsyrXVvdDNs6zHv6OsyMPR pyDUsby0yrHRp9LU1sLTw6Ohv86zzML60uK2yLjftO85NSWjrNbatuDRp9Sxvvmx7Q0Kyr6juqGw tdrSu7TOzP21vcjntMvKtdW9oaLKtdPDoaLKtdCntcTAzbavt6i/zrPMo6HW08DPyqa3x7OjzvHK taGisrvLtb3MoaLDu9PQyczStc62tcCjrNbV09rM/Q0Ktb3By8jDztKyu9TZuvO72rXEvquyyr/O s8yjoaGxDQoNCtbTwM/Kps/IuvPU2qG2uePW3cjVsaiht6GiobbEz7e9trzK0LGoobehoqG21tC5 +snnu+G/xtGnsaiht6GiobbIy8Gm18rUtKG3oaKhts/juNu5pNK119y74dTCv68NCqG3tcixqL+v oaLU09a+oaLDvczlt6Kx7deo0rXOxNXCu/KyybfDuOU1MLbgxqqhow0KDQrU+M6q0tTPwr/Nu6fM 4bmp18nRr6GiucvOyqGixNrRtaOot8e5q7+qv86jqbf+zvGjutbQufrIy8rZoaK547ei0vjQ0KGi 1tC5+rnitPPS+NDQoaLW0Ln608rV/qGiDQq5+rzStefN+KGi1tC5+tPK1f7L2bXdoaLW0Ln608rV /rSi0O7S+NDQoaLQr7PMwsPQ0M34oaK7qramtaOxo6GivajJ6NL40NChosWp0rXS+NDQoaK5pMnM 0vjQ0KGiDQrW0Mz6vK/NxaGiye7b2rv6s6GhorvGutPLrrXnv6q3oqGi1tDRzLyvzcWhosTP1MHO 78H3oaLQwsTPt728r83FoaLJ7tvasK7KqbXCucm33aGiye7b2r/htq/K/cLrDQqhorrPyfq0tNW5 oaLW0Lqjtdiy+qGit73UsrXYsvqhotbpva284MDtoaLW6b2tzbbXyqGiw8nFo8TMt9uhosj90MK1 2LL6oaLR+Mn6zMPSqdK1oaLSu8a3uuzSqdK1DQqhor6n1Le8r83FoaK549bdtefQxaGiufrRts2o 0MWhotLmuqO8r83FoaLN+rTzvK/NxaGi1tDUts7vwfehosW3yrHBprf+17Chornj1t3K37n7vK/N xaGiueO2q727DQrNqLyvzcWhotbpuqO/2rC2ueOzoaGiscjRx7XPxvuztaGi19264czstdihosnf v9q0rM7x1MvK5LnJt92horGxvqm1w9DFvNG6zdK9wcahorfnyfG8r83FoaLW0NfJDQq5pLPMvODA 7aGiuePSqbyvzcWhorjfyr/P39K1oaLA+7qjvK/NxaGiu6+9qLyvzcWhoruqv7Wxo8/VtPrA7aGi ye7b2suuzvG84MDtoaLUy7eivK/NxaGi0MK547n6DQq8yryvzcWhosPAtcS8r83FoaK9rcvVtPPI q7yvzcWhotHYuqO12LL6v9i5yaGiye7b2ruqx8izx6Gi0MXUtLyvzcWhor6ps8e/2LnJoaK547ar u6rFqc7Cys/Q88TBDQq5ybfdoaK5+tKpzu/B97yvzcW547aruavLvqGi1MbEz8O6u6+5pLyvzcWh otXjva3QwrTzvK/NxaGi1MbEz7PbuurQv9Xgucm33aGiuePW3bXnwabPtc2zoaLQxbL9DQq7+sb3 oaLUxsTPuujP6NKp0rWjqLyvzcWjqaGiueO2q7njtefN+MLnucm33bmry76hornjxvuyv7z+oaLW 0Ln6yq7G39KxvK/NxaGi1tC5+s2o0MW3/s7xoaLFt8bVDQrV1cP3oaLW0Lnjusu8r83FoaKzyba8 1sPQxbyvzcUtLS0tLS3Hp9PgvNLG89K1oaMNCg0K1PiyzrzTuf3W08DPyqbF4NG1uau/qr/OtcSy v7fWxvPStb/Nu6ejutbQufrSxravoaLW0Ln6vq28w9bcv6+hotbQufrEz7e9tefN+KGi1tC5+sWp 0rW089GnoaLW0A0Kyb2089GnoaLW0LnjusvE3NS0oaLW0Ln6ydnPyLbTysLStbei1bnW0NDEoaLW 6b2ttefTsNbGxqyhos3yv8a12LL6oaLDycWjyOnStaGi1um9rcahvsahotbQufrS+A0K0NChoruq yczS+NDQoaK547ei1qS+7aGi0MvStdL40NChotbQ0MXS+NDQ0MXTw7+o1tDQxKGi1tC6ycjLytmx o8/VoaLW0NDLzajRtqGi1tDKr7uvoaLW0Lqj082hog0KsNnE6rr9zb++xtK1oaKxo8D7t7+12LL6 oaK4u8Gmtdiy+qGi0cW+08DWtdiy+qGisLLMpKGivfC1+8jtvP6horO/ueLI6dK1oaK549bdtdjM +qGiwaKw17yvzcWhog0KwLbUwsHBoaK93bGqwre7osb7s7WhorHI0ce1z8b7s7Whota+uN+/1bX3 oaK549bdtefK08yooaKw19TGyb3WxtKpoaK98Leiv8a8vKGivNO24LGmoaK7qs6qoaK2qw0K1qXS vcHGoaK9rcvV0vjQ0Mnu29q31tDQoaK547aryqG159OwuavLvqGisbG+qbq9v9XUuqGi1tC5+sLD 0NDJ56GiueO2q9DCu6q3otDQvK/NxaGisNnKwqOo1tC5+g0Ko6mhoruqyPO9qNb+oaLG39DHvK/N xaGizKvR9L7Uo6ixsb6po6mhosqozfWhosTaw8m5xc73wK3j5cLZo6i8r83Fo6mhotbQufq6o9Hz yq/TzdfcuavLvqGixbLN/g0Kufq80sqv0825q8u+oaK98OW3tdiy+qGisLLBuL/YucmhosTPvqnW yrzgvOzR6dS6oaLM7NX9vK/NxaGiye7b2rDNyr+8ryDNxbnJt92hok5FVFNGSU2jqLGxvqmjqQ0K xanStb/GvLyhosTaw8m5xb3wuf6078O6zL+7r7mkoaLW0Ln6v8bRp9S6oaK549bdxvuztbyvzcWh or79u6q8r83FoaK/tbzRvK/NxaGisbG+qbq9v9XL+aGiye7b2g0K08rV/r7WoaK/yb/av8nA1qGi zajTw7XnxvihosvJz8K158b3oaLW0MTPtPPRp6GisLKw1LDrtbzM5aGivsa41ryvzcWhorG+zO/G +7O1oaLSu+DL1+KztaGiw9fG5A0KwdbC1syloaLL98ThoaLKwLzNwfrQxc+izfjC56GisKzErMn6 oaJUQ0yhorS0zqy158b3oaK5+tKpvK/NxaGivKrB1tHMst2hosLtyr+7+byv17Agz+ShotPD09HI 7Q0KvP6hor2ozM+7r7mkvK/NxaGiuLvKv82ooaLI/dK71ti5pC0tLS0tLby4zfK80sbz0rWhow0K qaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWp pamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppQ0KofHF4C3RtS2xqC3D+y3W0C3Q xDoNCg0Kye4g29ogiPMgw/sg64og1JKjuqOwo7ejtaO1LS2jsqOxo7OjsqO3o7OjtKO4oaKjsqOx o7OjsqO3o7ejtKO2DQoNCsnPILqjIIjzIMP7IOuKINSSo7qjsKOyo7EtLaO1o7GjsKO5o7mjt6Oy o7mhoqO1o7GjsKO5o7mjuKO1o7YNCg0Ksaggw/sg08ogz+SjunNnYnJ0QDE2My5jb20gICAgICAg waogz7UgyMujuuqQ0KG946GiwdbPyMn6oaLIZtChveMNCqmlqaWppamlqaWppamlqaWppamlqaWp pamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppamlqaWppaml qaWppamlqaWppQ0K From info@labsend.net Thu Apr 11 14:51:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.4 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,MIME_HTML_ONLY,MIME_QP_LONG_LINE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EE4087F37 for ; Thu, 11 Apr 2013 14:51:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D723A8F809B for ; Thu, 11 Apr 2013 12:50:57 -0700 (PDT) X-ASG-Debug-ID: 1365709855-04cbb057f8a0cb0001-NocioJ Received: from labsend.com (184-106-136-180.labsend.com [184.106.136.180]) by cuda.sgi.com with ESMTP id OdOr3TjAnLpFZBEI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 11 Apr 2013 12:50:55 -0700 (PDT) X-Barracuda-Envelope-From: info@labsend.net X-Barracuda-Apparent-Source-IP: 184.106.136.180 Received: from transito (unknown [184.106.237.74]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by labsend.com (Postfix) with ESMTPS id 60B7A83EEF for ; Thu, 11 Apr 2013 21:51:02 +0200 (CEST) Received: from nas-2A-E3-B6 (host31-177-static.9-188-b.business.telecomitalia.it [188.9.177.31]) (Authenticated sender: newsletter) by transito (Postfix) with ESMTPA id A221C6082F for ; Thu, 11 Apr 2013 22:14:14 +0200 (CEST) Received: from default (unknown [192.168.1.5]) by nas-2A-E3-B6 (Postfix) with ESMTP id 233FBCF2 for ; Thu, 11 Apr 2013 21:50:13 +0200 (CEST) MIME-Version: 1.0 From: "Cucine Noventa" To: xfs@oss.sgi.com Date: 11 Apr 2013 21:50:18 +0200 Subject: LA CUCINA! direttamente in fabbrica, con 10 anni di garanzia. Content-Type: text/html; charset=us-ascii X-ASG-Orig-Subj: LA CUCINA! direttamente in fabbrica, con 10 anni di garanzia. Content-Transfer-Encoding: quoted-printable X-Antivirus: avast! (VPS 130411-0, 11/04/2013), Outbound message X-Antivirus-Status: Clean Message-Id: <20130411195013.233FBCF2@nas-2A-E3-B6> X-Barracuda-Connect: 184-106-136-180.labsend.com[184.106.136.180] X-Barracuda-Start-Time: 1365709855 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.97 X-Barracuda-Spam-Status: No, SCORE=1.97 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_IMAGE_RATIO_02, HTML_MESSAGE, MIME_HTML_ONLY, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127837 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.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.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 =0D=0A=0D=0A=0D=0A=0D=0A=0D=0A=0D=0A =0D=0A= =0D=0A =0D=0A =0D=0A =0D=0A =0D=0A =0D=0A =0D=0A =0D=0A
Se non visualizza correttamente= le =0D=0A immagini clicchi= qui.
 
=0D=0A =0D=0A =0D=0A =0D=0A = =0D=0A =0D=0A =0D=0A = =0D=0A =0D=0A =0D=0A =0D=0A= =0D=0A =0D=0A =0D=0A = =0D=0A
=0D=0A =0D=0A =0D=0A = =0D=0A= =0D=0A =0D=0A = =0D=0A =0D=0A =0D=0A =0D=0A = =0D=0A =0D=0A =0D=0A = =0D=0A
=0D=0A =0D=0A =0D=0A =0D=0A =0D=0A
=0D=0A = =0D=0A = =0D=0A = =0D=0A =0D=0A
=0D=0A

= =0D=0A NON RISPONDA a questa Newsletter perche' = la comunicazione non sara' letta, ma invii =0D=0A a: info@cucinenoventa.com

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

 

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

=0D=0A Cucine= =0D=0A Noventa srl, Strada del Mobile, B/10 - =0D=0A = 33087 Cecchini di Pasiano (Pordenone)

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

=0D=0A= Sicuri=0D=0A di= non sbagliare!

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

VEDI cosa dicono
=0D=0A i =0D=0A nostri clienti
:

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

Oltre= =0D=0A 500
=0D=0A =0D=0A feedback positivi!

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

=0D=0A ___________________________________________________________________

=0D=0A =0D=0A
=0D=0A = =0D=0A
=0D=0A
=0D=0A - Consulenza & Progettazione.
= =0D=0A - Sconto del 45%.
=0D=0A -=0D=0A= Oltre 50 modelli.
=0D=0A -=0D=0A = Garanzia di 10 anni.
=0D=0A -=0D=0A = Trasporto & Montaggio gratuito.
=0D=0A -= =0D=0A Pagamenti rateali.
=0D=0A -=0D=0A= Produttori dal 1977
=0D=0A=0D=0A =0D=0A = =0D=0A =0D=0A =0D=0A = =0D=0A =0D=0A =0D=0A =0D=0A =0D=0A= =0D=0A =0D=0A =0D=0A = =0D=0A =0D=0A =0D=0A
   
 = =0D=0A

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

 
   
=0D=0A
=0D=0A =0D=0A =0D=0A =0D=0A = =0D=0A =0D=0A =0D=0A =0D=0A= =0D=0A =0D=0A =0D=0A = =0D=0A = =0D=0A =0D=0A =0D=0A = =0D=0A =0D=0A =0D=0A =0D=0A =0D=0A =0D=0A= =0D=0A =0D=0A =
=0D=0A = =0D=0A
=0D=0A =0D=0A =0D=0A
= =0D=0A                       = =0D=0AConsegna ed installazione?
=0D=0A                                                              = =0D=0A Ovunque.
=0D=0A
=0D=0A =0D=0A =0D=0A =0D=0A = =0D=0A
=0D=0A 3D"cn2"
=0D=0A
=0D=0A

=0D=0A 3D"cn2"

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

=0D=0A =0D=0A =0D=0A Sempre con personale =0D=0A= diretto.

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

=0D=0A =0D=0A = Gentile utente, questa Newsletter Le e' stata inviata automaticamente = =0D=0A nel rispetto della normativa sulla privacy, i suoi recapiti sono= stati =0D=0A prelevati da liste pubbliche. Comunque il suo indirizzo e-mail= potrebbe non essere stato da Lei =0D=0A sollecitato, In tal caso = ai sensi =0D=0A dell'articolo 9 del decreto legislativo 9 Aprile 2003= n. 70, che prevede =0D=0A la possibilita' di inviare messaggi promozionali= senza l'obbligo di =0D=0A ottenere il previo consenso del destinatario= che non sia consumatore, e =0D=0A nella probabilita' che il messaggio= non sia di suo interesse, ci scusiamo =0D=0A per il disturbo e la preghiamo= di cliccare sulla richiesta di =0D=0A cancellazione.= Per rimuovere definitivamente i suoi dati personali= clicchi= qui.

=0D=0A=0D=0A=0D=0A=0D=0A From yongtaofu@gmail.com Thu Apr 11 14:55:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B78F67F37 for ; Thu, 11 Apr 2013 14:55:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5D7A3AC004 for ; Thu, 11 Apr 2013 12:55:43 -0700 (PDT) X-ASG-Debug-ID: 1365710139-04bdf02d209ee00001-NocioJ Received: from mail-ia0-f169.google.com (mail-ia0-f169.google.com [209.85.210.169]) by cuda.sgi.com with ESMTP id BdJ7axG8arnlO5e2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 12:55:40 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.169] Received: by mail-ia0-f169.google.com with SMTP id h23so1664008iae.0 for ; Thu, 11 Apr 2013 12:55:39 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=0HttXdIaJwvgn2owR9PuvJTA3Zpgxj7f78AJQxOoH+Y=; b=mIJr4WthXLEjIgjyZYGvFU9dOp+FfNILf3m8k/dbRxvK5ioMTIZKmsqyweOipMGKrZ 4kzKlE14ZI6k7lT3MzV+HdvNHESpUxbBGIqfeIFDn+9bQ+6P0FaJSrllOKvwvhhHVw3E FKEVNmHim2HCeEy/QabvLh9e29BlzgC6OIcjh2xz7SEgBhSmNyMsJYP51EWWR77zA9/L o5Q6mZdnpmbUtZwrOZcrtdxtFPS4gf6BU7wQR6jgdN0wzFNpS8FtlxaOHtVUnthWO4vg Kin9TqP2MLmfPgtdCPCIPMUtvVH3YpmxGqkM/aHHaFQxstSINOh3h30pvuhkvhwxbTX/ F0XQ== MIME-Version: 1.0 X-Received: by 10.43.65.145 with SMTP id xm17mr4798163icb.35.1365710139552; Thu, 11 Apr 2013 12:55:39 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Thu, 11 Apr 2013 12:55:39 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> Date: Fri, 12 Apr 2013 03:55:39 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Emmanuel Florac Cc: Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=bcaec51d2998bc485b04da1b2bd0 X-Barracuda-Connect: mail-ia0-f169.google.com[209.85.210.169] X-Barracuda-Start-Time: 1365710140 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127837 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 --bcaec51d2998bc485b04da1b2bd0 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02ee20a The return address always 0xffffffffa02ee20a? 2013/4/12 =B7=FB=D3=C0=CC=CE > It happens tonight again on one of our servers, how to debug the root > cause? Thank you. > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() > returned error 22. > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree returned > error 22 > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called > from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D > 0xffffffffa02ee20a > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting down > filesystem > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem and > rectify the problem(s) > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > > xfs_repair -n > > > Phase 7 - verify link counts... > would have reset inode 20021 nlinks from 0 to 1 > would have reset inode 20789 nlinks from 0 to 1 > would have reset inode 35125 nlinks from 0 to 1 > would have reset inode 35637 nlinks from 0 to 1 > would have reset inode 36149 nlinks from 0 to 1 > would have reset inode 38197 nlinks from 0 to 1 > would have reset inode 39477 nlinks from 0 to 1 > would have reset inode 54069 nlinks from 0 to 1 > would have reset inode 62261 nlinks from 0 to 1 > would have reset inode 63029 nlinks from 0 to 1 > would have reset inode 72501 nlinks from 0 to 1 > would have reset inode 79925 nlinks from 0 to 1 > would have reset inode 81205 nlinks from 0 to 1 > would have reset inode 84789 nlinks from 0 to 1 > would have reset inode 87861 nlinks from 0 to 1 > would have reset inode 90663 nlinks from 0 to 1 > would have reset inode 91189 nlinks from 0 to 1 > would have reset inode 95541 nlinks from 0 to 1 > would have reset inode 98101 nlinks from 0 to 1 > would have reset inode 101173 nlinks from 0 to 1 > would have reset inode 113205 nlinks from 0 to 1 > would have reset inode 114741 nlinks from 0 to 1 > would have reset inode 126261 nlinks from 0 to 1 > would have reset inode 140597 nlinks from 0 to 1 > would have reset inode 144693 nlinks from 0 to 1 > would have reset inode 147765 nlinks from 0 to 1 > would have reset inode 152885 nlinks from 0 to 1 > would have reset inode 161333 nlinks from 0 to 1 > would have reset inode 161845 nlinks from 0 to 1 > would have reset inode 167477 nlinks from 0 to 1 > would have reset inode 172341 nlinks from 0 to 1 > would have reset inode 191797 nlinks from 0 to 1 > would have reset inode 204853 nlinks from 0 to 1 > would have reset inode 205365 nlinks from 0 to 1 > would have reset inode 215349 nlinks from 0 to 1 > would have reset inode 215861 nlinks from 0 to 1 > would have reset inode 216373 nlinks from 0 to 1 > would have reset inode 217397 nlinks from 0 to 1 > would have reset inode 224309 nlinks from 0 to 1 > would have reset inode 225589 nlinks from 0 to 1 > would have reset inode 234549 nlinks from 0 to 1 > would have reset inode 234805 nlinks from 0 to 1 > would have reset inode 249653 nlinks from 0 to 1 > would have reset inode 250677 nlinks from 0 to 1 > would have reset inode 252469 nlinks from 0 to 1 > would have reset inode 261429 nlinks from 0 to 1 > would have reset inode 265013 nlinks from 0 to 1 > would have reset inode 266805 nlinks from 0 to 1 > would have reset inode 267317 nlinks from 0 to 1 > would have reset inode 268853 nlinks from 0 to 1 > would have reset inode 272437 nlinks from 0 to 1 > would have reset inode 273205 nlinks from 0 to 1 > would have reset inode 274229 nlinks from 0 to 1 > would have reset inode 278325 nlinks from 0 to 1 > would have reset inode 278837 nlinks from 0 to 1 > would have reset inode 281397 nlinks from 0 to 1 > would have reset inode 292661 nlinks from 0 to 1 > would have reset inode 300853 nlinks from 0 to 1 > would have reset inode 302901 nlinks from 0 to 1 > would have reset inode 305205 nlinks from 0 to 1 > would have reset inode 314165 nlinks from 0 to 1 > would have reset inode 315189 nlinks from 0 to 1 > would have reset inode 320309 nlinks from 0 to 1 > would have reset inode 324917 nlinks from 0 to 1 > would have reset inode 328245 nlinks from 0 to 1 > would have reset inode 335925 nlinks from 0 to 1 > would have reset inode 339253 nlinks from 0 to 1 > would have reset inode 339765 nlinks from 0 to 1 > would have reset inode 348213 nlinks from 0 to 1 > would have reset inode 360501 nlinks from 0 to 1 > would have reset inode 362037 nlinks from 0 to 1 > would have reset inode 366389 nlinks from 0 to 1 > would have reset inode 385845 nlinks from 0 to 1 > would have reset inode 390709 nlinks from 0 to 1 > would have reset inode 409141 nlinks from 0 to 1 > would have reset inode 413237 nlinks from 0 to 1 > would have reset inode 414773 nlinks from 0 to 1 > would have reset inode 417845 nlinks from 0 to 1 > would have reset inode 436021 nlinks from 0 to 1 > would have reset inode 439349 nlinks from 0 to 1 > would have reset inode 447029 nlinks from 0 to 1 > would have reset inode 491317 nlinks from 0 to 1 > would have reset inode 494133 nlinks from 0 to 1 > would have reset inode 495413 nlinks from 0 to 1 > would have reset inode 501301 nlinks from 0 to 1 > would have reset inode 506421 nlinks from 0 to 1 > would have reset inode 508469 nlinks from 0 to 1 > would have reset inode 508981 nlinks from 0 to 1 > would have reset inode 511797 nlinks from 0 to 1 > would have reset inode 513077 nlinks from 0 to 1 > would have reset inode 517941 nlinks from 0 to 1 > would have reset inode 521013 nlinks from 0 to 1 > would have reset inode 522805 nlinks from 0 to 1 > would have reset inode 523317 nlinks from 0 to 1 > would have reset inode 525621 nlinks from 0 to 1 > would have reset inode 527925 nlinks from 0 to 1 > would have reset inode 535605 nlinks from 0 to 1 > would have reset inode 541749 nlinks from 0 to 1 > would have reset inode 573493 nlinks from 0 to 1 > would have reset inode 578613 nlinks from 0 to 1 > would have reset inode 583029 nlinks from 0 to 1 > would have reset inode 585525 nlinks from 0 to 1 > would have reset inode 586293 nlinks from 0 to 1 > would have reset inode 586805 nlinks from 0 to 1 > would have reset inode 591413 nlinks from 0 to 1 > would have reset inode 594485 nlinks from 0 to 1 > would have reset inode 596277 nlinks from 0 to 1 > would have reset inode 603189 nlinks from 0 to 1 > would have reset inode 613429 nlinks from 0 to 1 > would have reset inode 617781 nlinks from 0 to 1 > would have reset inode 621877 nlinks from 0 to 1 > would have reset inode 623925 nlinks from 0 to 1 > would have reset inode 625205 nlinks from 0 to 1 > would have reset inode 626741 nlinks from 0 to 1 > would have reset inode 639541 nlinks from 0 to 1 > would have reset inode 640053 nlinks from 0 to 1 > would have reset inode 640565 nlinks from 0 to 1 > would have reset inode 645173 nlinks from 0 to 1 > would have reset inode 652853 nlinks from 0 to 1 > would have reset inode 656181 nlinks from 0 to 1 > would have reset inode 659253 nlinks from 0 to 1 > would have reset inode 663605 nlinks from 0 to 1 > would have reset inode 667445 nlinks from 0 to 1 > would have reset inode 680757 nlinks from 0 to 1 > would have reset inode 691253 nlinks from 0 to 1 > would have reset inode 691765 nlinks from 0 to 1 > would have reset inode 697653 nlinks from 0 to 1 > would have reset inode 700469 nlinks from 0 to 1 > would have reset inode 707893 nlinks from 0 to 1 > would have reset inode 716853 nlinks from 0 to 1 > would have reset inode 722229 nlinks from 0 to 1 > would have reset inode 722741 nlinks from 0 to 1 > would have reset inode 723765 nlinks from 0 to 1 > would have reset inode 731957 nlinks from 0 to 1 > would have reset inode 742965 nlinks from 0 to 1 > would have reset inode 743477 nlinks from 0 to 1 > would have reset inode 745781 nlinks from 0 to 1 > would have reset inode 746293 nlinks from 0 to 1 > would have reset inode 774453 nlinks from 0 to 1 > would have reset inode 778805 nlinks from 0 to 1 > would have reset inode 785013 nlinks from 0 to 1 > would have reset inode 785973 nlinks from 0 to 1 > would have reset inode 791349 nlinks from 0 to 1 > would have reset inode 796981 nlinks from 0 to 1 > would have reset inode 803381 nlinks from 0 to 1 > would have reset inode 806965 nlinks from 0 to 1 > would have reset inode 811798 nlinks from 0 to 1 > would have reset inode 812310 nlinks from 0 to 1 > would have reset inode 813078 nlinks from 0 to 1 > would have reset inode 813607 nlinks from 0 to 1 > would have reset inode 814183 nlinks from 0 to 1 > would have reset inode 822069 nlinks from 0 to 1 > would have reset inode 828469 nlinks from 0 to 1 > would have reset inode 830005 nlinks from 0 to 1 > would have reset inode 832053 nlinks from 0 to 1 > would have reset inode 832565 nlinks from 0 to 1 > would have reset inode 836661 nlinks from 0 to 1 > would have reset inode 841013 nlinks from 0 to 1 > would have reset inode 841525 nlinks from 0 to 1 > would have reset inode 845365 nlinks from 0 to 1 > would have reset inode 846133 nlinks from 0 to 1 > would have reset inode 847157 nlinks from 0 to 1 > would have reset inode 852533 nlinks from 0 to 1 > would have reset inode 857141 nlinks from 0 to 1 > would have reset inode 863271 nlinks from 0 to 1 > would have reset inode 866855 nlinks from 0 to 1 > would have reset inode 887861 nlinks from 0 to 1 > would have reset inode 891701 nlinks from 0 to 1 > would have reset inode 894773 nlinks from 0 to 1 > would have reset inode 900149 nlinks from 0 to 1 > would have reset inode 902197 nlinks from 0 to 1 > would have reset inode 906293 nlinks from 0 to 1 > would have reset inode 906805 nlinks from 0 to 1 > would have reset inode 909877 nlinks from 0 to 1 > would have reset inode 925493 nlinks from 0 to 1 > would have reset inode 949543 nlinks from 0 to 1 > would have reset inode 955175 nlinks from 0 to 1 > would have reset inode 963623 nlinks from 0 to 1 > would have reset inode 967733 nlinks from 0 to 1 > would have reset inode 968231 nlinks from 0 to 1 > would have reset inode 982069 nlinks from 0 to 1 > would have reset inode 1007413 nlinks from 0 to 1 > would have reset inode 1011509 nlinks from 0 to 1 > would have reset inode 1014069 nlinks from 0 to 1 > would have reset inode 1014581 nlinks from 0 to 1 > would have reset inode 1022005 nlinks from 0 to 1 > would have reset inode 1022517 nlinks from 0 to 1 > would have reset inode 1023029 nlinks from 0 to 1 > would have reset inode 1025333 nlinks from 0 to 1 > would have reset inode 1043765 nlinks from 0 to 1 > would have reset inode 1044789 nlinks from 0 to 1 > would have reset inode 1049397 nlinks from 0 to 1 > would have reset inode 1050933 nlinks from 0 to 1 > would have reset inode 1051445 nlinks from 0 to 1 > would have reset inode 1054261 nlinks from 0 to 1 > would have reset inode 1060917 nlinks from 0 to 1 > would have reset inode 1063477 nlinks from 0 to 1 > would have reset inode 1076021 nlinks from 0 to 1 > would have reset inode 1081141 nlinks from 0 to 1 > would have reset inode 1086261 nlinks from 0 to 1 > would have reset inode 1097269 nlinks from 0 to 1 > would have reset inode 1099829 nlinks from 0 to 1 > would have reset inode 1100853 nlinks from 0 to 1 > would have reset inode 1101877 nlinks from 0 to 1 > would have reset inode 1126709 nlinks from 0 to 1 > would have reset inode 1134389 nlinks from 0 to 1 > would have reset inode 1141045 nlinks from 0 to 1 > would have reset inode 1141557 nlinks from 0 to 1 > would have reset inode 1142581 nlinks from 0 to 1 > would have reset inode 1148469 nlinks from 0 to 1 > would have reset inode 1153333 nlinks from 0 to 1 > would have reset inode 1181749 nlinks from 0 to 1 > would have reset inode 1192245 nlinks from 0 to 1 > would have reset inode 1198133 nlinks from 0 to 1 > would have reset inode 1203765 nlinks from 0 to 1 > would have reset inode 1221429 nlinks from 0 to 1 > would have reset inode 1223989 nlinks from 0 to 1 > would have reset inode 1235509 nlinks from 0 to 1 > would have reset inode 1239349 nlinks from 0 to 1 > would have reset inode 1240885 nlinks from 0 to 1 > would have reset inode 1241397 nlinks from 0 to 1 > would have reset inode 1241909 nlinks from 0 to 1 > would have reset inode 1242421 nlinks from 0 to 1 > would have reset inode 1244981 nlinks from 0 to 1 > would have reset inode 1246517 nlinks from 0 to 1 > would have reset inode 1253429 nlinks from 0 to 1 > would have reset inode 1271861 nlinks from 0 to 1 > would have reset inode 1274677 nlinks from 0 to 1 > would have reset inode 1277749 nlinks from 0 to 1 > would have reset inode 1278773 nlinks from 0 to 1 > would have reset inode 1286709 nlinks from 0 to 1 > would have reset inode 1288245 nlinks from 0 to 1 > would have reset inode 1299765 nlinks from 0 to 1 > would have reset inode 1302325 nlinks from 0 to 1 > would have reset inode 1304885 nlinks from 0 to 1 > would have reset inode 1305397 nlinks from 0 to 1 > would have reset inode 1307509 nlinks from 0 to 1 > would have reset inode 1309493 nlinks from 0 to 1 > would have reset inode 1310517 nlinks from 0 to 1 > would have reset inode 1311029 nlinks from 0 to 1 > would have reset inode 1312053 nlinks from 0 to 1 > would have reset inode 1316917 nlinks from 0 to 1 > would have reset inode 1317941 nlinks from 0 to 1 > would have reset inode 1320821 nlinks from 0 to 1 > would have reset inode 1322805 nlinks from 0 to 1 > would have reset inode 1332789 nlinks from 0 to 1 > would have reset inode 1336373 nlinks from 0 to 1 > would have reset inode 1345653 nlinks from 0 to 1 > would have reset inode 1354549 nlinks from 0 to 1 > would have reset inode 1361973 nlinks from 0 to 1 > would have reset inode 1369909 nlinks from 0 to 1 > would have reset inode 1372981 nlinks from 0 to 1 > would have reset inode 1388853 nlinks from 0 to 1 > would have reset inode 1402933 nlinks from 0 to 1 > would have reset inode 1403445 nlinks from 0 to 1 > would have reset inode 1420085 nlinks from 0 to 1 > would have reset inode 1452853 nlinks from 0 to 1 > would have reset inode 1456437 nlinks from 0 to 1 > would have reset inode 1457973 nlinks from 0 to 1 > would have reset inode 1459253 nlinks from 0 to 1 > would have reset inode 1467957 nlinks from 0 to 1 > would have reset inode 1471541 nlinks from 0 to 1 > would have reset inode 1476661 nlinks from 0 to 1 > would have reset inode 1479733 nlinks from 0 to 1 > would have reset inode 1483061 nlinks from 0 to 1 > would have reset inode 1484085 nlinks from 0 to 1 > would have reset inode 1486133 nlinks from 0 to 1 > would have reset inode 1489461 nlinks from 0 to 1 > would have reset inode 1490037 nlinks from 0 to 1 > would have reset inode 1492021 nlinks from 0 to 1 > would have reset inode 1493557 nlinks from 0 to 1 > would have reset inode 1494069 nlinks from 0 to 1 > would have reset inode 1496885 nlinks from 0 to 1 > would have reset inode 1498421 nlinks from 0 to 1 > would have reset inode 1498933 nlinks from 0 to 1 > would have reset inode 1499957 nlinks from 0 to 1 > would have reset inode 1506101 nlinks from 0 to 1 > would have reset inode 1507637 nlinks from 0 to 1 > would have reset inode 1510453 nlinks from 0 to 1 > would have reset inode 1514293 nlinks from 0 to 1 > would have reset inode 1517365 nlinks from 0 to 1 > would have reset inode 1520693 nlinks from 0 to 1 > would have reset inode 1521973 nlinks from 0 to 1 > would have reset inode 1530421 nlinks from 0 to 1 > would have reset inode 1530933 nlinks from 0 to 1 > would have reset inode 1537333 nlinks from 0 to 1 > would have reset inode 1538357 nlinks from 0 to 1 > would have reset inode 1548853 nlinks from 0 to 1 > would have reset inode 1553973 nlinks from 0 to 1 > would have reset inode 1557301 nlinks from 0 to 1 > would have reset inode 1564213 nlinks from 0 to 1 > would have reset inode 1564725 nlinks from 0 to 1 > would have reset inode 1576501 nlinks from 0 to 1 > would have reset inode 1580597 nlinks from 0 to 1 > would have reset inode 1584693 nlinks from 0 to 1 > would have reset inode 1586485 nlinks from 0 to 1 > would have reset inode 1589301 nlinks from 0 to 1 > would have reset inode 1589813 nlinks from 0 to 1 > would have reset inode 1592629 nlinks from 0 to 1 > would have reset inode 1595701 nlinks from 0 to 1 > would have reset inode 1601077 nlinks from 0 to 1 > would have reset inode 1623861 nlinks from 0 to 1 > would have reset inode 1626677 nlinks from 0 to 1 > would have reset inode 1627701 nlinks from 0 to 1 > would have reset inode 1633333 nlinks from 0 to 1 > would have reset inode 1639221 nlinks from 0 to 1 > would have reset inode 1649205 nlinks from 0 to 1 > would have reset inode 1686325 nlinks from 0 to 1 > would have reset inode 1690677 nlinks from 0 to 1 > would have reset inode 1693749 nlinks from 0 to 1 > would have reset inode 1704757 nlinks from 0 to 1 > would have reset inode 1707061 nlinks from 0 to 1 > would have reset inode 1709109 nlinks from 0 to 1 > would have reset inode 1719349 nlinks from 0 to 1 > would have reset inode 1737013 nlinks from 0 to 1 > would have reset inode 1741365 nlinks from 0 to 1 > would have reset inode 1747509 nlinks from 0 to 1 > would have reset inode 1770805 nlinks from 0 to 1 > would have reset inode 1780789 nlinks from 0 to 1 > would have reset inode 1793589 nlinks from 0 to 1 > would have reset inode 1795125 nlinks from 0 to 1 > would have reset inode 1800757 nlinks from 0 to 1 > would have reset inode 1801269 nlinks from 0 to 1 > would have reset inode 1802549 nlinks from 0 to 1 > would have reset inode 1804085 nlinks from 0 to 1 > would have reset inode 1817141 nlinks from 0 to 1 > would have reset inode 1821749 nlinks from 0 to 1 > would have reset inode 1832757 nlinks from 0 to 1 > would have reset inode 1836341 nlinks from 0 to 1 > would have reset inode 1856309 nlinks from 0 to 1 > would have reset inode 1900597 nlinks from 0 to 1 > would have reset inode 1902901 nlinks from 0 to 1 > would have reset inode 1912373 nlinks from 0 to 1 > would have reset inode 1943093 nlinks from 0 to 1 > would have reset inode 1944373 nlinks from 0 to 1 > would have reset inode 1954101 nlinks from 0 to 1 > would have reset inode 1955893 nlinks from 0 to 1 > would have reset inode 1961781 nlinks from 0 to 1 > would have reset inode 1974325 nlinks from 0 to 1 > would have reset inode 1978677 nlinks from 0 to 1 > would have reset inode 1981237 nlinks from 0 to 1 > would have reset inode 1992245 nlinks from 0 to 1 > would have reset inode 2000949 nlinks from 0 to 1 > would have reset inode 2002229 nlinks from 0 to 1 > would have reset inode 2004789 nlinks from 0 to 1 > would have reset inode 2005301 nlinks from 0 to 1 > would have reset inode 2011189 nlinks from 0 to 1 > would have reset inode 2012981 nlinks from 0 to 1 > would have reset inode 2015285 nlinks from 0 to 1 > would have reset inode 2018869 nlinks from 0 to 1 > would have reset inode 2028341 nlinks from 0 to 1 > would have reset inode 2028853 nlinks from 0 to 1 > would have reset inode 2030901 nlinks from 0 to 1 > would have reset inode 2032181 nlinks from 0 to 1 > would have reset inode 2032693 nlinks from 0 to 1 > would have reset inode 2040117 nlinks from 0 to 1 > would have reset inode 2053685 nlinks from 0 to 1 > would have reset inode 2083893 nlinks from 0 to 1 > would have reset inode 2087221 nlinks from 0 to 1 > would have reset inode 2095925 nlinks from 0 to 1 > would have reset inode 2098741 nlinks from 0 to 1 > would have reset inode 2100533 nlinks from 0 to 1 > would have reset inode 2101301 nlinks from 0 to 1 > would have reset inode 2123573 nlinks from 0 to 1 > would have reset inode 2132789 nlinks from 0 to 1 > would have reset inode 2133813 nlinks from 0 to 1 > > > > > > 2013/4/10 =B7=FB=D3=C0=CC=CE > >> The storage info is as following: >> RAID-6 >> SATA HDD >> Controller: PERC H710P Mini (Embedded) >> Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes >> 255 heads, 63 sectors/track, 3647334 cylinders >> Units =3D cylinders of 16065 * 512 =3D 8225280 bytes >> Sector size (logical/physical): 512 bytes / 512 bytes >> I/O size (minimum/optimal): 512 bytes / 512 bytes >> Disk identifier: 0x00000000 >> >> sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (30.0 TB/27.2 TiB= ) >> sd 0:2:1:0: [sdb] Write Protect is off >> sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08 >> sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enabled, doesn't >> support DPO or FUA >> sd 0:2:1:0: [sdb] Attached SCSI disk >> >> *-storage >> description: RAID bus controller >> product: MegaRAID SAS 2208 [Thunderbolt] >> vendor: LSI Logic / Symbios Logic >> physical id: 0 >> bus info: pci@0000:02:00.0 >> logical name: scsi0 >> version: 01 >> width: 64 bits >> clock: 33MHz >> capabilities: storage pm pciexpress vpd msi msix bus_master >> cap_list rom >> configuration: driver=3Dmegaraid_sas latency=3D0 >> resources: irq:42 ioport:fc00(size=3D256) memory:dd7fc000-dd7ffff= f >> memory:dd780000-dd7bffff memory:dc800000-dc81ffff(prefetchable) >> *-disk:0 >> description: SCSI Disk >> product: PERC H710P >> vendor: DELL >> physical id: 2.0.0 >> bus info: scsi@0:2.0.0 >> logical name: /dev/sda >> version: 3.13 >> serial: 0049d6ce1d9f2035180096fde490f648 >> size: 558GiB (599GB) >> capabilities: partitioned partitioned:dos >> configuration: ansiversion=3D5 signature=3D000aa336 >> *-disk:1 >> description: SCSI Disk >> product: PERC H710P >> vendor: DELL >> physical id: 2.1.0 >> bus info: scsi@0:2.1.0 >> logical name: /dev/sdb >> logical name: /mnt/xfsd >> version: 3.13 >> serial: 003366f71da22035180096fde490f648 >> size: 27TiB (30TB) >> configuration: ansiversion=3D5 mount.fstype=3Dxfs >> mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,sw= idth=3D1280,noquota >> state=3Dmounted >> >> Thank you. >> >> >> 2013/4/10 Emmanuel Florac >> >>> Le Tue, 9 Apr 2013 23:10:03 +0800 >>> =B7=FB=D3=C0=CC=CE =A8=A6crivait: >>> >>> > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected. >>> > > Shutting down filesystem >>> >>> This. I/O error detected. That means that at some point the underlying >>> device (disk, RAID array, SAN volume) couldn't be reached. So this >>> could very well be a case of a flakey drive, array, cable or SCSI >>> driver. >>> >>> What's the storage setup here? >>> >>> -- >>> -----------------------------------------------------------------------= - >>> Emmanuel Florac | Direction technique >>> | Intellique >>> | >>> | +33 1 78 94 84 02 >>> -----------------------------------------------------------------------= - >>> >> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --bcaec51d2998bc485b04da1b2bd0 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
fs/xfs/xfs_vnodeops.c.  Return address =3D = 0xffffffffa02ee20a
The return address always 0xffffffffa02ee20a?


2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
It happens tonight aga= in on one of our servers, how to debug the root cause? Thank you.

Ap= r 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() ret= urned error 22.
Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree returned er= ror 22
Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called f= rom line 1184 of file fs/xfs/xfs_vnodeops.c.  Return address =3D 0xfff= fffffa02ee20a
Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected= . Shutting down filesystem
Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem and re= ctify the problem(s)
Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5 returned.
Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_fo= rce: error 5 returned.
Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned.Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned.
xfs_repair -n


Phase 7 - verify link counts...
would have reset inode 20021 nlinks from 0 to 1
would have reset inode 2= 0789 nlinks from 0 to 1
would have reset inode 35125 nlinks from 0 to 1<= br>would have reset inode 35637 nlinks from 0 to 1
would have reset inod= e 36149 nlinks from 0 to 1
would have reset inode 38197 nlinks from 0 to 1
would have reset inode 3= 9477 nlinks from 0 to 1
would have reset inode 54069 nlinks from 0 to 1<= br>would have reset inode 62261 nlinks from 0 to 1
would have reset inod= e 63029 nlinks from 0 to 1
would have reset inode 72501 nlinks from 0 to 1
would have reset inode 7= 9925 nlinks from 0 to 1
would have reset inode 81205 nlinks from 0 to 1<= br>would have reset inode 84789 nlinks from 0 to 1
would have reset inod= e 87861 nlinks from 0 to 1
would have reset inode 90663 nlinks from 0 to 1
would have reset inode 9= 1189 nlinks from 0 to 1
would have reset inode 95541 nlinks from 0 to 1<= br>would have reset inode 98101 nlinks from 0 to 1
would have reset inod= e 101173 nlinks from 0 to 1
would have reset inode 113205 nlinks from 0 to 1
would have reset inode = 114741 nlinks from 0 to 1
would have reset inode 126261 nlinks from 0 to= 1
would have reset inode 140597 nlinks from 0 to 1
would have reset = inode 144693 nlinks from 0 to 1
would have reset inode 147765 nlinks from 0 to 1
would have reset inode = 152885 nlinks from 0 to 1
would have reset inode 161333 nlinks from 0 to= 1
would have reset inode 161845 nlinks from 0 to 1
would have reset = inode 167477 nlinks from 0 to 1
would have reset inode 172341 nlinks from 0 to 1
would have reset inode = 191797 nlinks from 0 to 1
would have reset inode 204853 nlinks from 0 to= 1
would have reset inode 205365 nlinks from 0 to 1
would have reset = inode 215349 nlinks from 0 to 1
would have reset inode 215861 nlinks from 0 to 1
would have reset inode = 216373 nlinks from 0 to 1
would have reset inode 217397 nlinks from 0 to= 1
would have reset inode 224309 nlinks from 0 to 1
would have reset = inode 225589 nlinks from 0 to 1
would have reset inode 234549 nlinks from 0 to 1
would have reset inode = 234805 nlinks from 0 to 1
would have reset inode 249653 nlinks from 0 to= 1
would have reset inode 250677 nlinks from 0 to 1
would have reset = inode 252469 nlinks from 0 to 1
would have reset inode 261429 nlinks from 0 to 1
would have reset inode = 265013 nlinks from 0 to 1
would have reset inode 266805 nlinks from 0 to= 1
would have reset inode 267317 nlinks from 0 to 1
would have reset = inode 268853 nlinks from 0 to 1
would have reset inode 272437 nlinks from 0 to 1
would have reset inode = 273205 nlinks from 0 to 1
would have reset inode 274229 nlinks from 0 to= 1
would have reset inode 278325 nlinks from 0 to 1
would have reset = inode 278837 nlinks from 0 to 1
would have reset inode 281397 nlinks from 0 to 1
would have reset inode = 292661 nlinks from 0 to 1
would have reset inode 300853 nlinks from 0 to= 1
would have reset inode 302901 nlinks from 0 to 1
would have reset = inode 305205 nlinks from 0 to 1
would have reset inode 314165 nlinks from 0 to 1
would have reset inode = 315189 nlinks from 0 to 1
would have reset inode 320309 nlinks from 0 to= 1
would have reset inode 324917 nlinks from 0 to 1
would have reset = inode 328245 nlinks from 0 to 1
would have reset inode 335925 nlinks from 0 to 1
would have reset inode = 339253 nlinks from 0 to 1
would have reset inode 339765 nlinks from 0 to= 1
would have reset inode 348213 nlinks from 0 to 1
would have reset = inode 360501 nlinks from 0 to 1
would have reset inode 362037 nlinks from 0 to 1
would have reset inode = 366389 nlinks from 0 to 1
would have reset inode 385845 nlinks from 0 to= 1
would have reset inode 390709 nlinks from 0 to 1
would have reset = inode 409141 nlinks from 0 to 1
would have reset inode 413237 nlinks from 0 to 1
would have reset inode = 414773 nlinks from 0 to 1
would have reset inode 417845 nlinks from 0 to= 1
would have reset inode 436021 nlinks from 0 to 1
would have reset = inode 439349 nlinks from 0 to 1
would have reset inode 447029 nlinks from 0 to 1
would have reset inode = 491317 nlinks from 0 to 1
would have reset inode 494133 nlinks from 0 to= 1
would have reset inode 495413 nlinks from 0 to 1
would have reset = inode 501301 nlinks from 0 to 1
would have reset inode 506421 nlinks from 0 to 1
would have reset inode = 508469 nlinks from 0 to 1
would have reset inode 508981 nlinks from 0 to= 1
would have reset inode 511797 nlinks from 0 to 1
would have reset = inode 513077 nlinks from 0 to 1
would have reset inode 517941 nlinks from 0 to 1
would have reset inode = 521013 nlinks from 0 to 1
would have reset inode 522805 nlinks from 0 to= 1
would have reset inode 523317 nlinks from 0 to 1
would have reset = inode 525621 nlinks from 0 to 1
would have reset inode 527925 nlinks from 0 to 1
would have reset inode = 535605 nlinks from 0 to 1
would have reset inode 541749 nlinks from 0 to= 1
would have reset inode 573493 nlinks from 0 to 1
would have reset = inode 578613 nlinks from 0 to 1
would have reset inode 583029 nlinks from 0 to 1
would have reset inode = 585525 nlinks from 0 to 1
would have reset inode 586293 nlinks from 0 to= 1
would have reset inode 586805 nlinks from 0 to 1
would have reset = inode 591413 nlinks from 0 to 1
would have reset inode 594485 nlinks from 0 to 1
would have reset inode = 596277 nlinks from 0 to 1
would have reset inode 603189 nlinks from 0 to= 1
would have reset inode 613429 nlinks from 0 to 1
would have reset = inode 617781 nlinks from 0 to 1
would have reset inode 621877 nlinks from 0 to 1
would have reset inode = 623925 nlinks from 0 to 1
would have reset inode 625205 nlinks from 0 to= 1
would have reset inode 626741 nlinks from 0 to 1
would have reset = inode 639541 nlinks from 0 to 1
would have reset inode 640053 nlinks from 0 to 1
would have reset inode = 640565 nlinks from 0 to 1
would have reset inode 645173 nlinks from 0 to= 1
would have reset inode 652853 nlinks from 0 to 1
would have reset = inode 656181 nlinks from 0 to 1
would have reset inode 659253 nlinks from 0 to 1
would have reset inode = 663605 nlinks from 0 to 1
would have reset inode 667445 nlinks from 0 to= 1
would have reset inode 680757 nlinks from 0 to 1
would have reset = inode 691253 nlinks from 0 to 1
would have reset inode 691765 nlinks from 0 to 1
would have reset inode = 697653 nlinks from 0 to 1
would have reset inode 700469 nlinks from 0 to= 1
would have reset inode 707893 nlinks from 0 to 1
would have reset = inode 716853 nlinks from 0 to 1
would have reset inode 722229 nlinks from 0 to 1
would have reset inode = 722741 nlinks from 0 to 1
would have reset inode 723765 nlinks from 0 to= 1
would have reset inode 731957 nlinks from 0 to 1
would have reset = inode 742965 nlinks from 0 to 1
would have reset inode 743477 nlinks from 0 to 1
would have reset inode = 745781 nlinks from 0 to 1
would have reset inode 746293 nlinks from 0 to= 1
would have reset inode 774453 nlinks from 0 to 1
would have reset = inode 778805 nlinks from 0 to 1
would have reset inode 785013 nlinks from 0 to 1
would have reset inode = 785973 nlinks from 0 to 1
would have reset inode 791349 nlinks from 0 to= 1
would have reset inode 796981 nlinks from 0 to 1
would have reset = inode 803381 nlinks from 0 to 1
would have reset inode 806965 nlinks from 0 to 1
would have reset inode = 811798 nlinks from 0 to 1
would have reset inode 812310 nlinks from 0 to= 1
would have reset inode 813078 nlinks from 0 to 1
would have reset = inode 813607 nlinks from 0 to 1
would have reset inode 814183 nlinks from 0 to 1
would have reset inode = 822069 nlinks from 0 to 1
would have reset inode 828469 nlinks from 0 to= 1
would have reset inode 830005 nlinks from 0 to 1
would have reset = inode 832053 nlinks from 0 to 1
would have reset inode 832565 nlinks from 0 to 1
would have reset inode = 836661 nlinks from 0 to 1
would have reset inode 841013 nlinks from 0 to= 1
would have reset inode 841525 nlinks from 0 to 1
would have reset = inode 845365 nlinks from 0 to 1
would have reset inode 846133 nlinks from 0 to 1
would have reset inode = 847157 nlinks from 0 to 1
would have reset inode 852533 nlinks from 0 to= 1
would have reset inode 857141 nlinks from 0 to 1
would have reset = inode 863271 nlinks from 0 to 1
would have reset inode 866855 nlinks from 0 to 1
would have reset inode = 887861 nlinks from 0 to 1
would have reset inode 891701 nlinks from 0 to= 1
would have reset inode 894773 nlinks from 0 to 1
would have reset = inode 900149 nlinks from 0 to 1
would have reset inode 902197 nlinks from 0 to 1
would have reset inode = 906293 nlinks from 0 to 1
would have reset inode 906805 nlinks from 0 to= 1
would have reset inode 909877 nlinks from 0 to 1
would have reset = inode 925493 nlinks from 0 to 1
would have reset inode 949543 nlinks from 0 to 1
would have reset inode = 955175 nlinks from 0 to 1
would have reset inode 963623 nlinks from 0 to= 1
would have reset inode 967733 nlinks from 0 to 1
would have reset = inode 968231 nlinks from 0 to 1
would have reset inode 982069 nlinks from 0 to 1
would have reset inode = 1007413 nlinks from 0 to 1
would have reset inode 1011509 nlinks from 0 = to 1
would have reset inode 1014069 nlinks from 0 to 1
would have res= et inode 1014581 nlinks from 0 to 1
would have reset inode 1022005 nlinks from 0 to 1
would have reset inode= 1022517 nlinks from 0 to 1
would have reset inode 1023029 nlinks from 0= to 1
would have reset inode 1025333 nlinks from 0 to 1
would have re= set inode 1043765 nlinks from 0 to 1
would have reset inode 1044789 nlinks from 0 to 1
would have reset inode= 1049397 nlinks from 0 to 1
would have reset inode 1050933 nlinks from 0= to 1
would have reset inode 1051445 nlinks from 0 to 1
would have re= set inode 1054261 nlinks from 0 to 1
would have reset inode 1060917 nlinks from 0 to 1
would have reset inode= 1063477 nlinks from 0 to 1
would have reset inode 1076021 nlinks from 0= to 1
would have reset inode 1081141 nlinks from 0 to 1
would have re= set inode 1086261 nlinks from 0 to 1
would have reset inode 1097269 nlinks from 0 to 1
would have reset inode= 1099829 nlinks from 0 to 1
would have reset inode 1100853 nlinks from 0= to 1
would have reset inode 1101877 nlinks from 0 to 1
would have re= set inode 1126709 nlinks from 0 to 1
would have reset inode 1134389 nlinks from 0 to 1
would have reset inode= 1141045 nlinks from 0 to 1
would have reset inode 1141557 nlinks from 0= to 1
would have reset inode 1142581 nlinks from 0 to 1
would have re= set inode 1148469 nlinks from 0 to 1
would have reset inode 1153333 nlinks from 0 to 1
would have reset inode= 1181749 nlinks from 0 to 1
would have reset inode 1192245 nlinks from 0= to 1
would have reset inode 1198133 nlinks from 0 to 1
would have re= set inode 1203765 nlinks from 0 to 1
would have reset inode 1221429 nlinks from 0 to 1
would have reset inode= 1223989 nlinks from 0 to 1
would have reset inode 1235509 nlinks from 0= to 1
would have reset inode 1239349 nlinks from 0 to 1
would have re= set inode 1240885 nlinks from 0 to 1
would have reset inode 1241397 nlinks from 0 to 1
would have reset inode= 1241909 nlinks from 0 to 1
would have reset inode 1242421 nlinks from 0= to 1
would have reset inode 1244981 nlinks from 0 to 1
would have re= set inode 1246517 nlinks from 0 to 1
would have reset inode 1253429 nlinks from 0 to 1
would have reset inode= 1271861 nlinks from 0 to 1
would have reset inode 1274677 nlinks from 0= to 1
would have reset inode 1277749 nlinks from 0 to 1
would have re= set inode 1278773 nlinks from 0 to 1
would have reset inode 1286709 nlinks from 0 to 1
would have reset inode= 1288245 nlinks from 0 to 1
would have reset inode 1299765 nlinks from 0= to 1
would have reset inode 1302325 nlinks from 0 to 1
would have re= set inode 1304885 nlinks from 0 to 1
would have reset inode 1305397 nlinks from 0 to 1
would have reset inode= 1307509 nlinks from 0 to 1
would have reset inode 1309493 nlinks from 0= to 1
would have reset inode 1310517 nlinks from 0 to 1
would have re= set inode 1311029 nlinks from 0 to 1
would have reset inode 1312053 nlinks from 0 to 1
would have reset inode= 1316917 nlinks from 0 to 1
would have reset inode 1317941 nlinks from 0= to 1
would have reset inode 1320821 nlinks from 0 to 1
would have re= set inode 1322805 nlinks from 0 to 1
would have reset inode 1332789 nlinks from 0 to 1
would have reset inode= 1336373 nlinks from 0 to 1
would have reset inode 1345653 nlinks from 0= to 1
would have reset inode 1354549 nlinks from 0 to 1
would have re= set inode 1361973 nlinks from 0 to 1
would have reset inode 1369909 nlinks from 0 to 1
would have reset inode= 1372981 nlinks from 0 to 1
would have reset inode 1388853 nlinks from 0= to 1
would have reset inode 1402933 nlinks from 0 to 1
would have re= set inode 1403445 nlinks from 0 to 1
would have reset inode 1420085 nlinks from 0 to 1
would have reset inode= 1452853 nlinks from 0 to 1
would have reset inode 1456437 nlinks from 0= to 1
would have reset inode 1457973 nlinks from 0 to 1
would have re= set inode 1459253 nlinks from 0 to 1
would have reset inode 1467957 nlinks from 0 to 1
would have reset inode= 1471541 nlinks from 0 to 1
would have reset inode 1476661 nlinks from 0= to 1
would have reset inode 1479733 nlinks from 0 to 1
would have re= set inode 1483061 nlinks from 0 to 1
would have reset inode 1484085 nlinks from 0 to 1
would have reset inode= 1486133 nlinks from 0 to 1
would have reset inode 1489461 nlinks from 0= to 1
would have reset inode 1490037 nlinks from 0 to 1
would have re= set inode 1492021 nlinks from 0 to 1
would have reset inode 1493557 nlinks from 0 to 1
would have reset inode= 1494069 nlinks from 0 to 1
would have reset inode 1496885 nlinks from 0= to 1
would have reset inode 1498421 nlinks from 0 to 1
would have re= set inode 1498933 nlinks from 0 to 1
would have reset inode 1499957 nlinks from 0 to 1
would have reset inode= 1506101 nlinks from 0 to 1
would have reset inode 1507637 nlinks from 0= to 1
would have reset inode 1510453 nlinks from 0 to 1
would have re= set inode 1514293 nlinks from 0 to 1
would have reset inode 1517365 nlinks from 0 to 1
would have reset inode= 1520693 nlinks from 0 to 1
would have reset inode 1521973 nlinks from 0= to 1
would have reset inode 1530421 nlinks from 0 to 1
would have re= set inode 1530933 nlinks from 0 to 1
would have reset inode 1537333 nlinks from 0 to 1
would have reset inode= 1538357 nlinks from 0 to 1
would have reset inode 1548853 nlinks from 0= to 1
would have reset inode 1553973 nlinks from 0 to 1
would have re= set inode 1557301 nlinks from 0 to 1
would have reset inode 1564213 nlinks from 0 to 1
would have reset inode= 1564725 nlinks from 0 to 1
would have reset inode 1576501 nlinks from 0= to 1
would have reset inode 1580597 nlinks from 0 to 1
would have re= set inode 1584693 nlinks from 0 to 1
would have reset inode 1586485 nlinks from 0 to 1
would have reset inode= 1589301 nlinks from 0 to 1
would have reset inode 1589813 nlinks from 0= to 1
would have reset inode 1592629 nlinks from 0 to 1
would have re= set inode 1595701 nlinks from 0 to 1
would have reset inode 1601077 nlinks from 0 to 1
would have reset inode= 1623861 nlinks from 0 to 1
would have reset inode 1626677 nlinks from 0= to 1
would have reset inode 1627701 nlinks from 0 to 1
would have re= set inode 1633333 nlinks from 0 to 1
would have reset inode 1639221 nlinks from 0 to 1
would have reset inode= 1649205 nlinks from 0 to 1
would have reset inode 1686325 nlinks from 0= to 1
would have reset inode 1690677 nlinks from 0 to 1
would have re= set inode 1693749 nlinks from 0 to 1
would have reset inode 1704757 nlinks from 0 to 1
would have reset inode= 1707061 nlinks from 0 to 1
would have reset inode 1709109 nlinks from 0= to 1
would have reset inode 1719349 nlinks from 0 to 1
would have re= set inode 1737013 nlinks from 0 to 1
would have reset inode 1741365 nlinks from 0 to 1
would have reset inode= 1747509 nlinks from 0 to 1
would have reset inode 1770805 nlinks from 0= to 1
would have reset inode 1780789 nlinks from 0 to 1
would have re= set inode 1793589 nlinks from 0 to 1
would have reset inode 1795125 nlinks from 0 to 1
would have reset inode= 1800757 nlinks from 0 to 1
would have reset inode 1801269 nlinks from 0= to 1
would have reset inode 1802549 nlinks from 0 to 1
would have re= set inode 1804085 nlinks from 0 to 1
would have reset inode 1817141 nlinks from 0 to 1
would have reset inode= 1821749 nlinks from 0 to 1
would have reset inode 1832757 nlinks from 0= to 1
would have reset inode 1836341 nlinks from 0 to 1
would have re= set inode 1856309 nlinks from 0 to 1
would have reset inode 1900597 nlinks from 0 to 1
would have reset inode= 1902901 nlinks from 0 to 1
would have reset inode 1912373 nlinks from 0= to 1
would have reset inode 1943093 nlinks from 0 to 1
would have re= set inode 1944373 nlinks from 0 to 1
would have reset inode 1954101 nlinks from 0 to 1
would have reset inode= 1955893 nlinks from 0 to 1
would have reset inode 1961781 nlinks from 0= to 1
would have reset inode 1974325 nlinks from 0 to 1
would have re= set inode 1978677 nlinks from 0 to 1
would have reset inode 1981237 nlinks from 0 to 1
would have reset inode= 1992245 nlinks from 0 to 1
would have reset inode 2000949 nlinks from 0= to 1
would have reset inode 2002229 nlinks from 0 to 1
would have re= set inode 2004789 nlinks from 0 to 1
would have reset inode 2005301 nlinks from 0 to 1
would have reset inode= 2011189 nlinks from 0 to 1
would have reset inode 2012981 nlinks from 0= to 1
would have reset inode 2015285 nlinks from 0 to 1
would have re= set inode 2018869 nlinks from 0 to 1
would have reset inode 2028341 nlinks from 0 to 1
would have reset inode= 2028853 nlinks from 0 to 1
would have reset inode 2030901 nlinks from 0= to 1
would have reset inode 2032181 nlinks from 0 to 1
would have re= set inode 2032693 nlinks from 0 to 1
would have reset inode 2040117 nlinks from 0 to 1
would have reset inode= 2053685 nlinks from 0 to 1
would have reset inode 2083893 nlinks from 0= to 1
would have reset inode 2087221 nlinks from 0 to 1
would have re= set inode 2095925 nlinks from 0 to 1
would have reset inode 2098741 nlinks from 0 to 1
would have reset inode= 2100533 nlinks from 0 to 1
would have reset inode 2101301 nlinks from 0= to 1
would have reset inode 2123573 nlinks from 0 to 1
would have re= set inode 2132789 nlinks from 0 to 1
would have reset inode 2133813 nlinks from 0 to 1





2013/4/10 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com&g= t;
The storage info is as foll= owing:
RAID-6
SATA HDD
Controller: PERC H710P Mini (Embedded)
Disk /dev/sdb: 30000.3 GB, 30000= 346562560 bytes
255 heads, 63 sectors/track, 3647334 cylinders
Units =3D cylinders of 16065 * 512 =3D 8225280 bytes
Sector = size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/= optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

sd 0:2:1:0: [sdb] 58594426880 512-byte logical blo= cks: (30.0 TB/27.2 TiB)
sd 0:2:1:0: [sdb] Write Protect is off
sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08
sd 0:2:1:0: [sd= b] Write cache: enabled, read cache: enabled, doesn't support DPO or FU= A
sd 0:2:1:0: [sdb] Attached SCSI disk

*-storage               
       description: RAID bus controller
&n= bsp;      product: MegaRAID SAS 2208 [Thunderbolt]
       vendor: LSI Logic / Symbios Logic
&nbs= p;      physical id: 0
       = bus info: pci@0000:02:00.0
       logical nam= e: scsi0
       version: 01
  =      width: 64 bits
       clock: 33MHz
      &nbs= p;capabilities: storage pm pciexpress vpd msi msix bus_master cap_list rom<= /div>
       configuration: driver=3Dmegaraid_sas l= atency=3D0
       resources: irq:42 ioport:fc= 00(size=3D256) memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff memory:dc8= 00000-dc81ffff(prefetchable)
     *-disk:0
        &nb= sp; description: SCSI Disk
          pro= duct: PERC H710P
          vendor: DELL<= /div>
          physical id: 2.0.0
&= nbsp;         bus info: scsi@0:2.0.0
          logical name: /dev/sda
&n= bsp;         version: 3.13
    &nbs= p;     serial: 0049d6ce1d9f2035180096fde490f648
  =         size: 558GiB (599GB)
    &n= bsp;     capabilities: partitioned partitioned:dos
          configuration: ansiversion=3D5 sign= ature=3D000aa336
     *-disk:1
  &n= bsp;       description: SCSI Disk
    &n= bsp;     product: PERC H710P
       = ;   vendor: DELL
          physical= id: 2.1.0
          bus info: scsi@0:2.1.0
&n= bsp;         logical name: /dev/sdb
  &n= bsp;       logical name: /mnt/xfsd
    &= nbsp;     version: 3.13
        &nb= sp; serial: 003366f71da22035180096fde490f648
          size: 27TiB (30TB)
 =         configuration: ansiversion=3D5 mount.fstype=3D= xfs mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,s= width=3D1280,noquota state=3Dmounted

Thank you.
<= div>


2013/4/10 Emmanuel Florac <eflorac@intellique.com>
Le Tue, 9 Apr 2013 23:10:03 +0800
=B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com> =A8=A6crivait:

> > Apr  9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected.<= br> > > Shutting down filesystem

This. I/O error detected. That means that at some point the underlyin= g
device (disk, RAID array, SAN volume) couldn't be reached. So this
could very well be a case of a flakey drive, array, cable or SCSI
driver.

What's the storage setup here?

--
------------------------------------------------------------------------ Emmanuel Florac     |   Direction technique
                    | &nb= sp; Intellique
                    | &nb= sp; <eflorac= @intellique.com>
                    | &nb= sp; +33 1 78 94 84 02
------------------------------------------------------------------------



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--bcaec51d2998bc485b04da1b2bd0-- From jack@suse.cz Thu Apr 11 15:08:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C368D7F37 for ; Thu, 11 Apr 2013 15:08:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7CCD18F8094 for ; Thu, 11 Apr 2013 13:08:21 -0700 (PDT) X-ASG-Debug-ID: 1365710898-04bdf02d1da02e0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id V11pXm10cgEBR9p5 for ; Thu, 11 Apr 2013 13:08:19 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 6C31CA51F2; Thu, 11 Apr 2013 22:08:18 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id 122F82068D; Thu, 11 Apr 2013 22:08:17 +0200 (CEST) Date: Thu, 11 Apr 2013 22:08:17 +0200 From: Jan Kara To: Dave Chinner Cc: Jan Kara , xfs@oss.sgi.com, tinguely@sgi.com, Dave Chinner Subject: Re: [PATCH] xfs: Avoid pathological backwards allocation Message-ID: <20130411200817.GA9379@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH] xfs: Avoid pathological backwards allocation References: <1365680691-5330-1-git-send-email-jack@suse.cz> <20130411125003.GA31207@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130411125003.GA31207@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1365710898 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127837 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 11-04-13 22:50:03, Dave Chinner wrote: > On Thu, Apr 11, 2013 at 01:44:51PM +0200, Jan Kara wrote: > > Writing a large file using direct IO in 16 MB chunks sometimes results > > in a pathological allocation pattern where 16 MB chunks of large free > > extent are allocated to a file in a reversed order. So extents of a file > > look for example as: > > > > ext logical physical expected length flags > > 0 0 13 4550656 > > 1 4550656 188136807 4550668 12562432 > > 2 17113088 200699240 200699238 622592 > > 3 17735680 182046055 201321831 4096 > > 4 17739776 182041959 182050150 4096 > > 5 17743872 182037863 182046054 4096 > > 6 17747968 182033767 182041958 4096 > > 7 17752064 182029671 182037862 4096 > > ... > > 6757 45400064 154381644 154389835 4096 > > 6758 45404160 154377548 154385739 4096 > > 6759 45408256 252951571 154381643 73728 eof > > > > This happens because XFS_ALLOCTYPE_THIS_BNO allocation fails (the last > > extent in the file cannot be further extended) so we fall back to > > XFS_ALLOCTYPE_NEAR_BNO allocation which picks end of a large free > > extent as the best place to continue the file. Since the chunk at the > > end of the free extent again cannot be further extended, this behavior > > repeats until the whole free extent is consumed in a reversed order. > > > > For data allocations this backward allocation isn't beneficial so make > > xfs_alloc_compute_diff() pick start of a free extent instead of its end > > for them. That avoids the backward allocation pattern. > > > > Based on idea by Dave Chinner . > > Can you add a reference to the previous discussion thread here? > I had to go back and read it to remind myself of how we ended up > with this solution, so I think that we need to capture that > information in this commit message somehow. A url to an archive > (such as on oss.sgi.com) is probably the simplest way to do this. OK, added. > > CC: Dave Chinner > > Signed-off-by: Jan Kara > > --- > > fs/xfs/xfs_alloc.c | 22 ++++++++++++++++------ > > 1 files changed, 16 insertions(+), 6 deletions(-) > > > > BTW, I've tested With this patch applied I really cannot reproduce the > > problematic allocation pattern anymore. > > > > diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c > > index 0ad2325..64c6247 100644 > > --- a/fs/xfs/xfs_alloc.c > > +++ b/fs/xfs/xfs_alloc.c > > @@ -173,6 +173,7 @@ xfs_alloc_compute_diff( > > xfs_agblock_t wantbno, /* target starting block */ > > xfs_extlen_t wantlen, /* target length */ > > xfs_extlen_t alignment, /* target alignment */ > > + char userdata, /* are we allocating data? */ > > xfs_agblock_t freebno, /* freespace's starting block */ > > xfs_extlen_t freelen, /* freespace's length */ > > xfs_agblock_t *newbnop) /* result: best start block from free */ > > @@ -187,7 +188,12 @@ xfs_alloc_compute_diff( > > ASSERT(freelen >= wantlen); > > freeend = freebno + freelen; > > wantend = wantbno + wantlen; > > - if (freebno >= wantbno) { > > + /* > > + * We want to allocate from the start of a free extent if it is past > > + * the desired block or if we are allocating user data and the free > > + * extent is before desired block. > > + */ > > I think this probably needs a little more detail as to why we we do > this for user data. i.e. to carve from the front edge of the free > extent to allow for contiguous allocation from the remaining free > space if the file grows in the short term. I agree. I expanded the comment a bit. > > + if (freebno >= wantbno || (userdata && freeend < wantend)) { > > if ((newbno1 = roundup(freebno, alignment)) >= freeend) > > newbno1 = NULLAGBLOCK; > > So this is the meat of the change. We have this: > > freebno freeend > +---------------------------------+ > +-----+ > prev +----------+ > wantbno wantend > > and for user data this will now return: > > freebno freeend > +---------------------------------+ > +-----+ > +--------+ prev +----------+ > newbno1 wantbno wantend > > I wondered for a minute about how alignment affected the extent > returned by taking this different branch, but I'm the behaviour is > no different compared to carving an aligned chunk from the rear of > the free extent. If the extent is short, we get the same result > whether we try to carve it from the front or rear of the free space. Yes, I came to the same conclusion when I was thinking about this when writing the patch. > OK, what if we have: > > freebno freeend > +---------------------------------+ > +----------+ > wantbno wantend > > The existing code treats that the same as wantbno > freeend case > above, so we should treat it the same and carve from the front edge. > So the (freeend < wantend) check is sane, as is "<" for the > comparison. If the watned range fits within the freespace block, > then we should still carve that from the end of the freespace extent > as that was what was wanted. > > IOWs, the code change looks good, and as such: > > Reviewed-by: Dave Chinner Thanks. I'll send v2 with the updates you suggested shortly. > However, I think this probably needs to sit in the dev tree for a > little while before we release it on the world. I don't think that > pushing this for 3.10 is wise as we need a bit of time to determine > if there are unintended side effects from this change under > accelerated aging workloads first. I'd like to be conservative on > this as the allocation primitives being touched are devilishly > complex and getting this wrong will have permanent impact on > filesystems... I agree. I don't really hurry with pushing this to Linus. We will likely carry the change in our SUSE kernel and if it gets merged in forseeable future that's all I care about :) Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Thu Apr 11 15:09:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A40F37F37 for ; Thu, 11 Apr 2013 15:09:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7C0F68F8094 for ; Thu, 11 Apr 2013 13:09:59 -0700 (PDT) X-ASG-Debug-ID: 1365710997-04cbb057f5a2c30001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id URVE75zw6B8jm3nP for ; Thu, 11 Apr 2013 13:09:58 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 9CD16A51F5; Thu, 11 Apr 2013 22:09:57 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id 3A97D2068D; Thu, 11 Apr 2013 22:09:57 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: dchinner@redhat.com, tinguely@sgi.com, Jan Kara Subject: [PATCH v2] xfs: Avoid pathological backwards allocation Date: Thu, 11 Apr 2013 22:09:56 +0200 X-ASG-Orig-Subj: [PATCH v2] xfs: Avoid pathological backwards allocation Message-Id: <1365710996-16439-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1365710997 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127837 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Writing a large file using direct IO in 16 MB chunks sometimes results in a pathological allocation pattern where 16 MB chunks of large free extent are allocated to a file in a reversed order. So extents of a file look for example as: ext logical physical expected length flags 0 0 13 4550656 1 4550656 188136807 4550668 12562432 2 17113088 200699240 200699238 622592 3 17735680 182046055 201321831 4096 4 17739776 182041959 182050150 4096 5 17743872 182037863 182046054 4096 6 17747968 182033767 182041958 4096 7 17752064 182029671 182037862 4096 ... 6757 45400064 154381644 154389835 4096 6758 45404160 154377548 154385739 4096 6759 45408256 252951571 154381643 73728 eof This happens because XFS_ALLOCTYPE_THIS_BNO allocation fails (the last extent in the file cannot be further extended) so we fall back to XFS_ALLOCTYPE_NEAR_BNO allocation which picks end of a large free extent as the best place to continue the file. Since the chunk at the end of the free extent again cannot be further extended, this behavior repeats until the whole free extent is consumed in a reversed order. For data allocations this backward allocation isn't beneficial so make xfs_alloc_compute_diff() pick start of a free extent instead of its end for them. That avoids the backward allocation pattern. See thread at http://oss.sgi.com/archives/xfs/2013-03/msg00144.html for more details about the reproduction case and why this solution was chosen. Based on idea by Dave Chinner . CC: Dave Chinner Reviewed-by: Dave Chinner Signed-off-by: Jan Kara --- fs/xfs/xfs_alloc.c | 24 ++++++++++++++++++------ 1 files changed, 18 insertions(+), 6 deletions(-) v2: Updated comment and commit description. diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 0ad2325..f99113d 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -173,6 +173,7 @@ xfs_alloc_compute_diff( xfs_agblock_t wantbno, /* target starting block */ xfs_extlen_t wantlen, /* target length */ xfs_extlen_t alignment, /* target alignment */ + char userdata, /* are we allocating data? */ xfs_agblock_t freebno, /* freespace's starting block */ xfs_extlen_t freelen, /* freespace's length */ xfs_agblock_t *newbnop) /* result: best start block from free */ @@ -187,7 +188,14 @@ xfs_alloc_compute_diff( ASSERT(freelen >= wantlen); freeend = freebno + freelen; wantend = wantbno + wantlen; - if (freebno >= wantbno) { + /* + * We want to allocate from the start of a free extent if it is past + * the desired block or if we are allocating user data and the free + * extent is before desired block. The second case is there to allow + * for contiguous allocation from the remaining free space if the file + * grows in the short term. + */ + if (freebno >= wantbno || (userdata && freeend < wantend)) { if ((newbno1 = roundup(freebno, alignment)) >= freeend) newbno1 = NULLAGBLOCK; } else if (freeend >= wantend && alignment > 1) { @@ -772,7 +780,8 @@ xfs_alloc_find_best_extent( xfs_alloc_fix_len(args); sdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, *sbnoa, + args->alignment, + args->userdata, *sbnoa, *slena, &new); /* @@ -943,7 +952,8 @@ restart: if (args->len < blen) continue; ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, ltbnoa, ltlena, <new); + args->alignment, args->userdata, ltbnoa, + ltlena, <new); if (ltnew != NULLAGBLOCK && (args->len > blen || ltdiff < bdiff)) { bdiff = ltdiff; @@ -1095,7 +1105,8 @@ restart: args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, ltbnoa, ltlena, <new); + args->alignment, args->userdata, ltbnoa, + ltlena, <new); error = xfs_alloc_find_best_extent(args, &bno_cur_lt, &bno_cur_gt, @@ -1111,7 +1122,8 @@ restart: args->len = XFS_EXTLEN_MIN(gtlena, args->maxlen); xfs_alloc_fix_len(args); gtdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, gtbnoa, gtlena, >new); + args->alignment, args->userdata, gtbnoa, + gtlena, >new); error = xfs_alloc_find_best_extent(args, &bno_cur_gt, &bno_cur_lt, @@ -1170,7 +1182,7 @@ restart: } rlen = args->len; (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, - ltbnoa, ltlena, <new); + args->userdata, ltbnoa, ltlena, <new); ASSERT(ltnew >= ltbno); ASSERT(ltnew + rlen <= ltbnoa + ltlena); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); -- 1.7.1 From david@fromorbit.com Thu Apr 11 16:30:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 825547F37 for ; Thu, 11 Apr 2013 16:30:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5E02130404E for ; Thu, 11 Apr 2013 14:30:40 -0700 (PDT) X-ASG-Debug-ID: 1365715832-04cbb057f7ab7d0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id MJKCGlhAetdz7FbF for ; Thu, 11 Apr 2013 14:30:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApMVANMqZ1F5LLHC/2dsb2JhbABICIMGvGKFGAQBgQYXdIIfAQEFGgEMExwzCBgMJQ8FJQM0iBO9VxWNSxmBEhKCYGEDkzaDS5EQgx0q Received: from ppp121-44-177-194.lns20.syd7.internode.on.net (HELO dastard) ([121.44.177.194]) by ipmail07.adl2.internode.on.net with ESMTP; 12 Apr 2013 07:00:28 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQP4X-0007R2-VV for xfs@oss.sgi.com; Fri, 12 Apr 2013 07:30:22 +1000 Date: Fri, 12 Apr 2013 07:30:21 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH V2 13/22] xfs: add CRC checking to dir2 leaf blocks Message-ID: <20130411213021.GB31207@dastard> X-ASG-Orig-Subj: [PATCH V2 13/22] xfs: add CRC checking to dir2 leaf blocks References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-14-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-14-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1365715832 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127843 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner This addition follows the same pattern as the dir2 block CRCs. Seeing as both LEAF1 and LEAFN types need to changed at the same time, this is a pretty large amount of change. leaf block headers need to be abstracted away from the on-disk structures (struct xfs_dir3_icleaf_hdr), as do the base leaf entry locations. This header abstract allows the in-core header and leaf entry location to be passed around instead of the leaf block itself. This saves a lot of converting individual variables from on-disk format to host format where they are used, so there's a good chance that the compiler will be able to produce much more optimal code as it's not having to byteswap variables all over the place. Signed-off-by: Dave Chinner --- V2: fix issues from Ben's review. fs/xfs/xfs_da_btree.c | 45 ++- fs/xfs/xfs_da_btree.h | 23 ++ fs/xfs/xfs_dir2_block.c | 19 +- fs/xfs/xfs_dir2_format.h | 60 +++- fs/xfs/xfs_dir2_leaf.c | 792 +++++++++++++++++++++++++++++----------------- fs/xfs/xfs_dir2_node.c | 475 +++++++++++++++------------ fs/xfs/xfs_dir2_priv.h | 32 +- 7 files changed, 924 insertions(+), 522 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 4d7696a..2f23b14 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -139,7 +139,8 @@ xfs_da_node_read_verify( bp->b_ops->verify_read(bp); return; case XFS_DIR2_LEAFN_MAGIC: - bp->b_ops = &xfs_dir2_leafn_buf_ops; + case XFS_DIR3_LEAFN_MAGIC: + bp->b_ops = &xfs_dir3_leafn_buf_ops; bp->b_ops->verify_read(bp); return; default: @@ -396,11 +397,18 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, size = (int)((char *)&oldroot->btree[be16_to_cpu(oldroot->hdr.count)] - (char *)oldroot); } else { - ASSERT(oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; + leaf = (xfs_dir2_leaf_t *)oldroot; - size = (int)((char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] - - (char *)leaf); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + + ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || + leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); + size = (int)((char *)&ents[leafhdr.count] - (char *)leaf); } + /* XXX: can't just copy CRC headers from one block to another */ memcpy(node, oldroot, size); xfs_trans_log_buf(tp, bp, 0, size - 1); @@ -424,7 +432,8 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, node->hdr.count = cpu_to_be16(2); #ifdef DEBUG - if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { + if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { ASSERT(blk1->blkno >= mp->m_dirleafblk && blk1->blkno < mp->m_dirfreeblk); ASSERT(blk2->blkno >= mp->m_dirleafblk && @@ -782,6 +791,7 @@ xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level) if (level == 1) { ASSERT(magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); } else ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); @@ -1565,6 +1575,7 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, info = blk->bp->b_addr; ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); blk->magic = be16_to_cpu(info->magic); if (blk->magic == XFS_DA_NODE_MAGIC) { @@ -1584,12 +1595,13 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, NULL); break; case XFS_DIR2_LEAFN_MAGIC: + case XFS_DIR3_LEAFN_MAGIC: + blk->magic = XFS_DIR2_LEAFN_MAGIC; blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, NULL); break; default: - ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC || - blk->magic == XFS_DIR2_LEAFN_MAGIC); + ASSERT(0); break; } } @@ -1833,10 +1845,16 @@ xfs_da_swap_lastblock( /* * Get values from the moved block. */ - if (dead_info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { + if (dead_info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + dead_info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; + dead_leaf2 = (xfs_dir2_leaf_t *)dead_info; + xfs_dir3_leaf_hdr_from_disk(&leafhdr, dead_leaf2); + ents = xfs_dir3_leaf_ents_p(dead_leaf2); dead_level = 0; - dead_hash = be32_to_cpu(dead_leaf2->ents[be16_to_cpu(dead_leaf2->hdr.count) - 1].hashval); + dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval); } else { ASSERT(dead_info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); dead_node = (xfs_da_intnode_t *)dead_info; @@ -2281,10 +2299,17 @@ xfs_da_read_buf( XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && (magic != XFS_ATTR_LEAF_MAGIC) && (magic != XFS_DIR2_LEAF1_MAGIC) && + (magic != XFS_DIR3_LEAF1_MAGIC) && (magic != XFS_DIR2_LEAFN_MAGIC) && + (magic != XFS_DIR3_LEAFN_MAGIC) && (magic1 != XFS_DIR2_BLOCK_MAGIC) && + (magic1 != XFS_DIR3_BLOCK_MAGIC) && (magic1 != XFS_DIR2_DATA_MAGIC) && - (free->hdr.magic != cpu_to_be32(XFS_DIR2_FREE_MAGIC)), + (magic1 != XFS_DIR3_DATA_MAGIC) && + (free->hdr.magic != + cpu_to_be32(XFS_DIR2_FREE_MAGIC)) && + (free->hdr.magic != + cpu_to_be32(XFS_DIR3_FREE_MAGIC)), mp, XFS_ERRTAG_DA_READ_BUF, XFS_RANDOM_DA_READ_BUF))) { trace_xfs_da_btree_corrupt(bp, _RET_IP_); diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index ee5170c..0854b95 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -47,6 +47,29 @@ typedef struct xfs_da_blkinfo { } xfs_da_blkinfo_t; /* + * CRC enabled directory structure types + * + * The headers change size for the additional verification information, but + * otherwise the tree layouts and contents are unchanged. + */ +#define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */ +#define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ + +struct xfs_da3_blkinfo { + /* + * the node link manipulation code relies on the fact that the first + * element of this structure is the struct xfs_da_blkinfo so it can + * ignore the differences in the rest of the structures. + */ + struct xfs_da_blkinfo hdr; + __be32 crc; /* CRC of block */ + __be64 blkno; /* first block of the buffer */ + __be64 lsn; /* sequence number of last write */ + uuid_t uuid; /* filesystem we belong to */ + __be64 owner; /* inode that owns the block */ +}; + +/* * This is the structure of the root and intermediate nodes in the Btree. * The leaf nodes are defined above. * diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 7ec87c2..d2e445f 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -1013,6 +1013,8 @@ xfs_dir2_leaf_to_block( __be16 *tagp; /* end of entry (tag) */ int to; /* block/leaf to index */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; trace_xfs_dir2_leaf_to_block(args); @@ -1020,8 +1022,12 @@ xfs_dir2_leaf_to_block( tp = args->trans; mp = dp->i_mount; leaf = lbp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); ltp = xfs_dir2_leaf_tail_p(mp, leaf); + + ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC || + leafhdr.magic == XFS_DIR3_LEAF1_MAGIC); /* * If there are data blocks other than the first one, take this * opportunity to remove trailing empty data blocks that may have @@ -1058,7 +1064,7 @@ xfs_dir2_leaf_to_block( * Size of the "leaf" area in the block. */ size = (uint)sizeof(xfs_dir2_block_tail_t) + - (uint)sizeof(*lep) * (be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale)); + (uint)sizeof(*lep) * (leafhdr.count - leafhdr.stale); /* * Look at the last data entry. */ @@ -1087,18 +1093,17 @@ xfs_dir2_leaf_to_block( * Initialize the block tail. */ btp = xfs_dir2_block_tail_p(mp, hdr); - btp->count = cpu_to_be32(be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale)); + btp->count = cpu_to_be32(leafhdr.count - leafhdr.stale); btp->stale = 0; xfs_dir2_block_log_tail(tp, dbp); /* * Initialize the block leaf area. We compact out stale entries. */ lep = xfs_dir2_block_leaf_p(btp); - for (from = to = 0; from < be16_to_cpu(leaf->hdr.count); from++) { - if (leaf->ents[from].address == - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + for (from = to = 0; from < leafhdr.count; from++) { + if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) continue; - lep[to++] = leaf->ents[from]; + lep[to++] = ents[from]; } ASSERT(to == be32_to_cpu(btp->count)); xfs_dir2_block_log_leaf(tp, dbp, 0, be32_to_cpu(btp->count) - 1); diff --git a/fs/xfs/xfs_dir2_format.h b/fs/xfs/xfs_dir2_format.h index 0ac0950..7b986d3 100644 --- a/fs/xfs/xfs_dir2_format.h +++ b/fs/xfs/xfs_dir2_format.h @@ -470,6 +470,21 @@ typedef struct xfs_dir2_leaf_hdr { __be16 stale; /* count of stale entries */ } xfs_dir2_leaf_hdr_t; +struct xfs_dir3_leaf_hdr { + struct xfs_da3_blkinfo info; /* header for da routines */ + __be16 count; /* count of entries */ + __be16 stale; /* count of stale entries */ + __be32 pad; +}; + +struct xfs_dir3_icleaf_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t stale; +}; + /* * Leaf block entry. */ @@ -489,23 +504,50 @@ typedef struct xfs_dir2_leaf_tail { * Leaf block. */ typedef struct xfs_dir2_leaf { - xfs_dir2_leaf_hdr_t hdr; /* leaf header */ - xfs_dir2_leaf_entry_t ents[]; /* entries */ + xfs_dir2_leaf_hdr_t hdr; /* leaf header */ + xfs_dir2_leaf_entry_t __ents[]; /* entries */ } xfs_dir2_leaf_t; -/* - * DB blocks here are logical directory block numbers, not filesystem blocks. - */ +struct xfs_dir3_leaf { + struct xfs_dir3_leaf_hdr hdr; /* leaf header */ + struct xfs_dir2_leaf_entry __ents[]; /* entries */ +}; + +#define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) + +static inline int +xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) + return sizeof(struct xfs_dir3_leaf_hdr); + return sizeof(struct xfs_dir2_leaf_hdr); +} -static inline int xfs_dir2_max_leaf_ents(struct xfs_mount *mp) +static inline int +xfs_dir3_max_leaf_ents(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) { - return (mp->m_dirblksize - (uint)sizeof(struct xfs_dir2_leaf_hdr)) / + return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size(lp)) / (uint)sizeof(struct xfs_dir2_leaf_entry); } /* * Get address of the bestcount field in the single-leaf block. */ +static inline struct xfs_dir2_leaf_entry * +xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp; + return lp3->__ents; + } + return lp->__ents; +} + +/* + * Get address of the bestcount field in the single-leaf block. + */ static inline struct xfs_dir2_leaf_tail * xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) { @@ -524,6 +566,10 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) } /* + * DB blocks here are logical directory block numbers, not filesystem blocks. + */ + +/* * Convert dataptr to byte in file space */ static inline xfs_dir2_off_t diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index c7dca95..7352e41 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -33,77 +34,263 @@ #include "xfs_dir2_priv.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_buf_item.h" +#include "xfs_cksum.h" /* * Local function declarations. */ -#ifdef DEBUG -static void xfs_dir2_leaf_check(struct xfs_inode *dp, struct xfs_buf *bp); -#else -#define xfs_dir2_leaf_check(dp, bp) -#endif static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, struct xfs_buf **lbpp, int *indexp, struct xfs_buf **dbpp); -static void xfs_dir2_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *bp, +static void xfs_dir3_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *bp, int first, int last); -static void xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp); +static void xfs_dir3_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp); -static void -xfs_dir2_leaf_verify( +/* + * Check the internal consistency of a leaf1 block. + * Pop an assert if something is wrong. + */ +#ifdef DEBUG +#define xfs_dir3_leaf_check(mp, bp) \ +do { \ + if (!xfs_dir3_leaf1_check((mp), (bp))) \ + ASSERT(0); \ +} while (0); + +STATIC bool +xfs_dir3_leaf1_check( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dir2_leaf *leaf = bp->b_addr; + struct xfs_dir3_icleaf_hdr leafhdr; + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + + if (leafhdr.magic == XFS_DIR3_LEAF1_MAGIC) { + struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; + if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) + return false; + } else if (leafhdr.magic != XFS_DIR2_LEAF1_MAGIC) + return false; + + return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); +} +#else +#define xfs_dir3_leaf_check(mp, bp) +#endif + +void +xfs_dir3_leaf_hdr_from_disk( + struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from) +{ + if (from->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + from->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { + to->forw = be32_to_cpu(from->hdr.info.forw); + to->back = be32_to_cpu(from->hdr.info.back); + to->magic = be16_to_cpu(from->hdr.info.magic); + to->count = be16_to_cpu(from->hdr.count); + to->stale = be16_to_cpu(from->hdr.stale); + } else { + struct xfs_dir3_leaf_hdr *hdr3 = (struct xfs_dir3_leaf_hdr *)from; + + to->forw = be32_to_cpu(hdr3->info.hdr.forw); + to->back = be32_to_cpu(hdr3->info.hdr.back); + to->magic = be16_to_cpu(hdr3->info.hdr.magic); + to->count = be16_to_cpu(hdr3->count); + to->stale = be16_to_cpu(hdr3->stale); + } + + ASSERT(to->magic == XFS_DIR2_LEAF1_MAGIC || + to->magic == XFS_DIR3_LEAF1_MAGIC || + to->magic == XFS_DIR2_LEAFN_MAGIC || + to->magic == XFS_DIR3_LEAFN_MAGIC); +} + +void +xfs_dir3_leaf_hdr_to_disk( + struct xfs_dir2_leaf *to, + struct xfs_dir3_icleaf_hdr *from) +{ + ASSERT(from->magic == XFS_DIR2_LEAF1_MAGIC || + from->magic == XFS_DIR3_LEAF1_MAGIC || + from->magic == XFS_DIR2_LEAFN_MAGIC || + from->magic == XFS_DIR3_LEAFN_MAGIC); + + if (from->magic == XFS_DIR2_LEAF1_MAGIC || + from->magic == XFS_DIR2_LEAFN_MAGIC) { + to->hdr.info.forw = cpu_to_be32(from->forw); + to->hdr.info.back = cpu_to_be32(from->back); + to->hdr.info.magic = cpu_to_be16(from->magic); + to->hdr.count = cpu_to_be16(from->count); + to->hdr.stale = cpu_to_be16(from->stale); + } else { + struct xfs_dir3_leaf_hdr *hdr3 = (struct xfs_dir3_leaf_hdr *)to; + + hdr3->info.hdr.forw = cpu_to_be32(from->forw); + hdr3->info.hdr.back = cpu_to_be32(from->back); + hdr3->info.hdr.magic = cpu_to_be16(from->magic); + hdr3->count = cpu_to_be16(from->count); + hdr3->stale = cpu_to_be16(from->stale); + } +} + +bool +xfs_dir3_leaf_check_int( + struct xfs_mount *mp, + struct xfs_dir3_icleaf_hdr *hdr, + struct xfs_dir2_leaf *leaf) +{ + struct xfs_dir2_leaf_entry *ents; + xfs_dir2_leaf_tail_t *ltp; + int stale; + int i; + + ents = xfs_dir3_leaf_ents_p(leaf); + ltp = xfs_dir2_leaf_tail_p(mp, leaf); + + /* + * XXX (dgc): This value is not restrictive enough. + * Should factor in the size of the bests table as well. + * We can deduce a value for that from di_size. + */ + if (hdr->count > xfs_dir3_max_leaf_ents(mp, leaf)) + return false; + + /* Leaves and bests don't overlap in leaf format. */ + if ((hdr->magic == XFS_DIR2_LEAF1_MAGIC || + hdr->magic == XFS_DIR3_LEAF1_MAGIC) && + (char *)&ents[hdr->count] > (char *)xfs_dir2_leaf_bests_p(ltp)) + return false; + + /* Check hash value order, count stale entries. */ + for (i = stale = 0; i < hdr->count; i++) { + if (i + 1 < hdr->count) { + if (be32_to_cpu(ents[i].hashval) > + be32_to_cpu(ents[i + 1].hashval)) + return false; + } + if (ents[i].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + stale++; + } + if (hdr->stale != stale) + return false; + return true; +} + +static bool +xfs_dir3_leaf_verify( struct xfs_buf *bp, - __be16 magic) + __uint16_t magic) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dir2_leaf *leaf = bp->b_addr; + struct xfs_dir3_icleaf_hdr leafhdr; + + ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; + + if ((magic == XFS_DIR2_LEAF1_MAGIC && + leafhdr.magic != XFS_DIR3_LEAF1_MAGIC) || + (magic == XFS_DIR2_LEAFN_MAGIC && + leafhdr.magic != XFS_DIR3_LEAFN_MAGIC)) + return false; + + if (!uuid_equal(&leaf3->info.uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) + return false; + } else { + if (leafhdr.magic != magic) + return false; + } + return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); +} + +static void +__read_verify( + struct xfs_buf *bp, + __uint16_t magic) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_DIR3_LEAF_CRC_OFF)) || + !xfs_dir3_leaf_verify(bp, magic)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +__write_verify( + struct xfs_buf *bp, + __uint16_t magic) { struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_dir2_leaf_hdr *hdr = bp->b_addr; - int block_ok = 0; + struct xfs_buf_log_item *bip = bp->b_fspriv; + struct xfs_dir3_leaf_hdr *hdr3 = bp->b_addr; - block_ok = hdr->info.magic == magic; - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + if (!xfs_dir3_leaf_verify(bp, magic)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + return; } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_LEAF_CRC_OFF); } static void -xfs_dir2_leaf1_read_verify( +xfs_dir3_leaf1_read_verify( struct xfs_buf *bp) { - xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); + __read_verify(bp, XFS_DIR2_LEAF1_MAGIC); } static void -xfs_dir2_leaf1_write_verify( +xfs_dir3_leaf1_write_verify( struct xfs_buf *bp) { - xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); + __write_verify(bp, XFS_DIR2_LEAF1_MAGIC); } -void -xfs_dir2_leafn_read_verify( +static void +xfs_dir3_leafn_read_verify( struct xfs_buf *bp) { - xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + __read_verify(bp, XFS_DIR2_LEAFN_MAGIC); } -void -xfs_dir2_leafn_write_verify( +static void +xfs_dir3_leafn_write_verify( struct xfs_buf *bp) { - xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + __write_verify(bp, XFS_DIR2_LEAFN_MAGIC); } -static const struct xfs_buf_ops xfs_dir2_leaf1_buf_ops = { - .verify_read = xfs_dir2_leaf1_read_verify, - .verify_write = xfs_dir2_leaf1_write_verify, +static const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops = { + .verify_read = xfs_dir3_leaf1_read_verify, + .verify_write = xfs_dir3_leaf1_write_verify, }; -const struct xfs_buf_ops xfs_dir2_leafn_buf_ops = { - .verify_read = xfs_dir2_leafn_read_verify, - .verify_write = xfs_dir2_leafn_write_verify, +const struct xfs_buf_ops xfs_dir3_leafn_buf_ops = { + .verify_read = xfs_dir3_leafn_read_verify, + .verify_write = xfs_dir3_leafn_write_verify, }; static int -xfs_dir2_leaf_read( +xfs_dir3_leaf_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, @@ -111,11 +298,11 @@ xfs_dir2_leaf_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, - XFS_DATA_FORK, &xfs_dir2_leaf1_buf_ops); + XFS_DATA_FORK, &xfs_dir3_leaf1_buf_ops); } int -xfs_dir2_leafn_read( +xfs_dir3_leafn_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, @@ -123,7 +310,81 @@ xfs_dir2_leafn_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, - XFS_DATA_FORK, &xfs_dir2_leafn_buf_ops); + XFS_DATA_FORK, &xfs_dir3_leafn_buf_ops); +} + +/* + * Initialize a new leaf block, leaf1 or leafn magic accepted. + */ +static void +xfs_dir3_leaf_init( + struct xfs_mount *mp, + struct xfs_buf *bp, + xfs_ino_t owner, + __uint16_t type) +{ + struct xfs_dir2_leaf *leaf = bp->b_addr; + + ASSERT(type == XFS_DIR2_LEAF1_MAGIC || type == XFS_DIR2_LEAFN_MAGIC); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; + + memset(leaf3, 0, sizeof(*leaf3)); + + leaf3->info.hdr.magic = (type == XFS_DIR2_LEAF1_MAGIC) + ? cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) + : cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); + leaf3->info.blkno = cpu_to_be64(bp->b_bn); + leaf3->info.owner = cpu_to_be64(owner); + uuid_copy(&leaf3->info.uuid, &mp->m_sb.sb_uuid); + } else { + memset(leaf, 0, sizeof(*leaf)); + leaf->hdr.info.magic = cpu_to_be16(type); + } + + /* + * If it's a leaf-format directory initialize the tail. + * Caller is responsible for initialising the bests table. + */ + if (type == XFS_DIR2_LEAF1_MAGIC) { + struct xfs_dir2_leaf_tail *ltp; + + ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp->bestcount = 0; + bp->b_ops = &xfs_dir3_leaf1_buf_ops; + } else + bp->b_ops = &xfs_dir3_leafn_buf_ops; +} + +int +xfs_dir3_leaf_get_buf( + xfs_da_args_t *args, + xfs_dir2_db_t bno, + struct xfs_buf **bpp, + __uint16_t magic) +{ + struct xfs_inode *dp = args->dp; + struct xfs_trans *tp = args->trans; + struct xfs_mount *mp = dp->i_mount; + struct xfs_buf *bp; + int error; + + ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); + ASSERT(bno >= XFS_DIR2_LEAF_FIRSTDB(mp) && + bno < XFS_DIR2_FREE_FIRSTDB(mp)); + + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, + XFS_DATA_FORK); + if (error) + return error; + + xfs_dir3_leaf_init(mp, bp, dp->i_ino, magic); + xfs_dir3_leaf_log_header(tp, bp); + if (magic == XFS_DIR2_LEAF1_MAGIC) + xfs_dir3_leaf_log_tail(tp, bp); + *bpp = bp; + return 0; } /* @@ -150,6 +411,8 @@ xfs_dir2_block_to_leaf( int needscan; /* need to rescan bestfree */ xfs_trans_t *tp; /* transaction pointer */ struct xfs_dir2_data_free *bf; + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; trace_xfs_dir2_block_to_leaf(args); @@ -169,27 +432,33 @@ xfs_dir2_block_to_leaf( /* * Initialize the leaf block, get a buffer for it. */ - if ((error = xfs_dir2_leaf_init(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC))) { + error = xfs_dir3_leaf_get_buf(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC); + if (error) return error; - } - ASSERT(lbp != NULL); + leaf = lbp->b_addr; hdr = dbp->b_addr; xfs_dir3_data_check(dp, dbp); btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); bf = xfs_dir3_data_bestfree_p(hdr); + ents = xfs_dir3_leaf_ents_p(leaf); + /* * Set the counts in the leaf header. */ - leaf->hdr.count = cpu_to_be16(be32_to_cpu(btp->count)); - leaf->hdr.stale = cpu_to_be16(be32_to_cpu(btp->stale)); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + leafhdr.count = be32_to_cpu(btp->count); + leafhdr.stale = be32_to_cpu(btp->stale); + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, lbp); + /* * Could compact these but I think we always do the conversion * after squeezing out stale entries. */ - memcpy(leaf->ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir2_leaf_log_ents(tp, lbp, 0, be16_to_cpu(leaf->hdr.count) - 1); + memcpy(ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t)); + xfs_dir3_leaf_log_ents(tp, lbp, 0, leafhdr.count - 1); needscan = 0; needlog = 1; /* @@ -224,15 +493,16 @@ xfs_dir2_block_to_leaf( */ if (needlog) xfs_dir2_data_log_header(tp, dbp); - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(mp, lbp); xfs_dir3_data_check(dp, dbp); - xfs_dir2_leaf_log_bests(tp, lbp, 0, 0); + xfs_dir3_leaf_log_bests(tp, lbp, 0, 0); return 0; } STATIC void -xfs_dir2_leaf_find_stale( - struct xfs_dir2_leaf *leaf, +xfs_dir3_leaf_find_stale( + struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int index, int *lowstale, int *highstale) @@ -241,7 +511,7 @@ xfs_dir2_leaf_find_stale( * Find the first stale entry before our index, if any. */ for (*lowstale = index - 1; *lowstale >= 0; --*lowstale) { - if (leaf->ents[*lowstale].address == + if (ents[*lowstale].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) break; } @@ -251,10 +521,8 @@ xfs_dir2_leaf_find_stale( * Stop if the result would require moving more entries than using * lowstale. */ - for (*highstale = index; - *highstale < be16_to_cpu(leaf->hdr.count); - ++*highstale) { - if (leaf->ents[*highstale].address == + for (*highstale = index; *highstale < leafhdr->count; ++*highstale) { + if (ents[*highstale].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) break; if (*lowstale >= 0 && index - *lowstale <= *highstale - index) @@ -263,8 +531,9 @@ xfs_dir2_leaf_find_stale( } struct xfs_dir2_leaf_entry * -xfs_dir2_leaf_find_entry( - xfs_dir2_leaf_t *leaf, /* leaf structure */ +xfs_dir3_leaf_find_entry( + struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int index, /* leaf table position */ int compact, /* need to compact leaves */ int lowstale, /* index of prev stale leaf */ @@ -272,7 +541,7 @@ xfs_dir2_leaf_find_entry( int *lfloglow, /* low leaf logging index */ int *lfloghigh) /* high leaf logging index */ { - if (!leaf->hdr.stale) { + if (!leafhdr->stale) { xfs_dir2_leaf_entry_t *lep; /* leaf entry table pointer */ /* @@ -280,18 +549,16 @@ xfs_dir2_leaf_find_entry( * * If there are no stale entries, just insert a hole at index. */ - lep = &leaf->ents[index]; - if (index < be16_to_cpu(leaf->hdr.count)) + lep = &ents[index]; + if (index < leafhdr->count) memmove(lep + 1, lep, - (be16_to_cpu(leaf->hdr.count) - index) * - sizeof(*lep)); + (leafhdr->count - index) * sizeof(*lep)); /* * Record low and high logging indices for the leaf. */ *lfloglow = index; - *lfloghigh = be16_to_cpu(leaf->hdr.count); - be16_add_cpu(&leaf->hdr.count, 1); + *lfloghigh = leafhdr->count++; return lep; } @@ -305,16 +572,17 @@ xfs_dir2_leaf_find_entry( * entries before and after our insertion point. */ if (compact == 0) - xfs_dir2_leaf_find_stale(leaf, index, &lowstale, &highstale); + xfs_dir3_leaf_find_stale(leafhdr, ents, index, + &lowstale, &highstale); /* * If the low one is better, use it. */ if (lowstale >= 0 && - (highstale == be16_to_cpu(leaf->hdr.count) || + (highstale == leafhdr->count || index - lowstale - 1 < highstale - index)) { ASSERT(index - lowstale - 1 >= 0); - ASSERT(leaf->ents[lowstale].address == + ASSERT(ents[lowstale].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); /* @@ -322,37 +590,34 @@ xfs_dir2_leaf_find_entry( * for the new entry. */ if (index - lowstale - 1 > 0) { - memmove(&leaf->ents[lowstale], - &leaf->ents[lowstale + 1], + memmove(&ents[lowstale], &ents[lowstale + 1], (index - lowstale - 1) * - sizeof(xfs_dir2_leaf_entry_t)); + sizeof(xfs_dir2_leaf_entry_t)); } *lfloglow = MIN(lowstale, *lfloglow); *lfloghigh = MAX(index - 1, *lfloghigh); - be16_add_cpu(&leaf->hdr.stale, -1); - return &leaf->ents[index - 1]; + leafhdr->stale--; + return &ents[index - 1]; } /* * The high one is better, so use that one. */ ASSERT(highstale - index >= 0); - ASSERT(leaf->ents[highstale].address == - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); + ASSERT(ents[highstale].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); /* * Copy entries down to cover the stale entry and make room for the * new entry. */ if (highstale - index > 0) { - memmove(&leaf->ents[index + 1], - &leaf->ents[index], + memmove(&ents[index + 1], &ents[index], (highstale - index) * sizeof(xfs_dir2_leaf_entry_t)); } *lfloglow = MIN(index, *lfloglow); *lfloghigh = MAX(highstale, *lfloghigh); - be16_add_cpu(&leaf->hdr.stale, -1); - return &leaf->ents[index]; + leafhdr->stale--; + return &ents[index]; } /* @@ -390,6 +655,8 @@ xfs_dir2_leaf_addname( xfs_trans_t *tp; /* transaction pointer */ xfs_dir2_db_t use_block; /* data block number */ struct xfs_dir2_data_free *bf; /* bestfree table */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; trace_xfs_dir2_leaf_addname(args); @@ -397,7 +664,7 @@ xfs_dir2_leaf_addname( tp = args->trans; mp = dp->i_mount; - error = xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + error = xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); if (error) return error; @@ -410,16 +677,19 @@ xfs_dir2_leaf_addname( index = xfs_dir2_leaf_search_hash(args, lbp); leaf = lbp->b_addr; ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); length = xfs_dir2_data_entsize(args->namelen); + /* * See if there are any entries with the same hash value * and space in their block for the new entry. * This is good because it puts multiple same-hash value entries * in a data block, improving the lookup of those entries. */ - for (use_block = -1, lep = &leaf->ents[index]; - index < be16_to_cpu(leaf->hdr.count) && be32_to_cpu(lep->hashval) == args->hashval; + for (use_block = -1, lep = &ents[index]; + index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval; index++, lep++) { if (be32_to_cpu(lep->address) == XFS_DIR2_NULL_DATAPTR) continue; @@ -452,7 +722,7 @@ xfs_dir2_leaf_addname( * How many bytes do we need in the leaf block? */ needbytes = 0; - if (!leaf->hdr.stale) + if (!leafhdr.stale) needbytes += sizeof(xfs_dir2_leaf_entry_t); if (use_block == -1) needbytes += sizeof(xfs_dir2_data_off_t); @@ -467,16 +737,15 @@ xfs_dir2_leaf_addname( * If we don't have enough free bytes but we can make enough * by compacting out stale entries, we'll do that. */ - if ((char *)bestsp - (char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] < - needbytes && be16_to_cpu(leaf->hdr.stale) > 1) { + if ((char *)bestsp - (char *)&ents[leafhdr.count] < needbytes && + leafhdr.stale > 1) compact = 1; - } + /* * Otherwise if we don't have enough free bytes we need to * convert to node form. */ - else if ((char *)bestsp - (char *)&leaf->ents[be16_to_cpu( - leaf->hdr.count)] < needbytes) { + else if ((char *)bestsp - (char *)&ents[leafhdr.count] < needbytes) { /* * Just checking or no space reservation, give up. */ @@ -524,15 +793,15 @@ xfs_dir2_leaf_addname( * point later. */ if (compact) { - xfs_dir2_leaf_compact_x1(lbp, &index, &lowstale, &highstale, - &lfloglow, &lfloghigh); + xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale, + &highstale, &lfloglow, &lfloghigh); } /* * There are stale entries, so we'll need log-low and log-high * impossibly bad values later. */ - else if (be16_to_cpu(leaf->hdr.stale)) { - lfloglow = be16_to_cpu(leaf->hdr.count); + else if (leafhdr.stale) { + lfloglow = leafhdr.count; lfloghigh = -1; } /* @@ -564,14 +833,14 @@ xfs_dir2_leaf_addname( memmove(&bestsp[0], &bestsp[1], be32_to_cpu(ltp->bestcount) * sizeof(bestsp[0])); be32_add_cpu(<p->bestcount, 1); - xfs_dir2_leaf_log_tail(tp, lbp); - xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); } /* * If we're filling in a previously empty block just log it. */ else - xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); + xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); hdr = dbp->b_addr; bf = xfs_dir3_data_bestfree_p(hdr); bestsp[use_block] = bf[0].length; @@ -632,10 +901,10 @@ xfs_dir2_leaf_addname( if (be16_to_cpu(bestsp[use_block]) != be16_to_cpu(bf[0].length)) { bestsp[use_block] = bf[0].length; if (!grown) - xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); + xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); } - lep = xfs_dir2_leaf_find_entry(leaf, index, compact, lowstale, + lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale, highstale, &lfloglow, &lfloghigh); /* @@ -647,82 +916,40 @@ xfs_dir2_leaf_addname( /* * Log the leaf fields and give up the buffers. */ - xfs_dir2_leaf_log_header(tp, lbp); - xfs_dir2_leaf_log_ents(tp, lbp, lfloglow, lfloghigh); - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, lbp); + xfs_dir3_leaf_log_ents(tp, lbp, lfloglow, lfloghigh); + xfs_dir3_leaf_check(mp, lbp); xfs_dir3_data_check(dp, dbp); return 0; } -#ifdef DEBUG -/* - * Check the internal consistency of a leaf1 block. - * Pop an assert if something is wrong. - */ -STATIC void -xfs_dir2_leaf_check( - struct xfs_inode *dp, /* incore directory inode */ - struct xfs_buf *bp) /* leaf's buffer */ -{ - int i; /* leaf index */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ - xfs_dir2_leaf_tail_t *ltp; /* leaf tail pointer */ - xfs_mount_t *mp; /* filesystem mount point */ - int stale; /* count of stale leaves */ - - leaf = bp->b_addr; - mp = dp->i_mount; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); - /* - * This value is not restrictive enough. - * Should factor in the size of the bests table as well. - * We can deduce a value for that from di_size. - */ - ASSERT(be16_to_cpu(leaf->hdr.count) <= xfs_dir2_max_leaf_ents(mp)); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); - /* - * Leaves and bests don't overlap. - */ - ASSERT((char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] <= - (char *)xfs_dir2_leaf_bests_p(ltp)); - /* - * Check hash value order, count stale entries. - */ - for (i = stale = 0; i < be16_to_cpu(leaf->hdr.count); i++) { - if (i + 1 < be16_to_cpu(leaf->hdr.count)) - ASSERT(be32_to_cpu(leaf->ents[i].hashval) <= - be32_to_cpu(leaf->ents[i + 1].hashval)); - if (leaf->ents[i].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) - stale++; - } - ASSERT(be16_to_cpu(leaf->hdr.stale) == stale); -} -#endif /* DEBUG */ - /* * Compact out any stale entries in the leaf. * Log the header and changed leaf entries, if any. */ void -xfs_dir2_leaf_compact( +xfs_dir3_leaf_compact( xfs_da_args_t *args, /* operation arguments */ + struct xfs_dir3_icleaf_hdr *leafhdr, struct xfs_buf *bp) /* leaf buffer */ { int from; /* source leaf index */ xfs_dir2_leaf_t *leaf; /* leaf structure */ int loglow; /* first leaf entry to log */ int to; /* target leaf index */ + struct xfs_dir2_leaf_entry *ents; leaf = bp->b_addr; - if (!leaf->hdr.stale) { + if (!leafhdr->stale) return; - } + /* * Compress out the stale entries in place. */ - for (from = to = 0, loglow = -1; from < be16_to_cpu(leaf->hdr.count); from++) { - if (leaf->ents[from].address == - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + ents = xfs_dir3_leaf_ents_p(leaf); + for (from = to = 0, loglow = -1; from < leafhdr->count; from++) { + if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) continue; /* * Only actually copy the entries that are different. @@ -730,19 +957,21 @@ xfs_dir2_leaf_compact( if (from > to) { if (loglow == -1) loglow = to; - leaf->ents[to] = leaf->ents[from]; + ents[to] = ents[from]; } to++; } /* * Update and log the header, log the leaf entries. */ - ASSERT(be16_to_cpu(leaf->hdr.stale) == from - to); - be16_add_cpu(&leaf->hdr.count, -(be16_to_cpu(leaf->hdr.stale))); - leaf->hdr.stale = 0; - xfs_dir2_leaf_log_header(args->trans, bp); + ASSERT(leafhdr->stale == from - to); + leafhdr->count -= leafhdr->stale; + leafhdr->stale = 0; + + xfs_dir3_leaf_hdr_to_disk(leaf, leafhdr); + xfs_dir3_leaf_log_header(args->trans, bp); if (loglow != -1) - xfs_dir2_leaf_log_ents(args->trans, bp, loglow, to - 1); + xfs_dir3_leaf_log_ents(args->trans, bp, loglow, to - 1); } /* @@ -754,8 +983,9 @@ xfs_dir2_leaf_compact( * and leaf logging indices. */ void -xfs_dir2_leaf_compact_x1( - struct xfs_buf *bp, /* leaf buffer */ +xfs_dir3_leaf_compact_x1( + struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int *indexp, /* insertion index */ int *lowstalep, /* out: stale entry before us */ int *highstalep, /* out: stale entry after us */ @@ -766,22 +996,20 @@ xfs_dir2_leaf_compact_x1( int highstale; /* stale entry at/after index */ int index; /* insertion index */ int keepstale; /* source index of kept stale */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ int lowstale; /* stale entry before index */ int newindex=0; /* new insertion index */ int to; /* destination copy index */ - leaf = bp->b_addr; - ASSERT(be16_to_cpu(leaf->hdr.stale) > 1); + ASSERT(leafhdr->stale > 1); index = *indexp; - xfs_dir2_leaf_find_stale(leaf, index, &lowstale, &highstale); + xfs_dir3_leaf_find_stale(leafhdr, ents, index, &lowstale, &highstale); /* * Pick the better of lowstale and highstale. */ if (lowstale >= 0 && - (highstale == be16_to_cpu(leaf->hdr.count) || + (highstale == leafhdr->count || index - lowstale <= highstale - index)) keepstale = lowstale; else @@ -790,15 +1018,14 @@ xfs_dir2_leaf_compact_x1( * Copy the entries in place, removing all the stale entries * except keepstale. */ - for (from = to = 0; from < be16_to_cpu(leaf->hdr.count); from++) { + for (from = to = 0; from < leafhdr->count; from++) { /* * Notice the new value of index. */ if (index == from) newindex = to; if (from != keepstale && - leaf->ents[from].address == - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) { + ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) { if (from == to) *lowlogp = to; continue; @@ -812,7 +1039,7 @@ xfs_dir2_leaf_compact_x1( * Copy only the entries that have moved. */ if (from > to) - leaf->ents[to] = leaf->ents[from]; + ents[to] = ents[from]; to++; } ASSERT(from > to); @@ -826,8 +1053,8 @@ xfs_dir2_leaf_compact_x1( /* * Adjust the leaf header values. */ - be16_add_cpu(&leaf->hdr.count, -(from - to)); - leaf->hdr.stale = cpu_to_be16(1); + leafhdr->count -= from - to; + leafhdr->stale = 1; /* * Remember the low/high stale value only in the "right" * direction. @@ -835,8 +1062,8 @@ xfs_dir2_leaf_compact_x1( if (lowstale >= newindex) lowstale = -1; else - highstale = be16_to_cpu(leaf->hdr.count); - *highlogp = be16_to_cpu(leaf->hdr.count) - 1; + highstale = leafhdr->count; + *highlogp = leafhdr->count - 1; *lowstalep = lowstale; *highstalep = highstale; } @@ -1229,69 +1456,12 @@ xfs_dir2_leaf_getdents( return error; } -/* - * Initialize a new leaf block, leaf1 or leafn magic accepted. - */ -int -xfs_dir2_leaf_init( - xfs_da_args_t *args, /* operation arguments */ - xfs_dir2_db_t bno, /* directory block number */ - struct xfs_buf **bpp, /* out: leaf buffer */ - int magic) /* magic number for block */ -{ - struct xfs_buf *bp; /* leaf buffer */ - xfs_inode_t *dp; /* incore directory inode */ - int error; /* error return code */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ - xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ - xfs_mount_t *mp; /* filesystem mount point */ - xfs_trans_t *tp; /* transaction pointer */ - - dp = args->dp; - ASSERT(dp != NULL); - tp = args->trans; - mp = dp->i_mount; - ASSERT(bno >= XFS_DIR2_LEAF_FIRSTDB(mp) && - bno < XFS_DIR2_FREE_FIRSTDB(mp)); - /* - * Get the buffer for the block. - */ - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, - XFS_DATA_FORK); - if (error) - return error; - - /* - * Initialize the header. - */ - leaf = bp->b_addr; - leaf->hdr.info.magic = cpu_to_be16(magic); - leaf->hdr.info.forw = 0; - leaf->hdr.info.back = 0; - leaf->hdr.count = 0; - leaf->hdr.stale = 0; - xfs_dir2_leaf_log_header(tp, bp); - /* - * If it's a leaf-format directory initialize the tail. - * In this case our caller has the real bests table to copy into - * the block. - */ - if (magic == XFS_DIR2_LEAF1_MAGIC) { - bp->b_ops = &xfs_dir2_leaf1_buf_ops; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); - ltp->bestcount = 0; - xfs_dir2_leaf_log_tail(tp, bp); - } else - bp->b_ops = &xfs_dir2_leafn_buf_ops; - *bpp = bp; - return 0; -} /* * Log the bests entries indicated from a leaf1 block. */ static void -xfs_dir2_leaf_log_bests( +xfs_dir3_leaf_log_bests( xfs_trans_t *tp, /* transaction pointer */ struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ @@ -1299,11 +1469,12 @@ xfs_dir2_leaf_log_bests( { __be16 *firstb; /* pointer to first entry */ __be16 *lastb; /* pointer to last entry */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf = bp->b_addr; xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ - leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)); + ltp = xfs_dir2_leaf_tail_p(tp->t_mountp, leaf); firstb = xfs_dir2_leaf_bests_p(ltp) + first; lastb = xfs_dir2_leaf_bests_p(ltp) + last; @@ -1315,7 +1486,7 @@ xfs_dir2_leaf_log_bests( * Log the leaf entries indicated from a leaf1 or leafn block. */ void -xfs_dir2_leaf_log_ents( +xfs_dir3_leaf_log_ents( xfs_trans_t *tp, /* transaction pointer */ struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ @@ -1323,13 +1494,17 @@ xfs_dir2_leaf_log_ents( { xfs_dir2_leaf_entry_t *firstlep; /* pointer to first entry */ xfs_dir2_leaf_entry_t *lastlep; /* pointer to last entry */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf = bp->b_addr; + struct xfs_dir2_leaf_entry *ents; - leaf = bp->b_addr; ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || - leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - firstlep = &leaf->ents[first]; - lastlep = &leaf->ents[last]; + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); + + ents = xfs_dir3_leaf_ents_p(leaf); + firstlep = &ents[first]; + lastlep = &ents[last]; xfs_trans_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), (uint)((char *)lastlep - (char *)leaf + sizeof(*lastlep) - 1)); } @@ -1338,34 +1513,38 @@ xfs_dir2_leaf_log_ents( * Log the header of the leaf1 or leafn block. */ void -xfs_dir2_leaf_log_header( +xfs_dir3_leaf_log_header( struct xfs_trans *tp, struct xfs_buf *bp) { - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf = bp->b_addr; - leaf = bp->b_addr; ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || - leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); + xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), - (uint)(sizeof(leaf->hdr) - 1)); + xfs_dir3_leaf_hdr_size(leaf) - 1); } /* * Log the tail of the leaf1 block. */ STATIC void -xfs_dir2_leaf_log_tail( +xfs_dir3_leaf_log_tail( struct xfs_trans *tp, struct xfs_buf *bp) { - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf = bp->b_addr; xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ - xfs_mount_t *mp; /* filesystem mount point */ + struct xfs_mount *mp = tp->t_mountp; + + ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - mp = tp->t_mountp; - leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); ltp = xfs_dir2_leaf_tail_p(mp, leaf); xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), (uint)(mp->m_dirblksize - 1)); @@ -1389,6 +1568,7 @@ xfs_dir2_leaf_lookup( xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_leaf_entry *ents; trace_xfs_dir2_leaf_lookup(args); @@ -1400,12 +1580,14 @@ xfs_dir2_leaf_lookup( } tp = args->trans; dp = args->dp; - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(dp->i_mount, lbp); leaf = lbp->b_addr; + ents = xfs_dir3_leaf_ents_p(leaf); /* * Get to the leaf entry and contained data entry address. */ - lep = &leaf->ents[index]; + lep = &ents[index]; + /* * Point to the data entry. */ @@ -1449,18 +1631,23 @@ xfs_dir2_leaf_lookup_int( xfs_trans_t *tp; /* transaction pointer */ xfs_dir2_db_t cidb = -1; /* case match data block no. */ enum xfs_dacmp cmp; /* name compare result */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; dp = args->dp; tp = args->trans; mp = dp->i_mount; - error = xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + error = xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); if (error) return error; *lbpp = lbp; leaf = lbp->b_addr; - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(mp, lbp); + ents = xfs_dir3_leaf_ents_p(leaf); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + /* * Look for the first leaf entry with our hash value. */ @@ -1469,9 +1656,9 @@ xfs_dir2_leaf_lookup_int( * Loop over all the entries with the right hash value * looking to match the name. */ - for (lep = &leaf->ents[index]; index < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(lep->hashval) == args->hashval; - lep++, index++) { + for (lep = &ents[index]; + index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval; + lep++, index++) { /* * Skip over stale leaf entries. */ @@ -1576,6 +1763,8 @@ xfs_dir2_leaf_removename( xfs_dir2_data_off_t oldbest; /* old value of best free */ xfs_trans_t *tp; /* transaction pointer */ struct xfs_dir2_data_free *bf; /* bestfree table */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; trace_xfs_dir2_leaf_removename(args); @@ -1590,12 +1779,14 @@ xfs_dir2_leaf_removename( mp = dp->i_mount; leaf = lbp->b_addr; hdr = dbp->b_addr; - bf = xfs_dir3_data_bestfree_p(hdr); xfs_dir3_data_check(dp, dbp); + bf = xfs_dir3_data_bestfree_p(hdr); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); /* * Point to the leaf entry, use that to point to the data entry. */ - lep = &leaf->ents[index]; + lep = &ents[index]; db = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); dep = (xfs_dir2_data_entry_t *) ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); @@ -1613,10 +1804,13 @@ xfs_dir2_leaf_removename( /* * We just mark the leaf entry stale by putting a null in it. */ - be16_add_cpu(&leaf->hdr.stale, 1); - xfs_dir2_leaf_log_header(tp, lbp); + leafhdr.stale++; + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, lbp); + lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir2_leaf_log_ents(tp, lbp, index, index); + xfs_dir3_leaf_log_ents(tp, lbp, index, index); + /* * Scan the freespace in the data block again if necessary, * log the data block header if necessary. @@ -1631,7 +1825,7 @@ xfs_dir2_leaf_removename( */ if (be16_to_cpu(bf[0].length) != oldbest) { bestsp[db] = bf[0].length; - xfs_dir2_leaf_log_bests(tp, lbp, db, db); + xfs_dir3_leaf_log_bests(tp, lbp, db, db); } xfs_dir3_data_check(dp, dbp); /* @@ -1649,7 +1843,7 @@ xfs_dir2_leaf_removename( */ if (error == ENOSPC && args->total == 0) error = 0; - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(mp, lbp); return error; } dbp = NULL; @@ -1672,8 +1866,8 @@ xfs_dir2_leaf_removename( memmove(&bestsp[db - i], bestsp, (be32_to_cpu(ltp->bestcount) - (db - i)) * sizeof(*bestsp)); be32_add_cpu(<p->bestcount, -(db - i)); - xfs_dir2_leaf_log_tail(tp, lbp); - xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); } else bestsp[db] = cpu_to_be16(NULLDATAOFF); } @@ -1683,7 +1877,7 @@ xfs_dir2_leaf_removename( else if (db != mp->m_dirdatablk) dbp = NULL; - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(mp, lbp); /* * See if we can convert to block form. */ @@ -1706,6 +1900,7 @@ xfs_dir2_leaf_replace( xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_leaf_entry *ents; trace_xfs_dir2_leaf_replace(args); @@ -1717,10 +1912,11 @@ xfs_dir2_leaf_replace( } dp = args->dp; leaf = lbp->b_addr; + ents = xfs_dir3_leaf_ents_p(leaf); /* * Point to the leaf entry, get data address from it. */ - lep = &leaf->ents[index]; + lep = &ents[index]; /* * Point to the data entry. */ @@ -1734,7 +1930,7 @@ xfs_dir2_leaf_replace( dep->inumber = cpu_to_be64(args->inumber); tp = args->trans; xfs_dir2_data_log_entry(tp, dbp, dep); - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(dp->i_mount, lbp); xfs_trans_brelse(tp, lbp); return 0; } @@ -1756,17 +1952,22 @@ xfs_dir2_leaf_search_hash( xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ int mid=0; /* current leaf index */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; leaf = lbp->b_addr; + ents = xfs_dir3_leaf_ents_p(leaf); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + #ifndef __KERNEL__ - if (!leaf->hdr.count) + if (!leafhdr.count) return 0; #endif /* * Note, the table cannot be empty, so we have to go through the loop. * Binary search the leaf entries looking for our hash value. */ - for (lep = leaf->ents, low = 0, high = be16_to_cpu(leaf->hdr.count) - 1, + for (lep = ents, low = 0, high = leafhdr.count - 1, hashwant = args->hashval; low <= high; ) { mid = (low + high) >> 1; @@ -1852,23 +2053,29 @@ xfs_dir2_leaf_trim_data( bestsp = xfs_dir2_leaf_bests_p(ltp); be32_add_cpu(<p->bestcount, -1); memmove(&bestsp[1], &bestsp[0], be32_to_cpu(ltp->bestcount) * sizeof(*bestsp)); - xfs_dir2_leaf_log_tail(tp, lbp); - xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); return 0; } static inline size_t -xfs_dir2_leaf_size( - struct xfs_dir2_leaf_hdr *hdr, +xfs_dir3_leaf_size( + struct xfs_dir3_icleaf_hdr *hdr, int counts) { - int entries; + int entries; + int hdrsize; + + entries = hdr->count - hdr->stale; + if (hdr->magic == XFS_DIR2_LEAF1_MAGIC || + hdr->magic == XFS_DIR2_LEAFN_MAGIC) + hdrsize = sizeof(struct xfs_dir2_leaf_hdr); + else + hdrsize = sizeof(struct xfs_dir3_leaf_hdr); - entries = be16_to_cpu(hdr->count) - be16_to_cpu(hdr->stale); - return sizeof(xfs_dir2_leaf_hdr_t) + - entries * sizeof(xfs_dir2_leaf_entry_t) + - counts * sizeof(xfs_dir2_data_off_t) + - sizeof(xfs_dir2_leaf_tail_t); + return hdrsize + entries * sizeof(xfs_dir2_leaf_entry_t) + + counts * sizeof(xfs_dir2_data_off_t) + + sizeof(xfs_dir2_leaf_tail_t); } /* @@ -1892,6 +2099,7 @@ xfs_dir2_node_to_leaf( xfs_mount_t *mp; /* filesystem mount point */ int rval; /* successful free trim? */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir3_icfree_hdr freehdr; /* @@ -1942,7 +2150,11 @@ xfs_dir2_node_to_leaf( return 0; lbp = state->path.blk[0].bp; leaf = lbp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + + ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || + leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); + /* * Read the freespace block. */ @@ -1958,36 +2170,40 @@ xfs_dir2_node_to_leaf( * Now see if the leafn and free data will fit in a leaf1. * If not, release the buffer and give up. */ - if (xfs_dir2_leaf_size(&leaf->hdr, freehdr.nvalid) > mp->m_dirblksize) { + if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > mp->m_dirblksize) { xfs_trans_brelse(tp, fbp); return 0; } /* * If the leaf has any stale entries in it, compress them out. - * The compact routine will log the header. */ - if (be16_to_cpu(leaf->hdr.stale)) - xfs_dir2_leaf_compact(args, lbp); - else - xfs_dir2_leaf_log_header(tp, lbp); + if (leafhdr.stale) + xfs_dir3_leaf_compact(args, &leafhdr, lbp); - lbp->b_ops = &xfs_dir2_leaf1_buf_ops; - leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAF1_MAGIC); + lbp->b_ops = &xfs_dir3_leaf1_buf_ops; + leafhdr.magic = (leafhdr.magic == XFS_DIR2_LEAFN_MAGIC) + ? XFS_DIR2_LEAF1_MAGIC + : XFS_DIR3_LEAF1_MAGIC; /* * Set up the leaf tail from the freespace block. */ ltp = xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount = cpu_to_be32(freehdr.nvalid); + /* * Set up the leaf bests table. */ memcpy(xfs_dir2_leaf_bests_p(ltp), xfs_dir3_free_bests_p(mp, free), freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); - xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); - xfs_dir2_leaf_log_tail(tp, lbp); - xfs_dir2_leaf_check(dp, lbp); + + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, lbp); + xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_check(mp, lbp); + /* * Get rid of the freespace block. */ diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index abf617d..baaf9d9 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -41,14 +41,6 @@ */ static int xfs_dir2_leafn_add(struct xfs_buf *bp, xfs_da_args_t *args, int index); -#ifdef DEBUG -static void xfs_dir2_leafn_check(struct xfs_inode *dp, struct xfs_buf *bp); -#else -#define xfs_dir2_leafn_check(dp, bp) -#endif -static void xfs_dir2_leafn_moveents(xfs_da_args_t *args, struct xfs_buf *bp_s, - int start_s, struct xfs_buf *bp_d, - int start_d, int count); static void xfs_dir2_leafn_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_da_state_blk_t *blk2); @@ -58,6 +50,39 @@ static int xfs_dir2_leafn_remove(xfs_da_args_t *args, struct xfs_buf *bp, static int xfs_dir2_node_addname_int(xfs_da_args_t *args, xfs_da_state_blk_t *fblk); +/* + * Check internal consistency of a leafn block. + */ +#ifdef DEBUG +#define xfs_dir3_leaf_check(mp, bp) \ +do { \ + if (!xfs_dir3_leafn_check((mp), (bp))) \ + ASSERT(0); \ +} while (0); + +static bool +xfs_dir3_leafn_check( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dir2_leaf *leaf = bp->b_addr; + struct xfs_dir3_icleaf_hdr leafhdr; + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + + if (leafhdr.magic == XFS_DIR3_LEAFN_MAGIC) { + struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; + if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) + return false; + } else if (leafhdr.magic != XFS_DIR2_LEAFN_MAGIC) + return false; + + return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); +} +#else +#define xfs_dir3_leaf_check(mp, bp) +#endif + static bool xfs_dir3_free_verify( struct xfs_buf *bp) @@ -360,11 +385,19 @@ xfs_dir2_leaf_to_node( xfs_dir2_free_log_bests(tp, fbp, 0, freehdr.nvalid - 1); xfs_dir2_free_log_header(tp, fbp); - /* convert the leaf to a leafnode */ - leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); - lbp->b_ops = &xfs_dir2_leafn_buf_ops; - xfs_dir2_leaf_log_header(tp, lbp); - xfs_dir2_leafn_check(dp, lbp); + /* + * Converting the leaf to a leafnode is just a matter of changing the + * magic number and the ops. Do the change directly to the buffer as + * it's less work (and less code) than decoding the header to host + * format and back again. + */ + if (leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)) + leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); + else + leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); + lbp->b_ops = &xfs_dir3_leafn_buf_ops; + xfs_dir3_leaf_log_header(tp, lbp); + xfs_dir3_leaf_check(mp, lbp); return 0; } @@ -388,6 +421,8 @@ xfs_dir2_leafn_add( int lowstale; /* previous stale entry */ xfs_mount_t *mp; /* filesystem mount point */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; trace_xfs_dir2_leafn_add(args, index); @@ -395,6 +430,8 @@ xfs_dir2_leafn_add( mp = dp->i_mount; tp = args->trans; leaf = bp->b_addr; + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); /* * Quick check just to make sure we are not going to index @@ -410,15 +447,15 @@ xfs_dir2_leafn_add( * a compact. */ - if (be16_to_cpu(leaf->hdr.count) == xfs_dir2_max_leaf_ents(mp)) { - if (!leaf->hdr.stale) + if (leafhdr.count == xfs_dir3_max_leaf_ents(mp, leaf)) { + if (!leafhdr.stale) return XFS_ERROR(ENOSPC); - compact = be16_to_cpu(leaf->hdr.stale) > 1; + compact = leafhdr.stale > 1; } else compact = 0; - ASSERT(index == 0 || be32_to_cpu(leaf->ents[index - 1].hashval) <= args->hashval); - ASSERT(index == be16_to_cpu(leaf->hdr.count) || - be32_to_cpu(leaf->ents[index].hashval) >= args->hashval); + ASSERT(index == 0 || be32_to_cpu(ents[index - 1].hashval) <= args->hashval); + ASSERT(index == leafhdr.count || + be32_to_cpu(ents[index].hashval) >= args->hashval); if (args->op_flags & XFS_DA_OP_JUSTCHECK) return 0; @@ -427,62 +464,35 @@ xfs_dir2_leafn_add( * Compact out all but one stale leaf entry. Leaves behind * the entry closest to index. */ - if (compact) { - xfs_dir2_leaf_compact_x1(bp, &index, &lowstale, &highstale, - &lfloglow, &lfloghigh); - } - /* - * Set impossible logging indices for this case. - */ - else if (leaf->hdr.stale) { - lfloglow = be16_to_cpu(leaf->hdr.count); + if (compact) + xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale, + &highstale, &lfloglow, &lfloghigh); + else if (leafhdr.stale) { + /* + * Set impossible logging indices for this case. + */ + lfloglow = leafhdr.count; lfloghigh = -1; } /* * Insert the new entry, log everything. */ - lep = xfs_dir2_leaf_find_entry(leaf, index, compact, lowstale, + lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale, highstale, &lfloglow, &lfloghigh); lep->hashval = cpu_to_be32(args->hashval); lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, args->blkno, args->index)); - xfs_dir2_leaf_log_header(tp, bp); - xfs_dir2_leaf_log_ents(tp, bp, lfloglow, lfloghigh); - xfs_dir2_leafn_check(dp, bp); + + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, bp); + xfs_dir3_leaf_log_ents(tp, bp, lfloglow, lfloghigh); + xfs_dir3_leaf_check(mp, bp); return 0; } #ifdef DEBUG -/* - * Check internal consistency of a leafn block. - */ -void -xfs_dir2_leafn_check( - struct xfs_inode *dp, - struct xfs_buf *bp) -{ - int i; /* leaf index */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ - xfs_mount_t *mp; /* filesystem mount point */ - int stale; /* count of stale leaves */ - - leaf = bp->b_addr; - mp = dp->i_mount; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - ASSERT(be16_to_cpu(leaf->hdr.count) <= xfs_dir2_max_leaf_ents(mp)); - for (i = stale = 0; i < be16_to_cpu(leaf->hdr.count); i++) { - if (i + 1 < be16_to_cpu(leaf->hdr.count)) { - ASSERT(be32_to_cpu(leaf->ents[i].hashval) <= - be32_to_cpu(leaf->ents[i + 1].hashval)); - } - if (leaf->ents[i].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) - stale++; - } - ASSERT(be16_to_cpu(leaf->hdr.stale) == stale); -} - static void xfs_dir2_free_hdr_check( struct xfs_mount *mp, @@ -510,15 +520,22 @@ xfs_dir2_leafn_lasthash( struct xfs_buf *bp, /* leaf buffer */ int *count) /* count of entries in leaf */ { - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf = bp->b_addr; + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + + ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || + leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); - leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); if (count) - *count = be16_to_cpu(leaf->hdr.count); - if (!leaf->hdr.count) + *count = leafhdr.count; + if (!leafhdr.count) return 0; - return be32_to_cpu(leaf->ents[be16_to_cpu(leaf->hdr.count) - 1].hashval); + + ents = xfs_dir3_leaf_ents_p(leaf); + return be32_to_cpu(ents[leafhdr.count - 1].hashval); } /* @@ -547,16 +564,19 @@ xfs_dir2_leafn_lookup_for_addname( xfs_dir2_db_t newdb; /* new data block number */ xfs_dir2_db_t newfdb; /* new free block number */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; dp = args->dp; tp = args->trans; mp = dp->i_mount; leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); -#ifdef __KERNEL__ - ASSERT(be16_to_cpu(leaf->hdr.count) > 0); -#endif - xfs_dir2_leafn_check(dp, bp); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + + xfs_dir3_leaf_check(mp, bp); + ASSERT(leafhdr.count > 0); + /* * Look up the hash value in the leaf entries. */ @@ -576,9 +596,9 @@ xfs_dir2_leafn_lookup_for_addname( /* * Loop over leaf entries with the right hash value. */ - for (lep = &leaf->ents[index]; index < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(lep->hashval) == args->hashval; - lep++, index++) { + for (lep = &ents[index]; + index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval; + lep++, index++) { /* * Skip stale leaf entries. */ @@ -694,16 +714,19 @@ xfs_dir2_leafn_lookup_for_entry( xfs_dir2_db_t newdb; /* new data block number */ xfs_trans_t *tp; /* transaction pointer */ enum xfs_dacmp cmp; /* comparison result */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; dp = args->dp; tp = args->trans; mp = dp->i_mount; leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); -#ifdef __KERNEL__ - ASSERT(be16_to_cpu(leaf->hdr.count) > 0); -#endif - xfs_dir2_leafn_check(dp, bp); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + + xfs_dir3_leaf_check(mp, bp); + ASSERT(leafhdr.count > 0); + /* * Look up the hash value in the leaf entries. */ @@ -718,9 +741,9 @@ xfs_dir2_leafn_lookup_for_entry( /* * Loop over leaf entries with the right hash value. */ - for (lep = &leaf->ents[index]; index < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(lep->hashval) == args->hashval; - lep++, index++) { + for (lep = &ents[index]; + index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval; + lep++, index++) { /* * Skip stale leaf entries. */ @@ -792,8 +815,7 @@ xfs_dir2_leafn_lookup_for_entry( return XFS_ERROR(EEXIST); } } - ASSERT(index == be16_to_cpu(leaf->hdr.count) || - (args->op_flags & XFS_DA_OP_OKNOENT)); + ASSERT(index == leafhdr.count || (args->op_flags & XFS_DA_OP_OKNOENT)); if (curbp) { if (args->cmpresult == XFS_CMP_DIFFERENT) { /* Giving back last used data block. */ @@ -838,52 +860,50 @@ xfs_dir2_leafn_lookup_int( * Log entries and headers. Stale entries are preserved. */ static void -xfs_dir2_leafn_moveents( - xfs_da_args_t *args, /* operation arguments */ - struct xfs_buf *bp_s, /* source leaf buffer */ - int start_s, /* source leaf index */ - struct xfs_buf *bp_d, /* destination leaf buffer */ - int start_d, /* destination leaf index */ - int count) /* count of leaves to copy */ +xfs_dir3_leafn_moveents( + xfs_da_args_t *args, /* operation arguments */ + struct xfs_buf *bp_s, /* source */ + struct xfs_dir3_icleaf_hdr *shdr, + struct xfs_dir2_leaf_entry *sents, + int start_s,/* source leaf index */ + struct xfs_buf *bp_d, /* destination */ + struct xfs_dir3_icleaf_hdr *dhdr, + struct xfs_dir2_leaf_entry *dents, + int start_d,/* destination leaf index */ + int count) /* count of leaves to copy */ { - xfs_dir2_leaf_t *leaf_d; /* destination leaf structure */ - xfs_dir2_leaf_t *leaf_s; /* source leaf structure */ - int stale; /* count stale leaves copied */ - xfs_trans_t *tp; /* transaction pointer */ + struct xfs_trans *tp = args->trans; + int stale; /* count stale leaves copied */ trace_xfs_dir2_leafn_moveents(args, start_s, start_d, count); /* * Silently return if nothing to do. */ - if (count == 0) { + if (count == 0) return; - } - tp = args->trans; - leaf_s = bp_s->b_addr; - leaf_d = bp_d->b_addr; + /* * If the destination index is not the end of the current * destination leaf entries, open up a hole in the destination * to hold the new entries. */ - if (start_d < be16_to_cpu(leaf_d->hdr.count)) { - memmove(&leaf_d->ents[start_d + count], &leaf_d->ents[start_d], - (be16_to_cpu(leaf_d->hdr.count) - start_d) * - sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir2_leaf_log_ents(tp, bp_d, start_d + count, - count + be16_to_cpu(leaf_d->hdr.count) - 1); + if (start_d < dhdr->count) { + memmove(&dents[start_d + count], &dents[start_d], + (dhdr->count - start_d) * sizeof(xfs_dir2_leaf_entry_t)); + xfs_dir3_leaf_log_ents(tp, bp_d, start_d + count, + count + dhdr->count - 1); } /* * If the source has stale leaves, count the ones in the copy range * so we can update the header correctly. */ - if (leaf_s->hdr.stale) { + if (shdr->stale) { int i; /* temp leaf index */ for (i = start_s, stale = 0; i < start_s + count; i++) { - if (leaf_s->ents[i].address == - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + if (sents[i].address == + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) stale++; } } else @@ -891,29 +911,27 @@ xfs_dir2_leafn_moveents( /* * Copy the leaf entries from source to destination. */ - memcpy(&leaf_d->ents[start_d], &leaf_s->ents[start_s], + memcpy(&dents[start_d], &sents[start_s], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir2_leaf_log_ents(tp, bp_d, start_d, start_d + count - 1); + xfs_dir3_leaf_log_ents(tp, bp_d, start_d, start_d + count - 1); + /* * If there are source entries after the ones we copied, * delete the ones we copied by sliding the next ones down. */ - if (start_s + count < be16_to_cpu(leaf_s->hdr.count)) { - memmove(&leaf_s->ents[start_s], &leaf_s->ents[start_s + count], + if (start_s + count < shdr->count) { + memmove(&sents[start_s], &sents[start_s + count], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir2_leaf_log_ents(tp, bp_s, start_s, start_s + count - 1); + xfs_dir3_leaf_log_ents(tp, bp_s, start_s, start_s + count - 1); } + /* * Update the headers and log them. */ - be16_add_cpu(&leaf_s->hdr.count, -(count)); - be16_add_cpu(&leaf_s->hdr.stale, -(stale)); - be16_add_cpu(&leaf_d->hdr.count, count); - be16_add_cpu(&leaf_d->hdr.stale, stale); - xfs_dir2_leaf_log_header(tp, bp_s); - xfs_dir2_leaf_log_header(tp, bp_d); - xfs_dir2_leafn_check(args->dp, bp_s); - xfs_dir2_leafn_check(args->dp, bp_d); + shdr->count -= count; + shdr->stale -= stale; + dhdr->count += count; + dhdr->stale += stale; } /* @@ -922,21 +940,25 @@ xfs_dir2_leafn_moveents( */ int /* sort order */ xfs_dir2_leafn_order( - struct xfs_buf *leaf1_bp, /* leaf1 buffer */ - struct xfs_buf *leaf2_bp) /* leaf2 buffer */ + struct xfs_buf *leaf1_bp, /* leaf1 buffer */ + struct xfs_buf *leaf2_bp) /* leaf2 buffer */ { - xfs_dir2_leaf_t *leaf1; /* leaf1 structure */ - xfs_dir2_leaf_t *leaf2; /* leaf2 structure */ - - leaf1 = leaf1_bp->b_addr; - leaf2 = leaf2_bp->b_addr; - ASSERT(leaf1->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - ASSERT(leaf2->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - if (be16_to_cpu(leaf1->hdr.count) > 0 && - be16_to_cpu(leaf2->hdr.count) > 0 && - (be32_to_cpu(leaf2->ents[0].hashval) < be32_to_cpu(leaf1->ents[0].hashval) || - be32_to_cpu(leaf2->ents[be16_to_cpu(leaf2->hdr.count) - 1].hashval) < - be32_to_cpu(leaf1->ents[be16_to_cpu(leaf1->hdr.count) - 1].hashval))) + struct xfs_dir2_leaf *leaf1 = leaf1_bp->b_addr; + struct xfs_dir2_leaf *leaf2 = leaf2_bp->b_addr; + struct xfs_dir2_leaf_entry *ents1; + struct xfs_dir2_leaf_entry *ents2; + struct xfs_dir3_icleaf_hdr hdr1; + struct xfs_dir3_icleaf_hdr hdr2; + + xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); + xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); + ents1 = xfs_dir3_leaf_ents_p(leaf1); + ents2 = xfs_dir3_leaf_ents_p(leaf2); + + if (hdr1.count > 0 && hdr2.count > 0 && + (be32_to_cpu(ents2[0].hashval) < be32_to_cpu(ents1[0].hashval) || + be32_to_cpu(ents2[hdr2.count - 1].hashval) < + be32_to_cpu(ents1[hdr1.count - 1].hashval))) return 1; return 0; } @@ -965,6 +987,10 @@ xfs_dir2_leafn_rebalance( #endif int oldsum; /* old total leaf count */ int swap; /* swapped leaf blocks */ + struct xfs_dir2_leaf_entry *ents1; + struct xfs_dir2_leaf_entry *ents2; + struct xfs_dir3_icleaf_hdr hdr1; + struct xfs_dir3_icleaf_hdr hdr2; args = state->args; /* @@ -979,11 +1005,17 @@ xfs_dir2_leafn_rebalance( } leaf1 = blk1->bp->b_addr; leaf2 = blk2->bp->b_addr; - oldsum = be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count); + xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); + xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); + ents1 = xfs_dir3_leaf_ents_p(leaf1); + ents2 = xfs_dir3_leaf_ents_p(leaf2); + + oldsum = hdr1.count + hdr2.count; #ifdef DEBUG - oldstale = be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale); + oldstale = hdr1.stale + hdr2.stale; #endif mid = oldsum >> 1; + /* * If the old leaf count was odd then the new one will be even, * so we need to divide the new count evenly. @@ -991,10 +1023,10 @@ xfs_dir2_leafn_rebalance( if (oldsum & 1) { xfs_dahash_t midhash; /* middle entry hash value */ - if (mid >= be16_to_cpu(leaf1->hdr.count)) - midhash = be32_to_cpu(leaf2->ents[mid - be16_to_cpu(leaf1->hdr.count)].hashval); + if (mid >= hdr1.count) + midhash = be32_to_cpu(ents2[mid - hdr1.count].hashval); else - midhash = be32_to_cpu(leaf1->ents[mid].hashval); + midhash = be32_to_cpu(ents1[mid].hashval); isleft = args->hashval <= midhash; } /* @@ -1008,30 +1040,42 @@ xfs_dir2_leafn_rebalance( * Calculate moved entry count. Positive means left-to-right, * negative means right-to-left. Then move the entries. */ - count = be16_to_cpu(leaf1->hdr.count) - mid + (isleft == 0); + count = hdr1.count - mid + (isleft == 0); if (count > 0) - xfs_dir2_leafn_moveents(args, blk1->bp, - be16_to_cpu(leaf1->hdr.count) - count, blk2->bp, 0, count); + xfs_dir3_leafn_moveents(args, blk1->bp, &hdr1, ents1, + hdr1.count - count, blk2->bp, + &hdr2, ents2, 0, count); else if (count < 0) - xfs_dir2_leafn_moveents(args, blk2->bp, 0, blk1->bp, - be16_to_cpu(leaf1->hdr.count), count); - ASSERT(be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count) == oldsum); - ASSERT(be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale) == oldstale); + xfs_dir3_leafn_moveents(args, blk2->bp, &hdr2, ents2, 0, + blk1->bp, &hdr1, ents1, + hdr1.count, count); + + ASSERT(hdr1.count + hdr2.count == oldsum); + ASSERT(hdr1.stale + hdr2.stale == oldstale); + + /* log the changes made when moving the entries */ + xfs_dir3_leaf_hdr_to_disk(leaf1, &hdr1); + xfs_dir3_leaf_hdr_to_disk(leaf2, &hdr2); + xfs_dir3_leaf_log_header(args->trans, blk1->bp); + xfs_dir3_leaf_log_header(args->trans, blk2->bp); + + xfs_dir3_leaf_check(args->dp->i_mount, blk1->bp); + xfs_dir3_leaf_check(args->dp->i_mount, blk2->bp); + /* * Mark whether we're inserting into the old or new leaf. */ - if (be16_to_cpu(leaf1->hdr.count) < be16_to_cpu(leaf2->hdr.count)) + if (hdr1.count < hdr2.count) state->inleaf = swap; - else if (be16_to_cpu(leaf1->hdr.count) > be16_to_cpu(leaf2->hdr.count)) + else if (hdr1.count > hdr2.count) state->inleaf = !swap; else - state->inleaf = - swap ^ (blk1->index <= be16_to_cpu(leaf1->hdr.count)); + state->inleaf = swap ^ (blk1->index <= hdr1.count); /* * Adjust the expected index for insertion. */ if (!state->inleaf) - blk2->index = blk1->index - be16_to_cpu(leaf1->hdr.count); + blk2->index = blk1->index - hdr1.count; /* * Finally sanity check just to make sure we are not returning a @@ -1153,6 +1197,8 @@ xfs_dir2_leafn_remove( int needscan; /* need to rescan data frees */ xfs_trans_t *tp; /* transaction pointer */ struct xfs_dir2_data_free *bf; /* bestfree table */ + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; trace_xfs_dir2_leafn_remove(args, index); @@ -1160,11 +1206,14 @@ xfs_dir2_leafn_remove( tp = args->trans; mp = dp->i_mount; leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + /* * Point to the entry we're removing. */ - lep = &leaf->ents[index]; + lep = &ents[index]; + /* * Extract the data block and offset from the entry. */ @@ -1172,14 +1221,18 @@ xfs_dir2_leafn_remove( ASSERT(dblk->blkno == db); off = xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address)); ASSERT(dblk->index == off); + /* * Kill the leaf entry by marking it stale. * Log the leaf block changes. */ - be16_add_cpu(&leaf->hdr.stale, 1); - xfs_dir2_leaf_log_header(tp, bp); + leafhdr.stale++; + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, bp); + lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir2_leaf_log_ents(tp, bp, index, index); + xfs_dir3_leaf_log_ents(tp, bp, index, index); + /* * Make the data entry free. Keep track of the longest freespace * in the data block in case it changes. @@ -1267,15 +1320,13 @@ xfs_dir2_leafn_remove( return error; } - xfs_dir2_leafn_check(dp, bp); + xfs_dir3_leaf_check(mp, bp); /* * Return indication of whether this leaf block is empty enough * to justify trying to join it with a neighbor. */ - *rval = - ((uint)sizeof(leaf->hdr) + - (uint)sizeof(leaf->ents[0]) * - (be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale))) < + *rval = (xfs_dir3_leaf_hdr_size(leaf) + + (uint)sizeof(ents[0]) * (leafhdr.count - leafhdr.stale)) < mp->m_dir_magicpct; return 0; } @@ -1308,11 +1359,11 @@ xfs_dir2_leafn_split( /* * Initialize the new leaf block. */ - error = xfs_dir2_leaf_init(args, xfs_dir2_da_to_db(mp, blkno), - &newblk->bp, XFS_DIR2_LEAFN_MAGIC); - if (error) { + error = xfs_dir3_leaf_get_buf(args, xfs_dir2_da_to_db(mp, blkno), + &newblk->bp, XFS_DIR2_LEAFN_MAGIC); + if (error) return error; - } + newblk->blkno = blkno; newblk->magic = XFS_DIR2_LEAFN_MAGIC; /* @@ -1336,8 +1387,8 @@ xfs_dir2_leafn_split( */ oldblk->hashval = xfs_dir2_leafn_lasthash(oldblk->bp, NULL); newblk->hashval = xfs_dir2_leafn_lasthash(newblk->bp, NULL); - xfs_dir2_leafn_check(args->dp, oldblk->bp); - xfs_dir2_leafn_check(args->dp, newblk->bp); + xfs_dir3_leaf_check(mp, oldblk->bp); + xfs_dir3_leaf_check(mp, newblk->bp); return error; } @@ -1363,9 +1414,10 @@ xfs_dir2_leafn_toosmall( int error; /* error return value */ int forward; /* sibling block direction */ int i; /* sibling counter */ - xfs_da_blkinfo_t *info; /* leaf block header */ xfs_dir2_leaf_t *leaf; /* leaf structure */ int rval; /* result from path_shift */ + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; /* * Check for the degenerate case of the block being over 50% full. @@ -1373,11 +1425,13 @@ xfs_dir2_leafn_toosmall( * to coalesce with a sibling. */ blk = &state->path.blk[state->path.active - 1]; - info = blk->bp->b_addr; - ASSERT(info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - leaf = (xfs_dir2_leaf_t *)info; - count = be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); - bytes = (uint)sizeof(leaf->hdr) + count * (uint)sizeof(leaf->ents[0]); + leaf = blk->bp->b_addr; + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + xfs_dir3_leaf_check(state->args->dp->i_mount, blk->bp); + + count = leafhdr.count - leafhdr.stale; + bytes = xfs_dir3_leaf_hdr_size(leaf) + count * sizeof(ents[0]); if (bytes > (state->blocksize >> 1)) { /* * Blk over 50%, don't try to join. @@ -1396,7 +1450,7 @@ xfs_dir2_leafn_toosmall( * Make altpath point to the block we want to keep and * path point to the block we want to drop (this one). */ - forward = (info->forw != 0); + forward = (leafhdr.forw != 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); error = xfs_da_path_shift(state, &state->altpath, forward, 0, &rval); @@ -1412,15 +1466,17 @@ xfs_dir2_leafn_toosmall( * We prefer coalescing with the lower numbered sibling so as * to shrink a directory over time. */ - forward = be32_to_cpu(info->forw) < be32_to_cpu(info->back); + forward = leafhdr.forw < leafhdr.back; for (i = 0, bp = NULL; i < 2; forward = !forward, i++) { - blkno = forward ? be32_to_cpu(info->forw) : be32_to_cpu(info->back); + struct xfs_dir3_icleaf_hdr hdr2; + + blkno = forward ? leafhdr.forw : leafhdr.back; if (blkno == 0) continue; /* * Read the sibling leaf block. */ - error = xfs_dir2_leafn_read(state->args->trans, state->args->dp, + error = xfs_dir3_leafn_read(state->args->trans, state->args->dp, blkno, -1, &bp); if (error) return error; @@ -1428,13 +1484,15 @@ xfs_dir2_leafn_toosmall( /* * Count bytes in the two blocks combined. */ - leaf = (xfs_dir2_leaf_t *)info; - count = be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); + count = leafhdr.count - leafhdr.stale; bytes = state->blocksize - (state->blocksize >> 2); + leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - count += be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); - bytes -= count * (uint)sizeof(leaf->ents[0]); + xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf); + ents = xfs_dir3_leaf_ents_p(leaf); + count += hdr2.count - hdr2.stale; + bytes -= count * sizeof(ents[0]); + /* * Fits with at least 25% to spare. */ @@ -1481,34 +1539,53 @@ xfs_dir2_leafn_unbalance( xfs_da_args_t *args; /* operation arguments */ xfs_dir2_leaf_t *drop_leaf; /* dead leaf structure */ xfs_dir2_leaf_t *save_leaf; /* surviving leaf structure */ + struct xfs_dir3_icleaf_hdr savehdr; + struct xfs_dir3_icleaf_hdr drophdr; + struct xfs_dir2_leaf_entry *sents; + struct xfs_dir2_leaf_entry *dents; args = state->args; ASSERT(drop_blk->magic == XFS_DIR2_LEAFN_MAGIC); ASSERT(save_blk->magic == XFS_DIR2_LEAFN_MAGIC); drop_leaf = drop_blk->bp->b_addr; save_leaf = save_blk->bp->b_addr; - ASSERT(drop_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - ASSERT(save_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + + xfs_dir3_leaf_hdr_from_disk(&savehdr, save_leaf); + xfs_dir3_leaf_hdr_from_disk(&drophdr, drop_leaf); + sents = xfs_dir3_leaf_ents_p(save_leaf); + dents = xfs_dir3_leaf_ents_p(drop_leaf); + /* * If there are any stale leaf entries, take this opportunity * to purge them. */ - if (drop_leaf->hdr.stale) - xfs_dir2_leaf_compact(args, drop_blk->bp); - if (save_leaf->hdr.stale) - xfs_dir2_leaf_compact(args, save_blk->bp); + if (drophdr.stale) + xfs_dir3_leaf_compact(args, &drophdr, drop_blk->bp); + if (savehdr.stale) + xfs_dir3_leaf_compact(args, &savehdr, save_blk->bp); + /* * Move the entries from drop to the appropriate end of save. */ - drop_blk->hashval = be32_to_cpu(drop_leaf->ents[be16_to_cpu(drop_leaf->hdr.count) - 1].hashval); + drop_blk->hashval = be32_to_cpu(dents[drophdr.count - 1].hashval); if (xfs_dir2_leafn_order(save_blk->bp, drop_blk->bp)) - xfs_dir2_leafn_moveents(args, drop_blk->bp, 0, save_blk->bp, 0, - be16_to_cpu(drop_leaf->hdr.count)); + xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0, + save_blk->bp, &savehdr, sents, 0, + drophdr.count); else - xfs_dir2_leafn_moveents(args, drop_blk->bp, 0, save_blk->bp, - be16_to_cpu(save_leaf->hdr.count), be16_to_cpu(drop_leaf->hdr.count)); - save_blk->hashval = be32_to_cpu(save_leaf->ents[be16_to_cpu(save_leaf->hdr.count) - 1].hashval); - xfs_dir2_leafn_check(args->dp, save_blk->bp); + xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0, + save_blk->bp, &savehdr, sents, + savehdr.count, drophdr.count); + save_blk->hashval = be32_to_cpu(sents[savehdr.count - 1].hashval); + + /* log the changes made when moving the entries */ + xfs_dir3_leaf_hdr_to_disk(save_leaf, &savehdr); + xfs_dir3_leaf_hdr_to_disk(drop_leaf, &drophdr); + xfs_dir3_leaf_log_header(args->trans, save_blk->bp); + xfs_dir3_leaf_log_header(args->trans, drop_blk->bp); + + xfs_dir3_leaf_check(args->dp->i_mount, save_blk->bp); + xfs_dir3_leaf_check(args->dp->i_mount, drop_blk->bp); } /* @@ -2113,13 +2190,15 @@ xfs_dir2_node_replace( * and locked it. But paranoia is good. */ if (rval == EEXIST) { + struct xfs_dir2_leaf_entry *ents; /* * Find the leaf entry. */ blk = &state->path.blk[state->path.active - 1]; ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC); leaf = blk->bp->b_addr; - lep = &leaf->ents[blk->index]; + ents = xfs_dir3_leaf_ents_p(leaf); + lep = &ents[blk->index]; ASSERT(state->extravalid); /* * Point to the data entry. diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 910e644..932565d 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -77,24 +77,25 @@ extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_buf *bp, xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); /* xfs_dir2_leaf.c */ -extern const struct xfs_buf_ops xfs_dir2_leafn_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_leafn_buf_ops; -extern int xfs_dir2_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp, +extern int xfs_dir3_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, xfs_daddr_t mappedbno, struct xfs_buf **bpp); extern int xfs_dir2_block_to_leaf(struct xfs_da_args *args, struct xfs_buf *dbp); extern int xfs_dir2_leaf_addname(struct xfs_da_args *args); -extern void xfs_dir2_leaf_compact(struct xfs_da_args *args, - struct xfs_buf *bp); -extern void xfs_dir2_leaf_compact_x1(struct xfs_buf *bp, int *indexp, +extern void xfs_dir3_leaf_compact(struct xfs_da_args *args, + struct xfs_dir3_icleaf_hdr *leafhdr, struct xfs_buf *bp); +extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int *indexp, int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); extern int xfs_dir2_leaf_getdents(struct xfs_inode *dp, void *dirent, size_t bufsize, xfs_off_t *offset, filldir_t filldir); -extern int xfs_dir2_leaf_init(struct xfs_da_args *args, xfs_dir2_db_t bno, - struct xfs_buf **bpp, int magic); -extern void xfs_dir2_leaf_log_ents(struct xfs_trans *tp, struct xfs_buf *bp, +extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t bno, + struct xfs_buf **bpp, __uint16_t magic); +extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_buf *bp, int first, int last); -extern void xfs_dir2_leaf_log_header(struct xfs_trans *tp, +extern void xfs_dir3_leaf_log_header(struct xfs_trans *tp, struct xfs_buf *bp); extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); @@ -104,11 +105,18 @@ extern int xfs_dir2_leaf_search_hash(struct xfs_da_args *args, extern int xfs_dir2_leaf_trim_data(struct xfs_da_args *args, struct xfs_buf *lbp, xfs_dir2_db_t db); extern struct xfs_dir2_leaf_entry * -xfs_dir2_leaf_find_entry(struct xfs_dir2_leaf *leaf, int index, int compact, - int lowstale, int highstale, - int *lfloglow, int *lfloghigh); +xfs_dir3_leaf_find_entry(struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int index, int compact, + int lowstale, int highstale, int *lfloglow, int *lfloghigh); extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); +extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from); +extern void xfs_dir3_leaf_hdr_to_disk(struct xfs_dir2_leaf *to, + struct xfs_dir3_icleaf_hdr *from); +extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, + struct xfs_dir3_icleaf_hdr *hdr, struct xfs_dir2_leaf *leaf); + /* xfs_dir2_node.c */ extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, struct xfs_buf *lbp); From sekharan@us.ibm.com Thu Apr 11 16:45:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 052C17F37 for ; Thu, 11 Apr 2013 16:45:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C62DC8F8084 for ; Thu, 11 Apr 2013 14:45:20 -0700 (PDT) X-ASG-Debug-ID: 1365716716-04bdf02d1fa9e30001-NocioJ Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.150]) by cuda.sgi.com with ESMTP id xqFHe6ZVSJOUGt35 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 11 Apr 2013 14:45:16 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.110.150 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.150] Received: from /spool/local by e32.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 11 Apr 2013 15:45:16 -0600 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.150] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.150] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.150] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.150] Received: from d03dlp03.boulder.ibm.com (9.17.202.179) by e32.co.us.ibm.com (192.168.1.132) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 11 Apr 2013 15:45:14 -0600 Received: from d03relay02.boulder.ibm.com (d03relay02.boulder.ibm.com [9.17.195.227]) by d03dlp03.boulder.ibm.com (Postfix) with ESMTP id 1824819D8045 for ; Thu, 11 Apr 2013 15:45:09 -0600 (MDT) Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay02.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3BLjCoB134102 for ; Thu, 11 Apr 2013 15:45:13 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3BLjCm4025323 for ; Thu, 11 Apr 2013 15:45:12 -0600 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3BLj8UQ025084 for ; Thu, 11 Apr 2013 15:45:09 -0600 Subject: Deprecating xfs_check From: Chandra Seetharaman X-ASG-Orig-Subj: Deprecating xfs_check Reply-To: sekharan@us.ibm.com To: XFS mailing list Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Thu, 11 Apr 2013 16:45:08 -0500 Message-ID: <1365716708.3762.32154.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13041121-5406-0000-0000-0000075D25EC X-Barracuda-Connect: e32.co.us.ibm.com[32.97.110.150] X-Barracuda-Start-Time: 1365716716 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hello All, Alex Elder mentioned about deprecating xfs_check, and he suggested is to replace xfs_check command with a script, that says xfs_check is deprecated, use "xfs_repair -n". Sounds ok ? Let me know if it is not the right approach. Regards, Chandra From bpm@sgi.com Thu Apr 11 17:17:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 64ED07F37 for ; Thu, 11 Apr 2013 17:17:58 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 38C45304039; Thu, 11 Apr 2013 15:17:55 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 0E6F3500B4B; Thu, 11 Apr 2013 17:17:55 -0500 (CDT) Date: Thu, 11 Apr 2013 17:17:55 -0500 From: Ben Myers To: Chandra Seetharaman Cc: XFS mailing list Subject: Re: Deprecating xfs_check Message-ID: <20130411221754.GI22182@sgi.com> References: <1365716708.3762.32154.camel@chandra-dt.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1365716708.3762.32154.camel@chandra-dt.ibm.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Chandra, On Thu, Apr 11, 2013 at 04:45:08PM -0500, Chandra Seetharaman wrote: > Hello All, > > Alex Elder mentioned about deprecating xfs_check, and he suggested is to > replace xfs_check command with a script, that says xfs_check is > deprecated, use "xfs_repair -n". > > Sounds ok ? > > Let me know if it is not the right approach. That sounds ok to me. You might also consider making xfs_check a hardlink to xfs_repair and varying the behavior based on program name. Then xfs_check == xfs_repair -n. Regards, Ben From tdm@sgi.com Thu Apr 11 18:01:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A36E67F37 for ; Thu, 11 Apr 2013 18:01:19 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6BAE88F808F; Thu, 11 Apr 2013 16:01:16 -0700 (PDT) Received: from [134.15.0.72] (cf-sslvpn-0-72.corp.sgi.com [134.15.0.72]) by estes.americas.sgi.com (Postfix) with ESMTP id 05E68700204A; Thu, 11 Apr 2013 18:01:15 -0500 (CDT) Message-ID: <516740B8.4030704@sgi.com> Date: Thu, 11 Apr 2013 18:01:12 -0500 From: Troy McCorkell User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130308 Thunderbird/17.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com, Chandra Seetharaman , Ben Myers Subject: Re: Deprecating xfs_check References: <1365716708.3762.32154.camel@chandra-dt.ibm.com> <20130411221754.GI22182@sgi.com> In-Reply-To: <20130411221754.GI22182@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/11/2013 05:17 PM, Ben Myers wrote: > Hey Chandra, > > On Thu, Apr 11, 2013 at 04:45:08PM -0500, Chandra Seetharaman wrote: >> Hello All, >> >> Alex Elder mentioned about deprecating xfs_check, and he suggested is to >> replace xfs_check command with a script, that says xfs_check is >> deprecated, use "xfs_repair -n". >> >> Sounds ok ? >> >> Let me know if it is not the right approach. > That sounds ok to me. You might also consider making xfs_check a hardlink to > xfs_repair and varying the behavior based on program name. Then xfs_check == > xfs_repair -n. > > Regards, > Ben > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs Does "xfs_repair -n" need to provide all of the functionality that xfs_check provides before it is replaced? xfs_check can be run on a filesystem mounted read-only. xfs_repair -n can not. xfs_check has two options: -i ino Specifies verbose behavior for the specified inode ino. -b bno Specifies verbose behavior for the specific filesystem block at bno. which are not available with xfs_repair. -Troy From bfoster@redhat.com Thu Apr 11 18:29:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BBD677F37 for ; Thu, 11 Apr 2013 18:29:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 589A48F8096 for ; Thu, 11 Apr 2013 16:29:15 -0700 (PDT) X-ASG-Debug-ID: 1365722953-04bdf02d1fb1800001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id I46GJbcxbquuPWuP; Thu, 11 Apr 2013 16:29: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3BNTAZN030650 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 11 Apr 2013 19:29:11 -0400 Received: from laptop.bfoster (vpn-54-54.rdu2.redhat.com [10.10.54.54]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3BNT8Ek000756 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 11 Apr 2013 19:29:09 -0400 Message-ID: <516746AC.3090808@redhat.com> Date: Thu, 11 Apr 2013 19:26:36 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Emmanuel Florac , Ben Myers , "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: Content-Type: multipart/mixed; boundary="------------060102000008080400010001" 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: 1365722953 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is a multi-part message in MIME format. --------------060102000008080400010001 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 04/11/2013 03:11 PM, 符永涛 wrote: > It happens tonight again on one of our servers, how to debug the root > cause? Thank you. > Hi, I've attached a system tap script (stap -v xfs.stp) that should hopefully print out a bit more data should the issue happen again. Do you have a small enough number of nodes (or predictable enough pattern) that you could run this on the nodes that tend to fail and collect the output? Also, could you collect an xfs_metadump of the filesystem in question and make it available for download and analysis somewhere? I believe the ideal approach is to mount/umount the filesystem first to replay the log before collecting a metadump, but somebody could correct me on that (to be safe, you could collect multiple dumps: pre-mount and post-mount). Could you also describe your workload a little bit? Thanks. Brian > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > xfs_inotobp() returned error 22. > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree returned > error 22 > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) > called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = > 0xffffffffa02ee20a > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting > down filesystem > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem and > rectify the problem(s) > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. > > xfs_repair -n > > > Phase 7 - verify link counts... > would have reset inode 20021 nlinks from 0 to 1 > would have reset inode 20789 nlinks from 0 to 1 > would have reset inode 35125 nlinks from 0 to 1 > would have reset inode 35637 nlinks from 0 to 1 > would have reset inode 36149 nlinks from 0 to 1 > would have reset inode 38197 nlinks from 0 to 1 > would have reset inode 39477 nlinks from 0 to 1 > would have reset inode 54069 nlinks from 0 to 1 > would have reset inode 62261 nlinks from 0 to 1 > would have reset inode 63029 nlinks from 0 to 1 > would have reset inode 72501 nlinks from 0 to 1 > would have reset inode 79925 nlinks from 0 to 1 > would have reset inode 81205 nlinks from 0 to 1 > would have reset inode 84789 nlinks from 0 to 1 > would have reset inode 87861 nlinks from 0 to 1 > would have reset inode 90663 nlinks from 0 to 1 > would have reset inode 91189 nlinks from 0 to 1 > would have reset inode 95541 nlinks from 0 to 1 > would have reset inode 98101 nlinks from 0 to 1 > would have reset inode 101173 nlinks from 0 to 1 > would have reset inode 113205 nlinks from 0 to 1 > would have reset inode 114741 nlinks from 0 to 1 > would have reset inode 126261 nlinks from 0 to 1 > would have reset inode 140597 nlinks from 0 to 1 > would have reset inode 144693 nlinks from 0 to 1 > would have reset inode 147765 nlinks from 0 to 1 > would have reset inode 152885 nlinks from 0 to 1 > would have reset inode 161333 nlinks from 0 to 1 > would have reset inode 161845 nlinks from 0 to 1 > would have reset inode 167477 nlinks from 0 to 1 > would have reset inode 172341 nlinks from 0 to 1 > would have reset inode 191797 nlinks from 0 to 1 > would have reset inode 204853 nlinks from 0 to 1 > would have reset inode 205365 nlinks from 0 to 1 > would have reset inode 215349 nlinks from 0 to 1 > would have reset inode 215861 nlinks from 0 to 1 > would have reset inode 216373 nlinks from 0 to 1 > would have reset inode 217397 nlinks from 0 to 1 > would have reset inode 224309 nlinks from 0 to 1 > would have reset inode 225589 nlinks from 0 to 1 > would have reset inode 234549 nlinks from 0 to 1 > would have reset inode 234805 nlinks from 0 to 1 > would have reset inode 249653 nlinks from 0 to 1 > would have reset inode 250677 nlinks from 0 to 1 > would have reset inode 252469 nlinks from 0 to 1 > would have reset inode 261429 nlinks from 0 to 1 > would have reset inode 265013 nlinks from 0 to 1 > would have reset inode 266805 nlinks from 0 to 1 > would have reset inode 267317 nlinks from 0 to 1 > would have reset inode 268853 nlinks from 0 to 1 > would have reset inode 272437 nlinks from 0 to 1 > would have reset inode 273205 nlinks from 0 to 1 > would have reset inode 274229 nlinks from 0 to 1 > would have reset inode 278325 nlinks from 0 to 1 > would have reset inode 278837 nlinks from 0 to 1 > would have reset inode 281397 nlinks from 0 to 1 > would have reset inode 292661 nlinks from 0 to 1 > would have reset inode 300853 nlinks from 0 to 1 > would have reset inode 302901 nlinks from 0 to 1 > would have reset inode 305205 nlinks from 0 to 1 > would have reset inode 314165 nlinks from 0 to 1 > would have reset inode 315189 nlinks from 0 to 1 > would have reset inode 320309 nlinks from 0 to 1 > would have reset inode 324917 nlinks from 0 to 1 > would have reset inode 328245 nlinks from 0 to 1 > would have reset inode 335925 nlinks from 0 to 1 > would have reset inode 339253 nlinks from 0 to 1 > would have reset inode 339765 nlinks from 0 to 1 > would have reset inode 348213 nlinks from 0 to 1 > would have reset inode 360501 nlinks from 0 to 1 > would have reset inode 362037 nlinks from 0 to 1 > would have reset inode 366389 nlinks from 0 to 1 > would have reset inode 385845 nlinks from 0 to 1 > would have reset inode 390709 nlinks from 0 to 1 > would have reset inode 409141 nlinks from 0 to 1 > would have reset inode 413237 nlinks from 0 to 1 > would have reset inode 414773 nlinks from 0 to 1 > would have reset inode 417845 nlinks from 0 to 1 > would have reset inode 436021 nlinks from 0 to 1 > would have reset inode 439349 nlinks from 0 to 1 > would have reset inode 447029 nlinks from 0 to 1 > would have reset inode 491317 nlinks from 0 to 1 > would have reset inode 494133 nlinks from 0 to 1 > would have reset inode 495413 nlinks from 0 to 1 > would have reset inode 501301 nlinks from 0 to 1 > would have reset inode 506421 nlinks from 0 to 1 > would have reset inode 508469 nlinks from 0 to 1 > would have reset inode 508981 nlinks from 0 to 1 > would have reset inode 511797 nlinks from 0 to 1 > would have reset inode 513077 nlinks from 0 to 1 > would have reset inode 517941 nlinks from 0 to 1 > would have reset inode 521013 nlinks from 0 to 1 > would have reset inode 522805 nlinks from 0 to 1 > would have reset inode 523317 nlinks from 0 to 1 > would have reset inode 525621 nlinks from 0 to 1 > would have reset inode 527925 nlinks from 0 to 1 > would have reset inode 535605 nlinks from 0 to 1 > would have reset inode 541749 nlinks from 0 to 1 > would have reset inode 573493 nlinks from 0 to 1 > would have reset inode 578613 nlinks from 0 to 1 > would have reset inode 583029 nlinks from 0 to 1 > would have reset inode 585525 nlinks from 0 to 1 > would have reset inode 586293 nlinks from 0 to 1 > would have reset inode 586805 nlinks from 0 to 1 > would have reset inode 591413 nlinks from 0 to 1 > would have reset inode 594485 nlinks from 0 to 1 > would have reset inode 596277 nlinks from 0 to 1 > would have reset inode 603189 nlinks from 0 to 1 > would have reset inode 613429 nlinks from 0 to 1 > would have reset inode 617781 nlinks from 0 to 1 > would have reset inode 621877 nlinks from 0 to 1 > would have reset inode 623925 nlinks from 0 to 1 > would have reset inode 625205 nlinks from 0 to 1 > would have reset inode 626741 nlinks from 0 to 1 > would have reset inode 639541 nlinks from 0 to 1 > would have reset inode 640053 nlinks from 0 to 1 > would have reset inode 640565 nlinks from 0 to 1 > would have reset inode 645173 nlinks from 0 to 1 > would have reset inode 652853 nlinks from 0 to 1 > would have reset inode 656181 nlinks from 0 to 1 > would have reset inode 659253 nlinks from 0 to 1 > would have reset inode 663605 nlinks from 0 to 1 > would have reset inode 667445 nlinks from 0 to 1 > would have reset inode 680757 nlinks from 0 to 1 > would have reset inode 691253 nlinks from 0 to 1 > would have reset inode 691765 nlinks from 0 to 1 > would have reset inode 697653 nlinks from 0 to 1 > would have reset inode 700469 nlinks from 0 to 1 > would have reset inode 707893 nlinks from 0 to 1 > would have reset inode 716853 nlinks from 0 to 1 > would have reset inode 722229 nlinks from 0 to 1 > would have reset inode 722741 nlinks from 0 to 1 > would have reset inode 723765 nlinks from 0 to 1 > would have reset inode 731957 nlinks from 0 to 1 > would have reset inode 742965 nlinks from 0 to 1 > would have reset inode 743477 nlinks from 0 to 1 > would have reset inode 745781 nlinks from 0 to 1 > would have reset inode 746293 nlinks from 0 to 1 > would have reset inode 774453 nlinks from 0 to 1 > would have reset inode 778805 nlinks from 0 to 1 > would have reset inode 785013 nlinks from 0 to 1 > would have reset inode 785973 nlinks from 0 to 1 > would have reset inode 791349 nlinks from 0 to 1 > would have reset inode 796981 nlinks from 0 to 1 > would have reset inode 803381 nlinks from 0 to 1 > would have reset inode 806965 nlinks from 0 to 1 > would have reset inode 811798 nlinks from 0 to 1 > would have reset inode 812310 nlinks from 0 to 1 > would have reset inode 813078 nlinks from 0 to 1 > would have reset inode 813607 nlinks from 0 to 1 > would have reset inode 814183 nlinks from 0 to 1 > would have reset inode 822069 nlinks from 0 to 1 > would have reset inode 828469 nlinks from 0 to 1 > would have reset inode 830005 nlinks from 0 to 1 > would have reset inode 832053 nlinks from 0 to 1 > would have reset inode 832565 nlinks from 0 to 1 > would have reset inode 836661 nlinks from 0 to 1 > would have reset inode 841013 nlinks from 0 to 1 > would have reset inode 841525 nlinks from 0 to 1 > would have reset inode 845365 nlinks from 0 to 1 > would have reset inode 846133 nlinks from 0 to 1 > would have reset inode 847157 nlinks from 0 to 1 > would have reset inode 852533 nlinks from 0 to 1 > would have reset inode 857141 nlinks from 0 to 1 > would have reset inode 863271 nlinks from 0 to 1 > would have reset inode 866855 nlinks from 0 to 1 > would have reset inode 887861 nlinks from 0 to 1 > would have reset inode 891701 nlinks from 0 to 1 > would have reset inode 894773 nlinks from 0 to 1 > would have reset inode 900149 nlinks from 0 to 1 > would have reset inode 902197 nlinks from 0 to 1 > would have reset inode 906293 nlinks from 0 to 1 > would have reset inode 906805 nlinks from 0 to 1 > would have reset inode 909877 nlinks from 0 to 1 > would have reset inode 925493 nlinks from 0 to 1 > would have reset inode 949543 nlinks from 0 to 1 > would have reset inode 955175 nlinks from 0 to 1 > would have reset inode 963623 nlinks from 0 to 1 > would have reset inode 967733 nlinks from 0 to 1 > would have reset inode 968231 nlinks from 0 to 1 > would have reset inode 982069 nlinks from 0 to 1 > would have reset inode 1007413 nlinks from 0 to 1 > would have reset inode 1011509 nlinks from 0 to 1 > would have reset inode 1014069 nlinks from 0 to 1 > would have reset inode 1014581 nlinks from 0 to 1 > would have reset inode 1022005 nlinks from 0 to 1 > would have reset inode 1022517 nlinks from 0 to 1 > would have reset inode 1023029 nlinks from 0 to 1 > would have reset inode 1025333 nlinks from 0 to 1 > would have reset inode 1043765 nlinks from 0 to 1 > would have reset inode 1044789 nlinks from 0 to 1 > would have reset inode 1049397 nlinks from 0 to 1 > would have reset inode 1050933 nlinks from 0 to 1 > would have reset inode 1051445 nlinks from 0 to 1 > would have reset inode 1054261 nlinks from 0 to 1 > would have reset inode 1060917 nlinks from 0 to 1 > would have reset inode 1063477 nlinks from 0 to 1 > would have reset inode 1076021 nlinks from 0 to 1 > would have reset inode 1081141 nlinks from 0 to 1 > would have reset inode 1086261 nlinks from 0 to 1 > would have reset inode 1097269 nlinks from 0 to 1 > would have reset inode 1099829 nlinks from 0 to 1 > would have reset inode 1100853 nlinks from 0 to 1 > would have reset inode 1101877 nlinks from 0 to 1 > would have reset inode 1126709 nlinks from 0 to 1 > would have reset inode 1134389 nlinks from 0 to 1 > would have reset inode 1141045 nlinks from 0 to 1 > would have reset inode 1141557 nlinks from 0 to 1 > would have reset inode 1142581 nlinks from 0 to 1 > would have reset inode 1148469 nlinks from 0 to 1 > would have reset inode 1153333 nlinks from 0 to 1 > would have reset inode 1181749 nlinks from 0 to 1 > would have reset inode 1192245 nlinks from 0 to 1 > would have reset inode 1198133 nlinks from 0 to 1 > would have reset inode 1203765 nlinks from 0 to 1 > would have reset inode 1221429 nlinks from 0 to 1 > would have reset inode 1223989 nlinks from 0 to 1 > would have reset inode 1235509 nlinks from 0 to 1 > would have reset inode 1239349 nlinks from 0 to 1 > would have reset inode 1240885 nlinks from 0 to 1 > would have reset inode 1241397 nlinks from 0 to 1 > would have reset inode 1241909 nlinks from 0 to 1 > would have reset inode 1242421 nlinks from 0 to 1 > would have reset inode 1244981 nlinks from 0 to 1 > would have reset inode 1246517 nlinks from 0 to 1 > would have reset inode 1253429 nlinks from 0 to 1 > would have reset inode 1271861 nlinks from 0 to 1 > would have reset inode 1274677 nlinks from 0 to 1 > would have reset inode 1277749 nlinks from 0 to 1 > would have reset inode 1278773 nlinks from 0 to 1 > would have reset inode 1286709 nlinks from 0 to 1 > would have reset inode 1288245 nlinks from 0 to 1 > would have reset inode 1299765 nlinks from 0 to 1 > would have reset inode 1302325 nlinks from 0 to 1 > would have reset inode 1304885 nlinks from 0 to 1 > would have reset inode 1305397 nlinks from 0 to 1 > would have reset inode 1307509 nlinks from 0 to 1 > would have reset inode 1309493 nlinks from 0 to 1 > would have reset inode 1310517 nlinks from 0 to 1 > would have reset inode 1311029 nlinks from 0 to 1 > would have reset inode 1312053 nlinks from 0 to 1 > would have reset inode 1316917 nlinks from 0 to 1 > would have reset inode 1317941 nlinks from 0 to 1 > would have reset inode 1320821 nlinks from 0 to 1 > would have reset inode 1322805 nlinks from 0 to 1 > would have reset inode 1332789 nlinks from 0 to 1 > would have reset inode 1336373 nlinks from 0 to 1 > would have reset inode 1345653 nlinks from 0 to 1 > would have reset inode 1354549 nlinks from 0 to 1 > would have reset inode 1361973 nlinks from 0 to 1 > would have reset inode 1369909 nlinks from 0 to 1 > would have reset inode 1372981 nlinks from 0 to 1 > would have reset inode 1388853 nlinks from 0 to 1 > would have reset inode 1402933 nlinks from 0 to 1 > would have reset inode 1403445 nlinks from 0 to 1 > would have reset inode 1420085 nlinks from 0 to 1 > would have reset inode 1452853 nlinks from 0 to 1 > would have reset inode 1456437 nlinks from 0 to 1 > would have reset inode 1457973 nlinks from 0 to 1 > would have reset inode 1459253 nlinks from 0 to 1 > would have reset inode 1467957 nlinks from 0 to 1 > would have reset inode 1471541 nlinks from 0 to 1 > would have reset inode 1476661 nlinks from 0 to 1 > would have reset inode 1479733 nlinks from 0 to 1 > would have reset inode 1483061 nlinks from 0 to 1 > would have reset inode 1484085 nlinks from 0 to 1 > would have reset inode 1486133 nlinks from 0 to 1 > would have reset inode 1489461 nlinks from 0 to 1 > would have reset inode 1490037 nlinks from 0 to 1 > would have reset inode 1492021 nlinks from 0 to 1 > would have reset inode 1493557 nlinks from 0 to 1 > would have reset inode 1494069 nlinks from 0 to 1 > would have reset inode 1496885 nlinks from 0 to 1 > would have reset inode 1498421 nlinks from 0 to 1 > would have reset inode 1498933 nlinks from 0 to 1 > would have reset inode 1499957 nlinks from 0 to 1 > would have reset inode 1506101 nlinks from 0 to 1 > would have reset inode 1507637 nlinks from 0 to 1 > would have reset inode 1510453 nlinks from 0 to 1 > would have reset inode 1514293 nlinks from 0 to 1 > would have reset inode 1517365 nlinks from 0 to 1 > would have reset inode 1520693 nlinks from 0 to 1 > would have reset inode 1521973 nlinks from 0 to 1 > would have reset inode 1530421 nlinks from 0 to 1 > would have reset inode 1530933 nlinks from 0 to 1 > would have reset inode 1537333 nlinks from 0 to 1 > would have reset inode 1538357 nlinks from 0 to 1 > would have reset inode 1548853 nlinks from 0 to 1 > would have reset inode 1553973 nlinks from 0 to 1 > would have reset inode 1557301 nlinks from 0 to 1 > would have reset inode 1564213 nlinks from 0 to 1 > would have reset inode 1564725 nlinks from 0 to 1 > would have reset inode 1576501 nlinks from 0 to 1 > would have reset inode 1580597 nlinks from 0 to 1 > would have reset inode 1584693 nlinks from 0 to 1 > would have reset inode 1586485 nlinks from 0 to 1 > would have reset inode 1589301 nlinks from 0 to 1 > would have reset inode 1589813 nlinks from 0 to 1 > would have reset inode 1592629 nlinks from 0 to 1 > would have reset inode 1595701 nlinks from 0 to 1 > would have reset inode 1601077 nlinks from 0 to 1 > would have reset inode 1623861 nlinks from 0 to 1 > would have reset inode 1626677 nlinks from 0 to 1 > would have reset inode 1627701 nlinks from 0 to 1 > would have reset inode 1633333 nlinks from 0 to 1 > would have reset inode 1639221 nlinks from 0 to 1 > would have reset inode 1649205 nlinks from 0 to 1 > would have reset inode 1686325 nlinks from 0 to 1 > would have reset inode 1690677 nlinks from 0 to 1 > would have reset inode 1693749 nlinks from 0 to 1 > would have reset inode 1704757 nlinks from 0 to 1 > would have reset inode 1707061 nlinks from 0 to 1 > would have reset inode 1709109 nlinks from 0 to 1 > would have reset inode 1719349 nlinks from 0 to 1 > would have reset inode 1737013 nlinks from 0 to 1 > would have reset inode 1741365 nlinks from 0 to 1 > would have reset inode 1747509 nlinks from 0 to 1 > would have reset inode 1770805 nlinks from 0 to 1 > would have reset inode 1780789 nlinks from 0 to 1 > would have reset inode 1793589 nlinks from 0 to 1 > would have reset inode 1795125 nlinks from 0 to 1 > would have reset inode 1800757 nlinks from 0 to 1 > would have reset inode 1801269 nlinks from 0 to 1 > would have reset inode 1802549 nlinks from 0 to 1 > would have reset inode 1804085 nlinks from 0 to 1 > would have reset inode 1817141 nlinks from 0 to 1 > would have reset inode 1821749 nlinks from 0 to 1 > would have reset inode 1832757 nlinks from 0 to 1 > would have reset inode 1836341 nlinks from 0 to 1 > would have reset inode 1856309 nlinks from 0 to 1 > would have reset inode 1900597 nlinks from 0 to 1 > would have reset inode 1902901 nlinks from 0 to 1 > would have reset inode 1912373 nlinks from 0 to 1 > would have reset inode 1943093 nlinks from 0 to 1 > would have reset inode 1944373 nlinks from 0 to 1 > would have reset inode 1954101 nlinks from 0 to 1 > would have reset inode 1955893 nlinks from 0 to 1 > would have reset inode 1961781 nlinks from 0 to 1 > would have reset inode 1974325 nlinks from 0 to 1 > would have reset inode 1978677 nlinks from 0 to 1 > would have reset inode 1981237 nlinks from 0 to 1 > would have reset inode 1992245 nlinks from 0 to 1 > would have reset inode 2000949 nlinks from 0 to 1 > would have reset inode 2002229 nlinks from 0 to 1 > would have reset inode 2004789 nlinks from 0 to 1 > would have reset inode 2005301 nlinks from 0 to 1 > would have reset inode 2011189 nlinks from 0 to 1 > would have reset inode 2012981 nlinks from 0 to 1 > would have reset inode 2015285 nlinks from 0 to 1 > would have reset inode 2018869 nlinks from 0 to 1 > would have reset inode 2028341 nlinks from 0 to 1 > would have reset inode 2028853 nlinks from 0 to 1 > would have reset inode 2030901 nlinks from 0 to 1 > would have reset inode 2032181 nlinks from 0 to 1 > would have reset inode 2032693 nlinks from 0 to 1 > would have reset inode 2040117 nlinks from 0 to 1 > would have reset inode 2053685 nlinks from 0 to 1 > would have reset inode 2083893 nlinks from 0 to 1 > would have reset inode 2087221 nlinks from 0 to 1 > would have reset inode 2095925 nlinks from 0 to 1 > would have reset inode 2098741 nlinks from 0 to 1 > would have reset inode 2100533 nlinks from 0 to 1 > would have reset inode 2101301 nlinks from 0 to 1 > would have reset inode 2123573 nlinks from 0 to 1 > would have reset inode 2132789 nlinks from 0 to 1 > would have reset inode 2133813 nlinks from 0 to 1 > > > > > > 2013/4/10 符永涛 > > > The storage info is as following: > RAID-6 > SATA HDD > Controller: PERC H710P Mini (Embedded) > Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes > 255 heads, 63 sectors/track, 3647334 cylinders > Units = cylinders of 16065 * 512 = 8225280 bytes > Sector size (logical/physical): 512 bytes / 512 bytes > I/O size (minimum/optimal): 512 bytes / 512 bytes > Disk identifier: 0x00000000 > > sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (30.0 TB/27.2 > TiB) > sd 0:2:1:0: [sdb] Write Protect is off > sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08 > sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enabled, doesn't > support DPO or FUA > sd 0:2:1:0: [sdb] Attached SCSI disk > > *-storage > description: RAID bus controller > product: MegaRAID SAS 2208 [Thunderbolt] > vendor: LSI Logic / Symbios Logic > physical id: 0 > bus info: pci@0000:02:00.0 > logical name: scsi0 > version: 01 > width: 64 bits > clock: 33MHz > capabilities: storage pm pciexpress vpd msi msix bus_master > cap_list rom > configuration: driver=megaraid_sas latency=0 > resources: irq:42 ioport:fc00(size=256) > memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff > memory:dc800000-dc81ffff(prefetchable) > *-disk:0 > description: SCSI Disk > product: PERC H710P > vendor: DELL > physical id: 2.0.0 > bus info: scsi@0:2.0.0 > logical name: /dev/sda > version: 3.13 > serial: 0049d6ce1d9f2035180096fde490f648 > size: 558GiB (599GB) > capabilities: partitioned partitioned:dos > configuration: ansiversion=5 signature=000aa336 > *-disk:1 > description: SCSI Disk > product: PERC H710P > vendor: DELL > physical id: 2.1.0 > bus info: scsi@0:2.1.0 > logical name: /dev/sdb > logical name: /mnt/xfsd > version: 3.13 > serial: 003366f71da22035180096fde490f648 > size: 27TiB (30TB) > configuration: ansiversion=5 mount.fstype=xfs > mount.options=rw,relatime,attr2,delaylog,logbsize=64k,sunit=128,swidth=1280,noquota > state=mounted > > Thank you. > > > 2013/4/10 Emmanuel Florac > > > Le Tue, 9 Apr 2013 23:10:03 +0800 > 符永涛 > écrivait: > > > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected. > > > Shutting down filesystem > > This. I/O error detected. That means that at some point the > underlying > device (disk, RAID array, SAN volume) couldn't be reached. So this > could very well be a case of a flakey drive, array, cable or SCSI > driver. > > What's the storage setup here? > > -- > ------------------------------------------------------------------------ > Emmanuel Florac | Direction technique > | Intellique > | > > | +33 1 78 94 84 02 > ------------------------------------------------------------------------ > > > > > -- > 符永涛 > > > > > -- > 符永涛 > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > --------------060102000008080400010001 Content-Type: text/plain; charset=UTF-8; name="xfs.stp" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="xfs.stp" LyoKICogdW5saW5rIHBhdGgKICovCgovKiBhc3NlcnQgdGhhdCBubGluayA9PSAwIG9uIGFk ZGl0aW9uIHRvIHRoZSB1bmxpbmtlZCBpbm9kZSBsaXN0ICovCnByb2JlIG1vZHVsZSgieGZz IikuZnVuY3Rpb24oInhmc19pdW5saW5rIikKewoJaWYgKCRpcC0+aV9kLT5kaV9ubGluayA9 PSAwKQoJCW5leHQ7CgoJcHJpbnRmKCJcbi0tLSAlc1xuIiwgcHJvYmVmdW5jKCkpOwoJcHJp bnRmKCJ2YXJzOiAlc1xuIiwgJCR2YXJzKQoJcHJpbnRmKCJpcDogaV9pbm8gPSAweCV4LCBp X2ZsYWdzID0gMHgleFxuIiwgJGlwLT5pX2lubywgJGlwLT5pX2ZsYWdzKTsKICAgICAgICBw cmludGYoImlwLT5pX2Q6IGRpX25saW5rID0gMHgleCwgZGlfZ2VuID0gMHgleFxuIiwgJGlw LT5pX2QtPmRpX25saW5rLCAkaXAtPmlfZC0+ZGlfZ2VuKTsKCXByaW50Zigia2VybmVsIGJh Y2t0cmFjZTpcbiIpOwoJcHJpbnRfYmFja3RyYWNlKCk7CglwcmludGYoInVzZXIgYmFja3Ry YWNlOlxuIik7CglwcmludF91YmFja3RyYWNlKCk7Cn0KCgovKiBjYW4gd2UgY2hlY2sgdGhl IG5saW5rIGNvdW50IHdoZW4gYW4gYWdpIGJ1ZmZlciBpcyB3cml0dGVuIG91dD8/ICovCgov KgogKiByZWNsYWltIHBhdGgKICovCgovKiBpZiB3ZSBmYWlsZWQgdG8gcmVtb3ZlIGFuIHVu bGlua2VkIGlub2RlLCB3aGF0IGlub2RlIGNhdXNlZCB1cyB0byBibG93IHVwPyAqLwovKnBy b2JlIG1vZHVsZSgieGZzIikuc3RhdGVtZW50KCJ4ZnNfaXVubGlua19yZW1vdmVAZnMveGZz L3hmc19pbm9kZS5jOjE3NzkiKSovCnByb2JlIG1vZHVsZSgieGZzIikuZnVuY3Rpb24oInhm c19pdW5saW5rX3JlbW92ZSIpLnJldHVybgp7CgkvKiBFSU5WQUwgKi8KCWlmIChyZXR1cm52 YWwoKSAhPSAyMikKCQluZXh0OwoKICAgICAgICBwcmludGYoIlxuLS0tICVzIC0tICVzIC0t ICVzXG4iLCBwcm9iZWZ1bmMoKSwgcHAoKSwgJCRyZXR1cm4pOwoJcHJpbnRmKCJ2YXJzOiAl c1xuIiwgJCR2YXJzKTsKCXByaW50ZigiaXA6IGlfaW5vID0gMHgleCwgaV9mbGFncyA9IDB4 JXhcbiIsICRpcC0+aV9pbm8sICRpcC0+aV9mbGFncyk7CiAgICAgICAgcHJpbnRmKCJpcC0+ aV9kOiBkaV9ubGluayA9IDB4JXgsIGRpX2dlbiA9IDB4JXhcbiIsICRpcC0+aV9kLT5kaV9u bGluaywgJGlwLT5pX2QtPmRpX2dlbik7Cn0KCi8qCiMgQ2FwdHVyZSBhbiBFSU5WQUwgcmV0 dXJuIGZyb20geGZzX2ltYXAoKSBiYXNlZCBvbiBhbiBpbnZhbGlkIGluby4KcHJvYmUgbW9k dWxlKCJ4ZnMiKS5zdGF0ZW1lbnQoInhmc19pbWFwQGZzL3hmcy94ZnNfaWFsbG9jLmM6MTI4 MyIpCnsKCS8vaWYgKCgkYWdubyA8ICRtcC0+bV9zYi0+c2JfYWdjb3VudCkgJiYgKCRhZ2Ju byA8ICRtcC0+bV9zYi0+c2JfYWdibG9ja3MpKQoJCS8vbmV4dDsKCglwcmludGYoIlxuLS0t ICVzIC0tICVzIC0tIEVJTlZBTCAxXG4iLCBwcm9iZWZ1bmMoKSwgcHAoKSk7CglwcmludGYo InZhcnM6ICVzXG4iLCAkJHZhcnMpOwoJcHJpbnRmKCJtcDogbV9hZ25vX2xvZyA9IDB4JXgs IG1fYWdpbm9fbG9nID0gMHgleFxuIiwgJG1wLT5tX2Fnbm9fbG9nLCAkbXAtPm1fYWdpbm9f bG9nKTsKCXByaW50ZigibXAtPm1fc2I6IHNiX2FnY291bnQgPSAweCV4LCBzYl9hZ2Jsb2Nr cyA9IDB4JXgsIHNiX2lub3BibG9nID0gMHgleCwgc2JfYWdibGtsb2cgPSAweCV4XG4iLAoJ ICAgICAgICRtcC0+bV9zYi0+c2JfYWdjb3VudCwgJG1wLT5tX3NiLT5zYl9hZ2Jsb2Nrcywg JG1wLT5tX3NiLT5zYl9pbm9wYmxvZywgJG1wLT5tX3NiLT5zYl9hZ2Jsa2xvZyk7Cglwcmlu dGYoImtlcm5lbCBiYWNrdHJhY2U6XG4iKTsKCXByaW50X2JhY2t0cmFjZSgpOwoJcHJpbnRm KCJ1c2VyIGJhY2t0cmFjZTpcbiIpOwoJcHJpbnRfdWJhY2t0cmFjZSgpOwp9CiovCgpwcm9i ZSBtb2R1bGUoInhmcyIpLmZ1bmN0aW9uKCJ4ZnNfaW1hcCIpLnJldHVybgp7CgkvKiBFSU5W QUwgKi8KCWlmIChyZXR1cm52YWwoKSAhPSAyMikKCQluZXh0OwoKICAgICAgICBwcmludGYo IlxuLS0tICVzIC0tICVzIC0tICVzXG4iLCBwcm9iZWZ1bmMoKSwgcHAoKSwgJCRyZXR1cm4p OwoKICAgICAgICBwcmludGYoInZhcnM6ICVzXG4iLCAkJHZhcnMpOwoKICAgICAgICBwcmlu dGYoIm1wOiBtX2Fnbm9fbG9nID0gMHgleCwgbV9hZ2lub19sb2cgPSAweCV4XG4iLCAkbXAt Pm1fYWdub19sb2csICRtcC0+bV9hZ2lub19sb2cpOwogICAgICAgIHByaW50ZigibXAtPm1f c2I6IHNiX2FnY291bnQgPSAweCV4LCBzYl9hZ2Jsb2NrcyA9IDB4JXgsIHNiX2lub3BibG9n ID0gMHgleCwgc2JfYWdibGtsb2cgPSAweCV4LCBzYl9kYmxvY2tzID0gMHgleFxuIiwKICAg ICAgICAgICAgICAgJG1wLT5tX3NiLT5zYl9hZ2NvdW50LCAkbXAtPm1fc2ItPnNiX2FnYmxv Y2tzLCAkbXAtPm1fc2ItPnNiX2lub3BibG9nLCAkbXAtPm1fc2ItPnNiX2FnYmxrbG9nLCAk bXAtPm1fc2ItPnNiX2RibG9ja3MpOwoKCS8qCgkgKiB0aGlzIGRvZXNuJ3QgYXBwZWFyIHRv IHByaW50IHZhbGlkIGRhdGEgKGF0IGxlYXN0IGlmIEknbSBtb2RpZnlpbmcKCSAqIHRoZSBj b2RlIGV4cGxpY2l0bHkpLCBidXQgYWxhcyB0aGVyZSBpcyBhbiB4ZnNfYWxlcnQoKSBpZiBp bnZhbGlkLgoJICovCglwcmludGYoImltYXA6IGltX2Jsa25vID0gMHgleCwgaW1fbGVuID0g MHgleCwgaW1fYm9mZnNldCA9IDB4JXhcbiIsCgkgICAgICAgJGltYXAtPmltX2Jsa25vLCAk aW1hcC0+aW1fbGVuLCAkaW1hcC0+aW1fYm9mZnNldCk7CgogICAgICAgIHByaW50Zigia2Vy bmVsIGJhY2t0cmFjZTpcbiIpOwogICAgICAgIHByaW50X2JhY2t0cmFjZSgpOwogICAgICAg IHByaW50ZigidXNlciBiYWNrdHJhY2U6XG4iKTsKICAgICAgICBwcmludF91YmFja3RyYWNl KCk7Cn0KCi8qCiMgQ2FwdHVyZSBhbiBFSU5WQUwgcmV0dXJuIGZyb20geGZzX2ltYXAoKSBi YXNlZCBvbiBhbiBpbnZhbGlkIGltYXAuCnByb2JlIG1vZHVsZSgieGZzIikuc3RhdGVtZW50 KCJ4ZnNfaW1hcEBmcy94ZnMveGZzX2lhbGxvYy5jKzExNSIpCnsKCXByaW50ZigiXG4tLS0g JXMgLS0gJXMgLS0gRUlOVkFMIDJcbiIsIHByb2JlZnVuYygpLCBwcCgpKTsKCXByaW50Zigi dmFyczogJXNcbiIsICQkdmFycyk7CglwcmludGYoImltYXA6IGltX2Jsa25vID0gMHgleCwg aW1fbGVuID0gMHgleCwgaW1fYm9mZnNldCA9IDB4JXhcbiIsCgkgICAgICAgJGltYXAtPmlt X2Jsa25vLCAkaW1hcC0+aW1fbGVuLCAkaW1hcC0+aW1fYm9mZnNldCk7CglwcmludGYoIm1w LT5tX3NiOiBzYl9kYmxvY2tzID0gMHgleFxuIiwgJG1wLT5tX3NiLT5zYl9kYmxvY2tzKTsK CXByaW50Zigia2VybmVsIGJhY2t0cmFjZTpcbiIpOwoJcHJpbnRfYmFja3RyYWNlKCk7Cglw cmludGYoInVzZXIgYmFja3RyYWNlOlxuIik7CglwcmludF91YmFja3RyYWNlKCk7Cn0KKi8K --------------060102000008080400010001-- From shhuiw@gmail.com Thu Apr 11 18:50:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 ED0A07F37 for ; Thu, 11 Apr 2013 18:50:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D43F78F8054 for ; Thu, 11 Apr 2013 16:50:02 -0700 (PDT) X-ASG-Debug-ID: 1365724201-04cbb057f7b6270001-NocioJ Received: from mail-pa0-f49.google.com (mail-pa0-f49.google.com [209.85.220.49]) by cuda.sgi.com with ESMTP id H8Mch8ahN1kD6RiJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 16:50:01 -0700 (PDT) X-Barracuda-Envelope-From: shhuiw@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.49 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.49] Received: by mail-pa0-f49.google.com with SMTP id kp14so1146415pab.22 for ; Thu, 11 Apr 2013 16:50:01 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.49] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.49] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=9coLdqoh6BwARA6L50gxQtQjOxe6PP+COVn3CMXqz5k=; b=xCRx0ZH+SaFoXnVP0aIlA9A406xMmudZJuSxmp4nXXAZ+nZdcV24TLe5efzYP4CTHH pUbwsbq0NoIxlgRx9bEjb2tuGDDhhBFa51LVJodliYN2G1O/YthaMMVTTHV+P5yjUOFY JMIR6sPdytykeTro1sKwvSxQZQKx6S9w8Xh2OddarMC/2zjlNhxExoQ9mgXB/iQT1J5V EsUs+EhKMlBBKEnkjCu6lK3rsVg8vjAcl6IsGVd671dqoccDJhcvFNHIqDA9TjPE95lq jpx+3RM/EQa8O/9EJx8Sxi3+eo3lNsxkxoypC6GhD5O3wy48XErP4lXm3bft+2Bb8cgR 16ew== X-Received: by 10.67.14.105 with SMTP id ff9mr12487620pad.101.1365724200921; Thu, 11 Apr 2013 16:50:00 -0700 (PDT) Received: from [9.115.120.152] ([202.108.130.138]) by mx.google.com with ESMTPS id ky10sm6761141pab.23.2013.04.11.16.49.58 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 11 Apr 2013 16:50:00 -0700 (PDT) Message-ID: <51674C1E.9090606@gmail.com> Date: Fri, 12 Apr 2013 07:49:50 +0800 From: Wang Sheng-Hui User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Rich Johnston CC: Dave Chinner , xfstests Subject: Re: [PATCH] xfstests: make install support common/ and tests/ dirs References: <5166BA24.1060809@gmail.com> <5166D6BE.4050907@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: make install support common/ and tests/ dirs In-Reply-To: <5166D6BE.4050907@sgi.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-pa0-f49.google.com[209.85.220.49] X-Barracuda-Start-Time: 1365724201 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127853 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 2013年04月11日 23:29, Rich Johnston wrote: > Wang Sheng-Hui, > > The patch to Makefile would not apply. This is what I used to review. > > diff --git a/Makefile b/Makefile > index 6edd55c..73214ab 100644 > --- a/Makefile > +++ b/Makefile > @@ -52,12 +52,15 @@ LDIRT += $(SRCTAR) > endif > > LIB_SUBDIRS = include lib > -TOOL_SUBDIRS = ltp src m4 > +TOOL_SUBDIRS = ltp src m4 common > ifeq ($(HAVE_DMAPI), true) > TOOL_SUBDIRS += dmapi > endif > > -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) > +# all the tests have been put into tests/ > +TESTS_SUBDIR = tests > + > +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_SUBDIR) > > default: include/builddefs $(DMAPI_MAKEFILE) $(TESTS) > ifeq ($(HAVE_BUILDDEFS), no) > @@ -91,12 +94,7 @@ depend: include/builddefs $(addsuffix -depend,$(SUBDIRS)) > install: default $(addsuffix -install,$(SUBDIRS)) > $(INSTALL) -m 755 -d $(PKG_LIB_DIR) > $(INSTALL) -m 755 check $(PKG_LIB_DIR) > - $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) > - $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) > - $(INSTALL) -m 644 group $(PKG_LIB_DIR) Hi Rich, This is the different point. When I scratched the patch against the xfstests( pulled from the git tree, should be the latest, I think), there is one file "group" under the topdir. .../xfstests$ pwd .../xfstests .../xfstests$ ls | grep group group .../xfstests$ cat group # QA groups control file # Defines test groups and nominal group owners # - do not start group names with a digit # - comment line before each group is "new" description # The top "group" file is useless, I think. Will you please help fixup the patch? Thanks for your support! Regards, Sheng-Hui > $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) > - $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) > - $(INSTALL) -m 644 common* $(PKG_LIB_DIR) > > # Nothing. > install-dev install-lib: > > Here is your original: > >> diff --git a/Makefile b/Makefile >> index 6edd55c..95e3e5d 100644 >> --- a/Makefile >> +++ b/Makefile >> @@ -52,12 +52,15 @@ LDIRT += $(SRCTAR) >> endif >> >> LIB_SUBDIRS = include lib >> -TOOL_SUBDIRS = ltp src m4 >> +TOOL_SUBDIRS = ltp src m4 common >> ifeq ($(HAVE_DMAPI), true) >> TOOL_SUBDIRS += dmapi >> endif >> >> -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) >> +# all the tests have been put into tests/ >> +TESTS_SUBDIR = tests >> + >> +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_SUBDIR) >> >> default: include/builddefs $(DMAPI_MAKEFILE) $(TESTS) >> ifeq ($(HAVE_BUILDDEFS), no) >> @@ -91,12 +94,8 @@ depend: include/builddefs $(addsuffix >> -depend,$(SUBDIRS)) >> install: default $(addsuffix -install,$(SUBDIRS)) >> $(INSTALL) -m 755 -d $(PKG_LIB_DIR) >> $(INSTALL) -m 755 check $(PKG_LIB_DIR) >> - $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) >> - $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) >> $(INSTALL) -m 644 group $(PKG_LIB_DIR) > oops somehow the above line was not deleted >> $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) >> - $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) >> - $(INSTALL) -m 644 common* $(PKG_LIB_DIR) >> >> # Nothing. >> install-dev install-lib: > > The rest of the patch looked good. If you agree with my slight mod then I will put my Reviewed-by and commit it. > > Thanks > --Rich From david@fromorbit.com Thu Apr 11 19:25:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 33AE77F37 for ; Thu, 11 Apr 2013 19:25:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1E46D8F8094 for ; Thu, 11 Apr 2013 17:25:17 -0700 (PDT) X-ASG-Debug-ID: 1365726312-04cbb057f8b85a0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id Gx1GSPAtGzBe6GMp for ; Thu, 11 Apr 2013 17:25:12 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApUVAPdTZ1F5LLHC/2dsb2JhbABGCoMGvHKFGAQBgQcXdIIfAQEEATocHgUFCwgDGAkMGQ8FJQMhExQHh3MFvTIVjUUFGoEdBwqCVmEDlwGREIMdKoEv Received: from ppp121-44-177-194.lns20.syd7.internode.on.net (HELO dastard) ([121.44.177.194]) by ipmail07.adl2.internode.on.net with ESMTP; 12 Apr 2013 09:54:40 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQRnC-0007nC-SR; Fri, 12 Apr 2013 10:24:38 +1000 Date: Fri, 12 Apr 2013 10:24:38 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy Message-ID: <20130412002438.GC31207@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: reserve fields in inode for parent ptr and alloc policy References: <20130410182438.268267840@sgi.com> <20130411030057.GF10481@dastard> <5166C08C.8000200@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5166C08C.8000200@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1365726312 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127855 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 11, 2013 at 08:54:20AM -0500, Mark Tinguely wrote: > On 04/10/13 22:00, Dave Chinner wrote: > >On Wed, Apr 10, 2013 at 01:24:24PM -0500, Mark Tinguely wrote: > >>Reserve fields in new inode layout for parent pointer and > >>allocation policy. > > > >Not without a design review - there is no way we are going to > >blindly reserve space in any on-disk structure without first having > >a solid design, published proof-of-concept code and agreement that > >the format changes being proposed are the right way to proceed. > > > >Where are the design docs/code for these features? > > Then you might want to bump the pad size. Not without good reason. Padding is not designed to accomodate new features that require 16 bytes of core inode space. If you need that amount of space in the inode, we have EAs for that.... The plan of record for the past 5-6 years has been that parent pointers require an arbitrary amount of space in the inode so they need to be entirely EA based. Hence I'm not prepared to agree to an inode core change for a shiny new parent pointer implementation I first heard about 2 days ago and know absolutely nothing about. You need to show everyone the code so we can get some idea of what benefit putting this information in the inode core will bring us over a purely EA based implementation. FWIW, inodes are versioned and it's trivial to bump the inode version and add feature bit if an inode core format change is absolutely necessary. From that perspective, I don't see any need to rush a change at this point in time. > >> ---- > >>The inode will hold the parent information for the first > >>link to a file. Information for the other links will be > >>held in extended attribute entries. > >> > >>The "di_parino" is the inode of the parent directory. The > >>directory information for this entry is located the parent > >>directory with "di_paroff" offset. > >> > >>The di_parino/di_paroff concept code is running. > > > >How does it handle hard links? (i.e. multiple parents) > > As I stated, the hard links will use extended attribute entries. That will add significant complexity of the implementation. > >Also, inode number is not enough for unique identification of the > >parent - generation number is also required. > > Per the 2005 XFS features meeting, I was at those meetings and wasn't allowed to keep a copy of those notes when I left SGI. If you want to refer to them, you'll need to post the notes so everyone knows what was discussed. ;) > the inode and directory offset > will uniquely describe a link It doesn't, though. An inode can only be uniquely identified by the combination of the inode+generation number. The inode number identifies an inode, but it doesn't identify the lifecycle instance of the inode that the reference is valid for. If this parent pointer link is going to be in any way useful for metadata scrubbing and repair, then it has to identify the instance of the parent inode that it points to. Note that I'm not saying that the EA format in the 2009 patch set is perfect - I think it needs a couple of significant tweaks. What I am saying is that there is good reasons for the format of information in that EA. > - (thank-you to Glen Overby for that > observation). The concept code just using one link verifies this > fact. Using the inode/offset as the identifier is compact and also > gives information to the file name. Yup, using d_off was also considered, but has problems, too. The problem with pointing to the directory offset is that if the directory is rebuilt for any reason (e.g. by xfs_repair), then the directory offset in the child inodes is now invalid and needs to also be fixed. And then you have the problem of needing multiple parent links for a single parent directory as you have to instantiate every single hard link to the same directory. In the current EA patchset, this does not occur as the parent structure simply counts the number of references to a given parent directory. The EA approach just points to the parent directory and keeps a count of the number of links back to the directory. Hence as long as repair doesn't reallocate the directory inode, the parent pointer information remains intact. i.e. There is less dependency between the objects and so the format is much more robust against unexpected changes to directory structures. This concedes the fact that inode number to name resolution needs to be a userspace problem. This is something we have to conceed because the presence of namespaces, security models, bind mounts and chroot environments use top-down path traversal to limit what part of the filesystem a userspace process can actually see. In-kernel resolution of reverse path names is a potential vector for information leakage between namespaces and at it's worst, a provide a method for escape. Hence there are security concerns about parent pointers that we have to take into account as well. The EA approach is also allows more flexibility for potential future directory features. For example: online defragmentation. If we want defrag to be able to compact directories into a contiguous address space, we need to be able to change the offsets of the data entries. We can do this if there are no open references to the directory at the time of the defrag. However, if we fix the offsets of directory entries in the child inode parent pointers, then this form of defrag becomes impossible to implement as we cannot update the directory and all the child inodes atomically from a userspace or transactional POV. IOWs, the parent pointer format containing an exact directory offset also limits what we can do with directories in future.... > >That uses xattrs to store parent information - inode #, generation > >#, and a counter - for each parent. It requires a counter because > >you can have the same inode hard linked into the same parent > >directory multiple times: > > > >typedef struct xfs_parent_eaname_rec { > > __be64 p_ino; > > __be32 p_gen; > > __be32 p_cnt; > >} xfs_parent_eaname_rec_t; > > > >And a transaction appended to the the inode create, link, rename and > >remove operations to manage the xattrs so all cases involving hard > >links work just fine. > > > >Indeed, the single di_parino/di_paroff concept was one of the > >original designs considered because of it's simplicity, but it was > >rejected because of that very simplicity - it cannot handle common > >use cases involving hardlinks. > > According to Geoffrey's notes, the hybrid approach was discussed > too. The single link case will save all the EA operations for the > majority of the inodes. Sure, those meetings were brain storming about how we *might* solve a problem, but keep in mind the context of those meetings was that all the first and second generation XFS gurus had left SGI and in that vaccuum nobody left at SGI fully understood the problem domains being discussed. As such, there were some really crazy ideas discussed and documented, but that doesn't mean they were the best solution or even a good idea. We came up with several possible ways to implement parent pointers, but the real world sorted them out pretty quickly after the brain storming sessions. Indeed, the real world broke the initial implementation of parent pointers pretty quickly. You may not know the entire history, but XFS on Irix effectively ended up with a useless, broken parent pointer implementation because it was implemented quickly based on assumptions made in those brainstorming seesions meeting. i.e. still without fully understanding the problem space. The limitations the Irix implementation exposed resulted in it being thrown away completely and redesigned for Linux. IOWs, the EA based patchset is what evolved from the hard lessons that Irix taught us.... > >Release early, release often? > > No, trust but verify. Verification can't be done if you don't tell us anything about what you are doing. Verification needs to be done at the design/POC phase just as much as at the final patch review stage, because there are many parties that have different requirements for the same feature. Open source development is supposed to be, well, open. Public. Not behind closed doors. Design is open, implementation is open, flamewars aout stuff are out there in public. Nothing is done behind closed doors. Saying "we're doing X" and then not telling anyone about it is the antithesis of OSS. It -excludes- the community from the process of developing the new features, and prevents them from verifying what you are doing is suitable for their needs. IOWs, there is no possibility of "trust, but verify" in OSS without "release early, release often". You develop trust by being open and allowing people to review and verify what you are doing at every stage of development - from POC through to production code. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 11 19:41:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 024B67F37 for ; Thu, 11 Apr 2013 19:41:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 99020AC003 for ; Thu, 11 Apr 2013 17:41:33 -0700 (PDT) X-ASG-Debug-ID: 1365727291-04bdf02d1cb64f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 9QWHs2QebdmBg5SW for ; Thu, 11 Apr 2013 17:41:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApQVAHtXZ1F5LLHC/2dsb2JhbABQgwa8coUYBAGBBxd0gh8BAQQBOhwjBQsIAxgJJQ8FDRgDIROIAgMJBbNJDYldFYwugTaBHQeCYGEDlR+BYot0hRyDHSo Received: from ppp121-44-177-194.lns20.syd7.internode.on.net (HELO dastard) ([121.44.177.194]) by ipmail07.adl2.internode.on.net with ESMTP; 12 Apr 2013 10:11:31 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQS3W-0007on-JL; Fri, 12 Apr 2013 10:41:30 +1000 Date: Fri, 12 Apr 2013 10:41:30 +1000 From: Dave Chinner To: Wang Sheng-Hui Cc: Dave Chinner , xfstests Subject: Re: [PATCH] xfstests: make install support common/ and tests/ dirs Message-ID: <20130412004130.GD31207@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: make install support common/ and tests/ dirs References: <5166BA24.1060809@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5166BA24.1060809@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1365727291 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127855 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 11, 2013 at 09:27:00PM +0800, Wang Sheng-Hui wrote: > xfstests have some change on the organization of the testcases > and common* files: > * The common* scripts have been reorganized into the common/ dir. > * The testcases have been reorganized into sub test dirs under tests/. > * The run.* scripts have been removed. > > This patch uses the simple way to make install support above changes: > Make up one Makefile for each newly created subdirs, which can control > 'make install' separately. Thanks for doing this! Comments below. > Signed-off-by: Wang Sheng-Hui > --- > Makefile | 11 +++++------ > common/Makefile | 17 +++++++++++++++++ > tests/Makefile | 23 +++++++++++++++++++++++ > tests/btrfs/Makefile | 21 +++++++++++++++++++++ > tests/ext4/Makefile | 21 +++++++++++++++++++++ > tests/generic/Makefile | 21 +++++++++++++++++++++ > tests/shared/Makefile | 21 +++++++++++++++++++++ > tests/udf/Makefile | 21 +++++++++++++++++++++ > tests/xfs/Makefile | 21 +++++++++++++++++++++ > 9 files changed, 171 insertions(+), 6 deletions(-) > create mode 100644 common/Makefile > create mode 100644 tests/Makefile > create mode 100644 tests/btrfs/Makefile > create mode 100644 tests/ext4/Makefile > create mode 100644 tests/generic/Makefile > create mode 100644 tests/shared/Makefile > create mode 100644 tests/udf/Makefile > create mode 100644 tests/xfs/Makefile > > diff --git a/Makefile b/Makefile > index 6edd55c..95e3e5d 100644 > --- a/Makefile > +++ b/Makefile > @@ -52,12 +52,15 @@ LDIRT += $(SRCTAR) > endif > > LIB_SUBDIRS = include lib > -TOOL_SUBDIRS = ltp src m4 > +TOOL_SUBDIRS = ltp src m4 common > ifeq ($(HAVE_DMAPI), true) > TOOL_SUBDIRS += dmapi > endif > > -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) > +# all the tests have been put into tests/ > +TESTS_SUBDIR = tests No need for the comment - it's redundant.... > +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_SUBDIR) > > default: include/builddefs $(DMAPI_MAKEFILE) $(TESTS) > ifeq ($(HAVE_BUILDDEFS), no) > @@ -91,12 +94,8 @@ depend: include/builddefs $(addsuffix -depend,$(SUBDIRS)) > install: default $(addsuffix -install,$(SUBDIRS)) > $(INSTALL) -m 755 -d $(PKG_LIB_DIR) > $(INSTALL) -m 755 check $(PKG_LIB_DIR) > - $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) > - $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) > $(INSTALL) -m 644 group $(PKG_LIB_DIR) > $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) > - $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) > - $(INSTALL) -m 644 common* $(PKG_LIB_DIR) > > # Nothing. > install-dev install-lib: > diff --git a/common/Makefile b/common/Makefile > new file mode 100644 > index 0000000..649f55f > --- /dev/null > +++ b/common/Makefile > @@ -0,0 +1,17 @@ > +# > +# Copyright (c) 2003-2006 Silicon Graphics, Inc. All Rights Reserved. > +# > + > +TOPDIR = .. > +include $(TOPDIR)/include/builddefs > + > +# current ../common dir > +COMMON_SUBDIR = common Same, the comment is redundant. Also, it's not a subdir, so: COMMON_DIR = common The same changes for all the other makefiles, too. > + > +include $(BUILDRULES) > + > +install: > + $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/$(COMMON_SUBDIR) > + $(INSTALL) -m 644 * $(PKG_LIB_DIR)/$(COMMON_SUBDIR) > + > +install-dev install-lib: > diff --git a/tests/Makefile b/tests/Makefile > new file mode 100644 > index 0000000..50e6bb3 > --- /dev/null > +++ b/tests/Makefile > @@ -0,0 +1,23 @@ > +# > +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. > +# > + > +TOPDIR = .. > +include $(TOPDIR)/include/builddefs > + > +# current ../tests dir > +TESTS_SUBDIR = tests > +export TESTS_SUBDIR Why export that here? why not in the top level makefile? > + > +TESTS_SUBDIRS = btrfs ext4 generic shared udf xfs TESTS_SUBDIR/TESTS_SUBDIRS are way too similar. TESTS_DIR and TESTS_SUBDIRS are fine, this I don't think you need to specify Indeed, because this is just iterating sub directories, something like: TESTS_SUBDIRS = $(dir $(wildcard $(PKG_LIB_DIR)/$(TESTS_DIR))) means that we don't need to modify the makefile if we add more directories at a later date. Or if people want to add their own custom test directories... Otherwise it looks ok. Cheers, Dave. -- Dave Chinner david@fromorbit.com From yongtaofu@gmail.com Thu Apr 11 19:46:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 693DB7F37 for ; Thu, 11 Apr 2013 19:46:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6E97AC001 for ; Thu, 11 Apr 2013 17:46:02 -0700 (PDT) X-ASG-Debug-ID: 1365727558-04cbb057f8b9d40001-NocioJ Received: from mail-ie0-f173.google.com (mail-ie0-f173.google.com [209.85.223.173]) by cuda.sgi.com with ESMTP id 9kHN52kVgFzYTTVP (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 17:45:59 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.173 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.173] Received: by mail-ie0-f173.google.com with SMTP id 10so2711480ied.32 for ; Thu, 11 Apr 2013 17:45:58 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.173] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.173] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=aSHVFVXDUgseH2avQrLlQe7+kGTm+xmPk6uxeFgJ3cA=; b=QbTN+drkSUI1dUP3aoapbF4/sFjjZqJlpM7/5Zcvt4ucMz2Fixbij7y73SnNLck+cS EqK9wP+0hG8KNBYdKaPqZT3Vim1eqpagg/23yFRONbK4ZmbQtkD/E7ksc0+TLkwBDbit 610sM+lxrme670KaLQK9ZAVS5cAwG+7P7Cikp+x9awQbc7pZK/ggW9Sx2yY6YlJBOUFI QXeAEHYTDZJImF95z2e0D+HvVjvT0LRPKxs31D38Y79SyCrCOMZCmNWUPPAfbcCwy4Rk XfDt3EayNdSAQuxrscbK5cj/YF0cB7uKPorHJqvizrF/e89Y6AVCUxLtW5AVpxciW1Fn +KGQ== MIME-Version: 1.0 X-Received: by 10.50.192.165 with SMTP id hh5mr246799igc.89.1365727558632; Thu, 11 Apr 2013 17:45:58 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Thu, 11 Apr 2013 17:45:58 -0700 (PDT) In-Reply-To: <516746AC.3090808@redhat.com> References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> Date: Fri, 12 Apr 2013 08:45:58 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Emmanuel Florac , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340865fe58f004da1f39e8 X-Barracuda-Connect: mail-ie0-f173.google.com[209.85.223.173] X-Barracuda-Start-Time: 1365727559 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.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_SA038b, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127855 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.20 BSF_SC0_SA038b Custom Rule SA038b --14dae9340865fe58f004da1f39e8 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable the workload is about: 24 servers, replica(3) which means the distribute is 8 load is about 3(TB)-8(TB) per day. 2013/4/12 Brian Foster > On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote: > > It happens tonight again on one of our servers, how to debug the root > > cause? Thank you. > > > > Hi, > > I've attached a system tap script (stap -v xfs.stp) that should > hopefully print out a bit more data should the issue happen again. Do > you have a small enough number of nodes (or predictable enough pattern) > that you could run this on the nodes that tend to fail and collect the > output? > > Also, could you collect an xfs_metadump of the filesystem in question > and make it available for download and analysis somewhere? I believe the > ideal approach is to mount/umount the filesystem first to replay the log > before collecting a metadump, but somebody could correct me on that (to > be safe, you could collect multiple dumps: pre-mount and post-mount). > > Could you also describe your workload a little bit? Thanks. > > Brian > > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > > xfs_inotobp() returned error 22. > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree returne= d > > error 22 > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) > > called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = =3D > > 0xffffffffa02ee20a > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting > > down filesystem > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem an= d > > rectify the problem(s) > > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned= . > > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned= . > > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned= . > > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned= . > > > > xfs_repair -n > > > > > > Phase 7 - verify link counts... > > would have reset inode 20021 nlinks from 0 to 1 > > would have reset inode 20789 nlinks from 0 to 1 > > would have reset inode 35125 nlinks from 0 to 1 > > would have reset inode 35637 nlinks from 0 to 1 > > would have reset inode 36149 nlinks from 0 to 1 > > would have reset inode 38197 nlinks from 0 to 1 > > would have reset inode 39477 nlinks from 0 to 1 > > would have reset inode 54069 nlinks from 0 to 1 > > would have reset inode 62261 nlinks from 0 to 1 > > would have reset inode 63029 nlinks from 0 to 1 > > would have reset inode 72501 nlinks from 0 to 1 > > would have reset inode 79925 nlinks from 0 to 1 > > would have reset inode 81205 nlinks from 0 to 1 > > would have reset inode 84789 nlinks from 0 to 1 > > would have reset inode 87861 nlinks from 0 to 1 > > would have reset inode 90663 nlinks from 0 to 1 > > would have reset inode 91189 nlinks from 0 to 1 > > would have reset inode 95541 nlinks from 0 to 1 > > would have reset inode 98101 nlinks from 0 to 1 > > would have reset inode 101173 nlinks from 0 to 1 > > would have reset inode 113205 nlinks from 0 to 1 > > would have reset inode 114741 nlinks from 0 to 1 > > would have reset inode 126261 nlinks from 0 to 1 > > would have reset inode 140597 nlinks from 0 to 1 > > would have reset inode 144693 nlinks from 0 to 1 > > would have reset inode 147765 nlinks from 0 to 1 > > would have reset inode 152885 nlinks from 0 to 1 > > would have reset inode 161333 nlinks from 0 to 1 > > would have reset inode 161845 nlinks from 0 to 1 > > would have reset inode 167477 nlinks from 0 to 1 > > would have reset inode 172341 nlinks from 0 to 1 > > would have reset inode 191797 nlinks from 0 to 1 > > would have reset inode 204853 nlinks from 0 to 1 > > would have reset inode 205365 nlinks from 0 to 1 > > would have reset inode 215349 nlinks from 0 to 1 > > would have reset inode 215861 nlinks from 0 to 1 > > would have reset inode 216373 nlinks from 0 to 1 > > would have reset inode 217397 nlinks from 0 to 1 > > would have reset inode 224309 nlinks from 0 to 1 > > would have reset inode 225589 nlinks from 0 to 1 > > would have reset inode 234549 nlinks from 0 to 1 > > would have reset inode 234805 nlinks from 0 to 1 > > would have reset inode 249653 nlinks from 0 to 1 > > would have reset inode 250677 nlinks from 0 to 1 > > would have reset inode 252469 nlinks from 0 to 1 > > would have reset inode 261429 nlinks from 0 to 1 > > would have reset inode 265013 nlinks from 0 to 1 > > would have reset inode 266805 nlinks from 0 to 1 > > would have reset inode 267317 nlinks from 0 to 1 > > would have reset inode 268853 nlinks from 0 to 1 > > would have reset inode 272437 nlinks from 0 to 1 > > would have reset inode 273205 nlinks from 0 to 1 > > would have reset inode 274229 nlinks from 0 to 1 > > would have reset inode 278325 nlinks from 0 to 1 > > would have reset inode 278837 nlinks from 0 to 1 > > would have reset inode 281397 nlinks from 0 to 1 > > would have reset inode 292661 nlinks from 0 to 1 > > would have reset inode 300853 nlinks from 0 to 1 > > would have reset inode 302901 nlinks from 0 to 1 > > would have reset inode 305205 nlinks from 0 to 1 > > would have reset inode 314165 nlinks from 0 to 1 > > would have reset inode 315189 nlinks from 0 to 1 > > would have reset inode 320309 nlinks from 0 to 1 > > would have reset inode 324917 nlinks from 0 to 1 > > would have reset inode 328245 nlinks from 0 to 1 > > would have reset inode 335925 nlinks from 0 to 1 > > would have reset inode 339253 nlinks from 0 to 1 > > would have reset inode 339765 nlinks from 0 to 1 > > would have reset inode 348213 nlinks from 0 to 1 > > would have reset inode 360501 nlinks from 0 to 1 > > would have reset inode 362037 nlinks from 0 to 1 > > would have reset inode 366389 nlinks from 0 to 1 > > would have reset inode 385845 nlinks from 0 to 1 > > would have reset inode 390709 nlinks from 0 to 1 > > would have reset inode 409141 nlinks from 0 to 1 > > would have reset inode 413237 nlinks from 0 to 1 > > would have reset inode 414773 nlinks from 0 to 1 > > would have reset inode 417845 nlinks from 0 to 1 > > would have reset inode 436021 nlinks from 0 to 1 > > would have reset inode 439349 nlinks from 0 to 1 > > would have reset inode 447029 nlinks from 0 to 1 > > would have reset inode 491317 nlinks from 0 to 1 > > would have reset inode 494133 nlinks from 0 to 1 > > would have reset inode 495413 nlinks from 0 to 1 > > would have reset inode 501301 nlinks from 0 to 1 > > would have reset inode 506421 nlinks from 0 to 1 > > would have reset inode 508469 nlinks from 0 to 1 > > would have reset inode 508981 nlinks from 0 to 1 > > would have reset inode 511797 nlinks from 0 to 1 > > would have reset inode 513077 nlinks from 0 to 1 > > would have reset inode 517941 nlinks from 0 to 1 > > would have reset inode 521013 nlinks from 0 to 1 > > would have reset inode 522805 nlinks from 0 to 1 > > would have reset inode 523317 nlinks from 0 to 1 > > would have reset inode 525621 nlinks from 0 to 1 > > would have reset inode 527925 nlinks from 0 to 1 > > would have reset inode 535605 nlinks from 0 to 1 > > would have reset inode 541749 nlinks from 0 to 1 > > would have reset inode 573493 nlinks from 0 to 1 > > would have reset inode 578613 nlinks from 0 to 1 > > would have reset inode 583029 nlinks from 0 to 1 > > would have reset inode 585525 nlinks from 0 to 1 > > would have reset inode 586293 nlinks from 0 to 1 > > would have reset inode 586805 nlinks from 0 to 1 > > would have reset inode 591413 nlinks from 0 to 1 > > would have reset inode 594485 nlinks from 0 to 1 > > would have reset inode 596277 nlinks from 0 to 1 > > would have reset inode 603189 nlinks from 0 to 1 > > would have reset inode 613429 nlinks from 0 to 1 > > would have reset inode 617781 nlinks from 0 to 1 > > would have reset inode 621877 nlinks from 0 to 1 > > would have reset inode 623925 nlinks from 0 to 1 > > would have reset inode 625205 nlinks from 0 to 1 > > would have reset inode 626741 nlinks from 0 to 1 > > would have reset inode 639541 nlinks from 0 to 1 > > would have reset inode 640053 nlinks from 0 to 1 > > would have reset inode 640565 nlinks from 0 to 1 > > would have reset inode 645173 nlinks from 0 to 1 > > would have reset inode 652853 nlinks from 0 to 1 > > would have reset inode 656181 nlinks from 0 to 1 > > would have reset inode 659253 nlinks from 0 to 1 > > would have reset inode 663605 nlinks from 0 to 1 > > would have reset inode 667445 nlinks from 0 to 1 > > would have reset inode 680757 nlinks from 0 to 1 > > would have reset inode 691253 nlinks from 0 to 1 > > would have reset inode 691765 nlinks from 0 to 1 > > would have reset inode 697653 nlinks from 0 to 1 > > would have reset inode 700469 nlinks from 0 to 1 > > would have reset inode 707893 nlinks from 0 to 1 > > would have reset inode 716853 nlinks from 0 to 1 > > would have reset inode 722229 nlinks from 0 to 1 > > would have reset inode 722741 nlinks from 0 to 1 > > would have reset inode 723765 nlinks from 0 to 1 > > would have reset inode 731957 nlinks from 0 to 1 > > would have reset inode 742965 nlinks from 0 to 1 > > would have reset inode 743477 nlinks from 0 to 1 > > would have reset inode 745781 nlinks from 0 to 1 > > would have reset inode 746293 nlinks from 0 to 1 > > would have reset inode 774453 nlinks from 0 to 1 > > would have reset inode 778805 nlinks from 0 to 1 > > would have reset inode 785013 nlinks from 0 to 1 > > would have reset inode 785973 nlinks from 0 to 1 > > would have reset inode 791349 nlinks from 0 to 1 > > would have reset inode 796981 nlinks from 0 to 1 > > would have reset inode 803381 nlinks from 0 to 1 > > would have reset inode 806965 nlinks from 0 to 1 > > would have reset inode 811798 nlinks from 0 to 1 > > would have reset inode 812310 nlinks from 0 to 1 > > would have reset inode 813078 nlinks from 0 to 1 > > would have reset inode 813607 nlinks from 0 to 1 > > would have reset inode 814183 nlinks from 0 to 1 > > would have reset inode 822069 nlinks from 0 to 1 > > would have reset inode 828469 nlinks from 0 to 1 > > would have reset inode 830005 nlinks from 0 to 1 > > would have reset inode 832053 nlinks from 0 to 1 > > would have reset inode 832565 nlinks from 0 to 1 > > would have reset inode 836661 nlinks from 0 to 1 > > would have reset inode 841013 nlinks from 0 to 1 > > would have reset inode 841525 nlinks from 0 to 1 > > would have reset inode 845365 nlinks from 0 to 1 > > would have reset inode 846133 nlinks from 0 to 1 > > would have reset inode 847157 nlinks from 0 to 1 > > would have reset inode 852533 nlinks from 0 to 1 > > would have reset inode 857141 nlinks from 0 to 1 > > would have reset inode 863271 nlinks from 0 to 1 > > would have reset inode 866855 nlinks from 0 to 1 > > would have reset inode 887861 nlinks from 0 to 1 > > would have reset inode 891701 nlinks from 0 to 1 > > would have reset inode 894773 nlinks from 0 to 1 > > would have reset inode 900149 nlinks from 0 to 1 > > would have reset inode 902197 nlinks from 0 to 1 > > would have reset inode 906293 nlinks from 0 to 1 > > would have reset inode 906805 nlinks from 0 to 1 > > would have reset inode 909877 nlinks from 0 to 1 > > would have reset inode 925493 nlinks from 0 to 1 > > would have reset inode 949543 nlinks from 0 to 1 > > would have reset inode 955175 nlinks from 0 to 1 > > would have reset inode 963623 nlinks from 0 to 1 > > would have reset inode 967733 nlinks from 0 to 1 > > would have reset inode 968231 nlinks from 0 to 1 > > would have reset inode 982069 nlinks from 0 to 1 > > would have reset inode 1007413 nlinks from 0 to 1 > > would have reset inode 1011509 nlinks from 0 to 1 > > would have reset inode 1014069 nlinks from 0 to 1 > > would have reset inode 1014581 nlinks from 0 to 1 > > would have reset inode 1022005 nlinks from 0 to 1 > > would have reset inode 1022517 nlinks from 0 to 1 > > would have reset inode 1023029 nlinks from 0 to 1 > > would have reset inode 1025333 nlinks from 0 to 1 > > would have reset inode 1043765 nlinks from 0 to 1 > > would have reset inode 1044789 nlinks from 0 to 1 > > would have reset inode 1049397 nlinks from 0 to 1 > > would have reset inode 1050933 nlinks from 0 to 1 > > would have reset inode 1051445 nlinks from 0 to 1 > > would have reset inode 1054261 nlinks from 0 to 1 > > would have reset inode 1060917 nlinks from 0 to 1 > > would have reset inode 1063477 nlinks from 0 to 1 > > would have reset inode 1076021 nlinks from 0 to 1 > > would have reset inode 1081141 nlinks from 0 to 1 > > would have reset inode 1086261 nlinks from 0 to 1 > > would have reset inode 1097269 nlinks from 0 to 1 > > would have reset inode 1099829 nlinks from 0 to 1 > > would have reset inode 1100853 nlinks from 0 to 1 > > would have reset inode 1101877 nlinks from 0 to 1 > > would have reset inode 1126709 nlinks from 0 to 1 > > would have reset inode 1134389 nlinks from 0 to 1 > > would have reset inode 1141045 nlinks from 0 to 1 > > would have reset inode 1141557 nlinks from 0 to 1 > > would have reset inode 1142581 nlinks from 0 to 1 > > would have reset inode 1148469 nlinks from 0 to 1 > > would have reset inode 1153333 nlinks from 0 to 1 > > would have reset inode 1181749 nlinks from 0 to 1 > > would have reset inode 1192245 nlinks from 0 to 1 > > would have reset inode 1198133 nlinks from 0 to 1 > > would have reset inode 1203765 nlinks from 0 to 1 > > would have reset inode 1221429 nlinks from 0 to 1 > > would have reset inode 1223989 nlinks from 0 to 1 > > would have reset inode 1235509 nlinks from 0 to 1 > > would have reset inode 1239349 nlinks from 0 to 1 > > would have reset inode 1240885 nlinks from 0 to 1 > > would have reset inode 1241397 nlinks from 0 to 1 > > would have reset inode 1241909 nlinks from 0 to 1 > > would have reset inode 1242421 nlinks from 0 to 1 > > would have reset inode 1244981 nlinks from 0 to 1 > > would have reset inode 1246517 nlinks from 0 to 1 > > would have reset inode 1253429 nlinks from 0 to 1 > > would have reset inode 1271861 nlinks from 0 to 1 > > would have reset inode 1274677 nlinks from 0 to 1 > > would have reset inode 1277749 nlinks from 0 to 1 > > would have reset inode 1278773 nlinks from 0 to 1 > > would have reset inode 1286709 nlinks from 0 to 1 > > would have reset inode 1288245 nlinks from 0 to 1 > > would have reset inode 1299765 nlinks from 0 to 1 > > would have reset inode 1302325 nlinks from 0 to 1 > > would have reset inode 1304885 nlinks from 0 to 1 > > would have reset inode 1305397 nlinks from 0 to 1 > > would have reset inode 1307509 nlinks from 0 to 1 > > would have reset inode 1309493 nlinks from 0 to 1 > > would have reset inode 1310517 nlinks from 0 to 1 > > would have reset inode 1311029 nlinks from 0 to 1 > > would have reset inode 1312053 nlinks from 0 to 1 > > would have reset inode 1316917 nlinks from 0 to 1 > > would have reset inode 1317941 nlinks from 0 to 1 > > would have reset inode 1320821 nlinks from 0 to 1 > > would have reset inode 1322805 nlinks from 0 to 1 > > would have reset inode 1332789 nlinks from 0 to 1 > > would have reset inode 1336373 nlinks from 0 to 1 > > would have reset inode 1345653 nlinks from 0 to 1 > > would have reset inode 1354549 nlinks from 0 to 1 > > would have reset inode 1361973 nlinks from 0 to 1 > > would have reset inode 1369909 nlinks from 0 to 1 > > would have reset inode 1372981 nlinks from 0 to 1 > > would have reset inode 1388853 nlinks from 0 to 1 > > would have reset inode 1402933 nlinks from 0 to 1 > > would have reset inode 1403445 nlinks from 0 to 1 > > would have reset inode 1420085 nlinks from 0 to 1 > > would have reset inode 1452853 nlinks from 0 to 1 > > would have reset inode 1456437 nlinks from 0 to 1 > > would have reset inode 1457973 nlinks from 0 to 1 > > would have reset inode 1459253 nlinks from 0 to 1 > > would have reset inode 1467957 nlinks from 0 to 1 > > would have reset inode 1471541 nlinks from 0 to 1 > > would have reset inode 1476661 nlinks from 0 to 1 > > would have reset inode 1479733 nlinks from 0 to 1 > > would have reset inode 1483061 nlinks from 0 to 1 > > would have reset inode 1484085 nlinks from 0 to 1 > > would have reset inode 1486133 nlinks from 0 to 1 > > would have reset inode 1489461 nlinks from 0 to 1 > > would have reset inode 1490037 nlinks from 0 to 1 > > would have reset inode 1492021 nlinks from 0 to 1 > > would have reset inode 1493557 nlinks from 0 to 1 > > would have reset inode 1494069 nlinks from 0 to 1 > > would have reset inode 1496885 nlinks from 0 to 1 > > would have reset inode 1498421 nlinks from 0 to 1 > > would have reset inode 1498933 nlinks from 0 to 1 > > would have reset inode 1499957 nlinks from 0 to 1 > > would have reset inode 1506101 nlinks from 0 to 1 > > would have reset inode 1507637 nlinks from 0 to 1 > > would have reset inode 1510453 nlinks from 0 to 1 > > would have reset inode 1514293 nlinks from 0 to 1 > > would have reset inode 1517365 nlinks from 0 to 1 > > would have reset inode 1520693 nlinks from 0 to 1 > > would have reset inode 1521973 nlinks from 0 to 1 > > would have reset inode 1530421 nlinks from 0 to 1 > > would have reset inode 1530933 nlinks from 0 to 1 > > would have reset inode 1537333 nlinks from 0 to 1 > > would have reset inode 1538357 nlinks from 0 to 1 > > would have reset inode 1548853 nlinks from 0 to 1 > > would have reset inode 1553973 nlinks from 0 to 1 > > would have reset inode 1557301 nlinks from 0 to 1 > > would have reset inode 1564213 nlinks from 0 to 1 > > would have reset inode 1564725 nlinks from 0 to 1 > > would have reset inode 1576501 nlinks from 0 to 1 > > would have reset inode 1580597 nlinks from 0 to 1 > > would have reset inode 1584693 nlinks from 0 to 1 > > would have reset inode 1586485 nlinks from 0 to 1 > > would have reset inode 1589301 nlinks from 0 to 1 > > would have reset inode 1589813 nlinks from 0 to 1 > > would have reset inode 1592629 nlinks from 0 to 1 > > would have reset inode 1595701 nlinks from 0 to 1 > > would have reset inode 1601077 nlinks from 0 to 1 > > would have reset inode 1623861 nlinks from 0 to 1 > > would have reset inode 1626677 nlinks from 0 to 1 > > would have reset inode 1627701 nlinks from 0 to 1 > > would have reset inode 1633333 nlinks from 0 to 1 > > would have reset inode 1639221 nlinks from 0 to 1 > > would have reset inode 1649205 nlinks from 0 to 1 > > would have reset inode 1686325 nlinks from 0 to 1 > > would have reset inode 1690677 nlinks from 0 to 1 > > would have reset inode 1693749 nlinks from 0 to 1 > > would have reset inode 1704757 nlinks from 0 to 1 > > would have reset inode 1707061 nlinks from 0 to 1 > > would have reset inode 1709109 nlinks from 0 to 1 > > would have reset inode 1719349 nlinks from 0 to 1 > > would have reset inode 1737013 nlinks from 0 to 1 > > would have reset inode 1741365 nlinks from 0 to 1 > > would have reset inode 1747509 nlinks from 0 to 1 > > would have reset inode 1770805 nlinks from 0 to 1 > > would have reset inode 1780789 nlinks from 0 to 1 > > would have reset inode 1793589 nlinks from 0 to 1 > > would have reset inode 1795125 nlinks from 0 to 1 > > would have reset inode 1800757 nlinks from 0 to 1 > > would have reset inode 1801269 nlinks from 0 to 1 > > would have reset inode 1802549 nlinks from 0 to 1 > > would have reset inode 1804085 nlinks from 0 to 1 > > would have reset inode 1817141 nlinks from 0 to 1 > > would have reset inode 1821749 nlinks from 0 to 1 > > would have reset inode 1832757 nlinks from 0 to 1 > > would have reset inode 1836341 nlinks from 0 to 1 > > would have reset inode 1856309 nlinks from 0 to 1 > > would have reset inode 1900597 nlinks from 0 to 1 > > would have reset inode 1902901 nlinks from 0 to 1 > > would have reset inode 1912373 nlinks from 0 to 1 > > would have reset inode 1943093 nlinks from 0 to 1 > > would have reset inode 1944373 nlinks from 0 to 1 > > would have reset inode 1954101 nlinks from 0 to 1 > > would have reset inode 1955893 nlinks from 0 to 1 > > would have reset inode 1961781 nlinks from 0 to 1 > > would have reset inode 1974325 nlinks from 0 to 1 > > would have reset inode 1978677 nlinks from 0 to 1 > > would have reset inode 1981237 nlinks from 0 to 1 > > would have reset inode 1992245 nlinks from 0 to 1 > > would have reset inode 2000949 nlinks from 0 to 1 > > would have reset inode 2002229 nlinks from 0 to 1 > > would have reset inode 2004789 nlinks from 0 to 1 > > would have reset inode 2005301 nlinks from 0 to 1 > > would have reset inode 2011189 nlinks from 0 to 1 > > would have reset inode 2012981 nlinks from 0 to 1 > > would have reset inode 2015285 nlinks from 0 to 1 > > would have reset inode 2018869 nlinks from 0 to 1 > > would have reset inode 2028341 nlinks from 0 to 1 > > would have reset inode 2028853 nlinks from 0 to 1 > > would have reset inode 2030901 nlinks from 0 to 1 > > would have reset inode 2032181 nlinks from 0 to 1 > > would have reset inode 2032693 nlinks from 0 to 1 > > would have reset inode 2040117 nlinks from 0 to 1 > > would have reset inode 2053685 nlinks from 0 to 1 > > would have reset inode 2083893 nlinks from 0 to 1 > > would have reset inode 2087221 nlinks from 0 to 1 > > would have reset inode 2095925 nlinks from 0 to 1 > > would have reset inode 2098741 nlinks from 0 to 1 > > would have reset inode 2100533 nlinks from 0 to 1 > > would have reset inode 2101301 nlinks from 0 to 1 > > would have reset inode 2123573 nlinks from 0 to 1 > > would have reset inode 2132789 nlinks from 0 to 1 > > would have reset inode 2133813 nlinks from 0 to 1 > > > > > > > > > > > > 2013/4/10 =B7=FB=D3=C0=CC=CE > > > > > The storage info is as following: > > RAID-6 > > SATA HDD > > Controller: PERC H710P Mini (Embedded) > > Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes > > 255 heads, 63 sectors/track, 3647334 cylinders > > Units =3D cylinders of 16065 * 512 =3D 8225280 bytes > > Sector size (logical/physical): 512 bytes / 512 bytes > > I/O size (minimum/optimal): 512 bytes / 512 bytes > > Disk identifier: 0x00000000 > > > > sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (30.0 TB/27.= 2 > > TiB) > > sd 0:2:1:0: [sdb] Write Protect is off > > sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08 > > sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enabled, doesn'= t > > support DPO or FUA > > sd 0:2:1:0: [sdb] Attached SCSI disk > > > > *-storage > > description: RAID bus controller > > product: MegaRAID SAS 2208 [Thunderbolt] > > vendor: LSI Logic / Symbios Logic > > physical id: 0 > > bus info: pci@0000:02:00.0 > > logical name: scsi0 > > version: 01 > > width: 64 bits > > clock: 33MHz > > capabilities: storage pm pciexpress vpd msi msix bus_master > > cap_list rom > > configuration: driver=3Dmegaraid_sas latency=3D0 > > resources: irq:42 ioport:fc00(size=3D256) > > memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff > > memory:dc800000-dc81ffff(prefetchable) > > *-disk:0 > > description: SCSI Disk > > product: PERC H710P > > vendor: DELL > > physical id: 2.0.0 > > bus info: scsi@0:2.0.0 > > logical name: /dev/sda > > version: 3.13 > > serial: 0049d6ce1d9f2035180096fde490f648 > > size: 558GiB (599GB) > > capabilities: partitioned partitioned:dos > > configuration: ansiversion=3D5 signature=3D000aa336 > > *-disk:1 > > description: SCSI Disk > > product: PERC H710P > > vendor: DELL > > physical id: 2.1.0 > > bus info: scsi@0:2.1.0 > > logical name: /dev/sdb > > logical name: /mnt/xfsd > > version: 3.13 > > serial: 003366f71da22035180096fde490f648 > > size: 27TiB (30TB) > > configuration: ansiversion=3D5 mount.fstype=3Dxfs > > > mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,swi= dth=3D1280,noquota > > state=3Dmounted > > > > Thank you. > > > > > > 2013/4/10 Emmanuel Florac > > > > > > Le Tue, 9 Apr 2013 23:10:03 +0800 > > =B7=FB=D3=C0=CC=CE > =A8=A6crivait: > > > > > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected. > > > > Shutting down filesystem > > > > This. I/O error detected. That means that at some point the > > underlying > > device (disk, RAID array, SAN volume) couldn't be reached. So > this > > could very well be a case of a flakey drive, array, cable or SC= SI > > driver. > > > > What's the storage setup here? > > > > -- > > > ------------------------------------------------------------------------ > > Emmanuel Florac | Direction technique > > | Intellique > > | > > > > | +33 1 78 94 84 02 > > > ------------------------------------------------------------------------ > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > --=20 =B7=FB=D3=C0=CC=CE --14dae9340865fe58f004da1f39e8 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
the workload is about:
24 servers, repl= ica(3) which means the distribute is 8
load is about 3(TB)-8(TB) p= er day.


2013/4/12 Brian Foster <bfoster@redhat.com>
On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote:
> It happens tonight again on one of our servers, how to debug the root<= br> > cause? Thank you.
>

Hi,

I've attached a system tap script (stap -v xfs.stp) that should
hopefully print out a bit more data should the issue happen again. Do
you have a small enough number of nodes (or predictable enough pattern)
that you could run this on the nodes that tend to fail and collect the
output?

Also, could you collect an xfs_metadump of the filesystem in question
and make it available for download and analysis somewhere? I believe the ideal approach is to mount/umount the filesystem first to replay the log before collecting a metadump, but somebody could correct me on that (to
be safe, you could collect multiple dumps: pre-mount and post-mount).

Could you also describe your workload a little bit? Thanks.

Brian

> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove:
> xfs_inotobp() returned error 22.
> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree return= ed
> error 22
> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1)
> called from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return addr= ess =3D
> 0xffffffffa02ee20a
> Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting > down filesystem
> Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem a= nd
> rectify the problem(s)
> Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
> Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
> Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
> Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
>
> xfs_repair -n
>
>
> Phase 7 - verify link counts...
> would have reset inode 20021 nlinks from 0 to 1
> would have reset inode 20789 nlinks from 0 to 1
> would have reset inode 35125 nlinks from 0 to 1
> would have reset inode 35637 nlinks from 0 to 1
> would have reset inode 36149 nlinks from 0 to 1
> would have reset inode 38197 nlinks from 0 to 1
> would have reset inode 39477 nlinks from 0 to 1
> would have reset inode 54069 nlinks from 0 to 1
> would have reset inode 62261 nlinks from 0 to 1
> would have reset inode 63029 nlinks from 0 to 1
> would have reset inode 72501 nlinks from 0 to 1
> would have reset inode 79925 nlinks from 0 to 1
> would have reset inode 81205 nlinks from 0 to 1
> would have reset inode 84789 nlinks from 0 to 1
> would have reset inode 87861 nlinks from 0 to 1
> would have reset inode 90663 nlinks from 0 to 1
> would have reset inode 91189 nlinks from 0 to 1
> would have reset inode 95541 nlinks from 0 to 1
> would have reset inode 98101 nlinks from 0 to 1
> would have reset inode 101173 nlinks from 0 to 1
> would have reset inode 113205 nlinks from 0 to 1
> would have reset inode 114741 nlinks from 0 to 1
> would have reset inode 126261 nlinks from 0 to 1
> would have reset inode 140597 nlinks from 0 to 1
> would have reset inode 144693 nlinks from 0 to 1
> would have reset inode 147765 nlinks from 0 to 1
> would have reset inode 152885 nlinks from 0 to 1
> would have reset inode 161333 nlinks from 0 to 1
> would have reset inode 161845 nlinks from 0 to 1
> would have reset inode 167477 nlinks from 0 to 1
> would have reset inode 172341 nlinks from 0 to 1
> would have reset inode 191797 nlinks from 0 to 1
> would have reset inode 204853 nlinks from 0 to 1
> would have reset inode 205365 nlinks from 0 to 1
> would have reset inode 215349 nlinks from 0 to 1
> would have reset inode 215861 nlinks from 0 to 1
> would have reset inode 216373 nlinks from 0 to 1
> would have reset inode 217397 nlinks from 0 to 1
> would have reset inode 224309 nlinks from 0 to 1
> would have reset inode 225589 nlinks from 0 to 1
> would have reset inode 234549 nlinks from 0 to 1
> would have reset inode 234805 nlinks from 0 to 1
> would have reset inode 249653 nlinks from 0 to 1
> would have reset inode 250677 nlinks from 0 to 1
> would have reset inode 252469 nlinks from 0 to 1
> would have reset inode 261429 nlinks from 0 to 1
> would have reset inode 265013 nlinks from 0 to 1
> would have reset inode 266805 nlinks from 0 to 1
> would have reset inode 267317 nlinks from 0 to 1
> would have reset inode 268853 nlinks from 0 to 1
> would have reset inode 272437 nlinks from 0 to 1
> would have reset inode 273205 nlinks from 0 to 1
> would have reset inode 274229 nlinks from 0 to 1
> would have reset inode 278325 nlinks from 0 to 1
> would have reset inode 278837 nlinks from 0 to 1
> would have reset inode 281397 nlinks from 0 to 1
> would have reset inode 292661 nlinks from 0 to 1
> would have reset inode 300853 nlinks from 0 to 1
> would have reset inode 302901 nlinks from 0 to 1
> would have reset inode 305205 nlinks from 0 to 1
> would have reset inode 314165 nlinks from 0 to 1
> would have reset inode 315189 nlinks from 0 to 1
> would have reset inode 320309 nlinks from 0 to 1
> would have reset inode 324917 nlinks from 0 to 1
> would have reset inode 328245 nlinks from 0 to 1
> would have reset inode 335925 nlinks from 0 to 1
> would have reset inode 339253 nlinks from 0 to 1
> would have reset inode 339765 nlinks from 0 to 1
> would have reset inode 348213 nlinks from 0 to 1
> would have reset inode 360501 nlinks from 0 to 1
> would have reset inode 362037 nlinks from 0 to 1
> would have reset inode 366389 nlinks from 0 to 1
> would have reset inode 385845 nlinks from 0 to 1
> would have reset inode 390709 nlinks from 0 to 1
> would have reset inode 409141 nlinks from 0 to 1
> would have reset inode 413237 nlinks from 0 to 1
> would have reset inode 414773 nlinks from 0 to 1
> would have reset inode 417845 nlinks from 0 to 1
> would have reset inode 436021 nlinks from 0 to 1
> would have reset inode 439349 nlinks from 0 to 1
> would have reset inode 447029 nlinks from 0 to 1
> would have reset inode 491317 nlinks from 0 to 1
> would have reset inode 494133 nlinks from 0 to 1
> would have reset inode 495413 nlinks from 0 to 1
> would have reset inode 501301 nlinks from 0 to 1
> would have reset inode 506421 nlinks from 0 to 1
> would have reset inode 508469 nlinks from 0 to 1
> would have reset inode 508981 nlinks from 0 to 1
> would have reset inode 511797 nlinks from 0 to 1
> would have reset inode 513077 nlinks from 0 to 1
> would have reset inode 517941 nlinks from 0 to 1
> would have reset inode 521013 nlinks from 0 to 1
> would have reset inode 522805 nlinks from 0 to 1
> would have reset inode 523317 nlinks from 0 to 1
> would have reset inode 525621 nlinks from 0 to 1
> would have reset inode 527925 nlinks from 0 to 1
> would have reset inode 535605 nlinks from 0 to 1
> would have reset inode 541749 nlinks from 0 to 1
> would have reset inode 573493 nlinks from 0 to 1
> would have reset inode 578613 nlinks from 0 to 1
> would have reset inode 583029 nlinks from 0 to 1
> would have reset inode 585525 nlinks from 0 to 1
> would have reset inode 586293 nlinks from 0 to 1
> would have reset inode 586805 nlinks from 0 to 1
> would have reset inode 591413 nlinks from 0 to 1
> would have reset inode 594485 nlinks from 0 to 1
> would have reset inode 596277 nlinks from 0 to 1
> would have reset inode 603189 nlinks from 0 to 1
> would have reset inode 613429 nlinks from 0 to 1
> would have reset inode 617781 nlinks from 0 to 1
> would have reset inode 621877 nlinks from 0 to 1
> would have reset inode 623925 nlinks from 0 to 1
> would have reset inode 625205 nlinks from 0 to 1
> would have reset inode 626741 nlinks from 0 to 1
> would have reset inode 639541 nlinks from 0 to 1
> would have reset inode 640053 nlinks from 0 to 1
> would have reset inode 640565 nlinks from 0 to 1
> would have reset inode 645173 nlinks from 0 to 1
> would have reset inode 652853 nlinks from 0 to 1
> would have reset inode 656181 nlinks from 0 to 1
> would have reset inode 659253 nlinks from 0 to 1
> would have reset inode 663605 nlinks from 0 to 1
> would have reset inode 667445 nlinks from 0 to 1
> would have reset inode 680757 nlinks from 0 to 1
> would have reset inode 691253 nlinks from 0 to 1
> would have reset inode 691765 nlinks from 0 to 1
> would have reset inode 697653 nlinks from 0 to 1
> would have reset inode 700469 nlinks from 0 to 1
> would have reset inode 707893 nlinks from 0 to 1
> would have reset inode 716853 nlinks from 0 to 1
> would have reset inode 722229 nlinks from 0 to 1
> would have reset inode 722741 nlinks from 0 to 1
> would have reset inode 723765 nlinks from 0 to 1
> would have reset inode 731957 nlinks from 0 to 1
> would have reset inode 742965 nlinks from 0 to 1
> would have reset inode 743477 nlinks from 0 to 1
> would have reset inode 745781 nlinks from 0 to 1
> would have reset inode 746293 nlinks from 0 to 1
> would have reset inode 774453 nlinks from 0 to 1
> would have reset inode 778805 nlinks from 0 to 1
> would have reset inode 785013 nlinks from 0 to 1
> would have reset inode 785973 nlinks from 0 to 1
> would have reset inode 791349 nlinks from 0 to 1
> would have reset inode 796981 nlinks from 0 to 1
> would have reset inode 803381 nlinks from 0 to 1
> would have reset inode 806965 nlinks from 0 to 1
> would have reset inode 811798 nlinks from 0 to 1
> would have reset inode 812310 nlinks from 0 to 1
> would have reset inode 813078 nlinks from 0 to 1
> would have reset inode 813607 nlinks from 0 to 1
> would have reset inode 814183 nlinks from 0 to 1
> would have reset inode 822069 nlinks from 0 to 1
> would have reset inode 828469 nlinks from 0 to 1
> would have reset inode 830005 nlinks from 0 to 1
> would have reset inode 832053 nlinks from 0 to 1
> would have reset inode 832565 nlinks from 0 to 1
> would have reset inode 836661 nlinks from 0 to 1
> would have reset inode 841013 nlinks from 0 to 1
> would have reset inode 841525 nlinks from 0 to 1
> would have reset inode 845365 nlinks from 0 to 1
> would have reset inode 846133 nlinks from 0 to 1
> would have reset inode 847157 nlinks from 0 to 1
> would have reset inode 852533 nlinks from 0 to 1
> would have reset inode 857141 nlinks from 0 to 1
> would have reset inode 863271 nlinks from 0 to 1
> would have reset inode 866855 nlinks from 0 to 1
> would have reset inode 887861 nlinks from 0 to 1
> would have reset inode 891701 nlinks from 0 to 1
> would have reset inode 894773 nlinks from 0 to 1
> would have reset inode 900149 nlinks from 0 to 1
> would have reset inode 902197 nlinks from 0 to 1
> would have reset inode 906293 nlinks from 0 to 1
> would have reset inode 906805 nlinks from 0 to 1
> would have reset inode 909877 nlinks from 0 to 1
> would have reset inode 925493 nlinks from 0 to 1
> would have reset inode 949543 nlinks from 0 to 1
> would have reset inode 955175 nlinks from 0 to 1
> would have reset inode 963623 nlinks from 0 to 1
> would have reset inode 967733 nlinks from 0 to 1
> would have reset inode 968231 nlinks from 0 to 1
> would have reset inode 982069 nlinks from 0 to 1
> would have reset inode 1007413 nlinks from 0 to 1
> would have reset inode 1011509 nlinks from 0 to 1
> would have reset inode 1014069 nlinks from 0 to 1
> would have reset inode 1014581 nlinks from 0 to 1
> would have reset inode 1022005 nlinks from 0 to 1
> would have reset inode 1022517 nlinks from 0 to 1
> would have reset inode 1023029 nlinks from 0 to 1
> would have reset inode 1025333 nlinks from 0 to 1
> would have reset inode 1043765 nlinks from 0 to 1
> would have reset inode 1044789 nlinks from 0 to 1
> would have reset inode 1049397 nlinks from 0 to 1
> would have reset inode 1050933 nlinks from 0 to 1
> would have reset inode 1051445 nlinks from 0 to 1
> would have reset inode 1054261 nlinks from 0 to 1
> would have reset inode 1060917 nlinks from 0 to 1
> would have reset inode 1063477 nlinks from 0 to 1
> would have reset inode 1076021 nlinks from 0 to 1
> would have reset inode 1081141 nlinks from 0 to 1
> would have reset inode 1086261 nlinks from 0 to 1
> would have reset inode 1097269 nlinks from 0 to 1
> would have reset inode 1099829 nlinks from 0 to 1
> would have reset inode 1100853 nlinks from 0 to 1
> would have reset inode 1101877 nlinks from 0 to 1
> would have reset inode 1126709 nlinks from 0 to 1
> would have reset inode 1134389 nlinks from 0 to 1
> would have reset inode 1141045 nlinks from 0 to 1
> would have reset inode 1141557 nlinks from 0 to 1
> would have reset inode 1142581 nlinks from 0 to 1
> would have reset inode 1148469 nlinks from 0 to 1
> would have reset inode 1153333 nlinks from 0 to 1
> would have reset inode 1181749 nlinks from 0 to 1
> would have reset inode 1192245 nlinks from 0 to 1
> would have reset inode 1198133 nlinks from 0 to 1
> would have reset inode 1203765 nlinks from 0 to 1
> would have reset inode 1221429 nlinks from 0 to 1
> would have reset inode 1223989 nlinks from 0 to 1
> would have reset inode 1235509 nlinks from 0 to 1
> would have reset inode 1239349 nlinks from 0 to 1
> would have reset inode 1240885 nlinks from 0 to 1
> would have reset inode 1241397 nlinks from 0 to 1
> would have reset inode 1241909 nlinks from 0 to 1
> would have reset inode 1242421 nlinks from 0 to 1
> would have reset inode 1244981 nlinks from 0 to 1
> would have reset inode 1246517 nlinks from 0 to 1
> would have reset inode 1253429 nlinks from 0 to 1
> would have reset inode 1271861 nlinks from 0 to 1
> would have reset inode 1274677 nlinks from 0 to 1
> would have reset inode 1277749 nlinks from 0 to 1
> would have reset inode 1278773 nlinks from 0 to 1
> would have reset inode 1286709 nlinks from 0 to 1
> would have reset inode 1288245 nlinks from 0 to 1
> would have reset inode 1299765 nlinks from 0 to 1
> would have reset inode 1302325 nlinks from 0 to 1
> would have reset inode 1304885 nlinks from 0 to 1
> would have reset inode 1305397 nlinks from 0 to 1
> would have reset inode 1307509 nlinks from 0 to 1
> would have reset inode 1309493 nlinks from 0 to 1
> would have reset inode 1310517 nlinks from 0 to 1
> would have reset inode 1311029 nlinks from 0 to 1
> would have reset inode 1312053 nlinks from 0 to 1
> would have reset inode 1316917 nlinks from 0 to 1
> would have reset inode 1317941 nlinks from 0 to 1
> would have reset inode 1320821 nlinks from 0 to 1
> would have reset inode 1322805 nlinks from 0 to 1
> would have reset inode 1332789 nlinks from 0 to 1
> would have reset inode 1336373 nlinks from 0 to 1
> would have reset inode 1345653 nlinks from 0 to 1
> would have reset inode 1354549 nlinks from 0 to 1
> would have reset inode 1361973 nlinks from 0 to 1
> would have reset inode 1369909 nlinks from 0 to 1
> would have reset inode 1372981 nlinks from 0 to 1
> would have reset inode 1388853 nlinks from 0 to 1
> would have reset inode 1402933 nlinks from 0 to 1
> would have reset inode 1403445 nlinks from 0 to 1
> would have reset inode 1420085 nlinks from 0 to 1
> would have reset inode 1452853 nlinks from 0 to 1
> would have reset inode 1456437 nlinks from 0 to 1
> would have reset inode 1457973 nlinks from 0 to 1
> would have reset inode 1459253 nlinks from 0 to 1
> would have reset inode 1467957 nlinks from 0 to 1
> would have reset inode 1471541 nlinks from 0 to 1
> would have reset inode 1476661 nlinks from 0 to 1
> would have reset inode 1479733 nlinks from 0 to 1
> would have reset inode 1483061 nlinks from 0 to 1
> would have reset inode 1484085 nlinks from 0 to 1
> would have reset inode 1486133 nlinks from 0 to 1
> would have reset inode 1489461 nlinks from 0 to 1
> would have reset inode 1490037 nlinks from 0 to 1
> would have reset inode 1492021 nlinks from 0 to 1
> would have reset inode 1493557 nlinks from 0 to 1
> would have reset inode 1494069 nlinks from 0 to 1
> would have reset inode 1496885 nlinks from 0 to 1
> would have reset inode 1498421 nlinks from 0 to 1
> would have reset inode 1498933 nlinks from 0 to 1
> would have reset inode 1499957 nlinks from 0 to 1
> would have reset inode 1506101 nlinks from 0 to 1
> would have reset inode 1507637 nlinks from 0 to 1
> would have reset inode 1510453 nlinks from 0 to 1
> would have reset inode 1514293 nlinks from 0 to 1
> would have reset inode 1517365 nlinks from 0 to 1
> would have reset inode 1520693 nlinks from 0 to 1
> would have reset inode 1521973 nlinks from 0 to 1
> would have reset inode 1530421 nlinks from 0 to 1
> would have reset inode 1530933 nlinks from 0 to 1
> would have reset inode 1537333 nlinks from 0 to 1
> would have reset inode 1538357 nlinks from 0 to 1
> would have reset inode 1548853 nlinks from 0 to 1
> would have reset inode 1553973 nlinks from 0 to 1
> would have reset inode 1557301 nlinks from 0 to 1
> would have reset inode 1564213 nlinks from 0 to 1
> would have reset inode 1564725 nlinks from 0 to 1
> would have reset inode 1576501 nlinks from 0 to 1
> would have reset inode 1580597 nlinks from 0 to 1
> would have reset inode 1584693 nlinks from 0 to 1
> would have reset inode 1586485 nlinks from 0 to 1
> would have reset inode 1589301 nlinks from 0 to 1
> would have reset inode 1589813 nlinks from 0 to 1
> would have reset inode 1592629 nlinks from 0 to 1
> would have reset inode 1595701 nlinks from 0 to 1
> would have reset inode 1601077 nlinks from 0 to 1
> would have reset inode 1623861 nlinks from 0 to 1
> would have reset inode 1626677 nlinks from 0 to 1
> would have reset inode 1627701 nlinks from 0 to 1
> would have reset inode 1633333 nlinks from 0 to 1
> would have reset inode 1639221 nlinks from 0 to 1
> would have reset inode 1649205 nlinks from 0 to 1
> would have reset inode 1686325 nlinks from 0 to 1
> would have reset inode 1690677 nlinks from 0 to 1
> would have reset inode 1693749 nlinks from 0 to 1
> would have reset inode 1704757 nlinks from 0 to 1
> would have reset inode 1707061 nlinks from 0 to 1
> would have reset inode 1709109 nlinks from 0 to 1
> would have reset inode 1719349 nlinks from 0 to 1
> would have reset inode 1737013 nlinks from 0 to 1
> would have reset inode 1741365 nlinks from 0 to 1
> would have reset inode 1747509 nlinks from 0 to 1
> would have reset inode 1770805 nlinks from 0 to 1
> would have reset inode 1780789 nlinks from 0 to 1
> would have reset inode 1793589 nlinks from 0 to 1
> would have reset inode 1795125 nlinks from 0 to 1
> would have reset inode 1800757 nlinks from 0 to 1
> would have reset inode 1801269 nlinks from 0 to 1
> would have reset inode 1802549 nlinks from 0 to 1
> would have reset inode 1804085 nlinks from 0 to 1
> would have reset inode 1817141 nlinks from 0 to 1
> would have reset inode 1821749 nlinks from 0 to 1
> would have reset inode 1832757 nlinks from 0 to 1
> would have reset inode 1836341 nlinks from 0 to 1
> would have reset inode 1856309 nlinks from 0 to 1
> would have reset inode 1900597 nlinks from 0 to 1
> would have reset inode 1902901 nlinks from 0 to 1
> would have reset inode 1912373 nlinks from 0 to 1
> would have reset inode 1943093 nlinks from 0 to 1
> would have reset inode 1944373 nlinks from 0 to 1
> would have reset inode 1954101 nlinks from 0 to 1
> would have reset inode 1955893 nlinks from 0 to 1
> would have reset inode 1961781 nlinks from 0 to 1
> would have reset inode 1974325 nlinks from 0 to 1
> would have reset inode 1978677 nlinks from 0 to 1
> would have reset inode 1981237 nlinks from 0 to 1
> would have reset inode 1992245 nlinks from 0 to 1
> would have reset inode 2000949 nlinks from 0 to 1
> would have reset inode 2002229 nlinks from 0 to 1
> would have reset inode 2004789 nlinks from 0 to 1
> would have reset inode 2005301 nlinks from 0 to 1
> would have reset inode 2011189 nlinks from 0 to 1
> would have reset inode 2012981 nlinks from 0 to 1
> would have reset inode 2015285 nlinks from 0 to 1
> would have reset inode 2018869 nlinks from 0 to 1
> would have reset inode 2028341 nlinks from 0 to 1
> would have reset inode 2028853 nlinks from 0 to 1
> would have reset inode 2030901 nlinks from 0 to 1
> would have reset inode 2032181 nlinks from 0 to 1
> would have reset inode 2032693 nlinks from 0 to 1
> would have reset inode 2040117 nlinks from 0 to 1
> would have reset inode 2053685 nlinks from 0 to 1
> would have reset inode 2083893 nlinks from 0 to 1
> would have reset inode 2087221 nlinks from 0 to 1
> would have reset inode 2095925 nlinks from 0 to 1
> would have reset inode 2098741 nlinks from 0 to 1
> would have reset inode 2100533 nlinks from 0 to 1
> would have reset inode 2101301 nlinks from 0 to 1
> would have reset inode 2123573 nlinks from 0 to 1
> would have reset inode 2132789 nlinks from 0 to 1
> would have reset inode 2133813 nlinks from 0 to 1
>
>
>
>
>
> 2013/4/10 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     The storage info is as following:
>     RAID-6
>     SATA HDD
>     Controller: PERC H710P Mini (Embedded)
>     Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes
>     255 heads, 63 sectors/track, 3647334 cylinders
>     Units =3D cylinders of 16065 * 512 =3D 8225280 bytes
>     Sector size (logical/physical): 512 bytes / 512 bytes >     I/O size (minimum/optimal): 512 bytes / 512 bytes
>     Disk identifier: 0x00000000
>
>     sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (= 30.0 TB/27.2
>     TiB)
>     sd 0:2:1:0: [sdb] Write Protect is off
>     sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08
>     sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enab= led, doesn't
>     support DPO or FUA
>     sd 0:2:1:0: [sdb] Attached SCSI disk
>
>     *-storage
>            description: RAID bus control= ler
>            product: MegaRAID SAS 2208 [T= hunderbolt]
>            vendor: LSI Logic / Symbios L= ogic
>            physical id: 0
>            bus info: pci@0000:02:00.0 >            logical name: scsi0
>            version: 01
>            width: 64 bits
>            clock: 33MHz
>            capabilities: storage pm pcie= xpress vpd msi msix bus_master
>     cap_list rom
>            configuration: driver=3Dmegar= aid_sas latency=3D0
>            resources: irq:42 ioport:fc00= (size=3D256)
>     memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff
>     memory:dc800000-dc81ffff(prefetchable)
>          *-disk:0
>               description: SCSI Dis= k
>               product: PERC H710P >               vendor: DELL
>               physical id: 2.0.0 >               bus info: scsi@0:2.0.= 0
>               logical name: /dev/sd= a
>               version: 3.13
>               serial: 0049d6ce1d9f2= 035180096fde490f648
>               size: 558GiB (599GB)<= br> >               capabilities: partiti= oned partitioned:dos
>               configuration: ansive= rsion=3D5 signature=3D000aa336
>          *-disk:1
>               description: SCSI Dis= k
>               product: PERC H710P >               vendor: DELL
>               physical id: 2.1.0 >               bus info: scsi@0:2.1.= 0
>               logical name: /dev/sd= b
>               logical name: /mnt/xf= sd
>               version: 3.13
>               serial: 003366f71da22= 035180096fde490f648
>               size: 27TiB (30TB) >               configuration: ansive= rsion=3D5 mount.fstype=3Dxfs
>     mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64= k,sunit=3D128,swidth=3D1280,noquota
>     state=3Dmounted
>
>     Thank you.
>
>
>     2013/4/10 Emmanuel Florac <eflorac@intellique.com
>     <mailto:eflorac@intellique.com>>
>
>         Le Tue, 9 Apr 2013 23:10:03 +0800
>         =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>> =A8=A6crivait:
>
>         > > Apr  9 11:01:30 cqdx kernel= : XFS (sdb): I/O Error Detected.
>         > > Shutting down filesystem
>
>         This. I/O error detected. That means that = at some point the
>         underlying
>         device (disk, RAID array, SAN volume) coul= dn't be reached. So this
>         could very well be a case of a flakey driv= e, array, cable or SCSI
>         driver.
>
>         What's the storage setup here?
>
>         --
>         ------------------------------------------= ------------------------------
>         Emmanuel Florac     |   Dir= ection technique
>                     =         |   Intellique
>                     =         |   <eflorac@intellique.com
>         <mailto:eflorac@intellique.com>>



--
=B7=FB=D3= =C0=CC=CE
--14dae9340865fe58f004da1f39e8-- From david@fromorbit.com Thu Apr 11 20:04:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7B5AE7F3F for ; Thu, 11 Apr 2013 20:04:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 57DFE8F809B for ; Thu, 11 Apr 2013 18:04:11 -0700 (PDT) X-ASG-Debug-ID: 1365728649-04cbb057f5bae50001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id gxTfaWxGT5Q70eAC for ; Thu, 11 Apr 2013 18:04:09 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApMVACpcZ1F5LLHC/2dsb2JhbABQgwa8coUYBAGBBxd0gh8BAQQBOhwjBQsIAxgJJQ8FJQMhE4gOBb01FY1kgR0HgmBhA5cBiXeHGYMdKg Received: from ppp121-44-177-194.lns20.syd7.internode.on.net (HELO dastard) ([121.44.177.194]) by ipmail07.adl2.internode.on.net with ESMTP; 12 Apr 2013 10:34:08 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQSPP-0007sI-MN; Fri, 12 Apr 2013 11:04:07 +1000 Date: Fri, 12 Apr 2013 11:04:07 +1000 From: Dave Chinner To: Troy McCorkell Cc: xfs@oss.sgi.com, Chandra Seetharaman , Ben Myers Subject: Re: Deprecating xfs_check Message-ID: <20130412010407.GE31207@dastard> X-ASG-Orig-Subj: Re: Deprecating xfs_check References: <1365716708.3762.32154.camel@chandra-dt.ibm.com> <20130411221754.GI22182@sgi.com> <516740B8.4030704@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <516740B8.4030704@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1365728649 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [compendium reply] On Thu, Apr 11, 2013 at 06:01:12PM -0500, Troy McCorkell wrote: > On 04/11/2013 05:17 PM, Ben Myers wrote: > >Hey Chandra, > > > >On Thu, Apr 11, 2013 at 04:45:08PM -0500, Chandra Seetharaman wrote: > >>Hello All, > >> > >>Alex Elder mentioned about deprecating xfs_check, and he suggested is to > >>replace xfs_check command with a script, that says xfs_check is > >>deprecated, use "xfs_repair -n". > >> > >>Sounds ok ? Yes. I'd suggest that you also put a removal date in the output, such as: "xfs_check is deprecated and scheduled for removal in June 2014. Please use xfs_repair -n instead." The same information needs to go into the xfs_check man page. xfstests also still needs to run xfs_check. That means we also need either an override flag an make $XFS_CHECK_PROG have it set appropriately or add an internal xfs_db wrapper that runs the xfs_check functionality appropriately. The second is probably the better option... > >>Let me know if it is not the right approach. > >That sounds ok to me. You might also consider making xfs_check a hardlink to > >xfs_repair and varying the behavior based on program name. Then xfs_check == > >xfs_repair -n. xfs_check is a shell script wrapper around xfs_db, so modifying the shell script is the right thing to do at this point in time. > Does "xfs_repair -n" need to provide all of the functionality that xfs_check > provides before it is replaced? It already does. > xfs_check can be run on a filesystem mounted read-only. xfs_repair > -n can not. -d Repair dangerously. Allow xfs_repair to repair an XFS filesystem mounted read only. This is typically done on a root fileystem from single user mode, immediately followed by a reboot. $ sudo mount -o remount,ro /mnt/scratch $ grep scratch /proc/mounts /dev/vdc /mnt/scratch xfs ro,relatime,attr2,nobarrier,inode64,logbsize=256k,noquota 0 0 $ sudo xfs_repair -dn /dev/vdc Phase 1 - find and verify superblock... Version 5 superblock detected. xfsprogs has EXPERIMENTAL support enabled! Use of these features is at your own risk! Not enough RAM available for repair to enable prefetching. This will be _slow_. You need at least 16061MB RAM to run with prefetching enabled. Phase 2 - using internal log - scan filesystem freespace and inode maps... .... - agno = 98 - agno = 99 No modify flag set, skipping phase 5 Phase 6 - check inode connectivity... - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify link counts... No modify flag set, skipping filesystem flush and exiting. $ So it works just fine on read-only filesystems... (Oh, yeah, that's a 100TB metadata crc enabled filesystem with 50 million inodes in it ;) > xfs_check has two options: > -i ino Specifies verbose behavior for the specified inode ino. > -b bno Specifies verbose behavior for the specific filesystem > block at bno. > which are not available with xfs_repair. I've never used either of them in 10 years. If they are needed, you can still use xfs_db to get that information directly: # xfs_db -F -i -p xfs_check -c "check -i ino" So, really, we are not losing any xfs_check functionality at all - all we are doing is deprecating the user facing interface to it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Apr 11 20:07:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C528F7F3F for ; Thu, 11 Apr 2013 20:07:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A1C3D30404E for ; Thu, 11 Apr 2013 18:07:54 -0700 (PDT) X-ASG-Debug-ID: 1365728873-04cbb057f5bb1b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id gSZPoCsX74T0zvkA for ; Thu, 11 Apr 2013 18:07:53 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B03EF60C3E27; Thu, 11 Apr 2013 20:07:52 -0500 (CDT) Message-ID: <51675E67.7030600@sandeen.net> Date: Thu, 11 Apr 2013 20:07:51 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Brian Foster CC: =?UTF-8?B?56ym5rC45rab?= , Ben Myers , "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: <516746AC.3090808@redhat.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365728873 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/11/13 6:26 PM, Brian Foster wrote: > On 04/11/2013 03:11 PM, 符永涛 wrote: >> It happens tonight again on one of our servers, how to debug the root >> cause? Thank you. >> > > Hi, > > I've attached a system tap script (stap -v xfs.stp) that should > hopefully print out a bit more data should the issue happen again. Do > you have a small enough number of nodes (or predictable enough pattern) > that you could run this on the nodes that tend to fail and collect the > output? > > Also, could you collect an xfs_metadump of the filesystem in question > and make it available for download and analysis somewhere? I believe the > ideal approach is to mount/umount the filesystem first to replay the log > before collecting a metadump, but somebody could correct me on that (to > be safe, you could collect multiple dumps: pre-mount and post-mount). Dave suggested yesterday that this would be best: metadump right after unmounting post-failure, then mount/umount & generate another metadump. -Eric > Could you also describe your workload a little bit? Thanks. > > Brian > >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: >> xfs_inotobp() returned error 22. >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree returned >> error 22 >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) >> called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = >> 0xffffffffa02ee20a >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting >> down filesystem >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem and >> rectify the problem(s) >> Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. >> Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. >> Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. >> Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned. >> From yongtaofu@gmail.com Thu Apr 11 20:36:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 74F777F37 for ; Thu, 11 Apr 2013 20:36:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 00FD3AC001 for ; Thu, 11 Apr 2013 18:36:36 -0700 (PDT) X-ASG-Debug-ID: 1365730595-04bdf02d1fba540001-NocioJ Received: from mail-ve0-f180.google.com (mail-ve0-f180.google.com [209.85.128.180]) by cuda.sgi.com with ESMTP id EkCwpJedlIVaL0mU (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 18:36:35 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.180 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.180] Received: by mail-ve0-f180.google.com with SMTP id da11so149741veb.25 for ; Thu, 11 Apr 2013 18:36:35 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.180] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.180] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=/6FD0s/Ws0ygGYMMAOK1njTZcZr+ulEtUn5JKsnncVY=; b=zvsFVKThY5sqiRjTXGoJvJzsB9tZGxMIAiZzTlZNsNhIa2y+ReGSIJ9LalRZDXxtbP W4mjaFooW6O1Jx5AlSp+rD5RlbhinnEckfdZYNAh+MEbR9SfFU10WI+tYFclC+vOc0oi +9PoX8eAWqKvb7kC/ezgdYHnket6f5sTDyvlFIKUx77UlNjPVO4EFnVvUQWIN7MlbY8m IqJMrnPBq3xhkAtGcEmDFjH0BkwKChkxXgvu411HWCHXEtQYiCqE4t7vTAHiO7e3Y2bX UbMMdJB/VlZRZv85FrNBzaGCf/5kUmFp8sFvaS24wxeiEYDyDpVYIL7IQ9kW318aoScT sSeA== MIME-Version: 1.0 X-Received: by 10.220.82.3 with SMTP id z3mr7049223vck.18.1365730595062; Thu, 11 Apr 2013 18:36:35 -0700 (PDT) Received: by 10.52.30.3 with HTTP; Thu, 11 Apr 2013 18:36:34 -0700 (PDT) In-Reply-To: <51675E67.7030600@sandeen.net> References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <51675E67.7030600@sandeen.net> Date: Fri, 12 Apr 2013 09:36:34 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: Brian Foster , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=001a11c1ed32fa496f04da1fee6d X-Barracuda-Connect: mail-ve0-f180.google.com[209.85.128.180] X-Barracuda-Start-Time: 1365730595 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.127859 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 --001a11c1ed32fa496f04da1fee6d Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Sorry I didn't dump the meta right after unmounting post-failure, I have dumped meta after a mount/umount, I'll share the meta to you soon. 2013/4/12 Eric Sandeen > On 4/11/13 6:26 PM, Brian Foster wrote: > > On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote: > >> It happens tonight again on one of our servers, how to debug the root > >> cause? Thank you. > >> > > > > Hi, > > > > I've attached a system tap script (stap -v xfs.stp) that should > > hopefully print out a bit more data should the issue happen again. Do > > you have a small enough number of nodes (or predictable enough pattern) > > that you could run this on the nodes that tend to fail and collect the > > output? > > > > Also, could you collect an xfs_metadump of the filesystem in question > > and make it available for download and analysis somewhere? I believe th= e > > ideal approach is to mount/umount the filesystem first to replay the lo= g > > before collecting a metadump, but somebody could correct me on that (to > > be safe, you could collect multiple dumps: pre-mount and post-mount). > > Dave suggested yesterday that this would be best: metadump right > after unmounting post-failure, then mount/umount & generate another > metadump. > > -Eric > > > Could you also describe your workload a little bit? Thanks. > > > > Brian > > > >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > >> xfs_inotobp() returned error 22. > >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree return= ed > >> error 22 > >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) > >> called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = =3D > >> 0xffffffffa02ee20a > >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting > >> down filesystem > >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem a= nd > >> rectify the problem(s) > >> Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. > >> Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. > >> Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. > >> Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. > >> > > --=20 =B7=FB=D3=C0=CC=CE --001a11c1ed32fa496f04da1fee6d Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Sorry I didn't dump the meta right after unmounting po= st-failure, I have dumped meta after a mount/umount, I'll share the met= a to you soon.


2013/4/12 Eric Sandeen <sandeen@sandeen.net>
On 4/11/13 6:26 PM, Brian Foster wrote:
> On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote:
>> It happens tonight again on one of our servers, how to debug the r= oot
>> cause? Thank you.
>>
>
> Hi,
>
> I've attached a system tap script (stap -v xfs.stp) that should > hopefully print out a bit more data should the issue happen again. Do<= br> > you have a small enough number of nodes (or predictable enough pattern= )
> that you could run this on the nodes that tend to fail and collect the=
> output?
>
> Also, could you collect an xfs_metadump of the filesystem in question<= br> > and make it available for download and analysis somewhere? I believe t= he
> ideal approach is to mount/umount the filesystem first to replay the l= og
> before collecting a metadump, but somebody could correct me on that (t= o
> be safe, you could collect multiple dumps: pre-mount and post-mount).<= br>
Dave suggested yesterday that this would be best: metadump right
after unmounting post-failure, then mount/umount & generate another met= adump.

-Eric

> Could you also describe your workload a little bit? Thanks.
>
> Brian
>
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove:
>> xfs_inotobp() returned error 22.
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree re= turned
>> error 22
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1)=
>> called from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return = address =3D
>> 0xffffffffa02ee20a
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutti= ng
>> down filesystem
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesyst= em and
>> rectify the problem(s)
>> Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 ret= urned.
>> Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 ret= urned.
>> Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 ret= urned.
>> Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 ret= urned.
>>




--
=B7=FB=D3= =C0=CC=CE
--001a11c1ed32fa496f04da1fee6d-- From yongtaofu@gmail.com Thu Apr 11 20:38:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 AAFA87F4C for ; Thu, 11 Apr 2013 20:38:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 96475304039 for ; Thu, 11 Apr 2013 18:38:51 -0700 (PDT) X-ASG-Debug-ID: 1365730730-04cb6c2c1ebfe80001-NocioJ Received: from mail-vc0-f177.google.com (mail-vc0-f177.google.com [209.85.220.177]) by cuda.sgi.com with ESMTP id b66W2ZbmFX8Eu5ka (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 18:38:50 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.177] Received: by mail-vc0-f177.google.com with SMTP id hr11so1793361vcb.8 for ; Thu, 11 Apr 2013 18:38:50 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=ekyi+ylxC5gcuync5LDhtZj5jGkCppQeyEcRXtKGt84=; b=vmr/mPQxk43CdoFRyyK6y9juAbrqtRJeN+FsIMKb61b5PYm4sUfuMudnrpJGx2ywI9 cKXMigo8c4nl4DQDrO935+6cp/TyE2vae5G1ZSLzfBNMcDuZyEB6xME6pIp043KtRJov LzOk/x5T0SUPJRSlmJ8GLsT1UgNQT3v7n7F0Vn9REVDJHLa2hlQut9DAn+E8zyjnFCL6 L0+Vr4v0dgrdha3D8Z3cNFzMrE80kYXEplhyAbWyGM+g4tG+f5GkKUA6xnvDbdPyXZZL ZqPPz2Gwg3oxuDaaF+1ssjX+HkDxmAS5oA+6Pzi/WyKD1mY+eEa/L497AgImtg1RQBFO 8MmQ== MIME-Version: 1.0 X-Received: by 10.58.29.101 with SMTP id j5mr7002431veh.26.1365730729971; Thu, 11 Apr 2013 18:38:49 -0700 (PDT) Received: by 10.52.30.3 with HTTP; Thu, 11 Apr 2013 18:38:49 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <51675E67.7030600@sandeen.net> Date: Fri, 12 Apr 2013 09:38:49 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: Brian Foster , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=047d7b67656204d7f204da1ff7ac X-Barracuda-Connect: mail-vc0-f177.google.com[209.85.220.177] X-Barracuda-Start-Time: 1365730730 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127859 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 --047d7b67656204d7f204da1ff7ac Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Next time I'll dump it according to your suggestions, thank you. 2013/4/12 =B7=FB=D3=C0=CC=CE > Sorry I didn't dump the meta right after unmounting post-failure, I have > dumped meta after a mount/umount, I'll share the meta to you soon. > > > 2013/4/12 Eric Sandeen > >> On 4/11/13 6:26 PM, Brian Foster wrote: >> > On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote: >> >> It happens tonight again on one of our servers, how to debug the root >> >> cause? Thank you. >> >> >> > >> > Hi, >> > >> > I've attached a system tap script (stap -v xfs.stp) that should >> > hopefully print out a bit more data should the issue happen again. Do >> > you have a small enough number of nodes (or predictable enough pattern= ) >> > that you could run this on the nodes that tend to fail and collect the >> > output? >> > >> > Also, could you collect an xfs_metadump of the filesystem in question >> > and make it available for download and analysis somewhere? I believe t= he >> > ideal approach is to mount/umount the filesystem first to replay the l= og >> > before collecting a metadump, but somebody could correct me on that (t= o >> > be safe, you could collect multiple dumps: pre-mount and post-mount). >> >> Dave suggested yesterday that this would be best: metadump right >> after unmounting post-failure, then mount/umount & generate another >> metadump. >> >> -Eric >> >> > Could you also describe your workload a little bit? Thanks. >> > >> > Brian >> > >> >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: >> >> xfs_inotobp() returned error 22. >> >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree >> returned >> >> error 22 >> >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) >> >> called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = =3D >> >> 0xffffffffa02ee20a >> >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting >> >> down filesystem >> >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem >> and >> >> rectify the problem(s) >> >> Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> >> Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> >> Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> >> Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> >> >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --047d7b67656204d7f204da1ff7ac Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Next time I'll dump it according to your suggestions, = thank you.


2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com><= br>
Sorry I didn't dump the= meta right after unmounting post-failure, I have dumped meta after a mount= /umount, I'll share the meta to you soon.


2013/4/12 Eric Sandeen <sandeen@sandeen.net>
On 4/11/13 6:26 PM, Brian Foster wrote:
> On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote:
>> It happens tonight again on one of our servers, how to debug the r= oot
>> cause? Thank you.
>>
>
> Hi,
>
> I've attached a system tap script (stap -v xfs.stp) that should > hopefully print out a bit more data should the issue happen again. Do<= br> > you have a small enough number of nodes (or predictable enough pattern= )
> that you could run this on the nodes that tend to fail and collect the=
> output?
>
> Also, could you collect an xfs_metadump of the filesystem in question<= br> > and make it available for download and analysis somewhere? I believe t= he
> ideal approach is to mount/umount the filesystem first to replay the l= og
> before collecting a metadump, but somebody could correct me on that (t= o
> be safe, you could collect multiple dumps: pre-mount and post-mount).<= br>
Dave suggested yesterday that this would be best: metadump right
after unmounting post-failure, then mount/umount & generate another met= adump.

-Eric

> Could you also describe your workload a little bit? Thanks.
>
> Brian
>
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove:
>> xfs_inotobp() returned error 22.
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree re= turned
>> error 22
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1)=
>> called from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return = address =3D
>> 0xffffffffa02ee20a
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutti= ng
>> down filesystem
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesyst= em and
>> rectify the problem(s)
>> Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 ret= urned.
>> Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 ret= urned.
>> Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 ret= urned.
>> Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 ret= urned.
>>




--
=B7=FB=D3=C0=CC=CE

http://www.ccdhb.org.nz




--
=B7=FB=D3=C0=CC=CE
--047d7b67656204d7f204da1ff7ac-- From shhuiw@gmail.com Thu Apr 11 23:27:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D284F7F37 for ; Thu, 11 Apr 2013 23:27:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5C4E5AC003 for ; Thu, 11 Apr 2013 21:27:11 -0700 (PDT) X-ASG-Debug-ID: 1365740829-04cb6c2c1fcb8a0001-NocioJ Received: from mail-qe0-f43.google.com (mail-qe0-f43.google.com [209.85.128.43]) by cuda.sgi.com with ESMTP id nJFWNEjxkZs0YIJ1 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 21:27:09 -0700 (PDT) X-Barracuda-Envelope-From: shhuiw@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.43 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.43] Received: by mail-qe0-f43.google.com with SMTP id f6so1330034qej.16 for ; Thu, 11 Apr 2013 21:27:09 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.43] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.43] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; bh=6MattO2l8iXr30DzQb3nzRb9QpPOv+paako3PZ6/p7I=; b=uFzNVf0ACiJvxO9wkrBGdJ+lrqgi1I8sNp73I9dsZUbpUTzowI61IrTUYNgsOxdfxV kBK/dm/Kg/deukapc/Ul8jwA/VgnJXLkSJhGnsQdDmXsADRpkoSNy9mS9geR+IBZEbwP eJCjXEDJnmGnItoN+HDMRIFr4/SKaRzNqYOq3gwSlO/PX2uLAwCbTqz31KSsgO7FXgA4 /xQZ9+4EQkwrJwXCFCzpEvvhMGD3OsRylxJiKQzkovJQqvuQnhoac2lAh0Ia/nhhv0LR /gsKVzQdozXpIbG/9aHAvDZUsupYZfbcfKTdwMbX7NJcFUp0+4hBpLGDiETT/X2OoeMn yx0g== X-Received: by 10.224.8.129 with SMTP id h1mr8912879qah.86.1365740829318; Thu, 11 Apr 2013 21:27:09 -0700 (PDT) Received: from [9.115.120.152] ([202.108.130.138]) by mx.google.com with ESMTPS id j6sm11262592qek.8.2013.04.11.21.27.03 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 11 Apr 2013 21:27:08 -0700 (PDT) Message-ID: <51678D0D.1070002@gmail.com> Date: Fri, 12 Apr 2013 12:26:53 +0800 From: Wang Sheng-Hui User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner , Rich Johnston , xfstests Subject: [PATCH v2] xfstests: make install support common/ and tests/ dirs Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: [PATCH v2] xfstests: make install support common/ and tests/ dirs Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qe0-f43.google.com[209.85.128.43] X-Barracuda-Start-Time: 1365740829 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127871 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 xfstests have some change on the organization of the testcases and common* files: * The common* scripts have been reorganized into the common/ dir. * The testcases have been reorganized into sub test dirs under tests/. * The run.* scripts have been removed. This patch uses the simple way to make install support above changes: Make up one Makefile for each newly created subdirs, which can control 'make install' separately. v2 introduces the following changes compared with v1: * Ignore the file 'group' under the top dir, for it's useless in the new structures. * Remove the redundant comments in the Makefiles. * Use XXX_DIR instead of XXX_SUBDIR in the Makefiles under common/ and tests/. * Export TESTS_DIR in teh top level Makefile instead of tests/Makefile. * Obtain the names of dirs for testcases by iterating sub dirs under /tests, not by enumeration in tests/Makefile. Signed-off-by: Wang Sheng-Hui --- Makefile | 12 +++++------- common/Makefile | 16 ++++++++++++++++ tests/Makefile | 19 +++++++++++++++++++ tests/btrfs/Makefile | 20 ++++++++++++++++++++ tests/ext4/Makefile | 20 ++++++++++++++++++++ tests/generic/Makefile | 20 ++++++++++++++++++++ tests/shared/Makefile | 20 ++++++++++++++++++++ tests/udf/Makefile | 20 ++++++++++++++++++++ tests/xfs/Makefile | 20 ++++++++++++++++++++ 9 files changed, 160 insertions(+), 7 deletions(-) create mode 100644 common/Makefile create mode 100644 tests/Makefile create mode 100644 tests/btrfs/Makefile create mode 100644 tests/ext4/Makefile create mode 100644 tests/generic/Makefile create mode 100644 tests/shared/Makefile create mode 100644 tests/udf/Makefile create mode 100644 tests/xfs/Makefile diff --git a/Makefile b/Makefile index 6edd55c..611b36d 100644 --- a/Makefile +++ b/Makefile @@ -52,12 +52,15 @@ LDIRT += $(SRCTAR) endif LIB_SUBDIRS = include lib -TOOL_SUBDIRS = ltp src m4 +TOOL_SUBDIRS = ltp src m4 common ifeq ($(HAVE_DMAPI), true) TOOL_SUBDIRS += dmapi endif -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) +TESTS_DIR = tests +export TESTS_DIR + +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_DIR) default: include/builddefs $(DMAPI_MAKEFILE) $(TESTS) ifeq ($(HAVE_BUILDDEFS), no) @@ -91,12 +94,7 @@ depend: include/builddefs $(addsuffix -depend,$(SUBDIRS)) install: default $(addsuffix -install,$(SUBDIRS)) $(INSTALL) -m 755 -d $(PKG_LIB_DIR) $(INSTALL) -m 755 check $(PKG_LIB_DIR) - $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) - $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) - $(INSTALL) -m 644 group $(PKG_LIB_DIR) $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) - $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) - $(INSTALL) -m 644 common* $(PKG_LIB_DIR) # Nothing. install-dev install-lib: diff --git a/common/Makefile b/common/Makefile new file mode 100644 index 0000000..5f91e8c --- /dev/null +++ b/common/Makefile @@ -0,0 +1,16 @@ +# +# Copyright (c) 2003-2006 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = .. +include $(TOPDIR)/include/builddefs + +COMMON_DIR = common + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/$(COMMON_DIR) + $(INSTALL) -m 644 * $(PKG_LIB_DIR)/$(COMMON_DIR) + +install-dev install-lib: diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..254dd48 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,19 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = .. +include $(TOPDIR)/include/builddefs + +TESTS_SUBDIRS = $(shell find . -maxdepth 1 -type d | sed -n -e 's/\.\///gp') + +include $(BUILDRULES) + +install: $(addsuffix -install,$(TESTS_SUBDIRS)) + $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/$(TESTS_DIR) + +# Nothing. +install-dev install-lib: + +%-install: + $(MAKE) $(MAKEOPTS) -C $* install diff --git a/tests/btrfs/Makefile b/tests/btrfs/Makefile new file mode 100644 index 0000000..e1a5be1 --- /dev/null +++ b/tests/btrfs/Makefile @@ -0,0 +1,20 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +BTRFS_DIR = btrfs +TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(BTRFS_DIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_DIR) + $(INSTALL) -m 644 group $(TARGET_DIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_DIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/ext4/Makefile b/tests/ext4/Makefile new file mode 100644 index 0000000..7a3c8e1 --- /dev/null +++ b/tests/ext4/Makefile @@ -0,0 +1,20 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +EXT4_DIR = ext4 +TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(EXT4_DIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_DIR) + $(INSTALL) -m 644 group $(TARGET_DIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_DIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/generic/Makefile b/tests/generic/Makefile new file mode 100644 index 0000000..9529fb8 --- /dev/null +++ b/tests/generic/Makefile @@ -0,0 +1,20 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +GENERIC_DIR = generic +TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(GENERIC_DIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_DIR) + $(INSTALL) -m 644 group $(TARGET_DIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_DIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/shared/Makefile b/tests/shared/Makefile new file mode 100644 index 0000000..cbd87f9 --- /dev/null +++ b/tests/shared/Makefile @@ -0,0 +1,20 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +SHARED_DIR = shared +TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(SHARED_DIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_DIR) + $(INSTALL) -m 644 group $(TARGET_DIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_DIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/udf/Makefile b/tests/udf/Makefile new file mode 100644 index 0000000..1d96658 --- /dev/null +++ b/tests/udf/Makefile @@ -0,0 +1,20 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +UDF_DIR = udf +TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(UDF_DIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_DIR) + $(INSTALL) -m 644 group $(TARGET_DIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_DIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/xfs/Makefile b/tests/xfs/Makefile new file mode 100644 index 0000000..db94be0 --- /dev/null +++ b/tests/xfs/Makefile @@ -0,0 +1,20 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +XFS_DIR = xfs +TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(XFS_DIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_DIR) + $(INSTALL) -m 644 group $(TARGET_DIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_DIR) + +# Nothing. +install-dev install-lib: -- 1.7.12.4 From yongtaofu@gmail.com Thu Apr 11 23:32:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F196C7F37 for ; Thu, 11 Apr 2013 23:32:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DF6E930404E for ; Thu, 11 Apr 2013 21:32:13 -0700 (PDT) X-ASG-Debug-ID: 1365741129-04cbb057f6c9c90001-NocioJ Received: from mail-ve0-f175.google.com (mail-ve0-f175.google.com [209.85.128.175]) by cuda.sgi.com with ESMTP id dPja9s7USsGQtCqV (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 21:32:10 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.175] Received: by mail-ve0-f175.google.com with SMTP id pb11so2062479veb.20 for ; Thu, 11 Apr 2013 21:32:09 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=L8mhdq0PCVE5Md/144P5ottH6Vvj1W5pzytwSlZmSxU=; b=NnZu1D17jhc3q7ZMWk4fWx+m/hIjfA5hhdTinhb0ET5LHa8rmQMu0BmiuinN2v31PK /pgcjZUV9KgOmQAg1pcx5kVb5POSW+7d5YIXSKOSGQ2Wqv5eQ4T3ng8wOlM2UDDvVlxg aP+SmqZI42/Sn4pKV7SqTY/HVnbhLTXrqkLUKMLv+oXYN3Lc2F0JUX27XCfKknKRE30g zvdHBgBiOmYLVcMAjLdj2So8S13uQ2j+PnxhvJ0mjGqr8J+di34fwncEjOe0AFan9OrR TuYmiU3Ppl9ZYU85IQzu5yM1jjMyeRQof8tTbFJu7JrwEImxA38VADSLtv10krn109Xs rKmA== MIME-Version: 1.0 X-Received: by 10.52.177.161 with SMTP id cr1mr6154015vdc.64.1365741129673; Thu, 11 Apr 2013 21:32:09 -0700 (PDT) Received: by 10.52.30.3 with HTTP; Thu, 11 Apr 2013 21:32:09 -0700 (PDT) In-Reply-To: <516746AC.3090808@redhat.com> References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> Date: Fri, 12 Apr 2013 12:32:09 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Emmanuel Florac , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=20cf3071ceace4976004da2262e5 X-Barracuda-Connect: mail-ve0-f175.google.com[209.85.128.175] X-Barracuda-Start-Time: 1365741130 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.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_SA038b, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127871 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.20 BSF_SC0_SA038b Custom Rule SA038b --20cf3071ceace4976004da2262e5 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brian, Sorry but when I execute the script it says: WARNING: cannot find module xfs debuginfo: No DWARF information found semantic error: no match while resolving probe point module("xfs").function("xfs_iunlink") uname -a 2.6.32-279.el6.x86_64 kernel debuginfo has been installed. Where can I find the correct xfs debuginfo? Thank you for your help. 2013/4/12 Brian Foster > On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote: > > It happens tonight again on one of our servers, how to debug the root > > cause? Thank you. > > > > Hi, > > I've attached a system tap script (stap -v xfs.stp) that should > hopefully print out a bit more data should the issue happen again. Do > you have a small enough number of nodes (or predictable enough pattern) > that you could run this on the nodes that tend to fail and collect the > output? > > Also, could you collect an xfs_metadump of the filesystem in question > and make it available for download and analysis somewhere? I believe the > ideal approach is to mount/umount the filesystem first to replay the log > before collecting a metadump, but somebody could correct me on that (to > be safe, you could collect multiple dumps: pre-mount and post-mount). > > Could you also describe your workload a little bit? Thanks. > > Brian > > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > > xfs_inotobp() returned error 22. > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree returne= d > > error 22 > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) > > called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = =3D > > 0xffffffffa02ee20a > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting > > down filesystem > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem an= d > > rectify the problem(s) > > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned= . > > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned= . > > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned= . > > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returned= . > > > > xfs_repair -n > > > > > > Phase 7 - verify link counts... > > would have reset inode 20021 nlinks from 0 to 1 > > would have reset inode 20789 nlinks from 0 to 1 > > would have reset inode 35125 nlinks from 0 to 1 > > would have reset inode 35637 nlinks from 0 to 1 > > would have reset inode 36149 nlinks from 0 to 1 > > would have reset inode 38197 nlinks from 0 to 1 > > would have reset inode 39477 nlinks from 0 to 1 > > would have reset inode 54069 nlinks from 0 to 1 > > would have reset inode 62261 nlinks from 0 to 1 > > would have reset inode 63029 nlinks from 0 to 1 > > would have reset inode 72501 nlinks from 0 to 1 > > would have reset inode 79925 nlinks from 0 to 1 > > would have reset inode 81205 nlinks from 0 to 1 > > would have reset inode 84789 nlinks from 0 to 1 > > would have reset inode 87861 nlinks from 0 to 1 > > would have reset inode 90663 nlinks from 0 to 1 > > would have reset inode 91189 nlinks from 0 to 1 > > would have reset inode 95541 nlinks from 0 to 1 > > would have reset inode 98101 nlinks from 0 to 1 > > would have reset inode 101173 nlinks from 0 to 1 > > would have reset inode 113205 nlinks from 0 to 1 > > would have reset inode 114741 nlinks from 0 to 1 > > would have reset inode 126261 nlinks from 0 to 1 > > would have reset inode 140597 nlinks from 0 to 1 > > would have reset inode 144693 nlinks from 0 to 1 > > would have reset inode 147765 nlinks from 0 to 1 > > would have reset inode 152885 nlinks from 0 to 1 > > would have reset inode 161333 nlinks from 0 to 1 > > would have reset inode 161845 nlinks from 0 to 1 > > would have reset inode 167477 nlinks from 0 to 1 > > would have reset inode 172341 nlinks from 0 to 1 > > would have reset inode 191797 nlinks from 0 to 1 > > would have reset inode 204853 nlinks from 0 to 1 > > would have reset inode 205365 nlinks from 0 to 1 > > would have reset inode 215349 nlinks from 0 to 1 > > would have reset inode 215861 nlinks from 0 to 1 > > would have reset inode 216373 nlinks from 0 to 1 > > would have reset inode 217397 nlinks from 0 to 1 > > would have reset inode 224309 nlinks from 0 to 1 > > would have reset inode 225589 nlinks from 0 to 1 > > would have reset inode 234549 nlinks from 0 to 1 > > would have reset inode 234805 nlinks from 0 to 1 > > would have reset inode 249653 nlinks from 0 to 1 > > would have reset inode 250677 nlinks from 0 to 1 > > would have reset inode 252469 nlinks from 0 to 1 > > would have reset inode 261429 nlinks from 0 to 1 > > would have reset inode 265013 nlinks from 0 to 1 > > would have reset inode 266805 nlinks from 0 to 1 > > would have reset inode 267317 nlinks from 0 to 1 > > would have reset inode 268853 nlinks from 0 to 1 > > would have reset inode 272437 nlinks from 0 to 1 > > would have reset inode 273205 nlinks from 0 to 1 > > would have reset inode 274229 nlinks from 0 to 1 > > would have reset inode 278325 nlinks from 0 to 1 > > would have reset inode 278837 nlinks from 0 to 1 > > would have reset inode 281397 nlinks from 0 to 1 > > would have reset inode 292661 nlinks from 0 to 1 > > would have reset inode 300853 nlinks from 0 to 1 > > would have reset inode 302901 nlinks from 0 to 1 > > would have reset inode 305205 nlinks from 0 to 1 > > would have reset inode 314165 nlinks from 0 to 1 > > would have reset inode 315189 nlinks from 0 to 1 > > would have reset inode 320309 nlinks from 0 to 1 > > would have reset inode 324917 nlinks from 0 to 1 > > would have reset inode 328245 nlinks from 0 to 1 > > would have reset inode 335925 nlinks from 0 to 1 > > would have reset inode 339253 nlinks from 0 to 1 > > would have reset inode 339765 nlinks from 0 to 1 > > would have reset inode 348213 nlinks from 0 to 1 > > would have reset inode 360501 nlinks from 0 to 1 > > would have reset inode 362037 nlinks from 0 to 1 > > would have reset inode 366389 nlinks from 0 to 1 > > would have reset inode 385845 nlinks from 0 to 1 > > would have reset inode 390709 nlinks from 0 to 1 > > would have reset inode 409141 nlinks from 0 to 1 > > would have reset inode 413237 nlinks from 0 to 1 > > would have reset inode 414773 nlinks from 0 to 1 > > would have reset inode 417845 nlinks from 0 to 1 > > would have reset inode 436021 nlinks from 0 to 1 > > would have reset inode 439349 nlinks from 0 to 1 > > would have reset inode 447029 nlinks from 0 to 1 > > would have reset inode 491317 nlinks from 0 to 1 > > would have reset inode 494133 nlinks from 0 to 1 > > would have reset inode 495413 nlinks from 0 to 1 > > would have reset inode 501301 nlinks from 0 to 1 > > would have reset inode 506421 nlinks from 0 to 1 > > would have reset inode 508469 nlinks from 0 to 1 > > would have reset inode 508981 nlinks from 0 to 1 > > would have reset inode 511797 nlinks from 0 to 1 > > would have reset inode 513077 nlinks from 0 to 1 > > would have reset inode 517941 nlinks from 0 to 1 > > would have reset inode 521013 nlinks from 0 to 1 > > would have reset inode 522805 nlinks from 0 to 1 > > would have reset inode 523317 nlinks from 0 to 1 > > would have reset inode 525621 nlinks from 0 to 1 > > would have reset inode 527925 nlinks from 0 to 1 > > would have reset inode 535605 nlinks from 0 to 1 > > would have reset inode 541749 nlinks from 0 to 1 > > would have reset inode 573493 nlinks from 0 to 1 > > would have reset inode 578613 nlinks from 0 to 1 > > would have reset inode 583029 nlinks from 0 to 1 > > would have reset inode 585525 nlinks from 0 to 1 > > would have reset inode 586293 nlinks from 0 to 1 > > would have reset inode 586805 nlinks from 0 to 1 > > would have reset inode 591413 nlinks from 0 to 1 > > would have reset inode 594485 nlinks from 0 to 1 > > would have reset inode 596277 nlinks from 0 to 1 > > would have reset inode 603189 nlinks from 0 to 1 > > would have reset inode 613429 nlinks from 0 to 1 > > would have reset inode 617781 nlinks from 0 to 1 > > would have reset inode 621877 nlinks from 0 to 1 > > would have reset inode 623925 nlinks from 0 to 1 > > would have reset inode 625205 nlinks from 0 to 1 > > would have reset inode 626741 nlinks from 0 to 1 > > would have reset inode 639541 nlinks from 0 to 1 > > would have reset inode 640053 nlinks from 0 to 1 > > would have reset inode 640565 nlinks from 0 to 1 > > would have reset inode 645173 nlinks from 0 to 1 > > would have reset inode 652853 nlinks from 0 to 1 > > would have reset inode 656181 nlinks from 0 to 1 > > would have reset inode 659253 nlinks from 0 to 1 > > would have reset inode 663605 nlinks from 0 to 1 > > would have reset inode 667445 nlinks from 0 to 1 > > would have reset inode 680757 nlinks from 0 to 1 > > would have reset inode 691253 nlinks from 0 to 1 > > would have reset inode 691765 nlinks from 0 to 1 > > would have reset inode 697653 nlinks from 0 to 1 > > would have reset inode 700469 nlinks from 0 to 1 > > would have reset inode 707893 nlinks from 0 to 1 > > would have reset inode 716853 nlinks from 0 to 1 > > would have reset inode 722229 nlinks from 0 to 1 > > would have reset inode 722741 nlinks from 0 to 1 > > would have reset inode 723765 nlinks from 0 to 1 > > would have reset inode 731957 nlinks from 0 to 1 > > would have reset inode 742965 nlinks from 0 to 1 > > would have reset inode 743477 nlinks from 0 to 1 > > would have reset inode 745781 nlinks from 0 to 1 > > would have reset inode 746293 nlinks from 0 to 1 > > would have reset inode 774453 nlinks from 0 to 1 > > would have reset inode 778805 nlinks from 0 to 1 > > would have reset inode 785013 nlinks from 0 to 1 > > would have reset inode 785973 nlinks from 0 to 1 > > would have reset inode 791349 nlinks from 0 to 1 > > would have reset inode 796981 nlinks from 0 to 1 > > would have reset inode 803381 nlinks from 0 to 1 > > would have reset inode 806965 nlinks from 0 to 1 > > would have reset inode 811798 nlinks from 0 to 1 > > would have reset inode 812310 nlinks from 0 to 1 > > would have reset inode 813078 nlinks from 0 to 1 > > would have reset inode 813607 nlinks from 0 to 1 > > would have reset inode 814183 nlinks from 0 to 1 > > would have reset inode 822069 nlinks from 0 to 1 > > would have reset inode 828469 nlinks from 0 to 1 > > would have reset inode 830005 nlinks from 0 to 1 > > would have reset inode 832053 nlinks from 0 to 1 > > would have reset inode 832565 nlinks from 0 to 1 > > would have reset inode 836661 nlinks from 0 to 1 > > would have reset inode 841013 nlinks from 0 to 1 > > would have reset inode 841525 nlinks from 0 to 1 > > would have reset inode 845365 nlinks from 0 to 1 > > would have reset inode 846133 nlinks from 0 to 1 > > would have reset inode 847157 nlinks from 0 to 1 > > would have reset inode 852533 nlinks from 0 to 1 > > would have reset inode 857141 nlinks from 0 to 1 > > would have reset inode 863271 nlinks from 0 to 1 > > would have reset inode 866855 nlinks from 0 to 1 > > would have reset inode 887861 nlinks from 0 to 1 > > would have reset inode 891701 nlinks from 0 to 1 > > would have reset inode 894773 nlinks from 0 to 1 > > would have reset inode 900149 nlinks from 0 to 1 > > would have reset inode 902197 nlinks from 0 to 1 > > would have reset inode 906293 nlinks from 0 to 1 > > would have reset inode 906805 nlinks from 0 to 1 > > would have reset inode 909877 nlinks from 0 to 1 > > would have reset inode 925493 nlinks from 0 to 1 > > would have reset inode 949543 nlinks from 0 to 1 > > would have reset inode 955175 nlinks from 0 to 1 > > would have reset inode 963623 nlinks from 0 to 1 > > would have reset inode 967733 nlinks from 0 to 1 > > would have reset inode 968231 nlinks from 0 to 1 > > would have reset inode 982069 nlinks from 0 to 1 > > would have reset inode 1007413 nlinks from 0 to 1 > > would have reset inode 1011509 nlinks from 0 to 1 > > would have reset inode 1014069 nlinks from 0 to 1 > > would have reset inode 1014581 nlinks from 0 to 1 > > would have reset inode 1022005 nlinks from 0 to 1 > > would have reset inode 1022517 nlinks from 0 to 1 > > would have reset inode 1023029 nlinks from 0 to 1 > > would have reset inode 1025333 nlinks from 0 to 1 > > would have reset inode 1043765 nlinks from 0 to 1 > > would have reset inode 1044789 nlinks from 0 to 1 > > would have reset inode 1049397 nlinks from 0 to 1 > > would have reset inode 1050933 nlinks from 0 to 1 > > would have reset inode 1051445 nlinks from 0 to 1 > > would have reset inode 1054261 nlinks from 0 to 1 > > would have reset inode 1060917 nlinks from 0 to 1 > > would have reset inode 1063477 nlinks from 0 to 1 > > would have reset inode 1076021 nlinks from 0 to 1 > > would have reset inode 1081141 nlinks from 0 to 1 > > would have reset inode 1086261 nlinks from 0 to 1 > > would have reset inode 1097269 nlinks from 0 to 1 > > would have reset inode 1099829 nlinks from 0 to 1 > > would have reset inode 1100853 nlinks from 0 to 1 > > would have reset inode 1101877 nlinks from 0 to 1 > > would have reset inode 1126709 nlinks from 0 to 1 > > would have reset inode 1134389 nlinks from 0 to 1 > > would have reset inode 1141045 nlinks from 0 to 1 > > would have reset inode 1141557 nlinks from 0 to 1 > > would have reset inode 1142581 nlinks from 0 to 1 > > would have reset inode 1148469 nlinks from 0 to 1 > > would have reset inode 1153333 nlinks from 0 to 1 > > would have reset inode 1181749 nlinks from 0 to 1 > > would have reset inode 1192245 nlinks from 0 to 1 > > would have reset inode 1198133 nlinks from 0 to 1 > > would have reset inode 1203765 nlinks from 0 to 1 > > would have reset inode 1221429 nlinks from 0 to 1 > > would have reset inode 1223989 nlinks from 0 to 1 > > would have reset inode 1235509 nlinks from 0 to 1 > > would have reset inode 1239349 nlinks from 0 to 1 > > would have reset inode 1240885 nlinks from 0 to 1 > > would have reset inode 1241397 nlinks from 0 to 1 > > would have reset inode 1241909 nlinks from 0 to 1 > > would have reset inode 1242421 nlinks from 0 to 1 > > would have reset inode 1244981 nlinks from 0 to 1 > > would have reset inode 1246517 nlinks from 0 to 1 > > would have reset inode 1253429 nlinks from 0 to 1 > > would have reset inode 1271861 nlinks from 0 to 1 > > would have reset inode 1274677 nlinks from 0 to 1 > > would have reset inode 1277749 nlinks from 0 to 1 > > would have reset inode 1278773 nlinks from 0 to 1 > > would have reset inode 1286709 nlinks from 0 to 1 > > would have reset inode 1288245 nlinks from 0 to 1 > > would have reset inode 1299765 nlinks from 0 to 1 > > would have reset inode 1302325 nlinks from 0 to 1 > > would have reset inode 1304885 nlinks from 0 to 1 > > would have reset inode 1305397 nlinks from 0 to 1 > > would have reset inode 1307509 nlinks from 0 to 1 > > would have reset inode 1309493 nlinks from 0 to 1 > > would have reset inode 1310517 nlinks from 0 to 1 > > would have reset inode 1311029 nlinks from 0 to 1 > > would have reset inode 1312053 nlinks from 0 to 1 > > would have reset inode 1316917 nlinks from 0 to 1 > > would have reset inode 1317941 nlinks from 0 to 1 > > would have reset inode 1320821 nlinks from 0 to 1 > > would have reset inode 1322805 nlinks from 0 to 1 > > would have reset inode 1332789 nlinks from 0 to 1 > > would have reset inode 1336373 nlinks from 0 to 1 > > would have reset inode 1345653 nlinks from 0 to 1 > > would have reset inode 1354549 nlinks from 0 to 1 > > would have reset inode 1361973 nlinks from 0 to 1 > > would have reset inode 1369909 nlinks from 0 to 1 > > would have reset inode 1372981 nlinks from 0 to 1 > > would have reset inode 1388853 nlinks from 0 to 1 > > would have reset inode 1402933 nlinks from 0 to 1 > > would have reset inode 1403445 nlinks from 0 to 1 > > would have reset inode 1420085 nlinks from 0 to 1 > > would have reset inode 1452853 nlinks from 0 to 1 > > would have reset inode 1456437 nlinks from 0 to 1 > > would have reset inode 1457973 nlinks from 0 to 1 > > would have reset inode 1459253 nlinks from 0 to 1 > > would have reset inode 1467957 nlinks from 0 to 1 > > would have reset inode 1471541 nlinks from 0 to 1 > > would have reset inode 1476661 nlinks from 0 to 1 > > would have reset inode 1479733 nlinks from 0 to 1 > > would have reset inode 1483061 nlinks from 0 to 1 > > would have reset inode 1484085 nlinks from 0 to 1 > > would have reset inode 1486133 nlinks from 0 to 1 > > would have reset inode 1489461 nlinks from 0 to 1 > > would have reset inode 1490037 nlinks from 0 to 1 > > would have reset inode 1492021 nlinks from 0 to 1 > > would have reset inode 1493557 nlinks from 0 to 1 > > would have reset inode 1494069 nlinks from 0 to 1 > > would have reset inode 1496885 nlinks from 0 to 1 > > would have reset inode 1498421 nlinks from 0 to 1 > > would have reset inode 1498933 nlinks from 0 to 1 > > would have reset inode 1499957 nlinks from 0 to 1 > > would have reset inode 1506101 nlinks from 0 to 1 > > would have reset inode 1507637 nlinks from 0 to 1 > > would have reset inode 1510453 nlinks from 0 to 1 > > would have reset inode 1514293 nlinks from 0 to 1 > > would have reset inode 1517365 nlinks from 0 to 1 > > would have reset inode 1520693 nlinks from 0 to 1 > > would have reset inode 1521973 nlinks from 0 to 1 > > would have reset inode 1530421 nlinks from 0 to 1 > > would have reset inode 1530933 nlinks from 0 to 1 > > would have reset inode 1537333 nlinks from 0 to 1 > > would have reset inode 1538357 nlinks from 0 to 1 > > would have reset inode 1548853 nlinks from 0 to 1 > > would have reset inode 1553973 nlinks from 0 to 1 > > would have reset inode 1557301 nlinks from 0 to 1 > > would have reset inode 1564213 nlinks from 0 to 1 > > would have reset inode 1564725 nlinks from 0 to 1 > > would have reset inode 1576501 nlinks from 0 to 1 > > would have reset inode 1580597 nlinks from 0 to 1 > > would have reset inode 1584693 nlinks from 0 to 1 > > would have reset inode 1586485 nlinks from 0 to 1 > > would have reset inode 1589301 nlinks from 0 to 1 > > would have reset inode 1589813 nlinks from 0 to 1 > > would have reset inode 1592629 nlinks from 0 to 1 > > would have reset inode 1595701 nlinks from 0 to 1 > > would have reset inode 1601077 nlinks from 0 to 1 > > would have reset inode 1623861 nlinks from 0 to 1 > > would have reset inode 1626677 nlinks from 0 to 1 > > would have reset inode 1627701 nlinks from 0 to 1 > > would have reset inode 1633333 nlinks from 0 to 1 > > would have reset inode 1639221 nlinks from 0 to 1 > > would have reset inode 1649205 nlinks from 0 to 1 > > would have reset inode 1686325 nlinks from 0 to 1 > > would have reset inode 1690677 nlinks from 0 to 1 > > would have reset inode 1693749 nlinks from 0 to 1 > > would have reset inode 1704757 nlinks from 0 to 1 > > would have reset inode 1707061 nlinks from 0 to 1 > > would have reset inode 1709109 nlinks from 0 to 1 > > would have reset inode 1719349 nlinks from 0 to 1 > > would have reset inode 1737013 nlinks from 0 to 1 > > would have reset inode 1741365 nlinks from 0 to 1 > > would have reset inode 1747509 nlinks from 0 to 1 > > would have reset inode 1770805 nlinks from 0 to 1 > > would have reset inode 1780789 nlinks from 0 to 1 > > would have reset inode 1793589 nlinks from 0 to 1 > > would have reset inode 1795125 nlinks from 0 to 1 > > would have reset inode 1800757 nlinks from 0 to 1 > > would have reset inode 1801269 nlinks from 0 to 1 > > would have reset inode 1802549 nlinks from 0 to 1 > > would have reset inode 1804085 nlinks from 0 to 1 > > would have reset inode 1817141 nlinks from 0 to 1 > > would have reset inode 1821749 nlinks from 0 to 1 > > would have reset inode 1832757 nlinks from 0 to 1 > > would have reset inode 1836341 nlinks from 0 to 1 > > would have reset inode 1856309 nlinks from 0 to 1 > > would have reset inode 1900597 nlinks from 0 to 1 > > would have reset inode 1902901 nlinks from 0 to 1 > > would have reset inode 1912373 nlinks from 0 to 1 > > would have reset inode 1943093 nlinks from 0 to 1 > > would have reset inode 1944373 nlinks from 0 to 1 > > would have reset inode 1954101 nlinks from 0 to 1 > > would have reset inode 1955893 nlinks from 0 to 1 > > would have reset inode 1961781 nlinks from 0 to 1 > > would have reset inode 1974325 nlinks from 0 to 1 > > would have reset inode 1978677 nlinks from 0 to 1 > > would have reset inode 1981237 nlinks from 0 to 1 > > would have reset inode 1992245 nlinks from 0 to 1 > > would have reset inode 2000949 nlinks from 0 to 1 > > would have reset inode 2002229 nlinks from 0 to 1 > > would have reset inode 2004789 nlinks from 0 to 1 > > would have reset inode 2005301 nlinks from 0 to 1 > > would have reset inode 2011189 nlinks from 0 to 1 > > would have reset inode 2012981 nlinks from 0 to 1 > > would have reset inode 2015285 nlinks from 0 to 1 > > would have reset inode 2018869 nlinks from 0 to 1 > > would have reset inode 2028341 nlinks from 0 to 1 > > would have reset inode 2028853 nlinks from 0 to 1 > > would have reset inode 2030901 nlinks from 0 to 1 > > would have reset inode 2032181 nlinks from 0 to 1 > > would have reset inode 2032693 nlinks from 0 to 1 > > would have reset inode 2040117 nlinks from 0 to 1 > > would have reset inode 2053685 nlinks from 0 to 1 > > would have reset inode 2083893 nlinks from 0 to 1 > > would have reset inode 2087221 nlinks from 0 to 1 > > would have reset inode 2095925 nlinks from 0 to 1 > > would have reset inode 2098741 nlinks from 0 to 1 > > would have reset inode 2100533 nlinks from 0 to 1 > > would have reset inode 2101301 nlinks from 0 to 1 > > would have reset inode 2123573 nlinks from 0 to 1 > > would have reset inode 2132789 nlinks from 0 to 1 > > would have reset inode 2133813 nlinks from 0 to 1 > > > > > > > > > > > > 2013/4/10 =B7=FB=D3=C0=CC=CE > > > > > The storage info is as following: > > RAID-6 > > SATA HDD > > Controller: PERC H710P Mini (Embedded) > > Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes > > 255 heads, 63 sectors/track, 3647334 cylinders > > Units =3D cylinders of 16065 * 512 =3D 8225280 bytes > > Sector size (logical/physical): 512 bytes / 512 bytes > > I/O size (minimum/optimal): 512 bytes / 512 bytes > > Disk identifier: 0x00000000 > > > > sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (30.0 TB/27.= 2 > > TiB) > > sd 0:2:1:0: [sdb] Write Protect is off > > sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08 > > sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enabled, doesn'= t > > support DPO or FUA > > sd 0:2:1:0: [sdb] Attached SCSI disk > > > > *-storage > > description: RAID bus controller > > product: MegaRAID SAS 2208 [Thunderbolt] > > vendor: LSI Logic / Symbios Logic > > physical id: 0 > > bus info: pci@0000:02:00.0 > > logical name: scsi0 > > version: 01 > > width: 64 bits > > clock: 33MHz > > capabilities: storage pm pciexpress vpd msi msix bus_master > > cap_list rom > > configuration: driver=3Dmegaraid_sas latency=3D0 > > resources: irq:42 ioport:fc00(size=3D256) > > memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff > > memory:dc800000-dc81ffff(prefetchable) > > *-disk:0 > > description: SCSI Disk > > product: PERC H710P > > vendor: DELL > > physical id: 2.0.0 > > bus info: scsi@0:2.0.0 > > logical name: /dev/sda > > version: 3.13 > > serial: 0049d6ce1d9f2035180096fde490f648 > > size: 558GiB (599GB) > > capabilities: partitioned partitioned:dos > > configuration: ansiversion=3D5 signature=3D000aa336 > > *-disk:1 > > description: SCSI Disk > > product: PERC H710P > > vendor: DELL > > physical id: 2.1.0 > > bus info: scsi@0:2.1.0 > > logical name: /dev/sdb > > logical name: /mnt/xfsd > > version: 3.13 > > serial: 003366f71da22035180096fde490f648 > > size: 27TiB (30TB) > > configuration: ansiversion=3D5 mount.fstype=3Dxfs > > > mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,swi= dth=3D1280,noquota > > state=3Dmounted > > > > Thank you. > > > > > > 2013/4/10 Emmanuel Florac > > > > > > Le Tue, 9 Apr 2013 23:10:03 +0800 > > =B7=FB=D3=C0=CC=CE > =A8=A6crivait: > > > > > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected. > > > > Shutting down filesystem > > > > This. I/O error detected. That means that at some point the > > underlying > > device (disk, RAID array, SAN volume) couldn't be reached. So > this > > could very well be a case of a flakey drive, array, cable or SC= SI > > driver. > > > > What's the storage setup here? > > > > -- > > > ------------------------------------------------------------------------ > > Emmanuel Florac | Direction technique > > | Intellique > > | > > > > | +33 1 78 94 84 02 > > > ------------------------------------------------------------------------ > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > --=20 =B7=FB=D3=C0=CC=CE --20cf3071ceace4976004da2262e5 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brian,
Sorry but when I execute= the script it says:
WARNING: cannot find module xfs debuginfo: No DWARF= information found
semantic error: no match while resolving probe point = module("xfs").function("xfs_iunlink")

uname -a
2.6.32-279.el6.x86_64
kernel debuginfo has been in= stalled.

Where can I find the correct xfs debuginfo?
<= /div>


Thank you for your help.


2013/4/12 Brian Foster <bfoster@redhat= .com>
On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote:
> It happens tonight again on one of our servers, how to debug the root<= br> > cause? Thank you.
>

Hi,

I've attached a system tap script (stap -v xfs.stp) that should
hopefully print out a bit more data should the issue happen again. Do
you have a small enough number of nodes (or predictable enough pattern)
that you could run this on the nodes that tend to fail and collect the
output?

Also, could you collect an xfs_metadump of the filesystem in question
and make it available for download and analysis somewhere? I believe the ideal approach is to mount/umount the filesystem first to replay the log before collecting a metadump, but somebody could correct me on that (to
be safe, you could collect multiple dumps: pre-mount and post-mount).

Could you also describe your workload a little bit? Thanks.

Brian

> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove:
> xfs_inotobp() returned error 22.
> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree return= ed
> error 22
> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1)
> called from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return addr= ess =3D
> 0xffffffffa02ee20a
> Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting > down filesystem
> Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem a= nd
> rectify the problem(s)
> Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
> Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
> Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
> Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
>
> xfs_repair -n
>
>
> Phase 7 - verify link counts...
> would have reset inode 20021 nlinks from 0 to 1
> would have reset inode 20789 nlinks from 0 to 1
> would have reset inode 35125 nlinks from 0 to 1
> would have reset inode 35637 nlinks from 0 to 1
> would have reset inode 36149 nlinks from 0 to 1
> would have reset inode 38197 nlinks from 0 to 1
> would have reset inode 39477 nlinks from 0 to 1
> would have reset inode 54069 nlinks from 0 to 1
> would have reset inode 62261 nlinks from 0 to 1
> would have reset inode 63029 nlinks from 0 to 1
> would have reset inode 72501 nlinks from 0 to 1
> would have reset inode 79925 nlinks from 0 to 1
> would have reset inode 81205 nlinks from 0 to 1
> would have reset inode 84789 nlinks from 0 to 1
> would have reset inode 87861 nlinks from 0 to 1
> would have reset inode 90663 nlinks from 0 to 1
> would have reset inode 91189 nlinks from 0 to 1
> would have reset inode 95541 nlinks from 0 to 1
> would have reset inode 98101 nlinks from 0 to 1
> would have reset inode 101173 nlinks from 0 to 1
> would have reset inode 113205 nlinks from 0 to 1
> would have reset inode 114741 nlinks from 0 to 1
> would have reset inode 126261 nlinks from 0 to 1
> would have reset inode 140597 nlinks from 0 to 1
> would have reset inode 144693 nlinks from 0 to 1
> would have reset inode 147765 nlinks from 0 to 1
> would have reset inode 152885 nlinks from 0 to 1
> would have reset inode 161333 nlinks from 0 to 1
> would have reset inode 161845 nlinks from 0 to 1
> would have reset inode 167477 nlinks from 0 to 1
> would have reset inode 172341 nlinks from 0 to 1
> would have reset inode 191797 nlinks from 0 to 1
> would have reset inode 204853 nlinks from 0 to 1
> would have reset inode 205365 nlinks from 0 to 1
> would have reset inode 215349 nlinks from 0 to 1
> would have reset inode 215861 nlinks from 0 to 1
> would have reset inode 216373 nlinks from 0 to 1
> would have reset inode 217397 nlinks from 0 to 1
> would have reset inode 224309 nlinks from 0 to 1
> would have reset inode 225589 nlinks from 0 to 1
> would have reset inode 234549 nlinks from 0 to 1
> would have reset inode 234805 nlinks from 0 to 1
> would have reset inode 249653 nlinks from 0 to 1
> would have reset inode 250677 nlinks from 0 to 1
> would have reset inode 252469 nlinks from 0 to 1
> would have reset inode 261429 nlinks from 0 to 1
> would have reset inode 265013 nlinks from 0 to 1
> would have reset inode 266805 nlinks from 0 to 1
> would have reset inode 267317 nlinks from 0 to 1
> would have reset inode 268853 nlinks from 0 to 1
> would have reset inode 272437 nlinks from 0 to 1
> would have reset inode 273205 nlinks from 0 to 1
> would have reset inode 274229 nlinks from 0 to 1
> would have reset inode 278325 nlinks from 0 to 1
> would have reset inode 278837 nlinks from 0 to 1
> would have reset inode 281397 nlinks from 0 to 1
> would have reset inode 292661 nlinks from 0 to 1
> would have reset inode 300853 nlinks from 0 to 1
> would have reset inode 302901 nlinks from 0 to 1
> would have reset inode 305205 nlinks from 0 to 1
> would have reset inode 314165 nlinks from 0 to 1
> would have reset inode 315189 nlinks from 0 to 1
> would have reset inode 320309 nlinks from 0 to 1
> would have reset inode 324917 nlinks from 0 to 1
> would have reset inode 328245 nlinks from 0 to 1
> would have reset inode 335925 nlinks from 0 to 1
> would have reset inode 339253 nlinks from 0 to 1
> would have reset inode 339765 nlinks from 0 to 1
> would have reset inode 348213 nlinks from 0 to 1
> would have reset inode 360501 nlinks from 0 to 1
> would have reset inode 362037 nlinks from 0 to 1
> would have reset inode 366389 nlinks from 0 to 1
> would have reset inode 385845 nlinks from 0 to 1
> would have reset inode 390709 nlinks from 0 to 1
> would have reset inode 409141 nlinks from 0 to 1
> would have reset inode 413237 nlinks from 0 to 1
> would have reset inode 414773 nlinks from 0 to 1
> would have reset inode 417845 nlinks from 0 to 1
> would have reset inode 436021 nlinks from 0 to 1
> would have reset inode 439349 nlinks from 0 to 1
> would have reset inode 447029 nlinks from 0 to 1
> would have reset inode 491317 nlinks from 0 to 1
> would have reset inode 494133 nlinks from 0 to 1
> would have reset inode 495413 nlinks from 0 to 1
> would have reset inode 501301 nlinks from 0 to 1
> would have reset inode 506421 nlinks from 0 to 1
> would have reset inode 508469 nlinks from 0 to 1
> would have reset inode 508981 nlinks from 0 to 1
> would have reset inode 511797 nlinks from 0 to 1
> would have reset inode 513077 nlinks from 0 to 1
> would have reset inode 517941 nlinks from 0 to 1
> would have reset inode 521013 nlinks from 0 to 1
> would have reset inode 522805 nlinks from 0 to 1
> would have reset inode 523317 nlinks from 0 to 1
> would have reset inode 525621 nlinks from 0 to 1
> would have reset inode 527925 nlinks from 0 to 1
> would have reset inode 535605 nlinks from 0 to 1
> would have reset inode 541749 nlinks from 0 to 1
> would have reset inode 573493 nlinks from 0 to 1
> would have reset inode 578613 nlinks from 0 to 1
> would have reset inode 583029 nlinks from 0 to 1
> would have reset inode 585525 nlinks from 0 to 1
> would have reset inode 586293 nlinks from 0 to 1
> would have reset inode 586805 nlinks from 0 to 1
> would have reset inode 591413 nlinks from 0 to 1
> would have reset inode 594485 nlinks from 0 to 1
> would have reset inode 596277 nlinks from 0 to 1
> would have reset inode 603189 nlinks from 0 to 1
> would have reset inode 613429 nlinks from 0 to 1
> would have reset inode 617781 nlinks from 0 to 1
> would have reset inode 621877 nlinks from 0 to 1
> would have reset inode 623925 nlinks from 0 to 1
> would have reset inode 625205 nlinks from 0 to 1
> would have reset inode 626741 nlinks from 0 to 1
> would have reset inode 639541 nlinks from 0 to 1
> would have reset inode 640053 nlinks from 0 to 1
> would have reset inode 640565 nlinks from 0 to 1
> would have reset inode 645173 nlinks from 0 to 1
> would have reset inode 652853 nlinks from 0 to 1
> would have reset inode 656181 nlinks from 0 to 1
> would have reset inode 659253 nlinks from 0 to 1
> would have reset inode 663605 nlinks from 0 to 1
> would have reset inode 667445 nlinks from 0 to 1
> would have reset inode 680757 nlinks from 0 to 1
> would have reset inode 691253 nlinks from 0 to 1
> would have reset inode 691765 nlinks from 0 to 1
> would have reset inode 697653 nlinks from 0 to 1
> would have reset inode 700469 nlinks from 0 to 1
> would have reset inode 707893 nlinks from 0 to 1
> would have reset inode 716853 nlinks from 0 to 1
> would have reset inode 722229 nlinks from 0 to 1
> would have reset inode 722741 nlinks from 0 to 1
> would have reset inode 723765 nlinks from 0 to 1
> would have reset inode 731957 nlinks from 0 to 1
> would have reset inode 742965 nlinks from 0 to 1
> would have reset inode 743477 nlinks from 0 to 1
> would have reset inode 745781 nlinks from 0 to 1
> would have reset inode 746293 nlinks from 0 to 1
> would have reset inode 774453 nlinks from 0 to 1
> would have reset inode 778805 nlinks from 0 to 1
> would have reset inode 785013 nlinks from 0 to 1
> would have reset inode 785973 nlinks from 0 to 1
> would have reset inode 791349 nlinks from 0 to 1
> would have reset inode 796981 nlinks from 0 to 1
> would have reset inode 803381 nlinks from 0 to 1
> would have reset inode 806965 nlinks from 0 to 1
> would have reset inode 811798 nlinks from 0 to 1
> would have reset inode 812310 nlinks from 0 to 1
> would have reset inode 813078 nlinks from 0 to 1
> would have reset inode 813607 nlinks from 0 to 1
> would have reset inode 814183 nlinks from 0 to 1
> would have reset inode 822069 nlinks from 0 to 1
> would have reset inode 828469 nlinks from 0 to 1
> would have reset inode 830005 nlinks from 0 to 1
> would have reset inode 832053 nlinks from 0 to 1
> would have reset inode 832565 nlinks from 0 to 1
> would have reset inode 836661 nlinks from 0 to 1
> would have reset inode 841013 nlinks from 0 to 1
> would have reset inode 841525 nlinks from 0 to 1
> would have reset inode 845365 nlinks from 0 to 1
> would have reset inode 846133 nlinks from 0 to 1
> would have reset inode 847157 nlinks from 0 to 1
> would have reset inode 852533 nlinks from 0 to 1
> would have reset inode 857141 nlinks from 0 to 1
> would have reset inode 863271 nlinks from 0 to 1
> would have reset inode 866855 nlinks from 0 to 1
> would have reset inode 887861 nlinks from 0 to 1
> would have reset inode 891701 nlinks from 0 to 1
> would have reset inode 894773 nlinks from 0 to 1
> would have reset inode 900149 nlinks from 0 to 1
> would have reset inode 902197 nlinks from 0 to 1
> would have reset inode 906293 nlinks from 0 to 1
> would have reset inode 906805 nlinks from 0 to 1
> would have reset inode 909877 nlinks from 0 to 1
> would have reset inode 925493 nlinks from 0 to 1
> would have reset inode 949543 nlinks from 0 to 1
> would have reset inode 955175 nlinks from 0 to 1
> would have reset inode 963623 nlinks from 0 to 1
> would have reset inode 967733 nlinks from 0 to 1
> would have reset inode 968231 nlinks from 0 to 1
> would have reset inode 982069 nlinks from 0 to 1
> would have reset inode 1007413 nlinks from 0 to 1
> would have reset inode 1011509 nlinks from 0 to 1
> would have reset inode 1014069 nlinks from 0 to 1
> would have reset inode 1014581 nlinks from 0 to 1
> would have reset inode 1022005 nlinks from 0 to 1
> would have reset inode 1022517 nlinks from 0 to 1
> would have reset inode 1023029 nlinks from 0 to 1
> would have reset inode 1025333 nlinks from 0 to 1
> would have reset inode 1043765 nlinks from 0 to 1
> would have reset inode 1044789 nlinks from 0 to 1
> would have reset inode 1049397 nlinks from 0 to 1
> would have reset inode 1050933 nlinks from 0 to 1
> would have reset inode 1051445 nlinks from 0 to 1
> would have reset inode 1054261 nlinks from 0 to 1
> would have reset inode 1060917 nlinks from 0 to 1
> would have reset inode 1063477 nlinks from 0 to 1
> would have reset inode 1076021 nlinks from 0 to 1
> would have reset inode 1081141 nlinks from 0 to 1
> would have reset inode 1086261 nlinks from 0 to 1
> would have reset inode 1097269 nlinks from 0 to 1
> would have reset inode 1099829 nlinks from 0 to 1
> would have reset inode 1100853 nlinks from 0 to 1
> would have reset inode 1101877 nlinks from 0 to 1
> would have reset inode 1126709 nlinks from 0 to 1
> would have reset inode 1134389 nlinks from 0 to 1
> would have reset inode 1141045 nlinks from 0 to 1
> would have reset inode 1141557 nlinks from 0 to 1
> would have reset inode 1142581 nlinks from 0 to 1
> would have reset inode 1148469 nlinks from 0 to 1
> would have reset inode 1153333 nlinks from 0 to 1
> would have reset inode 1181749 nlinks from 0 to 1
> would have reset inode 1192245 nlinks from 0 to 1
> would have reset inode 1198133 nlinks from 0 to 1
> would have reset inode 1203765 nlinks from 0 to 1
> would have reset inode 1221429 nlinks from 0 to 1
> would have reset inode 1223989 nlinks from 0 to 1
> would have reset inode 1235509 nlinks from 0 to 1
> would have reset inode 1239349 nlinks from 0 to 1
> would have reset inode 1240885 nlinks from 0 to 1
> would have reset inode 1241397 nlinks from 0 to 1
> would have reset inode 1241909 nlinks from 0 to 1
> would have reset inode 1242421 nlinks from 0 to 1
> would have reset inode 1244981 nlinks from 0 to 1
> would have reset inode 1246517 nlinks from 0 to 1
> would have reset inode 1253429 nlinks from 0 to 1
> would have reset inode 1271861 nlinks from 0 to 1
> would have reset inode 1274677 nlinks from 0 to 1
> would have reset inode 1277749 nlinks from 0 to 1
> would have reset inode 1278773 nlinks from 0 to 1
> would have reset inode 1286709 nlinks from 0 to 1
> would have reset inode 1288245 nlinks from 0 to 1
> would have reset inode 1299765 nlinks from 0 to 1
> would have reset inode 1302325 nlinks from 0 to 1
> would have reset inode 1304885 nlinks from 0 to 1
> would have reset inode 1305397 nlinks from 0 to 1
> would have reset inode 1307509 nlinks from 0 to 1
> would have reset inode 1309493 nlinks from 0 to 1
> would have reset inode 1310517 nlinks from 0 to 1
> would have reset inode 1311029 nlinks from 0 to 1
> would have reset inode 1312053 nlinks from 0 to 1
> would have reset inode 1316917 nlinks from 0 to 1
> would have reset inode 1317941 nlinks from 0 to 1
> would have reset inode 1320821 nlinks from 0 to 1
> would have reset inode 1322805 nlinks from 0 to 1
> would have reset inode 1332789 nlinks from 0 to 1
> would have reset inode 1336373 nlinks from 0 to 1
> would have reset inode 1345653 nlinks from 0 to 1
> would have reset inode 1354549 nlinks from 0 to 1
> would have reset inode 1361973 nlinks from 0 to 1
> would have reset inode 1369909 nlinks from 0 to 1
> would have reset inode 1372981 nlinks from 0 to 1
> would have reset inode 1388853 nlinks from 0 to 1
> would have reset inode 1402933 nlinks from 0 to 1
> would have reset inode 1403445 nlinks from 0 to 1
> would have reset inode 1420085 nlinks from 0 to 1
> would have reset inode 1452853 nlinks from 0 to 1
> would have reset inode 1456437 nlinks from 0 to 1
> would have reset inode 1457973 nlinks from 0 to 1
> would have reset inode 1459253 nlinks from 0 to 1
> would have reset inode 1467957 nlinks from 0 to 1
> would have reset inode 1471541 nlinks from 0 to 1
> would have reset inode 1476661 nlinks from 0 to 1
> would have reset inode 1479733 nlinks from 0 to 1
> would have reset inode 1483061 nlinks from 0 to 1
> would have reset inode 1484085 nlinks from 0 to 1
> would have reset inode 1486133 nlinks from 0 to 1
> would have reset inode 1489461 nlinks from 0 to 1
> would have reset inode 1490037 nlinks from 0 to 1
> would have reset inode 1492021 nlinks from 0 to 1
> would have reset inode 1493557 nlinks from 0 to 1
> would have reset inode 1494069 nlinks from 0 to 1
> would have reset inode 1496885 nlinks from 0 to 1
> would have reset inode 1498421 nlinks from 0 to 1
> would have reset inode 1498933 nlinks from 0 to 1
> would have reset inode 1499957 nlinks from 0 to 1
> would have reset inode 1506101 nlinks from 0 to 1
> would have reset inode 1507637 nlinks from 0 to 1
> would have reset inode 1510453 nlinks from 0 to 1
> would have reset inode 1514293 nlinks from 0 to 1
> would have reset inode 1517365 nlinks from 0 to 1
> would have reset inode 1520693 nlinks from 0 to 1
> would have reset inode 1521973 nlinks from 0 to 1
> would have reset inode 1530421 nlinks from 0 to 1
> would have reset inode 1530933 nlinks from 0 to 1
> would have reset inode 1537333 nlinks from 0 to 1
> would have reset inode 1538357 nlinks from 0 to 1
> would have reset inode 1548853 nlinks from 0 to 1
> would have reset inode 1553973 nlinks from 0 to 1
> would have reset inode 1557301 nlinks from 0 to 1
> would have reset inode 1564213 nlinks from 0 to 1
> would have reset inode 1564725 nlinks from 0 to 1
> would have reset inode 1576501 nlinks from 0 to 1
> would have reset inode 1580597 nlinks from 0 to 1
> would have reset inode 1584693 nlinks from 0 to 1
> would have reset inode 1586485 nlinks from 0 to 1
> would have reset inode 1589301 nlinks from 0 to 1
> would have reset inode 1589813 nlinks from 0 to 1
> would have reset inode 1592629 nlinks from 0 to 1
> would have reset inode 1595701 nlinks from 0 to 1
> would have reset inode 1601077 nlinks from 0 to 1
> would have reset inode 1623861 nlinks from 0 to 1
> would have reset inode 1626677 nlinks from 0 to 1
> would have reset inode 1627701 nlinks from 0 to 1
> would have reset inode 1633333 nlinks from 0 to 1
> would have reset inode 1639221 nlinks from 0 to 1
> would have reset inode 1649205 nlinks from 0 to 1
> would have reset inode 1686325 nlinks from 0 to 1
> would have reset inode 1690677 nlinks from 0 to 1
> would have reset inode 1693749 nlinks from 0 to 1
> would have reset inode 1704757 nlinks from 0 to 1
> would have reset inode 1707061 nlinks from 0 to 1
> would have reset inode 1709109 nlinks from 0 to 1
> would have reset inode 1719349 nlinks from 0 to 1
> would have reset inode 1737013 nlinks from 0 to 1
> would have reset inode 1741365 nlinks from 0 to 1
> would have reset inode 1747509 nlinks from 0 to 1
> would have reset inode 1770805 nlinks from 0 to 1
> would have reset inode 1780789 nlinks from 0 to 1
> would have reset inode 1793589 nlinks from 0 to 1
> would have reset inode 1795125 nlinks from 0 to 1
> would have reset inode 1800757 nlinks from 0 to 1
> would have reset inode 1801269 nlinks from 0 to 1
> would have reset inode 1802549 nlinks from 0 to 1
> would have reset inode 1804085 nlinks from 0 to 1
> would have reset inode 1817141 nlinks from 0 to 1
> would have reset inode 1821749 nlinks from 0 to 1
> would have reset inode 1832757 nlinks from 0 to 1
> would have reset inode 1836341 nlinks from 0 to 1
> would have reset inode 1856309 nlinks from 0 to 1
> would have reset inode 1900597 nlinks from 0 to 1
> would have reset inode 1902901 nlinks from 0 to 1
> would have reset inode 1912373 nlinks from 0 to 1
> would have reset inode 1943093 nlinks from 0 to 1
> would have reset inode 1944373 nlinks from 0 to 1
> would have reset inode 1954101 nlinks from 0 to 1
> would have reset inode 1955893 nlinks from 0 to 1
> would have reset inode 1961781 nlinks from 0 to 1
> would have reset inode 1974325 nlinks from 0 to 1
> would have reset inode 1978677 nlinks from 0 to 1
> would have reset inode 1981237 nlinks from 0 to 1
> would have reset inode 1992245 nlinks from 0 to 1
> would have reset inode 2000949 nlinks from 0 to 1
> would have reset inode 2002229 nlinks from 0 to 1
> would have reset inode 2004789 nlinks from 0 to 1
> would have reset inode 2005301 nlinks from 0 to 1
> would have reset inode 2011189 nlinks from 0 to 1
> would have reset inode 2012981 nlinks from 0 to 1
> would have reset inode 2015285 nlinks from 0 to 1
> would have reset inode 2018869 nlinks from 0 to 1
> would have reset inode 2028341 nlinks from 0 to 1
> would have reset inode 2028853 nlinks from 0 to 1
> would have reset inode 2030901 nlinks from 0 to 1
> would have reset inode 2032181 nlinks from 0 to 1
> would have reset inode 2032693 nlinks from 0 to 1
> would have reset inode 2040117 nlinks from 0 to 1
> would have reset inode 2053685 nlinks from 0 to 1
> would have reset inode 2083893 nlinks from 0 to 1
> would have reset inode 2087221 nlinks from 0 to 1
> would have reset inode 2095925 nlinks from 0 to 1
> would have reset inode 2098741 nlinks from 0 to 1
> would have reset inode 2100533 nlinks from 0 to 1
> would have reset inode 2101301 nlinks from 0 to 1
> would have reset inode 2123573 nlinks from 0 to 1
> would have reset inode 2132789 nlinks from 0 to 1
> would have reset inode 2133813 nlinks from 0 to 1
>
>
>
>
>
> 2013/4/10 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     The storage info is as following:
>     RAID-6
>     SATA HDD
>     Controller: PERC H710P Mini (Embedded)
>     Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes
>     255 heads, 63 sectors/track, 3647334 cylinders
>     Units =3D cylinders of 16065 * 512 =3D 8225280 bytes
>     Sector size (logical/physical): 512 bytes / 512 bytes >     I/O size (minimum/optimal): 512 bytes / 512 bytes
>     Disk identifier: 0x00000000
>
>     sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (= 30.0 TB/27.2
>     TiB)
>     sd 0:2:1:0: [sdb] Write Protect is off
>     sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08
>     sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enab= led, doesn't
>     support DPO or FUA
>     sd 0:2:1:0: [sdb] Attached SCSI disk
>
>     *-storage
>            description: RAID bus control= ler
>            product: MegaRAID SAS 2208 [T= hunderbolt]
>            vendor: LSI Logic / Symbios L= ogic
>            physical id: 0
>            bus info: pci@0000:02:00.0 >            logical name: scsi0
>            version: 01
>            width: 64 bits
>            clock: 33MHz
>            capabilities: storage pm pcie= xpress vpd msi msix bus_master
>     cap_list rom
>            configuration: driver=3Dmegar= aid_sas latency=3D0
>            resources: irq:42 ioport:fc00= (size=3D256)
>     memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff
>     memory:dc800000-dc81ffff(prefetchable)
>          *-disk:0
>               description: SCSI Dis= k
>               product: PERC H710P >               vendor: DELL
>               physical id: 2.0.0 >               bus info: scsi@0:2.0.= 0
>               logical name: /dev/sd= a
>               version: 3.13
>               serial: 0049d6ce1d9f2= 035180096fde490f648
>               size: 558GiB (599GB)<= br> >               capabilities: partiti= oned partitioned:dos
>               configuration: ansive= rsion=3D5 signature=3D000aa336
>          *-disk:1
>               description: SCSI Dis= k
>               product: PERC H710P >               vendor: DELL
>               physical id: 2.1.0 >               bus info: scsi@0:2.1.= 0
>               logical name: /dev/sd= b
>               logical name: /mnt/xf= sd
>               version: 3.13
>               serial: 003366f71da22= 035180096fde490f648
>               size: 27TiB (30TB) >               configuration: ansive= rsion=3D5 mount.fstype=3Dxfs
>     mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64= k,sunit=3D128,swidth=3D1280,noquota
>     state=3Dmounted
>
>     Thank you.
>
>
>     2013/4/10 Emmanuel Florac <eflorac@intellique.com
>     <mailto:eflorac@intellique.com>>
>
>         Le Tue, 9 Apr 2013 23:10:03 +0800
>         =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>> =A8=A6crivait:
>
>         > > Apr  9 11:01:30 cqdx kernel= : XFS (sdb): I/O Error Detected.
>         > > Shutting down filesystem
>
>         This. I/O error detected. That means that = at some point the
>         underlying
>         device (disk, RAID array, SAN volume) coul= dn't be reached. So this
>         could very well be a case of a flakey driv= e, array, cable or SCSI
>         driver.
>
>         What's the storage setup here?
>
>         --
>         ------------------------------------------= ------------------------------
>         Emmanuel Florac     |   Dir= ection technique
>                     =         |   Intellique
>                     =         |   <eflorac@intellique.com
>         <mailto:eflorac@intellique.com>>



--
=B7=FB=D3= =C0=CC=CE
--20cf3071ceace4976004da2262e5-- From sandeen@sandeen.net Fri Apr 12 00:16:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1C3CB7F37 for ; Fri, 12 Apr 2013 00:16:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 09A688F80A1 for ; Thu, 11 Apr 2013 22:16:34 -0700 (PDT) X-ASG-Debug-ID: 1365743790-04cbb057f6cc9c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id RTZO1z8BNZOCkmTE for ; Thu, 11 Apr 2013 22:16:31 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A9AE563C5B50; Fri, 12 Apr 2013 00:16:30 -0500 (CDT) Message-ID: <516798AE.9050908@sandeen.net> Date: Fri, 12 Apr 2013 00:16:30 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Brian Foster , Ben Myers , "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1365743790 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127873 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/11/13 11:32 PM, 符永涛 wrote: > Hi Brian, > Sorry but when I execute the script it says: > WARNING: cannot find module xfs debuginfo: No DWARF information found > semantic error: no match while resolving probe point module("xfs").function("xfs_iunlink") > > uname -a > 2.6.32-279.el6.x86_64 > kernel debuginfo has been installed. > > Where can I find the correct xfs debuginfo? it should be in the kernel-debuginfo rpm (of the same version/release as the kernel rpm you're running) You should have: /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug If not, can you show: # uname -a # rpm -q kernel # rpm -q kernel-debuginfo -Eric From yongtaofu@gmail.com Fri Apr 12 00:23:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 2742F7F37 for ; Fri, 12 Apr 2013 00:23:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E60A98F80A1 for ; Thu, 11 Apr 2013 22:23:11 -0700 (PDT) X-ASG-Debug-ID: 1365744186-04cb6c2c1dcf1f0001-NocioJ Received: from mail-ve0-f176.google.com (mail-ve0-f176.google.com [209.85.128.176]) by cuda.sgi.com with ESMTP id XyB9ohAZ8M99xfCE (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 22:23:06 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.176 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.176] Received: by mail-ve0-f176.google.com with SMTP id ox1so2096675veb.35 for ; Thu, 11 Apr 2013 22:23:06 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.176] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.176] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=4aYmpJZ+RNyfs+ZwEpKvoM8Dh9sCakfAY7lhTI63yjo=; b=UIK29hCL9/5GGTaE/zOpL0HAV8t9tkWxNoTV20rYPHylqfO3q4RK9PqeobZzKoM2sO SIcVpfHamZAdkIcnT/emjlhvqQVnoPmdo5DcmrhayJWlEEXVD5iXjAHLPJUUx1aKMdIE gQf7/u8k6Si+vCwTdDtGqaxgmeZC/o1ZoKcFLe4g7HZSwzl0MBhjwN7W3HgF+YJhmcXx 5Vv1pFOWVaxvVpYNWxpZAXVzwhiTVg83/E9akuLp72EBt1waTWK+9vZItupCGoCpjqd8 lTAwpoNx3GsLbIn0jMUVAXh9rG7/Hu5HD6IR5C5TVz5aWvo5kgu3pnylB993JA8uZwZD iu5g== MIME-Version: 1.0 X-Received: by 10.58.214.231 with SMTP id od7mr7341741vec.44.1365744185922; Thu, 11 Apr 2013 22:23:05 -0700 (PDT) Received: by 10.52.30.3 with HTTP; Thu, 11 Apr 2013 22:23:05 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> Date: Fri, 12 Apr 2013 13:23:05 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Emmanuel Florac , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e011831980e5b8d04da231926 X-Barracuda-Connect: mail-ve0-f176.google.com[209.85.128.176] X-Barracuda-Start-Time: 1365744186 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.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_SA038b, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127875 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.20 BSF_SC0_SA038b Custom Rule SA038b --089e011831980e5b8d04da231926 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable sudo stap -L 'kernel.trace("*")'|grep xfs_iunlink sudo stap -L 'kernel.trace("*")'|grep xfs_ifree sudo stap -L 'kernel.trace("*")'|grep xfs kernel.trace("xfs_agf") $mp:struct xfs_mount* $agf:struct xfs_agf* $flags:int $caller_ip:long unsigned int kernel.trace("xfs_alloc_busy") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t kernel.trace("xfs_alloc_busy_clear") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t kernel.trace("xfs_alloc_busy_enomem") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t kernel.trace("xfs_alloc_busy_force") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t kernel.trace("xfs_alloc_busy_reuse") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t kernel.trace("xfs_alloc_busy_trim") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t $tbno:xfs_agblock_t $tlen:xfs_extlen_t kernel.trace("xfs_alloc_exact_done") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_exact_error") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_exact_notfound") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_file_space") $ip:struct xfs_inode* kernel.trace("xfs_alloc_near_busy") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_near_error") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_near_first") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_near_greater") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_near_lesser") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_near_noentry") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_near_nominleft") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_size_busy") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_size_done") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_size_error") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_size_neither") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_size_noentry") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_size_nominleft") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_small_done") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_small_error") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_small_freelist") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_small_notenough") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_vextent_allfailed") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_vextent_badargs") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_vextent_loopfailed") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_vextent_noagbp") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_vextent_nofix") $args:struct xfs_alloc_arg* kernel.trace("xfs_attr_list_add") $ctx:struct xfs_attr_list_context* kernel.trace("xfs_attr_list_full") $ctx:struct xfs_attr_list_context* kernel.trace("xfs_attr_list_leaf") $ctx:struct xfs_attr_list_context* kernel.trace("xfs_attr_list_leaf_end") $ctx:struct xfs_attr_list_context* kernel.trace("xfs_attr_list_node_descend") $ctx:struct xfs_attr_list_context* $btree:struct xfs_da_node_entry* kernel.trace("xfs_attr_list_notfound") $ctx:struct xfs_attr_list_context* kernel.trace("xfs_attr_list_sf") $ctx:struct xfs_attr_list_context* kernel.trace("xfs_attr_list_sf_all") $ctx:struct xfs_attr_list_context* kernel.trace("xfs_attr_list_wrong_blk") $ctx:struct xfs_attr_list_context* kernel.trace("xfs_bdstrat_shut") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_bmap_post_update") $ip:struct xfs_inode* $idx:xfs_extnum_t $state:int $caller_ip:long unsigned int kernel.trace("xfs_bmap_pre_update") $ip:struct xfs_inode* $idx:xfs_extnum_t $state:int $caller_ip:long unsigned int kernel.trace("xfs_btree_corrupt") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_bawrite") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_bdwrite") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_cond_lock") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_delwri_dequeue") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_delwri_queue") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_delwri_split") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_error_relse") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_find") $bp:struct xfs_buf* $flags:unsigned int $caller_ip:long unsigned int kernel.trace("xfs_buf_free") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_get") $bp:struct xfs_buf* $flags:unsigned int $caller_ip:long unsigned int kernel.trace("xfs_buf_get_uncached") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_hold") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_init") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_iodone") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_ioerror") $bp:struct xfs_buf* $error:int $caller_ip:long unsigned int kernel.trace("xfs_buf_iorequest") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_iowait") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_iowait_done") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_item_committed") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_item_format") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_item_format_stale") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_item_iodone") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_item_iodone_async") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_item_pin") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_item_push") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_item_pushbuf") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_item_relse") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_item_size") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_item_size_stale") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_item_trylock") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_item_unlock") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_item_unlock_stale") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_item_unpin") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_item_unpin_stale") $bip:struct xfs_buf_log_item* kernel.trace("xfs_buf_lock") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_lock_done") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_read") $bp:struct xfs_buf* $flags:unsigned int $caller_ip:long unsigned int kernel.trace("xfs_buf_rele") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_buf_unlock") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_bunmap") $ip:struct xfs_inode* $bno:xfs_fileoff_t $len:xfs_filblks_t $flags:int $caller_ip:long unsigned int kernel.trace("xfs_check_acl") $ip:struct xfs_inode* kernel.trace("xfs_clear_inode") $ip:struct xfs_inode* kernel.trace("xfs_create") $dp:struct xfs_inode* $xfs_create:struct xfs_name* kernel.trace("xfs_da_btree_corrupt") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_delalloc_enospc") $ip:struct xfs_inode* $offset:xfs_off_t $count:ssize_t kernel.trace("xfs_destroy_inode") $ip:struct xfs_inode* kernel.trace("xfs_dir2_block_addname") $args:struct xfs_da_args* kernel.trace("xfs_dir2_block_lookup") $args:struct xfs_da_args* kernel.trace("xfs_dir2_block_removename") $args:struct xfs_da_args* kernel.trace("xfs_dir2_block_replace") $args:struct xfs_da_args* kernel.trace("xfs_dir2_block_to_leaf") $args:struct xfs_da_args* kernel.trace("xfs_dir2_block_to_sf") $args:struct xfs_da_args* kernel.trace("xfs_dir2_grow_inode") $args:struct xfs_da_args* $idx:int kernel.trace("xfs_dir2_leaf_addname") $args:struct xfs_da_args* kernel.trace("xfs_dir2_leaf_lookup") $args:struct xfs_da_args* kernel.trace("xfs_dir2_leaf_removename") $args:struct xfs_da_args* kernel.trace("xfs_dir2_leaf_replace") $args:struct xfs_da_args* kernel.trace("xfs_dir2_leaf_to_block") $args:struct xfs_da_args* kernel.trace("xfs_dir2_leaf_to_node") $args:struct xfs_da_args* kernel.trace("xfs_dir2_leafn_add") $args:struct xfs_da_args* $idx:int kernel.trace("xfs_dir2_leafn_moveents") $args:struct xfs_da_args* $src_idx:int $dst_idx:int $count:int kernel.trace("xfs_dir2_leafn_remove") $args:struct xfs_da_args* $idx:int kernel.trace("xfs_dir2_node_addname") $args:struct xfs_da_args* kernel.trace("xfs_dir2_node_lookup") $args:struct xfs_da_args* kernel.trace("xfs_dir2_node_removename") $args:struct xfs_da_args* kernel.trace("xfs_dir2_node_replace") $args:struct xfs_da_args* kernel.trace("xfs_dir2_node_to_leaf") $args:struct xfs_da_args* kernel.trace("xfs_dir2_sf_addname") $args:struct xfs_da_args* kernel.trace("xfs_dir2_sf_create") $args:struct xfs_da_args* kernel.trace("xfs_dir2_sf_lookup") $args:struct xfs_da_args* kernel.trace("xfs_dir2_sf_removename") $args:struct xfs_da_args* kernel.trace("xfs_dir2_sf_replace") $args:struct xfs_da_args* kernel.trace("xfs_dir2_sf_to_block") $args:struct xfs_da_args* kernel.trace("xfs_dir2_sf_toino4") $args:struct xfs_da_args* kernel.trace("xfs_dir2_sf_toino8") $args:struct xfs_da_args* kernel.trace("xfs_dir2_shrink_inode") $args:struct xfs_da_args* $idx:int kernel.trace("xfs_discard_busy") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t kernel.trace("xfs_discard_exclude") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t kernel.trace("xfs_discard_extent") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t kernel.trace("xfs_discard_toosmall") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t kernel.trace("xfs_dqadjust") $dqp:struct xfs_dquot* kernel.trace("xfs_dqalloc") $dqp:struct xfs_dquot* kernel.trace("xfs_dqattach_found") $dqp:struct xfs_dquot* kernel.trace("xfs_dqattach_get") $dqp:struct xfs_dquot* kernel.trace("xfs_dqflush") $dqp:struct xfs_dquot* kernel.trace("xfs_dqflush_done") $dqp:struct xfs_dquot* kernel.trace("xfs_dqflush_force") $dqp:struct xfs_dquot* kernel.trace("xfs_dqget_hit") $dqp:struct xfs_dquot* kernel.trace("xfs_dqget_miss") $dqp:struct xfs_dquot* kernel.trace("xfs_dqinit") $dqp:struct xfs_dquot* kernel.trace("xfs_dqlookup_done") $dqp:struct xfs_dquot* kernel.trace("xfs_dqlookup_found") $dqp:struct xfs_dquot* kernel.trace("xfs_dqlookup_freelist") $dqp:struct xfs_dquot* kernel.trace("xfs_dqlookup_want") $dqp:struct xfs_dquot* kernel.trace("xfs_dqput") $dqp:struct xfs_dquot* kernel.trace("xfs_dqput_free") $dqp:struct xfs_dquot* kernel.trace("xfs_dqput_wait") $dqp:struct xfs_dquot* kernel.trace("xfs_dqread") $dqp:struct xfs_dquot* kernel.trace("xfs_dqread_fail") $dqp:struct xfs_dquot* kernel.trace("xfs_dqreclaim_dirty") $dqp:struct xfs_dquot* kernel.trace("xfs_dqreclaim_unlink") $dqp:struct xfs_dquot* kernel.trace("xfs_dqreclaim_want") $dqp:struct xfs_dquot* kernel.trace("xfs_dqrele") $dqp:struct xfs_dquot* kernel.trace("xfs_dqreuse") $dqp:struct xfs_dquot* kernel.trace("xfs_dqtobp_read") $dqp:struct xfs_dquot* kernel.trace("xfs_dquot_dqalloc") $ip:struct xfs_inode* kernel.trace("xfs_dquot_dqdetach") $ip:struct xfs_inode* kernel.trace("xfs_extlist") $ip:struct xfs_inode* $idx:xfs_extnum_t $state:int $caller_ip:long unsigned int kernel.trace("xfs_file_buffered_write") $ip:struct xfs_inode* $count:size_t $offset:loff_t $flags:int kernel.trace("xfs_file_compat_ioctl") $ip:struct xfs_inode* kernel.trace("xfs_file_direct_write") $ip:struct xfs_inode* $count:size_t $offset:loff_t $flags:int kernel.trace("xfs_file_fsync") $ip:struct xfs_inode* kernel.trace("xfs_file_ioctl") $ip:struct xfs_inode* kernel.trace("xfs_file_read") $ip:struct xfs_inode* $count:size_t $offset:loff_t $flags:int kernel.trace("xfs_file_splice_read") $ip:struct xfs_inode* $count:size_t $offset:loff_t $flags:int kernel.trace("xfs_file_splice_write") $ip:struct xfs_inode* $count:size_t $offset:loff_t $flags:int kernel.trace("xfs_free_extent") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t $isfl:bool $haveleft:int $haveright:int kernel.trace("xfs_free_file_space") $ip:struct xfs_inode* kernel.trace("xfs_get_blocks_alloc") $ip:struct xfs_inode* $offset:xfs_off_t $count:ssize_t $type:int $irec:struct xfs_bmbt_irec* kernel.trace("xfs_get_blocks_found") $ip:struct xfs_inode* $offset:xfs_off_t $count:ssize_t $type:int $irec:struct xfs_bmbt_irec* kernel.trace("xfs_get_blocks_notfound") $ip:struct xfs_inode* $offset:xfs_off_t $count:ssize_t kernel.trace("xfs_getattr") $ip:struct xfs_inode* kernel.trace("xfs_iext_insert") $ip:struct xfs_inode* $idx:xfs_extnum_t $r:struct xfs_bmbt_irec* $state:int $caller_ip:long unsigned int kernel.trace("xfs_iext_remove") $ip:struct xfs_inode* $idx:xfs_extnum_t $state:int $caller_ip:long unsigned int kernel.trace("xfs_iget_hit") $ip:struct xfs_inode* kernel.trace("xfs_iget_miss") $ip:struct xfs_inode* kernel.trace("xfs_iget_reclaim") $ip:struct xfs_inode* kernel.trace("xfs_iget_reclaim_fail") $ip:struct xfs_inode* kernel.trace("xfs_iget_skip") $ip:struct xfs_inode* kernel.trace("xfs_ihold") $ip:struct xfs_inode* $caller_ip:long unsigned in= t kernel.trace("xfs_ilock") $ip:struct xfs_inode* $lock_flags:unsigned int $caller_ip:long unsigned int kernel.trace("xfs_ilock_demote") $ip:struct xfs_inode* $lock_flags:unsigned int $caller_ip:long unsigned int kernel.trace("xfs_ilock_nowait") $ip:struct xfs_inode* $lock_flags:unsigned int $caller_ip:long unsigned int kernel.trace("xfs_inode_item_push") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_inode_pin") $ip:struct xfs_inode* $caller_ip:long unsigned int kernel.trace("xfs_inode_unpin") $ip:struct xfs_inode* $caller_ip:long unsigned int kernel.trace("xfs_inode_unpin_nowait") $ip:struct xfs_inode* $caller_ip:long unsigned int kernel.trace("xfs_invalidatepage") $inode:struct inode* $page:struct page* $off:long unsigned int kernel.trace("xfs_ioctl_setattr") $ip:struct xfs_inode* kernel.trace("xfs_irele") $ip:struct xfs_inode* $caller_ip:long unsigned in= t kernel.trace("xfs_itruncate_finish_end") $ip:struct xfs_inode* $new_size:xfs_fsize_t kernel.trace("xfs_itruncate_finish_start") $ip:struct xfs_inode* $new_size:xfs_fsize_t kernel.trace("xfs_itruncate_start") $ip:struct xfs_inode* $new_size:xfs_fsize_t $flag:int $toss_start:xfs_off_t $toss_finish:xfs_off_= t kernel.trace("xfs_iunlock") $ip:struct xfs_inode* $lock_flags:unsigned int $caller_ip:long unsigned int kernel.trace("xfs_link") $dp:struct xfs_inode* $xfs_link:struct xfs_name* kernel.trace("xfs_log_done_nonperm") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_done_perm") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_grant_enter") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_grant_error") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_grant_exit") $log:struct log* $tic:struct xlog_ticket= * kernel.trace("xfs_log_grant_sleep1") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_grant_sleep2") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_grant_wake1") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_grant_wake2") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_grant_wake_up") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_recover_buf_cancel") $log:struct log* $buf_f:struct xfs_buf_log_format* kernel.trace("xfs_log_recover_buf_cancel_add") $log:struct log* $buf_f:struct xfs_buf_log_format* kernel.trace("xfs_log_recover_buf_cancel_ref_inc") $log:struct log* $buf_f:struct xfs_buf_log_format* kernel.trace("xfs_log_recover_buf_dquot_buf") $log:struct log* $buf_f:struct xfs_buf_log_format* kernel.trace("xfs_log_recover_buf_inode_buf") $log:struct log* $buf_f:struct xfs_buf_log_format* kernel.trace("xfs_log_recover_buf_not_cancel") $log:struct log* $buf_f:struct xfs_buf_log_format* kernel.trace("xfs_log_recover_buf_recover") $log:struct log* $buf_f:struct xfs_buf_log_format* kernel.trace("xfs_log_recover_buf_reg_buf") $log:struct log* $buf_f:struct xfs_buf_log_format* kernel.trace("xfs_log_recover_inode_cancel") $log:struct log* $in_f:struct xfs_inode_log_format* kernel.trace("xfs_log_recover_inode_recover") $log:struct log* $in_f:struct xfs_inode_log_format* kernel.trace("xfs_log_recover_inode_skip") $log:struct log* $in_f:struct xfs_inode_log_format* kernel.trace("xfs_log_recover_item_add") $log:struct log* $trans:struct xlog_recover* $item:struct xlog_recover_item* $pass:int kernel.trace("xfs_log_recover_item_add_cont") $log:struct log* $trans:struct xlog_recover* $item:struct xlog_recover_item* $pass:int kernel.trace("xfs_log_recover_item_recover") $log:struct log* $trans:struct xlog_recover* $item:struct xlog_recover_item* $pass:int kernel.trace("xfs_log_recover_item_reorder_head") $log:struct log* $trans:struct xlog_recover* $item:struct xlog_recover_item* $pass:int kernel.trace("xfs_log_recover_item_reorder_tail") $log:struct log* $trans:struct xlog_recover* $item:struct xlog_recover_item* $pass:int kernel.trace("xfs_log_regrant_reserve_enter") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_regrant_reserve_exit") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_regrant_reserve_sub") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_regrant_write_enter") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_regrant_write_error") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_regrant_write_exit") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_regrant_write_sleep1") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_regrant_write_sleep2") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_regrant_write_wake1") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_regrant_write_wake2") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_regrant_write_wake_up") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_reserve") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_umount_write") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_ungrant_enter") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_ungrant_exit") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_log_ungrant_sub") $log:struct log* $tic:struct xlog_ticket* kernel.trace("xfs_lookup") $dp:struct xfs_inode* $xfs_lookup:struct xfs_name* kernel.trace("xfs_map_blocks_alloc") $ip:struct xfs_inode* $offset:xfs_off_t $count:ssize_t $type:int $irec:struct xfs_bmbt_irec* kernel.trace("xfs_map_blocks_found") $ip:struct xfs_inode* $offset:xfs_off_t $count:ssize_t $type:int $irec:struct xfs_bmbt_irec* kernel.trace("xfs_pagecache_inval") $ip:struct xfs_inode* $start:xfs_off_t $finish:xfs_off_t kernel.trace("xfs_perag_clear_reclaim") $mp:struct xfs_mount* $agno:xfs_agnumber_t $refcount:int $caller_ip:long unsigned int kernel.trace("xfs_perag_get") $mp:struct xfs_mount* $agno:xfs_agnumber_t $refcount:int $caller_ip:long unsigned int kernel.trace("xfs_perag_get_tag") $mp:struct xfs_mount* $agno:xfs_agnumber_t $refcount:int $caller_ip:long unsigned int kernel.trace("xfs_perag_put") $mp:struct xfs_mount* $agno:xfs_agnumber_t $refcount:int $caller_ip:long unsigned int kernel.trace("xfs_perag_set_reclaim") $mp:struct xfs_mount* $agno:xfs_agnumber_t $refcount:int $caller_ip:long unsigned int kernel.trace("xfs_readdir") $ip:struct xfs_inode* kernel.trace("xfs_readlink") $ip:struct xfs_inode* kernel.trace("xfs_releasepage") $inode:struct inode* $page:struct page* $off:long unsigned int kernel.trace("xfs_remove") $dp:struct xfs_inode* $xfs_remove:struct xfs_name* kernel.trace("xfs_rename") $src_dp:struct xfs_inode* $target_dp:struct xfs_inode* $src_name:struct xfs_name* $target_name:struct xfs_name* kernel.trace("xfs_reset_dqcounts") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_setattr") $ip:struct xfs_inode* kernel.trace("xfs_swap_extent_after") $ip:struct xfs_inode* $which:int kernel.trace("xfs_swap_extent_before") $ip:struct xfs_inode* $which:int kernel.trace("xfs_symlink") $dp:struct xfs_inode* $xfs_symlink:struct xfs_name* kernel.trace("xfs_trans_bhold") $bip:struct xfs_buf_log_item* kernel.trace("xfs_trans_bhold_release") $bip:struct xfs_buf_log_item* kernel.trace("xfs_trans_binval") $bip:struct xfs_buf_log_item* kernel.trace("xfs_trans_bjoin") $bip:struct xfs_buf_log_item* kernel.trace("xfs_trans_brelse") $bip:struct xfs_buf_log_item* kernel.trace("xfs_trans_commit_lsn") $trans:struct xfs_trans* kernel.trace("xfs_trans_get_buf") $bip:struct xfs_buf_log_item* kernel.trace("xfs_trans_get_buf_recur") $bip:struct xfs_buf_log_item* kernel.trace("xfs_trans_getsb") $bip:struct xfs_buf_log_item* kernel.trace("xfs_trans_getsb_recur") $bip:struct xfs_buf_log_item* kernel.trace("xfs_trans_log_buf") $bip:struct xfs_buf_log_item* kernel.trace("xfs_trans_read_buf") $bip:struct xfs_buf_log_item* kernel.trace("xfs_trans_read_buf_io") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_trans_read_buf_recur") $bip:struct xfs_buf_log_item* kernel.trace("xfs_trans_read_buf_shut") $bp:struct xfs_buf* $caller_ip:long unsigned int kernel.trace("xfs_unwritten_convert") $ip:struct xfs_inode* $offset:xfs_off_t $count:ssize_t kernel.trace("xfs_vm_bmap") $ip:struct xfs_inode* kernel.trace("xfs_write_inode") $ip:struct xfs_inode* kernel.trace("xfs_writepage") $inode:struct inode* $page:struct page* $off:long unsigned int 2013/4/12 =B7=FB=D3=C0=CC=CE > Hi Brian, > Sorry but when I execute the script it says: > WARNING: cannot find module xfs debuginfo: No DWARF information found > semantic error: no match while resolving probe point > module("xfs").function("xfs_iunlink") > > uname -a > 2.6.32-279.el6.x86_64 > kernel debuginfo has been installed. > > Where can I find the correct xfs debuginfo? > > > Thank you for your help. > > > 2013/4/12 Brian Foster > >> On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote: >> > It happens tonight again on one of our servers, how to debug the root >> > cause? Thank you. >> > >> >> Hi, >> >> I've attached a system tap script (stap -v xfs.stp) that should >> hopefully print out a bit more data should the issue happen again. Do >> you have a small enough number of nodes (or predictable enough pattern) >> that you could run this on the nodes that tend to fail and collect the >> output? >> >> Also, could you collect an xfs_metadump of the filesystem in question >> and make it available for download and analysis somewhere? I believe the >> ideal approach is to mount/umount the filesystem first to replay the log >> before collecting a metadump, but somebody could correct me on that (to >> be safe, you could collect multiple dumps: pre-mount and post-mount). >> >> Could you also describe your workload a little bit? Thanks. >> >> Brian >> >> > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: >> > xfs_inotobp() returned error 22. >> > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree return= ed >> > error 22 >> > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) >> > called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = =3D >> > 0xffffffffa02ee20a >> > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting >> > down filesystem >> > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem a= nd >> > rectify the problem(s) >> > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. >> > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. >> > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. >> > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. >> > >> > xfs_repair -n >> > >> > >> > Phase 7 - verify link counts... >> > would have reset inode 20021 nlinks from 0 to 1 >> > would have reset inode 20789 nlinks from 0 to 1 >> > would have reset inode 35125 nlinks from 0 to 1 >> > would have reset inode 35637 nlinks from 0 to 1 >> > would have reset inode 36149 nlinks from 0 to 1 >> > would have reset inode 38197 nlinks from 0 to 1 >> > would have reset inode 39477 nlinks from 0 to 1 >> > would have reset inode 54069 nlinks from 0 to 1 >> > would have reset inode 62261 nlinks from 0 to 1 >> > would have reset inode 63029 nlinks from 0 to 1 >> > would have reset inode 72501 nlinks from 0 to 1 >> > would have reset inode 79925 nlinks from 0 to 1 >> > would have reset inode 81205 nlinks from 0 to 1 >> > would have reset inode 84789 nlinks from 0 to 1 >> > would have reset inode 87861 nlinks from 0 to 1 >> > would have reset inode 90663 nlinks from 0 to 1 >> > would have reset inode 91189 nlinks from 0 to 1 >> > would have reset inode 95541 nlinks from 0 to 1 >> > would have reset inode 98101 nlinks from 0 to 1 >> > would have reset inode 101173 nlinks from 0 to 1 >> > would have reset inode 113205 nlinks from 0 to 1 >> > would have reset inode 114741 nlinks from 0 to 1 >> > would have reset inode 126261 nlinks from 0 to 1 >> > would have reset inode 140597 nlinks from 0 to 1 >> > would have reset inode 144693 nlinks from 0 to 1 >> > would have reset inode 147765 nlinks from 0 to 1 >> > would have reset inode 152885 nlinks from 0 to 1 >> > would have reset inode 161333 nlinks from 0 to 1 >> > would have reset inode 161845 nlinks from 0 to 1 >> > would have reset inode 167477 nlinks from 0 to 1 >> > would have reset inode 172341 nlinks from 0 to 1 >> > would have reset inode 191797 nlinks from 0 to 1 >> > would have reset inode 204853 nlinks from 0 to 1 >> > would have reset inode 205365 nlinks from 0 to 1 >> > would have reset inode 215349 nlinks from 0 to 1 >> > would have reset inode 215861 nlinks from 0 to 1 >> > would have reset inode 216373 nlinks from 0 to 1 >> > would have reset inode 217397 nlinks from 0 to 1 >> > would have reset inode 224309 nlinks from 0 to 1 >> > would have reset inode 225589 nlinks from 0 to 1 >> > would have reset inode 234549 nlinks from 0 to 1 >> > would have reset inode 234805 nlinks from 0 to 1 >> > would have reset inode 249653 nlinks from 0 to 1 >> > would have reset inode 250677 nlinks from 0 to 1 >> > would have reset inode 252469 nlinks from 0 to 1 >> > would have reset inode 261429 nlinks from 0 to 1 >> > would have reset inode 265013 nlinks from 0 to 1 >> > would have reset inode 266805 nlinks from 0 to 1 >> > would have reset inode 267317 nlinks from 0 to 1 >> > would have reset inode 268853 nlinks from 0 to 1 >> > would have reset inode 272437 nlinks from 0 to 1 >> > would have reset inode 273205 nlinks from 0 to 1 >> > would have reset inode 274229 nlinks from 0 to 1 >> > would have reset inode 278325 nlinks from 0 to 1 >> > would have reset inode 278837 nlinks from 0 to 1 >> > would have reset inode 281397 nlinks from 0 to 1 >> > would have reset inode 292661 nlinks from 0 to 1 >> > would have reset inode 300853 nlinks from 0 to 1 >> > would have reset inode 302901 nlinks from 0 to 1 >> > would have reset inode 305205 nlinks from 0 to 1 >> > would have reset inode 314165 nlinks from 0 to 1 >> > would have reset inode 315189 nlinks from 0 to 1 >> > would have reset inode 320309 nlinks from 0 to 1 >> > would have reset inode 324917 nlinks from 0 to 1 >> > would have reset inode 328245 nlinks from 0 to 1 >> > would have reset inode 335925 nlinks from 0 to 1 >> > would have reset inode 339253 nlinks from 0 to 1 >> > would have reset inode 339765 nlinks from 0 to 1 >> > would have reset inode 348213 nlinks from 0 to 1 >> > would have reset inode 360501 nlinks from 0 to 1 >> > would have reset inode 362037 nlinks from 0 to 1 >> > would have reset inode 366389 nlinks from 0 to 1 >> > would have reset inode 385845 nlinks from 0 to 1 >> > would have reset inode 390709 nlinks from 0 to 1 >> > would have reset inode 409141 nlinks from 0 to 1 >> > would have reset inode 413237 nlinks from 0 to 1 >> > would have reset inode 414773 nlinks from 0 to 1 >> > would have reset inode 417845 nlinks from 0 to 1 >> > would have reset inode 436021 nlinks from 0 to 1 >> > would have reset inode 439349 nlinks from 0 to 1 >> > would have reset inode 447029 nlinks from 0 to 1 >> > would have reset inode 491317 nlinks from 0 to 1 >> > would have reset inode 494133 nlinks from 0 to 1 >> > would have reset inode 495413 nlinks from 0 to 1 >> > would have reset inode 501301 nlinks from 0 to 1 >> > would have reset inode 506421 nlinks from 0 to 1 >> > would have reset inode 508469 nlinks from 0 to 1 >> > would have reset inode 508981 nlinks from 0 to 1 >> > would have reset inode 511797 nlinks from 0 to 1 >> > would have reset inode 513077 nlinks from 0 to 1 >> > would have reset inode 517941 nlinks from 0 to 1 >> > would have reset inode 521013 nlinks from 0 to 1 >> > would have reset inode 522805 nlinks from 0 to 1 >> > would have reset inode 523317 nlinks from 0 to 1 >> > would have reset inode 525621 nlinks from 0 to 1 >> > would have reset inode 527925 nlinks from 0 to 1 >> > would have reset inode 535605 nlinks from 0 to 1 >> > would have reset inode 541749 nlinks from 0 to 1 >> > would have reset inode 573493 nlinks from 0 to 1 >> > would have reset inode 578613 nlinks from 0 to 1 >> > would have reset inode 583029 nlinks from 0 to 1 >> > would have reset inode 585525 nlinks from 0 to 1 >> > would have reset inode 586293 nlinks from 0 to 1 >> > would have reset inode 586805 nlinks from 0 to 1 >> > would have reset inode 591413 nlinks from 0 to 1 >> > would have reset inode 594485 nlinks from 0 to 1 >> > would have reset inode 596277 nlinks from 0 to 1 >> > would have reset inode 603189 nlinks from 0 to 1 >> > would have reset inode 613429 nlinks from 0 to 1 >> > would have reset inode 617781 nlinks from 0 to 1 >> > would have reset inode 621877 nlinks from 0 to 1 >> > would have reset inode 623925 nlinks from 0 to 1 >> > would have reset inode 625205 nlinks from 0 to 1 >> > would have reset inode 626741 nlinks from 0 to 1 >> > would have reset inode 639541 nlinks from 0 to 1 >> > would have reset inode 640053 nlinks from 0 to 1 >> > would have reset inode 640565 nlinks from 0 to 1 >> > would have reset inode 645173 nlinks from 0 to 1 >> > would have reset inode 652853 nlinks from 0 to 1 >> > would have reset inode 656181 nlinks from 0 to 1 >> > would have reset inode 659253 nlinks from 0 to 1 >> > would have reset inode 663605 nlinks from 0 to 1 >> > would have reset inode 667445 nlinks from 0 to 1 >> > would have reset inode 680757 nlinks from 0 to 1 >> > would have reset inode 691253 nlinks from 0 to 1 >> > would have reset inode 691765 nlinks from 0 to 1 >> > would have reset inode 697653 nlinks from 0 to 1 >> > would have reset inode 700469 nlinks from 0 to 1 >> > would have reset inode 707893 nlinks from 0 to 1 >> > would have reset inode 716853 nlinks from 0 to 1 >> > would have reset inode 722229 nlinks from 0 to 1 >> > would have reset inode 722741 nlinks from 0 to 1 >> > would have reset inode 723765 nlinks from 0 to 1 >> > would have reset inode 731957 nlinks from 0 to 1 >> > would have reset inode 742965 nlinks from 0 to 1 >> > would have reset inode 743477 nlinks from 0 to 1 >> > would have reset inode 745781 nlinks from 0 to 1 >> > would have reset inode 746293 nlinks from 0 to 1 >> > would have reset inode 774453 nlinks from 0 to 1 >> > would have reset inode 778805 nlinks from 0 to 1 >> > would have reset inode 785013 nlinks from 0 to 1 >> > would have reset inode 785973 nlinks from 0 to 1 >> > would have reset inode 791349 nlinks from 0 to 1 >> > would have reset inode 796981 nlinks from 0 to 1 >> > would have reset inode 803381 nlinks from 0 to 1 >> > would have reset inode 806965 nlinks from 0 to 1 >> > would have reset inode 811798 nlinks from 0 to 1 >> > would have reset inode 812310 nlinks from 0 to 1 >> > would have reset inode 813078 nlinks from 0 to 1 >> > would have reset inode 813607 nlinks from 0 to 1 >> > would have reset inode 814183 nlinks from 0 to 1 >> > would have reset inode 822069 nlinks from 0 to 1 >> > would have reset inode 828469 nlinks from 0 to 1 >> > would have reset inode 830005 nlinks from 0 to 1 >> > would have reset inode 832053 nlinks from 0 to 1 >> > would have reset inode 832565 nlinks from 0 to 1 >> > would have reset inode 836661 nlinks from 0 to 1 >> > would have reset inode 841013 nlinks from 0 to 1 >> > would have reset inode 841525 nlinks from 0 to 1 >> > would have reset inode 845365 nlinks from 0 to 1 >> > would have reset inode 846133 nlinks from 0 to 1 >> > would have reset inode 847157 nlinks from 0 to 1 >> > would have reset inode 852533 nlinks from 0 to 1 >> > would have reset inode 857141 nlinks from 0 to 1 >> > would have reset inode 863271 nlinks from 0 to 1 >> > would have reset inode 866855 nlinks from 0 to 1 >> > would have reset inode 887861 nlinks from 0 to 1 >> > would have reset inode 891701 nlinks from 0 to 1 >> > would have reset inode 894773 nlinks from 0 to 1 >> > would have reset inode 900149 nlinks from 0 to 1 >> > would have reset inode 902197 nlinks from 0 to 1 >> > would have reset inode 906293 nlinks from 0 to 1 >> > would have reset inode 906805 nlinks from 0 to 1 >> > would have reset inode 909877 nlinks from 0 to 1 >> > would have reset inode 925493 nlinks from 0 to 1 >> > would have reset inode 949543 nlinks from 0 to 1 >> > would have reset inode 955175 nlinks from 0 to 1 >> > would have reset inode 963623 nlinks from 0 to 1 >> > would have reset inode 967733 nlinks from 0 to 1 >> > would have reset inode 968231 nlinks from 0 to 1 >> > would have reset inode 982069 nlinks from 0 to 1 >> > would have reset inode 1007413 nlinks from 0 to 1 >> > would have reset inode 1011509 nlinks from 0 to 1 >> > would have reset inode 1014069 nlinks from 0 to 1 >> > would have reset inode 1014581 nlinks from 0 to 1 >> > would have reset inode 1022005 nlinks from 0 to 1 >> > would have reset inode 1022517 nlinks from 0 to 1 >> > would have reset inode 1023029 nlinks from 0 to 1 >> > would have reset inode 1025333 nlinks from 0 to 1 >> > would have reset inode 1043765 nlinks from 0 to 1 >> > would have reset inode 1044789 nlinks from 0 to 1 >> > would have reset inode 1049397 nlinks from 0 to 1 >> > would have reset inode 1050933 nlinks from 0 to 1 >> > would have reset inode 1051445 nlinks from 0 to 1 >> > would have reset inode 1054261 nlinks from 0 to 1 >> > would have reset inode 1060917 nlinks from 0 to 1 >> > would have reset inode 1063477 nlinks from 0 to 1 >> > would have reset inode 1076021 nlinks from 0 to 1 >> > would have reset inode 1081141 nlinks from 0 to 1 >> > would have reset inode 1086261 nlinks from 0 to 1 >> > would have reset inode 1097269 nlinks from 0 to 1 >> > would have reset inode 1099829 nlinks from 0 to 1 >> > would have reset inode 1100853 nlinks from 0 to 1 >> > would have reset inode 1101877 nlinks from 0 to 1 >> > would have reset inode 1126709 nlinks from 0 to 1 >> > would have reset inode 1134389 nlinks from 0 to 1 >> > would have reset inode 1141045 nlinks from 0 to 1 >> > would have reset inode 1141557 nlinks from 0 to 1 >> > would have reset inode 1142581 nlinks from 0 to 1 >> > would have reset inode 1148469 nlinks from 0 to 1 >> > would have reset inode 1153333 nlinks from 0 to 1 >> > would have reset inode 1181749 nlinks from 0 to 1 >> > would have reset inode 1192245 nlinks from 0 to 1 >> > would have reset inode 1198133 nlinks from 0 to 1 >> > would have reset inode 1203765 nlinks from 0 to 1 >> > would have reset inode 1221429 nlinks from 0 to 1 >> > would have reset inode 1223989 nlinks from 0 to 1 >> > would have reset inode 1235509 nlinks from 0 to 1 >> > would have reset inode 1239349 nlinks from 0 to 1 >> > would have reset inode 1240885 nlinks from 0 to 1 >> > would have reset inode 1241397 nlinks from 0 to 1 >> > would have reset inode 1241909 nlinks from 0 to 1 >> > would have reset inode 1242421 nlinks from 0 to 1 >> > would have reset inode 1244981 nlinks from 0 to 1 >> > would have reset inode 1246517 nlinks from 0 to 1 >> > would have reset inode 1253429 nlinks from 0 to 1 >> > would have reset inode 1271861 nlinks from 0 to 1 >> > would have reset inode 1274677 nlinks from 0 to 1 >> > would have reset inode 1277749 nlinks from 0 to 1 >> > would have reset inode 1278773 nlinks from 0 to 1 >> > would have reset inode 1286709 nlinks from 0 to 1 >> > would have reset inode 1288245 nlinks from 0 to 1 >> > would have reset inode 1299765 nlinks from 0 to 1 >> > would have reset inode 1302325 nlinks from 0 to 1 >> > would have reset inode 1304885 nlinks from 0 to 1 >> > would have reset inode 1305397 nlinks from 0 to 1 >> > would have reset inode 1307509 nlinks from 0 to 1 >> > would have reset inode 1309493 nlinks from 0 to 1 >> > would have reset inode 1310517 nlinks from 0 to 1 >> > would have reset inode 1311029 nlinks from 0 to 1 >> > would have reset inode 1312053 nlinks from 0 to 1 >> > would have reset inode 1316917 nlinks from 0 to 1 >> > would have reset inode 1317941 nlinks from 0 to 1 >> > would have reset inode 1320821 nlinks from 0 to 1 >> > would have reset inode 1322805 nlinks from 0 to 1 >> > would have reset inode 1332789 nlinks from 0 to 1 >> > would have reset inode 1336373 nlinks from 0 to 1 >> > would have reset inode 1345653 nlinks from 0 to 1 >> > would have reset inode 1354549 nlinks from 0 to 1 >> > would have reset inode 1361973 nlinks from 0 to 1 >> > would have reset inode 1369909 nlinks from 0 to 1 >> > would have reset inode 1372981 nlinks from 0 to 1 >> > would have reset inode 1388853 nlinks from 0 to 1 >> > would have reset inode 1402933 nlinks from 0 to 1 >> > would have reset inode 1403445 nlinks from 0 to 1 >> > would have reset inode 1420085 nlinks from 0 to 1 >> > would have reset inode 1452853 nlinks from 0 to 1 >> > would have reset inode 1456437 nlinks from 0 to 1 >> > would have reset inode 1457973 nlinks from 0 to 1 >> > would have reset inode 1459253 nlinks from 0 to 1 >> > would have reset inode 1467957 nlinks from 0 to 1 >> > would have reset inode 1471541 nlinks from 0 to 1 >> > would have reset inode 1476661 nlinks from 0 to 1 >> > would have reset inode 1479733 nlinks from 0 to 1 >> > would have reset inode 1483061 nlinks from 0 to 1 >> > would have reset inode 1484085 nlinks from 0 to 1 >> > would have reset inode 1486133 nlinks from 0 to 1 >> > would have reset inode 1489461 nlinks from 0 to 1 >> > would have reset inode 1490037 nlinks from 0 to 1 >> > would have reset inode 1492021 nlinks from 0 to 1 >> > would have reset inode 1493557 nlinks from 0 to 1 >> > would have reset inode 1494069 nlinks from 0 to 1 >> > would have reset inode 1496885 nlinks from 0 to 1 >> > would have reset inode 1498421 nlinks from 0 to 1 >> > would have reset inode 1498933 nlinks from 0 to 1 >> > would have reset inode 1499957 nlinks from 0 to 1 >> > would have reset inode 1506101 nlinks from 0 to 1 >> > would have reset inode 1507637 nlinks from 0 to 1 >> > would have reset inode 1510453 nlinks from 0 to 1 >> > would have reset inode 1514293 nlinks from 0 to 1 >> > would have reset inode 1517365 nlinks from 0 to 1 >> > would have reset inode 1520693 nlinks from 0 to 1 >> > would have reset inode 1521973 nlinks from 0 to 1 >> > would have reset inode 1530421 nlinks from 0 to 1 >> > would have reset inode 1530933 nlinks from 0 to 1 >> > would have reset inode 1537333 nlinks from 0 to 1 >> > would have reset inode 1538357 nlinks from 0 to 1 >> > would have reset inode 1548853 nlinks from 0 to 1 >> > would have reset inode 1553973 nlinks from 0 to 1 >> > would have reset inode 1557301 nlinks from 0 to 1 >> > would have reset inode 1564213 nlinks from 0 to 1 >> > would have reset inode 1564725 nlinks from 0 to 1 >> > would have reset inode 1576501 nlinks from 0 to 1 >> > would have reset inode 1580597 nlinks from 0 to 1 >> > would have reset inode 1584693 nlinks from 0 to 1 >> > would have reset inode 1586485 nlinks from 0 to 1 >> > would have reset inode 1589301 nlinks from 0 to 1 >> > would have reset inode 1589813 nlinks from 0 to 1 >> > would have reset inode 1592629 nlinks from 0 to 1 >> > would have reset inode 1595701 nlinks from 0 to 1 >> > would have reset inode 1601077 nlinks from 0 to 1 >> > would have reset inode 1623861 nlinks from 0 to 1 >> > would have reset inode 1626677 nlinks from 0 to 1 >> > would have reset inode 1627701 nlinks from 0 to 1 >> > would have reset inode 1633333 nlinks from 0 to 1 >> > would have reset inode 1639221 nlinks from 0 to 1 >> > would have reset inode 1649205 nlinks from 0 to 1 >> > would have reset inode 1686325 nlinks from 0 to 1 >> > would have reset inode 1690677 nlinks from 0 to 1 >> > would have reset inode 1693749 nlinks from 0 to 1 >> > would have reset inode 1704757 nlinks from 0 to 1 >> > would have reset inode 1707061 nlinks from 0 to 1 >> > would have reset inode 1709109 nlinks from 0 to 1 >> > would have reset inode 1719349 nlinks from 0 to 1 >> > would have reset inode 1737013 nlinks from 0 to 1 >> > would have reset inode 1741365 nlinks from 0 to 1 >> > would have reset inode 1747509 nlinks from 0 to 1 >> > would have reset inode 1770805 nlinks from 0 to 1 >> > would have reset inode 1780789 nlinks from 0 to 1 >> > would have reset inode 1793589 nlinks from 0 to 1 >> > would have reset inode 1795125 nlinks from 0 to 1 >> > would have reset inode 1800757 nlinks from 0 to 1 >> > would have reset inode 1801269 nlinks from 0 to 1 >> > would have reset inode 1802549 nlinks from 0 to 1 >> > would have reset inode 1804085 nlinks from 0 to 1 >> > would have reset inode 1817141 nlinks from 0 to 1 >> > would have reset inode 1821749 nlinks from 0 to 1 >> > would have reset inode 1832757 nlinks from 0 to 1 >> > would have reset inode 1836341 nlinks from 0 to 1 >> > would have reset inode 1856309 nlinks from 0 to 1 >> > would have reset inode 1900597 nlinks from 0 to 1 >> > would have reset inode 1902901 nlinks from 0 to 1 >> > would have reset inode 1912373 nlinks from 0 to 1 >> > would have reset inode 1943093 nlinks from 0 to 1 >> > would have reset inode 1944373 nlinks from 0 to 1 >> > would have reset inode 1954101 nlinks from 0 to 1 >> > would have reset inode 1955893 nlinks from 0 to 1 >> > would have reset inode 1961781 nlinks from 0 to 1 >> > would have reset inode 1974325 nlinks from 0 to 1 >> > would have reset inode 1978677 nlinks from 0 to 1 >> > would have reset inode 1981237 nlinks from 0 to 1 >> > would have reset inode 1992245 nlinks from 0 to 1 >> > would have reset inode 2000949 nlinks from 0 to 1 >> > would have reset inode 2002229 nlinks from 0 to 1 >> > would have reset inode 2004789 nlinks from 0 to 1 >> > would have reset inode 2005301 nlinks from 0 to 1 >> > would have reset inode 2011189 nlinks from 0 to 1 >> > would have reset inode 2012981 nlinks from 0 to 1 >> > would have reset inode 2015285 nlinks from 0 to 1 >> > would have reset inode 2018869 nlinks from 0 to 1 >> > would have reset inode 2028341 nlinks from 0 to 1 >> > would have reset inode 2028853 nlinks from 0 to 1 >> > would have reset inode 2030901 nlinks from 0 to 1 >> > would have reset inode 2032181 nlinks from 0 to 1 >> > would have reset inode 2032693 nlinks from 0 to 1 >> > would have reset inode 2040117 nlinks from 0 to 1 >> > would have reset inode 2053685 nlinks from 0 to 1 >> > would have reset inode 2083893 nlinks from 0 to 1 >> > would have reset inode 2087221 nlinks from 0 to 1 >> > would have reset inode 2095925 nlinks from 0 to 1 >> > would have reset inode 2098741 nlinks from 0 to 1 >> > would have reset inode 2100533 nlinks from 0 to 1 >> > would have reset inode 2101301 nlinks from 0 to 1 >> > would have reset inode 2123573 nlinks from 0 to 1 >> > would have reset inode 2132789 nlinks from 0 to 1 >> > would have reset inode 2133813 nlinks from 0 to 1 >> > >> > >> > >> > >> > >> > 2013/4/10 =B7=FB=D3=C0=CC=CE > >> > >> > The storage info is as following: >> > RAID-6 >> > SATA HDD >> > Controller: PERC H710P Mini (Embedded) >> > Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes >> > 255 heads, 63 sectors/track, 3647334 cylinders >> > Units =3D cylinders of 16065 * 512 =3D 8225280 bytes >> > Sector size (logical/physical): 512 bytes / 512 bytes >> > I/O size (minimum/optimal): 512 bytes / 512 bytes >> > Disk identifier: 0x00000000 >> > >> > sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (30.0 TB/27= .2 >> > TiB) >> > sd 0:2:1:0: [sdb] Write Protect is off >> > sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08 >> > sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enabled, doesn= 't >> > support DPO or FUA >> > sd 0:2:1:0: [sdb] Attached SCSI disk >> > >> > *-storage >> > description: RAID bus controller >> > product: MegaRAID SAS 2208 [Thunderbolt] >> > vendor: LSI Logic / Symbios Logic >> > physical id: 0 >> > bus info: pci@0000:02:00.0 >> > logical name: scsi0 >> > version: 01 >> > width: 64 bits >> > clock: 33MHz >> > capabilities: storage pm pciexpress vpd msi msix bus_master >> > cap_list rom >> > configuration: driver=3Dmegaraid_sas latency=3D0 >> > resources: irq:42 ioport:fc00(size=3D256) >> > memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff >> > memory:dc800000-dc81ffff(prefetchable) >> > *-disk:0 >> > description: SCSI Disk >> > product: PERC H710P >> > vendor: DELL >> > physical id: 2.0.0 >> > bus info: scsi@0:2.0.0 >> > logical name: /dev/sda >> > version: 3.13 >> > serial: 0049d6ce1d9f2035180096fde490f648 >> > size: 558GiB (599GB) >> > capabilities: partitioned partitioned:dos >> > configuration: ansiversion=3D5 signature=3D000aa336 >> > *-disk:1 >> > description: SCSI Disk >> > product: PERC H710P >> > vendor: DELL >> > physical id: 2.1.0 >> > bus info: scsi@0:2.1.0 >> > logical name: /dev/sdb >> > logical name: /mnt/xfsd >> > version: 3.13 >> > serial: 003366f71da22035180096fde490f648 >> > size: 27TiB (30TB) >> > configuration: ansiversion=3D5 mount.fstype=3Dxfs >> > >> mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,sw= idth=3D1280,noquota >> > state=3Dmounted >> > >> > Thank you. >> > >> > >> > 2013/4/10 Emmanuel Florac > > > >> > >> > Le Tue, 9 Apr 2013 23:10:03 +0800 >> > =B7=FB=D3=C0=CC=CE > >> =A8=A6crivait: >> > >> > > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error Detected= . >> > > > Shutting down filesystem >> > >> > This. I/O error detected. That means that at some point the >> > underlying >> > device (disk, RAID array, SAN volume) couldn't be reached. So >> this >> > could very well be a case of a flakey drive, array, cable or >> SCSI >> > driver. >> > >> > What's the storage setup here? >> > >> > -- >> > >> ------------------------------------------------------------------------ >> > Emmanuel Florac | Direction technique >> > | Intellique >> > | > > > >> > | +33 1 78 94 84 02 >> > >> ------------------------------------------------------------------------ >> > >> > >> > >> > >> > -- >> > =B7=FB=D3=C0=CC=CE >> > >> > >> > >> > >> > -- >> > =B7=FB=D3=C0=CC=CE >> > >> > >> > _______________________________________________ >> > xfs mailing list >> > xfs@oss.sgi.com >> > http://oss.sgi.com/mailman/listinfo/xfs >> > >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --089e011831980e5b8d04da231926 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
sudo stap -L 'kernel.trace("*")'|grep xf= s_iunlink
sudo stap -L 'kernel.trace("*")'|grep xfs_if= ree
sudo stap -L 'kernel.trace("*")'|grep xfs
kerne= l.trace("xfs_agf") $mp:struct xfs_mount* $agf:struct xfs_agf* $fl= ags:int $caller_ip:long unsigned int
kernel.trace("xfs_alloc_busy") $mp:struct xfs_mount* $agno:xfs_ag= number_t $agbno:xfs_agblock_t $len:xfs_extlen_t
kernel.trace("xfs_a= lloc_busy_clear") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:xf= s_agblock_t $len:xfs_extlen_t
kernel.trace("xfs_alloc_busy_enomem") $mp:struct xfs_mount* $agno= :xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t
kernel.trace(&quo= t;xfs_alloc_busy_force") $mp:struct xfs_mount* $agno:xfs_agnumber_t $a= gbno:xfs_agblock_t $len:xfs_extlen_t
kernel.trace("xfs_alloc_busy_reuse") $mp:struct xfs_mount* $agno:= xfs_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t
kernel.trace("= ;xfs_alloc_busy_trim") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agb= no:xfs_agblock_t $len:xfs_extlen_t $tbno:xfs_agblock_t $tlen:xfs_extlen_t kernel.trace("xfs_alloc_exact_done") $args:struct xfs_alloc_arg*<= br>kernel.trace("xfs_alloc_exact_error") $args:struct xfs_alloc_a= rg*
kernel.trace("xfs_alloc_exact_notfound") $args:struct xfs_= alloc_arg*
kernel.trace("xfs_alloc_file_space") $ip:struct xfs_inode*
ker= nel.trace("xfs_alloc_near_busy") $args:struct xfs_alloc_arg*
k= ernel.trace("xfs_alloc_near_error") $args:struct xfs_alloc_arg* kernel.trace("xfs_alloc_near_first") $args:struct xfs_alloc_arg*<= br>kernel.trace("xfs_alloc_near_greater") $args:struct xfs_alloc_= arg*
kernel.trace("xfs_alloc_near_lesser") $args:struct xfs_al= loc_arg*
kernel.trace("xfs_alloc_near_noentry") $args:struct xfs_alloc_arg= *
kernel.trace("xfs_alloc_near_nominleft") $args:struct xfs_al= loc_arg*
kernel.trace("xfs_alloc_size_busy") $args:struct xfs_= alloc_arg*
kernel.trace("xfs_alloc_size_done") $args:struct xfs_alloc_arg*kernel.trace("xfs_alloc_size_error") $args:struct xfs_alloc_arg= *
kernel.trace("xfs_alloc_size_neither") $args:struct xfs_allo= c_arg*
kernel.trace("xfs_alloc_size_noentry") $args:struct xfs_alloc_arg= *
kernel.trace("xfs_alloc_size_nominleft") $args:struct xfs_al= loc_arg*
kernel.trace("xfs_alloc_small_done") $args:struct xfs= _alloc_arg*
kernel.trace("xfs_alloc_small_error") $args:struct xfs_alloc_arg*=
kernel.trace("xfs_alloc_small_freelist") $args:struct xfs_all= oc_arg*
kernel.trace("xfs_alloc_small_notenough") $args:struct= xfs_alloc_arg*
kernel.trace("xfs_alloc_vextent_allfailed") $args:struct xfs_allo= c_arg*
kernel.trace("xfs_alloc_vextent_badargs") $args:struct = xfs_alloc_arg*
kernel.trace("xfs_alloc_vextent_loopfailed") $a= rgs:struct xfs_alloc_arg*
kernel.trace("xfs_alloc_vextent_noagbp") $args:struct xfs_alloc_a= rg*
kernel.trace("xfs_alloc_vextent_nofix") $args:struct xfs_a= lloc_arg*
kernel.trace("xfs_attr_list_add") $ctx:struct xfs_at= tr_list_context*
kernel.trace("xfs_attr_list_full") $ctx:struct xfs_attr_list_cont= ext*
kernel.trace("xfs_attr_list_leaf") $ctx:struct xfs_attr_l= ist_context*
kernel.trace("xfs_attr_list_leaf_end") $ctx:struc= t xfs_attr_list_context*
kernel.trace("xfs_attr_list_node_descend") $ctx:struct xfs_attr_l= ist_context* $btree:struct xfs_da_node_entry*
kernel.trace("xfs_att= r_list_notfound") $ctx:struct xfs_attr_list_context*
kernel.trace(&= quot;xfs_attr_list_sf") $ctx:struct xfs_attr_list_context*
kernel.trace("xfs_attr_list_sf_all") $ctx:struct xfs_attr_list_co= ntext*
kernel.trace("xfs_attr_list_wrong_blk") $ctx:struct xfs= _attr_list_context*
kernel.trace("xfs_bdstrat_shut") $bp:struc= t xfs_buf* $caller_ip:long unsigned int
kernel.trace("xfs_bmap_post_update") $ip:struct xfs_inode* $idx:x= fs_extnum_t $state:int $caller_ip:long unsigned int
kernel.trace("x= fs_bmap_pre_update") $ip:struct xfs_inode* $idx:xfs_extnum_t $state:in= t $caller_ip:long unsigned int
kernel.trace("xfs_btree_corrupt") $bp:struct xfs_buf* $caller_ip:= long unsigned int
kernel.trace("xfs_buf_bawrite") $bp:struct x= fs_buf* $caller_ip:long unsigned int
kernel.trace("xfs_buf_bdwrite&= quot;) $bp:struct xfs_buf* $caller_ip:long unsigned int
kernel.trace("xfs_buf_cond_lock") $bp:struct xfs_buf* $caller_ip:= long unsigned int
kernel.trace("xfs_buf_delwri_dequeue") $bp:s= truct xfs_buf* $caller_ip:long unsigned int
kernel.trace("xfs_buf_d= elwri_queue") $bp:struct xfs_buf* $caller_ip:long unsigned int
kernel.trace("xfs_buf_delwri_split") $bp:struct xfs_buf* $caller_= ip:long unsigned int
kernel.trace("xfs_buf_error_relse") $bp:s= truct xfs_buf* $caller_ip:long unsigned int
kernel.trace("xfs_buf_f= ind") $bp:struct xfs_buf* $flags:unsigned int $caller_ip:long unsigned= int
kernel.trace("xfs_buf_free") $bp:struct xfs_buf* $caller_ip:long = unsigned int
kernel.trace("xfs_buf_get") $bp:struct xfs_buf* $= flags:unsigned int $caller_ip:long unsigned int
kernel.trace("xfs_b= uf_get_uncached") $bp:struct xfs_buf* $caller_ip:long unsigned int
kernel.trace("xfs_buf_hold") $bp:struct xfs_buf* $caller_ip:long = unsigned int
kernel.trace("xfs_buf_init") $bp:struct xfs_buf* = $caller_ip:long unsigned int
kernel.trace("xfs_buf_iodone") $b= p:struct xfs_buf* $caller_ip:long unsigned int
kernel.trace("xfs_buf_ioerror") $bp:struct xfs_buf* $error:int $c= aller_ip:long unsigned int
kernel.trace("xfs_buf_iorequest") $= bp:struct xfs_buf* $caller_ip:long unsigned int
kernel.trace("xfs_b= uf_iowait") $bp:struct xfs_buf* $caller_ip:long unsigned int
kernel.trace("xfs_buf_iowait_done") $bp:struct xfs_buf* $caller_i= p:long unsigned int
kernel.trace("xfs_buf_item_committed") $bi= p:struct xfs_buf_log_item*
kernel.trace("xfs_buf_item_format")= $bip:struct xfs_buf_log_item*
kernel.trace("xfs_buf_item_format_stale") $bip:struct xfs_buf_log= _item*
kernel.trace("xfs_buf_item_iodone") $bp:struct xfs_buf*= $caller_ip:long unsigned int
kernel.trace("xfs_buf_item_iodone_asy= nc") $bp:struct xfs_buf* $caller_ip:long unsigned int
kernel.trace("xfs_buf_item_pin") $bip:struct xfs_buf_log_item*kernel.trace("xfs_buf_item_push") $bip:struct xfs_buf_log_item*<= br>kernel.trace("xfs_buf_item_pushbuf") $bip:struct xfs_buf_log_i= tem*
kernel.trace("xfs_buf_item_relse") $bp:struct xfs_buf* $caller_ip= :long unsigned int
kernel.trace("xfs_buf_item_size") $bip:stru= ct xfs_buf_log_item*
kernel.trace("xfs_buf_item_size_stale") $= bip:struct xfs_buf_log_item*
kernel.trace("xfs_buf_item_trylock") $bip:struct xfs_buf_log_item= *
kernel.trace("xfs_buf_item_unlock") $bip:struct xfs_buf_log_= item*
kernel.trace("xfs_buf_item_unlock_stale") $bip:struct xf= s_buf_log_item*
kernel.trace("xfs_buf_item_unpin") $bip:struct xfs_buf_log_item*<= br>kernel.trace("xfs_buf_item_unpin_stale") $bip:struct xfs_buf_l= og_item*
kernel.trace("xfs_buf_lock") $bp:struct xfs_buf* $cal= ler_ip:long unsigned int
kernel.trace("xfs_buf_lock_done") $bp:struct xfs_buf* $caller_ip:= long unsigned int
kernel.trace("xfs_buf_read") $bp:struct xfs_= buf* $flags:unsigned int $caller_ip:long unsigned int
kernel.trace("= ;xfs_buf_rele") $bp:struct xfs_buf* $caller_ip:long unsigned int
kernel.trace("xfs_buf_unlock") $bp:struct xfs_buf* $caller_ip:lon= g unsigned int
kernel.trace("xfs_bunmap") $ip:struct xfs_inode= * $bno:xfs_fileoff_t $len:xfs_filblks_t $flags:int $caller_ip:long unsigned= int
kernel.trace("xfs_check_acl") $ip:struct xfs_inode*
kernel.tra= ce("xfs_clear_inode") $ip:struct xfs_inode*
kernel.trace("= ;xfs_create") $dp:struct xfs_inode* $xfs_create:struct xfs_name*
kernel.trace("xfs_da_btree_corrupt") $bp:struct xfs_buf* $caller_= ip:long unsigned int
kernel.trace("xfs_delalloc_enospc") $ip:s= truct xfs_inode* $offset:xfs_off_t $count:ssize_t
kernel.trace("xfs= _destroy_inode") $ip:struct xfs_inode*
kernel.trace("xfs_dir2_block_addname") $args:struct xfs_da_args*<= br>kernel.trace("xfs_dir2_block_lookup") $args:struct xfs_da_args= *
kernel.trace("xfs_dir2_block_removename") $args:struct xfs_d= a_args*
kernel.trace("xfs_dir2_block_replace") $args:struct xfs_da_args*<= br>kernel.trace("xfs_dir2_block_to_leaf") $args:struct xfs_da_arg= s*
kernel.trace("xfs_dir2_block_to_sf") $args:struct xfs_da_ar= gs*
kernel.trace("xfs_dir2_grow_inode") $args:struct xfs_da_args* $id= x:int
kernel.trace("xfs_dir2_leaf_addname") $args:struct xfs_d= a_args*
kernel.trace("xfs_dir2_leaf_lookup") $args:struct xfs_= da_args*
kernel.trace("xfs_dir2_leaf_removename") $args:struct xfs_da_args= *
kernel.trace("xfs_dir2_leaf_replace") $args:struct xfs_da_ar= gs*
kernel.trace("xfs_dir2_leaf_to_block") $args:struct xfs_da= _args*
kernel.trace("xfs_dir2_leaf_to_node") $args:struct xfs_da_args*kernel.trace("xfs_dir2_leafn_add") $args:struct xfs_da_args* $i= dx:int
kernel.trace("xfs_dir2_leafn_moveents") $args:struct xf= s_da_args* $src_idx:int $dst_idx:int $count:int
kernel.trace("xfs_dir2_leafn_remove") $args:struct xfs_da_args* $= idx:int
kernel.trace("xfs_dir2_node_addname") $args:struct xfs= _da_args*
kernel.trace("xfs_dir2_node_lookup") $args:struct xf= s_da_args*
kernel.trace("xfs_dir2_node_removename") $args:struct xfs_da_args= *
kernel.trace("xfs_dir2_node_replace") $args:struct xfs_da_ar= gs*
kernel.trace("xfs_dir2_node_to_leaf") $args:struct xfs_da_= args*
kernel.trace("xfs_dir2_sf_addname") $args:struct xfs_da_args*
= kernel.trace("xfs_dir2_sf_create") $args:struct xfs_da_args*
k= ernel.trace("xfs_dir2_sf_lookup") $args:struct xfs_da_args*
kernel.trace("xfs_dir2_sf_removename") $args:struct xfs_da_args*<= br>kernel.trace("xfs_dir2_sf_replace") $args:struct xfs_da_args*<= br>kernel.trace("xfs_dir2_sf_to_block") $args:struct xfs_da_args*=
kernel.trace("xfs_dir2_sf_toino4") $args:struct xfs_da_args*
k= ernel.trace("xfs_dir2_sf_toino8") $args:struct xfs_da_args*
ke= rnel.trace("xfs_dir2_shrink_inode") $args:struct xfs_da_args* $id= x:int
kernel.trace("xfs_discard_busy") $mp:struct xfs_mount* $agno:xfs_= agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t
kernel.trace("xfs= _discard_exclude") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbno:x= fs_agblock_t $len:xfs_extlen_t
kernel.trace("xfs_discard_extent") $mp:struct xfs_mount* $agno:xf= s_agnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t
kernel.trace("x= fs_discard_toosmall") $mp:struct xfs_mount* $agno:xfs_agnumber_t $agbn= o:xfs_agblock_t $len:xfs_extlen_t
kernel.trace("xfs_dqadjust") $dqp:struct xfs_dquot*
kernel.tra= ce("xfs_dqalloc") $dqp:struct xfs_dquot*
kernel.trace("xf= s_dqattach_found") $dqp:struct xfs_dquot*
kernel.trace("xfs_dq= attach_get") $dqp:struct xfs_dquot*
kernel.trace("xfs_dqflush") $dqp:struct xfs_dquot*
kernel.trac= e("xfs_dqflush_done") $dqp:struct xfs_dquot*
kernel.trace(&quo= t;xfs_dqflush_force") $dqp:struct xfs_dquot*
kernel.trace("xfs= _dqget_hit") $dqp:struct xfs_dquot*
kernel.trace("xfs_dqget_miss") $dqp:struct xfs_dquot*
kernel.t= race("xfs_dqinit") $dqp:struct xfs_dquot*
kernel.trace("x= fs_dqlookup_done") $dqp:struct xfs_dquot*
kernel.trace("xfs_dq= lookup_found") $dqp:struct xfs_dquot*
kernel.trace("xfs_dqlookup_freelist") $dqp:struct xfs_dquot*
k= ernel.trace("xfs_dqlookup_want") $dqp:struct xfs_dquot*
kernel= .trace("xfs_dqput") $dqp:struct xfs_dquot*
kernel.trace("= xfs_dqput_free") $dqp:struct xfs_dquot*
kernel.trace("xfs_dqput_wait") $dqp:struct xfs_dquot*
kernel.t= race("xfs_dqread") $dqp:struct xfs_dquot*
kernel.trace("x= fs_dqread_fail") $dqp:struct xfs_dquot*
kernel.trace("xfs_dqre= claim_dirty") $dqp:struct xfs_dquot*
kernel.trace("xfs_dqreclaim_unlink") $dqp:struct xfs_dquot*
ke= rnel.trace("xfs_dqreclaim_want") $dqp:struct xfs_dquot*
kernel= .trace("xfs_dqrele") $dqp:struct xfs_dquot*
kernel.trace("= ;xfs_dqreuse") $dqp:struct xfs_dquot*
kernel.trace("xfs_dqtobp_read") $dqp:struct xfs_dquot*
kernel.= trace("xfs_dquot_dqalloc") $ip:struct xfs_inode*
kernel.trace(= "xfs_dquot_dqdetach") $ip:struct xfs_inode*
kernel.trace("= ;xfs_extlist") $ip:struct xfs_inode* $idx:xfs_extnum_t $state:int $cal= ler_ip:long unsigned int
kernel.trace("xfs_file_buffered_write") $ip:struct xfs_inode* $co= unt:size_t $offset:loff_t $flags:int
kernel.trace("xfs_file_compat_= ioctl") $ip:struct xfs_inode*
kernel.trace("xfs_file_direct_wr= ite") $ip:struct xfs_inode* $count:size_t $offset:loff_t $flags:int kernel.trace("xfs_file_fsync") $ip:struct xfs_inode*
kernel.tr= ace("xfs_file_ioctl") $ip:struct xfs_inode*
kernel.trace("= ;xfs_file_read") $ip:struct xfs_inode* $count:size_t $offset:loff_t $f= lags:int
kernel.trace("xfs_file_splice_read") $ip:struct xfs_inode* $count= :size_t $offset:loff_t $flags:int
kernel.trace("xfs_file_splice_wri= te") $ip:struct xfs_inode* $count:size_t $offset:loff_t $flags:int
kernel.trace("xfs_free_extent") $mp:struct xfs_mount* $agno:xfs_a= gnumber_t $agbno:xfs_agblock_t $len:xfs_extlen_t $isfl:bool $haveleft:int $= haveright:int
kernel.trace("xfs_free_file_space") $ip:struct x= fs_inode*
kernel.trace("xfs_get_blocks_alloc") $ip:struct xfs_inode* $offse= t:xfs_off_t $count:ssize_t $type:int $irec:struct xfs_bmbt_irec*
kernel.= trace("xfs_get_blocks_found") $ip:struct xfs_inode* $offset:xfs_o= ff_t $count:ssize_t $type:int $irec:struct xfs_bmbt_irec*
kernel.trace("xfs_get_blocks_notfound") $ip:struct xfs_inode* $of= fset:xfs_off_t $count:ssize_t
kernel.trace("xfs_getattr") $ip:= struct xfs_inode*
kernel.trace("xfs_iext_insert") $ip:struct x= fs_inode* $idx:xfs_extnum_t $r:struct xfs_bmbt_irec* $state:int $caller_ip:= long unsigned int
kernel.trace("xfs_iext_remove") $ip:struct xfs_inode* $idx:xfs_ex= tnum_t $state:int $caller_ip:long unsigned int
kernel.trace("xfs_ig= et_hit") $ip:struct xfs_inode*
kernel.trace("xfs_iget_miss&quo= t;) $ip:struct xfs_inode*
kernel.trace("xfs_iget_reclaim") $ip:struct xfs_inode*
kernel.= trace("xfs_iget_reclaim_fail") $ip:struct xfs_inode*
kernel.tr= ace("xfs_iget_skip") $ip:struct xfs_inode*
kernel.trace("= xfs_ihold") $ip:struct xfs_inode* $caller_ip:long unsigned int
kernel.trace("xfs_ilock") $ip:struct xfs_inode* $lock_flags:unsig= ned int $caller_ip:long unsigned int
kernel.trace("xfs_ilock_demote= ") $ip:struct xfs_inode* $lock_flags:unsigned int $caller_ip:long unsi= gned int
kernel.trace("xfs_ilock_nowait") $ip:struct xfs_inode* $lock_flag= s:unsigned int $caller_ip:long unsigned int
kernel.trace("xfs_inode= _item_push") $bp:struct xfs_buf* $caller_ip:long unsigned int
kerne= l.trace("xfs_inode_pin") $ip:struct xfs_inode* $caller_ip:long un= signed int
kernel.trace("xfs_inode_unpin") $ip:struct xfs_inode* $caller_ip:= long unsigned int
kernel.trace("xfs_inode_unpin_nowait") $ip:s= truct xfs_inode* $caller_ip:long unsigned int
kernel.trace("xfs_inv= alidatepage") $inode:struct inode* $page:struct page* $off:long unsign= ed int
kernel.trace("xfs_ioctl_setattr") $ip:struct xfs_inode*
kernel= .trace("xfs_irele") $ip:struct xfs_inode* $caller_ip:long unsigne= d int
kernel.trace("xfs_itruncate_finish_end") $ip:struct xfs_= inode* $new_size:xfs_fsize_t
kernel.trace("xfs_itruncate_finish_start") $ip:struct xfs_inode* = $new_size:xfs_fsize_t
kernel.trace("xfs_itruncate_start") $ip:= struct xfs_inode* $new_size:xfs_fsize_t $flag:int $toss_start:xfs_off_t $to= ss_finish:xfs_off_t
kernel.trace("xfs_iunlock") $ip:struct xfs_inode* $lock_flags:uns= igned int $caller_ip:long unsigned int
kernel.trace("xfs_link"= ) $dp:struct xfs_inode* $xfs_link:struct xfs_name*
kernel.trace("xf= s_log_done_nonperm") $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_log_done_perm") $log:struct log* $tic:struct xl= og_ticket*
kernel.trace("xfs_log_grant_enter") $log:struct log= * $tic:struct xlog_ticket*
kernel.trace("xfs_log_grant_error")= $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_log_grant_exit") $log:struct log* $tic:struct x= log_ticket*
kernel.trace("xfs_log_grant_sleep1") $log:struct l= og* $tic:struct xlog_ticket*
kernel.trace("xfs_log_grant_sleep2&quo= t;) $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_log_grant_wake1") $log:struct log* $tic:struct = xlog_ticket*
kernel.trace("xfs_log_grant_wake2") $log:struct l= og* $tic:struct xlog_ticket*
kernel.trace("xfs_log_grant_wake_up&qu= ot;) $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_log_recover_buf_cancel") $log:struct log* $buf_= f:struct xfs_buf_log_format*
kernel.trace("xfs_log_recover_buf_canc= el_add") $log:struct log* $buf_f:struct xfs_buf_log_format*
kernel.= trace("xfs_log_recover_buf_cancel_ref_inc") $log:struct log* $buf= _f:struct xfs_buf_log_format*
kernel.trace("xfs_log_recover_buf_dquot_buf") $log:struct log* $b= uf_f:struct xfs_buf_log_format*
kernel.trace("xfs_log_recover_buf_i= node_buf") $log:struct log* $buf_f:struct xfs_buf_log_format*
kerne= l.trace("xfs_log_recover_buf_not_cancel") $log:struct log* $buf_f= :struct xfs_buf_log_format*
kernel.trace("xfs_log_recover_buf_recover") $log:struct log* $buf= _f:struct xfs_buf_log_format*
kernel.trace("xfs_log_recover_buf_reg= _buf") $log:struct log* $buf_f:struct xfs_buf_log_format*
kernel.tr= ace("xfs_log_recover_inode_cancel") $log:struct log* $in_f:struct= xfs_inode_log_format*
kernel.trace("xfs_log_recover_inode_recover") $log:struct log* $i= n_f:struct xfs_inode_log_format*
kernel.trace("xfs_log_recover_inod= e_skip") $log:struct log* $in_f:struct xfs_inode_log_format*
kernel= .trace("xfs_log_recover_item_add") $log:struct log* $trans:struct= xlog_recover* $item:struct xlog_recover_item* $pass:int
kernel.trace("xfs_log_recover_item_add_cont") $log:struct log* $t= rans:struct xlog_recover* $item:struct xlog_recover_item* $pass:int
kern= el.trace("xfs_log_recover_item_recover") $log:struct log* $trans:= struct xlog_recover* $item:struct xlog_recover_item* $pass:int
kernel.trace("xfs_log_recover_item_reorder_head") $log:struct log= * $trans:struct xlog_recover* $item:struct xlog_recover_item* $pass:int
= kernel.trace("xfs_log_recover_item_reorder_tail") $log:struct log= * $trans:struct xlog_recover* $item:struct xlog_recover_item* $pass:int
kernel.trace("xfs_log_regrant_reserve_enter") $log:struct log* $t= ic:struct xlog_ticket*
kernel.trace("xfs_log_regrant_reserve_exit&q= uot;) $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_l= og_regrant_reserve_sub") $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_log_regrant_write_enter") $log:struct log* $tic= :struct xlog_ticket*
kernel.trace("xfs_log_regrant_write_error"= ;) $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_log_= regrant_write_exit") $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_log_regrant_write_sleep1") $log:struct log* $ti= c:struct xlog_ticket*
kernel.trace("xfs_log_regrant_write_sleep2&qu= ot;) $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_lo= g_regrant_write_wake1") $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_log_regrant_write_wake2") $log:struct log* $tic= :struct xlog_ticket*
kernel.trace("xfs_log_regrant_write_wake_up&qu= ot;) $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_lo= g_reserve") $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_log_umount_write") $log:struct log* $tic:struct= xlog_ticket*
kernel.trace("xfs_log_ungrant_enter") $log:struc= t log* $tic:struct xlog_ticket*
kernel.trace("xfs_log_ungrant_exit&= quot;) $log:struct log* $tic:struct xlog_ticket*
kernel.trace("xfs_log_ungrant_sub") $log:struct log* $tic:struct = xlog_ticket*
kernel.trace("xfs_lookup") $dp:struct xfs_inode* = $xfs_lookup:struct xfs_name*
kernel.trace("xfs_map_blocks_alloc&quo= t;) $ip:struct xfs_inode* $offset:xfs_off_t $count:ssize_t $type:int $irec:= struct xfs_bmbt_irec*
kernel.trace("xfs_map_blocks_found") $ip:struct xfs_inode* $offse= t:xfs_off_t $count:ssize_t $type:int $irec:struct xfs_bmbt_irec*
kernel.= trace("xfs_pagecache_inval") $ip:struct xfs_inode* $start:xfs_off= _t $finish:xfs_off_t
kernel.trace("xfs_perag_clear_reclaim") $mp:struct xfs_mount* $ag= no:xfs_agnumber_t $refcount:int $caller_ip:long unsigned int
kernel.trac= e("xfs_perag_get") $mp:struct xfs_mount* $agno:xfs_agnumber_t $re= fcount:int $caller_ip:long unsigned int
kernel.trace("xfs_perag_get_tag") $mp:struct xfs_mount* $agno:xfs= _agnumber_t $refcount:int $caller_ip:long unsigned int
kernel.trace(&quo= t;xfs_perag_put") $mp:struct xfs_mount* $agno:xfs_agnumber_t $refcount= :int $caller_ip:long unsigned int
kernel.trace("xfs_perag_set_reclaim") $mp:struct xfs_mount* $agno= :xfs_agnumber_t $refcount:int $caller_ip:long unsigned int
kernel.trace(= "xfs_readdir") $ip:struct xfs_inode*
kernel.trace("xfs_re= adlink") $ip:struct xfs_inode*
kernel.trace("xfs_releasepage") $inode:struct inode* $page:struct= page* $off:long unsigned int
kernel.trace("xfs_remove") $dp:s= truct xfs_inode* $xfs_remove:struct xfs_name*
kernel.trace("xfs_ren= ame") $src_dp:struct xfs_inode* $target_dp:struct xfs_inode* $src_name= :struct xfs_name* $target_name:struct xfs_name*
kernel.trace("xfs_reset_dqcounts") $bp:struct xfs_buf* $caller_ip= :long unsigned int
kernel.trace("xfs_setattr") $ip:struct xfs_= inode*
kernel.trace("xfs_swap_extent_after") $ip:struct xfs_in= ode* $which:int
kernel.trace("xfs_swap_extent_before") $ip:struct xfs_inode* $whi= ch:int
kernel.trace("xfs_symlink") $dp:struct xfs_inode* $xfs_= symlink:struct xfs_name*
kernel.trace("xfs_trans_bhold") $bip:= struct xfs_buf_log_item*
kernel.trace("xfs_trans_bhold_release") $bip:struct xfs_buf_log_i= tem*
kernel.trace("xfs_trans_binval") $bip:struct xfs_buf_log_= item*
kernel.trace("xfs_trans_bjoin") $bip:struct xfs_buf_log_= item*
kernel.trace("xfs_trans_brelse") $bip:struct xfs_buf_log_item*kernel.trace("xfs_trans_commit_lsn") $trans:struct xfs_trans*kernel.trace("xfs_trans_get_buf") $bip:struct xfs_buf_log_item*<= br> kernel.trace("xfs_trans_get_buf_recur") $bip:struct xfs_buf_log_i= tem*
kernel.trace("xfs_trans_getsb") $bip:struct xfs_buf_log_i= tem*
kernel.trace("xfs_trans_getsb_recur") $bip:struct xfs_buf= _log_item*
kernel.trace("xfs_trans_log_buf") $bip:struct xfs_buf_log_item*kernel.trace("xfs_trans_read_buf") $bip:struct xfs_buf_log_item= *
kernel.trace("xfs_trans_read_buf_io") $bp:struct xfs_buf* $c= aller_ip:long unsigned int
kernel.trace("xfs_trans_read_buf_recur") $bip:struct xfs_buf_log_= item*
kernel.trace("xfs_trans_read_buf_shut") $bp:struct xfs_b= uf* $caller_ip:long unsigned int
kernel.trace("xfs_unwritten_conver= t") $ip:struct xfs_inode* $offset:xfs_off_t $count:ssize_t
kernel.trace("xfs_vm_bmap") $ip:struct xfs_inode*
kernel.trace= ("xfs_write_inode") $ip:struct xfs_inode*
kernel.trace("x= fs_writepage") $inode:struct inode* $page:struct page* $off:long unsig= ned int


2013/4/= 12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brian,
Sorry but when I execute= the script it says:
WARNING: cannot find module xfs debuginfo: No DWARF= information found
semantic error: no match while resolving probe point = module("xfs").function("xfs_iunlink")

uname -a
2.6.32-279.el6.x86_64
kernel debuginfo has been in= stalled.

Where can I find the correct xfs debuginfo?
<= /div>


Thank you for your help.


2013/4/12 Brian Foster <bfoster@redhat= .com>
On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote:
> It happens tonight again on one of our servers, how to debug the root<= br> > cause? Thank you.
>

Hi,

I've attached a system tap script (stap -v xfs.stp) that should
hopefully print out a bit more data should the issue happen again. Do
you have a small enough number of nodes (or predictable enough pattern)
that you could run this on the nodes that tend to fail and collect the
output?

Also, could you collect an xfs_metadump of the filesystem in question
and make it available for download and analysis somewhere? I believe the ideal approach is to mount/umount the filesystem first to replay the log before collecting a metadump, but somebody could correct me on that (to
be safe, you could collect multiple dumps: pre-mount and post-mount).

Could you also describe your workload a little bit? Thanks.

Brian

> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove:
> xfs_inotobp() returned error 22.
> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree return= ed
> error 22
> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1)
> called from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return addr= ess =3D
> 0xffffffffa02ee20a
> Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting > down filesystem
> Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem a= nd
> rectify the problem(s)
> Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
> Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
> Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
> Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d.
>
> xfs_repair -n
>
>
> Phase 7 - verify link counts...
> would have reset inode 20021 nlinks from 0 to 1
> would have reset inode 20789 nlinks from 0 to 1
> would have reset inode 35125 nlinks from 0 to 1
> would have reset inode 35637 nlinks from 0 to 1
> would have reset inode 36149 nlinks from 0 to 1
> would have reset inode 38197 nlinks from 0 to 1
> would have reset inode 39477 nlinks from 0 to 1
> would have reset inode 54069 nlinks from 0 to 1
> would have reset inode 62261 nlinks from 0 to 1
> would have reset inode 63029 nlinks from 0 to 1
> would have reset inode 72501 nlinks from 0 to 1
> would have reset inode 79925 nlinks from 0 to 1
> would have reset inode 81205 nlinks from 0 to 1
> would have reset inode 84789 nlinks from 0 to 1
> would have reset inode 87861 nlinks from 0 to 1
> would have reset inode 90663 nlinks from 0 to 1
> would have reset inode 91189 nlinks from 0 to 1
> would have reset inode 95541 nlinks from 0 to 1
> would have reset inode 98101 nlinks from 0 to 1
> would have reset inode 101173 nlinks from 0 to 1
> would have reset inode 113205 nlinks from 0 to 1
> would have reset inode 114741 nlinks from 0 to 1
> would have reset inode 126261 nlinks from 0 to 1
> would have reset inode 140597 nlinks from 0 to 1
> would have reset inode 144693 nlinks from 0 to 1
> would have reset inode 147765 nlinks from 0 to 1
> would have reset inode 152885 nlinks from 0 to 1
> would have reset inode 161333 nlinks from 0 to 1
> would have reset inode 161845 nlinks from 0 to 1
> would have reset inode 167477 nlinks from 0 to 1
> would have reset inode 172341 nlinks from 0 to 1
> would have reset inode 191797 nlinks from 0 to 1
> would have reset inode 204853 nlinks from 0 to 1
> would have reset inode 205365 nlinks from 0 to 1
> would have reset inode 215349 nlinks from 0 to 1
> would have reset inode 215861 nlinks from 0 to 1
> would have reset inode 216373 nlinks from 0 to 1
> would have reset inode 217397 nlinks from 0 to 1
> would have reset inode 224309 nlinks from 0 to 1
> would have reset inode 225589 nlinks from 0 to 1
> would have reset inode 234549 nlinks from 0 to 1
> would have reset inode 234805 nlinks from 0 to 1
> would have reset inode 249653 nlinks from 0 to 1
> would have reset inode 250677 nlinks from 0 to 1
> would have reset inode 252469 nlinks from 0 to 1
> would have reset inode 261429 nlinks from 0 to 1
> would have reset inode 265013 nlinks from 0 to 1
> would have reset inode 266805 nlinks from 0 to 1
> would have reset inode 267317 nlinks from 0 to 1
> would have reset inode 268853 nlinks from 0 to 1
> would have reset inode 272437 nlinks from 0 to 1
> would have reset inode 273205 nlinks from 0 to 1
> would have reset inode 274229 nlinks from 0 to 1
> would have reset inode 278325 nlinks from 0 to 1
> would have reset inode 278837 nlinks from 0 to 1
> would have reset inode 281397 nlinks from 0 to 1
> would have reset inode 292661 nlinks from 0 to 1
> would have reset inode 300853 nlinks from 0 to 1
> would have reset inode 302901 nlinks from 0 to 1
> would have reset inode 305205 nlinks from 0 to 1
> would have reset inode 314165 nlinks from 0 to 1
> would have reset inode 315189 nlinks from 0 to 1
> would have reset inode 320309 nlinks from 0 to 1
> would have reset inode 324917 nlinks from 0 to 1
> would have reset inode 328245 nlinks from 0 to 1
> would have reset inode 335925 nlinks from 0 to 1
> would have reset inode 339253 nlinks from 0 to 1
> would have reset inode 339765 nlinks from 0 to 1
> would have reset inode 348213 nlinks from 0 to 1
> would have reset inode 360501 nlinks from 0 to 1
> would have reset inode 362037 nlinks from 0 to 1
> would have reset inode 366389 nlinks from 0 to 1
> would have reset inode 385845 nlinks from 0 to 1
> would have reset inode 390709 nlinks from 0 to 1
> would have reset inode 409141 nlinks from 0 to 1
> would have reset inode 413237 nlinks from 0 to 1
> would have reset inode 414773 nlinks from 0 to 1
> would have reset inode 417845 nlinks from 0 to 1
> would have reset inode 436021 nlinks from 0 to 1
> would have reset inode 439349 nlinks from 0 to 1
> would have reset inode 447029 nlinks from 0 to 1
> would have reset inode 491317 nlinks from 0 to 1
> would have reset inode 494133 nlinks from 0 to 1
> would have reset inode 495413 nlinks from 0 to 1
> would have reset inode 501301 nlinks from 0 to 1
> would have reset inode 506421 nlinks from 0 to 1
> would have reset inode 508469 nlinks from 0 to 1
> would have reset inode 508981 nlinks from 0 to 1
> would have reset inode 511797 nlinks from 0 to 1
> would have reset inode 513077 nlinks from 0 to 1
> would have reset inode 517941 nlinks from 0 to 1
> would have reset inode 521013 nlinks from 0 to 1
> would have reset inode 522805 nlinks from 0 to 1
> would have reset inode 523317 nlinks from 0 to 1
> would have reset inode 525621 nlinks from 0 to 1
> would have reset inode 527925 nlinks from 0 to 1
> would have reset inode 535605 nlinks from 0 to 1
> would have reset inode 541749 nlinks from 0 to 1
> would have reset inode 573493 nlinks from 0 to 1
> would have reset inode 578613 nlinks from 0 to 1
> would have reset inode 583029 nlinks from 0 to 1
> would have reset inode 585525 nlinks from 0 to 1
> would have reset inode 586293 nlinks from 0 to 1
> would have reset inode 586805 nlinks from 0 to 1
> would have reset inode 591413 nlinks from 0 to 1
> would have reset inode 594485 nlinks from 0 to 1
> would have reset inode 596277 nlinks from 0 to 1
> would have reset inode 603189 nlinks from 0 to 1
> would have reset inode 613429 nlinks from 0 to 1
> would have reset inode 617781 nlinks from 0 to 1
> would have reset inode 621877 nlinks from 0 to 1
> would have reset inode 623925 nlinks from 0 to 1
> would have reset inode 625205 nlinks from 0 to 1
> would have reset inode 626741 nlinks from 0 to 1
> would have reset inode 639541 nlinks from 0 to 1
> would have reset inode 640053 nlinks from 0 to 1
> would have reset inode 640565 nlinks from 0 to 1
> would have reset inode 645173 nlinks from 0 to 1
> would have reset inode 652853 nlinks from 0 to 1
> would have reset inode 656181 nlinks from 0 to 1
> would have reset inode 659253 nlinks from 0 to 1
> would have reset inode 663605 nlinks from 0 to 1
> would have reset inode 667445 nlinks from 0 to 1
> would have reset inode 680757 nlinks from 0 to 1
> would have reset inode 691253 nlinks from 0 to 1
> would have reset inode 691765 nlinks from 0 to 1
> would have reset inode 697653 nlinks from 0 to 1
> would have reset inode 700469 nlinks from 0 to 1
> would have reset inode 707893 nlinks from 0 to 1
> would have reset inode 716853 nlinks from 0 to 1
> would have reset inode 722229 nlinks from 0 to 1
> would have reset inode 722741 nlinks from 0 to 1
> would have reset inode 723765 nlinks from 0 to 1
> would have reset inode 731957 nlinks from 0 to 1
> would have reset inode 742965 nlinks from 0 to 1
> would have reset inode 743477 nlinks from 0 to 1
> would have reset inode 745781 nlinks from 0 to 1
> would have reset inode 746293 nlinks from 0 to 1
> would have reset inode 774453 nlinks from 0 to 1
> would have reset inode 778805 nlinks from 0 to 1
> would have reset inode 785013 nlinks from 0 to 1
> would have reset inode 785973 nlinks from 0 to 1
> would have reset inode 791349 nlinks from 0 to 1
> would have reset inode 796981 nlinks from 0 to 1
> would have reset inode 803381 nlinks from 0 to 1
> would have reset inode 806965 nlinks from 0 to 1
> would have reset inode 811798 nlinks from 0 to 1
> would have reset inode 812310 nlinks from 0 to 1
> would have reset inode 813078 nlinks from 0 to 1
> would have reset inode 813607 nlinks from 0 to 1
> would have reset inode 814183 nlinks from 0 to 1
> would have reset inode 822069 nlinks from 0 to 1
> would have reset inode 828469 nlinks from 0 to 1
> would have reset inode 830005 nlinks from 0 to 1
> would have reset inode 832053 nlinks from 0 to 1
> would have reset inode 832565 nlinks from 0 to 1
> would have reset inode 836661 nlinks from 0 to 1
> would have reset inode 841013 nlinks from 0 to 1
> would have reset inode 841525 nlinks from 0 to 1
> would have reset inode 845365 nlinks from 0 to 1
> would have reset inode 846133 nlinks from 0 to 1
> would have reset inode 847157 nlinks from 0 to 1
> would have reset inode 852533 nlinks from 0 to 1
> would have reset inode 857141 nlinks from 0 to 1
> would have reset inode 863271 nlinks from 0 to 1
> would have reset inode 866855 nlinks from 0 to 1
> would have reset inode 887861 nlinks from 0 to 1
> would have reset inode 891701 nlinks from 0 to 1
> would have reset inode 894773 nlinks from 0 to 1
> would have reset inode 900149 nlinks from 0 to 1
> would have reset inode 902197 nlinks from 0 to 1
> would have reset inode 906293 nlinks from 0 to 1
> would have reset inode 906805 nlinks from 0 to 1
> would have reset inode 909877 nlinks from 0 to 1
> would have reset inode 925493 nlinks from 0 to 1
> would have reset inode 949543 nlinks from 0 to 1
> would have reset inode 955175 nlinks from 0 to 1
> would have reset inode 963623 nlinks from 0 to 1
> would have reset inode 967733 nlinks from 0 to 1
> would have reset inode 968231 nlinks from 0 to 1
> would have reset inode 982069 nlinks from 0 to 1
> would have reset inode 1007413 nlinks from 0 to 1
> would have reset inode 1011509 nlinks from 0 to 1
> would have reset inode 1014069 nlinks from 0 to 1
> would have reset inode 1014581 nlinks from 0 to 1
> would have reset inode 1022005 nlinks from 0 to 1
> would have reset inode 1022517 nlinks from 0 to 1
> would have reset inode 1023029 nlinks from 0 to 1
> would have reset inode 1025333 nlinks from 0 to 1
> would have reset inode 1043765 nlinks from 0 to 1
> would have reset inode 1044789 nlinks from 0 to 1
> would have reset inode 1049397 nlinks from 0 to 1
> would have reset inode 1050933 nlinks from 0 to 1
> would have reset inode 1051445 nlinks from 0 to 1
> would have reset inode 1054261 nlinks from 0 to 1
> would have reset inode 1060917 nlinks from 0 to 1
> would have reset inode 1063477 nlinks from 0 to 1
> would have reset inode 1076021 nlinks from 0 to 1
> would have reset inode 1081141 nlinks from 0 to 1
> would have reset inode 1086261 nlinks from 0 to 1
> would have reset inode 1097269 nlinks from 0 to 1
> would have reset inode 1099829 nlinks from 0 to 1
> would have reset inode 1100853 nlinks from 0 to 1
> would have reset inode 1101877 nlinks from 0 to 1
> would have reset inode 1126709 nlinks from 0 to 1
> would have reset inode 1134389 nlinks from 0 to 1
> would have reset inode 1141045 nlinks from 0 to 1
> would have reset inode 1141557 nlinks from 0 to 1
> would have reset inode 1142581 nlinks from 0 to 1
> would have reset inode 1148469 nlinks from 0 to 1
> would have reset inode 1153333 nlinks from 0 to 1
> would have reset inode 1181749 nlinks from 0 to 1
> would have reset inode 1192245 nlinks from 0 to 1
> would have reset inode 1198133 nlinks from 0 to 1
> would have reset inode 1203765 nlinks from 0 to 1
> would have reset inode 1221429 nlinks from 0 to 1
> would have reset inode 1223989 nlinks from 0 to 1
> would have reset inode 1235509 nlinks from 0 to 1
> would have reset inode 1239349 nlinks from 0 to 1
> would have reset inode 1240885 nlinks from 0 to 1
> would have reset inode 1241397 nlinks from 0 to 1
> would have reset inode 1241909 nlinks from 0 to 1
> would have reset inode 1242421 nlinks from 0 to 1
> would have reset inode 1244981 nlinks from 0 to 1
> would have reset inode 1246517 nlinks from 0 to 1
> would have reset inode 1253429 nlinks from 0 to 1
> would have reset inode 1271861 nlinks from 0 to 1
> would have reset inode 1274677 nlinks from 0 to 1
> would have reset inode 1277749 nlinks from 0 to 1
> would have reset inode 1278773 nlinks from 0 to 1
> would have reset inode 1286709 nlinks from 0 to 1
> would have reset inode 1288245 nlinks from 0 to 1
> would have reset inode 1299765 nlinks from 0 to 1
> would have reset inode 1302325 nlinks from 0 to 1
> would have reset inode 1304885 nlinks from 0 to 1
> would have reset inode 1305397 nlinks from 0 to 1
> would have reset inode 1307509 nlinks from 0 to 1
> would have reset inode 1309493 nlinks from 0 to 1
> would have reset inode 1310517 nlinks from 0 to 1
> would have reset inode 1311029 nlinks from 0 to 1
> would have reset inode 1312053 nlinks from 0 to 1
> would have reset inode 1316917 nlinks from 0 to 1
> would have reset inode 1317941 nlinks from 0 to 1
> would have reset inode 1320821 nlinks from 0 to 1
> would have reset inode 1322805 nlinks from 0 to 1
> would have reset inode 1332789 nlinks from 0 to 1
> would have reset inode 1336373 nlinks from 0 to 1
> would have reset inode 1345653 nlinks from 0 to 1
> would have reset inode 1354549 nlinks from 0 to 1
> would have reset inode 1361973 nlinks from 0 to 1
> would have reset inode 1369909 nlinks from 0 to 1
> would have reset inode 1372981 nlinks from 0 to 1
> would have reset inode 1388853 nlinks from 0 to 1
> would have reset inode 1402933 nlinks from 0 to 1
> would have reset inode 1403445 nlinks from 0 to 1
> would have reset inode 1420085 nlinks from 0 to 1
> would have reset inode 1452853 nlinks from 0 to 1
> would have reset inode 1456437 nlinks from 0 to 1
> would have reset inode 1457973 nlinks from 0 to 1
> would have reset inode 1459253 nlinks from 0 to 1
> would have reset inode 1467957 nlinks from 0 to 1
> would have reset inode 1471541 nlinks from 0 to 1
> would have reset inode 1476661 nlinks from 0 to 1
> would have reset inode 1479733 nlinks from 0 to 1
> would have reset inode 1483061 nlinks from 0 to 1
> would have reset inode 1484085 nlinks from 0 to 1
> would have reset inode 1486133 nlinks from 0 to 1
> would have reset inode 1489461 nlinks from 0 to 1
> would have reset inode 1490037 nlinks from 0 to 1
> would have reset inode 1492021 nlinks from 0 to 1
> would have reset inode 1493557 nlinks from 0 to 1
> would have reset inode 1494069 nlinks from 0 to 1
> would have reset inode 1496885 nlinks from 0 to 1
> would have reset inode 1498421 nlinks from 0 to 1
> would have reset inode 1498933 nlinks from 0 to 1
> would have reset inode 1499957 nlinks from 0 to 1
> would have reset inode 1506101 nlinks from 0 to 1
> would have reset inode 1507637 nlinks from 0 to 1
> would have reset inode 1510453 nlinks from 0 to 1
> would have reset inode 1514293 nlinks from 0 to 1
> would have reset inode 1517365 nlinks from 0 to 1
> would have reset inode 1520693 nlinks from 0 to 1
> would have reset inode 1521973 nlinks from 0 to 1
> would have reset inode 1530421 nlinks from 0 to 1
> would have reset inode 1530933 nlinks from 0 to 1
> would have reset inode 1537333 nlinks from 0 to 1
> would have reset inode 1538357 nlinks from 0 to 1
> would have reset inode 1548853 nlinks from 0 to 1
> would have reset inode 1553973 nlinks from 0 to 1
> would have reset inode 1557301 nlinks from 0 to 1
> would have reset inode 1564213 nlinks from 0 to 1
> would have reset inode 1564725 nlinks from 0 to 1
> would have reset inode 1576501 nlinks from 0 to 1
> would have reset inode 1580597 nlinks from 0 to 1
> would have reset inode 1584693 nlinks from 0 to 1
> would have reset inode 1586485 nlinks from 0 to 1
> would have reset inode 1589301 nlinks from 0 to 1
> would have reset inode 1589813 nlinks from 0 to 1
> would have reset inode 1592629 nlinks from 0 to 1
> would have reset inode 1595701 nlinks from 0 to 1
> would have reset inode 1601077 nlinks from 0 to 1
> would have reset inode 1623861 nlinks from 0 to 1
> would have reset inode 1626677 nlinks from 0 to 1
> would have reset inode 1627701 nlinks from 0 to 1
> would have reset inode 1633333 nlinks from 0 to 1
> would have reset inode 1639221 nlinks from 0 to 1
> would have reset inode 1649205 nlinks from 0 to 1
> would have reset inode 1686325 nlinks from 0 to 1
> would have reset inode 1690677 nlinks from 0 to 1
> would have reset inode 1693749 nlinks from 0 to 1
> would have reset inode 1704757 nlinks from 0 to 1
> would have reset inode 1707061 nlinks from 0 to 1
> would have reset inode 1709109 nlinks from 0 to 1
> would have reset inode 1719349 nlinks from 0 to 1
> would have reset inode 1737013 nlinks from 0 to 1
> would have reset inode 1741365 nlinks from 0 to 1
> would have reset inode 1747509 nlinks from 0 to 1
> would have reset inode 1770805 nlinks from 0 to 1
> would have reset inode 1780789 nlinks from 0 to 1
> would have reset inode 1793589 nlinks from 0 to 1
> would have reset inode 1795125 nlinks from 0 to 1
> would have reset inode 1800757 nlinks from 0 to 1
> would have reset inode 1801269 nlinks from 0 to 1
> would have reset inode 1802549 nlinks from 0 to 1
> would have reset inode 1804085 nlinks from 0 to 1
> would have reset inode 1817141 nlinks from 0 to 1
> would have reset inode 1821749 nlinks from 0 to 1
> would have reset inode 1832757 nlinks from 0 to 1
> would have reset inode 1836341 nlinks from 0 to 1
> would have reset inode 1856309 nlinks from 0 to 1
> would have reset inode 1900597 nlinks from 0 to 1
> would have reset inode 1902901 nlinks from 0 to 1
> would have reset inode 1912373 nlinks from 0 to 1
> would have reset inode 1943093 nlinks from 0 to 1
> would have reset inode 1944373 nlinks from 0 to 1
> would have reset inode 1954101 nlinks from 0 to 1
> would have reset inode 1955893 nlinks from 0 to 1
> would have reset inode 1961781 nlinks from 0 to 1
> would have reset inode 1974325 nlinks from 0 to 1
> would have reset inode 1978677 nlinks from 0 to 1
> would have reset inode 1981237 nlinks from 0 to 1
> would have reset inode 1992245 nlinks from 0 to 1
> would have reset inode 2000949 nlinks from 0 to 1
> would have reset inode 2002229 nlinks from 0 to 1
> would have reset inode 2004789 nlinks from 0 to 1
> would have reset inode 2005301 nlinks from 0 to 1
> would have reset inode 2011189 nlinks from 0 to 1
> would have reset inode 2012981 nlinks from 0 to 1
> would have reset inode 2015285 nlinks from 0 to 1
> would have reset inode 2018869 nlinks from 0 to 1
> would have reset inode 2028341 nlinks from 0 to 1
> would have reset inode 2028853 nlinks from 0 to 1
> would have reset inode 2030901 nlinks from 0 to 1
> would have reset inode 2032181 nlinks from 0 to 1
> would have reset inode 2032693 nlinks from 0 to 1
> would have reset inode 2040117 nlinks from 0 to 1
> would have reset inode 2053685 nlinks from 0 to 1
> would have reset inode 2083893 nlinks from 0 to 1
> would have reset inode 2087221 nlinks from 0 to 1
> would have reset inode 2095925 nlinks from 0 to 1
> would have reset inode 2098741 nlinks from 0 to 1
> would have reset inode 2100533 nlinks from 0 to 1
> would have reset inode 2101301 nlinks from 0 to 1
> would have reset inode 2123573 nlinks from 0 to 1
> would have reset inode 2132789 nlinks from 0 to 1
> would have reset inode 2133813 nlinks from 0 to 1
>
>
>
>
>
> 2013/4/10 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com&g= t;>
>
>     The storage info is as following:
>     RAID-6
>     SATA HDD
>     Controller: PERC H710P Mini (Embedded)
>     Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes
>     255 heads, 63 sectors/track, 3647334 cylinders
>     Units =3D cylinders of 16065 * 512 =3D 8225280 bytes
>     Sector size (logical/physical): 512 bytes / 512 bytes >     I/O size (minimum/optimal): 512 bytes / 512 bytes
>     Disk identifier: 0x00000000
>
>     sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (= 30.0 TB/27.2
>     TiB)
>     sd 0:2:1:0: [sdb] Write Protect is off
>     sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08
>     sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enab= led, doesn't
>     support DPO or FUA
>     sd 0:2:1:0: [sdb] Attached SCSI disk
>
>     *-storage
>            description: RAID bus control= ler
>            product: MegaRAID SAS 2208 [T= hunderbolt]
>            vendor: LSI Logic / Symbios L= ogic
>            physical id: 0
>            bus info: pci@0000:02:00.0 >            logical name: scsi0
>            version: 01
>            width: 64 bits
>            clock: 33MHz
>            capabilities: storage pm pcie= xpress vpd msi msix bus_master
>     cap_list rom
>            configuration: driver=3Dmegar= aid_sas latency=3D0
>            resources: irq:42 ioport:fc00= (size=3D256)
>     memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff
>     memory:dc800000-dc81ffff(prefetchable)
>          *-disk:0
>               description: SCSI Dis= k
>               product: PERC H710P >               vendor: DELL
>               physical id: 2.0.0 >               bus info: scsi@0:2.0.= 0
>               logical name: /dev/sd= a
>               version: 3.13
>               serial: 0049d6ce1d9f2= 035180096fde490f648
>               size: 558GiB (599GB)<= br> >               capabilities: partiti= oned partitioned:dos
>               configuration: ansive= rsion=3D5 signature=3D000aa336
>          *-disk:1
>               description: SCSI Dis= k
>               product: PERC H710P >               vendor: DELL
>               physical id: 2.1.0 >               bus info: scsi@0:2.1.= 0
>               logical name: /dev/sd= b
>               logical name: /mnt/xf= sd
>               version: 3.13
>               serial: 003366f71da22= 035180096fde490f648
>               size: 27TiB (30TB) >               configuration: ansive= rsion=3D5 mount.fstype=3Dxfs
>     mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64= k,sunit=3D128,swidth=3D1280,noquota
>     state=3Dmounted
>
>     Thank you.
>
>
>     2013/4/10 Emmanuel Florac <eflorac@intellique.com
>     <mailto:eflorac@intellique.com>>
>
>         Le Tue, 9 Apr 2013 23:10:03 +0800
>         =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mai= lto:yongtaofu@gmai= l.com>> =A8=A6crivait:
>
>         > > Apr  9 11:01:30 cqdx kernel= : XFS (sdb): I/O Error Detected.
>         > > Shutting down filesystem
>
>         This. I/O error detected. That means that = at some point the
>         underlying
>         device (disk, RAID array, SAN volume) coul= dn't be reached. So this
>         could very well be a case of a flakey driv= e, array, cable or SCSI
>         driver.
>
>         What's the storage setup here?
>
>         --
>         ------------------------------------------= ------------------------------
>         Emmanuel Florac     |   Dir= ection technique
>                     =         |   Intellique
>                     =         |   <eflorac@intellique.com
>         <mailto:eflorac@intellique.com>>
>                   &n= bsp;         |   +33 1 78 94 84 02=
>         ------------------------------------------= ------------------------------
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE
>
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
>
= http://oss.sgi.com/mailman/listinfo/xfs
>




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--089e011831980e5b8d04da231926-- From yongtaofu@gmail.com Fri Apr 12 00:41:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 690367F37 for ; Fri, 12 Apr 2013 00:41:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 29B4B8F808F for ; Thu, 11 Apr 2013 22:41:02 -0700 (PDT) X-ASG-Debug-ID: 1365745260-04bdf02d1fcda40001-NocioJ Received: from mail-ia0-f174.google.com (mail-ia0-f174.google.com [209.85.210.174]) by cuda.sgi.com with ESMTP id 0cPXBn5sw8yhUPRc (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 22:41:00 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.174] Received: by mail-ia0-f174.google.com with SMTP id r13so2053613iar.5 for ; Thu, 11 Apr 2013 22:41:00 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=gTOM12lugYMpQSJSlhc6JX3HlIhJyK+12+4qywqCtwM=; b=r76xCqR/XqJVZR0QAysvnJZuP7m8NF5qQh/fE333aiX8RiX2yg6DMiOAtTEi9Nz0Np v2nTBKftyEhPVA3dUrrxpb7YFUfca1zHYCYqFskw5aGCOtS+Wt9bRhAFsOAjiZAU1TIg cQS1AU/9ZsjodgJKpgh9YcQ99drevfj2zZ9+3XqrOfFWcrL3iTp8rwctA6R0PM2UknGV Me8hjeBQG56ovF16B6K0hOqAQS4yPRpx5WWuaqNrx2wE3jtsWojHlrSfXtfKoJ/2UdzW sDtqF/5Rgvhejl8EX8jKUH+JUFeJ52wQvOYtIGkiTiL/gjYxiw23BDp28azMuYrqpbpe ps+A== MIME-Version: 1.0 X-Received: by 10.50.20.163 with SMTP id o3mr790182ige.51.1365745260125; Thu, 11 Apr 2013 22:41:00 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Thu, 11 Apr 2013 22:40:59 -0700 (PDT) In-Reply-To: <516798AE.9050908@sandeen.net> References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> Date: Fri, 12 Apr 2013 13:40:59 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: Brian Foster , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=047d7bd75dec1563e204da2359d0 X-Barracuda-Connect: mail-ia0-f174.google.com[209.85.210.174] X-Barracuda-Start-Time: 1365745260 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127875 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 --047d7bd75dec1563e204da2359d0 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable ls -l /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug -r--r--r-- 1 root root 21393024 Apr 12 12:08 /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug rpm -qa|grep kernel kernel-headers-2.6.32-279.el6.x86_64 kernel-devel-2.6.32-279.el6.x86_64 kernel-2.6.32-358.el6.x86_64 kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 abrt-addon-kerneloops-2.0.8-6.el6.x86_64 kernel-firmware-2.6.32-358.el6.noarch kernel-debug-2.6.32-358.el6.x86_64 kernel-debuginfo-2.6.32-279.el6.x86_64 dracut-kernel-004-283.el6.noarch libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 kernel-devel-2.6.32-358.el6.x86_64 kernel-2.6.32-279.el6.x86_64 rpm -q kernel-debuginfo kernel-debuginfo-2.6.32-279.el6.x86_64 rpm -q kernel kernel-2.6.32-279.el6.x86_64 kernel-2.6.32-358.el6.x86_64 do I need to re probe it? 2013/4/12 Eric Sandeen > On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote: > > Hi Brian, > > Sorry but when I execute the script it says: > > WARNING: cannot find module xfs debuginfo: No DWARF information found > > semantic error: no match while resolving probe point > module("xfs").function("xfs_iunlink") > > > > uname -a > > 2.6.32-279.el6.x86_64 > > kernel debuginfo has been installed. > > > > Where can I find the correct xfs debuginfo? > > it should be in the kernel-debuginfo rpm (of the same version/release as > the kernel rpm you're running) > > You should have: > > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.deb= ug > > If not, can you show: > > # uname -a > # rpm -q kernel > # rpm -q kernel-debuginfo > > -Eric > > > --=20 =B7=FB=D3=C0=CC=CE --047d7bd75dec1563e204da2359d0 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
ls -l /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_6= 4/kernel/fs/xfs/xfs.ko.debug
-r--r--r-- 1 root root 21393024 Apr 12 12:0= 8 /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.deb= ug

rpm -qa|grep  kernel
kernel-headers-2.6.32-279.el6.x86_64
ke= rnel-devel-2.6.32-279.el6.x86_64
kernel-2.6.32-358.el6.x86_64
kernel-= debuginfo-common-x86_64-2.6.32-279.el6.x86_64
abrt-addon-kerneloops-2.0.= 8-6.el6.x86_64
kernel-firmware-2.6.32-358.el6.noarch
kernel-debug-2.6.32-358.el6.x86_64=
kernel-debuginfo-2.6.32-279.el6.x86_64
dracut-kernel-004-283.el6.noa= rch
libreport-plugin-kerneloops-2.0.9-5.el6.x86_64
kernel-devel-2.6.3= 2-358.el6.x86_64
kernel-2.6.32-279.el6.x86_64

rpm -q kernel-debuginfo
kernel-debug= info-2.6.32-279.el6.x86_64

rpm -q kernel
kernel-2.6.32-279.el6.x8= 6_64
kernel-2.6.32-358.el6.x86_64

do I need to re probe it?=


2013/4/= 12 Eric Sandeen <sandeen@sandeen.net>
On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote:
> Hi Brian,
> Sorry but when I execute the script it says:
> WARNING: cannot find module xfs debuginfo: No DWARF information found<= br> > semantic error: no match while resolving probe point module("xfs&= quot;).function("xfs_iunlink")
>
> uname -a
> 2.6.32-279.el6.x86_64
> kernel debuginfo has been installed.
>
> Where can I find the correct xfs debuginfo?

it should be in the kernel-debuginfo rpm (of the same version/release= as the kernel rpm you're running)

You should have:

/usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug=

If not, can you show:

# uname -a
# rpm -q kernel
# rpm -q kernel-debuginfo

-Eric





--
=B7=FB=D3= =C0=CC=CE
--047d7bd75dec1563e204da2359d0-- From yongtaofu@gmail.com Fri Apr 12 01:00:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 EA4457F37 for ; Fri, 12 Apr 2013 01:00:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8C45BAC005 for ; Thu, 11 Apr 2013 23:00:41 -0700 (PDT) X-ASG-Debug-ID: 1365746439-04bdf02d1dcf050001-NocioJ Received: from mail-ie0-f181.google.com (mail-ie0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id jLrkNHaGXWqYd2kd (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 23:00:40 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] Received: by mail-ie0-f181.google.com with SMTP id 17so2910267iea.40 for ; Thu, 11 Apr 2013 23:00:39 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=slk+fTBxZ562iGY8MVTp/2vbnMUiOIPNRb77RBJXFI8=; b=CMDIfnsCX9aCsVyfPVlHIlMOyFratVSX3ATpubzqk71nFKBdhHW0Xk2zL1kHH+f+q1 zj4A/igF0p4v4waNj3cvGZxrTBppMHaHfLnA4vweHdXgcg1SDNOUHTOKa03cusKCmcq8 fuwmkyQle0ibUUj3RRZxLgCHo43oKHD4T8Nwcyq2uTO5k3ifz6kdxoDYMiwRL2nN1THs VYYfhphXvQr1iq7WOnGaq7CPFzCKxI7dJh0lRZ/JFJSaJWXxOSX7rVrncIPuuQF4gXeI nvbJknvRs6Lh6IM7FwZuhcHL1B52uLEyZL90yivD6ZoCfKchzojUmoL0CH3hQ7l5XajA WEEw== MIME-Version: 1.0 X-Received: by 10.50.20.163 with SMTP id o3mr823043ige.51.1365746439669; Thu, 11 Apr 2013 23:00:39 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Thu, 11 Apr 2013 23:00:39 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> Date: Fri, 12 Apr 2013 14:00:39 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: Brian Foster , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=047d7bd75dec63cc6b04da239f09 X-Barracuda-Connect: mail-ie0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1365746440 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127877 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 --047d7bd75dec63cc6b04da239f09 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable stap -e 'probe module("xfs").function("xfs_iunlink"){}' WARNING: cannot find module xfs debuginfo: No DWARF information found semantic error: no match while resolving probe point module("xfs").function("xfs_iunlink") Pass 2: analysis failed. Try again with another '--vp 01' option. 2013/4/12 =B7=FB=D3=C0=CC=CE > ls -l > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.deb= ug > -r--r--r-- 1 root root 21393024 Apr 12 12:08 > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.deb= ug > > rpm -qa|grep kernel > kernel-headers-2.6.32-279.el6.x86_64 > kernel-devel-2.6.32-279.el6.x86_64 > kernel-2.6.32-358.el6.x86_64 > kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 > abrt-addon-kerneloops-2.0.8-6.el6.x86_64 > kernel-firmware-2.6.32-358.el6.noarch > kernel-debug-2.6.32-358.el6.x86_64 > kernel-debuginfo-2.6.32-279.el6.x86_64 > dracut-kernel-004-283.el6.noarch > libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 > kernel-devel-2.6.32-358.el6.x86_64 > kernel-2.6.32-279.el6.x86_64 > > rpm -q kernel-debuginfo > kernel-debuginfo-2.6.32-279.el6.x86_64 > > rpm -q kernel > kernel-2.6.32-279.el6.x86_64 > kernel-2.6.32-358.el6.x86_64 > > do I need to re probe it? > > > 2013/4/12 Eric Sandeen > >> On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote: >> > Hi Brian, >> > Sorry but when I execute the script it says: >> > WARNING: cannot find module xfs debuginfo: No DWARF information found >> > semantic error: no match while resolving probe point >> module("xfs").function("xfs_iunlink") >> > >> > uname -a >> > 2.6.32-279.el6.x86_64 >> > kernel debuginfo has been installed. >> > >> > Where can I find the correct xfs debuginfo? >> >> it should be in the kernel-debuginfo rpm (of the same version/release as >> the kernel rpm you're running) >> >> You should have: >> >> >> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.de= bug >> >> If not, can you show: >> >> # uname -a >> # rpm -q kernel >> # rpm -q kernel-debuginfo >> >> -Eric >> >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --047d7bd75dec63cc6b04da239f09 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
stap -e 'probe module("xfs").function("= xfs_iunlink"){}'
WARNING: cannot find module xfs debuginfo: No = DWARF information found
semantic error: no match while resolving probe p= oint module("xfs").function("xfs_iunlink")
Pass 2: analysis failed.  Try again with another '--vp 01' opt= ion.


2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
ls -l /usr/lib/debug/l= ib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug
-r--r--r-- 1= root root 21393024 Apr 12 12:08 /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug

rpm -qa|grep  kernel
kernel-headers-2.6.32-279.el6.x86_64
ke= rnel-devel-2.6.32-279.el6.x86_64
kernel-2.6.32-358.el6.x86_64
kernel-= debuginfo-common-x86_64-2.6.32-279.el6.x86_64
abrt-addon-kerneloops-2.0.= 8-6.el6.x86_64
kernel-firmware-2.6.32-358.el6.noarch
kernel-debug-2.6.32-358.el6.x86_64=
kernel-debuginfo-2.6.32-279.el6.x86_64
dracut-kernel-004-283.el6.noa= rch
libreport-plugin-kerneloops-2.0.9-5.el6.x86_64
kernel-devel-2.6.3= 2-358.el6.x86_64
kernel-2.6.32-279.el6.x86_64

rpm -q kernel-debuginfo
kernel-debug= info-2.6.32-279.el6.x86_64

rpm -q kernel
kernel-2.6.32-279.el6.x8= 6_64
kernel-2.6.32-358.el6.x86_64

do I need to re probe it?=


2013/4/12 Eric Sandeen <sandeen@sandeen.net>
On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote:
> Hi Brian,
> Sorry but when I execute the script it says:
> WARNING: cannot find module xfs debuginfo: No DWARF information found<= br> > semantic error: no match while resolving probe point module("xfs&= quot;).function("xfs_iunlink")
>
> uname -a
> 2.6.32-279.el6.x86_64
> kernel debuginfo has been installed.
>
> Where can I find the correct xfs debuginfo?

it should be in the kernel-debuginfo rpm (of the same version/release= as the kernel rpm you're running)

You should have:

/usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug=

If not, can you show:

# uname -a
# rpm -q kernel
# rpm -q kernel-debuginfo

-Eric





--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--047d7bd75dec63cc6b04da239f09-- From shhuiw@gmail.com Fri Apr 12 01:12:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E5DA77F3F for ; Fri, 12 Apr 2013 01:12:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 81FE6AC005 for ; Thu, 11 Apr 2013 23:12:51 -0700 (PDT) X-ASG-Debug-ID: 1365747170-04bdf02d1dcffe0001-NocioJ Received: from mail-da0-f54.google.com (mail-da0-f54.google.com [209.85.210.54]) by cuda.sgi.com with ESMTP id JgPgtwsFkKh5mr6u (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 23:12:50 -0700 (PDT) X-Barracuda-Envelope-From: shhuiw@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.54 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.54] Received: by mail-da0-f54.google.com with SMTP id p1so998588dad.27 for ; Thu, 11 Apr 2013 23:12:50 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.54] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.54] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; bh=CLtJqaa3VFSf1IpZI2aP9Amm5fX/hQzx+Y+ozZAhBXE=; b=mGJ8rz6MGF+YNzjlQ7fCfpf3VP+AnFSuUlmaIdCO+n133552CswYVgte/A7QEBssDX IHxEiBTB7oQd9RL7uG7Vn2mFppe7uMzO0nFyvxSTw7tdp3LDCst5SlrmzlV4YSHR1DRM 9JHA5rkvY7DTED+NvbqVXrBpexVZrH9d8kMApbwvz7RLGQqE7Cp5Z4LWa+r0ikEDVGl5 qG091qJb5RzsWOemYc1CfKRcVTuL2KZLPYj5c7Nb3rtSHyAabm0Hb/ObVDYOsg9CKB2a UmN7AVPLD0ntyRq+8Vbf0TFnztMWGsP9RkGHkXKe6ePXDY6U6NtLsUtvfb1qkf3h9gU5 RUGg== X-Received: by 10.68.194.195 with SMTP id hy3mr12724061pbc.179.1365747170311; Thu, 11 Apr 2013 23:12:50 -0700 (PDT) Received: from [9.115.120.152] ([202.108.130.138]) by mx.google.com with ESMTPS id o7sm3091573pbs.45.2013.04.11.23.12.44 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 11 Apr 2013 23:12:49 -0700 (PDT) Message-ID: <5167A5D3.4070903@gmail.com> Date: Fri, 12 Apr 2013 14:12:35 +0800 From: Wang Sheng-Hui User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Rich Johnston , Dave Chinner , xfstests Subject: [PATCH] xfstests: fix the regex pattern in get_group_list of check Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: [PATCH] xfstests: fix the regex pattern in get_group_list of check Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-da0-f54.google.com[209.85.210.54] X-Barracuda-Start-Time: 1365747170 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127877 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 In group files, non comment line starts with a 3-digits, then followed by space and other characters, but no group names. The old regex in get_group_list uses the group name as part of the regex, and fails './check -g xfs' run: Group "xfs" is empty or not defined? The patch removes the pattern for group name, and thus we can trigger tests like "./check -g xfs" as normal. Signed-off-by: Wang Sheng-Hui --- check | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check b/check index 966fbe5..abc65cb 100755 --- a/check +++ b/check @@ -100,7 +100,7 @@ get_group_list() l=$(sed -n < $SRC_DIR/$d/group \ -e 's/#.*//' \ -e 's/$/ /' \ - -e "s;\(^[0-9][0-9][0-9]\).* $grp .*;$SRC_DIR/$d/\1;p") + -e "s;\(^[0-9][0-9][0-9]\) .*;$SRC_DIR/$d/\1;p") grpl="$grpl $l" done echo $grpl -- 1.7.12.4 From yongtaofu@gmail.com Fri Apr 12 01:15:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0C0367F3F for ; Fri, 12 Apr 2013 01:15:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8666BAC003 for ; Thu, 11 Apr 2013 23:15:13 -0700 (PDT) X-ASG-Debug-ID: 1365747312-04cbb057f5d14f0001-NocioJ Received: from mail-ie0-f178.google.com (mail-ie0-f178.google.com [209.85.223.178]) by cuda.sgi.com with ESMTP id ziKylhFgYYBuSavv (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 11 Apr 2013 23:15:12 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] Received: by mail-ie0-f178.google.com with SMTP id bn7so2920448ieb.23 for ; Thu, 11 Apr 2013 23:15:11 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=fDLwKSbpIYvxX1C02fBDevUwUCY4tA1r2aauDIuFvlQ=; b=VtXmX7o1u8E1GDrXCPz8OVO1+TpnlsuX8Ev7CtP6eteX3xjQ+FYEV9cbGcYKBi7NGS OWEVvDjCgvggOn5VI0Wlu+u5zgQLvo/0F+O5D+15pQQsXXCkeLQQw+H1kFf7cTKRsqFu BwqhDxXZM5PRVwT5lUAtHMVej52jRv6JPmoqANmTLjvPOxJyGzjIPt005/79X7YLv8aB mAY3Ih7xuyPv+AUe38ZoypJ54w8rRk/bLIOFxghKDDj5CcyRs021Q280sP6lL6HEm79g 0GJJ0wV+GoWMRjJUsGd+cVjKqC5jRomvmAUbdGTYTHZD1ILeHLiZz6iLtFxecN23weiR eXjg== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr946758igq.51.1365747311610; Thu, 11 Apr 2013 23:15:11 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Thu, 11 Apr 2013 23:15:11 -0700 (PDT) In-Reply-To: <51675E67.7030600@sandeen.net> References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <51675E67.7030600@sandeen.net> Date: Fri, 12 Apr 2013 14:15:11 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: Brian Foster , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee75c987f04da23d3af X-Barracuda-Connect: mail-ie0-f178.google.com[209.85.223.178] X-Barracuda-Start-Time: 1365747312 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127877 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 --14dae9340ee75c987f04da23d3af Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Eric and all, Thank you for your help and you can get the xfs meta dump file from the following link: https://docs.google.com/file/d/0B7n2C4T5tfNCdFBCTnNxNERmbWc/edit?usp=3Dshar= ing I dump it after a mount/unmount procedure. 2013/4/12 Eric Sandeen > On 4/11/13 6:26 PM, Brian Foster wrote: > > On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote: > >> It happens tonight again on one of our servers, how to debug the root > >> cause? Thank you. > >> > > > > Hi, > > > > I've attached a system tap script (stap -v xfs.stp) that should > > hopefully print out a bit more data should the issue happen again. Do > > you have a small enough number of nodes (or predictable enough pattern) > > that you could run this on the nodes that tend to fail and collect the > > output? > > > > Also, could you collect an xfs_metadump of the filesystem in question > > and make it available for download and analysis somewhere? I believe th= e > > ideal approach is to mount/umount the filesystem first to replay the lo= g > > before collecting a metadump, but somebody could correct me on that (to > > be safe, you could collect multiple dumps: pre-mount and post-mount). > > Dave suggested yesterday that this would be best: metadump right > after unmounting post-failure, then mount/umount & generate another > metadump. > > -Eric > > > Could you also describe your workload a little bit? Thanks. > > > > Brian > > > >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > >> xfs_inotobp() returned error 22. > >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree return= ed > >> error 22 > >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) > >> called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = =3D > >> 0xffffffffa02ee20a > >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting > >> down filesystem > >> Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesystem a= nd > >> rectify the problem(s) > >> Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. > >> Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. > >> Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. > >> Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 returne= d. > >> > > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee75c987f04da23d3af Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Eric and all,
Thank you for your hel= p and you can get the xfs meta dump file from the following link:
https://docs.google.com/file/d/0B7n2C4T5tfNCdFBCTnNxNERmbWc/edi= t?usp=3Dsharing

I dump it after a mount/unmount procedure.



2013/4/12 Eric Sandeen= <sandeen@sandeen.net>
On 4/11/13 6:26 PM, Brian = Foster wrote:
> On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote:
>> It happens tonight again on one of our servers, how to debug the r= oot
>> cause? Thank you.
>>
>
> Hi,
>
> I've attached a system tap script (stap -v xfs.stp) that should > hopefully print out a bit more data should the issue happen again. Do<= br> > you have a small enough number of nodes (or predictable enough pattern= )
> that you could run this on the nodes that tend to fail and collect the=
> output?
>
> Also, could you collect an xfs_metadump of the filesystem in question<= br> > and make it available for download and analysis somewhere? I believe t= he
> ideal approach is to mount/umount the filesystem first to replay the l= og
> before collecting a metadump, but somebody could correct me on that (t= o
> be safe, you could collect multiple dumps: pre-mount and post-mount).<= br>
Dave suggested yesterday that this would be best: metadump right
after unmounting post-failure, then mount/umount & generate another met= adump.

-Eric

> Could you also describe your workload a little bit? Thanks.
>
> Brian
>
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove:
>> xfs_inotobp() returned error 22.
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree re= turned
>> error 22
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1)=
>> called from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return = address =3D
>> 0xffffffffa02ee20a
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutti= ng
>> down filesystem
>> Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the filesyst= em and
>> rectify the problem(s)
>> Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 ret= urned.
>> Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 ret= urned.
>> Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 ret= urned.
>> Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 ret= urned.
>>




--
=B7=FB=D3= =C0=CC=CE
--14dae9340ee75c987f04da23d3af-- From jeff.liu@oracle.com Fri Apr 12 01:51:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3AA007F3F for ; Fri, 12 Apr 2013 01:51:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C3957AC002 for ; Thu, 11 Apr 2013 23:51:19 -0700 (PDT) X-ASG-Debug-ID: 1365749478-04bdf02d1cd2bb0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id FouS85lcONKnEKqs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 11 Apr 2013 23:51:18 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r3C6pGNw004534 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 12 Apr 2013 06:51:16 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3C6pFIp023323 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Fri, 12 Apr 2013 06:51:16 GMT Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3C6pFDr014631; Fri, 12 Apr 2013 06:51:15 GMT Received: from [192.168.1.102] (/221.223.105.164) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 11 Apr 2013 23:51:15 -0700 Message-ID: <5167AEDD.2050708@oracle.com> Date: Fri, 12 Apr 2013 14:51:09 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: "Michael L. Semon" CC: xfs@oss.sgi.com Subject: Re: New xfstests generic/308 causes XFS hang (high CPU use), at least on 32-bit References: <51656D47.9010806@gmail.com> X-ASG-Orig-Subj: Re: New xfstests generic/308 causes XFS hang (high CPU use), at least on 32-bit In-Reply-To: <51656D47.9010806@gmail.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1365749478 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127881 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 Hi Michael, On 04/10/2013 09:46 PM, Michael L. Semon wrote: > Hi! On my 32-bit Pentium III PC, xfstests generic/308 uses xfs_io, and > that xfs_io hangs the XFS file system without causing a crash. In other > words, the FS cannot be umounted, xfs_io can't be killed, and shutdown > is handled by magic SysRq keys. In this time, there is about 90% CPU > usage from xfs_io (top) but zero disk I/O (iostat). > > The PC uses kernel 3.8-rc4 + Dave's CRC v4 patches + J. Liu's bitness patch. I think this is a bug for x86 only and it is irrelevant to above patches(You have also mentioned in another email). AFAICS, it is caused by the 2nd test case in 308, i.e. # Write to the block after the extent just created offset=$(((2**32 - 1) * $block_size)) $XFS_IO_PROG -f -c "pwrite $offset $block_size" -c fsync $testfile >>$seqres.full 2>&1 Run xfs_io with the given huge offset is enough to reproduce this issue(don't need to specify the 'fsync' option), it will hang at page write back stage soon. As we performs buffered io writes, the code execute path should go through: xfs_buffered_aio_write xfs_file_aio_write_checks generic_write_checks In this case, the given offset is larger than s_maxbytes on 32-bit machine. I think we should not be allowed to create this file at all according to the following check up at generic_write_checks(): if (likely(!isblk)) { if (unlikely(*pos >= inode->i_sb->s_maxbytes)) { if (*count || *pos > inode->i_sb->s_maxbytes) { return -EFBIG; } /* zero-length writes at ->s_maxbytes are OK */ } However, at xfs_max_file_offset(), we figure out s_maxbytes to (__uint64_t) range, it violated the MAX_LFS_FILESIZE limits, so the file can be created but will failed at page write back phase after a little while, just like the comments for MAX_LFS_FILESIZE: /* Page cache limit. The filesystems should put that into their s_maxbytes limits, otherwise bad things can happen in VM. */ #if BITS_PER_LONG==32 #define MAX_LFS_FILESIZE (((loff_t)PAGE_CACHE_SIZE << (BITS_PER_LONG-1))-1) I'll try to fix it later. Thanks, -Jeff From david@fromorbit.com Fri Apr 12 02:40:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 51AC57F3F for ; Fri, 12 Apr 2013 02:40:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3CF4D30404E for ; Fri, 12 Apr 2013 00:40:40 -0700 (PDT) X-ASG-Debug-ID: 1365752435-04cbb057f8d79a0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id kGBo7s8g6nHKBrKi for ; Fri, 12 Apr 2013 00:40:36 -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: AmYVABm5Z1F5LLHC/2dsb2JhbABQgwaCe7l5hRgEAYEJF3SCHwEBBTocIxAIAxgJJQ8FJQMhE4gTvU0VjWSBHQeCYGEDlwGREIMdKg Received: from ppp121-44-177-194.lns20.syd7.internode.on.net (HELO dastard) ([121.44.177.194]) by ipmail07.adl2.internode.on.net with ESMTP; 12 Apr 2013 17:10:35 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQYb4-00005v-7g; Fri, 12 Apr 2013 17:40:34 +1000 Date: Fri, 12 Apr 2013 17:40:34 +1000 From: Dave Chinner To: Wang Sheng-Hui Cc: Dave Chinner , Rich Johnston , xfstests Subject: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs Message-ID: <20130412074034.GC30622@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs References: <51678D0D.1070002@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <51678D0D.1070002@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1365752435 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127883 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 12, 2013 at 12:26:53PM +0800, Wang Sheng-Hui wrote: > +# > + > +TOPDIR = .. > +include $(TOPDIR)/include/builddefs > + > +TESTS_SUBDIRS = $(shell find . -maxdepth 1 -type d | sed -n -e 's/\.\///gp') This is much neater: TESTS_SUBDIRS = $(sort $(dir $(wildcard $(PWD)/*/))) -Dave. -- Dave Chinner david@fromorbit.com From yongtaofu@gmail.com Fri Apr 12 02:44:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5A6247F3F for ; Fri, 12 Apr 2013 02:44:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 05AC4AC003 for ; Fri, 12 Apr 2013 00:44:26 -0700 (PDT) X-ASG-Debug-ID: 1365752665-04bdf02d1dd65b0001-NocioJ Received: from mail-ia0-f173.google.com (mail-ia0-f173.google.com [209.85.210.173]) by cuda.sgi.com with ESMTP id nvhKgXWtfAjMvJnF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 00:44:25 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.173 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] Received: by mail-ia0-f173.google.com with SMTP id j5so1625729iaf.4 for ; Fri, 12 Apr 2013 00:44:25 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=8N4n6JKHRyHJKBQBwf3lsNSsvJqgqUme0qZIyR30HKE=; b=jZvsmkVqjtVpqDAKwD7Z+uxcgJxuSzfkdEf+CvcFVxH+K04lpF1Z5bdhthBv7LfSYb uPr14wuLCXHdrD8SeFVkEBeAjeKQ+n4N3v/Cm3ic5yCiiQnvbaw9C21TIAdbyfw4fKuT 1VoUGxiF83XGDiID/6R4b7q0/myyS0dPFOs1pWkv81ALCOsGLBitDMNGyjSq8UfModfi +zCHzt9U2vNFiPMfSIgMAHBB21AIy7Rg7RBdKL750KN2iOm+NE9kjD8zCULBHTPYFeib Sn7NSsgPYBjRiIiUpKdtse7EgZCxgzY2ViFlC/WMAsjOaTK9jlz+ApBzfrleZC7scOzB AA0Q== MIME-Version: 1.0 X-Received: by 10.42.155.136 with SMTP id u8mr5894170icw.26.1365752665420; Fri, 12 Apr 2013 00:44:25 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Fri, 12 Apr 2013 00:44:25 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> Date: Fri, 12 Apr 2013 15:44:25 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: Brian Foster , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=90e6ba6e817a793ecf04da251244 X-Barracuda-Connect: mail-ia0-f173.google.com[209.85.210.173] X-Barracuda-Start-Time: 1365752665 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127883 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 --90e6ba6e817a793ecf04da251244 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brian, What else I'm missing? Thank you. stap -e 'probe module("xfs").function("xfs_iunlink"){}' WARNING: cannot find module xfs debuginfo: No DWARF information found semantic error: no match while resolving probe point module("xfs").function("xfs_iunlink") Pass 2: analysis failed. Try again with another '--vp 01' option. 2013/4/12 =B7=FB=D3=C0=CC=CE > ls -l > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.deb= ug > -r--r--r-- 1 root root 21393024 Apr 12 12:08 > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.deb= ug > > rpm -qa|grep kernel > kernel-headers-2.6.32-279.el6.x86_64 > kernel-devel-2.6.32-279.el6.x86_64 > kernel-2.6.32-358.el6.x86_64 > kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 > abrt-addon-kerneloops-2.0.8-6.el6.x86_64 > kernel-firmware-2.6.32-358.el6.noarch > kernel-debug-2.6.32-358.el6.x86_64 > kernel-debuginfo-2.6.32-279.el6.x86_64 > dracut-kernel-004-283.el6.noarch > libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 > kernel-devel-2.6.32-358.el6.x86_64 > kernel-2.6.32-279.el6.x86_64 > > rpm -q kernel-debuginfo > kernel-debuginfo-2.6.32-279.el6.x86_64 > > rpm -q kernel > kernel-2.6.32-279.el6.x86_64 > kernel-2.6.32-358.el6.x86_64 > > do I need to re probe it? > > > 2013/4/12 Eric Sandeen > >> On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote: >> > Hi Brian, >> > Sorry but when I execute the script it says: >> > WARNING: cannot find module xfs debuginfo: No DWARF information found >> > semantic error: no match while resolving probe point >> module("xfs").function("xfs_iunlink") >> > >> > uname -a >> > 2.6.32-279.el6.x86_64 >> > kernel debuginfo has been installed. >> > >> > Where can I find the correct xfs debuginfo? >> >> it should be in the kernel-debuginfo rpm (of the same version/release as >> the kernel rpm you're running) >> >> You should have: >> >> >> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.de= bug >> >> If not, can you show: >> >> # uname -a >> # rpm -q kernel >> # rpm -q kernel-debuginfo >> >> -Eric >> >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --90e6ba6e817a793ecf04da251244 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brian,
What else I'm missing? Thank you.<= /div>
stap -e 'pr= obe module("xfs").function("xfs_iunlink"){}'

WARNING: cannot find module xfs debuginfo: No DWARF information foundsemantic error: no match while resolving probe point module("xfs&quo= t;).function("xfs_iunlink")
Pass 2: analysis failed.  Try again wi= th another '--vp 01' option.


2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
ls -l /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_6= 4/kernel/fs/xfs/xfs.ko.debug
-r--r--r-- 1 root root 21393024 Apr 12 12:0= 8 /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.deb= ug

rpm -qa|grep  kernel
kernel-headers-2.6.32-279.el6.x86_64
ke= rnel-devel-2.6.32-279.el6.x86_64
kernel-2.6.32-358.el6.x86_64
kernel-= debuginfo-common-x86_64-2.6.32-279.el6.x86_64
abrt-addon-kerneloops-2.0.= 8-6.el6.x86_64
kernel-firmware-2.6.32-358.el6.noarch
kernel-debug-2.6.32-358.el6.x86_64=
kernel-debuginfo-2.6.32-279.el6.x86_64
dracut-kernel-004-283.el6.noa= rch
libreport-plugin-kerneloops-2.0.9-5.el6.x86_64
kernel-devel-2.6.3= 2-358.el6.x86_64
kernel-2.6.32-279.el6.x86_64

rpm -q kernel-debuginfo
kernel-debug= info-2.6.32-279.el6.x86_64

rpm -q kernel
kernel-2.6.32-279.el6.x8= 6_64
kernel-2.6.32-358.el6.x86_64

do I need to re probe it?=


2013/4/12 Eric Sandeen <sandeen@sandeen.net>
On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote:
> Hi Brian,
> Sorry but when I execute the script it says:
> WARNING: cannot find module xfs debuginfo: No DWARF information found<= br> > semantic error: no match while resolving probe point module("xfs&= quot;).function("xfs_iunlink")
>
> uname -a
> 2.6.32-279.el6.x86_64
> kernel debuginfo has been installed.
>
> Where can I find the correct xfs debuginfo?

it should be in the kernel-debuginfo rpm (of the same version/release= as the kernel rpm you're running)

You should have:

/usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug=

If not, can you show:

# uname -a
# rpm -q kernel
# rpm -q kernel-debuginfo

-Eric





--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0= =CC=CE
--90e6ba6e817a793ecf04da251244-- From david@fromorbit.com Fri Apr 12 02:57:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7DA4229DFA for ; Fri, 12 Apr 2013 02:57:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 549DB30404E for ; Fri, 12 Apr 2013 00:57:32 -0700 (PDT) X-ASG-Debug-ID: 1365753450-04cb6c2c1cd9360001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id U84KxNQ85aGbnnfV for ; Fri, 12 Apr 2013 00:57:30 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmcVALm9Z1F5LLHC/2dsb2JhbABQgwaCe7l5hRgEAYEJF3SCHwEBBAE6HCMFCwgDGAklDwUlAyETiA4FvVAVjWSBHQeCYGEDlwGJd4cZgx0q Received: from ppp121-44-177-194.lns20.syd7.internode.on.net (HELO dastard) ([121.44.177.194]) by ipmail07.adl2.internode.on.net with ESMTP; 12 Apr 2013 17:27:29 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQYrQ-00007h-U9; Fri, 12 Apr 2013 17:57:28 +1000 Date: Fri, 12 Apr 2013 17:57:28 +1000 From: Dave Chinner To: Wang Sheng-Hui Cc: Rich Johnston , Dave Chinner , xfstests Subject: Re: [PATCH] xfstests: fix the regex pattern in get_group_list of check Message-ID: <20130412075728.GD30622@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix the regex pattern in get_group_list of check References: <5167A5D3.4070903@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5167A5D3.4070903@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1365753450 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127885 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 12, 2013 at 02:12:35PM +0800, Wang Sheng-Hui wrote: > In group files, non comment line starts with a 3-digits, then followed by > space and other characters, but no group names. I don't follow. A group file line looks like: 003 db auto quick Which defines the test name, followed by the group names the test belongs to. > The old regex in get_group_list uses the group name as part of the regex, > and fails './check -g xfs' run: > Group "xfs" is empty or not defined? Well, yes, "xfs" is not a defined group name: $ grep xfs tests/*/group $ If I define a "xfs" group by assigning tests to it, check runs just fine. $ grep xfs tests/*/group tests/xfs/group:003 db auto quick xfs $ sudo ./check -g xfs FSTYP -- xfs (debug) PLATFORM -- Linux/x86_64 test-2 3.9.0-rc4-dgc+ MKFS_OPTIONS -- -f -bsize=4096 /dev/vdb MOUNT_OPTIONS -- /dev/vdb /mnt/scratch xfs/003 1s Ran: xfs/003 Passed all 1 tests $ So what check is doing looks perfectly OK to me and doesn't need changing. > The patch removes the pattern for group name, and thus we can trigger tests > like "./check -g xfs" as normal. If you want to run all the tests in a specific subdirectory regardless of groups, then you can do it like: $ sudo ./check xfs/[0-9][0-9][0-9] FSTYP -- xfs (debug) PLATFORM -- Linux/x86_64 test-2 3.9.0-rc4-dgc+ MKFS_OPTIONS -- -f -bsize=4096 /dev/vdb MOUNT_OPTIONS -- /dev/vdb /mnt/scratch xfs/003 0s xfs/004 0s xfs/008 1s ..... There's definitely better ways to do this, but conflating source tree layout with runtime test group definitions is not it. ;) Perhaps something like "check xfs" will just run all tests in the xfs test dir, similar for ext4, shared, etc? Cheers, Dave. -- Dave Chinner david@fromorbit.com From yongtaofu@gmail.com Fri Apr 12 03:33:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 20AD329DFA for ; Fri, 12 Apr 2013 03:33:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 95C65AC002 for ; Fri, 12 Apr 2013 01:33:01 -0700 (PDT) X-ASG-Debug-ID: 1365755579-04cb6c2c1cdb620001-NocioJ Received: from mail-ia0-f172.google.com (mail-ia0-f172.google.com [209.85.210.172]) by cuda.sgi.com with ESMTP id Z2RlMPDfHHU2UstK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 01:33:00 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.172] Received: by mail-ia0-f172.google.com with SMTP id k38so2148335iah.17 for ; Fri, 12 Apr 2013 01:32:59 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=kfrnFw0ATHClElYGjkI0w50D+knUsFmBx9lQ3YlVak0=; b=I70FhVA2Sz60cfzJTQ6p0V64z309NVioxo9nQPqlDNZ0RUrfXDt5cqa+hJ7xgSwjo5 wWGHFQL328Cfu/GPMlJ4CEIBL2wr+B9g5vc+vSjBzsoKPJWU5rKDeI8d5lIb143jautO /x6cAcboVYaNE33RCIZqOH+jgi+ky4S7T51C9VkGuFxy/+O+Na4C6yDqm8Y4r+OOoYWH wA+pMidArLLhS/5zIQcn6VqlKJHJRBP7m12u8AzuVTlBANNnGsQ8b75eyPfeq+QEXEWx ThXeNJqYjp3bXR4XV3t6aUA6FRy4r2nI61K7KRD50DOFHSIP7Jj8riIDuOojpL4dzpKu jTdw== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr1108019igx.11.1365755579684; Fri, 12 Apr 2013 01:32:59 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Fri, 12 Apr 2013 01:32:59 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> Date: Fri, 12 Apr 2013 16:32:59 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: Brian Foster , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e0111e0742d6be404da25c056 X-Barracuda-Connect: mail-ia0-f172.google.com[209.85.210.172] X-Barracuda-Start-Time: 1365755580 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127887 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 --089e0111e0742d6be404da25c056 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Dear xfs experts, Can I just call xfs_stack_trace(); in the second line of xfs_do_force_shutdown() to print stack and rebuild kernel to check what's the error? 2013/4/12 =B7=FB=D3=C0=CC=CE > Hi Brian, > What else I'm missing? Thank you. > stap -e 'probe module("xfs").function("xfs_iunlink"){}' > > WARNING: cannot find module xfs debuginfo: No DWARF information found > semantic error: no match while resolving probe point > module("xfs").function("xfs_iunlink") > Pass 2: analysis failed. Try again with another '--vp 01' option. > > > 2013/4/12 =B7=FB=D3=C0=CC=CE > >> ls -l >> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.de= bug >> -r--r--r-- 1 root root 21393024 Apr 12 12:08 >> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.de= bug >> >> rpm -qa|grep kernel >> kernel-headers-2.6.32-279.el6.x86_64 >> kernel-devel-2.6.32-279.el6.x86_64 >> kernel-2.6.32-358.el6.x86_64 >> kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 >> abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >> kernel-firmware-2.6.32-358.el6.noarch >> kernel-debug-2.6.32-358.el6.x86_64 >> kernel-debuginfo-2.6.32-279.el6.x86_64 >> dracut-kernel-004-283.el6.noarch >> libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 >> kernel-devel-2.6.32-358.el6.x86_64 >> kernel-2.6.32-279.el6.x86_64 >> >> rpm -q kernel-debuginfo >> kernel-debuginfo-2.6.32-279.el6.x86_64 >> >> rpm -q kernel >> kernel-2.6.32-279.el6.x86_64 >> kernel-2.6.32-358.el6.x86_64 >> >> do I need to re probe it? >> >> >> 2013/4/12 Eric Sandeen >> >>> On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote: >>> > Hi Brian, >>> > Sorry but when I execute the script it says: >>> > WARNING: cannot find module xfs debuginfo: No DWARF information found >>> > semantic error: no match while resolving probe point >>> module("xfs").function("xfs_iunlink") >>> > >>> > uname -a >>> > 2.6.32-279.el6.x86_64 >>> > kernel debuginfo has been installed. >>> > >>> > Where can I find the correct xfs debuginfo? >>> >>> it should be in the kernel-debuginfo rpm (of the same version/release a= s >>> the kernel rpm you're running) >>> >>> You should have: >>> >>> >>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.d= ebug >>> >>> If not, can you show: >>> >>> # uname -a >>> # rpm -q kernel >>> # rpm -q kernel-debuginfo >>> >>> -Eric >>> >>> >>> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --089e0111e0742d6be404da25c056 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Dear xfs experts,
Can I just call xfs_stack_= trace(); in the second line of xfs_do_force_shutdown() to print stack and r= ebuild kernel to check what's the error?


2013/4/12 =B7=FB=D3=C0=CC=CE <yongt= aofu@gmail.com>
Hi Brian,
What else I'm missing? Thank you.
<= div> stap -e 'pr= obe module("xfs").function("xfs_iunlink"){}'

WARNING: cannot find module xfs debuginfo: No DWARF information foundsemantic error: no match while resolving probe point module("xfs&quo= t;).function("xfs_iunlink")
Pass 2: analysis fa= iled.  Try again with another '--vp 01' option.


2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
ls -l /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_6= 4/kernel/fs/xfs/xfs.ko.debug
-r--r--r-- 1 root root 21393024 Apr 12 12:0= 8 /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.deb= ug

rpm -qa|grep  kernel
kernel-headers-2.6.32-279.el6.x86_64
ke= rnel-devel-2.6.32-279.el6.x86_64
kernel-2.6.32-358.el6.x86_64
kernel-= debuginfo-common-x86_64-2.6.32-279.el6.x86_64
abrt-addon-kerneloops-2.0.= 8-6.el6.x86_64
kernel-firmware-2.6.32-358.el6.noarch
kernel-debug-2.6.32-358.el6.x86_64=
kernel-debuginfo-2.6.32-279.el6.x86_64
dracut-kernel-004-283.el6.noa= rch
libreport-plugin-kerneloops-2.0.9-5.el6.x86_64
kernel-devel-2.6.3= 2-358.el6.x86_64
kernel-2.6.32-279.el6.x86_64

rpm -q kernel-debuginfo
kernel-debug= info-2.6.32-279.el6.x86_64

rpm -q kernel
kernel-2.6.32-279.el6.x8= 6_64
kernel-2.6.32-358.el6.x86_64

do I need to re probe it?=


2013/4/12 Eric Sandeen <sandeen@sandeen.net>
On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote:
> Hi Brian,
> Sorry but when I execute the script it says:
> WARNING: cannot find module xfs debuginfo: No DWARF information found<= br> > semantic error: no match while resolving probe point module("xfs&= quot;).function("xfs_iunlink")
>
> uname -a
> 2.6.32-279.el6.x86_64
> kernel debuginfo has been installed.
>
> Where can I find the correct xfs debuginfo?

it should be in the kernel-debuginfo rpm (of the same version/release= as the kernel rpm you're running)

You should have:

/usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug=

If not, can you show:

# uname -a
# rpm -q kernel
# rpm -q kernel-debuginfo

-Eric





--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE --089e0111e0742d6be404da25c056-- From jeff.liu@oracle.com Fri Apr 12 05:26:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B911D29DFA for ; Fri, 12 Apr 2013 05:26:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8DE91304043 for ; Fri, 12 Apr 2013 03:26:55 -0700 (PDT) X-ASG-Debug-ID: 1365762411-04cb6c2c1fe2ed0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Qkkq3OT9G6UbRRJA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 12 Apr 2013 03:26:51 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r3CAQl4Q007263 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 12 Apr 2013 10:26:48 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3CAQkTx013090 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Fri, 12 Apr 2013 10:26:47 GMT Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3CAQk8I023609; Fri, 12 Apr 2013 10:26:46 GMT Received: from [192.168.1.102] (/221.223.105.164) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 12 Apr 2013 03:26:46 -0700 Message-ID: <5167E160.3020800@oracle.com> Date: Fri, 12 Apr 2013 18:26:40 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: "xfs@oss.sgi.com" CC: "Michael L. Semon" Subject: [PATCH] xfs: fix s_max_bytes to MAX_LFS_FILESIZE if needed Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: fix s_max_bytes to MAX_LFS_FILESIZE if needed Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1365762411 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email From: Jie Liu On 32-bit machine, the s_maxbytes is larger than the MAX_LFS_FILESIZE limits if CONFIG_LBDAF is not enabled. Hence it's possible to create a huge file via buffered-IO write with a given offset beyond this limitation. e.g. # block_size=4096 # offset=$(((2**32 - 1) * $block_size)) # xfs_io -f -c "pwrite $offset $block_size" /storage/test_file In this case, xfs_io will hang at the page writeback stage soon since the given offset would cause an overflow at xfs_vm_writepage(): end_index = offset >> PAGE_CACHE_SHIFT; last_index = (offset - 1) >> PAGE_CACHE_SHIFT; if (page->index >= end_index) { unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); /* * Just skip the page if it is fully outside i_size, e.g. due * to a truncate operation that is in progress. */ if (page->index >= end_index + 1 || offset_into_page == 0) { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unlock_page(page); return 0; } end_index is unsigned long so that the max value is '2^32-1 = 4294967295', and it would be evaluated to the max value with the given offset(when writing the page offset up to s_max_bytes) for above test case. As a result, (page->index >= end_index + 1) is ok as (end_index + 1) is overflowed to ZERO. Actually, create a file as above on 32-bit machine should be failed with EFBIG error returned because there has strict check up at generic_write_checks() against the given offset with a *correct* s_max_bytes. This patch fix the s_max_bytes to MAX_LFS_FILESIZE if the pre-calculated value is greater than it. Reported-by: Michael L. Semon Signed-off-by: Jie Liu --- fs/xfs/xfs_super.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index ea341ce..0644d61 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -585,6 +585,7 @@ xfs_max_file_offset( { unsigned int pagefactor = 1; unsigned int bitshift = BITS_PER_LONG - 1; + __uint64_t offset; /* Figure out maximum filesize, on Linux this can depend on * the filesystem blocksize (on 32 bit platforms). @@ -610,7 +611,10 @@ xfs_max_file_offset( # endif #endif - return (((__uint64_t)pagefactor) << bitshift) - 1; + offset = (((__uint64_t)pagefactor) << bitshift) - 1; + + /* Check against VM & VFS exposed limits */ + return (offset > MAX_LFS_FILESIZE) ? MAX_LFS_FILESIZE : offset; } xfs_agnumber_t -- 1.7.9.5 From svavar@fiton.is Fri Apr 12 05:38:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DED7E29DFA for ; Fri, 12 Apr 2013 05:38:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CC2078F8040 for ; Fri, 12 Apr 2013 03:38:52 -0700 (PDT) X-ASG-Debug-ID: 1365763130-04cb6c2c1ce3ba0001-w1Z2WR Received: from atlas.fiton.is (atlas.fiton.is [62.145.135.105]) by cuda.sgi.com with ESMTP id KUdiW5qKiL1Drawm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 12 Apr 2013 03:38:51 -0700 (PDT) X-Barracuda-Envelope-From: svavar@fiton.is X-Barracuda-Apparent-Source-IP: 62.145.135.105 X-Footer: Zml0b24uaXM= Received: from localhost ([127.0.0.1]) by atlas.fiton.is for linux-xfs@oss.sgi.com; Fri, 12 Apr 2013 10:38:49 +0000 From: =?iso-8859-1?Q?Svavar_=D6rn_Eysteinsson?= Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Subject: xfsaild causing load, and stuck in D state - Centos 6.4 x64 Date: Fri, 12 Apr 2013 10:38:49 +0000 X-ASG-Orig-Subj: xfsaild causing load, and stuck in D state - Centos 6.4 x64 Message-Id: To: linux-xfs@oss.sgi.com Mime-Version: 1.0 (Apple Message framework v1283) X-Mailer: Apple Mail (2.1283) X-Barracuda-Connect: atlas.fiton.is[62.145.135.105] X-Barracuda-Start-Time: 1365763130 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- PowerEdge 2850 with PERC SCSI RAID controller. 16GB RAM Dual Intel(R) Xeon(TM) CPU 3.00GHz Using megaraid driver and xfs on 3x 300GB SCSI disks as /dev/sdb (total = 572GB) (RAID-5) Stock Centos 6.4 x64, everything updated. Kernel : 2.6.32-358.2.1.el6.x86_64 #1 SMP My Load always shows : top - 10:30:21 up 23:09, 1 users, load average: 0.99, 0.96, 0.79 yet there is no services what-so-ever doing anything. Using PowerTOP I can see that xfsaild is causing second most wake-ups = (after kernel core : hrtimer_start (tick_sched_timer) ) < Detailed C-state information is not P-states (frequencies) 3.00 Ghz 100.0% 1500 Mhz 0.0% 1125 Mhz 0.0% 750 Mhz 0.0% 375 Mhz 0.0% Wakeups-from-idle per second : 125.1 interval: 10.0s no ACPI power usage estimate available Top causes for wake-ups: 47.7% (119.6) : hrtimer_start (tick_sched_timer)=20 39.9% (100.0) xfsaild/sdb1 : xfsaild (process_timeout) Again, using TOP I can see that xfsaild is stuck in D state. It never = changes. 10050 root 20 0 0 0 0 D 0.0 0.0 0:01.17 = xfsaild/sdb1 My only way to fix this, is either rebooting the machine, unmounting the = volume and mounting it back online. I've been rsyncing data twice between this = server and another one. The rsync process takes about 30m-1hour. After the rsync operation = I see that the xfsaild is stuck in D State and my Load is near 1.00. I'v had no problem what-so-ever on centos 6.3 or early versions on other = servers. Any thoughts ? Information, help would be much appreciated. Thanks in advance. Best regards, Svavar= From bfoster@redhat.com Fri Apr 12 07:14:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6B8027F3F for ; Fri, 12 Apr 2013 07:14:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4AD278F8040 for ; Fri, 12 Apr 2013 05:14:22 -0700 (PDT) X-ASG-Debug-ID: 1365768861-04cb6c2c1eebbb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MCO6auMTxYh1SPtI for ; Fri, 12 Apr 2013 05:14: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3CCEJWb022279 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 12 Apr 2013 08:14:19 -0400 Received: from laptop.bfoster (vpn-57-177.rdu2.redhat.com [10.10.57.177]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3CCEHXb026806 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 12 Apr 2013 08:14:17 -0400 Message-ID: <5167F9FF.40800@redhat.com> Date: Fri, 12 Apr 2013 08:11:43 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Eric Sandeen , Ben Myers , "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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: 1365768861 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/12/2013 02:00 AM, 符永涛 wrote: > stap -e 'probe module("xfs").function("xfs_iunlink"){}' > WARNING: cannot find module xfs debuginfo: No DWARF information found > semantic error: no match while resolving probe point > module("xfs").function("xfs_iunlink") > Pass 2: analysis failed. Try again with another '--vp 01' option. > This is the error I get if I remove kernel-debuginfo-2.6.32-279.el6.x86_64.rpm. Otherwise, the example xfs_iunlink() probe works for me. The xfs.ko.debug module installed to my system matches the path you've listed below, as well. I suppose it couldn't hurt to try and remove/reinstall that module. Do you get any output from 'objdump --dwarf .../xfs.ko.debug?' I also notice that you have a newer kernel installed on this system. Are you sure you're still running the -279 build? I'm not an stap expert, but it would be nice to find out where it's looking for debug info at runtime... Brian P.S., The commands you've listed in another mail: sudo stap -L 'kernel.trace("*")'|grep xfs_iunlink sudo stap -L 'kernel.trace("*")'|grep xfs_ifree ... don't print anything on my box either, but as mentioned, the xfs_iunlink() probe works. I suspect these are not relevant. Perhaps you are listing tracepoints here? The following command prints the probe point info on my box: stap -L 'module("xfs").function("xfs_iunlink")' > > 2013/4/12 符永涛 > > > ls -l > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug > -r--r--r-- 1 root root 21393024 Apr 12 12:08 > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug > > rpm -qa|grep kernel > kernel-headers-2.6.32-279.el6.x86_64 > kernel-devel-2.6.32-279.el6.x86_64 > kernel-2.6.32-358.el6.x86_64 > kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 > abrt-addon-kerneloops-2.0.8-6.el6.x86_64 > kernel-firmware-2.6.32-358.el6.noarch > kernel-debug-2.6.32-358.el6.x86_64 > kernel-debuginfo-2.6.32-279.el6.x86_64 > dracut-kernel-004-283.el6.noarch > libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 > kernel-devel-2.6.32-358.el6.x86_64 > kernel-2.6.32-279.el6.x86_64 > > rpm -q kernel-debuginfo > kernel-debuginfo-2.6.32-279.el6.x86_64 > > rpm -q kernel > kernel-2.6.32-279.el6.x86_64 > kernel-2.6.32-358.el6.x86_64 > > do I need to re probe it? > > > 2013/4/12 Eric Sandeen > > > On 4/11/13 11:32 PM, 符永涛 wrote: > > Hi Brian, > > Sorry but when I execute the script it says: > > WARNING: cannot find module xfs debuginfo: No DWARF > information found > > semantic error: no match while resolving probe point > module("xfs").function("xfs_iunlink") > > > > uname -a > > 2.6.32-279.el6.x86_64 > > kernel debuginfo has been installed. > > > > Where can I find the correct xfs debuginfo? > > it should be in the kernel-debuginfo rpm (of the same > version/release as the kernel rpm you're running) > > You should have: > > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug > > If not, can you show: > > # uname -a > # rpm -q kernel > # rpm -q kernel-debuginfo > > -Eric > > > > > > -- > 符永涛 > > > > > -- > 符永涛 From bfoster@redhat.com Fri Apr 12 07:44:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4115029DFA for ; Fri, 12 Apr 2013 07:44:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C0DC1AC002 for ; Fri, 12 Apr 2013 05:44:04 -0700 (PDT) X-ASG-Debug-ID: 1365770643-04cb6c2c1def090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8oBgFvJlNOtUF52P for ; Fri, 12 Apr 2013 05:44: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3CCi2fE031546 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 12 Apr 2013 08:44:02 -0400 Received: from laptop.bfoster (vpn-57-177.rdu2.redhat.com [10.10.57.177]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3CCi08L002387 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 12 Apr 2013 08:44:01 -0400 Message-ID: <516800F7.80502@redhat.com> Date: Fri, 12 Apr 2013 08:41:27 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Eric Sandeen , Ben Myers , "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1365770643 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/12/2013 04:32 AM, 符永涛 wrote: > Dear xfs experts, > Can I just call xfs_stack_trace(); in the second line of > xfs_do_force_shutdown() to print stack and rebuild kernel to check > what's the error? > I suppose that's a start. If you're willing/able to create and run a modified kernel for the purpose of collecting more debug info, perhaps we can get a bit more creative in collecting more data on the problem (but a stack trace there is a good start). BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp) check almost halfway into the function to avoid duplicate messages. Brian > > 2013/4/12 符永涛 > > > Hi Brian, > What else I'm missing? Thank you. > stap -e 'probe module("xfs").function("xfs_iunlink"){}' > > WARNING: cannot find module xfs debuginfo: No DWARF information found > semantic error: no match while resolving probe point > module("xfs").function("xfs_iunlink") > Pass 2: analysis failed. Try again with another '--vp 01' option. > > > 2013/4/12 符永涛 > > > ls -l > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug > -r--r--r-- 1 root root 21393024 Apr 12 12:08 > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug > > rpm -qa|grep kernel > kernel-headers-2.6.32-279.el6.x86_64 > kernel-devel-2.6.32-279.el6.x86_64 > kernel-2.6.32-358.el6.x86_64 > kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 > abrt-addon-kerneloops-2.0.8-6.el6.x86_64 > kernel-firmware-2.6.32-358.el6.noarch > kernel-debug-2.6.32-358.el6.x86_64 > kernel-debuginfo-2.6.32-279.el6.x86_64 > dracut-kernel-004-283.el6.noarch > libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 > kernel-devel-2.6.32-358.el6.x86_64 > kernel-2.6.32-279.el6.x86_64 > > rpm -q kernel-debuginfo > kernel-debuginfo-2.6.32-279.el6.x86_64 > > rpm -q kernel > kernel-2.6.32-279.el6.x86_64 > kernel-2.6.32-358.el6.x86_64 > > do I need to re probe it? > > > 2013/4/12 Eric Sandeen > > > On 4/11/13 11:32 PM, 符永涛 wrote: > > Hi Brian, > > Sorry but when I execute the script it says: > > WARNING: cannot find module xfs debuginfo: No DWARF > information found > > semantic error: no match while resolving probe point > module("xfs").function("xfs_iunlink") > > > > uname -a > > 2.6.32-279.el6.x86_64 > > kernel debuginfo has been installed. > > > > Where can I find the correct xfs debuginfo? > > it should be in the kernel-debuginfo rpm (of the same > version/release as the kernel rpm you're running) > > You should have: > > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug > > If not, can you show: > > # uname -a > # rpm -q kernel > # rpm -q kernel-debuginfo > > -Eric > > > > > > -- > 符永涛 > > > > > -- > 符永涛 > > > > > -- > 符永涛 > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From bfoster@redhat.com Fri Apr 12 07:53:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7B0C829DFA for ; Fri, 12 Apr 2013 07:53:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3AFBA8F8039 for ; Fri, 12 Apr 2013 05:53:17 -0700 (PDT) X-ASG-Debug-ID: 1365771195-04bdf02d1cefbb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2727bu7npEyrRMI0; Fri, 12 Apr 2013 05:53: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]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3CCrENH008763 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 12 Apr 2013 08:53:14 -0400 Received: from laptop.bfoster (vpn-57-177.rdu2.redhat.com [10.10.57.177]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3CCrD5G006479 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 12 Apr 2013 08:53:13 -0400 Message-ID: <51680320.7050400@redhat.com> Date: Fri, 12 Apr 2013 08:50:40 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Ben Myers , "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1365771195 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/11/2013 08:45 PM, 符永涛 wrote: > the workload is about: > 24 servers, replica(3) which means the distribute is 8 > load is about 3(TB)-8(TB) per day. > This describes your cluster, but not the workload (though cluster info is good too). What kind of workload is running on your clients (i.e., rsync jobs, etc.)? Are you running through native gluster mount points, NFS mounts or a mix? Do you have any gluster internal operations running (i.e., rebalance, etc.). Is there any kind of pattern you can discern from the workload and when the XFS error happens to occur? You have a good number of servers in play here, is there any kind of pattern in terms of which servers experience the error? Is it always the same servers or a random set? Brian > > 2013/4/12 Brian Foster > > > On 04/11/2013 03:11 PM, 符永涛 wrote: > > It happens tonight again on one of our servers, how to debug the root > > cause? Thank you. > > > > Hi, > > I've attached a system tap script (stap -v xfs.stp) that should > hopefully print out a bit more data should the issue happen again. Do > you have a small enough number of nodes (or predictable enough pattern) > that you could run this on the nodes that tend to fail and collect the > output? > > Also, could you collect an xfs_metadump of the filesystem in question > and make it available for download and analysis somewhere? I believe the > ideal approach is to mount/umount the filesystem first to replay the log > before collecting a metadump, but somebody could correct me on that (to > be safe, you could collect multiple dumps: pre-mount and post-mount). > > Could you also describe your workload a little bit? Thanks. > > Brian > > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > > xfs_inotobp() returned error 22. > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree > returned > > error 22 > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1) > > called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = > > 0xffffffffa02ee20a > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. Shutting > > down filesystem > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the > filesystem and > > rectify the problem(s) > > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > > > xfs_repair -n > > > > > > Phase 7 - verify link counts... > > would have reset inode 20021 nlinks from 0 to 1 > > would have reset inode 20789 nlinks from 0 to 1 > > would have reset inode 35125 nlinks from 0 to 1 > > would have reset inode 35637 nlinks from 0 to 1 > > would have reset inode 36149 nlinks from 0 to 1 > > would have reset inode 38197 nlinks from 0 to 1 > > would have reset inode 39477 nlinks from 0 to 1 > > would have reset inode 54069 nlinks from 0 to 1 > > would have reset inode 62261 nlinks from 0 to 1 > > would have reset inode 63029 nlinks from 0 to 1 > > would have reset inode 72501 nlinks from 0 to 1 > > would have reset inode 79925 nlinks from 0 to 1 > > would have reset inode 81205 nlinks from 0 to 1 > > would have reset inode 84789 nlinks from 0 to 1 > > would have reset inode 87861 nlinks from 0 to 1 > > would have reset inode 90663 nlinks from 0 to 1 > > would have reset inode 91189 nlinks from 0 to 1 > > would have reset inode 95541 nlinks from 0 to 1 > > would have reset inode 98101 nlinks from 0 to 1 > > would have reset inode 101173 nlinks from 0 to 1 > > would have reset inode 113205 nlinks from 0 to 1 > > would have reset inode 114741 nlinks from 0 to 1 > > would have reset inode 126261 nlinks from 0 to 1 > > would have reset inode 140597 nlinks from 0 to 1 > > would have reset inode 144693 nlinks from 0 to 1 > > would have reset inode 147765 nlinks from 0 to 1 > > would have reset inode 152885 nlinks from 0 to 1 > > would have reset inode 161333 nlinks from 0 to 1 > > would have reset inode 161845 nlinks from 0 to 1 > > would have reset inode 167477 nlinks from 0 to 1 > > would have reset inode 172341 nlinks from 0 to 1 > > would have reset inode 191797 nlinks from 0 to 1 > > would have reset inode 204853 nlinks from 0 to 1 > > would have reset inode 205365 nlinks from 0 to 1 > > would have reset inode 215349 nlinks from 0 to 1 > > would have reset inode 215861 nlinks from 0 to 1 > > would have reset inode 216373 nlinks from 0 to 1 > > would have reset inode 217397 nlinks from 0 to 1 > > would have reset inode 224309 nlinks from 0 to 1 > > would have reset inode 225589 nlinks from 0 to 1 > > would have reset inode 234549 nlinks from 0 to 1 > > would have reset inode 234805 nlinks from 0 to 1 > > would have reset inode 249653 nlinks from 0 to 1 > > would have reset inode 250677 nlinks from 0 to 1 > > would have reset inode 252469 nlinks from 0 to 1 > > would have reset inode 261429 nlinks from 0 to 1 > > would have reset inode 265013 nlinks from 0 to 1 > > would have reset inode 266805 nlinks from 0 to 1 > > would have reset inode 267317 nlinks from 0 to 1 > > would have reset inode 268853 nlinks from 0 to 1 > > would have reset inode 272437 nlinks from 0 to 1 > > would have reset inode 273205 nlinks from 0 to 1 > > would have reset inode 274229 nlinks from 0 to 1 > > would have reset inode 278325 nlinks from 0 to 1 > > would have reset inode 278837 nlinks from 0 to 1 > > would have reset inode 281397 nlinks from 0 to 1 > > would have reset inode 292661 nlinks from 0 to 1 > > would have reset inode 300853 nlinks from 0 to 1 > > would have reset inode 302901 nlinks from 0 to 1 > > would have reset inode 305205 nlinks from 0 to 1 > > would have reset inode 314165 nlinks from 0 to 1 > > would have reset inode 315189 nlinks from 0 to 1 > > would have reset inode 320309 nlinks from 0 to 1 > > would have reset inode 324917 nlinks from 0 to 1 > > would have reset inode 328245 nlinks from 0 to 1 > > would have reset inode 335925 nlinks from 0 to 1 > > would have reset inode 339253 nlinks from 0 to 1 > > would have reset inode 339765 nlinks from 0 to 1 > > would have reset inode 348213 nlinks from 0 to 1 > > would have reset inode 360501 nlinks from 0 to 1 > > would have reset inode 362037 nlinks from 0 to 1 > > would have reset inode 366389 nlinks from 0 to 1 > > would have reset inode 385845 nlinks from 0 to 1 > > would have reset inode 390709 nlinks from 0 to 1 > > would have reset inode 409141 nlinks from 0 to 1 > > would have reset inode 413237 nlinks from 0 to 1 > > would have reset inode 414773 nlinks from 0 to 1 > > would have reset inode 417845 nlinks from 0 to 1 > > would have reset inode 436021 nlinks from 0 to 1 > > would have reset inode 439349 nlinks from 0 to 1 > > would have reset inode 447029 nlinks from 0 to 1 > > would have reset inode 491317 nlinks from 0 to 1 > > would have reset inode 494133 nlinks from 0 to 1 > > would have reset inode 495413 nlinks from 0 to 1 > > would have reset inode 501301 nlinks from 0 to 1 > > would have reset inode 506421 nlinks from 0 to 1 > > would have reset inode 508469 nlinks from 0 to 1 > > would have reset inode 508981 nlinks from 0 to 1 > > would have reset inode 511797 nlinks from 0 to 1 > > would have reset inode 513077 nlinks from 0 to 1 > > would have reset inode 517941 nlinks from 0 to 1 > > would have reset inode 521013 nlinks from 0 to 1 > > would have reset inode 522805 nlinks from 0 to 1 > > would have reset inode 523317 nlinks from 0 to 1 > > would have reset inode 525621 nlinks from 0 to 1 > > would have reset inode 527925 nlinks from 0 to 1 > > would have reset inode 535605 nlinks from 0 to 1 > > would have reset inode 541749 nlinks from 0 to 1 > > would have reset inode 573493 nlinks from 0 to 1 > > would have reset inode 578613 nlinks from 0 to 1 > > would have reset inode 583029 nlinks from 0 to 1 > > would have reset inode 585525 nlinks from 0 to 1 > > would have reset inode 586293 nlinks from 0 to 1 > > would have reset inode 586805 nlinks from 0 to 1 > > would have reset inode 591413 nlinks from 0 to 1 > > would have reset inode 594485 nlinks from 0 to 1 > > would have reset inode 596277 nlinks from 0 to 1 > > would have reset inode 603189 nlinks from 0 to 1 > > would have reset inode 613429 nlinks from 0 to 1 > > would have reset inode 617781 nlinks from 0 to 1 > > would have reset inode 621877 nlinks from 0 to 1 > > would have reset inode 623925 nlinks from 0 to 1 > > would have reset inode 625205 nlinks from 0 to 1 > > would have reset inode 626741 nlinks from 0 to 1 > > would have reset inode 639541 nlinks from 0 to 1 > > would have reset inode 640053 nlinks from 0 to 1 > > would have reset inode 640565 nlinks from 0 to 1 > > would have reset inode 645173 nlinks from 0 to 1 > > would have reset inode 652853 nlinks from 0 to 1 > > would have reset inode 656181 nlinks from 0 to 1 > > would have reset inode 659253 nlinks from 0 to 1 > > would have reset inode 663605 nlinks from 0 to 1 > > would have reset inode 667445 nlinks from 0 to 1 > > would have reset inode 680757 nlinks from 0 to 1 > > would have reset inode 691253 nlinks from 0 to 1 > > would have reset inode 691765 nlinks from 0 to 1 > > would have reset inode 697653 nlinks from 0 to 1 > > would have reset inode 700469 nlinks from 0 to 1 > > would have reset inode 707893 nlinks from 0 to 1 > > would have reset inode 716853 nlinks from 0 to 1 > > would have reset inode 722229 nlinks from 0 to 1 > > would have reset inode 722741 nlinks from 0 to 1 > > would have reset inode 723765 nlinks from 0 to 1 > > would have reset inode 731957 nlinks from 0 to 1 > > would have reset inode 742965 nlinks from 0 to 1 > > would have reset inode 743477 nlinks from 0 to 1 > > would have reset inode 745781 nlinks from 0 to 1 > > would have reset inode 746293 nlinks from 0 to 1 > > would have reset inode 774453 nlinks from 0 to 1 > > would have reset inode 778805 nlinks from 0 to 1 > > would have reset inode 785013 nlinks from 0 to 1 > > would have reset inode 785973 nlinks from 0 to 1 > > would have reset inode 791349 nlinks from 0 to 1 > > would have reset inode 796981 nlinks from 0 to 1 > > would have reset inode 803381 nlinks from 0 to 1 > > would have reset inode 806965 nlinks from 0 to 1 > > would have reset inode 811798 nlinks from 0 to 1 > > would have reset inode 812310 nlinks from 0 to 1 > > would have reset inode 813078 nlinks from 0 to 1 > > would have reset inode 813607 nlinks from 0 to 1 > > would have reset inode 814183 nlinks from 0 to 1 > > would have reset inode 822069 nlinks from 0 to 1 > > would have reset inode 828469 nlinks from 0 to 1 > > would have reset inode 830005 nlinks from 0 to 1 > > would have reset inode 832053 nlinks from 0 to 1 > > would have reset inode 832565 nlinks from 0 to 1 > > would have reset inode 836661 nlinks from 0 to 1 > > would have reset inode 841013 nlinks from 0 to 1 > > would have reset inode 841525 nlinks from 0 to 1 > > would have reset inode 845365 nlinks from 0 to 1 > > would have reset inode 846133 nlinks from 0 to 1 > > would have reset inode 847157 nlinks from 0 to 1 > > would have reset inode 852533 nlinks from 0 to 1 > > would have reset inode 857141 nlinks from 0 to 1 > > would have reset inode 863271 nlinks from 0 to 1 > > would have reset inode 866855 nlinks from 0 to 1 > > would have reset inode 887861 nlinks from 0 to 1 > > would have reset inode 891701 nlinks from 0 to 1 > > would have reset inode 894773 nlinks from 0 to 1 > > would have reset inode 900149 nlinks from 0 to 1 > > would have reset inode 902197 nlinks from 0 to 1 > > would have reset inode 906293 nlinks from 0 to 1 > > would have reset inode 906805 nlinks from 0 to 1 > > would have reset inode 909877 nlinks from 0 to 1 > > would have reset inode 925493 nlinks from 0 to 1 > > would have reset inode 949543 nlinks from 0 to 1 > > would have reset inode 955175 nlinks from 0 to 1 > > would have reset inode 963623 nlinks from 0 to 1 > > would have reset inode 967733 nlinks from 0 to 1 > > would have reset inode 968231 nlinks from 0 to 1 > > would have reset inode 982069 nlinks from 0 to 1 > > would have reset inode 1007413 nlinks from 0 to 1 > > would have reset inode 1011509 nlinks from 0 to 1 > > would have reset inode 1014069 nlinks from 0 to 1 > > would have reset inode 1014581 nlinks from 0 to 1 > > would have reset inode 1022005 nlinks from 0 to 1 > > would have reset inode 1022517 nlinks from 0 to 1 > > would have reset inode 1023029 nlinks from 0 to 1 > > would have reset inode 1025333 nlinks from 0 to 1 > > would have reset inode 1043765 nlinks from 0 to 1 > > would have reset inode 1044789 nlinks from 0 to 1 > > would have reset inode 1049397 nlinks from 0 to 1 > > would have reset inode 1050933 nlinks from 0 to 1 > > would have reset inode 1051445 nlinks from 0 to 1 > > would have reset inode 1054261 nlinks from 0 to 1 > > would have reset inode 1060917 nlinks from 0 to 1 > > would have reset inode 1063477 nlinks from 0 to 1 > > would have reset inode 1076021 nlinks from 0 to 1 > > would have reset inode 1081141 nlinks from 0 to 1 > > would have reset inode 1086261 nlinks from 0 to 1 > > would have reset inode 1097269 nlinks from 0 to 1 > > would have reset inode 1099829 nlinks from 0 to 1 > > would have reset inode 1100853 nlinks from 0 to 1 > > would have reset inode 1101877 nlinks from 0 to 1 > > would have reset inode 1126709 nlinks from 0 to 1 > > would have reset inode 1134389 nlinks from 0 to 1 > > would have reset inode 1141045 nlinks from 0 to 1 > > would have reset inode 1141557 nlinks from 0 to 1 > > would have reset inode 1142581 nlinks from 0 to 1 > > would have reset inode 1148469 nlinks from 0 to 1 > > would have reset inode 1153333 nlinks from 0 to 1 > > would have reset inode 1181749 nlinks from 0 to 1 > > would have reset inode 1192245 nlinks from 0 to 1 > > would have reset inode 1198133 nlinks from 0 to 1 > > would have reset inode 1203765 nlinks from 0 to 1 > > would have reset inode 1221429 nlinks from 0 to 1 > > would have reset inode 1223989 nlinks from 0 to 1 > > would have reset inode 1235509 nlinks from 0 to 1 > > would have reset inode 1239349 nlinks from 0 to 1 > > would have reset inode 1240885 nlinks from 0 to 1 > > would have reset inode 1241397 nlinks from 0 to 1 > > would have reset inode 1241909 nlinks from 0 to 1 > > would have reset inode 1242421 nlinks from 0 to 1 > > would have reset inode 1244981 nlinks from 0 to 1 > > would have reset inode 1246517 nlinks from 0 to 1 > > would have reset inode 1253429 nlinks from 0 to 1 > > would have reset inode 1271861 nlinks from 0 to 1 > > would have reset inode 1274677 nlinks from 0 to 1 > > would have reset inode 1277749 nlinks from 0 to 1 > > would have reset inode 1278773 nlinks from 0 to 1 > > would have reset inode 1286709 nlinks from 0 to 1 > > would have reset inode 1288245 nlinks from 0 to 1 > > would have reset inode 1299765 nlinks from 0 to 1 > > would have reset inode 1302325 nlinks from 0 to 1 > > would have reset inode 1304885 nlinks from 0 to 1 > > would have reset inode 1305397 nlinks from 0 to 1 > > would have reset inode 1307509 nlinks from 0 to 1 > > would have reset inode 1309493 nlinks from 0 to 1 > > would have reset inode 1310517 nlinks from 0 to 1 > > would have reset inode 1311029 nlinks from 0 to 1 > > would have reset inode 1312053 nlinks from 0 to 1 > > would have reset inode 1316917 nlinks from 0 to 1 > > would have reset inode 1317941 nlinks from 0 to 1 > > would have reset inode 1320821 nlinks from 0 to 1 > > would have reset inode 1322805 nlinks from 0 to 1 > > would have reset inode 1332789 nlinks from 0 to 1 > > would have reset inode 1336373 nlinks from 0 to 1 > > would have reset inode 1345653 nlinks from 0 to 1 > > would have reset inode 1354549 nlinks from 0 to 1 > > would have reset inode 1361973 nlinks from 0 to 1 > > would have reset inode 1369909 nlinks from 0 to 1 > > would have reset inode 1372981 nlinks from 0 to 1 > > would have reset inode 1388853 nlinks from 0 to 1 > > would have reset inode 1402933 nlinks from 0 to 1 > > would have reset inode 1403445 nlinks from 0 to 1 > > would have reset inode 1420085 nlinks from 0 to 1 > > would have reset inode 1452853 nlinks from 0 to 1 > > would have reset inode 1456437 nlinks from 0 to 1 > > would have reset inode 1457973 nlinks from 0 to 1 > > would have reset inode 1459253 nlinks from 0 to 1 > > would have reset inode 1467957 nlinks from 0 to 1 > > would have reset inode 1471541 nlinks from 0 to 1 > > would have reset inode 1476661 nlinks from 0 to 1 > > would have reset inode 1479733 nlinks from 0 to 1 > > would have reset inode 1483061 nlinks from 0 to 1 > > would have reset inode 1484085 nlinks from 0 to 1 > > would have reset inode 1486133 nlinks from 0 to 1 > > would have reset inode 1489461 nlinks from 0 to 1 > > would have reset inode 1490037 nlinks from 0 to 1 > > would have reset inode 1492021 nlinks from 0 to 1 > > would have reset inode 1493557 nlinks from 0 to 1 > > would have reset inode 1494069 nlinks from 0 to 1 > > would have reset inode 1496885 nlinks from 0 to 1 > > would have reset inode 1498421 nlinks from 0 to 1 > > would have reset inode 1498933 nlinks from 0 to 1 > > would have reset inode 1499957 nlinks from 0 to 1 > > would have reset inode 1506101 nlinks from 0 to 1 > > would have reset inode 1507637 nlinks from 0 to 1 > > would have reset inode 1510453 nlinks from 0 to 1 > > would have reset inode 1514293 nlinks from 0 to 1 > > would have reset inode 1517365 nlinks from 0 to 1 > > would have reset inode 1520693 nlinks from 0 to 1 > > would have reset inode 1521973 nlinks from 0 to 1 > > would have reset inode 1530421 nlinks from 0 to 1 > > would have reset inode 1530933 nlinks from 0 to 1 > > would have reset inode 1537333 nlinks from 0 to 1 > > would have reset inode 1538357 nlinks from 0 to 1 > > would have reset inode 1548853 nlinks from 0 to 1 > > would have reset inode 1553973 nlinks from 0 to 1 > > would have reset inode 1557301 nlinks from 0 to 1 > > would have reset inode 1564213 nlinks from 0 to 1 > > would have reset inode 1564725 nlinks from 0 to 1 > > would have reset inode 1576501 nlinks from 0 to 1 > > would have reset inode 1580597 nlinks from 0 to 1 > > would have reset inode 1584693 nlinks from 0 to 1 > > would have reset inode 1586485 nlinks from 0 to 1 > > would have reset inode 1589301 nlinks from 0 to 1 > > would have reset inode 1589813 nlinks from 0 to 1 > > would have reset inode 1592629 nlinks from 0 to 1 > > would have reset inode 1595701 nlinks from 0 to 1 > > would have reset inode 1601077 nlinks from 0 to 1 > > would have reset inode 1623861 nlinks from 0 to 1 > > would have reset inode 1626677 nlinks from 0 to 1 > > would have reset inode 1627701 nlinks from 0 to 1 > > would have reset inode 1633333 nlinks from 0 to 1 > > would have reset inode 1639221 nlinks from 0 to 1 > > would have reset inode 1649205 nlinks from 0 to 1 > > would have reset inode 1686325 nlinks from 0 to 1 > > would have reset inode 1690677 nlinks from 0 to 1 > > would have reset inode 1693749 nlinks from 0 to 1 > > would have reset inode 1704757 nlinks from 0 to 1 > > would have reset inode 1707061 nlinks from 0 to 1 > > would have reset inode 1709109 nlinks from 0 to 1 > > would have reset inode 1719349 nlinks from 0 to 1 > > would have reset inode 1737013 nlinks from 0 to 1 > > would have reset inode 1741365 nlinks from 0 to 1 > > would have reset inode 1747509 nlinks from 0 to 1 > > would have reset inode 1770805 nlinks from 0 to 1 > > would have reset inode 1780789 nlinks from 0 to 1 > > would have reset inode 1793589 nlinks from 0 to 1 > > would have reset inode 1795125 nlinks from 0 to 1 > > would have reset inode 1800757 nlinks from 0 to 1 > > would have reset inode 1801269 nlinks from 0 to 1 > > would have reset inode 1802549 nlinks from 0 to 1 > > would have reset inode 1804085 nlinks from 0 to 1 > > would have reset inode 1817141 nlinks from 0 to 1 > > would have reset inode 1821749 nlinks from 0 to 1 > > would have reset inode 1832757 nlinks from 0 to 1 > > would have reset inode 1836341 nlinks from 0 to 1 > > would have reset inode 1856309 nlinks from 0 to 1 > > would have reset inode 1900597 nlinks from 0 to 1 > > would have reset inode 1902901 nlinks from 0 to 1 > > would have reset inode 1912373 nlinks from 0 to 1 > > would have reset inode 1943093 nlinks from 0 to 1 > > would have reset inode 1944373 nlinks from 0 to 1 > > would have reset inode 1954101 nlinks from 0 to 1 > > would have reset inode 1955893 nlinks from 0 to 1 > > would have reset inode 1961781 nlinks from 0 to 1 > > would have reset inode 1974325 nlinks from 0 to 1 > > would have reset inode 1978677 nlinks from 0 to 1 > > would have reset inode 1981237 nlinks from 0 to 1 > > would have reset inode 1992245 nlinks from 0 to 1 > > would have reset inode 2000949 nlinks from 0 to 1 > > would have reset inode 2002229 nlinks from 0 to 1 > > would have reset inode 2004789 nlinks from 0 to 1 > > would have reset inode 2005301 nlinks from 0 to 1 > > would have reset inode 2011189 nlinks from 0 to 1 > > would have reset inode 2012981 nlinks from 0 to 1 > > would have reset inode 2015285 nlinks from 0 to 1 > > would have reset inode 2018869 nlinks from 0 to 1 > > would have reset inode 2028341 nlinks from 0 to 1 > > would have reset inode 2028853 nlinks from 0 to 1 > > would have reset inode 2030901 nlinks from 0 to 1 > > would have reset inode 2032181 nlinks from 0 to 1 > > would have reset inode 2032693 nlinks from 0 to 1 > > would have reset inode 2040117 nlinks from 0 to 1 > > would have reset inode 2053685 nlinks from 0 to 1 > > would have reset inode 2083893 nlinks from 0 to 1 > > would have reset inode 2087221 nlinks from 0 to 1 > > would have reset inode 2095925 nlinks from 0 to 1 > > would have reset inode 2098741 nlinks from 0 to 1 > > would have reset inode 2100533 nlinks from 0 to 1 > > would have reset inode 2101301 nlinks from 0 to 1 > > would have reset inode 2123573 nlinks from 0 to 1 > > would have reset inode 2132789 nlinks from 0 to 1 > > would have reset inode 2133813 nlinks from 0 to 1 > > > > > > > > > > > > 2013/4/10 符永涛 > >> > > > > The storage info is as following: > > RAID-6 > > SATA HDD > > Controller: PERC H710P Mini (Embedded) > > Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes > > 255 heads, 63 sectors/track, 3647334 cylinders > > Units = cylinders of 16065 * 512 = 8225280 bytes > > Sector size (logical/physical): 512 bytes / 512 bytes > > I/O size (minimum/optimal): 512 bytes / 512 bytes > > Disk identifier: 0x00000000 > > > > sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (30.0 > TB/27.2 > > TiB) > > sd 0:2:1:0: [sdb] Write Protect is off > > sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08 > > sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enabled, > doesn't > > support DPO or FUA > > sd 0:2:1:0: [sdb] Attached SCSI disk > > > > *-storage > > description: RAID bus controller > > product: MegaRAID SAS 2208 [Thunderbolt] > > vendor: LSI Logic / Symbios Logic > > physical id: 0 > > bus info: pci@0000:02:00.0 > > logical name: scsi0 > > version: 01 > > width: 64 bits > > clock: 33MHz > > capabilities: storage pm pciexpress vpd msi msix bus_master > > cap_list rom > > configuration: driver=megaraid_sas latency=0 > > resources: irq:42 ioport:fc00(size=256) > > memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff > > memory:dc800000-dc81ffff(prefetchable) > > *-disk:0 > > description: SCSI Disk > > product: PERC H710P > > vendor: DELL > > physical id: 2.0.0 > > bus info: scsi@0:2.0.0 > > logical name: /dev/sda > > version: 3.13 > > serial: 0049d6ce1d9f2035180096fde490f648 > > size: 558GiB (599GB) > > capabilities: partitioned partitioned:dos > > configuration: ansiversion=5 signature=000aa336 > > *-disk:1 > > description: SCSI Disk > > product: PERC H710P > > vendor: DELL > > physical id: 2.1.0 > > bus info: scsi@0:2.1.0 > > logical name: /dev/sdb > > logical name: /mnt/xfsd > > version: 3.13 > > serial: 003366f71da22035180096fde490f648 > > size: 27TiB (30TB) > > configuration: ansiversion=5 mount.fstype=xfs > > > mount.options=rw,relatime,attr2,delaylog,logbsize=64k,sunit=128,swidth=1280,noquota > > state=mounted > > > > Thank you. > > > > > > 2013/4/10 Emmanuel Florac > > >> > > > > Le Tue, 9 Apr 2013 23:10:03 +0800 > > 符永涛 > >> écrivait: > > > > > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error > Detected. > > > > Shutting down filesystem > > > > This. I/O error detected. That means that at some point the > > underlying > > device (disk, RAID array, SAN volume) couldn't be reached. > So this > > could very well be a case of a flakey drive, array, cable > or SCSI > > driver. > > > > What's the storage setup here? > > > > -- > > > ------------------------------------------------------------------------ > > Emmanuel Florac | Direction technique > > | Intellique > > | > > >> > > | +33 1 78 94 84 02 > > > > ------------------------------------------------------------------------ > > > > > > > > > > -- > > 符永涛 > > > > > > > > > > -- > > 符永涛 > > > > > > _______________________________________________ > > 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 svavar@fiton.is Fri Apr 12 08:19:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 42EB129DFA for ; Fri, 12 Apr 2013 08:19:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 30F8E8F8073 for ; Fri, 12 Apr 2013 06:19:46 -0700 (PDT) X-ASG-Debug-ID: 1365772784-04cbb057f7f35d0001-w1Z2WR Received: from atlas.fiton.is (atlas.fiton.is [62.145.135.105]) by cuda.sgi.com with ESMTP id ISG6jS1xDnsLqnW9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 12 Apr 2013 06:19:45 -0700 (PDT) X-Barracuda-Envelope-From: svavar@fiton.is X-Barracuda-Apparent-Source-IP: 62.145.135.105 X-Footer: Zml0b24uaXM= Received: from localhost ([127.0.0.1]) by atlas.fiton.is for linux-xfs@oss.sgi.com; Fri, 12 Apr 2013 13:19:39 +0000 Content-Type: text/plain; charset=iso-8859-1 Mime-Version: 1.0 (Apple Message framework v1283) Subject: Re: xfsaild causing load, and stuck in D state - Centos 6.4 x64 From: =?iso-8859-1?Q?Svavar_=D6rn_Eysteinsson?= X-ASG-Orig-Subj: Re: xfsaild causing load, and stuck in D state - Centos 6.4 x64 In-Reply-To: Date: Fri, 12 Apr 2013 13:19:39 +0000 Content-Transfer-Encoding: quoted-printable Message-Id: References: To: linux-xfs@oss.sgi.com X-Mailer: Apple Mail (2.1283) X-Barracuda-Connect: atlas.fiton.is[62.145.135.105] X-Barracuda-Start-Time: 1365772785 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I installed the latest centosplus kernel, and it fixed it. ( ) Looks like this problem will be fixed in kernel-2.6.32-358.5.1.el6 https://bugzilla.redhat.com/show_bug.cgi?id=3D921958 On 12.4.2013, at 10:38, Svavar =D6rn Eysteinsson wrote: > PowerEdge 2850 with PERC SCSI RAID controller. > 16GB RAM > Dual Intel(R) Xeon(TM) CPU 3.00GHz > Using megaraid driver and xfs on 3x 300GB SCSI disks as /dev/sdb = (total 572GB) (RAID-5) >=20 > Stock Centos 6.4 x64, everything updated. > Kernel : 2.6.32-358.2.1.el6.x86_64 #1 SMP >=20 > My Load always shows : >=20 > top - 10:30:21 up 23:09, 1 users, load average: 0.99, 0.96, 0.79 >=20 > yet there is no services what-so-ever doing anything. >=20 > Using PowerTOP I can see that xfsaild is causing second most wake-ups = (after kernel core : hrtimer_start (tick_sched_timer) ) >=20 >=20 > < Detailed C-state information is not P-states (frequencies) > 3.00 Ghz 100.0% > 1500 Mhz 0.0% > 1125 Mhz 0.0% > 750 Mhz 0.0% > 375 Mhz 0.0% >=20 > Wakeups-from-idle per second : 125.1 interval: 10.0s > no ACPI power usage estimate available >=20 > Top causes for wake-ups: > 47.7% (119.6) : hrtimer_start (tick_sched_timer)=20 > 39.9% (100.0) xfsaild/sdb1 : xfsaild (process_timeout) >=20 >=20 > Again, using TOP I can see that xfsaild is stuck in D state. It never = changes. >=20 >=20 > 10050 root 20 0 0 0 0 D 0.0 0.0 0:01.17 = xfsaild/sdb1 >=20 >=20 > My only way to fix this, is either rebooting the machine, unmounting = the volume > and mounting it back online. I've been rsyncing data twice between = this server and another > one. The rsync process takes about 30m-1hour. After the rsync = operation I see that > the xfsaild is stuck in D State and my Load is near 1.00. >=20 >=20 > I'v had no problem what-so-ever on centos 6.3 or early versions on = other servers. >=20 > Any thoughts ? > Information, help would be much appreciated. >=20 > Thanks in advance. >=20 > Best regards, >=20 > Svavar > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From yongtaofu@gmail.com Fri Apr 12 08:42:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4837829DFA for ; Fri, 12 Apr 2013 08:42:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 92FBEAC003 for ; Fri, 12 Apr 2013 06:42:55 -0700 (PDT) X-ASG-Debug-ID: 1365774171-04cb6c2c1df4550001-NocioJ Received: from mail-ia0-f169.google.com (mail-ia0-f169.google.com [209.85.210.169]) by cuda.sgi.com with ESMTP id XRXslmZxPty6gYQo (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 06:42:51 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.169] Received: by mail-ia0-f169.google.com with SMTP id h23so2278583iae.14 for ; Fri, 12 Apr 2013 06:42:50 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=Nu8Yqxws9tBg2Hdi67xYrNTBXTCVvJnlohX+ycJERME=; b=MOQhlIXpFKFkFCRlxapPBp8tBnTm3Y8bM3iSDfepd5f+S0LUbjNrWy7Px0GAEDJupU ZiPFNjWc7vQ6F0OKRzNDTke3Hx65S/IUnlCyIShRuCSdXdEtCPBlUtexnyvMCoc+qTS6 Au2+QqWO+9smfdbsmy8zpIZriyB+nm1LNrNE/brXivj0nahOuMhqpF3D/Rk0z3voRu2K L046DovEwXJ36ejm4Woyn/aLnlUquZTK99Q30dFkVdv4WgiezaX3SXuKgG7CGMBXJ69f la6z7X39uJumcppU8ZywYhvO9SqaxcXg5N+7dce2lzM/YIdheWH2bkenrVZTr0KD9R4x 75Zw== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr1803114igq.51.1365774170538; Fri, 12 Apr 2013 06:42:50 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Fri, 12 Apr 2013 06:42:50 -0700 (PDT) In-Reply-To: <51680320.7050400@redhat.com> References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <51680320.7050400@redhat.com> Date: Fri, 12 Apr 2013 21:42:50 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee747493904da2a14ac X-Barracuda-Connect: mail-ia0-f169.google.com[209.85.210.169] X-Barracuda-Start-Time: 1365774171 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127907 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 --14dae9340ee747493904da2a14ac Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable The xfs shutdown error is always the same. (It happens about 20 times on about 50 servers during last half year) Recently the shutdown happens on the cluster with 24 servers(dis 8 * replica 3) during rebalance. The average work load of this cluster is more than 3TB growth per day. The work load including normal fops, rsync jobs, video encoding/decoding, logging etc. through glusterfs native client of hundreds of machines. The shutdown tend to happen when we run rebalance for the glusterfs cluster which I guess will trigger a lot of unlink operations? Thank you very much. May be I can try to collect more logs with a modified kernel package. 2013/4/12 Brian Foster > On 04/11/2013 08:45 PM, =B7=FB=D3=C0=CC=CE wrote: > > the workload is about: > > 24 servers, replica(3) which means the distribute is 8 > > load is about 3(TB)-8(TB) per day. > > > > This describes your cluster, but not the workload (though cluster info > is good too). What kind of workload is running on your clients (i.e., > rsync jobs, etc.)? Are you running through native gluster mount points, > NFS mounts or a mix? Do you have any gluster internal operations running > (i.e., rebalance, etc.). > > Is there any kind of pattern you can discern from the workload and when > the XFS error happens to occur? You have a good number of servers in > play here, is there any kind of pattern in terms of which servers > experience the error? Is it always the same servers or a random set? > > Brian > > > > > 2013/4/12 Brian Foster > > > > > On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote: > > > It happens tonight again on one of our servers, how to debug the > root > > > cause? Thank you. > > > > > > > Hi, > > > > I've attached a system tap script (stap -v xfs.stp) that should > > hopefully print out a bit more data should the issue happen again. = Do > > you have a small enough number of nodes (or predictable enough > pattern) > > that you could run this on the nodes that tend to fail and collect > the > > output? > > > > Also, could you collect an xfs_metadump of the filesystem in questi= on > > and make it available for download and analysis somewhere? I believ= e > the > > ideal approach is to mount/umount the filesystem first to replay th= e > log > > before collecting a metadump, but somebody could correct me on that > (to > > be safe, you could collect multiple dumps: pre-mount and post-mount= ). > > > > Could you also describe your workload a little bit? Thanks. > > > > Brian > > > > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: > > > xfs_inotobp() returned error 22. > > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree > > returned > > > error 22 > > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x1= ) > > > called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return > address =3D > > > 0xffffffffa02ee20a > > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. > Shutting > > > down filesystem > > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the > > filesystem and > > > rectify the problem(s) > > > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > > returned. > > > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > > returned. > > > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > > returned. > > > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 > > returned. > > > > > > xfs_repair -n > > > > > > > > > Phase 7 - verify link counts... > > > would have reset inode 20021 nlinks from 0 to 1 > > > would have reset inode 20789 nlinks from 0 to 1 > > > would have reset inode 35125 nlinks from 0 to 1 > > > would have reset inode 35637 nlinks from 0 to 1 > > > would have reset inode 36149 nlinks from 0 to 1 > > > would have reset inode 38197 nlinks from 0 to 1 > > > would have reset inode 39477 nlinks from 0 to 1 > > > would have reset inode 54069 nlinks from 0 to 1 > > > would have reset inode 62261 nlinks from 0 to 1 > > > would have reset inode 63029 nlinks from 0 to 1 > > > would have reset inode 72501 nlinks from 0 to 1 > > > would have reset inode 79925 nlinks from 0 to 1 > > > would have reset inode 81205 nlinks from 0 to 1 > > > would have reset inode 84789 nlinks from 0 to 1 > > > would have reset inode 87861 nlinks from 0 to 1 > > > would have reset inode 90663 nlinks from 0 to 1 > > > would have reset inode 91189 nlinks from 0 to 1 > > > would have reset inode 95541 nlinks from 0 to 1 > > > would have reset inode 98101 nlinks from 0 to 1 > > > would have reset inode 101173 nlinks from 0 to 1 > > > would have reset inode 113205 nlinks from 0 to 1 > > > would have reset inode 114741 nlinks from 0 to 1 > > > would have reset inode 126261 nlinks from 0 to 1 > > > would have reset inode 140597 nlinks from 0 to 1 > > > would have reset inode 144693 nlinks from 0 to 1 > > > would have reset inode 147765 nlinks from 0 to 1 > > > would have reset inode 152885 nlinks from 0 to 1 > > > would have reset inode 161333 nlinks from 0 to 1 > > > would have reset inode 161845 nlinks from 0 to 1 > > > would have reset inode 167477 nlinks from 0 to 1 > > > would have reset inode 172341 nlinks from 0 to 1 > > > would have reset inode 191797 nlinks from 0 to 1 > > > would have reset inode 204853 nlinks from 0 to 1 > > > would have reset inode 205365 nlinks from 0 to 1 > > > would have reset inode 215349 nlinks from 0 to 1 > > > would have reset inode 215861 nlinks from 0 to 1 > > > would have reset inode 216373 nlinks from 0 to 1 > > > would have reset inode 217397 nlinks from 0 to 1 > > > would have reset inode 224309 nlinks from 0 to 1 > > > would have reset inode 225589 nlinks from 0 to 1 > > > would have reset inode 234549 nlinks from 0 to 1 > > > would have reset inode 234805 nlinks from 0 to 1 > > > would have reset inode 249653 nlinks from 0 to 1 > > > would have reset inode 250677 nlinks from 0 to 1 > > > would have reset inode 252469 nlinks from 0 to 1 > > > would have reset inode 261429 nlinks from 0 to 1 > > > would have reset inode 265013 nlinks from 0 to 1 > > > would have reset inode 266805 nlinks from 0 to 1 > > > would have reset inode 267317 nlinks from 0 to 1 > > > would have reset inode 268853 nlinks from 0 to 1 > > > would have reset inode 272437 nlinks from 0 to 1 > > > would have reset inode 273205 nlinks from 0 to 1 > > > would have reset inode 274229 nlinks from 0 to 1 > > > would have reset inode 278325 nlinks from 0 to 1 > > > would have reset inode 278837 nlinks from 0 to 1 > > > would have reset inode 281397 nlinks from 0 to 1 > > > would have reset inode 292661 nlinks from 0 to 1 > > > would have reset inode 300853 nlinks from 0 to 1 > > > would have reset inode 302901 nlinks from 0 to 1 > > > would have reset inode 305205 nlinks from 0 to 1 > > > would have reset inode 314165 nlinks from 0 to 1 > > > would have reset inode 315189 nlinks from 0 to 1 > > > would have reset inode 320309 nlinks from 0 to 1 > > > would have reset inode 324917 nlinks from 0 to 1 > > > would have reset inode 328245 nlinks from 0 to 1 > > > would have reset inode 335925 nlinks from 0 to 1 > > > would have reset inode 339253 nlinks from 0 to 1 > > > would have reset inode 339765 nlinks from 0 to 1 > > > would have reset inode 348213 nlinks from 0 to 1 > > > would have reset inode 360501 nlinks from 0 to 1 > > > would have reset inode 362037 nlinks from 0 to 1 > > > would have reset inode 366389 nlinks from 0 to 1 > > > would have reset inode 385845 nlinks from 0 to 1 > > > would have reset inode 390709 nlinks from 0 to 1 > > > would have reset inode 409141 nlinks from 0 to 1 > > > would have reset inode 413237 nlinks from 0 to 1 > > > would have reset inode 414773 nlinks from 0 to 1 > > > would have reset inode 417845 nlinks from 0 to 1 > > > would have reset inode 436021 nlinks from 0 to 1 > > > would have reset inode 439349 nlinks from 0 to 1 > > > would have reset inode 447029 nlinks from 0 to 1 > > > would have reset inode 491317 nlinks from 0 to 1 > > > would have reset inode 494133 nlinks from 0 to 1 > > > would have reset inode 495413 nlinks from 0 to 1 > > > would have reset inode 501301 nlinks from 0 to 1 > > > would have reset inode 506421 nlinks from 0 to 1 > > > would have reset inode 508469 nlinks from 0 to 1 > > > would have reset inode 508981 nlinks from 0 to 1 > > > would have reset inode 511797 nlinks from 0 to 1 > > > would have reset inode 513077 nlinks from 0 to 1 > > > would have reset inode 517941 nlinks from 0 to 1 > > > would have reset inode 521013 nlinks from 0 to 1 > > > would have reset inode 522805 nlinks from 0 to 1 > > > would have reset inode 523317 nlinks from 0 to 1 > > > would have reset inode 525621 nlinks from 0 to 1 > > > would have reset inode 527925 nlinks from 0 to 1 > > > would have reset inode 535605 nlinks from 0 to 1 > > > would have reset inode 541749 nlinks from 0 to 1 > > > would have reset inode 573493 nlinks from 0 to 1 > > > would have reset inode 578613 nlinks from 0 to 1 > > > would have reset inode 583029 nlinks from 0 to 1 > > > would have reset inode 585525 nlinks from 0 to 1 > > > would have reset inode 586293 nlinks from 0 to 1 > > > would have reset inode 586805 nlinks from 0 to 1 > > > would have reset inode 591413 nlinks from 0 to 1 > > > would have reset inode 594485 nlinks from 0 to 1 > > > would have reset inode 596277 nlinks from 0 to 1 > > > would have reset inode 603189 nlinks from 0 to 1 > > > would have reset inode 613429 nlinks from 0 to 1 > > > would have reset inode 617781 nlinks from 0 to 1 > > > would have reset inode 621877 nlinks from 0 to 1 > > > would have reset inode 623925 nlinks from 0 to 1 > > > would have reset inode 625205 nlinks from 0 to 1 > > > would have reset inode 626741 nlinks from 0 to 1 > > > would have reset inode 639541 nlinks from 0 to 1 > > > would have reset inode 640053 nlinks from 0 to 1 > > > would have reset inode 640565 nlinks from 0 to 1 > > > would have reset inode 645173 nlinks from 0 to 1 > > > would have reset inode 652853 nlinks from 0 to 1 > > > would have reset inode 656181 nlinks from 0 to 1 > > > would have reset inode 659253 nlinks from 0 to 1 > > > would have reset inode 663605 nlinks from 0 to 1 > > > would have reset inode 667445 nlinks from 0 to 1 > > > would have reset inode 680757 nlinks from 0 to 1 > > > would have reset inode 691253 nlinks from 0 to 1 > > > would have reset inode 691765 nlinks from 0 to 1 > > > would have reset inode 697653 nlinks from 0 to 1 > > > would have reset inode 700469 nlinks from 0 to 1 > > > would have reset inode 707893 nlinks from 0 to 1 > > > would have reset inode 716853 nlinks from 0 to 1 > > > would have reset inode 722229 nlinks from 0 to 1 > > > would have reset inode 722741 nlinks from 0 to 1 > > > would have reset inode 723765 nlinks from 0 to 1 > > > would have reset inode 731957 nlinks from 0 to 1 > > > would have reset inode 742965 nlinks from 0 to 1 > > > would have reset inode 743477 nlinks from 0 to 1 > > > would have reset inode 745781 nlinks from 0 to 1 > > > would have reset inode 746293 nlinks from 0 to 1 > > > would have reset inode 774453 nlinks from 0 to 1 > > > would have reset inode 778805 nlinks from 0 to 1 > > > would have reset inode 785013 nlinks from 0 to 1 > > > would have reset inode 785973 nlinks from 0 to 1 > > > would have reset inode 791349 nlinks from 0 to 1 > > > would have reset inode 796981 nlinks from 0 to 1 > > > would have reset inode 803381 nlinks from 0 to 1 > > > would have reset inode 806965 nlinks from 0 to 1 > > > would have reset inode 811798 nlinks from 0 to 1 > > > would have reset inode 812310 nlinks from 0 to 1 > > > would have reset inode 813078 nlinks from 0 to 1 > > > would have reset inode 813607 nlinks from 0 to 1 > > > would have reset inode 814183 nlinks from 0 to 1 > > > would have reset inode 822069 nlinks from 0 to 1 > > > would have reset inode 828469 nlinks from 0 to 1 > > > would have reset inode 830005 nlinks from 0 to 1 > > > would have reset inode 832053 nlinks from 0 to 1 > > > would have reset inode 832565 nlinks from 0 to 1 > > > would have reset inode 836661 nlinks from 0 to 1 > > > would have reset inode 841013 nlinks from 0 to 1 > > > would have reset inode 841525 nlinks from 0 to 1 > > > would have reset inode 845365 nlinks from 0 to 1 > > > would have reset inode 846133 nlinks from 0 to 1 > > > would have reset inode 847157 nlinks from 0 to 1 > > > would have reset inode 852533 nlinks from 0 to 1 > > > would have reset inode 857141 nlinks from 0 to 1 > > > would have reset inode 863271 nlinks from 0 to 1 > > > would have reset inode 866855 nlinks from 0 to 1 > > > would have reset inode 887861 nlinks from 0 to 1 > > > would have reset inode 891701 nlinks from 0 to 1 > > > would have reset inode 894773 nlinks from 0 to 1 > > > would have reset inode 900149 nlinks from 0 to 1 > > > would have reset inode 902197 nlinks from 0 to 1 > > > would have reset inode 906293 nlinks from 0 to 1 > > > would have reset inode 906805 nlinks from 0 to 1 > > > would have reset inode 909877 nlinks from 0 to 1 > > > would have reset inode 925493 nlinks from 0 to 1 > > > would have reset inode 949543 nlinks from 0 to 1 > > > would have reset inode 955175 nlinks from 0 to 1 > > > would have reset inode 963623 nlinks from 0 to 1 > > > would have reset inode 967733 nlinks from 0 to 1 > > > would have reset inode 968231 nlinks from 0 to 1 > > > would have reset inode 982069 nlinks from 0 to 1 > > > would have reset inode 1007413 nlinks from 0 to 1 > > > would have reset inode 1011509 nlinks from 0 to 1 > > > would have reset inode 1014069 nlinks from 0 to 1 > > > would have reset inode 1014581 nlinks from 0 to 1 > > > would have reset inode 1022005 nlinks from 0 to 1 > > > would have reset inode 1022517 nlinks from 0 to 1 > > > would have reset inode 1023029 nlinks from 0 to 1 > > > would have reset inode 1025333 nlinks from 0 to 1 > > > would have reset inode 1043765 nlinks from 0 to 1 > > > would have reset inode 1044789 nlinks from 0 to 1 > > > would have reset inode 1049397 nlinks from 0 to 1 > > > would have reset inode 1050933 nlinks from 0 to 1 > > > would have reset inode 1051445 nlinks from 0 to 1 > > > would have reset inode 1054261 nlinks from 0 to 1 > > > would have reset inode 1060917 nlinks from 0 to 1 > > > would have reset inode 1063477 nlinks from 0 to 1 > > > would have reset inode 1076021 nlinks from 0 to 1 > > > would have reset inode 1081141 nlinks from 0 to 1 > > > would have reset inode 1086261 nlinks from 0 to 1 > > > would have reset inode 1097269 nlinks from 0 to 1 > > > would have reset inode 1099829 nlinks from 0 to 1 > > > would have reset inode 1100853 nlinks from 0 to 1 > > > would have reset inode 1101877 nlinks from 0 to 1 > > > would have reset inode 1126709 nlinks from 0 to 1 > > > would have reset inode 1134389 nlinks from 0 to 1 > > > would have reset inode 1141045 nlinks from 0 to 1 > > > would have reset inode 1141557 nlinks from 0 to 1 > > > would have reset inode 1142581 nlinks from 0 to 1 > > > would have reset inode 1148469 nlinks from 0 to 1 > > > would have reset inode 1153333 nlinks from 0 to 1 > > > would have reset inode 1181749 nlinks from 0 to 1 > > > would have reset inode 1192245 nlinks from 0 to 1 > > > would have reset inode 1198133 nlinks from 0 to 1 > > > would have reset inode 1203765 nlinks from 0 to 1 > > > would have reset inode 1221429 nlinks from 0 to 1 > > > would have reset inode 1223989 nlinks from 0 to 1 > > > would have reset inode 1235509 nlinks from 0 to 1 > > > would have reset inode 1239349 nlinks from 0 to 1 > > > would have reset inode 1240885 nlinks from 0 to 1 > > > would have reset inode 1241397 nlinks from 0 to 1 > > > would have reset inode 1241909 nlinks from 0 to 1 > > > would have reset inode 1242421 nlinks from 0 to 1 > > > would have reset inode 1244981 nlinks from 0 to 1 > > > would have reset inode 1246517 nlinks from 0 to 1 > > > would have reset inode 1253429 nlinks from 0 to 1 > > > would have reset inode 1271861 nlinks from 0 to 1 > > > would have reset inode 1274677 nlinks from 0 to 1 > > > would have reset inode 1277749 nlinks from 0 to 1 > > > would have reset inode 1278773 nlinks from 0 to 1 > > > would have reset inode 1286709 nlinks from 0 to 1 > > > would have reset inode 1288245 nlinks from 0 to 1 > > > would have reset inode 1299765 nlinks from 0 to 1 > > > would have reset inode 1302325 nlinks from 0 to 1 > > > would have reset inode 1304885 nlinks from 0 to 1 > > > would have reset inode 1305397 nlinks from 0 to 1 > > > would have reset inode 1307509 nlinks from 0 to 1 > > > would have reset inode 1309493 nlinks from 0 to 1 > > > would have reset inode 1310517 nlinks from 0 to 1 > > > would have reset inode 1311029 nlinks from 0 to 1 > > > would have reset inode 1312053 nlinks from 0 to 1 > > > would have reset inode 1316917 nlinks from 0 to 1 > > > would have reset inode 1317941 nlinks from 0 to 1 > > > would have reset inode 1320821 nlinks from 0 to 1 > > > would have reset inode 1322805 nlinks from 0 to 1 > > > would have reset inode 1332789 nlinks from 0 to 1 > > > would have reset inode 1336373 nlinks from 0 to 1 > > > would have reset inode 1345653 nlinks from 0 to 1 > > > would have reset inode 1354549 nlinks from 0 to 1 > > > would have reset inode 1361973 nlinks from 0 to 1 > > > would have reset inode 1369909 nlinks from 0 to 1 > > > would have reset inode 1372981 nlinks from 0 to 1 > > > would have reset inode 1388853 nlinks from 0 to 1 > > > would have reset inode 1402933 nlinks from 0 to 1 > > > would have reset inode 1403445 nlinks from 0 to 1 > > > would have reset inode 1420085 nlinks from 0 to 1 > > > would have reset inode 1452853 nlinks from 0 to 1 > > > would have reset inode 1456437 nlinks from 0 to 1 > > > would have reset inode 1457973 nlinks from 0 to 1 > > > would have reset inode 1459253 nlinks from 0 to 1 > > > would have reset inode 1467957 nlinks from 0 to 1 > > > would have reset inode 1471541 nlinks from 0 to 1 > > > would have reset inode 1476661 nlinks from 0 to 1 > > > would have reset inode 1479733 nlinks from 0 to 1 > > > would have reset inode 1483061 nlinks from 0 to 1 > > > would have reset inode 1484085 nlinks from 0 to 1 > > > would have reset inode 1486133 nlinks from 0 to 1 > > > would have reset inode 1489461 nlinks from 0 to 1 > > > would have reset inode 1490037 nlinks from 0 to 1 > > > would have reset inode 1492021 nlinks from 0 to 1 > > > would have reset inode 1493557 nlinks from 0 to 1 > > > would have reset inode 1494069 nlinks from 0 to 1 > > > would have reset inode 1496885 nlinks from 0 to 1 > > > would have reset inode 1498421 nlinks from 0 to 1 > > > would have reset inode 1498933 nlinks from 0 to 1 > > > would have reset inode 1499957 nlinks from 0 to 1 > > > would have reset inode 1506101 nlinks from 0 to 1 > > > would have reset inode 1507637 nlinks from 0 to 1 > > > would have reset inode 1510453 nlinks from 0 to 1 > > > would have reset inode 1514293 nlinks from 0 to 1 > > > would have reset inode 1517365 nlinks from 0 to 1 > > > would have reset inode 1520693 nlinks from 0 to 1 > > > would have reset inode 1521973 nlinks from 0 to 1 > > > would have reset inode 1530421 nlinks from 0 to 1 > > > would have reset inode 1530933 nlinks from 0 to 1 > > > would have reset inode 1537333 nlinks from 0 to 1 > > > would have reset inode 1538357 nlinks from 0 to 1 > > > would have reset inode 1548853 nlinks from 0 to 1 > > > would have reset inode 1553973 nlinks from 0 to 1 > > > would have reset inode 1557301 nlinks from 0 to 1 > > > would have reset inode 1564213 nlinks from 0 to 1 > > > would have reset inode 1564725 nlinks from 0 to 1 > > > would have reset inode 1576501 nlinks from 0 to 1 > > > would have reset inode 1580597 nlinks from 0 to 1 > > > would have reset inode 1584693 nlinks from 0 to 1 > > > would have reset inode 1586485 nlinks from 0 to 1 > > > would have reset inode 1589301 nlinks from 0 to 1 > > > would have reset inode 1589813 nlinks from 0 to 1 > > > would have reset inode 1592629 nlinks from 0 to 1 > > > would have reset inode 1595701 nlinks from 0 to 1 > > > would have reset inode 1601077 nlinks from 0 to 1 > > > would have reset inode 1623861 nlinks from 0 to 1 > > > would have reset inode 1626677 nlinks from 0 to 1 > > > would have reset inode 1627701 nlinks from 0 to 1 > > > would have reset inode 1633333 nlinks from 0 to 1 > > > would have reset inode 1639221 nlinks from 0 to 1 > > > would have reset inode 1649205 nlinks from 0 to 1 > > > would have reset inode 1686325 nlinks from 0 to 1 > > > would have reset inode 1690677 nlinks from 0 to 1 > > > would have reset inode 1693749 nlinks from 0 to 1 > > > would have reset inode 1704757 nlinks from 0 to 1 > > > would have reset inode 1707061 nlinks from 0 to 1 > > > would have reset inode 1709109 nlinks from 0 to 1 > > > would have reset inode 1719349 nlinks from 0 to 1 > > > would have reset inode 1737013 nlinks from 0 to 1 > > > would have reset inode 1741365 nlinks from 0 to 1 > > > would have reset inode 1747509 nlinks from 0 to 1 > > > would have reset inode 1770805 nlinks from 0 to 1 > > > would have reset inode 1780789 nlinks from 0 to 1 > > > would have reset inode 1793589 nlinks from 0 to 1 > > > would have reset inode 1795125 nlinks from 0 to 1 > > > would have reset inode 1800757 nlinks from 0 to 1 > > > would have reset inode 1801269 nlinks from 0 to 1 > > > would have reset inode 1802549 nlinks from 0 to 1 > > > would have reset inode 1804085 nlinks from 0 to 1 > > > would have reset inode 1817141 nlinks from 0 to 1 > > > would have reset inode 1821749 nlinks from 0 to 1 > > > would have reset inode 1832757 nlinks from 0 to 1 > > > would have reset inode 1836341 nlinks from 0 to 1 > > > would have reset inode 1856309 nlinks from 0 to 1 > > > would have reset inode 1900597 nlinks from 0 to 1 > > > would have reset inode 1902901 nlinks from 0 to 1 > > > would have reset inode 1912373 nlinks from 0 to 1 > > > would have reset inode 1943093 nlinks from 0 to 1 > > > would have reset inode 1944373 nlinks from 0 to 1 > > > would have reset inode 1954101 nlinks from 0 to 1 > > > would have reset inode 1955893 nlinks from 0 to 1 > > > would have reset inode 1961781 nlinks from 0 to 1 > > > would have reset inode 1974325 nlinks from 0 to 1 > > > would have reset inode 1978677 nlinks from 0 to 1 > > > would have reset inode 1981237 nlinks from 0 to 1 > > > would have reset inode 1992245 nlinks from 0 to 1 > > > would have reset inode 2000949 nlinks from 0 to 1 > > > would have reset inode 2002229 nlinks from 0 to 1 > > > would have reset inode 2004789 nlinks from 0 to 1 > > > would have reset inode 2005301 nlinks from 0 to 1 > > > would have reset inode 2011189 nlinks from 0 to 1 > > > would have reset inode 2012981 nlinks from 0 to 1 > > > would have reset inode 2015285 nlinks from 0 to 1 > > > would have reset inode 2018869 nlinks from 0 to 1 > > > would have reset inode 2028341 nlinks from 0 to 1 > > > would have reset inode 2028853 nlinks from 0 to 1 > > > would have reset inode 2030901 nlinks from 0 to 1 > > > would have reset inode 2032181 nlinks from 0 to 1 > > > would have reset inode 2032693 nlinks from 0 to 1 > > > would have reset inode 2040117 nlinks from 0 to 1 > > > would have reset inode 2053685 nlinks from 0 to 1 > > > would have reset inode 2083893 nlinks from 0 to 1 > > > would have reset inode 2087221 nlinks from 0 to 1 > > > would have reset inode 2095925 nlinks from 0 to 1 > > > would have reset inode 2098741 nlinks from 0 to 1 > > > would have reset inode 2100533 nlinks from 0 to 1 > > > would have reset inode 2101301 nlinks from 0 to 1 > > > would have reset inode 2123573 nlinks from 0 to 1 > > > would have reset inode 2132789 nlinks from 0 to 1 > > > would have reset inode 2133813 nlinks from 0 to 1 > > > > > > > > > > > > > > > > > > 2013/4/10 =B7=FB=D3=C0=CC=CE > > >> > > > > > > The storage info is as following: > > > RAID-6 > > > SATA HDD > > > Controller: PERC H710P Mini (Embedded) > > > Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes > > > 255 heads, 63 sectors/track, 3647334 cylinders > > > Units =3D cylinders of 16065 * 512 =3D 8225280 bytes > > > Sector size (logical/physical): 512 bytes / 512 bytes > > > I/O size (minimum/optimal): 512 bytes / 512 bytes > > > Disk identifier: 0x00000000 > > > > > > sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (30.0 > > TB/27.2 > > > TiB) > > > sd 0:2:1:0: [sdb] Write Protect is off > > > sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08 > > > sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enabled, > > doesn't > > > support DPO or FUA > > > sd 0:2:1:0: [sdb] Attached SCSI disk > > > > > > *-storage > > > description: RAID bus controller > > > product: MegaRAID SAS 2208 [Thunderbolt] > > > vendor: LSI Logic / Symbios Logic > > > physical id: 0 > > > bus info: pci@0000:02:00.0 > > > logical name: scsi0 > > > version: 01 > > > width: 64 bits > > > clock: 33MHz > > > capabilities: storage pm pciexpress vpd msi msix > bus_master > > > cap_list rom > > > configuration: driver=3Dmegaraid_sas latency=3D0 > > > resources: irq:42 ioport:fc00(size=3D256) > > > memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff > > > memory:dc800000-dc81ffff(prefetchable) > > > *-disk:0 > > > description: SCSI Disk > > > product: PERC H710P > > > vendor: DELL > > > physical id: 2.0.0 > > > bus info: scsi@0:2.0.0 > > > logical name: /dev/sda > > > version: 3.13 > > > serial: 0049d6ce1d9f2035180096fde490f648 > > > size: 558GiB (599GB) > > > capabilities: partitioned partitioned:dos > > > configuration: ansiversion=3D5 signature=3D000aa336 > > > *-disk:1 > > > description: SCSI Disk > > > product: PERC H710P > > > vendor: DELL > > > physical id: 2.1.0 > > > bus info: scsi@0:2.1.0 > > > logical name: /dev/sdb > > > logical name: /mnt/xfsd > > > version: 3.13 > > > serial: 003366f71da22035180096fde490f648 > > > size: 27TiB (30TB) > > > configuration: ansiversion=3D5 mount.fstype=3Dxfs > > > > > > mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,swi= dth=3D1280,noquota > > > state=3Dmounted > > > > > > Thank you. > > > > > > > > > 2013/4/10 Emmanuel Florac > > > > >>> > > > > > > Le Tue, 9 Apr 2013 23:10:03 +0800 > > > =B7=FB=D3=C0=CC=CE > > >> =A8=A6cr= ivait: > > > > > > > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error > > Detected. > > > > > Shutting down filesystem > > > > > > This. I/O error detected. That means that at some point t= he > > > underlying > > > device (disk, RAID array, SAN volume) couldn't be reached= . > > So this > > > could very well be a case of a flakey drive, array, cable > > or SCSI > > > driver. > > > > > > What's the storage setup here? > > > > > > -- > > > > > > ------------------------------------------------------------------------ > > > Emmanuel Florac | Direction technique > > > | Intellique > > > | > > > > > >> > > > | +33 1 78 94 84 02 > > > > > > > > ------------------------------------------------------------------------ > > > > > > > > > > > > > > > -- > > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > > > > > > -- > > > =B7=FB=D3=C0=CC=CE > > > > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee747493904da2a14ac Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
The xfs shutdown error is always the same. (It h= appens about 20 times on about 50 servers during last half year)
Recentl= y the shutdown happens on the cluster with 24 servers(dis 8 * replica 3) du= ring rebalance. The average work load of this cluster is more than 3TB grow= th per day.
The work load including normal fops, rsync jobs, video encoding/decoding, l= ogging etc. through glusterfs native client of hundreds of machines.
The shutdown tend to happen when we run rebalance for the glusterfs clu= ster which I guess will trigger a lot of unlink operations?

Thank you very much. May be I can try to collect more logs with a= modified kernel package.



=
2013/4/12 Brian Foster <bfoster@redhat.com= >
On 04/11/2013 08:45 PM, = =B7=FB=D3=C0=CC=CE wrote:
> the workload is about:
> 24 servers, replica(3) which means the distribute is 8
> load is about 3(TB)-8(TB) per day.
>

This describes your cluster, but not the workload (though cluster inf= o
is good too). What kind of workload is running on your clients (i.e.,
rsync jobs, etc.)? Are you running through native gluster mount points,
NFS mounts or a mix? Do you have any gluster internal operations running (i.e., rebalance, etc.).

Is there any kind of pattern you can discern from the workload and when
the XFS error happens to occur? You have a good number of servers in
play here, is there any kind of pattern in terms of which servers
experience the error? Is it always the same servers or a random set?

Brian

>
> 2013/4/12 Brian Foster <bfost= er@redhat.com <mailto:bfoster@= redhat.com>>
>
>     On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote:
>     > It happens tonight again on one of our servers, how= to debug the root
>     > cause? Thank you.
>     >
>
>     Hi,
>
>     I've attached a system tap script (stap -v xfs.stp) = that should
>     hopefully print out a bit more data should the issue hap= pen again. Do
>     you have a small enough number of nodes (or predictable = enough pattern)
>     that you could run this on the nodes that tend to fail a= nd collect the
>     output?
>
>     Also, could you collect an xfs_metadump of the filesyste= m in question
>     and make it available for download and analysis somewher= e? I believe the
>     ideal approach is to mount/umount the filesystem first t= o replay the log
>     before collecting a metadump, but somebody could correct= me on that (to
>     be safe, you could collect multiple dumps: pre-mount and= post-mount).
>
>     Could you also describe your workload a little bit? Than= ks.
>
>     Brian
>
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink= _remove:
>     > xfs_inotobp() returned error 22.
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactiv= e: xfs_ifree
>     returned
>     > error 22
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_forc= e_shutdown(0x1)
>     > called from line 1184 of file fs/xfs/xfs_vnodeops.c= .  Return address =3D
>     > 0xffffffffa02ee20a
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error D= etected. Shutting
>     > down filesystem
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umou= nt the
>     filesystem and
>     > rectify the problem(s)
>     > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     >
>     > xfs_repair -n
>     >
>     >
>     > Phase 7 - verify link counts...
>     > would have reset inode 20021 nlinks from 0 to 1
>     > would have reset inode 20789 nlinks from 0 to 1
>     > would have reset inode 35125 nlinks from 0 to 1
>     > would have reset inode 35637 nlinks from 0 to 1
>     > would have reset inode 36149 nlinks from 0 to 1
>     > would have reset inode 38197 nlinks from 0 to 1
>     > would have reset inode 39477 nlinks from 0 to 1
>     > would have reset inode 54069 nlinks from 0 to 1
>     > would have reset inode 62261 nlinks from 0 to 1
>     > would have reset inode 63029 nlinks from 0 to 1
>     > would have reset inode 72501 nlinks from 0 to 1
>     > would have reset inode 79925 nlinks from 0 to 1
>     > would have reset inode 81205 nlinks from 0 to 1
>     > would have reset inode 84789 nlinks from 0 to 1
>     > would have reset inode 87861 nlinks from 0 to 1
>     > would have reset inode 90663 nlinks from 0 to 1
>     > would have reset inode 91189 nlinks from 0 to 1
>     > would have reset inode 95541 nlinks from 0 to 1
>     > would have reset inode 98101 nlinks from 0 to 1
>     > would have reset inode 101173 nlinks from 0 to 1 >     > would have reset inode 113205 nlinks from 0 to 1 >     > would have reset inode 114741 nlinks from 0 to 1 >     > would have reset inode 126261 nlinks from 0 to 1 >     > would have reset inode 140597 nlinks from 0 to 1 >     > would have reset inode 144693 nlinks from 0 to 1 >     > would have reset inode 147765 nlinks from 0 to 1 >     > would have reset inode 152885 nlinks from 0 to 1 >     > would have reset inode 161333 nlinks from 0 to 1 >     > would have reset inode 161845 nlinks from 0 to 1 >     > would have reset inode 167477 nlinks from 0 to 1 >     > would have reset inode 172341 nlinks from 0 to 1 >     > would have reset inode 191797 nlinks from 0 to 1 >     > would have reset inode 204853 nlinks from 0 to 1 >     > would have reset inode 205365 nlinks from 0 to 1 >     > would have reset inode 215349 nlinks from 0 to 1 >     > would have reset inode 215861 nlinks from 0 to 1 >     > would have reset inode 216373 nlinks from 0 to 1 >     > would have reset inode 217397 nlinks from 0 to 1 >     > would have reset inode 224309 nlinks from 0 to 1 >     > would have reset inode 225589 nlinks from 0 to 1 >     > would have reset inode 234549 nlinks from 0 to 1 >     > would have reset inode 234805 nlinks from 0 to 1 >     > would have reset inode 249653 nlinks from 0 to 1 >     > would have reset inode 250677 nlinks from 0 to 1 >     > would have reset inode 252469 nlinks from 0 to 1 >     > would have reset inode 261429 nlinks from 0 to 1 >     > would have reset inode 265013 nlinks from 0 to 1 >     > would have reset inode 266805 nlinks from 0 to 1 >     > would have reset inode 267317 nlinks from 0 to 1 >     > would have reset inode 268853 nlinks from 0 to 1 >     > would have reset inode 272437 nlinks from 0 to 1 >     > would have reset inode 273205 nlinks from 0 to 1 >     > would have reset inode 274229 nlinks from 0 to 1 >     > would have reset inode 278325 nlinks from 0 to 1 >     > would have reset inode 278837 nlinks from 0 to 1 >     > would have reset inode 281397 nlinks from 0 to 1 >     > would have reset inode 292661 nlinks from 0 to 1 >     > would have reset inode 300853 nlinks from 0 to 1 >     > would have reset inode 302901 nlinks from 0 to 1 >     > would have reset inode 305205 nlinks from 0 to 1 >     > would have reset inode 314165 nlinks from 0 to 1 >     > would have reset inode 315189 nlinks from 0 to 1 >     > would have reset inode 320309 nlinks from 0 to 1 >     > would have reset inode 324917 nlinks from 0 to 1 >     > would have reset inode 328245 nlinks from 0 to 1 >     > would have reset inode 335925 nlinks from 0 to 1 >     > would have reset inode 339253 nlinks from 0 to 1 >     > would have reset inode 339765 nlinks from 0 to 1 >     > would have reset inode 348213 nlinks from 0 to 1 >     > would have reset inode 360501 nlinks from 0 to 1 >     > would have reset inode 362037 nlinks from 0 to 1 >     > would have reset inode 366389 nlinks from 0 to 1 >     > would have reset inode 385845 nlinks from 0 to 1 >     > would have reset inode 390709 nlinks from 0 to 1 >     > would have reset inode 409141 nlinks from 0 to 1 >     > would have reset inode 413237 nlinks from 0 to 1 >     > would have reset inode 414773 nlinks from 0 to 1 >     > would have reset inode 417845 nlinks from 0 to 1 >     > would have reset inode 436021 nlinks from 0 to 1 >     > would have reset inode 439349 nlinks from 0 to 1 >     > would have reset inode 447029 nlinks from 0 to 1 >     > would have reset inode 491317 nlinks from 0 to 1 >     > would have reset inode 494133 nlinks from 0 to 1 >     > would have reset inode 495413 nlinks from 0 to 1 >     > would have reset inode 501301 nlinks from 0 to 1 >     > would have reset inode 506421 nlinks from 0 to 1 >     > would have reset inode 508469 nlinks from 0 to 1 >     > would have reset inode 508981 nlinks from 0 to 1 >     > would have reset inode 511797 nlinks from 0 to 1 >     > would have reset inode 513077 nlinks from 0 to 1 >     > would have reset inode 517941 nlinks from 0 to 1 >     > would have reset inode 521013 nlinks from 0 to 1 >     > would have reset inode 522805 nlinks from 0 to 1 >     > would have reset inode 523317 nlinks from 0 to 1 >     > would have reset inode 525621 nlinks from 0 to 1 >     > would have reset inode 527925 nlinks from 0 to 1 >     > would have reset inode 535605 nlinks from 0 to 1 >     > would have reset inode 541749 nlinks from 0 to 1 >     > would have reset inode 573493 nlinks from 0 to 1 >     > would have reset inode 578613 nlinks from 0 to 1 >     > would have reset inode 583029 nlinks from 0 to 1 >     > would have reset inode 585525 nlinks from 0 to 1 >     > would have reset inode 586293 nlinks from 0 to 1 >     > would have reset inode 586805 nlinks from 0 to 1 >     > would have reset inode 591413 nlinks from 0 to 1 >     > would have reset inode 594485 nlinks from 0 to 1 >     > would have reset inode 596277 nlinks from 0 to 1 >     > would have reset inode 603189 nlinks from 0 to 1 >     > would have reset inode 613429 nlinks from 0 to 1 >     > would have reset inode 617781 nlinks from 0 to 1 >     > would have reset inode 621877 nlinks from 0 to 1 >     > would have reset inode 623925 nlinks from 0 to 1 >     > would have reset inode 625205 nlinks from 0 to 1 >     > would have reset inode 626741 nlinks from 0 to 1 >     > would have reset inode 639541 nlinks from 0 to 1 >     > would have reset inode 640053 nlinks from 0 to 1 >     > would have reset inode 640565 nlinks from 0 to 1 >     > would have reset inode 645173 nlinks from 0 to 1 >     > would have reset inode 652853 nlinks from 0 to 1 >     > would have reset inode 656181 nlinks from 0 to 1 >     > would have reset inode 659253 nlinks from 0 to 1 >     > would have reset inode 663605 nlinks from 0 to 1 >     > would have reset inode 667445 nlinks from 0 to 1 >     > would have reset inode 680757 nlinks from 0 to 1 >     > would have reset inode 691253 nlinks from 0 to 1 >     > would have reset inode 691765 nlinks from 0 to 1 >     > would have reset inode 697653 nlinks from 0 to 1 >     > would have reset inode 700469 nlinks from 0 to 1 >     > would have reset inode 707893 nlinks from 0 to 1 >     > would have reset inode 716853 nlinks from 0 to 1 >     > would have reset inode 722229 nlinks from 0 to 1 >     > would have reset inode 722741 nlinks from 0 to 1 >     > would have reset inode 723765 nlinks from 0 to 1 >     > would have reset inode 731957 nlinks from 0 to 1 >     > would have reset inode 742965 nlinks from 0 to 1 >     > would have reset inode 743477 nlinks from 0 to 1 >     > would have reset inode 745781 nlinks from 0 to 1 >     > would have reset inode 746293 nlinks from 0 to 1 >     > would have reset inode 774453 nlinks from 0 to 1 >     > would have reset inode 778805 nlinks from 0 to 1 >     > would have reset inode 785013 nlinks from 0 to 1 >     > would have reset inode 785973 nlinks from 0 to 1 >     > would have reset inode 791349 nlinks from 0 to 1 >     > would have reset inode 796981 nlinks from 0 to 1 >     > would have reset inode 803381 nlinks from 0 to 1 >     > would have reset inode 806965 nlinks from 0 to 1 >     > would have reset inode 811798 nlinks from 0 to 1 >     > would have reset inode 812310 nlinks from 0 to 1 >     > would have reset inode 813078 nlinks from 0 to 1 >     > would have reset inode 813607 nlinks from 0 to 1 >     > would have reset inode 814183 nlinks from 0 to 1 >     > would have reset inode 822069 nlinks from 0 to 1 >     > would have reset inode 828469 nlinks from 0 to 1 >     > would have reset inode 830005 nlinks from 0 to 1 >     > would have reset inode 832053 nlinks from 0 to 1 >     > would have reset inode 832565 nlinks from 0 to 1 >     > would have reset inode 836661 nlinks from 0 to 1 >     > would have reset inode 841013 nlinks from 0 to 1 >     > would have reset inode 841525 nlinks from 0 to 1 >     > would have reset inode 845365 nlinks from 0 to 1 >     > would have reset inode 846133 nlinks from 0 to 1 >     > would have reset inode 847157 nlinks from 0 to 1 >     > would have reset inode 852533 nlinks from 0 to 1 >     > would have reset inode 857141 nlinks from 0 to 1 >     > would have reset inode 863271 nlinks from 0 to 1 >     > would have reset inode 866855 nlinks from 0 to 1 >     > would have reset inode 887861 nlinks from 0 to 1 >     > would have reset inode 891701 nlinks from 0 to 1 >     > would have reset inode 894773 nlinks from 0 to 1 >     > would have reset inode 900149 nlinks from 0 to 1 >     > would have reset inode 902197 nlinks from 0 to 1 >     > would have reset inode 906293 nlinks from 0 to 1 >     > would have reset inode 906805 nlinks from 0 to 1 >     > would have reset inode 909877 nlinks from 0 to 1 >     > would have reset inode 925493 nlinks from 0 to 1 >     > would have reset inode 949543 nlinks from 0 to 1 >     > would have reset inode 955175 nlinks from 0 to 1 >     > would have reset inode 963623 nlinks from 0 to 1 >     > would have reset inode 967733 nlinks from 0 to 1 >     > would have reset inode 968231 nlinks from 0 to 1 >     > would have reset inode 982069 nlinks from 0 to 1 >     > would have reset inode 1007413 nlinks from 0 to 1 >     > would have reset inode 1011509 nlinks from 0 to 1 >     > would have reset inode 1014069 nlinks from 0 to 1 >     > would have reset inode 1014581 nlinks from 0 to 1 >     > would have reset inode 1022005 nlinks from 0 to 1 >     > would have reset inode 1022517 nlinks from 0 to 1 >     > would have reset inode 1023029 nlinks from 0 to 1 >     > would have reset inode 1025333 nlinks from 0 to 1 >     > would have reset inode 1043765 nlinks from 0 to 1 >     > would have reset inode 1044789 nlinks from 0 to 1 >     > would have reset inode 1049397 nlinks from 0 to 1 >     > would have reset inode 1050933 nlinks from 0 to 1 >     > would have reset inode 1051445 nlinks from 0 to 1 >     > would have reset inode 1054261 nlinks from 0 to 1 >     > would have reset inode 1060917 nlinks from 0 to 1 >     > would have reset inode 1063477 nlinks from 0 to 1 >     > would have reset inode 1076021 nlinks from 0 to 1 >     > would have reset inode 1081141 nlinks from 0 to 1 >     > would have reset inode 1086261 nlinks from 0 to 1 >     > would have reset inode 1097269 nlinks from 0 to 1 >     > would have reset inode 1099829 nlinks from 0 to 1 >     > would have reset inode 1100853 nlinks from 0 to 1 >     > would have reset inode 1101877 nlinks from 0 to 1 >     > would have reset inode 1126709 nlinks from 0 to 1 >     > would have reset inode 1134389 nlinks from 0 to 1 >     > would have reset inode 1141045 nlinks from 0 to 1 >     > would have reset inode 1141557 nlinks from 0 to 1 >     > would have reset inode 1142581 nlinks from 0 to 1 >     > would have reset inode 1148469 nlinks from 0 to 1 >     > would have reset inode 1153333 nlinks from 0 to 1 >     > would have reset inode 1181749 nlinks from 0 to 1 >     > would have reset inode 1192245 nlinks from 0 to 1 >     > would have reset inode 1198133 nlinks from 0 to 1 >     > would have reset inode 1203765 nlinks from 0 to 1 >     > would have reset inode 1221429 nlinks from 0 to 1 >     > would have reset inode 1223989 nlinks from 0 to 1 >     > would have reset inode 1235509 nlinks from 0 to 1 >     > would have reset inode 1239349 nlinks from 0 to 1 >     > would have reset inode 1240885 nlinks from 0 to 1 >     > would have reset inode 1241397 nlinks from 0 to 1 >     > would have reset inode 1241909 nlinks from 0 to 1 >     > would have reset inode 1242421 nlinks from 0 to 1 >     > would have reset inode 1244981 nlinks from 0 to 1 >     > would have reset inode 1246517 nlinks from 0 to 1 >     > would have reset inode 1253429 nlinks from 0 to 1 >     > would have reset inode 1271861 nlinks from 0 to 1 >     > would have reset inode 1274677 nlinks from 0 to 1 >     > would have reset inode 1277749 nlinks from 0 to 1 >     > would have reset inode 1278773 nlinks from 0 to 1 >     > would have reset inode 1286709 nlinks from 0 to 1 >     > would have reset inode 1288245 nlinks from 0 to 1 >     > would have reset inode 1299765 nlinks from 0 to 1 >     > would have reset inode 1302325 nlinks from 0 to 1 >     > would have reset inode 1304885 nlinks from 0 to 1 >     > would have reset inode 1305397 nlinks from 0 to 1 >     > would have reset inode 1307509 nlinks from 0 to 1 >     > would have reset inode 1309493 nlinks from 0 to 1 >     > would have reset inode 1310517 nlinks from 0 to 1 >     > would have reset inode 1311029 nlinks from 0 to 1 >     > would have reset inode 1312053 nlinks from 0 to 1 >     > would have reset inode 1316917 nlinks from 0 to 1 >     > would have reset inode 1317941 nlinks from 0 to 1 >     > would have reset inode 1320821 nlinks from 0 to 1 >     > would have reset inode 1322805 nlinks from 0 to 1 >     > would have reset inode 1332789 nlinks from 0 to 1 >     > would have reset inode 1336373 nlinks from 0 to 1 >     > would have reset inode 1345653 nlinks from 0 to 1 >     > would have reset inode 1354549 nlinks from 0 to 1 >     > would have reset inode 1361973 nlinks from 0 to 1 >     > would have reset inode 1369909 nlinks from 0 to 1 >     > would have reset inode 1372981 nlinks from 0 to 1 >     > would have reset inode 1388853 nlinks from 0 to 1 >     > would have reset inode 1402933 nlinks from 0 to 1 >     > would have reset inode 1403445 nlinks from 0 to 1 >     > would have reset inode 1420085 nlinks from 0 to 1 >     > would have reset inode 1452853 nlinks from 0 to 1 >     > would have reset inode 1456437 nlinks from 0 to 1 >     > would have reset inode 1457973 nlinks from 0 to 1 >     > would have reset inode 1459253 nlinks from 0 to 1 >     > would have reset inode 1467957 nlinks from 0 to 1 >     > would have reset inode 1471541 nlinks from 0 to 1 >     > would have reset inode 1476661 nlinks from 0 to 1 >     > would have reset inode 1479733 nlinks from 0 to 1 >     > would have reset inode 1483061 nlinks from 0 to 1 >     > would have reset inode 1484085 nlinks from 0 to 1 >     > would have reset inode 1486133 nlinks from 0 to 1 >     > would have reset inode 1489461 nlinks from 0 to 1 >     > would have reset inode 1490037 nlinks from 0 to 1 >     > would have reset inode 1492021 nlinks from 0 to 1 >     > would have reset inode 1493557 nlinks from 0 to 1 >     > would have reset inode 1494069 nlinks from 0 to 1 >     > would have reset inode 1496885 nlinks from 0 to 1 >     > would have reset inode 1498421 nlinks from 0 to 1 >     > would have reset inode 1498933 nlinks from 0 to 1 >     > would have reset inode 1499957 nlinks from 0 to 1 >     > would have reset inode 1506101 nlinks from 0 to 1 >     > would have reset inode 1507637 nlinks from 0 to 1 >     > would have reset inode 1510453 nlinks from 0 to 1 >     > would have reset inode 1514293 nlinks from 0 to 1 >     > would have reset inode 1517365 nlinks from 0 to 1 >     > would have reset inode 1520693 nlinks from 0 to 1 >     > would have reset inode 1521973 nlinks from 0 to 1 >     > would have reset inode 1530421 nlinks from 0 to 1 >     > would have reset inode 1530933 nlinks from 0 to 1 >     > would have reset inode 1537333 nlinks from 0 to 1 >     > would have reset inode 1538357 nlinks from 0 to 1 >     > would have reset inode 1548853 nlinks from 0 to 1 >     > would have reset inode 1553973 nlinks from 0 to 1 >     > would have reset inode 1557301 nlinks from 0 to 1 >     > would have reset inode 1564213 nlinks from 0 to 1 >     > would have reset inode 1564725 nlinks from 0 to 1 >     > would have reset inode 1576501 nlinks from 0 to 1 >     > would have reset inode 1580597 nlinks from 0 to 1 >     > would have reset inode 1584693 nlinks from 0 to 1 >     > would have reset inode 1586485 nlinks from 0 to 1 >     > would have reset inode 1589301 nlinks from 0 to 1 >     > would have reset inode 1589813 nlinks from 0 to 1 >     > would have reset inode 1592629 nlinks from 0 to 1 >     > would have reset inode 1595701 nlinks from 0 to 1 >     > would have reset inode 1601077 nlinks from 0 to 1 >     > would have reset inode 1623861 nlinks from 0 to 1 >     > would have reset inode 1626677 nlinks from 0 to 1 >     > would have reset inode 1627701 nlinks from 0 to 1 >     > would have reset inode 1633333 nlinks from 0 to 1 >     > would have reset inode 1639221 nlinks from 0 to 1 >     > would have reset inode 1649205 nlinks from 0 to 1 >     > would have reset inode 1686325 nlinks from 0 to 1 >     > would have reset inode 1690677 nlinks from 0 to 1 >     > would have reset inode 1693749 nlinks from 0 to 1 >     > would have reset inode 1704757 nlinks from 0 to 1 >     > would have reset inode 1707061 nlinks from 0 to 1 >     > would have reset inode 1709109 nlinks from 0 to 1 >     > would have reset inode 1719349 nlinks from 0 to 1 >     > would have reset inode 1737013 nlinks from 0 to 1 >     > would have reset inode 1741365 nlinks from 0 to 1 >     > would have reset inode 1747509 nlinks from 0 to 1 >     > would have reset inode 1770805 nlinks from 0 to 1 >     > would have reset inode 1780789 nlinks from 0 to 1 >     > would have reset inode 1793589 nlinks from 0 to 1 >     > would have reset inode 1795125 nlinks from 0 to 1 >     > would have reset inode 1800757 nlinks from 0 to 1 >     > would have reset inode 1801269 nlinks from 0 to 1 >     > would have reset inode 1802549 nlinks from 0 to 1 >     > would have reset inode 1804085 nlinks from 0 to 1 >     > would have reset inode 1817141 nlinks from 0 to 1 >     > would have reset inode 1821749 nlinks from 0 to 1 >     > would have reset inode 1832757 nlinks from 0 to 1 >     > would have reset inode 1836341 nlinks from 0 to 1 >     > would have reset inode 1856309 nlinks from 0 to 1 >     > would have reset inode 1900597 nlinks from 0 to 1 >     > would have reset inode 1902901 nlinks from 0 to 1 >     > would have reset inode 1912373 nlinks from 0 to 1 >     > would have reset inode 1943093 nlinks from 0 to 1 >     > would have reset inode 1944373 nlinks from 0 to 1 >     > would have reset inode 1954101 nlinks from 0 to 1 >     > would have reset inode 1955893 nlinks from 0 to 1 >     > would have reset inode 1961781 nlinks from 0 to 1 >     > would have reset inode 1974325 nlinks from 0 to 1 >     > would have reset inode 1978677 nlinks from 0 to 1 >     > would have reset inode 1981237 nlinks from 0 to 1 >     > would have reset inode 1992245 nlinks from 0 to 1 >     > would have reset inode 2000949 nlinks from 0 to 1 >     > would have reset inode 2002229 nlinks from 0 to 1 >     > would have reset inode 2004789 nlinks from 0 to 1 >     > would have reset inode 2005301 nlinks from 0 to 1 >     > would have reset inode 2011189 nlinks from 0 to 1 >     > would have reset inode 2012981 nlinks from 0 to 1 >     > would have reset inode 2015285 nlinks from 0 to 1 >     > would have reset inode 2018869 nlinks from 0 to 1 >     > would have reset inode 2028341 nlinks from 0 to 1 >     > would have reset inode 2028853 nlinks from 0 to 1 >     > would have reset inode 2030901 nlinks from 0 to 1 >     > would have reset inode 2032181 nlinks from 0 to 1 >     > would have reset inode 2032693 nlinks from 0 to 1 >     > would have reset inode 2040117 nlinks from 0 to 1 >     > would have reset inode 2053685 nlinks from 0 to 1 >     > would have reset inode 2083893 nlinks from 0 to 1 >     > would have reset inode 2087221 nlinks from 0 to 1 >     > would have reset inode 2095925 nlinks from 0 to 1 >     > would have reset inode 2098741 nlinks from 0 to 1 >     > would have reset inode 2100533 nlinks from 0 to 1 >     > would have reset inode 2101301 nlinks from 0 to 1 >     > would have reset inode 2123573 nlinks from 0 to 1 >     > would have reset inode 2132789 nlinks from 0 to 1 >     > would have reset inode 2133813 nlinks from 0 to 1 >     >
>     >
>     >
>     >
>     >
>     > 2013/4/10 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>
>     <mailto:yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>>
>     >
>     >     The storage info is as following:
>     >     RAID-6
>     >     SATA HDD
>     >     Controller: PERC H710P Mini (Embedded= )
>     >     Disk /dev/sdb: 30000.3 GB, 3000034656= 2560 bytes
>     >     255 heads, 63 sectors/track, 3647334 = cylinders
>     >     Units =3D cylinders of 16065 * 512 = =3D 8225280 bytes
>     >     Sector size (logical/physical): 512 b= ytes / 512 bytes
>     >     I/O size (minimum/optimal): 512 bytes= / 512 bytes
>     >     Disk identifier: 0x00000000
>     >
>     >     sd 0:2:1:0: [sdb] 58594426880 512-byt= e logical blocks: (30.0
>     TB/27.2
>     >     TiB)
>     >     sd 0:2:1:0: [sdb] Write Protect is of= f
>     >     sd 0:2:1:0: [sdb] Mode Sense: 1f 00 0= 0 08
>     >     sd 0:2:1:0: [sdb] Write cache: enable= d, read cache: enabled,
>     doesn't
>     >     support DPO or FUA
>     >     sd 0:2:1:0: [sdb] Attached SCSI disk<= br> >     >
>     >     *-storage
>     >            descriptio= n: RAID bus controller
>     >            product: M= egaRAID SAS 2208 [Thunderbolt]
>     >            vendor: LS= I Logic / Symbios Logic
>     >            physical i= d: 0
>     >            bus info: = pci@0000:02:00.0
>     >            logical na= me: scsi0
>     >            version: 0= 1
>     >            width: 64 = bits
>     >            clock: 33M= Hz
>     >            capabiliti= es: storage pm pciexpress vpd msi msix bus_master
>     >     cap_list rom
>     >            configurat= ion: driver=3Dmegaraid_sas latency=3D0
>     >            resources:= irq:42 ioport:fc00(size=3D256)
>     >     memory:dd7fc000-dd7fffff memory:dd780= 000-dd7bffff
>     >     memory:dc800000-dc81ffff(prefetchable= )
>     >          *-disk:0
>     >               de= scription: SCSI Disk
>     >               pr= oduct: PERC H710P
>     >               ve= ndor: DELL
>     >               ph= ysical id: 2.0.0
>     >               bu= s info: scsi@0:2.0.0
>     >               lo= gical name: /dev/sda
>     >               ve= rsion: 3.13
>     >               se= rial: 0049d6ce1d9f2035180096fde490f648
>     >               si= ze: 558GiB (599GB)
>     >               ca= pabilities: partitioned partitioned:dos
>     >               co= nfiguration: ansiversion=3D5 signature=3D000aa336
>     >          *-disk:1
>     >               de= scription: SCSI Disk
>     >               pr= oduct: PERC H710P
>     >               ve= ndor: DELL
>     >               ph= ysical id: 2.1.0
>     >               bu= s info: scsi@0:2.1.0
>     >               lo= gical name: /dev/sdb
>     >               lo= gical name: /mnt/xfsd
>     >               ve= rsion: 3.13
>     >               se= rial: 003366f71da22035180096fde490f648
>     >               si= ze: 27TiB (30TB)
>     >               co= nfiguration: ansiversion=3D5 mount.fstype=3Dxfs
>     >
>     mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64= k,sunit=3D128,swidth=3D1280,noquota
>     >     state=3Dmounted
>     >
>     >     Thank you.
>     >
>     >
>     >     2013/4/10 Emmanuel Florac <eflorac@intellique.com
>     <mailto:efl= orac@intellique.com>
>     >     <mailto:eflorac@intellique.com <mailto:eflorac@intellique.com>>>
>     >
>     >         Le Tue, 9 Apr 2013 23:1= 0:03 +0800
>     >         =B7=FB=D3=C0=CC=CE <= yongtaofu@gmail.com <mailto:<= a href=3D"mailto:yongtaofu@gmail.com">yongtaofu@gmail.com>
>     <mailto:= yongtaofu@gmail.com <mailto:y= ongtaofu@gmail.com>>> =A8=A6crivait:
>     >
>     >         > > Apr  9 1= 1:01:30 cqdx kernel: XFS (sdb): I/O Error
>     Detected.
>     >         > > Shutting down= filesystem
>     >
>     >         This. I/O error detecte= d. That means that at some point the
>     >         underlying
>     >         device (disk, RAID arra= y, SAN volume) couldn't be reached.
>     So this
>     >         could very well be a ca= se of a flakey drive, array, cable
>     or SCSI
>     >         driver.
>     >
>     >         What's the storage = setup here?
>     >
>     >         --
>     >
>     --------------------------------------------------------= ----------------
>     >         Emmanuel Florac   =   |   Direction technique
>     >               &n= bsp;             |   Intellique
>     >               &n= bsp;             |   <eflorac@intellique.com
>     <mailto:efl= orac@intellique.com>
>     >         <mailto:eflorac@intellique.com
>     <mailto:eflorac@intellique.com>>>
>     >               &n= bsp;             |   +33 1 78 94 84 02
>     <tel:%2B33%201%2078%2094%2084%2002>
>     >
>     --------------------------------------------------------= ----------------
>     >
>     >
>     >
>     >
>     >     --
>     >     =B7=FB=D3=C0=CC=CE
>     >
>     >
>     >
>     >
>     > --
>     > =B7=FB=D3=C0=CC=CE
>     >
>     >
>     > _______________________________________________
>     > xfs mailing list
>     > xfs@oss.sg= i.com <mailto:xfs@oss.sgi.com= >
>     > http://oss.sgi.c= om/mailman/listinfo/xfs
>     >
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE
>
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> = http://oss.sgi.com/mailman/listinfo/xfs
>




--
=B7=FB=D3= =C0=CC=CE
--14dae9340ee747493904da2a14ac-- From yongtaofu@gmail.com Fri Apr 12 08:49:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9038329DFA for ; Fri, 12 Apr 2013 08:49:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7A85C8F8068 for ; Fri, 12 Apr 2013 06:49:00 -0700 (PDT) X-ASG-Debug-ID: 1365774535-04cbb057f7f5dc0001-NocioJ Received: from mail-ia0-f172.google.com (mail-ia0-f172.google.com [209.85.210.172]) by cuda.sgi.com with ESMTP id IEO1yov7Hw0u7vI7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 06:48:56 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.172] Received: by mail-ia0-f172.google.com with SMTP id k38so2380325iah.17 for ; Fri, 12 Apr 2013 06:48:55 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=zjkp0vuJDcpxz4DgcjSaZdhYM1wFZbr+Gu6bhkscjQs=; b=kGf7sTXhyy9ZqHcFSVw1PC2rHNUsGxthm2WoQyx2xJYnrjDWHRPWQE6XBcLx6Vp8kZ YdOWtf3it/gf5B/0mZSN8A4qlPo2nKuBJ3d0DyzQsuC020qv0eEF33A7GJASrH/q94GX tIDq0Y0oJgspYmsl5yQcQh0IlgwDPsiJn/oM9qWV9aaGxLpT9GPPFFLwOVG5Q1ojkWB7 Hz3djJaCGNqxAxUsrYia5NkYyMAPP6t0GRf/faPNT5osGRjh77KoH4Ud3RlCIWFRCQ16 dBKDRvQB/PO3oRjyDfVtjfzb8pfctfQQtJCRDLbs/uANnVJW9OBdJWiMCiursbOf7MZ1 B4Aw== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr1765298igx.11.1365774535565; Fri, 12 Apr 2013 06:48:55 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Fri, 12 Apr 2013 06:48:55 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <51680320.7050400@redhat.com> Date: Fri, 12 Apr 2013 21:48:55 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e0111e0740925d704da2a2a7b X-Barracuda-Connect: mail-ia0-f172.google.com[209.85.210.172] X-Barracuda-Start-Time: 1365774536 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127909 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 --089e0111e0740925d704da2a2a7b Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable And I'm not sure what kind of information is important to debug this issue? Thank you. 2013/4/12 =B7=FB=D3=C0=CC=CE > The xfs shutdown error is always the same. (It happens about 20 times on > about 50 servers during last half year) > Recently the shutdown happens on the cluster with 24 servers(dis 8 * > replica 3) during rebalance. The average work load of this cluster is mor= e > than 3TB growth per day. > The work load including normal fops, rsync jobs, video encoding/decoding, > logging etc. through glusterfs native client of hundreds of machines. > The shutdown tend to happen when we run rebalance for the glusterfs > cluster which I guess will trigger a lot of unlink operations? > > Thank you very much. May be I can try to collect more logs with a modifie= d > kernel package. > > > > 2013/4/12 Brian Foster > >> On 04/11/2013 08:45 PM, =B7=FB=D3=C0=CC=CE wrote: >> > the workload is about: >> > 24 servers, replica(3) which means the distribute is 8 >> > load is about 3(TB)-8(TB) per day. >> > >> >> This describes your cluster, but not the workload (though cluster info >> is good too). What kind of workload is running on your clients (i.e., >> rsync jobs, etc.)? Are you running through native gluster mount points, >> NFS mounts or a mix? Do you have any gluster internal operations running >> (i.e., rebalance, etc.). >> >> Is there any kind of pattern you can discern from the workload and when >> the XFS error happens to occur? You have a good number of servers in >> play here, is there any kind of pattern in terms of which servers >> experience the error? Is it always the same servers or a random set? >> >> Brian >> >> > >> > 2013/4/12 Brian Foster = > >> > >> > On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote: >> > > It happens tonight again on one of our servers, how to debug the >> root >> > > cause? Thank you. >> > > >> > >> > Hi, >> > >> > I've attached a system tap script (stap -v xfs.stp) that should >> > hopefully print out a bit more data should the issue happen again. >> Do >> > you have a small enough number of nodes (or predictable enough >> pattern) >> > that you could run this on the nodes that tend to fail and collect >> the >> > output? >> > >> > Also, could you collect an xfs_metadump of the filesystem in >> question >> > and make it available for download and analysis somewhere? I >> believe the >> > ideal approach is to mount/umount the filesystem first to replay >> the log >> > before collecting a metadump, but somebody could correct me on tha= t >> (to >> > be safe, you could collect multiple dumps: pre-mount and >> post-mount). >> > >> > Could you also describe your workload a little bit? Thanks. >> > >> > Brian >> > >> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: >> > > xfs_inotobp() returned error 22. >> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree >> > returned >> > > error 22 >> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_force_shutdown(0x= 1) >> > > called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return >> address =3D >> > > 0xffffffffa02ee20a >> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. >> Shutting >> > > down filesystem >> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the >> > filesystem and >> > > rectify the problem(s) >> > > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> > returned. >> > > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> > returned. >> > > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> > returned. >> > > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >> > returned. >> > > >> > > xfs_repair -n >> > > >> > > >> > > Phase 7 - verify link counts... >> > > would have reset inode 20021 nlinks from 0 to 1 >> > > would have reset inode 20789 nlinks from 0 to 1 >> > > would have reset inode 35125 nlinks from 0 to 1 >> > > would have reset inode 35637 nlinks from 0 to 1 >> > > would have reset inode 36149 nlinks from 0 to 1 >> > > would have reset inode 38197 nlinks from 0 to 1 >> > > would have reset inode 39477 nlinks from 0 to 1 >> > > would have reset inode 54069 nlinks from 0 to 1 >> > > would have reset inode 62261 nlinks from 0 to 1 >> > > would have reset inode 63029 nlinks from 0 to 1 >> > > would have reset inode 72501 nlinks from 0 to 1 >> > > would have reset inode 79925 nlinks from 0 to 1 >> > > would have reset inode 81205 nlinks from 0 to 1 >> > > would have reset inode 84789 nlinks from 0 to 1 >> > > would have reset inode 87861 nlinks from 0 to 1 >> > > would have reset inode 90663 nlinks from 0 to 1 >> > > would have reset inode 91189 nlinks from 0 to 1 >> > > would have reset inode 95541 nlinks from 0 to 1 >> > > would have reset inode 98101 nlinks from 0 to 1 >> > > would have reset inode 101173 nlinks from 0 to 1 >> > > would have reset inode 113205 nlinks from 0 to 1 >> > > would have reset inode 114741 nlinks from 0 to 1 >> > > would have reset inode 126261 nlinks from 0 to 1 >> > > would have reset inode 140597 nlinks from 0 to 1 >> > > would have reset inode 144693 nlinks from 0 to 1 >> > > would have reset inode 147765 nlinks from 0 to 1 >> > > would have reset inode 152885 nlinks from 0 to 1 >> > > would have reset inode 161333 nlinks from 0 to 1 >> > > would have reset inode 161845 nlinks from 0 to 1 >> > > would have reset inode 167477 nlinks from 0 to 1 >> > > would have reset inode 172341 nlinks from 0 to 1 >> > > would have reset inode 191797 nlinks from 0 to 1 >> > > would have reset inode 204853 nlinks from 0 to 1 >> > > would have reset inode 205365 nlinks from 0 to 1 >> > > would have reset inode 215349 nlinks from 0 to 1 >> > > would have reset inode 215861 nlinks from 0 to 1 >> > > would have reset inode 216373 nlinks from 0 to 1 >> > > would have reset inode 217397 nlinks from 0 to 1 >> > > would have reset inode 224309 nlinks from 0 to 1 >> > > would have reset inode 225589 nlinks from 0 to 1 >> > > would have reset inode 234549 nlinks from 0 to 1 >> > > would have reset inode 234805 nlinks from 0 to 1 >> > > would have reset inode 249653 nlinks from 0 to 1 >> > > would have reset inode 250677 nlinks from 0 to 1 >> > > would have reset inode 252469 nlinks from 0 to 1 >> > > would have reset inode 261429 nlinks from 0 to 1 >> > > would have reset inode 265013 nlinks from 0 to 1 >> > > would have reset inode 266805 nlinks from 0 to 1 >> > > would have reset inode 267317 nlinks from 0 to 1 >> > > would have reset inode 268853 nlinks from 0 to 1 >> > > would have reset inode 272437 nlinks from 0 to 1 >> > > would have reset inode 273205 nlinks from 0 to 1 >> > > would have reset inode 274229 nlinks from 0 to 1 >> > > would have reset inode 278325 nlinks from 0 to 1 >> > > would have reset inode 278837 nlinks from 0 to 1 >> > > would have reset inode 281397 nlinks from 0 to 1 >> > > would have reset inode 292661 nlinks from 0 to 1 >> > > would have reset inode 300853 nlinks from 0 to 1 >> > > would have reset inode 302901 nlinks from 0 to 1 >> > > would have reset inode 305205 nlinks from 0 to 1 >> > > would have reset inode 314165 nlinks from 0 to 1 >> > > would have reset inode 315189 nlinks from 0 to 1 >> > > would have reset inode 320309 nlinks from 0 to 1 >> > > would have reset inode 324917 nlinks from 0 to 1 >> > > would have reset inode 328245 nlinks from 0 to 1 >> > > would have reset inode 335925 nlinks from 0 to 1 >> > > would have reset inode 339253 nlinks from 0 to 1 >> > > would have reset inode 339765 nlinks from 0 to 1 >> > > would have reset inode 348213 nlinks from 0 to 1 >> > > would have reset inode 360501 nlinks from 0 to 1 >> > > would have reset inode 362037 nlinks from 0 to 1 >> > > would have reset inode 366389 nlinks from 0 to 1 >> > > would have reset inode 385845 nlinks from 0 to 1 >> > > would have reset inode 390709 nlinks from 0 to 1 >> > > would have reset inode 409141 nlinks from 0 to 1 >> > > would have reset inode 413237 nlinks from 0 to 1 >> > > would have reset inode 414773 nlinks from 0 to 1 >> > > would have reset inode 417845 nlinks from 0 to 1 >> > > would have reset inode 436021 nlinks from 0 to 1 >> > > would have reset inode 439349 nlinks from 0 to 1 >> > > would have reset inode 447029 nlinks from 0 to 1 >> > > would have reset inode 491317 nlinks from 0 to 1 >> > > would have reset inode 494133 nlinks from 0 to 1 >> > > would have reset inode 495413 nlinks from 0 to 1 >> > > would have reset inode 501301 nlinks from 0 to 1 >> > > would have reset inode 506421 nlinks from 0 to 1 >> > > would have reset inode 508469 nlinks from 0 to 1 >> > > would have reset inode 508981 nlinks from 0 to 1 >> > > would have reset inode 511797 nlinks from 0 to 1 >> > > would have reset inode 513077 nlinks from 0 to 1 >> > > would have reset inode 517941 nlinks from 0 to 1 >> > > would have reset inode 521013 nlinks from 0 to 1 >> > > would have reset inode 522805 nlinks from 0 to 1 >> > > would have reset inode 523317 nlinks from 0 to 1 >> > > would have reset inode 525621 nlinks from 0 to 1 >> > > would have reset inode 527925 nlinks from 0 to 1 >> > > would have reset inode 535605 nlinks from 0 to 1 >> > > would have reset inode 541749 nlinks from 0 to 1 >> > > would have reset inode 573493 nlinks from 0 to 1 >> > > would have reset inode 578613 nlinks from 0 to 1 >> > > would have reset inode 583029 nlinks from 0 to 1 >> > > would have reset inode 585525 nlinks from 0 to 1 >> > > would have reset inode 586293 nlinks from 0 to 1 >> > > would have reset inode 586805 nlinks from 0 to 1 >> > > would have reset inode 591413 nlinks from 0 to 1 >> > > would have reset inode 594485 nlinks from 0 to 1 >> > > would have reset inode 596277 nlinks from 0 to 1 >> > > would have reset inode 603189 nlinks from 0 to 1 >> > > would have reset inode 613429 nlinks from 0 to 1 >> > > would have reset inode 617781 nlinks from 0 to 1 >> > > would have reset inode 621877 nlinks from 0 to 1 >> > > would have reset inode 623925 nlinks from 0 to 1 >> > > would have reset inode 625205 nlinks from 0 to 1 >> > > would have reset inode 626741 nlinks from 0 to 1 >> > > would have reset inode 639541 nlinks from 0 to 1 >> > > would have reset inode 640053 nlinks from 0 to 1 >> > > would have reset inode 640565 nlinks from 0 to 1 >> > > would have reset inode 645173 nlinks from 0 to 1 >> > > would have reset inode 652853 nlinks from 0 to 1 >> > > would have reset inode 656181 nlinks from 0 to 1 >> > > would have reset inode 659253 nlinks from 0 to 1 >> > > would have reset inode 663605 nlinks from 0 to 1 >> > > would have reset inode 667445 nlinks from 0 to 1 >> > > would have reset inode 680757 nlinks from 0 to 1 >> > > would have reset inode 691253 nlinks from 0 to 1 >> > > would have reset inode 691765 nlinks from 0 to 1 >> > > would have reset inode 697653 nlinks from 0 to 1 >> > > would have reset inode 700469 nlinks from 0 to 1 >> > > would have reset inode 707893 nlinks from 0 to 1 >> > > would have reset inode 716853 nlinks from 0 to 1 >> > > would have reset inode 722229 nlinks from 0 to 1 >> > > would have reset inode 722741 nlinks from 0 to 1 >> > > would have reset inode 723765 nlinks from 0 to 1 >> > > would have reset inode 731957 nlinks from 0 to 1 >> > > would have reset inode 742965 nlinks from 0 to 1 >> > > would have reset inode 743477 nlinks from 0 to 1 >> > > would have reset inode 745781 nlinks from 0 to 1 >> > > would have reset inode 746293 nlinks from 0 to 1 >> > > would have reset inode 774453 nlinks from 0 to 1 >> > > would have reset inode 778805 nlinks from 0 to 1 >> > > would have reset inode 785013 nlinks from 0 to 1 >> > > would have reset inode 785973 nlinks from 0 to 1 >> > > would have reset inode 791349 nlinks from 0 to 1 >> > > would have reset inode 796981 nlinks from 0 to 1 >> > > would have reset inode 803381 nlinks from 0 to 1 >> > > would have reset inode 806965 nlinks from 0 to 1 >> > > would have reset inode 811798 nlinks from 0 to 1 >> > > would have reset inode 812310 nlinks from 0 to 1 >> > > would have reset inode 813078 nlinks from 0 to 1 >> > > would have reset inode 813607 nlinks from 0 to 1 >> > > would have reset inode 814183 nlinks from 0 to 1 >> > > would have reset inode 822069 nlinks from 0 to 1 >> > > would have reset inode 828469 nlinks from 0 to 1 >> > > would have reset inode 830005 nlinks from 0 to 1 >> > > would have reset inode 832053 nlinks from 0 to 1 >> > > would have reset inode 832565 nlinks from 0 to 1 >> > > would have reset inode 836661 nlinks from 0 to 1 >> > > would have reset inode 841013 nlinks from 0 to 1 >> > > would have reset inode 841525 nlinks from 0 to 1 >> > > would have reset inode 845365 nlinks from 0 to 1 >> > > would have reset inode 846133 nlinks from 0 to 1 >> > > would have reset inode 847157 nlinks from 0 to 1 >> > > would have reset inode 852533 nlinks from 0 to 1 >> > > would have reset inode 857141 nlinks from 0 to 1 >> > > would have reset inode 863271 nlinks from 0 to 1 >> > > would have reset inode 866855 nlinks from 0 to 1 >> > > would have reset inode 887861 nlinks from 0 to 1 >> > > would have reset inode 891701 nlinks from 0 to 1 >> > > would have reset inode 894773 nlinks from 0 to 1 >> > > would have reset inode 900149 nlinks from 0 to 1 >> > > would have reset inode 902197 nlinks from 0 to 1 >> > > would have reset inode 906293 nlinks from 0 to 1 >> > > would have reset inode 906805 nlinks from 0 to 1 >> > > would have reset inode 909877 nlinks from 0 to 1 >> > > would have reset inode 925493 nlinks from 0 to 1 >> > > would have reset inode 949543 nlinks from 0 to 1 >> > > would have reset inode 955175 nlinks from 0 to 1 >> > > would have reset inode 963623 nlinks from 0 to 1 >> > > would have reset inode 967733 nlinks from 0 to 1 >> > > would have reset inode 968231 nlinks from 0 to 1 >> > > would have reset inode 982069 nlinks from 0 to 1 >> > > would have reset inode 1007413 nlinks from 0 to 1 >> > > would have reset inode 1011509 nlinks from 0 to 1 >> > > would have reset inode 1014069 nlinks from 0 to 1 >> > > would have reset inode 1014581 nlinks from 0 to 1 >> > > would have reset inode 1022005 nlinks from 0 to 1 >> > > would have reset inode 1022517 nlinks from 0 to 1 >> > > would have reset inode 1023029 nlinks from 0 to 1 >> > > would have reset inode 1025333 nlinks from 0 to 1 >> > > would have reset inode 1043765 nlinks from 0 to 1 >> > > would have reset inode 1044789 nlinks from 0 to 1 >> > > would have reset inode 1049397 nlinks from 0 to 1 >> > > would have reset inode 1050933 nlinks from 0 to 1 >> > > would have reset inode 1051445 nlinks from 0 to 1 >> > > would have reset inode 1054261 nlinks from 0 to 1 >> > > would have reset inode 1060917 nlinks from 0 to 1 >> > > would have reset inode 1063477 nlinks from 0 to 1 >> > > would have reset inode 1076021 nlinks from 0 to 1 >> > > would have reset inode 1081141 nlinks from 0 to 1 >> > > would have reset inode 1086261 nlinks from 0 to 1 >> > > would have reset inode 1097269 nlinks from 0 to 1 >> > > would have reset inode 1099829 nlinks from 0 to 1 >> > > would have reset inode 1100853 nlinks from 0 to 1 >> > > would have reset inode 1101877 nlinks from 0 to 1 >> > > would have reset inode 1126709 nlinks from 0 to 1 >> > > would have reset inode 1134389 nlinks from 0 to 1 >> > > would have reset inode 1141045 nlinks from 0 to 1 >> > > would have reset inode 1141557 nlinks from 0 to 1 >> > > would have reset inode 1142581 nlinks from 0 to 1 >> > > would have reset inode 1148469 nlinks from 0 to 1 >> > > would have reset inode 1153333 nlinks from 0 to 1 >> > > would have reset inode 1181749 nlinks from 0 to 1 >> > > would have reset inode 1192245 nlinks from 0 to 1 >> > > would have reset inode 1198133 nlinks from 0 to 1 >> > > would have reset inode 1203765 nlinks from 0 to 1 >> > > would have reset inode 1221429 nlinks from 0 to 1 >> > > would have reset inode 1223989 nlinks from 0 to 1 >> > > would have reset inode 1235509 nlinks from 0 to 1 >> > > would have reset inode 1239349 nlinks from 0 to 1 >> > > would have reset inode 1240885 nlinks from 0 to 1 >> > > would have reset inode 1241397 nlinks from 0 to 1 >> > > would have reset inode 1241909 nlinks from 0 to 1 >> > > would have reset inode 1242421 nlinks from 0 to 1 >> > > would have reset inode 1244981 nlinks from 0 to 1 >> > > would have reset inode 1246517 nlinks from 0 to 1 >> > > would have reset inode 1253429 nlinks from 0 to 1 >> > > would have reset inode 1271861 nlinks from 0 to 1 >> > > would have reset inode 1274677 nlinks from 0 to 1 >> > > would have reset inode 1277749 nlinks from 0 to 1 >> > > would have reset inode 1278773 nlinks from 0 to 1 >> > > would have reset inode 1286709 nlinks from 0 to 1 >> > > would have reset inode 1288245 nlinks from 0 to 1 >> > > would have reset inode 1299765 nlinks from 0 to 1 >> > > would have reset inode 1302325 nlinks from 0 to 1 >> > > would have reset inode 1304885 nlinks from 0 to 1 >> > > would have reset inode 1305397 nlinks from 0 to 1 >> > > would have reset inode 1307509 nlinks from 0 to 1 >> > > would have reset inode 1309493 nlinks from 0 to 1 >> > > would have reset inode 1310517 nlinks from 0 to 1 >> > > would have reset inode 1311029 nlinks from 0 to 1 >> > > would have reset inode 1312053 nlinks from 0 to 1 >> > > would have reset inode 1316917 nlinks from 0 to 1 >> > > would have reset inode 1317941 nlinks from 0 to 1 >> > > would have reset inode 1320821 nlinks from 0 to 1 >> > > would have reset inode 1322805 nlinks from 0 to 1 >> > > would have reset inode 1332789 nlinks from 0 to 1 >> > > would have reset inode 1336373 nlinks from 0 to 1 >> > > would have reset inode 1345653 nlinks from 0 to 1 >> > > would have reset inode 1354549 nlinks from 0 to 1 >> > > would have reset inode 1361973 nlinks from 0 to 1 >> > > would have reset inode 1369909 nlinks from 0 to 1 >> > > would have reset inode 1372981 nlinks from 0 to 1 >> > > would have reset inode 1388853 nlinks from 0 to 1 >> > > would have reset inode 1402933 nlinks from 0 to 1 >> > > would have reset inode 1403445 nlinks from 0 to 1 >> > > would have reset inode 1420085 nlinks from 0 to 1 >> > > would have reset inode 1452853 nlinks from 0 to 1 >> > > would have reset inode 1456437 nlinks from 0 to 1 >> > > would have reset inode 1457973 nlinks from 0 to 1 >> > > would have reset inode 1459253 nlinks from 0 to 1 >> > > would have reset inode 1467957 nlinks from 0 to 1 >> > > would have reset inode 1471541 nlinks from 0 to 1 >> > > would have reset inode 1476661 nlinks from 0 to 1 >> > > would have reset inode 1479733 nlinks from 0 to 1 >> > > would have reset inode 1483061 nlinks from 0 to 1 >> > > would have reset inode 1484085 nlinks from 0 to 1 >> > > would have reset inode 1486133 nlinks from 0 to 1 >> > > would have reset inode 1489461 nlinks from 0 to 1 >> > > would have reset inode 1490037 nlinks from 0 to 1 >> > > would have reset inode 1492021 nlinks from 0 to 1 >> > > would have reset inode 1493557 nlinks from 0 to 1 >> > > would have reset inode 1494069 nlinks from 0 to 1 >> > > would have reset inode 1496885 nlinks from 0 to 1 >> > > would have reset inode 1498421 nlinks from 0 to 1 >> > > would have reset inode 1498933 nlinks from 0 to 1 >> > > would have reset inode 1499957 nlinks from 0 to 1 >> > > would have reset inode 1506101 nlinks from 0 to 1 >> > > would have reset inode 1507637 nlinks from 0 to 1 >> > > would have reset inode 1510453 nlinks from 0 to 1 >> > > would have reset inode 1514293 nlinks from 0 to 1 >> > > would have reset inode 1517365 nlinks from 0 to 1 >> > > would have reset inode 1520693 nlinks from 0 to 1 >> > > would have reset inode 1521973 nlinks from 0 to 1 >> > > would have reset inode 1530421 nlinks from 0 to 1 >> > > would have reset inode 1530933 nlinks from 0 to 1 >> > > would have reset inode 1537333 nlinks from 0 to 1 >> > > would have reset inode 1538357 nlinks from 0 to 1 >> > > would have reset inode 1548853 nlinks from 0 to 1 >> > > would have reset inode 1553973 nlinks from 0 to 1 >> > > would have reset inode 1557301 nlinks from 0 to 1 >> > > would have reset inode 1564213 nlinks from 0 to 1 >> > > would have reset inode 1564725 nlinks from 0 to 1 >> > > would have reset inode 1576501 nlinks from 0 to 1 >> > > would have reset inode 1580597 nlinks from 0 to 1 >> > > would have reset inode 1584693 nlinks from 0 to 1 >> > > would have reset inode 1586485 nlinks from 0 to 1 >> > > would have reset inode 1589301 nlinks from 0 to 1 >> > > would have reset inode 1589813 nlinks from 0 to 1 >> > > would have reset inode 1592629 nlinks from 0 to 1 >> > > would have reset inode 1595701 nlinks from 0 to 1 >> > > would have reset inode 1601077 nlinks from 0 to 1 >> > > would have reset inode 1623861 nlinks from 0 to 1 >> > > would have reset inode 1626677 nlinks from 0 to 1 >> > > would have reset inode 1627701 nlinks from 0 to 1 >> > > would have reset inode 1633333 nlinks from 0 to 1 >> > > would have reset inode 1639221 nlinks from 0 to 1 >> > > would have reset inode 1649205 nlinks from 0 to 1 >> > > would have reset inode 1686325 nlinks from 0 to 1 >> > > would have reset inode 1690677 nlinks from 0 to 1 >> > > would have reset inode 1693749 nlinks from 0 to 1 >> > > would have reset inode 1704757 nlinks from 0 to 1 >> > > would have reset inode 1707061 nlinks from 0 to 1 >> > > would have reset inode 1709109 nlinks from 0 to 1 >> > > would have reset inode 1719349 nlinks from 0 to 1 >> > > would have reset inode 1737013 nlinks from 0 to 1 >> > > would have reset inode 1741365 nlinks from 0 to 1 >> > > would have reset inode 1747509 nlinks from 0 to 1 >> > > would have reset inode 1770805 nlinks from 0 to 1 >> > > would have reset inode 1780789 nlinks from 0 to 1 >> > > would have reset inode 1793589 nlinks from 0 to 1 >> > > would have reset inode 1795125 nlinks from 0 to 1 >> > > would have reset inode 1800757 nlinks from 0 to 1 >> > > would have reset inode 1801269 nlinks from 0 to 1 >> > > would have reset inode 1802549 nlinks from 0 to 1 >> > > would have reset inode 1804085 nlinks from 0 to 1 >> > > would have reset inode 1817141 nlinks from 0 to 1 >> > > would have reset inode 1821749 nlinks from 0 to 1 >> > > would have reset inode 1832757 nlinks from 0 to 1 >> > > would have reset inode 1836341 nlinks from 0 to 1 >> > > would have reset inode 1856309 nlinks from 0 to 1 >> > > would have reset inode 1900597 nlinks from 0 to 1 >> > > would have reset inode 1902901 nlinks from 0 to 1 >> > > would have reset inode 1912373 nlinks from 0 to 1 >> > > would have reset inode 1943093 nlinks from 0 to 1 >> > > would have reset inode 1944373 nlinks from 0 to 1 >> > > would have reset inode 1954101 nlinks from 0 to 1 >> > > would have reset inode 1955893 nlinks from 0 to 1 >> > > would have reset inode 1961781 nlinks from 0 to 1 >> > > would have reset inode 1974325 nlinks from 0 to 1 >> > > would have reset inode 1978677 nlinks from 0 to 1 >> > > would have reset inode 1981237 nlinks from 0 to 1 >> > > would have reset inode 1992245 nlinks from 0 to 1 >> > > would have reset inode 2000949 nlinks from 0 to 1 >> > > would have reset inode 2002229 nlinks from 0 to 1 >> > > would have reset inode 2004789 nlinks from 0 to 1 >> > > would have reset inode 2005301 nlinks from 0 to 1 >> > > would have reset inode 2011189 nlinks from 0 to 1 >> > > would have reset inode 2012981 nlinks from 0 to 1 >> > > would have reset inode 2015285 nlinks from 0 to 1 >> > > would have reset inode 2018869 nlinks from 0 to 1 >> > > would have reset inode 2028341 nlinks from 0 to 1 >> > > would have reset inode 2028853 nlinks from 0 to 1 >> > > would have reset inode 2030901 nlinks from 0 to 1 >> > > would have reset inode 2032181 nlinks from 0 to 1 >> > > would have reset inode 2032693 nlinks from 0 to 1 >> > > would have reset inode 2040117 nlinks from 0 to 1 >> > > would have reset inode 2053685 nlinks from 0 to 1 >> > > would have reset inode 2083893 nlinks from 0 to 1 >> > > would have reset inode 2087221 nlinks from 0 to 1 >> > > would have reset inode 2095925 nlinks from 0 to 1 >> > > would have reset inode 2098741 nlinks from 0 to 1 >> > > would have reset inode 2100533 nlinks from 0 to 1 >> > > would have reset inode 2101301 nlinks from 0 to 1 >> > > would have reset inode 2123573 nlinks from 0 to 1 >> > > would have reset inode 2132789 nlinks from 0 to 1 >> > > would have reset inode 2133813 nlinks from 0 to 1 >> > > >> > > >> > > >> > > >> > > >> > > 2013/4/10 =B7=FB=D3=C0=CC=CE >> > >> >> > > >> > > The storage info is as following: >> > > RAID-6 >> > > SATA HDD >> > > Controller: PERC H710P Mini (Embedded) >> > > Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes >> > > 255 heads, 63 sectors/track, 3647334 cylinders >> > > Units =3D cylinders of 16065 * 512 =3D 8225280 bytes >> > > Sector size (logical/physical): 512 bytes / 512 bytes >> > > I/O size (minimum/optimal): 512 bytes / 512 bytes >> > > Disk identifier: 0x00000000 >> > > >> > > sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (30.0 >> > TB/27.2 >> > > TiB) >> > > sd 0:2:1:0: [sdb] Write Protect is off >> > > sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08 >> > > sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enabled, >> > doesn't >> > > support DPO or FUA >> > > sd 0:2:1:0: [sdb] Attached SCSI disk >> > > >> > > *-storage >> > > description: RAID bus controller >> > > product: MegaRAID SAS 2208 [Thunderbolt] >> > > vendor: LSI Logic / Symbios Logic >> > > physical id: 0 >> > > bus info: pci@0000:02:00.0 >> > > logical name: scsi0 >> > > version: 01 >> > > width: 64 bits >> > > clock: 33MHz >> > > capabilities: storage pm pciexpress vpd msi msix >> bus_master >> > > cap_list rom >> > > configuration: driver=3Dmegaraid_sas latency=3D0 >> > > resources: irq:42 ioport:fc00(size=3D256) >> > > memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff >> > > memory:dc800000-dc81ffff(prefetchable) >> > > *-disk:0 >> > > description: SCSI Disk >> > > product: PERC H710P >> > > vendor: DELL >> > > physical id: 2.0.0 >> > > bus info: scsi@0:2.0.0 >> > > logical name: /dev/sda >> > > version: 3.13 >> > > serial: 0049d6ce1d9f2035180096fde490f648 >> > > size: 558GiB (599GB) >> > > capabilities: partitioned partitioned:dos >> > > configuration: ansiversion=3D5 signature=3D000aa33= 6 >> > > *-disk:1 >> > > description: SCSI Disk >> > > product: PERC H710P >> > > vendor: DELL >> > > physical id: 2.1.0 >> > > bus info: scsi@0:2.1.0 >> > > logical name: /dev/sdb >> > > logical name: /mnt/xfsd >> > > version: 3.13 >> > > serial: 003366f71da22035180096fde490f648 >> > > size: 27TiB (30TB) >> > > configuration: ansiversion=3D5 mount.fstype=3Dxfs >> > > >> > >> mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,sw= idth=3D1280,noquota >> > > state=3Dmounted >> > > >> > > Thank you. >> > > >> > > >> > > 2013/4/10 Emmanuel Florac > > >> > > > >>> >> > > >> > > Le Tue, 9 Apr 2013 23:10:03 +0800 >> > > =B7=FB=D3=C0=CC=CE >> > >> >> =A8=A6crivait: >> > > >> > > > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error >> > Detected. >> > > > > Shutting down filesystem >> > > >> > > This. I/O error detected. That means that at some point >> the >> > > underlying >> > > device (disk, RAID array, SAN volume) couldn't be reache= d. >> > So this >> > > could very well be a case of a flakey drive, array, cabl= e >> > or SCSI >> > > driver. >> > > >> > > What's the storage setup here? >> > > >> > > -- >> > > >> > >> ------------------------------------------------------------------------ >> > > Emmanuel Florac | Direction technique >> > > | Intellique >> > > | > > >> > > > > >> >> > > | +33 1 78 94 84 02 >> > >> > > >> > >> ------------------------------------------------------------------------ >> > > >> > > >> > > >> > > >> > > -- >> > > =B7=FB=D3=C0=CC=CE >> > > >> > > >> > > >> > > >> > > -- >> > > =B7=FB=D3=C0=CC=CE >> > > >> > > >> > > _______________________________________________ >> > > xfs mailing list >> > > xfs@oss.sgi.com >> > > http://oss.sgi.com/mailman/listinfo/xfs >> > > >> > >> > >> > >> > >> > -- >> > =B7=FB=D3=C0=CC=CE >> > >> > >> > _______________________________________________ >> > xfs mailing list >> > xfs@oss.sgi.com >> > http://oss.sgi.com/mailman/listinfo/xfs >> > >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --089e0111e0740925d704da2a2a7b Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
And I'm not sure what kind of information is impo= rtant to debug this issue?
Thank you.


2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
The xfs shutdown = error is always the same. (It happens about 20 times on about 50 servers du= ring last half year)
Recently the shutdown happens on the cluster with 24 servers(dis 8 * replic= a 3) during rebalance. The average work load of this cluster is more than 3= TB growth per day.
The work load including normal fops, rsync jobs, video encoding/decoding, l= ogging etc. through glusterfs native client of hundreds of machines.
The shutdown tend to happen when we run rebalance for the glusterfs clu= ster which I guess will trigger a lot of unlink operations?

Thank you very much. May be I can try to collect more logs with a= modified kernel package.



2013/4/12 Brian Foster <bfoster@redhat.com>
On 04/11/2013 08:45 PM, =B7=FB=D3=C0=CC= =CE wrote:
> the workload is about:
> 24 servers, replica(3) which means the distribute is 8
> load is about 3(TB)-8(TB) per day.
>

This describes your cluster, but not the workload (though cluster inf= o
is good too). What kind of workload is running on your clients (i.e.,
rsync jobs, etc.)? Are you running through native gluster mount points,
NFS mounts or a mix? Do you have any gluster internal operations running (i.e., rebalance, etc.).

Is there any kind of pattern you can discern from the workload and when
the XFS error happens to occur? You have a good number of servers in
play here, is there any kind of pattern in terms of which servers
experience the error? Is it always the same servers or a random set?

Brian

>
> 2013/4/12 Brian Foster <bfoster@redhat.com <mailto:bfoster@redhat.com>>
>
>     On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote:
>     > It happens tonight again on one of our servers, how= to debug the root
>     > cause? Thank you.
>     >
>
>     Hi,
>
>     I've attached a system tap script (stap -v xfs.stp) = that should
>     hopefully print out a bit more data should the issue hap= pen again. Do
>     you have a small enough number of nodes (or predictable = enough pattern)
>     that you could run this on the nodes that tend to fail a= nd collect the
>     output?
>
>     Also, could you collect an xfs_metadump of the filesyste= m in question
>     and make it available for download and analysis somewher= e? I believe the
>     ideal approach is to mount/umount the filesystem first t= o replay the log
>     before collecting a metadump, but somebody could correct= me on that (to
>     be safe, you could collect multiple dumps: pre-mount and= post-mount).
>
>     Could you also describe your workload a little bit? Than= ks.
>
>     Brian
>
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink= _remove:
>     > xfs_inotobp() returned error 22.
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactiv= e: xfs_ifree
>     returned
>     > error 22
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_forc= e_shutdown(0x1)
>     > called from line 1184 of file fs/xfs/xfs_vnodeops.c= .  Return address =3D
>     > 0xffffffffa02ee20a
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error D= etected. Shutting
>     > down filesystem
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umou= nt the
>     filesystem and
>     > rectify the problem(s)
>     > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     >
>     > xfs_repair -n
>     >
>     >
>     > Phase 7 - verify link counts...
>     > would have reset inode 20021 nlinks from 0 to 1
>     > would have reset inode 20789 nlinks from 0 to 1
>     > would have reset inode 35125 nlinks from 0 to 1
>     > would have reset inode 35637 nlinks from 0 to 1
>     > would have reset inode 36149 nlinks from 0 to 1
>     > would have reset inode 38197 nlinks from 0 to 1
>     > would have reset inode 39477 nlinks from 0 to 1
>     > would have reset inode 54069 nlinks from 0 to 1
>     > would have reset inode 62261 nlinks from 0 to 1
>     > would have reset inode 63029 nlinks from 0 to 1
>     > would have reset inode 72501 nlinks from 0 to 1
>     > would have reset inode 79925 nlinks from 0 to 1
>     > would have reset inode 81205 nlinks from 0 to 1
>     > would have reset inode 84789 nlinks from 0 to 1
>     > would have reset inode 87861 nlinks from 0 to 1
>     > would have reset inode 90663 nlinks from 0 to 1
>     > would have reset inode 91189 nlinks from 0 to 1
>     > would have reset inode 95541 nlinks from 0 to 1
>     > would have reset inode 98101 nlinks from 0 to 1
>     > would have reset inode 101173 nlinks from 0 to 1 >     > would have reset inode 113205 nlinks from 0 to 1 >     > would have reset inode 114741 nlinks from 0 to 1 >     > would have reset inode 126261 nlinks from 0 to 1 >     > would have reset inode 140597 nlinks from 0 to 1 >     > would have reset inode 144693 nlinks from 0 to 1 >     > would have reset inode 147765 nlinks from 0 to 1 >     > would have reset inode 152885 nlinks from 0 to 1 >     > would have reset inode 161333 nlinks from 0 to 1 >     > would have reset inode 161845 nlinks from 0 to 1 >     > would have reset inode 167477 nlinks from 0 to 1 >     > would have reset inode 172341 nlinks from 0 to 1 >     > would have reset inode 191797 nlinks from 0 to 1 >     > would have reset inode 204853 nlinks from 0 to 1 >     > would have reset inode 205365 nlinks from 0 to 1 >     > would have reset inode 215349 nlinks from 0 to 1 >     > would have reset inode 215861 nlinks from 0 to 1 >     > would have reset inode 216373 nlinks from 0 to 1 >     > would have reset inode 217397 nlinks from 0 to 1 >     > would have reset inode 224309 nlinks from 0 to 1 >     > would have reset inode 225589 nlinks from 0 to 1 >     > would have reset inode 234549 nlinks from 0 to 1 >     > would have reset inode 234805 nlinks from 0 to 1 >     > would have reset inode 249653 nlinks from 0 to 1 >     > would have reset inode 250677 nlinks from 0 to 1 >     > would have reset inode 252469 nlinks from 0 to 1 >     > would have reset inode 261429 nlinks from 0 to 1 >     > would have reset inode 265013 nlinks from 0 to 1 >     > would have reset inode 266805 nlinks from 0 to 1 >     > would have reset inode 267317 nlinks from 0 to 1 >     > would have reset inode 268853 nlinks from 0 to 1 >     > would have reset inode 272437 nlinks from 0 to 1 >     > would have reset inode 273205 nlinks from 0 to 1 >     > would have reset inode 274229 nlinks from 0 to 1 >     > would have reset inode 278325 nlinks from 0 to 1 >     > would have reset inode 278837 nlinks from 0 to 1 >     > would have reset inode 281397 nlinks from 0 to 1 >     > would have reset inode 292661 nlinks from 0 to 1 >     > would have reset inode 300853 nlinks from 0 to 1 >     > would have reset inode 302901 nlinks from 0 to 1 >     > would have reset inode 305205 nlinks from 0 to 1 >     > would have reset inode 314165 nlinks from 0 to 1 >     > would have reset inode 315189 nlinks from 0 to 1 >     > would have reset inode 320309 nlinks from 0 to 1 >     > would have reset inode 324917 nlinks from 0 to 1 >     > would have reset inode 328245 nlinks from 0 to 1 >     > would have reset inode 335925 nlinks from 0 to 1 >     > would have reset inode 339253 nlinks from 0 to 1 >     > would have reset inode 339765 nlinks from 0 to 1 >     > would have reset inode 348213 nlinks from 0 to 1 >     > would have reset inode 360501 nlinks from 0 to 1 >     > would have reset inode 362037 nlinks from 0 to 1 >     > would have reset inode 366389 nlinks from 0 to 1 >     > would have reset inode 385845 nlinks from 0 to 1 >     > would have reset inode 390709 nlinks from 0 to 1 >     > would have reset inode 409141 nlinks from 0 to 1 >     > would have reset inode 413237 nlinks from 0 to 1 >     > would have reset inode 414773 nlinks from 0 to 1 >     > would have reset inode 417845 nlinks from 0 to 1 >     > would have reset inode 436021 nlinks from 0 to 1 >     > would have reset inode 439349 nlinks from 0 to 1 >     > would have reset inode 447029 nlinks from 0 to 1 >     > would have reset inode 491317 nlinks from 0 to 1 >     > would have reset inode 494133 nlinks from 0 to 1 >     > would have reset inode 495413 nlinks from 0 to 1 >     > would have reset inode 501301 nlinks from 0 to 1 >     > would have reset inode 506421 nlinks from 0 to 1 >     > would have reset inode 508469 nlinks from 0 to 1 >     > would have reset inode 508981 nlinks from 0 to 1 >     > would have reset inode 511797 nlinks from 0 to 1 >     > would have reset inode 513077 nlinks from 0 to 1 >     > would have reset inode 517941 nlinks from 0 to 1 >     > would have reset inode 521013 nlinks from 0 to 1 >     > would have reset inode 522805 nlinks from 0 to 1 >     > would have reset inode 523317 nlinks from 0 to 1 >     > would have reset inode 525621 nlinks from 0 to 1 >     > would have reset inode 527925 nlinks from 0 to 1 >     > would have reset inode 535605 nlinks from 0 to 1 >     > would have reset inode 541749 nlinks from 0 to 1 >     > would have reset inode 573493 nlinks from 0 to 1 >     > would have reset inode 578613 nlinks from 0 to 1 >     > would have reset inode 583029 nlinks from 0 to 1 >     > would have reset inode 585525 nlinks from 0 to 1 >     > would have reset inode 586293 nlinks from 0 to 1 >     > would have reset inode 586805 nlinks from 0 to 1 >     > would have reset inode 591413 nlinks from 0 to 1 >     > would have reset inode 594485 nlinks from 0 to 1 >     > would have reset inode 596277 nlinks from 0 to 1 >     > would have reset inode 603189 nlinks from 0 to 1 >     > would have reset inode 613429 nlinks from 0 to 1 >     > would have reset inode 617781 nlinks from 0 to 1 >     > would have reset inode 621877 nlinks from 0 to 1 >     > would have reset inode 623925 nlinks from 0 to 1 >     > would have reset inode 625205 nlinks from 0 to 1 >     > would have reset inode 626741 nlinks from 0 to 1 >     > would have reset inode 639541 nlinks from 0 to 1 >     > would have reset inode 640053 nlinks from 0 to 1 >     > would have reset inode 640565 nlinks from 0 to 1 >     > would have reset inode 645173 nlinks from 0 to 1 >     > would have reset inode 652853 nlinks from 0 to 1 >     > would have reset inode 656181 nlinks from 0 to 1 >     > would have reset inode 659253 nlinks from 0 to 1 >     > would have reset inode 663605 nlinks from 0 to 1 >     > would have reset inode 667445 nlinks from 0 to 1 >     > would have reset inode 680757 nlinks from 0 to 1 >     > would have reset inode 691253 nlinks from 0 to 1 >     > would have reset inode 691765 nlinks from 0 to 1 >     > would have reset inode 697653 nlinks from 0 to 1 >     > would have reset inode 700469 nlinks from 0 to 1 >     > would have reset inode 707893 nlinks from 0 to 1 >     > would have reset inode 716853 nlinks from 0 to 1 >     > would have reset inode 722229 nlinks from 0 to 1 >     > would have reset inode 722741 nlinks from 0 to 1 >     > would have reset inode 723765 nlinks from 0 to 1 >     > would have reset inode 731957 nlinks from 0 to 1 >     > would have reset inode 742965 nlinks from 0 to 1 >     > would have reset inode 743477 nlinks from 0 to 1 >     > would have reset inode 745781 nlinks from 0 to 1 >     > would have reset inode 746293 nlinks from 0 to 1 >     > would have reset inode 774453 nlinks from 0 to 1 >     > would have reset inode 778805 nlinks from 0 to 1 >     > would have reset inode 785013 nlinks from 0 to 1 >     > would have reset inode 785973 nlinks from 0 to 1 >     > would have reset inode 791349 nlinks from 0 to 1 >     > would have reset inode 796981 nlinks from 0 to 1 >     > would have reset inode 803381 nlinks from 0 to 1 >     > would have reset inode 806965 nlinks from 0 to 1 >     > would have reset inode 811798 nlinks from 0 to 1 >     > would have reset inode 812310 nlinks from 0 to 1 >     > would have reset inode 813078 nlinks from 0 to 1 >     > would have reset inode 813607 nlinks from 0 to 1 >     > would have reset inode 814183 nlinks from 0 to 1 >     > would have reset inode 822069 nlinks from 0 to 1 >     > would have reset inode 828469 nlinks from 0 to 1 >     > would have reset inode 830005 nlinks from 0 to 1 >     > would have reset inode 832053 nlinks from 0 to 1 >     > would have reset inode 832565 nlinks from 0 to 1 >     > would have reset inode 836661 nlinks from 0 to 1 >     > would have reset inode 841013 nlinks from 0 to 1 >     > would have reset inode 841525 nlinks from 0 to 1 >     > would have reset inode 845365 nlinks from 0 to 1 >     > would have reset inode 846133 nlinks from 0 to 1 >     > would have reset inode 847157 nlinks from 0 to 1 >     > would have reset inode 852533 nlinks from 0 to 1 >     > would have reset inode 857141 nlinks from 0 to 1 >     > would have reset inode 863271 nlinks from 0 to 1 >     > would have reset inode 866855 nlinks from 0 to 1 >     > would have reset inode 887861 nlinks from 0 to 1 >     > would have reset inode 891701 nlinks from 0 to 1 >     > would have reset inode 894773 nlinks from 0 to 1 >     > would have reset inode 900149 nlinks from 0 to 1 >     > would have reset inode 902197 nlinks from 0 to 1 >     > would have reset inode 906293 nlinks from 0 to 1 >     > would have reset inode 906805 nlinks from 0 to 1 >     > would have reset inode 909877 nlinks from 0 to 1 >     > would have reset inode 925493 nlinks from 0 to 1 >     > would have reset inode 949543 nlinks from 0 to 1 >     > would have reset inode 955175 nlinks from 0 to 1 >     > would have reset inode 963623 nlinks from 0 to 1 >     > would have reset inode 967733 nlinks from 0 to 1 >     > would have reset inode 968231 nlinks from 0 to 1 >     > would have reset inode 982069 nlinks from 0 to 1 >     > would have reset inode 1007413 nlinks from 0 to 1 >     > would have reset inode 1011509 nlinks from 0 to 1 >     > would have reset inode 1014069 nlinks from 0 to 1 >     > would have reset inode 1014581 nlinks from 0 to 1 >     > would have reset inode 1022005 nlinks from 0 to 1 >     > would have reset inode 1022517 nlinks from 0 to 1 >     > would have reset inode 1023029 nlinks from 0 to 1 >     > would have reset inode 1025333 nlinks from 0 to 1 >     > would have reset inode 1043765 nlinks from 0 to 1 >     > would have reset inode 1044789 nlinks from 0 to 1 >     > would have reset inode 1049397 nlinks from 0 to 1 >     > would have reset inode 1050933 nlinks from 0 to 1 >     > would have reset inode 1051445 nlinks from 0 to 1 >     > would have reset inode 1054261 nlinks from 0 to 1 >     > would have reset inode 1060917 nlinks from 0 to 1 >     > would have reset inode 1063477 nlinks from 0 to 1 >     > would have reset inode 1076021 nlinks from 0 to 1 >     > would have reset inode 1081141 nlinks from 0 to 1 >     > would have reset inode 1086261 nlinks from 0 to 1 >     > would have reset inode 1097269 nlinks from 0 to 1 >     > would have reset inode 1099829 nlinks from 0 to 1 >     > would have reset inode 1100853 nlinks from 0 to 1 >     > would have reset inode 1101877 nlinks from 0 to 1 >     > would have reset inode 1126709 nlinks from 0 to 1 >     > would have reset inode 1134389 nlinks from 0 to 1 >     > would have reset inode 1141045 nlinks from 0 to 1 >     > would have reset inode 1141557 nlinks from 0 to 1 >     > would have reset inode 1142581 nlinks from 0 to 1 >     > would have reset inode 1148469 nlinks from 0 to 1 >     > would have reset inode 1153333 nlinks from 0 to 1 >     > would have reset inode 1181749 nlinks from 0 to 1 >     > would have reset inode 1192245 nlinks from 0 to 1 >     > would have reset inode 1198133 nlinks from 0 to 1 >     > would have reset inode 1203765 nlinks from 0 to 1 >     > would have reset inode 1221429 nlinks from 0 to 1 >     > would have reset inode 1223989 nlinks from 0 to 1 >     > would have reset inode 1235509 nlinks from 0 to 1 >     > would have reset inode 1239349 nlinks from 0 to 1 >     > would have reset inode 1240885 nlinks from 0 to 1 >     > would have reset inode 1241397 nlinks from 0 to 1 >     > would have reset inode 1241909 nlinks from 0 to 1 >     > would have reset inode 1242421 nlinks from 0 to 1 >     > would have reset inode 1244981 nlinks from 0 to 1 >     > would have reset inode 1246517 nlinks from 0 to 1 >     > would have reset inode 1253429 nlinks from 0 to 1 >     > would have reset inode 1271861 nlinks from 0 to 1 >     > would have reset inode 1274677 nlinks from 0 to 1 >     > would have reset inode 1277749 nlinks from 0 to 1 >     > would have reset inode 1278773 nlinks from 0 to 1 >     > would have reset inode 1286709 nlinks from 0 to 1 >     > would have reset inode 1288245 nlinks from 0 to 1 >     > would have reset inode 1299765 nlinks from 0 to 1 >     > would have reset inode 1302325 nlinks from 0 to 1 >     > would have reset inode 1304885 nlinks from 0 to 1 >     > would have reset inode 1305397 nlinks from 0 to 1 >     > would have reset inode 1307509 nlinks from 0 to 1 >     > would have reset inode 1309493 nlinks from 0 to 1 >     > would have reset inode 1310517 nlinks from 0 to 1 >     > would have reset inode 1311029 nlinks from 0 to 1 >     > would have reset inode 1312053 nlinks from 0 to 1 >     > would have reset inode 1316917 nlinks from 0 to 1 >     > would have reset inode 1317941 nlinks from 0 to 1 >     > would have reset inode 1320821 nlinks from 0 to 1 >     > would have reset inode 1322805 nlinks from 0 to 1 >     > would have reset inode 1332789 nlinks from 0 to 1 >     > would have reset inode 1336373 nlinks from 0 to 1 >     > would have reset inode 1345653 nlinks from 0 to 1 >     > would have reset inode 1354549 nlinks from 0 to 1 >     > would have reset inode 1361973 nlinks from 0 to 1 >     > would have reset inode 1369909 nlinks from 0 to 1 >     > would have reset inode 1372981 nlinks from 0 to 1 >     > would have reset inode 1388853 nlinks from 0 to 1 >     > would have reset inode 1402933 nlinks from 0 to 1 >     > would have reset inode 1403445 nlinks from 0 to 1 >     > would have reset inode 1420085 nlinks from 0 to 1 >     > would have reset inode 1452853 nlinks from 0 to 1 >     > would have reset inode 1456437 nlinks from 0 to 1 >     > would have reset inode 1457973 nlinks from 0 to 1 >     > would have reset inode 1459253 nlinks from 0 to 1 >     > would have reset inode 1467957 nlinks from 0 to 1 >     > would have reset inode 1471541 nlinks from 0 to 1 >     > would have reset inode 1476661 nlinks from 0 to 1 >     > would have reset inode 1479733 nlinks from 0 to 1 >     > would have reset inode 1483061 nlinks from 0 to 1 >     > would have reset inode 1484085 nlinks from 0 to 1 >     > would have reset inode 1486133 nlinks from 0 to 1 >     > would have reset inode 1489461 nlinks from 0 to 1 >     > would have reset inode 1490037 nlinks from 0 to 1 >     > would have reset inode 1492021 nlinks from 0 to 1 >     > would have reset inode 1493557 nlinks from 0 to 1 >     > would have reset inode 1494069 nlinks from 0 to 1 >     > would have reset inode 1496885 nlinks from 0 to 1 >     > would have reset inode 1498421 nlinks from 0 to 1 >     > would have reset inode 1498933 nlinks from 0 to 1 >     > would have reset inode 1499957 nlinks from 0 to 1 >     > would have reset inode 1506101 nlinks from 0 to 1 >     > would have reset inode 1507637 nlinks from 0 to 1 >     > would have reset inode 1510453 nlinks from 0 to 1 >     > would have reset inode 1514293 nlinks from 0 to 1 >     > would have reset inode 1517365 nlinks from 0 to 1 >     > would have reset inode 1520693 nlinks from 0 to 1 >     > would have reset inode 1521973 nlinks from 0 to 1 >     > would have reset inode 1530421 nlinks from 0 to 1 >     > would have reset inode 1530933 nlinks from 0 to 1 >     > would have reset inode 1537333 nlinks from 0 to 1 >     > would have reset inode 1538357 nlinks from 0 to 1 >     > would have reset inode 1548853 nlinks from 0 to 1 >     > would have reset inode 1553973 nlinks from 0 to 1 >     > would have reset inode 1557301 nlinks from 0 to 1 >     > would have reset inode 1564213 nlinks from 0 to 1 >     > would have reset inode 1564725 nlinks from 0 to 1 >     > would have reset inode 1576501 nlinks from 0 to 1 >     > would have reset inode 1580597 nlinks from 0 to 1 >     > would have reset inode 1584693 nlinks from 0 to 1 >     > would have reset inode 1586485 nlinks from 0 to 1 >     > would have reset inode 1589301 nlinks from 0 to 1 >     > would have reset inode 1589813 nlinks from 0 to 1 >     > would have reset inode 1592629 nlinks from 0 to 1 >     > would have reset inode 1595701 nlinks from 0 to 1 >     > would have reset inode 1601077 nlinks from 0 to 1 >     > would have reset inode 1623861 nlinks from 0 to 1 >     > would have reset inode 1626677 nlinks from 0 to 1 >     > would have reset inode 1627701 nlinks from 0 to 1 >     > would have reset inode 1633333 nlinks from 0 to 1 >     > would have reset inode 1639221 nlinks from 0 to 1 >     > would have reset inode 1649205 nlinks from 0 to 1 >     > would have reset inode 1686325 nlinks from 0 to 1 >     > would have reset inode 1690677 nlinks from 0 to 1 >     > would have reset inode 1693749 nlinks from 0 to 1 >     > would have reset inode 1704757 nlinks from 0 to 1 >     > would have reset inode 1707061 nlinks from 0 to 1 >     > would have reset inode 1709109 nlinks from 0 to 1 >     > would have reset inode 1719349 nlinks from 0 to 1 >     > would have reset inode 1737013 nlinks from 0 to 1 >     > would have reset inode 1741365 nlinks from 0 to 1 >     > would have reset inode 1747509 nlinks from 0 to 1 >     > would have reset inode 1770805 nlinks from 0 to 1 >     > would have reset inode 1780789 nlinks from 0 to 1 >     > would have reset inode 1793589 nlinks from 0 to 1 >     > would have reset inode 1795125 nlinks from 0 to 1 >     > would have reset inode 1800757 nlinks from 0 to 1 >     > would have reset inode 1801269 nlinks from 0 to 1 >     > would have reset inode 1802549 nlinks from 0 to 1 >     > would have reset inode 1804085 nlinks from 0 to 1 >     > would have reset inode 1817141 nlinks from 0 to 1 >     > would have reset inode 1821749 nlinks from 0 to 1 >     > would have reset inode 1832757 nlinks from 0 to 1 >     > would have reset inode 1836341 nlinks from 0 to 1 >     > would have reset inode 1856309 nlinks from 0 to 1 >     > would have reset inode 1900597 nlinks from 0 to 1 >     > would have reset inode 1902901 nlinks from 0 to 1 >     > would have reset inode 1912373 nlinks from 0 to 1 >     > would have reset inode 1943093 nlinks from 0 to 1 >     > would have reset inode 1944373 nlinks from 0 to 1 >     > would have reset inode 1954101 nlinks from 0 to 1 >     > would have reset inode 1955893 nlinks from 0 to 1 >     > would have reset inode 1961781 nlinks from 0 to 1 >     > would have reset inode 1974325 nlinks from 0 to 1 >     > would have reset inode 1978677 nlinks from 0 to 1 >     > would have reset inode 1981237 nlinks from 0 to 1 >     > would have reset inode 1992245 nlinks from 0 to 1 >     > would have reset inode 2000949 nlinks from 0 to 1 >     > would have reset inode 2002229 nlinks from 0 to 1 >     > would have reset inode 2004789 nlinks from 0 to 1 >     > would have reset inode 2005301 nlinks from 0 to 1 >     > would have reset inode 2011189 nlinks from 0 to 1 >     > would have reset inode 2012981 nlinks from 0 to 1 >     > would have reset inode 2015285 nlinks from 0 to 1 >     > would have reset inode 2018869 nlinks from 0 to 1 >     > would have reset inode 2028341 nlinks from 0 to 1 >     > would have reset inode 2028853 nlinks from 0 to 1 >     > would have reset inode 2030901 nlinks from 0 to 1 >     > would have reset inode 2032181 nlinks from 0 to 1 >     > would have reset inode 2032693 nlinks from 0 to 1 >     > would have reset inode 2040117 nlinks from 0 to 1 >     > would have reset inode 2053685 nlinks from 0 to 1 >     > would have reset inode 2083893 nlinks from 0 to 1 >     > would have reset inode 2087221 nlinks from 0 to 1 >     > would have reset inode 2095925 nlinks from 0 to 1 >     > would have reset inode 2098741 nlinks from 0 to 1 >     > would have reset inode 2100533 nlinks from 0 to 1 >     > would have reset inode 2101301 nlinks from 0 to 1 >     > would have reset inode 2123573 nlinks from 0 to 1 >     > would have reset inode 2132789 nlinks from 0 to 1 >     > would have reset inode 2133813 nlinks from 0 to 1 >     >
>     >
>     >
>     >
>     >
>     > 2013/4/10 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:<= a href=3D"mailto:yongtaofu@gmail.com" target=3D"_blank">yongtaofu@gmail.com= >
>     <mailto:yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>>= ;
>     >
>     >     The storage info is as following:
>     >     RAID-6
>     >     SATA HDD
>     >     Controller: PERC H710P Mini (Embedded= )
>     >     Disk /dev/sdb: 30000.3 GB, 3000034656= 2560 bytes
>     >     255 heads, 63 sectors/track, 3647334 = cylinders
>     >     Units =3D cylinders of 16065 * 512 = =3D 8225280 bytes
>     >     Sector size (logical/physical): 512 b= ytes / 512 bytes
>     >     I/O size (minimum/optimal): 512 bytes= / 512 bytes
>     >     Disk identifier: 0x00000000
>     >
>     >     sd 0:2:1:0: [sdb] 58594426880 512-byt= e logical blocks: (30.0
>     TB/27.2
>     >     TiB)
>     >     sd 0:2:1:0: [sdb] Write Protect is of= f
>     >     sd 0:2:1:0: [sdb] Mode Sense: 1f 00 0= 0 08
>     >     sd 0:2:1:0: [sdb] Write cache: enable= d, read cache: enabled,
>     doesn't
>     >     support DPO or FUA
>     >     sd 0:2:1:0: [sdb] Attached SCSI disk<= br> >     >
>     >     *-storage
>     >            descriptio= n: RAID bus controller
>     >            product: M= egaRAID SAS 2208 [Thunderbolt]
>     >            vendor: LS= I Logic / Symbios Logic
>     >            physical i= d: 0
>     >            bus info: = pci@0000:02:00.0
>     >            logical na= me: scsi0
>     >            version: 0= 1
>     >            width: 64 = bits
>     >            clock: 33M= Hz
>     >            capabiliti= es: storage pm pciexpress vpd msi msix bus_master
>     >     cap_list rom
>     >            configurat= ion: driver=3Dmegaraid_sas latency=3D0
>     >            resources:= irq:42 ioport:fc00(size=3D256)
>     >     memory:dd7fc000-dd7fffff memory:dd780= 000-dd7bffff
>     >     memory:dc800000-dc81ffff(prefetchable= )
>     >          *-disk:0
>     >               de= scription: SCSI Disk
>     >               pr= oduct: PERC H710P
>     >               ve= ndor: DELL
>     >               ph= ysical id: 2.0.0
>     >               bu= s info: scsi@0:2.0.0
>     >               lo= gical name: /dev/sda
>     >               ve= rsion: 3.13
>     >               se= rial: 0049d6ce1d9f2035180096fde490f648
>     >               si= ze: 558GiB (599GB)
>     >               ca= pabilities: partitioned partitioned:dos
>     >               co= nfiguration: ansiversion=3D5 signature=3D000aa336
>     >          *-disk:1
>     >               de= scription: SCSI Disk
>     >               pr= oduct: PERC H710P
>     >               ve= ndor: DELL
>     >               ph= ysical id: 2.1.0
>     >               bu= s info: scsi@0:2.1.0
>     >               lo= gical name: /dev/sdb
>     >               lo= gical name: /mnt/xfsd
>     >               ve= rsion: 3.13
>     >               se= rial: 003366f71da22035180096fde490f648
>     >               si= ze: 27TiB (30TB)
>     >               co= nfiguration: ansiversion=3D5 mount.fstype=3Dxfs
>     >
>     mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64= k,sunit=3D128,swidth=3D1280,noquota
>     >     state=3Dmounted
>     >
>     >     Thank you.
>     >
>     >
>     >     2013/4/10 Emmanuel Florac <eflorac@intellique.com=
>     <mailto:eflorac@intellique.com>
>     >     <mailto:eflorac@intellique.com &l= t;mailto:eflora= c@intellique.com>>>
>     >
>     >         Le Tue, 9 Apr 2013 23:1= 0:03 +0800
>     >         =B7=FB=D3=C0=CC=CE <= yongtaofu@gmail.co= m <mailto:y= ongtaofu@gmail.com>
>     <mailto:yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>> =A8= =A6crivait:
>     >
>     >         > > Apr  9 1= 1:01:30 cqdx kernel: XFS (sdb): I/O Error
>     Detected.
>     >         > > Shutting down= filesystem
>     >
>     >         This. I/O error detecte= d. That means that at some point the
>     >         underlying
>     >         device (disk, RAID arra= y, SAN volume) couldn't be reached.
>     So this
>     >         could very well be a ca= se of a flakey drive, array, cable
>     or SCSI
>     >         driver.
>     >
>     >         What's the storage = setup here?
>     >
>     >         --
>     >
>     --------------------------------------------------------= ----------------
>     >         Emmanuel Florac   =   |   Direction technique
>     >               &n= bsp;             |   Intellique
>     >               &n= bsp;             |   <eflorac@intellique.com
>     <mailto:eflorac@intellique.com>
>     >         <mailto:eflorac@intellique.co= m
>     <mailto:eflorac@intellique.com>>>
>     >               &n= bsp;             |   +33 1 78 94 84 02
>     <tel:%2B33%201%2078%2094%2084%2002>
>     >
>     --------------------------------------------------------= ----------------
>     >
>     >
>     >
>     >
>     >     --
>     >     =B7=FB=D3=C0=CC=CE
>     >
>     >
>     >
>     >
>     > --
>     > =B7=FB=D3=C0=CC=CE
>     >
>     >
>     > _______________________________________________
>     > xfs mailing list
>     > xfs@oss.sgi.com <mailto:xfs@oss.sgi.com>
>     > http://oss.sgi.com/mailman/listinfo/xfs >     >
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE
>
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
>
= http://oss.sgi.com/mailman/listinfo/xfs
>




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--089e0111e0740925d704da2a2a7b-- From csmith@loomis-usd.k12.ca.us Fri Apr 12 08:50:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 396A529DFA for ; Fri, 12 Apr 2013 08:50:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 18970304043 for ; Fri, 12 Apr 2013 06:50:13 -0700 (PDT) X-ASG-Debug-ID: 1365774606-04bdf02d20f55a0001-w1Z2WR Received: from mail.loomis-usd.k12.ca.us (lusd-mail01.loomis-usd.k12.ca.us [137.164.230.67]) by cuda.sgi.com with ESMTP id dfVzEREdmzZArNgM (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 06:50:07 -0700 (PDT) X-Barracuda-Envelope-From: csmith@loomis-usd.k12.ca.us X-Barracuda-Apparent-Source-IP: 137.164.230.67 Received: from LUSD-MAIL01.lusd.local ([fe80::bd27:247d:610:b502]) by lusd-mail01.lusd.local ([fe80::bd27:247d:610:b502%13]) with mapi id 14.01.0438.000; Fri, 12 Apr 2013 06:50:05 -0700 From: "Smith, Chad" Subject: System Administrator Thread-Topic: System Administrator X-ASG-Orig-Subj: System Administrator Thread-Index: Ac43hAfzwyqile8yRAKl/DIyAEedkQ== Date: Fri, 12 Apr 2013 13:50:04 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.57.0.8] Content-Type: multipart/alternative; boundary="_000_A4C7CCED01E0A24F89CC7E3D544F04B1B10E1CE9lusdmail01lusdl_" MIME-Version: 1.0 X-Barracuda-Connect: lusd-mail01.loomis-usd.k12.ca.us[137.164.230.67] X-Barracuda-Start-Time: 1365774607 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.23 X-Barracuda-Spam-Status: No, SCORE=1.23 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_HEADERS, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; --_000_A4C7CCED01E0A24F89CC7E3D544F04B1B10E1CE9lusdmail01lusdl_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable You will not be able to send/receive more emails until you visit the below = helpdesk link to restore your email access. Copy/click http://minhareferencia.com/form/forms/form1.html System Administrator 201.286.2331 --_000_A4C7CCED01E0A24F89CC7E3D544F04B1B10E1CE9lusdmail01lusdl_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

You will not be able to send/receive more emails until you visit the bel= ow helpdesk link to restore your email access.

Copy/click = http://minhareferencia.com/form/forms/form1.html


System Administrator
201.286.2331

--_000_A4C7CCED01E0A24F89CC7E3D544F04B1B10E1CE9lusdmail01lusdl_-- From yongtaofu@gmail.com Fri Apr 12 08:52:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B465129DFA for ; Fri, 12 Apr 2013 08:52:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04707AC008 for ; Fri, 12 Apr 2013 06:52:04 -0700 (PDT) X-ASG-Debug-ID: 1365774720-04cbb057f5f6220001-NocioJ Received: from mail-ia0-f181.google.com (mail-ia0-f181.google.com [209.85.210.181]) by cuda.sgi.com with ESMTP id ppbLRei7Mh34GQiD (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 06:52:00 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.181] Received: by mail-ia0-f181.google.com with SMTP id y25so1461306iay.12 for ; Fri, 12 Apr 2013 06:52:00 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=GeMfc40EmZGKWq71CVBMzdwuVhqvjUluJk2Slcb4ZAo=; b=HNbscAxlx6BPQ/gYRdiqjM1NL1wGMX7yhYvrbYOegCSaBkdABDSquRXZPa/t8iguDC VLyST0nTsa8Iy88uD+R8yNEdoRuDmArmbBy5kD6znqwX0s9B/qDv1lBUrip7q4fCoDWj yrv5oOnfpauazfyYxtZKvCeHCFjbWIg5DaUv5A3PJ+7gKodOpT4FbuNys8Vu9qBW8RV8 4yO6YGlafadMBfdPDNldEy6quQBqMyA8fE/pC7seL1Y77PlT/XpJIEyKIm/kTzS7GWsD tjkLYp9COL2AJOdZ7T8cD/6SLmparQhdku5S/PMuZOdFb5hNJSOZ6W3Z9yCa5RkPydq6 szYA== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr1771893igx.11.1365774697343; Fri, 12 Apr 2013 06:51:37 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Fri, 12 Apr 2013 06:51:36 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <51680320.7050400@redhat.com> Date: Fri, 12 Apr 2013 21:51:36 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e0111e074afaa6e04da2a33fd X-Barracuda-Connect: mail-ia0-f181.google.com[209.85.210.181] X-Barracuda-Start-Time: 1365774720 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127909 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 --089e0111e074afaa6e04da2a33fd Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable I have attached the xfs_metadump file to google drive and is there any useful clue there? I don't know how to check the meta file. https://docs.google.com/file/d/0B7n2C4T5tfNCdFBCTnNxNERmbWc/edit?usp=3Dshar= ing 2013/4/12 =B7=FB=D3=C0=CC=CE > And I'm not sure what kind of information is important to debug this issu= e? > Thank you. > > > 2013/4/12 =B7=FB=D3=C0=CC=CE > >> The xfs shutdown error is always the same. (It happens about 20 times on >> about 50 servers during last half year) >> Recently the shutdown happens on the cluster with 24 servers(dis 8 * >> replica 3) during rebalance. The average work load of this cluster is mo= re >> than 3TB growth per day. >> The work load including normal fops, rsync jobs, video encoding/decoding= , >> logging etc. through glusterfs native client of hundreds of machines. >> The shutdown tend to happen when we run rebalance for the glusterfs >> cluster which I guess will trigger a lot of unlink operations? >> >> Thank you very much. May be I can try to collect more logs with a >> modified kernel package. >> >> >> >> 2013/4/12 Brian Foster >> >>> On 04/11/2013 08:45 PM, =B7=FB=D3=C0=CC=CE wrote: >>> > the workload is about: >>> > 24 servers, replica(3) which means the distribute is 8 >>> > load is about 3(TB)-8(TB) per day. >>> > >>> >>> This describes your cluster, but not the workload (though cluster info >>> is good too). What kind of workload is running on your clients (i.e., >>> rsync jobs, etc.)? Are you running through native gluster mount points, >>> NFS mounts or a mix? Do you have any gluster internal operations runnin= g >>> (i.e., rebalance, etc.). >>> >>> Is there any kind of pattern you can discern from the workload and when >>> the XFS error happens to occur? You have a good number of servers in >>> play here, is there any kind of pattern in terms of which servers >>> experience the error? Is it always the same servers or a random set? >>> >>> Brian >>> >>> > >>> > 2013/4/12 Brian Foster >> >> >>> > >>> > On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote: >>> > > It happens tonight again on one of our servers, how to debug th= e >>> root >>> > > cause? Thank you. >>> > > >>> > >>> > Hi, >>> > >>> > I've attached a system tap script (stap -v xfs.stp) that should >>> > hopefully print out a bit more data should the issue happen again= . >>> Do >>> > you have a small enough number of nodes (or predictable enough >>> pattern) >>> > that you could run this on the nodes that tend to fail and collec= t >>> the >>> > output? >>> > >>> > Also, could you collect an xfs_metadump of the filesystem in >>> question >>> > and make it available for download and analysis somewhere? I >>> believe the >>> > ideal approach is to mount/umount the filesystem first to replay >>> the log >>> > before collecting a metadump, but somebody could correct me on >>> that (to >>> > be safe, you could collect multiple dumps: pre-mount and >>> post-mount). >>> > >>> > Could you also describe your workload a little bit? Thanks. >>> > >>> > Brian >>> > >>> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: >>> > > xfs_inotobp() returned error 22. >>> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifree >>> > returned >>> > > error 22 >>> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): >>> xfs_do_force_shutdown(0x1) >>> > > called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return >>> address =3D >>> > > 0xffffffffa02ee20a >>> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. >>> Shutting >>> > > down filesystem >>> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the >>> > filesystem and >>> > > rectify the problem(s) >>> > > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >>> > returned. >>> > > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >>> > returned. >>> > > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >>> > returned. >>> > > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >>> > returned. >>> > > >>> > > xfs_repair -n >>> > > >>> > > >>> > > Phase 7 - verify link counts... >>> > > would have reset inode 20021 nlinks from 0 to 1 >>> > > would have reset inode 20789 nlinks from 0 to 1 >>> > > would have reset inode 35125 nlinks from 0 to 1 >>> > > would have reset inode 35637 nlinks from 0 to 1 >>> > > would have reset inode 36149 nlinks from 0 to 1 >>> > > would have reset inode 38197 nlinks from 0 to 1 >>> > > would have reset inode 39477 nlinks from 0 to 1 >>> > > would have reset inode 54069 nlinks from 0 to 1 >>> > > would have reset inode 62261 nlinks from 0 to 1 >>> > > would have reset inode 63029 nlinks from 0 to 1 >>> > > would have reset inode 72501 nlinks from 0 to 1 >>> > > would have reset inode 79925 nlinks from 0 to 1 >>> > > would have reset inode 81205 nlinks from 0 to 1 >>> > > would have reset inode 84789 nlinks from 0 to 1 >>> > > would have reset inode 87861 nlinks from 0 to 1 >>> > > would have reset inode 90663 nlinks from 0 to 1 >>> > > would have reset inode 91189 nlinks from 0 to 1 >>> > > would have reset inode 95541 nlinks from 0 to 1 >>> > > would have reset inode 98101 nlinks from 0 to 1 >>> > > would have reset inode 101173 nlinks from 0 to 1 >>> > > would have reset inode 113205 nlinks from 0 to 1 >>> > > would have reset inode 114741 nlinks from 0 to 1 >>> > > would have reset inode 126261 nlinks from 0 to 1 >>> > > would have reset inode 140597 nlinks from 0 to 1 >>> > > would have reset inode 144693 nlinks from 0 to 1 >>> > > would have reset inode 147765 nlinks from 0 to 1 >>> > > would have reset inode 152885 nlinks from 0 to 1 >>> > > would have reset inode 161333 nlinks from 0 to 1 >>> > > would have reset inode 161845 nlinks from 0 to 1 >>> > > would have reset inode 167477 nlinks from 0 to 1 >>> > > would have reset inode 172341 nlinks from 0 to 1 >>> > > would have reset inode 191797 nlinks from 0 to 1 >>> > > would have reset inode 204853 nlinks from 0 to 1 >>> > > would have reset inode 205365 nlinks from 0 to 1 >>> > > would have reset inode 215349 nlinks from 0 to 1 >>> > > would have reset inode 215861 nlinks from 0 to 1 >>> > > would have reset inode 216373 nlinks from 0 to 1 >>> > > would have reset inode 217397 nlinks from 0 to 1 >>> > > would have reset inode 224309 nlinks from 0 to 1 >>> > > would have reset inode 225589 nlinks from 0 to 1 >>> > > would have reset inode 234549 nlinks from 0 to 1 >>> > > would have reset inode 234805 nlinks from 0 to 1 >>> > > would have reset inode 249653 nlinks from 0 to 1 >>> > > would have reset inode 250677 nlinks from 0 to 1 >>> > > would have reset inode 252469 nlinks from 0 to 1 >>> > > would have reset inode 261429 nlinks from 0 to 1 >>> > > would have reset inode 265013 nlinks from 0 to 1 >>> > > would have reset inode 266805 nlinks from 0 to 1 >>> > > would have reset inode 267317 nlinks from 0 to 1 >>> > > would have reset inode 268853 nlinks from 0 to 1 >>> > > would have reset inode 272437 nlinks from 0 to 1 >>> > > would have reset inode 273205 nlinks from 0 to 1 >>> > > would have reset inode 274229 nlinks from 0 to 1 >>> > > would have reset inode 278325 nlinks from 0 to 1 >>> > > would have reset inode 278837 nlinks from 0 to 1 >>> > > would have reset inode 281397 nlinks from 0 to 1 >>> > > would have reset inode 292661 nlinks from 0 to 1 >>> > > would have reset inode 300853 nlinks from 0 to 1 >>> > > would have reset inode 302901 nlinks from 0 to 1 >>> > > would have reset inode 305205 nlinks from 0 to 1 >>> > > would have reset inode 314165 nlinks from 0 to 1 >>> > > would have reset inode 315189 nlinks from 0 to 1 >>> > > would have reset inode 320309 nlinks from 0 to 1 >>> > > would have reset inode 324917 nlinks from 0 to 1 >>> > > would have reset inode 328245 nlinks from 0 to 1 >>> > > would have reset inode 335925 nlinks from 0 to 1 >>> > > would have reset inode 339253 nlinks from 0 to 1 >>> > > would have reset inode 339765 nlinks from 0 to 1 >>> > > would have reset inode 348213 nlinks from 0 to 1 >>> > > would have reset inode 360501 nlinks from 0 to 1 >>> > > would have reset inode 362037 nlinks from 0 to 1 >>> > > would have reset inode 366389 nlinks from 0 to 1 >>> > > would have reset inode 385845 nlinks from 0 to 1 >>> > > would have reset inode 390709 nlinks from 0 to 1 >>> > > would have reset inode 409141 nlinks from 0 to 1 >>> > > would have reset inode 413237 nlinks from 0 to 1 >>> > > would have reset inode 414773 nlinks from 0 to 1 >>> > > would have reset inode 417845 nlinks from 0 to 1 >>> > > would have reset inode 436021 nlinks from 0 to 1 >>> > > would have reset inode 439349 nlinks from 0 to 1 >>> > > would have reset inode 447029 nlinks from 0 to 1 >>> > > would have reset inode 491317 nlinks from 0 to 1 >>> > > would have reset inode 494133 nlinks from 0 to 1 >>> > > would have reset inode 495413 nlinks from 0 to 1 >>> > > would have reset inode 501301 nlinks from 0 to 1 >>> > > would have reset inode 506421 nlinks from 0 to 1 >>> > > would have reset inode 508469 nlinks from 0 to 1 >>> > > would have reset inode 508981 nlinks from 0 to 1 >>> > > would have reset inode 511797 nlinks from 0 to 1 >>> > > would have reset inode 513077 nlinks from 0 to 1 >>> > > would have reset inode 517941 nlinks from 0 to 1 >>> > > would have reset inode 521013 nlinks from 0 to 1 >>> > > would have reset inode 522805 nlinks from 0 to 1 >>> > > would have reset inode 523317 nlinks from 0 to 1 >>> > > would have reset inode 525621 nlinks from 0 to 1 >>> > > would have reset inode 527925 nlinks from 0 to 1 >>> > > would have reset inode 535605 nlinks from 0 to 1 >>> > > would have reset inode 541749 nlinks from 0 to 1 >>> > > would have reset inode 573493 nlinks from 0 to 1 >>> > > would have reset inode 578613 nlinks from 0 to 1 >>> > > would have reset inode 583029 nlinks from 0 to 1 >>> > > would have reset inode 585525 nlinks from 0 to 1 >>> > > would have reset inode 586293 nlinks from 0 to 1 >>> > > would have reset inode 586805 nlinks from 0 to 1 >>> > > would have reset inode 591413 nlinks from 0 to 1 >>> > > would have reset inode 594485 nlinks from 0 to 1 >>> > > would have reset inode 596277 nlinks from 0 to 1 >>> > > would have reset inode 603189 nlinks from 0 to 1 >>> > > would have reset inode 613429 nlinks from 0 to 1 >>> > > would have reset inode 617781 nlinks from 0 to 1 >>> > > would have reset inode 621877 nlinks from 0 to 1 >>> > > would have reset inode 623925 nlinks from 0 to 1 >>> > > would have reset inode 625205 nlinks from 0 to 1 >>> > > would have reset inode 626741 nlinks from 0 to 1 >>> > > would have reset inode 639541 nlinks from 0 to 1 >>> > > would have reset inode 640053 nlinks from 0 to 1 >>> > > would have reset inode 640565 nlinks from 0 to 1 >>> > > would have reset inode 645173 nlinks from 0 to 1 >>> > > would have reset inode 652853 nlinks from 0 to 1 >>> > > would have reset inode 656181 nlinks from 0 to 1 >>> > > would have reset inode 659253 nlinks from 0 to 1 >>> > > would have reset inode 663605 nlinks from 0 to 1 >>> > > would have reset inode 667445 nlinks from 0 to 1 >>> > > would have reset inode 680757 nlinks from 0 to 1 >>> > > would have reset inode 691253 nlinks from 0 to 1 >>> > > would have reset inode 691765 nlinks from 0 to 1 >>> > > would have reset inode 697653 nlinks from 0 to 1 >>> > > would have reset inode 700469 nlinks from 0 to 1 >>> > > would have reset inode 707893 nlinks from 0 to 1 >>> > > would have reset inode 716853 nlinks from 0 to 1 >>> > > would have reset inode 722229 nlinks from 0 to 1 >>> > > would have reset inode 722741 nlinks from 0 to 1 >>> > > would have reset inode 723765 nlinks from 0 to 1 >>> > > would have reset inode 731957 nlinks from 0 to 1 >>> > > would have reset inode 742965 nlinks from 0 to 1 >>> > > would have reset inode 743477 nlinks from 0 to 1 >>> > > would have reset inode 745781 nlinks from 0 to 1 >>> > > would have reset inode 746293 nlinks from 0 to 1 >>> > > would have reset inode 774453 nlinks from 0 to 1 >>> > > would have reset inode 778805 nlinks from 0 to 1 >>> > > would have reset inode 785013 nlinks from 0 to 1 >>> > > would have reset inode 785973 nlinks from 0 to 1 >>> > > would have reset inode 791349 nlinks from 0 to 1 >>> > > would have reset inode 796981 nlinks from 0 to 1 >>> > > would have reset inode 803381 nlinks from 0 to 1 >>> > > would have reset inode 806965 nlinks from 0 to 1 >>> > > would have reset inode 811798 nlinks from 0 to 1 >>> > > would have reset inode 812310 nlinks from 0 to 1 >>> > > would have reset inode 813078 nlinks from 0 to 1 >>> > > would have reset inode 813607 nlinks from 0 to 1 >>> > > would have reset inode 814183 nlinks from 0 to 1 >>> > > would have reset inode 822069 nlinks from 0 to 1 >>> > > would have reset inode 828469 nlinks from 0 to 1 >>> > > would have reset inode 830005 nlinks from 0 to 1 >>> > > would have reset inode 832053 nlinks from 0 to 1 >>> > > would have reset inode 832565 nlinks from 0 to 1 >>> > > would have reset inode 836661 nlinks from 0 to 1 >>> > > would have reset inode 841013 nlinks from 0 to 1 >>> > > would have reset inode 841525 nlinks from 0 to 1 >>> > > would have reset inode 845365 nlinks from 0 to 1 >>> > > would have reset inode 846133 nlinks from 0 to 1 >>> > > would have reset inode 847157 nlinks from 0 to 1 >>> > > would have reset inode 852533 nlinks from 0 to 1 >>> > > would have reset inode 857141 nlinks from 0 to 1 >>> > > would have reset inode 863271 nlinks from 0 to 1 >>> > > would have reset inode 866855 nlinks from 0 to 1 >>> > > would have reset inode 887861 nlinks from 0 to 1 >>> > > would have reset inode 891701 nlinks from 0 to 1 >>> > > would have reset inode 894773 nlinks from 0 to 1 >>> > > would have reset inode 900149 nlinks from 0 to 1 >>> > > would have reset inode 902197 nlinks from 0 to 1 >>> > > would have reset inode 906293 nlinks from 0 to 1 >>> > > would have reset inode 906805 nlinks from 0 to 1 >>> > > would have reset inode 909877 nlinks from 0 to 1 >>> > > would have reset inode 925493 nlinks from 0 to 1 >>> > > would have reset inode 949543 nlinks from 0 to 1 >>> > > would have reset inode 955175 nlinks from 0 to 1 >>> > > would have reset inode 963623 nlinks from 0 to 1 >>> > > would have reset inode 967733 nlinks from 0 to 1 >>> > > would have reset inode 968231 nlinks from 0 to 1 >>> > > would have reset inode 982069 nlinks from 0 to 1 >>> > > would have reset inode 1007413 nlinks from 0 to 1 >>> > > would have reset inode 1011509 nlinks from 0 to 1 >>> > > would have reset inode 1014069 nlinks from 0 to 1 >>> > > would have reset inode 1014581 nlinks from 0 to 1 >>> > > would have reset inode 1022005 nlinks from 0 to 1 >>> > > would have reset inode 1022517 nlinks from 0 to 1 >>> > > would have reset inode 1023029 nlinks from 0 to 1 >>> > > would have reset inode 1025333 nlinks from 0 to 1 >>> > > would have reset inode 1043765 nlinks from 0 to 1 >>> > > would have reset inode 1044789 nlinks from 0 to 1 >>> > > would have reset inode 1049397 nlinks from 0 to 1 >>> > > would have reset inode 1050933 nlinks from 0 to 1 >>> > > would have reset inode 1051445 nlinks from 0 to 1 >>> > > would have reset inode 1054261 nlinks from 0 to 1 >>> > > would have reset inode 1060917 nlinks from 0 to 1 >>> > > would have reset inode 1063477 nlinks from 0 to 1 >>> > > would have reset inode 1076021 nlinks from 0 to 1 >>> > > would have reset inode 1081141 nlinks from 0 to 1 >>> > > would have reset inode 1086261 nlinks from 0 to 1 >>> > > would have reset inode 1097269 nlinks from 0 to 1 >>> > > would have reset inode 1099829 nlinks from 0 to 1 >>> > > would have reset inode 1100853 nlinks from 0 to 1 >>> > > would have reset inode 1101877 nlinks from 0 to 1 >>> > > would have reset inode 1126709 nlinks from 0 to 1 >>> > > would have reset inode 1134389 nlinks from 0 to 1 >>> > > would have reset inode 1141045 nlinks from 0 to 1 >>> > > would have reset inode 1141557 nlinks from 0 to 1 >>> > > would have reset inode 1142581 nlinks from 0 to 1 >>> > > would have reset inode 1148469 nlinks from 0 to 1 >>> > > would have reset inode 1153333 nlinks from 0 to 1 >>> > > would have reset inode 1181749 nlinks from 0 to 1 >>> > > would have reset inode 1192245 nlinks from 0 to 1 >>> > > would have reset inode 1198133 nlinks from 0 to 1 >>> > > would have reset inode 1203765 nlinks from 0 to 1 >>> > > would have reset inode 1221429 nlinks from 0 to 1 >>> > > would have reset inode 1223989 nlinks from 0 to 1 >>> > > would have reset inode 1235509 nlinks from 0 to 1 >>> > > would have reset inode 1239349 nlinks from 0 to 1 >>> > > would have reset inode 1240885 nlinks from 0 to 1 >>> > > would have reset inode 1241397 nlinks from 0 to 1 >>> > > would have reset inode 1241909 nlinks from 0 to 1 >>> > > would have reset inode 1242421 nlinks from 0 to 1 >>> > > would have reset inode 1244981 nlinks from 0 to 1 >>> > > would have reset inode 1246517 nlinks from 0 to 1 >>> > > would have reset inode 1253429 nlinks from 0 to 1 >>> > > would have reset inode 1271861 nlinks from 0 to 1 >>> > > would have reset inode 1274677 nlinks from 0 to 1 >>> > > would have reset inode 1277749 nlinks from 0 to 1 >>> > > would have reset inode 1278773 nlinks from 0 to 1 >>> > > would have reset inode 1286709 nlinks from 0 to 1 >>> > > would have reset inode 1288245 nlinks from 0 to 1 >>> > > would have reset inode 1299765 nlinks from 0 to 1 >>> > > would have reset inode 1302325 nlinks from 0 to 1 >>> > > would have reset inode 1304885 nlinks from 0 to 1 >>> > > would have reset inode 1305397 nlinks from 0 to 1 >>> > > would have reset inode 1307509 nlinks from 0 to 1 >>> > > would have reset inode 1309493 nlinks from 0 to 1 >>> > > would have reset inode 1310517 nlinks from 0 to 1 >>> > > would have reset inode 1311029 nlinks from 0 to 1 >>> > > would have reset inode 1312053 nlinks from 0 to 1 >>> > > would have reset inode 1316917 nlinks from 0 to 1 >>> > > would have reset inode 1317941 nlinks from 0 to 1 >>> > > would have reset inode 1320821 nlinks from 0 to 1 >>> > > would have reset inode 1322805 nlinks from 0 to 1 >>> > > would have reset inode 1332789 nlinks from 0 to 1 >>> > > would have reset inode 1336373 nlinks from 0 to 1 >>> > > would have reset inode 1345653 nlinks from 0 to 1 >>> > > would have reset inode 1354549 nlinks from 0 to 1 >>> > > would have reset inode 1361973 nlinks from 0 to 1 >>> > > would have reset inode 1369909 nlinks from 0 to 1 >>> > > would have reset inode 1372981 nlinks from 0 to 1 >>> > > would have reset inode 1388853 nlinks from 0 to 1 >>> > > would have reset inode 1402933 nlinks from 0 to 1 >>> > > would have reset inode 1403445 nlinks from 0 to 1 >>> > > would have reset inode 1420085 nlinks from 0 to 1 >>> > > would have reset inode 1452853 nlinks from 0 to 1 >>> > > would have reset inode 1456437 nlinks from 0 to 1 >>> > > would have reset inode 1457973 nlinks from 0 to 1 >>> > > would have reset inode 1459253 nlinks from 0 to 1 >>> > > would have reset inode 1467957 nlinks from 0 to 1 >>> > > would have reset inode 1471541 nlinks from 0 to 1 >>> > > would have reset inode 1476661 nlinks from 0 to 1 >>> > > would have reset inode 1479733 nlinks from 0 to 1 >>> > > would have reset inode 1483061 nlinks from 0 to 1 >>> > > would have reset inode 1484085 nlinks from 0 to 1 >>> > > would have reset inode 1486133 nlinks from 0 to 1 >>> > > would have reset inode 1489461 nlinks from 0 to 1 >>> > > would have reset inode 1490037 nlinks from 0 to 1 >>> > > would have reset inode 1492021 nlinks from 0 to 1 >>> > > would have reset inode 1493557 nlinks from 0 to 1 >>> > > would have reset inode 1494069 nlinks from 0 to 1 >>> > > would have reset inode 1496885 nlinks from 0 to 1 >>> > > would have reset inode 1498421 nlinks from 0 to 1 >>> > > would have reset inode 1498933 nlinks from 0 to 1 >>> > > would have reset inode 1499957 nlinks from 0 to 1 >>> > > would have reset inode 1506101 nlinks from 0 to 1 >>> > > would have reset inode 1507637 nlinks from 0 to 1 >>> > > would have reset inode 1510453 nlinks from 0 to 1 >>> > > would have reset inode 1514293 nlinks from 0 to 1 >>> > > would have reset inode 1517365 nlinks from 0 to 1 >>> > > would have reset inode 1520693 nlinks from 0 to 1 >>> > > would have reset inode 1521973 nlinks from 0 to 1 >>> > > would have reset inode 1530421 nlinks from 0 to 1 >>> > > would have reset inode 1530933 nlinks from 0 to 1 >>> > > would have reset inode 1537333 nlinks from 0 to 1 >>> > > would have reset inode 1538357 nlinks from 0 to 1 >>> > > would have reset inode 1548853 nlinks from 0 to 1 >>> > > would have reset inode 1553973 nlinks from 0 to 1 >>> > > would have reset inode 1557301 nlinks from 0 to 1 >>> > > would have reset inode 1564213 nlinks from 0 to 1 >>> > > would have reset inode 1564725 nlinks from 0 to 1 >>> > > would have reset inode 1576501 nlinks from 0 to 1 >>> > > would have reset inode 1580597 nlinks from 0 to 1 >>> > > would have reset inode 1584693 nlinks from 0 to 1 >>> > > would have reset inode 1586485 nlinks from 0 to 1 >>> > > would have reset inode 1589301 nlinks from 0 to 1 >>> > > would have reset inode 1589813 nlinks from 0 to 1 >>> > > would have reset inode 1592629 nlinks from 0 to 1 >>> > > would have reset inode 1595701 nlinks from 0 to 1 >>> > > would have reset inode 1601077 nlinks from 0 to 1 >>> > > would have reset inode 1623861 nlinks from 0 to 1 >>> > > would have reset inode 1626677 nlinks from 0 to 1 >>> > > would have reset inode 1627701 nlinks from 0 to 1 >>> > > would have reset inode 1633333 nlinks from 0 to 1 >>> > > would have reset inode 1639221 nlinks from 0 to 1 >>> > > would have reset inode 1649205 nlinks from 0 to 1 >>> > > would have reset inode 1686325 nlinks from 0 to 1 >>> > > would have reset inode 1690677 nlinks from 0 to 1 >>> > > would have reset inode 1693749 nlinks from 0 to 1 >>> > > would have reset inode 1704757 nlinks from 0 to 1 >>> > > would have reset inode 1707061 nlinks from 0 to 1 >>> > > would have reset inode 1709109 nlinks from 0 to 1 >>> > > would have reset inode 1719349 nlinks from 0 to 1 >>> > > would have reset inode 1737013 nlinks from 0 to 1 >>> > > would have reset inode 1741365 nlinks from 0 to 1 >>> > > would have reset inode 1747509 nlinks from 0 to 1 >>> > > would have reset inode 1770805 nlinks from 0 to 1 >>> > > would have reset inode 1780789 nlinks from 0 to 1 >>> > > would have reset inode 1793589 nlinks from 0 to 1 >>> > > would have reset inode 1795125 nlinks from 0 to 1 >>> > > would have reset inode 1800757 nlinks from 0 to 1 >>> > > would have reset inode 1801269 nlinks from 0 to 1 >>> > > would have reset inode 1802549 nlinks from 0 to 1 >>> > > would have reset inode 1804085 nlinks from 0 to 1 >>> > > would have reset inode 1817141 nlinks from 0 to 1 >>> > > would have reset inode 1821749 nlinks from 0 to 1 >>> > > would have reset inode 1832757 nlinks from 0 to 1 >>> > > would have reset inode 1836341 nlinks from 0 to 1 >>> > > would have reset inode 1856309 nlinks from 0 to 1 >>> > > would have reset inode 1900597 nlinks from 0 to 1 >>> > > would have reset inode 1902901 nlinks from 0 to 1 >>> > > would have reset inode 1912373 nlinks from 0 to 1 >>> > > would have reset inode 1943093 nlinks from 0 to 1 >>> > > would have reset inode 1944373 nlinks from 0 to 1 >>> > > would have reset inode 1954101 nlinks from 0 to 1 >>> > > would have reset inode 1955893 nlinks from 0 to 1 >>> > > would have reset inode 1961781 nlinks from 0 to 1 >>> > > would have reset inode 1974325 nlinks from 0 to 1 >>> > > would have reset inode 1978677 nlinks from 0 to 1 >>> > > would have reset inode 1981237 nlinks from 0 to 1 >>> > > would have reset inode 1992245 nlinks from 0 to 1 >>> > > would have reset inode 2000949 nlinks from 0 to 1 >>> > > would have reset inode 2002229 nlinks from 0 to 1 >>> > > would have reset inode 2004789 nlinks from 0 to 1 >>> > > would have reset inode 2005301 nlinks from 0 to 1 >>> > > would have reset inode 2011189 nlinks from 0 to 1 >>> > > would have reset inode 2012981 nlinks from 0 to 1 >>> > > would have reset inode 2015285 nlinks from 0 to 1 >>> > > would have reset inode 2018869 nlinks from 0 to 1 >>> > > would have reset inode 2028341 nlinks from 0 to 1 >>> > > would have reset inode 2028853 nlinks from 0 to 1 >>> > > would have reset inode 2030901 nlinks from 0 to 1 >>> > > would have reset inode 2032181 nlinks from 0 to 1 >>> > > would have reset inode 2032693 nlinks from 0 to 1 >>> > > would have reset inode 2040117 nlinks from 0 to 1 >>> > > would have reset inode 2053685 nlinks from 0 to 1 >>> > > would have reset inode 2083893 nlinks from 0 to 1 >>> > > would have reset inode 2087221 nlinks from 0 to 1 >>> > > would have reset inode 2095925 nlinks from 0 to 1 >>> > > would have reset inode 2098741 nlinks from 0 to 1 >>> > > would have reset inode 2100533 nlinks from 0 to 1 >>> > > would have reset inode 2101301 nlinks from 0 to 1 >>> > > would have reset inode 2123573 nlinks from 0 to 1 >>> > > would have reset inode 2132789 nlinks from 0 to 1 >>> > > would have reset inode 2133813 nlinks from 0 to 1 >>> > > >>> > > >>> > > >>> > > >>> > > >>> > > 2013/4/10 =B7=FB=D3=C0=CC=CE >>> > >> >>> > > >>> > > The storage info is as following: >>> > > RAID-6 >>> > > SATA HDD >>> > > Controller: PERC H710P Mini (Embedded) >>> > > Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes >>> > > 255 heads, 63 sectors/track, 3647334 cylinders >>> > > Units =3D cylinders of 16065 * 512 =3D 8225280 bytes >>> > > Sector size (logical/physical): 512 bytes / 512 bytes >>> > > I/O size (minimum/optimal): 512 bytes / 512 bytes >>> > > Disk identifier: 0x00000000 >>> > > >>> > > sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (30.= 0 >>> > TB/27.2 >>> > > TiB) >>> > > sd 0:2:1:0: [sdb] Write Protect is off >>> > > sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08 >>> > > sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enabled= , >>> > doesn't >>> > > support DPO or FUA >>> > > sd 0:2:1:0: [sdb] Attached SCSI disk >>> > > >>> > > *-storage >>> > > description: RAID bus controller >>> > > product: MegaRAID SAS 2208 [Thunderbolt] >>> > > vendor: LSI Logic / Symbios Logic >>> > > physical id: 0 >>> > > bus info: pci@0000:02:00.0 >>> > > logical name: scsi0 >>> > > version: 01 >>> > > width: 64 bits >>> > > clock: 33MHz >>> > > capabilities: storage pm pciexpress vpd msi msix >>> bus_master >>> > > cap_list rom >>> > > configuration: driver=3Dmegaraid_sas latency=3D0 >>> > > resources: irq:42 ioport:fc00(size=3D256) >>> > > memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff >>> > > memory:dc800000-dc81ffff(prefetchable) >>> > > *-disk:0 >>> > > description: SCSI Disk >>> > > product: PERC H710P >>> > > vendor: DELL >>> > > physical id: 2.0.0 >>> > > bus info: scsi@0:2.0.0 >>> > > logical name: /dev/sda >>> > > version: 3.13 >>> > > serial: 0049d6ce1d9f2035180096fde490f648 >>> > > size: 558GiB (599GB) >>> > > capabilities: partitioned partitioned:dos >>> > > configuration: ansiversion=3D5 signature=3D000aa3= 36 >>> > > *-disk:1 >>> > > description: SCSI Disk >>> > > product: PERC H710P >>> > > vendor: DELL >>> > > physical id: 2.1.0 >>> > > bus info: scsi@0:2.1.0 >>> > > logical name: /dev/sdb >>> > > logical name: /mnt/xfsd >>> > > version: 3.13 >>> > > serial: 003366f71da22035180096fde490f648 >>> > > size: 27TiB (30TB) >>> > > configuration: ansiversion=3D5 mount.fstype=3Dxfs >>> > > >>> > >>> mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,s= width=3D1280,noquota >>> > > state=3Dmounted >>> > > >>> > > Thank you. >>> > > >>> > > >>> > > 2013/4/10 Emmanuel Florac >> > >>> > > >> eflorac@intellique.com>>> >>> > > >>> > > Le Tue, 9 Apr 2013 23:10:03 +0800 >>> > > =B7=FB=D3=C0=CC=CE >>> > >> >>> =A8=A6crivait: >>> > > >>> > > > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error >>> > Detected. >>> > > > > Shutting down filesystem >>> > > >>> > > This. I/O error detected. That means that at some point >>> the >>> > > underlying >>> > > device (disk, RAID array, SAN volume) couldn't be >>> reached. >>> > So this >>> > > could very well be a case of a flakey drive, array, cab= le >>> > or SCSI >>> > > driver. >>> > > >>> > > What's the storage setup here? >>> > > >>> > > -- >>> > > >>> > >>> -----------------------------------------------------------------------= - >>> > > Emmanuel Florac | Direction technique >>> > > | Intellique >>> > > | >> > >>> > > >> > >> >>> > > | +33 1 78 94 84 02 >>> > >>> > > >>> > >>> -----------------------------------------------------------------------= - >>> > > >>> > > >>> > > >>> > > >>> > > -- >>> > > =B7=FB=D3=C0=CC=CE >>> > > >>> > > >>> > > >>> > > >>> > > -- >>> > > =B7=FB=D3=C0=CC=CE >>> > > >>> > > >>> > > _______________________________________________ >>> > > xfs mailing list >>> > > xfs@oss.sgi.com >>> > > http://oss.sgi.com/mailman/listinfo/xfs >>> > > >>> > >>> > >>> > >>> > >>> > -- >>> > =B7=FB=D3=C0=CC=CE >>> > >>> > >>> > _______________________________________________ >>> > xfs mailing list >>> > xfs@oss.sgi.com >>> > http://oss.sgi.com/mailman/listinfo/xfs >>> > >>> >>> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --089e0111e074afaa6e04da2a33fd Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
I have attached the xfs_metadump file to google drive and = is there any useful clue there? I don't know how to check the meta file= .
https://docs.google.com/file/d/0B7n2= C4T5tfNCdFBCTnNxNERmbWc/edit?usp=3Dsharing


2013/4/= 12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
And I'm not sure what kind of information is impo= rtant to debug this issue?
Thank you.


2013/4/12= =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
The xfs shutdown = error is always the same. (It happens about 20 times on about 50 servers du= ring last half year)
Recently the shutdown happens on the cluster with 24 servers(dis 8 * replic= a 3) during rebalance. The average work load of this cluster is more than 3= TB growth per day.
The work load including normal fops, rsync jobs, video encoding/decoding, l= ogging etc. through glusterfs native client of hundreds of machines.
The shutdown tend to happen when we run rebalance for the glusterfs clu= ster which I guess will trigger a lot of unlink operations?

Thank you very much. May be I can try to collect more logs with a= modified kernel package.



2013/4/12 Brian Foster <bfoster@redh= at.com>
On 04/11/2013 08:45 PM, =B7=FB=D3=C0=CC= =CE wrote:
> the workload is about:
> 24 servers, replica(3) which means the distribute is 8
> load is about 3(TB)-8(TB) per day.
>

This describes your cluster, but not the workload (though cluster inf= o
is good too). What kind of workload is running on your clients (i.e.,
rsync jobs, etc.)? Are you running through native gluster mount points,
NFS mounts or a mix? Do you have any gluster internal operations running (i.e., rebalance, etc.).

Is there any kind of pattern you can discern from the workload and when
the XFS error happens to occur? You have a good number of servers in
play here, is there any kind of pattern in terms of which servers
experience the error? Is it always the same servers or a random set?

Brian

>
> 2013/4/12 Brian Foster <bfoster@redhat.com <mailto:bfoster@redhat.com>>
>
>     On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote:
>     > It happens tonight again on one of our servers, how= to debug the root
>     > cause? Thank you.
>     >
>
>     Hi,
>
>     I've attached a system tap script (stap -v xfs.stp) = that should
>     hopefully print out a bit more data should the issue hap= pen again. Do
>     you have a small enough number of nodes (or predictable = enough pattern)
>     that you could run this on the nodes that tend to fail a= nd collect the
>     output?
>
>     Also, could you collect an xfs_metadump of the filesyste= m in question
>     and make it available for download and analysis somewher= e? I believe the
>     ideal approach is to mount/umount the filesystem first t= o replay the log
>     before collecting a metadump, but somebody could correct= me on that (to
>     be safe, you could collect multiple dumps: pre-mount and= post-mount).
>
>     Could you also describe your workload a little bit? Than= ks.
>
>     Brian
>
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink= _remove:
>     > xfs_inotobp() returned error 22.
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactiv= e: xfs_ifree
>     returned
>     > error 22
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_forc= e_shutdown(0x1)
>     > called from line 1184 of file fs/xfs/xfs_vnodeops.c= .  Return address =3D
>     > 0xffffffffa02ee20a
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error D= etected. Shutting
>     > down filesystem
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umou= nt the
>     filesystem and
>     > rectify the problem(s)
>     > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     >
>     > xfs_repair -n
>     >
>     >
>     > Phase 7 - verify link counts...
>     > would have reset inode 20021 nlinks from 0 to 1
>     > would have reset inode 20789 nlinks from 0 to 1
>     > would have reset inode 35125 nlinks from 0 to 1
>     > would have reset inode 35637 nlinks from 0 to 1
>     > would have reset inode 36149 nlinks from 0 to 1
>     > would have reset inode 38197 nlinks from 0 to 1
>     > would have reset inode 39477 nlinks from 0 to 1
>     > would have reset inode 54069 nlinks from 0 to 1
>     > would have reset inode 62261 nlinks from 0 to 1
>     > would have reset inode 63029 nlinks from 0 to 1
>     > would have reset inode 72501 nlinks from 0 to 1
>     > would have reset inode 79925 nlinks from 0 to 1
>     > would have reset inode 81205 nlinks from 0 to 1
>     > would have reset inode 84789 nlinks from 0 to 1
>     > would have reset inode 87861 nlinks from 0 to 1
>     > would have reset inode 90663 nlinks from 0 to 1
>     > would have reset inode 91189 nlinks from 0 to 1
>     > would have reset inode 95541 nlinks from 0 to 1
>     > would have reset inode 98101 nlinks from 0 to 1
>     > would have reset inode 101173 nlinks from 0 to 1 >     > would have reset inode 113205 nlinks from 0 to 1 >     > would have reset inode 114741 nlinks from 0 to 1 >     > would have reset inode 126261 nlinks from 0 to 1 >     > would have reset inode 140597 nlinks from 0 to 1 >     > would have reset inode 144693 nlinks from 0 to 1 >     > would have reset inode 147765 nlinks from 0 to 1 >     > would have reset inode 152885 nlinks from 0 to 1 >     > would have reset inode 161333 nlinks from 0 to 1 >     > would have reset inode 161845 nlinks from 0 to 1 >     > would have reset inode 167477 nlinks from 0 to 1 >     > would have reset inode 172341 nlinks from 0 to 1 >     > would have reset inode 191797 nlinks from 0 to 1 >     > would have reset inode 204853 nlinks from 0 to 1 >     > would have reset inode 205365 nlinks from 0 to 1 >     > would have reset inode 215349 nlinks from 0 to 1 >     > would have reset inode 215861 nlinks from 0 to 1 >     > would have reset inode 216373 nlinks from 0 to 1 >     > would have reset inode 217397 nlinks from 0 to 1 >     > would have reset inode 224309 nlinks from 0 to 1 >     > would have reset inode 225589 nlinks from 0 to 1 >     > would have reset inode 234549 nlinks from 0 to 1 >     > would have reset inode 234805 nlinks from 0 to 1 >     > would have reset inode 249653 nlinks from 0 to 1 >     > would have reset inode 250677 nlinks from 0 to 1 >     > would have reset inode 252469 nlinks from 0 to 1 >     > would have reset inode 261429 nlinks from 0 to 1 >     > would have reset inode 265013 nlinks from 0 to 1 >     > would have reset inode 266805 nlinks from 0 to 1 >     > would have reset inode 267317 nlinks from 0 to 1 >     > would have reset inode 268853 nlinks from 0 to 1 >     > would have reset inode 272437 nlinks from 0 to 1 >     > would have reset inode 273205 nlinks from 0 to 1 >     > would have reset inode 274229 nlinks from 0 to 1 >     > would have reset inode 278325 nlinks from 0 to 1 >     > would have reset inode 278837 nlinks from 0 to 1 >     > would have reset inode 281397 nlinks from 0 to 1 >     > would have reset inode 292661 nlinks from 0 to 1 >     > would have reset inode 300853 nlinks from 0 to 1 >     > would have reset inode 302901 nlinks from 0 to 1 >     > would have reset inode 305205 nlinks from 0 to 1 >     > would have reset inode 314165 nlinks from 0 to 1 >     > would have reset inode 315189 nlinks from 0 to 1 >     > would have reset inode 320309 nlinks from 0 to 1 >     > would have reset inode 324917 nlinks from 0 to 1 >     > would have reset inode 328245 nlinks from 0 to 1 >     > would have reset inode 335925 nlinks from 0 to 1 >     > would have reset inode 339253 nlinks from 0 to 1 >     > would have reset inode 339765 nlinks from 0 to 1 >     > would have reset inode 348213 nlinks from 0 to 1 >     > would have reset inode 360501 nlinks from 0 to 1 >     > would have reset inode 362037 nlinks from 0 to 1 >     > would have reset inode 366389 nlinks from 0 to 1 >     > would have reset inode 385845 nlinks from 0 to 1 >     > would have reset inode 390709 nlinks from 0 to 1 >     > would have reset inode 409141 nlinks from 0 to 1 >     > would have reset inode 413237 nlinks from 0 to 1 >     > would have reset inode 414773 nlinks from 0 to 1 >     > would have reset inode 417845 nlinks from 0 to 1 >     > would have reset inode 436021 nlinks from 0 to 1 >     > would have reset inode 439349 nlinks from 0 to 1 >     > would have reset inode 447029 nlinks from 0 to 1 >     > would have reset inode 491317 nlinks from 0 to 1 >     > would have reset inode 494133 nlinks from 0 to 1 >     > would have reset inode 495413 nlinks from 0 to 1 >     > would have reset inode 501301 nlinks from 0 to 1 >     > would have reset inode 506421 nlinks from 0 to 1 >     > would have reset inode 508469 nlinks from 0 to 1 >     > would have reset inode 508981 nlinks from 0 to 1 >     > would have reset inode 511797 nlinks from 0 to 1 >     > would have reset inode 513077 nlinks from 0 to 1 >     > would have reset inode 517941 nlinks from 0 to 1 >     > would have reset inode 521013 nlinks from 0 to 1 >     > would have reset inode 522805 nlinks from 0 to 1 >     > would have reset inode 523317 nlinks from 0 to 1 >     > would have reset inode 525621 nlinks from 0 to 1 >     > would have reset inode 527925 nlinks from 0 to 1 >     > would have reset inode 535605 nlinks from 0 to 1 >     > would have reset inode 541749 nlinks from 0 to 1 >     > would have reset inode 573493 nlinks from 0 to 1 >     > would have reset inode 578613 nlinks from 0 to 1 >     > would have reset inode 583029 nlinks from 0 to 1 >     > would have reset inode 585525 nlinks from 0 to 1 >     > would have reset inode 586293 nlinks from 0 to 1 >     > would have reset inode 586805 nlinks from 0 to 1 >     > would have reset inode 591413 nlinks from 0 to 1 >     > would have reset inode 594485 nlinks from 0 to 1 >     > would have reset inode 596277 nlinks from 0 to 1 >     > would have reset inode 603189 nlinks from 0 to 1 >     > would have reset inode 613429 nlinks from 0 to 1 >     > would have reset inode 617781 nlinks from 0 to 1 >     > would have reset inode 621877 nlinks from 0 to 1 >     > would have reset inode 623925 nlinks from 0 to 1 >     > would have reset inode 625205 nlinks from 0 to 1 >     > would have reset inode 626741 nlinks from 0 to 1 >     > would have reset inode 639541 nlinks from 0 to 1 >     > would have reset inode 640053 nlinks from 0 to 1 >     > would have reset inode 640565 nlinks from 0 to 1 >     > would have reset inode 645173 nlinks from 0 to 1 >     > would have reset inode 652853 nlinks from 0 to 1 >     > would have reset inode 656181 nlinks from 0 to 1 >     > would have reset inode 659253 nlinks from 0 to 1 >     > would have reset inode 663605 nlinks from 0 to 1 >     > would have reset inode 667445 nlinks from 0 to 1 >     > would have reset inode 680757 nlinks from 0 to 1 >     > would have reset inode 691253 nlinks from 0 to 1 >     > would have reset inode 691765 nlinks from 0 to 1 >     > would have reset inode 697653 nlinks from 0 to 1 >     > would have reset inode 700469 nlinks from 0 to 1 >     > would have reset inode 707893 nlinks from 0 to 1 >     > would have reset inode 716853 nlinks from 0 to 1 >     > would have reset inode 722229 nlinks from 0 to 1 >     > would have reset inode 722741 nlinks from 0 to 1 >     > would have reset inode 723765 nlinks from 0 to 1 >     > would have reset inode 731957 nlinks from 0 to 1 >     > would have reset inode 742965 nlinks from 0 to 1 >     > would have reset inode 743477 nlinks from 0 to 1 >     > would have reset inode 745781 nlinks from 0 to 1 >     > would have reset inode 746293 nlinks from 0 to 1 >     > would have reset inode 774453 nlinks from 0 to 1 >     > would have reset inode 778805 nlinks from 0 to 1 >     > would have reset inode 785013 nlinks from 0 to 1 >     > would have reset inode 785973 nlinks from 0 to 1 >     > would have reset inode 791349 nlinks from 0 to 1 >     > would have reset inode 796981 nlinks from 0 to 1 >     > would have reset inode 803381 nlinks from 0 to 1 >     > would have reset inode 806965 nlinks from 0 to 1 >     > would have reset inode 811798 nlinks from 0 to 1 >     > would have reset inode 812310 nlinks from 0 to 1 >     > would have reset inode 813078 nlinks from 0 to 1 >     > would have reset inode 813607 nlinks from 0 to 1 >     > would have reset inode 814183 nlinks from 0 to 1 >     > would have reset inode 822069 nlinks from 0 to 1 >     > would have reset inode 828469 nlinks from 0 to 1 >     > would have reset inode 830005 nlinks from 0 to 1 >     > would have reset inode 832053 nlinks from 0 to 1 >     > would have reset inode 832565 nlinks from 0 to 1 >     > would have reset inode 836661 nlinks from 0 to 1 >     > would have reset inode 841013 nlinks from 0 to 1 >     > would have reset inode 841525 nlinks from 0 to 1 >     > would have reset inode 845365 nlinks from 0 to 1 >     > would have reset inode 846133 nlinks from 0 to 1 >     > would have reset inode 847157 nlinks from 0 to 1 >     > would have reset inode 852533 nlinks from 0 to 1 >     > would have reset inode 857141 nlinks from 0 to 1 >     > would have reset inode 863271 nlinks from 0 to 1 >     > would have reset inode 866855 nlinks from 0 to 1 >     > would have reset inode 887861 nlinks from 0 to 1 >     > would have reset inode 891701 nlinks from 0 to 1 >     > would have reset inode 894773 nlinks from 0 to 1 >     > would have reset inode 900149 nlinks from 0 to 1 >     > would have reset inode 902197 nlinks from 0 to 1 >     > would have reset inode 906293 nlinks from 0 to 1 >     > would have reset inode 906805 nlinks from 0 to 1 >     > would have reset inode 909877 nlinks from 0 to 1 >     > would have reset inode 925493 nlinks from 0 to 1 >     > would have reset inode 949543 nlinks from 0 to 1 >     > would have reset inode 955175 nlinks from 0 to 1 >     > would have reset inode 963623 nlinks from 0 to 1 >     > would have reset inode 967733 nlinks from 0 to 1 >     > would have reset inode 968231 nlinks from 0 to 1 >     > would have reset inode 982069 nlinks from 0 to 1 >     > would have reset inode 1007413 nlinks from 0 to 1 >     > would have reset inode 1011509 nlinks from 0 to 1 >     > would have reset inode 1014069 nlinks from 0 to 1 >     > would have reset inode 1014581 nlinks from 0 to 1 >     > would have reset inode 1022005 nlinks from 0 to 1 >     > would have reset inode 1022517 nlinks from 0 to 1 >     > would have reset inode 1023029 nlinks from 0 to 1 >     > would have reset inode 1025333 nlinks from 0 to 1 >     > would have reset inode 1043765 nlinks from 0 to 1 >     > would have reset inode 1044789 nlinks from 0 to 1 >     > would have reset inode 1049397 nlinks from 0 to 1 >     > would have reset inode 1050933 nlinks from 0 to 1 >     > would have reset inode 1051445 nlinks from 0 to 1 >     > would have reset inode 1054261 nlinks from 0 to 1 >     > would have reset inode 1060917 nlinks from 0 to 1 >     > would have reset inode 1063477 nlinks from 0 to 1 >     > would have reset inode 1076021 nlinks from 0 to 1 >     > would have reset inode 1081141 nlinks from 0 to 1 >     > would have reset inode 1086261 nlinks from 0 to 1 >     > would have reset inode 1097269 nlinks from 0 to 1 >     > would have reset inode 1099829 nlinks from 0 to 1 >     > would have reset inode 1100853 nlinks from 0 to 1 >     > would have reset inode 1101877 nlinks from 0 to 1 >     > would have reset inode 1126709 nlinks from 0 to 1 >     > would have reset inode 1134389 nlinks from 0 to 1 >     > would have reset inode 1141045 nlinks from 0 to 1 >     > would have reset inode 1141557 nlinks from 0 to 1 >     > would have reset inode 1142581 nlinks from 0 to 1 >     > would have reset inode 1148469 nlinks from 0 to 1 >     > would have reset inode 1153333 nlinks from 0 to 1 >     > would have reset inode 1181749 nlinks from 0 to 1 >     > would have reset inode 1192245 nlinks from 0 to 1 >     > would have reset inode 1198133 nlinks from 0 to 1 >     > would have reset inode 1203765 nlinks from 0 to 1 >     > would have reset inode 1221429 nlinks from 0 to 1 >     > would have reset inode 1223989 nlinks from 0 to 1 >     > would have reset inode 1235509 nlinks from 0 to 1 >     > would have reset inode 1239349 nlinks from 0 to 1 >     > would have reset inode 1240885 nlinks from 0 to 1 >     > would have reset inode 1241397 nlinks from 0 to 1 >     > would have reset inode 1241909 nlinks from 0 to 1 >     > would have reset inode 1242421 nlinks from 0 to 1 >     > would have reset inode 1244981 nlinks from 0 to 1 >     > would have reset inode 1246517 nlinks from 0 to 1 >     > would have reset inode 1253429 nlinks from 0 to 1 >     > would have reset inode 1271861 nlinks from 0 to 1 >     > would have reset inode 1274677 nlinks from 0 to 1 >     > would have reset inode 1277749 nlinks from 0 to 1 >     > would have reset inode 1278773 nlinks from 0 to 1 >     > would have reset inode 1286709 nlinks from 0 to 1 >     > would have reset inode 1288245 nlinks from 0 to 1 >     > would have reset inode 1299765 nlinks from 0 to 1 >     > would have reset inode 1302325 nlinks from 0 to 1 >     > would have reset inode 1304885 nlinks from 0 to 1 >     > would have reset inode 1305397 nlinks from 0 to 1 >     > would have reset inode 1307509 nlinks from 0 to 1 >     > would have reset inode 1309493 nlinks from 0 to 1 >     > would have reset inode 1310517 nlinks from 0 to 1 >     > would have reset inode 1311029 nlinks from 0 to 1 >     > would have reset inode 1312053 nlinks from 0 to 1 >     > would have reset inode 1316917 nlinks from 0 to 1 >     > would have reset inode 1317941 nlinks from 0 to 1 >     > would have reset inode 1320821 nlinks from 0 to 1 >     > would have reset inode 1322805 nlinks from 0 to 1 >     > would have reset inode 1332789 nlinks from 0 to 1 >     > would have reset inode 1336373 nlinks from 0 to 1 >     > would have reset inode 1345653 nlinks from 0 to 1 >     > would have reset inode 1354549 nlinks from 0 to 1 >     > would have reset inode 1361973 nlinks from 0 to 1 >     > would have reset inode 1369909 nlinks from 0 to 1 >     > would have reset inode 1372981 nlinks from 0 to 1 >     > would have reset inode 1388853 nlinks from 0 to 1 >     > would have reset inode 1402933 nlinks from 0 to 1 >     > would have reset inode 1403445 nlinks from 0 to 1 >     > would have reset inode 1420085 nlinks from 0 to 1 >     > would have reset inode 1452853 nlinks from 0 to 1 >     > would have reset inode 1456437 nlinks from 0 to 1 >     > would have reset inode 1457973 nlinks from 0 to 1 >     > would have reset inode 1459253 nlinks from 0 to 1 >     > would have reset inode 1467957 nlinks from 0 to 1 >     > would have reset inode 1471541 nlinks from 0 to 1 >     > would have reset inode 1476661 nlinks from 0 to 1 >     > would have reset inode 1479733 nlinks from 0 to 1 >     > would have reset inode 1483061 nlinks from 0 to 1 >     > would have reset inode 1484085 nlinks from 0 to 1 >     > would have reset inode 1486133 nlinks from 0 to 1 >     > would have reset inode 1489461 nlinks from 0 to 1 >     > would have reset inode 1490037 nlinks from 0 to 1 >     > would have reset inode 1492021 nlinks from 0 to 1 >     > would have reset inode 1493557 nlinks from 0 to 1 >     > would have reset inode 1494069 nlinks from 0 to 1 >     > would have reset inode 1496885 nlinks from 0 to 1 >     > would have reset inode 1498421 nlinks from 0 to 1 >     > would have reset inode 1498933 nlinks from 0 to 1 >     > would have reset inode 1499957 nlinks from 0 to 1 >     > would have reset inode 1506101 nlinks from 0 to 1 >     > would have reset inode 1507637 nlinks from 0 to 1 >     > would have reset inode 1510453 nlinks from 0 to 1 >     > would have reset inode 1514293 nlinks from 0 to 1 >     > would have reset inode 1517365 nlinks from 0 to 1 >     > would have reset inode 1520693 nlinks from 0 to 1 >     > would have reset inode 1521973 nlinks from 0 to 1 >     > would have reset inode 1530421 nlinks from 0 to 1 >     > would have reset inode 1530933 nlinks from 0 to 1 >     > would have reset inode 1537333 nlinks from 0 to 1 >     > would have reset inode 1538357 nlinks from 0 to 1 >     > would have reset inode 1548853 nlinks from 0 to 1 >     > would have reset inode 1553973 nlinks from 0 to 1 >     > would have reset inode 1557301 nlinks from 0 to 1 >     > would have reset inode 1564213 nlinks from 0 to 1 >     > would have reset inode 1564725 nlinks from 0 to 1 >     > would have reset inode 1576501 nlinks from 0 to 1 >     > would have reset inode 1580597 nlinks from 0 to 1 >     > would have reset inode 1584693 nlinks from 0 to 1 >     > would have reset inode 1586485 nlinks from 0 to 1 >     > would have reset inode 1589301 nlinks from 0 to 1 >     > would have reset inode 1589813 nlinks from 0 to 1 >     > would have reset inode 1592629 nlinks from 0 to 1 >     > would have reset inode 1595701 nlinks from 0 to 1 >     > would have reset inode 1601077 nlinks from 0 to 1 >     > would have reset inode 1623861 nlinks from 0 to 1 >     > would have reset inode 1626677 nlinks from 0 to 1 >     > would have reset inode 1627701 nlinks from 0 to 1 >     > would have reset inode 1633333 nlinks from 0 to 1 >     > would have reset inode 1639221 nlinks from 0 to 1 >     > would have reset inode 1649205 nlinks from 0 to 1 >     > would have reset inode 1686325 nlinks from 0 to 1 >     > would have reset inode 1690677 nlinks from 0 to 1 >     > would have reset inode 1693749 nlinks from 0 to 1 >     > would have reset inode 1704757 nlinks from 0 to 1 >     > would have reset inode 1707061 nlinks from 0 to 1 >     > would have reset inode 1709109 nlinks from 0 to 1 >     > would have reset inode 1719349 nlinks from 0 to 1 >     > would have reset inode 1737013 nlinks from 0 to 1 >     > would have reset inode 1741365 nlinks from 0 to 1 >     > would have reset inode 1747509 nlinks from 0 to 1 >     > would have reset inode 1770805 nlinks from 0 to 1 >     > would have reset inode 1780789 nlinks from 0 to 1 >     > would have reset inode 1793589 nlinks from 0 to 1 >     > would have reset inode 1795125 nlinks from 0 to 1 >     > would have reset inode 1800757 nlinks from 0 to 1 >     > would have reset inode 1801269 nlinks from 0 to 1 >     > would have reset inode 1802549 nlinks from 0 to 1 >     > would have reset inode 1804085 nlinks from 0 to 1 >     > would have reset inode 1817141 nlinks from 0 to 1 >     > would have reset inode 1821749 nlinks from 0 to 1 >     > would have reset inode 1832757 nlinks from 0 to 1 >     > would have reset inode 1836341 nlinks from 0 to 1 >     > would have reset inode 1856309 nlinks from 0 to 1 >     > would have reset inode 1900597 nlinks from 0 to 1 >     > would have reset inode 1902901 nlinks from 0 to 1 >     > would have reset inode 1912373 nlinks from 0 to 1 >     > would have reset inode 1943093 nlinks from 0 to 1 >     > would have reset inode 1944373 nlinks from 0 to 1 >     > would have reset inode 1954101 nlinks from 0 to 1 >     > would have reset inode 1955893 nlinks from 0 to 1 >     > would have reset inode 1961781 nlinks from 0 to 1 >     > would have reset inode 1974325 nlinks from 0 to 1 >     > would have reset inode 1978677 nlinks from 0 to 1 >     > would have reset inode 1981237 nlinks from 0 to 1 >     > would have reset inode 1992245 nlinks from 0 to 1 >     > would have reset inode 2000949 nlinks from 0 to 1 >     > would have reset inode 2002229 nlinks from 0 to 1 >     > would have reset inode 2004789 nlinks from 0 to 1 >     > would have reset inode 2005301 nlinks from 0 to 1 >     > would have reset inode 2011189 nlinks from 0 to 1 >     > would have reset inode 2012981 nlinks from 0 to 1 >     > would have reset inode 2015285 nlinks from 0 to 1 >     > would have reset inode 2018869 nlinks from 0 to 1 >     > would have reset inode 2028341 nlinks from 0 to 1 >     > would have reset inode 2028853 nlinks from 0 to 1 >     > would have reset inode 2030901 nlinks from 0 to 1 >     > would have reset inode 2032181 nlinks from 0 to 1 >     > would have reset inode 2032693 nlinks from 0 to 1 >     > would have reset inode 2040117 nlinks from 0 to 1 >     > would have reset inode 2053685 nlinks from 0 to 1 >     > would have reset inode 2083893 nlinks from 0 to 1 >     > would have reset inode 2087221 nlinks from 0 to 1 >     > would have reset inode 2095925 nlinks from 0 to 1 >     > would have reset inode 2098741 nlinks from 0 to 1 >     > would have reset inode 2100533 nlinks from 0 to 1 >     > would have reset inode 2101301 nlinks from 0 to 1 >     > would have reset inode 2123573 nlinks from 0 to 1 >     > would have reset inode 2132789 nlinks from 0 to 1 >     > would have reset inode 2133813 nlinks from 0 to 1 >     >
>     >
>     >
>     >
>     >
>     > 2013/4/10 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:<= a href=3D"mailto:yongtaofu@gmail.com" target=3D"_blank">yongtaofu@gmail.com= >
>     <mailto:yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>>= ;
>     >
>     >     The storage info is as following:
>     >     RAID-6
>     >     SATA HDD
>     >     Controller: PERC H710P Mini (Embedded= )
>     >     Disk /dev/sdb: 30000.3 GB, 3000034656= 2560 bytes
>     >     255 heads, 63 sectors/track, 3647334 = cylinders
>     >     Units =3D cylinders of 16065 * 512 = =3D 8225280 bytes
>     >     Sector size (logical/physical): 512 b= ytes / 512 bytes
>     >     I/O size (minimum/optimal): 512 bytes= / 512 bytes
>     >     Disk identifier: 0x00000000
>     >
>     >     sd 0:2:1:0: [sdb] 58594426880 512-byt= e logical blocks: (30.0
>     TB/27.2
>     >     TiB)
>     >     sd 0:2:1:0: [sdb] Write Protect is of= f
>     >     sd 0:2:1:0: [sdb] Mode Sense: 1f 00 0= 0 08
>     >     sd 0:2:1:0: [sdb] Write cache: enable= d, read cache: enabled,
>     doesn't
>     >     support DPO or FUA
>     >     sd 0:2:1:0: [sdb] Attached SCSI disk<= br> >     >
>     >     *-storage
>     >            descriptio= n: RAID bus controller
>     >            product: M= egaRAID SAS 2208 [Thunderbolt]
>     >            vendor: LS= I Logic / Symbios Logic
>     >            physical i= d: 0
>     >            bus info: = pci@0000:02:00.0
>     >            logical na= me: scsi0
>     >            version: 0= 1
>     >            width: 64 = bits
>     >            clock: 33M= Hz
>     >            capabiliti= es: storage pm pciexpress vpd msi msix bus_master
>     >     cap_list rom
>     >            configurat= ion: driver=3Dmegaraid_sas latency=3D0
>     >            resources:= irq:42 ioport:fc00(size=3D256)
>     >     memory:dd7fc000-dd7fffff memory:dd780= 000-dd7bffff
>     >     memory:dc800000-dc81ffff(prefetchable= )
>     >          *-disk:0
>     >               de= scription: SCSI Disk
>     >               pr= oduct: PERC H710P
>     >               ve= ndor: DELL
>     >               ph= ysical id: 2.0.0
>     >               bu= s info: scsi@0:2.0.0
>     >               lo= gical name: /dev/sda
>     >               ve= rsion: 3.13
>     >               se= rial: 0049d6ce1d9f2035180096fde490f648
>     >               si= ze: 558GiB (599GB)
>     >               ca= pabilities: partitioned partitioned:dos
>     >               co= nfiguration: ansiversion=3D5 signature=3D000aa336
>     >          *-disk:1
>     >               de= scription: SCSI Disk
>     >               pr= oduct: PERC H710P
>     >               ve= ndor: DELL
>     >               ph= ysical id: 2.1.0
>     >               bu= s info: scsi@0:2.1.0
>     >               lo= gical name: /dev/sdb
>     >               lo= gical name: /mnt/xfsd
>     >               ve= rsion: 3.13
>     >               se= rial: 003366f71da22035180096fde490f648
>     >               si= ze: 27TiB (30TB)
>     >               co= nfiguration: ansiversion=3D5 mount.fstype=3Dxfs
>     >
>     mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64= k,sunit=3D128,swidth=3D1280,noquota
>     >     state=3Dmounted
>     >
>     >     Thank you.
>     >
>     >
>     >     2013/4/10 Emmanuel Florac <eflorac@intellique.com=
>     <mailto:eflorac@intellique.com>
>     >     <mailto:eflorac@intellique.com &l= t;mailto:eflora= c@intellique.com>>>
>     >
>     >         Le Tue, 9 Apr 2013 23:1= 0:03 +0800
>     >         =B7=FB=D3=C0=CC=CE <= yongtaofu@gmail.co= m <mailto:y= ongtaofu@gmail.com>
>     <mailto:yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>> =A8= =A6crivait:
>     >
>     >         > > Apr  9 1= 1:01:30 cqdx kernel: XFS (sdb): I/O Error
>     Detected.
>     >         > > Shutting down= filesystem
>     >
>     >         This. I/O error detecte= d. That means that at some point the
>     >         underlying
>     >         device (disk, RAID arra= y, SAN volume) couldn't be reached.
>     So this
>     >         could very well be a ca= se of a flakey drive, array, cable
>     or SCSI
>     >         driver.
>     >
>     >         What's the storage = setup here?
>     >
>     >         --
>     >
>     --------------------------------------------------------= ----------------
>     >         Emmanuel Florac   =   |   Direction technique
>     >               &n= bsp;             |   Intellique
>     >               &n= bsp;             |   <eflorac@intellique.com
>     <mailto:eflorac@intellique.com>
>     >         <mailto:eflorac@intellique.co= m
>     <mailto:eflorac@intellique.com>>>
>     >               &n= bsp;             |   +33 1 78 94 84 02
>     <tel:%2B33%201%2078%2094%2084%2002>
>     >
>     --------------------------------------------------------= ----------------
>     >
>     >
>     >
>     >
>     >     --
>     >     =B7=FB=D3=C0=CC=CE
>     >
>     >
>     >
>     >
>     > --
>     > =B7=FB=D3=C0=CC=CE
>     >
>     >
>     > _______________________________________________
>     > xfs mailing list
>     > xfs@oss.sgi.com <mailto:xfs@oss.sgi.com>
>     > http://oss.sgi.com/mailman/listinfo/xfs >     >
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE
>
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
>
= http://oss.sgi.com/mailman/listinfo/xfs
>




= --
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--089e0111e074afaa6e04da2a33fd-- From dave@fromorbit.com Fri Apr 12 08:57:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 76BA829DFA for ; Fri, 12 Apr 2013 08:57:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E9EE0AC002 for ; Fri, 12 Apr 2013 06:57:30 -0700 (PDT) X-ASG-Debug-ID: 1365775048-04cb6c2c1cf5b90001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Tc6vVk0QJmlOhlZx for ; Fri, 12 Apr 2013 06:57:28 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsILAFISaFF5LLHC/2dsb2JhbABQgwbCEwSBChd0gh8BLS87GGoDNIgTnCKhI416gTqDKwOgeocZgx0qgTAk Received: from ppp121-44-177-194.lns20.syd7.internode.on.net (HELO dastard) ([121.44.177.194]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Apr 2013 23:27:04 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UQeTO-0000oY-9B for xfs@oss.sgi.com; Fri, 12 Apr 2013 23:57:02 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UQeTO-0000aY-47 for xfs@oss.sgi.com; Fri, 12 Apr 2013 23:57:02 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs_repair: validate on-disk extent count better Date: Fri, 12 Apr 2013 23:57:02 +1000 X-ASG-Orig-Subj: [PATCH] xfs_repair: validate on-disk extent count better Message-Id: <1365775022-2234-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1365775048 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When scanning a btree format inode, we trust the extent count to be in range. However, values of the range 2^31 <= cnt < 2^32 are invalid and can cause problems with signed range checks. This results in assert failures which validating the extent count such as: xfs_repair: dinode.c:768: process_bmbt_reclist_int: Assertion `i < *numrecs' failed. Validate the extent count is at least within the positive range of a singed 32 bit integer before using it. Signed-off-by: Dave Chinner --- repair/dinode.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index 5a2da39..239bb7b 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -1293,7 +1293,7 @@ process_exinode( xfs_bmbt_rec_t *rp; xfs_dfiloff_t first_key; xfs_dfiloff_t last_key; - int numrecs; + int32_t numrecs; int ret; lino = XFS_AGINO_TO_INO(mp, agno, ino); @@ -1302,6 +1302,15 @@ process_exinode( numrecs = XFS_DFORK_NEXTENTS(dip, whichfork); /* + * We've already decided on the maximum number of extents on the inode, + * and numrecs may be corrupt. Hence make sure we only allow numrecs to + * be in the range of valid on-disk numbers, which is: + * 0 < numrecs < 2^31 - 1 + */ + if (numrecs < 0) + numrecs = *nex; + + /* * XXX - if we were going to fix up the btree record, * we'd do it right here. For now, if there's a problem, * we'll bail out and presumably clear the inode. @@ -2038,11 +2047,23 @@ process_inode_data_fork( { xfs_ino_t lino = XFS_AGINO_TO_INO(mp, agno, ino); int err = 0; + int nex; + + /* + * extent count on disk is only valid for positive values. The kernel + * uses negative values in memory. hence if we see negative numbers + * here, trash it! + */ + nex = be32_to_cpu(dino->di_nextents); + if (nex < 0) + *nextents = 1; + else + *nextents = nex; - *nextents = be32_to_cpu(dino->di_nextents); if (*nextents > be64_to_cpu(dino->di_nblocks)) *nextents = 1; + if (dino->di_format != XFS_DINODE_FMT_LOCAL && type != XR_INO_RTDATA) *dblkmap = blkmap_alloc(*nextents, XFS_DATA_FORK); *nextents = 0; -- 1.7.10.4 From yongtaofu@gmail.com Fri Apr 12 08:59:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1DBFC29DFA for ; Fri, 12 Apr 2013 08:59:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0B47C304043 for ; Fri, 12 Apr 2013 06:59:55 -0700 (PDT) X-ASG-Debug-ID: 1365775190-04cb6c2c1df5f50001-NocioJ Received: from mail-ie0-f180.google.com (mail-ie0-f180.google.com [209.85.223.180]) by cuda.sgi.com with ESMTP id CI0VWLRdbDIdgxVR (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 06:59:50 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.180 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.180] Received: by mail-ie0-f180.google.com with SMTP id a11so3304804iee.39 for ; Fri, 12 Apr 2013 06:59:50 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.180] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.180] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=P2LQ9LOUGHw5xEoZCbfRdMNKIBCU/YYT7ocAkq/d1u0=; b=NNnX4LXjMO3CPuhuWpyuilh3PV8YzIhtFrad4/nDFvrtZIBhwNeLgeLYPD/2ieIvZn 3rEKHcrhR9Jz64gmgrmIXX/Su85BkjUQNaeol29hSfVhpPQdV55EdwTEiItUZwaJlRN4 nL/NfKSCG5iXDivFtDQsfFiqS08brQwsxiJfMKIXyJCtOBNRZtZFODfKS0jsmxpOpC38 N6hYyYIa7rGCCajA5JH9RISPx2aLwRjrsVp8UhLkeYSDKfoY3+8xf5LpzA1vqWaglcG2 dfVFL8E/ClmiGVAHPadBQytJEBYItm68/p6ds6ZZ6grBz85wNj624m2leBWDP9wjtr3i DY3g== MIME-Version: 1.0 X-Received: by 10.50.107.4 with SMTP id gy4mr1803401igb.89.1365775190424; Fri, 12 Apr 2013 06:59:50 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Fri, 12 Apr 2013 06:59:50 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <51680320.7050400@redhat.com> Date: Fri, 12 Apr 2013 21:59:50 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=047d7b10d1b713721304da2a51b0 X-Barracuda-Connect: mail-ie0-f180.google.com[209.85.223.180] X-Barracuda-Start-Time: 1365775190 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127909 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 --047d7b10d1b713721304da2a51b0 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable The error happens randomly among the servers and we still can't find any clear pattern. And since there are few logs and we can't find any clue If it's hardware issue or software issue. And when xfs shutdown happens no hardware alarms found too. 2013/4/12 =B7=FB=D3=C0=CC=CE > I have attached the xfs_metadump file to google drive and is there any > useful clue there? I don't know how to check the meta file. > > https://docs.google.com/file/d/0B7n2C4T5tfNCdFBCTnNxNERmbWc/edit?usp=3Dsh= aring > > > 2013/4/12 =B7=FB=D3=C0=CC=CE > >> And I'm not sure what kind of information is important to debug this >> issue? >> Thank you. >> >> >> 2013/4/12 =B7=FB=D3=C0=CC=CE >> >>> The xfs shutdown error is always the same. (It happens about 20 times o= n >>> about 50 servers during last half year) >>> Recently the shutdown happens on the cluster with 24 servers(dis 8 * >>> replica 3) during rebalance. The average work load of this cluster is m= ore >>> than 3TB growth per day. >>> The work load including normal fops, rsync jobs, video >>> encoding/decoding, logging etc. through glusterfs native client of hund= reds >>> of machines. >>> The shutdown tend to happen when we run rebalance for the glusterfs >>> cluster which I guess will trigger a lot of unlink operations? >>> >>> Thank you very much. May be I can try to collect more logs with a >>> modified kernel package. >>> >>> >>> >>> 2013/4/12 Brian Foster >>> >>>> On 04/11/2013 08:45 PM, =B7=FB=D3=C0=CC=CE wrote: >>>> > the workload is about: >>>> > 24 servers, replica(3) which means the distribute is 8 >>>> > load is about 3(TB)-8(TB) per day. >>>> > >>>> >>>> This describes your cluster, but not the workload (though cluster info >>>> is good too). What kind of workload is running on your clients (i.e., >>>> rsync jobs, etc.)? Are you running through native gluster mount points= , >>>> NFS mounts or a mix? Do you have any gluster internal operations runni= ng >>>> (i.e., rebalance, etc.). >>>> >>>> Is there any kind of pattern you can discern from the workload and whe= n >>>> the XFS error happens to occur? You have a good number of servers in >>>> play here, is there any kind of pattern in terms of which servers >>>> experience the error? Is it always the same servers or a random set? >>>> >>>> Brian >>>> >>>> > >>>> > 2013/4/12 Brian Foster >>> >> >>>> > >>>> > On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote: >>>> > > It happens tonight again on one of our servers, how to debug >>>> the root >>>> > > cause? Thank you. >>>> > > >>>> > >>>> > Hi, >>>> > >>>> > I've attached a system tap script (stap -v xfs.stp) that should >>>> > hopefully print out a bit more data should the issue happen >>>> again. Do >>>> > you have a small enough number of nodes (or predictable enough >>>> pattern) >>>> > that you could run this on the nodes that tend to fail and >>>> collect the >>>> > output? >>>> > >>>> > Also, could you collect an xfs_metadump of the filesystem in >>>> question >>>> > and make it available for download and analysis somewhere? I >>>> believe the >>>> > ideal approach is to mount/umount the filesystem first to replay >>>> the log >>>> > before collecting a metadump, but somebody could correct me on >>>> that (to >>>> > be safe, you could collect multiple dumps: pre-mount and >>>> post-mount). >>>> > >>>> > Could you also describe your workload a little bit? Thanks. >>>> > >>>> > Brian >>>> > >>>> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink_remove: >>>> > > xfs_inotobp() returned error 22. >>>> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactive: xfs_ifre= e >>>> > returned >>>> > > error 22 >>>> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): >>>> xfs_do_force_shutdown(0x1) >>>> > > called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return >>>> address =3D >>>> > > 0xffffffffa02ee20a >>>> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error Detected. >>>> Shutting >>>> > > down filesystem >>>> > > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umount the >>>> > filesystem and >>>> > > rectify the problem(s) >>>> > > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >>>> > returned. >>>> > > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >>>> > returned. >>>> > > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >>>> > returned. >>>> > > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_force: error 5 >>>> > returned. >>>> > > >>>> > > xfs_repair -n >>>> > > >>>> > > >>>> > > Phase 7 - verify link counts... >>>> > > would have reset inode 20021 nlinks from 0 to 1 >>>> > > would have reset inode 20789 nlinks from 0 to 1 >>>> > > would have reset inode 35125 nlinks from 0 to 1 >>>> > > would have reset inode 35637 nlinks from 0 to 1 >>>> > > would have reset inode 36149 nlinks from 0 to 1 >>>> > > would have reset inode 38197 nlinks from 0 to 1 >>>> > > would have reset inode 39477 nlinks from 0 to 1 >>>> > > would have reset inode 54069 nlinks from 0 to 1 >>>> > > would have reset inode 62261 nlinks from 0 to 1 >>>> > > would have reset inode 63029 nlinks from 0 to 1 >>>> > > would have reset inode 72501 nlinks from 0 to 1 >>>> > > would have reset inode 79925 nlinks from 0 to 1 >>>> > > would have reset inode 81205 nlinks from 0 to 1 >>>> > > would have reset inode 84789 nlinks from 0 to 1 >>>> > > would have reset inode 87861 nlinks from 0 to 1 >>>> > > would have reset inode 90663 nlinks from 0 to 1 >>>> > > would have reset inode 91189 nlinks from 0 to 1 >>>> > > would have reset inode 95541 nlinks from 0 to 1 >>>> > > would have reset inode 98101 nlinks from 0 to 1 >>>> > > would have reset inode 101173 nlinks from 0 to 1 >>>> > > would have reset inode 113205 nlinks from 0 to 1 >>>> > > would have reset inode 114741 nlinks from 0 to 1 >>>> > > would have reset inode 126261 nlinks from 0 to 1 >>>> > > would have reset inode 140597 nlinks from 0 to 1 >>>> > > would have reset inode 144693 nlinks from 0 to 1 >>>> > > would have reset inode 147765 nlinks from 0 to 1 >>>> > > would have reset inode 152885 nlinks from 0 to 1 >>>> > > would have reset inode 161333 nlinks from 0 to 1 >>>> > > would have reset inode 161845 nlinks from 0 to 1 >>>> > > would have reset inode 167477 nlinks from 0 to 1 >>>> > > would have reset inode 172341 nlinks from 0 to 1 >>>> > > would have reset inode 191797 nlinks from 0 to 1 >>>> > > would have reset inode 204853 nlinks from 0 to 1 >>>> > > would have reset inode 205365 nlinks from 0 to 1 >>>> > > would have reset inode 215349 nlinks from 0 to 1 >>>> > > would have reset inode 215861 nlinks from 0 to 1 >>>> > > would have reset inode 216373 nlinks from 0 to 1 >>>> > > would have reset inode 217397 nlinks from 0 to 1 >>>> > > would have reset inode 224309 nlinks from 0 to 1 >>>> > > would have reset inode 225589 nlinks from 0 to 1 >>>> > > would have reset inode 234549 nlinks from 0 to 1 >>>> > > would have reset inode 234805 nlinks from 0 to 1 >>>> > > would have reset inode 249653 nlinks from 0 to 1 >>>> > > would have reset inode 250677 nlinks from 0 to 1 >>>> > > would have reset inode 252469 nlinks from 0 to 1 >>>> > > would have reset inode 261429 nlinks from 0 to 1 >>>> > > would have reset inode 265013 nlinks from 0 to 1 >>>> > > would have reset inode 266805 nlinks from 0 to 1 >>>> > > would have reset inode 267317 nlinks from 0 to 1 >>>> > > would have reset inode 268853 nlinks from 0 to 1 >>>> > > would have reset inode 272437 nlinks from 0 to 1 >>>> > > would have reset inode 273205 nlinks from 0 to 1 >>>> > > would have reset inode 274229 nlinks from 0 to 1 >>>> > > would have reset inode 278325 nlinks from 0 to 1 >>>> > > would have reset inode 278837 nlinks from 0 to 1 >>>> > > would have reset inode 281397 nlinks from 0 to 1 >>>> > > would have reset inode 292661 nlinks from 0 to 1 >>>> > > would have reset inode 300853 nlinks from 0 to 1 >>>> > > would have reset inode 302901 nlinks from 0 to 1 >>>> > > would have reset inode 305205 nlinks from 0 to 1 >>>> > > would have reset inode 314165 nlinks from 0 to 1 >>>> > > would have reset inode 315189 nlinks from 0 to 1 >>>> > > would have reset inode 320309 nlinks from 0 to 1 >>>> > > would have reset inode 324917 nlinks from 0 to 1 >>>> > > would have reset inode 328245 nlinks from 0 to 1 >>>> > > would have reset inode 335925 nlinks from 0 to 1 >>>> > > would have reset inode 339253 nlinks from 0 to 1 >>>> > > would have reset inode 339765 nlinks from 0 to 1 >>>> > > would have reset inode 348213 nlinks from 0 to 1 >>>> > > would have reset inode 360501 nlinks from 0 to 1 >>>> > > would have reset inode 362037 nlinks from 0 to 1 >>>> > > would have reset inode 366389 nlinks from 0 to 1 >>>> > > would have reset inode 385845 nlinks from 0 to 1 >>>> > > would have reset inode 390709 nlinks from 0 to 1 >>>> > > would have reset inode 409141 nlinks from 0 to 1 >>>> > > would have reset inode 413237 nlinks from 0 to 1 >>>> > > would have reset inode 414773 nlinks from 0 to 1 >>>> > > would have reset inode 417845 nlinks from 0 to 1 >>>> > > would have reset inode 436021 nlinks from 0 to 1 >>>> > > would have reset inode 439349 nlinks from 0 to 1 >>>> > > would have reset inode 447029 nlinks from 0 to 1 >>>> > > would have reset inode 491317 nlinks from 0 to 1 >>>> > > would have reset inode 494133 nlinks from 0 to 1 >>>> > > would have reset inode 495413 nlinks from 0 to 1 >>>> > > would have reset inode 501301 nlinks from 0 to 1 >>>> > > would have reset inode 506421 nlinks from 0 to 1 >>>> > > would have reset inode 508469 nlinks from 0 to 1 >>>> > > would have reset inode 508981 nlinks from 0 to 1 >>>> > > would have reset inode 511797 nlinks from 0 to 1 >>>> > > would have reset inode 513077 nlinks from 0 to 1 >>>> > > would have reset inode 517941 nlinks from 0 to 1 >>>> > > would have reset inode 521013 nlinks from 0 to 1 >>>> > > would have reset inode 522805 nlinks from 0 to 1 >>>> > > would have reset inode 523317 nlinks from 0 to 1 >>>> > > would have reset inode 525621 nlinks from 0 to 1 >>>> > > would have reset inode 527925 nlinks from 0 to 1 >>>> > > would have reset inode 535605 nlinks from 0 to 1 >>>> > > would have reset inode 541749 nlinks from 0 to 1 >>>> > > would have reset inode 573493 nlinks from 0 to 1 >>>> > > would have reset inode 578613 nlinks from 0 to 1 >>>> > > would have reset inode 583029 nlinks from 0 to 1 >>>> > > would have reset inode 585525 nlinks from 0 to 1 >>>> > > would have reset inode 586293 nlinks from 0 to 1 >>>> > > would have reset inode 586805 nlinks from 0 to 1 >>>> > > would have reset inode 591413 nlinks from 0 to 1 >>>> > > would have reset inode 594485 nlinks from 0 to 1 >>>> > > would have reset inode 596277 nlinks from 0 to 1 >>>> > > would have reset inode 603189 nlinks from 0 to 1 >>>> > > would have reset inode 613429 nlinks from 0 to 1 >>>> > > would have reset inode 617781 nlinks from 0 to 1 >>>> > > would have reset inode 621877 nlinks from 0 to 1 >>>> > > would have reset inode 623925 nlinks from 0 to 1 >>>> > > would have reset inode 625205 nlinks from 0 to 1 >>>> > > would have reset inode 626741 nlinks from 0 to 1 >>>> > > would have reset inode 639541 nlinks from 0 to 1 >>>> > > would have reset inode 640053 nlinks from 0 to 1 >>>> > > would have reset inode 640565 nlinks from 0 to 1 >>>> > > would have reset inode 645173 nlinks from 0 to 1 >>>> > > would have reset inode 652853 nlinks from 0 to 1 >>>> > > would have reset inode 656181 nlinks from 0 to 1 >>>> > > would have reset inode 659253 nlinks from 0 to 1 >>>> > > would have reset inode 663605 nlinks from 0 to 1 >>>> > > would have reset inode 667445 nlinks from 0 to 1 >>>> > > would have reset inode 680757 nlinks from 0 to 1 >>>> > > would have reset inode 691253 nlinks from 0 to 1 >>>> > > would have reset inode 691765 nlinks from 0 to 1 >>>> > > would have reset inode 697653 nlinks from 0 to 1 >>>> > > would have reset inode 700469 nlinks from 0 to 1 >>>> > > would have reset inode 707893 nlinks from 0 to 1 >>>> > > would have reset inode 716853 nlinks from 0 to 1 >>>> > > would have reset inode 722229 nlinks from 0 to 1 >>>> > > would have reset inode 722741 nlinks from 0 to 1 >>>> > > would have reset inode 723765 nlinks from 0 to 1 >>>> > > would have reset inode 731957 nlinks from 0 to 1 >>>> > > would have reset inode 742965 nlinks from 0 to 1 >>>> > > would have reset inode 743477 nlinks from 0 to 1 >>>> > > would have reset inode 745781 nlinks from 0 to 1 >>>> > > would have reset inode 746293 nlinks from 0 to 1 >>>> > > would have reset inode 774453 nlinks from 0 to 1 >>>> > > would have reset inode 778805 nlinks from 0 to 1 >>>> > > would have reset inode 785013 nlinks from 0 to 1 >>>> > > would have reset inode 785973 nlinks from 0 to 1 >>>> > > would have reset inode 791349 nlinks from 0 to 1 >>>> > > would have reset inode 796981 nlinks from 0 to 1 >>>> > > would have reset inode 803381 nlinks from 0 to 1 >>>> > > would have reset inode 806965 nlinks from 0 to 1 >>>> > > would have reset inode 811798 nlinks from 0 to 1 >>>> > > would have reset inode 812310 nlinks from 0 to 1 >>>> > > would have reset inode 813078 nlinks from 0 to 1 >>>> > > would have reset inode 813607 nlinks from 0 to 1 >>>> > > would have reset inode 814183 nlinks from 0 to 1 >>>> > > would have reset inode 822069 nlinks from 0 to 1 >>>> > > would have reset inode 828469 nlinks from 0 to 1 >>>> > > would have reset inode 830005 nlinks from 0 to 1 >>>> > > would have reset inode 832053 nlinks from 0 to 1 >>>> > > would have reset inode 832565 nlinks from 0 to 1 >>>> > > would have reset inode 836661 nlinks from 0 to 1 >>>> > > would have reset inode 841013 nlinks from 0 to 1 >>>> > > would have reset inode 841525 nlinks from 0 to 1 >>>> > > would have reset inode 845365 nlinks from 0 to 1 >>>> > > would have reset inode 846133 nlinks from 0 to 1 >>>> > > would have reset inode 847157 nlinks from 0 to 1 >>>> > > would have reset inode 852533 nlinks from 0 to 1 >>>> > > would have reset inode 857141 nlinks from 0 to 1 >>>> > > would have reset inode 863271 nlinks from 0 to 1 >>>> > > would have reset inode 866855 nlinks from 0 to 1 >>>> > > would have reset inode 887861 nlinks from 0 to 1 >>>> > > would have reset inode 891701 nlinks from 0 to 1 >>>> > > would have reset inode 894773 nlinks from 0 to 1 >>>> > > would have reset inode 900149 nlinks from 0 to 1 >>>> > > would have reset inode 902197 nlinks from 0 to 1 >>>> > > would have reset inode 906293 nlinks from 0 to 1 >>>> > > would have reset inode 906805 nlinks from 0 to 1 >>>> > > would have reset inode 909877 nlinks from 0 to 1 >>>> > > would have reset inode 925493 nlinks from 0 to 1 >>>> > > would have reset inode 949543 nlinks from 0 to 1 >>>> > > would have reset inode 955175 nlinks from 0 to 1 >>>> > > would have reset inode 963623 nlinks from 0 to 1 >>>> > > would have reset inode 967733 nlinks from 0 to 1 >>>> > > would have reset inode 968231 nlinks from 0 to 1 >>>> > > would have reset inode 982069 nlinks from 0 to 1 >>>> > > would have reset inode 1007413 nlinks from 0 to 1 >>>> > > would have reset inode 1011509 nlinks from 0 to 1 >>>> > > would have reset inode 1014069 nlinks from 0 to 1 >>>> > > would have reset inode 1014581 nlinks from 0 to 1 >>>> > > would have reset inode 1022005 nlinks from 0 to 1 >>>> > > would have reset inode 1022517 nlinks from 0 to 1 >>>> > > would have reset inode 1023029 nlinks from 0 to 1 >>>> > > would have reset inode 1025333 nlinks from 0 to 1 >>>> > > would have reset inode 1043765 nlinks from 0 to 1 >>>> > > would have reset inode 1044789 nlinks from 0 to 1 >>>> > > would have reset inode 1049397 nlinks from 0 to 1 >>>> > > would have reset inode 1050933 nlinks from 0 to 1 >>>> > > would have reset inode 1051445 nlinks from 0 to 1 >>>> > > would have reset inode 1054261 nlinks from 0 to 1 >>>> > > would have reset inode 1060917 nlinks from 0 to 1 >>>> > > would have reset inode 1063477 nlinks from 0 to 1 >>>> > > would have reset inode 1076021 nlinks from 0 to 1 >>>> > > would have reset inode 1081141 nlinks from 0 to 1 >>>> > > would have reset inode 1086261 nlinks from 0 to 1 >>>> > > would have reset inode 1097269 nlinks from 0 to 1 >>>> > > would have reset inode 1099829 nlinks from 0 to 1 >>>> > > would have reset inode 1100853 nlinks from 0 to 1 >>>> > > would have reset inode 1101877 nlinks from 0 to 1 >>>> > > would have reset inode 1126709 nlinks from 0 to 1 >>>> > > would have reset inode 1134389 nlinks from 0 to 1 >>>> > > would have reset inode 1141045 nlinks from 0 to 1 >>>> > > would have reset inode 1141557 nlinks from 0 to 1 >>>> > > would have reset inode 1142581 nlinks from 0 to 1 >>>> > > would have reset inode 1148469 nlinks from 0 to 1 >>>> > > would have reset inode 1153333 nlinks from 0 to 1 >>>> > > would have reset inode 1181749 nlinks from 0 to 1 >>>> > > would have reset inode 1192245 nlinks from 0 to 1 >>>> > > would have reset inode 1198133 nlinks from 0 to 1 >>>> > > would have reset inode 1203765 nlinks from 0 to 1 >>>> > > would have reset inode 1221429 nlinks from 0 to 1 >>>> > > would have reset inode 1223989 nlinks from 0 to 1 >>>> > > would have reset inode 1235509 nlinks from 0 to 1 >>>> > > would have reset inode 1239349 nlinks from 0 to 1 >>>> > > would have reset inode 1240885 nlinks from 0 to 1 >>>> > > would have reset inode 1241397 nlinks from 0 to 1 >>>> > > would have reset inode 1241909 nlinks from 0 to 1 >>>> > > would have reset inode 1242421 nlinks from 0 to 1 >>>> > > would have reset inode 1244981 nlinks from 0 to 1 >>>> > > would have reset inode 1246517 nlinks from 0 to 1 >>>> > > would have reset inode 1253429 nlinks from 0 to 1 >>>> > > would have reset inode 1271861 nlinks from 0 to 1 >>>> > > would have reset inode 1274677 nlinks from 0 to 1 >>>> > > would have reset inode 1277749 nlinks from 0 to 1 >>>> > > would have reset inode 1278773 nlinks from 0 to 1 >>>> > > would have reset inode 1286709 nlinks from 0 to 1 >>>> > > would have reset inode 1288245 nlinks from 0 to 1 >>>> > > would have reset inode 1299765 nlinks from 0 to 1 >>>> > > would have reset inode 1302325 nlinks from 0 to 1 >>>> > > would have reset inode 1304885 nlinks from 0 to 1 >>>> > > would have reset inode 1305397 nlinks from 0 to 1 >>>> > > would have reset inode 1307509 nlinks from 0 to 1 >>>> > > would have reset inode 1309493 nlinks from 0 to 1 >>>> > > would have reset inode 1310517 nlinks from 0 to 1 >>>> > > would have reset inode 1311029 nlinks from 0 to 1 >>>> > > would have reset inode 1312053 nlinks from 0 to 1 >>>> > > would have reset inode 1316917 nlinks from 0 to 1 >>>> > > would have reset inode 1317941 nlinks from 0 to 1 >>>> > > would have reset inode 1320821 nlinks from 0 to 1 >>>> > > would have reset inode 1322805 nlinks from 0 to 1 >>>> > > would have reset inode 1332789 nlinks from 0 to 1 >>>> > > would have reset inode 1336373 nlinks from 0 to 1 >>>> > > would have reset inode 1345653 nlinks from 0 to 1 >>>> > > would have reset inode 1354549 nlinks from 0 to 1 >>>> > > would have reset inode 1361973 nlinks from 0 to 1 >>>> > > would have reset inode 1369909 nlinks from 0 to 1 >>>> > > would have reset inode 1372981 nlinks from 0 to 1 >>>> > > would have reset inode 1388853 nlinks from 0 to 1 >>>> > > would have reset inode 1402933 nlinks from 0 to 1 >>>> > > would have reset inode 1403445 nlinks from 0 to 1 >>>> > > would have reset inode 1420085 nlinks from 0 to 1 >>>> > > would have reset inode 1452853 nlinks from 0 to 1 >>>> > > would have reset inode 1456437 nlinks from 0 to 1 >>>> > > would have reset inode 1457973 nlinks from 0 to 1 >>>> > > would have reset inode 1459253 nlinks from 0 to 1 >>>> > > would have reset inode 1467957 nlinks from 0 to 1 >>>> > > would have reset inode 1471541 nlinks from 0 to 1 >>>> > > would have reset inode 1476661 nlinks from 0 to 1 >>>> > > would have reset inode 1479733 nlinks from 0 to 1 >>>> > > would have reset inode 1483061 nlinks from 0 to 1 >>>> > > would have reset inode 1484085 nlinks from 0 to 1 >>>> > > would have reset inode 1486133 nlinks from 0 to 1 >>>> > > would have reset inode 1489461 nlinks from 0 to 1 >>>> > > would have reset inode 1490037 nlinks from 0 to 1 >>>> > > would have reset inode 1492021 nlinks from 0 to 1 >>>> > > would have reset inode 1493557 nlinks from 0 to 1 >>>> > > would have reset inode 1494069 nlinks from 0 to 1 >>>> > > would have reset inode 1496885 nlinks from 0 to 1 >>>> > > would have reset inode 1498421 nlinks from 0 to 1 >>>> > > would have reset inode 1498933 nlinks from 0 to 1 >>>> > > would have reset inode 1499957 nlinks from 0 to 1 >>>> > > would have reset inode 1506101 nlinks from 0 to 1 >>>> > > would have reset inode 1507637 nlinks from 0 to 1 >>>> > > would have reset inode 1510453 nlinks from 0 to 1 >>>> > > would have reset inode 1514293 nlinks from 0 to 1 >>>> > > would have reset inode 1517365 nlinks from 0 to 1 >>>> > > would have reset inode 1520693 nlinks from 0 to 1 >>>> > > would have reset inode 1521973 nlinks from 0 to 1 >>>> > > would have reset inode 1530421 nlinks from 0 to 1 >>>> > > would have reset inode 1530933 nlinks from 0 to 1 >>>> > > would have reset inode 1537333 nlinks from 0 to 1 >>>> > > would have reset inode 1538357 nlinks from 0 to 1 >>>> > > would have reset inode 1548853 nlinks from 0 to 1 >>>> > > would have reset inode 1553973 nlinks from 0 to 1 >>>> > > would have reset inode 1557301 nlinks from 0 to 1 >>>> > > would have reset inode 1564213 nlinks from 0 to 1 >>>> > > would have reset inode 1564725 nlinks from 0 to 1 >>>> > > would have reset inode 1576501 nlinks from 0 to 1 >>>> > > would have reset inode 1580597 nlinks from 0 to 1 >>>> > > would have reset inode 1584693 nlinks from 0 to 1 >>>> > > would have reset inode 1586485 nlinks from 0 to 1 >>>> > > would have reset inode 1589301 nlinks from 0 to 1 >>>> > > would have reset inode 1589813 nlinks from 0 to 1 >>>> > > would have reset inode 1592629 nlinks from 0 to 1 >>>> > > would have reset inode 1595701 nlinks from 0 to 1 >>>> > > would have reset inode 1601077 nlinks from 0 to 1 >>>> > > would have reset inode 1623861 nlinks from 0 to 1 >>>> > > would have reset inode 1626677 nlinks from 0 to 1 >>>> > > would have reset inode 1627701 nlinks from 0 to 1 >>>> > > would have reset inode 1633333 nlinks from 0 to 1 >>>> > > would have reset inode 1639221 nlinks from 0 to 1 >>>> > > would have reset inode 1649205 nlinks from 0 to 1 >>>> > > would have reset inode 1686325 nlinks from 0 to 1 >>>> > > would have reset inode 1690677 nlinks from 0 to 1 >>>> > > would have reset inode 1693749 nlinks from 0 to 1 >>>> > > would have reset inode 1704757 nlinks from 0 to 1 >>>> > > would have reset inode 1707061 nlinks from 0 to 1 >>>> > > would have reset inode 1709109 nlinks from 0 to 1 >>>> > > would have reset inode 1719349 nlinks from 0 to 1 >>>> > > would have reset inode 1737013 nlinks from 0 to 1 >>>> > > would have reset inode 1741365 nlinks from 0 to 1 >>>> > > would have reset inode 1747509 nlinks from 0 to 1 >>>> > > would have reset inode 1770805 nlinks from 0 to 1 >>>> > > would have reset inode 1780789 nlinks from 0 to 1 >>>> > > would have reset inode 1793589 nlinks from 0 to 1 >>>> > > would have reset inode 1795125 nlinks from 0 to 1 >>>> > > would have reset inode 1800757 nlinks from 0 to 1 >>>> > > would have reset inode 1801269 nlinks from 0 to 1 >>>> > > would have reset inode 1802549 nlinks from 0 to 1 >>>> > > would have reset inode 1804085 nlinks from 0 to 1 >>>> > > would have reset inode 1817141 nlinks from 0 to 1 >>>> > > would have reset inode 1821749 nlinks from 0 to 1 >>>> > > would have reset inode 1832757 nlinks from 0 to 1 >>>> > > would have reset inode 1836341 nlinks from 0 to 1 >>>> > > would have reset inode 1856309 nlinks from 0 to 1 >>>> > > would have reset inode 1900597 nlinks from 0 to 1 >>>> > > would have reset inode 1902901 nlinks from 0 to 1 >>>> > > would have reset inode 1912373 nlinks from 0 to 1 >>>> > > would have reset inode 1943093 nlinks from 0 to 1 >>>> > > would have reset inode 1944373 nlinks from 0 to 1 >>>> > > would have reset inode 1954101 nlinks from 0 to 1 >>>> > > would have reset inode 1955893 nlinks from 0 to 1 >>>> > > would have reset inode 1961781 nlinks from 0 to 1 >>>> > > would have reset inode 1974325 nlinks from 0 to 1 >>>> > > would have reset inode 1978677 nlinks from 0 to 1 >>>> > > would have reset inode 1981237 nlinks from 0 to 1 >>>> > > would have reset inode 1992245 nlinks from 0 to 1 >>>> > > would have reset inode 2000949 nlinks from 0 to 1 >>>> > > would have reset inode 2002229 nlinks from 0 to 1 >>>> > > would have reset inode 2004789 nlinks from 0 to 1 >>>> > > would have reset inode 2005301 nlinks from 0 to 1 >>>> > > would have reset inode 2011189 nlinks from 0 to 1 >>>> > > would have reset inode 2012981 nlinks from 0 to 1 >>>> > > would have reset inode 2015285 nlinks from 0 to 1 >>>> > > would have reset inode 2018869 nlinks from 0 to 1 >>>> > > would have reset inode 2028341 nlinks from 0 to 1 >>>> > > would have reset inode 2028853 nlinks from 0 to 1 >>>> > > would have reset inode 2030901 nlinks from 0 to 1 >>>> > > would have reset inode 2032181 nlinks from 0 to 1 >>>> > > would have reset inode 2032693 nlinks from 0 to 1 >>>> > > would have reset inode 2040117 nlinks from 0 to 1 >>>> > > would have reset inode 2053685 nlinks from 0 to 1 >>>> > > would have reset inode 2083893 nlinks from 0 to 1 >>>> > > would have reset inode 2087221 nlinks from 0 to 1 >>>> > > would have reset inode 2095925 nlinks from 0 to 1 >>>> > > would have reset inode 2098741 nlinks from 0 to 1 >>>> > > would have reset inode 2100533 nlinks from 0 to 1 >>>> > > would have reset inode 2101301 nlinks from 0 to 1 >>>> > > would have reset inode 2123573 nlinks from 0 to 1 >>>> > > would have reset inode 2132789 nlinks from 0 to 1 >>>> > > would have reset inode 2133813 nlinks from 0 to 1 >>>> > > >>>> > > >>>> > > >>>> > > >>>> > > >>>> > > 2013/4/10 =B7=FB=D3=C0=CC=CE >>>> > >> >>>> > > >>>> > > The storage info is as following: >>>> > > RAID-6 >>>> > > SATA HDD >>>> > > Controller: PERC H710P Mini (Embedded) >>>> > > Disk /dev/sdb: 30000.3 GB, 30000346562560 bytes >>>> > > 255 heads, 63 sectors/track, 3647334 cylinders >>>> > > Units =3D cylinders of 16065 * 512 =3D 8225280 bytes >>>> > > Sector size (logical/physical): 512 bytes / 512 bytes >>>> > > I/O size (minimum/optimal): 512 bytes / 512 bytes >>>> > > Disk identifier: 0x00000000 >>>> > > >>>> > > sd 0:2:1:0: [sdb] 58594426880 512-byte logical blocks: (30= .0 >>>> > TB/27.2 >>>> > > TiB) >>>> > > sd 0:2:1:0: [sdb] Write Protect is off >>>> > > sd 0:2:1:0: [sdb] Mode Sense: 1f 00 00 08 >>>> > > sd 0:2:1:0: [sdb] Write cache: enabled, read cache: enable= d, >>>> > doesn't >>>> > > support DPO or FUA >>>> > > sd 0:2:1:0: [sdb] Attached SCSI disk >>>> > > >>>> > > *-storage >>>> > > description: RAID bus controller >>>> > > product: MegaRAID SAS 2208 [Thunderbolt] >>>> > > vendor: LSI Logic / Symbios Logic >>>> > > physical id: 0 >>>> > > bus info: pci@0000:02:00.0 >>>> > > logical name: scsi0 >>>> > > version: 01 >>>> > > width: 64 bits >>>> > > clock: 33MHz >>>> > > capabilities: storage pm pciexpress vpd msi msix >>>> bus_master >>>> > > cap_list rom >>>> > > configuration: driver=3Dmegaraid_sas latency=3D0 >>>> > > resources: irq:42 ioport:fc00(size=3D256) >>>> > > memory:dd7fc000-dd7fffff memory:dd780000-dd7bffff >>>> > > memory:dc800000-dc81ffff(prefetchable) >>>> > > *-disk:0 >>>> > > description: SCSI Disk >>>> > > product: PERC H710P >>>> > > vendor: DELL >>>> > > physical id: 2.0.0 >>>> > > bus info: scsi@0:2.0.0 >>>> > > logical name: /dev/sda >>>> > > version: 3.13 >>>> > > serial: 0049d6ce1d9f2035180096fde490f648 >>>> > > size: 558GiB (599GB) >>>> > > capabilities: partitioned partitioned:dos >>>> > > configuration: ansiversion=3D5 signature=3D000aa= 336 >>>> > > *-disk:1 >>>> > > description: SCSI Disk >>>> > > product: PERC H710P >>>> > > vendor: DELL >>>> > > physical id: 2.1.0 >>>> > > bus info: scsi@0:2.1.0 >>>> > > logical name: /dev/sdb >>>> > > logical name: /mnt/xfsd >>>> > > version: 3.13 >>>> > > serial: 003366f71da22035180096fde490f648 >>>> > > size: 27TiB (30TB) >>>> > > configuration: ansiversion=3D5 mount.fstype=3Dxf= s >>>> > > >>>> > >>>> mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64k,sunit=3D128,= swidth=3D1280,noquota >>>> > > state=3Dmounted >>>> > > >>>> > > Thank you. >>>> > > >>>> > > >>>> > > 2013/4/10 Emmanuel Florac >>> > >>>> > > >>> eflorac@intellique.com>>> >>>> > > >>>> > > Le Tue, 9 Apr 2013 23:10:03 +0800 >>>> > > =B7=FB=D3=C0=CC=CE >>>> > >> >>>> =A8=A6crivait: >>>> > > >>>> > > > > Apr 9 11:01:30 cqdx kernel: XFS (sdb): I/O Error >>>> > Detected. >>>> > > > > Shutting down filesystem >>>> > > >>>> > > This. I/O error detected. That means that at some poin= t >>>> the >>>> > > underlying >>>> > > device (disk, RAID array, SAN volume) couldn't be >>>> reached. >>>> > So this >>>> > > could very well be a case of a flakey drive, array, >>>> cable >>>> > or SCSI >>>> > > driver. >>>> > > >>>> > > What's the storage setup here? >>>> > > >>>> > > -- >>>> > > >>>> > >>>> ----------------------------------------------------------------------= -- >>>> > > Emmanuel Florac | Direction technique >>>> > > | Intellique >>>> > > | >>> > >>>> > > >>> > >> >>>> > > | +33 1 78 94 84 02 >>>> > >>>> > > >>>> > >>>> ----------------------------------------------------------------------= -- >>>> > > >>>> > > >>>> > > >>>> > > >>>> > > -- >>>> > > =B7=FB=D3=C0=CC=CE >>>> > > >>>> > > >>>> > > >>>> > > >>>> > > -- >>>> > > =B7=FB=D3=C0=CC=CE >>>> > > >>>> > > >>>> > > _______________________________________________ >>>> > > xfs mailing list >>>> > > xfs@oss.sgi.com >>>> > > http://oss.sgi.com/mailman/listinfo/xfs >>>> > > >>>> > >>>> > >>>> > >>>> > >>>> > -- >>>> > =B7=FB=D3=C0=CC=CE >>>> > >>>> > >>>> > _______________________________________________ >>>> > xfs mailing list >>>> > xfs@oss.sgi.com >>>> > http://oss.sgi.com/mailman/listinfo/xfs >>>> > >>>> >>>> >>> >>> >>> -- >>> =B7=FB=D3=C0=CC=CE >>> >> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --047d7b10d1b713721304da2a51b0 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
The error happens randomly among the servers and we still = can't find any clear pattern. And since there are few logs and we can&#= 39;t find any clue If it's hardware issue or software issue. And when x= fs shutdown happens no hardware alarms found too.


2013/4/= 12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
I have attached the xfs_metadump file to google drive and = is there any useful clue there? I don't know how to check the meta file= .
https://docs.google.com/file/d/0B7n2= C4T5tfNCdFBCTnNxNERmbWc/edit?usp=3Dsharing


2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com&g= t;
And I'm not sure what kind of information is impo= rtant to debug this issue?
Thank you.


2013/4/12 =B7=FB=D3=C0= =CC=CE <yongtaofu@gmail.com>
The xfs shutdown = error is always the same. (It happens about 20 times on about 50 servers du= ring last half year)
Recently the shutdown happens on the cluster with 24 servers(dis 8 * replic= a 3) during rebalance. The average work load of this cluster is more than 3= TB growth per day.
The work load including normal fops, rsync jobs, video encoding/decoding, l= ogging etc. through glusterfs native client of hundreds of machines.
The shutdown tend to happen when we run rebalance for the glusterfs clu= ster which I guess will trigger a lot of unlink operations?

Thank you very much. May be I can try to collect more logs with a= modified kernel package.



2013/4/12 Brian Foster <bfoster@redh= at.com>
On 04/11/2013 08:45 PM, =B7=FB=D3=C0=CC= =CE wrote:
> the workload is about:
> 24 servers, replica(3) which means the distribute is 8
> load is about 3(TB)-8(TB) per day.
>

This describes your cluster, but not the workload (though cluster inf= o
is good too). What kind of workload is running on your clients (i.e.,
rsync jobs, etc.)? Are you running through native gluster mount points,
NFS mounts or a mix? Do you have any gluster internal operations running (i.e., rebalance, etc.).

Is there any kind of pattern you can discern from the workload and when
the XFS error happens to occur? You have a good number of servers in
play here, is there any kind of pattern in terms of which servers
experience the error? Is it always the same servers or a random set?

Brian

>
> 2013/4/12 Brian Foster <bfoster@redhat.com <mailto:bfoster@redhat.com>>
>
>     On 04/11/2013 03:11 PM, =B7=FB=D3=C0=CC=CE wrote:
>     > It happens tonight again on one of our servers, how= to debug the root
>     > cause? Thank you.
>     >
>
>     Hi,
>
>     I've attached a system tap script (stap -v xfs.stp) = that should
>     hopefully print out a bit more data should the issue hap= pen again. Do
>     you have a small enough number of nodes (or predictable = enough pattern)
>     that you could run this on the nodes that tend to fail a= nd collect the
>     output?
>
>     Also, could you collect an xfs_metadump of the filesyste= m in question
>     and make it available for download and analysis somewher= e? I believe the
>     ideal approach is to mount/umount the filesystem first t= o replay the log
>     before collecting a metadump, but somebody could correct= me on that (to
>     be safe, you could collect multiple dumps: pre-mount and= post-mount).
>
>     Could you also describe your workload a little bit? Than= ks.
>
>     Brian
>
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_iunlink= _remove:
>     > xfs_inotobp() returned error 22.
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_inactiv= e: xfs_ifree
>     returned
>     > error 22
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): xfs_do_forc= e_shutdown(0x1)
>     > called from line 1184 of file fs/xfs/xfs_vnodeops.c= .  Return address =3D
>     > 0xffffffffa02ee20a
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): I/O Error D= etected. Shutting
>     > down filesystem
>     > Apr 12 02:32:10 cqdx kernel: XFS (sdb): Please umou= nt the
>     filesystem and
>     > rectify the problem(s)
>     > Apr 12 02:32:19 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     > Apr 12 02:32:49 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     > Apr 12 02:33:19 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     > Apr 12 02:33:49 cqdx kernel: XFS (sdb): xfs_log_for= ce: error 5
>     returned.
>     >
>     > xfs_repair -n
>     >
>     >
>     > Phase 7 - verify link counts...
>     > would have reset inode 20021 nlinks from 0 to 1
>     > would have reset inode 20789 nlinks from 0 to 1
>     > would have reset inode 35125 nlinks from 0 to 1
>     > would have reset inode 35637 nlinks from 0 to 1
>     > would have reset inode 36149 nlinks from 0 to 1
>     > would have reset inode 38197 nlinks from 0 to 1
>     > would have reset inode 39477 nlinks from 0 to 1
>     > would have reset inode 54069 nlinks from 0 to 1
>     > would have reset inode 62261 nlinks from 0 to 1
>     > would have reset inode 63029 nlinks from 0 to 1
>     > would have reset inode 72501 nlinks from 0 to 1
>     > would have reset inode 79925 nlinks from 0 to 1
>     > would have reset inode 81205 nlinks from 0 to 1
>     > would have reset inode 84789 nlinks from 0 to 1
>     > would have reset inode 87861 nlinks from 0 to 1
>     > would have reset inode 90663 nlinks from 0 to 1
>     > would have reset inode 91189 nlinks from 0 to 1
>     > would have reset inode 95541 nlinks from 0 to 1
>     > would have reset inode 98101 nlinks from 0 to 1
>     > would have reset inode 101173 nlinks from 0 to 1 >     > would have reset inode 113205 nlinks from 0 to 1 >     > would have reset inode 114741 nlinks from 0 to 1 >     > would have reset inode 126261 nlinks from 0 to 1 >     > would have reset inode 140597 nlinks from 0 to 1 >     > would have reset inode 144693 nlinks from 0 to 1 >     > would have reset inode 147765 nlinks from 0 to 1 >     > would have reset inode 152885 nlinks from 0 to 1 >     > would have reset inode 161333 nlinks from 0 to 1 >     > would have reset inode 161845 nlinks from 0 to 1 >     > would have reset inode 167477 nlinks from 0 to 1 >     > would have reset inode 172341 nlinks from 0 to 1 >     > would have reset inode 191797 nlinks from 0 to 1 >     > would have reset inode 204853 nlinks from 0 to 1 >     > would have reset inode 205365 nlinks from 0 to 1 >     > would have reset inode 215349 nlinks from 0 to 1 >     > would have reset inode 215861 nlinks from 0 to 1 >     > would have reset inode 216373 nlinks from 0 to 1 >     > would have reset inode 217397 nlinks from 0 to 1 >     > would have reset inode 224309 nlinks from 0 to 1 >     > would have reset inode 225589 nlinks from 0 to 1 >     > would have reset inode 234549 nlinks from 0 to 1 >     > would have reset inode 234805 nlinks from 0 to 1 >     > would have reset inode 249653 nlinks from 0 to 1 >     > would have reset inode 250677 nlinks from 0 to 1 >     > would have reset inode 252469 nlinks from 0 to 1 >     > would have reset inode 261429 nlinks from 0 to 1 >     > would have reset inode 265013 nlinks from 0 to 1 >     > would have reset inode 266805 nlinks from 0 to 1 >     > would have reset inode 267317 nlinks from 0 to 1 >     > would have reset inode 268853 nlinks from 0 to 1 >     > would have reset inode 272437 nlinks from 0 to 1 >     > would have reset inode 273205 nlinks from 0 to 1 >     > would have reset inode 274229 nlinks from 0 to 1 >     > would have reset inode 278325 nlinks from 0 to 1 >     > would have reset inode 278837 nlinks from 0 to 1 >     > would have reset inode 281397 nlinks from 0 to 1 >     > would have reset inode 292661 nlinks from 0 to 1 >     > would have reset inode 300853 nlinks from 0 to 1 >     > would have reset inode 302901 nlinks from 0 to 1 >     > would have reset inode 305205 nlinks from 0 to 1 >     > would have reset inode 314165 nlinks from 0 to 1 >     > would have reset inode 315189 nlinks from 0 to 1 >     > would have reset inode 320309 nlinks from 0 to 1 >     > would have reset inode 324917 nlinks from 0 to 1 >     > would have reset inode 328245 nlinks from 0 to 1 >     > would have reset inode 335925 nlinks from 0 to 1 >     > would have reset inode 339253 nlinks from 0 to 1 >     > would have reset inode 339765 nlinks from 0 to 1 >     > would have reset inode 348213 nlinks from 0 to 1 >     > would have reset inode 360501 nlinks from 0 to 1 >     > would have reset inode 362037 nlinks from 0 to 1 >     > would have reset inode 366389 nlinks from 0 to 1 >     > would have reset inode 385845 nlinks from 0 to 1 >     > would have reset inode 390709 nlinks from 0 to 1 >     > would have reset inode 409141 nlinks from 0 to 1 >     > would have reset inode 413237 nlinks from 0 to 1 >     > would have reset inode 414773 nlinks from 0 to 1 >     > would have reset inode 417845 nlinks from 0 to 1 >     > would have reset inode 436021 nlinks from 0 to 1 >     > would have reset inode 439349 nlinks from 0 to 1 >     > would have reset inode 447029 nlinks from 0 to 1 >     > would have reset inode 491317 nlinks from 0 to 1 >     > would have reset inode 494133 nlinks from 0 to 1 >     > would have reset inode 495413 nlinks from 0 to 1 >     > would have reset inode 501301 nlinks from 0 to 1 >     > would have reset inode 506421 nlinks from 0 to 1 >     > would have reset inode 508469 nlinks from 0 to 1 >     > would have reset inode 508981 nlinks from 0 to 1 >     > would have reset inode 511797 nlinks from 0 to 1 >     > would have reset inode 513077 nlinks from 0 to 1 >     > would have reset inode 517941 nlinks from 0 to 1 >     > would have reset inode 521013 nlinks from 0 to 1 >     > would have reset inode 522805 nlinks from 0 to 1 >     > would have reset inode 523317 nlinks from 0 to 1 >     > would have reset inode 525621 nlinks from 0 to 1 >     > would have reset inode 527925 nlinks from 0 to 1 >     > would have reset inode 535605 nlinks from 0 to 1 >     > would have reset inode 541749 nlinks from 0 to 1 >     > would have reset inode 573493 nlinks from 0 to 1 >     > would have reset inode 578613 nlinks from 0 to 1 >     > would have reset inode 583029 nlinks from 0 to 1 >     > would have reset inode 585525 nlinks from 0 to 1 >     > would have reset inode 586293 nlinks from 0 to 1 >     > would have reset inode 586805 nlinks from 0 to 1 >     > would have reset inode 591413 nlinks from 0 to 1 >     > would have reset inode 594485 nlinks from 0 to 1 >     > would have reset inode 596277 nlinks from 0 to 1 >     > would have reset inode 603189 nlinks from 0 to 1 >     > would have reset inode 613429 nlinks from 0 to 1 >     > would have reset inode 617781 nlinks from 0 to 1 >     > would have reset inode 621877 nlinks from 0 to 1 >     > would have reset inode 623925 nlinks from 0 to 1 >     > would have reset inode 625205 nlinks from 0 to 1 >     > would have reset inode 626741 nlinks from 0 to 1 >     > would have reset inode 639541 nlinks from 0 to 1 >     > would have reset inode 640053 nlinks from 0 to 1 >     > would have reset inode 640565 nlinks from 0 to 1 >     > would have reset inode 645173 nlinks from 0 to 1 >     > would have reset inode 652853 nlinks from 0 to 1 >     > would have reset inode 656181 nlinks from 0 to 1 >     > would have reset inode 659253 nlinks from 0 to 1 >     > would have reset inode 663605 nlinks from 0 to 1 >     > would have reset inode 667445 nlinks from 0 to 1 >     > would have reset inode 680757 nlinks from 0 to 1 >     > would have reset inode 691253 nlinks from 0 to 1 >     > would have reset inode 691765 nlinks from 0 to 1 >     > would have reset inode 697653 nlinks from 0 to 1 >     > would have reset inode 700469 nlinks from 0 to 1 >     > would have reset inode 707893 nlinks from 0 to 1 >     > would have reset inode 716853 nlinks from 0 to 1 >     > would have reset inode 722229 nlinks from 0 to 1 >     > would have reset inode 722741 nlinks from 0 to 1 >     > would have reset inode 723765 nlinks from 0 to 1 >     > would have reset inode 731957 nlinks from 0 to 1 >     > would have reset inode 742965 nlinks from 0 to 1 >     > would have reset inode 743477 nlinks from 0 to 1 >     > would have reset inode 745781 nlinks from 0 to 1 >     > would have reset inode 746293 nlinks from 0 to 1 >     > would have reset inode 774453 nlinks from 0 to 1 >     > would have reset inode 778805 nlinks from 0 to 1 >     > would have reset inode 785013 nlinks from 0 to 1 >     > would have reset inode 785973 nlinks from 0 to 1 >     > would have reset inode 791349 nlinks from 0 to 1 >     > would have reset inode 796981 nlinks from 0 to 1 >     > would have reset inode 803381 nlinks from 0 to 1 >     > would have reset inode 806965 nlinks from 0 to 1 >     > would have reset inode 811798 nlinks from 0 to 1 >     > would have reset inode 812310 nlinks from 0 to 1 >     > would have reset inode 813078 nlinks from 0 to 1 >     > would have reset inode 813607 nlinks from 0 to 1 >     > would have reset inode 814183 nlinks from 0 to 1 >     > would have reset inode 822069 nlinks from 0 to 1 >     > would have reset inode 828469 nlinks from 0 to 1 >     > would have reset inode 830005 nlinks from 0 to 1 >     > would have reset inode 832053 nlinks from 0 to 1 >     > would have reset inode 832565 nlinks from 0 to 1 >     > would have reset inode 836661 nlinks from 0 to 1 >     > would have reset inode 841013 nlinks from 0 to 1 >     > would have reset inode 841525 nlinks from 0 to 1 >     > would have reset inode 845365 nlinks from 0 to 1 >     > would have reset inode 846133 nlinks from 0 to 1 >     > would have reset inode 847157 nlinks from 0 to 1 >     > would have reset inode 852533 nlinks from 0 to 1 >     > would have reset inode 857141 nlinks from 0 to 1 >     > would have reset inode 863271 nlinks from 0 to 1 >     > would have reset inode 866855 nlinks from 0 to 1 >     > would have reset inode 887861 nlinks from 0 to 1 >     > would have reset inode 891701 nlinks from 0 to 1 >     > would have reset inode 894773 nlinks from 0 to 1 >     > would have reset inode 900149 nlinks from 0 to 1 >     > would have reset inode 902197 nlinks from 0 to 1 >     > would have reset inode 906293 nlinks from 0 to 1 >     > would have reset inode 906805 nlinks from 0 to 1 >     > would have reset inode 909877 nlinks from 0 to 1 >     > would have reset inode 925493 nlinks from 0 to 1 >     > would have reset inode 949543 nlinks from 0 to 1 >     > would have reset inode 955175 nlinks from 0 to 1 >     > would have reset inode 963623 nlinks from 0 to 1 >     > would have reset inode 967733 nlinks from 0 to 1 >     > would have reset inode 968231 nlinks from 0 to 1 >     > would have reset inode 982069 nlinks from 0 to 1 >     > would have reset inode 1007413 nlinks from 0 to 1 >     > would have reset inode 1011509 nlinks from 0 to 1 >     > would have reset inode 1014069 nlinks from 0 to 1 >     > would have reset inode 1014581 nlinks from 0 to 1 >     > would have reset inode 1022005 nlinks from 0 to 1 >     > would have reset inode 1022517 nlinks from 0 to 1 >     > would have reset inode 1023029 nlinks from 0 to 1 >     > would have reset inode 1025333 nlinks from 0 to 1 >     > would have reset inode 1043765 nlinks from 0 to 1 >     > would have reset inode 1044789 nlinks from 0 to 1 >     > would have reset inode 1049397 nlinks from 0 to 1 >     > would have reset inode 1050933 nlinks from 0 to 1 >     > would have reset inode 1051445 nlinks from 0 to 1 >     > would have reset inode 1054261 nlinks from 0 to 1 >     > would have reset inode 1060917 nlinks from 0 to 1 >     > would have reset inode 1063477 nlinks from 0 to 1 >     > would have reset inode 1076021 nlinks from 0 to 1 >     > would have reset inode 1081141 nlinks from 0 to 1 >     > would have reset inode 1086261 nlinks from 0 to 1 >     > would have reset inode 1097269 nlinks from 0 to 1 >     > would have reset inode 1099829 nlinks from 0 to 1 >     > would have reset inode 1100853 nlinks from 0 to 1 >     > would have reset inode 1101877 nlinks from 0 to 1 >     > would have reset inode 1126709 nlinks from 0 to 1 >     > would have reset inode 1134389 nlinks from 0 to 1 >     > would have reset inode 1141045 nlinks from 0 to 1 >     > would have reset inode 1141557 nlinks from 0 to 1 >     > would have reset inode 1142581 nlinks from 0 to 1 >     > would have reset inode 1148469 nlinks from 0 to 1 >     > would have reset inode 1153333 nlinks from 0 to 1 >     > would have reset inode 1181749 nlinks from 0 to 1 >     > would have reset inode 1192245 nlinks from 0 to 1 >     > would have reset inode 1198133 nlinks from 0 to 1 >     > would have reset inode 1203765 nlinks from 0 to 1 >     > would have reset inode 1221429 nlinks from 0 to 1 >     > would have reset inode 1223989 nlinks from 0 to 1 >     > would have reset inode 1235509 nlinks from 0 to 1 >     > would have reset inode 1239349 nlinks from 0 to 1 >     > would have reset inode 1240885 nlinks from 0 to 1 >     > would have reset inode 1241397 nlinks from 0 to 1 >     > would have reset inode 1241909 nlinks from 0 to 1 >     > would have reset inode 1242421 nlinks from 0 to 1 >     > would have reset inode 1244981 nlinks from 0 to 1 >     > would have reset inode 1246517 nlinks from 0 to 1 >     > would have reset inode 1253429 nlinks from 0 to 1 >     > would have reset inode 1271861 nlinks from 0 to 1 >     > would have reset inode 1274677 nlinks from 0 to 1 >     > would have reset inode 1277749 nlinks from 0 to 1 >     > would have reset inode 1278773 nlinks from 0 to 1 >     > would have reset inode 1286709 nlinks from 0 to 1 >     > would have reset inode 1288245 nlinks from 0 to 1 >     > would have reset inode 1299765 nlinks from 0 to 1 >     > would have reset inode 1302325 nlinks from 0 to 1 >     > would have reset inode 1304885 nlinks from 0 to 1 >     > would have reset inode 1305397 nlinks from 0 to 1 >     > would have reset inode 1307509 nlinks from 0 to 1 >     > would have reset inode 1309493 nlinks from 0 to 1 >     > would have reset inode 1310517 nlinks from 0 to 1 >     > would have reset inode 1311029 nlinks from 0 to 1 >     > would have reset inode 1312053 nlinks from 0 to 1 >     > would have reset inode 1316917 nlinks from 0 to 1 >     > would have reset inode 1317941 nlinks from 0 to 1 >     > would have reset inode 1320821 nlinks from 0 to 1 >     > would have reset inode 1322805 nlinks from 0 to 1 >     > would have reset inode 1332789 nlinks from 0 to 1 >     > would have reset inode 1336373 nlinks from 0 to 1 >     > would have reset inode 1345653 nlinks from 0 to 1 >     > would have reset inode 1354549 nlinks from 0 to 1 >     > would have reset inode 1361973 nlinks from 0 to 1 >     > would have reset inode 1369909 nlinks from 0 to 1 >     > would have reset inode 1372981 nlinks from 0 to 1 >     > would have reset inode 1388853 nlinks from 0 to 1 >     > would have reset inode 1402933 nlinks from 0 to 1 >     > would have reset inode 1403445 nlinks from 0 to 1 >     > would have reset inode 1420085 nlinks from 0 to 1 >     > would have reset inode 1452853 nlinks from 0 to 1 >     > would have reset inode 1456437 nlinks from 0 to 1 >     > would have reset inode 1457973 nlinks from 0 to 1 >     > would have reset inode 1459253 nlinks from 0 to 1 >     > would have reset inode 1467957 nlinks from 0 to 1 >     > would have reset inode 1471541 nlinks from 0 to 1 >     > would have reset inode 1476661 nlinks from 0 to 1 >     > would have reset inode 1479733 nlinks from 0 to 1 >     > would have reset inode 1483061 nlinks from 0 to 1 >     > would have reset inode 1484085 nlinks from 0 to 1 >     > would have reset inode 1486133 nlinks from 0 to 1 >     > would have reset inode 1489461 nlinks from 0 to 1 >     > would have reset inode 1490037 nlinks from 0 to 1 >     > would have reset inode 1492021 nlinks from 0 to 1 >     > would have reset inode 1493557 nlinks from 0 to 1 >     > would have reset inode 1494069 nlinks from 0 to 1 >     > would have reset inode 1496885 nlinks from 0 to 1 >     > would have reset inode 1498421 nlinks from 0 to 1 >     > would have reset inode 1498933 nlinks from 0 to 1 >     > would have reset inode 1499957 nlinks from 0 to 1 >     > would have reset inode 1506101 nlinks from 0 to 1 >     > would have reset inode 1507637 nlinks from 0 to 1 >     > would have reset inode 1510453 nlinks from 0 to 1 >     > would have reset inode 1514293 nlinks from 0 to 1 >     > would have reset inode 1517365 nlinks from 0 to 1 >     > would have reset inode 1520693 nlinks from 0 to 1 >     > would have reset inode 1521973 nlinks from 0 to 1 >     > would have reset inode 1530421 nlinks from 0 to 1 >     > would have reset inode 1530933 nlinks from 0 to 1 >     > would have reset inode 1537333 nlinks from 0 to 1 >     > would have reset inode 1538357 nlinks from 0 to 1 >     > would have reset inode 1548853 nlinks from 0 to 1 >     > would have reset inode 1553973 nlinks from 0 to 1 >     > would have reset inode 1557301 nlinks from 0 to 1 >     > would have reset inode 1564213 nlinks from 0 to 1 >     > would have reset inode 1564725 nlinks from 0 to 1 >     > would have reset inode 1576501 nlinks from 0 to 1 >     > would have reset inode 1580597 nlinks from 0 to 1 >     > would have reset inode 1584693 nlinks from 0 to 1 >     > would have reset inode 1586485 nlinks from 0 to 1 >     > would have reset inode 1589301 nlinks from 0 to 1 >     > would have reset inode 1589813 nlinks from 0 to 1 >     > would have reset inode 1592629 nlinks from 0 to 1 >     > would have reset inode 1595701 nlinks from 0 to 1 >     > would have reset inode 1601077 nlinks from 0 to 1 >     > would have reset inode 1623861 nlinks from 0 to 1 >     > would have reset inode 1626677 nlinks from 0 to 1 >     > would have reset inode 1627701 nlinks from 0 to 1 >     > would have reset inode 1633333 nlinks from 0 to 1 >     > would have reset inode 1639221 nlinks from 0 to 1 >     > would have reset inode 1649205 nlinks from 0 to 1 >     > would have reset inode 1686325 nlinks from 0 to 1 >     > would have reset inode 1690677 nlinks from 0 to 1 >     > would have reset inode 1693749 nlinks from 0 to 1 >     > would have reset inode 1704757 nlinks from 0 to 1 >     > would have reset inode 1707061 nlinks from 0 to 1 >     > would have reset inode 1709109 nlinks from 0 to 1 >     > would have reset inode 1719349 nlinks from 0 to 1 >     > would have reset inode 1737013 nlinks from 0 to 1 >     > would have reset inode 1741365 nlinks from 0 to 1 >     > would have reset inode 1747509 nlinks from 0 to 1 >     > would have reset inode 1770805 nlinks from 0 to 1 >     > would have reset inode 1780789 nlinks from 0 to 1 >     > would have reset inode 1793589 nlinks from 0 to 1 >     > would have reset inode 1795125 nlinks from 0 to 1 >     > would have reset inode 1800757 nlinks from 0 to 1 >     > would have reset inode 1801269 nlinks from 0 to 1 >     > would have reset inode 1802549 nlinks from 0 to 1 >     > would have reset inode 1804085 nlinks from 0 to 1 >     > would have reset inode 1817141 nlinks from 0 to 1 >     > would have reset inode 1821749 nlinks from 0 to 1 >     > would have reset inode 1832757 nlinks from 0 to 1 >     > would have reset inode 1836341 nlinks from 0 to 1 >     > would have reset inode 1856309 nlinks from 0 to 1 >     > would have reset inode 1900597 nlinks from 0 to 1 >     > would have reset inode 1902901 nlinks from 0 to 1 >     > would have reset inode 1912373 nlinks from 0 to 1 >     > would have reset inode 1943093 nlinks from 0 to 1 >     > would have reset inode 1944373 nlinks from 0 to 1 >     > would have reset inode 1954101 nlinks from 0 to 1 >     > would have reset inode 1955893 nlinks from 0 to 1 >     > would have reset inode 1961781 nlinks from 0 to 1 >     > would have reset inode 1974325 nlinks from 0 to 1 >     > would have reset inode 1978677 nlinks from 0 to 1 >     > would have reset inode 1981237 nlinks from 0 to 1 >     > would have reset inode 1992245 nlinks from 0 to 1 >     > would have reset inode 2000949 nlinks from 0 to 1 >     > would have reset inode 2002229 nlinks from 0 to 1 >     > would have reset inode 2004789 nlinks from 0 to 1 >     > would have reset inode 2005301 nlinks from 0 to 1 >     > would have reset inode 2011189 nlinks from 0 to 1 >     > would have reset inode 2012981 nlinks from 0 to 1 >     > would have reset inode 2015285 nlinks from 0 to 1 >     > would have reset inode 2018869 nlinks from 0 to 1 >     > would have reset inode 2028341 nlinks from 0 to 1 >     > would have reset inode 2028853 nlinks from 0 to 1 >     > would have reset inode 2030901 nlinks from 0 to 1 >     > would have reset inode 2032181 nlinks from 0 to 1 >     > would have reset inode 2032693 nlinks from 0 to 1 >     > would have reset inode 2040117 nlinks from 0 to 1 >     > would have reset inode 2053685 nlinks from 0 to 1 >     > would have reset inode 2083893 nlinks from 0 to 1 >     > would have reset inode 2087221 nlinks from 0 to 1 >     > would have reset inode 2095925 nlinks from 0 to 1 >     > would have reset inode 2098741 nlinks from 0 to 1 >     > would have reset inode 2100533 nlinks from 0 to 1 >     > would have reset inode 2101301 nlinks from 0 to 1 >     > would have reset inode 2123573 nlinks from 0 to 1 >     > would have reset inode 2132789 nlinks from 0 to 1 >     > would have reset inode 2133813 nlinks from 0 to 1 >     >
>     >
>     >
>     >
>     >
>     > 2013/4/10 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:<= a href=3D"mailto:yongtaofu@gmail.com" target=3D"_blank">yongtaofu@gmail.com= >
>     <mailto:yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>>= ;
>     >
>     >     The storage info is as following:
>     >     RAID-6
>     >     SATA HDD
>     >     Controller: PERC H710P Mini (Embedded= )
>     >     Disk /dev/sdb: 30000.3 GB, 3000034656= 2560 bytes
>     >     255 heads, 63 sectors/track, 3647334 = cylinders
>     >     Units =3D cylinders of 16065 * 512 = =3D 8225280 bytes
>     >     Sector size (logical/physical): 512 b= ytes / 512 bytes
>     >     I/O size (minimum/optimal): 512 bytes= / 512 bytes
>     >     Disk identifier: 0x00000000
>     >
>     >     sd 0:2:1:0: [sdb] 58594426880 512-byt= e logical blocks: (30.0
>     TB/27.2
>     >     TiB)
>     >     sd 0:2:1:0: [sdb] Write Protect is of= f
>     >     sd 0:2:1:0: [sdb] Mode Sense: 1f 00 0= 0 08
>     >     sd 0:2:1:0: [sdb] Write cache: enable= d, read cache: enabled,
>     doesn't
>     >     support DPO or FUA
>     >     sd 0:2:1:0: [sdb] Attached SCSI disk<= br> >     >
>     >     *-storage
>     >            descriptio= n: RAID bus controller
>     >            product: M= egaRAID SAS 2208 [Thunderbolt]
>     >            vendor: LS= I Logic / Symbios Logic
>     >            physical i= d: 0
>     >            bus info: = pci@0000:02:00.0
>     >            logical na= me: scsi0
>     >            version: 0= 1
>     >            width: 64 = bits
>     >            clock: 33M= Hz
>     >            capabiliti= es: storage pm pciexpress vpd msi msix bus_master
>     >     cap_list rom
>     >            configurat= ion: driver=3Dmegaraid_sas latency=3D0
>     >            resources:= irq:42 ioport:fc00(size=3D256)
>     >     memory:dd7fc000-dd7fffff memory:dd780= 000-dd7bffff
>     >     memory:dc800000-dc81ffff(prefetchable= )
>     >          *-disk:0
>     >               de= scription: SCSI Disk
>     >               pr= oduct: PERC H710P
>     >               ve= ndor: DELL
>     >               ph= ysical id: 2.0.0
>     >               bu= s info: scsi@0:2.0.0
>     >               lo= gical name: /dev/sda
>     >               ve= rsion: 3.13
>     >               se= rial: 0049d6ce1d9f2035180096fde490f648
>     >               si= ze: 558GiB (599GB)
>     >               ca= pabilities: partitioned partitioned:dos
>     >               co= nfiguration: ansiversion=3D5 signature=3D000aa336
>     >          *-disk:1
>     >               de= scription: SCSI Disk
>     >               pr= oduct: PERC H710P
>     >               ve= ndor: DELL
>     >               ph= ysical id: 2.1.0
>     >               bu= s info: scsi@0:2.1.0
>     >               lo= gical name: /dev/sdb
>     >               lo= gical name: /mnt/xfsd
>     >               ve= rsion: 3.13
>     >               se= rial: 003366f71da22035180096fde490f648
>     >               si= ze: 27TiB (30TB)
>     >               co= nfiguration: ansiversion=3D5 mount.fstype=3Dxfs
>     >
>     mount.options=3Drw,relatime,attr2,delaylog,logbsize=3D64= k,sunit=3D128,swidth=3D1280,noquota
>     >     state=3Dmounted
>     >
>     >     Thank you.
>     >
>     >
>     >     2013/4/10 Emmanuel Florac <eflorac@intellique.com=
>     <mailto:eflorac@intellique.com>
>     >     <mailto:eflorac@intellique.com &l= t;mailto:eflora= c@intellique.com>>>
>     >
>     >         Le Tue, 9 Apr 2013 23:1= 0:03 +0800
>     >         =B7=FB=D3=C0=CC=CE <= yongtaofu@gmail.co= m <mailto:y= ongtaofu@gmail.com>
>     <mailto:yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>> =A8= =A6crivait:
>     >
>     >         > > Apr  9 1= 1:01:30 cqdx kernel: XFS (sdb): I/O Error
>     Detected.
>     >         > > Shutting down= filesystem
>     >
>     >         This. I/O error detecte= d. That means that at some point the
>     >         underlying
>     >         device (disk, RAID arra= y, SAN volume) couldn't be reached.
>     So this
>     >         could very well be a ca= se of a flakey drive, array, cable
>     or SCSI
>     >         driver.
>     >
>     >         What's the storage = setup here?
>     >
>     >         --
>     >
>     --------------------------------------------------------= ----------------
>     >         Emmanuel Florac   =   |   Direction technique
>     >               &n= bsp;             |   Intellique
>     >               &n= bsp;             |   <eflorac@intellique.com
>     <mailto:eflorac@intellique.com>
>     >         <mailto:eflorac@intellique.co= m
>     <mailto:eflorac@intellique.com>>>
>     >               &n= bsp;             |   +33 1 78 94 84 02
>     <tel:%2B33%201%2078%2094%2084%2002>
>     >
>     --------------------------------------------------------= ----------------
>     >
>     >
>     >
>     >
>     >     --
>     >     =B7=FB=D3=C0=CC=CE
>     >
>     >
>     >
>     >
>     > --
>     > =B7=FB=D3=C0=CC=CE
>     >
>     >
>     > _______________________________________________
>     > xfs mailing list
>     > xfs@oss.sgi.com <mailto:xfs@oss.sgi.com>
>     > http://oss.sgi.com/mailman/listinfo/xfs >     >
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE
>
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
>
= http://oss.sgi.com/mailman/listinfo/xfs
>




= --
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--047d7b10d1b713721304da2a51b0-- From hvillar@surgery.arizona.edu Fri Apr 12 09:13:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LOTS_OF_MONEY,T_MONEY_PERCENT autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 181DE29DFA for ; Fri, 12 Apr 2013 09:13:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 051BD8F80AD for ; Fri, 12 Apr 2013 07:12:57 -0700 (PDT) X-ASG-Debug-ID: 1365775973-04cb6c2c1df77b0001-NocioJ Received: from smtp1.medadmin.arizona.edu (smtp1.medadmin.arizona.edu [128.196.161.215]) by cuda.sgi.com with ESMTP id MFKG6aaSEUqXvciP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 12 Apr 2013 07:12:54 -0700 (PDT) X-Barracuda-Envelope-From: hvillar@surgery.arizona.edu X-Barracuda-Apparent-Source-IP: 128.196.161.215 X-Barracuda-IPDD: Level2 [surgery.arizona.edu/128.196.161.215] X-Barracuda-IPDD: Level2 [surgery.arizona.edu/128.196.161.215] Received: from pps.filterd (smtp1 [127.0.0.1]) by smtp1.medadmin.arizona.edu (8.14.4/8.14.4) with SMTP id r3CE6hT7023588; Fri, 12 Apr 2013 07:12:41 -0700 X-Barracuda-IPDD: Level2 [surgery.arizona.edu/128.196.161.215] X-Barracuda-IPDD: Level2 [surgery.arizona.edu/128.196.161.215] X-Barracuda-IPDD: Level2 [surgery.arizona.edu/128.196.161.215] X-Barracuda-IPDD: Level2 [surgery.arizona.edu/128.196.161.215] X-Barracuda-IPDD: Level2 [surgery.arizona.edu/128.196.161.215] X-Barracuda-IPDD: Level2 [surgery.arizona.edu/128.196.161.215] Received: from cas1.medadmin.arizona.edu (mail.MedAdmin.Arizona.EDU [128.196.161.31]) by smtp1.medadmin.arizona.edu with ESMTP id 1ayt4wka2c-13 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NOT); Fri, 12 Apr 2013 07:12:41 -0700 Received: from tagliaficosrv.interni.tagliafico.com (95.224.19.51) by CAS1.medadmin.arizona.edu (128.196.161.31) with Microsoft SMTP Server (TLS) id 14.1.438.0; Fri, 12 Apr 2013 07:12:39 -0700 Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Subject: Re: Charity Projects For Orphans To: Recipients X-ASG-Orig-Subj: Re: Charity Projects For Orphans From: "Mr. William Billington" Date: Fri, 12 Apr 2013 16:12:30 +0200 Reply-To: Message-ID: <21452828-864b-49b4-8bd4-bda20306f65f@CAS1.medadmin.arizona.edu> X-Originating-IP: [95.224.19.51] X-Barracuda-Connect: smtp1.medadmin.arizona.edu[128.196.161.215] X-Barracuda-Start-Time: 1365775974 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Fingerprint-Found: *Phishing.Intl.Money.Scams-23347 (a8cd7b5ed0b5c117e8745ac1fbe0082a-232-txt) This is based on blind trust, hoping that you will expand my wishes as desi= red. I have US$200 Million for charity projects. You will be getting 20% of= total funds as your commission if interested. = Regards, = Mr. William Billington From tdm@sgi.com Fri Apr 12 09:41:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 47E3F29DFA for ; Fri, 12 Apr 2013 09:41:52 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0E3E2304039; Fri, 12 Apr 2013 07:41:48 -0700 (PDT) Received: from [128.162.232.11] (porter.americas.sgi.com [128.162.232.11]) by estes.americas.sgi.com (Postfix) with ESMTP id D52ED7001F30; Fri, 12 Apr 2013 09:41:48 -0500 (CDT) Message-ID: <51681D2C.8040401@sgi.com> Date: Fri, 12 Apr 2013 09:41:48 -0500 From: Troy McCorkell User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091204 Thunderbird/3.0 MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: Deprecating xfs_check References: <1365716708.3762.32154.camel@chandra-dt.ibm.com> <20130411221754.GI22182@sgi.com> <516740B8.4030704@sgi.com> <20130412010407.GE31207@dastard> In-Reply-To: <20130412010407.GE31207@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/11/2013 08:04 PM, Dave Chinner wrote: > [compendium reply] > > On Thu, Apr 11, 2013 at 06:01:12PM -0500, Troy McCorkell wrote: > >> On 04/11/2013 05:17 PM, Ben Myers wrote: >> >>> Hey Chandra, >>> >>> On Thu, Apr 11, 2013 at 04:45:08PM -0500, Chandra Seetharaman wrote: >>> >>>> Hello All, >>>> >>>> Alex Elder mentioned about deprecating xfs_check, and he suggested is to >>>> replace xfs_check command with a script, that says xfs_check is >>>> deprecated, use "xfs_repair -n". >>>> >>>> Sounds ok ? >>>> > Yes. I'd suggest that you also put a removal date in the output, > such as: > > "xfs_check is deprecated and scheduled for removal in June 2014. > Please use xfs_repair -n instead." > > The same information needs to go into the xfs_check man page. > > xfstests also still needs to run xfs_check. That means we also need > either an override flag an make $XFS_CHECK_PROG have it set > appropriately or add an internal xfs_db wrapper that runs the > xfs_check functionality appropriately. The second is probably the > better option... > > >>>> Let me know if it is not the right approach. >>>> >>> That sounds ok to me. You might also consider making xfs_check a hardlink to >>> xfs_repair and varying the behavior based on program name. Then xfs_check == >>> xfs_repair -n. >>> > xfs_check is a shell script wrapper around xfs_db, so modifying the > shell script is the right thing to do at this point in time. > > >> Does "xfs_repair -n" need to provide all of the functionality that xfs_check >> provides before it is replaced? >> > It already does. > > >> xfs_check can be run on a filesystem mounted read-only. xfs_repair >> -n can not. >> > -d Repair dangerously. Allow xfs_repair to repair an XFS filesystem mounted read only. This is typically done on a root fileystem from single user > mode, immediately followed by a reboot. > > > $ sudo mount -o remount,ro /mnt/scratch > $ grep scratch /proc/mounts > /dev/vdc /mnt/scratch xfs ro,relatime,attr2,nobarrier,inode64,logbsize=256k,noquota 0 0 > $ sudo xfs_repair -dn /dev/vdc > Phase 1 - find and verify superblock... > Version 5 superblock detected. xfsprogs has EXPERIMENTAL support enabled! > Use of these features is at your own risk! > Not enough RAM available for repair to enable prefetching. > This will be _slow_. > You need at least 16061MB RAM to run with prefetching enabled. > Phase 2 - using internal log > - scan filesystem freespace and inode maps... > .... > - agno = 98 > - agno = 99 > No modify flag set, skipping phase 5 > Phase 6 - check inode connectivity... > - traversing filesystem ... > - traversal finished ... > - moving disconnected inodes to lost+found ... > Phase 7 - verify link counts... > No modify flag set, skipping filesystem flush and exiting. > $ > > So it works just fine on read-only filesystems... > > (Oh, yeah, that's a 100TB metadata crc enabled filesystem with 50 > million inodes in it ;) > > >> xfs_check has two options: >> -i ino Specifies verbose behavior for the specified inode ino. >> -b bno Specifies verbose behavior for the specific filesystem >> block at bno. >> which are not available with xfs_repair. >> > I've never used either of them in 10 years. If they are needed, you > can still use xfs_db to get that information directly: > > # xfs_db -F -i -p xfs_check -c "check -i ino" > > So, really, we are not losing any xfs_check functionality at all - > all we are doing is deprecating the user facing interface to it. > > Cheers, > > Dave. > Dave, Thanks for the thorough explanation! I agree, time to deprecate xfs_check. Thanks, Troy From yongtaofu@gmail.com Fri Apr 12 09:48:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B287229DFA for ; Fri, 12 Apr 2013 09:48:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9A4688F80AC for ; Fri, 12 Apr 2013 07:48:49 -0700 (PDT) X-ASG-Debug-ID: 1365778128-04cb6c2c1efb920001-NocioJ Received: from mail-ie0-f178.google.com (mail-ie0-f178.google.com [209.85.223.178]) by cuda.sgi.com with ESMTP id 4EsPvN3fLsF8icV9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 07:48:48 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] Received: by mail-ie0-f178.google.com with SMTP id bn7so3373535ieb.37 for ; Fri, 12 Apr 2013 07:48:47 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=NlT70mVxSlIzzQBAbwdljdKHyUZ6rDHiyJUgqJ4kHVQ=; b=hE60pY0eJPlmZXaWi6bJckVNDqIWZVrRp+7m7nvOeklON9zzH08MWkOqi3iLZu5TUA 2DliouAOO1Wrs7ItLhmvoWpggizYCvWRtOfaKPBMoMAScHuq104uFbPJiTCZnJAziKop 0NgbD++Ot/Mg9qVhsjmT/pKsgSpaYtb6GFjreCtk+hlqZzC8krabpy0lIMTLaQ0d7p6O wp6/vjvEEJKcHpLpkcCVQLQBAa8IulmerCNhEroGRjfU1nSnBm5zru2rADCdxWwwcYMa 5dDb+EicujHzZlDL01O55PjWWUZdpfWpsEQ9w14s7ZJmHnJmxXhKqSNwVyMkmE06X6f6 knnw== MIME-Version: 1.0 X-Received: by 10.50.192.165 with SMTP id hh5mr1871431igc.89.1365778127745; Fri, 12 Apr 2013 07:48:47 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Fri, 12 Apr 2013 07:48:47 -0700 (PDT) In-Reply-To: <516800F7.80502@redhat.com> References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> <516800F7.80502@redhat.com> Date: Fri, 12 Apr 2013 22:48:47 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Eric Sandeen , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae93408652587d804da2b0054 X-Barracuda-Connect: mail-ie0-f178.google.com[209.85.223.178] X-Barracuda-Start-Time: 1365778128 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127913 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 --14dae93408652587d804da2b0054 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brian, Your scripts works for me now after I installed all the rpm built out from kernel srpm. I'll try it. Thank you. 2013/4/12 Brian Foster > On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote: > > Dear xfs experts, > > Can I just call xfs_stack_trace(); in the second line of > > xfs_do_force_shutdown() to print stack and rebuild kernel to check > > what's the error? > > > > I suppose that's a start. If you're willing/able to create and run a > modified kernel for the purpose of collecting more debug info, perhaps > we can get a bit more creative in collecting more data on the problem > (but a stack trace there is a good start). > > BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp) > check almost halfway into the function to avoid duplicate messages. > > Brian > > > > > 2013/4/12 =B7=FB=D3=C0=CC=CE > > > > > Hi Brian, > > What else I'm missing? Thank you. > > stap -e 'probe module("xfs").function("xfs_iunlink"){}' > > > > WARNING: cannot find module xfs debuginfo: No DWARF information fou= nd > > semantic error: no match while resolving probe point > > module("xfs").function("xfs_iunlink") > > Pass 2: analysis failed. Try again with another '--vp 01' option. > > > > > > 2013/4/12 =B7=FB=D3=C0=CC=CE > > > > > ls -l > > > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.deb= ug > > -r--r--r-- 1 root root 21393024 Apr 12 12:08 > > > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.deb= ug > > > > rpm -qa|grep kernel > > kernel-headers-2.6.32-279.el6.x86_64 > > kernel-devel-2.6.32-279.el6.x86_64 > > kernel-2.6.32-358.el6.x86_64 > > kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 > > abrt-addon-kerneloops-2.0.8-6.el6.x86_64 > > kernel-firmware-2.6.32-358.el6.noarch > > kernel-debug-2.6.32-358.el6.x86_64 > > kernel-debuginfo-2.6.32-279.el6.x86_64 > > dracut-kernel-004-283.el6.noarch > > libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 > > kernel-devel-2.6.32-358.el6.x86_64 > > kernel-2.6.32-279.el6.x86_64 > > > > rpm -q kernel-debuginfo > > kernel-debuginfo-2.6.32-279.el6.x86_64 > > > > rpm -q kernel > > kernel-2.6.32-279.el6.x86_64 > > kernel-2.6.32-358.el6.x86_64 > > > > do I need to re probe it? > > > > > > 2013/4/12 Eric Sandeen > > > > > > On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote: > > > Hi Brian, > > > Sorry but when I execute the script it says: > > > WARNING: cannot find module xfs debuginfo: No DWARF > > information found > > > semantic error: no match while resolving probe point > > module("xfs").function("xfs_iunlink") > > > > > > uname -a > > > 2.6.32-279.el6.x86_64 > > > kernel debuginfo has been installed. > > > > > > Where can I find the correct xfs debuginfo? > > > > it should be in the kernel-debuginfo rpm (of the same > > version/release as the kernel rpm you're running) > > > > You should have: > > > > > /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.deb= ug > > > > If not, can you show: > > > > # uname -a > > # rpm -q kernel > > # rpm -q kernel-debuginfo > > > > -Eric > > > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > --=20 =B7=FB=D3=C0=CC=CE --14dae93408652587d804da2b0054 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brian,

Your scripts works for me now = after I installed all the rpm built out from kernel srpm. I'll try it. = Thank you.


2013/4/12 Brian Foster <bfoster@redhat.com>
On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote:
> Dear xfs experts,
> Can I just call xfs_stack_trace(); in the second line of
> xfs_do_force_shutdown() to print stack and rebuild kernel to check
> what's the error?
>

I suppose that's a start. If you're willing/able to create an= d run a
modified kernel for the purpose of collecting more debug info, perhaps
we can get a bit more creative in collecting more data on the problem
(but a stack trace there is a good start).

BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp)
check almost halfway into the function to avoid duplicate messages.

Brian

>
> 2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     Hi Brian,
>     What else I'm missing? Thank you.
>     stap -e 'probe module("xfs").function(&quo= t;xfs_iunlink"){}'
>
>     WARNING: cannot find module xfs debuginfo: No DWARF info= rmation found
>     semantic error: no match while resolving probe point
>     module("xfs").function("xfs_iunlink"= )
>     Pass 2: analysis failed.  Try again with another &#= 39;--vp 01' option.
>
>
>     2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>         ls -l
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>         -r--r--r-- 1 root root 21393024 Apr 12 12:= 08
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>
>         rpm -qa|grep  kernel
>         kernel-headers-2.6.32-279.el6.x86_64
>         kernel-devel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>         kernel-debuginfo-common-x86_64-2.6.32-279.= el6.x86_64
>         abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >         kernel-firmware-2.6.32-358.el6.noarch
>         kernel-debug-2.6.32-358.el6.x86_64
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>         dracut-kernel-004-283.el6.noarch
>         libreport-plugin-kerneloops-2.0.9-5.el6.x8= 6_64
>         kernel-devel-2.6.32-358.el6.x86_64
>         kernel-2.6.32-279.el6.x86_64
>
>         rpm -q kernel-debuginfo
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>
>         rpm -q kernel
>         kernel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>
>         do I need to re probe it?
>
>
>         2013/4/12 Eric Sandeen <sandeen@sandeen.net
>         <mailto:sandeen@sandeen.net>>
>
>             On 4/11/13 11:32 PM, =B7=FB= =D3=C0=CC=CE wrote:
>             > Hi Brian,
>             > Sorry but when I execut= e the script it says:
>             > WARNING: cannot find mo= dule xfs debuginfo: No DWARF
>             information found
>             > semantic error: no matc= h while resolving probe point
>             module("xfs").func= tion("xfs_iunlink")
>             >
>             > uname -a
>             > 2.6.32-279.el6.x86_64 >             > kernel debuginfo has be= en installed.
>             >
>             > Where can I find the co= rrect xfs debuginfo?
>
>             it should be in the kernel-d= ebuginfo rpm (of the same
>             version/release as the kerne= l rpm you're running)
>
>             You should have:
>
>             /usr/lib/debug/lib/modules/2= .6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug
>
>             If not, can you show:
>
>             # uname -a
>             # rpm -q kernel
>             # rpm -q kernel-debuginfo >
>             -Eric
>
>
>
>
>
>         --
>         =B7=FB=D3=C0=CC=CE
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE
>
>
> __________________= _____________________________
> xfs mailing list
> xfs@oss.sgi.com
> = http://oss.sgi.com/mailman/listinfo/xfs
>




--
=B7=FB=D3= =C0=CC=CE
--14dae93408652587d804da2b0054-- From david@fromorbit.com Fri Apr 12 09:57:19 2013 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 32E0229DFA for ; Fri, 12 Apr 2013 09:57:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 11F0A8F8059 for ; Fri, 12 Apr 2013 07:57:19 -0700 (PDT) X-ASG-Debug-ID: 1365778620-04cbb057f7fccb0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 7AT29KsfZHZpyvhF for ; Fri, 12 Apr 2013 07:57:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-NotFiltered: toobig Received: from ppp121-44-177-194.lns20.syd7.internode.on.net (HELO dastard) ([121.44.177.194]) by ipmail06.adl6.internode.on.net with ESMTP; 13 Apr 2013 00:25:56 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQfON-0000vN-KC for xfs@oss.sgi.com; Sat, 13 Apr 2013 00:55:55 +1000 Date: Sat, 13 Apr 2013 00:55:55 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 Message-ID: <20130412145555.GF30622@dastard> X-ASG-Orig-Subj: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Dxnq1zWXvFF0Q93v" 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: 1365778620 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -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 --Dxnq1zWXvFF0Q93v Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi folks, I've attached a tarball containing the patch series that adds metadata CRC support to xfsprogs. It is still very much a work in progress, but is sufficient to start running xfstests on CRC enable filesystems. THere is much missing functionality, especially with respect to directly/attribute modifications. Only mkfs and xfs_repair have been updated to explicitly support CRC on directory/sttribute blocks, though all the other tools will stil run the result might be a little unpredictable. The patch series is as follows: Dave Chinner (26): xfsprogs: sync code to current kernel code xfsprogs: update libxfs to 3.9-rc1 + xfsdev xfsprogs: add CRC32c infrastructure xfsprogs: updata libxlog to current kernel code libxfs: add crc format changes to generic btrees xfsprogs: add crc format chagnes to ag headers libxfs: change quota buffer formats libxfs: add version 3 inode support libxfs: add support for crc headers on remote symlinks xfs: add CRC checks to block format directory blocks xfs: add CRC checking to dir2 free blocks xfs: add CRC checking to dir2 data blocks xfs: add CRC checking to dir2 leaf blocks xfs: shortform directory offsets change for dir3 format xfs: add CRCs to dir2/da node blocks xfs: add CRCs to attr leaf blocks xfs: split remote attribute code out xfs: add CRC protection to remote attributes xfs: add buffer types to directory and attribute buffers xfs: buffer type overruns blf_flags field xfs: add CRC checks to the superblock xfs: implement extended feature masks xfsprogs: introduce CRC support into mkfs.xfs xfsprogs: add crc format support to repair xfsprogs: add crc format support to db xfs_repair: update for dir/attr crc format changes. Diffstat is below [1]. The changes are roughly: - sync to current kernel code - apply userspace converted version of kernel patches - update xfsprogs utilities to be aware of CRCs Much of the last 4 patches needs to be split up and redirected back to the patches that introduce the bugs that are fixed or conversions that are missed. Repair needs support for remote attribute and symlink block CRC support, as well as verifying the new feature masks. mkfs needs to handle thenew feature masks correctly, too. xfs_db needs to be able to display all crc enabled formats, and needs to ensure all read-only functions work properly on CRC enabled filesystems. I think that metadump will also need some attention. So there's plenty of work yet to do, though it is already usable. For non-CRC filesystems, the utilities appear to work without regressions in xfstests. Most of the testing I have done is on non-CRC filesytsems. For CRC enabled filesystems, xfstests will run for a short while before the kernel bugs out with an attribute corruption. Over the next week I hope to get the kernel code to the point where it will run most of xfstests with CRCs enabled: $ sudo MKFS_OPTIONS="-m crc=1" ./check -g auto FSTYP -- xfs (debug) PLATFORM -- Linux/x86_64 test-4 3.9.0-rc4-dgc+ MKFS_OPTIONS -- -f -m crc=1 /dev/vdb MOUNT_OPTIONS -- /dev/vdb /mnt/scr generic/001 4s generic/002 0s generic/005 0s generic/006 1s generic/007 1s generic/010 [not run] dbtest was not built for this platform generic/011 1s generic/013 12s generic/014 3s generic/015 0s generic/020 Message from syslogd@test-4 at Apr 13 00:35:45 ... kernel:[ 451.268820] XFS: Assertion failed: ichdr->firstused >= ichdr->count * sizeof(xfs_attr_leaf_entry_t) + xfs_attr3_leaf_hdr_size(leaf), file: fs/xfs/xfs_attr_leaf.c, line: 1427 $ Finally, I'm sending this update out as a quilt series style tarball rather than email patches as some of the patches are too large for the list and will get blocked. Hence you get patches and a series file that I've just exported from my current guilt tree. Obligatory warning: If you enable CRCs, the code will eat your data. Use this only only for testing with data you don't care about. Comments, flames and testing results all welcome. Cheers, Dave. [1] diffstat: copy/xfs_copy.c | 5 +- db/agf.c | 3 + db/agfl.c | 16 + db/agfl.h | 2 + db/agi.c | 3 + db/attr.c | 20 +- db/btblock.c | 145 + db/btblock.h | 10 + db/check.c | 55 +- db/dir.c | 8 +- db/dir.h | 6 + db/dir2.c | 16 +- db/dir2.h | 32 + db/dir2sf.c | 24 +- db/dirshort.c | 1 + db/field.c | 16 + db/field.h | 8 + db/freesp.c | 11 +- db/init.c | 4 + db/inode.c | 27 + db/inode.h | 3 + db/metadump.c | 27 +- db/sb.c | 40 +- db/type.c | 35 +- db/type.h | 3 +- estimate/xfs_estimate.c | 3 + fsr/xfs_fsr.c | 2 +- include/Makefile | 13 +- include/libxfs.h | 222 +- include/libxlog.h | 34 +- include/linux.h | 1 + include/platform_defs.h.in | 5 + include/swab.h | 38 + include/xfs.h | 1 + include/xfs_ag.h | 81 +- include/xfs_alloc.h | 57 +- include/xfs_alloc_btree.h | 29 +- include/xfs_arch.h | 16 + include/xfs_attr_leaf.h | 135 +- include/xfs_attr_remote.h | 52 + include/xfs_bmap.h | 325 +- include/xfs_bmap_btree.h | 21 +- include/xfs_btree.h | 87 +- include/xfs_buf_item.h | 117 +- include/xfs_cksum.h | 63 + include/xfs_da_btree.h | 185 +- include/xfs_dinode.h | 47 +- include/xfs_dir1.h | 13 + include/xfs_dir2.h | 95 +- include/xfs_dir2_block.h | 92 - include/xfs_dir2_data.h | 184 - include/xfs_dir2_format.h | 836 +++++ include/xfs_dir2_leaf.h | 253 -- include/xfs_dir2_node.h | 100 - include/xfs_dir2_sf.h | 171 - include/xfs_fs.h | 38 +- include/xfs_ialloc.h | 17 +- include/xfs_ialloc_btree.h | 12 +- include/xfs_inode.h | 263 +- include/xfs_inode_item.h | 22 +- include/xfs_inum.h | 16 - include/xfs_log.h | 31 +- include/xfs_log_priv.h | 101 +- include/xfs_mount.h | 48 +- include/xfs_quota.h | 58 +- include/xfs_rtalloc.h | 4 +- include/xfs_sb.h | 172 +- include/xfs_symlink.h | 45 + include/xfs_trace.h | 69 +- include/xfs_trans.h | 88 +- include/xfs_types.h | 25 +- libxfs/Makefile | 26 +- libxfs/crc32.c | 1036 ++++++ libxfs/crc32defs.h | 72 + libxfs/gen_crc32table.c | 144 + libxfs/init.c | 26 +- libxfs/logitem.c | 20 +- libxfs/rdwr.c | 522 ++- libxfs/trans.c | 55 +- libxfs/util.c | 230 +- libxfs/xfs.h | 147 +- libxfs/xfs_alloc.c | 694 ++-- libxfs/xfs_alloc_btree.c | 140 +- libxfs/xfs_attr.c | 546 +-- libxfs/xfs_attr_leaf.c | 1858 ++++++---- libxfs/xfs_attr_remote.c | 527 +++ libxfs/xfs_bmap.c | 8950 ++++++++++++++++++++++++---------------------- libxfs/xfs_bmap_btree.c | 124 +- libxfs/xfs_btree.c | 415 ++- libxfs/xfs_da_btree.c | 2598 ++++++++------ libxfs/xfs_dir2.c | 149 +- libxfs/xfs_dir2_block.c | 806 +++-- libxfs/xfs_dir2_data.c | 604 ++-- libxfs/xfs_dir2_leaf.c | 1342 ++++--- libxfs/xfs_dir2_node.c | 1455 ++++---- libxfs/xfs_dir2_priv.h | 160 + libxfs/xfs_dir2_sf.c | 326 +- libxfs/xfs_ialloc.c | 632 ++-- libxfs/xfs_ialloc_btree.c | 87 +- libxfs/xfs_inode.c | 505 ++- libxfs/xfs_mount.c | 259 +- libxfs/xfs_rtalloc.c | 77 +- libxfs/xfs_symlink.c | 154 + libxfs/xfs_trans.c | 9 +- libxlog/xfs_log_recover.c | 299 +- logprint/log_copy.c | 2 +- logprint/log_dump.c | 2 +- logprint/log_misc.c | 9 +- logprint/log_print_all.c | 7 +- logprint/log_print_trans.c | 22 +- logprint/logprint.c | 8 +- logprint/logprint.h | 10 +- mdrestore/Makefile | 2 +- mkfs/maxtrres.c | 4 +- mkfs/proto.c | 14 +- mkfs/xfs_mkfs.c | 162 +- mkfs/xfs_mkfs.h | 12 +- repair/agheader.c | 36 +- repair/attr_repair.c | 63 +- repair/dino_chunks.c | 13 +- repair/dinode.c | 208 +- repair/dir.c | 96 +- repair/dir2.c | 497 +-- repair/dir2.h | 28 +- repair/phase2.c | 13 +- repair/phase3.c | 2 +- repair/phase5.c | 157 +- repair/phase6.c | 327 +- repair/prefetch.c | 11 +- repair/rt.c | 4 +- repair/scan.c | 166 +- repair/scan.h | 12 +- repair/versions.c | 2 +- repair/xfs_repair.c | 9 +- 134 files changed, 19036 insertions(+), 12663 deletions(-) create mode 100644 include/xfs_attr_remote.h create mode 100644 include/xfs_cksum.h create mode 100644 include/xfs_dir1.h delete mode 100644 include/xfs_dir2_block.h delete mode 100644 include/xfs_dir2_data.h create mode 100644 include/xfs_dir2_format.h delete mode 100644 include/xfs_dir2_leaf.h delete mode 100644 include/xfs_dir2_node.h delete mode 100644 include/xfs_dir2_sf.h create mode 100644 include/xfs_symlink.h create mode 100644 libxfs/crc32.c create mode 100644 libxfs/crc32defs.h create mode 100644 libxfs/gen_crc32table.c create mode 100644 libxfs/xfs_attr_remote.c create mode 100644 libxfs/xfs_dir2_priv.h create mode 100644 libxfs/xfs_symlink.c -- Dave Chinner david@fromorbit.com --Dxnq1zWXvFF0Q93v Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="xfsprogs-crc-patchset-v2.tar.gz" Content-Transfer-Encoding: quoted-printable xfsprogs-crc-patchset-v2/=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=000000755=000001750=000001750=0000000000000=001213= 2011610=00014237=00 5=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00xfsprogs-crc-patchset-v2/series=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=000000644=000001750=000001750=0000000001436=001213201= 1546=00015470=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00repair-fix-extent-count logprint-agi-dump xfsprogs-kernel-3.8-update xfsprogs-kernel-3.9-rc1-dev-update xfsprogs-crc-infrastructure xfsprogs-libxlog-kernel-sync btree-format-changes ag-hdr-format-changes quota-format-changes inode-v3 remote-symlink-crc xfs-add-crc-to-dir2-block-2 xfs-add-crc-to-dir2-free-2 xfs-add-crc-to-dir2-data-2 xfs-add-crc-to-dir2-leaf-3 dir2-sf xfs-add-crc-to-da-node xfs-add-crc-to-attr-leaf xfs-attr-rmt-move xfs-add-crc-to-remote-attr xfs-da-blf-types xfs-trans-type-blf-change xfs__add_crc_checks_to_the_superblock-2 xfs-sb-v5-feature-masks xfsprogs-mkfs-crc-support xfsprogs-repair-crc-support xfsprogs-db-crc-support xfsprogs-repair-dir-crc-support debug bpm-progs-deb xfsprogs-freespace spaceman-trim spaceman-prealloc-flush spaceman-ag-control xfsprogs-freespace-2 =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00xfsprogs-crc-patchset-v2/repair-fix-extent-count=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750= =000001750=0000000004320=0012132011546=00020662=00 0=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00xfs_repair: validate on-disk exte= nt count better =46rom: Dave Chinner When scanning a btree format inode, we trust the extent count to be in range. However, values of the range 2^31 <=3D cnt < 2^32 are invalid and can cause problems with signed range checks. This results in assert failures which validating the extent count such as: xfs_repair: dinode.c:768: process_bmbt_reclist_int: Assertion `i < *numrecs= ' failed. Validate the extent count is at least within the positive range of a singed 32 bit integer before using it. Signed-off-by: Dave Chinner --- repair/dinode.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index 5a2da39..239bb7b 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -1293,7 +1293,7 @@ process_exinode( xfs_bmbt_rec_t *rp; xfs_dfiloff_t first_key; xfs_dfiloff_t last_key; - int numrecs; + int32_t numrecs; int ret; =20 lino =3D XFS_AGINO_TO_INO(mp, agno, ino); @@ -1302,6 +1302,15 @@ process_exinode( numrecs =3D XFS_DFORK_NEXTENTS(dip, whichfork); =20 /* + * We've already decided on the maximum number of extents on the inode, + * and numrecs may be corrupt. Hence make sure we only allow numrecs to + * be in the range of valid on-disk numbers, which is: + * 0 < numrecs < 2^31 - 1 + */ + if (numrecs < 0) + numrecs =3D *nex; + + /* * XXX - if we were going to fix up the btree record, * we'd do it right here. For now, if there's a problem, * we'll bail out and presumably clear the inode. @@ -2038,11 +2047,23 @@ process_inode_data_fork( { xfs_ino_t lino =3D XFS_AGINO_TO_INO(mp, agno, ino); int err =3D 0; + int nex; + + /* + * extent count on disk is only valid for positive values. The kernel + * uses negative values in memory. hence if we see negative numbers + * here, trash it! + */ + nex =3D be32_to_cpu(dino->di_nextents); + if (nex < 0) + *nextents =3D 1; + else + *nextents =3D nex; =20 - *nextents =3D be32_to_cpu(dino->di_nextents); if (*nextents > be64_to_cpu(dino->di_nblocks)) *nextents =3D 1; =20 + if (dino->di_format !=3D XFS_DINODE_FMT_LOCAL && type !=3D XR_INO_RTDATA) *dblkmap =3D blkmap_alloc(*nextents, XFS_DATA_FORK); *nextents =3D 0; =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00xfsprogs-crc-patchset-v2/logprint-agi-dump=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =000000600=000001750=000001750=0000000002412=0012132011546=00017520=00 0=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ust= ar =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00--- logprint/log_print_all.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index 5b2d942..70b0905 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -122,6 +122,7 @@ xlog_recover_print_buffer( be32_to_cpu(*(__be32 *)(p+56)), be32_to_cpu(*(__be32 *)(p+60))); } else if (be32_to_cpu(*(__be32 *)p) =3D=3D XFS_AGI_MAGIC) { + int bucket, buckets; agi =3D (xfs_agi_t *)p; printf(_(" AGI Buffer: (XAGI)\n")); if (!print_buffer)=20 @@ -137,6 +138,24 @@ xlog_recover_print_buffer( be32_to_cpu(agi->agi_level), be32_to_cpu(agi->agi_freecount), be32_to_cpu(agi->agi_newino)); + if (len =3D=3D 128) { + buckets =3D 17; + } else if (len =3D=3D 256) { + buckets =3D 32 + 17; + } else { + buckets =3D XFS_AGI_UNLINKED_BUCKETS; + } + for (bucket =3D 0; bucket < buckets;) { + int col; + printf(_("bucket[%d - %d]: "), bucket, bucket+3); + for (col =3D 0; col < 4; col++, bucket++) { + if (bucket < buckets) { + printf("0x%x ", + be32_to_cpu(agi->agi_unlinked[bucket])); + } + } + printf("\n"); + } } else if (be32_to_cpu(*(__be32 *)p) =3D=3D XFS_AGF_MAGIC) { agf =3D (xfs_agf_t *)p; printf(_(" AGF Buffer: (XAGF)\n")); =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-crc= -patchset-v2/xfsprogs-kernel-3.8-update=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001750=00000031244= 56=0012132011546=00021120=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00xfsprogs: sync code to current kernel code =46rom: Dave Chinner Update code base to match kernel 3.8-rc2 code base. Signed-off-by: Dave Chinner diff --git a/db/check.c b/db/check.c index e601e0a..5921779 100644 --- a/db/check.c +++ b/db/check.c @@ -31,6 +31,8 @@ #include "output.h" #include "init.h" #include "malloc.h" +#include "dir.h" +#include "dir2.h" =20 typedef enum { IS_USER_QUOTA, IS_PROJECT_QUOTA, IS_GROUP_QUOTA, @@ -2223,7 +2225,7 @@ process_data_dir_v2( bf =3D data->hdr.bestfree; ptr =3D (char *)data->u; if (be32_to_cpu(block->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC) { - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(mp, &block->hdr); lep =3D xfs_dir2_block_leaf_p(btp); endptr =3D (char *)lep; if (endptr <=3D ptr || endptr > (char *)btp) { @@ -2840,7 +2842,7 @@ process_inode( break; } if (ic) { - dqprid =3D xfs_get_projid(idic); /* dquot ID is u32 */ + dqprid =3D xfs_get_projid(&idic); /* dquot ID is u32 */ quota_add(&dqprid, &idic.di_gid, &idic.di_uid, 0, bc, ic, rc); } @@ -3166,7 +3168,7 @@ process_leaf_node_dir_v2_free( error++; return; } - maxent =3D XFS_DIR2_MAX_FREE_BESTS(mp); + maxent =3D xfs_dir2_free_max_bests(mp); if (be32_to_cpu(free->hdr.firstdb) !=3D xfs_dir2_da_to_db(mp,=20 dabno - mp->m_dirfreeblk) * maxent) { if (!sflag || v) @@ -3643,10 +3645,10 @@ process_sf_dir_v2( if (v) dbprintf(_("dir %lld entry . %lld\n"), id->ino, id->ino); (*dot)++; - sfe =3D xfs_dir2_sf_firstentry(sf); + sfe =3D xfs_dir2_sf_firstentry(&sf->hdr); offset =3D XFS_DIR2_DATA_FIRST_OFFSET; for (i =3D sf->hdr.count - 1, i8 =3D 0; i >=3D 0; i--) { - if ((__psint_t)sfe + xfs_dir2_sf_entsize_byentry(sf, sfe) - + if ((__psint_t)sfe + xfs_dir2_sf_entsize(&sf->hdr,sfe->namelen) - (__psint_t)sf > be64_to_cpu(dip->di_size)) { if (!sflag) dbprintf(_("dir %llu bad size in entry at %d\n"), @@ -3655,7 +3657,7 @@ process_sf_dir_v2( error++; break; } - lino =3D xfs_dir2_sf_get_inumber(sf, xfs_dir2_sf_inumberp(sfe)); + lino =3D xfs_dir2_sfe_get_ino(&sf->hdr, sfe); if (lino > XFS_DIR2_MAX_SHORT_INUM) i8++; cid =3D find_inode(lino, 1); @@ -3685,8 +3687,8 @@ process_sf_dir_v2( } offset =3D xfs_dir2_sf_get_offset(sfe) + - xfs_dir2_data_entsize(sfe->namelen); - sfe =3D xfs_dir2_sf_nextentry(sf, sfe); + xfs_dir2_sf_entsize(&sf->hdr, sfe->namelen); + sfe =3D xfs_dir2_sf_nextentry(&sf->hdr, sfe); } if (i < 0 && (__psint_t)sfe - (__psint_t)sf !=3D=20 be64_to_cpu(dip->di_size)) { @@ -3702,7 +3704,7 @@ process_sf_dir_v2( dbprintf(_("dir %llu offsets too high\n"), id->ino); error++; } - lino =3D xfs_dir2_sf_get_inumber(sf, &sf->hdr.parent); + lino =3D xfs_dir2_sf_get_parent_ino(&sf->hdr); if (lino > XFS_DIR2_MAX_SHORT_INUM) i8++; cid =3D find_inode(lino, 1); diff --git a/db/dir.h b/db/dir.h index 67e6689..5be82bf 100644 --- a/db/dir.h +++ b/db/dir.h @@ -16,6 +16,12 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ =20 +/* + * only db understands v1 directory format, so include them + * directly here + */ +#include + extern const field_t dir_flds[]; extern const field_t dir_hfld[]; extern const field_t dir_blkinfo_flds[]; diff --git a/db/dir2.c b/db/dir2.c index 51c598b..be58639 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -192,7 +192,7 @@ dir2_block_leaf_count( block =3D obj; if (be32_to_cpu(block->hdr.magic) !=3D XFS_DIR2_BLOCK_MAGIC) return 0; - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(mp, &block->hdr); return be32_to_cpu(btp->count); } =20 @@ -210,7 +210,7 @@ dir2_block_leaf_offset( ASSERT(startoff =3D=3D 0); block =3D obj; ASSERT(be32_to_cpu(block->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(mp, &block->hdr); lep =3D xfs_dir2_block_leaf_p(btp) + idx; return bitize((int)((char *)lep - (char *)block)); } @@ -242,7 +242,7 @@ dir2_block_tail_offset( ASSERT(idx =3D=3D 0); block =3D obj; ASSERT(be32_to_cpu(block->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(mp, &block->hdr); return bitize((int)((char *)btp - (char *)block)); } =20 @@ -264,7 +264,7 @@ dir2_block_u_count( block =3D obj; if (be32_to_cpu(block->hdr.magic) !=3D XFS_DIR2_BLOCK_MAGIC) return 0; - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(mp, &block->hdr); ptr =3D (char *)block->u; endptr =3D (char *)xfs_dir2_block_leaf_p(btp); for (i =3D 0; ptr < endptr; i++) { @@ -297,7 +297,7 @@ dir2_block_u_offset( ASSERT(startoff =3D=3D 0); block =3D obj; ASSERT(be32_to_cpu(block->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(mp, &block->hdr); ptr =3D (char *)block->u; endptr =3D (char *)xfs_dir2_block_leaf_p(btp); for (i =3D 0; i < idx; i++) { diff --git a/db/dir2.h b/db/dir2.h index dcf4787..4c2847b 100644 --- a/db/dir2.h +++ b/db/dir2.h @@ -27,5 +27,37 @@ extern const field_t dir2_leaf_entry_flds[]; extern const field_t dir2_leaf_hdr_flds[]; extern const field_t dir2_leaf_tail_flds[]; =20 +/* + * generic dir2 structures used by xfs_db + */ +typedef union { + xfs_dir2_data_entry_t entry; + xfs_dir2_data_unused_t unused; +} xfs_dir2_data_union_t; + +typedef struct xfs_dir2_data { + xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_DATA_MAGIC */ + xfs_dir2_data_union_t u[1]; +} xfs_dir2_data_t; + +typedef struct xfs_dir2_block { + xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_BLOCK_MAGIC */ + xfs_dir2_data_union_t u[1]; + xfs_dir2_leaf_entry_t leaf[1]; + xfs_dir2_block_tail_t tail; +} xfs_dir2_block_t; + +typedef struct xfs_dir2_sf { + xfs_dir2_sf_hdr_t hdr; /* shortform header */ + xfs_dir2_sf_entry_t list[1]; /* shortform entries */ +} xfs_dir2_sf_t; + +static inline xfs_dir2_inou_t *xfs_dir2_sf_inumberp(xfs_dir2_sf_entry_t *s= fep) +{ + return (xfs_dir2_inou_t *)&(sfep)->name[(sfep)->namelen]; +} + extern int dir2_data_union_size(void *obj, int startoff, int idx); extern int dir2_size(void *obj, int startoff, int idx); + + diff --git a/db/dir2sf.c b/db/dir2sf.c index b2db088..92f8a66 100644 --- a/db/dir2sf.c +++ b/db/dir2sf.c @@ -22,6 +22,7 @@ #include "fprint.h" #include "field.h" #include "bit.h" +#include "dir2.h" #include "dir2sf.h" =20 static int dir2_inou_i4_count(void *obj, int startoff); @@ -149,10 +150,10 @@ dir2_sf_entry_size( =20 ASSERT(bitoffs(startoff) =3D=3D 0); sf =3D (xfs_dir2_sf_t *)((char *)obj + byteize(startoff)); - e =3D xfs_dir2_sf_firstentry(sf); + e =3D xfs_dir2_sf_firstentry(&sf->hdr); for (i =3D 0; i < idx; i++) - e =3D xfs_dir2_sf_nextentry(sf, e); - return bitize((int)xfs_dir2_sf_entsize_byentry(sf, e)); + e =3D xfs_dir2_sf_nextentry(&sf->hdr, e); + return bitize((int)xfs_dir2_sf_entsize(&sf->hdr, e->namelen)); } =20 /*ARGSUSED*/ @@ -194,9 +195,9 @@ dir2_sf_list_offset( =20 ASSERT(bitoffs(startoff) =3D=3D 0); sf =3D (xfs_dir2_sf_t *)((char *)obj + byteize(startoff)); - e =3D xfs_dir2_sf_firstentry(sf); + e =3D xfs_dir2_sf_firstentry(&sf->hdr); for (i =3D 0; i < idx; i++) - e =3D xfs_dir2_sf_nextentry(sf, e); + e =3D xfs_dir2_sf_nextentry(&sf->hdr, e); return bitize((int)((char *)e - (char *)sf)); } =20 @@ -214,8 +215,8 @@ dir2sf_size( ASSERT(bitoffs(startoff) =3D=3D 0); ASSERT(idx =3D=3D 0); sf =3D (xfs_dir2_sf_t *)((char *)obj + byteize(startoff)); - e =3D xfs_dir2_sf_firstentry(sf); + e =3D xfs_dir2_sf_firstentry(&sf->hdr); for (i =3D 0; i < sf->hdr.count; i++) - e =3D xfs_dir2_sf_nextentry(sf, e); + e =3D xfs_dir2_sf_nextentry(&sf->hdr, e); return bitize((int)((char *)e - (char *)sf)); } diff --git a/db/dirshort.c b/db/dirshort.c index b0d3b6b..2b23c28 100644 --- a/db/dirshort.c +++ b/db/dirshort.c @@ -22,6 +22,7 @@ #include "fprint.h" #include "field.h" #include "bit.h" +#include "dir.h" #include "dirshort.h" =20 static int dir_sf_entry_name_count(void *obj, int startoff); diff --git a/db/metadump.c b/db/metadump.c index 9f15d9e..5739f86 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -26,6 +26,10 @@ #include "init.h" #include "sig.h" #include "xfs_metadump.h" +#include "fprint.h" +#include "faddr.h" +#include "field.h" +#include "dir2.h" =20 #define DEFAULT_MAX_EXT_SIZE 1000 =20 @@ -916,7 +920,7 @@ obfuscate_sf_dir( (long long)cur_ino); } =20 - sfep =3D xfs_dir2_sf_firstentry(sfp); + sfep =3D xfs_dir2_sf_firstentry(&sfp->hdr); for (i =3D 0; (i < sfp->hdr.count) && ((char *)sfep - (char *)sfp < ino_dir_size); i++) { =20 @@ -935,7 +939,7 @@ obfuscate_sf_dir( namelen =3D ino_dir_size - ((char *)&sfep->name[0] - (char *)sfp); } else if ((char *)sfep - (char *)sfp + - xfs_dir2_sf_entsize_byentry(sfp, sfep) > + xfs_dir2_sf_entsize(&sfp->hdr, sfep->namelen) > ino_dir_size) { if (show_warnings) print_warning("entry length in dir inode %llu " @@ -946,12 +950,11 @@ obfuscate_sf_dir( (char *)sfp); } =20 - generate_obfuscated_name(xfs_dir2_sf_get_inumber(sfp, - xfs_dir2_sf_inumberp(sfep)), namelen, - &sfep->name[0]); + generate_obfuscated_name(xfs_dir2_sfe_get_ino(&sfp->hdr, sfep), + namelen, &sfep->name[0]); =20 sfep =3D (xfs_dir2_sf_entry_t *)((char *)sfep + - xfs_dir2_sf_entsize_byname(sfp, namelen)); + xfs_dir2_sf_entsize(&sfp->hdr, namelen)); } } =20 @@ -1107,9 +1110,10 @@ obfuscate_dir_data_blocks( if (is_block_format) { xfs_dir2_leaf_entry_t *blp; xfs_dir2_block_tail_t *btp; + xfs_dir2_block_t *blk; =20 - btp =3D xfs_dir2_block_tail_p(mp, - (xfs_dir2_block_t *)block); + blk =3D (xfs_dir2_block_t *)block; + btp =3D xfs_dir2_block_tail_p(mp, &blk->hdr); blp =3D xfs_dir2_block_leaf_p(btp); if ((char *)blp > (char *)btp) blp =3D (xfs_dir2_leaf_entry_t *)btp; diff --git a/estimate/xfs_estimate.c b/estimate/xfs_estimate.c index 54a72e9..a8a3b99 100644 --- a/estimate/xfs_estimate.c +++ b/estimate/xfs_estimate.c @@ -18,8 +18,11 @@ =20 /* * Estimate space of an XFS filesystem + * + * XXX: assumes dirv1 format. */ #include +#include #include #include =20 diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 3d017ca..0471c55 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -16,8 +16,8 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ =20 -#include #include +#include #include #include #include diff --git a/include/Makefile b/include/Makefile index 7ad6ddb..b94d305 100644 --- a/include/Makefile +++ b/include/Makefile @@ -24,15 +24,14 @@ QAHFILES =3D libxfs.h libxlog.h \ xfs_ag.h xfs_alloc.h xfs_alloc_btree.h xfs_arch.h xfs_attr_leaf.h \ xfs_attr_sf.h xfs_bit.h xfs_bmap.h xfs_bmap_btree.h xfs_btree.h \ xfs_btree_trace.h xfs_buf_item.h xfs_da_btree.h xfs_dinode.h \ - xfs_dir2.h xfs_dir2_block.h xfs_dir2_data.h xfs_dir2_leaf.h \ - xfs_dir2_node.h xfs_dir2_sf.h xfs_dir_leaf.h xfs_dir_sf.h \ + xfs_dir2.h xfs_dir2_format.h xfs_dir1.h xfs_dir_leaf.h xfs_dir_sf.h \ xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ xfs_inode.h xfs_inode_item.h xfs_inum.h \ xfs_log.h xfs_log_priv.h xfs_log_recover.h xfs_metadump.h \ xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h xfs_trace.h \ - xfs_trans.h xfs_trans_space.h xfs_types.h xfs_dfrag.h + xfs_trans.h xfs_trans_space.h xfs_dfrag.h =20 -HFILES =3D handle.h jdm.h xqm.h xfs.h xfs_fs.h +HFILES =3D handle.h jdm.h xqm.h xfs.h xfs_fs.h xfs_types.h HFILES +=3D $(PKG_PLATFORM).h PHFILES =3D darwin.h freebsd.h irix.h linux.h gnukfreebsd.h DKHFILES =3D volume.h fstyp.h dvh.h diff --git a/include/libxfs.h b/include/libxfs.h index 9574f0b..0e2fc5f 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -33,8 +33,8 @@ #include #include =20 -#include #include +#include #include #include #include @@ -46,8 +46,6 @@ #include #include #include -#include -#include #include #include #include @@ -136,7 +134,6 @@ extern int libxfs_log_clear (dev_t, xfs_daddr_t, uint, = uuid_t *, extern int libxfs_log_header (xfs_caddr_t, uuid_t *, int, int, int, libxfs_get_block_t *, void *); =20 - /* * Define a user-level mount structure with all we need * in order to make use of the numerous XFS_* macros. @@ -200,6 +197,7 @@ typedef struct xfs_mount { xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */ } xfs_mount_t; =20 + #define LIBXFS_MOUNT_ROOTINOS 0x0001 #define LIBXFS_MOUNT_DEBUGGER 0x0002 #define LIBXFS_MOUNT_32BITINODES 0x0004 @@ -219,11 +217,32 @@ extern void libxfs_rtmount_destroy (xfs_mount_t *); /* * Simple I/O interface */ +typedef struct xfs_buftarg { + struct xfs_mount *bt_mount; + dev_t dev; +} xfs_buftarg_t; + +#define XB_PAGES 2 + +struct xfs_buf_map { + xfs_daddr_t bm_bn; /* block number for I/O */ + int bm_len; /* size of I/O */ +}; + +#define DEFINE_SINGLE_BUF_MAP(map, blkno, numblk) \ + struct xfs_buf_map (map) =3D { .bm_bn =3D (blkno), .bm_len =3D (numblk) }; + +struct xfs_buf_ops { + void (*verify_read)(struct xfs_buf *); + void (*verify_write)(struct xfs_buf *); +}; + typedef struct xfs_buf { struct cache_node b_node; unsigned int b_flags; xfs_daddr_t b_blkno; unsigned b_bcount; + unsigned int b_length; dev_t b_dev; pthread_mutex_t b_lock; pthread_t b_holder; @@ -231,8 +250,13 @@ typedef struct xfs_buf { void *b_fsprivate; void *b_fsprivate2; void *b_fsprivate3; - char *b_addr; + void *b_addr; int b_error; + const struct xfs_buf_ops *b_ops; + struct xfs_buftarg *b_target; + struct xfs_perag *b_pag; + struct xfs_buf_map *b_map; + int b_nmaps; #ifdef XFS_BUF_TRACING struct list_head b_lock_list; const char *b_func; @@ -245,10 +269,11 @@ enum xfs_buf_flags_t { /* b_flags bits */ LIBXFS_B_EXIT =3D 0x0001, /* =3D=3DLIBXFS_EXIT_ON_FAILURE */ LIBXFS_B_DIRTY =3D 0x0002, /* buffer has been modified */ LIBXFS_B_STALE =3D 0x0004, /* buffer marked as invalid */ - LIBXFS_B_UPTODATE =3D 0x0008 /* buffer is sync'd to disk */ + LIBXFS_B_UPTODATE =3D 0x0008, /* buffer is sync'd to disk */ + LIBXFS_B_DISCONTIG =3D 0x0010, /* discontiguous buffer */ }; =20 -#define XFS_BUF_PTR(bp) ((bp)->b_addr) +#define XFS_BUF_PTR(bp) ((char *)(bp)->b_addr) #define xfs_buf_offset(bp, offset) (XFS_BUF_PTR(bp) + (offset)) #define XFS_BUF_ADDR(bp) ((bp)->b_blkno) #define XFS_BUF_SIZE(bp) ((bp)->b_bcount) @@ -275,6 +300,8 @@ enum xfs_buf_flags_t { /* b_flags bits */ (pri)) #define XFS_BUF_PRIORITY(bp) (cache_node_get_priority( \ (struct cache_node *)(bp))) +#define xfs_buf_set_ref(bp,ref) ((void) 0) +#define xfs_buf_ioerror(bp,err) (bp)->b_error =3D (err); =20 /* Buffer Cache Interfaces */ =20 @@ -288,23 +315,34 @@ extern struct cache_operations libxfs_bcache_operatio= ns; #define libxfs_readbuf(dev, daddr, len, flags) \ libxfs_trace_readbuf(__FUNCTION__, __FILE__, __LINE__, \ (dev), (daddr), (len), (flags)) +#define libxfs_readbuf_map(dev, map, nmaps, flags) \ + libxfs_trace_readbuf_map(__FUNCTION__, __FILE__, __LINE__, \ + (dev), (map), (nmaps), (flags)) #define libxfs_writebuf(buf, flags) \ libxfs_trace_writebuf(__FUNCTION__, __FILE__, __LINE__, \ (buf), (flags)) #define libxfs_getbuf(dev, daddr, len) \ libxfs_trace_getbuf(__FUNCTION__, __FILE__, __LINE__, \ (dev), (daddr), (len)) +#define libxfs_getbuf_map(dev, map, nmaps) \ + libxfs_trace_getbuf_map(__FUNCTION__, __FILE__, __LINE__, \ + (dev), (map), (nmaps)) #define libxfs_getbuf_flags(dev, daddr, len, flags) \ - libxfs_trace_getbuf(__FUNCTION__, __FILE__, __LINE__, \ + libxfs_trace_getbuf_flags(__FUNCTION__, __FILE__, __LINE__, \ (dev), (daddr), (len), (flags)) #define libxfs_putbuf(buf) \ libxfs_trace_putbuf(__FUNCTION__, __FILE__, __LINE__, (buf)) =20 extern xfs_buf_t *libxfs_trace_readbuf(const char *, const char *, int, dev_t, xfs_daddr_t, int, int); +extern xfs_buf_t *libxfs_trace_readbuf_map(const char *, const char *, int, + dev_t, struct xfs_buf_map *, int, int); extern int libxfs_trace_writebuf(const char *, const char *, int, xfs_buf_t *, int); -extern xfs_buf_t *libxfs_trace_getbuf(const char *, const char *, int, dev= _t, xfs_daddr_t, int); +extern xfs_buf_t *libxfs_trace_getbuf(const char *, const char *, int, + dev_t, xfs_daddr_t, int); +extern xfs_buf_t *libxfs_trace_getbuf_map(const char *, const char *, int, + dev_t, struct xfs_buf_map *, int); extern xfs_buf_t *libxfs_trace_getbuf_flags(const char *, const char *, in= t, dev_t, xfs_daddr_t, int, unsigned int); extern void libxfs_trace_putbuf (const char *, const char *, int, @@ -313,8 +351,10 @@ extern void libxfs_trace_putbuf (const char *, const c= har *, int, #else =20 extern xfs_buf_t *libxfs_readbuf(dev_t, xfs_daddr_t, int, int); +extern xfs_buf_t *libxfs_readbuf_map(dev_t, struct xfs_buf_map *, int, int= ); extern int libxfs_writebuf(xfs_buf_t *, int); extern xfs_buf_t *libxfs_getbuf(dev_t, xfs_daddr_t, int); +extern xfs_buf_t *libxfs_getbuf_map(dev_t, struct xfs_buf_map *, int); extern xfs_buf_t *libxfs_getbuf_flags(dev_t, xfs_daddr_t, int, unsigned in= t); extern void libxfs_putbuf (xfs_buf_t *); =20 @@ -358,6 +398,7 @@ typedef struct xfs_inode_log_item { xfs_log_item_t ili_item; /* common portion */ struct xfs_inode *ili_inode; /* inode pointer */ unsigned short ili_flags; /* misc flags */ + unsigned int ili_fields; /* fields to be logged */ unsigned int ili_last_fields; /* fields when flushed*/ xfs_inode_log_format_t ili_format; /* logged structure */ int ili_lock_flags; @@ -409,11 +450,50 @@ extern void libxfs_trans_bjoin (xfs_trans_t *, struct= xfs_buf *); extern void libxfs_trans_bhold (xfs_trans_t *, struct xfs_buf *); extern void libxfs_trans_log_buf (xfs_trans_t *, struct xfs_buf *, uint, uint); +/* extern xfs_buf_t *libxfs_trans_get_buf (xfs_trans_t *, dev_t, xfs_daddr_t, int, uint); extern int libxfs_trans_read_buf (xfs_mount_t *, xfs_trans_t *, dev_t, xfs_daddr_t, int, uint, struct xfs_buf **); - +*/ + +struct xfs_buf *libxfs_trans_get_buf_map(struct xfs_trans *tp, dev_t dev, + struct xfs_buf_map *map, int nmaps, + uint flags); + +static inline struct xfs_buf * +libxfs_trans_get_buf( + struct xfs_trans *tp, + dev_t dev, + xfs_daddr_t blkno, + int numblks, + uint flags) +{ + DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); + return libxfs_trans_get_buf_map(tp, dev, &map, 1, flags); +} + +int libxfs_trans_read_buf_map(struct xfs_mount *mp, + struct xfs_trans *tp, dev_t dev, + struct xfs_buf_map *map, int nmaps, + uint flags, struct xfs_buf **bpp, + const struct xfs_buf_ops *ops); + +static inline int +libxfs_trans_read_buf( + struct xfs_mount *mp, + struct xfs_trans *tp, + dev_t dev, + xfs_daddr_t blkno, + int numblks, + uint flags, + struct xfs_buf **bpp, + const struct xfs_buf_ops *ops) +{ + DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); + return libxfs_trans_read_buf_map(mp, tp, dev, &map, 1, + flags, bpp, ops); +} =20 /* * Inode interface @@ -438,6 +518,27 @@ typedef struct xfs_inode { #define LIBXFS_ATTR_CREATE 0x0010 /* create, but fail if attr exists */ #define LIBXFS_ATTR_REPLACE 0x0020 /* set, but fail if attr not exists */ =20 +/* + * Project quota id helpers (previously projid was 16bit only and using two + * 16bit values to hold new 32bit projid was chosen to retain compatibilit= y with + * "old" filesystems). + * + * Copied here from xfs_inode.h because it has to be defined after the str= uct + * xfs_inode... + */ +static inline prid_t +xfs_get_projid(struct xfs_icdinode *id) +{ + return (prid_t)id->di_projid_hi << 16 | id->di_projid_lo; +} + +static inline void +xfs_set_projid(struct xfs_icdinode *id, prid_t projid) +{ + id->di_projid_hi =3D (__uint16_t) (projid >> 16); + id->di_projid_lo =3D (__uint16_t) (projid & 0xffff); +} + typedef struct cred { uid_t cr_uid; gid_t cr_gid; @@ -451,8 +552,6 @@ extern void libxfs_trans_inode_alloc_buf (xfs_trans_t *= , xfs_buf_t *); extern void libxfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); extern int libxfs_iflush_int (xfs_inode_t *, xfs_buf_t *); -extern int libxfs_iread (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, - xfs_inode_t *, xfs_daddr_t); =20 /* Inode Cache Interfaces */ extern struct cache *libxfs_icache; @@ -462,14 +561,7 @@ extern int libxfs_iget (xfs_mount_t *, xfs_trans_t *, = xfs_ino_t, uint, xfs_inode_t **, xfs_daddr_t); extern void libxfs_iput (xfs_inode_t *, uint); =20 -extern int xfs_imap_to_bp(xfs_mount_t *mp, xfs_trans_t *tp, struct xfs_ima= p *imap, - xfs_buf_t **bpp, uint buf_flags, uint iget_flags); - -#include /* dirv1 support in db & repair */=20 -#include -#include -#include -#include +#include =20 /* Shared utility routines */ extern unsigned int libxfs_log2_roundup(unsigned int i); @@ -478,11 +570,6 @@ extern int libxfs_alloc_file_space (xfs_inode_t *, xfs= _off_t, xfs_off_t, int, int); extern int libxfs_bmap_finish(xfs_trans_t **, xfs_bmap_free_t *, int *); =20 -extern void libxfs_da_bjoin (xfs_trans_t *, xfs_dabuf_t *); -extern void libxfs_da_bhold (xfs_trans_t *, xfs_dabuf_t *); -extern int libxfs_da_read_bufr(xfs_trans_t *, xfs_inode_t *, xfs_dablk_t, - xfs_daddr_t, xfs_dabuf_t **, int); - extern void libxfs_fs_repair_cmn_err(int, struct xfs_mount *, char *, ...= ); extern void libxfs_fs_cmn_err(int, struct xfs_mount *, char *, ...); =20 @@ -536,7 +623,8 @@ void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_= irec_t *s); /* xfs_bmap.h */ #define libxfs_bmap_cancel xfs_bmap_cancel #define libxfs_bmap_last_offset xfs_bmap_last_offset -#define libxfs_bmapi xfs_bmapi +#define libxfs_bmapi_write xfs_bmapi_write +#define libxfs_bmapi_read xfs_bmapi_read #define libxfs_bunmapi xfs_bunmapi =20 /* xfs_bmap_btree.h */ @@ -546,6 +634,7 @@ void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_= irec_t *s); #define libxfs_da_brelse xfs_da_brelse #define libxfs_da_hashname xfs_da_hashname #define libxfs_da_shrink_inode xfs_da_shrink_inode +#define libxfs_da_read_buf xfs_da_read_buf =20 /* xfs_dir2.h */ #define libxfs_dir_createname xfs_dir_createname @@ -566,6 +655,8 @@ void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_= irec_t *s); /* xfs_inode.h */ #define libxfs_dinode_from_disk xfs_dinode_from_disk #define libxfs_dinode_to_disk xfs_dinode_to_disk +void xfs_dinode_from_disk(struct xfs_icdinode *, + struct xfs_dinode *); #define libxfs_idata_realloc xfs_idata_realloc #define libxfs_idestroy_fork xfs_idestroy_fork =20 diff --git a/include/linux.h b/include/linux.h index e0bcba2..5bb91cd 100644 --- a/include/linux.h +++ b/include/linux.h @@ -27,6 +27,7 @@ #include #include #include +#include =20 static __inline__ int xfsctl(const char *path, int fd, int cmd, void *p) { diff --git a/include/platform_defs.h.in b/include/platform_defs.h.in index 4e1e0c4..217d6c0 100644 --- a/include/platform_defs.h.in +++ b/include/platform_defs.h.in @@ -34,6 +34,7 @@ #include #include #include +#include =20 #undef HAVE___U32 #ifdef HAVE___U32 @@ -57,6 +58,10 @@ typedef signed long long int __s64; #define __force #endif =20 +typedef __u16 __bitwise __le16; +typedef __u32 __bitwise __le32; +typedef __u64 __bitwise __le64; + typedef __u16 __bitwise __be16; typedef __u32 __bitwise __be32; typedef __u64 __bitwise __be64; diff --git a/include/swab.h b/include/swab.h index 2684aa7..3de44d8 100644 --- a/include/swab.h +++ b/include/swab.h @@ -153,4 +153,42 @@ static __inline__ void __swab64s(__u64 *addr) (__extension__ ({__arch__swab64s(addr);})); } =20 +static inline __uint16_t get_unaligned_be16(void *p) +{ + __uint8_t *__p =3D p; + return __p[0] << 8 | __p[1]; +} + +static inline __uint32_t get_unaligned_be32(void *p) +{ + __uint8_t *__p =3D p; + return __p[0] << 24 | __p[1] << 16 | __p[2] << 8 | __p[3]; +} + +static inline __uint64_t get_unaligned_be64(void *p) +{ + return (__uint64_t)get_unaligned_be32(p) << 32 | + get_unaligned_be32(p + 4); +} + +static inline void put_unaligned_be16(__uint16_t val, void *p) +{ + __uint8_t *__p =3D p; + *__p++ =3D val >> 8; + *__p++ =3D val; +} + +static inline void put_unaligned_be32(__uint32_t val, void *p) +{ + __uint8_t *__p =3D p; + put_unaligned_be16(val >> 16, __p); + put_unaligned_be16(val, __p + 2); +} + +static inline void put_unaligned_be64(__uint64_t val, void *p) +{ + put_unaligned_be32(val >> 32, p); + put_unaligned_be32(val, p + 4); +} + #endif /* SWAB_H */ diff --git a/include/xfs.h b/include/xfs.h index 147a5a0..e32c4a8 100644 --- a/include/xfs.h +++ b/include/xfs.h @@ -34,6 +34,7 @@ #define __XFS_H__ =20 #include +#include #include =20 #endif /* __XFS_H__ */ diff --git a/include/xfs_ag.h b/include/xfs_ag.h index 5adce91..f2aeedb 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -103,11 +103,13 @@ typedef struct xfs_agf { /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) #define XFS_AGF_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp)) -#define XFS_BUF_TO_AGF(bp) ((xfs_agf_t *)XFS_BUF_PTR(bp)) +#define XFS_BUF_TO_AGF(bp) ((xfs_agf_t *)((bp)->b_addr)) =20 extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); =20 +extern const struct xfs_buf_ops xfs_agf_buf_ops; + /* * Size of the unlinked inode hash table in the agi. */ @@ -156,11 +158,13 @@ typedef struct xfs_agi { /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGI_DADDR(mp) ((xfs_daddr_t)(2 << (mp)->m_sectbb_log)) #define XFS_AGI_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGI_DADDR(mp)) -#define XFS_BUF_TO_AGI(bp) ((xfs_agi_t *)XFS_BUF_PTR(bp)) +#define XFS_BUF_TO_AGI(bp) ((xfs_agi_t *)((bp)->b_addr)) =20 extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, struct xfs_buf **bpp); =20 +extern const struct xfs_buf_ops xfs_agi_buf_ops; + /* * The third a.g. block contains the a.g. freelist, an array * of block pointers to blocks owned by the allocation btree code. @@ -168,31 +172,13 @@ extern int xfs_read_agi(struct xfs_mount *mp, struct = xfs_trans *tp, #define XFS_AGFL_DADDR(mp) ((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) #define XFS_AGFL_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp)) #define XFS_AGFL_SIZE(mp) ((mp)->m_sb.sb_sectsize / sizeof(xfs_agblock_t)) -#define XFS_BUF_TO_AGFL(bp) ((xfs_agfl_t *)XFS_BUF_PTR(bp)) +#define XFS_BUF_TO_AGFL(bp) ((xfs_agfl_t *)((bp)->b_addr)) =20 typedef struct xfs_agfl { __be32 agfl_bno[1]; /* actually XFS_AGFL_SIZE(mp) */ } xfs_agfl_t; =20 /* - * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks t= hat - * have been freed but whose transactions aren't committed to disk yet. - * - * Note that we use the transaction ID to record the transaction, not the - * transaction structure itself. See xfs_alloc_busy_insert() for details. - */ -struct xfs_busy_extent { -#ifdef __KERNEL__ - struct rb_node rb_node; /* ag by-bno indexed search tree */ -#endif - struct list_head list; /* transaction busy extent list */ - xfs_agnumber_t agno; - xfs_agblock_t bno; - xfs_extlen_t length; - xlog_tid_t tid; /* transaction that created this */ -}; - -/* * Per-ag incore structure, copies of information in agf and agi, * to improve the performance of allocation group selection. */ @@ -251,6 +237,7 @@ typedef struct xfs_perag { #define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup in xfs_inode_ag_iterator */ #define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ +#define XFS_ICI_EOFBLOCKS_TAG 1 /* inode has blocks beyond EOF */ =20 #define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels) #define XFS_MIN_FREELIST_RAW(bl,cl,mp) \ diff --git a/include/xfs_alloc.h b/include/xfs_alloc.h index 895009a..99d0a61 100644 --- a/include/xfs_alloc.h +++ b/include/xfs_alloc.h @@ -19,10 +19,12 @@ #define __XFS_ALLOC_H__ =20 struct xfs_buf; +struct xfs_btree_cur; struct xfs_mount; struct xfs_perag; struct xfs_trans; -struct xfs_busy_extent; + +extern struct workqueue_struct *xfs_alloc_wq; =20 /* * Freespace allocation types. Argument to xfs_alloc_[v]extent. @@ -74,6 +76,22 @@ typedef unsigned int xfs_alloctype_t; #define XFS_ALLOC_SET_ASIDE(mp) (4 + ((mp)->m_sb.sb_agcount * 4)) =20 /* + * When deciding how much space to allocate out of an AG, we limit the + * allocation maximum size to the size the AG. However, we cannot use all = the + * blocks in the AG - some are permanently used by metadata. These + * blocks are generally: + * - the AG superblock, AGF, AGI and AGFL + * - the AGF (bno and cnt) and AGI btree root blocks + * - 4 blocks on the AGFL according to XFS_ALLOC_SET_ASIDE() limits + * + * The AG headers are sector sized, so the amount of space they take up is + * dependent on filesystem geometry. The others are all single blocks. + */ +#define XFS_ALLOC_AG_MAX_USABLE(mp) \ + ((mp)->m_sb.sb_agblocks - XFS_BB_TO_FSB(mp, XFS_FSS_TO_BB(mp, 4)) - 7) + + +/* * Argument structure for xfs_alloc routines. * This is turned into a structure to avoid having 20 arguments passed * down several levels of the stack. @@ -117,19 +135,6 @@ xfs_extlen_t xfs_alloc_longest_free_extent(struct xfs_mount *mp, struct xfs_perag *pag); =20 -#ifdef __KERNEL__ - -void -xfs_alloc_busy_insert(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len); - -void -xfs_alloc_busy_clear(struct xfs_mount *mp, struct xfs_busy_extent *busyp); - -#endif /* __KERNEL__ */ - /* * Compute and fill in value of m_ag_maxlevels. */ @@ -205,4 +210,28 @@ xfs_free_extent( xfs_fsblock_t bno, /* starting block number of extent */ xfs_extlen_t len); /* length of extent */ =20 +int /* error */ +xfs_alloc_lookup_le( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agblock_t bno, /* starting block of extent */ + xfs_extlen_t len, /* length of extent */ + int *stat); /* success/failure */ + +int /* error */ +xfs_alloc_lookup_ge( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agblock_t bno, /* starting block of extent */ + xfs_extlen_t len, /* length of extent */ + int *stat); /* success/failure */ + +int /* error */ +xfs_alloc_get_rec( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agblock_t *bno, /* output: starting block of extent */ + xfs_extlen_t *len, /* output: length of extent */ + int *stat); /* output: success/failure */ + +extern const struct xfs_buf_ops xfs_agf_buf_ops; +extern const struct xfs_buf_ops xfs_agfl_buf_ops; + #endif /* __XFS_ALLOC_H__ */ diff --git a/include/xfs_alloc_btree.h b/include/xfs_alloc_btree.h index a6caa00..7e89a2b 100644 --- a/include/xfs_alloc_btree.h +++ b/include/xfs_alloc_btree.h @@ -51,20 +51,6 @@ typedef struct xfs_alloc_rec_incore { typedef __be32 xfs_alloc_ptr_t; =20 /* - * Minimum and maximum blocksize and sectorsize. - * The blocksize upper limit is pretty much arbitrary. - * The sectorsize upper limit is due to sizeof(sb_sectsize). - */ -#define XFS_MIN_BLOCKSIZE_LOG 9 /* i.e. 512 bytes */ -#define XFS_MAX_BLOCKSIZE_LOG 16 /* i.e. 65536 bytes */ -#define XFS_MIN_BLOCKSIZE (1 << XFS_MIN_BLOCKSIZE_LOG) -#define XFS_MAX_BLOCKSIZE (1 << XFS_MAX_BLOCKSIZE_LOG) -#define XFS_MIN_SECTORSIZE_LOG 9 /* i.e. 512 bytes */ -#define XFS_MAX_SECTORSIZE_LOG 15 /* i.e. 32768 bytes */ -#define XFS_MIN_SECTORSIZE (1 << XFS_MIN_SECTORSIZE_LOG) -#define XFS_MAX_SECTORSIZE (1 << XFS_MAX_SECTORSIZE_LOG) - -/* * Block numbers in the AG: * SB is sector 0, AGF is sector 1, AGI is sector 2, AGFL is sector 3. */ @@ -107,4 +93,6 @@ extern struct xfs_btree_cur *xfs_allocbt_init_cursor(str= uct xfs_mount *, xfs_agnumber_t, xfs_btnum_t); extern int xfs_allocbt_maxrecs(struct xfs_mount *, int, int); =20 +extern const struct xfs_buf_ops xfs_allocbt_buf_ops; + #endif /* __XFS_ALLOC_BTREE_H__ */ diff --git a/include/xfs_attr_leaf.h b/include/xfs_attr_leaf.h index 9c7d22f..77de139 100644 --- a/include/xfs_attr_leaf.h +++ b/include/xfs_attr_leaf.h @@ -31,7 +31,6 @@ struct attrlist; struct attrlist_cursor_kern; struct xfs_attr_list_context; -struct xfs_dabuf; struct xfs_da_args; struct xfs_da_state; struct xfs_da_state_blk; @@ -215,7 +214,7 @@ int xfs_attr_shortform_getvalue(struct xfs_da_args *arg= s); int xfs_attr_shortform_to_leaf(struct xfs_da_args *args); int xfs_attr_shortform_remove(struct xfs_da_args *args); int xfs_attr_shortform_list(struct xfs_attr_list_context *context); -int xfs_attr_shortform_allfit(struct xfs_dabuf *bp, struct xfs_inode *dp); +int xfs_attr_shortform_allfit(struct xfs_buf *bp, struct xfs_inode *dp); int xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes); =20 =20 @@ -223,7 +222,7 @@ int xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int by= tes); * Internal routines when attribute fork size =3D=3D XFS_LBSIZE(mp). */ int xfs_attr_leaf_to_node(struct xfs_da_args *args); -int xfs_attr_leaf_to_shortform(struct xfs_dabuf *bp, +int xfs_attr_leaf_to_shortform(struct xfs_buf *bp, struct xfs_da_args *args, int forkoff); int xfs_attr_leaf_clearflag(struct xfs_da_args *args); int xfs_attr_leaf_setflag(struct xfs_da_args *args); @@ -235,14 +234,14 @@ int xfs_attr_leaf_flipflags(xfs_da_args_t *args); int xfs_attr_leaf_split(struct xfs_da_state *state, struct xfs_da_state_blk *oldblk, struct xfs_da_state_blk *newblk); -int xfs_attr_leaf_lookup_int(struct xfs_dabuf *leaf, +int xfs_attr_leaf_lookup_int(struct xfs_buf *leaf, struct xfs_da_args *args); -int xfs_attr_leaf_getvalue(struct xfs_dabuf *bp, struct xfs_da_args *args); -int xfs_attr_leaf_add(struct xfs_dabuf *leaf_buffer, +int xfs_attr_leaf_getvalue(struct xfs_buf *bp, struct xfs_da_args *args); +int xfs_attr_leaf_add(struct xfs_buf *leaf_buffer, struct xfs_da_args *args); -int xfs_attr_leaf_remove(struct xfs_dabuf *leaf_buffer, +int xfs_attr_leaf_remove(struct xfs_buf *leaf_buffer, struct xfs_da_args *args); -int xfs_attr_leaf_list_int(struct xfs_dabuf *bp, +int xfs_attr_leaf_list_int(struct xfs_buf *bp, struct xfs_attr_list_context *context); =20 /* @@ -257,9 +256,15 @@ int xfs_attr_root_inactive(struct xfs_trans **trans, s= truct xfs_inode *dp); /* * Utility routines. */ -xfs_dahash_t xfs_attr_leaf_lasthash(struct xfs_dabuf *bp, int *count); -int xfs_attr_leaf_order(struct xfs_dabuf *leaf1_bp, - struct xfs_dabuf *leaf2_bp); +xfs_dahash_t xfs_attr_leaf_lasthash(struct xfs_buf *bp, int *count); +int xfs_attr_leaf_order(struct xfs_buf *leaf1_bp, + struct xfs_buf *leaf2_bp); int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local); +int xfs_attr_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, + xfs_dablk_t bno, xfs_daddr_t mappedbno, + struct xfs_buf **bpp); + +extern const struct xfs_buf_ops xfs_attr_leaf_buf_ops; + #endif /* __XFS_ATTR_LEAF_H__ */ diff --git a/include/xfs_bmap.h b/include/xfs_bmap.h index 3651191..de451a2 100644 --- a/include/xfs_bmap.h +++ b/include/xfs_bmap.h @@ -62,36 +62,32 @@ typedef struct xfs_bmap_free #define XFS_BMAP_MAX_NMAP 4 =20 /* - * Flags for xfs_bmapi + * Flags for xfs_bmapi_* */ -#define XFS_BMAPI_WRITE 0x001 /* write operation: allocate space */ -#define XFS_BMAPI_DELAY 0x002 /* delayed write operation */ -#define XFS_BMAPI_ENTIRE 0x004 /* return entire extent, not trimmed */ -#define XFS_BMAPI_METADATA 0x008 /* mapping metadata not user data */ -#define XFS_BMAPI_ATTRFORK 0x010 /* use attribute fork not data */ -#define XFS_BMAPI_RSVBLOCKS 0x020 /* OK to alloc. reserved data blocks */ -#define XFS_BMAPI_PREALLOC 0x040 /* preallocation op: unwritten space */ -#define XFS_BMAPI_IGSTATE 0x080 /* Ignore state - */ +#define XFS_BMAPI_ENTIRE 0x001 /* return entire extent, not trimmed */ +#define XFS_BMAPI_METADATA 0x002 /* mapping metadata not user data */ +#define XFS_BMAPI_ATTRFORK 0x004 /* use attribute fork not data */ +#define XFS_BMAPI_PREALLOC 0x008 /* preallocation op: unwritten space */ +#define XFS_BMAPI_IGSTATE 0x010 /* Ignore state - */ /* combine contig. space */ -#define XFS_BMAPI_CONTIG 0x100 /* must allocate only one extent */ +#define XFS_BMAPI_CONTIG 0x020 /* must allocate only one extent */ /* * unwritten extent conversion - this needs write cache flushing and no ad= ditional * allocation alignments. When specified with XFS_BMAPI_PREALLOC it conver= ts * from written to unwritten, otherwise convert from unwritten to written. */ -#define XFS_BMAPI_CONVERT 0x200 +#define XFS_BMAPI_CONVERT 0x040 +#define XFS_BMAPI_STACK_SWITCH 0x080 =20 #define XFS_BMAPI_FLAGS \ - { XFS_BMAPI_WRITE, "WRITE" }, \ - { XFS_BMAPI_DELAY, "DELAY" }, \ { XFS_BMAPI_ENTIRE, "ENTIRE" }, \ { XFS_BMAPI_METADATA, "METADATA" }, \ { XFS_BMAPI_ATTRFORK, "ATTRFORK" }, \ - { XFS_BMAPI_RSVBLOCKS, "RSVBLOCKS" }, \ { XFS_BMAPI_PREALLOC, "PREALLOC" }, \ { XFS_BMAPI_IGSTATE, "IGSTATE" }, \ { XFS_BMAPI_CONTIG, "CONTIG" }, \ - { XFS_BMAPI_CONVERT, "CONVERT" } + { XFS_BMAPI_CONVERT, "CONVERT" }, \ + { XFS_BMAPI_STACK_SWITCH, "STACK_SWITCH" } =20 =20 static inline int xfs_bmapi_aflag(int w) @@ -115,23 +111,32 @@ static inline void xfs_bmap_init(xfs_bmap_free_t *flp= , xfs_fsblock_t *fbp) * Argument structure for xfs_bmap_alloc. */ typedef struct xfs_bmalloca { - xfs_fsblock_t firstblock; /* i/o first block allocated */ - xfs_fsblock_t rval; /* starting block of new extent */ - xfs_fileoff_t off; /* offset in file filling in */ + xfs_fsblock_t *firstblock; /* i/o first block allocated */ + struct xfs_bmap_free *flist; /* bmap freelist */ struct xfs_trans *tp; /* transaction pointer */ struct xfs_inode *ip; /* incore inode pointer */ - struct xfs_bmbt_irec *prevp; /* extent before the new one */ - struct xfs_bmbt_irec *gotp; /* extent after, or delayed */ - xfs_extlen_t alen; /* i/o length asked/allocated */ + struct xfs_bmbt_irec prev; /* extent before the new one */ + struct xfs_bmbt_irec got; /* extent after, or delayed */ + + xfs_fileoff_t offset; /* offset in file filling in */ + xfs_extlen_t length; /* i/o length asked/allocated */ + xfs_fsblock_t blkno; /* starting block of new extent */ + + struct xfs_btree_cur *cur; /* btree cursor */ + xfs_extnum_t idx; /* current extent index */ + int nallocs;/* number of extents alloc'd */ + int logflags;/* flags for transaction logging */ + xfs_extlen_t total; /* total blocks needed for xaction */ xfs_extlen_t minlen; /* minimum allocation size (blocks) */ xfs_extlen_t minleft; /* amount must be left after alloc */ char eof; /* set if allocating past last extent */ char wasdel; /* replacing a delayed allocation */ char userdata;/* set if is user data */ - char low; /* low on space, using seq'l ags */ char aeof; /* allocated space at eof */ char conv; /* overwriting unwritten extents */ + int flags; + int stack_switch; } xfs_bmalloca_t; =20 /* @@ -154,251 +159,65 @@ typedef struct xfs_bmalloca { { BMAP_RIGHT_FILLING, "RF" }, \ { BMAP_ATTRFORK, "ATTR" } =20 -/* - * Add bmap trace insert entries for all the contents of the extent list. - * - * Quite excessive tracing. Only do this for debug builds. - */ #if defined(__KERNEL) && defined(DEBUG) -void -xfs_bmap_trace_exlist( - struct xfs_inode *ip, /* incore inode pointer */ - xfs_extnum_t cnt, /* count of entries in list */ - int whichfork, - unsigned long caller_ip); /* data or attr fork */ +void xfs_bmap_trace_exlist(struct xfs_inode *ip, xfs_extnum_t cnt, + int whichfork, unsigned long caller_ip); #define XFS_BMAP_TRACE_EXLIST(ip,c,w) \ xfs_bmap_trace_exlist(ip,c,w, _THIS_IP_) #else #define XFS_BMAP_TRACE_EXLIST(ip,c,w) #endif =20 -/* - * Convert inode from non-attributed to attributed. - * Must not be in a transaction, ip must not be locked. - */ -int /* error code */ -xfs_bmap_add_attrfork( - struct xfs_inode *ip, /* incore inode pointer */ - int size, /* space needed for new attribute */ - int rsvd); /* flag for reserved block allocation */ - -/* - * Add the extent to the list of extents to be free at transaction end. - * The list is maintained sorted (by block number). - */ -void -xfs_bmap_add_free( - xfs_fsblock_t bno, /* fs block number of extent */ - xfs_filblks_t len, /* length of extent */ - xfs_bmap_free_t *flist, /* list of extents */ - struct xfs_mount *mp); /* mount point structure */ - -/* - * Routine to clean up the free list data structure when - * an error occurs during a transaction. - */ -void -xfs_bmap_cancel( - xfs_bmap_free_t *flist); /* free list to clean up */ - -/* - * Compute and fill in the value of the maximum depth of a bmap btree - * in this filesystem. Done once, during mount. - */ -void -xfs_bmap_compute_maxlevels( - struct xfs_mount *mp, /* file system mount structure */ - int whichfork); /* data or attr fork */ - -/* - * Returns the file-relative block number of the first unused block in the= file. - * This is the lowest-address hole if the file has holes, else the first b= lock - * past the end of file. - */ -int /* error */ -xfs_bmap_first_unused( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - xfs_extlen_t len, /* size of hole to find */ - xfs_fileoff_t *unused, /* unused block num */ - int whichfork); /* data or attr fork */ - -/* - * Returns the file-relative block number of the last block + 1 before - * last_block (input value) in the file. - * This is not based on i_size, it is based on the extent list. - * Returns 0 for local files, as they do not have an extent list. - */ -int /* error */ -xfs_bmap_last_before( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - xfs_fileoff_t *last_block, /* last block */ - int whichfork); /* data or attr fork */ - -/* - * Returns the file-relative block number of the first block past eof in - * the file. This is not based on i_size, it is based on the extent list. - * Returns 0 for local files, as they do not have an extent list. - */ -int /* error */ -xfs_bmap_last_offset( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - xfs_fileoff_t *unused, /* last block num */ - int whichfork); /* data or attr fork */ - -/* - * Returns whether the selected fork of the inode has exactly one - * block or not. For the data fork we check this matches di_size, - * implying the file's range is 0..bsize-1. - */ -int -xfs_bmap_one_block( - struct xfs_inode *ip, /* incore inode */ - int whichfork); /* data or attr fork */ - -/* - * Read in the extents to iu_extents. - * All inode fields are set up by caller, we just traverse the btree - * and copy the records in. - */ -int /* error */ -xfs_bmap_read_extents( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - int whichfork); /* data or attr fork */ - -/* - * Map file blocks to filesystem blocks. - * File range is given by the bno/len pair. - * Adds blocks to file if a write ("flags & XFS_BMAPI_WRITE" set) - * into a hole or past eof. - * Only allocates blocks from a single allocation group, - * to avoid locking problems. - * The returned value in "firstblock" from the first call in a transaction - * must be remembered and presented to subsequent calls in "firstblock". - * An upper bound for the number of blocks to be allocated is supplied to - * the first call in "total"; if no allocation group has that many free - * blocks then the call will fail (return NULLFSBLOCK in "firstblock"). - */ -int /* error */ -xfs_bmapi( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - xfs_fileoff_t bno, /* starting file offs. mapped */ - xfs_filblks_t len, /* length to map in file */ - int flags, /* XFS_BMAPI_... */ - xfs_fsblock_t *firstblock, /* first allocated block - controls a.g. for allocs */ - xfs_extlen_t total, /* total blocks needed */ - struct xfs_bmbt_irec *mval, /* output: map values */ - int *nmap, /* i/o: mval size/count */ - xfs_bmap_free_t *flist); /* i/o: list extents to free */ - -/* - * Map file blocks to filesystem blocks, simple version. - * One block only, read-only. - * For flags, only the XFS_BMAPI_ATTRFORK flag is examined. - * For the other flag values, the effect is as if XFS_BMAPI_METADATA - * was set and all the others were clear. - */ -int /* error */ -xfs_bmapi_single( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - int whichfork, /* data or attr fork */ - xfs_fsblock_t *fsb, /* output: mapped block */ - xfs_fileoff_t bno); /* starting file offs. mapped */ - -/* - * Unmap (remove) blocks from a file. - * If nexts is nonzero then the number of extents to remove is limited to - * that value. If not all extents in the block range can be removed then - * *done is set. - */ -int /* error */ -xfs_bunmapi( - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - xfs_fileoff_t bno, /* starting offset to unmap */ - xfs_filblks_t len, /* length to unmap in file */ - int flags, /* XFS_BMAPI_... */ - xfs_extnum_t nexts, /* number of extents max */ - xfs_fsblock_t *firstblock, /* first allocated block - controls a.g. for allocs */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - int *done); /* set if not done yet */ - -/* - * Check an extent list, which has just been read, for - * any bit in the extent flag field. - */ -int -xfs_check_nostate_extents( - struct xfs_ifork *ifp, - xfs_extnum_t idx, - xfs_extnum_t num); - -uint -xfs_default_attroffset( - struct xfs_inode *ip); +int xfs_bmap_add_attrfork(struct xfs_inode *ip, int size, int rsvd); +void xfs_bmap_add_free(xfs_fsblock_t bno, xfs_filblks_t len, + struct xfs_bmap_free *flist, struct xfs_mount *mp); +void xfs_bmap_cancel(struct xfs_bmap_free *flist); +void xfs_bmap_compute_maxlevels(struct xfs_mount *mp, int whichfork); +int xfs_bmap_first_unused(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_extlen_t len, xfs_fileoff_t *unused, int whichfork); +int xfs_bmap_last_before(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_fileoff_t *last_block, int whichfork); +int xfs_bmap_last_offset(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_fileoff_t *unused, int whichfork); +int xfs_bmap_one_block(struct xfs_inode *ip, int whichfork); +int xfs_bmap_read_extents(struct xfs_trans *tp, struct xfs_inode *ip, + int whichfork); +int xfs_bmapi_read(struct xfs_inode *ip, xfs_fileoff_t bno, + xfs_filblks_t len, struct xfs_bmbt_irec *mval, + int *nmap, int flags); +int xfs_bmapi_delay(struct xfs_inode *ip, xfs_fileoff_t bno, + xfs_filblks_t len, struct xfs_bmbt_irec *mval, + int *nmap, int flags); +int xfs_bmapi_write(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_fileoff_t bno, xfs_filblks_t len, int flags, + xfs_fsblock_t *firstblock, xfs_extlen_t total, + struct xfs_bmbt_irec *mval, int *nmap, + struct xfs_bmap_free *flist); +int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_fileoff_t bno, xfs_filblks_t len, int flags, + xfs_extnum_t nexts, xfs_fsblock_t *firstblock, + struct xfs_bmap_free *flist, int *done); +int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, + xfs_extnum_t num); +uint xfs_default_attroffset(struct xfs_inode *ip); =20 #ifdef __KERNEL__ - -/* - * Routine to be called at transaction's end by xfs_bmapi, xfs_bunmapi - * caller. Frees all the extents that need freeing, which must be done - * last due to locking considerations. - * - * Return 1 if the given transaction was committed and a new one allocated, - * and 0 otherwise. - */ -int /* error */ -xfs_bmap_finish( - struct xfs_trans **tp, /* transaction pointer addr */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - int *committed); /* xact committed or not */ - /* bmap to userspace formatter - copy to user & advance pointer */ typedef int (*xfs_bmap_format_t)(void **, struct getbmapx *, int *); =20 -/* - * Get inode's extents as described in bmv, and format for output. - */ -int /* error code */ -xfs_getbmap( - xfs_inode_t *ip, - struct getbmapx *bmv, /* user bmap structure */ - xfs_bmap_format_t formatter, /* format to user */ - void *arg); /* formatter arg */ +int xfs_bmap_finish(struct xfs_trans **tp, struct xfs_bmap_free *flist, + int *committed); +int xfs_getbmap(struct xfs_inode *ip, struct getbmapx *bmv, + xfs_bmap_format_t formatter, void *arg); +int xfs_bmap_eof(struct xfs_inode *ip, xfs_fileoff_t endoff, + int whichfork, int *eof); +int xfs_bmap_count_blocks(struct xfs_trans *tp, struct xfs_inode *ip, + int whichfork, int *count); +int xfs_bmap_punch_delalloc_range(struct xfs_inode *ip, + xfs_fileoff_t start_fsb, xfs_fileoff_t length); =20 -/* - * Check if the endoff is outside the last extent. If so the caller will g= row - * the allocation to a stripe unit boundary - */ -int -xfs_bmap_eof( - struct xfs_inode *ip, - xfs_fileoff_t endoff, - int whichfork, - int *eof); - -/* - * Count fsblocks of the given fork. - */ -int -xfs_bmap_count_blocks( - xfs_trans_t *tp, - struct xfs_inode *ip, - int whichfork, - int *count); +xfs_daddr_t xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb); =20 -int -xfs_bmap_punch_delalloc_range( - struct xfs_inode *ip, - xfs_fileoff_t start_fsb, - xfs_fileoff_t length); #endif /* __KERNEL__ */ =20 #endif /* __XFS_BMAP_H__ */ diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index 0e66c4e..88469ca 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -236,5 +236,6 @@ extern int xfs_bmbt_maxrecs(struct xfs_mount *, int blo= cklen, int leaf); extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, int); =20 +extern const struct xfs_buf_ops xfs_bmbt_buf_ops; =20 #endif /* __XFS_BMAP_BTREE_H__ */ diff --git a/include/xfs_btree.h b/include/xfs_btree.h index 82fafc6..be1eb23 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -188,6 +188,8 @@ struct xfs_btree_ops { __int64_t (*key_diff)(struct xfs_btree_cur *cur, union xfs_btree_key *key); =20 + const struct xfs_buf_ops *buf_ops; + #ifdef DEBUG /* check that k1 is lower than k2 */ int (*keys_inorder)(struct xfs_btree_cur *cur, @@ -281,7 +283,7 @@ typedef struct xfs_btree_cur /* * Convert from buffer to btree block header. */ -#define XFS_BUF_TO_BLOCK(bp) ((struct xfs_btree_block *)XFS_BUF_PTR(bp)) +#define XFS_BUF_TO_BLOCK(bp) ((struct xfs_btree_block *)((bp)->b_addr)) =20 =20 /* @@ -374,7 +376,8 @@ xfs_btree_read_bufl( xfs_fsblock_t fsbno, /* file system block number */ uint lock, /* lock flags for read_buf */ struct xfs_buf **bpp, /* buffer for fsbno */ - int refval);/* ref count value for buffer */ + int refval, /* ref count value for buffer */ + const struct xfs_buf_ops *ops); =20 /* * Read-ahead the block, don't wait for it, don't return a buffer. @@ -384,7 +387,8 @@ void /* error */ xfs_btree_reada_bufl( struct xfs_mount *mp, /* file system mount point */ xfs_fsblock_t fsbno, /* file system block number */ - xfs_extlen_t count); /* count of filesystem blocks */ + xfs_extlen_t count, /* count of filesystem blocks */ + const struct xfs_buf_ops *ops); =20 /* * Read-ahead the block, don't wait for it, don't return a buffer. @@ -395,8 +399,20 @@ xfs_btree_reada_bufs( struct xfs_mount *mp, /* file system mount point */ xfs_agnumber_t agno, /* allocation group number */ xfs_agblock_t agbno, /* allocation group block number */ - xfs_extlen_t count); /* count of filesystem blocks */ + xfs_extlen_t count, /* count of filesystem blocks */ + const struct xfs_buf_ops *ops); =20 +/* + * Initialise a new btree block header + */ +void +xfs_btree_init_block( + struct xfs_mount *mp, + struct xfs_buf *bp, + __u32 magic, + __u16 level, + __u16 numrecs, + unsigned int flags); =20 /* * Common btree core entry points. diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index a5efba9..ee36c88 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -21,23 +21,6 @@ extern kmem_zone_t *xfs_buf_item_zone; =20 /* - * This is the structure used to lay out a buf log item in the - * log. The data map describes which 128 byte chunks of the buffer - * have been logged. - * For 6.2 and beyond, this is XFS_LI_BUF. We use this to log everything. - */ -typedef struct xfs_buf_log_format { - unsigned short blf_type; /* buf log item type indicator */ - unsigned short blf_size; /* size of this item */ - ushort blf_flags; /* misc state */ - ushort blf_len; /* number of blocks in this buf */ - __int64_t blf_blkno; /* starting blkno of this buf */ - unsigned int blf_map_size; /* size of data bitmap in words */ - unsigned int blf_data_map[1];/* variable size bitmap of */ - /* regions of buffer in this item */ -} xfs_buf_log_format_t; - -/* * This flag indicates that the buffer contains on disk inodes * and requires special recovery handling. */ @@ -61,6 +44,23 @@ typedef struct xfs_buf_log_format { #define NBWORD (NBBY * sizeof(unsigned int)) =20 /* + * This is the structure used to lay out a buf log item in the + * log. The data map describes which 128 byte chunks of the buffer + * have been logged. + */ +#define XFS_BLF_DATAMAP_SIZE ((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / NBWORD) + +typedef struct xfs_buf_log_format { + unsigned short blf_type; /* buf log item type indicator */ + unsigned short blf_size; /* size of this item */ + ushort blf_flags; /* misc state */ + ushort blf_len; /* number of blocks in this buf */ + __int64_t blf_blkno; /* starting blkno of this buf */ + unsigned int blf_map_size; /* used size of data bitmap in words */ + unsigned int blf_data_map[XFS_BLF_DATAMAP_SIZE]; /* dirty bitmap */ +} xfs_buf_log_format_t; + +/* * buf log item flags */ #define XFS_BLI_HOLD 0x01 @@ -69,7 +69,7 @@ typedef struct xfs_buf_log_format { #define XFS_BLI_LOGGED 0x08 #define XFS_BLI_INODE_ALLOC_BUF 0x10 #define XFS_BLI_STALE_INODE 0x20 -#define XFS_BLI_INODE_BUF 0x40 +#define XFS_BLI_INODE_BUF 0x40 =20 #define XFS_BLI_FLAGS \ { XFS_BLI_HOLD, "HOLD" }, \ @@ -80,6 +80,7 @@ typedef struct xfs_buf_log_format { { XFS_BLI_STALE_INODE, "STALE_INODE" }, \ { XFS_BLI_INODE_BUF, "INODE_BUF" } =20 + #ifdef __KERNEL__ =20 struct xfs_buf; @@ -97,11 +98,9 @@ typedef struct xfs_buf_log_item { unsigned int bli_flags; /* misc flags */ unsigned int bli_recur; /* lock recursion count */ atomic_t bli_refcount; /* cnt of tp refs */ -#ifdef XFS_TRANS_DEBUG - char *bli_orig; /* original buffer copy */ - char *bli_logged; /* bytes logged (bitmap) */ -#endif - xfs_buf_log_format_t bli_format; /* in-log header */ + int bli_format_count; /* count of headers */ + 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; =20 void xfs_buf_item_init(struct xfs_buf *, struct xfs_mount *); @@ -114,16 +113,6 @@ void xfs_buf_attach_iodone(struct xfs_buf *, void xfs_buf_iodone_callbacks(struct xfs_buf *); void xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *); =20 -#ifdef XFS_TRANS_DEBUG -void -xfs_buf_item_flush_log_debug( - struct xfs_buf *bp, - uint first, - uint last); -#else -#define xfs_buf_item_flush_log_debug(bp, first, last) -#endif - #endif /* __KERNEL__ */ =20 #endif /* __XFS_BUF_ITEM_H__ */ diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index fe9f5a8..ee5170c 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -18,7 +18,6 @@ #ifndef __XFS_DA_BTREE_H__ #define __XFS_DA_BTREE_H__ =20 -struct xfs_buf; struct xfs_bmap_free; struct xfs_inode; struct xfs_mount; @@ -32,7 +31,7 @@ struct zone; /* * This structure is common to both leaf nodes and non-leaf nodes in the B= tree. * - * Is is used to manage a doubly linked list of all blocks at the same + * It is used to manage a doubly linked list of all blocks at the same * level in the Btree, and to identify which type of block this is. */ #define XFS_DA_NODE_MAGIC 0xfebe /* magic number: non-leaf blocks */ @@ -133,35 +132,6 @@ typedef struct xfs_da_args { { XFS_DA_OP_CILOOKUP, "CILOOKUP" } =20 /* - * Structure to describe buffer(s) for a block. - * This is needed in the directory version 2 format case, when - * multiple non-contiguous fsblocks might be needed to cover one - * logical directory block. - * If the buffer count is 1 then the data pointer points to the - * same place as the b_addr field for the buffer, else to kmem_alloced mem= ory. - */ -typedef struct xfs_dabuf { - int nbuf; /* number of buffer pointers present */ - short dirty; /* data needs to be copied back */ - short bbcount; /* how large is data in bbs */ - void *data; /* pointer for buffers' data */ -#ifdef XFS_DABUF_DEBUG - inst_t *ra; /* return address of caller to make */ - struct xfs_dabuf *next; /* next in global chain */ - struct xfs_dabuf *prev; /* previous in global chain */ - struct xfs_buftarg *target; /* device for buffer */ - xfs_daddr_t blkno; /* daddr first in bps[0] */ -#endif - struct xfs_buf *bps[1]; /* actually nbuf of these */ -} xfs_dabuf_t; -#define XFS_DA_BUF_SIZE(n) \ - (sizeof(xfs_dabuf_t) + sizeof(struct xfs_buf *) * ((n) - 1)) - -#ifdef XFS_DABUF_DEBUG -extern xfs_dabuf_t *xfs_dabuf_global_list; -#endif - -/* * Storage for holding state during Btree searches and split/join ops. * * Only need space for 5 intermediate nodes. With a minimum of 62-way @@ -169,7 +139,7 @@ extern xfs_dabuf_t *xfs_dabuf_global_list; * which is slightly more than enough. */ typedef struct xfs_da_state_blk { - xfs_dabuf_t *bp; /* buffer containing block */ + struct xfs_buf *bp; /* buffer containing block */ xfs_dablk_t blkno; /* filesystem blkno of buffer */ xfs_daddr_t disk_blkno; /* on-disk blkno (in BBs) of buffer */ int index; /* relevant index into block */ @@ -222,7 +192,7 @@ struct xfs_nameops { * Routines used for growing the Btree. */ int xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, - xfs_dabuf_t **bpp, int whichfork); + struct xfs_buf **bpp, int whichfork); int xfs_da_split(xfs_da_state_t *state); =20 /* @@ -243,21 +213,28 @@ int xfs_da_path_shift(xfs_da_state_t *state, xfs_da_s= tate_path_t *path, */ int xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, xfs_da_state_blk_t *new_blk); +int xfs_da_node_read(struct xfs_trans *tp, struct xfs_inode *dp, + xfs_dablk_t bno, xfs_daddr_t mappedbno, + struct xfs_buf **bpp, int which_fork); =20 /* * Utility routines. */ int xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno); +int xfs_da_grow_inode_int(struct xfs_da_args *args, xfs_fileoff_t *bno, + int count); int xfs_da_get_buf(struct xfs_trans *trans, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, - xfs_dabuf_t **bp, int whichfork); + struct xfs_buf **bp, int whichfork); int xfs_da_read_buf(struct xfs_trans *trans, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, - xfs_dabuf_t **bpp, int whichfork); + struct xfs_buf **bpp, int whichfork, + const struct xfs_buf_ops *ops); xfs_daddr_t xfs_da_reada_buf(struct xfs_trans *trans, struct xfs_inode *dp, - xfs_dablk_t bno, int whichfork); + xfs_dablk_t bno, xfs_daddr_t mapped_bno, + int whichfork, const struct xfs_buf_ops *ops); int xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, - xfs_dabuf_t *dead_buf); + struct xfs_buf *dead_buf); =20 uint xfs_da_hashname(const __uint8_t *name_string, int name_length); enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args, @@ -267,15 +244,7 @@ enum xfs_dacmp xfs_da_compname(struct xfs_da_args *arg= s, xfs_da_state_t *xfs_da_state_alloc(void); void xfs_da_state_free(xfs_da_state_t *state); =20 -void xfs_da_buf_done(xfs_dabuf_t *dabuf); -void xfs_da_log_buf(struct xfs_trans *tp, xfs_dabuf_t *dabuf, uint first, - uint last); -void xfs_da_brelse(struct xfs_trans *tp, xfs_dabuf_t *dabuf); -void xfs_da_binval(struct xfs_trans *tp, xfs_dabuf_t *dabuf); -xfs_daddr_t xfs_da_blkno(xfs_dabuf_t *dabuf); - extern struct kmem_zone *xfs_da_state_zone; -extern struct kmem_zone *xfs_dabuf_zone; extern const struct xfs_nameops xfs_default_nameops; =20 #endif /* __XFS_DA_BTREE_H__ */ diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index dffba9b..1d9643b 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -33,7 +33,7 @@ typedef struct xfs_timestamp { * variable size the leftover area split into a data and an attribute fork. * The format of the data and attribute fork depends on the format of the * inode as indicated by di_format and di_aformat. To access the data and - * attribute use the XFS_DFORK_PTR, XFS_DFORK_DPTR, and XFS_DFORK_PTR macr= os + * attribute use the XFS_DFORK_DPTR, XFS_DFORK_APTR, and XFS_DFORK_PTR mac= ros * below. * * There is a very similar struct icdinode in xfs_inode which matches the @@ -148,7 +148,7 @@ typedef enum xfs_dinode_fmt { be32_to_cpu((dip)->di_nextents) : \ be16_to_cpu((dip)->di_anextents)) =20 -#define XFS_BUF_TO_DINODE(bp) ((xfs_dinode_t *)XFS_BUF_PTR(bp)) +#define XFS_BUF_TO_DINODE(bp) ((xfs_dinode_t *)((bp)->b_addr)) =20 /* * For block and character special files the 32bit dev_t is stored at the diff --git a/include/xfs_dir1.h b/include/xfs_dir1.h new file mode 100644 index 0000000..d83537c --- /dev/null +++ b/include/xfs_dir1.h @@ -0,0 +1,13 @@ +#ifndef __XFS_DIRV1_H +#define __XFS_DIRV1_H 1 + +#if XFS_BIG_INUMS +typedef xfs_ino_t xfs_intino_t; +#else +typedef __uint32_t xfs_intino_t; +#endif + +#include +#include + +#endif /* __XFS_DIRV1_H */ diff --git a/include/xfs_dir2.h b/include/xfs_dir2.h index 74a3b10..2dd0cc0 100644 --- a/include/xfs_dir2.h +++ b/include/xfs_dir2.h @@ -16,49 +16,23 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __XFS_DIR2_H__ -#define __XFS_DIR2_H__ +#define __XFS_DIR2_H__ =20 -struct uio; -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_dir2_put_args; struct xfs_bmap_free; +struct xfs_da_args; struct xfs_inode; struct xfs_mount; struct xfs_trans; +struct xfs_dir2_sf_hdr; +struct xfs_dir2_sf_entry; +struct xfs_dir2_data_hdr; +struct xfs_dir2_data_entry; +struct xfs_dir2_data_unused; +struct xfs_dir2_data_free; =20 -/* - * Directory version 2. - * There are 4 possible formats: - * shortform - * single block - data with embedded leaf at the end - * multiple data blocks, single leaf+freeindex block - * data blocks, node&leaf blocks (btree), freeindex blocks - * - * The shortform format is in xfs_dir2_sf.h. - * The single block format is in xfs_dir2_block.h. - * The data block format is in xfs_dir2_data.h. - * The leaf and freeindex block formats are in xfs_dir2_leaf.h. - * Node blocks are the same as the other version, in xfs_da_btree.h. - */ - -/* - * Byte offset in data block and shortform entry. - */ -typedef __uint16_t xfs_dir2_data_off_t; -#define NULLDATAOFF 0xffffU typedef uint xfs_dir2_data_aoff_t; /* argument form */ - -/* - * Directory block number (logical dirblk in file) - */ typedef __uint32_t xfs_dir2_db_t; =20 -/* - * Byte offset in a directory. - */ -typedef xfs_off_t xfs_dir2_off_t; - extern struct xfs_name xfs_name_dotdot; =20 /* @@ -86,21 +60,44 @@ extern int xfs_dir_replace(struct xfs_trans *tp, struct= xfs_inode *dp, struct xfs_bmap_free *flist, xfs_extlen_t tot); extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp, struct xfs_name *name, uint resblks); -extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino); =20 /* - * Utility routines for v2 directories. + * Direct call from the bmap code, bypassing the generic directory layer. */ -extern int xfs_dir2_grow_inode(struct xfs_da_args *args, int space, - xfs_dir2_db_t *dbp); -extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp, - int *vp); -extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, - int *vp); +extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); + +/* + * used by db + */ +extern xfs_ino_t xfs_dir2_sf_get_parent_ino(struct xfs_dir2_sf_hdr *sfp); +extern void xfs_dir2_sf_put_parent_ino(struct xfs_dir2_sf_hdr *sfp, + xfs_ino_t ino); +extern xfs_ino_t xfs_dir2_sfe_get_ino(struct xfs_dir2_sf_hdr *sfp, + struct xfs_dir2_sf_entry *sfep); +extern void xfs_dir2_sfe_put_ino( struct xfs_dir2_sf_hdr *, + struct xfs_dir2_sf_entry *sfep, xfs_ino_t ino); + +extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp, in= t *r); +extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, int= *r); extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t d= b, - struct xfs_dabuf *bp); + struct xfs_buf *bp); + +extern void xfs_dir2_data_freescan(struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr, int *loghead); +extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_buf *= bp, + struct xfs_dir2_data_entry *dep); +extern void xfs_dir2_data_log_header(struct xfs_trans *tp, + struct xfs_buf *bp); +extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_buf = *bp, + struct xfs_dir2_data_unused *dup); +extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_buf *= bp, + xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, + int *needlogp, int *needscanp); +extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_buf *b= p, + struct xfs_dir2_data_unused *dup, xfs_dir2_data_aoff_t offset, + xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); =20 -extern int xfs_dir_cilookup_result(struct xfs_da_args *args, - const unsigned char *name, int len); +extern struct xfs_dir2_data_free *xfs_dir2_data_freefind( + struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_data_unused *dup); =20 #endif /* __XFS_DIR2_H__ */ diff --git a/include/xfs_dir2_block.h b/include/xfs_dir2_block.h deleted file mode 100644 index 10e6896..0000000 --- a/include/xfs_dir2_block.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2000-2001,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_DIR2_BLOCK_H__ -#define __XFS_DIR2_BLOCK_H__ - -/* - * xfs_dir2_block.h - * Directory version 2, single block format structures - */ - -struct uio; -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_dir2_data_hdr; -struct xfs_dir2_leaf_entry; -struct xfs_inode; -struct xfs_mount; -struct xfs_trans; - -/* - * The single block format is as follows: - * xfs_dir2_data_hdr_t structure - * xfs_dir2_data_entry_t and xfs_dir2_data_unused_t structures - * xfs_dir2_leaf_entry_t structures - * xfs_dir2_block_tail_t structure - */ - -#define XFS_DIR2_BLOCK_MAGIC 0x58443242 /* XD2B: for one block dirs */ - -typedef struct xfs_dir2_block_tail { - __be32 count; /* count of leaf entries */ - __be32 stale; /* count of stale lf entries */ -} xfs_dir2_block_tail_t; - -/* - * Generic single-block structure, for xfs_db. - */ -typedef struct xfs_dir2_block { - xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_BLOCK_MAGIC */ - xfs_dir2_data_union_t u[1]; - xfs_dir2_leaf_entry_t leaf[1]; - xfs_dir2_block_tail_t tail; -} xfs_dir2_block_t; - -/* - * Pointer to the leaf header embedded in a data block (1-block format) - */ -static inline xfs_dir2_block_tail_t * -xfs_dir2_block_tail_p(struct xfs_mount *mp, xfs_dir2_block_t *block) -{ - return (((xfs_dir2_block_tail_t *) - ((char *)(block) + (mp)->m_dirblksize)) - 1); -} - -/* - * Pointer to the leaf entries embedded in a data block (1-block format) - */ -static inline struct xfs_dir2_leaf_entry * -xfs_dir2_block_leaf_p(xfs_dir2_block_tail_t *btp) -{ - return ((struct xfs_dir2_leaf_entry *)btp) - be32_to_cpu(btp->count); -} - -/* - * Function declarations. - */ -extern int xfs_dir2_block_addname(struct xfs_da_args *args); -extern int xfs_dir2_block_getdents(struct xfs_inode *dp, void *dirent, - xfs_off_t *offset, filldir_t filldir); -extern int xfs_dir2_block_lookup(struct xfs_da_args *args); -extern int xfs_dir2_block_removename(struct xfs_da_args *args); -extern int xfs_dir2_block_replace(struct xfs_da_args *args); -extern int xfs_dir2_leaf_to_block(struct xfs_da_args *args, - struct xfs_dabuf *lbp, struct xfs_dabuf *dbp); -extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); - -#endif /* __XFS_DIR2_BLOCK_H__ */ diff --git a/include/xfs_dir2_data.h b/include/xfs_dir2_data.h deleted file mode 100644 index efbc290..0000000 --- a/include/xfs_dir2_data.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2000,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_DIR2_DATA_H__ -#define __XFS_DIR2_DATA_H__ - -/* - * Directory format 2, data block structures. - */ - -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_inode; -struct xfs_trans; - -/* - * Constants. - */ -#define XFS_DIR2_DATA_MAGIC 0x58443244 /* XD2D: for multiblock dirs */ -#define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ -#define XFS_DIR2_DATA_ALIGN (1 << XFS_DIR2_DATA_ALIGN_LOG) -#define XFS_DIR2_DATA_FREE_TAG 0xffff -#define XFS_DIR2_DATA_FD_COUNT 3 - -/* - * Directory address space divided into sections, - * spaces separated by 32GB. - */ -#define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) -#define XFS_DIR2_DATA_SPACE 0 -#define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_DATA_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) - -/* - * Offsets of . and .. in data space (always block 0) - */ -#define XFS_DIR2_DATA_DOT_OFFSET \ - ((xfs_dir2_data_aoff_t)sizeof(xfs_dir2_data_hdr_t)) -#define XFS_DIR2_DATA_DOTDOT_OFFSET \ - (XFS_DIR2_DATA_DOT_OFFSET + xfs_dir2_data_entsize(1)) -#define XFS_DIR2_DATA_FIRST_OFFSET \ - (XFS_DIR2_DATA_DOTDOT_OFFSET + xfs_dir2_data_entsize(2)) - -/* - * Structures. - */ - -/* - * Describe a free area in the data block. - * The freespace will be formatted as a xfs_dir2_data_unused_t. - */ -typedef struct xfs_dir2_data_free { - __be16 offset; /* start of freespace */ - __be16 length; /* length of freespace */ -} xfs_dir2_data_free_t; - -/* - * Header for the data blocks. - * Always at the beginning of a directory-sized block. - * The code knows that XFS_DIR2_DATA_FD_COUNT is 3. - */ -typedef struct xfs_dir2_data_hdr { - __be32 magic; /* XFS_DIR2_DATA_MAGIC */ - /* or XFS_DIR2_BLOCK_MAGIC */ - xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; -} xfs_dir2_data_hdr_t; - -/* - * Active entry in a data block. Aligned to 8 bytes. - * Tag appears as the last 2 bytes. - */ -typedef struct xfs_dir2_data_entry { - __be64 inumber; /* inode number */ - __u8 namelen; /* name length */ - __u8 name[1]; /* name bytes, no null */ - /* variable offset */ - __be16 tag; /* starting offset of us */ -} xfs_dir2_data_entry_t; - -/* - * Unused entry in a data block. Aligned to 8 bytes. - * Tag appears as the last 2 bytes. - */ -typedef struct xfs_dir2_data_unused { - __be16 freetag; /* XFS_DIR2_DATA_FREE_TAG */ - __be16 length; /* total free length */ - /* variable offset */ - __be16 tag; /* starting offset of us */ -} xfs_dir2_data_unused_t; - -typedef union { - xfs_dir2_data_entry_t entry; - xfs_dir2_data_unused_t unused; -} xfs_dir2_data_union_t; - -/* - * Generic data block structure, for xfs_db. - */ -typedef struct xfs_dir2_data { - xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_DATA_MAGIC */ - xfs_dir2_data_union_t u[1]; -} xfs_dir2_data_t; - -/* - * Macros. - */ - -/* - * Size of a data entry. - */ -static inline int xfs_dir2_data_entsize(int n) -{ - return (int)roundup(offsetof(xfs_dir2_data_entry_t, name[0]) + (n) + \ - (uint)sizeof(xfs_dir2_data_off_t), XFS_DIR2_DATA_ALIGN); -} - -/* - * Pointer to an entry's tag word. - */ -static inline __be16 * -xfs_dir2_data_entry_tag_p(xfs_dir2_data_entry_t *dep) -{ - return (__be16 *)((char *)dep + - xfs_dir2_data_entsize(dep->namelen) - sizeof(__be16)); -} - -/* - * Pointer to a freespace's tag word. - */ -static inline __be16 * -xfs_dir2_data_unused_tag_p(xfs_dir2_data_unused_t *dup) -{ - return (__be16 *)((char *)dup + - be16_to_cpu(dup->length) - sizeof(__be16)); -} - -/* - * Function declarations. - */ -#ifdef DEBUG -extern void xfs_dir2_data_check(struct xfs_inode *dp, struct xfs_dabuf *bp= ); -#else -#define xfs_dir2_data_check(dp,bp) -#endif -extern xfs_dir2_data_free_t *xfs_dir2_data_freefind(xfs_dir2_data_t *d, - xfs_dir2_data_unused_t *dup); -extern xfs_dir2_data_free_t *xfs_dir2_data_freeinsert(xfs_dir2_data_t *d, - xfs_dir2_data_unused_t *dup, int *loghead); -extern void xfs_dir2_data_freescan(struct xfs_mount *mp, xfs_dir2_data_t *= d, - int *loghead); -extern int xfs_dir2_data_init(struct xfs_da_args *args, xfs_dir2_db_t blkn= o, - struct xfs_dabuf **bpp); -extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_dabuf= *bp, - xfs_dir2_data_entry_t *dep); -extern void xfs_dir2_data_log_header(struct xfs_trans *tp, - struct xfs_dabuf *bp); -extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_dabu= f *bp, - xfs_dir2_data_unused_t *dup); -extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_dabuf= *bp, - xfs_dir2_data_aoff_t offset, - xfs_dir2_data_aoff_t len, int *needlogp, - int *needscanp); -extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_dabuf = *bp, - xfs_dir2_data_unused_t *dup, - xfs_dir2_data_aoff_t offset, - xfs_dir2_data_aoff_t len, int *needlogp, - int *needscanp); - -#endif /* __XFS_DIR2_DATA_H__ */ diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h new file mode 100644 index 0000000..0727098 --- /dev/null +++ b/include/xfs_dir2_format.h @@ -0,0 +1,597 @@ +/* + * Copyright (c) 2000-2001,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_DIR2_FORMAT_H__ +#define __XFS_DIR2_FORMAT_H__ + +/* + * Directory version 2. + * + * There are 4 possible formats: + * - shortform - embedded into the inode + * - single block - data with embedded leaf at the end + * - multiple data blocks, single leaf+freeindex block + * - data blocks, node and leaf blocks (btree), freeindex blocks + * + * Note: many node blocks structures and constants are shared with the attr + * code and defined in xfs_da_btree.h. + */ + +#define XFS_DIR2_BLOCK_MAGIC 0x58443242 /* XD2B: single block dirs */ +#define XFS_DIR2_DATA_MAGIC 0x58443244 /* XD2D: multiblock dirs */ +#define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F: free index blocks */ + +/* + * Byte offset in data block and shortform entry. + */ +typedef __uint16_t xfs_dir2_data_off_t; +#define NULLDATAOFF 0xffffU +typedef uint xfs_dir2_data_aoff_t; /* argument form */ + +/* + * Normalized offset (in a data block) of the entry, really xfs_dir2_data_= off_t. + * Only need 16 bits, this is the byte offset into the single block form. + */ +typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; + +/* + * Offset in data space of a data entry. + */ +typedef __uint32_t xfs_dir2_dataptr_t; +#define XFS_DIR2_MAX_DATAPTR ((xfs_dir2_dataptr_t)0xffffffff) +#define XFS_DIR2_NULL_DATAPTR ((xfs_dir2_dataptr_t)0) + +/* + * Byte offset in a directory. + */ +typedef xfs_off_t xfs_dir2_off_t; + +/* + * Directory block number (logical dirblk in file) + */ +typedef __uint32_t xfs_dir2_db_t; + +/* + * Inode number stored as 8 8-bit values. + */ +typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; + +/* + * Inode number stored as 4 8-bit values. + * Works a lot of the time, when all the inode numbers in a directory + * fit in 32 bits. + */ +typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t; + +typedef union { + xfs_dir2_ino8_t i8; + xfs_dir2_ino4_t i4; +} xfs_dir2_inou_t; +#define XFS_DIR2_MAX_SHORT_INUM ((xfs_ino_t)0xffffffffULL) + +/* + * Directory layout when stored internal to an inode. + * + * Small directories are packed as tightly as possible so as to fit into t= he + * literal area of the inode. These "shortform" directories consist of a + * single xfs_dir2_sf_hdr header followed by zero or more xfs_dir2_sf_entry + * structures. Due the different inode number storage size and the variab= le + * length name field in the xfs_dir2_sf_entry all these structure are + * variable length, and the accessors in this file should be used to itera= te + * over them. + */ +typedef struct xfs_dir2_sf_hdr { + __uint8_t count; /* count of entries */ + __uint8_t i8count; /* count of 8-byte inode #s */ + xfs_dir2_inou_t parent; /* parent dir inode number */ +} __arch_pack xfs_dir2_sf_hdr_t; + +typedef struct xfs_dir2_sf_entry { + __u8 namelen; /* actual name length */ + xfs_dir2_sf_off_t offset; /* saved offset */ + __u8 name[]; /* name, variable size */ + /* + * A xfs_dir2_ino8_t or xfs_dir2_ino4_t follows here, at a + * variable offset after the name. + */ +} __arch_pack xfs_dir2_sf_entry_t; + +static inline int xfs_dir2_sf_hdr_size(int i8count) +{ + return sizeof(struct xfs_dir2_sf_hdr) - + (i8count =3D=3D 0) * + (sizeof(xfs_dir2_ino8_t) - sizeof(xfs_dir2_ino4_t)); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) +{ + return get_unaligned_be16(&sfep->offset.i); +} + +static inline void +xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) +{ + put_unaligned_be16(off, &sfep->offset.i); +} + +static inline int +xfs_dir2_sf_entsize(struct xfs_dir2_sf_hdr *hdr, int len) +{ + return sizeof(struct xfs_dir2_sf_entry) + /* namelen + offset */ + len + /* name */ + (hdr->i8count ? /* ino */ + sizeof(xfs_dir2_ino8_t) : + sizeof(xfs_dir2_ino4_t)); +} + +static inline struct xfs_dir2_sf_entry * +xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); +} + +static inline struct xfs_dir2_sf_entry * +xfs_dir2_sf_nextentry(struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)sfep + xfs_dir2_sf_entsize(hdr, sfep->namelen)); +} + + +/* + * Data block structures. + * + * A pure data block looks like the following drawing on disk: + * + * +-------------------------------------------------+ + * | xfs_dir2_data_hdr_t | + * +-------------------------------------------------+ + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | ... | + * +-------------------------------------------------+ + * | unused space | + * +-------------------------------------------------+ + * + * As all the entries are variable size structures the accessors below sho= uld + * be used to iterate over them. + * + * In addition to the pure data blocks for the data and node formats, + * most structures are also used for the combined data/freespace "block" + * format below. + */ + +#define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ +#define XFS_DIR2_DATA_ALIGN (1 << XFS_DIR2_DATA_ALIGN_LOG) +#define XFS_DIR2_DATA_FREE_TAG 0xffff +#define XFS_DIR2_DATA_FD_COUNT 3 + +/* + * Directory address space divided into sections, + * spaces separated by 32GB. + */ +#define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) +#define XFS_DIR2_DATA_SPACE 0 +#define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_DATA_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) + +/* + * Offsets of . and .. in data space (always block 0) + */ +#define XFS_DIR2_DATA_DOT_OFFSET \ + ((xfs_dir2_data_aoff_t)sizeof(struct xfs_dir2_data_hdr)) +#define XFS_DIR2_DATA_DOTDOT_OFFSET \ + (XFS_DIR2_DATA_DOT_OFFSET + xfs_dir2_data_entsize(1)) +#define XFS_DIR2_DATA_FIRST_OFFSET \ + (XFS_DIR2_DATA_DOTDOT_OFFSET + xfs_dir2_data_entsize(2)) + +/* + * Describe a free area in the data block. + * + * The freespace will be formatted as a xfs_dir2_data_unused_t. + */ +typedef struct xfs_dir2_data_free { + __be16 offset; /* start of freespace */ + __be16 length; /* length of freespace */ +} xfs_dir2_data_free_t; + +/* + * Header for the data blocks. + * + * The code knows that XFS_DIR2_DATA_FD_COUNT is 3. + */ +typedef struct xfs_dir2_data_hdr { + __be32 magic; /* XFS_DIR2_DATA_MAGIC or */ + /* XFS_DIR2_BLOCK_MAGIC */ + xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; +} xfs_dir2_data_hdr_t; + +/* + * Active entry in a data block. + * + * Aligned to 8 bytes. After the variable length name field there is a + * 2 byte tag field, which can be accessed using xfs_dir2_data_entry_tag_p. + */ +typedef struct xfs_dir2_data_entry { + __be64 inumber; /* inode number */ + __u8 namelen; /* name length */ + __u8 name[]; /* name bytes, no null */ + /* __be16 tag; */ /* starting offset of us */ +} xfs_dir2_data_entry_t; + +/* + * Unused entry in a data block. + * + * Aligned to 8 bytes. Tag appears as the last 2 bytes and must be access= ed + * using xfs_dir2_data_unused_tag_p. + */ +typedef struct xfs_dir2_data_unused { + __be16 freetag; /* XFS_DIR2_DATA_FREE_TAG */ + __be16 length; /* total free length */ + /* variable offset */ + __be16 tag; /* starting offset of us */ +} xfs_dir2_data_unused_t; + +/* + * Size of a data entry. + */ +static inline int xfs_dir2_data_entsize(int n) +{ + return (int)roundup(offsetof(struct xfs_dir2_data_entry, name[0]) + n + + (uint)sizeof(xfs_dir2_data_off_t), XFS_DIR2_DATA_ALIGN); +} + +/* + * Pointer to an entry's tag word. + */ +static inline __be16 * +xfs_dir2_data_entry_tag_p(struct xfs_dir2_data_entry *dep) +{ + return (__be16 *)((char *)dep + + xfs_dir2_data_entsize(dep->namelen) - sizeof(__be16)); +} + +/* + * Pointer to a freespace's tag word. + */ +static inline __be16 * +xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) +{ + return (__be16 *)((char *)dup + + be16_to_cpu(dup->length) - sizeof(__be16)); +} + +/* + * Leaf block structures. + * + * A pure leaf block looks like the following drawing on disk: + * + * +---------------------------+ + * | xfs_dir2_leaf_hdr_t | + * +---------------------------+ + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | ... | + * +---------------------------+ + * | xfs_dir2_data_off_t | + * | xfs_dir2_data_off_t | + * | xfs_dir2_data_off_t | + * | ... | + * +---------------------------+ + * | xfs_dir2_leaf_tail_t | + * +---------------------------+ + * + * The xfs_dir2_data_off_t members (bests) and tail are at the end of the = block + * for single-leaf (magic =3D XFS_DIR2_LEAF1_MAGIC) blocks only, but not p= resent + * for directories with separate leaf nodes and free space blocks + * (magic =3D XFS_DIR2_LEAFN_MAGIC). + * + * As all the entries are variable size structures the accessors below sho= uld + * be used to iterate over them. + */ + +/* + * Offset of the leaf/node space. First block in this space + * is the btree root. + */ +#define XFS_DIR2_LEAF_SPACE 1 +#define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_LEAF_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) + +/* + * Leaf block header. + */ +typedef struct xfs_dir2_leaf_hdr { + xfs_da_blkinfo_t info; /* header for da routines */ + __be16 count; /* count of entries */ + __be16 stale; /* count of stale entries */ +} xfs_dir2_leaf_hdr_t; + +/* + * Leaf block entry. + */ +typedef struct xfs_dir2_leaf_entry { + __be32 hashval; /* hash value of name */ + __be32 address; /* address of data entry */ +} xfs_dir2_leaf_entry_t; + +/* + * Leaf block tail. + */ +typedef struct xfs_dir2_leaf_tail { + __be32 bestcount; +} xfs_dir2_leaf_tail_t; + +/* + * Leaf block. + */ +typedef struct xfs_dir2_leaf { + xfs_dir2_leaf_hdr_t hdr; /* leaf header */ + xfs_dir2_leaf_entry_t ents[]; /* entries */ +} xfs_dir2_leaf_t; + +/* + * DB blocks here are logical directory block numbers, not filesystem bloc= ks. + */ + +static inline int xfs_dir2_max_leaf_ents(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - (uint)sizeof(struct xfs_dir2_leaf_hdr)) / + (uint)sizeof(struct xfs_dir2_leaf_entry); +} + +/* + * Get address of the bestcount field in the single-leaf block. + */ +static inline struct xfs_dir2_leaf_tail * +xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +{ + return (struct xfs_dir2_leaf_tail *) + ((char *)lp + mp->m_dirblksize - + sizeof(struct xfs_dir2_leaf_tail)); +} + +/* + * Get address of the bests array in the single-leaf block. + */ +static inline __be16 * +xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) +{ + return (__be16 *)ltp - be32_to_cpu(ltp->bestcount); +} + +/* + * Convert dataptr to byte in file space + */ +static inline xfs_dir2_off_t +xfs_dir2_dataptr_to_byte(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; +} + +/* + * Convert byte in file space to dataptr. It had better be aligned. + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_byte_to_dataptr(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); +} + +/* + * Convert byte in space to (DB) block + */ +static inline xfs_dir2_db_t +xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_db_t) + (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); +} + +/* + * Convert dataptr to a block number + */ +static inline xfs_dir2_db_t +xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(mp, dp)); +} + +/* + * Convert byte in space to offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_data_aoff_t)(by & + ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); +} + +/* + * Convert dataptr to a byte offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(mp, dp)); +} + +/* + * Convert block and offset to byte in space + */ +static inline xfs_dir2_off_t +xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return ((xfs_dir2_off_t)db << + (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; +} + +/* + * Convert block (DB) to block (dablk) + */ +static inline xfs_dablk_t +xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); +} + +/* + * Convert byte in space to (DA) block + */ +static inline xfs_dablk_t +xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); +} + +/* + * Convert block and offset to dataptr + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return xfs_dir2_byte_to_dataptr(mp, xfs_dir2_db_off_to_byte(mp, db, o)); +} + +/* + * Convert block (dablk) to block (DB) + */ +static inline xfs_dir2_db_t +xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) +{ + return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); +} + +/* + * Convert block (dablk) to byte offset in space + */ +static inline xfs_dir2_off_t +xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) +{ + return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); +} + +/* + * Free space block defintions for the node format. + */ + +/* + * Offset of the freespace index. + */ +#define XFS_DIR2_FREE_SPACE 2 +#define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_FREE_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + +typedef struct xfs_dir2_free_hdr { + __be32 magic; /* XFS_DIR2_FREE_MAGIC */ + __be32 firstdb; /* db of first entry */ + __be32 nvalid; /* count of valid entries */ + __be32 nused; /* count of used entries */ +} xfs_dir2_free_hdr_t; + +typedef struct xfs_dir2_free { + xfs_dir2_free_hdr_t hdr; /* block header */ + __be16 bests[]; /* best free counts */ + /* unused entries are -1 */ +} xfs_dir2_free_t; + +static inline int xfs_dir2_free_max_bests(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - sizeof(struct xfs_dir2_free_hdr)) / + sizeof(xfs_dir2_data_off_t); +} + +/* + * Convert data space db to the corresponding free db. + */ +static inline xfs_dir2_db_t +xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir2_free_max_bests(mp); +} + +/* + * Convert data space db to the corresponding index in a free db. + */ +static inline int +xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return db % xfs_dir2_free_max_bests(mp); +} + +/* + * Single block format. + * + * The single block format looks like the following drawing on disk: + * + * +-------------------------------------------------+ + * | xfs_dir2_data_hdr_t | + * +-------------------------------------------------+ + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t : + * | ... | + * +-------------------------------------------------+ + * | unused space | + * +-------------------------------------------------+ + * | ... | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * +-------------------------------------------------+ + * | xfs_dir2_block_tail_t | + * +-------------------------------------------------+ + * + * As all the entries are variable size structures the accessors below sho= uld + * be used to iterate over them. + */ + +typedef struct xfs_dir2_block_tail { + __be32 count; /* count of leaf entries */ + __be32 stale; /* count of stale lf entries */ +} xfs_dir2_block_tail_t; + +/* + * Pointer to the leaf header embedded in a data block (1-block format) + */ +static inline struct xfs_dir2_block_tail * +xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) +{ + return ((struct xfs_dir2_block_tail *) + ((char *)hdr + mp->m_dirblksize)) - 1; +} + +/* + * Pointer to the leaf entries embedded in a data block (1-block format) + */ +static inline struct xfs_dir2_leaf_entry * +xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) +{ + return ((struct xfs_dir2_leaf_entry *)btp) - be32_to_cpu(btp->count); +} + +#endif /* __XFS_DIR2_FORMAT_H__ */ diff --git a/include/xfs_dir2_leaf.h b/include/xfs_dir2_leaf.h deleted file mode 100644 index 6c9539f..0000000 --- a/include/xfs_dir2_leaf.h +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (c) 2000-2001,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_DIR2_LEAF_H__ -#define __XFS_DIR2_LEAF_H__ - -struct uio; -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_inode; -struct xfs_mount; -struct xfs_trans; - -/* - * Offset of the leaf/node space. First block in this space - * is the btree root. - */ -#define XFS_DIR2_LEAF_SPACE 1 -#define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_LEAF_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) - -/* - * Offset in data space of a data entry. - */ -typedef __uint32_t xfs_dir2_dataptr_t; -#define XFS_DIR2_MAX_DATAPTR ((xfs_dir2_dataptr_t)0xffffffff) -#define XFS_DIR2_NULL_DATAPTR ((xfs_dir2_dataptr_t)0) - -/* - * Leaf block header. - */ -typedef struct xfs_dir2_leaf_hdr { - xfs_da_blkinfo_t info; /* header for da routines */ - __be16 count; /* count of entries */ - __be16 stale; /* count of stale entries */ -} xfs_dir2_leaf_hdr_t; - -/* - * Leaf block entry. - */ -typedef struct xfs_dir2_leaf_entry { - __be32 hashval; /* hash value of name */ - __be32 address; /* address of data entry */ -} xfs_dir2_leaf_entry_t; - -/* - * Leaf block tail. - */ -typedef struct xfs_dir2_leaf_tail { - __be32 bestcount; -} xfs_dir2_leaf_tail_t; - -/* - * Leaf block. - * bests and tail are at the end of the block for single-leaf only - * (magic =3D XFS_DIR2_LEAF1_MAGIC not XFS_DIR2_LEAFN_MAGIC). - */ -typedef struct xfs_dir2_leaf { - xfs_dir2_leaf_hdr_t hdr; /* leaf header */ - xfs_dir2_leaf_entry_t ents[1]; /* entries */ - /* ... */ - xfs_dir2_data_off_t bests[1]; /* best free counts */ - xfs_dir2_leaf_tail_t tail; /* leaf tail */ -} xfs_dir2_leaf_t; - -/* - * DB blocks here are logical directory block numbers, not filesystem bloc= ks. - */ - -static inline int xfs_dir2_max_leaf_ents(struct xfs_mount *mp) -{ - return (int)(((mp)->m_dirblksize - (uint)sizeof(xfs_dir2_leaf_hdr_t)) / - (uint)sizeof(xfs_dir2_leaf_entry_t)); -} - -/* - * Get address of the bestcount field in the single-leaf block. - */ -static inline xfs_dir2_leaf_tail_t * -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, xfs_dir2_leaf_t *lp) -{ - return (xfs_dir2_leaf_tail_t *) - ((char *)(lp) + (mp)->m_dirblksize -=20 - (uint)sizeof(xfs_dir2_leaf_tail_t)); -} - -/* - * Get address of the bests array in the single-leaf block. - */ -static inline __be16 * -xfs_dir2_leaf_bests_p(xfs_dir2_leaf_tail_t *ltp) -{ - return (__be16 *)ltp - be32_to_cpu(ltp->bestcount); -} - -/* - * Convert dataptr to byte in file space - */ -static inline xfs_dir2_off_t -xfs_dir2_dataptr_to_byte(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return (xfs_dir2_off_t)(dp) << XFS_DIR2_DATA_ALIGN_LOG; -} - -/* - * Convert byte in file space to dataptr. It had better be aligned. - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_byte_to_dataptr(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_dataptr_t)((by) >> XFS_DIR2_DATA_ALIGN_LOG); -} - -/* - * Convert byte in space to (DB) block - */ -static inline xfs_dir2_db_t -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_db_t)((by) >> \ - ((mp)->m_sb.sb_blocklog + (mp)->m_sb.sb_dirblklog)); -} - -/* - * Convert dataptr to a block number - */ -static inline xfs_dir2_db_t -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(mp, dp)); -} - -/* - * Convert byte in space to offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_data_aoff_t)((by) & \ - ((1 << ((mp)->m_sb.sb_blocklog + (mp)->m_sb.sb_dirblklog)) - 1)); -} - -/* - * Convert dataptr to a byte offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(mp, dp)); -} - -/* - * Convert block and offset to byte in space - */ -static inline xfs_dir2_off_t -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return ((xfs_dir2_off_t)(db) << \ - ((mp)->m_sb.sb_blocklog + (mp)->m_sb.sb_dirblklog)) + (o); -} - -/* - * Convert block (DB) to block (dablk) - */ -static inline xfs_dablk_t -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return (xfs_dablk_t)((db) << (mp)->m_sb.sb_dirblklog); -} - -/* - * Convert byte in space to (DA) block - */ -static inline xfs_dablk_t -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); -} - -/* - * Convert block and offset to dataptr - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return xfs_dir2_byte_to_dataptr(mp, xfs_dir2_db_off_to_byte(mp, db, o)); -} - -/* - * Convert block (dablk) to block (DB) - */ -static inline xfs_dir2_db_t -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) -{ - return (xfs_dir2_db_t)((da) >> (mp)->m_sb.sb_dirblklog); -} - -/* - * Convert block (dablk) to byte offset in space - */ -static inline xfs_dir2_off_t -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) -{ - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); -} - -/* - * Function declarations. - */ -extern int xfs_dir2_block_to_leaf(struct xfs_da_args *args, - struct xfs_dabuf *dbp); -extern int xfs_dir2_leaf_addname(struct xfs_da_args *args); -extern void xfs_dir2_leaf_compact(struct xfs_da_args *args, - struct xfs_dabuf *bp); -extern void xfs_dir2_leaf_compact_x1(struct xfs_dabuf *bp, int *indexp, - int *lowstalep, int *highstalep, - int *lowlogp, int *highlogp); -extern int xfs_dir2_leaf_getdents(struct xfs_inode *dp, void *dirent, - size_t bufsize, xfs_off_t *offset, - filldir_t filldir); -extern int xfs_dir2_leaf_init(struct xfs_da_args *args, xfs_dir2_db_t bno, - struct xfs_dabuf **bpp, int magic); -extern void xfs_dir2_leaf_log_ents(struct xfs_trans *tp, struct xfs_dabuf = *bp, - int first, int last); -extern void xfs_dir2_leaf_log_header(struct xfs_trans *tp, - struct xfs_dabuf *bp); -extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); -extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); -extern int xfs_dir2_leaf_replace(struct xfs_da_args *args); -extern int xfs_dir2_leaf_search_hash(struct xfs_da_args *args, - struct xfs_dabuf *lbp); -extern int xfs_dir2_leaf_trim_data(struct xfs_da_args *args, - struct xfs_dabuf *lbp, xfs_dir2_db_t db); -extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); - -#endif /* __XFS_DIR2_LEAF_H__ */ diff --git a/include/xfs_dir2_node.h b/include/xfs_dir2_node.h deleted file mode 100644 index 82dfe71..0000000 --- a/include/xfs_dir2_node.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2000,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_DIR2_NODE_H__ -#define __XFS_DIR2_NODE_H__ - -/* - * Directory version 2, btree node format structures - */ - -struct uio; -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_da_state; -struct xfs_da_state_blk; -struct xfs_inode; -struct xfs_trans; - -/* - * Offset of the freespace index. - */ -#define XFS_DIR2_FREE_SPACE 2 -#define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_FREE_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) - -#define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F */ - -typedef struct xfs_dir2_free_hdr { - __be32 magic; /* XFS_DIR2_FREE_MAGIC */ - __be32 firstdb; /* db of first entry */ - __be32 nvalid; /* count of valid entries */ - __be32 nused; /* count of used entries */ -} xfs_dir2_free_hdr_t; - -typedef struct xfs_dir2_free { - xfs_dir2_free_hdr_t hdr; /* block header */ - __be16 bests[1]; /* best free counts */ - /* unused entries are -1 */ -} xfs_dir2_free_t; - -#define XFS_DIR2_MAX_FREE_BESTS(mp) \ - (((mp)->m_dirblksize - (uint)sizeof(xfs_dir2_free_hdr_t)) / \ - (uint)sizeof(xfs_dir2_data_off_t)) - -/* - * Convert data space db to the corresponding free db. - */ -static inline xfs_dir2_db_t -xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return (XFS_DIR2_FREE_FIRSTDB(mp) + (db) / XFS_DIR2_MAX_FREE_BESTS(mp)); -} - -/* - * Convert data space db to the corresponding index in a free db. - */ -static inline int -xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return ((db) % XFS_DIR2_MAX_FREE_BESTS(mp)); -} - -extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, - struct xfs_dabuf *lbp); -extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_dabuf *bp, int *cou= nt); -extern int xfs_dir2_leafn_lookup_int(struct xfs_dabuf *bp, - struct xfs_da_args *args, int *indexp, - struct xfs_da_state *state); -extern int xfs_dir2_leafn_order(struct xfs_dabuf *leaf1_bp, - struct xfs_dabuf *leaf2_bp); -extern int xfs_dir2_leafn_split(struct xfs_da_state *state, - struct xfs_da_state_blk *oldblk, - struct xfs_da_state_blk *newblk); -extern int xfs_dir2_leafn_toosmall(struct xfs_da_state *state, int *action= ); -extern void xfs_dir2_leafn_unbalance(struct xfs_da_state *state, - struct xfs_da_state_blk *drop_blk, - struct xfs_da_state_blk *save_blk); -extern int xfs_dir2_node_addname(struct xfs_da_args *args); -extern int xfs_dir2_node_lookup(struct xfs_da_args *args); -extern int xfs_dir2_node_removename(struct xfs_da_args *args); -extern int xfs_dir2_node_replace(struct xfs_da_args *args); -extern int xfs_dir2_node_trim_free(struct xfs_da_args *args, xfs_fileoff_t= fo, - int *rvalp); - -#endif /* __XFS_DIR2_NODE_H__ */ diff --git a/include/xfs_dir2_sf.h b/include/xfs_dir2_sf.h deleted file mode 100644 index 6ac44b5..0000000 --- a/include/xfs_dir2_sf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (c) 2000-2001,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_DIR2_SF_H__ -#define __XFS_DIR2_SF_H__ - -/* - * Directory layout when stored internal to an inode. - * - * Small directories are packed as tightly as possible so as to - * fit into the literal area of the inode. - */ - -struct uio; -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_dir2_block; -struct xfs_inode; -struct xfs_mount; -struct xfs_trans; - -/* - * Inode number stored as 8 8-bit values. - */ -typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; - -/* - * Inode number stored as 4 8-bit values. - * Works a lot of the time, when all the inode numbers in a directory - * fit in 32 bits. - */ -typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t; - -typedef union { - xfs_dir2_ino8_t i8; - xfs_dir2_ino4_t i4; -} xfs_dir2_inou_t; -#define XFS_DIR2_MAX_SHORT_INUM ((xfs_ino_t)0xffffffffULL) - -/* - * Normalized offset (in a data block) of the entry, really xfs_dir2_data_= off_t. - * Only need 16 bits, this is the byte offset into the single block form. - */ -typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; - -/* - * The parent directory has a dedicated field, and the self-pointer must - * be calculated on the fly. - * - * Entries are packed toward the top as tightly as possible. The header - * and the elements must be memcpy'd out into a work area to get correct - * alignment for the inode number fields. - */ -typedef struct xfs_dir2_sf_hdr { - __uint8_t count; /* count of entries */ - __uint8_t i8count; /* count of 8-byte inode #s */ - xfs_dir2_inou_t parent; /* parent dir inode number */ -} __arch_pack xfs_dir2_sf_hdr_t; - -typedef struct xfs_dir2_sf_entry { - __uint8_t namelen; /* actual name length */ - xfs_dir2_sf_off_t offset; /* saved offset */ - __uint8_t name[1]; /* name, variable size */ - xfs_dir2_inou_t inumber; /* inode number, var. offset */ -} __arch_pack xfs_dir2_sf_entry_t;=20 - -typedef struct xfs_dir2_sf { - xfs_dir2_sf_hdr_t hdr; /* shortform header */ - xfs_dir2_sf_entry_t list[1]; /* shortform entries */ -} xfs_dir2_sf_t; - -static inline int xfs_dir2_sf_hdr_size(int i8count) -{ - return ((uint)sizeof(xfs_dir2_sf_hdr_t) - \ - ((i8count) =3D=3D 0) * \ - ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t))); -} - -static inline xfs_dir2_inou_t *xfs_dir2_sf_inumberp(xfs_dir2_sf_entry_t *s= fep) -{ - return (xfs_dir2_inou_t *)&(sfep)->name[(sfep)->namelen]; -} - -static inline xfs_intino_t -xfs_dir2_sf_get_inumber(xfs_dir2_sf_t *sfp, xfs_dir2_inou_t *from) -{ - return ((sfp)->hdr.i8count =3D=3D 0 ? \ - (xfs_intino_t)XFS_GET_DIR_INO4((from)->i4) : \ - (xfs_intino_t)XFS_GET_DIR_INO8((from)->i8)); -} - -static inline void xfs_dir2_sf_put_inumber(xfs_dir2_sf_t *sfp, xfs_ino_t *= =66rom, - xfs_dir2_inou_t *to) -{ - if ((sfp)->hdr.i8count =3D=3D 0) - XFS_PUT_DIR_INO4(*(from), (to)->i4); - else - XFS_PUT_DIR_INO8(*(from), (to)->i8); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) -{ - return INT_GET_UNALIGNED_16_BE(&(sfep)->offset.i); -} - -static inline void -xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) -{ - INT_SET_UNALIGNED_16_BE(&(sfep)->offset.i, off); -} - -static inline int xfs_dir2_sf_entsize_byname(xfs_dir2_sf_t *sfp, int len) -{ - return ((uint)sizeof(xfs_dir2_sf_entry_t) - 1 + (len) - \ - ((sfp)->hdr.i8count =3D=3D 0) * \ - ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t))); -} - -static inline int -xfs_dir2_sf_entsize_byentry(xfs_dir2_sf_t *sfp, xfs_dir2_sf_entry_t *sfep) -{ - return ((uint)sizeof(xfs_dir2_sf_entry_t) - 1 + (sfep)->namelen - \ - ((sfp)->hdr.i8count =3D=3D 0) * \ - ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t))); -} - -static inline xfs_dir2_sf_entry_t *xfs_dir2_sf_firstentry(xfs_dir2_sf_t *s= fp) -{ - return ((xfs_dir2_sf_entry_t *) \ - ((char *)(sfp) + xfs_dir2_sf_hdr_size(sfp->hdr.i8count))); -} - -static inline xfs_dir2_sf_entry_t * -xfs_dir2_sf_nextentry(xfs_dir2_sf_t *sfp, xfs_dir2_sf_entry_t *sfep) -{ - return ((xfs_dir2_sf_entry_t *) \ - ((char *)(sfep) + xfs_dir2_sf_entsize_byentry(sfp,sfep))); -} - -/* - * Functions. - */ -extern int xfs_dir2_block_sfsize(struct xfs_inode *dp, - struct xfs_dir2_block *block, - xfs_dir2_sf_hdr_t *sfhp); -extern int xfs_dir2_block_to_sf(struct xfs_da_args *args, struct xfs_dabuf= *bp, - int size, xfs_dir2_sf_hdr_t *sfhp); -extern int xfs_dir2_sf_addname(struct xfs_da_args *args); -extern int xfs_dir2_sf_create(struct xfs_da_args *args, xfs_ino_t pino); -extern int xfs_dir2_sf_getdents(struct xfs_inode *dp, void *dirent, - xfs_off_t *offset, filldir_t filldir); -extern int xfs_dir2_sf_lookup(struct xfs_da_args *args); -extern int xfs_dir2_sf_removename(struct xfs_da_args *args); -extern int xfs_dir2_sf_replace(struct xfs_da_args *args); - -#endif /* __XFS_DIR2_SF_H__ */ diff --git a/include/xfs_fs.h b/include/xfs_fs.h index faac5af..1cc1aa0 100644 --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -233,7 +233,8 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_LOGV2 0x0100 /* log format version 2 */ #define XFS_FSOP_GEOM_FLAGS_SECTOR 0x0200 /* sector sizes >1BB */ #define XFS_FSOP_GEOM_FLAGS_ATTR2 0x0400 /* inline attributes rework */ -#define XFS_FSOP_GEOM_FLAGS_DIRV2CI 0x1000 /* ASCII only CI names */ +#define XFS_FSOP_GEOM_FLAGS_PROJID32 0x0800 /* 32-bit project IDs */ +#define XFS_FSOP_GEOM_FLAGS_DIRV2CI 0x1000 /* ASCII only CI names */ #define XFS_FSOP_GEOM_FLAGS_LAZYSB 0x4000 /* lazy superblock counters */ =20 =20 @@ -249,6 +250,11 @@ typedef struct xfs_fsop_resblks { #define XFS_MAX_LOG_BYTES \ ((2 * 1024 * 1024 * 1024ULL) - XFS_MIN_LOG_BYTES) =20 +/* Used for sanity checks on superblock */ +#define XFS_MAX_DBLOCKS(s) ((xfs_drfsbno_t)(s)->sb_agcount * (s)->sb_agblo= cks) +#define XFS_MIN_DBLOCKS(s) ((xfs_drfsbno_t)((s)->sb_agcount - 1) * \ + (s)->sb_agblocks + XFS_MIN_AG_BLOCKS) + /* * Structures for XFS_IOC_FSGROWFSDATA, XFS_IOC_FSGROWFSLOG & XFS_IOC_FSGR= OWFSRT */ @@ -334,6 +340,35 @@ typedef struct xfs_error_injection { =20 =20 /* + * Speculative preallocation trimming. + */ +#define XFS_EOFBLOCKS_VERSION 1 +struct xfs_eofblocks { + __u32 eof_version; + __u32 eof_flags; + uid_t eof_uid; + gid_t eof_gid; + prid_t eof_prid; + __u32 pad32; + __u64 eof_min_file_size; + __u64 pad64[12]; +}; + +/* eof_flags values */ +#define XFS_EOF_FLAGS_SYNC (1 << 0) /* sync/wait mode scan */ +#define XFS_EOF_FLAGS_UID (1 << 1) /* filter by uid */ +#define XFS_EOF_FLAGS_GID (1 << 2) /* filter by gid */ +#define XFS_EOF_FLAGS_PRID (1 << 3) /* filter by project id */ +#define XFS_EOF_FLAGS_MINFILESIZE (1 << 4) /* filter by min file size */ +#define XFS_EOF_FLAGS_VALID \ + (XFS_EOF_FLAGS_SYNC | \ + XFS_EOF_FLAGS_UID | \ + XFS_EOF_FLAGS_GID | \ + XFS_EOF_FLAGS_PRID | \ + XFS_EOF_FLAGS_MINFILESIZE) + + +/* * The user-level Handle Request interface structure. */ typedef struct xfs_fsop_handlereq { @@ -451,6 +486,7 @@ typedef struct xfs_handle { /* XFS_IOC_GETBIOSIZE ---- deprecated 47 */ #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) +#define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) =20 /* * ioctl commands that replace IRIX syssgi()'s diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index bb53854..c8da3df 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -47,15 +47,6 @@ xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, i= nt o) } =20 /* - * Find a free (set) bit in the inode bitmask. - */ -static inline int xfs_ialloc_find_free(xfs_inofree_t *fp) -{ - return xfs_lowbit64(*fp); -} - - -/* * Allocate an inode on disk. * Mode is used to tell whether the new inode will need space, and whether * it is a directory. @@ -81,11 +72,9 @@ int /* error */ xfs_dialloc( struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t parent, /* parent inode (directory) */ - mode_t mode, /* mode bits for new inode */ + umode_t mode, /* mode bits for new inode */ int okalloc, /* ok to allocate more space */ struct xfs_buf **agbp, /* buf for a.g. inode header */ - boolean_t *alloc_done, /* an allocation was done to replenish - the free inodes */ xfs_ino_t *inop); /* inode number allocated */ =20 /* @@ -158,7 +147,9 @@ int xfs_inobt_lookup(struct xfs_btree_cur *cur, xfs_agi= no_t ino, /* * Get the data from the pointed-to record. */ -extern int xfs_inobt_get_rec(struct xfs_btree_cur *cur, +int xfs_inobt_get_rec(struct xfs_btree_cur *cur, xfs_inobt_rec_incore_t *rec, int *stat); =20 +extern const struct xfs_buf_ops xfs_agi_buf_ops; + #endif /* __XFS_IALLOC_H__ */ diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index f782ad0..25c0239 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -109,4 +109,6 @@ extern struct xfs_btree_cur *xfs_inobt_init_cursor(stru= ct xfs_mount *, struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t); extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); =20 +extern const struct xfs_buf_ops xfs_inobt_buf_ops; + #endif /* __XFS_IALLOC_BTREE_H__ */ diff --git a/include/xfs_inode.h b/include/xfs_inode.h index ca56544..437b3af 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -66,8 +66,6 @@ typedef struct xfs_ifork { struct xfs_btree_block *if_broot; /* file's incore btree root */ short if_broot_bytes; /* bytes allocated for root */ unsigned char if_flags; /* per-fork flags */ - unsigned char if_ext_max; /* max # of extent records */ - xfs_extnum_t if_lastex; /* last if_extents used */ union { xfs_bmbt_rec_host_t *if_extents;/* linear map file exts */ xfs_ext_irec_t *if_ext_irec; /* irec map file exts */ @@ -111,7 +109,7 @@ struct xfs_imap { * Generally, we do not want to hold the i_rlock while holding the * i_ilock. Hierarchy is i_iolock followed by i_rlock. * - * xfs_iptr_t contains all the inode fields upto and including the + * xfs_iptr_t contains all the inode fields up to and including the * i_mnext and i_mprev fields, it is used as a marker in the inode * chain off the mount structure by xfs_sync calls. */ @@ -207,29 +205,12 @@ typedef struct xfs_icdinode { ((w) =3D=3D XFS_DATA_FORK ? \ ((ip)->i_d.di_nextents =3D (n)) : \ ((ip)->i_d.di_anextents =3D (n))) +#define XFS_IFORK_MAXEXT(ip, w) \ + (XFS_IFORK_SIZE(ip, w) / sizeof(xfs_bmbt_rec_t)) =20 -/* - * Project quota id helpers (previously projid was 16bit only - * and using two 16bit values to hold new 32bit projid was choosen - * to retain compatibility with "old" filesystems). - */ -static inline __uint32_t -xfs_get_projid(struct xfs_icdinode i_d) -{ - return (__uint32_t)i_d.di_projid_hi << 16 | i_d.di_projid_lo; -} - -static inline void -xfs_set_projid(struct xfs_icdinode *i_d, - __uint32_t projid) -{ - i_d->di_projid_hi =3D (__uint16_t) (projid >> 16); - i_d->di_projid_lo =3D (__uint16_t) (projid & 0xffff); -} =20 #ifdef __KERNEL__ =20 -struct bhv_desc; struct xfs_buf; struct xfs_bmap_free; struct xfs_bmbt_irec; @@ -238,12 +219,6 @@ struct xfs_mount; struct xfs_trans; struct xfs_dquot; =20 -typedef struct dm_attrs_s { - __uint32_t da_dmevmask; /* DMIG event mask */ - __uint16_t da_dmstate; /* DMIG state info */ - __uint16_t da_pad; /* DMIG extra padding */ -} dm_attrs_t; - typedef struct xfs_inode { /* Inode linking and identification information. */ struct xfs_mount *i_mount; /* fs mount struct ptr */ @@ -259,32 +234,21 @@ typedef struct xfs_inode { xfs_ifork_t i_df; /* data fork */ =20 /* Transaction and locking information. */ - struct xfs_trans *i_transp; /* ptr to owning transaction*/ struct xfs_inode_log_item *i_itemp; /* logging information */ mrlock_t i_lock; /* inode lock */ mrlock_t i_iolock; /* inode IO lock */ - struct completion i_flush; /* inode flush completion q */ atomic_t i_pincount; /* inode pin count */ - wait_queue_head_t i_ipin_wait; /* inode pinning wait queue */ spinlock_t i_flags_lock; /* inode i_flags lock */ /* Miscellaneous state. */ - unsigned short i_flags; /* see defined flags below */ - unsigned char i_update_core; /* timestamps/size is dirty */ + unsigned long i_flags; /* see defined flags below */ unsigned int i_delayed_blks; /* count of delay alloc blks */ =20 xfs_icdinode_t i_d; /* most of ondisk inode */ =20 - xfs_fsize_t i_size; /* in-memory size */ - xfs_fsize_t i_new_size; /* size when write completes */ - atomic_t i_iocount; /* outstanding I/O count */ - /* VFS inode */ struct inode i_vnode; /* embedded VFS inode */ } xfs_inode_t; =20 -#define XFS_ISIZE(ip) (((ip)->i_d.di_mode & S_IFMT) =3D=3D S_IFREG) ? \ - (ip)->i_size : (ip)->i_d.di_size; - /* Convert from vfs inode to xfs inode */ static inline struct xfs_inode *XFS_I(struct inode *inode) { @@ -298,6 +262,32 @@ static inline struct inode *VFS_I(struct xfs_inode *ip) } =20 /* + * For regular files we only update the on-disk filesize when actually + * writing data back to disk. Until then only the copy in the VFS inode + * is uptodate. + */ +static inline xfs_fsize_t XFS_ISIZE(struct xfs_inode *ip) +{ + if (S_ISREG(ip->i_d.di_mode)) + return i_size_read(VFS_I(ip)); + return ip->i_d.di_size; +} + +/* + * If this I/O goes past the on-disk inode size update it unless it would + * be past the current in-core inode size. + */ +static inline xfs_fsize_t +xfs_new_eof(struct xfs_inode *ip, xfs_fsize_t new_size) +{ + xfs_fsize_t i_size =3D i_size_read(VFS_I(ip)); + + if (new_size > i_size) + new_size =3D i_size; + return new_size > ip->i_d.di_size ? new_size : 0; +} + +/* * i_flags helper functions */ static inline void @@ -351,9 +341,22 @@ xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned sh= ort flags) return ret; } =20 +static inline int +xfs_iflags_test_and_set(xfs_inode_t *ip, unsigned short flags) +{ + int ret; + + spin_lock(&ip->i_flags_lock); + ret =3D ip->i_flags & flags; + if (!ret) + ip->i_flags |=3D flags; + spin_unlock(&ip->i_flags_lock); + return ret; +} + /* * Project quota id helpers (previously projid was 16bit only - * and using two 16bit values to hold new 32bit projid was choosen + * and using two 16bit values to hold new 32bit projid was chosen * to retain compatibility with "old" filesystems). */ static inline prid_t @@ -371,35 +374,58 @@ xfs_set_projid(struct xfs_inode *ip, } =20 /* - * Manage the i_flush queue embedded in the inode. This completion - * queue synchronizes processes attempting to flush the in-core - * inode back to disk. + * In-core inode flags. + */ +#define XFS_IRECLAIM (1 << 0) /* started reclaiming this inode */ +#define XFS_ISTALE (1 << 1) /* inode has been staled */ +#define XFS_IRECLAIMABLE (1 << 2) /* inode can be reclaimed */ +#define XFS_INEW (1 << 3) /* inode has just been allocated */ +#define XFS_IFILESTREAM (1 << 4) /* inode is in a filestream dir. */ +#define XFS_ITRUNCATED (1 << 5) /* truncated down so flush-on-close */ +#define XFS_IDIRTY_RELEASE (1 << 6) /* dirty release already seen */ +#define __XFS_IFLOCK_BIT 7 /* inode is being flushed right now */ +#define XFS_IFLOCK (1 << __XFS_IFLOCK_BIT) +#define __XFS_IPINNED_BIT 8 /* wakeup key for zero pin count */ +#define XFS_IPINNED (1 << __XFS_IPINNED_BIT) +#define XFS_IDONTCACHE (1 << 9) /* don't cache the inode long term */ + +/* + * Per-lifetime flags need to be reset when re-using a reclaimable inode d= uring + * inode lookup. This prevents unintended behaviour on the new inode from + * ocurring. */ -static inline void xfs_iflock(xfs_inode_t *ip) +#define XFS_IRECLAIM_RESET_FLAGS \ + (XFS_IRECLAIMABLE | XFS_IRECLAIM | \ + XFS_IDIRTY_RELEASE | XFS_ITRUNCATED | \ + XFS_IFILESTREAM); + +/* + * Synchronize processes attempting to flush the in-core inode back to dis= k. + */ + +extern void __xfs_iflock(struct xfs_inode *ip); + +static inline int xfs_iflock_nowait(struct xfs_inode *ip) { - wait_for_completion(&ip->i_flush); + return !xfs_iflags_test_and_set(ip, XFS_IFLOCK); } =20 -static inline int xfs_iflock_nowait(xfs_inode_t *ip) +static inline void xfs_iflock(struct xfs_inode *ip) { - return try_wait_for_completion(&ip->i_flush); + if (!xfs_iflock_nowait(ip)) + __xfs_iflock(ip); } =20 -static inline void xfs_ifunlock(xfs_inode_t *ip) +static inline void xfs_ifunlock(struct xfs_inode *ip) { - complete(&ip->i_flush); + xfs_iflags_clear(ip, XFS_IFLOCK); + wake_up_bit(&ip->i_flags, __XFS_IFLOCK_BIT); } =20 -/* - * In-core inode flags. - */ -#define XFS_IRECLAIM 0x0001 /* started reclaiming this inode */ -#define XFS_ISTALE 0x0002 /* inode has been staled */ -#define XFS_IRECLAIMABLE 0x0004 /* inode can be reclaimed */ -#define XFS_INEW 0x0008 /* inode has just been allocated */ -#define XFS_IFILESTREAM 0x0010 /* inode is in a filestream directory */ -#define XFS_ITRUNCATED 0x0020 /* truncated down so flush-on-close */ -#define XFS_IDIRTY_RELEASE 0x0040 /* dirty release already seen */ +static inline int xfs_isiflocked(struct xfs_inode *ip) +{ + return xfs_iflags_test(ip, XFS_IFLOCK); +} =20 /* * Flags for inode locking. @@ -410,7 +436,6 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) #define XFS_IOLOCK_SHARED (1<<1) #define XFS_ILOCK_EXCL (1<<2) #define XFS_ILOCK_SHARED (1<<3) -#define XFS_IUNLOCK_NONOTIFY (1<<4) =20 #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED) @@ -419,35 +444,41 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \ { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \ { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \ - { XFS_ILOCK_SHARED, "ILOCK_SHARED" }, \ - { XFS_IUNLOCK_NONOTIFY, "IUNLOCK_NONOTIFY" } + { XFS_ILOCK_SHARED, "ILOCK_SHARED" } =20 =20 /* * Flags for lockdep annotations. * - * XFS_I[O]LOCK_PARENT - for operations that require locking two inodes - * (ie directory operations that require locking a directory inode and - * an entry inode). The first inode gets locked with this flag so it - * gets a lockdep subclass of 1 and the second lock will have a lockdep - * subclass of 0. + * XFS_LOCK_PARENT - for directory operations that require locking a + * parent directory inode and a child entry inode. The parent gets locked + * with this flag so it gets a lockdep subclass of 1 and the child entry + * lock will have a lockdep subclass of 0. + * + * XFS_LOCK_RTBITMAP/XFS_LOCK_RTSUM - the realtime device bitmap and summa= ry + * inodes do not participate in the normal lock order, and thus have their + * own subclasses. * * XFS_LOCK_INUMORDER - for locking several inodes at the some time * with xfs_lock_inodes(). This flag is used as the starting subclass * and each subsequent lock acquired will increment the subclass by one. - * So the first lock acquired will have a lockdep subclass of 2, the - * second lock will have a lockdep subclass of 3, and so on. It is + * So the first lock acquired will have a lockdep subclass of 4, the + * second lock will have a lockdep subclass of 5, and so on. It is * the responsibility of the class builder to shift this to the correct * portion of the lock_mode lockdep mask. */ #define XFS_LOCK_PARENT 1 -#define XFS_LOCK_INUMORDER 2 +#define XFS_LOCK_RTBITMAP 2 +#define XFS_LOCK_RTSUM 3 +#define XFS_LOCK_INUMORDER 4 =20 #define XFS_IOLOCK_SHIFT 16 #define XFS_IOLOCK_PARENT (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT) =20 #define XFS_ILOCK_SHIFT 24 #define XFS_ILOCK_PARENT (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT) +#define XFS_ILOCK_RTBITMAP (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT) +#define XFS_ILOCK_RTSUM (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT) =20 #define XFS_IOLOCK_DEP_MASK 0x00ff0000 #define XFS_ILOCK_DEP_MASK 0xff000000 @@ -456,18 +487,6 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) #define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) >> XFS_IOLO= CK_SHIFT) #define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_= SHIFT) =20 -extern struct lock_class_key xfs_iolock_reclaimable; - -/* - * Flags for xfs_itruncate_start(). - */ -#define XFS_ITRUNC_DEFINITE 0x1 -#define XFS_ITRUNC_MAYBE 0x2 - -#define XFS_ITRUNC_FLAGS \ - { XFS_ITRUNC_DEFINITE, "DEFINITE" }, \ - { XFS_ITRUNC_MAYBE, "MAYBE" } - /* * For multiple groups support: if S_ISGID bit is set in the parent * directory, group of new file is set to that of the parent, and @@ -477,11 +496,10 @@ extern struct lock_class_key xfs_iolock_reclaimable; (((pip)->i_mount->m_flags & XFS_MOUNT_GRPID) || \ ((pip)->i_d.di_mode & S_ISGID)) =20 + /* - * xfs_iget.c prototypes. + * xfs_inode.c prototypes. */ -int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, - uint, uint, xfs_inode_t **); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); void xfs_iunlock(xfs_inode_t *, uint); @@ -489,33 +507,25 @@ void xfs_ilock_demote(xfs_inode_t *, uint); int xfs_isilocked(xfs_inode_t *, uint); uint xfs_ilock_map_shared(xfs_inode_t *); void xfs_iunlock_map_shared(xfs_inode_t *, uint); -void xfs_inode_free(struct xfs_inode *ip); - -/* - * xfs_inode.c prototypes. - */ -int xfs_ialloc(struct xfs_trans *, xfs_inode_t *, mode_t, +int xfs_ialloc(struct xfs_trans *, xfs_inode_t *, umode_t, xfs_nlink_t, xfs_dev_t, prid_t, int, - struct xfs_buf **, boolean_t *, xfs_inode_t **); + struct xfs_buf **, xfs_inode_t **); =20 uint xfs_ip2xflags(struct xfs_inode *); uint xfs_dic2xflags(struct xfs_dinode *); int xfs_ifree(struct xfs_trans *, xfs_inode_t *, struct xfs_bmap_free *); -int xfs_itruncate_start(xfs_inode_t *, uint, xfs_fsize_t); -int xfs_itruncate_finish(struct xfs_trans **, xfs_inode_t *, - xfs_fsize_t, int, int); +int xfs_itruncate_extents(struct xfs_trans **, struct xfs_inode *, + int, xfs_fsize_t); int xfs_iunlink(struct xfs_trans *, xfs_inode_t *); =20 void xfs_iext_realloc(xfs_inode_t *, int, int); void xfs_iunpin_wait(xfs_inode_t *); -int xfs_iflush(xfs_inode_t *, uint); +int xfs_iflush(struct xfs_inode *, struct xfs_buf **); void xfs_lock_inodes(xfs_inode_t **, int, uint); void xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint); =20 -void xfs_synchronize_times(xfs_inode_t *); -void xfs_mark_inode_dirty(xfs_inode_t *); -void xfs_mark_inode_dirty_sync(xfs_inode_t *); +xfs_extlen_t xfs_get_extsz_hint(struct xfs_inode *ip); =20 #define IHOLD(ip) \ do { \ @@ -537,19 +547,15 @@ do { \ */ #define XFS_IGET_CREATE 0x1 #define XFS_IGET_UNTRUSTED 0x2 +#define XFS_IGET_DONTCACHE 0x4 =20 -int xfs_inotobp(struct xfs_mount *, struct xfs_trans *, - xfs_ino_t, struct xfs_dinode **, - struct xfs_buf **, int *, uint); -int xfs_itobp(struct xfs_mount *, struct xfs_trans *, - struct xfs_inode *, struct xfs_dinode **, - struct xfs_buf **, uint); +int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *, + struct xfs_imap *, struct xfs_dinode **, + struct xfs_buf **, uint, uint); int xfs_iread(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, uint); void xfs_dinode_to_disk(struct xfs_dinode *, struct xfs_icdinode *); -void xfs_dinode_from_disk(struct xfs_icdinode *, - struct xfs_dinode *); void xfs_idestroy_fork(struct xfs_inode *, int); void xfs_idata_realloc(struct xfs_inode *, int, int); void xfs_iroot_realloc(struct xfs_inode *, int, int); @@ -579,16 +585,10 @@ void xfs_iext_irec_compact(xfs_ifork_t *); void xfs_iext_irec_compact_pages(xfs_ifork_t *); void xfs_iext_irec_compact_full(xfs_ifork_t *); void xfs_iext_irec_update_extoffs(xfs_ifork_t *, int, int); +bool xfs_can_free_eofblocks(struct xfs_inode *, bool); =20 #define xfs_ipincount(ip) ((unsigned int) atomic_read(&ip->i_pincount)) =20 -#ifdef DEBUG -void xfs_isize_check(struct xfs_mount *, struct xfs_inode *, - xfs_fsize_t); -#else /* DEBUG */ -#define xfs_isize_check(mp, ip, isize) -#endif /* DEBUG */ - #if defined(DEBUG) void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); #else @@ -598,5 +598,6 @@ void xfs_inobp_check(struct xfs_mount *, struct xfs_bu= f *); extern struct kmem_zone *xfs_ifork_zone; extern struct kmem_zone *xfs_inode_zone; extern struct kmem_zone *xfs_ili_zone; +extern const struct xfs_buf_ops xfs_inode_buf_ops; =20 #endif /* __XFS_INODE_H__ */ diff --git a/include/xfs_inode_item.h b/include/xfs_inode_item.h index d3dee61..779812f 100644 --- a/include/xfs_inode_item.h +++ b/include/xfs_inode_item.h @@ -86,6 +86,15 @@ typedef struct xfs_inode_log_format_64 { #define XFS_ILOG_AEXT 0x080 /* log i_af.if_extents */ #define XFS_ILOG_ABROOT 0x100 /* log i_af.i_broot */ =20 + +/* + * The timestamps are dirty, but not necessarily anything else in the inode + * core. Unlike the other fields above this one must never make it to disk + * in the ilf_fields of the inode_log_format, but is purely store in-memor= y in + * ili_fields in the inode_log_item. + */ +#define XFS_ILOG_TIMESTAMP 0x4000 + #define XFS_ILOG_NONCORE (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ XFS_ILOG_DBROOT | XFS_ILOG_DEV | \ XFS_ILOG_UUID | XFS_ILOG_ADATA | \ @@ -101,7 +110,7 @@ typedef struct xfs_inode_log_format_64 { XFS_ILOG_DEXT | XFS_ILOG_DBROOT | \ XFS_ILOG_DEV | XFS_ILOG_UUID | \ XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ - XFS_ILOG_ABROOT) + XFS_ILOG_ABROOT | XFS_ILOG_TIMESTAMP) =20 static inline int xfs_ilog_fbroot(int w) { @@ -134,30 +143,25 @@ typedef struct xfs_inode_log_item { unsigned short ili_lock_flags; /* lock flags */ unsigned short ili_logged; /* flushed logged data */ unsigned int ili_last_fields; /* fields when flushed */ + unsigned int ili_fields; /* fields to be logged */ struct xfs_bmbt_rec *ili_extents_buf; /* array of logged data exts */ struct xfs_bmbt_rec *ili_aextents_buf; /* array of logged attr exts */ -#ifdef XFS_TRANS_DEBUG - int ili_root_size; - char *ili_orig_root; -#endif xfs_inode_log_format_t ili_format; /* logged structure */ } xfs_inode_log_item_t; =20 =20 static inline int xfs_inode_clean(xfs_inode_t *ip) { - return (!ip->i_itemp || - !(ip->i_itemp->ili_format.ilf_fields & XFS_ILOG_ALL)) && - !ip->i_update_core; + return !ip->i_itemp || !(ip->i_itemp->ili_fields & XFS_ILOG_ALL); } =20 extern void xfs_inode_item_init(struct xfs_inode *, struct xfs_mount *); extern void xfs_inode_item_destroy(struct xfs_inode *); extern void xfs_iflush_done(struct xfs_buf *, struct xfs_log_item *); extern void xfs_istale_done(struct xfs_buf *, struct xfs_log_item *); -extern void xfs_iflush_abort(struct xfs_inode *); +extern void xfs_iflush_abort(struct xfs_inode *, bool); extern int xfs_inode_item_format_convert(xfs_log_iovec_t *, xfs_inode_log_format_t *); =20 diff --git a/include/xfs_inum.h b/include/xfs_inum.h index b8e4ee4..90efdaf 100644 --- a/include/xfs_inum.h +++ b/include/xfs_inum.h @@ -26,22 +26,6 @@ * high agno_log-agblklog-inopblog bits - 0 */ =20 -typedef __uint32_t xfs_agino_t; /* within allocation grp inode number */ - -/* - * Useful inode bits for this kernel. - * Used in some places where having 64-bits in the 32-bit kernels - * costs too much. - */ -#if XFS_BIG_INUMS -typedef xfs_ino_t xfs_intino_t; -#else -typedef __uint32_t xfs_intino_t; -#endif - -#define NULLFSINO ((xfs_ino_t)-1) -#define NULLAGINO ((xfs_agino_t)-1) - struct xfs_mount; =20 #define XFS_INO_MASK(k) (__uint32_t)((1ULL << (k)) - 1) diff --git a/include/xfs_log.h b/include/xfs_log.h index 916eb7d..5caee96 100644 --- a/include/xfs_log.h +++ b/include/xfs_log.h @@ -53,15 +53,6 @@ static inline xfs_lsn_t _lsn_cmp(xfs_lsn_t lsn1, xfs_lsn= _t lsn2) #define XFS_LOG_REL_PERM_RESERV 0x1 =20 /* - * Flags to xfs_log_reserve() - * - * XFS_LOG_PERM_RESERV: Permanent reservation. When writes are - * performed against this type of reservation, the reservation - * is not decreased. Long running transactions should use this. - */ -#define XFS_LOG_PERM_RESERV 0x2 - -/* * Flags to xfs_log_force() * * XFS_LOG_SYNC: Synchronous force in-core log to disk @@ -137,7 +128,7 @@ struct xfs_trans; void xfs_log_item_init(struct xfs_mount *mp, struct xfs_log_item *item, int type, - struct xfs_item_ops *ops); + const struct xfs_item_ops *ops); =20 xfs_lsn_t xfs_log_done(struct xfs_mount *mp, struct xlog_ticket *ticket, @@ -160,8 +151,9 @@ int xfs_log_mount(struct xfs_mount *mp, xfs_daddr_t start_block, int num_bblocks); int xfs_log_mount_finish(struct xfs_mount *mp); -void xfs_log_move_tail(struct xfs_mount *mp, - xfs_lsn_t tail_lsn); +xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); +xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp); +void xfs_log_space_wake(struct xfs_mount *mp); int xfs_log_notify(struct xfs_mount *mp, struct xlog_in_core *iclog, xfs_log_callback_t *callback_entry); @@ -172,13 +164,9 @@ int xfs_log_reserve(struct xfs_mount *mp, int count, struct xlog_ticket **ticket, __uint8_t clientid, - uint flags, + bool permanent, uint t_type); -int xfs_log_write(struct xfs_mount *mp, - xfs_log_iovec_t region[], - int nentries, - struct xlog_ticket *ticket, - xfs_lsn_t *start_lsn); +int xfs_log_regrant(struct xfs_mount *mp, struct xlog_ticket *tic); int xfs_log_unmount_write(struct xfs_mount *mp); void xfs_log_unmount(struct xfs_mount *mp); int xfs_log_force_umount(struct xfs_mount *mp, int logerror); @@ -189,12 +177,13 @@ void xlog_iodone(struct xfs_buf *); struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket); void xfs_log_ticket_put(struct xlog_ticket *ticket); =20 -xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); - int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, - struct xfs_log_vec *log_vector, xfs_lsn_t *commit_lsn, int flags); bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); =20 +void xfs_log_work_queue(struct xfs_mount *mp); +void xfs_log_worker(struct work_struct *work); +void xfs_log_quiesce(struct xfs_mount *mp); + #endif #endif /* __XFS_LOG_H__ */ diff --git a/include/xfs_log_priv.h b/include/xfs_log_priv.h index d5f8be8..16d8d12 100644 --- a/include/xfs_log_priv.h +++ b/include/xfs_log_priv.h @@ -19,7 +19,7 @@ #define __XFS_LOG_PRIV_H__ =20 struct xfs_buf; -struct log; +struct xlog; struct xlog_ticket; struct xfs_mount; =20 @@ -87,10 +87,6 @@ static inline uint xlog_get_client_id(__be32 i) return be32_to_cpu(i) >> 24; } =20 -#define xlog_panic(args...) cmn_err(CE_PANIC, ## args) -#define xlog_exit(args...) cmn_err(CE_PANIC, ## args) -#define xlog_warn(args...) cmn_err(CE_WARN, ## args) - /* * In core log state */ @@ -143,11 +139,13 @@ static inline uint xlog_get_client_id(__be32 i) /* * Flags for log structure */ -#define XLOG_CHKSUM_MISMATCH 0x1 /* used only during recovery */ #define XLOG_ACTIVE_RECOVERY 0x2 /* in the middle of recovery */ #define XLOG_RECOVERY_NEEDED 0x4 /* log was recovered */ #define XLOG_IO_ERROR 0x8 /* log hit an I/O error, and being shutdown */ +#define XLOG_TAIL_WARN 0x10 /* log tail verify warning issued */ + +typedef __uint32_t xlog_tid_t; =20 #ifdef __KERNEL__ /* @@ -240,8 +238,8 @@ typedef struct xlog_res { } xlog_res_t; =20 typedef struct xlog_ticket { - wait_queue_head_t t_wait; /* ticket wait queue */ struct list_head t_queue; /* reserve/write queue */ + struct task_struct *t_task; /* task that owns this ticket */ xlog_tid_t t_tid; /* transaction identifier : 4 */ atomic_t t_ref; /* ticket reference count : 4 */ int t_curr_res; /* current reservation in bytes : 4 */ @@ -292,7 +290,7 @@ typedef struct xlog_rec_header { __be32 h_len; /* len in bytes; should be 64-bit aligned: 4 */ __be64 h_lsn; /* lsn of this LR : 8 */ __be64 h_tail_lsn; /* lsn of 1st LR w/ buffers not committed: 8 */ - __be32 h_chksum; /* may not be used; non-zero if used : 4 */ + __le32 h_crc; /* crc of log record : 4 */ __be32 h_prev_block; /* block number to previous LR : 4 */ __be32 h_num_logops; /* number of log operations in this LR : 4 */ __be32 h_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE]; @@ -353,7 +351,7 @@ typedef struct xlog_in_core { struct xlog_in_core *ic_next; struct xlog_in_core *ic_prev; struct xfs_buf *ic_bp; - struct log *ic_log; + struct xlog *ic_log; int ic_size; int ic_offset; int ic_bwritecnt; @@ -410,7 +408,7 @@ struct xfs_cil_ctx { * operations almost as efficient as the old logging methods. */ struct xfs_cil { - struct log *xc_log; + struct xlog *xc_log; struct list_head xc_cil; spinlock_t xc_cil_lock; struct xfs_cil_ctx *xc_ctx; @@ -418,6 +416,8 @@ struct xfs_cil { struct list_head xc_committing; wait_queue_head_t xc_commit_wait; xfs_lsn_t xc_current_sequence; + struct work_struct xc_push_work; + xfs_lsn_t xc_push_seq; }; =20 /* @@ -471,12 +471,22 @@ struct xfs_cil { #define XLOG_CIL_HARD_SPACE_LIMIT(log) (3 * (log->l_logsize >> 4)) =20 /* + * ticket grant locks, queues and accounting have their own cachlines + * as these are quite hot and can be operated on concurrently. + */ +struct xlog_grant_head { + spinlock_t lock ____cacheline_aligned_in_smp; + struct list_head waiters; + atomic64_t grant; +}; + +/* * The reservation head lsn is not made up of a cycle number and block num= ber. * Instead, it uses a cycle number and byte number. Logs don't expect to * overflow 31 bits worth of byte offset, so using a byte number will mean * that round off problems won't occur when releasing partial reservations. */ -typedef struct log { +struct xlog { /* The following fields don't need locking */ struct xfs_mount *l_mp; /* mount point */ struct xfs_ail *l_ailp; /* AIL log is working with */ @@ -484,6 +494,7 @@ typedef struct log { struct xfs_buf *l_xbuf; /* extra buffer for log * wrapping */ struct xfs_buftarg *l_targ; /* buftarg of log */ + struct delayed_work l_work; /* background flush work */ uint l_flags; uint l_quotaoffs_flag; /* XFS_DQ_*, for QUOTAOFFs */ struct list_head *l_buf_cancel_table; @@ -521,24 +532,15 @@ typedef struct log { /* lsn of 1st LR with unflushed * buffers */ atomic64_t l_tail_lsn ____cacheline_aligned_in_smp; =20 - /* - * ticket grant locks, queues and accounting have their own cachlines - * as these are quite hot and can be operated on concurrently. - */ - spinlock_t l_grant_reserve_lock ____cacheline_aligned_in_smp; - struct list_head l_reserveq; - atomic64_t l_grant_reserve_head; - - spinlock_t l_grant_write_lock ____cacheline_aligned_in_smp; - struct list_head l_writeq; - atomic64_t l_grant_write_head; + struct xlog_grant_head l_reserve_head; + struct xlog_grant_head l_write_head; =20 /* The following field are used for debugging; need to hold icloglock */ #ifdef DEBUG char *l_iclog_bak[XLOG_MAX_ICLOGS]; #endif =20 -} xlog_t; +}; =20 #define XLOG_BUF_CANCEL_BUCKET(log, blkno) \ ((log)->l_buf_cancel_table + ((__uint64_t)blkno % XLOG_BC_TABLE_SIZE)) @@ -546,15 +548,25 @@ typedef struct log { #define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) =20 /* common routines */ -extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); -extern int xlog_recover(xlog_t *log); -extern int xlog_recover_finish(xlog_t *log); -extern void xlog_pack_data(xlog_t *log, xlog_in_core_t *iclog, int); +extern int +xlog_recover( + struct xlog *log); +extern int +xlog_recover_finish( + struct xlog *log); + +extern __le32 xlog_cksum(struct xlog *log, struct xlog_rec_header *rhead, + char *dp, int size); =20 extern kmem_zone_t *xfs_log_ticket_zone; -struct xlog_ticket *xlog_ticket_alloc(struct log *log, int unit_bytes, - int count, char client, uint xflags, - int alloc_flags); +struct xlog_ticket * +xlog_ticket_alloc( + struct xlog *log, + int unit_bytes, + int count, + char client, + bool permanent, + xfs_km_flags_t alloc_flags); =20 =20 static inline void @@ -566,15 +578,20 @@ xlog_write_adv_cnt(void **ptr, int *len, int *off, si= ze_t bytes) } =20 void xlog_print_tic_res(struct xfs_mount *mp, struct xlog_ticket *ticket); -int xlog_write(struct log *log, struct xfs_log_vec *log_vector, - struct xlog_ticket *tic, xfs_lsn_t *start_lsn, - xlog_in_core_t **commit_iclog, uint flags); +int +xlog_write( + struct xlog *log, + struct xfs_log_vec *log_vector, + struct xlog_ticket *tic, + xfs_lsn_t *start_lsn, + struct xlog_in_core **commit_iclog, + uint flags); =20 /* * When we crack an atomic LSN, we sample it first so that the value will = not * change while we are cracking it into the component values. This means we * will always get consistent component values to work from. This should a= lways - * be used to smaple and crack LSNs taht are stored and updated in atomic + * be used to sample and crack LSNs that are stored and updated in atomic * variables. */ static inline void @@ -628,17 +645,23 @@ xlog_assign_grant_head(atomic64_t *head, int cycle, i= nt space) /* * Committed Item List interfaces */ -int xlog_cil_init(struct log *log); -void xlog_cil_init_post_recovery(struct log *log); -void xlog_cil_destroy(struct log *log); +int +xlog_cil_init(struct xlog *log); +void +xlog_cil_init_post_recovery(struct xlog *log); +void +xlog_cil_destroy(struct xlog *log); =20 /* * CIL force routines */ -xfs_lsn_t xlog_cil_force_lsn(struct log *log, xfs_lsn_t sequence); +xfs_lsn_t +xlog_cil_force_lsn( + struct xlog *log, + xfs_lsn_t sequence); =20 static inline void -xlog_cil_force(struct log *log) +xlog_cil_force(struct xlog *log) { xlog_cil_force_lsn(log, log->l_cilp->xc_current_sequence); } diff --git a/include/xfs_mount.h b/include/xfs_mount.h index 9be9a05..c267379 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -52,15 +52,8 @@ typedef struct xfs_trans_reservations { =20 #else /* __KERNEL__ */ =20 -#include "xfs_sync.h" - -struct log; -struct xfs_mount_args; +struct xlog; struct xfs_inode; -struct xfs_bmbt_irec; -struct xfs_bmap_free; -struct xfs_extdelta; -struct xfs_swapext; struct xfs_mru_cache; struct xfs_nameops; struct xfs_ail; @@ -134,7 +127,7 @@ typedef struct xfs_mount { uint m_readio_blocks; /* min read size blocks */ uint m_writeio_log; /* min write size log bytes */ uint m_writeio_blocks; /* min write size blocks */ - struct log *m_log; /* log specific stuff */ + struct xlog *m_log; /* log specific stuff */ int m_logbufs; /* number of log buffers */ int m_logbsize; /* size of each log buffer */ uint m_rsumlevels; /* rt summary levels */ @@ -177,7 +170,6 @@ typedef struct xfs_mount { uint m_qflags; /* quota status flags */ xfs_trans_reservations_t m_reservations;/* precomputed res values */ __uint64_t m_maxicount; /* maximum inode count */ - __uint64_t m_maxioffset; /* maximum inode offset */ __uint64_t m_resblks; /* total reserved blocks */ __uint64_t m_resblks_avail;/* available reserved blocks */ __uint64_t m_resblks_save; /* reserved blks @ remount,ro */ @@ -204,17 +196,21 @@ typedef struct xfs_mount { struct mutex m_icsb_mutex; /* balancer sync lock */ #endif struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ - struct task_struct *m_sync_task; /* generalised sync thread */ - xfs_sync_work_t m_sync_work; /* work item for VFS_SYNC */ - struct list_head m_sync_list; /* sync thread work item list */ - spinlock_t m_sync_lock; /* work item list lock */ - int m_sync_seq; /* sync thread generation no. */ - wait_queue_head_t m_wait_single_sync_task; + struct delayed_work m_reclaim_work; /* background inode reclaim */ + struct delayed_work m_eofblocks_work; /* background eof blocks + trimming */ __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ struct shrinker m_inode_shrink; /* inode reclaim shrinker */ int64_t m_low_space[XFS_LOWSP_MAX]; /* low free space thresholds */ + + struct workqueue_struct *m_data_workqueue; + struct workqueue_struct *m_unwritten_workqueue; + struct workqueue_struct *m_cil_workqueue; + struct workqueue_struct *m_reclaim_workqueue; + struct workqueue_struct *m_log_workqueue; + struct workqueue_struct *m_eofblocks_workqueue; } xfs_mount_t; =20 /* @@ -223,11 +219,11 @@ typedef struct xfs_mount { #define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops must be synchronous except for space allocations */ -#define XFS_MOUNT_DELAYLOG (1ULL << 1) /* delayed logging is enabled */ #define XFS_MOUNT_WAS_CLEAN (1ULL << 3) #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem operations, typically for disk errors in metadata */ +#define XFS_MOUNT_DISCARD (1ULL << 5) /* discard unused blocks */ #define XFS_MOUNT_RETERR (1ULL << 6) /* return alignment errors to user */ #define XFS_MOUNT_NOALIGN (1ULL << 7) /* turn off stripe alignment @@ -297,8 +293,6 @@ xfs_preferred_iosize(xfs_mount_t *mp) PAGE_CACHE_SIZE)); } =20 -#define XFS_MAXIOFFSET(mp) ((mp)->m_maxioffset) - #define XFS_LAST_UNMOUNT_WAS_CLEAN(mp) \ ((mp)->m_flags & XFS_MOUNT_WAS_CLEAN) #define XFS_FORCED_SHUTDOWN(mp) ((mp)->m_flags & XFS_MOUNT_FS_SHUTDOWN) @@ -314,9 +308,6 @@ void xfs_do_force_shutdown(struct xfs_mount *mp, int fl= ags, char *fname, #define SHUTDOWN_REMOTE_REQ 0x0010 /* shutdown came from remote cell */ #define SHUTDOWN_DEVICE_REQ 0x0020 /* failed all paths to the device */ =20 -#define xfs_test_for_freeze(mp) ((mp)->m_super->s_frozen) -#define xfs_wait_for_freeze(mp,l) vfs_check_frozen((mp)->m_super, (l)) - /* * Flags for xfs_mountfs */ @@ -366,12 +357,11 @@ typedef struct xfs_mod_sb { int64_t msb_delta; /* Change to make to specified field */ } xfs_mod_sb_t; =20 -extern int xfs_log_sbcount(xfs_mount_t *, uint); +extern int xfs_log_sbcount(xfs_mount_t *); extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); extern int xfs_mountfs(xfs_mount_t *mp); =20 extern void xfs_unmountfs(xfs_mount_t *); -extern int xfs_unmountfs_writesb(xfs_mount_t *); extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, uint, int); @@ -402,4 +392,6 @@ extern int xfs_initialize_perag(struct xfs_mount *, xfs= _agnumber_t, extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); =20 +extern const struct xfs_buf_ops xfs_sb_buf_ops; + #endif /* __XFS_MOUNT_H__ */ diff --git a/include/xfs_quota.h b/include/xfs_quota.h index 5d1f57d..b50ec5b 100644 --- a/include/xfs_quota.h +++ b/include/xfs_quota.h @@ -87,8 +87,7 @@ typedef struct xfs_dqblk { #define XFS_DQ_PROJ 0x0002 /* project quota */ #define XFS_DQ_GROUP 0x0004 /* a group quota */ #define XFS_DQ_DIRTY 0x0008 /* dquot is dirty */ -#define XFS_DQ_WANT 0x0010 /* for lookup/reclaim race */ -#define XFS_DQ_INACTIVE 0x0020 /* dq off mplist & hashlist */ +#define XFS_DQ_FREEING 0x0010 /* dquot is beeing torn down */ =20 #define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP) =20 @@ -97,8 +96,7 @@ typedef struct xfs_dqblk { { XFS_DQ_PROJ, "PROJ" }, \ { XFS_DQ_GROUP, "GROUP" }, \ { XFS_DQ_DIRTY, "DIRTY" }, \ - { XFS_DQ_WANT, "WANT" }, \ - { XFS_DQ_INACTIVE, "INACTIVE" } + { XFS_DQ_FREEING, "FREEING" } =20 /* * In the worst case, when both user and group quotas are on, @@ -176,6 +174,8 @@ typedef struct xfs_qoff_logformat { #define XFS_UQUOTA_ACTIVE 0x0100 /* uquotas are being turned off */ #define XFS_PQUOTA_ACTIVE 0x0200 /* pquotas are being turned off */ #define XFS_GQUOTA_ACTIVE 0x0400 /* gquotas are being turned off */ +#define XFS_ALL_QUOTA_ACTIVE \ + (XFS_UQUOTA_ACTIVE | XFS_PQUOTA_ACTIVE | XFS_GQUOTA_ACTIVE) =20 /* * Checking XFS_IS_*QUOTA_ON() while holding any inode lock guarantees @@ -199,7 +199,6 @@ typedef struct xfs_qoff_logformat { #define XFS_QMOPT_UQUOTA 0x0000004 /* user dquot requested */ #define XFS_QMOPT_PQUOTA 0x0000008 /* project dquot requested */ #define XFS_QMOPT_FORCE_RES 0x0000010 /* ignore quota limits */ -#define XFS_QMOPT_DQSUSER 0x0000020 /* don't cache super users dquot */ #define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */ #define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if neede= d */ #define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot if damaged */ @@ -299,11 +298,6 @@ typedef struct xfs_dqtrx { long qt_delrtb_delta; /* delayed RT blk count changes */ } xfs_dqtrx_t; =20 -extern int xfs_qm_dqcheck(xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char= *); -extern int xfs_mount_reset_sbqflags(struct xfs_mount *); - -#endif /* __KERNEL__ */ - #ifdef CONFIG_XFS_QUOTA extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *); extern void xfs_trans_free_dqinfo(struct xfs_trans *); @@ -331,25 +325,36 @@ extern int xfs_qm_dqattach_locked(struct xfs_inode *,= uint); extern void xfs_qm_dqdetach(struct xfs_inode *); extern void xfs_qm_dqrele(struct xfs_dquot *); extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *); -extern int xfs_qm_sync(struct xfs_mount *, int); extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *); extern void xfs_qm_mount_quotas(struct xfs_mount *); extern void xfs_qm_unmount(struct xfs_mount *); extern void xfs_qm_unmount_quotas(struct xfs_mount *); =20 #else -#define xfs_qm_vop_dqalloc(ip, uid, gid, prid, flags, udqp, gdqp) ({ \ - *(udqp) =3D NULL; \ - *(gdqp) =3D NULL; \ - 0; \ -}) +static inline int +xfs_qm_vop_dqalloc(struct xfs_inode *ip, uid_t uid, gid_t gid, prid_t prid, + uint flags, struct xfs_dquot **udqp, struct xfs_dquot **gdqp) +{ + *udqp =3D NULL; + *gdqp =3D NULL; + return 0; +} #define xfs_trans_dup_dqinfo(tp, tp2) #define xfs_trans_free_dqinfo(tp) #define xfs_trans_mod_dquot_byino(tp, ip, fields, delta) #define xfs_trans_apply_dquot_deltas(tp) #define xfs_trans_unreserve_and_mod_dquots(tp) -#define xfs_trans_reserve_quota_nblks(tp, ip, blks, inos, flg) (0) -#define xfs_trans_reserve_quota_bydquots(tp, mp, uqp, gqp, blks, inos, flg= ) (0) +static inline int xfs_trans_reserve_quota_nblks(struct xfs_trans *tp, + struct xfs_inode *ip, long nblks, long ninos, uint flags) +{ + return 0; +} +static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp, + struct xfs_mount *mp, struct xfs_dquot *udqp, + struct xfs_dquot *gdqp, long nblks, long nions, uint flags) +{ + return 0; +} #define xfs_qm_vop_create_dqattach(tp, ip, u, g) #define xfs_qm_vop_rename_dqattach(it) (0) #define xfs_qm_vop_chown(tp, ip, old, new) (NULL) @@ -359,7 +364,6 @@ extern void xfs_qm_unmount_quotas(struct xfs_mount *); #define xfs_qm_dqdetach(ip) #define xfs_qm_dqrele(d) #define xfs_qm_statvfs(ip, s) -#define xfs_qm_sync(mp, flags) (0) #define xfs_qm_newmount(mp, a, b) (0) #define xfs_qm_mount_quotas(mp) #define xfs_qm_unmount(mp) @@ -372,4 +376,9 @@ extern void xfs_qm_unmount_quotas(struct xfs_mount *); xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \ f | XFS_QMOPT_RES_REGBLKS) =20 +extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, + xfs_dqid_t, uint, uint, char *); +extern int xfs_mount_reset_sbqflags(struct xfs_mount *); + +#endif /* __KERNEL__ */ #endif /* __XFS_QUOTA_H__ */ diff --git a/include/xfs_rtalloc.h b/include/xfs_rtalloc.h index ff614c2..f7f3a35 100644 --- a/include/xfs_rtalloc.h +++ b/include/xfs_rtalloc.h @@ -47,7 +47,7 @@ struct xfs_trans; #define XFS_SUMOFFSTOBLOCK(mp,s) \ (((s) * (uint)sizeof(xfs_suminfo_t)) >> (mp)->m_sb.sb_blocklog) #define XFS_SUMPTR(mp,bp,so) \ - ((xfs_suminfo_t *)((char *)XFS_BUF_PTR(bp) + \ + ((xfs_suminfo_t *)((bp)->b_addr + \ (((so) * (uint)sizeof(xfs_suminfo_t)) & XFS_BLOCKMASK(mp)))) =20 #define XFS_BITTOBLOCK(mp,bi) ((bi) >> (mp)->m_blkbit_log) @@ -154,7 +154,7 @@ xfs_rtmount_init( if (mp->m_sb.sb_rblocks =3D=3D 0) return 0; =20 - cmn_err(CE_WARN, "XFS: Not built with CONFIG_XFS_RT"); + xfs_warn(mp, "Not built with CONFIG_XFS_RT"); return ENOSYS; } # define xfs_rtmount_inodes(m) (((mp)->m_sb.sb_rblocks =3D=3D 0)? 0 : (EN= OSYS)) diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 5dcc2d7..6a7f8b0 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -81,6 +81,7 @@ struct xfs_mount; #define XFS_SB_VERSION2_ATTR2BIT 0x00000008 /* Inline attr rework */ #define XFS_SB_VERSION2_PARENTBIT 0x00000010 /* parent pointers */ #define XFS_SB_VERSION2_PROJID32BIT 0x00000080 /* 32 bit project id */ +#define XFS_SB_VERSION2_CRCBIT 0x00000100 /* metadata CRCs */ =20 #define XFS_SB_VERSION2_OKREALFBITS \ (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ @@ -510,13 +511,19 @@ static inline void xfs_sb_version_addprojid32bit(xfs_= sb_t *sbp) sbp->sb_bad_features2 |=3D XFS_SB_VERSION2_PROJID32BIT; } =20 +static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) +{ + return (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_CRCBIT)); +} + /* * end of superblock version macros */ =20 #define XFS_SB_DADDR ((xfs_daddr_t)0) /* daddr in filesystem/ag */ #define XFS_SB_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_SB_DADDR) -#define XFS_BUF_TO_SBP(bp) ((xfs_dsb_t *)XFS_BUF_PTR(bp)) +#define XFS_BUF_TO_SBP(bp) ((xfs_dsb_t *)((bp)->b_addr)) =20 #define XFS_HDR_BLOCK(mp,d) ((xfs_agblock_t)XFS_BB_TO_FSBT(mp,d)) #define XFS_DADDR_TO_FSB(mp,d) XFS_AGB_TO_FSB(mp, \ @@ -536,7 +543,6 @@ static inline void xfs_sb_version_addprojid32bit(xfs_sb= _t *sbp) #define XFS_BB_TO_FSB(mp,bb) \ (((bb) + (XFS_FSB_TO_BB(mp,1) - 1)) >> (mp)->m_blkbb_log) #define XFS_BB_TO_FSBT(mp,bb) ((bb) >> (mp)->m_blkbb_log) -#define XFS_BB_FSB_OFFSET(mp,bb) ((bb) & ((mp)->m_bsize - 1)) =20 /* * File system block to byte conversions. diff --git a/include/xfs_trace.h b/include/xfs_trace.h index 1abcf28..5f32097 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -26,11 +26,14 @@ #define trace_xfs_alloc_near_greater(a) ((void) 0) #define trace_xfs_alloc_near_lesser(a) ((void) 0) #define trace_xfs_alloc_near_error(a) ((void) 0) +#define trace_xfs_alloc_near_noentry(a) ((void) 0) +#define trace_xfs_alloc_near_busy(a) ((void) 0) #define trace_xfs_alloc_size_neither(a) ((void) 0) #define trace_xfs_alloc_size_noentry(a) ((void) 0) #define trace_xfs_alloc_size_nominleft(a) ((void) 0) #define trace_xfs_alloc_size_done(a) ((void) 0) #define trace_xfs_alloc_size_error(a) ((void) 0) +#define trace_xfs_alloc_size_busy(a) ((void) 0) #define trace_xfs_alloc_small_freelist(a) ((void) 0) #define trace_xfs_alloc_small_notenough(a) ((void) 0) #define trace_xfs_alloc_small_done(a) ((void) 0) @@ -91,12 +94,74 @@ #define trace_xfs_dir2_sf_toino4(a) ((void) 0) #define trace_xfs_dir2_sf_toino8(a) ((void) 0) =20 +#define trace_xfs_da_node_create(a) ((void) 0) +#define trace_xfs_da_split(a) ((void) 0) +#define trace_xfs_attr_leaf_split_before(a) ((void) 0) +#define trace_xfs_attr_leaf_split_after(a) ((void) 0) +#define trace_xfs_da_root_split(a) ((void) 0) +#define trace_xfs_da_node_split(a) ((void) 0) +#define trace_xfs_da_node_rebalance(a) ((void) 0) +#define trace_xfs_da_node_add(a) ((void) 0) +#define trace_xfs_da_join(a) ((void) 0) +#define trace_xfs_da_root_join(a) ((void) 0) +#define trace_xfs_da_node_toosmall(a) ((void) 0) +#define trace_xfs_da_fixhashpath(a) ((void) 0) +#define trace_xfs_da_node_remove(a) ((void) 0) +#define trace_xfs_da_node_unbalance(a) ((void) 0) +#define trace_xfs_da_link_before(a) ((void) 0) +#define trace_xfs_da_link_after(a) ((void) 0) +#define trace_xfs_da_unlink_back(a) ((void) 0) +#define trace_xfs_da_unlink_forward(a) ((void) 0) +#define trace_xfs_da_path_shift(a) ((void) 0) +#define trace_xfs_da_grow_inode(a) ((void) 0) +#define trace_xfs_da_swap_lastblock(a) ((void) 0) +#define trace_xfs_da_shrink_inode(a) ((void) 0) + +#define trace_xfs_attr_sf_create(a) ((void) 0) +#define trace_xfs_attr_sf_add(a) ((void) 0) +#define trace_xfs_attr_sf_remove(a) ((void) 0) +#define trace_xfs_attr_sf_lookup(a) ((void) 0) +#define trace_xfs_attr_sf_to_leaf(a) ((void) 0) +#define trace_xfs_attr_leaf_to_sf(a) ((void) 0) +#define trace_xfs_attr_leaf_to_node(a) ((void) 0) +#define trace_xfs_attr_leaf_create(a) ((void) 0) +#define trace_xfs_attr_leaf_split(a) ((void) 0) +#define trace_xfs_attr_leaf_add_old(a) ((void) 0) +#define trace_xfs_attr_leaf_add_new(a) ((void) 0) +#define trace_xfs_attr_leaf_add(a) ((void) 0) +#define trace_xfs_attr_leaf_add_work(a) ((void) 0) +#define trace_xfs_attr_leaf_compact(a) ((void) 0) +#define trace_xfs_attr_leaf_rebalance(a) ((void) 0) +#define trace_xfs_attr_leaf_toosmall(a) ((void) 0) +#define trace_xfs_attr_leaf_remove(a) ((void) 0) +#define trace_xfs_attr_leaf_unbalance(a) ((void) 0) +#define trace_xfs_attr_leaf_lookup(a) ((void) 0) +#define trace_xfs_attr_leaf_clearflag(a) ((void) 0) +#define trace_xfs_attr_leaf_setflag(a) ((void) 0) +#define trace_xfs_attr_leaf_flipflags(a) ((void) 0) + +#define trace_xfs_attr_sf_addname(a) ((void) 0) +#define trace_xfs_attr_leaf_addname(a) ((void) 0) +#define trace_xfs_attr_leaf_replace(a) ((void) 0) +#define trace_xfs_attr_leaf_removename(a) ((void) 0) +#define trace_xfs_attr_leaf_get(a) ((void) 0) +#define trace_xfs_attr_node_addname(a) ((void) 0) +#define trace_xfs_attr_node_replace(a) ((void) 0) +#define trace_xfs_attr_node_removename(a) ((void) 0) +#define trace_xfs_attr_fillstate(a) ((void) 0) +#define trace_xfs_attr_refillstate(a) ((void) 0) +#define trace_xfs_attr_node_get(a) ((void) 0) +#define trace_xfs_attr_rmtval_get(a) ((void) 0) +#define trace_xfs_attr_rmtval_set(a) ((void) 0) +#define trace_xfs_attr_rmtval_remove(a) ((void) 0) + #define trace_xfs_bmap_pre_update(a,b,c,d) ((void) 0) #define trace_xfs_bmap_post_update(a,b,c,d) ((void) 0) #define trace_xfs_extlist(a,b,c,d) ((void) 0) #define trace_xfs_bunmap(a,b,c,d,e) ((void) 0) =20 -#define trace_xfs_perag_get(a,b,c,d) ((void) 0) -#define trace_xfs_perag_put(a,b,c,d) ((void) 0) +/* set c =3D c to avoid unused var warnings */ +#define trace_xfs_perag_get(a,b,c,d) ((c) =3D (c)) +#define trace_xfs_perag_put(a,b,c,d) ((c) =3D (c)) =20 #endif /* __TRACE_H__ */ diff --git a/include/xfs_trans.h b/include/xfs_trans.h index 2870308..acf1381 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -163,9 +163,8 @@ typedef struct xfs_trans_header { */ struct xfs_log_item_desc { struct xfs_log_item *lid_item; - ushort lid_size; - unsigned char lid_flags; struct list_head lid_trans; + unsigned char lid_flags; }; =20 #define XFS_LID_DIRTY 0x1 @@ -180,6 +179,8 @@ struct xfs_log_item_desc { #define XFS_TRANS_SYNC 0x08 /* make commit synchronous */ #define XFS_TRANS_DQ_DIRTY 0x10 /* at least one dquot in trx dirty */ #define XFS_TRANS_RESERVE 0x20 /* OK to use reserved data blocks */ +#define XFS_TRANS_FREEZE_PROT 0x40 /* Transaction has elevated writer + count in superblock */ =20 /* * Values for call flags parameter. @@ -323,7 +324,7 @@ typedef struct xfs_log_item { struct xfs_log_item *); /* buffer item iodone */ /* callback func */ - struct xfs_item_ops *li_ops; /* function list */ + const struct xfs_item_ops *li_ops; /* function list */ =20 /* delayed logging */ struct list_head li_cil; /* CIL pointers */ @@ -338,37 +339,33 @@ typedef struct xfs_log_item { { XFS_LI_IN_AIL, "IN_AIL" }, \ { XFS_LI_ABORTED, "ABORTED" } =20 -typedef struct xfs_item_ops { +struct xfs_item_ops { uint (*iop_size)(xfs_log_item_t *); void (*iop_format)(xfs_log_item_t *, struct xfs_log_iovec *); void (*iop_pin)(xfs_log_item_t *); void (*iop_unpin)(xfs_log_item_t *, int remove); - uint (*iop_trylock)(xfs_log_item_t *); + uint (*iop_push)(struct xfs_log_item *, struct list_head *); void (*iop_unlock)(xfs_log_item_t *); xfs_lsn_t (*iop_committed)(xfs_log_item_t *, xfs_lsn_t); - void (*iop_push)(xfs_log_item_t *); - void (*iop_pushbuf)(xfs_log_item_t *); void (*iop_committing)(xfs_log_item_t *, xfs_lsn_t); -} xfs_item_ops_t; +}; =20 #define IOP_SIZE(ip) (*(ip)->li_ops->iop_size)(ip) #define IOP_FORMAT(ip,vp) (*(ip)->li_ops->iop_format)(ip, vp) #define IOP_PIN(ip) (*(ip)->li_ops->iop_pin)(ip) #define IOP_UNPIN(ip, remove) (*(ip)->li_ops->iop_unpin)(ip, remove) -#define IOP_TRYLOCK(ip) (*(ip)->li_ops->iop_trylock)(ip) +#define IOP_PUSH(ip, list) (*(ip)->li_ops->iop_push)(ip, list) #define IOP_UNLOCK(ip) (*(ip)->li_ops->iop_unlock)(ip) #define IOP_COMMITTED(ip, lsn) (*(ip)->li_ops->iop_committed)(ip, lsn) -#define IOP_PUSH(ip) (*(ip)->li_ops->iop_push)(ip) -#define IOP_PUSHBUF(ip) (*(ip)->li_ops->iop_pushbuf)(ip) #define IOP_COMMITTING(ip, lsn) (*(ip)->li_ops->iop_committing)(ip, lsn) =20 /* - * Return values for the IOP_TRYLOCK() routines. + * Return values for the IOP_PUSH() routines. */ -#define XFS_ITEM_SUCCESS 0 -#define XFS_ITEM_PINNED 1 -#define XFS_ITEM_LOCKED 2 -#define XFS_ITEM_PUSHBUF 3 +#define XFS_ITEM_SUCCESS 0 +#define XFS_ITEM_PINNED 1 +#define XFS_ITEM_LOCKED 2 +#define XFS_ITEM_FLUSHING 3 =20 /* * This is the type of function which can be given to xfs_trans_callback() @@ -445,16 +442,53 @@ typedef struct xfs_trans { * XFS transaction mechanism exported interfaces. */ xfs_trans_t *xfs_trans_alloc(struct xfs_mount *, uint); -xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint, uint); +xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint, xfs_km_flags_t); xfs_trans_t *xfs_trans_dup(xfs_trans_t *); int xfs_trans_reserve(xfs_trans_t *, uint, uint, uint, uint, uint); void xfs_trans_mod_sb(xfs_trans_t *, uint, int64_t); -struct xfs_buf *xfs_trans_get_buf(xfs_trans_t *, struct xfs_buftarg *, xfs= _daddr_t, - int, uint); -int xfs_trans_read_buf(struct xfs_mount *, xfs_trans_t *, - struct xfs_buftarg *, xfs_daddr_t, int, uint, - struct xfs_buf **); + +struct xfs_buf *xfs_trans_get_buf_map(struct xfs_trans *tp, + struct xfs_buftarg *target, + struct xfs_buf_map *map, int nmaps, + uint flags); + +static inline struct xfs_buf * +xfs_trans_get_buf( + struct xfs_trans *tp, + struct xfs_buftarg *target, + xfs_daddr_t blkno, + int numblks, + uint flags) +{ + DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); + return xfs_trans_get_buf_map(tp, target, &map, 1, flags); +} + +int xfs_trans_read_buf_map(struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buftarg *target, + struct xfs_buf_map *map, int nmaps, + xfs_buf_flags_t flags, + struct xfs_buf **bpp, + const struct xfs_buf_ops *ops); + +static inline int +xfs_trans_read_buf( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buftarg *target, + xfs_daddr_t blkno, + int numblks, + xfs_buf_flags_t flags, + struct xfs_buf **bpp, + const struct xfs_buf_ops *ops) +{ + DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); + return xfs_trans_read_buf_map(mp, tp, target, &map, 1, + flags, bpp, ops); +} + struct xfs_buf *xfs_trans_getsb(xfs_trans_t *, struct xfs_mount *, int); =20 void xfs_trans_brelse(xfs_trans_t *, struct xfs_buf *); @@ -466,11 +500,8 @@ void xfs_trans_inode_buf(xfs_trans_t *, struct xfs_bu= f *); void xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); -int xfs_trans_iget(struct xfs_mount *, xfs_trans_t *, - xfs_ino_t , uint, uint, struct xfs_inode **); void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); -void xfs_trans_ijoin_ref(struct xfs_trans *, struct xfs_inode *, uint); -void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *); +void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); @@ -486,10 +517,7 @@ void xfs_trans_log_efd_extent(xfs_trans_t *, struct xfs_efd_log_item *, xfs_fsblock_t, xfs_extlen_t); -int _xfs_trans_commit(xfs_trans_t *, - uint flags, - int *); -#define xfs_trans_commit(tp, flags) _xfs_trans_commit(tp, flags, NULL) +int xfs_trans_commit(xfs_trans_t *, uint flags); void xfs_trans_cancel(xfs_trans_t *, int); int xfs_trans_ail_init(struct xfs_mount *); void xfs_trans_ail_destroy(struct xfs_mount *); diff --git a/include/xfs_types.h b/include/xfs_types.h index 26d1867..e9bd5c3 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -33,7 +33,6 @@ typedef signed long long int __int64_t; typedef unsigned long long int __uint64_t; =20 typedef enum { B_FALSE,B_TRUE } boolean_t; -typedef __uint32_t prid_t; /* project ID */ typedef __uint32_t inst_t; /* an instruction */ =20 typedef __s64 xfs_off_t; /* type */ @@ -56,7 +55,10 @@ typedef __uint64_t __psunsigned_t; =20 #endif /* __KERNEL__ */ =20 +typedef __uint32_t prid_t; /* project ID */ + typedef __uint32_t xfs_agblock_t; /* blockno in alloc. group */ +typedef __uint32_t xfs_agino_t; /* inode # within allocation grp */ typedef __uint32_t xfs_extlen_t; /* extent length in blocks */ typedef __uint32_t xfs_agnumber_t; /* allocation group number */ typedef __int32_t xfs_extnum_t; /* # of extents in a file */ @@ -73,8 +75,6 @@ typedef __int32_t xfs_tid_t; /* transaction identifier */ typedef __uint32_t xfs_dablk_t; /* dir/attr block number (in file) */ typedef __uint32_t xfs_dahash_t; /* dir/attr hash value */ =20 -typedef __uint32_t xlog_tid_t; /* transaction ID type */ - /* * These types are 64 bits on disk but are either 32 or 64 bits in memory. * Disk based types: @@ -103,6 +103,7 @@ typedef __uint64_t xfs_fileoff_t; /* block number in a = file */ typedef __int64_t xfs_sfiloff_t; /* signed block number in a file */ typedef __uint64_t xfs_filblks_t; /* number of blocks in a file */ =20 + /* * Null values for the types. */ @@ -122,6 +123,9 @@ typedef __uint64_t xfs_filblks_t; /* number of blocks i= n a file */ =20 #define NULLCOMMITLSN ((xfs_lsn_t)-1) =20 +#define NULLFSINO ((xfs_ino_t)-1) +#define NULLAGINO ((xfs_agino_t)-1) + /* * Max values for extlen, extnum, aextnum. */ @@ -130,6 +134,20 @@ typedef __uint64_t xfs_filblks_t; /* number of blocks = in a file */ #define MAXAEXTNUM ((xfs_aextnum_t)0x7fff) /* signed short */ =20 /* + * Minimum and maximum blocksize and sectorsize. + * The blocksize upper limit is pretty much arbitrary. + * The sectorsize upper limit is due to sizeof(sb_sectsize). + */ +#define XFS_MIN_BLOCKSIZE_LOG 9 /* i.e. 512 bytes */ +#define XFS_MAX_BLOCKSIZE_LOG 16 /* i.e. 65536 bytes */ +#define XFS_MIN_BLOCKSIZE (1 << XFS_MIN_BLOCKSIZE_LOG) +#define XFS_MAX_BLOCKSIZE (1 << XFS_MAX_BLOCKSIZE_LOG) +#define XFS_MIN_SECTORSIZE_LOG 9 /* i.e. 512 bytes */ +#define XFS_MAX_SECTORSIZE_LOG 15 /* i.e. 32768 bytes */ +#define XFS_MIN_SECTORSIZE (1 << XFS_MIN_SECTORSIZE_LOG) +#define XFS_MAX_SECTORSIZE (1 << XFS_MAX_SECTORSIZE_LOG) + +/* * Min numbers of data/attr fork btree root pointers. */ #define MINDBTPTRS 3 diff --git a/libxfs/Makefile b/libxfs/Makefile index b3fd85c..dc9b22c 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -10,7 +10,7 @@ LT_CURRENT =3D 0 LT_REVISION =3D 0 LT_AGE =3D 0 =20 -HFILES =3D xfs.h init.h +HFILES =3D xfs.h init.h xfs_dir2_priv.h CFILES =3D cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c uti= l.c \ xfs_alloc.c xfs_ialloc.c xfs_inode.c xfs_btree.c xfs_alloc_btree.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ diff --git a/libxfs/init.c b/libxfs/init.c index 08fc584..1b11fb0 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -371,7 +371,6 @@ manage_zones(int release) extern kmem_zone_t *xfs_ili_zone; extern kmem_zone_t *xfs_inode_zone; extern kmem_zone_t *xfs_ifork_zone; - extern kmem_zone_t *xfs_dabuf_zone; extern kmem_zone_t *xfs_buf_item_zone; extern kmem_zone_t *xfs_da_state_zone; extern kmem_zone_t *xfs_btree_cur_zone; @@ -383,7 +382,6 @@ manage_zones(int release) kmem_free(xfs_buf_zone); kmem_free(xfs_inode_zone); kmem_free(xfs_ifork_zone); - kmem_free(xfs_dabuf_zone); kmem_free(xfs_buf_item_zone); kmem_free(xfs_da_state_zone); kmem_free(xfs_btree_cur_zone); @@ -395,7 +393,6 @@ manage_zones(int release) xfs_buf_zone =3D kmem_zone_init(sizeof(xfs_buf_t), "xfs_buffer"); xfs_inode_zone =3D kmem_zone_init(sizeof(xfs_inode_t), "xfs_inode"); xfs_ifork_zone =3D kmem_zone_init(sizeof(xfs_ifork_t), "xfs_ifork"); - xfs_dabuf_zone =3D kmem_zone_init(sizeof(xfs_dabuf_t), "xfs_dabuf"); xfs_ili_zone =3D kmem_zone_init( sizeof(xfs_inode_log_item_t), "xfs_inode_log_item"); xfs_buf_item_zone =3D kmem_zone_init( diff --git a/libxfs/logitem.c b/libxfs/logitem.c index 116d3ed..84e4c14 100644 --- a/libxfs/logitem.c +++ b/libxfs/logitem.c @@ -32,21 +32,27 @@ kmem_zone_t *xfs_ili_zone; /* inode log item zone */ xfs_buf_t * xfs_trans_buf_item_match( xfs_trans_t *tp, - xfs_buftarg_t *target, - xfs_daddr_t blkno, - int len) + dev_t dev, + struct xfs_buf_map *map, + int nmaps) { struct xfs_log_item_desc *lidp; struct xfs_buf_log_item *blip; + int len =3D 0; + int i; + + for (i =3D 0; i < nmaps; i++) + len +=3D map[i].bm_len; =20 - len =3D BBTOB(len); list_for_each_entry(lidp, &tp->t_items, lid_trans) { blip =3D (struct xfs_buf_log_item *)lidp->lid_item; if (blip->bli_item.li_type =3D=3D XFS_LI_BUF && - XFS_BUF_TARGET(blip->bli_buf) =3D=3D target->dev && - XFS_BUF_ADDR(blip->bli_buf) =3D=3D blkno && - XFS_BUF_COUNT(blip->bli_buf) =3D=3D len) + blip->bli_buf->b_dev =3D=3D dev && + XFS_BUF_ADDR(blip->bli_buf) =3D=3D map[0].bm_bn && + blip->bli_buf->b_bcount =3D=3D BBTOB(len)) { + ASSERT(blip->bli_buf->b_map_count =3D=3D nmaps); return blip->bli_buf; + } } =20 return NULL; diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 432a1af..e75edd0 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -159,7 +159,7 @@ libxfs_log_header( head->h_len =3D cpu_to_be32(sunit - BBSIZE); else head->h_len =3D cpu_to_be32(20); - head->h_chksum =3D cpu_to_be32(0); + head->h_crc =3D cpu_to_be32(0); head->h_prev_block =3D cpu_to_be32(-1); head->h_num_logops =3D cpu_to_be32(1); head->h_cycle_data[0] =3D cpu_to_be32(0xb0c0d0d0); @@ -193,72 +193,86 @@ libxfs_log_header( #ifdef XFS_BUF_TRACING =20 #undef libxfs_readbuf +#undef libxfs_readbuf_map #undef libxfs_writebuf #undef libxfs_getbuf +#undef libxfs_getbuf_map #undef libxfs_getbuf_flags #undef libxfs_putbuf =20 -xfs_buf_t *libxfs_readbuf(dev_t, xfs_daddr_t, int, int); +xfs_buf_t *libxfs_readbuf(dev_t, xfs_daddr_t, int, int); +xfs_buf_t *libxfs_readbuf_map(dev_t, struct xfs_buf_map *, int, int); int libxfs_writebuf(xfs_buf_t *, int); -xfs_buf_t *libxfs_getbuf(dev_t, xfs_daddr_t, int); +xfs_buf_t *libxfs_getbuf(dev_t, xfs_daddr_t, int); +xfs_buf_t *libxfs_getbuf_map(dev_t, struct xfs_buf_map *, int); +xfs_buf_t *libxfs_getbuf_flags(dev_t, xfs_daddr_t, int, unsigned int); void libxfs_putbuf (xfs_buf_t *); =20 +#define __add_trace(bp, func, file, line) \ +do { \ + if (bp) { \ + (bp)->b_func =3D (func); \ + (bp)->b_file =3D (file); \ + (bp)->b_line =3D (line); \ + } \ +} while (0) + xfs_buf_t * -libxfs_trace_readbuf(const char *func, const char *file, int line, dev_t d= ev, xfs_daddr_t blkno, int len, int flags) +libxfs_trace_readbuf(const char *func, const char *file, int line, + dev_t dev, xfs_daddr_t blkno, int len, int flags) { xfs_buf_t *bp =3D libxfs_readbuf(dev, blkno, len, flags); + __add_trace(bp, func, file, line); + return bp; +} =20 - if (bp){ - bp->b_func =3D func; - bp->b_file =3D file; - bp->b_line =3D line; - } - +xfs_buf_t * +libxfs_trace_readbuf_map(const char *func, const char *file, int line, + dev_t dev, struct xfs_buf_map *map, int nmaps, int flags) +{ + xfs_buf_t *bp =3D libxfs_readbuf_map(dev, map, nmaps, flags); + __add_trace(bp, func, file, line); return bp; } =20 int libxfs_trace_writebuf(const char *func, const char *file, int line, xfs_bu= f_t *bp, int flags) { - bp->b_func =3D func; - bp->b_file =3D file; - bp->b_line =3D line; - + __add_trace(bp, func, file, line); return libxfs_writebuf(bp, flags); } =20 xfs_buf_t * -libxfs_trace_getbuf(const char *func, const char *file, int line, dev_t de= vice, xfs_daddr_t blkno, int len) +libxfs_trace_getbuf(const char *func, const char *file, int line, + dev_t device, xfs_daddr_t blkno, int len) { xfs_buf_t *bp =3D libxfs_getbuf(device, blkno, len); + __add_trace(bp, func, file, line); + return bp; +} =20 - bp->b_func =3D func; - bp->b_file =3D file; - bp->b_line =3D line; - +xfs_buf_t * +libxfs_trace_getbuf_map(const char *func, const char *file, int line, + dev_t device, struct xfs_buf_map *map, int nmaps) +{ + xfs_buf_t *bp =3D libxfs_getbuf_map(device, map, nmaps); + __add_trace(bp, func, file, line); return bp; } =20 xfs_buf_t * libxfs_trace_getbuf_flags(const char *func, const char *file, int line, - dev_t device, xfs_daddr_t blkno, int len, unsigned long flags) + dev_t device, xfs_daddr_t blkno, int len, unsigned int flags) { - xfs_buf_t *bp =3D libxfs_getbuf(device, blkno, len, flags); - - bp->b_func =3D func; - bp->b_file =3D file; - bp->b_line =3D line; - + xfs_buf_t *bp =3D libxfs_getbuf_flags(device, blkno, len, flags); + __add_trace(bp, func, file, line); return bp; } =20 void libxfs_trace_putbuf(const char *func, const char *file, int line, xfs_buf_= t *bp) { - bp->b_func =3D func; - bp->b_file =3D file; - bp->b_line =3D line; - + __add_trace(bp, func, file, line); libxfs_putbuf(bp); } =20 @@ -279,30 +293,40 @@ static struct cache_mru xfs_buf_freelist =3D {{&xfs_buf_freelist.cm_list, &xfs_buf_freelist.cm_list}, 0, PTHREAD_MUTEX_INITIALIZER }; =20 -typedef struct { - dev_t device; - xfs_daddr_t blkno; - unsigned int bblen; -} xfs_bufkey_t; +/* + * The bufkey is used to pass the new buffer information to the cache obje= ct + * allocation routine. Because discontiguous buffers need to pass different + * information, we need fields to pass that information. However, because = the + * blkno and bblen is needed for the initial cache entry lookup (i.e. for + * bcompare) the fact that the map/nmaps is non-null to switch to disconti= guous + * buffer initialisation instead of a contiguous buffer. + */ +struct xfs_bufkey { + dev_t device; + xfs_daddr_t blkno; + unsigned int bblen; + struct xfs_buf_map *map; + int nmaps; +}; =20 static unsigned int libxfs_bhash(cache_key_t key, unsigned int hashsize) { - return (((unsigned int)((xfs_bufkey_t *)key)->blkno) >> 5) % hashsize; + return (((unsigned int)((struct xfs_bufkey *)key)->blkno) >> 5) % hashsiz= e; } =20 static int libxfs_bcompare(struct cache_node *node, cache_key_t key) { - xfs_buf_t *bp =3D (xfs_buf_t *)node; - xfs_bufkey_t *bkey =3D (xfs_bufkey_t *)key; + struct xfs_buf *bp =3D (struct xfs_buf *)node; + struct xfs_bufkey *bkey =3D (struct xfs_bufkey *)key; =20 #ifdef IO_BCOMPARE_CHECK if (bp->b_dev =3D=3D bkey->device && bp->b_blkno =3D=3D bkey->blkno && bp->b_bcount !=3D BBTOB(bkey->bblen)) fprintf(stderr, "%lx: Badness in key lookup (length)\n" - "bp=3D(bno %llu, len %u bytes) key=3D(bno %llu, len %u bytes)\n", + "bp=3D(bno 0x%llx, len %u bytes) key=3D(bno 0x%llx, len %u bytes)\n", pthread_self(), (unsigned long long)bp->b_blkno, (int)bp->b_bcount, (unsigned long long)bkey->blkno, BBTOB(bkey->bblen)); @@ -322,11 +346,12 @@ libxfs_bprint(xfs_buf_t *bp) } =20 static void -libxfs_initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int = bytes) +__initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int bytes) { bp->b_flags =3D 0; bp->b_blkno =3D bno; bp->b_bcount =3D bytes; + bp->b_length =3D BTOBB(bytes); bp->b_dev =3D device; bp->b_error =3D 0; if (!bp->b_addr) @@ -346,11 +371,44 @@ libxfs_initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr= _t bno, unsigned int bytes) bp->b_recur =3D 0; } =20 +static void +libxfs_initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int = bytes) +{ + __initbuf(bp, device, bno, bytes); +} + +static void +libxfs_initbuf_map(xfs_buf_t *bp, dev_t device, struct xfs_buf_map *map, i= nt nmaps) +{ + unsigned int bytes =3D 0; + int i; + + bytes =3D sizeof(struct xfs_buf_map) * nmaps; + bp->b_map =3D malloc(bytes); + if (!bp->b_map) { + fprintf(stderr, + _("%s: %s can't malloc %u bytes: %s\n"), + progname, __FUNCTION__, bytes, + strerror(errno)); + exit(1); + } + bp->b_nmaps =3D nmaps; + + bytes =3D 0; + for ( i =3D 0; i < nmaps; i++) { + bp->b_map[i].bm_bn =3D map[i].bm_bn; + bp->b_map[i].bm_len =3D map[i].bm_len; + bytes +=3D BBTOB(map[i].bm_len); + } + + __initbuf(bp, device, map[0].bm_bn, bytes); + bp->b_flags |=3D LIBXFS_B_DISCONTIG; +} + xfs_buf_t * -libxfs_getbufr(dev_t device, xfs_daddr_t blkno, int bblen) +__libxfs_getbufr(int blen) { xfs_buf_t *bp; - int blen =3D BBTOB(bblen); =20 /* * first look for a buffer that can be used as-is, @@ -372,15 +430,27 @@ libxfs_getbufr(dev_t device, xfs_daddr_t blkno, int b= blen) list_del_init(&bp->b_node.cn_mru); free(bp->b_addr); bp->b_addr =3D NULL; + free(bp->b_map); + bp->b_map =3D NULL; } } else bp =3D kmem_zone_zalloc(xfs_buf_zone, 0); pthread_mutex_unlock(&xfs_buf_freelist.cm_mutex); =20 - if (bp !=3D NULL) + return bp; +} + +xfs_buf_t * +libxfs_getbufr(dev_t device, xfs_daddr_t blkno, int bblen) +{ + xfs_buf_t *bp; + int blen =3D BBTOB(bblen); + + bp =3D__libxfs_getbufr(blen); + if (bp) libxfs_initbuf(bp, device, blkno, blen); #ifdef IO_DEBUG - printf("%lx: %s: allocated %u bytes buffer, key=3D%llu(%llu), %p\n", + printf("%lx: %s: allocated %u bytes buffer, key=3D0x%llx(0x%llx), %p\n", pthread_self(), __FUNCTION__, blen, (long long)LIBXFS_BBTOOFF64(blkno), (long long)blkno, bp); #endif @@ -388,6 +458,38 @@ libxfs_getbufr(dev_t device, xfs_daddr_t blkno, int bb= len) return bp; } =20 +xfs_buf_t * +libxfs_getbufr_map(dev_t device, xfs_daddr_t blkno, int bblen, + struct xfs_buf_map *map, int nmaps) +{ + xfs_buf_t *bp; + int blen =3D BBTOB(bblen); + + if (!map || !nmaps) { + fprintf(stderr, + _("%s: %s invalid map %p or nmaps %d\n"), + progname, __FUNCTION__, map, nmaps); + exit(1); + } + + if (blkno !=3D map[0].bm_bn) { + fprintf(stderr, + _("%s: %s map blkno %lx doesn't match key %lx\n"), + progname, __FUNCTION__, map[0].bm_bn, blkno); + exit(1); + } + + bp =3D__libxfs_getbufr(blen); + if (bp) + libxfs_initbuf_map(bp, device, map, nmaps); +#ifdef IO_DEBUG + printf("%lx: %s: allocated %u bytes buffer, key=3D0x%llx(0x%llx), %p\n", + pthread_self(), __FUNCTION__, blen, + (long long)LIBXFS_BBTOOFF64(blkno), (long long)blkno, bp); +#endif + + return bp; +} =20 #ifdef XFS_BUF_TRACING struct list_head lock_buf_list =3D {&lock_buf_list, &lock_buf_list}; @@ -396,18 +498,12 @@ int lock_buf_count =3D 0; =20 extern int use_xfs_buf_lock; =20 -struct xfs_buf * -libxfs_getbuf_flags(dev_t device, xfs_daddr_t blkno, int len, unsigned int= flags) +static struct xfs_buf * +__cache_lookup(struct xfs_bufkey *key, unsigned int flags) { - xfs_buf_t *bp; - xfs_bufkey_t key; - int miss; - - key.device =3D device; - key.blkno =3D blkno; - key.bblen =3D len; + struct xfs_buf *bp; =20 - miss =3D cache_node_get(libxfs_bcache, &key, (struct cache_node **)&bp); + cache_node_get(libxfs_bcache, key, (struct cache_node **)&bp); if (!bp) return NULL; =20 @@ -423,7 +519,7 @@ libxfs_getbuf_flags(dev_t device, xfs_daddr_t blkno, in= t len, unsigned int flags if (pthread_equal(bp->b_holder, pthread_self())) { fprintf(stderr, _("Warning: recursive buffer locking at block %" PRIu64 " detected\n"), - blkno); + key->blkno); bp->b_recur++; return bp; } else { @@ -444,9 +540,9 @@ libxfs_getbuf_flags(dev_t device, xfs_daddr_t blkno, in= t len, unsigned int flags pthread_mutex_unlock(&libxfs_bcache->c_mutex); #endif #ifdef IO_DEBUG - printf("%lx %s: %s buffer %p for bno =3D %llu\n", - pthread_self(), __FUNCTION__, miss ? "miss" : "hit", - bp, (long long)LIBXFS_BBTOOFF64(blkno)); + printf("%lx %s: hit buffer %p for bno =3D 0x%llx/0x%llx\n", + pthread_self(), __FUNCTION__, + bp, bp->b_bn, (long long)LIBXFS_BBTOOFF64(key->blkno)); #endif =20 return bp; @@ -456,11 +552,40 @@ out_put: } =20 struct xfs_buf * +libxfs_getbuf_flags(dev_t device, xfs_daddr_t blkno, int len, unsigned int= flags) +{ + struct xfs_bufkey key =3D {0}; + + key.device =3D device; + key.blkno =3D blkno; + key.bblen =3D len; + + return __cache_lookup(&key, flags); +} + +struct xfs_buf * libxfs_getbuf(dev_t device, xfs_daddr_t blkno, int len) { return libxfs_getbuf_flags(device, blkno, len, 0); } =20 +struct xfs_buf * +libxfs_getbuf_map(dev_t device, struct xfs_buf_map *map, int nmaps) +{ + struct xfs_bufkey key =3D {0}; + int i; + + key.device =3D device; + key.blkno =3D map[0].bm_bn; + for (i =3D 0; i < nmaps; i++) { + key.bblen +=3D map[i].bm_len; + } + key.map =3D map; + key.nmaps =3D nmaps; + + return __cache_lookup(&key, 0); +} + void libxfs_putbuf(xfs_buf_t *bp) { @@ -485,7 +610,7 @@ libxfs_putbuf(xfs_buf_t *bp) void libxfs_purgebuf(xfs_buf_t *bp) { - xfs_bufkey_t key; + struct xfs_bufkey key =3D {0}; =20 key.device =3D bp->b_dev; key.blkno =3D bp->b_blkno; @@ -497,47 +622,62 @@ libxfs_purgebuf(xfs_buf_t *bp) static struct cache_node * libxfs_balloc(cache_key_t key) { - xfs_bufkey_t *bufkey =3D (xfs_bufkey_t *)key; + struct xfs_bufkey *bufkey =3D (struct xfs_bufkey *)key; =20 + if (bufkey->map) + return (struct cache_node *) + libxfs_getbufr_map(bufkey->device, + bufkey->blkno, bufkey->bblen, + bufkey->map, bufkey->nmaps); return (struct cache_node *)libxfs_getbufr(bufkey->device, - bufkey->blkno, bufkey->bblen); + bufkey->blkno, bufkey->bblen); } =20 -int -libxfs_readbufr(dev_t dev, xfs_daddr_t blkno, xfs_buf_t *bp, int len, int = flags) + +static int +__read_buf(int fd, void *buf, int len, off64_t offset, int flags) { - int fd =3D libxfs_device_to_fd(dev); - int bytes =3D BBTOB(len); - int error; int sts; =20 - ASSERT(BBTOB(len) <=3D bp->b_bcount); - - sts =3D pread64(fd, bp->b_addr, bytes, LIBXFS_BBTOOFF64(blkno)); + sts =3D pread64(fd, buf, len, offset); if (sts < 0) { - error =3D errno; + int error =3D errno; fprintf(stderr, _("%s: read failed: %s\n"), progname, strerror(error)); if (flags & LIBXFS_EXIT_ON_FAILURE) exit(1); return error; - } else if (sts !=3D bytes) { + } else if (sts !=3D len) { fprintf(stderr, _("%s: error - read only %d of %d bytes\n"), - progname, sts, bytes); + progname, sts, len); if (flags & LIBXFS_EXIT_ON_FAILURE) exit(1); return EIO; } -#ifdef IO_DEBUG - printf("%lx: %s: read %u bytes, blkno=3D%llu(%llu), %p\n", - pthread_self(), __FUNCTION__, bytes, - (long long)LIBXFS_BBTOOFF64(blkno), (long long)blkno, bp); -#endif - if (bp->b_dev =3D=3D dev && + return 0; +} + +int +libxfs_readbufr(dev_t dev, xfs_daddr_t blkno, xfs_buf_t *bp, int len, int = flags) +{ + int fd =3D libxfs_device_to_fd(dev); + int bytes =3D BBTOB(len); + int error; + + ASSERT(BBTOB(len) <=3D bp->b_bcount); + + error =3D __read_buf(fd, bp->b_addr, bytes, LIBXFS_BBTOOFF64(blkno), flag= s); + if (!error && + bp->b_dev =3D=3D dev && bp->b_blkno =3D=3D blkno && bp->b_bcount =3D=3D bytes) bp->b_flags |=3D LIBXFS_B_UPTODATE; - return 0; +#ifdef IO_DEBUG + printf("%lx: %s: read %u bytes, error %d, blkno=3D0x%llx(0x%llx), %p\n", + pthread_self(), __FUNCTION__, bytes, error, + (long long)LIBXFS_BBTOOFF64(blkno), (long long)blkno, bp); +#endif + return error; } =20 xfs_buf_t * @@ -555,37 +695,113 @@ libxfs_readbuf(dev_t dev, xfs_daddr_t blkno, int len= , int flags) return bp; } =20 -int -libxfs_writebufr(xfs_buf_t *bp) +struct xfs_buf * +libxfs_readbuf_map(dev_t dev, struct xfs_buf_map *map, int nmaps, int flag= s) +{ + xfs_buf_t *bp; + int error =3D 0; + int fd; + int i; + char *buf; + + if (nmaps =3D=3D 1) + return libxfs_readbuf(dev, map[0].bm_bn, map[0].bm_len, flags); + + bp =3D libxfs_getbuf_map(dev, map, nmaps); + if (!bp || (bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) + return bp; + + ASSERT(bp->b_nmaps =3D nmaps); + + fd =3D libxfs_device_to_fd(dev); + buf =3D bp->b_addr; + for (i =3D 0; i < bp->b_nmaps; i++) { + off64_t offset =3D LIBXFS_BBTOOFF64(bp->b_map[i].bm_bn); + int len =3D BBTOB(bp->b_map[i].bm_len); + + ASSERT(bp->b_map[i].bm_bn =3D=3D map[i].bm_bn); + ASSERT(bp->b_map[i].bm_len =3D=3D map[i].bm_len); + + error =3D __read_buf(fd, buf, len, offset, flags); + if (error) { + bp->b_error =3D error; + break; + } + buf +=3D len; + offset +=3D len; + } + + if (!error) + bp->b_flags |=3D LIBXFS_B_UPTODATE; +#ifdef IO_DEBUG + printf("%lx: %s: read %lu bytes, error %d, blkno=3D%llu(%llu), %p\n", + pthread_self(), __FUNCTION__, buf - (char *)bp->b_addr, error, + (long long)LIBXFS_BBTOOFF64(bp->b_blkno), (long long)bp->b_blkno, bp); +#endif + return bp; +} + +static int +__write_buf(int fd, void *buf, int len, off64_t offset, int flags) { int sts; - int fd =3D libxfs_device_to_fd(bp->b_dev); - int error; =20 - sts =3D pwrite64(fd, bp->b_addr, bp->b_bcount, LIBXFS_BBTOOFF64(bp->b_blk= no)); + sts =3D pwrite64(fd, buf, len, offset); if (sts < 0) { - error =3D errno; + int error =3D errno; fprintf(stderr, _("%s: pwrite64 failed: %s\n"), progname, strerror(error)); - if (bp->b_flags & LIBXFS_B_EXIT) + if (flags & LIBXFS_B_EXIT) exit(1); return error; - } else if (sts !=3D bp->b_bcount) { - fprintf(stderr, _("%s: error - wrote only %d of %d bytes\n"), - progname, sts, bp->b_bcount); - if (bp->b_flags & LIBXFS_B_EXIT) + } else if (sts !=3D len) { + fprintf(stderr, _("%s: error - pwrite64 only %d of %d bytes\n"), + progname, sts, len); + if (flags & LIBXFS_B_EXIT) exit(1); return EIO; } + return 0; +} + +int +libxfs_writebufr(xfs_buf_t *bp) +{ + int fd =3D libxfs_device_to_fd(bp->b_dev); + int error =3D 0; + + if (!(bp->b_flags & LIBXFS_B_DISCONTIG)) { + error =3D __write_buf(fd, bp->b_addr, bp->b_bcount, + LIBXFS_BBTOOFF64(bp->b_blkno), bp->b_flags); + } else { + int i; + char *buf =3D bp->b_addr; + + for (i =3D 0; i < bp->b_nmaps; i++) { + off64_t offset =3D LIBXFS_BBTOOFF64(bp->b_map[i].bm_bn); + int len =3D BBTOB(bp->b_map[i].bm_len); + + error =3D __write_buf(fd, buf, len, offset, bp->b_flags); + if (error) { + bp->b_error =3D error; + break; + } + buf +=3D len; + offset +=3D len; + } + } + #ifdef IO_DEBUG printf("%lx: %s: wrote %u bytes, blkno=3D%llu(%llu), %p\n", pthread_self(), __FUNCTION__, bp->b_bcount, (long long)LIBXFS_BBTOOFF64(bp->b_blkno), (long long)bp->b_blkno, bp); #endif - bp->b_flags |=3D LIBXFS_B_UPTODATE; - bp->b_flags &=3D ~(LIBXFS_B_DIRTY | LIBXFS_B_EXIT); - return 0; + if (!error) { + bp->b_flags |=3D LIBXFS_B_UPTODATE; + bp->b_flags &=3D ~(LIBXFS_B_DIRTY | LIBXFS_B_EXIT); + } + return error; } =20 int @@ -609,7 +825,7 @@ libxfs_iomove(xfs_buf_t *bp, uint boff, int len, void *= data, int flags) #ifdef IO_DEBUG if (boff + len > bp->b_bcount) { printf("Badness, iomove out of range!\n" - "bp=3D(bno %llu, bytes %u) range=3D(boff %u, bytes %u)\n", + "bp=3D(bno 0x%llx, bytes %u) range=3D(boff %u, bytes %u)\n", (long long)bp->b_blkno, bp->b_bcount, boff, len); abort(); } @@ -742,7 +958,10 @@ libxfs_iget(xfs_mount_t *mp, xfs_trans_t *tp, xfs_ino_= t ino, uint lock_flags, fprintf(stderr, "%s: allocated inode, ino=3D%llu(%llu), %p\n", __FUNCTION__, (unsigned long long)ino, bno, ip); #endif - if ((error =3D libxfs_iread(mp, tp, ino, ip, bno))) { + ip->i_ino =3D ino; + ip->i_mount =3D mp; + error =3D xfs_iread(mp, tp, ip, bno); + if (error) { cache_node_purge(libxfs_icache, &ino, (struct cache_node *)ip); ip =3D NULL; diff --git a/libxfs/trans.c b/libxfs/trans.c index a745d51..7cb3c8c 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -252,7 +252,7 @@ xfs_trans_log_inode( * this coordination mechanism. */ flags |=3D ip->i_itemp->ili_last_fields; - ip->i_itemp->ili_format.ilf_fields |=3D flags; + ip->i_itemp->ili_fields |=3D flags; } =20 /* @@ -338,7 +338,7 @@ libxfs_trans_binval( if (bip->bli_flags & XFS_BLI_STALE) return; XFS_BUF_UNDELAYWRITE(bp); - XFS_BUF_STALE(bp); + xfs_buf_stale(bp); bip->bli_flags |=3D XFS_BLI_STALE; bip->bli_flags &=3D ~XFS_BLI_DIRTY; bip->bli_format.blf_flags &=3D ~XFS_BLF_INODE_BUF; @@ -383,22 +383,20 @@ libxfs_trans_bhold( } =20 xfs_buf_t * -libxfs_trans_get_buf( +libxfs_trans_get_buf_map( xfs_trans_t *tp, dev_t dev, - xfs_daddr_t d, - int len, + struct xfs_buf_map *map, + int nmaps, uint f) { xfs_buf_t *bp; xfs_buf_log_item_t *bip; - xfs_buftarg_t bdev; =20 if (tp =3D=3D NULL) - return libxfs_getbuf(dev, d, len); + return libxfs_getbuf_map(dev, map, nmaps); =20 - bdev.dev =3D dev; - bp =3D xfs_trans_buf_item_match(tp, &bdev, d, len); + bp =3D xfs_trans_buf_item_match(tp, dev, map, nmaps); if (bp !=3D NULL) { ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) =3D=3D tp); bip =3D XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); @@ -407,7 +405,7 @@ libxfs_trans_get_buf( return bp; } =20 - bp =3D libxfs_getbuf(dev, d, len); + bp =3D libxfs_getbuf_map(dev, map, nmaps); if (bp =3D=3D NULL) return NULL; #ifdef XACT_DEBUG @@ -432,15 +430,13 @@ libxfs_trans_getsb( { xfs_buf_t *bp; xfs_buf_log_item_t *bip; - xfs_buftarg_t bdev; - int len; + int len =3D XFS_FSS_TO_BB(mp, 1); + DEFINE_SINGLE_BUF_MAP(map, XFS_SB_DADDR, len); =20 if (tp =3D=3D NULL) return libxfs_getsb(mp, flags); =20 - bdev.dev =3D mp->m_dev; - len =3D XFS_FSS_TO_BB(mp, 1); - bp =3D xfs_trans_buf_item_match(tp, &bdev, XFS_SB_DADDR, len); + bp =3D xfs_trans_buf_item_match(tp, mp->m_dev, &map, 1); if (bp !=3D NULL) { ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) =3D=3D tp); bip =3D XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); @@ -465,24 +461,24 @@ libxfs_trans_getsb( } =20 int -libxfs_trans_read_buf( +libxfs_trans_read_buf_map( xfs_mount_t *mp, xfs_trans_t *tp, dev_t dev, - xfs_daddr_t blkno, - int len, + struct xfs_buf_map *map, + int nmaps, uint flags, - xfs_buf_t **bpp) + xfs_buf_t **bpp, + const struct xfs_buf_ops *ops) { xfs_buf_t *bp; xfs_buf_log_item_t *bip; - xfs_buftarg_t bdev; int error; =20 *bpp =3D NULL; =20 if (tp =3D=3D NULL) { - bp =3D libxfs_readbuf(dev, blkno, len, flags); + bp =3D libxfs_readbuf_map(dev, map, nmaps, flags); if (!bp) { return (flags & XBF_TRYLOCK) ? EAGAIN : XFS_ERROR(ENOMEM); @@ -492,8 +488,7 @@ libxfs_trans_read_buf( goto done; } =20 - bdev.dev =3D dev; - bp =3D xfs_trans_buf_item_match(tp, &bdev, blkno, len); + bp =3D xfs_trans_buf_item_match(tp, dev, map, nmaps); if (bp !=3D NULL) { ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) =3D=3D tp); ASSERT(XFS_BUF_FSPRIVATE(bp, void *) !=3D NULL); @@ -502,7 +497,7 @@ libxfs_trans_read_buf( goto done; } =20 - bp =3D libxfs_readbuf(dev, blkno, len, flags); + bp =3D libxfs_readbuf_map(dev, map, nmaps, flags); if (!bp) { return (flags & XBF_TRYLOCK) ? EAGAIN : XFS_ERROR(ENOMEM); @@ -588,7 +583,7 @@ inode_item_done( mp =3D iip->ili_item.li_mountp; ASSERT(ip !=3D NULL); =20 - if (!(iip->ili_format.ilf_fields & XFS_ILOG_ALL)) { + if (!(iip->ili_fields & XFS_ILOG_ALL)) { ip->i_transp =3D NULL; /* disassociate from transaction */ iip->ili_flags =3D 0; /* reset all flags */ goto ili_done; @@ -597,9 +592,9 @@ inode_item_done( /* * Get the buffer containing the on-disk inode. */ - error =3D xfs_itobp(mp, NULL, ip, &dip, &bp, 0); + error =3D xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, 0, 0); if (error) { - fprintf(stderr, _("%s: warning - itobp failed (%d)\n"), + fprintf(stderr, _("%s: warning - imap_to_bp failed (%d)\n"), progname, error); goto ili_done; } @@ -674,6 +669,7 @@ trans_committed( struct xfs_log_item *lip =3D lidp->lid_item; =20 xfs_trans_del_item(lip); + if (lip->li_type =3D=3D XFS_LI_BUF) buf_item_done((xfs_buf_log_item_t *)lip); else if (lip->li_type =3D=3D XFS_LI_INODE) diff --git a/libxfs/util.c b/libxfs/util.c index bffbac0..2ad4bfd 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -50,130 +50,6 @@ libxfs_trans_ichgtime( } =20 /* - * Given a mount structure and an inode number, return a pointer - * to a newly allocated in-core inode coresponding to the given - * inode number. - * - * Initialize the inode's attributes and extent pointers if it - * already has them (it will not if the inode has no links). - * - * NOTE: this has slightly different behaviour to the kernel in - * that this version requires the already allocated *ip being=20 - * passed in while the kernel version does the allocation and=20 - * returns it in **ip. - */ -int -libxfs_iread( - xfs_mount_t *mp, - xfs_trans_t *tp, - xfs_ino_t ino, - xfs_inode_t *ip, - xfs_daddr_t bno) -{ - xfs_buf_t *bp; - xfs_dinode_t *dip; - int error; - - ip->i_ino =3D ino; - ip->i_mount =3D mp; - - /* - * Fill in the location information in the in-core inode. - */ - error =3D xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, 0); - if (error) - return error; - - /* - * Get pointers to the on-disk inode and the buffer containing it. - */ - error =3D xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp, XBF_LOCK, 0); - if (error) - return error; - dip =3D (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); - - /* - * If we got something that isn't an inode it means someone - * (nfs or dmi) has a stale handle. - */ - if (be16_to_cpu(dip->di_magic) !=3D XFS_DINODE_MAGIC) { - xfs_trans_brelse(tp, bp); - return EINVAL; - } - - /* - * If the on-disk inode is already linked to a directory - * entry, copy all of the inode into the in-core inode. - * xfs_iformat() handles copying in the inode format - * specific information. - * Otherwise, just get the truly permanent information. - */ - if (dip->di_mode) { - xfs_dinode_from_disk(&ip->i_d, dip); - error =3D xfs_iformat(ip, dip); - if (error) { - xfs_trans_brelse(tp, bp); - return error; - } - } else { - ip->i_d.di_magic =3D be16_to_cpu(dip->di_magic); - ip->i_d.di_version =3D dip->di_version; - ip->i_d.di_gen =3D be32_to_cpu(dip->di_gen); - ip->i_d.di_flushiter =3D be16_to_cpu(dip->di_flushiter); - /* - * Make sure to pull in the mode here as well in - * case the inode is released without being used. - * This ensures that xfs_inactive() will see that - * the inode is already free and not try to mess - * with the uninitialized part of it. - */ - ip->i_d.di_mode =3D 0; - /* - * Initialize the per-fork minima and maxima for a new - * inode here. xfs_iformat will do it for old inodes. - */ - ip->i_df.if_ext_max =3D - XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); - } - - /* - * The inode format changed when we moved the link count and - * made it 32 bits long. If this is an old format inode, - * convert it in memory to look like a new one. If it gets - * flushed to disk we will convert back before flushing or - * logging it. We zero out the new projid_lo/hi field and the old link - * count field. We'll handle clearing the pad field (the remains - * of the old uuid field) when we actually convert the inode to - * the new format. We don't change the version number so that we - * can distinguish this from a real new format inode. - */ - if (ip->i_d.di_version =3D=3D 1) { - ip->i_d.di_nlink =3D ip->i_d.di_onlink; - ip->i_d.di_onlink =3D 0; - xfs_set_projid(&ip->i_d, 0); - } - - ip->i_delayed_blks =3D 0; - ip->i_size =3D ip->i_d.di_size; - - /* - * Use xfs_trans_brelse() to release the buffer containing the - * on-disk inode, because it was acquired with xfs_trans_read_buf() - * in xfs_itobp() above. If tp is NULL, this is just a normal - * brelse(). If we're within a transaction, then xfs_trans_brelse() - * will only release the buffer if it is not dirty within the - * transaction. It will be OK to release the buffer in this case, - * because inodes on disk are never destroyed and we will be - * locking the new in-core inode before putting it in the hash - * table where other processes can find it. Thus we don't have - * to worry about the inode being changed just because we released - * the buffer. - */ - xfs_trans_brelse(tp, bp); - return 0; -} - -/* * Allocate an inode on disk and return a copy of its in-core version. * Set mode, nlink, and rdev appropriately within the inode. * The uid and gid for the inode are set according to the contents of @@ -193,7 +69,6 @@ libxfs_ialloc( struct fsxattr *fsx, int okalloc, xfs_buf_t **ialloc_context, - boolean_t *call_again, xfs_inode_t **ipp) { xfs_ino_t ino; @@ -206,10 +81,10 @@ libxfs_ialloc( * the on-disk inode to be allocated. */ error =3D xfs_dialloc(tp, pip ? pip->i_ino : 0, mode, okalloc, - ialloc_context, call_again, &ino); + ialloc_context, &ino); if (error !=3D 0) return error; - if (*call_again || ino =3D=3D NULLFSINO) { + if (*ialloc_context || ino =3D=3D NULLFSINO) { *ipp =3D NULL; return 0; } @@ -455,7 +330,7 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp) dip->di_onlink =3D 0; memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); memset(&(dip->di_pad[0]), 0, sizeof(dip->di_pad)); - ASSERT(xfs_get_projid(ip->i_d) =3D=3D 0); + ASSERT(xfs_get_projid(&ip->i_d) =3D=3D 0); } } =20 @@ -560,7 +435,7 @@ libxfs_alloc_file_space( error =3D 0; imapp =3D &imaps[0]; reccount =3D 1; - xfs_bmapi_flags =3D XFS_BMAPI_WRITE | (alloc_type ? XFS_BMAPI_PREALLOC : = 0); + xfs_bmapi_flags =3D alloc_type ? XFS_BMAPI_PREALLOC : 0; mp =3D ip->i_mount; startoffset_fsb =3D XFS_B_TO_FSBT(mp, offset); allocatesize_fsb =3D XFS_B_TO_FSB(mp, count); @@ -578,7 +453,7 @@ libxfs_alloc_file_space( xfs_trans_ihold(tp, ip); =20 xfs_bmap_init(&free_list, &firstfsb); - error =3D xfs_bmapi(tp, ip, startoffset_fsb, allocatesize_fsb, + error =3D xfs_bmapi_write(tp, ip, startoffset_fsb, allocatesize_fsb, xfs_bmapi_flags, &firstfsb, 0, imapp, &reccount, &free_list); =20 @@ -617,56 +492,6 @@ libxfs_log2_roundup(unsigned int i) } =20 /* - * Get a buffer for the dir/attr block, fill in the contents. - * Don't check magic number, the caller will (it's xfs_repair). - * - * Originally from xfs_da_btree.c in the kernel, but only used - * in userspace so it now resides here. - */ -int -libxfs_da_read_bufr( - xfs_trans_t *trans, - xfs_inode_t *dp, - xfs_dablk_t bno, - xfs_daddr_t mappedbno, - xfs_dabuf_t **bpp, - int whichfork) -{ - return xfs_da_do_buf(trans, dp, bno, &mappedbno, bpp, whichfork, 2, - (inst_t *)__return_address); -} - -/* - * Hold dabuf at transaction commit. - * - * Originally from xfs_da_btree.c in the kernel, but only used - * in userspace so it now resides here. - */ -void -libxfs_da_bhold(xfs_trans_t *tp, xfs_dabuf_t *dabuf) -{ - int i; - - for (i =3D 0; i < dabuf->nbuf; i++) - xfs_trans_bhold(tp, dabuf->bps[i]); -} - -/* - * Join dabuf to transaction. - * - * Originally from xfs_da_btree.c in the kernel, but only used - * in userspace so it now resides here. - */ -void -libxfs_da_bjoin(xfs_trans_t *tp, xfs_dabuf_t *dabuf) -{ - int i; - - for (i =3D 0; i < dabuf->nbuf; i++) - xfs_trans_bjoin(tp, dabuf->bps[i]); -} - -/* * Wrapper around call to libxfs_ialloc. Takes care of committing and * allocating a new transaction as needed. * @@ -684,21 +509,25 @@ libxfs_inode_alloc( struct fsxattr *fsx, xfs_inode_t **ipp) { - boolean_t call_again; int i; xfs_buf_t *ialloc_context; xfs_inode_t *ip; xfs_trans_t *ntp; int error; =20 - call_again =3D B_FALSE; ialloc_context =3D (xfs_buf_t *)0; error =3D libxfs_ialloc(*tp, pip, mode, nlink, rdev, cr, fsx, - 1, &ialloc_context, &call_again, &ip); - if (error) + 1, &ialloc_context, &ip); + if (error) { + *ipp =3D NULL; return error; + } + if (!ialloc_context && !ip) { + *ipp =3D NULL; + return XFS_ERROR(ENOSPC); + } =20 - if (call_again) { + if (ialloc_context) { xfs_trans_bhold(*tp, ialloc_context); ntp =3D xfs_trans_dup(*tp); xfs_trans_commit(*tp, 0); @@ -710,8 +539,7 @@ libxfs_inode_alloc( } xfs_trans_bjoin(*tp, ialloc_context); error =3D libxfs_ialloc(*tp, pip, mode, nlink, rdev, cr, - fsx, 1, &ialloc_context, - &call_again, &ip); + fsx, 1, &ialloc_context, &ip); if (!ip) error =3D ENOSPC; if (error) diff --git a/libxfs/xfs.h b/libxfs/xfs.h index b3f8378..6213284 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -43,14 +43,21 @@ */ =20 #include +#include "xfs_dir2_priv.h" =20 -typedef struct { dev_t dev; } xfs_buftarg_t; +#undef ASSERT +#define ASSERT(ex) assert(ex) =20 -typedef __uint32_t uint_t; +typedef __uint32_t uint_t; typedef __uint32_t inst_t; /* an instruction */ =20 +#ifndef EWRONGFS +#define EWRONGFS EINVAL +#endif =20 -#define m_ddev_targp m_dev +#define m_ddev_targp m_dev +#define m_logdev_targp m_logdev +#define m_rtdev_targp m_rtdev #define xfs_error_level 0 =20 #define STATIC static @@ -64,10 +71,11 @@ typedef __uint32_t inst_t; /* an instruction */ =20 #define IHOLD(ip) ((void) 0) =20 -#define XFS_CORRUPTION_ERROR(e,l,mp,m) ((void) 0) +/* stop unused var warnings by assigning mp to itself */ +#define XFS_CORRUPTION_ERROR(e,l,mp,m) do { (mp) =3D (mp); } while (0) +#define XFS_ERROR_REPORT(e,l,mp) do { (mp) =3D (mp); } while (0) #define XFS_QM_DQATTACH(mp,ip,flags) 0 #define XFS_ERROR(e) (e) -#define XFS_ERROR_REPORT(e,l,mp) ((void) 0) #define XFS_ERRLEVEL_LOW 1 #define XFS_FORCED_SHUTDOWN(mp) 0 #define XFS_ILOCK_EXCL 0 @@ -124,35 +132,6 @@ static inline int __do_div(unsigned long long *n, unsi= gned base) ({ type __x =3D (x); type __y =3D (y); __x > __y ? __x: __y; }) =20 =20 -static inline __uint32_t __get_unaligned_be32(const __uint8_t *p) -{ - return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; -} - -static inline __uint64_t get_unaligned_be64(void *p) -{ - return (__uint64_t)__get_unaligned_be32(p) << 32 | - __get_unaligned_be32(p + 4); -} - -static inline void __put_unaligned_be16(__uint16_t val, __uint8_t *p) -{ - *p++ =3D val >> 8; - *p++ =3D val; -} - -static inline void __put_unaligned_be32(__uint32_t val, __uint8_t *p) -{ - __put_unaligned_be16(val >> 16, p); - __put_unaligned_be16(val, p + 2); -} - -static inline void put_unaligned_be64(__uint64_t val, void *p) -{ - __put_unaligned_be32(val >> 32, p); - __put_unaligned_be32(val, p + 4); -} - =20 static inline __attribute__((const)) int is_power_of_2(unsigned long n) @@ -191,10 +170,11 @@ roundup_pow_of_two(uint v) #define XBF_LOCK XFS_BUF_LOCK #define XBF_TRYLOCK XFS_BUF_TRYLOCK #define XBF_DONT_BLOCK 0 +#define XBF_UNMAPPED 0 #define XFS_BUF_GETERROR(bp) 0 #define XFS_BUF_DONE(bp) ((bp)->b_flags |=3D LIBXFS_B_UPTODATE) #define XFS_BUF_ISDONE(bp) ((bp)->b_flags & LIBXFS_B_UPTODATE) -#define XFS_BUF_STALE(bp) ((bp)->b_flags |=3D LIBXFS_B_STALE) +#define xfs_buf_stale(bp) ((bp)->b_flags |=3D LIBXFS_B_STALE) #define XFS_BUF_UNDELAYWRITE(bp) ((bp)->b_flags &=3D ~LIBXFS_B_DIRTY) #define XFS_BUF_SET_VTYPE(a,b) ((void) 0) #define XFS_BUF_SET_VTYPE_REF(a,b,c) ((void) 0) @@ -260,6 +240,8 @@ roundup_pow_of_two(uint v) #define xfs_trans_log_inode libxfs_trans_log_inode #define xfs_trans_mod_sb libxfs_trans_mod_sb #define xfs_trans_read_buf libxfs_trans_read_buf +#define xfs_trans_read_buf_map libxfs_trans_read_buf_map +#define xfs_trans_get_buf_map libxfs_trans_get_buf_map #define xfs_trans_reserve libxfs_trans_reserve =20 #define xfs_trans_get_block_res(tp) 1 @@ -268,12 +250,16 @@ roundup_pow_of_two(uint v) #define xfs_trans_agflist_delta(tp, d) #define xfs_trans_agbtree_delta(tp, d) =20 -#define xfs_buf_readahead(a,b,c) ((void) 0) /* no readahead */ -#define xfs_btree_reada_bufl(m,fsb,c) ((void) 0) -#define xfs_btree_reada_bufs(m,fsb,c,x) ((void) 0) -#define xfs_buftrace(x,y) ((void) 0) /* debug only */ +#define xfs_buf_readahead(a,b,c,ops) ((void) 0) /* no readahead */ +#define xfs_buf_readahead_map(a,b,c,ops) ((void) 0) /* no readahead */ +#define xfs_btree_reada_bufl(m,fsb,c,ops) ((void) 0) +#define xfs_btree_reada_bufs(m,fsb,c,x,ops) ((void) 0) +#define xfs_buftrace(x,y) ((void) 0) /* debug only */ =20 #define xfs_cmn_err(tag,level,mp,fmt,args...) cmn_err(level,fmt, ## args) +#define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) +#define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) +#define xfs_alert_tag(mp,tag,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) =20 #define xfs_dir2_trace_args(where, args) ((void) 0) #define xfs_dir2_trace_args_b(where, args, bp) ((void) 0) @@ -289,15 +275,28 @@ roundup_pow_of_two(uint v) #define xfs_initialize_perag_icache(pag) ((void) 0) =20 #define xfs_ilock(ip,mode) ((void) 0) +#define xfs_ilock_nowait(ip,mode) ((void) 0) +#define xfs_ilock_demote(ip,mode) ((void) 0) #define xfs_iunlock(ip,mode) ((void) 0) +#define xfs_ilock_map_shared(ip,mode) ((void) 0) +#define xfs_iunlock_map_shared(ip,mode) ((void) 0) +#define __xfs_flock(ip) ((void) 0) =20 /* space allocation */ -#define xfs_alloc_busy_search(tp,ag,b,len) 0 +#define xfs_extent_busy_reuse(mp,ag,bno,len,user) ((void) 0) +#define xfs_extent_busy_insert(tp,ag,bno,len,flags) ((void) 0) +#define xfs_extent_busy_trim(args,fbno,flen,bno,len) \ +do { \ + *(bno) =3D (fbno); \ + *(len) =3D (flen); \ +} while (0) + /* avoid unused variable warning */ #define xfs_alloc_busy_insert(tp,ag,b,len) ({ \ xfs_agnumber_t __foo =3D ag; \ __foo =3D 0; \ }) + #define xfs_rotorstep 1 #define xfs_bmap_rtalloc(a) (ENOSYS) #define xfs_rtpick_extent(mp,tp,len,p) (ENOSYS) @@ -306,6 +305,15 @@ roundup_pow_of_two(uint v) #define xfs_filestream_lookup_ag(ip) (0) #define xfs_filestream_new_ag(ip,ag) (0) =20 +#define xfs_log_force(mp,flags) ((void) 0) +#define XFS_LOG_SYNC 1 + +/* quota bits */ +#define xfs_trans_mod_dquot_byino(t,i,f,d) ((void) 0) +#define xfs_trans_reserve_quota_nblks(t,i,b,n,f) (0) +#define xfs_trans_unreserve_quota_nblks(t,i,b,n,f) ((void) 0) +#define xfs_qm_dqattach(i,f) (0) + /* * Prototypes for kernel static functions that are aren't in their * associated header files @@ -318,14 +326,20 @@ int xfs_attr_rmtval_get(struct xfs_da_args *); void xfs_bmap_del_free(xfs_bmap_free_t *, xfs_bmap_free_item_t *, xfs_bmap_free_item_t *); =20 -/* xfs_da_btree.c */ -int xfs_da_do_buf(xfs_trans_t *, xfs_inode_t *, xfs_dablk_t, xfs_daddr_t = *, - xfs_dabuf_t **, int, int, inst_t *); - /* xfs_inode.c */ void xfs_iflush_fork(xfs_inode_t *, xfs_dinode_t *, xfs_inode_log_item_t *, int, xfs_buf_t *); -int xfs_iformat(xfs_inode_t *, xfs_dinode_t *); +/* + * For regular files we only update the on-disk filesize when actually + * writing data back to disk. Until then only the copy in the VFS inode + * is uptodate. + */ +static inline xfs_fsize_t XFS_ISIZE(struct xfs_inode *ip) +{ + if (S_ISREG(ip->i_d.di_mode)) + return ip->i_size; + return ip->i_d.di_size; +} =20 /* xfs_mount.c */ int xfs_initialize_perag_data(xfs_mount_t *, xfs_agnumber_t); @@ -348,8 +362,8 @@ void xfs_buf_item_init (xfs_buf_t *, xfs_mount_t *); void xfs_buf_item_log (xfs_buf_log_item_t *, uint, uint); =20 /* xfs_trans_buf.c */ -xfs_buf_t *xfs_trans_buf_item_match (xfs_trans_t *, xfs_buftarg_t *, - xfs_daddr_t, int); +xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, dev_t, + struct xfs_buf_map *, int); =20 /* local source files */ int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index a76512d..61cdc6c 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -22,19 +22,11 @@ #define XFSA_FIXUP_BNO_OK 1 #define XFSA_FIXUP_CNT_OK 2 =20 -/* - * Prototypes for per-ag allocation routines - */ - STATIC int xfs_alloc_ag_vextent_exact(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_near(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_size(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_small(xfs_alloc_arg_t *, - xfs_btree_cur_t *, xfs_agblock_t *, xfs_extlen_t *, int *); - -/* - * Internal functions. - */ + xfs_btree_cur_t *, xfs_agblock_t *, xfs_extlen_t *, int *); =20 /* * Lookup the record equal to [bno, len] in the btree given by cur. @@ -55,7 +47,7 @@ xfs_alloc_lookup_eq( * Lookup the first record greater than or equal to [bno, len] * in the btree given by cur. */ -STATIC int /* error */ +int /* error */ xfs_alloc_lookup_ge( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t bno, /* starting block of extent */ @@ -71,7 +63,7 @@ xfs_alloc_lookup_ge( * Lookup the first record less than or equal to [bno, len] * in the btree given by cur. */ -STATIC int /* error */ +int /* error */ xfs_alloc_lookup_le( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t bno, /* starting block of extent */ @@ -104,7 +96,7 @@ xfs_alloc_update( /* * Get the data from the pointed-to record. */ -STATIC int /* error */ +int /* error */ xfs_alloc_get_rec( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t *bno, /* output: starting block of extent */ @@ -128,27 +120,28 @@ xfs_alloc_get_rec( */ STATIC void xfs_alloc_compute_aligned( + xfs_alloc_arg_t *args, /* allocation argument structure */ xfs_agblock_t foundbno, /* starting block in found extent */ xfs_extlen_t foundlen, /* length in found extent */ - xfs_extlen_t alignment, /* alignment for allocation */ - xfs_extlen_t minlen, /* minimum length for allocation */ xfs_agblock_t *resbno, /* result block number */ xfs_extlen_t *reslen) /* result length */ { xfs_agblock_t bno; - xfs_extlen_t diff; xfs_extlen_t len; =20 - if (alignment > 1 && foundlen >=3D minlen) { - bno =3D roundup(foundbno, alignment); - diff =3D bno - foundbno; - len =3D diff >=3D foundlen ? 0 : foundlen - diff; + /* Trim busy sections out of found extent */ + xfs_extent_busy_trim(args, foundbno, foundlen, &bno, &len); + + if (args->alignment > 1 && len >=3D args->minlen) { + xfs_agblock_t aligned_bno =3D roundup(bno, args->alignment); + xfs_extlen_t diff =3D aligned_bno - bno; + + *resbno =3D aligned_bno; + *reslen =3D diff >=3D len ? 0 : len - diff; } else { - bno =3D foundbno; - len =3D foundlen; + *resbno =3D bno; + *reslen =3D len; } - *resbno =3D bno; - *reslen =3D len; } =20 /* @@ -262,7 +255,6 @@ xfs_alloc_fix_minleft( return 1; agf =3D XFS_BUF_TO_AGF(args->agbp); diff =3D be32_to_cpu(agf->agf_freeblks) - + be32_to_cpu(agf->agf_flcount) - args->len - args->minleft; if (diff >=3D 0) return 1; @@ -418,6 +410,60 @@ xfs_alloc_fixup_trees( return 0; } =20 +static void +xfs_agfl_verify( + struct xfs_buf *bp) +{ +#ifdef WHEN_CRCS_COME_ALONG + /* + * we cannot actually do any verification of the AGFL because mkfs does + * not initialise the AGFL to zero or NULL. Hence the only valid part of + * the AGFL is what the AGF says is active. We can't get to the AGF, so + * we can't verify just those entries are valid. + * + * This problem goes away when the CRC format change comes along as that + * requires the AGFL to be initialised by mkfs. At that point, we can + * verify the blocks in the agfl -active or not- lie within the bounds + * of the AG. Until then, just leave this check ifdef'd out. + */ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_agfl *agfl =3D XFS_BUF_TO_AGFL(bp); + int agfl_ok =3D 1; + + int i; + + for (i =3D 0; i < XFS_AGFL_SIZE(mp); i++) { + if (be32_to_cpu(agfl->agfl_bno[i]) =3D=3D NULLAGBLOCK || + be32_to_cpu(agfl->agfl_bno[i]) >=3D mp->m_sb.sb_agblocks) + agfl_ok =3D 0; + } + + if (!agfl_ok) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agfl); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +#endif +} + +static void +xfs_agfl_write_verify( + struct xfs_buf *bp) +{ + xfs_agfl_verify(bp); +} + +static void +xfs_agfl_read_verify( + struct xfs_buf *bp) +{ + xfs_agfl_verify(bp); +} + +const struct xfs_buf_ops xfs_agfl_buf_ops =3D { + .verify_read =3D xfs_agfl_read_verify, + .verify_write =3D xfs_agfl_write_verify, +}; + /* * Read in the allocation group free block array. */ @@ -435,16 +481,36 @@ xfs_alloc_read_agfl( error =3D xfs_trans_read_buf( mp, tp, mp->m_ddev_targp, XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0, &bp); + XFS_FSS_TO_BB(mp, 1), 0, &bp, &xfs_agfl_buf_ops); if (error) return error; - ASSERT(bp); - ASSERT(!XFS_BUF_GETERROR(bp)); - XFS_BUF_SET_VTYPE_REF(bp, B_FS_AGFL, XFS_AGFL_REF); + ASSERT(!xfs_buf_geterror(bp)); + xfs_buf_set_ref(bp, XFS_AGFL_REF); *bpp =3D bp; return 0; } =20 +STATIC int +xfs_alloc_update_counters( + struct xfs_trans *tp, + struct xfs_perag *pag, + struct xfs_buf *agbp, + long len) +{ + struct xfs_agf *agf =3D XFS_BUF_TO_AGF(agbp); + + pag->pagf_freeblks +=3D len; + be32_add_cpu(&agf->agf_freeblks, len); + + xfs_trans_agblocks_delta(tp, len); + if (unlikely(be32_to_cpu(agf->agf_freeblks) > + be32_to_cpu(agf->agf_length))) + return EFSCORRUPTED; + + xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS); + return 0; +} + /* * Allocation group level functions. */ @@ -486,49 +552,36 @@ xfs_alloc_ag_vextent( ASSERT(0); /* NOTREACHED */ } - if (error) + + if (error || args->agbno =3D=3D NULLAGBLOCK) return error; - /* - * If the allocation worked, need to change the agf structure - * (and log it), and the superblock. - */ - if (args->agbno !=3D NULLAGBLOCK) { - xfs_agf_t *agf; /* allocation group freelist header */ - long slen =3D (long)args->len; =20 - ASSERT(args->len >=3D args->minlen && args->len <=3D args->maxlen); - ASSERT(!(args->wasfromfl) || !args->isfl); - ASSERT(args->agbno % args->alignment =3D=3D 0); - if (!(args->wasfromfl)) { - - agf =3D XFS_BUF_TO_AGF(args->agbp); - be32_add_cpu(&agf->agf_freeblks, -(args->len)); - xfs_trans_agblocks_delta(args->tp, - -((long)(args->len))); - args->pag->pagf_freeblks -=3D args->len; - ASSERT(be32_to_cpu(agf->agf_freeblks) <=3D - be32_to_cpu(agf->agf_length)); - xfs_alloc_log_agf(args->tp, args->agbp, - XFS_AGF_FREEBLKS); - /* - * Search the busylist for these blocks and mark the - * transaction as synchronous if blocks are found. This - * avoids the need to block due to a synchronous log - * force to ensure correct ordering as the synchronous - * transaction will guarantee that for us. - */ - if (xfs_alloc_busy_search(args->mp, args->agno, - args->agbno, args->len)) - xfs_trans_set_sync(args->tp); - } - if (!args->isfl) - xfs_trans_mod_sb(args->tp, - args->wasdel ? XFS_TRANS_SB_RES_FDBLOCKS : - XFS_TRANS_SB_FDBLOCKS, -slen); - XFS_STATS_INC(xs_allocx); - XFS_STATS_ADD(xs_allocb, args->len); + ASSERT(args->len >=3D args->minlen); + ASSERT(args->len <=3D args->maxlen); + ASSERT(!args->wasfromfl || !args->isfl); + ASSERT(args->agbno % args->alignment =3D=3D 0); + + if (!args->wasfromfl) { + error =3D xfs_alloc_update_counters(args->tp, args->pag, + args->agbp, + -((long)(args->len))); + if (error) + return error; + + ASSERT(!xfs_extent_busy_search(args->mp, args->agno, + args->agbno, args->len)); } - return 0; + + if (!args->isfl) { + xfs_trans_mod_sb(args->tp, args->wasdel ? + XFS_TRANS_SB_RES_FDBLOCKS : + XFS_TRANS_SB_FDBLOCKS, + -((long)(args->len))); + } + + XFS_STATS_INC(xs_allocx); + XFS_STATS_ADD(xs_allocb, args->len); + return error; } =20 /* @@ -543,17 +596,16 @@ xfs_alloc_ag_vextent_exact( { xfs_btree_cur_t *bno_cur;/* by block-number btree cursor */ xfs_btree_cur_t *cnt_cur;/* by count btree cursor */ - xfs_agblock_t end; /* end of allocated extent */ int error; xfs_agblock_t fbno; /* start block of found extent */ - xfs_agblock_t fend; /* end block of found extent */ xfs_extlen_t flen; /* length of found extent */ + xfs_agblock_t tbno; /* start block of trimmed extent */ + xfs_extlen_t tlen; /* length of trimmed extent */ + xfs_agblock_t tend; /* end block of trimmed extent */ int i; /* success/failure of operation */ - xfs_agblock_t maxend; /* end of maximal extent */ - xfs_agblock_t minend; /* end of minimal extent */ - xfs_extlen_t rlen; /* length of returned extent */ =20 ASSERT(args->alignment =3D=3D 1); + /* * Allocate/initialize a cursor for the by-number freespace btree. */ @@ -579,14 +631,22 @@ xfs_alloc_ag_vextent_exact( goto error0; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, error0); ASSERT(fbno <=3D args->agbno); - minend =3D args->agbno + args->minlen; - maxend =3D args->agbno + args->maxlen; - fend =3D fbno + flen; =20 /* - * Give up if the freespace isn't long enough for the minimum request. + * Check for overlapping busy extents. + */ + xfs_extent_busy_trim(args, fbno, flen, &tbno, &tlen); + + /* + * Give up if the start of the extent is busy, or the freespace isn't + * long enough for the minimum request. */ - if (fend < minend) + if (tbno > args->agbno) + goto not_found; + if (tlen < args->minlen) + goto not_found; + tend =3D tbno + tlen; + if (tend < args->agbno + args->minlen) goto not_found; =20 /* @@ -595,18 +655,16 @@ xfs_alloc_ag_vextent_exact( * * Fix the length according to mod and prod if given. */ - end =3D XFS_AGBLOCK_MIN(fend, maxend); - args->len =3D end - args->agbno; + args->len =3D XFS_AGBLOCK_MIN(tend, args->agbno + args->maxlen) + - args->agbno; xfs_alloc_fix_len(args); if (!xfs_alloc_fix_minleft(args)) goto not_found; =20 - rlen =3D args->len; - ASSERT(args->agbno + rlen <=3D fend); - end =3D args->agbno + rlen; + ASSERT(args->agbno + args->len <=3D tend); =20 /* - * We are allocating agbno for rlen [agbno .. end] + * We are allocating agbno for args->len * Allocate/initialize a cursor for the by-size btree. */ cnt_cur =3D xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, @@ -619,8 +677,10 @@ xfs_alloc_ag_vextent_exact( xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR); goto error0; } + xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + args->wasfromfl =3D 0; trace_xfs_alloc_exact_done(args); return 0; @@ -649,11 +709,11 @@ xfs_alloc_find_best_extent( struct xfs_btree_cur **scur, /* searching cursor */ xfs_agblock_t gdiff, /* difference for search comparison */ xfs_agblock_t *sbno, /* extent found by search */ - xfs_extlen_t *slen, - xfs_extlen_t *slena, /* aligned length */ + xfs_extlen_t *slen, /* extent length */ + xfs_agblock_t *sbnoa, /* aligned extent found by search */ + xfs_extlen_t *slena, /* aligned extent length */ int dir) /* 0 =3D search right, 1 =3D search left */ { - xfs_agblock_t bno; xfs_agblock_t new; xfs_agblock_t sdiff; int error; @@ -671,17 +731,16 @@ xfs_alloc_find_best_extent( if (error) goto error0; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, error0); - xfs_alloc_compute_aligned(*sbno, *slen, args->alignment, - args->minlen, &bno, slena); + xfs_alloc_compute_aligned(args, *sbno, *slen, sbnoa, slena); =20 /* * The good extent is closer than this one. */ if (!dir) { - if (bno >=3D args->agbno + gdiff) + if (*sbnoa >=3D args->agbno + gdiff) goto out_use_good; } else { - if (bno <=3D args->agbno - gdiff) + if (*sbnoa <=3D args->agbno - gdiff) goto out_use_good; } =20 @@ -693,8 +752,8 @@ xfs_alloc_find_best_extent( xfs_alloc_fix_len(args); =20 sdiff =3D xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, *sbno, - *slen, &new); + args->alignment, *sbnoa, + *slena, &new); =20 /* * Choose closer size and invalidate other cursor. @@ -744,7 +803,7 @@ xfs_alloc_ag_vextent_near( xfs_agblock_t gtbnoa; /* aligned ... */ xfs_extlen_t gtdiff; /* difference to right side entry */ xfs_extlen_t gtlen; /* length of right side entry */ - xfs_extlen_t gtlena =3D 0; /* aligned ... */ + xfs_extlen_t gtlena; /* aligned ... */ xfs_agblock_t gtnew; /* useful start bno of right side */ int error; /* error code */ int i; /* result code, temporary */ @@ -753,9 +812,10 @@ xfs_alloc_ag_vextent_near( xfs_agblock_t ltbnoa; /* aligned ... */ xfs_extlen_t ltdiff; /* difference to left side entry */ xfs_extlen_t ltlen; /* length of left side entry */ - xfs_extlen_t ltlena =3D 0; /* aligned ... */ + xfs_extlen_t ltlena; /* aligned ... */ xfs_agblock_t ltnew; /* useful start bno of left side */ xfs_extlen_t rlen; /* length of returned extent */ + int forced =3D 0; #if defined(DEBUG) && defined(__KERNEL__) /* * Randomly don't execute the first algorithm. @@ -764,13 +824,20 @@ xfs_alloc_ag_vextent_near( =20 dofirst =3D random32() & 1; #endif + +restart: + bno_cur_lt =3D NULL; + bno_cur_gt =3D NULL; + ltlen =3D 0; + gtlena =3D 0; + ltlena =3D 0; + /* * Get a cursor for the by-size btree. */ cnt_cur =3D xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, args->agno, XFS_BTNUM_CNT); - ltlen =3D 0; - bno_cur_lt =3D bno_cur_gt =3D NULL; + /* * See if there are any free extents as big as maxlen. */ @@ -786,11 +853,13 @@ xfs_alloc_ag_vextent_near( goto error0; if (i =3D=3D 0 || ltlen =3D=3D 0) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + trace_xfs_alloc_near_noentry(args); return 0; } ASSERT(i =3D=3D 1); } args->wasfromfl =3D 0; + /* * First algorithm. * If the requested extent is large wrt the freespaces available @@ -844,8 +913,8 @@ xfs_alloc_ag_vextent_near( if ((error =3D xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) goto error0; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, error0); - xfs_alloc_compute_aligned(ltbno, ltlen, args->alignment, - args->minlen, <bnoa, <lena); + xfs_alloc_compute_aligned(args, ltbno, ltlen, + <bnoa, <lena); if (ltlena < args->minlen) continue; args->len =3D XFS_EXTLEN_MIN(ltlena, args->maxlen); @@ -854,7 +923,7 @@ xfs_alloc_ag_vextent_near( if (args->len < blen) continue; ltdiff =3D xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, ltbno, ltlen, <new); + args->alignment, ltbnoa, ltlena, <new); if (ltnew !=3D NULLAGBLOCK && (args->len > blen || ltdiff < bdiff)) { bdiff =3D ltdiff; @@ -965,8 +1034,8 @@ xfs_alloc_ag_vextent_near( if ((error =3D xfs_alloc_get_rec(bno_cur_lt, <bno, <len, &i))) goto error0; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, error0); - xfs_alloc_compute_aligned(ltbno, ltlen, args->alignment, - args->minlen, <bnoa, <lena); + xfs_alloc_compute_aligned(args, ltbno, ltlen, + <bnoa, <lena); if (ltlena >=3D args->minlen) break; if ((error =3D xfs_btree_decrement(bno_cur_lt, 0, &i))) @@ -981,8 +1050,8 @@ xfs_alloc_ag_vextent_near( if ((error =3D xfs_alloc_get_rec(bno_cur_gt, >bno, >len, &i))) goto error0; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, error0); - xfs_alloc_compute_aligned(gtbno, gtlen, args->alignment, - args->minlen, >bnoa, >lena); + xfs_alloc_compute_aligned(args, gtbno, gtlen, + >bnoa, >lena); if (gtlena >=3D args->minlen) break; if ((error =3D xfs_btree_increment(bno_cur_gt, 0, &i))) @@ -1005,13 +1074,13 @@ xfs_alloc_ag_vextent_near( */ args->len =3D XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); - rlen =3D args->len; ltdiff =3D xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, ltbno, ltlen, <new); + args->alignment, ltbnoa, ltlena, <new); =20 error =3D xfs_alloc_find_best_extent(args, &bno_cur_lt, &bno_cur_gt, - ltdiff, >bno, >len, >lena, + ltdiff, >bno, >len, + >bnoa, >lena, 0 /* search right */); } else { ASSERT(gtlena >=3D args->minlen); @@ -1022,11 +1091,12 @@ xfs_alloc_ag_vextent_near( args->len =3D XFS_EXTLEN_MIN(gtlena, args->maxlen); xfs_alloc_fix_len(args); gtdiff =3D xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, gtbno, gtlen, >new); + args->alignment, gtbnoa, gtlena, >new); =20 error =3D xfs_alloc_find_best_extent(args, &bno_cur_gt, &bno_cur_lt, - gtdiff, <bno, <len, <lena, + gtdiff, <bno, <len, + <bnoa, <lena, 1 /* search left */); } =20 @@ -1038,6 +1108,13 @@ xfs_alloc_ag_vextent_near( * If we couldn't get anything, give up. */ if (bno_cur_lt =3D=3D NULL && bno_cur_gt =3D=3D NULL) { + xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + + if (!forced++) { + trace_xfs_alloc_near_busy(args); + xfs_log_force(args->mp, XFS_LOG_SYNC); + goto restart; + } trace_xfs_alloc_size_neither(args); args->agbno =3D NULLAGBLOCK; return 0; @@ -1072,12 +1149,13 @@ xfs_alloc_ag_vextent_near( return 0; } rlen =3D args->len; - (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, ltbno, - ltlen, <new); + (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, + ltbnoa, ltlena, <new); ASSERT(ltnew >=3D ltbno); - ASSERT(ltnew + rlen <=3D ltbno + ltlen); + ASSERT(ltnew + rlen <=3D ltbnoa + ltlena); ASSERT(ltnew + rlen <=3D be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_leng= th)); args->agbno =3D ltnew; + if ((error =3D xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen, ltnew, rlen, XFSA_FIXUP_BNO_OK))) goto error0; @@ -1120,26 +1198,35 @@ xfs_alloc_ag_vextent_size( int i; /* temp status variable */ xfs_agblock_t rbno; /* returned block number */ xfs_extlen_t rlen; /* length of returned extent */ + int forced =3D 0; =20 +restart: /* * Allocate and initialize a cursor for the by-size btree. */ cnt_cur =3D xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, args->agno, XFS_BTNUM_CNT); bno_cur =3D NULL; + /* * Look for an entry >=3D maxlen+alignment-1 blocks. */ if ((error =3D xfs_alloc_lookup_ge(cnt_cur, 0, args->maxlen + args->alignment - 1, &i))) goto error0; + /* - * If none, then pick up the last entry in the tree unless the - * tree is empty. + * If none or we have busy extents that we cannot allocate from, then + * we have to settle for a smaller extent. In the case that there are + * no large extents, this will return the last entry in the tree unless + * the tree is empty. In the case that there are only busy large + * extents, this will return the largest small extent unless there + * are no smaller extents available. */ - if (!i) { - if ((error =3D xfs_alloc_ag_vextent_small(args, cnt_cur, &fbno, - &flen, &i))) + if (!i || forced > 1) { + error =3D xfs_alloc_ag_vextent_small(args, cnt_cur, + &fbno, &flen, &i); + if (error) goto error0; if (i =3D=3D 0 || flen =3D=3D 0) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); @@ -1147,23 +1234,56 @@ xfs_alloc_ag_vextent_size( return 0; } ASSERT(i =3D=3D 1); + xfs_alloc_compute_aligned(args, fbno, flen, &rbno, &rlen); + } else { + /* + * Search for a non-busy extent that is large enough. + * If we are at low space, don't check, or if we fall of + * the end of the btree, turn off the busy check and + * restart. + */ + for (;;) { + error =3D xfs_alloc_get_rec(cnt_cur, &fbno, &flen, &i); + if (error) + goto error0; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, error0); + + xfs_alloc_compute_aligned(args, fbno, flen, + &rbno, &rlen); + + if (rlen >=3D args->maxlen) + break; + + error =3D xfs_btree_increment(cnt_cur, 0, &i); + if (error) + goto error0; + if (i =3D=3D 0) { + /* + * Our only valid extents must have been busy. + * Make it unbusy by forcing the log out and + * retrying. If we've been here before, forcing + * the log isn't making the extents available, + * which means they have probably been freed in + * this transaction. In that case, we have to + * give up on them and we'll attempt a minlen + * allocation the next time around. + */ + xfs_btree_del_cursor(cnt_cur, + XFS_BTREE_NOERROR); + trace_xfs_alloc_size_busy(args); + if (!forced++) + xfs_log_force(args->mp, XFS_LOG_SYNC); + goto restart; + } + } } - /* - * There's a freespace as big as maxlen+alignment-1, get it. - */ - else { - if ((error =3D xfs_alloc_get_rec(cnt_cur, &fbno, &flen, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, error0); - } + /* * In the first case above, we got the last entry in the * by-size btree. Now we check to see if the space hits maxlen * once aligned; if not, we search left for something better. * This can't happen in the second case above. */ - xfs_alloc_compute_aligned(fbno, flen, args->alignment, args->minlen, - &rbno, &rlen); rlen =3D XFS_EXTLEN_MIN(args->maxlen, rlen); XFS_WANT_CORRUPTED_GOTO(rlen =3D=3D 0 || (rlen <=3D flen && rbno + rlen <=3D fbno + flen), error0); @@ -1188,8 +1308,8 @@ xfs_alloc_ag_vextent_size( XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, error0); if (flen < bestrlen) break; - xfs_alloc_compute_aligned(fbno, flen, args->alignment, - args->minlen, &rbno, &rlen); + xfs_alloc_compute_aligned(args, fbno, flen, + &rbno, &rlen); rlen =3D XFS_EXTLEN_MIN(args->maxlen, rlen); XFS_WANT_CORRUPTED_GOTO(rlen =3D=3D 0 || (rlen <=3D flen && rbno + rlen <=3D fbno + flen), @@ -1217,13 +1337,19 @@ xfs_alloc_ag_vextent_size( * Fix up the length. */ args->len =3D rlen; - xfs_alloc_fix_len(args); - if (rlen < args->minlen || !xfs_alloc_fix_minleft(args)) { - xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); - trace_xfs_alloc_size_nominleft(args); - args->agbno =3D NULLAGBLOCK; - return 0; + if (rlen < args->minlen) { + if (!forced++) { + xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + trace_xfs_alloc_size_busy(args); + xfs_log_force(args->mp, XFS_LOG_SYNC); + goto restart; + } + goto out_nominleft; } + xfs_alloc_fix_len(args); + + if (!xfs_alloc_fix_minleft(args)) + goto out_nominleft; rlen =3D args->len; XFS_WANT_CORRUPTED_GOTO(rlen <=3D flen, error0); /* @@ -1253,6 +1379,12 @@ error0: if (bno_cur) xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR); return error; + +out_nominleft: + xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + trace_xfs_alloc_size_nominleft(args); + args->agbno =3D NULLAGBLOCK; + return 0; } =20 /* @@ -1292,6 +1424,9 @@ xfs_alloc_ag_vextent_small( if (error) goto error0; if (fbno !=3D NULLAGBLOCK) { + xfs_extent_busy_reuse(args->mp, args->agno, fbno, 1, + args->userdata); + if (args->userdata) { xfs_buf_t *bp; =20 @@ -1367,6 +1502,7 @@ xfs_free_ag_extent( xfs_mount_t *mp; /* mount point struct for filesystem */ xfs_agblock_t nbno; /* new starting block of freespace */ xfs_extlen_t nlen; /* new length of freespace */ + xfs_perag_t *pag; /* per allocation group data */ =20 mp =3D tp->t_mountp; /* @@ -1565,45 +1701,23 @@ xfs_free_ag_extent( XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, error0); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); cnt_cur =3D NULL; + /* * Update the freespace totals in the ag and superblock. */ - { - xfs_agf_t *agf; - xfs_perag_t *pag; /* per allocation group data */ - - pag =3D xfs_perag_get(mp, agno); - pag->pagf_freeblks +=3D len; - xfs_perag_put(pag); - - agf =3D XFS_BUF_TO_AGF(agbp); - be32_add_cpu(&agf->agf_freeblks, len); - xfs_trans_agblocks_delta(tp, len); - XFS_WANT_CORRUPTED_GOTO( - be32_to_cpu(agf->agf_freeblks) <=3D - be32_to_cpu(agf->agf_length), - error0); - xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS); - if (!isfl) - xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len); - XFS_STATS_INC(xs_freex); - XFS_STATS_ADD(xs_freeb, len); - } + pag =3D xfs_perag_get(mp, agno); + error =3D xfs_alloc_update_counters(tp, pag, agbp, len); + xfs_perag_put(pag); + if (error) + goto error0; + + if (!isfl) + xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len); + XFS_STATS_INC(xs_freex); + XFS_STATS_ADD(xs_freeb, len); =20 trace_xfs_free_extent(mp, agno, bno, len, isfl, haveleft, haveright); =20 - /* - * Since blocks move to the free list without the coordination - * used in xfs_bmap_finish, we can't allow block to be available - * for reallocation and non-transaction writing (user data) - * until we know that the transaction that moved it to the free - * list is permanently on disk. We track the blocks by declaring - * these blocks as "busy"; the busy list is maintained on a per-ag - * basis and each transaction records which entries should be removed - * when the iclog commits to disk. If a busy block is allocated, - * the iclog is pushed up to the LSN that freed the block. - */ - xfs_alloc_busy_insert(tp, agno, bno, len); return 0; =20 error0: @@ -1788,12 +1902,11 @@ xfs_alloc_fix_freelist( /* * Initialize the args structure. */ + memset(&targs, 0, sizeof(targs)); targs.tp =3D tp; targs.mp =3D mp; targs.agbp =3D agbp; targs.agno =3D args->agno; - targs.mod =3D targs.minleft =3D targs.wasdel =3D targs.userdata =3D - targs.minalignslop =3D 0; targs.alignment =3D targs.minlen =3D targs.prod =3D targs.isfl =3D 1; targs.type =3D XFS_ALLOCTYPE_THIS_AG; targs.pag =3D pag; @@ -1900,21 +2013,6 @@ xfs_alloc_get_freelist( xfs_alloc_log_agf(tp, agbp, logflags); *bnop =3D bno; =20 - /* - * As blocks are freed, they are added to the per-ag busy list and - * remain there until the freeing transaction is committed to disk. - * Now that we have allocated blocks, this list must be searched to see - * if a block is being reused. If one is, then the freeing transaction - * must be pushed to disk before this transaction. - * - * We do this by setting the current transaction to a sync transaction - * which guarantees that the freeing transaction is on disk before this - * transaction. This is done instead of a synchronous log force here so - * that we don't sit and wait with the AGF locked in the transaction - * during the log force. - */ - if (xfs_alloc_busy_search(mp, be32_to_cpu(agf->agf_seqno), bno, 1)) - xfs_trans_set_sync(tp); return 0; } =20 @@ -2027,6 +2125,63 @@ xfs_alloc_put_freelist( return 0; } =20 +static void +xfs_agf_verify( + struct xfs_buf *bp) + { + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_agf *agf; + int agf_ok; + + agf =3D XFS_BUF_TO_AGF(bp); + + agf_ok =3D agf->agf_magicnum =3D=3D cpu_to_be32(XFS_AGF_MAGIC) && + XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && + be32_to_cpu(agf->agf_freeblks) <=3D be32_to_cpu(agf->agf_length) && + be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_flcount) <=3D XFS_AGFL_SIZE(mp); + + /* + * during growfs operations, the perag is not fully initialised, + * so we can't use it for any useful checking. growfs ensures we can't + * use it by using uncached buffers that don't have the perag attached + * so we can detect and avoid this problem. + */ + if (bp->b_pag) + agf_ok =3D agf_ok && be32_to_cpu(agf->agf_seqno) =3D=3D + bp->b_pag->pag_agno; + + if (xfs_sb_version_haslazysbcount(&mp->m_sb)) + agf_ok =3D agf_ok && be32_to_cpu(agf->agf_btreeblks) <=3D + be32_to_cpu(agf->agf_length); + + if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, + XFS_RANDOM_ALLOC_READ_AGF))) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agf); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_agf_read_verify( + struct xfs_buf *bp) +{ + xfs_agf_verify(bp); +} + +static void +xfs_agf_write_verify( + struct xfs_buf *bp) +{ + xfs_agf_verify(bp); +} + +const struct xfs_buf_ops xfs_agf_buf_ops =3D { + .verify_read =3D xfs_agf_read_verify, + .verify_write =3D xfs_agf_write_verify, +}; + /* * Read in the allocation group header (free/alloc section). */ @@ -2038,45 +2193,20 @@ xfs_read_agf( int flags, /* XFS_BUF_ */ struct xfs_buf **bpp) /* buffer for the ag freelist header */ { - struct xfs_agf *agf; /* ag freelist header */ - int agf_ok; /* set if agf is consistent */ int error; =20 ASSERT(agno !=3D NULLAGNUMBER); error =3D xfs_trans_read_buf( mp, tp, mp->m_ddev_targp, XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), flags, bpp); + XFS_FSS_TO_BB(mp, 1), flags, bpp, &xfs_agf_buf_ops); if (error) return error; if (!*bpp) return 0; =20 - ASSERT(!XFS_BUF_GETERROR(*bpp)); - agf =3D XFS_BUF_TO_AGF(*bpp); - - /* - * Validate the magic number of the agf block. - */ - agf_ok =3D - be32_to_cpu(agf->agf_magicnum) =3D=3D XFS_AGF_MAGIC && - XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && - be32_to_cpu(agf->agf_freeblks) <=3D be32_to_cpu(agf->agf_length) && - be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_flcount) <=3D XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_seqno) =3D=3D agno; - if (xfs_sb_version_haslazysbcount(&mp->m_sb)) - agf_ok =3D agf_ok && be32_to_cpu(agf->agf_btreeblks) <=3D - be32_to_cpu(agf->agf_length); - if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, - XFS_RANDOM_ALLOC_READ_AGF))) { - XFS_CORRUPTION_ERROR("xfs_alloc_read_agf", - XFS_ERRLEVEL_LOW, mp, agf); - xfs_trans_brelse(tp, *bpp); - return XFS_ERROR(EFSCORRUPTED); - } - XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_AGF, XFS_AGF_REF); + ASSERT(!(*bpp)->b_error); + xfs_buf_set_ref(*bpp, XFS_AGF_REF); return 0; } =20 @@ -2104,7 +2234,7 @@ xfs_alloc_read_agf( return error; if (!*bpp) return 0; - ASSERT(!XFS_BUF_GETERROR(*bpp)); + ASSERT(!(*bpp)->b_error); =20 agf =3D XFS_BUF_TO_AGF(*bpp); pag =3D xfs_perag_get(mp, agno); @@ -2371,18 +2501,36 @@ xfs_free_extent( memset(&args, 0, sizeof(xfs_alloc_arg_t)); args.tp =3D tp; args.mp =3D tp->t_mountp; + + /* + * validate that the block number is legal - the enables us to detect + * and handle a silent filesystem corruption rather than crashing. + */ args.agno =3D XFS_FSB_TO_AGNO(args.mp, bno); - ASSERT(args.agno < args.mp->m_sb.sb_agcount); + if (args.agno >=3D args.mp->m_sb.sb_agcount) + return EFSCORRUPTED; + args.agbno =3D XFS_FSB_TO_AGBNO(args.mp, bno); + if (args.agbno >=3D args.mp->m_sb.sb_agblocks) + return EFSCORRUPTED; + args.pag =3D xfs_perag_get(args.mp, args.agno); - if ((error =3D xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING))) + ASSERT(args.pag); + + error =3D xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING); + if (error) goto error0; -#ifdef DEBUG - ASSERT(args.agbp !=3D NULL); - ASSERT((args.agbno + len) <=3D - be32_to_cpu(XFS_BUF_TO_AGF(args.agbp)->agf_length)); -#endif + + /* validate the extent size is legal now we have the agf locked */ + if (args.agbno + len > + be32_to_cpu(XFS_BUF_TO_AGF(args.agbp)->agf_length)) { + error =3D EFSCORRUPTED; + goto error0; + } + error =3D xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, len, 0= ); + if (!error) + xfs_extent_busy_insert(tp, args.agno, args.agbno, len, 0); error0: xfs_perag_put(args.pag); return error; diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index b782d9d..dc9ed48 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -75,6 +75,8 @@ xfs_allocbt_alloc_block( return 0; } =20 + xfs_extent_busy_reuse(cur->bc_mp, cur->bc_private.a.agno, bno, 1, false); + xfs_trans_agbtree_delta(cur->bc_tp, 1); new->s =3D cpu_to_be32(bno); =20 @@ -98,19 +100,11 @@ xfs_allocbt_free_block( if (error) return error; =20 - /* - * Since blocks move to the free list without the coordination used in - * xfs_bmap_finish, we can't allow block to be available for - * reallocation and non-transaction writing (user data) until we know - * that the transaction that moved it to the free list is permanently - * on disk. We track the blocks by declaring these blocks as "busy"; - * the busy list is maintained on a per-ag basis and each transaction - * records which entries should be removed when the iclog commits to - * disk. If a busy block is allocated, the iclog is pushed up to the - * LSN that freed the block. - */ - xfs_alloc_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); + xfs_extent_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1, + XFS_EXTENT_BUSY_SKIP_DISCARD); xfs_trans_agbtree_delta(cur->bc_tp, -1); + + xfs_trans_binval(cur->bc_tp, bp); return 0; } =20 @@ -260,6 +254,82 @@ xfs_allocbt_key_diff( return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; } =20 +static void +xfs_allocbt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); + struct xfs_perag *pag =3D bp->b_pag; + unsigned int level; + int sblock_ok; /* block passes checks */ + + /* + * magic number and level verification + * + * During growfs operations, we can't verify the exact level as the + * perag is not fully initialised and hence not attached to the buffer. + * In this case, check against the maximum tree depth. + */ + level =3D be16_to_cpu(block->bb_level); + switch (cpu_to_be32(block->bb_magic)) { + case XFS_ABTB_MAGIC: + if (pag) + sblock_ok =3D level < pag->pagf_levels[XFS_BTNUM_BNOi]; + else + sblock_ok =3D level < mp->m_ag_maxlevels; + break; + case XFS_ABTC_MAGIC: + if (pag) + sblock_ok =3D level < pag->pagf_levels[XFS_BTNUM_CNTi]; + else + sblock_ok =3D level < mp->m_ag_maxlevels; + break; + default: + sblock_ok =3D 0; + break; + } + + /* numrecs verification */ + sblock_ok =3D sblock_ok && + be16_to_cpu(block->bb_numrecs) <=3D mp->m_alloc_mxr[level !=3D 0]; + + /* sibling pointer verification */ + sblock_ok =3D sblock_ok && + (block->bb_u.s.bb_leftsib =3D=3D cpu_to_be32(NULLAGBLOCK) || + be32_to_cpu(block->bb_u.s.bb_leftsib) < mp->m_sb.sb_agblocks) && + block->bb_u.s.bb_leftsib && + (block->bb_u.s.bb_rightsib =3D=3D cpu_to_be32(NULLAGBLOCK) || + be32_to_cpu(block->bb_u.s.bb_rightsib) < mp->m_sb.sb_agblocks) && + block->bb_u.s.bb_rightsib; + + if (!sblock_ok) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_allocbt_read_verify( + struct xfs_buf *bp) +{ + xfs_allocbt_verify(bp); +} + +static void +xfs_allocbt_write_verify( + struct xfs_buf *bp) +{ + xfs_allocbt_verify(bp); +} + +const struct xfs_buf_ops xfs_allocbt_buf_ops =3D { + .verify_read =3D xfs_allocbt_read_verify, + .verify_write =3D xfs_allocbt_write_verify, +}; + + #ifdef DEBUG STATIC int xfs_allocbt_keys_inorder( @@ -381,7 +451,7 @@ static const struct xfs_btree_ops xfs_allocbt_ops =3D { .init_rec_from_cur =3D xfs_allocbt_init_rec_from_cur, .init_ptr_from_cur =3D xfs_allocbt_init_ptr_from_cur, .key_diff =3D xfs_allocbt_key_diff, - + .buf_ops =3D &xfs_allocbt_buf_ops, #ifdef DEBUG .keys_inorder =3D xfs_allocbt_keys_inorder, .recs_inorder =3D xfs_allocbt_recs_inorder, @@ -415,13 +485,16 @@ xfs_allocbt_init_cursor( =20 cur->bc_tp =3D tp; cur->bc_mp =3D mp; - cur->bc_nlevels =3D be32_to_cpu(agf->agf_levels[btnum]); cur->bc_btnum =3D btnum; cur->bc_blocklog =3D mp->m_sb.sb_blocklog; - cur->bc_ops =3D &xfs_allocbt_ops; - if (btnum =3D=3D XFS_BTNUM_CNT) + + if (btnum =3D=3D XFS_BTNUM_CNT) { + cur->bc_nlevels =3D be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]); cur->bc_flags =3D XFS_BTREE_LASTREC_UPDATE; + } else { + cur->bc_nlevels =3D be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]); + } =20 cur->bc_private.a.agbp =3D agbp; cur->bc_private.a.agno =3D agno; diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index eec7f8f..42546a9 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -295,8 +295,7 @@ xfs_attr_set_int( return (error); } =20 - xfs_trans_ijoin(args.trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args.trans, dp); + xfs_trans_ijoin(args.trans, dp, 0); =20 /* * If the attribute list is non-existent or a shortform list, @@ -365,10 +364,8 @@ xfs_attr_set_int( * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args.trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args.trans, dp); - } + if (committed) + xfs_trans_ijoin(args.trans, dp, 0); =20 /* * Commit the leaf transformation. We'll need another (linked) @@ -469,6 +466,13 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *= name, int flags) args.whichfork =3D XFS_ATTR_FORK; =20 /* + * we have no control over the attribute names that userspace passes us + * to remove, so we have to allow the name lookup prior to attribute + * removal to fail. + */ + args.op_flags =3D XFS_DA_OP_OKNOENT; + + /* * Attach the dquots to the inode. */ error =3D xfs_qm_dqattach(dp, 0); @@ -509,8 +513,7 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *n= ame, int flags) * No need to make quota reservations here. We expect to release some * blocks not allocate in the common case. */ - xfs_trans_ijoin(args.trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args.trans, dp); + xfs_trans_ijoin(args.trans, dp, 0); =20 /* * Decide on what work routines to call based on the inode size. @@ -603,6 +606,8 @@ xfs_attr_shortform_addname(xfs_da_args_t *args) { int newsize, forkoff, retval; =20 + trace_xfs_attr_sf_addname(args); + retval =3D xfs_attr_shortform_lookup(args); if ((args->flags & ATTR_REPLACE) && (retval =3D=3D ENOATTR)) { return(retval); @@ -643,19 +648,19 @@ STATIC int xfs_attr_leaf_addname(xfs_da_args_t *args) { xfs_inode_t *dp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int retval, error, committed, forkoff; =20 + trace_xfs_attr_leaf_addname(args); + /* * Read the (only) block in the attribute list in. */ dp =3D args->dp; args->blkno =3D 0; - error =3D xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp, - XFS_ATTR_FORK); + error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) - return(error); - ASSERT(bp !=3D NULL); + return error; =20 /* * Look up the given attribute in the leaf block. Figure out if @@ -663,13 +668,16 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) */ retval =3D xfs_attr_leaf_lookup_int(bp, args); if ((args->flags & ATTR_REPLACE) && (retval =3D=3D ENOATTR)) { - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); return(retval); } else if (retval =3D=3D EEXIST) { if (args->flags & ATTR_CREATE) { /* pure create op */ - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); return(retval); } + + trace_xfs_attr_leaf_replace(args); + args->op_flags |=3D XFS_DA_OP_RENAME; /* an atomic rename */ args->blkno2 =3D args->blkno; /* set 2nd entry info*/ args->index2 =3D args->index; @@ -682,7 +690,6 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * if required. */ retval =3D xfs_attr_leaf_add(bp, args); - xfs_da_buf_done(bp); if (retval =3D=3D ENOSPC) { /* * Promote the attribute list to the Btree format, then @@ -706,10 +713,8 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); =20 /* * Commit the current trans (including the inode) and start @@ -779,12 +784,12 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Read in the block containing the "old" attr, then * remove the "old" attr from that block (neat, huh!) */ - error =3D xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, - &bp, XFS_ATTR_FORK); + error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, + -1, &bp); if (error) - return(error); - ASSERT(bp !=3D NULL); - (void)xfs_attr_leaf_remove(bp, args); + return error; + + xfs_attr_leaf_remove(bp, args); =20 /* * If the result is small enough, shrink it all into the inode. @@ -810,12 +815,9 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * and started a new one. We need the inode to be * in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } - } else - xfs_da_buf_done(bp); + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); + } =20 /* * Commit the remove and start the next trans in series. @@ -841,28 +843,27 @@ STATIC int xfs_attr_leaf_removename(xfs_da_args_t *args) { xfs_inode_t *dp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error, committed, forkoff; =20 + trace_xfs_attr_leaf_removename(args); + /* * Remove the attribute. */ dp =3D args->dp; args->blkno =3D 0; - error =3D xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp, - XFS_ATTR_FORK); - if (error) { - return(error); - } + error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + if (error) + return error; =20 - ASSERT(bp !=3D NULL); error =3D xfs_attr_leaf_lookup_int(bp, args); if (error =3D=3D ENOATTR) { - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); return(error); } =20 - (void)xfs_attr_leaf_remove(bp, args); + xfs_attr_leaf_remove(bp, args); =20 /* * If the result is small enough, shrink it all into the inode. @@ -886,12 +887,9 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } - } else - xfs_da_buf_done(bp); + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); + } return(0); } =20 @@ -904,23 +902,23 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) STATIC int xfs_attr_leaf_get(xfs_da_args_t *args) { - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; =20 + trace_xfs_attr_leaf_get(args); + args->blkno =3D 0; - error =3D xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp, - XFS_ATTR_FORK); + error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) - return(error); - ASSERT(bp !=3D NULL); + return error; =20 error =3D xfs_attr_leaf_lookup_int(bp, args); if (error !=3D EEXIST) { - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); return(error); } error =3D xfs_attr_leaf_getvalue(bp, args); - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); if (!error && (args->rmtblkno > 0) && !(args->flags & ATTR_KERNOVAL)) { error =3D xfs_attr_rmtval_get(args); } @@ -950,6 +948,8 @@ xfs_attr_node_addname(xfs_da_args_t *args) xfs_mount_t *mp; int committed, retval, error; =20 + trace_xfs_attr_node_addname(args); + /* * Fill in bucket of arguments/results/context to carry around. */ @@ -976,6 +976,9 @@ restart: } else if (retval =3D=3D EEXIST) { if (args->flags & ATTR_CREATE) goto out; + + trace_xfs_attr_node_replace(args); + args->op_flags |=3D XFS_DA_OP_RENAME; /* atomic rename op */ args->blkno2 =3D args->blkno; /* set 2nd entry info*/ args->index2 =3D args->index; @@ -1013,10 +1016,8 @@ restart: * and started a new one. We need the inode to be * in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); =20 /* * Commit the node conversion and start the next @@ -1052,10 +1053,8 @@ restart: * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); } else { /* * Addition succeeded, update Btree hashvals. @@ -1166,10 +1165,8 @@ restart: * and started a new one. We need the inode to be * in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); } =20 /* @@ -1210,9 +1207,11 @@ xfs_attr_node_removename(xfs_da_args_t *args) xfs_da_state_t *state; xfs_da_state_blk_t *blk; xfs_inode_t *dp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int retval, error, committed, forkoff; =20 + trace_xfs_attr_node_removename(args); + /* * Tie a string around our finger to remind us where we are. */ @@ -1300,10 +1299,8 @@ xfs_attr_node_removename(xfs_da_args_t *args) * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); =20 /* * Commit the Btree join operation and start a new trans. @@ -1322,16 +1319,11 @@ xfs_attr_node_removename(xfs_da_args_t *args) */ ASSERT(state->path.active =3D=3D 1); ASSERT(state->path.blk[0].bp); - xfs_da_buf_done(state->path.blk[0].bp); state->path.blk[0].bp =3D NULL; =20 - error =3D xfs_da_read_buf(args->trans, args->dp, 0, -1, &bp, - XFS_ATTR_FORK); + error =3D xfs_attr_leaf_read(args->trans, args->dp, 0, -1, &bp); if (error) goto out; - ASSERT(be16_to_cpu(((xfs_attr_leafblock_t *) - bp->data)->hdr.info.magic) - =3D=3D XFS_ATTR_LEAF_MAGIC); =20 if ((forkoff =3D xfs_attr_shortform_allfit(bp, dp))) { xfs_bmap_init(args->flist, args->firstblock); @@ -1354,12 +1346,10 @@ xfs_attr_node_removename(xfs_da_args_t *args) * and started a new one. We need the inode to be * in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); } else - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); } error =3D 0; =20 @@ -1381,6 +1371,8 @@ xfs_attr_fillstate(xfs_da_state_t *state) xfs_da_state_blk_t *blk; int level; =20 + trace_xfs_attr_fillstate(state->args); + /* * Roll down the "path" in the state structure, storing the on-disk * block number for those buffers in the "path". @@ -1389,8 +1381,7 @@ xfs_attr_fillstate(xfs_da_state_t *state) ASSERT((path->active >=3D 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk =3D path->blk, level =3D 0; level < path->active; blk++, level++= ) { if (blk->bp) { - blk->disk_blkno =3D xfs_da_blkno(blk->bp); - xfs_da_buf_done(blk->bp); + blk->disk_blkno =3D XFS_BUF_ADDR(blk->bp); blk->bp =3D NULL; } else { blk->disk_blkno =3D 0; @@ -1405,8 +1396,7 @@ xfs_attr_fillstate(xfs_da_state_t *state) ASSERT((path->active >=3D 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk =3D path->blk, level =3D 0; level < path->active; blk++, level++= ) { if (blk->bp) { - blk->disk_blkno =3D xfs_da_blkno(blk->bp); - xfs_da_buf_done(blk->bp); + blk->disk_blkno =3D XFS_BUF_ADDR(blk->bp); blk->bp =3D NULL; } else { blk->disk_blkno =3D 0; @@ -1429,6 +1419,8 @@ xfs_attr_refillstate(xfs_da_state_t *state) xfs_da_state_blk_t *blk; int level, error; =20 + trace_xfs_attr_refillstate(state->args); + /* * Roll down the "path" in the state structure, storing the on-disk * block number for those buffers in the "path". @@ -1437,7 +1429,7 @@ xfs_attr_refillstate(xfs_da_state_t *state) ASSERT((path->active >=3D 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk =3D path->blk, level =3D 0; level < path->active; blk++, level++= ) { if (blk->disk_blkno) { - error =3D xfs_da_read_buf(state->args->trans, + error =3D xfs_da_node_read(state->args->trans, state->args->dp, blk->blkno, blk->disk_blkno, &blk->bp, XFS_ATTR_FORK); @@ -1456,7 +1448,7 @@ xfs_attr_refillstate(xfs_da_state_t *state) ASSERT((path->active >=3D 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk =3D path->blk, level =3D 0; level < path->active; blk++, level++= ) { if (blk->disk_blkno) { - error =3D xfs_da_read_buf(state->args->trans, + error =3D xfs_da_node_read(state->args->trans, state->args->dp, blk->blkno, blk->disk_blkno, &blk->bp, XFS_ATTR_FORK); @@ -1485,6 +1477,8 @@ xfs_attr_node_get(xfs_da_args_t *args) int error, retval; int i; =20 + trace_xfs_attr_node_get(args); + state =3D xfs_da_state_alloc(); state->args =3D args; state->mp =3D args->dp->i_mount; @@ -1516,7 +1510,7 @@ xfs_attr_node_get(xfs_da_args_t *args) * If not in a transaction, we have to release all the buffers. */ for (i =3D 0; i < state->path.active; i++) { - xfs_da_brelse(args->trans, state->path.blk[i].bp); + xfs_trans_brelse(args->trans, state->path.blk[i].bp); state->path.blk[i].bp =3D NULL; } =20 @@ -1543,6 +1537,8 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) int nmap, error, tmp, valuelen, blkcnt, i; xfs_dablk_t lblkno; =20 + trace_xfs_attr_rmtval_get(args); + ASSERT(!(args->flags & ATTR_KERNOVAL)); =20 mp =3D args->dp->i_mount; @@ -1551,10 +1547,9 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) lblkno =3D args->rmtblkno; while (valuelen > 0) { nmap =3D ATTR_RMTVALUE_MAPSIZE; - error =3D xfs_bmapi(args->trans, args->dp, (xfs_fileoff_t)lblkno, - args->rmtblkcnt, - XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - NULL, 0, map, &nmap, NULL); + error =3D xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, + args->rmtblkcnt, map, &nmap, + XFS_BMAPI_ATTRFORK); if (error) return(error); ASSERT(nmap >=3D 1); @@ -1564,14 +1559,12 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) (map[i].br_startblock !=3D HOLESTARTBLOCK)); dblkno =3D XFS_FSB_TO_DADDR(mp, map[i].br_startblock); blkcnt =3D XFS_FSB_TO_BB(mp, map[i].br_blockcount); - error =3D xfs_read_buf(mp, mp->m_ddev_targp, dblkno, - blkcnt, XBF_LOCK | XBF_DONT_BLOCK, - &bp); + error =3D xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, + dblkno, blkcnt, 0, &bp, NULL); if (error) return(error); =20 - tmp =3D (valuelen < XFS_BUF_SIZE(bp)) - ? valuelen : XFS_BUF_SIZE(bp); + tmp =3D min_t(int, valuelen, BBTOB(bp->b_length)); xfs_buf_iomove(bp, 0, tmp, dst, XBRW_READ); xfs_buf_relse(bp); dst +=3D tmp; @@ -1601,6 +1594,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) xfs_dablk_t lblkno; int blkcnt, valuelen, nmap, error, tmp, committed; =20 + trace_xfs_attr_rmtval_set(args); + dp =3D args->dp; mp =3D dp->i_mount; src =3D args->value; @@ -1628,10 +1623,9 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) */ xfs_bmap_init(args->flist, args->firstblock); nmap =3D 1; - error =3D xfs_bmapi(args->trans, dp, (xfs_fileoff_t)lblkno, + error =3D xfs_bmapi_write(args->trans, dp, (xfs_fileoff_t)lblkno, blkcnt, - XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA | - XFS_BMAPI_WRITE, + XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, args->firstblock, args->total, &map, &nmap, args->flist); if (!error) { @@ -1649,10 +1643,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, dp); - } + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); =20 ASSERT(nmap =3D=3D 1); ASSERT((map.br_startblock !=3D DELAYSTARTBLOCK) && @@ -1677,19 +1669,18 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) lblkno =3D args->rmtblkno; valuelen =3D args->valuelen; while (valuelen > 0) { + int buflen; + /* * Try to remember where we decided to put the value. */ xfs_bmap_init(args->flist, args->firstblock); nmap =3D 1; - error =3D xfs_bmapi(NULL, dp, (xfs_fileoff_t)lblkno, - args->rmtblkcnt, - XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - args->firstblock, 0, &map, &nmap, - NULL); - if (error) { + error =3D xfs_bmapi_read(dp, (xfs_fileoff_t)lblkno, + args->rmtblkcnt, &map, &nmap, + XFS_BMAPI_ATTRFORK); + if (error) return(error); - } ASSERT(nmap =3D=3D 1); ASSERT((map.br_startblock !=3D DELAYSTARTBLOCK) && (map.br_startblock !=3D HOLESTARTBLOCK)); @@ -1697,19 +1688,20 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) dblkno =3D XFS_FSB_TO_DADDR(mp, map.br_startblock), blkcnt =3D XFS_FSB_TO_BB(mp, map.br_blockcount); =20 - bp =3D xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, - XBF_LOCK | XBF_DONT_BLOCK); - ASSERT(bp); - ASSERT(!XFS_BUF_GETERROR(bp)); + bp =3D xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, 0); + if (!bp) + return ENOMEM; =20 - tmp =3D (valuelen < XFS_BUF_SIZE(bp)) ? valuelen : - XFS_BUF_SIZE(bp); + buflen =3D BBTOB(bp->b_length); + tmp =3D min_t(int, valuelen, buflen); xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); - if (tmp < XFS_BUF_SIZE(bp)) - xfs_buf_zero(bp, tmp, XFS_BUF_SIZE(bp) - tmp); - if ((error =3D xfs_bwrite(mp, bp))) {/* GROT: NOTE: synchronous write */ - return (error); - } + if (tmp < buflen) + xfs_buf_zero(bp, tmp, buflen - tmp); + + error =3D xfs_bwrite(mp, bp); /* GROT: NOTE: synchronous write */ + xfs_buf_relse(bp); + if (error) + return error; src +=3D tmp; valuelen -=3D tmp; =20 @@ -1733,6 +1725,8 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) xfs_dablk_t lblkno; int valuelen, blkcnt, nmap, error, done, committed; =20 + trace_xfs_attr_rmtval_remove(args); + mp =3D args->dp->i_mount; =20 /* @@ -1745,16 +1739,12 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) /* * Try to remember where we decided to put the value. */ - xfs_bmap_init(args->flist, args->firstblock); nmap =3D 1; - error =3D xfs_bmapi(NULL, args->dp, (xfs_fileoff_t)lblkno, - args->rmtblkcnt, - XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - args->firstblock, 0, &map, &nmap, - args->flist); - if (error) { + error =3D xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, + args->rmtblkcnt, &map, &nmap, + XFS_BMAPI_ATTRFORK); + if (error) return(error); - } ASSERT(nmap =3D=3D 1); ASSERT((map.br_startblock !=3D DELAYSTARTBLOCK) && (map.br_startblock !=3D HOLESTARTBLOCK)); @@ -1767,8 +1757,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) */ bp =3D xfs_incore(mp->m_ddev_targp, dblkno, blkcnt, XBF_TRYLOCK); if (bp) { - XFS_BUF_STALE(bp); - XFS_BUF_UNDELAYWRITE(bp); + xfs_buf_stale(bp); xfs_buf_relse(bp); bp =3D NULL; } @@ -1805,10 +1794,8 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) * bmap_finish() may have committed the last trans and started * a new one. We need the inode to be in all transactions. */ - if (committed) { - xfs_trans_ijoin(args->trans, args->dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(args->trans, args->dp); - } + if (committed) + xfs_trans_ijoin(args->trans, args->dp, 0); =20 /* * Close out trans and start the next one in the chain. diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index d1f7a20..824c122 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -32,10 +32,11 @@ * Routines used for growing the Btree. */ STATIC int xfs_attr_leaf_create(xfs_da_args_t *args, xfs_dablk_t which_blo= ck, - xfs_dabuf_t **bpp); -STATIC int xfs_attr_leaf_add_work(xfs_dabuf_t *leaf_buffer, xfs_da_args_t = *args, - int freemap_index); -STATIC void xfs_attr_leaf_compact(xfs_trans_t *trans, xfs_dabuf_t *leaf_bu= ffer); + struct xfs_buf **bpp); +STATIC int xfs_attr_leaf_add_work(struct xfs_buf *leaf_buffer, + xfs_da_args_t *args, int freemap_index); +STATIC void xfs_attr_leaf_compact(struct xfs_da_args *args, + struct xfs_buf *leaf_buffer); STATIC void xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_da_state_blk_t *blk2); @@ -56,6 +57,52 @@ STATIC void xfs_attr_leaf_moveents(xfs_attr_leafblock_t = *src_leaf, xfs_mount_t *mp); STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); =20 +static void +xfs_attr_leaf_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_attr_leaf_hdr *hdr =3D bp->b_addr; + int block_ok =3D 0; + + block_ok =3D hdr->info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC); + if (!block_ok) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_attr_leaf_read_verify( + struct xfs_buf *bp) +{ + xfs_attr_leaf_verify(bp); +} + +static void +xfs_attr_leaf_write_verify( + struct xfs_buf *bp) +{ + xfs_attr_leaf_verify(bp); +} + +const struct xfs_buf_ops xfs_attr_leaf_buf_ops =3D { + .verify_read =3D xfs_attr_leaf_read_verify, + .verify_write =3D xfs_attr_leaf_write_verify, +}; + +int +xfs_attr_leaf_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp) +{ + return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, + XFS_ATTR_FORK, &xfs_attr_leaf_buf_ops); +} + /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D * Namespace helper routines *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/ @@ -78,6 +125,7 @@ xfs_attr_namesp_match(int arg_flags, int ondisk_flags) /* * Query whether the requested number of additional bytes of extended * attribute space will be able to fit inline. + * * Returns zero if not, else the di_forkoff fork offset to be used in the * literal area for attribute data once the new bytes have been added. * @@ -90,7 +138,7 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) int offset; int minforkoff; /* lower limit on valid forkoff locations */ int maxforkoff; /* upper limit on valid forkoff locations */ - int dsize;=09 + int dsize; xfs_mount_t *mp =3D dp->i_mount; =20 offset =3D (XFS_LITINO(mp) - bytes) >> 3; /* rounded down */ @@ -104,47 +152,60 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int byte= s) return (offset >=3D minforkoff) ? minforkoff : 0; } =20 - if (!(mp->m_flags & XFS_MOUNT_ATTR2)) { - if (bytes <=3D XFS_IFORK_ASIZE(dp)) - return dp->i_d.di_forkoff; + /* + * If the requested numbers of bytes is smaller or equal to the + * current attribute fork size we can always proceed. + * + * Note that if_bytes in the data fork might actually be larger than + * the current data fork size is due to delalloc extents. In that + * case either the extent count will go down when they are converted + * to real extents, or the delalloc conversion will take care of the + * literal area rebalancing. + */ + if (bytes <=3D XFS_IFORK_ASIZE(dp)) + return dp->i_d.di_forkoff; + + /* + * For attr2 we can try to move the forkoff if there is space in the + * literal area, but for the old format we are done if there is no + * space in the fixed attribute fork. + */ + if (!(mp->m_flags & XFS_MOUNT_ATTR2)) return 0; - } =20 dsize =3D dp->i_df.if_bytes; -=09 + switch (dp->i_d.di_format) { case XFS_DINODE_FMT_EXTENTS: - /*=20 + /* * If there is no attr fork and the data fork is extents,=20 - * determine if creating the default attr fork will result=20 - * in the extents form migrating to btree. If so, the=20 - * minimum offset only needs to be the space required for=20 + * determine if creating the default attr fork will result + * in the extents form migrating to btree. If so, the + * minimum offset only needs to be the space required for * the btree root. - */=20 + */ if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > xfs_default_attroffset(dp)) dsize =3D XFS_BMDR_SPACE_CALC(MINDBTPTRS); break; - =09 case XFS_DINODE_FMT_BTREE: /* - * If have data btree then keep forkoff if we have one, - * otherwise we are adding a new attr, so then we set=20 - * minforkoff to where the btree root can finish so we have=20 + * If we have a data btree then keep forkoff if we have one, + * otherwise we are adding a new attr, so then we set + * minforkoff to where the btree root can finish so we have * plenty of room for attrs */ if (dp->i_d.di_forkoff) { - if (offset < dp->i_d.di_forkoff)=20 + if (offset < dp->i_d.di_forkoff) return 0; - else=20 - return dp->i_d.di_forkoff; - } else - dsize =3D XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot); + return dp->i_d.di_forkoff; + } + dsize =3D XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot); break; } -=09 - /*=20 - * A data fork btree root must have space for at least=20 + + /* + * A data fork btree root must have space for at least * MINDBTPTRS key/ptr pairs if the data fork is small or empty. */ minforkoff =3D MAX(dsize, XFS_BMDR_SPACE_CALC(MINDBTPTRS)); @@ -154,10 +215,10 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int byte= s) maxforkoff =3D XFS_LITINO(mp) - XFS_BMDR_SPACE_CALC(MINABTPTRS); maxforkoff =3D maxforkoff >> 3; /* rounded down */ =20 - if (offset >=3D minforkoff && offset < maxforkoff) - return offset; if (offset >=3D maxforkoff) return maxforkoff; + if (offset >=3D minforkoff) + return offset; return 0; } =20 @@ -189,6 +250,8 @@ xfs_attr_shortform_create(xfs_da_args_t *args) xfs_inode_t *dp; xfs_ifork_t *ifp; =20 + trace_xfs_attr_sf_create(args); + dp =3D args->dp; ASSERT(dp !=3D NULL); ifp =3D dp->i_afp; @@ -222,13 +285,11 @@ xfs_attr_shortform_add(xfs_da_args_t *args, int forko= ff) xfs_inode_t *dp; xfs_ifork_t *ifp; =20 + trace_xfs_attr_sf_add(args); + dp =3D args->dp; mp =3D dp->i_mount; dp->i_d.di_forkoff =3D forkoff; - dp->i_df.if_ext_max =3D - XFS_IFORK_DSIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); - dp->i_afp->if_ext_max =3D - XFS_IFORK_ASIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); =20 ifp =3D dp->i_afp; ASSERT(ifp->if_flags & XFS_IFINLINE); @@ -280,7 +341,6 @@ xfs_attr_fork_reset( ASSERT(ip->i_d.di_anextents =3D=3D 0); ASSERT(ip->i_afp =3D=3D NULL); =20 - ip->i_df.if_ext_max =3D XFS_IFORK_DSIZE(ip) / sizeof(xfs_bmbt_rec_t); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); } =20 @@ -296,6 +356,8 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) xfs_mount_t *mp; xfs_inode_t *dp; =20 + trace_xfs_attr_sf_remove(args); + dp =3D args->dp; mp =3D dp->i_mount; base =3D sizeof(xfs_attr_sf_hdr_t); @@ -343,10 +405,6 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) (args->op_flags & XFS_DA_OP_ADDNAME) || !(mp->m_flags & XFS_MOUNT_ATTR2) || dp->i_d.di_format =3D=3D XFS_DINODE_FMT_BTREE); - dp->i_afp->if_ext_max =3D - XFS_IFORK_ASIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); - dp->i_df.if_ext_max =3D - XFS_IFORK_DSIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA); } @@ -368,6 +426,8 @@ xfs_attr_shortform_lookup(xfs_da_args_t *args) int i; xfs_ifork_t *ifp; =20 + trace_xfs_attr_sf_lookup(args); + ifp =3D args->dp->i_afp; ASSERT(ifp->if_flags & XFS_IFINLINE); sf =3D (xfs_attr_shortform_t *)ifp->if_u1.if_data; @@ -436,9 +496,11 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) char *tmpbuffer; int error, i, size; xfs_dablk_t blkno; - xfs_dabuf_t *bp; + struct xfs_buf *bp; xfs_ifork_t *ifp; =20 + trace_xfs_attr_sf_to_leaf(args); + dp =3D args->dp; ifp =3D dp->i_afp; sf =3D (xfs_attr_shortform_t *)ifp->if_u1.if_data; @@ -504,8 +566,6 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) error =3D 0; =20 out: - if(bp) - xfs_da_buf_done(bp); kmem_free(tmpbuffer); return(error); } @@ -515,15 +575,17 @@ out: * a shortform attribute list. */ int -xfs_attr_shortform_allfit(xfs_dabuf_t *bp, xfs_inode_t *dp) +xfs_attr_shortform_allfit( + struct xfs_buf *bp, + struct xfs_inode *dp) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_entry_t *entry; xfs_attr_leaf_name_local_t *name_loc; int bytes, i; =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); =20 entry =3D &leaf->entries[0]; bytes =3D sizeof(struct xfs_attr_sf_hdr); @@ -552,7 +614,10 @@ xfs_attr_shortform_allfit(xfs_dabuf_t *bp, xfs_inode_t= *dp) * Convert a leaf attribute list to shortform attribute list */ int -xfs_attr_leaf_to_shortform(xfs_dabuf_t *bp, xfs_da_args_t *args, int forko= ff) +xfs_attr_leaf_to_shortform( + struct xfs_buf *bp, + xfs_da_args_t *args, + int forkoff) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_entry_t *entry; @@ -562,15 +627,17 @@ xfs_attr_leaf_to_shortform(xfs_dabuf_t *bp, xfs_da_ar= gs_t *args, int forkoff) char *tmpbuffer; int error, i; =20 + trace_xfs_attr_leaf_to_sf(args); + dp =3D args->dp; tmpbuffer =3D kmem_alloc(XFS_LBSIZE(dp->i_mount), KM_SLEEP); ASSERT(tmpbuffer !=3D NULL); =20 ASSERT(bp !=3D NULL); - memcpy(tmpbuffer, bp->data, XFS_LBSIZE(dp->i_mount)); + memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(dp->i_mount)); leaf =3D (xfs_attr_leafblock_t *)tmpbuffer; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); - memset(bp->data, 0, XFS_LBSIZE(dp->i_mount)); + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + memset(bp->b_addr, 0, XFS_LBSIZE(dp->i_mount)); =20 /* * Clean out the prior contents of the attribute list. @@ -631,30 +698,30 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) xfs_attr_leafblock_t *leaf; xfs_da_intnode_t *node; xfs_inode_t *dp; - xfs_dabuf_t *bp1, *bp2; + struct xfs_buf *bp1, *bp2; xfs_dablk_t blkno; int error; =20 + trace_xfs_attr_leaf_to_node(args); + dp =3D args->dp; bp1 =3D bp2 =3D NULL; error =3D xfs_da_grow_inode(args, &blkno); if (error) goto out; - error =3D xfs_da_read_buf(args->trans, args->dp, 0, -1, &bp1, - XFS_ATTR_FORK); + error =3D xfs_attr_leaf_read(args->trans, args->dp, 0, -1, &bp1); if (error) goto out; - ASSERT(bp1 !=3D NULL); + bp2 =3D NULL; error =3D xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp2, XFS_ATTR_FORK); if (error) goto out; - ASSERT(bp2 !=3D NULL); - memcpy(bp2->data, bp1->data, XFS_LBSIZE(dp->i_mount)); - xfs_da_buf_done(bp1); + bp2->b_ops =3D bp1->b_ops; + memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(dp->i_mount)); bp1 =3D NULL; - xfs_da_log_buf(args->trans, bp2, 0, XFS_LBSIZE(dp->i_mount) - 1); + xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(dp->i_mount) - 1); =20 /* * Set up the new root node. @@ -662,21 +729,17 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) error =3D xfs_da_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); if (error) goto out; - node =3D bp1->data; - leaf =3D bp2->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + node =3D bp1->b_addr; + leaf =3D bp2->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); /* both on-disk, don't endian-flip twice */ node->btree[0].hashval =3D leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; node->btree[0].before =3D cpu_to_be32(blkno); node->hdr.count =3D cpu_to_be16(1); - xfs_da_log_buf(args->trans, bp1, 0, XFS_LBSIZE(dp->i_mount) - 1); + xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(dp->i_mount) - 1); error =3D 0; out: - if (bp1) - xfs_da_buf_done(bp1); - if (bp2) - xfs_da_buf_done(bp2); return(error); } =20 @@ -690,22 +753,27 @@ out: * or a leaf in a node attribute list. */ STATIC int -xfs_attr_leaf_create(xfs_da_args_t *args, xfs_dablk_t blkno, xfs_dabuf_t *= *bpp) +xfs_attr_leaf_create( + xfs_da_args_t *args, + xfs_dablk_t blkno, + struct xfs_buf **bpp) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_hdr_t *hdr; xfs_inode_t *dp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; =20 + trace_xfs_attr_leaf_create(args); + dp =3D args->dp; ASSERT(dp !=3D NULL); error =3D xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp, XFS_ATTR_FORK); if (error) return(error); - ASSERT(bp !=3D NULL); - leaf =3D bp->data; + bp->b_ops =3D &xfs_attr_leaf_buf_ops; + leaf =3D bp->b_addr; memset((char *)leaf, 0, XFS_LBSIZE(dp->i_mount)); hdr =3D &leaf->hdr; hdr->info.magic =3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC); @@ -719,7 +787,7 @@ xfs_attr_leaf_create(xfs_da_args_t *args, xfs_dablk_t b= lkno, xfs_dabuf_t **bpp) hdr->freemap[0].size =3D cpu_to_be16(be16_to_cpu(hdr->firstused) - sizeof(xfs_attr_leaf_hdr_t)); =20 - xfs_da_log_buf(args->trans, bp, 0, XFS_LBSIZE(dp->i_mount) - 1); + xfs_trans_log_buf(args->trans, bp, 0, XFS_LBSIZE(dp->i_mount) - 1); =20 *bpp =3D bp; return(0); @@ -735,6 +803,8 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state= _blk_t *oldblk, xfs_dablk_t blkno; int error; =20 + trace_xfs_attr_leaf_split(state->args); + /* * Allocate space for a new leaf node. */ @@ -764,10 +834,13 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_sta= te_blk_t *oldblk, * * Insert the "new" entry in the correct block. */ - if (state->inleaf) + if (state->inleaf) { + trace_xfs_attr_leaf_add_old(state->args); error =3D xfs_attr_leaf_add(oldblk->bp, state->args); - else + } else { + trace_xfs_attr_leaf_add_new(state->args); error =3D xfs_attr_leaf_add(newblk->bp, state->args); + } =20 /* * Update last hashval in each block since we added the name. @@ -781,15 +854,19 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_sta= te_blk_t *oldblk, * Add a name to the leaf attribute list structure. */ int -xfs_attr_leaf_add(xfs_dabuf_t *bp, xfs_da_args_t *args) +xfs_attr_leaf_add( + struct xfs_buf *bp, + struct xfs_da_args *args) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_hdr_t *hdr; xfs_attr_leaf_map_t *map; int tablesize, entsize, sum, tmp, i; =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + trace_xfs_attr_leaf_add(args); + + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); ASSERT((args->index >=3D 0) && (args->index <=3D be16_to_cpu(leaf->hdr.count))); hdr =3D &leaf->hdr; @@ -833,7 +910,7 @@ xfs_attr_leaf_add(xfs_dabuf_t *bp, xfs_da_args_t *args) * Compact the entries to coalesce free space. * This may change the hdr->count via dropping INCOMPLETE entries. */ - xfs_attr_leaf_compact(args->trans, bp); + xfs_attr_leaf_compact(args, bp); =20 /* * After compaction, the block is guaranteed to have only one @@ -850,7 +927,10 @@ xfs_attr_leaf_add(xfs_dabuf_t *bp, xfs_da_args_t *args) * Add a name to a leaf attribute list structure. */ STATIC int -xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) +xfs_attr_leaf_add_work( + struct xfs_buf *bp, + xfs_da_args_t *args, + int mapindex) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_hdr_t *hdr; @@ -861,8 +941,10 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t = *args, int mapindex) xfs_mount_t *mp; int tmp, i; =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + trace_xfs_attr_leaf_add_work(args); + + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); hdr =3D &leaf->hdr; ASSERT((mapindex >=3D 0) && (mapindex < XFS_ATTR_LEAF_MAPSIZE)); ASSERT((args->index >=3D 0) && (args->index <=3D be16_to_cpu(hdr->count))= ); @@ -875,7 +957,7 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *= args, int mapindex) tmp =3D be16_to_cpu(hdr->count) - args->index; tmp *=3D sizeof(xfs_attr_leaf_entry_t); memmove((char *)(entry+1), (char *)entry, tmp); - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry))); } be16_add_cpu(&hdr->count, 1); @@ -907,7 +989,7 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *= args, int mapindex) args->index2++; } } - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); ASSERT((args->index =3D=3D 0) || (be32_to_cpu(entry->hashval) >=3D be32_to_cpu((entry-1)->hashval))= ); @@ -915,8 +997,6 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *= args, int mapindex) (be32_to_cpu(entry->hashval) <=3D be32_to_cpu((entry+1)->hashval))= ); =20 /* - * Copy the attribute name and value into the new space. - * * For "remote" attribute values, simply note that we need to * allocate space for the "remote" value. We can't actually * allocate the extents in this transaction, and we can't decide @@ -941,7 +1021,7 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t = *args, int mapindex) args->rmtblkno =3D 1; args->rmtblkcnt =3D XFS_B_TO_FSB(mp, args->valuelen); } - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), xfs_attr_leaf_entsize(leaf, args->index))); =20 @@ -965,7 +1045,7 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t = *args, int mapindex) } } be16_add_cpu(&hdr->usedbytes, xfs_attr_leaf_entsize(leaf, args->index)); - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, hdr, sizeof(*hdr))); return(0); } @@ -974,24 +1054,28 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_= t *args, int mapindex) * Garbage collect a leaf attribute list block by copying it to a new buff= er. */ STATIC void -xfs_attr_leaf_compact(xfs_trans_t *trans, xfs_dabuf_t *bp) +xfs_attr_leaf_compact( + struct xfs_da_args *args, + struct xfs_buf *bp) { - xfs_attr_leafblock_t *leaf_s, *leaf_d; - xfs_attr_leaf_hdr_t *hdr_s, *hdr_d; - xfs_mount_t *mp; - char *tmpbuffer; + xfs_attr_leafblock_t *leaf_s, *leaf_d; + xfs_attr_leaf_hdr_t *hdr_s, *hdr_d; + struct xfs_trans *trans =3D args->trans; + struct xfs_mount *mp =3D trans->t_mountp; + char *tmpbuffer; + + trace_xfs_attr_leaf_compact(args); =20 - mp =3D trans->t_mountp; tmpbuffer =3D kmem_alloc(XFS_LBSIZE(mp), KM_SLEEP); ASSERT(tmpbuffer !=3D NULL); - memcpy(tmpbuffer, bp->data, XFS_LBSIZE(mp)); - memset(bp->data, 0, XFS_LBSIZE(mp)); + memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(mp)); + memset(bp->b_addr, 0, XFS_LBSIZE(mp)); =20 /* * Copy basic information */ leaf_s =3D (xfs_attr_leafblock_t *)tmpbuffer; - leaf_d =3D bp->data; + leaf_d =3D bp->b_addr; hdr_s =3D &leaf_s->hdr; hdr_d =3D &leaf_d->hdr; hdr_d->info =3D hdr_s->info; /* struct copy */ @@ -1014,7 +1098,7 @@ xfs_attr_leaf_compact(xfs_trans_t *trans, xfs_dabuf_t= *bp) */ xfs_attr_leaf_moveents(leaf_s, 0, leaf_d, 0, be16_to_cpu(hdr_s->count), mp); - xfs_da_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); =20 kmem_free(tmpbuffer); } @@ -1046,12 +1130,15 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_= da_state_blk_t *blk1, */ ASSERT(blk1->magic =3D=3D XFS_ATTR_LEAF_MAGIC); ASSERT(blk2->magic =3D=3D XFS_ATTR_LEAF_MAGIC); - leaf1 =3D blk1->bp->data; - leaf2 =3D blk2->bp->data; - ASSERT(be16_to_cpu(leaf1->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); - ASSERT(be16_to_cpu(leaf2->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + leaf1 =3D blk1->bp->b_addr; + leaf2 =3D blk2->bp->b_addr; + ASSERT(leaf1->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + ASSERT(leaf2->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + ASSERT(leaf2->hdr.count =3D=3D 0); args =3D state->args; =20 + trace_xfs_attr_leaf_rebalance(args); + /* * Check ordering of blocks, reverse if it makes things simpler. * @@ -1063,8 +1150,8 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da= _state_blk_t *blk1, tmp_blk =3D blk1; blk1 =3D blk2; blk2 =3D tmp_blk; - leaf1 =3D blk1->bp->data; - leaf2 =3D blk2->bp->data; + leaf1 =3D blk1->bp->b_addr; + leaf2 =3D blk2->bp->b_addr; swap =3D 1; } hdr1 =3D &leaf1->hdr; @@ -1101,9 +1188,8 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da= _state_blk_t *blk1, max =3D be16_to_cpu(hdr2->firstused) - sizeof(xfs_attr_leaf_hdr_t); max -=3D be16_to_cpu(hdr2->count) * sizeof(xfs_attr_leaf_entry_t); - if (space > max) { - xfs_attr_leaf_compact(args->trans, blk2->bp); - } + if (space > max) + xfs_attr_leaf_compact(args, blk2->bp); =20 /* * Move high entries from leaf1 to low end of leaf2. @@ -1111,13 +1197,14 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_= da_state_blk_t *blk1, xfs_attr_leaf_moveents(leaf1, be16_to_cpu(hdr1->count) - count, leaf2, 0, count, state->mp); =20 - xfs_da_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); - xfs_da_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); + xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); + xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); } else if (count > be16_to_cpu(hdr1->count)) { /* * I assert that since all callers pass in an empty * second buffer, this code should never execute. */ + ASSERT(0); =20 /* * Figure the total bytes to be added to the destination leaf. @@ -1133,9 +1220,8 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da= _state_blk_t *blk1, max =3D be16_to_cpu(hdr1->firstused) - sizeof(xfs_attr_leaf_hdr_t); max -=3D be16_to_cpu(hdr1->count) * sizeof(xfs_attr_leaf_entry_t); - if (space > max) { - xfs_attr_leaf_compact(args->trans, blk1->bp); - } + if (space > max) + xfs_attr_leaf_compact(args, blk1->bp); =20 /* * Move low entries from leaf2 to high end of leaf1. @@ -1143,8 +1229,8 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da= _state_blk_t *blk1, xfs_attr_leaf_moveents(leaf2, 0, leaf1, be16_to_cpu(hdr1->count), count, state->mp); =20 - xfs_da_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); - xfs_da_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); + xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); + xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); } =20 /* @@ -1179,10 +1265,24 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_= da_state_blk_t *blk1, args->index2 =3D 0; args->blkno2 =3D blk2->blkno; } else { + /* + * On a double leaf split, the original attr location + * is already stored in blkno2/index2, so don't + * overwrite it overwise we corrupt the tree. + */ blk2->index =3D blk1->index - be16_to_cpu(leaf1->hdr.count); - args->index =3D args->index2 =3D blk2->index; - args->blkno =3D args->blkno2 =3D blk2->blkno; + args->index =3D blk2->index; + args->blkno =3D blk2->blkno; + if (!state->extravalid) { + /* + * set the new attr location to match the old + * one and let the higher level split code + * decide where in the leaf to place it. + */ + args->index2 =3D blk2->index; + args->blkno2 =3D blk2->blkno; + } } } else { ASSERT(state->inleaf =3D=3D 1); @@ -1213,8 +1313,8 @@ xfs_attr_leaf_figure_balance(xfs_da_state_t *state, /* * Set up environment. */ - leaf1 =3D blk1->bp->data; - leaf2 =3D blk2->bp->data; + leaf1 =3D blk1->bp->b_addr; + leaf2 =3D blk2->bp->b_addr; hdr1 =3D &leaf1->hdr; hdr2 =3D &leaf2->hdr; foundit =3D 0; @@ -1316,7 +1416,9 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *ac= tion) xfs_da_blkinfo_t *info; int count, bytes, forward, error, retval, i; xfs_dablk_t blkno; - xfs_dabuf_t *bp; + struct xfs_buf *bp; + + trace_xfs_attr_leaf_toosmall(state->args); =20 /* * Check for the degenerate case of the block being over 50% full. @@ -1324,8 +1426,8 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *ac= tion) * to coalesce with a sibling. */ blk =3D &state->path.blk[ state->path.active-1 ]; - info =3D blk->bp->data; - ASSERT(be16_to_cpu(info->magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + info =3D blk->bp->b_addr; + ASSERT(info->magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); leaf =3D (xfs_attr_leafblock_t *)info; count =3D be16_to_cpu(leaf->hdr.count); bytes =3D sizeof(xfs_attr_leaf_hdr_t) + @@ -1377,23 +1479,21 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *= action) blkno =3D be32_to_cpu(info->back); if (blkno =3D=3D 0) continue; - error =3D xfs_da_read_buf(state->args->trans, state->args->dp, - blkno, -1, &bp, XFS_ATTR_FORK); + error =3D xfs_attr_leaf_read(state->args->trans, state->args->dp, + blkno, -1, &bp); if (error) return(error); - ASSERT(bp !=3D NULL); =20 leaf =3D (xfs_attr_leafblock_t *)info; count =3D be16_to_cpu(leaf->hdr.count); bytes =3D state->blocksize - (state->blocksize>>2); bytes -=3D be16_to_cpu(leaf->hdr.usedbytes); - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + leaf =3D bp->b_addr; count +=3D be16_to_cpu(leaf->hdr.count); bytes -=3D be16_to_cpu(leaf->hdr.usedbytes); bytes -=3D count * sizeof(xfs_attr_leaf_entry_t); bytes -=3D sizeof(xfs_attr_leaf_hdr_t); - xfs_da_brelse(state->args->trans, bp); + xfs_trans_brelse(state->args->trans, bp); if (bytes >=3D 0) break; /* fits with at least 25% to spare */ } @@ -1431,7 +1531,9 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *ac= tion) * If two leaves are 37% full, when combined they will leave 25% free. */ int -xfs_attr_leaf_remove(xfs_dabuf_t *bp, xfs_da_args_t *args) +xfs_attr_leaf_remove( + struct xfs_buf *bp, + xfs_da_args_t *args) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_hdr_t *hdr; @@ -1441,8 +1543,10 @@ xfs_attr_leaf_remove(xfs_dabuf_t *bp, xfs_da_args_t = *args) int tablesize, tmp, i; xfs_mount_t *mp; =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + trace_xfs_attr_leaf_remove(args); + + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); hdr =3D &leaf->hdr; mp =3D args->trans->t_mountp; ASSERT((be16_to_cpu(hdr->count) > 0) @@ -1534,7 +1638,7 @@ xfs_attr_leaf_remove(xfs_dabuf_t *bp, xfs_da_args_t *= args) */ memset(xfs_attr_leaf_name(leaf, args->index), 0, entsize); be16_add_cpu(&hdr->usedbytes, -entsize); - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), entsize)); =20 @@ -1542,7 +1646,7 @@ xfs_attr_leaf_remove(xfs_dabuf_t *bp, xfs_da_args_t *= args) * sizeof(xfs_attr_leaf_entry_t); memmove((char *)entry, (char *)(entry+1), tmp); be16_add_cpu(&hdr->count, -1); - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry))); entry =3D &leaf->entries[be16_to_cpu(hdr->count)]; memset((char *)entry, 0, sizeof(xfs_attr_leaf_entry_t)); @@ -1572,7 +1676,7 @@ xfs_attr_leaf_remove(xfs_dabuf_t *bp, xfs_da_args_t *= args) } else { hdr->holes =3D 1; /* mark as needing compaction */ } - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, hdr, sizeof(*hdr))); =20 /* @@ -1597,16 +1701,18 @@ xfs_attr_leaf_unbalance(xfs_da_state_t *state, xfs_= da_state_blk_t *drop_blk, xfs_mount_t *mp; char *tmpbuffer; =20 + trace_xfs_attr_leaf_unbalance(state->args); + /* * Set up environment. */ mp =3D state->mp; ASSERT(drop_blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); ASSERT(save_blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); - drop_leaf =3D drop_blk->bp->data; - save_leaf =3D save_blk->bp->data; - ASSERT(be16_to_cpu(drop_leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); - ASSERT(be16_to_cpu(save_leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + drop_leaf =3D drop_blk->bp->b_addr; + save_leaf =3D save_blk->bp->b_addr; + ASSERT(drop_leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + ASSERT(save_leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); drop_hdr =3D &drop_leaf->hdr; save_hdr =3D &save_leaf->hdr; =20 @@ -1669,7 +1775,7 @@ xfs_attr_leaf_unbalance(xfs_da_state_t *state, xfs_da= _state_blk_t *drop_blk, kmem_free(tmpbuffer); } =20 - xfs_da_log_buf(state->args->trans, save_blk->bp, 0, + xfs_trans_log_buf(state->args->trans, save_blk->bp, 0, state->blocksize - 1); =20 /* @@ -1697,7 +1803,9 @@ xfs_attr_leaf_unbalance(xfs_da_state_t *state, xfs_da= _state_blk_t *drop_blk, * Don't change the args->value unless we find the attribute. */ int -xfs_attr_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_args_t *args) +xfs_attr_leaf_lookup_int( + struct xfs_buf *bp, + xfs_da_args_t *args) { xfs_attr_leafblock_t *leaf; xfs_attr_leaf_entry_t *entry; @@ -1706,8 +1814,10 @@ xfs_attr_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_arg= s_t *args) int probe, span; xfs_dahash_t hashval; =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + trace_xfs_attr_leaf_lookup(args); + + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); ASSERT(be16_to_cpu(leaf->hdr.count) < (XFS_LBSIZE(args->dp->i_mount)/8)); =20 @@ -1802,7 +1912,9 @@ xfs_attr_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_args= _t *args) * list structure. */ int -xfs_attr_leaf_getvalue(xfs_dabuf_t *bp, xfs_da_args_t *args) +xfs_attr_leaf_getvalue( + struct xfs_buf *bp, + xfs_da_args_t *args) { int valuelen; xfs_attr_leafblock_t *leaf; @@ -1810,8 +1922,8 @@ xfs_attr_leaf_getvalue(xfs_dabuf_t *bp, xfs_da_args_t= *args) xfs_attr_leaf_name_local_t *name_loc; xfs_attr_leaf_name_remote_t *name_rmt; =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); ASSERT(be16_to_cpu(leaf->hdr.count) < (XFS_LBSIZE(args->dp->i_mount)/8)); ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); @@ -1879,8 +1991,8 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, = int start_s, /* * Set up environment. */ - ASSERT(be16_to_cpu(leaf_s->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); - ASSERT(be16_to_cpu(leaf_d->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + ASSERT(leaf_s->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + ASSERT(leaf_d->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); hdr_s =3D &leaf_s->hdr; hdr_d =3D &leaf_d->hdr; ASSERT((be16_to_cpu(hdr_s->count) > 0) && @@ -2008,14 +2120,16 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s= , int start_s, * Return 0 unless leaf2 should go before leaf1. */ int -xfs_attr_leaf_order(xfs_dabuf_t *leaf1_bp, xfs_dabuf_t *leaf2_bp) +xfs_attr_leaf_order( + struct xfs_buf *leaf1_bp, + struct xfs_buf *leaf2_bp) { xfs_attr_leafblock_t *leaf1, *leaf2; =20 - leaf1 =3D leaf1_bp->data; - leaf2 =3D leaf2_bp->data; - ASSERT((be16_to_cpu(leaf1->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC) && - (be16_to_cpu(leaf2->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC)); + leaf1 =3D leaf1_bp->b_addr; + leaf2 =3D leaf2_bp->b_addr; + ASSERT((leaf1->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)) && + (leaf2->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC))); if ((be16_to_cpu(leaf1->hdr.count) > 0) && (be16_to_cpu(leaf2->hdr.count) > 0) && ((be32_to_cpu(leaf2->entries[0].hashval) < @@ -2033,12 +2147,14 @@ xfs_attr_leaf_order(xfs_dabuf_t *leaf1_bp, xfs_dabu= f_t *leaf2_bp) * Pick up the last hashvalue from a leaf block. */ xfs_dahash_t -xfs_attr_leaf_lasthash(xfs_dabuf_t *bp, int *count) +xfs_attr_leaf_lasthash( + struct xfs_buf *bp, + int *count) { xfs_attr_leafblock_t *leaf; =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); if (count) *count =3D be16_to_cpu(leaf->hdr.count); if (!leaf->hdr.count) @@ -2057,7 +2173,7 @@ xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int= index) xfs_attr_leaf_name_remote_t *name_rmt; int size; =20 - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); if (leaf->entries[index].flags & XFS_ATTR_LOCAL) { name_loc =3D xfs_attr_leaf_name_local(leaf, index); size =3D xfs_attr_leaf_entsize_local(name_loc->namelen, @@ -2107,7 +2223,7 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) xfs_attr_leafblock_t *leaf; xfs_attr_leaf_entry_t *entry; xfs_attr_leaf_name_remote_t *name_rmt; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; #ifdef DEBUG xfs_attr_leaf_name_local_t *name_loc; @@ -2115,18 +2231,15 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) char *name; #endif /* DEBUG */ =20 + trace_xfs_attr_leaf_clearflag(args); /* * Set up the operation. */ - error =3D xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp, - XFS_ATTR_FORK); - if (error) { + error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + if (error) return(error); - } - ASSERT(bp !=3D NULL); =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + leaf =3D bp->b_addr; ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); ASSERT(args->index >=3D 0); entry =3D &leaf->entries[ args->index ]; @@ -2148,7 +2261,7 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) #endif /* DEBUG */ =20 entry->flags &=3D ~XFS_ATTR_INCOMPLETE; - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); =20 if (args->rmtblkno) { @@ -2156,10 +2269,9 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) name_rmt =3D xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->valueblk =3D cpu_to_be32(args->rmtblkno); name_rmt->valuelen =3D cpu_to_be32(args->valuelen); - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt))); } - xfs_da_buf_done(bp); =20 /* * Commit the flag value change and start the next trans in series. @@ -2176,37 +2288,34 @@ xfs_attr_leaf_setflag(xfs_da_args_t *args) xfs_attr_leafblock_t *leaf; xfs_attr_leaf_entry_t *entry; xfs_attr_leaf_name_remote_t *name_rmt; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; =20 + trace_xfs_attr_leaf_setflag(args); + /* * Set up the operation. */ - error =3D xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp, - XFS_ATTR_FORK); - if (error) { + error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + if (error) return(error); - } - ASSERT(bp !=3D NULL); =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + leaf =3D bp->b_addr; ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); ASSERT(args->index >=3D 0); entry =3D &leaf->entries[ args->index ]; =20 ASSERT((entry->flags & XFS_ATTR_INCOMPLETE) =3D=3D 0); entry->flags |=3D XFS_ATTR_INCOMPLETE; - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); if ((entry->flags & XFS_ATTR_LOCAL) =3D=3D 0) { name_rmt =3D xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->valueblk =3D 0; name_rmt->valuelen =3D 0; - xfs_da_log_buf(args->trans, bp, + xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt))); } - xfs_da_buf_done(bp); =20 /* * Commit the flag value change and start the next trans in series. @@ -2227,7 +2336,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) xfs_attr_leafblock_t *leaf1, *leaf2; xfs_attr_leaf_entry_t *entry1, *entry2; xfs_attr_leaf_name_remote_t *name_rmt; - xfs_dabuf_t *bp1, *bp2; + struct xfs_buf *bp1, *bp2; int error; #ifdef DEBUG xfs_attr_leaf_name_local_t *name_loc; @@ -2235,38 +2344,33 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) char *name1, *name2; #endif /* DEBUG */ =20 + trace_xfs_attr_leaf_flipflags(args); + /* * Read the block containing the "old" attr */ - error =3D xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp1, - XFS_ATTR_FORK); - if (error) { - return(error); - } - ASSERT(bp1 !=3D NULL); + error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp1= ); + if (error) + return error; =20 /* * Read the block containing the "new" attr, if it is different */ if (args->blkno2 !=3D args->blkno) { - error =3D xfs_da_read_buf(args->trans, args->dp, args->blkno2, - -1, &bp2, XFS_ATTR_FORK); - if (error) { - return(error); - } - ASSERT(bp2 !=3D NULL); + error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno2, + -1, &bp2); + if (error) + return error; } else { bp2 =3D bp1; } =20 - leaf1 =3D bp1->data; - ASSERT(be16_to_cpu(leaf1->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + leaf1 =3D bp1->b_addr; ASSERT(args->index < be16_to_cpu(leaf1->hdr.count)); ASSERT(args->index >=3D 0); entry1 =3D &leaf1->entries[ args->index ]; =20 - leaf2 =3D bp2->data; - ASSERT(be16_to_cpu(leaf2->hdr.info.magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + leaf2 =3D bp2->b_addr; ASSERT(args->index2 < be16_to_cpu(leaf2->hdr.count)); ASSERT(args->index2 >=3D 0); entry2 =3D &leaf2->entries[ args->index2 ]; @@ -2299,30 +2403,27 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) ASSERT((entry2->flags & XFS_ATTR_INCOMPLETE) =3D=3D 0); =20 entry1->flags &=3D ~XFS_ATTR_INCOMPLETE; - xfs_da_log_buf(args->trans, bp1, + xfs_trans_log_buf(args->trans, bp1, XFS_DA_LOGRANGE(leaf1, entry1, sizeof(*entry1))); if (args->rmtblkno) { ASSERT((entry1->flags & XFS_ATTR_LOCAL) =3D=3D 0); name_rmt =3D xfs_attr_leaf_name_remote(leaf1, args->index); name_rmt->valueblk =3D cpu_to_be32(args->rmtblkno); name_rmt->valuelen =3D cpu_to_be32(args->valuelen); - xfs_da_log_buf(args->trans, bp1, + xfs_trans_log_buf(args->trans, bp1, XFS_DA_LOGRANGE(leaf1, name_rmt, sizeof(*name_rmt))); } =20 entry2->flags |=3D XFS_ATTR_INCOMPLETE; - xfs_da_log_buf(args->trans, bp2, + xfs_trans_log_buf(args->trans, bp2, XFS_DA_LOGRANGE(leaf2, entry2, sizeof(*entry2))); if ((entry2->flags & XFS_ATTR_LOCAL) =3D=3D 0) { name_rmt =3D xfs_attr_leaf_name_remote(leaf2, args->index2); name_rmt->valueblk =3D 0; name_rmt->valuelen =3D 0; - xfs_da_log_buf(args->trans, bp2, + xfs_trans_log_buf(args->trans, bp2, XFS_DA_LOGRANGE(leaf2, name_rmt, sizeof(*name_rmt))); } - xfs_da_buf_done(bp1); - if (bp1 !=3D bp2) - xfs_da_buf_done(bp2); =20 /* * Commit the flag value change and start the next trans in series. diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 5a626b0..b328a0b 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -18,10 +18,6 @@ =20 #include =20 -#ifdef DEBUG -STATIC void -xfs_bmap_check_leaf_extents(xfs_btree_cur_t *cur, xfs_inode_t *ip, int whi= chfork); -#endif =20 kmem_zone_t *xfs_bmap_free_item_zone; =20 @@ -29,6 +25,16 @@ kmem_zone_t *xfs_bmap_free_item_zone; * Prototypes for internal bmap routines. */ =20 +#ifdef DEBUG +STATIC void +xfs_bmap_check_leaf_extents( + struct xfs_btree_cur *cur, + struct xfs_inode *ip, + int whichfork); +#else +#define xfs_bmap_check_leaf_extents(cur, ip, whichfork) do { } while (0) +#endif + =20 /* * Called from xfs_bmap_add_attrfork to handle extents format files. @@ -53,75 +59,6 @@ xfs_bmap_add_attrfork_local( int *flags); /* inode logging flags */ =20 /* - * Called by xfs_bmapi to update file extent records and the btree - * after allocating space (or doing a delayed allocation). - */ -STATIC int /* error */ -xfs_bmap_add_extent( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - xfs_fsblock_t *first, /* pointer to firstblock variable */ - xfs_bmap_free_t *flist, /* list of extents to be freed */ - int *logflagsp, /* inode logging flags */ - int whichfork, /* data or attr fork */ - int rsvd); /* OK to allocate reserved blocks */ - -/* - * Called by xfs_bmap_add_extent to handle cases converting a delayed - * allocation to a real allocation. - */ -STATIC int /* error */ -xfs_bmap_add_extent_delay_real( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - xfs_filblks_t *dnew, /* new delayed-alloc indirect blocks */ - xfs_fsblock_t *first, /* pointer to firstblock variable */ - xfs_bmap_free_t *flist, /* list of extents to be freed */ - int *logflagsp, /* inode logging flags */ - int rsvd); /* OK to allocate reserved blocks */ - -/* - * Called by xfs_bmap_add_extent to handle cases converting a hole - * to a delayed allocation. - */ -STATIC int /* error */ -xfs_bmap_add_extent_hole_delay( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp,/* inode logging flags */ - int rsvd); /* OK to allocate reserved blocks */ - -/* - * Called by xfs_bmap_add_extent to handle cases converting a hole - * to a real allocation. - */ -STATIC int /* error */ -xfs_bmap_add_extent_hole_real( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t *cur, /* if null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp, /* inode logging flags */ - int whichfork); /* data or attr fork */ - -/* - * Called by xfs_bmap_add_extent to handle cases converting an unwritten - * allocation to a real allocation or vice versa. - */ -STATIC int /* error */ -xfs_bmap_add_extent_unwritten_real( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp); /* inode logging flags */ - -/* * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. * It figures out where to ask the underlying allocator to put the new ext= ent. */ @@ -144,22 +81,6 @@ xfs_bmap_btree_to_extents( int whichfork); /* data or attr fork */ =20 /* - * Called by xfs_bmapi to update file extent records and the btree - * after removing space (or undoing a delayed allocation). - */ -STATIC int /* error */ -xfs_bmap_del_extent( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_trans_t *tp, /* current trans pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_bmap_free_t *flist, /* list of extents to be freed */ - xfs_btree_cur_t *cur, /* if null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp,/* inode logging flags */ - int whichfork, /* data or attr fork */ - int rsvd); /* OK to allocate reserved blocks */ - -/* * Convert an extents-format file into a btree-format file. * The new file will have a root block (in the inode) and a single child b= lock. */ @@ -189,19 +110,6 @@ xfs_bmap_local_to_extents( int whichfork); /* data or attr fork */ =20 /* - * Check the last inode extent to determine whether this allocation will r= esult - * in blocks being allocated at the end of the file. When we allocate new = data - * blocks at the end of the file which do not start at the previous data b= lock, - * we will try to align the new blocks at stripe unit boundaries. - */ -STATIC int /* error */ -xfs_bmap_isaeof( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fileoff_t off, /* file offset in fsblocks */ - int whichfork, /* data or attribute fork */ - char *aeof); /* return value */ - -/* * Compute the worst-case number of indirect blocks that will be used * for ip's delayed extent of length "len". */ @@ -283,7 +191,27 @@ xfs_bmbt_lookup_ge( } =20 /* -* Update the record referred to by cur to the value given + * Check if the inode needs to be converted to btree format. + */ +static inline bool xfs_bmap_needs_btree(struct xfs_inode *ip, int whichfor= k) +{ + return XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_NEXTENTS(ip, whichfork) > + XFS_IFORK_MAXEXT(ip, whichfork); +} + +/* + * Check if the inode should be converted to extent format. + */ +static inline bool xfs_bmap_wants_extents(struct xfs_inode *ip, int whichf= ork) +{ + return XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_BTREE && + XFS_IFORK_NEXTENTS(ip, whichfork) <=3D + XFS_IFORK_MAXEXT(ip, whichfork); +} + +/* + * Update the record referred to by cur to the value given * by [off, bno, len, state]. * This either works (return 0) or gets an EFSCORRUPTED error. */ @@ -388,7 +316,7 @@ xfs_bmap_add_attrfork_local( =20 if (ip->i_df.if_bytes <=3D XFS_IFORK_DSIZE(ip)) return 0; - if ((ip->i_d.di_mode & S_IFMT) =3D=3D S_IFDIR) { + if (S_ISDIR(ip->i_d.di_mode)) { mp =3D ip->i_mount; memset(&dargs, 0, sizeof(dargs)); dargs.dp =3D ip; @@ -405,188 +333,13 @@ xfs_bmap_add_attrfork_local( } =20 /* - * Called by xfs_bmapi to update file extent records and the btree - * after allocating space (or doing a delayed allocation). - */ -STATIC int /* error */ -xfs_bmap_add_extent( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - xfs_fsblock_t *first, /* pointer to firstblock variable */ - xfs_bmap_free_t *flist, /* list of extents to be freed */ - int *logflagsp, /* inode logging flags */ - int whichfork, /* data or attr fork */ - int rsvd) /* OK to use reserved data blocks */ -{ - xfs_btree_cur_t *cur; /* btree cursor or null */ - xfs_filblks_t da_new; /* new count del alloc blocks used */ - xfs_filblks_t da_old; /* old count del alloc blocks used */ - int error; /* error return value */ - xfs_ifork_t *ifp; /* inode fork ptr */ - int logflags; /* returned value */ - xfs_extnum_t nextents; /* number of extents in file now */ - - XFS_STATS_INC(xs_add_exlist); - cur =3D *curp; - ifp =3D XFS_IFORK_PTR(ip, whichfork); - nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - ASSERT(idx <=3D nextents); - da_old =3D da_new =3D 0; - error =3D 0; - /* - * This is the first extent added to a new/empty file. - * Special case this one, so other routines get to assume there are - * already extents in the list. - */ - if (nextents =3D=3D 0) { - xfs_iext_insert(ip, 0, 1, new, - whichfork =3D=3D XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); - - ASSERT(cur =3D=3D NULL); - ifp->if_lastex =3D 0; - if (!isnullstartblock(new->br_startblock)) { - XFS_IFORK_NEXT_SET(ip, whichfork, 1); - logflags =3D XFS_ILOG_CORE | xfs_ilog_fext(whichfork); - } else - logflags =3D 0; - } - /* - * Any kind of new delayed allocation goes here. - */ - else if (isnullstartblock(new->br_startblock)) { - if (cur) - ASSERT((cur->bc_private.b.flags & - XFS_BTCUR_BPRV_WASDEL) =3D=3D 0); - if ((error =3D xfs_bmap_add_extent_hole_delay(ip, idx, new, - &logflags, rsvd))) - goto done; - } - /* - * Real allocation off the end of the file. - */ - else if (idx =3D=3D nextents) { - if (cur) - ASSERT((cur->bc_private.b.flags & - XFS_BTCUR_BPRV_WASDEL) =3D=3D 0); - if ((error =3D xfs_bmap_add_extent_hole_real(ip, idx, cur, new, - &logflags, whichfork))) - goto done; - } else { - xfs_bmbt_irec_t prev; /* old extent at offset idx */ - - /* - * Get the record referred to by idx. - */ - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx), &prev); - /* - * If it's a real allocation record, and the new allocation ends - * after the start of the referred to record, then we're filling - * in a delayed or unwritten allocation with a real one, or - * converting real back to unwritten. - */ - if (!isnullstartblock(new->br_startblock) && - new->br_startoff + new->br_blockcount > prev.br_startoff) { - if (prev.br_state !=3D XFS_EXT_UNWRITTEN && - isnullstartblock(prev.br_startblock)) { - da_old =3D startblockval(prev.br_startblock); - if (cur) - ASSERT(cur->bc_private.b.flags & - XFS_BTCUR_BPRV_WASDEL); - if ((error =3D xfs_bmap_add_extent_delay_real(ip, - idx, &cur, new, &da_new, first, flist, - &logflags, rsvd))) - goto done; - } else if (new->br_state =3D=3D XFS_EXT_NORM) { - ASSERT(new->br_state =3D=3D XFS_EXT_NORM); - if ((error =3D xfs_bmap_add_extent_unwritten_real( - ip, idx, &cur, new, &logflags))) - goto done; - } else { - ASSERT(new->br_state =3D=3D XFS_EXT_UNWRITTEN); - if ((error =3D xfs_bmap_add_extent_unwritten_real( - ip, idx, &cur, new, &logflags))) - goto done; - } - ASSERT(*curp =3D=3D cur || *curp =3D=3D NULL); - } - /* - * Otherwise we're filling in a hole with an allocation. - */ - else { - if (cur) - ASSERT((cur->bc_private.b.flags & - XFS_BTCUR_BPRV_WASDEL) =3D=3D 0); - if ((error =3D xfs_bmap_add_extent_hole_real(ip, idx, cur, - new, &logflags, whichfork))) - goto done; - } - } - - ASSERT(*curp =3D=3D cur || *curp =3D=3D NULL); - /* - * Convert to a btree if necessary. - */ - if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max) { - int tmp_logflags; /* partial log flag return val */ - - ASSERT(cur =3D=3D NULL); - error =3D xfs_bmap_extents_to_btree(ip->i_transp, ip, first, - flist, &cur, da_old > 0, &tmp_logflags, whichfork); - logflags |=3D tmp_logflags; - if (error) - goto done; - } - /* - * Adjust for changes in reserved delayed indirect blocks. - * Nothing to do for disk quotas here. - */ - if (da_old || da_new) { - xfs_filblks_t nblks; - - nblks =3D da_new; - if (cur) - nblks +=3D cur->bc_private.b.allocated; - ASSERT(nblks <=3D da_old); - if (nblks < da_old) - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, - (int64_t)(da_old - nblks), rsvd); - } - /* - * Clear out the allocated field, done with it now in any case. - */ - if (cur) { - cur->bc_private.b.allocated =3D 0; - *curp =3D cur; - } -done: -#ifdef DEBUG - if (!error) - xfs_bmap_check_leaf_extents(*curp, ip, whichfork); -#endif - *logflagsp =3D logflags; - return error; -} - -/* - * Called by xfs_bmap_add_extent to handle cases converting a delayed - * allocation to a real allocation. + * Convert a delayed allocation to a real allocation. */ STATIC int /* error */ xfs_bmap_add_extent_delay_real( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - xfs_filblks_t *dnew, /* new delayed-alloc indirect blocks */ - xfs_fsblock_t *first, /* pointer to firstblock variable */ - xfs_bmap_free_t *flist, /* list of extents to be freed */ - int *logflagsp, /* inode logging flags */ - int rsvd) /* OK to use reserved data block allocation */ + struct xfs_bmalloca *bma) { - xfs_btree_cur_t *cur; /* btree cursor */ + struct xfs_bmbt_irec *new =3D &bma->got; int diff; /* temp value */ xfs_bmbt_rec_host_t *ep; /* extent entry for idx */ int error; /* error return value */ @@ -597,10 +350,22 @@ xfs_bmap_add_extent_delay_real( /* left is 0, right is 1, prev is 2 */ int rval=3D0; /* return value (logging flags) */ int state =3D 0;/* state bits, accessed thru macros */ - xfs_filblks_t temp=3D0; /* value for dnew calculations */ - xfs_filblks_t temp2=3D0;/* value for dnew calculations */ + xfs_filblks_t da_new; /* new count del alloc blocks used */ + xfs_filblks_t da_old; /* old count del alloc blocks used */ + xfs_filblks_t temp=3D0; /* value for da_new calculations */ + xfs_filblks_t temp2=3D0;/* value for da_new calculations */ int tmp_rval; /* partial logging flags */ =20 + ifp =3D XFS_IFORK_PTR(bma->ip, XFS_DATA_FORK); + + ASSERT(bma->idx >=3D 0); + ASSERT(bma->idx <=3D ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); + ASSERT(!isnullstartblock(new->br_startblock)); + ASSERT(!bma->cur || + (bma->cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL)); + + XFS_STATS_INC(xs_add_exlist); + #define LEFT r[0] #define RIGHT r[1] #define PREV r[2] @@ -608,14 +373,15 @@ xfs_bmap_add_extent_delay_real( /* * Set up a bunch of variables to make the tests simpler. */ - cur =3D *curp; - ifp =3D XFS_IFORK_PTR(ip, XFS_DATA_FORK); - ep =3D xfs_iext_get_ext(ifp, idx); + ep =3D xfs_iext_get_ext(ifp, bma->idx); xfs_bmbt_get_all(ep, &PREV); new_endoff =3D new->br_startoff + new->br_blockcount; ASSERT(PREV.br_startoff <=3D new->br_startoff); ASSERT(PREV.br_startoff + PREV.br_blockcount >=3D new_endoff); =20 + da_old =3D startblockval(PREV.br_startblock); + da_new =3D 0; + /* * Set flags determining what part of the previous delayed allocation * extent is being replaced by a real allocation. @@ -629,9 +395,9 @@ xfs_bmap_add_extent_delay_real( * Check and set flags if this segment has a left neighbor. * Don't set contiguous if the combined extent would be too large. */ - if (idx > 0) { + if (bma->idx > 0) { state |=3D BMAP_LEFT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx - 1), &LEFT); =20 if (isnullstartblock(LEFT.br_startblock)) state |=3D BMAP_LEFT_DELAY; @@ -649,9 +415,9 @@ xfs_bmap_add_extent_delay_real( * Don't set contiguous if the combined extent would be too large. * Also check for all-three-contiguous being too large. */ - if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { + if (bma->idx < bma->ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)= { state |=3D BMAP_RIGHT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx + 1), &RIGHT); =20 if (isnullstartblock(RIGHT.br_startblock)) state |=3D BMAP_RIGHT_DELAY; @@ -682,38 +448,41 @@ xfs_bmap_add_extent_delay_real( * Filling in all of a previously delayed allocation extent. * The left and right neighbors are both contiguous with new. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + bma->idx--; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), LEFT.br_blockcount + PREV.br_blockcount + RIGHT.br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); =20 - xfs_iext_remove(ip, idx, 2, state); - ip->i_df.if_lastex =3D idx - 1; - ip->i_d.di_nextents--; - if (cur =3D=3D NULL) + xfs_iext_remove(bma->ip, bma->idx + 1, 2, state); + bma->ip->i_d.di_nextents--; + if (bma->cur =3D=3D NULL) rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; else { rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, RIGHT.br_startoff, + error =3D xfs_bmbt_lookup_eq(bma->cur, RIGHT.br_startoff, RIGHT.br_startblock, - RIGHT.br_blockcount, &i))) + RIGHT.br_blockcount, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_btree_delete(cur, &i))) + error =3D xfs_btree_delete(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_btree_decrement(cur, 0, &i))) + error =3D xfs_btree_decrement(bma->cur, 0, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, LEFT.br_startoff, + error =3D xfs_bmbt_update(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + PREV.br_blockcount + - RIGHT.br_blockcount, LEFT.br_state))) + RIGHT.br_blockcount, LEFT.br_state); + if (error) goto done; } - *dnew =3D 0; break; =20 case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: @@ -721,29 +490,31 @@ xfs_bmap_add_extent_delay_real( * Filling in all of a previously delayed allocation extent. * The left neighbor is contiguous, the right is not. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + bma->idx--; + + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), LEFT.br_blockcount + PREV.br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); =20 - ip->i_df.if_lastex =3D idx - 1; - xfs_iext_remove(ip, idx, 1, state); - if (cur =3D=3D NULL) + xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); + if (bma->cur =3D=3D NULL) rval =3D XFS_ILOG_DEXT; else { rval =3D 0; - if ((error =3D xfs_bmbt_lookup_eq(cur, LEFT.br_startoff, + error =3D xfs_bmbt_lookup_eq(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount, - &i))) + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, LEFT.br_startoff, + error =3D xfs_bmbt_update(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + - PREV.br_blockcount, LEFT.br_state))) + PREV.br_blockcount, LEFT.br_state); + if (error) goto done; } - *dnew =3D 0; break; =20 case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -751,30 +522,30 @@ xfs_bmap_add_extent_delay_real( * Filling in all of a previously delayed allocation extent. * The right neighbor is contiguous, the left is not. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_bmbt_set_startblock(ep, new->br_startblock); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount + RIGHT.br_blockcount); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); =20 - ip->i_df.if_lastex =3D idx; - xfs_iext_remove(ip, idx + 1, 1, state); - if (cur =3D=3D NULL) + xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); + if (bma->cur =3D=3D NULL) rval =3D XFS_ILOG_DEXT; else { rval =3D 0; - if ((error =3D xfs_bmbt_lookup_eq(cur, RIGHT.br_startoff, + error =3D xfs_bmbt_lookup_eq(bma->cur, RIGHT.br_startoff, RIGHT.br_startblock, - RIGHT.br_blockcount, &i))) + RIGHT.br_blockcount, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, PREV.br_startoff, + error =3D xfs_bmbt_update(bma->cur, PREV.br_startoff, new->br_startblock, PREV.br_blockcount + - RIGHT.br_blockcount, PREV.br_state))) + RIGHT.br_blockcount, PREV.br_state); + if (error) goto done; } - *dnew =3D 0; break; =20 case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: @@ -783,27 +554,27 @@ xfs_bmap_add_extent_delay_real( * Neither the left nor right neighbors are contiguous with * the new one. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_bmbt_set_startblock(ep, new->br_startblock); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); =20 - ip->i_df.if_lastex =3D idx; - ip->i_d.di_nextents++; - if (cur =3D=3D NULL) + bma->ip->i_d.di_nextents++; + if (bma->cur =3D=3D NULL) rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; else { rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, new->br_startoff, + error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount, - &i))) + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); - cur->bc_rec.b.br_state =3D XFS_EXT_NORM; - if ((error =3D xfs_btree_insert(cur, &i))) + bma->cur->bc_rec.b.br_state =3D XFS_EXT_NORM; + error =3D xfs_btree_insert(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); } - *dnew =3D 0; break; =20 case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: @@ -811,38 +582,40 @@ xfs_bmap_add_extent_delay_real( * Filling in the first part of a previous delayed allocation. * The left neighbor is contiguous. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + trace_xfs_bmap_pre_update(bma->ip, bma->idx - 1, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx - 1), LEFT.br_blockcount + new->br_blockcount); xfs_bmbt_set_startoff(ep, PREV.br_startoff + new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx - 1, state, _THIS_IP_); =20 temp =3D PREV.br_blockcount - new->br_blockcount; - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); - ip->i_df.if_lastex =3D idx - 1; - if (cur =3D=3D NULL) + if (bma->cur =3D=3D NULL) rval =3D XFS_ILOG_DEXT; else { rval =3D 0; - if ((error =3D xfs_bmbt_lookup_eq(cur, LEFT.br_startoff, + error =3D xfs_bmbt_lookup_eq(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount, - &i))) + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, LEFT.br_startoff, + error =3D xfs_bmbt_update(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + new->br_blockcount, - LEFT.br_state))) + LEFT.br_state); + if (error) goto done; } - temp =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + da_new =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), startblockval(PREV.br_startblock)); - xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - *dnew =3D temp; + xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + bma->idx--; break; =20 case BMAP_LEFT_FILLING: @@ -850,43 +623,43 @@ xfs_bmap_add_extent_delay_real( * Filling in the first part of a previous delayed allocation. * The left neighbor is not contiguous. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_bmbt_set_startoff(ep, new_endoff); temp =3D PREV.br_blockcount - new->br_blockcount; xfs_bmbt_set_blockcount(ep, temp); - xfs_iext_insert(ip, idx, 1, new, state); - ip->i_df.if_lastex =3D idx; - ip->i_d.di_nextents++; - if (cur =3D=3D NULL) + xfs_iext_insert(bma->ip, bma->idx, 1, new, state); + bma->ip->i_d.di_nextents++; + if (bma->cur =3D=3D NULL) rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; else { rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, new->br_startoff, + error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount, - &i))) + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); - cur->bc_rec.b.br_state =3D XFS_EXT_NORM; - if ((error =3D xfs_btree_insert(cur, &i))) + bma->cur->bc_rec.b.br_state =3D XFS_EXT_NORM; + error =3D xfs_btree_insert(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); } - if (ip->i_d.di_format =3D=3D XFS_DINODE_FMT_EXTENTS && - ip->i_d.di_nextents > ip->i_df.if_ext_max) { - error =3D xfs_bmap_extents_to_btree(ip->i_transp, ip, - first, flist, &cur, 1, &tmp_rval, - XFS_DATA_FORK); + + if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { + error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, + &bma->cur, 1, &tmp_rval, XFS_DATA_FORK); rval |=3D tmp_rval; if (error) goto done; } - temp =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + da_new =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), startblockval(PREV.br_startblock) - - (cur ? cur->bc_private.b.allocated : 0)); - ep =3D xfs_iext_get_ext(ifp, idx + 1); - xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); - *dnew =3D temp; + (bma->cur ? bma->cur->bc_private.b.allocated : 0)); + ep =3D xfs_iext_get_ext(ifp, bma->idx + 1); + xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); + trace_xfs_bmap_post_update(bma->ip, bma->idx + 1, state, _THIS_IP_); break; =20 case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -895,36 +668,39 @@ xfs_bmap_add_extent_delay_real( * The right neighbor is contiguous with the new allocation. */ temp =3D PREV.br_blockcount - new->br_blockcount; - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); - trace_xfs_bmap_pre_update(ip, idx + 1, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx + 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); - xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, idx + 1), + xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, bma->idx + 1), new->br_startoff, new->br_startblock, new->br_blockcount + RIGHT.br_blockcount, RIGHT.br_state); - trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); - ip->i_df.if_lastex =3D idx + 1; - if (cur =3D=3D NULL) + trace_xfs_bmap_post_update(bma->ip, bma->idx + 1, state, _THIS_IP_); + if (bma->cur =3D=3D NULL) rval =3D XFS_ILOG_DEXT; else { rval =3D 0; - if ((error =3D xfs_bmbt_lookup_eq(cur, RIGHT.br_startoff, + error =3D xfs_bmbt_lookup_eq(bma->cur, RIGHT.br_startoff, RIGHT.br_startblock, - RIGHT.br_blockcount, &i))) + RIGHT.br_blockcount, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, new->br_startoff, + error =3D xfs_bmbt_update(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount + RIGHT.br_blockcount, - RIGHT.br_state))) + RIGHT.br_state); + if (error) goto done; } - temp =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + + da_new =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), startblockval(PREV.br_startblock)); - xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - *dnew =3D temp; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + bma->idx++; break; =20 case BMAP_RIGHT_FILLING: @@ -933,41 +709,43 @@ xfs_bmap_add_extent_delay_real( * The right neighbor is not contiguous. */ temp =3D PREV.br_blockcount - new->br_blockcount; - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); - xfs_iext_insert(ip, idx + 1, 1, new, state); - ip->i_df.if_lastex =3D idx + 1; - ip->i_d.di_nextents++; - if (cur =3D=3D NULL) + xfs_iext_insert(bma->ip, bma->idx + 1, 1, new, state); + bma->ip->i_d.di_nextents++; + if (bma->cur =3D=3D NULL) rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; else { rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, new->br_startoff, + error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount, - &i))) + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); - cur->bc_rec.b.br_state =3D XFS_EXT_NORM; - if ((error =3D xfs_btree_insert(cur, &i))) + bma->cur->bc_rec.b.br_state =3D XFS_EXT_NORM; + error =3D xfs_btree_insert(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); } - if (ip->i_d.di_format =3D=3D XFS_DINODE_FMT_EXTENTS && - ip->i_d.di_nextents > ip->i_df.if_ext_max) { - error =3D xfs_bmap_extents_to_btree(ip->i_transp, ip, - first, flist, &cur, 1, &tmp_rval, - XFS_DATA_FORK); + + if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { + error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, &bma->cur, 1, + &tmp_rval, XFS_DATA_FORK); rval |=3D tmp_rval; if (error) goto done; } - temp =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + da_new =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), startblockval(PREV.br_startblock) - - (cur ? cur->bc_private.b.allocated : 0)); - ep =3D xfs_iext_get_ext(ifp, idx); - xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - *dnew =3D temp; + (bma->cur ? bma->cur->bc_private.b.allocated : 0)); + ep =3D xfs_iext_get_ext(ifp, bma->idx); + xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + bma->idx++; break; =20 case 0: @@ -975,82 +753,83 @@ xfs_bmap_add_extent_delay_real( * Filling in the middle part of a previous delayed allocation. * Contiguity is impossible here. * This case is avoided almost all the time. + * + * We start with a delayed allocation: + * + * +ddddddddddddddddddddddddddddddddddddddddddddddddddddddd+ + * PREV @ idx + * + * and we are allocating: + * +rrrrrrrrrrrrrrrrr+ + * new + * + * and we set it up for insertion as: + * +ddddddddddddddddddd+rrrrrrrrrrrrrrrrr+ddddddddddddddddd+ + * new + * PREV @ idx LEFT RIGHT + * inserted at idx + 1 */ temp =3D new->br_startoff - PREV.br_startoff; - trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, temp); - r[0] =3D *new; - r[1].br_state =3D PREV.br_state; - r[1].br_startblock =3D 0; - r[1].br_startoff =3D new_endoff; temp2 =3D PREV.br_startoff + PREV.br_blockcount - new_endoff; - r[1].br_blockcount =3D temp2; - xfs_iext_insert(ip, idx + 1, 2, &r[0], state); - ip->i_df.if_lastex =3D idx + 1; - ip->i_d.di_nextents++; - if (cur =3D=3D NULL) + trace_xfs_bmap_pre_update(bma->ip, bma->idx, 0, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); /* truncate PREV */ + LEFT =3D *new; + RIGHT.br_state =3D PREV.br_state; + RIGHT.br_startblock =3D nullstartblock( + (int)xfs_bmap_worst_indlen(bma->ip, temp2)); + RIGHT.br_startoff =3D new_endoff; + RIGHT.br_blockcount =3D temp2; + /* insert LEFT (r[0]) and RIGHT (r[1]) at the same time */ + xfs_iext_insert(bma->ip, bma->idx + 1, 2, &LEFT, state); + bma->ip->i_d.di_nextents++; + if (bma->cur =3D=3D NULL) rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; else { rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, new->br_startoff, + error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount, - &i))) + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); - cur->bc_rec.b.br_state =3D XFS_EXT_NORM; - if ((error =3D xfs_btree_insert(cur, &i))) + bma->cur->bc_rec.b.br_state =3D XFS_EXT_NORM; + error =3D xfs_btree_insert(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); } - if (ip->i_d.di_format =3D=3D XFS_DINODE_FMT_EXTENTS && - ip->i_d.di_nextents > ip->i_df.if_ext_max) { - error =3D xfs_bmap_extents_to_btree(ip->i_transp, ip, - first, flist, &cur, 1, &tmp_rval, - XFS_DATA_FORK); + + if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { + error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, &bma->cur, + 1, &tmp_rval, XFS_DATA_FORK); rval |=3D tmp_rval; if (error) goto done; } - temp =3D xfs_bmap_worst_indlen(ip, temp); - temp2 =3D xfs_bmap_worst_indlen(ip, temp2); + temp =3D xfs_bmap_worst_indlen(bma->ip, temp); + temp2 =3D xfs_bmap_worst_indlen(bma->ip, temp2); diff =3D (int)(temp + temp2 - startblockval(PREV.br_startblock) - - (cur ? cur->bc_private.b.allocated : 0)); - if (diff > 0 && - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, - -((int64_t)diff), rsvd)) { - /* - * Ick gross gag me with a spoon. - */ - ASSERT(0); /* want to see if this ever happens! */ - while (diff > 0) { - if (temp) { - temp--; - diff--; - if (!diff || - !xfs_icsb_modify_counters(ip->i_mount, - XFS_SBS_FDBLOCKS, - -((int64_t)diff), rsvd)) - break; - } - if (temp2) { - temp2--; - diff--; - if (!diff || - !xfs_icsb_modify_counters(ip->i_mount, - XFS_SBS_FDBLOCKS, - -((int64_t)diff), rsvd)) - break; - } - } + (bma->cur ? bma->cur->bc_private.b.allocated : 0)); + if (diff > 0) { + error =3D xfs_icsb_modify_counters(bma->ip->i_mount, + XFS_SBS_FDBLOCKS, + -((int64_t)diff), 0); + ASSERT(!error); + if (error) + goto done; } - ep =3D xfs_iext_get_ext(ifp, idx); + + ep =3D xfs_iext_get_ext(ifp, bma->idx); xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - trace_xfs_bmap_pre_update(ip, idx + 2, state, _THIS_IP_); - xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx + 2), + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx + 2, state, _THIS_IP_); + xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, bma->idx + 2), nullstartblock((int)temp2)); - trace_xfs_bmap_post_update(ip, idx + 2, state, _THIS_IP_); - *dnew =3D temp + temp2; + trace_xfs_bmap_post_update(bma->ip, bma->idx + 2, state, _THIS_IP_); + + bma->idx++; + da_new =3D temp + temp2; break; =20 case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: @@ -1065,9 +844,39 @@ xfs_bmap_add_extent_delay_real( */ ASSERT(0); } - *curp =3D cur; + + /* convert to a btree if necessary */ + if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(bma->cur =3D=3D NULL); + error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, &bma->cur, + da_old > 0, &tmp_logflags, XFS_DATA_FORK); + bma->logflags |=3D tmp_logflags; + if (error) + goto done; + } + + /* adjust for changes in reserved delayed indirect blocks */ + if (da_old || da_new) { + temp =3D da_new; + if (bma->cur) + temp +=3D bma->cur->bc_private.b.allocated; + ASSERT(temp <=3D da_old); + if (temp < da_old) + xfs_icsb_modify_counters(bma->ip->i_mount, + XFS_SBS_FDBLOCKS, + (int64_t)(da_old - temp), 0); + } + + /* clear out the allocated field, done with it now in any case. */ + if (bma->cur) + bma->cur->bc_private.b.allocated =3D 0; + + xfs_bmap_check_leaf_extents(bma->cur, bma->ip, XFS_DATA_FORK); done: - *logflagsp =3D rval; + bma->logflags |=3D rval; return error; #undef LEFT #undef RIGHT @@ -1075,15 +884,17 @@ done: } =20 /* - * Called by xfs_bmap_add_extent to handle cases converting an unwritten - * allocation to a real allocation or vice versa. + * Convert an unwritten allocation to a real allocation or vice versa. */ STATIC int /* error */ xfs_bmap_add_extent_unwritten_real( + struct xfs_trans *tp, xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ + xfs_extnum_t *idx, /* extent number to update/insert */ xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ + xfs_fsblock_t *first, /* pointer to firstblock variable */ + xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp) /* inode logging flags */ { xfs_btree_cur_t *cur; /* btree cursor */ @@ -1099,16 +910,26 @@ xfs_bmap_add_extent_unwritten_real( int rval=3D0; /* return value (logging flags) */ int state =3D 0;/* state bits, accessed thru macros */ =20 + *logflagsp =3D 0; + + cur =3D *curp; + ifp =3D XFS_IFORK_PTR(ip, XFS_DATA_FORK); + + ASSERT(*idx >=3D 0); + ASSERT(*idx <=3D ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); + ASSERT(!isnullstartblock(new->br_startblock)); + + XFS_STATS_INC(xs_add_exlist); + #define LEFT r[0] #define RIGHT r[1] #define PREV r[2] + /* * Set up a bunch of variables to make the tests simpler. */ error =3D 0; - cur =3D *curp; - ifp =3D XFS_IFORK_PTR(ip, XFS_DATA_FORK); - ep =3D xfs_iext_get_ext(ifp, idx); + ep =3D xfs_iext_get_ext(ifp, *idx); xfs_bmbt_get_all(ep, &PREV); newext =3D new->br_state; oldext =3D (newext =3D=3D XFS_EXT_UNWRITTEN) ? @@ -1131,9 +952,9 @@ xfs_bmap_add_extent_unwritten_real( * Check and set flags if this segment has a left neighbor. * Don't set contiguous if the combined extent would be too large. */ - if (idx > 0) { + if (*idx > 0) { state |=3D BMAP_LEFT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx - 1), &LEFT); =20 if (isnullstartblock(LEFT.br_startblock)) state |=3D BMAP_LEFT_DELAY; @@ -1151,9 +972,9 @@ xfs_bmap_add_extent_unwritten_real( * Don't set contiguous if the combined extent would be too large. * Also check for all-three-contiguous being too large. */ - if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { + if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { state |=3D BMAP_RIGHT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx + 1), &RIGHT); if (isnullstartblock(RIGHT.br_startblock)) state |=3D BMAP_RIGHT_DELAY; } @@ -1182,14 +1003,15 @@ xfs_bmap_add_extent_unwritten_real( * Setting all of a previous oldext extent to newext. * The left and right neighbors are both contiguous with new. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + --*idx; + + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), LEFT.br_blockcount + PREV.br_blockcount + RIGHT.br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 - xfs_iext_remove(ip, idx, 2, state); - ip->i_df.if_lastex =3D idx - 1; + xfs_iext_remove(ip, *idx + 1, 2, state); ip->i_d.di_nextents -=3D 2; if (cur =3D=3D NULL) rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1225,13 +1047,14 @@ xfs_bmap_add_extent_unwritten_real( * Setting all of a previous oldext extent to newext. * The left neighbor is contiguous, the right is not. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + --*idx; + + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), LEFT.br_blockcount + PREV.br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 - ip->i_df.if_lastex =3D idx - 1; - xfs_iext_remove(ip, idx, 1, state); + xfs_iext_remove(ip, *idx + 1, 1, state); ip->i_d.di_nextents--; if (cur =3D=3D NULL) rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1261,13 +1084,12 @@ xfs_bmap_add_extent_unwritten_real( * Setting all of a previous oldext extent to newext. * The right neighbor is contiguous, the left is not. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount + RIGHT.br_blockcount); xfs_bmbt_set_state(ep, newext); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - ip->i_df.if_lastex =3D idx; - xfs_iext_remove(ip, idx + 1, 1, state); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + xfs_iext_remove(ip, *idx + 1, 1, state); ip->i_d.di_nextents--; if (cur =3D=3D NULL) rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1298,11 +1120,10 @@ xfs_bmap_add_extent_unwritten_real( * Neither the left nor right neighbors are contiguous with * the new one. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_state(ep, newext); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 - ip->i_df.if_lastex =3D idx; if (cur =3D=3D NULL) rval =3D XFS_ILOG_DEXT; else { @@ -1324,21 +1145,22 @@ xfs_bmap_add_extent_unwritten_real( * Setting the first part of a previous oldext extent to newext. * The left neighbor is contiguous. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + trace_xfs_bmap_pre_update(ip, *idx - 1, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx - 1), LEFT.br_blockcount + new->br_blockcount); xfs_bmbt_set_startoff(ep, PREV.br_startoff + new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx - 1, state, _THIS_IP_); =20 - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_startblock(ep, new->br_startblock + new->br_blockcount); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + + --*idx; =20 - ip->i_df.if_lastex =3D idx - 1; if (cur =3D=3D NULL) rval =3D XFS_ILOG_DEXT; else { @@ -1356,10 +1178,11 @@ xfs_bmap_add_extent_unwritten_real( goto done; if ((error =3D xfs_btree_decrement(cur, 0, &i))) goto done; - if (xfs_bmbt_update(cur, LEFT.br_startoff, + error =3D xfs_bmbt_update(cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + new->br_blockcount, - LEFT.br_state)) + LEFT.br_state); + if (error) goto done; } break; @@ -1369,17 +1192,16 @@ xfs_bmap_add_extent_unwritten_real( * Setting the first part of a previous oldext extent to newext. * The left neighbor is not contiguous. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); ASSERT(ep && xfs_bmbt_get_state(ep) =3D=3D oldext); xfs_bmbt_set_startoff(ep, new_endoff); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); xfs_bmbt_set_startblock(ep, new->br_startblock + new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 - xfs_iext_insert(ip, idx, 1, new, state); - ip->i_df.if_lastex =3D idx; + xfs_iext_insert(ip, *idx, 1, new, state); ip->i_d.di_nextents++; if (cur =3D=3D NULL) rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1408,17 +1230,19 @@ xfs_bmap_add_extent_unwritten_real( * Setting the last part of a previous oldext extent to newext. * The right neighbor is contiguous with the new allocation. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); - trace_xfs_bmap_pre_update(ip, idx + 1, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, idx + 1), + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + + ++*idx; + + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, *idx), new->br_startoff, new->br_startblock, new->br_blockcount + RIGHT.br_blockcount, newext); - trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 - ip->i_df.if_lastex =3D idx + 1; if (cur =3D=3D NULL) rval =3D XFS_ILOG_DEXT; else { @@ -1448,13 +1272,14 @@ xfs_bmap_add_extent_unwritten_real( * Setting the last part of a previous oldext extent to newext. * The right neighbor is not contiguous. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + + ++*idx; + xfs_iext_insert(ip, *idx, 1, new, state); =20 - xfs_iext_insert(ip, idx + 1, 1, new, state); - ip->i_df.if_lastex =3D idx + 1; ip->i_d.di_nextents++; if (cur =3D=3D NULL) rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1488,10 +1313,10 @@ xfs_bmap_add_extent_unwritten_real( * newext. Contiguity is impossible here. * One extent becomes three extents. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, new->br_startoff - PREV.br_startoff); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 r[0] =3D *new; r[1].br_startoff =3D new_endoff; @@ -1499,8 +1324,10 @@ xfs_bmap_add_extent_unwritten_real( PREV.br_startoff + PREV.br_blockcount - new_endoff; r[1].br_startblock =3D new->br_startblock + new->br_blockcount; r[1].br_state =3D oldext; - xfs_iext_insert(ip, idx + 1, 2, &r[0], state); - ip->i_df.if_lastex =3D idx + 1; + + ++*idx; + xfs_iext_insert(ip, *idx, 2, &r[0], state); + ip->i_d.di_nextents +=3D 2; if (cur =3D=3D NULL) rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1553,9 +1380,28 @@ xfs_bmap_add_extent_unwritten_real( */ ASSERT(0); } - *curp =3D cur; + + /* convert to a btree if necessary */ + if (xfs_bmap_needs_btree(ip, XFS_DATA_FORK)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(cur =3D=3D NULL); + error =3D xfs_bmap_extents_to_btree(tp, ip, first, flist, &cur, + 0, &tmp_logflags, XFS_DATA_FORK); + *logflagsp |=3D tmp_logflags; + if (error) + goto done; + } + + /* clear out the allocated field, done with it now in any case. */ + if (cur) { + cur->bc_private.b.allocated =3D 0; + *curp =3D cur; + } + + xfs_bmap_check_leaf_extents(*curp, ip, XFS_DATA_FORK); done: - *logflagsp =3D rval; + *logflagsp |=3D rval; return error; #undef LEFT #undef RIGHT @@ -1563,19 +1409,14 @@ done: } =20 /* - * Called by xfs_bmap_add_extent to handle cases converting a hole - * to a delayed allocation. + * Convert a hole to a delayed allocation. */ -/*ARGSUSED*/ -STATIC int /* error */ +STATIC void xfs_bmap_add_extent_hole_delay( xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp, /* inode logging flags */ - int rsvd) /* OK to allocate reserved blocks */ + xfs_extnum_t *idx, /* extent number to update/insert */ + xfs_bmbt_irec_t *new) /* new data to add to file extents */ { - xfs_bmbt_rec_host_t *ep; /* extent record for idx */ xfs_ifork_t *ifp; /* inode fork pointer */ xfs_bmbt_irec_t left; /* left neighbor extent entry */ xfs_filblks_t newlen=3D0; /* new indirect size */ @@ -1585,16 +1426,15 @@ xfs_bmap_add_extent_hole_delay( xfs_filblks_t temp=3D0; /* temp for indirect calculations */ =20 ifp =3D XFS_IFORK_PTR(ip, XFS_DATA_FORK); - ep =3D xfs_iext_get_ext(ifp, idx); state =3D 0; ASSERT(isnullstartblock(new->br_startblock)); =20 /* * Check and set flags if this segment has a left neighbor */ - if (idx > 0) { + if (*idx > 0) { state |=3D BMAP_LEFT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx - 1), &left); =20 if (isnullstartblock(left.br_startblock)) state |=3D BMAP_LEFT_DELAY; @@ -1604,9 +1444,9 @@ xfs_bmap_add_extent_hole_delay( * Check and set flags if the current (right) segment exists. * If it doesn't exist, we're converting the hole at end-of-file. */ - if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { + if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { state |=3D BMAP_RIGHT_VALID; - xfs_bmbt_get_all(ep, &right); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx), &right); =20 if (isnullstartblock(right.br_startblock)) state |=3D BMAP_RIGHT_DELAY; @@ -1639,21 +1479,21 @@ xfs_bmap_add_extent_hole_delay( * on the left and on the right. * Merge all three into a single extent record. */ + --*idx; temp =3D left.br_blockcount + new->br_blockcount + right.br_blockcount; =20 - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), temp); oldlen =3D startblockval(left.br_startblock) + startblockval(new->br_startblock) + startblockval(right.br_startblock); newlen =3D xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), + xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, *idx), nullstartblock((int)newlen)); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 - xfs_iext_remove(ip, idx, 1, state); - ip->i_df.if_lastex =3D idx - 1; + xfs_iext_remove(ip, *idx + 1, 1, state); break; =20 case BMAP_LEFT_CONTIG: @@ -1662,17 +1502,17 @@ xfs_bmap_add_extent_hole_delay( * on the left. * Merge the new allocation with the left neighbor. */ + --*idx; temp =3D left.br_blockcount + new->br_blockcount; - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); + + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), temp); oldlen =3D startblockval(left.br_startblock) + startblockval(new->br_startblock); newlen =3D xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), + xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, *idx), nullstartblock((int)newlen)); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); - - ip->i_df.if_lastex =3D idx - 1; + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); break; =20 case BMAP_RIGHT_CONTIG: @@ -1681,16 +1521,15 @@ xfs_bmap_add_extent_hole_delay( * on the right. * Merge the new allocation with the right neighbor. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); temp =3D new->br_blockcount + right.br_blockcount; oldlen =3D startblockval(new->br_startblock) + startblockval(right.br_startblock); newlen =3D xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_allf(ep, new->br_startoff, + xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, *idx), + new->br_startoff, nullstartblock((int)newlen), temp, right.br_state); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - - ip->i_df.if_lastex =3D idx; + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); break; =20 case 0: @@ -1700,36 +1539,28 @@ xfs_bmap_add_extent_hole_delay( * Insert a new entry. */ oldlen =3D newlen =3D 0; - xfs_iext_insert(ip, idx, 1, new, state); - ip->i_df.if_lastex =3D idx; + xfs_iext_insert(ip, *idx, 1, new, state); break; } if (oldlen !=3D newlen) { ASSERT(oldlen > newlen); xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, - (int64_t)(oldlen - newlen), rsvd); + (int64_t)(oldlen - newlen), 0); /* * Nothing to do for disk quota accounting here. */ } - *logflagsp =3D 0; - return 0; } =20 /* - * Called by xfs_bmap_add_extent to handle cases converting a hole - * to a real allocation. + * Convert a hole to a real allocation. */ STATIC int /* error */ xfs_bmap_add_extent_hole_real( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* extent number to update/insert */ - xfs_btree_cur_t *cur, /* if null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp, /* inode logging flags */ - int whichfork) /* data or attr fork */ + struct xfs_bmalloca *bma, + int whichfork) { - xfs_bmbt_rec_host_t *ep; /* pointer to extent entry ins. point */ + struct xfs_bmbt_irec *new =3D &bma->got; int error; /* error return value */ int i; /* temp state */ xfs_ifork_t *ifp; /* inode fork pointer */ @@ -1738,20 +1569,26 @@ xfs_bmap_add_extent_hole_real( int rval=3D0; /* return value (logging flags) */ int state; /* state bits, accessed thru macros */ =20 - ifp =3D XFS_IFORK_PTR(ip, whichfork); - ASSERT(idx <=3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); - ep =3D xfs_iext_get_ext(ifp, idx); - state =3D 0; + ifp =3D XFS_IFORK_PTR(bma->ip, whichfork); + + ASSERT(bma->idx >=3D 0); + ASSERT(bma->idx <=3D ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); + ASSERT(!isnullstartblock(new->br_startblock)); + ASSERT(!bma->cur || + !(bma->cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL)); + + XFS_STATS_INC(xs_add_exlist); =20 + state =3D 0; if (whichfork =3D=3D XFS_ATTR_FORK) state |=3D BMAP_ATTRFORK; =20 /* * Check and set flags if this segment has a left neighbor. */ - if (idx > 0) { + if (bma->idx > 0) { state |=3D BMAP_LEFT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx - 1), &left); if (isnullstartblock(left.br_startblock)) state |=3D BMAP_LEFT_DELAY; } @@ -1760,9 +1597,9 @@ xfs_bmap_add_extent_hole_real( * Check and set flags if this segment has a current value. * Not true if we're inserting into the "hole" at eof. */ - if (idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { + if (bma->idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { state |=3D BMAP_RIGHT_VALID; - xfs_bmbt_get_all(ep, &right); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx), &right); if (isnullstartblock(right.br_startblock)) state |=3D BMAP_RIGHT_DELAY; } @@ -1799,38 +1636,42 @@ xfs_bmap_add_extent_hole_real( * left and on the right. * Merge all three into a single extent record. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + --bma->idx; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), left.br_blockcount + new->br_blockcount + right.br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); =20 - xfs_iext_remove(ip, idx, 1, state); - ifp->if_lastex =3D idx - 1; - XFS_IFORK_NEXT_SET(ip, whichfork, - XFS_IFORK_NEXTENTS(ip, whichfork) - 1); - if (cur =3D=3D NULL) { + xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); + + XFS_IFORK_NEXT_SET(bma->ip, whichfork, + XFS_IFORK_NEXTENTS(bma->ip, whichfork) - 1); + if (bma->cur =3D=3D NULL) { rval =3D XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else { rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, - right.br_startoff, - right.br_startblock, - right.br_blockcount, &i))) + error =3D xfs_bmbt_lookup_eq(bma->cur, right.br_startoff, + right.br_startblock, right.br_blockcount, + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_btree_delete(cur, &i))) + error =3D xfs_btree_delete(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_btree_decrement(cur, 0, &i))) + error =3D xfs_btree_decrement(bma->cur, 0, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, left.br_startoff, + error =3D xfs_bmbt_update(bma->cur, left.br_startoff, left.br_startblock, left.br_blockcount + new->br_blockcount + right.br_blockcount, - left.br_state))) + left.br_state); + if (error) goto done; } break; @@ -1841,27 +1682,28 @@ xfs_bmap_add_extent_hole_real( * on the left. * Merge the new allocation with the left neighbor. */ - trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), + --bma->idx; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), left.br_blockcount + new->br_blockcount); - trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); =20 - ifp->if_lastex =3D idx - 1; - if (cur =3D=3D NULL) { + if (bma->cur =3D=3D NULL) { rval =3D xfs_ilog_fext(whichfork); } else { rval =3D 0; - if ((error =3D xfs_bmbt_lookup_eq(cur, - left.br_startoff, - left.br_startblock, - left.br_blockcount, &i))) + error =3D xfs_bmbt_lookup_eq(bma->cur, left.br_startoff, + left.br_startblock, left.br_blockcount, + &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, left.br_startoff, + error =3D xfs_bmbt_update(bma->cur, left.br_startoff, left.br_startblock, left.br_blockcount + new->br_blockcount, - left.br_state))) + left.br_state); + if (error) goto done; } break; @@ -1872,28 +1714,30 @@ xfs_bmap_add_extent_hole_real( * on the right. * Merge the new allocation with the right neighbor. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); - xfs_bmbt_set_allf(ep, new->br_startoff, new->br_startblock, + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, bma->idx), + new->br_startoff, new->br_startblock, new->br_blockcount + right.br_blockcount, right.br_state); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); =20 - ifp->if_lastex =3D idx; - if (cur =3D=3D NULL) { + if (bma->cur =3D=3D NULL) { rval =3D xfs_ilog_fext(whichfork); } else { rval =3D 0; - if ((error =3D xfs_bmbt_lookup_eq(cur, + error =3D xfs_bmbt_lookup_eq(bma->cur, right.br_startoff, right.br_startblock, - right.br_blockcount, &i))) + right.br_blockcount, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, new->br_startoff, + error =3D xfs_bmbt_update(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount + right.br_blockcount, - right.br_state))) + right.br_state); + if (error) goto done; } break; @@ -1904,29 +1748,49 @@ xfs_bmap_add_extent_hole_real( * real allocation. * Insert a new entry. */ - xfs_iext_insert(ip, idx, 1, new, state); - ifp->if_lastex =3D idx; - XFS_IFORK_NEXT_SET(ip, whichfork, - XFS_IFORK_NEXTENTS(ip, whichfork) + 1); - if (cur =3D=3D NULL) { + xfs_iext_insert(bma->ip, bma->idx, 1, new, state); + XFS_IFORK_NEXT_SET(bma->ip, whichfork, + XFS_IFORK_NEXTENTS(bma->ip, whichfork) + 1); + if (bma->cur =3D=3D NULL) { rval =3D XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else { rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, + error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, new->br_startblock, - new->br_blockcount, &i))) + new->br_blockcount, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); - cur->bc_rec.b.br_state =3D new->br_state; - if ((error =3D xfs_btree_insert(cur, &i))) + bma->cur->bc_rec.b.br_state =3D new->br_state; + error =3D xfs_btree_insert(bma->cur, &i); + if (error) goto done; XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); } break; } + + /* convert to a btree if necessary */ + if (xfs_bmap_needs_btree(bma->ip, whichfork)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(bma->cur =3D=3D NULL); + error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, &bma->cur, + 0, &tmp_logflags, whichfork); + bma->logflags |=3D tmp_logflags; + if (error) + goto done; + } + + /* clear out the allocated field, done with it now in any case. */ + if (bma->cur) + bma->cur->bc_private.b.allocated =3D 0; + + xfs_bmap_check_leaf_extents(bma->cur, bma->ip, whichfork); done: - *logflagsp =3D rval; + bma->logflags |=3D rval; return error; } =20 @@ -2113,26 +1977,26 @@ xfs_bmap_adjacent( XFS_FSB_TO_AGBNO(mp, x) < mp->m_sb.sb_agblocks) =20 mp =3D ap->ip->i_mount; - nullfb =3D ap->firstblock =3D=3D NULLFSBLOCK; + nullfb =3D *ap->firstblock =3D=3D NULLFSBLOCK; rt =3D XFS_IS_REALTIME_INODE(ap->ip) && ap->userdata; - fb_agno =3D nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, ap->firstblock); + fb_agno =3D nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock); /* * If allocating at eof, and there's a previous real block, * try to use its last block as our starting point. */ - if (ap->eof && ap->prevp->br_startoff !=3D NULLFILEOFF && - !isnullstartblock(ap->prevp->br_startblock) && - ISVALID(ap->prevp->br_startblock + ap->prevp->br_blockcount, - ap->prevp->br_startblock)) { - ap->rval =3D ap->prevp->br_startblock + ap->prevp->br_blockcount; + if (ap->eof && ap->prev.br_startoff !=3D NULLFILEOFF && + !isnullstartblock(ap->prev.br_startblock) && + ISVALID(ap->prev.br_startblock + ap->prev.br_blockcount, + ap->prev.br_startblock)) { + ap->blkno =3D ap->prev.br_startblock + ap->prev.br_blockcount; /* * Adjust for the gap between prevp and us. */ - adjust =3D ap->off - - (ap->prevp->br_startoff + ap->prevp->br_blockcount); + adjust =3D ap->offset - + (ap->prev.br_startoff + ap->prev.br_blockcount); if (adjust && - ISVALID(ap->rval + adjust, ap->prevp->br_startblock)) - ap->rval +=3D adjust; + ISVALID(ap->blkno + adjust, ap->prev.br_startblock)) + ap->blkno +=3D adjust; } /* * If not at eof, then compare the two neighbor blocks. @@ -2149,17 +2013,17 @@ xfs_bmap_adjacent( * If there's a previous (left) block, select a requested * start block based on it. */ - if (ap->prevp->br_startoff !=3D NULLFILEOFF && - !isnullstartblock(ap->prevp->br_startblock) && - (prevbno =3D ap->prevp->br_startblock + - ap->prevp->br_blockcount) && - ISVALID(prevbno, ap->prevp->br_startblock)) { + if (ap->prev.br_startoff !=3D NULLFILEOFF && + !isnullstartblock(ap->prev.br_startblock) && + (prevbno =3D ap->prev.br_startblock + + ap->prev.br_blockcount) && + ISVALID(prevbno, ap->prev.br_startblock)) { /* * Calculate gap to end of previous block. */ - adjust =3D prevdiff =3D ap->off - - (ap->prevp->br_startoff + - ap->prevp->br_blockcount); + adjust =3D prevdiff =3D ap->offset - + (ap->prev.br_startoff + + ap->prev.br_blockcount); /* * Figure the startblock based on the previous block's * end and the gap size. @@ -2168,9 +2032,9 @@ xfs_bmap_adjacent( * allocating, or using it gives us an invalid block * number, then just use the end of the previous block. */ - if (prevdiff <=3D XFS_ALLOC_GAP_UNITS * ap->alen && + if (prevdiff <=3D XFS_ALLOC_GAP_UNITS * ap->length && ISVALID(prevbno + prevdiff, - ap->prevp->br_startblock)) + ap->prev.br_startblock)) prevbno +=3D adjust; else prevdiff +=3D adjust; @@ -2191,16 +2055,16 @@ xfs_bmap_adjacent( * If there's a following (right) block, select a requested * start block based on it. */ - if (!isnullstartblock(ap->gotp->br_startblock)) { + if (!isnullstartblock(ap->got.br_startblock)) { /* * Calculate gap to start of next block. */ - adjust =3D gotdiff =3D ap->gotp->br_startoff - ap->off; + adjust =3D gotdiff =3D ap->got.br_startoff - ap->offset; /* * Figure the startblock based on the next block's * start and the gap size. */ - gotbno =3D ap->gotp->br_startblock; + gotbno =3D ap->got.br_startblock; /* * Heuristic! * If the gap is large relative to the piece we're @@ -2208,12 +2072,12 @@ xfs_bmap_adjacent( * number, then just use the start of the next block * offset by our length. */ - if (gotdiff <=3D XFS_ALLOC_GAP_UNITS * ap->alen && + if (gotdiff <=3D XFS_ALLOC_GAP_UNITS * ap->length && ISVALID(gotbno - gotdiff, gotbno)) gotbno -=3D adjust; - else if (ISVALID(gotbno - ap->alen, gotbno)) { - gotbno -=3D ap->alen; - gotdiff +=3D adjust - ap->alen; + else if (ISVALID(gotbno - ap->length, gotbno)) { + gotbno -=3D ap->length; + gotdiff +=3D adjust - ap->length; } else gotdiff +=3D adjust; /* @@ -2234,11 +2098,11 @@ xfs_bmap_adjacent( * one, else ap->rval is already set (to 0 or the inode block). */ if (prevbno !=3D NULLFSBLOCK && gotbno !=3D NULLFSBLOCK) - ap->rval =3D prevdiff <=3D gotdiff ? prevbno : gotbno; + ap->blkno =3D prevdiff <=3D gotdiff ? prevbno : gotbno; else if (prevbno !=3D NULLFSBLOCK) - ap->rval =3D prevbno; + ap->blkno =3D prevbno; else if (gotbno !=3D NULLFSBLOCK) - ap->rval =3D gotbno; + ap->blkno =3D gotbno; } #undef ISVALID } @@ -2271,7 +2135,7 @@ xfs_bmap_btalloc_nullfb( startag =3D ag =3D 0; =20 pag =3D xfs_perag_get(mp, ag); - while (*blen < ap->alen) { + while (*blen < args->maxlen) { if (!pag->pagf_init) { error =3D xfs_alloc_pagf_init(mp, args->tp, ag, XFS_ALLOC_FLAG_TRYLOCK); @@ -2293,7 +2157,7 @@ xfs_bmap_btalloc_nullfb( notinit =3D 1; =20 if (xfs_inode_is_filestream(ap->ip)) { - if (*blen >=3D ap->alen) + if (*blen >=3D args->maxlen) break; =20 if (ap->userdata) { @@ -2339,21 +2203,21 @@ xfs_bmap_btalloc_nullfb( * If the best seen length is less than the request * length, use the best as the minimum. */ - else if (*blen < ap->alen) + else if (*blen < args->maxlen) args->minlen =3D *blen; /* - * Otherwise we've seen an extent as big as alen, + * Otherwise we've seen an extent as big as maxlen, * use that as the minimum. */ else - args->minlen =3D ap->alen; + args->minlen =3D args->maxlen; =20 /* * set the failure fallback case to look in the selected * AG as the stream may have moved. */ if (xfs_inode_is_filestream(ap->ip)) - ap->rval =3D args->fsbno =3D XFS_AGB_TO_FSB(mp, ag, 0); + ap->blkno =3D args->fsbno =3D XFS_AGB_TO_FSB(mp, ag, 0); =20 return 0; } @@ -2375,53 +2239,58 @@ xfs_bmap_btalloc( int tryagain; int error; =20 + ASSERT(ap->length); + mp =3D ap->ip->i_mount; align =3D ap->userdata ? xfs_get_extsz_hint(ap->ip) : 0; if (unlikely(align)) { - error =3D xfs_bmap_extsize_align(mp, ap->gotp, ap->prevp, + error =3D xfs_bmap_extsize_align(mp, &ap->got, &ap->prev, align, 0, ap->eof, 0, ap->conv, - &ap->off, &ap->alen); + &ap->offset, &ap->length); ASSERT(!error); - ASSERT(ap->alen); + ASSERT(ap->length); } - nullfb =3D ap->firstblock =3D=3D NULLFSBLOCK; - fb_agno =3D nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, ap->firstblock); + nullfb =3D *ap->firstblock =3D=3D NULLFSBLOCK; + fb_agno =3D nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock); if (nullfb) { if (ap->userdata && xfs_inode_is_filestream(ap->ip)) { ag =3D xfs_filestream_lookup_ag(ap->ip); ag =3D (ag !=3D NULLAGNUMBER) ? ag : 0; - ap->rval =3D XFS_AGB_TO_FSB(mp, ag, 0); + ap->blkno =3D XFS_AGB_TO_FSB(mp, ag, 0); } else { - ap->rval =3D XFS_INO_TO_FSB(mp, ap->ip->i_ino); + ap->blkno =3D XFS_INO_TO_FSB(mp, ap->ip->i_ino); } } else - ap->rval =3D ap->firstblock; + ap->blkno =3D *ap->firstblock; =20 xfs_bmap_adjacent(ap); =20 /* - * If allowed, use ap->rval; otherwise must use firstblock since + * If allowed, use ap->blkno; otherwise must use firstblock since * it's in the right allocation group. */ - if (nullfb || XFS_FSB_TO_AGNO(mp, ap->rval) =3D=3D fb_agno) + if (nullfb || XFS_FSB_TO_AGNO(mp, ap->blkno) =3D=3D fb_agno) ; else - ap->rval =3D ap->firstblock; + ap->blkno =3D *ap->firstblock; /* * Normal allocation, done through xfs_alloc_vextent. */ tryagain =3D isaligned =3D 0; + memset(&args, 0, sizeof(args)); args.tp =3D ap->tp; args.mp =3D mp; - args.fsbno =3D ap->rval; - args.maxlen =3D MIN(ap->alen, mp->m_sb.sb_agblocks); - args.firstblock =3D ap->firstblock; + args.fsbno =3D ap->blkno; + + /* Trim the allocation back to the maximum an AG can fit. */ + args.maxlen =3D MIN(ap->length, XFS_ALLOC_AG_MAX_USABLE(mp)); + args.firstblock =3D *ap->firstblock; blen =3D 0; if (nullfb) { error =3D xfs_bmap_btalloc_nullfb(ap, &args, &blen); if (error) return error; - } else if (ap->low) { + } else if (ap->flist->xbf_low) { if (xfs_inode_is_filestream(ap->ip)) args.type =3D XFS_ALLOCTYPE_FIRST_AG; else @@ -2435,14 +2304,14 @@ xfs_bmap_btalloc( /* apply extent size hints if obtained earlier */ if (unlikely(align)) { args.prod =3D align; - if ((args.mod =3D (xfs_extlen_t)do_mod(ap->off, args.prod))) + if ((args.mod =3D (xfs_extlen_t)do_mod(ap->offset, args.prod))) args.mod =3D (xfs_extlen_t)(args.prod - args.mod); } else if (mp->m_sb.sb_blocksize >=3D PAGE_CACHE_SIZE) { args.prod =3D 1; args.mod =3D 0; } else { args.prod =3D PAGE_CACHE_SIZE >> mp->m_sb.sb_blocklog; - if ((args.mod =3D (xfs_extlen_t)(do_mod(ap->off, args.prod)))) + if ((args.mod =3D (xfs_extlen_t)(do_mod(ap->offset, args.prod)))) args.mod =3D (xfs_extlen_t)(args.prod - args.mod); } /* @@ -2454,15 +2323,15 @@ xfs_bmap_btalloc( * is >=3D the stripe unit and the allocation offset is * at the end of file. */ - if (!ap->low && ap->aeof) { - if (!ap->off) { + if (!ap->flist->xbf_low && ap->aeof) { + if (!ap->offset) { args.alignment =3D mp->m_dalign; atype =3D args.type; isaligned =3D 1; /* * Adjust for alignment */ - if (blen > args.alignment && blen <=3D ap->alen) + if (blen > args.alignment && blen <=3D args.maxlen) args.minlen =3D blen - args.alignment; args.minalignslop =3D 0; } else { @@ -2481,7 +2350,7 @@ xfs_bmap_btalloc( * of minlen+alignment+slop doesn't go up * between the calls. */ - if (blen > mp->m_dalign && blen <=3D ap->alen) + if (blen > mp->m_dalign && blen <=3D args.maxlen) nextminlen =3D blen - mp->m_dalign; else nextminlen =3D args.minlen; @@ -2508,7 +2377,7 @@ xfs_bmap_btalloc( * turned on. */ args.type =3D atype; - args.fsbno =3D ap->rval; + args.fsbno =3D ap->blkno; args.alignment =3D mp->m_dalign; args.minlen =3D nextminlen; args.minalignslop =3D 0; @@ -2522,7 +2391,7 @@ xfs_bmap_btalloc( * try again. */ args.type =3D atype; - args.fsbno =3D ap->rval; + args.fsbno =3D ap->blkno; args.alignment =3D 0; if ((error =3D xfs_alloc_vextent(&args))) return error; @@ -2531,7 +2400,7 @@ xfs_bmap_btalloc( args.minlen > ap->minlen) { args.minlen =3D ap->minlen; args.type =3D XFS_ALLOCTYPE_START_BNO; - args.fsbno =3D ap->rval; + args.fsbno =3D ap->blkno; if ((error =3D xfs_alloc_vextent(&args))) return error; } @@ -2542,13 +2411,26 @@ xfs_bmap_btalloc( args.minleft =3D 0; if ((error =3D xfs_alloc_vextent(&args))) return error; - ap->low =3D 1; + ap->flist->xbf_low =3D 1; } if (args.fsbno !=3D NULLFSBLOCK) { - ap->firstblock =3D ap->rval =3D args.fsbno; + /* + * check the allocation happened at the same or higher AG than + * the first block that was allocated. + */ + ASSERT(*ap->firstblock =3D=3D NULLFSBLOCK || + XFS_FSB_TO_AGNO(mp, *ap->firstblock) =3D=3D + XFS_FSB_TO_AGNO(mp, args.fsbno) || + (ap->flist->xbf_low && + XFS_FSB_TO_AGNO(mp, *ap->firstblock) < + XFS_FSB_TO_AGNO(mp, args.fsbno))); + + ap->blkno =3D args.fsbno; + if (*ap->firstblock =3D=3D NULLFSBLOCK) + *ap->firstblock =3D args.fsbno; ASSERT(nullfb || fb_agno =3D=3D args.agno || - (ap->low && fb_agno < args.agno)); - ap->alen =3D args.len; + (ap->flist->xbf_low && fb_agno < args.agno)); + ap->length =3D args.len; ap->ip->i_d.di_nblocks +=3D args.len; xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE); if (ap->wasdel) @@ -2562,8 +2444,8 @@ xfs_bmap_btalloc( XFS_TRANS_DQ_BCOUNT, (long) args.len); } else { - ap->rval =3D NULLFSBLOCK; - ap->alen =3D 0; + ap->blkno =3D NULLFSBLOCK; + ap->length =3D 0; } return 0; } @@ -2620,8 +2502,9 @@ xfs_bmap_btree_to_extents( if ((error =3D xfs_btree_check_lptr(cur, cbno, 1))) return error; #endif - if ((error =3D xfs_btree_read_bufl(mp, tp, cbno, 0, &cbp, - XFS_BMAP_BTREE_REF))) + error =3D xfs_btree_read_bufl(mp, tp, cbno, 0, &cbp, XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) return error; cblock =3D XFS_BUF_TO_BLOCK(cbp); if ((error =3D xfs_btree_check_block(cur, cblock, 0, cbp))) @@ -2648,13 +2531,12 @@ STATIC int /* error */ xfs_bmap_del_extent( xfs_inode_t *ip, /* incore inode pointer */ xfs_trans_t *tp, /* current transaction pointer */ - xfs_extnum_t idx, /* extent number to update/delete */ + xfs_extnum_t *idx, /* extent number to update/delete */ xfs_bmap_free_t *flist, /* list of extents to be freed */ xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *del, /* data to remove from extents */ int *logflagsp, /* inode logging flags */ - int whichfork, /* data or attr fork */ - int rsvd) /* OK to allocate reserved blocks */ + int whichfork) /* data or attr fork */ { xfs_filblks_t da_new; /* new delay-alloc indirect blocks */ xfs_filblks_t da_old; /* old delay-alloc indirect blocks */ @@ -2685,10 +2567,10 @@ xfs_bmap_del_extent( =20 mp =3D ip->i_mount; ifp =3D XFS_IFORK_PTR(ip, whichfork); - ASSERT((idx >=3D 0) && (idx < ifp->if_bytes / + ASSERT((*idx >=3D 0) && (*idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))); ASSERT(del->br_blockcount > 0); - ep =3D xfs_iext_get_ext(ifp, idx); + ep =3D xfs_iext_get_ext(ifp, *idx); xfs_bmbt_get_all(ep, &got); ASSERT(got.br_startoff <=3D del->br_startoff); del_endoff =3D del->br_startoff + del->br_blockcount; @@ -2719,8 +2601,8 @@ xfs_bmap_del_extent( len =3D del->br_blockcount; do_div(bno, mp->m_sb.sb_rextsize); do_div(len, mp->m_sb.sb_rextsize); - if ((error =3D xfs_rtfree_extent(ip->i_transp, bno, - (xfs_extlen_t)len))) + error =3D xfs_rtfree_extent(tp, bno, (xfs_extlen_t)len); + if (error) goto done; do_fx =3D 0; nblks =3D len * mp->m_sb.sb_rextsize; @@ -2762,11 +2644,12 @@ xfs_bmap_del_extent( /* * Matches the whole extent. Delete the entry. */ - xfs_iext_remove(ip, idx, 1, + xfs_iext_remove(ip, *idx, 1, whichfork =3D=3D XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); - ifp->if_lastex =3D idx; + --*idx; if (delay) break; + XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) - 1); flags |=3D XFS_ILOG_CORE; @@ -2783,21 +2666,20 @@ xfs_bmap_del_extent( /* * Deleting the first part of the extent. */ - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_startoff(ep, del_endoff); temp =3D got.br_blockcount - del->br_blockcount; xfs_bmbt_set_blockcount(ep, temp); - ifp->if_lastex =3D idx; if (delay) { temp =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), da_old); xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); da_new =3D temp; break; } xfs_bmbt_set_startblock(ep, del_endblock); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); if (!cur) { flags |=3D xfs_ilog_fext(whichfork); break; @@ -2813,18 +2695,17 @@ xfs_bmap_del_extent( * Deleting the last part of the extent. */ temp =3D got.br_blockcount - del->br_blockcount; - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); - ifp->if_lastex =3D idx; if (delay) { temp =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), da_old); xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); da_new =3D temp; break; } - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); if (!cur) { flags |=3D xfs_ilog_fext(whichfork); break; @@ -2841,7 +2722,7 @@ xfs_bmap_del_extent( * Deleting the middle of the extent. */ temp =3D del->br_startoff - got.br_startoff; - trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); new.br_startoff =3D del_endoff; temp2 =3D got_endoff - del_endoff; @@ -2928,9 +2809,9 @@ xfs_bmap_del_extent( } } } - trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); - xfs_iext_insert(ip, idx + 1, 1, &new, state); - ifp->if_lastex =3D idx + 1; + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + xfs_iext_insert(ip, *idx + 1, 1, &new, state); + ++*idx; break; } /* @@ -2957,7 +2838,7 @@ xfs_bmap_del_extent( ASSERT(da_old >=3D da_new); if (da_old > da_new) { xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - (int64_t)(da_old - da_new), rsvd); + (int64_t)(da_old - da_new), 0); } done: *logflagsp =3D flags; @@ -3014,8 +2895,7 @@ xfs_bmap_extents_to_btree( =20 ifp =3D XFS_IFORK_PTR(ip, whichfork); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS); - ASSERT(ifp->if_ext_max =3D=3D - XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); + /* * Make space in the inode incore. */ @@ -3044,6 +2924,7 @@ xfs_bmap_extents_to_btree( * Convert to a btree with two levels, one record in root. */ XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_BTREE); + memset(&args, 0, sizeof(args)); args.tp =3D tp; args.mp =3D mp; args.firstblock =3D *firstblock; @@ -3058,8 +2939,6 @@ xfs_bmap_extents_to_btree( args.fsbno =3D *firstblock; } args.minlen =3D args.maxlen =3D args.prod =3D 1; - args.total =3D args.minleft =3D args.alignment =3D args.mod =3D args.isfl= =3D - args.minalignslop =3D 0; args.wasdel =3D wasdel; *logflagsp =3D 0; if ((error =3D xfs_alloc_vextent(&args))) { @@ -3083,6 +2962,7 @@ xfs_bmap_extents_to_btree( /* * Fill in the child block. */ + abp->b_ops =3D &xfs_bmbt_buf_ops; ablock =3D XFS_BUF_TO_BLOCK(abp); ablock->bb_magic =3D cpu_to_be32(XFS_BMAP_MAGIC); ablock->bb_level =3D 0; @@ -3161,13 +3041,8 @@ xfs_bmap_forkoff_reset( ip->i_d.di_format !=3D XFS_DINODE_FMT_BTREE) { uint dfl_forkoff =3D xfs_default_attroffset(ip) >> 3; =20 - if (dfl_forkoff > ip->i_d.di_forkoff) { + if (dfl_forkoff > ip->i_d.di_forkoff) ip->i_d.di_forkoff =3D dfl_forkoff; - ip->i_df.if_ext_max =3D - XFS_IFORK_DSIZE(ip) / sizeof(xfs_bmbt_rec_t); - ip->i_afp->if_ext_max =3D - XFS_IFORK_ASIZE(ip) / sizeof(xfs_bmbt_rec_t); - } } } =20 @@ -3194,8 +3069,7 @@ xfs_bmap_local_to_extents( * We don't want to deal with the case of keeping inode data inline yet. * So sending the data fork of a regular inode is invalid. */ - ASSERT(!((ip->i_d.di_mode & S_IFMT) =3D=3D S_IFREG && - whichfork =3D=3D XFS_DATA_FORK)); + ASSERT(!(S_ISREG(ip->i_d.di_mode) && whichfork =3D=3D XFS_DATA_FORK)); ifp =3D XFS_IFORK_PTR(ip, whichfork); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL); flags =3D 0; @@ -3205,6 +3079,7 @@ xfs_bmap_local_to_extents( xfs_buf_t *bp; /* buffer for extent block */ xfs_bmbt_rec_host_t *ep;/* extent record pointer */ =20 + memset(&args, 0, sizeof(args)); args.tp =3D tp; args.mp =3D ip->i_mount; args.firstblock =3D *firstblock; @@ -3222,8 +3097,6 @@ xfs_bmap_local_to_extents( args.type =3D XFS_ALLOCTYPE_NEAR_BNO; } args.total =3D total; - args.mod =3D args.minleft =3D args.alignment =3D args.wasdel =3D - args.isfl =3D args.minalignslop =3D 0; args.minlen =3D args.maxlen =3D args.prod =3D 1; if ((error =3D xfs_alloc_vextent(&args))) goto done; @@ -3234,8 +3107,8 @@ xfs_bmap_local_to_extents( ASSERT(args.len =3D=3D 1); *firstblock =3D args.fsbno; bp =3D xfs_btree_get_bufl(args.mp, tp, args.fsbno, 0); - memcpy((char *)XFS_BUF_PTR(bp), ifp->if_u1.if_data, - ifp->if_bytes); + bp->b_ops =3D &xfs_bmbt_buf_ops; + memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1); xfs_bmap_forkoff_reset(args.mp, ip, whichfork); xfs_idata_realloc(ip, -ifp->if_bytes, whichfork); @@ -3341,7 +3214,7 @@ xfs_bmap_search_extents( =20 if (unlikely(!(gotp->br_startblock) && (*lastxp !=3D NULLEXTNUM) && !(XFS_IS_REALTIME_INODE(ip) && fork =3D=3D XFS_DATA_FORK))) { - xfs_cmn_err(XFS_PTAG_FSBLOCK_ZERO, CE_ALERT, ip->i_mount, + xfs_alert_tag(ip->i_mount, XFS_PTAG_FSBLOCK_ZERO, "Access to block zero in inode %llu " "start_block: %llx start_off: %llx " "blkcnt: %llx extent-state: %x lastx: %x\n", @@ -3409,8 +3282,6 @@ xfs_bmap_add_attrfork( int error; /* error return value */ =20 ASSERT(XFS_IFORK_Q(ip) =3D=3D 0); - ASSERT(ip->i_df.if_ext_max =3D=3D - XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t)); =20 mp =3D ip->i_mount; ASSERT(!XFS_NOT_DQATTACHED(mp, ip)); @@ -3441,7 +3312,7 @@ xfs_bmap_add_attrfork( } ASSERT(ip->i_d.di_anextents =3D=3D 0); =20 - xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); =20 switch (ip->i_d.di_format) { @@ -3465,12 +3336,9 @@ xfs_bmap_add_attrfork( error =3D XFS_ERROR(EINVAL); goto error1; } - ip->i_df.if_ext_max =3D - XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); + ASSERT(ip->i_afp =3D=3D NULL); ip->i_afp =3D kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP); - ip->i_afp->if_ext_max =3D - XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); ip->i_afp->if_flags =3D XFS_IFEXTENTS; logflags =3D 0; xfs_bmap_init(&flist, &firstblock); @@ -3514,20 +3382,17 @@ xfs_bmap_add_attrfork( } else spin_unlock(&mp->m_sb_lock); } - if ((error =3D xfs_bmap_finish(&tp, &flist, &committed))) + + error =3D xfs_bmap_finish(&tp, &flist, &committed); + if (error) goto error2; - error =3D xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - ASSERT(ip->i_df.if_ext_max =3D=3D - XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t)); - return error; + return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); error2: xfs_bmap_cancel(&flist); error1: xfs_iunlock(ip, XFS_ILOCK_EXCL); error0: xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); - ASSERT(ip->i_df.if_ext_max =3D=3D - XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t)); return error; } =20 @@ -3753,42 +3618,122 @@ xfs_bmap_last_before( return 0; } =20 +STATIC int +xfs_bmap_last_extent( + struct xfs_trans *tp, + struct xfs_inode *ip, + int whichfork, + struct xfs_bmbt_irec *rec, + int *is_empty) +{ + struct xfs_ifork *ifp =3D XFS_IFORK_PTR(ip, whichfork); + int error; + int nextents; + + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + error =3D xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + nextents =3D ifp->if_bytes / sizeof(xfs_bmbt_rec_t); + if (nextents =3D=3D 0) { + *is_empty =3D 1; + return 0; + } + + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, nextents - 1), rec); + *is_empty =3D 0; + return 0; +} + +/* + * Check the last inode extent to determine whether this allocation will r= esult + * in blocks being allocated at the end of the file. When we allocate new = data + * blocks at the end of the file which do not start at the previous data b= lock, + * we will try to align the new blocks at stripe unit boundaries. + * + * Returns 0 in bma->aeof if the file (fork) is empty as any new write wil= l be + * at, or past the EOF. + */ +STATIC int +xfs_bmap_isaeof( + struct xfs_bmalloca *bma, + int whichfork) +{ + struct xfs_bmbt_irec rec; + int is_empty; + int error; + + bma->aeof =3D 0; + error =3D xfs_bmap_last_extent(NULL, bma->ip, whichfork, &rec, + &is_empty); + if (error || is_empty) + return error; + + /* + * Check if we are allocation or past the last extent, or at least into + * the last delayed allocated extent. + */ + bma->aeof =3D bma->offset >=3D rec.br_startoff + rec.br_blockcount || + (bma->offset >=3D rec.br_startoff && + isnullstartblock(rec.br_startblock)); + return 0; +} + +/* + * Check if the endoff is outside the last extent. If so the caller will g= row + * the allocation to a stripe unit boundary. All offsets are considered o= utside + * the end of file for an empty fork, so 1 is returned in *eof in that cas= e. + */ +int +xfs_bmap_eof( + struct xfs_inode *ip, + xfs_fileoff_t endoff, + int whichfork, + int *eof) +{ + struct xfs_bmbt_irec rec; + int error; + + error =3D xfs_bmap_last_extent(NULL, ip, whichfork, &rec, eof); + if (error || *eof) + return error; + + *eof =3D endoff >=3D rec.br_startoff + rec.br_blockcount; + return 0; +} + /* * Returns the file-relative block number of the first block past eof in * the file. This is not based on i_size, it is based on the extent recor= ds. * Returns 0 for local files, as they do not have extent records. */ -int /* error */ +int xfs_bmap_last_offset( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode */ - xfs_fileoff_t *last_block, /* last block */ - int whichfork) /* data or attr fork */ + struct xfs_trans *tp, + struct xfs_inode *ip, + xfs_fileoff_t *last_block, + int whichfork) { - xfs_bmbt_rec_host_t *ep; /* pointer to last extent */ - int error; /* error return value */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_extnum_t nextents; /* number of extent entries */ + struct xfs_bmbt_irec rec; + int is_empty; + int error; + + *last_block =3D 0; + + if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL) + return 0; =20 if (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE && - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_LOCAL) + XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS) return XFS_ERROR(EIO); - if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL) { - *last_block =3D 0; - return 0; - } - ifp =3D XFS_IFORK_PTR(ip, whichfork); - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error =3D xfs_iread_extents(tp, ip, whichfork))) + + error =3D xfs_bmap_last_extent(NULL, ip, whichfork, &rec, &is_empty); + if (error || is_empty) return error; - nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - if (!nextents) { - *last_block =3D 0; - return 0; - } - ep =3D xfs_iext_get_ext(ifp, nextents - 1); - *last_block =3D xfs_bmbt_get_startoff(ep) + xfs_bmbt_get_blockcount(ep); + + *last_block =3D rec.br_startoff + rec.br_blockcount; return 0; } =20 @@ -3808,11 +3753,8 @@ xfs_bmap_one_block( xfs_bmbt_irec_t s; /* internal version of extent */ =20 #ifndef DEBUG - if (whichfork =3D=3D XFS_DATA_FORK) { - return ((ip->i_d.di_mode & S_IFMT) =3D=3D S_IFREG) ? - (ip->i_size =3D=3D ip->i_mount->m_sb.sb_blocksize) : - (ip->i_d.di_size =3D=3D ip->i_mount->m_sb.sb_blocksize); - } + if (whichfork =3D=3D XFS_DATA_FORK) + return XFS_ISIZE(ip) =3D=3D ip->i_mount->m_sb.sb_blocksize; #endif /* !DEBUG */ if (XFS_IFORK_NEXTENTS(ip, whichfork) !=3D 1) return 0; @@ -3824,7 +3766,7 @@ xfs_bmap_one_block( xfs_bmbt_get_all(ep, &s); rval =3D s.br_startoff =3D=3D 0 && s.br_blockcount =3D=3D 1; if (rval && whichfork =3D=3D XFS_DATA_FORK) - ASSERT(ip->i_size =3D=3D ip->i_mount->m_sb.sb_blocksize); + ASSERT(XFS_ISIZE(ip) =3D=3D ip->i_mount->m_sb.sb_blocksize); return rval; } =20 @@ -3836,7 +3778,7 @@ xfs_bmap_sanity_check( { struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); =20 - if (be32_to_cpu(block->bb_magic) !=3D XFS_BMAP_MAGIC || + if (block->bb_magic !=3D cpu_to_be32(XFS_BMAP_MAGIC) || be16_to_cpu(block->bb_level) !=3D level || be16_to_cpu(block->bb_numrecs) =3D=3D 0 || be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level !=3D 0]) @@ -3890,8 +3832,9 @@ xfs_bmap_read_extents( * pointer (leftmost) at each level. */ while (level-- > 0) { - if ((error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, - XFS_BMAP_BTREE_REF))) + error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, + XFS_BMAP_BTREE_REF, &xfs_bmbt_buf_ops); + if (error) return error; block =3D XFS_BUF_TO_BLOCK(bp); XFS_WANT_CORRUPTED_GOTO( @@ -3918,16 +3861,14 @@ xfs_bmap_read_extents( xfs_extnum_t num_recs; xfs_extnum_t start; =20 - num_recs =3D xfs_btree_get_numrecs(block); if (unlikely(i + num_recs > room)) { ASSERT(i + num_recs <=3D room); - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + xfs_warn(ip->i_mount, "corrupt dinode %Lu, (btree extents).", (unsigned long long) ip->i_ino); - XFS_ERROR_REPORT("xfs_bmap_read_extents(1)", - XFS_ERRLEVEL_LOW, - ip->i_mount); + XFS_CORRUPTION_ERROR("xfs_bmap_read_extents(1)", + XFS_ERRLEVEL_LOW, ip->i_mount, block); goto error0; } XFS_WANT_CORRUPTED_GOTO( @@ -3938,7 +3879,8 @@ xfs_bmap_read_extents( */ nextbno =3D be64_to_cpu(block->bb_u.l.bb_rightsib); if (nextbno !=3D NULLFSBLOCK) - xfs_btree_reada_bufl(mp, nextbno, 1); + xfs_btree_reada_bufl(mp, nextbno, 1, + &xfs_bmbt_buf_ops); /* * Copy records into the extent records. */ @@ -3970,8 +3912,9 @@ xfs_bmap_read_extents( */ if (bno =3D=3D NULLFSBLOCK) break; - if ((error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, - XFS_BMAP_BTREE_REF))) + error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, + XFS_BMAP_BTREE_REF, &xfs_bmbt_buf_ops); + if (error) return error; block =3D XFS_BUF_TO_BLOCK(bp); } @@ -4042,9 +3985,8 @@ xfs_bmap_validate_ret( ASSERT(i =3D=3D 0 || mval[i - 1].br_startoff + mval[i - 1].br_blockcount =3D=3D mval[i].br_startoff); - if ((flags & XFS_BMAPI_WRITE) && !(flags & XFS_BMAPI_DELAY)) - ASSERT(mval[i].br_startblock !=3D DELAYSTARTBLOCK && - mval[i].br_startblock !=3D HOLESTARTBLOCK); + ASSERT(mval[i].br_startblock !=3D DELAYSTARTBLOCK && + mval[i].br_startblock !=3D HOLESTARTBLOCK); ASSERT(mval[i].br_state =3D=3D XFS_EXT_NORM || mval[i].br_state =3D=3D XFS_EXT_UNWRITTEN); } @@ -4053,395 +3995,166 @@ xfs_bmap_validate_ret( =20 =20 /* - * Map file blocks to filesystem blocks. - * File range is given by the bno/len pair. - * Adds blocks to file if a write ("flags & XFS_BMAPI_WRITE" set) - * into a hole or past eof. - * Only allocates blocks from a single allocation group, - * to avoid locking problems. - * The returned value in "firstblock" from the first call in a transaction - * must be remembered and presented to subsequent calls in "firstblock". - * An upper bound for the number of blocks to be allocated is supplied to - * the first call in "total"; if no allocation group has that many free - * blocks then the call will fail (return NULLFSBLOCK in "firstblock"). + * Trim the returned map to the required bounds */ -int /* error */ -xfs_bmapi( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode */ - xfs_fileoff_t bno, /* starting file offs. mapped */ - xfs_filblks_t len, /* length to map in file */ - int flags, /* XFS_BMAPI_... */ - xfs_fsblock_t *firstblock, /* first allocated block - controls a.g. for allocs */ - xfs_extlen_t total, /* total blocks needed */ - xfs_bmbt_irec_t *mval, /* output: map values */ - int *nmap, /* i/o: mval size/count */ - xfs_bmap_free_t *flist) /* i/o: list extents to free */ +STATIC void +xfs_bmapi_trim_map( + struct xfs_bmbt_irec *mval, + struct xfs_bmbt_irec *got, + xfs_fileoff_t *bno, + xfs_filblks_t len, + xfs_fileoff_t obno, + xfs_fileoff_t end, + int n, + int flags) { - xfs_fsblock_t abno; /* allocated block number */ - xfs_extlen_t alen; /* allocated extent length */ - xfs_fileoff_t aoff; /* allocated file offset */ - xfs_bmalloca_t bma =3D { 0 }; /* args for xfs_bmap_alloc */ - xfs_btree_cur_t *cur; /* bmap btree cursor */ - xfs_fileoff_t end; /* end of mapped file region */ - int eof; /* we've hit the end of extents */ - xfs_bmbt_rec_host_t *ep; /* extent record pointer */ - int error; /* error return */ - xfs_bmbt_irec_t got; /* current file extent record */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_extlen_t indlen; /* indirect blocks length */ - xfs_extnum_t lastx; /* last useful extent number */ - int logflags; /* flags for transaction logging */ - xfs_extlen_t minleft; /* min blocks left after allocation */ - xfs_extlen_t minlen; /* min allocation size */ - xfs_mount_t *mp; /* xfs mount structure */ - int n; /* current extent index */ - int nallocs; /* number of extents alloc'd */ - xfs_extnum_t nextents; /* number of extents in file */ - xfs_fileoff_t obno; /* old block number (offset) */ - xfs_bmbt_irec_t prev; /* previous file extent record */ - int tmp_logflags; /* temp flags holder */ - int whichfork; /* data or attr fork */ - char inhole; /* current location is hole in file */ - char wasdelay; /* old extent was delayed */ - char wr; /* this is a write request */ - char rt; /* this is a realtime file */ -#ifdef DEBUG - xfs_fileoff_t orig_bno; /* original block number value */ - int orig_flags; /* original flags arg value */ - xfs_filblks_t orig_len; /* original value of len arg */ - xfs_bmbt_irec_t *orig_mval; /* original value of mval */ - int orig_nmap; /* original value of *nmap */ - - orig_bno =3D bno; - orig_len =3D len; - orig_flags =3D flags; - orig_mval =3D mval; - orig_nmap =3D *nmap; -#endif - ASSERT(*nmap >=3D 1); - ASSERT(*nmap <=3D XFS_BMAP_MAX_NMAP || !(flags & XFS_BMAPI_WRITE)); - whichfork =3D (flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; - mp =3D ip->i_mount; - if (unlikely(XFS_TEST_ERROR( - (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE && - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_LOCAL), - mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { - XFS_ERROR_REPORT("xfs_bmapi", XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); + if ((flags & XFS_BMAPI_ENTIRE) || + got->br_startoff + got->br_blockcount <=3D obno) { + *mval =3D *got; + if (isnullstartblock(got->br_startblock)) + mval->br_startblock =3D DELAYSTARTBLOCK; + return; } - if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); - rt =3D (whichfork =3D=3D XFS_DATA_FORK) && XFS_IS_REALTIME_INODE(ip); - ifp =3D XFS_IFORK_PTR(ip, whichfork); - ASSERT(ifp->if_ext_max =3D=3D - XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); - if ((wr =3D (flags & XFS_BMAPI_WRITE)) !=3D 0) - XFS_STATS_INC(xs_blk_mapw); + + if (obno > *bno) + *bno =3D obno; + ASSERT((*bno >=3D obno) || (n =3D=3D 0)); + ASSERT(*bno < end); + mval->br_startoff =3D *bno; + if (isnullstartblock(got->br_startblock)) + mval->br_startblock =3D DELAYSTARTBLOCK; else - XFS_STATS_INC(xs_blk_mapr); + mval->br_startblock =3D got->br_startblock + + (*bno - got->br_startoff); /* - * IGSTATE flag is used to combine extents which - * differ only due to the state of the extents. - * This technique is used from xfs_getbmap() - * when the caller does not wish to see the - * separation (which is the default). - * - * This technique is also used when writing a - * buffer which has been partially written, - * (usually by being flushed during a chunkread), - * to ensure one write takes place. This also - * prevents a change in the xfs inode extents at - * this time, intentionally. This change occurs - * on completion of the write operation, in - * xfs_strat_comp(), where the xfs_bmapi() call - * is transactioned, and the extents combined. + * Return the minimum of what we got and what we asked for for + * the length. We can use the len variable here because it is + * modified below and we could have been there before coming + * here if the first part of the allocation didn't overlap what + * was asked for. */ - if ((flags & XFS_BMAPI_IGSTATE) && wr) /* if writing unwritten space */ - wr =3D 0; /* no allocations are allowed */ - ASSERT(wr || !(flags & XFS_BMAPI_DELAY)); - logflags =3D 0; - nallocs =3D 0; - cur =3D NULL; - if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL) { - ASSERT(wr && tp); - if ((error =3D xfs_bmap_local_to_extents(tp, ip, - firstblock, total, &logflags, whichfork))) - goto error0; - } - if (wr && *firstblock =3D=3D NULLFSBLOCK) { - if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_BTREE) - minleft =3D be16_to_cpu(ifp->if_broot->bb_level) + 1; - else - minleft =3D 1; - } else - minleft =3D 0; - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error =3D xfs_iread_extents(tp, ip, whichfork))) - goto error0; - ep =3D xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, - &prev); - nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - n =3D 0; - end =3D bno + len; - obno =3D bno; - bma.ip =3D NULL; + mval->br_blockcount =3D XFS_FILBLKS_MIN(end - *bno, + got->br_blockcount - (*bno - got->br_startoff)); + mval->br_state =3D got->br_state; + ASSERT(mval->br_blockcount <=3D len); + return; +} =20 - while (bno < end && n < *nmap) { - /* - * Reading past eof, act as though there's a hole - * up to end. - */ - if (eof && !wr) - got.br_startoff =3D end; - inhole =3D eof || got.br_startoff > bno; - wasdelay =3D wr && !inhole && !(flags & XFS_BMAPI_DELAY) && - isnullstartblock(got.br_startblock); - /* - * First, deal with the hole before the allocated space - * that we found, if any. - */ - if (wr && (inhole || wasdelay)) { - /* - * For the wasdelay case, we could also just - * allocate the stuff asked for in this bmap call - * but that wouldn't be as good. - */ - if (wasdelay) { - alen =3D (xfs_extlen_t)got.br_blockcount; - aoff =3D got.br_startoff; - if (lastx !=3D NULLEXTNUM && lastx) { - ep =3D xfs_iext_get_ext(ifp, lastx - 1); - xfs_bmbt_get_all(ep, &prev); - } - } else { - alen =3D (xfs_extlen_t) - XFS_FILBLKS_MIN(len, MAXEXTLEN); - if (!eof) - alen =3D (xfs_extlen_t) - XFS_FILBLKS_MIN(alen, - got.br_startoff - bno); - aoff =3D bno; - } - minlen =3D (flags & XFS_BMAPI_CONTIG) ? alen : 1; - if (flags & XFS_BMAPI_DELAY) { - xfs_extlen_t extsz; - - /* Figure out the extent size, adjust alen */ - extsz =3D xfs_get_extsz_hint(ip); - if (extsz) { - error =3D xfs_bmap_extsize_align(mp, - &got, &prev, extsz, - rt, eof, - flags&XFS_BMAPI_DELAY, - flags&XFS_BMAPI_CONVERT, - &aoff, &alen); - ASSERT(!error); - } +/* + * Update and validate the extent map to return + */ +STATIC void +xfs_bmapi_update_map( + struct xfs_bmbt_irec **map, + xfs_fileoff_t *bno, + xfs_filblks_t *len, + xfs_fileoff_t obno, + xfs_fileoff_t end, + int *n, + int flags) +{ + xfs_bmbt_irec_t *mval =3D *map; + + ASSERT((flags & XFS_BMAPI_ENTIRE) || + ((mval->br_startoff + mval->br_blockcount) <=3D end)); + ASSERT((flags & XFS_BMAPI_ENTIRE) || (mval->br_blockcount <=3D *len) || + (mval->br_startoff < obno)); + + *bno =3D mval->br_startoff + mval->br_blockcount; + *len =3D end - *bno; + if (*n > 0 && mval->br_startoff =3D=3D mval[-1].br_startoff) { + /* update previous map with new information */ + ASSERT(mval->br_startblock =3D=3D mval[-1].br_startblock); + ASSERT(mval->br_blockcount > mval[-1].br_blockcount); + ASSERT(mval->br_state =3D=3D mval[-1].br_state); + mval[-1].br_blockcount =3D mval->br_blockcount; + mval[-1].br_state =3D mval->br_state; + } else if (*n > 0 && mval->br_startblock !=3D DELAYSTARTBLOCK && + mval[-1].br_startblock !=3D DELAYSTARTBLOCK && + mval[-1].br_startblock !=3D HOLESTARTBLOCK && + mval->br_startblock =3D=3D mval[-1].br_startblock + + mval[-1].br_blockcount && + ((flags & XFS_BMAPI_IGSTATE) || + mval[-1].br_state =3D=3D mval->br_state)) { + ASSERT(mval->br_startoff =3D=3D + mval[-1].br_startoff + mval[-1].br_blockcount); + mval[-1].br_blockcount +=3D mval->br_blockcount; + } else if (*n > 0 && + mval->br_startblock =3D=3D DELAYSTARTBLOCK && + mval[-1].br_startblock =3D=3D DELAYSTARTBLOCK && + mval->br_startoff =3D=3D + mval[-1].br_startoff + mval[-1].br_blockcount) { + mval[-1].br_blockcount +=3D mval->br_blockcount; + mval[-1].br_state =3D mval->br_state; + } else if (!((*n =3D=3D 0) && + ((mval->br_startoff + mval->br_blockcount) <=3D + obno))) { + mval++; + (*n)++; + } + *map =3D mval; +} =20 - if (rt) - extsz =3D alen / mp->m_sb.sb_rextsize; +/* + * Map file blocks to filesystem blocks without allocation. + */ +int +xfs_bmapi_read( + struct xfs_inode *ip, + xfs_fileoff_t bno, + xfs_filblks_t len, + struct xfs_bmbt_irec *mval, + int *nmap, + int flags) +{ + struct xfs_mount *mp =3D ip->i_mount; + struct xfs_ifork *ifp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec prev; + xfs_fileoff_t obno; + xfs_fileoff_t end; + xfs_extnum_t lastx; + int error; + int eof; + int n =3D 0; + int whichfork =3D (flags & XFS_BMAPI_ATTRFORK) ? + XFS_ATTR_FORK : XFS_DATA_FORK; =20 - /* - * Make a transaction-less quota reservation for - * delayed allocation blocks. This number gets - * adjusted later. We return if we haven't - * allocated blocks already inside this loop. - */ - error =3D xfs_trans_reserve_quota_nblks( - NULL, ip, (long)alen, 0, - rt ? XFS_QMOPT_RES_RTBLKS : - XFS_QMOPT_RES_REGBLKS); - if (error) { - if (n =3D=3D 0) { - *nmap =3D 0; - ASSERT(cur =3D=3D NULL); - return error; - } - break; - } + ASSERT(*nmap >=3D 1); + ASSERT(!(flags & ~(XFS_BMAPI_ATTRFORK|XFS_BMAPI_ENTIRE| + XFS_BMAPI_IGSTATE))); =20 - /* - * Split changing sb for alen and indlen since - * they could be coming from different places. - */ - indlen =3D (xfs_extlen_t) - xfs_bmap_worst_indlen(ip, alen); - ASSERT(indlen > 0); - - if (rt) { - error =3D xfs_mod_incore_sb(mp, - XFS_SBS_FREXTENTS, - -((int64_t)extsz), (flags & - XFS_BMAPI_RSVBLOCKS)); - } else { - error =3D xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, - -((int64_t)alen), (flags & - XFS_BMAPI_RSVBLOCKS)); - } - if (!error) { - error =3D xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, - -((int64_t)indlen), (flags & - XFS_BMAPI_RSVBLOCKS)); - if (error && rt) - xfs_mod_incore_sb(mp, - XFS_SBS_FREXTENTS, - (int64_t)extsz, (flags & - XFS_BMAPI_RSVBLOCKS)); - else if (error) - xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, - (int64_t)alen, (flags & - XFS_BMAPI_RSVBLOCKS)); - } + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmapi_read", XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } =20 - if (error) { - if (XFS_IS_QUOTA_ON(mp)) - /* unreserve the blocks now */ - (void) - xfs_trans_unreserve_quota_nblks( - NULL, ip, - (long)alen, 0, rt ? - XFS_QMOPT_RES_RTBLKS : - XFS_QMOPT_RES_REGBLKS); - break; - } + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); =20 - ip->i_delayed_blks +=3D alen; - abno =3D nullstartblock(indlen); - } else { - /* - * If first time, allocate and fill in - * once-only bma fields. - */ - if (bma.ip =3D=3D NULL) { - bma.tp =3D tp; - bma.ip =3D ip; - bma.prevp =3D &prev; - bma.gotp =3D &got; - bma.total =3D total; - bma.userdata =3D 0; - } - /* Indicate if this is the first user data - * in the file, or just any user data. - */ - if (!(flags & XFS_BMAPI_METADATA)) { - bma.userdata =3D (aoff =3D=3D 0) ? - XFS_ALLOC_INITIAL_USER_DATA : - XFS_ALLOC_USERDATA; - } - /* - * Fill in changeable bma fields. - */ - bma.eof =3D eof; - bma.firstblock =3D *firstblock; - bma.alen =3D alen; - bma.off =3D aoff; - bma.conv =3D !!(flags & XFS_BMAPI_CONVERT); - bma.wasdel =3D wasdelay; - bma.minlen =3D minlen; - bma.low =3D flist->xbf_low; - bma.minleft =3D minleft; - /* - * Only want to do the alignment at the - * eof if it is userdata and allocation length - * is larger than a stripe unit. - */ - if (mp->m_dalign && alen >=3D mp->m_dalign && - (!(flags & XFS_BMAPI_METADATA)) && - (whichfork =3D=3D XFS_DATA_FORK)) { - if ((error =3D xfs_bmap_isaeof(ip, aoff, - whichfork, &bma.aeof))) - goto error0; - } else - bma.aeof =3D 0; - /* - * Call allocator. - */ - if ((error =3D xfs_bmap_alloc(&bma))) - goto error0; - /* - * Copy out result fields. - */ - abno =3D bma.rval; - if ((flist->xbf_low =3D bma.low)) - minleft =3D 0; - alen =3D bma.alen; - aoff =3D bma.off; - ASSERT(*firstblock =3D=3D NULLFSBLOCK || - XFS_FSB_TO_AGNO(mp, *firstblock) =3D=3D - XFS_FSB_TO_AGNO(mp, bma.firstblock) || - (flist->xbf_low && - XFS_FSB_TO_AGNO(mp, *firstblock) < - XFS_FSB_TO_AGNO(mp, bma.firstblock))); - *firstblock =3D bma.firstblock; - if (cur) - cur->bc_private.b.firstblock =3D - *firstblock; - if (abno =3D=3D NULLFSBLOCK) - break; - if ((ifp->if_flags & XFS_IFBROOT) && !cur) { - cur =3D xfs_bmbt_init_cursor(mp, tp, - ip, whichfork); - cur->bc_private.b.firstblock =3D - *firstblock; - cur->bc_private.b.flist =3D flist; - } - /* - * Bump the number of extents we've allocated - * in this call. - */ - nallocs++; - } - if (cur) - cur->bc_private.b.flags =3D - wasdelay ? XFS_BTCUR_BPRV_WASDEL : 0; - got.br_startoff =3D aoff; - got.br_startblock =3D abno; - got.br_blockcount =3D alen; - got.br_state =3D XFS_EXT_NORM; /* assume normal */ - /* - * Determine state of extent, and the filesystem. - * A wasdelay extent has been initialized, so - * shouldn't be flagged as unwritten. - */ - if (wr && xfs_sb_version_hasextflgbit(&mp->m_sb)) { - if (!wasdelay && (flags & XFS_BMAPI_PREALLOC)) - got.br_state =3D XFS_EXT_UNWRITTEN; - } - error =3D xfs_bmap_add_extent(ip, lastx, &cur, &got, - firstblock, flist, &tmp_logflags, - whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); - logflags |=3D tmp_logflags; - if (error) - goto error0; - lastx =3D ifp->if_lastex; - ep =3D xfs_iext_get_ext(ifp, lastx); - nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - xfs_bmbt_get_all(ep, &got); - ASSERT(got.br_startoff <=3D aoff); - ASSERT(got.br_startoff + got.br_blockcount >=3D - aoff + alen); -#ifdef DEBUG - if (flags & XFS_BMAPI_DELAY) { - ASSERT(isnullstartblock(got.br_startblock)); - ASSERT(startblockval(got.br_startblock) > 0); - } - ASSERT(got.br_state =3D=3D XFS_EXT_NORM || - got.br_state =3D=3D XFS_EXT_UNWRITTEN); -#endif - /* - * Fall down into the found allocated space case. - */ - } else if (inhole) { - /* - * Reading in a hole. - */ + XFS_STATS_INC(xs_blk_mapr); + + ifp =3D XFS_IFORK_PTR(ip, whichfork); + + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + error =3D xfs_iread_extents(NULL, ip, whichfork); + if (error) + return error; + } + + xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, &prev); + end =3D bno + len; + obno =3D bno; + + while (bno < end && n < *nmap) { + /* Reading past eof, act as though there's a hole up to end. */ + if (eof) + got.br_startoff =3D end; + if (got.br_startoff > bno) { + /* Reading in a hole. */ mval->br_startoff =3D bno; mval->br_startblock =3D HOLESTARTBLOCK; mval->br_blockcount =3D @@ -4453,193 +4166,624 @@ xfs_bmapi( n++; continue; } + + /* set up the extent map to return. */ + xfs_bmapi_trim_map(mval, &got, &bno, len, obno, end, n, flags); + xfs_bmapi_update_map(&mval, &bno, &len, obno, end, &n, flags); + + /* If we're done, stop now. */ + if (bno >=3D end || n >=3D *nmap) + break; + + /* Else go on to the next record. */ + if (++lastx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, lastx), &got); + else + eof =3D 1; + } + *nmap =3D n; + return 0; +} + +STATIC int +xfs_bmapi_reserve_delalloc( + struct xfs_inode *ip, + xfs_fileoff_t aoff, + xfs_filblks_t len, + struct xfs_bmbt_irec *got, + struct xfs_bmbt_irec *prev, + xfs_extnum_t *lastx, + int eof) +{ + struct xfs_mount *mp =3D ip->i_mount; + struct xfs_ifork *ifp =3D XFS_IFORK_PTR(ip, XFS_DATA_FORK); + xfs_extlen_t alen; + xfs_extlen_t indlen; + char rt =3D XFS_IS_REALTIME_INODE(ip); + xfs_extlen_t extsz; + int error; + + alen =3D XFS_FILBLKS_MIN(len, MAXEXTLEN); + if (!eof) + alen =3D XFS_FILBLKS_MIN(alen, got->br_startoff - aoff); + + /* Figure out the extent size, adjust alen */ + extsz =3D xfs_get_extsz_hint(ip); + if (extsz) { /* - * Then deal with the allocated space we found. + * Make sure we don't exceed a single extent length when we + * align the extent by reducing length we are going to + * allocate by the maximum amount extent size aligment may + * require. */ - ASSERT(ep !=3D NULL); - if (!(flags & XFS_BMAPI_ENTIRE) && - (got.br_startoff + got.br_blockcount > obno)) { - if (obno > bno) - bno =3D obno; - ASSERT((bno >=3D obno) || (n =3D=3D 0)); - ASSERT(bno < end); - mval->br_startoff =3D bno; - if (isnullstartblock(got.br_startblock)) { - ASSERT(!wr || (flags & XFS_BMAPI_DELAY)); - mval->br_startblock =3D DELAYSTARTBLOCK; - } else - mval->br_startblock =3D - got.br_startblock + - (bno - got.br_startoff); - /* - * Return the minimum of what we got and what we - * asked for for the length. We can use the len - * variable here because it is modified below - * and we could have been there before coming - * here if the first part of the allocation - * didn't overlap what was asked for. - */ - mval->br_blockcount =3D - XFS_FILBLKS_MIN(end - bno, got.br_blockcount - - (bno - got.br_startoff)); - mval->br_state =3D got.br_state; - ASSERT(mval->br_blockcount <=3D len); - } else { - *mval =3D got; - if (isnullstartblock(mval->br_startblock)) { - ASSERT(!wr || (flags & XFS_BMAPI_DELAY)); - mval->br_startblock =3D DELAYSTARTBLOCK; + alen =3D XFS_FILBLKS_MIN(len, MAXEXTLEN - (2 * extsz - 1)); + error =3D xfs_bmap_extsize_align(mp, got, prev, extsz, rt, eof, + 1, 0, &aoff, &alen); + ASSERT(!error); + } + + if (rt) + extsz =3D alen / mp->m_sb.sb_rextsize; + + /* + * Make a transaction-less quota reservation for delayed allocation + * blocks. This number gets adjusted later. We return if we haven't + * allocated blocks already inside this loop. + */ + error =3D xfs_trans_reserve_quota_nblks(NULL, ip, (long)alen, 0, + rt ? XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS); + if (error) + return error; + + /* + * Split changing sb for alen and indlen since they could be coming + * from different places. + */ + indlen =3D (xfs_extlen_t)xfs_bmap_worst_indlen(ip, alen); + ASSERT(indlen > 0); + + if (rt) { + error =3D xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, + -((int64_t)extsz), 0); + } else { + error =3D xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + -((int64_t)alen), 0); + } + + if (error) + goto out_unreserve_quota; + + error =3D xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + -((int64_t)indlen), 0); + if (error) + goto out_unreserve_blocks; + + + ip->i_delayed_blks +=3D alen; + + got->br_startoff =3D aoff; + got->br_startblock =3D nullstartblock(indlen); + got->br_blockcount =3D alen; + got->br_state =3D XFS_EXT_NORM; + xfs_bmap_add_extent_hole_delay(ip, lastx, got); + + /* + * Update our extent pointer, given that xfs_bmap_add_extent_hole_delay + * might have merged it into one of the neighbouring ones. + */ + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *lastx), got); + + ASSERT(got->br_startoff <=3D aoff); + ASSERT(got->br_startoff + got->br_blockcount >=3D aoff + alen); + ASSERT(isnullstartblock(got->br_startblock)); + ASSERT(got->br_state =3D=3D XFS_EXT_NORM); + return 0; + +out_unreserve_blocks: + if (rt) + xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, extsz, 0); + else + xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, alen, 0); +out_unreserve_quota: + if (XFS_IS_QUOTA_ON(mp)) + xfs_trans_unreserve_quota_nblks(NULL, ip, (long)alen, 0, rt ? + XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS); + return error; +} + +/* + * Map file blocks to filesystem blocks, adding delayed allocations as nee= ded. + */ +int +xfs_bmapi_delay( + struct xfs_inode *ip, /* incore inode */ + xfs_fileoff_t bno, /* starting file offs. mapped */ + xfs_filblks_t len, /* length to map in file */ + struct xfs_bmbt_irec *mval, /* output: map values */ + int *nmap, /* i/o: mval size/count */ + int flags) /* XFS_BMAPI_... */ +{ + struct xfs_mount *mp =3D ip->i_mount; + struct xfs_ifork *ifp =3D XFS_IFORK_PTR(ip, XFS_DATA_FORK); + struct xfs_bmbt_irec got; /* current file extent record */ + struct xfs_bmbt_irec prev; /* previous file extent record */ + xfs_fileoff_t obno; /* old block number (offset) */ + xfs_fileoff_t end; /* end of mapped file region */ + xfs_extnum_t lastx; /* last useful extent number */ + int eof; /* we've hit the end of extents */ + int n =3D 0; /* current extent index */ + int error =3D 0; + + ASSERT(*nmap >=3D 1); + ASSERT(*nmap <=3D XFS_BMAP_MAX_NMAP); + ASSERT(!(flags & ~XFS_BMAPI_ENTIRE)); + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) !=3D XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) !=3D XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmapi_delay", XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + XFS_STATS_INC(xs_blk_mapw); + + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + error =3D xfs_iread_extents(NULL, ip, XFS_DATA_FORK); + if (error) + return error; + } + + xfs_bmap_search_extents(ip, bno, XFS_DATA_FORK, &eof, &lastx, &got, &prev= ); + end =3D bno + len; + obno =3D bno; + + while (bno < end && n < *nmap) { + if (eof || got.br_startoff > bno) { + error =3D xfs_bmapi_reserve_delalloc(ip, bno, len, &got, + &prev, &lastx, eof); + if (error) { + if (n =3D=3D 0) { + *nmap =3D 0; + return error; + } + break; } } =20 + /* set up the extent map to return. */ + xfs_bmapi_trim_map(mval, &got, &bno, len, obno, end, n, flags); + xfs_bmapi_update_map(&mval, &bno, &len, obno, end, &n, flags); + + /* If we're done, stop now. */ + if (bno >=3D end || n >=3D *nmap) + break; + + /* Else go on to the next record. */ + prev =3D got; + if (++lastx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, lastx), &got); + else + eof =3D 1; + } + + *nmap =3D n; + return 0; +} + + +STATIC int +xfs_bmapi_allocate( + struct xfs_bmalloca *bma) +{ + struct xfs_mount *mp =3D bma->ip->i_mount; + int whichfork =3D (bma->flags & XFS_BMAPI_ATTRFORK) ? + XFS_ATTR_FORK : XFS_DATA_FORK; + struct xfs_ifork *ifp =3D XFS_IFORK_PTR(bma->ip, whichfork); + int tmp_logflags =3D 0; + int error; + + ASSERT(bma->length > 0); + + /* + * For the wasdelay case, we could also just allocate the stuff asked + * for in this bmap call but that wouldn't be as good. + */ + if (bma->wasdel) { + bma->length =3D (xfs_extlen_t)bma->got.br_blockcount; + bma->offset =3D bma->got.br_startoff; + if (bma->idx !=3D NULLEXTNUM && bma->idx) { + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx - 1), + &bma->prev); + } + } else { + bma->length =3D XFS_FILBLKS_MIN(bma->length, MAXEXTLEN); + if (!bma->eof) + bma->length =3D XFS_FILBLKS_MIN(bma->length, + bma->got.br_startoff - bma->offset); + } + + /* + * Indicate if this is the first user data in the file, or just any + * user data. + */ + if (!(bma->flags & XFS_BMAPI_METADATA)) { + bma->userdata =3D (bma->offset =3D=3D 0) ? + XFS_ALLOC_INITIAL_USER_DATA : XFS_ALLOC_USERDATA; + } + + bma->minlen =3D (bma->flags & XFS_BMAPI_CONTIG) ? bma->length : 1; + + /* + * Only want to do the alignment at the eof if it is userdata and + * allocation length is larger than a stripe unit. + */ + if (mp->m_dalign && bma->length >=3D mp->m_dalign && + !(bma->flags & XFS_BMAPI_METADATA) && whichfork =3D=3D XFS_DATA_FORK)= { + error =3D xfs_bmap_isaeof(bma, whichfork); + if (error) + return error; + } + + if (bma->flags & XFS_BMAPI_STACK_SWITCH) + bma->stack_switch =3D 1; + + error =3D xfs_bmap_alloc(bma); + if (error) + return error; + + if (bma->flist->xbf_low) + bma->minleft =3D 0; + if (bma->cur) + bma->cur->bc_private.b.firstblock =3D *bma->firstblock; + if (bma->blkno =3D=3D NULLFSBLOCK) + return 0; + if ((ifp->if_flags & XFS_IFBROOT) && !bma->cur) { + bma->cur =3D xfs_bmbt_init_cursor(mp, bma->tp, bma->ip, whichfork); + bma->cur->bc_private.b.firstblock =3D *bma->firstblock; + bma->cur->bc_private.b.flist =3D bma->flist; + } + /* + * Bump the number of extents we've allocated + * in this call. + */ + bma->nallocs++; + + if (bma->cur) + bma->cur->bc_private.b.flags =3D + bma->wasdel ? XFS_BTCUR_BPRV_WASDEL : 0; + + bma->got.br_startoff =3D bma->offset; + bma->got.br_startblock =3D bma->blkno; + bma->got.br_blockcount =3D bma->length; + bma->got.br_state =3D XFS_EXT_NORM; + + /* + * A wasdelay extent has been initialized, so shouldn't be flagged + * as unwritten. + */ + if (!bma->wasdel && (bma->flags & XFS_BMAPI_PREALLOC) && + xfs_sb_version_hasextflgbit(&mp->m_sb)) + bma->got.br_state =3D XFS_EXT_UNWRITTEN; + + if (bma->wasdel) + error =3D xfs_bmap_add_extent_delay_real(bma); + else + error =3D xfs_bmap_add_extent_hole_real(bma, whichfork); + + bma->logflags |=3D tmp_logflags; + if (error) + return error; + + /* + * Update our extent pointer, given that xfs_bmap_add_extent_delay_real + * or xfs_bmap_add_extent_hole_real might have merged it into one of + * the neighbouring ones. + */ + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx), &bma->got); + + ASSERT(bma->got.br_startoff <=3D bma->offset); + ASSERT(bma->got.br_startoff + bma->got.br_blockcount >=3D + bma->offset + bma->length); + ASSERT(bma->got.br_state =3D=3D XFS_EXT_NORM || + bma->got.br_state =3D=3D XFS_EXT_UNWRITTEN); + return 0; +} + + +STATIC int +xfs_bmapi_convert_unwritten( + struct xfs_bmalloca *bma, + struct xfs_bmbt_irec *mval, + xfs_filblks_t len, + int flags) +{ + int whichfork =3D (flags & XFS_BMAPI_ATTRFORK) ? + XFS_ATTR_FORK : XFS_DATA_FORK; + struct xfs_ifork *ifp =3D XFS_IFORK_PTR(bma->ip, whichfork); + int tmp_logflags =3D 0; + int error; + + /* check if we need to do unwritten->real conversion */ + if (mval->br_state =3D=3D XFS_EXT_UNWRITTEN && + (flags & XFS_BMAPI_PREALLOC)) + return 0; + + /* check if we need to do real->unwritten conversion */ + if (mval->br_state =3D=3D XFS_EXT_NORM && + (flags & (XFS_BMAPI_PREALLOC | XFS_BMAPI_CONVERT)) !=3D + (XFS_BMAPI_PREALLOC | XFS_BMAPI_CONVERT)) + return 0; + + /* + * Modify (by adding) the state flag, if writing. + */ + ASSERT(mval->br_blockcount <=3D len); + if ((ifp->if_flags & XFS_IFBROOT) && !bma->cur) { + bma->cur =3D xfs_bmbt_init_cursor(bma->ip->i_mount, bma->tp, + bma->ip, whichfork); + bma->cur->bc_private.b.firstblock =3D *bma->firstblock; + bma->cur->bc_private.b.flist =3D bma->flist; + } + mval->br_state =3D (mval->br_state =3D=3D XFS_EXT_UNWRITTEN) + ? XFS_EXT_NORM : XFS_EXT_UNWRITTEN; + + error =3D xfs_bmap_add_extent_unwritten_real(bma->tp, bma->ip, &bma->idx, + &bma->cur, mval, bma->firstblock, bma->flist, + &tmp_logflags); + bma->logflags |=3D tmp_logflags; + if (error) + return error; + + /* + * Update our extent pointer, given that + * xfs_bmap_add_extent_unwritten_real might have merged it into one + * of the neighbouring ones. + */ + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx), &bma->got); + + /* + * We may have combined previously unwritten space with written space, + * so generate another request. + */ + if (mval->br_blockcount < len) + return EAGAIN; + return 0; +} + +/* + * Map file blocks to filesystem blocks, and allocate blocks or convert the + * extent state if necessary. Details behaviour is controlled by the flags + * parameter. Only allocates blocks from a single allocation group, to av= oid + * locking problems. + * + * The returned value in "firstblock" from the first call in a transaction + * must be remembered and presented to subsequent calls in "firstblock". + * An upper bound for the number of blocks to be allocated is supplied to + * the first call in "total"; if no allocation group has that many free + * blocks then the call will fail (return NULLFSBLOCK in "firstblock"). + */ +int +xfs_bmapi_write( + struct xfs_trans *tp, /* transaction pointer */ + struct xfs_inode *ip, /* incore inode */ + xfs_fileoff_t bno, /* starting file offs. mapped */ + xfs_filblks_t len, /* length to map in file */ + int flags, /* XFS_BMAPI_... */ + xfs_fsblock_t *firstblock, /* first allocated block + controls a.g. for allocs */ + xfs_extlen_t total, /* total blocks needed */ + struct xfs_bmbt_irec *mval, /* output: map values */ + int *nmap, /* i/o: mval size/count */ + struct xfs_bmap_free *flist) /* i/o: list extents to free */ +{ + struct xfs_mount *mp =3D ip->i_mount; + struct xfs_ifork *ifp; + struct xfs_bmalloca bma =3D { 0 }; /* args for xfs_bmap_alloc */ + xfs_fileoff_t end; /* end of mapped file region */ + int eof; /* after the end of extents */ + int error; /* error return */ + int n; /* current extent index */ + xfs_fileoff_t obno; /* old block number (offset) */ + int whichfork; /* data or attr fork */ + char inhole; /* current location is hole in file */ + char wasdelay; /* old extent was delayed */ + +#ifdef DEBUG + xfs_fileoff_t orig_bno; /* original block number value */ + int orig_flags; /* original flags arg value */ + xfs_filblks_t orig_len; /* original value of len arg */ + struct xfs_bmbt_irec *orig_mval; /* original value of mval */ + int orig_nmap; /* original value of *nmap */ + + orig_bno =3D bno; + orig_len =3D len; + orig_flags =3D flags; + orig_mval =3D mval; + orig_nmap =3D *nmap; +#endif + + ASSERT(*nmap >=3D 1); + ASSERT(*nmap <=3D XFS_BMAP_MAX_NMAP); + ASSERT(!(flags & XFS_BMAPI_IGSTATE)); + ASSERT(tp !=3D NULL); + ASSERT(len > 0); + + whichfork =3D (flags & XFS_BMAPI_ATTRFORK) ? + XFS_ATTR_FORK : XFS_DATA_FORK; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE && + XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_LOCAL), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmapi_write", XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + ifp =3D XFS_IFORK_PTR(ip, whichfork); + + XFS_STATS_INC(xs_blk_mapw); + + if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL) { + error =3D xfs_bmap_local_to_extents(tp, ip, firstblock, total, + &bma.logflags, whichfork); + if (error) + goto error0; + } + + if (*firstblock =3D=3D NULLFSBLOCK) { + if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_BTREE) + bma.minleft =3D be16_to_cpu(ifp->if_broot->bb_level) + 1; + else + bma.minleft =3D 1; + } else { + bma.minleft =3D 0; + } + + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + error =3D xfs_iread_extents(tp, ip, whichfork); + if (error) + goto error0; + } + + xfs_bmap_search_extents(ip, bno, whichfork, &eof, &bma.idx, &bma.got, + &bma.prev); + n =3D 0; + end =3D bno + len; + obno =3D bno; + + bma.tp =3D tp; + bma.ip =3D ip; + bma.total =3D total; + bma.userdata =3D 0; + bma.flist =3D flist; + bma.firstblock =3D firstblock; + + while (bno < end && n < *nmap) { + inhole =3D eof || bma.got.br_startoff > bno; + wasdelay =3D !inhole && isnullstartblock(bma.got.br_startblock); + /* - * Check if writing previously allocated but - * unwritten extents. + * First, deal with the hole before the allocated space + * that we found, if any. */ - if (wr && - ((mval->br_state =3D=3D XFS_EXT_UNWRITTEN && - ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_DELAY)) =3D=3D 0)) || - (mval->br_state =3D=3D XFS_EXT_NORM && - ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_CONVERT)) =3D=3D - (XFS_BMAPI_PREALLOC|XFS_BMAPI_CONVERT))))) { + if (inhole || wasdelay) { + bma.eof =3D eof; + bma.conv =3D !!(flags & XFS_BMAPI_CONVERT); + bma.wasdel =3D wasdelay; + bma.offset =3D bno; + bma.flags =3D flags; + /* - * Modify (by adding) the state flag, if writing. + * There's a 32/64 bit type mismatch between the + * allocation length request (which can be 64 bits in + * length) and the bma length request, which is + * xfs_extlen_t and therefore 32 bits. Hence we have to + * check for 32-bit overflows and handle them here. */ - ASSERT(mval->br_blockcount <=3D len); - if ((ifp->if_flags & XFS_IFBROOT) && !cur) { - cur =3D xfs_bmbt_init_cursor(mp, - tp, ip, whichfork); - cur->bc_private.b.firstblock =3D - *firstblock; - cur->bc_private.b.flist =3D flist; - } - mval->br_state =3D (mval->br_state =3D=3D XFS_EXT_UNWRITTEN) - ? XFS_EXT_NORM - : XFS_EXT_UNWRITTEN; - error =3D xfs_bmap_add_extent(ip, lastx, &cur, mval, - firstblock, flist, &tmp_logflags, - whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); - logflags |=3D tmp_logflags; + if (len > (xfs_filblks_t)MAXEXTLEN) + bma.length =3D MAXEXTLEN; + else + bma.length =3D len; + + ASSERT(len > 0); + ASSERT(bma.length > 0); + error =3D xfs_bmapi_allocate(&bma); if (error) goto error0; - lastx =3D ifp->if_lastex; - ep =3D xfs_iext_get_ext(ifp, lastx); - nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - xfs_bmbt_get_all(ep, &got); - /* - * We may have combined previously unwritten - * space with written space, so generate - * another request. - */ - if (mval->br_blockcount < len) - continue; + if (bma.blkno =3D=3D NULLFSBLOCK) + break; } =20 - ASSERT((flags & XFS_BMAPI_ENTIRE) || - ((mval->br_startoff + mval->br_blockcount) <=3D end)); - ASSERT((flags & XFS_BMAPI_ENTIRE) || - (mval->br_blockcount <=3D len) || - (mval->br_startoff < obno)); - bno =3D mval->br_startoff + mval->br_blockcount; - len =3D end - bno; - if (n > 0 && mval->br_startoff =3D=3D mval[-1].br_startoff) { - ASSERT(mval->br_startblock =3D=3D mval[-1].br_startblock); - ASSERT(mval->br_blockcount > mval[-1].br_blockcount); - ASSERT(mval->br_state =3D=3D mval[-1].br_state); - mval[-1].br_blockcount =3D mval->br_blockcount; - mval[-1].br_state =3D mval->br_state; - } else if (n > 0 && mval->br_startblock !=3D DELAYSTARTBLOCK && - mval[-1].br_startblock !=3D DELAYSTARTBLOCK && - mval[-1].br_startblock !=3D HOLESTARTBLOCK && - mval->br_startblock =3D=3D - mval[-1].br_startblock + mval[-1].br_blockcount && - ((flags & XFS_BMAPI_IGSTATE) || - mval[-1].br_state =3D=3D mval->br_state)) { - ASSERT(mval->br_startoff =3D=3D - mval[-1].br_startoff + mval[-1].br_blockcount); - mval[-1].br_blockcount +=3D mval->br_blockcount; - } else if (n > 0 && - mval->br_startblock =3D=3D DELAYSTARTBLOCK && - mval[-1].br_startblock =3D=3D DELAYSTARTBLOCK && - mval->br_startoff =3D=3D - mval[-1].br_startoff + mval[-1].br_blockcount) { - mval[-1].br_blockcount +=3D mval->br_blockcount; - mval[-1].br_state =3D mval->br_state; - } else if (!((n =3D=3D 0) && - ((mval->br_startoff + mval->br_blockcount) <=3D - obno))) { - mval++; - n++; - } + /* Deal with the allocated space we found. */ + xfs_bmapi_trim_map(mval, &bma.got, &bno, len, obno, + end, n, flags); + + /* Execute unwritten extent conversion if necessary */ + error =3D xfs_bmapi_convert_unwritten(&bma, mval, len, flags); + if (error =3D=3D EAGAIN) + continue; + if (error) + goto error0; + + /* update the extent map to return */ + xfs_bmapi_update_map(&mval, &bno, &len, obno, end, &n, flags); + /* * If we're done, stop now. Stop when we've allocated * XFS_BMAP_MAX_NMAP extents no matter what. Otherwise * the transaction may get too big. */ - if (bno >=3D end || n >=3D *nmap || nallocs >=3D *nmap) + if (bno >=3D end || n >=3D *nmap || bma.nallocs >=3D *nmap) break; - /* - * Else go on to the next record. - */ - ep =3D xfs_iext_get_ext(ifp, ++lastx); - prev =3D got; - if (lastx >=3D nextents) + + /* Else go on to the next record. */ + bma.prev =3D bma.got; + if (++bma.idx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) { + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma.idx), + &bma.got); + } else eof =3D 1; - else - xfs_bmbt_get_all(ep, &got); } - ifp->if_lastex =3D lastx; *nmap =3D n; + /* * Transform from btree to extents, give it cur. */ - if (tp && XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_BTREE && - XFS_IFORK_NEXTENTS(ip, whichfork) <=3D ifp->if_ext_max) { - ASSERT(wr && cur); - error =3D xfs_bmap_btree_to_extents(tp, ip, cur, + if (xfs_bmap_wants_extents(ip, whichfork)) { + int tmp_logflags =3D 0; + + ASSERT(bma.cur); + error =3D xfs_bmap_btree_to_extents(tp, ip, bma.cur, &tmp_logflags, whichfork); - logflags |=3D tmp_logflags; + bma.logflags |=3D tmp_logflags; if (error) goto error0; } - ASSERT(ifp->if_ext_max =3D=3D - XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); + ASSERT(XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE || - XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max); + XFS_IFORK_NEXTENTS(ip, whichfork) > + XFS_IFORK_MAXEXT(ip, whichfork)); error =3D 0; error0: /* * Log everything. Do this after conversion, there's no point in * logging the extent records if we've converted to btree format. */ - if ((logflags & xfs_ilog_fext(whichfork)) && + if ((bma.logflags & xfs_ilog_fext(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS) - logflags &=3D ~xfs_ilog_fext(whichfork); - else if ((logflags & xfs_ilog_fbroot(whichfork)) && + bma.logflags &=3D ~xfs_ilog_fext(whichfork); + else if ((bma.logflags & xfs_ilog_fbroot(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE) - logflags &=3D ~xfs_ilog_fbroot(whichfork); + bma.logflags &=3D ~xfs_ilog_fbroot(whichfork); /* * Log whatever the flags say, even if error. Otherwise we might miss * detecting a case where the data is changed, there's an error, * and it's not logged so we don't shutdown when we should. */ - if (logflags) { - ASSERT(tp && wr); - xfs_trans_log_inode(tp, ip, logflags); - } - if (cur) { + if (bma.logflags) + xfs_trans_log_inode(tp, ip, bma.logflags); + + if (bma.cur) { if (!error) { ASSERT(*firstblock =3D=3D NULLFSBLOCK || XFS_FSB_TO_AGNO(mp, *firstblock) =3D=3D XFS_FSB_TO_AGNO(mp, - cur->bc_private.b.firstblock) || + bma.cur->bc_private.b.firstblock) || (flist->xbf_low && XFS_FSB_TO_AGNO(mp, *firstblock) < XFS_FSB_TO_AGNO(mp, - cur->bc_private.b.firstblock))); - *firstblock =3D cur->bc_private.b.firstblock; + bma.cur->bc_private.b.firstblock))); + *firstblock =3D bma.cur->bc_private.b.firstblock; } - xfs_btree_del_cursor(cur, + xfs_btree_del_cursor(bma.cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); } if (!error) @@ -4649,59 +4793,6 @@ error0: } =20 /* - * Map file blocks to filesystem blocks, simple version. - * One block (extent) only, read-only. - * For flags, only the XFS_BMAPI_ATTRFORK flag is examined. - * For the other flag values, the effect is as if XFS_BMAPI_METADATA - * was set and all the others were clear. - */ -int /* error */ -xfs_bmapi_single( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode */ - int whichfork, /* data or attr fork */ - xfs_fsblock_t *fsb, /* output: mapped block */ - xfs_fileoff_t bno) /* starting file offs. mapped */ -{ - int eof; /* we've hit the end of extents */ - int error; /* error return */ - xfs_bmbt_irec_t got; /* current file extent record */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_extnum_t lastx; /* last useful extent number */ - xfs_bmbt_irec_t prev; /* previous file extent record */ - - ifp =3D XFS_IFORK_PTR(ip, whichfork); - if (unlikely( - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE && - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS)) { - XFS_ERROR_REPORT("xfs_bmapi_single", XFS_ERRLEVEL_LOW, - ip->i_mount); - return XFS_ERROR(EFSCORRUPTED); - } - if (XFS_FORCED_SHUTDOWN(ip->i_mount)) - return XFS_ERROR(EIO); - XFS_STATS_INC(xs_blk_mapr); - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error =3D xfs_iread_extents(tp, ip, whichfork))) - return error; - (void)xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, - &prev); - /* - * Reading past eof, act as though there's a hole - * up to end. - */ - if (eof || got.br_startoff > bno) { - *fsb =3D NULLFSBLOCK; - return 0; - } - ASSERT(!isnullstartblock(got.br_startblock)); - ASSERT(bno < got.br_startoff + got.br_blockcount); - *fsb =3D got.br_startblock + (bno - got.br_startoff); - ifp->if_lastex =3D lastx; - return 0; -} - -/* * Unmap (remove) blocks from a file. * If nexts is nonzero then the number of extents to remove is limited to * that value. If not all extents in the block range can be removed then @@ -4739,7 +4830,6 @@ xfs_bunmapi( int tmp_logflags; /* partial logging flags */ int wasdel; /* was a delayed alloc extent */ int whichfork; /* data or attribute fork */ - int rsvd; /* OK to allocate reserved blocks */ xfs_fsblock_t sum; =20 trace_xfs_bunmap(ip, bno, len, flags, _RET_IP_); @@ -4757,11 +4847,10 @@ xfs_bunmapi( mp =3D ip->i_mount; if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - rsvd =3D (flags & XFS_BMAPI_RSVBLOCKS) !=3D 0; + ASSERT(len > 0); ASSERT(nexts >=3D 0); - ASSERT(ifp->if_ext_max =3D=3D - XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); + if (!(ifp->if_flags & XFS_IFEXTENTS) && (error =3D xfs_iread_extents(tp, ip, whichfork))) return error; @@ -4795,6 +4884,15 @@ xfs_bunmapi( cur->bc_private.b.flags =3D 0; } else cur =3D NULL; + + if (isrt) { + /* + * Synchronize by locking the bitmap inode. + */ + xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, mp->m_rbmip, XFS_ILOCK_EXCL); + } + extno =3D 0; while (bno !=3D (xfs_fileoff_t)-1 && bno >=3D start && lastx >=3D 0 && (nexts =3D=3D 0 || extno < nexts)) { @@ -4873,9 +4971,9 @@ xfs_bunmapi( del.br_blockcount =3D mod; } del.br_state =3D XFS_EXT_UNWRITTEN; - error =3D xfs_bmap_add_extent(ip, lastx, &cur, &del, - firstblock, flist, &logflags, - XFS_DATA_FORK, 0); + error =3D xfs_bmap_add_extent_unwritten_real(tp, ip, + &lastx, &cur, &del, firstblock, flist, + &logflags); if (error) goto error0; goto nodelete; @@ -4901,9 +4999,12 @@ xfs_bunmapi( */ ASSERT(bno >=3D del.br_blockcount); bno -=3D del.br_blockcount; - if (bno < got.br_startoff) { - if (--lastx >=3D 0) - xfs_bmbt_get_all(--ep, &got); + if (got.br_startoff > bno) { + if (--lastx >=3D 0) { + ep =3D xfs_iext_get_ext(ifp, + lastx); + xfs_bmbt_get_all(ep, &got); + } } continue; } else if (del.br_state =3D=3D XFS_EXT_UNWRITTEN) { @@ -4927,18 +5028,19 @@ xfs_bunmapi( prev.br_startoff =3D start; } prev.br_state =3D XFS_EXT_UNWRITTEN; - error =3D xfs_bmap_add_extent(ip, lastx - 1, &cur, - &prev, firstblock, flist, &logflags, - XFS_DATA_FORK, 0); + lastx--; + error =3D xfs_bmap_add_extent_unwritten_real(tp, + ip, &lastx, &cur, &prev, + firstblock, flist, &logflags); if (error) goto error0; goto nodelete; } else { ASSERT(del.br_state =3D=3D XFS_EXT_NORM); del.br_state =3D XFS_EXT_UNWRITTEN; - error =3D xfs_bmap_add_extent(ip, lastx, &cur, - &del, firstblock, flist, &logflags, - XFS_DATA_FORK, 0); + error =3D xfs_bmap_add_extent_unwritten_real(tp, + ip, &lastx, &cur, &del, + firstblock, flist, &logflags); if (error) goto error0; goto nodelete; @@ -4953,13 +5055,13 @@ xfs_bunmapi( rtexts =3D XFS_FSB_TO_B(mp, del.br_blockcount); do_div(rtexts, mp->m_sb.sb_rextsize); xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, - (int64_t)rtexts, rsvd); + (int64_t)rtexts, 0); (void)xfs_trans_reserve_quota_nblks(NULL, ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_RTBLKS); } else { xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - (int64_t)del.br_blockcount, rsvd); + (int64_t)del.br_blockcount, 0); (void)xfs_trans_reserve_quota_nblks(NULL, ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_REGBLKS); @@ -4983,46 +5085,43 @@ xfs_bunmapi( */ if (!wasdel && xfs_trans_get_block_res(tp) =3D=3D 0 && XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_NEXTENTS(ip, whichfork) >=3D ifp->if_ext_max && + XFS_IFORK_NEXTENTS(ip, whichfork) >=3D /* Note the >=3D */ + XFS_IFORK_MAXEXT(ip, whichfork) && del.br_startoff > got.br_startoff && del.br_startoff + del.br_blockcount < got.br_startoff + got.br_blockcount) { error =3D XFS_ERROR(ENOSPC); goto error0; } - error =3D xfs_bmap_del_extent(ip, tp, lastx, flist, cur, &del, - &tmp_logflags, whichfork, rsvd); + error =3D xfs_bmap_del_extent(ip, tp, &lastx, flist, cur, &del, + &tmp_logflags, whichfork); logflags |=3D tmp_logflags; if (error) goto error0; bno =3D del.br_startoff - 1; nodelete: - lastx =3D ifp->if_lastex; /* * If not done go on to the next (previous) record. - * Reset ep in case the extents array was re-alloced. */ - ep =3D xfs_iext_get_ext(ifp, lastx); if (bno !=3D (xfs_fileoff_t)-1 && bno >=3D start) { - if (lastx >=3D XFS_IFORK_NEXTENTS(ip, whichfork) || - xfs_bmbt_get_startoff(ep) > bno) { - if (--lastx >=3D 0) - ep =3D xfs_iext_get_ext(ifp, lastx); - } - if (lastx >=3D 0) + if (lastx >=3D 0) { + ep =3D xfs_iext_get_ext(ifp, lastx); + if (xfs_bmbt_get_startoff(ep) > bno) { + if (--lastx >=3D 0) + ep =3D xfs_iext_get_ext(ifp, + lastx); + } xfs_bmbt_get_all(ep, &got); + } extno++; } } - ifp->if_lastex =3D lastx; *done =3D bno =3D=3D (xfs_fileoff_t)-1 || bno < start || lastx < 0; - ASSERT(ifp->if_ext_max =3D=3D - XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); + /* * Convert to a btree if necessary. */ - if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max) { + if (xfs_bmap_needs_btree(ip, whichfork)) { ASSERT(cur =3D=3D NULL); error =3D xfs_bmap_extents_to_btree(tp, ip, firstblock, flist, &cur, 0, &tmp_logflags, whichfork); @@ -5033,8 +5132,7 @@ nodelete: /* * transform from btree to extents, give it cur */ - else if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_BTREE && - XFS_IFORK_NEXTENTS(ip, whichfork) <=3D ifp->if_ext_max) { + else if (xfs_bmap_wants_extents(ip, whichfork)) { ASSERT(cur !=3D NULL); error =3D xfs_bmap_btree_to_extents(tp, ip, cur, &tmp_logflags, whichfork); @@ -5045,8 +5143,6 @@ nodelete: /* * transform from extents to local? */ - ASSERT(ifp->if_ext_max =3D=3D - XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); error =3D 0; error0: /* @@ -5076,88 +5172,252 @@ error0: return error; } =20 +#ifdef DEBUG +STATIC struct xfs_buf * +xfs_bmap_get_bp( + struct xfs_btree_cur *cur, + xfs_fsblock_t bno) +{ + struct xfs_log_item_desc *lidp; + int i; + + if (!cur) + return NULL; + + for (i =3D 0; i < XFS_BTREE_MAXLEVELS; i++) { + if (!cur->bc_bufs[i]) + break; + if (XFS_BUF_ADDR(cur->bc_bufs[i]) =3D=3D bno) + return cur->bc_bufs[i]; + } + + /* Chase down all the log items to see if the bp is there */ + list_for_each_entry(lidp, &cur->bc_tp->t_items, lid_trans) { + struct xfs_buf_log_item *bip; + bip =3D (struct xfs_buf_log_item *)lidp->lid_item; + if (bip->bli_item.li_type =3D=3D XFS_LI_BUF && + XFS_BUF_ADDR(bip->bli_buf) =3D=3D bno) + return bip->bli_buf; + } + + return NULL; +} + +STATIC void +xfs_check_block( + struct xfs_btree_block *block, + xfs_mount_t *mp, + int root, + short sz) +{ + int i, j, dmxr; + __be64 *pp, *thispa; /* pointer to block address */ + xfs_bmbt_key_t *prevp, *keyp; + + ASSERT(be16_to_cpu(block->bb_level) > 0); + + prevp =3D NULL; + for( i =3D 1; i <=3D xfs_btree_get_numrecs(block); i++) { + dmxr =3D mp->m_bmap_dmxr[0]; + keyp =3D XFS_BMBT_KEY_ADDR(mp, block, i); + + if (prevp) { + ASSERT(be64_to_cpu(prevp->br_startoff) < + be64_to_cpu(keyp->br_startoff)); + } + prevp =3D keyp; + + /* + * Compare the block numbers to see if there are dups. + */ + if (root) + pp =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, i, sz); + else + pp =3D XFS_BMBT_PTR_ADDR(mp, block, i, dmxr); + + for (j =3D i+1; j <=3D be16_to_cpu(block->bb_numrecs); j++) { + if (root) + thispa =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, j, sz); + else + thispa =3D XFS_BMBT_PTR_ADDR(mp, block, j, dmxr); + if (*thispa =3D=3D *pp) { + xfs_warn(mp, "%s: thispa(%d) =3D=3D pp(%d) %Ld", + __func__, j, i, + (unsigned long long)be64_to_cpu(*thispa)); + panic("%s: ptrs are equal in node\n", + __func__); + } + } + } +} + /* - * Check the last inode extent to determine whether this allocation will r= esult - * in blocks being allocated at the end of the file. When we allocate new = data - * blocks at the end of the file which do not start at the previous data b= lock, - * we will try to align the new blocks at stripe unit boundaries. + * Check that the extents for the inode ip are in the right order in all + * btree leaves. */ -STATIC int /* error */ -xfs_bmap_isaeof( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fileoff_t off, /* file offset in fsblocks */ - int whichfork, /* data or attribute fork */ - char *aeof) /* return value */ + +STATIC void +xfs_bmap_check_leaf_extents( + xfs_btree_cur_t *cur, /* btree cursor or null */ + xfs_inode_t *ip, /* incore inode pointer */ + int whichfork) /* data or attr fork */ { - int error; /* error return value */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_bmbt_rec_host_t *lastrec; /* extent record pointer */ - xfs_extnum_t nextents; /* number of file extents */ - xfs_bmbt_irec_t s; /* expanded extent record */ + struct xfs_btree_block *block; /* current btree block */ + xfs_fsblock_t bno; /* block # of "block" */ + xfs_buf_t *bp; /* buffer for "block" */ + int error; /* error return value */ + xfs_extnum_t i=3D0, j; /* index into the extents list */ + xfs_ifork_t *ifp; /* fork structure */ + int level; /* btree level, for checking */ + xfs_mount_t *mp; /* file system mount structure */ + __be64 *pp; /* pointer to block address */ + xfs_bmbt_rec_t *ep; /* pointer to current extent */ + xfs_bmbt_rec_t last =3D {0, 0}; /* last extent in prev block */ + xfs_bmbt_rec_t *nextp; /* pointer to next extent */ + int bp_release =3D 0; =20 - ASSERT(whichfork =3D=3D XFS_DATA_FORK); - ifp =3D XFS_IFORK_PTR(ip, whichfork); - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error =3D xfs_iread_extents(NULL, ip, whichfork))) - return error; - nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - if (nextents =3D=3D 0) { - *aeof =3D 1; - return 0; + if (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE) { + return; } + + bno =3D NULLFSBLOCK; + mp =3D ip->i_mount; + ifp =3D XFS_IFORK_PTR(ip, whichfork); + block =3D ifp->if_broot; /* - * Go to the last extent + * Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out. */ - lastrec =3D xfs_iext_get_ext(ifp, nextents - 1); - xfs_bmbt_get_all(lastrec, &s); + level =3D be16_to_cpu(block->bb_level); + ASSERT(level > 0); + xfs_check_block(block, mp, 1, ifp->if_broot_bytes); + pp =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes); + bno =3D be64_to_cpu(*pp); + + ASSERT(bno !=3D NULLDFSBNO); + ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount); + ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks); + /* - * Check we are allocating in the last extent (for delayed allocations) - * or past the last extent for non-delayed allocations. + * Go down the tree until leaf level is reached, following the first + * pointer (leftmost) at each level. */ - *aeof =3D (off >=3D s.br_startoff && - off < s.br_startoff + s.br_blockcount && - isnullstartblock(s.br_startblock)) || - off >=3D s.br_startoff + s.br_blockcount; - return 0; -} + while (level-- > 0) { + /* See if buf is in cur first */ + bp_release =3D 0; + bp =3D xfs_bmap_get_bp(cur, XFS_FSB_TO_DADDR(mp, bno)); + if (!bp) { + bp_release =3D 1; + error =3D xfs_btree_read_bufl(mp, NULL, bno, 0, &bp, + XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) + goto error_norelse; + } + block =3D XFS_BUF_TO_BLOCK(bp); + XFS_WANT_CORRUPTED_GOTO( + xfs_bmap_sanity_check(mp, bp, level), + error0); + if (level =3D=3D 0) + break; =20 -/* - * Check if the endoff is outside the last extent. If so the caller will g= row - * the allocation to a stripe unit boundary. - */ -int /* error */ -xfs_bmap_eof( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fileoff_t endoff, /* file offset in fsblocks */ - int whichfork, /* data or attribute fork */ - int *eof) /* result value */ -{ - xfs_fsblock_t blockcount; /* extent block count */ - int error; /* error return value */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_bmbt_rec_host_t *lastrec; /* extent record pointer */ - xfs_extnum_t nextents; /* number of file extents */ - xfs_fileoff_t startoff; /* extent starting file offset */ + /* + * Check this block for basic sanity (increasing keys and + * no duplicate blocks). + */ =20 - ASSERT(whichfork =3D=3D XFS_DATA_FORK); - ifp =3D XFS_IFORK_PTR(ip, whichfork); - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error =3D xfs_iread_extents(NULL, ip, whichfork))) - return error; - nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - if (nextents =3D=3D 0) { - *eof =3D 1; - return 0; + xfs_check_block(block, mp, 0, 0); + pp =3D XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); + bno =3D be64_to_cpu(*pp); + XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); + if (bp_release) { + bp_release =3D 0; + xfs_trans_brelse(NULL, bp); + } } + + /* + * Here with bp and block set to the leftmost leaf node in the tree. + */ + i =3D 0; + /* - * Go to the last extent + * Loop over all leaf nodes checking that all extents are in the right or= der. */ - lastrec =3D xfs_iext_get_ext(ifp, nextents - 1); - startoff =3D xfs_bmbt_get_startoff(lastrec); - blockcount =3D xfs_bmbt_get_blockcount(lastrec); - *eof =3D endoff >=3D startoff + blockcount; - return 0; + for (;;) { + xfs_fsblock_t nextbno; + xfs_extnum_t num_recs; + + + num_recs =3D xfs_btree_get_numrecs(block); + + /* + * Read-ahead the next leaf block, if any. + */ + + nextbno =3D be64_to_cpu(block->bb_u.l.bb_rightsib); + + /* + * Check all the extents to make sure they are OK. + * If we had a previous block, the last entry should + * conform with the first entry in this one. + */ + + ep =3D XFS_BMBT_REC_ADDR(mp, block, 1); + if (i) { + ASSERT(xfs_bmbt_disk_get_startoff(&last) + + xfs_bmbt_disk_get_blockcount(&last) <=3D + xfs_bmbt_disk_get_startoff(ep)); + } + for (j =3D 1; j < num_recs; j++) { + nextp =3D XFS_BMBT_REC_ADDR(mp, block, j + 1); + ASSERT(xfs_bmbt_disk_get_startoff(ep) + + xfs_bmbt_disk_get_blockcount(ep) <=3D + xfs_bmbt_disk_get_startoff(nextp)); + ep =3D nextp; + } + + last =3D *ep; + i +=3D num_recs; + if (bp_release) { + bp_release =3D 0; + xfs_trans_brelse(NULL, bp); + } + bno =3D nextbno; + /* + * If we've reached the end, stop. + */ + if (bno =3D=3D NULLFSBLOCK) + break; + + bp_release =3D 0; + bp =3D xfs_bmap_get_bp(cur, XFS_FSB_TO_DADDR(mp, bno)); + if (!bp) { + bp_release =3D 1; + error =3D xfs_btree_read_bufl(mp, NULL, bno, 0, &bp, + XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) + goto error_norelse; + } + block =3D XFS_BUF_TO_BLOCK(bp); + } + if (bp_release) { + bp_release =3D 0; + xfs_trans_brelse(NULL, bp); + } + return; + +error0: + xfs_warn(mp, "%s: at error0", __func__); + if (bp_release) + xfs_trans_brelse(NULL, bp); +error_norelse: + xfs_warn(mp, "%s: BAD after btree leaves for %d extents", + __func__, i); + panic("%s: CORRUPTED BTREE OR SOMETHING", __func__); + return; } +#endif =20 /* * Count fsblocks of the given fork. @@ -5229,7 +5489,9 @@ xfs_bmap_count_tree( struct xfs_btree_block *block, *nextblock; int numrecs; =20 - if ((error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, XFS_BMAP_BTREE_RE= F))) + error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) return error; *count +=3D 1; block =3D XFS_BUF_TO_BLOCK(bp); @@ -5238,8 +5500,10 @@ xfs_bmap_count_tree( /* Not at node above leaves, count this level of nodes */ nextbno =3D be64_to_cpu(block->bb_u.l.bb_rightsib); while (nextbno !=3D NULLFSBLOCK) { - if ((error =3D xfs_btree_read_bufl(mp, tp, nextbno, - 0, &nbp, XFS_BMAP_BTREE_REF))) + error =3D xfs_btree_read_bufl(mp, tp, nextbno, 0, &nbp, + XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) return error; *count +=3D 1; nextblock =3D XFS_BUF_TO_BLOCK(nbp); @@ -5268,8 +5532,10 @@ xfs_bmap_count_tree( if (nextbno =3D=3D NULLFSBLOCK) break; bno =3D nextbno; - if ((error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, - XFS_BMAP_BTREE_REF))) + error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, + XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) return error; *count +=3D 1; block =3D XFS_BUF_TO_BLOCK(bp); @@ -5315,3 +5581,16 @@ xfs_bmap_disk_count_leaves( *count +=3D xfs_bmbt_disk_get_blockcount(frp); } } + +/* + * Convert the given file system block to a disk block. We have to treat = it + * differently based on whether the file is a real time file or not, becau= se the + * bmap code does. + */ +xfs_daddr_t +xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) +{ + return (XFS_IS_REALTIME_INODE(ip) ? \ + (xfs_daddr_t)XFS_FSB_TO_BB((ip)->i_mount, (fsb)) : \ + XFS_FSB_TO_DADDR((ip)->i_mount, (fsb))); +} diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index ff51fdd..836f52f 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -403,10 +403,10 @@ xfs_bmbt_to_bmdr( xfs_bmbt_key_t *tkp; __be64 *tpp; =20 - ASSERT(be32_to_cpu(rblock->bb_magic) =3D=3D XFS_BMAP_MAGIC); - ASSERT(be64_to_cpu(rblock->bb_u.l.bb_leftsib) =3D=3D NULLDFSBNO); - ASSERT(be64_to_cpu(rblock->bb_u.l.bb_rightsib) =3D=3D NULLDFSBNO); - ASSERT(be16_to_cpu(rblock->bb_level) > 0); + ASSERT(rblock->bb_magic =3D=3D cpu_to_be32(XFS_BMAP_MAGIC)); + ASSERT(rblock->bb_u.l.bb_leftsib =3D=3D cpu_to_be64(NULLDFSBNO)); + ASSERT(rblock->bb_u.l.bb_rightsib =3D=3D cpu_to_be64(NULLDFSBNO)); + ASSERT(rblock->bb_level !=3D 0); dblock->bb_level =3D rblock->bb_level; dblock->bb_numrecs =3D rblock->bb_numrecs; dmxr =3D xfs_bmdr_maxrecs(mp, dblocklen, 0); @@ -687,6 +687,67 @@ xfs_bmbt_key_diff( cur->bc_rec.b.br_startoff; } =20 +static void +xfs_bmbt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); + unsigned int level; + int lblock_ok; /* block passes checks */ + + /* magic number and level verification. + * + * We don't know waht fork we belong to, so just verify that the level + * is less than the maximum of the two. Later checks will be more + * precise. + */ + level =3D be16_to_cpu(block->bb_level); + lblock_ok =3D block->bb_magic =3D=3D cpu_to_be32(XFS_BMAP_MAGIC) && + level < MAX(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1]); + + /* numrecs verification */ + lblock_ok =3D lblock_ok && + be16_to_cpu(block->bb_numrecs) <=3D mp->m_bmap_dmxr[level !=3D 0]; + + /* sibling pointer verification */ + lblock_ok =3D lblock_ok && + block->bb_u.l.bb_leftsib && + (block->bb_u.l.bb_leftsib =3D=3D cpu_to_be64(NULLDFSBNO) || + XFS_FSB_SANITY_CHECK(mp, + be64_to_cpu(block->bb_u.l.bb_leftsib))) && + block->bb_u.l.bb_rightsib && + (block->bb_u.l.bb_rightsib =3D=3D cpu_to_be64(NULLDFSBNO) || + XFS_FSB_SANITY_CHECK(mp, + be64_to_cpu(block->bb_u.l.bb_rightsib))); + + if (!lblock_ok) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_bmbt_read_verify( + struct xfs_buf *bp) +{ + xfs_bmbt_verify(bp); +} + +static void +xfs_bmbt_write_verify( + struct xfs_buf *bp) +{ + xfs_bmbt_verify(bp); +} + +const struct xfs_buf_ops xfs_bmbt_buf_ops =3D { + .verify_read =3D xfs_bmbt_read_verify, + .verify_write =3D xfs_bmbt_write_verify, +}; + + #ifdef DEBUG STATIC int xfs_bmbt_keys_inorder( @@ -815,7 +876,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops =3D { .init_rec_from_cur =3D xfs_bmbt_init_rec_from_cur, .init_ptr_from_cur =3D xfs_bmbt_init_ptr_from_cur, .key_diff =3D xfs_bmbt_key_diff, - + .buf_ops =3D &xfs_bmbt_buf_ops, #ifdef DEBUG .keys_inorder =3D xfs_bmbt_keys_inorder, .recs_inorder =3D xfs_bmbt_recs_inorder, diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 02854db..c35269b 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -48,11 +48,11 @@ xfs_btree_check_lblock( be16_to_cpu(block->bb_numrecs) <=3D cur->bc_ops->get_maxrecs(cur, level) && block->bb_u.l.bb_leftsib && - (be64_to_cpu(block->bb_u.l.bb_leftsib) =3D=3D NULLDFSBNO || + (block->bb_u.l.bb_leftsib =3D=3D cpu_to_be64(NULLDFSBNO) || XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_leftsib))) && block->bb_u.l.bb_rightsib && - (be64_to_cpu(block->bb_u.l.bb_rightsib) =3D=3D NULLDFSBNO || + (block->bb_u.l.bb_rightsib =3D=3D cpu_to_be64(NULLDFSBNO) || XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_rightsib))); if (unlikely(XFS_TEST_ERROR(!lblock_ok, mp, @@ -87,10 +87,10 @@ xfs_btree_check_sblock( be16_to_cpu(block->bb_level) =3D=3D level && be16_to_cpu(block->bb_numrecs) <=3D cur->bc_ops->get_maxrecs(cur, level) && - (be32_to_cpu(block->bb_u.s.bb_leftsib) =3D=3D NULLAGBLOCK || + (block->bb_u.s.bb_leftsib =3D=3D cpu_to_be32(NULLAGBLOCK) || be32_to_cpu(block->bb_u.s.bb_leftsib) < agflen) && block->bb_u.s.bb_leftsib && - (be32_to_cpu(block->bb_u.s.bb_rightsib) =3D=3D NULLAGBLOCK || + (block->bb_u.s.bb_rightsib =3D=3D cpu_to_be32(NULLAGBLOCK) || be32_to_cpu(block->bb_u.s.bb_rightsib) < agflen) && block->bb_u.s.bb_rightsib; if (unlikely(XFS_TEST_ERROR(!sblock_ok, cur->bc_mp, @@ -250,16 +250,19 @@ xfs_btree_dup_cursor( for (i =3D 0; i < new->bc_nlevels; i++) { new->bc_ptrs[i] =3D cur->bc_ptrs[i]; new->bc_ra[i] =3D cur->bc_ra[i]; - if ((bp =3D cur->bc_bufs[i])) { - if ((error =3D xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, - XFS_BUF_ADDR(bp), mp->m_bsize, 0, &bp))) { + bp =3D cur->bc_bufs[i]; + if (bp) { + error =3D xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, + XFS_BUF_ADDR(bp), mp->m_bsize, + 0, &bp, + cur->bc_ops->buf_ops); + if (error) { xfs_btree_del_cursor(new, error); *ncur =3D NULL; return error; } new->bc_bufs[i] =3D bp; - ASSERT(bp); - ASSERT(!XFS_BUF_GETERROR(bp)); + ASSERT(!xfs_buf_geterror(bp)); } else new->bc_bufs[i] =3D NULL; } @@ -450,8 +453,7 @@ xfs_btree_get_bufl( ASSERT(fsbno !=3D NULLFSBLOCK); d =3D XFS_FSB_TO_DADDR(mp, fsbno); bp =3D xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, lock); - ASSERT(bp); - ASSERT(!XFS_BUF_GETERROR(bp)); + ASSERT(!xfs_buf_geterror(bp)); return bp; } =20 @@ -474,8 +476,7 @@ xfs_btree_get_bufs( ASSERT(agbno !=3D NULLAGBLOCK); d =3D XFS_AGB_TO_DADDR(mp, agno, agbno); bp =3D xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, lock); - ASSERT(bp); - ASSERT(!XFS_BUF_GETERROR(bp)); + ASSERT(!xfs_buf_geterror(bp)); return bp; } =20 @@ -493,9 +494,9 @@ xfs_btree_islastblock( block =3D xfs_btree_get_block(cur, level, &bp); xfs_btree_check_block(cur, block, level, bp); if (cur->bc_flags & XFS_BTREE_LONG_PTRS) - return be64_to_cpu(block->bb_u.l.bb_rightsib) =3D=3D NULLDFSBNO; + return block->bb_u.l.bb_rightsib =3D=3D cpu_to_be64(NULLDFSBNO); else - return be32_to_cpu(block->bb_u.s.bb_rightsib) =3D=3D NULLAGBLOCK; + return block->bb_u.s.bb_rightsib =3D=3D cpu_to_be32(NULLAGBLOCK); } =20 /* @@ -596,69 +597,29 @@ xfs_btree_offsets( * Get a buffer for the block, return it read in. * Long-form addressing. */ -int /* error */ +int xfs_btree_read_bufl( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_fsblock_t fsbno, /* file system block number */ - uint lock, /* lock flags for read_buf */ - xfs_buf_t **bpp, /* buffer for fsbno */ - int refval) /* ref count value for buffer */ -{ - xfs_buf_t *bp; /* return value */ + struct xfs_mount *mp, /* file system mount point */ + struct xfs_trans *tp, /* transaction pointer */ + xfs_fsblock_t fsbno, /* file system block number */ + uint lock, /* lock flags for read_buf */ + struct xfs_buf **bpp, /* buffer for fsbno */ + int refval, /* ref count value for buffer */ + const struct xfs_buf_ops *ops) +{ + struct xfs_buf *bp; /* return value */ xfs_daddr_t d; /* real disk block address */ - int error; + int error; =20 ASSERT(fsbno !=3D NULLFSBLOCK); d =3D XFS_FSB_TO_DADDR(mp, fsbno); - if ((error =3D xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, d, - mp->m_bsize, lock, &bp))) { - return error; - } - ASSERT(!bp || !XFS_BUF_GETERROR(bp)); - if (bp !=3D NULL) { - XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, refval); - } - *bpp =3D bp; - return 0; -} - -/* - * Get a buffer for the block, return it read in. - * Short-form addressing. - */ -int /* error */ -xfs_btree_read_bufs( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_agnumber_t agno, /* allocation group number */ - xfs_agblock_t agbno, /* allocation group block number */ - uint lock, /* lock flags for read_buf */ - xfs_buf_t **bpp, /* buffer for agno/agbno */ - int refval) /* ref count value for buffer */ -{ - xfs_buf_t *bp; /* return value */ - xfs_daddr_t d; /* real disk block address */ - int error; - - ASSERT(agno !=3D NULLAGNUMBER); - ASSERT(agbno !=3D NULLAGBLOCK); - d =3D XFS_AGB_TO_DADDR(mp, agno, agbno); - if ((error =3D xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, d, - mp->m_bsize, lock, &bp))) { + error =3D xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, d, + mp->m_bsize, lock, &bp, ops); + if (error) return error; - } - ASSERT(!bp || !XFS_BUF_GETERROR(bp)); - if (bp !=3D NULL) { - switch (refval) { - case XFS_ALLOC_BTREE_REF: - XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, refval); - break; - case XFS_INO_BTREE_REF: - XFS_BUF_SET_VTYPE_REF(bp, B_FS_INOMAP, refval); - break; - } - } + ASSERT(!xfs_buf_geterror(bp)); + if (bp) + xfs_buf_set_ref(bp, refval); *bpp =3D bp; return 0; } @@ -674,12 +635,14 @@ xfs_btree_readahead_lblock( xfs_dfsbno_t right =3D be64_to_cpu(block->bb_u.l.bb_rightsib); =20 if ((lr & XFS_BTCUR_LEFTRA) && left !=3D NULLDFSBNO) { - xfs_btree_reada_bufl(cur->bc_mp, left, 1); + xfs_btree_reada_bufl(cur->bc_mp, left, 1, + cur->bc_ops->buf_ops); rval++; } =20 if ((lr & XFS_BTCUR_RIGHTRA) && right !=3D NULLDFSBNO) { - xfs_btree_reada_bufl(cur->bc_mp, right, 1); + xfs_btree_reada_bufl(cur->bc_mp, right, 1, + cur->bc_ops->buf_ops); rval++; } =20 @@ -699,13 +662,13 @@ xfs_btree_readahead_sblock( =20 if ((lr & XFS_BTCUR_LEFTRA) && left !=3D NULLAGBLOCK) { xfs_btree_reada_bufs(cur->bc_mp, cur->bc_private.a.agno, - left, 1); + left, 1, cur->bc_ops->buf_ops); rval++; } =20 if ((lr & XFS_BTCUR_RIGHTRA) && right !=3D NULLAGBLOCK) { xfs_btree_reada_bufs(cur->bc_mp, cur->bc_private.a.agno, - right, 1); + right, 1, cur->bc_ops->buf_ops); rval++; } =20 @@ -762,14 +725,14 @@ xfs_btree_setbuf( =20 b =3D XFS_BUF_TO_BLOCK(bp); if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { - if (be64_to_cpu(b->bb_u.l.bb_leftsib) =3D=3D NULLDFSBNO) + if (b->bb_u.l.bb_leftsib =3D=3D cpu_to_be64(NULLDFSBNO)) cur->bc_ra[lev] |=3D XFS_BTCUR_LEFTRA; - if (be64_to_cpu(b->bb_u.l.bb_rightsib) =3D=3D NULLDFSBNO) + if (b->bb_u.l.bb_rightsib =3D=3D cpu_to_be64(NULLDFSBNO)) cur->bc_ra[lev] |=3D XFS_BTCUR_RIGHTRA; } else { - if (be32_to_cpu(b->bb_u.s.bb_leftsib) =3D=3D NULLAGBLOCK) + if (b->bb_u.s.bb_leftsib =3D=3D cpu_to_be32(NULLAGBLOCK)) cur->bc_ra[lev] |=3D XFS_BTCUR_LEFTRA; - if (be32_to_cpu(b->bb_u.s.bb_rightsib) =3D=3D NULLAGBLOCK) + if (b->bb_u.s.bb_rightsib =3D=3D cpu_to_be32(NULLAGBLOCK)) cur->bc_ra[lev] |=3D XFS_BTCUR_RIGHTRA; } } @@ -780,9 +743,9 @@ xfs_btree_ptr_is_null( union xfs_btree_ptr *ptr) { if (cur->bc_flags & XFS_BTREE_LONG_PTRS) - return be64_to_cpu(ptr->l) =3D=3D NULLDFSBNO; + return ptr->l =3D=3D cpu_to_be64(NULLDFSBNO); else - return be32_to_cpu(ptr->s) =3D=3D NULLAGBLOCK; + return ptr->s =3D=3D cpu_to_be32(NULLAGBLOCK); } =20 STATIC void @@ -843,18 +806,22 @@ xfs_btree_set_sibling( } } =20 -STATIC void +void xfs_btree_init_block( - struct xfs_btree_cur *cur, - int level, - int numrecs, - struct xfs_btree_block *new) /* new block */ + struct xfs_mount *mp, + struct xfs_buf *bp, + __u32 magic, + __u16 level, + __u16 numrecs, + unsigned int flags) { - new->bb_magic =3D cpu_to_be32(xfs_magics[cur->bc_btnum]); + struct xfs_btree_block *new =3D XFS_BUF_TO_BLOCK(bp); + + new->bb_magic =3D cpu_to_be32(magic); new->bb_level =3D cpu_to_be16(level); new->bb_numrecs =3D cpu_to_be16(numrecs); =20 - if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + if (flags & XFS_BTREE_LONG_PTRS) { new->bb_u.l.bb_leftsib =3D cpu_to_be64(NULLDFSBNO); new->bb_u.l.bb_rightsib =3D cpu_to_be64(NULLDFSBNO); } else { @@ -863,6 +830,17 @@ xfs_btree_init_block( } } =20 +STATIC void +xfs_btree_init_block_cur( + struct xfs_btree_cur *cur, + int level, + int numrecs, + struct xfs_buf *bp) +{ + xfs_btree_init_block(cur->bc_mp, bp, xfs_magics[cur->bc_btnum], + level, numrecs, cur->bc_flags); +} + /* * Return true if ptr is the last record in the btree and * we need to track update=D1=95 to this record. The decision @@ -908,12 +886,12 @@ xfs_btree_ptr_to_daddr( union xfs_btree_ptr *ptr) { if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { - ASSERT(be64_to_cpu(ptr->l) !=3D NULLDFSBNO); + ASSERT(ptr->l !=3D cpu_to_be64(NULLDFSBNO)); =20 return XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l)); } else { ASSERT(cur->bc_private.a.agno !=3D NULLAGNUMBER); - ASSERT(be32_to_cpu(ptr->s) !=3D NULLAGBLOCK); + ASSERT(ptr->s !=3D cpu_to_be32(NULLAGBLOCK)); =20 return XFS_AGB_TO_DADDR(cur->bc_mp, cur->bc_private.a.agno, be32_to_cpu(ptr->s)); @@ -928,13 +906,13 @@ xfs_btree_set_refs( switch (cur->bc_btnum) { case XFS_BTNUM_BNO: case XFS_BTNUM_CNT: - XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, XFS_ALLOC_BTREE_REF); + xfs_buf_set_ref(bp, XFS_ALLOC_BTREE_REF); break; case XFS_BTNUM_INO: - XFS_BUF_SET_VTYPE_REF(bp, B_FS_INOMAP, XFS_INO_BTREE_REF); + xfs_buf_set_ref(bp, XFS_INO_BTREE_REF); break; case XFS_BTNUM_BMAP: - XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, XFS_BMAP_BTREE_REF); + xfs_buf_set_ref(bp, XFS_BMAP_BTREE_REF); break; default: ASSERT(0); @@ -959,9 +937,10 @@ xfs_btree_get_buf_block( *bpp =3D xfs_trans_get_buf(cur->bc_tp, mp->m_ddev_targp, d, mp->m_bsize, flags); =20 - ASSERT(*bpp); - ASSERT(!XFS_BUF_GETERROR(*bpp)); + if (!*bpp) + return ENOMEM; =20 + (*bpp)->b_ops =3D cur->bc_ops->buf_ops; *block =3D XFS_BUF_TO_BLOCK(*bpp); return 0; } @@ -988,20 +967,15 @@ xfs_btree_read_buf_block( =20 d =3D xfs_btree_ptr_to_daddr(cur, ptr); error =3D xfs_trans_read_buf(mp, cur->bc_tp, mp->m_ddev_targp, d, - mp->m_bsize, flags, bpp); + mp->m_bsize, flags, bpp, + cur->bc_ops->buf_ops); if (error) return error; =20 - ASSERT(*bpp !=3D NULL); - ASSERT(!XFS_BUF_GETERROR(*bpp)); - + ASSERT(!xfs_buf_geterror(*bpp)); xfs_btree_set_refs(cur, *bpp); *block =3D XFS_BUF_TO_BLOCK(*bpp); - - error =3D xfs_btree_check_block(cur, *block, level, *bpp); - if (error) - xfs_trans_brelse(cur->bc_tp, *bpp); - return error; + return 0; } =20 /* @@ -2174,7 +2148,7 @@ xfs_btree_split( goto error0; =20 /* Fill in the btree header for the new right block. */ - xfs_btree_init_block(cur, xfs_btree_get_level(left), 0, right); + xfs_btree_init_block_cur(cur, xfs_btree_get_level(left), 0, rbp); =20 /* * Split the entries between the old and the new block evenly. @@ -2483,7 +2457,7 @@ xfs_btree_new_root( nptr =3D 2; } /* Fill in the new block's btree header and log it. */ - xfs_btree_init_block(cur, cur->bc_nlevels, 2, new); + xfs_btree_init_block_cur(cur, cur->bc_nlevels, 2, nbp); xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS); ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) && !xfs_btree_ptr_is_null(cur, &rptr)); diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index 3eb34d6..a31d353 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -62,14 +62,92 @@ STATIC void xfs_da_node_unbalance(xfs_da_state_t *state, /* * Utility routines. */ -STATIC uint xfs_da_node_lasthash(xfs_dabuf_t *bp, int *count); -STATIC int xfs_da_node_order(xfs_dabuf_t *node1_bp, xfs_dabuf_t *node2_bp); -STATIC xfs_dabuf_t *xfs_da_buf_make(int nbuf, xfs_buf_t **bps, inst_t *ra); +STATIC uint xfs_da_node_lasthash(struct xfs_buf *bp, int *count); +STATIC int xfs_da_node_order(struct xfs_buf *node1_bp, + struct xfs_buf *node2_bp); STATIC int xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, xfs_da_state_blk_t *save_blk); STATIC void xfs_da_state_kill_altpath(xfs_da_state_t *state); =20 +static void +xfs_da_node_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_da_node_hdr *hdr =3D bp->b_addr; + int block_ok =3D 0; + + block_ok =3D hdr->info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC); + block_ok =3D block_ok && + be16_to_cpu(hdr->level) > 0 && + be16_to_cpu(hdr->count) > 0 ; + if (!block_ok) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + +} + +static void +xfs_da_node_write_verify( + struct xfs_buf *bp) +{ + xfs_da_node_verify(bp); +} + +/* + * leaf/node format detection on trees is sketchy, so a node read can be d= one on + * leaf level blocks when detection identifies the tree as a node format t= ree + * incorrectly. In this case, we need to swap the verifier to match the co= rrect + * format of the block being read. + */ +static void +xfs_da_node_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_da_blkinfo *info =3D bp->b_addr; + + switch (be16_to_cpu(info->magic)) { + case XFS_DA_NODE_MAGIC: + xfs_da_node_verify(bp); + break; + case XFS_ATTR_LEAF_MAGIC: + bp->b_ops =3D &xfs_attr_leaf_buf_ops; + bp->b_ops->verify_read(bp); + return; + case XFS_DIR2_LEAFN_MAGIC: + bp->b_ops =3D &xfs_dir2_leafn_buf_ops; + bp->b_ops->verify_read(bp); + return; + default: + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + mp, info); + xfs_buf_ioerror(bp, EFSCORRUPTED); + break; + } +} + +const struct xfs_buf_ops xfs_da_node_buf_ops =3D { + .verify_read =3D xfs_da_node_read_verify, + .verify_write =3D xfs_da_node_write_verify, +}; + + +int +xfs_da_node_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp, + int which_fork) +{ + return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, + which_fork, &xfs_da_node_buf_ops); +} + /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D * Routines used for growing the Btree. *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/ @@ -79,19 +157,21 @@ STATIC void xfs_da_state_kill_altpath(xfs_da_state_t *= state); */ int xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, - xfs_dabuf_t **bpp, int whichfork) + struct xfs_buf **bpp, int whichfork) { xfs_da_intnode_t *node; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; xfs_trans_t *tp; =20 + trace_xfs_da_node_create(args); + tp =3D args->trans; error =3D xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); if (error) return(error); ASSERT(bp !=3D NULL); - node =3D bp->data; + node =3D bp->b_addr; node->hdr.info.forw =3D 0; node->hdr.info.back =3D 0; node->hdr.info.magic =3D cpu_to_be16(XFS_DA_NODE_MAGIC); @@ -99,9 +179,10 @@ xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blk= no, int level, node->hdr.count =3D 0; node->hdr.level =3D cpu_to_be16(level); =20 - xfs_da_log_buf(tp, bp, + xfs_trans_log_buf(tp, bp, XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); =20 + bp->b_ops =3D &xfs_da_node_buf_ops; *bpp =3D bp; return(0); } @@ -115,9 +196,11 @@ xfs_da_split(xfs_da_state_t *state) { xfs_da_state_blk_t *oldblk, *newblk, *addblk; xfs_da_intnode_t *node; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int max, action, error, i; =20 + trace_xfs_da_split(state->args); + /* * Walk back up the tree splitting/inserting/adjusting as necessary. * If we need to insert and there isn't room, split the node, then @@ -156,10 +239,12 @@ xfs_da_split(xfs_da_state_t *state) state->extravalid =3D 1; if (state->inleaf) { state->extraafter =3D 0; /* before newblk */ + trace_xfs_attr_leaf_split_before(state->args); error =3D xfs_attr_leaf_split(state, oldblk, &state->extrablk); } else { state->extraafter =3D 1; /* after newblk */ + trace_xfs_attr_leaf_split_after(state->args); error =3D xfs_attr_leaf_split(state, newblk, &state->extrablk); } @@ -176,7 +261,6 @@ xfs_da_split(xfs_da_state_t *state) case XFS_DA_NODE_MAGIC: error =3D xfs_da_node_split(state, oldblk, newblk, addblk, max - i, &action); - xfs_da_buf_done(addblk->bp); addblk->bp =3D NULL; if (error) return(error); /* GROT: dir is inconsistent */ @@ -194,13 +278,6 @@ xfs_da_split(xfs_da_state_t *state) * Update the btree to show the new hashval for this child. */ xfs_da_fixhashpath(state, &state->path); - /* - * If we won't need this block again, it's getting dropped - * from the active path by the loop control, so we need - * to mark it done now. - */ - if (i > 0 || !addblk) - xfs_da_buf_done(oldblk->bp); } if (!addblk) return(0); @@ -212,8 +289,6 @@ xfs_da_split(xfs_da_state_t *state) oldblk =3D &state->path.blk[0]; error =3D xfs_da_root_split(state, oldblk, addblk); if (error) { - xfs_da_buf_done(oldblk->bp); - xfs_da_buf_done(addblk->bp); addblk->bp =3D NULL; return(error); /* GROT: dir is inconsistent */ } @@ -225,7 +300,7 @@ xfs_da_split(xfs_da_state_t *state) * and the original block 0 could be at any position in the list. */ =20 - node =3D oldblk->bp->data; + node =3D oldblk->bp->b_addr; if (node->hdr.info.forw) { if (be32_to_cpu(node->hdr.info.forw) =3D=3D addblk->blkno) { bp =3D addblk->bp; @@ -233,13 +308,13 @@ xfs_da_split(xfs_da_state_t *state) ASSERT(state->extravalid); bp =3D state->extrablk.bp; } - node =3D bp->data; + node =3D bp->b_addr; node->hdr.info.back =3D cpu_to_be32(oldblk->blkno); - xfs_da_log_buf(state->args->trans, bp, + xfs_trans_log_buf(state->args->trans, bp, XFS_DA_LOGRANGE(node, &node->hdr.info, sizeof(node->hdr.info))); } - node =3D oldblk->bp->data; + node =3D oldblk->bp->b_addr; if (node->hdr.info.back) { if (be32_to_cpu(node->hdr.info.back) =3D=3D addblk->blkno) { bp =3D addblk->bp; @@ -247,14 +322,12 @@ xfs_da_split(xfs_da_state_t *state) ASSERT(state->extravalid); bp =3D state->extrablk.bp; } - node =3D bp->data; + node =3D bp->b_addr; node->hdr.info.forw =3D cpu_to_be32(oldblk->blkno); - xfs_da_log_buf(state->args->trans, bp, + xfs_trans_log_buf(state->args->trans, bp, XFS_DA_LOGRANGE(node, &node->hdr.info, sizeof(node->hdr.info))); } - xfs_da_buf_done(oldblk->bp); - xfs_da_buf_done(addblk->bp); addblk->bp =3D NULL; return(0); } @@ -271,13 +344,15 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state= _blk_t *blk1, xfs_da_intnode_t *node, *oldroot; xfs_da_args_t *args; xfs_dablk_t blkno; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error, size; xfs_inode_t *dp; xfs_trans_t *tp; xfs_mount_t *mp; xfs_dir2_leaf_t *leaf; =20 + trace_xfs_da_root_split(state->args); + /* * Copy the existing (incorrect) block from the root node position * to a free space somewhere. @@ -294,20 +369,21 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state= _blk_t *blk1, if (error) return(error); ASSERT(bp !=3D NULL); - node =3D bp->data; - oldroot =3D blk1->bp->data; - if (be16_to_cpu(oldroot->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC) { + node =3D bp->b_addr; + oldroot =3D blk1->bp->b_addr; + if (oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)) { size =3D (int)((char *)&oldroot->btree[be16_to_cpu(oldroot->hdr.count)] - (char *)oldroot); } else { - ASSERT(be16_to_cpu(oldroot->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); + ASSERT(oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); leaf =3D (xfs_dir2_leaf_t *)oldroot; size =3D (int)((char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] - (char *)leaf); } memcpy(node, oldroot, size); - xfs_da_log_buf(tp, bp, 0, size - 1); - xfs_da_buf_done(blk1->bp); + xfs_trans_log_buf(tp, bp, 0, size - 1); + + bp->b_ops =3D blk1->bp->b_ops; blk1->bp =3D bp; blk1->blkno =3D blkno; =20 @@ -319,7 +395,7 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_b= lk_t *blk1, be16_to_cpu(node->hdr.level) + 1, &bp, args->whichfork); if (error) return(error); - node =3D bp->data; + node =3D bp->b_addr; node->btree[0].hashval =3D cpu_to_be32(blk1->hashval); node->btree[0].before =3D cpu_to_be32(blk1->blkno); node->btree[1].hashval =3D cpu_to_be32(blk2->hashval); @@ -327,7 +403,7 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_b= lk_t *blk1, node->hdr.count =3D cpu_to_be16(2); =20 #ifdef DEBUG - if (be16_to_cpu(oldroot->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC) { + if (oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { ASSERT(blk1->blkno >=3D mp->m_dirleafblk && blk1->blkno < mp->m_dirfreeblk); ASSERT(blk2->blkno >=3D mp->m_dirleafblk && @@ -336,10 +412,9 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_= blk_t *blk1, #endif =20 /* Header is already logged by xfs_da_node_create */ - xfs_da_log_buf(tp, bp, + xfs_trans_log_buf(tp, bp, XFS_DA_LOGRANGE(node, node->btree, sizeof(xfs_da_node_entry_t) * 2)); - xfs_da_buf_done(bp); =20 return(0); } @@ -358,8 +433,10 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_= blk_t *oldblk, int newcount, error; int useextra; =20 - node =3D oldblk->bp->data; - ASSERT(be16_to_cpu(node->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC); + trace_xfs_da_node_split(state->args); + + node =3D oldblk->bp->b_addr; + ASSERT(node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); =20 /* * With V2 dirs the extra block is data or freespace. @@ -405,7 +482,7 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_b= lk_t *oldblk, * * If we had double-split op below us, then add the extra block too. */ - node =3D oldblk->bp->data; + node =3D oldblk->bp->b_addr; if (oldblk->index <=3D be16_to_cpu(node->hdr.count)) { oldblk->index++; xfs_da_node_add(state, oldblk, addblk); @@ -444,8 +521,10 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_st= ate_blk_t *blk1, int count, tmp; xfs_trans_t *tp; =20 - node1 =3D blk1->bp->data; - node2 =3D blk2->bp->data; + trace_xfs_da_node_rebalance(state->args); + + node1 =3D blk1->bp->b_addr; + node2 =3D blk2->bp->b_addr; /* * Figure out how many entries need to move, and in which direction. * Swap the nodes around if that makes it simpler. @@ -458,8 +537,8 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_sta= te_blk_t *blk1, node1 =3D node2; node2 =3D tmpnode; } - ASSERT(be16_to_cpu(node1->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC); - ASSERT(be16_to_cpu(node2->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC); + ASSERT(node1->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); + ASSERT(node2->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); count =3D (be16_to_cpu(node1->hdr.count) - be16_to_cpu(node2->hdr.count))= / 2; if (count =3D=3D 0) return; @@ -499,7 +578,7 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_sta= te_blk_t *blk1, btree_d =3D &node1->btree[be16_to_cpu(node1->hdr.count)]; memcpy(btree_d, btree_s, tmp); be16_add_cpu(&node1->hdr.count, count); - xfs_da_log_buf(tp, blk1->bp, + xfs_trans_log_buf(tp, blk1->bp, XFS_DA_LOGRANGE(node1, btree_d, tmp)); =20 /* @@ -516,9 +595,9 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_sta= te_blk_t *blk1, /* * Log header of node 1 and all current bits of node 2. */ - xfs_da_log_buf(tp, blk1->bp, + xfs_trans_log_buf(tp, blk1->bp, XFS_DA_LOGRANGE(node1, &node1->hdr, sizeof(node1->hdr))); - xfs_da_log_buf(tp, blk2->bp, + xfs_trans_log_buf(tp, blk2->bp, XFS_DA_LOGRANGE(node2, &node2->hdr, sizeof(node2->hdr) + sizeof(node2->btree[0]) * be16_to_cpu(node2->hdr.count))); @@ -527,8 +606,8 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_sta= te_blk_t *blk1, * Record the last hashval from each block for upward propagation. * (note: don't use the swapped node pointers) */ - node1 =3D blk1->bp->data; - node2 =3D blk2->bp->data; + node1 =3D blk1->bp->b_addr; + node2 =3D blk2->bp->b_addr; blk1->hashval =3D be32_to_cpu(node1->btree[be16_to_cpu(node1->hdr.count)-= 1].hashval); blk2->hashval =3D be32_to_cpu(node2->btree[be16_to_cpu(node2->hdr.count)-= 1].hashval); =20 @@ -552,8 +631,10 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_bl= k_t *oldblk, xfs_da_node_entry_t *btree; int tmp; =20 - node =3D oldblk->bp->data; - ASSERT(be16_to_cpu(node->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC); + trace_xfs_da_node_add(state->args); + + node =3D oldblk->bp->b_addr; + ASSERT(node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); ASSERT((oldblk->index >=3D 0) && (oldblk->index <=3D be16_to_cpu(node->hd= r.count))); ASSERT(newblk->blkno !=3D 0); if (state->args->whichfork =3D=3D XFS_DATA_FORK) @@ -571,10 +652,10 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_b= lk_t *oldblk, } btree->hashval =3D cpu_to_be32(newblk->hashval); btree->before =3D cpu_to_be32(newblk->blkno); - xfs_da_log_buf(state->args->trans, oldblk->bp, + xfs_trans_log_buf(state->args->trans, oldblk->bp, XFS_DA_LOGRANGE(node, btree, tmp + sizeof(*btree))); be16_add_cpu(&node->hdr.count, 1); - xfs_da_log_buf(state->args->trans, oldblk->bp, + xfs_trans_log_buf(state->args->trans, oldblk->bp, XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); =20 /* @@ -597,6 +678,8 @@ xfs_da_join(xfs_da_state_t *state) xfs_da_state_blk_t *drop_blk, *save_blk; int action, error; =20 + trace_xfs_da_join(state->args); + action =3D 0; drop_blk =3D &state->path.blk[ state->path.active-1 ]; save_blk =3D &state->altpath.blk[ state->path.active-1 ]; @@ -670,6 +753,24 @@ xfs_da_join(xfs_da_state_t *state) return(error); } =20 +#ifdef DEBUG +static void +xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 le= vel) +{ + __be16 magic =3D blkinfo->magic; + + if (level =3D=3D 1) { + ASSERT(magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + } else + ASSERT(magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); + ASSERT(!blkinfo->forw); + ASSERT(!blkinfo->back); +} +#else /* !DEBUG */ +#define xfs_da_blkinfo_onlychild_validate(blkinfo, level) +#endif /* !DEBUG */ + /* * We have only one entry in the root. Copy the only remaining child of * the old root to block 0 as the new root node. @@ -678,18 +779,18 @@ STATIC int xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) { xfs_da_intnode_t *oldroot; - /* REFERENCED */ - xfs_da_blkinfo_t *blkinfo; xfs_da_args_t *args; xfs_dablk_t child; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; =20 + trace_xfs_da_root_join(state->args); + args =3D state->args; ASSERT(args !=3D NULL); ASSERT(root_blk->magic =3D=3D XFS_DA_NODE_MAGIC); - oldroot =3D root_blk->bp->data; - ASSERT(be16_to_cpu(oldroot->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC); + oldroot =3D root_blk->bp->b_addr; + ASSERT(oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); ASSERT(!oldroot->hdr.info.forw); ASSERT(!oldroot->hdr.info.back); =20 @@ -705,22 +806,23 @@ xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_= blk_t *root_blk) */ child =3D be32_to_cpu(oldroot->btree[0].before); ASSERT(child !=3D 0); - error =3D xfs_da_read_buf(args->trans, args->dp, child, -1, &bp, + error =3D xfs_da_node_read(args->trans, args->dp, child, -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp !=3D NULL); - blkinfo =3D bp->data; - if (be16_to_cpu(oldroot->hdr.level) =3D=3D 1) { - ASSERT(be16_to_cpu(blkinfo->magic) =3D=3D XFS_DIR2_LEAFN_MAGIC || - be16_to_cpu(blkinfo->magic) =3D=3D XFS_ATTR_LEAF_MAGIC); - } else { - ASSERT(be16_to_cpu(blkinfo->magic) =3D=3D XFS_DA_NODE_MAGIC); - } - ASSERT(!blkinfo->forw); - ASSERT(!blkinfo->back); - memcpy(root_blk->bp->data, bp->data, state->blocksize); - xfs_da_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); + xfs_da_blkinfo_onlychild_validate(bp->b_addr, + be16_to_cpu(oldroot->hdr.level)); + + /* + * This could be copying a leaf back into the root block in the case of + * there only being a single leaf block left in the tree. Hence we have + * to update the b_ops pointer as well to match the buffer type change + * that could occur. + */ + memcpy(root_blk->bp->b_addr, bp->b_addr, state->blocksize); + root_blk->bp->b_ops =3D bp->b_ops; + xfs_trans_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); error =3D xfs_da_shrink_inode(args, child, bp); return(error); } @@ -742,7 +844,9 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) xfs_da_blkinfo_t *info; int count, forward, error, retval, i; xfs_dablk_t blkno; - xfs_dabuf_t *bp; + struct xfs_buf *bp; + + trace_xfs_da_node_toosmall(state->args); =20 /* * Check for the degenerate case of the block being over 50% full. @@ -750,8 +854,8 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) * to coalesce with a sibling. */ blk =3D &state->path.blk[ state->path.active-1 ]; - info =3D blk->bp->data; - ASSERT(be16_to_cpu(info->magic) =3D=3D XFS_DA_NODE_MAGIC); + info =3D blk->bp->b_addr; + ASSERT(info->magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); node =3D (xfs_da_intnode_t *)info; count =3D be16_to_cpu(node->hdr.count); if (count > (state->node_ents >> 1)) { @@ -800,7 +904,7 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) blkno =3D be32_to_cpu(info->back); if (blkno =3D=3D 0) continue; - error =3D xfs_da_read_buf(state->args->trans, state->args->dp, + error =3D xfs_da_node_read(state->args->trans, state->args->dp, blkno, -1, &bp, state->args->whichfork); if (error) return(error); @@ -810,10 +914,10 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *acti= on) count =3D state->node_ents; count -=3D state->node_ents >> 2; count -=3D be16_to_cpu(node->hdr.count); - node =3D bp->data; - ASSERT(be16_to_cpu(node->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC); + node =3D bp->b_addr; + ASSERT(node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); count -=3D be16_to_cpu(node->hdr.count); - xfs_da_brelse(state->args->trans, bp); + xfs_trans_brelse(state->args->trans, bp); if (count >=3D 0) break; /* fits with at least 25% to spare */ } @@ -865,6 +969,8 @@ xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_state_= path_t *path) xfs_dahash_t lasthash=3D0; int level, count; =20 + trace_xfs_da_fixhashpath(state->args); + level =3D path->active-1; blk =3D &path->blk[ level ]; switch (blk->magic) { @@ -885,14 +991,14 @@ xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_stat= e_path_t *path) break; } for (blk--, level--; level >=3D 0; blk--, level--) { - node =3D blk->bp->data; - ASSERT(be16_to_cpu(node->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC); + node =3D blk->bp->b_addr; + ASSERT(node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); btree =3D &node->btree[ blk->index ]; if (be32_to_cpu(btree->hashval) =3D=3D lasthash) break; blk->hashval =3D lasthash; btree->hashval =3D cpu_to_be32(lasthash); - xfs_da_log_buf(state->args->trans, blk->bp, + xfs_trans_log_buf(state->args->trans, blk->bp, XFS_DA_LOGRANGE(node, btree, sizeof(*btree))); =20 lasthash =3D be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1].has= hval); @@ -909,7 +1015,9 @@ xfs_da_node_remove(xfs_da_state_t *state, xfs_da_state= _blk_t *drop_blk) xfs_da_node_entry_t *btree; int tmp; =20 - node =3D drop_blk->bp->data; + trace_xfs_da_node_remove(state->args); + + node =3D drop_blk->bp->b_addr; ASSERT(drop_blk->index < be16_to_cpu(node->hdr.count)); ASSERT(drop_blk->index >=3D 0); =20 @@ -921,15 +1029,15 @@ xfs_da_node_remove(xfs_da_state_t *state, xfs_da_sta= te_blk_t *drop_blk) tmp =3D be16_to_cpu(node->hdr.count) - drop_blk->index - 1; tmp *=3D (uint)sizeof(xfs_da_node_entry_t); memmove(btree, btree + 1, tmp); - xfs_da_log_buf(state->args->trans, drop_blk->bp, + xfs_trans_log_buf(state->args->trans, drop_blk->bp, XFS_DA_LOGRANGE(node, btree, tmp)); btree =3D &node->btree[be16_to_cpu(node->hdr.count)-1]; } memset((char *)btree, 0, sizeof(xfs_da_node_entry_t)); - xfs_da_log_buf(state->args->trans, drop_blk->bp, + xfs_trans_log_buf(state->args->trans, drop_blk->bp, XFS_DA_LOGRANGE(node, btree, sizeof(*btree))); be16_add_cpu(&node->hdr.count, -1); - xfs_da_log_buf(state->args->trans, drop_blk->bp, + xfs_trans_log_buf(state->args->trans, drop_blk->bp, XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); =20 /* @@ -952,10 +1060,12 @@ xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_= state_blk_t *drop_blk, int tmp; xfs_trans_t *tp; =20 - drop_node =3D drop_blk->bp->data; - save_node =3D save_blk->bp->data; - ASSERT(be16_to_cpu(drop_node->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC); - ASSERT(be16_to_cpu(save_node->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC); + trace_xfs_da_node_unbalance(state->args); + + drop_node =3D drop_blk->bp->b_addr; + save_node =3D save_blk->bp->b_addr; + ASSERT(drop_node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); + ASSERT(save_node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); tp =3D state->args->trans; =20 /* @@ -970,13 +1080,13 @@ xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_= state_blk_t *drop_blk, tmp =3D be16_to_cpu(save_node->hdr.count) * (uint)sizeof(xfs_da_node_ent= ry_t); memmove(btree, &save_node->btree[0], tmp); btree =3D &save_node->btree[0]; - xfs_da_log_buf(tp, save_blk->bp, + xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, btree, (be16_to_cpu(save_node->hdr.count) + be16_to_cpu(drop_node->hdr.count)= ) * sizeof(xfs_da_node_entry_t))); } else { btree =3D &save_node->btree[be16_to_cpu(save_node->hdr.count)]; - xfs_da_log_buf(tp, save_blk->bp, + xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, btree, be16_to_cpu(drop_node->hdr.count) * sizeof(xfs_da_node_entry_t))); @@ -989,7 +1099,7 @@ xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_st= ate_blk_t *drop_blk, memcpy(btree, &drop_node->btree[0], tmp); be16_add_cpu(&save_node->hdr.count, be16_to_cpu(drop_node->hdr.count)); =20 - xfs_da_log_buf(tp, save_blk->bp, + xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, &save_node->hdr, sizeof(save_node->hdr))); =20 @@ -1040,14 +1150,14 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *= result) * Read the next node down in the tree. */ blk->blkno =3D blkno; - error =3D xfs_da_read_buf(args->trans, args->dp, blkno, + error =3D xfs_da_node_read(args->trans, args->dp, blkno, -1, &blk->bp, args->whichfork); if (error) { blk->blkno =3D 0; state->path.active--; return(error); } - curr =3D blk->bp->data; + curr =3D blk->bp->b_addr; blk->magic =3D be16_to_cpu(curr->magic); ASSERT(blk->magic =3D=3D XFS_DA_NODE_MAGIC || blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC || @@ -1057,7 +1167,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *re= sult) * Search an intermediate node for a match. */ if (blk->magic =3D=3D XFS_DA_NODE_MAGIC) { - node =3D blk->bp->data; + node =3D blk->bp->b_addr; max =3D be16_to_cpu(node->hdr.count); blk->hashval =3D be32_to_cpu(node->btree[max-1].hashval); =20 @@ -1163,15 +1273,15 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state= _blk_t *old_blk, xfs_da_blkinfo_t *old_info, *new_info, *tmp_info; xfs_da_args_t *args; int before=3D0, error; - xfs_dabuf_t *bp; + struct xfs_buf *bp; =20 /* * Set up environment. */ args =3D state->args; ASSERT(args !=3D NULL); - old_info =3D old_blk->bp->data; - new_info =3D new_blk->bp->data; + old_info =3D old_blk->bp->b_addr; + new_info =3D new_blk->bp->b_addr; ASSERT(old_blk->magic =3D=3D XFS_DA_NODE_MAGIC || old_blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC || old_blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); @@ -1198,48 +1308,48 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state= _blk_t *old_blk, /* * Link new block in before existing block. */ + trace_xfs_da_link_before(args); new_info->forw =3D cpu_to_be32(old_blk->blkno); new_info->back =3D old_info->back; if (old_info->back) { - error =3D xfs_da_read_buf(args->trans, args->dp, + error =3D xfs_da_node_read(args->trans, args->dp, be32_to_cpu(old_info->back), -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp !=3D NULL); - tmp_info =3D bp->data; + tmp_info =3D bp->b_addr; ASSERT(be16_to_cpu(tmp_info->magic) =3D=3D be16_to_cpu(old_info->magic)= ); ASSERT(be32_to_cpu(tmp_info->forw) =3D=3D old_blk->blkno); tmp_info->forw =3D cpu_to_be32(new_blk->blkno); - xfs_da_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1); - xfs_da_buf_done(bp); + xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1); } old_info->back =3D cpu_to_be32(new_blk->blkno); } else { /* * Link new block in after existing block. */ + trace_xfs_da_link_after(args); new_info->forw =3D old_info->forw; new_info->back =3D cpu_to_be32(old_blk->blkno); if (old_info->forw) { - error =3D xfs_da_read_buf(args->trans, args->dp, + error =3D xfs_da_node_read(args->trans, args->dp, be32_to_cpu(old_info->forw), -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp !=3D NULL); - tmp_info =3D bp->data; + tmp_info =3D bp->b_addr; ASSERT(tmp_info->magic =3D=3D old_info->magic); ASSERT(be32_to_cpu(tmp_info->back) =3D=3D old_blk->blkno); tmp_info->back =3D cpu_to_be32(new_blk->blkno); - xfs_da_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1); - xfs_da_buf_done(bp); + xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1); } old_info->forw =3D cpu_to_be32(new_blk->blkno); } =20 - xfs_da_log_buf(args->trans, old_blk->bp, 0, sizeof(*tmp_info) - 1); - xfs_da_log_buf(args->trans, new_blk->bp, 0, sizeof(*tmp_info) - 1); + xfs_trans_log_buf(args->trans, old_blk->bp, 0, sizeof(*tmp_info) - 1); + xfs_trans_log_buf(args->trans, new_blk->bp, 0, sizeof(*tmp_info) - 1); return(0); } =20 @@ -1247,14 +1357,16 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state= _blk_t *old_blk, * Compare two intermediate nodes for "order". */ STATIC int -xfs_da_node_order(xfs_dabuf_t *node1_bp, xfs_dabuf_t *node2_bp) +xfs_da_node_order( + struct xfs_buf *node1_bp, + struct xfs_buf *node2_bp) { xfs_da_intnode_t *node1, *node2; =20 - node1 =3D node1_bp->data; - node2 =3D node2_bp->data; - ASSERT((be16_to_cpu(node1->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC) && - (be16_to_cpu(node2->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC)); + node1 =3D node1_bp->b_addr; + node2 =3D node2_bp->b_addr; + ASSERT(node1->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC) && + node2->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); if ((be16_to_cpu(node1->hdr.count) > 0) && (be16_to_cpu(node2->hdr.count)= > 0) && ((be32_to_cpu(node2->btree[0].hashval) < be32_to_cpu(node1->btree[0].hashval)) || @@ -1269,12 +1381,14 @@ xfs_da_node_order(xfs_dabuf_t *node1_bp, xfs_dabuf_= t *node2_bp) * Pick up the last hashvalue from an intermediate node. */ STATIC uint -xfs_da_node_lasthash(xfs_dabuf_t *bp, int *count) +xfs_da_node_lasthash( + struct xfs_buf *bp, + int *count) { xfs_da_intnode_t *node; =20 - node =3D bp->data; - ASSERT(be16_to_cpu(node->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC); + node =3D bp->b_addr; + ASSERT(node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); if (count) *count =3D be16_to_cpu(node->hdr.count); if (!node->hdr.count) @@ -1291,7 +1405,7 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state= _blk_t *drop_blk, { xfs_da_blkinfo_t *drop_info, *save_info, *tmp_info; xfs_da_args_t *args; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int error; =20 /* @@ -1299,8 +1413,8 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state= _blk_t *drop_blk, */ args =3D state->args; ASSERT(args !=3D NULL); - save_info =3D save_blk->bp->data; - drop_info =3D drop_blk->bp->data; + save_info =3D save_blk->bp->b_addr; + drop_info =3D drop_blk->bp->b_addr; ASSERT(save_blk->magic =3D=3D XFS_DA_NODE_MAGIC || save_blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC || save_blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); @@ -1316,42 +1430,42 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_sta= te_blk_t *drop_blk, * Unlink the leaf block from the doubly linked chain of leaves. */ if (be32_to_cpu(save_info->back) =3D=3D drop_blk->blkno) { + trace_xfs_da_unlink_back(args); save_info->back =3D drop_info->back; if (drop_info->back) { - error =3D xfs_da_read_buf(args->trans, args->dp, + error =3D xfs_da_node_read(args->trans, args->dp, be32_to_cpu(drop_info->back), -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp !=3D NULL); - tmp_info =3D bp->data; + tmp_info =3D bp->b_addr; ASSERT(tmp_info->magic =3D=3D save_info->magic); ASSERT(be32_to_cpu(tmp_info->forw) =3D=3D drop_blk->blkno); tmp_info->forw =3D cpu_to_be32(save_blk->blkno); - xfs_da_log_buf(args->trans, bp, 0, + xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info) - 1); - xfs_da_buf_done(bp); } } else { + trace_xfs_da_unlink_forward(args); save_info->forw =3D drop_info->forw; if (drop_info->forw) { - error =3D xfs_da_read_buf(args->trans, args->dp, + error =3D xfs_da_node_read(args->trans, args->dp, be32_to_cpu(drop_info->forw), -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp !=3D NULL); - tmp_info =3D bp->data; + tmp_info =3D bp->b_addr; ASSERT(tmp_info->magic =3D=3D save_info->magic); ASSERT(be32_to_cpu(tmp_info->back) =3D=3D drop_blk->blkno); tmp_info->back =3D cpu_to_be32(save_blk->blkno); - xfs_da_log_buf(args->trans, bp, 0, + xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info) - 1); - xfs_da_buf_done(bp); } } =20 - xfs_da_log_buf(args->trans, save_blk->bp, 0, sizeof(*save_info) - 1); + xfs_trans_log_buf(args->trans, save_blk->bp, 0, sizeof(*save_info) - 1); return(0); } =20 @@ -1374,6 +1488,8 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state= _path_t *path, xfs_dablk_t blkno=3D0; int level, error; =20 + trace_xfs_da_path_shift(state->args); + /* * Roll up the Btree looking for the first block where our * current index is not at the edge of the block. Note that @@ -1386,8 +1502,8 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state= _path_t *path, level =3D (path->active-1) - 1; /* skip bottom layer in path */ for (blk =3D &path->blk[level]; level >=3D 0; blk--, level--) { ASSERT(blk->bp !=3D NULL); - node =3D blk->bp->data; - ASSERT(be16_to_cpu(node->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC); + node =3D blk->bp->b_addr; + ASSERT(node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); if (forward && (blk->index < be16_to_cpu(node->hdr.count)-1)) { blk->index++; blkno =3D be32_to_cpu(node->btree[blk->index].before); @@ -1414,21 +1530,21 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_sta= te_path_t *path, * (if it's dirty, trans won't actually let go) */ if (release) - xfs_da_brelse(args->trans, blk->bp); + xfs_trans_brelse(args->trans, blk->bp); =20 /* * Read the next child block. */ blk->blkno =3D blkno; - error =3D xfs_da_read_buf(args->trans, args->dp, blkno, -1, - &blk->bp, args->whichfork); + error =3D xfs_da_node_read(args->trans, args->dp, blkno, -1, + &blk->bp, args->whichfork); if (error) return(error); ASSERT(blk->bp !=3D NULL); - info =3D blk->bp->data; - ASSERT(be16_to_cpu(info->magic) =3D=3D XFS_DA_NODE_MAGIC || - be16_to_cpu(info->magic) =3D=3D XFS_DIR2_LEAFN_MAGIC || - be16_to_cpu(info->magic) =3D=3D XFS_ATTR_LEAF_MAGIC); + info =3D blk->bp->b_addr; + ASSERT(info->magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC) || + info->magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + info->magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); blk->magic =3D be16_to_cpu(info->magic); if (blk->magic =3D=3D XFS_DA_NODE_MAGIC) { node =3D (xfs_da_intnode_t *)info; @@ -1521,79 +1637,60 @@ const struct xfs_nameops xfs_default_nameops =3D { .compname =3D xfs_da_compname }; =20 -/* - * Add a block to the btree ahead of the file. - * Return the new block number to the caller. - */ int -xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) +xfs_da_grow_inode_int( + struct xfs_da_args *args, + xfs_fileoff_t *bno, + int count) { - xfs_fileoff_t bno, b; - xfs_bmbt_irec_t map; - xfs_bmbt_irec_t *mapp; - xfs_inode_t *dp; - int nmap, error, w, count, c, got, i, mapi; - xfs_trans_t *tp; - xfs_mount_t *mp; - xfs_drfsbno_t nblks; - - dp =3D args->dp; - mp =3D dp->i_mount; - w =3D args->whichfork; - tp =3D args->trans; - nblks =3D dp->i_d.di_nblocks; + struct xfs_trans *tp =3D args->trans; + struct xfs_inode *dp =3D args->dp; + int w =3D args->whichfork; + xfs_drfsbno_t nblks =3D dp->i_d.di_nblocks; + struct xfs_bmbt_irec map, *mapp; + int nmap, error, got, i, mapi; =20 /* - * For new directories adjust the file offset and block count. - */ - if (w =3D=3D XFS_DATA_FORK) { - bno =3D mp->m_dirleafblk; - count =3D mp->m_dirblkfsbs; - } else { - bno =3D 0; - count =3D 1; - } - /* * Find a spot in the file space to put the new block. */ - if ((error =3D xfs_bmap_first_unused(tp, dp, count, &bno, w))) + error =3D xfs_bmap_first_unused(tp, dp, count, bno, w); + if (error) return error; - if (w =3D=3D XFS_DATA_FORK) - ASSERT(bno >=3D mp->m_dirleafblk && bno < mp->m_dirfreeblk); + /* * Try mapping it in one filesystem block. */ nmap =3D 1; ASSERT(args->firstblock !=3D NULL); - if ((error =3D xfs_bmapi(tp, dp, bno, count, - xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA| - XFS_BMAPI_CONTIG, + error =3D xfs_bmapi_write(tp, dp, *bno, count, + xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG, args->firstblock, args->total, &map, &nmap, - args->flist))) { + args->flist); + if (error) return error; - } + ASSERT(nmap <=3D 1); if (nmap =3D=3D 1) { mapp =3D ↦ mapi =3D 1; - } - /* - * If we didn't get it and the block might work if fragmented, - * try without the CONTIG flag. Loop until we get it all. - */ - else if (nmap =3D=3D 0 && count > 1) { + } else if (nmap =3D=3D 0 && count > 1) { + xfs_fileoff_t b; + int c; + + /* + * If we didn't get it and the block might work if fragmented, + * try without the CONTIG flag. Loop until we get it all. + */ mapp =3D kmem_alloc(sizeof(*mapp) * count, KM_SLEEP); - for (b =3D bno, mapi =3D 0; b < bno + count; ) { + for (b =3D *bno, mapi =3D 0; b < *bno + count; ) { nmap =3D MIN(XFS_BMAP_MAX_NMAP, count); - c =3D (int)(bno + count - b); - if ((error =3D xfs_bmapi(tp, dp, b, c, - xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE| - XFS_BMAPI_METADATA, + c =3D (int)(*bno + count - b); + error =3D xfs_bmapi_write(tp, dp, b, c, + xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, args->firstblock, args->total, - &mapp[mapi], &nmap, args->flist))) { - kmem_free(mapp); - return error; - } + &mapp[mapi], &nmap, args->flist); + if (error) + goto out_free_map; if (nmap < 1) break; mapi +=3D nmap; @@ -1604,24 +1701,55 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t = *new_blkno) mapi =3D 0; mapp =3D NULL; } + /* * Count the blocks we got, make sure it matches the total. */ for (i =3D 0, got =3D 0; i < mapi; i++) got +=3D mapp[i].br_blockcount; - if (got !=3D count || mapp[0].br_startoff !=3D bno || + if (got !=3D count || mapp[0].br_startoff !=3D *bno || mapp[mapi - 1].br_startoff + mapp[mapi - 1].br_blockcount !=3D - bno + count) { - if (mapp !=3D &map) - kmem_free(mapp); - return XFS_ERROR(ENOSPC); + *bno + count) { + error =3D XFS_ERROR(ENOSPC); + goto out_free_map; } - if (mapp !=3D &map) - kmem_free(mapp); + /* account for newly allocated blocks in reserved blocks total */ args->total -=3D dp->i_d.di_nblocks - nblks; - *new_blkno =3D (xfs_dablk_t)bno; - return 0; + +out_free_map: + if (mapp !=3D &map) + kmem_free(mapp); + return error; +} + +/* + * Add a block to the btree ahead of the file. + * Return the new block number to the caller. + */ +int +xfs_da_grow_inode( + struct xfs_da_args *args, + xfs_dablk_t *new_blkno) +{ + xfs_fileoff_t bno; + int count; + int error; + + trace_xfs_da_grow_inode(args); + + if (args->whichfork =3D=3D XFS_DATA_FORK) { + bno =3D args->dp->i_mount->m_dirleafblk; + count =3D args->dp->i_mount->m_dirblkfsbs; + } else { + bno =3D 0; + count =3D 1; + } + + error =3D xfs_da_grow_inode_int(args, &bno, count); + if (!error) + *new_blkno =3D (xfs_dablk_t)bno; + return error; } =20 /* @@ -1633,11 +1761,13 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t = *new_blkno) * a bmap btree split to do that. */ STATIC int -xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, - xfs_dabuf_t **dead_bufp) +xfs_da_swap_lastblock( + xfs_da_args_t *args, + xfs_dablk_t *dead_blknop, + struct xfs_buf **dead_bufp) { xfs_dablk_t dead_blkno, last_blkno, sib_blkno, par_blkno; - xfs_dabuf_t *dead_buf, *last_buf, *sib_buf, *par_buf; + struct xfs_buf *dead_buf, *last_buf, *sib_buf, *par_buf; xfs_fileoff_t lastoff; xfs_inode_t *ip; xfs_trans_t *tp; @@ -1648,6 +1778,8 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_= t *dead_blknop, xfs_dir2_leaf_t *dead_leaf2; xfs_dahash_t dead_hash; =20 + trace_xfs_da_swap_lastblock(args); + dead_buf =3D *dead_bufp; dead_blkno =3D *dead_blknop; tp =3D args->trans; @@ -1668,23 +1800,24 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dabl= k_t *dead_blknop, * Read the last block in the btree space. */ last_blkno =3D (xfs_dablk_t)lastoff - mp->m_dirblkfsbs; - if ((error =3D xfs_da_read_buf(tp, ip, last_blkno, -1, &last_buf, w))) + error =3D xfs_da_node_read(tp, ip, last_blkno, -1, &last_buf, w); + if (error) return error; /* * Copy the last block into the dead buffer and log it. */ - memcpy(dead_buf->data, last_buf->data, mp->m_dirblksize); - xfs_da_log_buf(tp, dead_buf, 0, mp->m_dirblksize - 1); - dead_info =3D dead_buf->data; + memcpy(dead_buf->b_addr, last_buf->b_addr, mp->m_dirblksize); + xfs_trans_log_buf(tp, dead_buf, 0, mp->m_dirblksize - 1); + dead_info =3D dead_buf->b_addr; /* * Get values from the moved block. */ - if (be16_to_cpu(dead_info->magic) =3D=3D XFS_DIR2_LEAFN_MAGIC) { + if (dead_info->magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { dead_leaf2 =3D (xfs_dir2_leaf_t *)dead_info; dead_level =3D 0; dead_hash =3D be32_to_cpu(dead_leaf2->ents[be16_to_cpu(dead_leaf2->hdr.c= ount) - 1].hashval); } else { - ASSERT(be16_to_cpu(dead_info->magic) =3D=3D XFS_DA_NODE_MAGIC); + ASSERT(dead_info->magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); dead_node =3D (xfs_da_intnode_t *)dead_info; dead_level =3D be16_to_cpu(dead_node->hdr.level); dead_hash =3D be32_to_cpu(dead_node->btree[be16_to_cpu(dead_node->hdr.co= unt) - 1].hashval); @@ -1694,9 +1827,10 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk= _t *dead_blknop, * If the moved block has a left sibling, fix up the pointers. */ if ((sib_blkno =3D be32_to_cpu(dead_info->back))) { - if ((error =3D xfs_da_read_buf(tp, ip, sib_blkno, -1, &sib_buf, w))) + error =3D xfs_da_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); + if (error) goto done; - sib_info =3D sib_buf->data; + sib_info =3D sib_buf->b_addr; if (unlikely( be32_to_cpu(sib_info->forw) !=3D last_blkno || sib_info->magic !=3D dead_info->magic)) { @@ -1706,19 +1840,19 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dabl= k_t *dead_blknop, goto done; } sib_info->forw =3D cpu_to_be32(dead_blkno); - xfs_da_log_buf(tp, sib_buf, + xfs_trans_log_buf(tp, sib_buf, XFS_DA_LOGRANGE(sib_info, &sib_info->forw, sizeof(sib_info->forw))); - xfs_da_buf_done(sib_buf); sib_buf =3D NULL; } /* * If the moved block has a right sibling, fix up the pointers. */ if ((sib_blkno =3D be32_to_cpu(dead_info->forw))) { - if ((error =3D xfs_da_read_buf(tp, ip, sib_blkno, -1, &sib_buf, w))) + error =3D xfs_da_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); + if (error) goto done; - sib_info =3D sib_buf->data; + sib_info =3D sib_buf->b_addr; if (unlikely( be32_to_cpu(sib_info->back) !=3D last_blkno || sib_info->magic !=3D dead_info->magic)) { @@ -1728,10 +1862,9 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk= _t *dead_blknop, goto done; } sib_info->back =3D cpu_to_be32(dead_blkno); - xfs_da_log_buf(tp, sib_buf, + xfs_trans_log_buf(tp, sib_buf, XFS_DA_LOGRANGE(sib_info, &sib_info->back, sizeof(sib_info->back))); - xfs_da_buf_done(sib_buf); sib_buf =3D NULL; } par_blkno =3D mp->m_dirleafblk; @@ -1740,11 +1873,12 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dabl= k_t *dead_blknop, * Walk down the tree looking for the parent of the moved block. */ for (;;) { - if ((error =3D xfs_da_read_buf(tp, ip, par_blkno, -1, &par_buf, w))) + error =3D xfs_da_node_read(tp, ip, par_blkno, -1, &par_buf, w); + if (error) goto done; - par_node =3D par_buf->data; - if (unlikely( - be16_to_cpu(par_node->hdr.info.magic) !=3D XFS_DA_NODE_MAGIC || + par_node =3D par_buf->b_addr; + if (unlikely(par_node->hdr.info.magic !=3D + cpu_to_be16(XFS_DA_NODE_MAGIC) || (level >=3D 0 && level !=3D be16_to_cpu(par_node->hdr.level) + 1))) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(4)", XFS_ERRLEVEL_LOW, mp); @@ -1766,7 +1900,7 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_= t *dead_blknop, par_blkno =3D be32_to_cpu(par_node->btree[entno].before); if (level =3D=3D dead_level + 1) break; - xfs_da_brelse(tp, par_buf); + xfs_trans_brelse(tp, par_buf); par_buf =3D NULL; } /* @@ -1782,7 +1916,7 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_= t *dead_blknop, if (entno < be16_to_cpu(par_node->hdr.count)) break; par_blkno =3D be32_to_cpu(par_node->hdr.info.forw); - xfs_da_brelse(tp, par_buf); + xfs_trans_brelse(tp, par_buf); par_buf =3D NULL; if (unlikely(par_blkno =3D=3D 0)) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(6)", @@ -1790,12 +1924,13 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dabl= k_t *dead_blknop, error =3D XFS_ERROR(EFSCORRUPTED); goto done; } - if ((error =3D xfs_da_read_buf(tp, ip, par_blkno, -1, &par_buf, w))) + error =3D xfs_da_node_read(tp, ip, par_blkno, -1, &par_buf, w); + if (error) goto done; - par_node =3D par_buf->data; + par_node =3D par_buf->b_addr; if (unlikely( be16_to_cpu(par_node->hdr.level) !=3D level || - be16_to_cpu(par_node->hdr.info.magic) !=3D XFS_DA_NODE_MAGIC)) { + par_node->hdr.info.magic !=3D cpu_to_be16(XFS_DA_NODE_MAGIC))) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(7)", XFS_ERRLEVEL_LOW, mp); error =3D XFS_ERROR(EFSCORRUPTED); @@ -1807,20 +1942,18 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dabl= k_t *dead_blknop, * Update the parent entry pointing to the moved block. */ par_node->btree[entno].before =3D cpu_to_be32(dead_blkno); - xfs_da_log_buf(tp, par_buf, + xfs_trans_log_buf(tp, par_buf, XFS_DA_LOGRANGE(par_node, &par_node->btree[entno].before, sizeof(par_node->btree[entno].before))); - xfs_da_buf_done(par_buf); - xfs_da_buf_done(dead_buf); *dead_blknop =3D last_blkno; *dead_bufp =3D last_buf; return 0; done: if (par_buf) - xfs_da_brelse(tp, par_buf); + xfs_trans_brelse(tp, par_buf); if (sib_buf) - xfs_da_brelse(tp, sib_buf); - xfs_da_brelse(tp, last_buf); + xfs_trans_brelse(tp, sib_buf); + xfs_trans_brelse(tp, last_buf); return error; } =20 @@ -1828,14 +1961,18 @@ done: * Remove a btree block from a directory or attribute. */ int -xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, - xfs_dabuf_t *dead_buf) +xfs_da_shrink_inode( + xfs_da_args_t *args, + xfs_dablk_t dead_blkno, + struct xfs_buf *dead_buf) { xfs_inode_t *dp; int done, error, w, count; xfs_trans_t *tp; xfs_mount_t *mp; =20 + trace_xfs_da_shrink_inode(args); + dp =3D args->dp; w =3D args->whichfork; tp =3D args->trans; @@ -1862,7 +1999,7 @@ xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t = dead_blkno, break; } } - xfs_da_binval(tp, dead_buf); + xfs_trans_binval(tp, dead_buf); return error; } =20 @@ -1894,36 +2031,75 @@ xfs_da_map_covers_blocks( } =20 /* - * Make a dabuf. - * Used for get_buf, read_buf, read_bufr, and reada_buf. + * Convert a struct xfs_bmbt_irec to a struct xfs_buf_map. + * + * For the single map case, it is assumed that the caller has provided a p= ointer + * to a valid xfs_buf_map. For the multiple map case, this function will + * allocate the xfs_buf_map to hold all the maps and replace the caller's = single + * map pointer with the allocated map. */ -int -xfs_da_do_buf( - xfs_trans_t *trans, - xfs_inode_t *dp, - xfs_dablk_t bno, - xfs_daddr_t *mappedbnop, - xfs_dabuf_t **bpp, - int whichfork, - int caller, - inst_t *ra) +static int +xfs_buf_map_from_irec( + struct xfs_mount *mp, + struct xfs_buf_map **mapp, + unsigned int *nmaps, + struct xfs_bmbt_irec *irecs, + unsigned int nirecs) { - xfs_buf_t *bp =3D NULL; - xfs_buf_t **bplist; - int error=3D0; - int i; - xfs_bmbt_irec_t map; - xfs_bmbt_irec_t *mapp; - xfs_daddr_t mappedbno; - xfs_mount_t *mp; - int nbplist=3D0; - int nfsb; - int nmap; - xfs_dabuf_t *rbp; + struct xfs_buf_map *map; + int i; + + ASSERT(*nmaps =3D=3D 1); + ASSERT(nirecs >=3D 1); + + if (nirecs > 1) { + map =3D kmem_zalloc(nirecs * sizeof(struct xfs_buf_map), KM_SLEEP); + if (!map) + return ENOMEM; + *mapp =3D map; + } + + *nmaps =3D nirecs; + map =3D *mapp; + for (i =3D 0; i < *nmaps; i++) { + ASSERT(irecs[i].br_startblock !=3D DELAYSTARTBLOCK && + irecs[i].br_startblock !=3D HOLESTARTBLOCK); + map[i].bm_bn =3D XFS_FSB_TO_DADDR(mp, irecs[i].br_startblock); + map[i].bm_len =3D XFS_FSB_TO_BB(mp, irecs[i].br_blockcount); + } + return 0; +} + +/* + * Map the block we are given ready for reading. There are three possible = return + * values: + * -1 - will be returned if we land in a hole and mappedbno =3D=3D -2 so t= he + * caller knows not to execute a subsequent read. + * 0 - if we mapped the block successfully + * >0 - positive error number if there was an error. + */ +static int +xfs_dabuf_map( + struct xfs_trans *trans, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + int whichfork, + struct xfs_buf_map **map, + int *nmaps) +{ + struct xfs_mount *mp =3D dp->i_mount; + int nfsb; + int error =3D 0; + struct xfs_bmbt_irec irec; + struct xfs_bmbt_irec *irecs =3D &irec; + int nirecs; + + ASSERT(map && *map); + ASSERT(*nmaps =3D=3D 1); =20 - mp =3D dp->i_mount; nfsb =3D (whichfork =3D=3D XFS_DATA_FORK) ? mp->m_dirblkfsbs : 1; - mappedbno =3D *mappedbnop; + /* * Caller doesn't have a mapping. -2 means don't complain * if we land in a hole. @@ -1932,139 +2108,154 @@ xfs_da_do_buf( /* * Optimize the one-block case. */ - if (nfsb =3D=3D 1) { - xfs_fsblock_t fsb; + if (nfsb !=3D 1) + irecs =3D kmem_zalloc(sizeof(irec) * nfsb, KM_SLEEP); =20 - if ((error =3D - xfs_bmapi_single(trans, dp, whichfork, &fsb, - (xfs_fileoff_t)bno))) { - return error; - } - mapp =3D ↦ - if (fsb =3D=3D NULLFSBLOCK) { - nmap =3D 0; - } else { - map.br_startblock =3D fsb; - map.br_startoff =3D (xfs_fileoff_t)bno; - map.br_blockcount =3D 1; - nmap =3D 1; - } - } else { - mapp =3D kmem_alloc(sizeof(*mapp) * nfsb, KM_SLEEP); - nmap =3D nfsb; - if ((error =3D xfs_bmapi(trans, dp, (xfs_fileoff_t)bno, - nfsb, - XFS_BMAPI_METADATA | - xfs_bmapi_aflag(whichfork), - NULL, 0, mapp, &nmap, NULL))) - goto exit0; - } + nirecs =3D nfsb; + error =3D xfs_bmapi_read(dp, (xfs_fileoff_t)bno, nfsb, irecs, + &nirecs, xfs_bmapi_aflag(whichfork)); + if (error) + goto out; } else { - map.br_startblock =3D XFS_DADDR_TO_FSB(mp, mappedbno); - map.br_startoff =3D (xfs_fileoff_t)bno; - map.br_blockcount =3D nfsb; - mapp =3D ↦ - nmap =3D 1; + irecs->br_startblock =3D XFS_DADDR_TO_FSB(mp, mappedbno); + irecs->br_startoff =3D (xfs_fileoff_t)bno; + irecs->br_blockcount =3D nfsb; + irecs->br_state =3D 0; + nirecs =3D 1; } - if (!xfs_da_map_covers_blocks(nmap, mapp, bno, nfsb)) { - error =3D mappedbno =3D=3D -2 ? 0 : XFS_ERROR(EFSCORRUPTED); + + if (!xfs_da_map_covers_blocks(nirecs, irecs, bno, nfsb)) { + error =3D mappedbno =3D=3D -2 ? -1 : XFS_ERROR(EFSCORRUPTED); if (unlikely(error =3D=3D EFSCORRUPTED)) { if (xfs_error_level >=3D XFS_ERRLEVEL_LOW) { - cmn_err(CE_ALERT, "xfs_da_do_buf: bno %lld\n", - (long long)bno); - cmn_err(CE_ALERT, "dir: inode %lld\n", + int i; + xfs_alert(mp, "%s: bno %lld dir: inode %lld", + __func__, (long long)bno, (long long)dp->i_ino); - for (i =3D 0; i < nmap; i++) { - cmn_err(CE_ALERT, - "[%02d] br_startoff %lld br_startblock %lld br_blockcount %lld br_st= ate %d\n", + for (i =3D 0; i < *nmaps; i++) { + xfs_alert(mp, +"[%02d] br_startoff %lld br_startblock %lld br_blockcount %lld br_state %d= ", i, - (long long)mapp[i].br_startoff, - (long long)mapp[i].br_startblock, - (long long)mapp[i].br_blockcount, - mapp[i].br_state); + (long long)irecs[i].br_startoff, + (long long)irecs[i].br_startblock, + (long long)irecs[i].br_blockcount, + irecs[i].br_state); } } XFS_ERROR_REPORT("xfs_da_do_buf(1)", XFS_ERRLEVEL_LOW, mp); } - goto exit0; + goto out; } - if (caller !=3D 3 && nmap > 1) { - bplist =3D kmem_alloc(sizeof(*bplist) * nmap, KM_SLEEP); - nbplist =3D 0; - } else - bplist =3D NULL; - /* - * Turn the mapping(s) into buffer(s). - */ - for (i =3D 0; i < nmap; i++) { - int nmapped; - - mappedbno =3D XFS_FSB_TO_DADDR(mp, mapp[i].br_startblock); - if (i =3D=3D 0) - *mappedbnop =3D mappedbno; - nmapped =3D (int)XFS_FSB_TO_BB(mp, mapp[i].br_blockcount); - switch (caller) { - case 0: - bp =3D xfs_trans_get_buf(trans, mp->m_ddev_targp, - mappedbno, nmapped, 0); - error =3D bp ? XFS_BUF_GETERROR(bp) : XFS_ERROR(EIO); - break; - case 1: - case 2: - bp =3D NULL; - error =3D xfs_trans_read_buf(mp, trans, mp->m_ddev_targp, - mappedbno, nmapped, 0, &bp); - break; - case 3: - xfs_buf_readahead(mp->m_ddev_targp, mappedbno, nmapped); + error =3D xfs_buf_map_from_irec(mp, map, nmaps, irecs, nirecs); +out: + if (irecs !=3D &irec) + kmem_free(irecs); + return error; +} + +/* + * Get a buffer for the dir/attr block. + */ +int +xfs_da_get_buf( + struct xfs_trans *trans, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp, + int whichfork) +{ + struct xfs_buf *bp; + struct xfs_buf_map map; + struct xfs_buf_map *mapp; + int nmap; + int error; + + *bpp =3D NULL; + mapp =3D ↦ + nmap =3D 1; + error =3D xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork, + &mapp, &nmap); + if (error) { + /* mapping a hole is not an error, but we don't continue */ + if (error =3D=3D -1) error =3D 0; - bp =3D NULL; - break; - } - if (error) { - if (bp) - xfs_trans_brelse(trans, bp); - goto exit1; - } - if (!bp) - continue; - if (caller =3D=3D 1) { - if (whichfork =3D=3D XFS_ATTR_FORK) { - XFS_BUF_SET_VTYPE_REF(bp, B_FS_ATTR_BTREE, - XFS_ATTR_BTREE_REF); - } else { - XFS_BUF_SET_VTYPE_REF(bp, B_FS_DIR_BTREE, - XFS_DIR_BTREE_REF); - } - } - if (bplist) { - bplist[nbplist++] =3D bp; - } + goto out_free; } - /* - * Build a dabuf structure. - */ - if (bplist) { - rbp =3D xfs_da_buf_make(nbplist, bplist, ra); - } else if (bp) - rbp =3D xfs_da_buf_make(1, &bp, ra); + + bp =3D xfs_trans_get_buf_map(trans, dp->i_mount->m_ddev_targp, + mapp, nmap, 0); + error =3D bp ? bp->b_error : XFS_ERROR(EIO); + if (error) { + xfs_trans_brelse(trans, bp); + goto out_free; + } + + *bpp =3D bp; + +out_free: + if (mapp !=3D &map) + kmem_free(mapp); + + return error; +} + +/* + * Get a buffer for the dir/attr block, fill in the contents. + */ +int +xfs_da_read_buf( + struct xfs_trans *trans, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp, + int whichfork, + const struct xfs_buf_ops *ops) +{ + struct xfs_buf *bp; + struct xfs_buf_map map; + struct xfs_buf_map *mapp; + int nmap; + int error; + + *bpp =3D NULL; + mapp =3D ↦ + nmap =3D 1; + error =3D xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork, + &mapp, &nmap); + if (error) { + /* mapping a hole is not an error, but we don't continue */ + if (error =3D=3D -1) + error =3D 0; + goto out_free; + } + + error =3D xfs_trans_read_buf_map(dp->i_mount, trans, + dp->i_mount->m_ddev_targp, + mapp, nmap, 0, &bp, ops); + if (error) + goto out_free; + + if (whichfork =3D=3D XFS_ATTR_FORK) + xfs_buf_set_ref(bp, XFS_ATTR_BTREE_REF); else - rbp =3D NULL; + xfs_buf_set_ref(bp, XFS_DIR_BTREE_REF); + /* - * For read_buf, check the magic number. + * This verification code will be moved to a CRC verification callback + * function so just leave it here unchanged until then. */ - if (caller =3D=3D 1) { - xfs_dir2_data_t *data; - xfs_dir2_free_t *free; - xfs_da_blkinfo_t *info; + { + xfs_dir2_data_hdr_t *hdr =3D bp->b_addr; + xfs_dir2_free_t *free =3D bp->b_addr; + xfs_da_blkinfo_t *info =3D bp->b_addr; uint magic, magic1; + struct xfs_mount *mp =3D dp->i_mount; =20 - info =3D rbp->data; - data =3D rbp->data; - free =3D rbp->data; magic =3D be16_to_cpu(info->magic); - magic1 =3D be32_to_cpu(data->hdr.magic); + magic1 =3D be32_to_cpu(hdr->magic); if (unlikely( XFS_TEST_ERROR((magic !=3D XFS_DA_NODE_MAGIC) && (magic !=3D XFS_ATTR_LEAF_MAGIC) && @@ -2072,71 +2263,23 @@ xfs_da_do_buf( (magic !=3D XFS_DIR2_LEAFN_MAGIC) && (magic1 !=3D XFS_DIR2_BLOCK_MAGIC) && (magic1 !=3D XFS_DIR2_DATA_MAGIC) && - (be32_to_cpu(free->hdr.magic) !=3D XFS_DIR2_FREE_MAGIC), + (free->hdr.magic !=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)), mp, XFS_ERRTAG_DA_READ_BUF, XFS_RANDOM_DA_READ_BUF))) { - trace_xfs_da_btree_corrupt(rbp->bps[0], _RET_IP_); + trace_xfs_da_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR("xfs_da_do_buf(2)", XFS_ERRLEVEL_LOW, mp, info); error =3D XFS_ERROR(EFSCORRUPTED); - xfs_da_brelse(trans, rbp); - nbplist =3D 0; - goto exit1; + xfs_trans_brelse(trans, bp); + goto out_free; } } - if (bplist) { - kmem_free(bplist); - } - if (mapp !=3D &map) { - kmem_free(mapp); - } - if (bpp) - *bpp =3D rbp; - return 0; -exit1: - if (bplist) { - for (i =3D 0; i < nbplist; i++) - xfs_trans_brelse(trans, bplist[i]); - kmem_free(bplist); - } -exit0: + *bpp =3D bp; +out_free: if (mapp !=3D &map) kmem_free(mapp); - if (bpp) - *bpp =3D NULL; - return error; -} =20 -/* - * Get a buffer for the dir/attr block. - */ -int -xfs_da_get_buf( - xfs_trans_t *trans, - xfs_inode_t *dp, - xfs_dablk_t bno, - xfs_daddr_t mappedbno, - xfs_dabuf_t **bpp, - int whichfork) -{ - return xfs_da_do_buf(trans, dp, bno, &mappedbno, bpp, whichfork, 0, - (inst_t *)__return_address); -} - -/* - * Get a buffer for the dir/attr block, fill in the contents. - */ -int -xfs_da_read_buf( - xfs_trans_t *trans, - xfs_inode_t *dp, - xfs_dablk_t bno, - xfs_daddr_t mappedbno, - xfs_dabuf_t **bpp, - int whichfork) -{ - return xfs_da_do_buf(trans, dp, bno, &mappedbno, bpp, whichfork, 1, - (inst_t *)__return_address); + return error; } =20 /* @@ -2144,23 +2287,42 @@ xfs_da_read_buf( */ xfs_daddr_t xfs_da_reada_buf( - xfs_trans_t *trans, - xfs_inode_t *dp, - xfs_dablk_t bno, - int whichfork) + struct xfs_trans *trans, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + int whichfork, + const struct xfs_buf_ops *ops) { - xfs_daddr_t rval; + struct xfs_buf_map map; + struct xfs_buf_map *mapp; + int nmap; + int error; =20 - rval =3D -1; - if (xfs_da_do_buf(trans, dp, bno, &rval, NULL, whichfork, 3, - (inst_t *)__return_address)) + mapp =3D ↦ + nmap =3D 1; + error =3D xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork, + &mapp, &nmap); + if (error) { + /* mapping a hole is not an error, but we don't continue */ + if (error =3D=3D -1) + error =3D 0; + goto out_free; + } + + mappedbno =3D mapp[0].bm_bn; + xfs_buf_readahead_map(dp->i_mount->m_ddev_targp, mapp, nmap, ops); + +out_free: + if (mapp !=3D &map) + kmem_free(mapp); + + if (error) return -1; - else - return rval; + return mappedbno; } =20 kmem_zone_t *xfs_da_state_zone; /* anchor for state struct zone */ -kmem_zone_t *xfs_dabuf_zone; /* dabuf zone */ =20 /* * Allocate a dir-state structure. @@ -2180,13 +2342,8 @@ xfs_da_state_kill_altpath(xfs_da_state_t *state) { int i; =20 - for (i =3D 0; i < state->altpath.active; i++) { - if (state->altpath.blk[i].bp) { - if (state->altpath.blk[i].bp !=3D state->path.blk[i].bp) - xfs_da_buf_done(state->altpath.blk[i].bp); - state->altpath.blk[i].bp =3D NULL; - } - } + for (i =3D 0; i < state->altpath.active; i++) + state->altpath.blk[i].bp =3D NULL; state->altpath.active =3D 0; } =20 @@ -2196,244 +2353,9 @@ xfs_da_state_kill_altpath(xfs_da_state_t *state) void xfs_da_state_free(xfs_da_state_t *state) { - int i; - xfs_da_state_kill_altpath(state); - for (i =3D 0; i < state->path.active; i++) { - if (state->path.blk[i].bp) - xfs_da_buf_done(state->path.blk[i].bp); - } - if (state->extravalid && state->extrablk.bp) - xfs_da_buf_done(state->extrablk.bp); #ifdef DEBUG memset((char *)state, 0, sizeof(*state)); #endif /* DEBUG */ kmem_zone_free(xfs_da_state_zone, state); } - -#ifdef XFS_DABUF_DEBUG -xfs_dabuf_t *xfs_dabuf_global_list; -static DEFINE_SPINLOCK(xfs_dabuf_global_lock); -#endif - -/* - * Create a dabuf. - */ -/* ARGSUSED */ -STATIC xfs_dabuf_t * -xfs_da_buf_make(int nbuf, xfs_buf_t **bps, inst_t *ra) -{ - xfs_buf_t *bp; - xfs_dabuf_t *dabuf; - int i; - int off; - - if (nbuf =3D=3D 1) - dabuf =3D kmem_zone_alloc(xfs_dabuf_zone, KM_NOFS); - else - dabuf =3D kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_NOFS); - dabuf->dirty =3D 0; -#ifdef XFS_DABUF_DEBUG - dabuf->ra =3D ra; - dabuf->target =3D XFS_BUF_TARGET(bps[0]); - dabuf->blkno =3D XFS_BUF_ADDR(bps[0]); -#endif - if (nbuf =3D=3D 1) { - dabuf->nbuf =3D 1; - bp =3D bps[0]; - dabuf->bbcount =3D (short)BTOBB(XFS_BUF_COUNT(bp)); - dabuf->data =3D XFS_BUF_PTR(bp); - dabuf->bps[0] =3D bp; - } else { - dabuf->nbuf =3D nbuf; - for (i =3D 0, dabuf->bbcount =3D 0; i < nbuf; i++) { - dabuf->bps[i] =3D bp =3D bps[i]; - dabuf->bbcount +=3D BTOBB(XFS_BUF_COUNT(bp)); - } - dabuf->data =3D kmem_alloc(BBTOB(dabuf->bbcount), KM_SLEEP); - for (i =3D off =3D 0; i < nbuf; i++, off +=3D XFS_BUF_COUNT(bp)) { - bp =3D bps[i]; - memcpy((char *)dabuf->data + off, XFS_BUF_PTR(bp), - XFS_BUF_COUNT(bp)); - } - } -#ifdef XFS_DABUF_DEBUG - { - xfs_dabuf_t *p; - - spin_lock(&xfs_dabuf_global_lock); - for (p =3D xfs_dabuf_global_list; p; p =3D p->next) { - ASSERT(p->blkno !=3D dabuf->blkno || - p->target !=3D dabuf->target); - } - dabuf->prev =3D NULL; - if (xfs_dabuf_global_list) - xfs_dabuf_global_list->prev =3D dabuf; - dabuf->next =3D xfs_dabuf_global_list; - xfs_dabuf_global_list =3D dabuf; - spin_unlock(&xfs_dabuf_global_lock); - } -#endif - return dabuf; -} - -/* - * Un-dirty a dabuf. - */ -STATIC void -xfs_da_buf_clean(xfs_dabuf_t *dabuf) -{ - xfs_buf_t *bp; - int i; - int off; - - if (dabuf->dirty) { - ASSERT(dabuf->nbuf > 1); - dabuf->dirty =3D 0; - for (i =3D off =3D 0; i < dabuf->nbuf; - i++, off +=3D XFS_BUF_COUNT(bp)) { - bp =3D dabuf->bps[i]; - memcpy(XFS_BUF_PTR(bp), (char *)dabuf->data + off, - XFS_BUF_COUNT(bp)); - } - } -} - -/* - * Release a dabuf. - */ -void -xfs_da_buf_done(xfs_dabuf_t *dabuf) -{ - ASSERT(dabuf); - ASSERT(dabuf->nbuf && dabuf->data && dabuf->bbcount && dabuf->bps[0]); - if (dabuf->dirty) - xfs_da_buf_clean(dabuf); - if (dabuf->nbuf > 1) - kmem_free(dabuf->data); -#ifdef XFS_DABUF_DEBUG - { - spin_lock(&xfs_dabuf_global_lock); - if (dabuf->prev) - dabuf->prev->next =3D dabuf->next; - else - xfs_dabuf_global_list =3D dabuf->next; - if (dabuf->next) - dabuf->next->prev =3D dabuf->prev; - spin_unlock(&xfs_dabuf_global_lock); - } - memset(dabuf, 0, XFS_DA_BUF_SIZE(dabuf->nbuf)); -#endif - if (dabuf->nbuf =3D=3D 1) - kmem_zone_free(xfs_dabuf_zone, dabuf); - else - kmem_free(dabuf); -} - -/* - * Log transaction from a dabuf. - */ -void -xfs_da_log_buf(xfs_trans_t *tp, xfs_dabuf_t *dabuf, uint first, uint last) -{ - xfs_buf_t *bp; - uint f; - int i; - uint l; - int off; - - ASSERT(dabuf->nbuf && dabuf->data && dabuf->bbcount && dabuf->bps[0]); - if (dabuf->nbuf =3D=3D 1) { - ASSERT(dabuf->data =3D=3D (void *)XFS_BUF_PTR(dabuf->bps[0])); - xfs_trans_log_buf(tp, dabuf->bps[0], first, last); - return; - } - dabuf->dirty =3D 1; - ASSERT(first <=3D last); - for (i =3D off =3D 0; i < dabuf->nbuf; i++, off +=3D XFS_BUF_COUNT(bp)) { - bp =3D dabuf->bps[i]; - f =3D off; - l =3D f + XFS_BUF_COUNT(bp) - 1; - if (f < first) - f =3D first; - if (l > last) - l =3D last; - if (f <=3D l) - xfs_trans_log_buf(tp, bp, f - off, l - off); - /* - * B_DONE is set by xfs_trans_log buf. - * If we don't set it on a new buffer (get not read) - * then if we don't put anything in the buffer it won't - * be set, and at commit it it released into the cache, - * and then a read will fail. - */ - else if (!(XFS_BUF_ISDONE(bp))) - XFS_BUF_DONE(bp); - } - ASSERT(last < off); -} - -/* - * Release dabuf from a transaction. - * Have to free up the dabuf before the buffers are released, - * since the synchronization on the dabuf is really the lock on the buffer. - */ -void -xfs_da_brelse(xfs_trans_t *tp, xfs_dabuf_t *dabuf) -{ - xfs_buf_t *bp; - xfs_buf_t **bplist; - int i; - int nbuf; - - ASSERT(dabuf->nbuf && dabuf->data && dabuf->bbcount && dabuf->bps[0]); - if ((nbuf =3D dabuf->nbuf) =3D=3D 1) { - bplist =3D &bp; - bp =3D dabuf->bps[0]; - } else { - bplist =3D kmem_alloc(nbuf * sizeof(*bplist), KM_SLEEP); - memcpy(bplist, dabuf->bps, nbuf * sizeof(*bplist)); - } - xfs_da_buf_done(dabuf); - for (i =3D 0; i < nbuf; i++) - xfs_trans_brelse(tp, bplist[i]); - if (bplist !=3D &bp) - kmem_free(bplist); -} - -/* - * Invalidate dabuf from a transaction. - */ -void -xfs_da_binval(xfs_trans_t *tp, xfs_dabuf_t *dabuf) -{ - xfs_buf_t *bp; - xfs_buf_t **bplist; - int i; - int nbuf; - - ASSERT(dabuf->nbuf && dabuf->data && dabuf->bbcount && dabuf->bps[0]); - if ((nbuf =3D dabuf->nbuf) =3D=3D 1) { - bplist =3D &bp; - bp =3D dabuf->bps[0]; - } else { - bplist =3D kmem_alloc(nbuf * sizeof(*bplist), KM_SLEEP); - memcpy(bplist, dabuf->bps, nbuf * sizeof(*bplist)); - } - xfs_da_buf_done(dabuf); - for (i =3D 0; i < nbuf; i++) - xfs_trans_binval(tp, bplist[i]); - if (bplist !=3D &bp) - kmem_free(bplist); -} - -/* - * Get the first daddr from a dabuf. - */ -xfs_daddr_t -xfs_da_blkno(xfs_dabuf_t *dabuf) -{ - ASSERT(dabuf->nbuf); - ASSERT(dabuf->data); - return XFS_BUF_ADDR(dabuf->bps[0]); -} diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c index d475118..6a4027f 100644 --- a/libxfs/xfs_dir2.c +++ b/libxfs/xfs_dir2.c @@ -98,15 +98,15 @@ int xfs_dir_isempty( xfs_inode_t *dp) { - xfs_dir2_sf_t *sfp; + xfs_dir2_sf_hdr_t *sfp; =20 - ASSERT((dp->i_d.di_mode & S_IFMT) =3D=3D S_IFDIR); + ASSERT(S_ISDIR(dp->i_d.di_mode)); if (dp->i_d.di_size =3D=3D 0) /* might happen during shutdown. */ return 1; if (dp->i_d.di_size > XFS_IFORK_DSIZE(dp)) return 0; - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - return !sfp->hdr.count; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + return !sfp->count; } =20 /* @@ -135,7 +135,7 @@ xfs_dir_ino_validate( XFS_AGINO_TO_INO(mp, agno, agino) =3D=3D ino; if (unlikely(XFS_TEST_ERROR(!ino_ok, mp, XFS_ERRTAG_DIR_INO_VALIDATE, XFS_RANDOM_DIR_INO_VALIDATE))) { - xfs_fs_cmn_err(CE_WARN, mp, "Invalid inode number 0x%Lx", + xfs_warn(mp, "Invalid inode number 0x%Lx", (unsigned long long) ino); XFS_ERROR_REPORT("xfs_dir_ino_validate", XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); @@ -158,7 +158,7 @@ xfs_dir_init( memset((char *)&args, 0, sizeof(args)); args.dp =3D dp; args.trans =3D tp; - ASSERT((dp->i_d.di_mode & S_IFMT) =3D=3D S_IFDIR); + ASSERT(S_ISDIR(dp->i_d.di_mode)); if ((error =3D xfs_dir_ino_validate(tp->t_mountp, pdp->i_ino))) return error; return xfs_dir2_sf_create(&args, pdp->i_ino); @@ -181,7 +181,7 @@ xfs_dir_createname( int rval; int v; /* type-checking value */ =20 - ASSERT((dp->i_d.di_mode & S_IFMT) =3D=3D S_IFDIR); + ASSERT(S_ISDIR(dp->i_d.di_mode)); if ((rval =3D xfs_dir_ino_validate(tp->t_mountp, inum))) return rval; XFS_STATS_INC(xs_dir_create); @@ -257,7 +257,7 @@ xfs_dir_lookup( int rval; int v; /* type-checking value */ =20 - ASSERT((dp->i_d.di_mode & S_IFMT) =3D=3D S_IFDIR); + ASSERT(S_ISDIR(dp->i_d.di_mode)); XFS_STATS_INC(xs_dir_lookup); =20 memset(&args, 0, sizeof(xfs_da_args_t)); @@ -312,7 +312,7 @@ xfs_dir_removename( int rval; int v; /* type-checking value */ =20 - ASSERT((dp->i_d.di_mode & S_IFMT) =3D=3D S_IFDIR); + ASSERT(S_ISDIR(dp->i_d.di_mode)); XFS_STATS_INC(xs_dir_remove); =20 memset(&args, 0, sizeof(xfs_da_args_t)); @@ -359,7 +359,7 @@ xfs_dir_replace( int rval; int v; /* type-checking value */ =20 - ASSERT((dp->i_d.di_mode & S_IFMT) =3D=3D S_IFDIR); + ASSERT(S_ISDIR(dp->i_d.di_mode)); =20 if ((rval =3D xfs_dir_ino_validate(tp->t_mountp, inum))) return rval; @@ -397,129 +397,34 @@ xfs_dir_replace( =20 /* * Add a block to the directory. - * This routine is for data and free blocks, not leaf/node blocks - * which are handled by xfs_da_grow_inode. + * + * This routine is for data and free blocks, not leaf/node blocks which are + * handled by xfs_da_grow_inode. */ int xfs_dir2_grow_inode( - xfs_da_args_t *args, - int space, /* v2 dir's space XFS_DIR2_xxx_SPACE */ - xfs_dir2_db_t *dbp) /* out: block number added */ + struct xfs_da_args *args, + int space, /* v2 dir's space XFS_DIR2_xxx_SPACE */ + xfs_dir2_db_t *dbp) /* out: block number added */ { - xfs_fileoff_t bno; /* directory offset of new block */ - int count; /* count of filesystem blocks */ - xfs_inode_t *dp; /* incore directory inode */ - int error; - int got; /* blocks actually mapped */ - int i; - xfs_bmbt_irec_t map; /* single structure for bmap */ - int mapi; /* mapping index */ - xfs_bmbt_irec_t *mapp; /* bmap mapping structure(s) */ - xfs_mount_t *mp; - int nmap; /* number of bmap entries */ - xfs_trans_t *tp; - xfs_drfsbno_t nblks; + struct xfs_inode *dp =3D args->dp; + struct xfs_mount *mp =3D dp->i_mount; + xfs_fileoff_t bno; /* directory offset of new block */ + int count; /* count of filesystem blocks */ + int error; =20 trace_xfs_dir2_grow_inode(args, space); =20 - dp =3D args->dp; - tp =3D args->trans; - mp =3D dp->i_mount; - nblks =3D dp->i_d.di_nblocks; /* * Set lowest possible block in the space requested. */ bno =3D XFS_B_TO_FSBT(mp, space * XFS_DIR2_SPACE_SIZE); count =3D mp->m_dirblkfsbs; - /* - * Find the first hole for our block. - */ - if ((error =3D xfs_bmap_first_unused(tp, dp, count, &bno, XFS_DATA_FORK))) - return error; - nmap =3D 1; - ASSERT(args->firstblock !=3D NULL); - /* - * Try mapping the new block contiguously (one extent). - */ - if ((error =3D xfs_bmapi(tp, dp, bno, count, - XFS_BMAPI_WRITE|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG, - args->firstblock, args->total, &map, &nmap, - args->flist))) - return error; - ASSERT(nmap <=3D 1); - if (nmap =3D=3D 1) { - mapp =3D ↦ - mapi =3D 1; - } - /* - * Didn't work and this is a multiple-fsb directory block. - * Try again with contiguous flag turned on. - */ - else if (nmap =3D=3D 0 && count > 1) { - xfs_fileoff_t b; /* current file offset */ =20 - /* - * Space for maximum number of mappings. - */ - mapp =3D kmem_alloc(sizeof(*mapp) * count, KM_SLEEP); - /* - * Iterate until we get to the end of our block. - */ - for (b =3D bno, mapi =3D 0; b < bno + count; ) { - int c; /* current fsb count */ - - /* - * Can't map more than MAX_NMAP at once. - */ - nmap =3D MIN(XFS_BMAP_MAX_NMAP, count); - c =3D (int)(bno + count - b); - if ((error =3D xfs_bmapi(tp, dp, b, c, - XFS_BMAPI_WRITE|XFS_BMAPI_METADATA, - args->firstblock, args->total, - &mapp[mapi], &nmap, args->flist))) { - kmem_free(mapp); - return error; - } - if (nmap < 1) - break; - /* - * Add this bunch into our table, go to the next offset. - */ - mapi +=3D nmap; - b =3D mapp[mapi - 1].br_startoff + - mapp[mapi - 1].br_blockcount; - } - } - /* - * Didn't work. - */ - else { - mapi =3D 0; - mapp =3D NULL; - } - /* - * See how many fsb's we got. - */ - for (i =3D 0, got =3D 0; i < mapi; i++) - got +=3D mapp[i].br_blockcount; - /* - * Didn't get enough fsb's, or the first/last block's are wrong. - */ - if (got !=3D count || mapp[0].br_startoff !=3D bno || - mapp[mapi - 1].br_startoff + mapp[mapi - 1].br_blockcount !=3D - bno + count) { - if (mapp !=3D &map) - kmem_free(mapp); - return XFS_ERROR(ENOSPC); - } - /* - * Done with the temporary mapping table. - */ - if (mapp !=3D &map) - kmem_free(mapp); + error =3D xfs_da_grow_inode_int(args, &bno, count); + if (error) + return error; =20 - /* account for newly allocated blocks in reserved blocks total */ - args->total -=3D dp->i_d.di_nblocks - nblks; *dbp =3D xfs_dir2_da_to_db(mp, (xfs_dablk_t)bno); =20 /* @@ -531,7 +436,7 @@ xfs_dir2_grow_inode( size =3D XFS_FSB_TO_B(mp, bno + count); if (size > dp->i_d.di_size) { dp->i_d.di_size =3D size; - xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); + xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE); } } return 0; @@ -588,7 +493,7 @@ int xfs_dir2_shrink_inode( xfs_da_args_t *args, xfs_dir2_db_t db, - xfs_dabuf_t *bp) + struct xfs_buf *bp) { xfs_fileoff_t bno; /* directory file offset */ xfs_dablk_t da; /* directory file offset */ @@ -630,7 +535,7 @@ xfs_dir2_shrink_inode( /* * Invalidate the buffer from the transaction. */ - xfs_da_binval(tp, bp); + xfs_trans_binval(tp, bp); /* * If it's not a data block, we're done. */ diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index b614ea6..7397faa 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -21,10 +21,10 @@ /* * Local function prototypes. */ -static void xfs_dir2_block_log_leaf(xfs_trans_t *tp, xfs_dabuf_t *bp, int = first, - int last); -static void xfs_dir2_block_log_tail(xfs_trans_t *tp, xfs_dabuf_t *bp); -static int xfs_dir2_block_lookup_int(xfs_da_args_t *args, xfs_dabuf_t **bp= p, +static void xfs_dir2_block_log_leaf(xfs_trans_t *tp, struct xfs_buf *bp, + int first, int last); +static void xfs_dir2_block_log_tail(xfs_trans_t *tp, struct xfs_buf *bp); +static int xfs_dir2_block_lookup_int(xfs_da_args_t *args, struct xfs_buf *= *bpp, int *entno); static int xfs_dir2_block_sort(const void *a, const void *b); =20 @@ -40,6 +40,214 @@ xfs_dir_startup(void) xfs_dir_hash_dotdot =3D xfs_da_hashname((unsigned char *)"..", 2); } =20 +static void +xfs_dir2_block_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_dir2_data_hdr *hdr =3D bp->b_addr; + int block_ok =3D 0; + + block_ok =3D hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); + block_ok =3D block_ok && __xfs_dir2_data_check(NULL, bp) =3D=3D 0; + + if (!block_ok) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_dir2_block_read_verify( + struct xfs_buf *bp) +{ + xfs_dir2_block_verify(bp); +} + +static void +xfs_dir2_block_write_verify( + struct xfs_buf *bp) +{ + xfs_dir2_block_verify(bp); +} + +const struct xfs_buf_ops xfs_dir2_block_buf_ops =3D { + .verify_read =3D xfs_dir2_block_read_verify, + .verify_write =3D xfs_dir2_block_write_verify, +}; + +static int +xfs_dir2_block_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + struct xfs_buf **bpp) +{ + struct xfs_mount *mp =3D dp->i_mount; + + return xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, + XFS_DATA_FORK, &xfs_dir2_block_buf_ops); +} + +static void +xfs_dir2_block_need_space( + struct xfs_dir2_data_hdr *hdr, + struct xfs_dir2_block_tail *btp, + struct xfs_dir2_leaf_entry *blp, + __be16 **tagpp, + struct xfs_dir2_data_unused **dupp, + struct xfs_dir2_data_unused **enddupp, + int *compact, + int len) +{ + struct xfs_dir2_data_free *bf; + __be16 *tagp =3D NULL; + struct xfs_dir2_data_unused *dup =3D NULL; + struct xfs_dir2_data_unused *enddup =3D NULL; + + *compact =3D 0; + bf =3D hdr->bestfree; + + /* + * If there are stale entries we'll use one for the leaf. + */ + if (btp->stale) { + if (be16_to_cpu(bf[0].length) >=3D len) { + /* + * The biggest entry enough to avoid compaction. + */ + dup =3D (xfs_dir2_data_unused_t *) + ((char *)hdr + be16_to_cpu(bf[0].offset)); + goto out; + } + + /* + * Will need to compact to make this work. + * Tag just before the first leaf entry. + */ + *compact =3D 1; + tagp =3D (__be16 *)blp - 1; + + /* Data object just before the first leaf entry. */ + dup =3D (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); + + /* + * If it's not free then the data will go where the + * leaf data starts now, if it works at all. + */ + if (be16_to_cpu(dup->freetag) =3D=3D XFS_DIR2_DATA_FREE_TAG) { + if (be16_to_cpu(dup->length) + (be32_to_cpu(btp->stale) - 1) * + (uint)sizeof(*blp) < len) + dup =3D NULL; + } else if ((be32_to_cpu(btp->stale) - 1) * (uint)sizeof(*blp) < len) + dup =3D NULL; + else + dup =3D (xfs_dir2_data_unused_t *)blp; + goto out; + } + + /* + * no stale entries, so just use free space. + * Tag just before the first leaf entry. + */ + tagp =3D (__be16 *)blp - 1; + + /* Data object just before the first leaf entry. */ + enddup =3D (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); + + /* + * If it's not free then can't do this add without cleaning up: + * the space before the first leaf entry needs to be free so it + * can be expanded to hold the pointer to the new entry. + */ + if (be16_to_cpu(enddup->freetag) =3D=3D XFS_DIR2_DATA_FREE_TAG) { + /* + * Check out the biggest freespace and see if it's the same one. + */ + dup =3D (xfs_dir2_data_unused_t *) + ((char *)hdr + be16_to_cpu(bf[0].offset)); + if (dup !=3D enddup) { + /* + * Not the same free entry, just check its length. + */ + if (be16_to_cpu(dup->length) < len) + dup =3D NULL; + goto out; + } + + /* + * It is the biggest freespace, can it hold the leaf too? + */ + if (be16_to_cpu(dup->length) < len + (uint)sizeof(*blp)) { + /* + * Yes, use the second-largest entry instead if it works. + */ + if (be16_to_cpu(bf[1].length) >=3D len) + dup =3D (xfs_dir2_data_unused_t *) + ((char *)hdr + be16_to_cpu(bf[1].offset)); + else + dup =3D NULL; + } + } +out: + *tagpp =3D tagp; + *dupp =3D dup; + *enddupp =3D enddup; +} + +/* + * compact the leaf entries. + * Leave the highest-numbered stale entry stale. + * XXX should be the one closest to mid but mid is not yet computed. + */ +static void +xfs_dir2_block_compact( + struct xfs_trans *tp, + struct xfs_buf *bp, + struct xfs_dir2_data_hdr *hdr, + struct xfs_dir2_block_tail *btp, + struct xfs_dir2_leaf_entry *blp, + int *needlog, + int *lfloghigh, + int *lfloglow) +{ + int fromidx; /* source leaf index */ + int toidx; /* target leaf index */ + int needscan =3D 0; + int highstale; /* high stale index */ + + fromidx =3D toidx =3D be32_to_cpu(btp->count) - 1; + highstale =3D *lfloghigh =3D -1; + for (; fromidx >=3D 0; fromidx--) { + if (blp[fromidx].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) { + if (highstale =3D=3D -1) + highstale =3D toidx; + else { + if (*lfloghigh =3D=3D -1) + *lfloghigh =3D toidx; + continue; + } + } + if (fromidx < toidx) + blp[toidx] =3D blp[fromidx]; + toidx--; + } + *lfloglow =3D toidx + 1 - (be32_to_cpu(btp->stale) - 1); + *lfloghigh -=3D be32_to_cpu(btp->stale) - 1; + be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1)); + xfs_dir2_data_make_free(tp, bp, + (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), + (xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)), + needlog, &needscan); + blp +=3D be32_to_cpu(btp->stale) - 1; + btp->stale =3D cpu_to_be32(1); + /* + * If we now need to rebuild the bestfree map, do so. + * This needs to happen before the next call to use_free. + */ + if (needscan) + xfs_dir2_data_freescan(tp->t_mountp, hdr, needlog); +} + /* * Add an entry to a block directory. */ @@ -47,10 +255,9 @@ int /* error */ xfs_dir2_block_addname( xfs_da_args_t *args) /* directory op arguments */ { - xfs_dir2_data_free_t *bf; /* bestfree table in block */ - xfs_dir2_block_t *block; /* directory block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ - xfs_dabuf_t *bp; /* buffer for block */ + struct xfs_buf *bp; /* buffer for block */ xfs_dir2_block_tail_t *btp; /* block tail */ int compact; /* need to compact leaf ents */ xfs_dir2_data_entry_t *dep; /* block data entry */ @@ -78,203 +285,72 @@ xfs_dir2_block_addname( dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; - /* - * Read the (one and only) directory block into dabuf bp. - */ - if ((error =3D - xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &bp, XFS_DATA_FORK))) { + + /* Read the (one and only) directory block into bp. */ + error =3D xfs_dir2_block_read(tp, dp, &bp); + if (error) return error; - } - ASSERT(bp !=3D NULL); - block =3D bp->data; - /* - * Check the magic number, corrupted if wrong. - */ - if (unlikely(be32_to_cpu(block->hdr.magic) !=3D XFS_DIR2_BLOCK_MAGIC)) { - XFS_CORRUPTION_ERROR("xfs_dir2_block_addname", - XFS_ERRLEVEL_LOW, mp, block); - xfs_da_brelse(tp, bp); - return XFS_ERROR(EFSCORRUPTED); - } + len =3D xfs_dir2_data_entsize(args->namelen); + /* * Set up pointers to parts of the block. */ - bf =3D block->hdr.bestfree; - btp =3D xfs_dir2_block_tail_p(mp, block); + hdr =3D bp->b_addr; + btp =3D xfs_dir2_block_tail_p(mp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); + /* - * No stale entries? Need space for entry and new leaf. - */ - if (!btp->stale) { - /* - * Tag just before the first leaf entry. - */ - tagp =3D (__be16 *)blp - 1; - /* - * Data object just before the first leaf entry. - */ - enddup =3D (xfs_dir2_data_unused_t *)((char *)block + be16_to_cpu(*tagp)= ); - /* - * If it's not free then can't do this add without cleaning up: - * the space before the first leaf entry needs to be free so it - * can be expanded to hold the pointer to the new entry. - */ - if (be16_to_cpu(enddup->freetag) !=3D XFS_DIR2_DATA_FREE_TAG) - dup =3D enddup =3D NULL; - /* - * Check out the biggest freespace and see if it's the same one. - */ - else { - dup =3D (xfs_dir2_data_unused_t *) - ((char *)block + be16_to_cpu(bf[0].offset)); - if (dup =3D=3D enddup) { - /* - * It is the biggest freespace, is it too small - * to hold the new leaf too? - */ - if (be16_to_cpu(dup->length) < len + (uint)sizeof(*blp)) { - /* - * Yes, we use the second-largest - * entry instead if it works. - */ - if (be16_to_cpu(bf[1].length) >=3D len) - dup =3D (xfs_dir2_data_unused_t *) - ((char *)block + - be16_to_cpu(bf[1].offset)); - else - dup =3D NULL; - } - } else { - /* - * Not the same free entry, - * just check its length. - */ - if (be16_to_cpu(dup->length) < len) { - dup =3D NULL; - } - } - } - compact =3D 0; - } - /* - * If there are stale entries we'll use one for the leaf. - * Is the biggest entry enough to avoid compaction? + * Find out if we can reuse stale entries or whether we need extra + * space for entry and new leaf. */ - else if (be16_to_cpu(bf[0].length) >=3D len) { - dup =3D (xfs_dir2_data_unused_t *) - ((char *)block + be16_to_cpu(bf[0].offset)); - compact =3D 0; - } + xfs_dir2_block_need_space(hdr, btp, blp, &tagp, &dup, + &enddup, &compact, len); + /* - * Will need to compact to make this work. + * Done everything we need for a space check now. */ - else { - /* - * Tag just before the first leaf entry. - */ - tagp =3D (__be16 *)blp - 1; - /* - * Data object just before the first leaf entry. - */ - dup =3D (xfs_dir2_data_unused_t *)((char *)block + be16_to_cpu(*tagp)); - /* - * If it's not free then the data will go where the - * leaf data starts now, if it works at all. - */ - if (be16_to_cpu(dup->freetag) =3D=3D XFS_DIR2_DATA_FREE_TAG) { - if (be16_to_cpu(dup->length) + (be32_to_cpu(btp->stale) - 1) * - (uint)sizeof(*blp) < len) - dup =3D NULL; - } else if ((be32_to_cpu(btp->stale) - 1) * (uint)sizeof(*blp) < len) - dup =3D NULL; - else - dup =3D (xfs_dir2_data_unused_t *)blp; - compact =3D 1; + if (args->op_flags & XFS_DA_OP_JUSTCHECK) { + xfs_trans_brelse(tp, bp); + if (!dup) + return XFS_ERROR(ENOSPC); + return 0; } - /* - * If this isn't a real add, we're done with the buffer. - */ - if (args->op_flags & XFS_DA_OP_JUSTCHECK) - xfs_da_brelse(tp, bp); + /* * If we don't have space for the new entry & leaf ... */ if (!dup) { - /* - * Not trying to actually do anything, or don't have - * a space reservation: return no-space. - */ - if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || args->total =3D=3D 0) + /* Don't have a space reservation: return no-space. */ + if (args->total =3D=3D 0) return XFS_ERROR(ENOSPC); /* * Convert to the next larger format. * Then add the new entry in that format. */ error =3D xfs_dir2_block_to_leaf(args, bp); - xfs_da_buf_done(bp); if (error) return error; return xfs_dir2_leaf_addname(args); } - /* - * Just checking, and it would work, so say so. - */ - if (args->op_flags & XFS_DA_OP_JUSTCHECK) - return 0; + needlog =3D needscan =3D 0; + /* * If need to compact the leaf entries, do it now. - * Leave the highest-numbered stale entry stale. - * XXX should be the one closest to mid but mid is not yet computed. */ - if (compact) { - int fromidx; /* source leaf index */ - int toidx; /* target leaf index */ - - for (fromidx =3D toidx =3D be32_to_cpu(btp->count) - 1, - highstale =3D lfloghigh =3D -1; - fromidx >=3D 0; - fromidx--) { - if (be32_to_cpu(blp[fromidx].address) =3D=3D XFS_DIR2_NULL_DATAPTR) { - if (highstale =3D=3D -1) - highstale =3D toidx; - else { - if (lfloghigh =3D=3D -1) - lfloghigh =3D toidx; - continue; - } - } - if (fromidx < toidx) - blp[toidx] =3D blp[fromidx]; - toidx--; - } - lfloglow =3D toidx + 1 - (be32_to_cpu(btp->stale) - 1); - lfloghigh -=3D be32_to_cpu(btp->stale) - 1; - be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1)); - xfs_dir2_data_make_free(tp, bp, - (xfs_dir2_data_aoff_t)((char *)blp - (char *)block), - (xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)), - &needlog, &needscan); - blp +=3D be32_to_cpu(btp->stale) - 1; - btp->stale =3D cpu_to_be32(1); + if (compact) + xfs_dir2_block_compact(tp, bp, hdr, btp, blp, &needlog, + &lfloghigh, &lfloglow); + else if (btp->stale) { /* - * If we now need to rebuild the bestfree map, do so. - * This needs to happen before the next call to use_free. + * Set leaf logging boundaries to impossible state. + * For the no-stale case they're set explicitly. */ - if (needscan) { - xfs_dir2_data_freescan(mp, (xfs_dir2_data_t *)block, &needlog); - needscan =3D 0; - } - } - /* - * Set leaf logging boundaries to impossible state. - * For the no-stale case they're set explicitly. - */ - else if (btp->stale) { lfloglow =3D be32_to_cpu(btp->count); lfloghigh =3D -1; } + /* * Find the slot that's first lower than our hash value, -1 if none. */ @@ -299,7 +375,7 @@ xfs_dir2_block_addname( */ xfs_dir2_data_use_free(tp, bp, enddup, (xfs_dir2_data_aoff_t) - ((char *)enddup - (char *)block + be16_to_cpu(enddup->length) - + ((char *)enddup - (char *)hdr + be16_to_cpu(enddup->length) - sizeof(*blp)), (xfs_dir2_data_aoff_t)sizeof(*blp), &needlog, &needscan); @@ -312,8 +388,7 @@ xfs_dir2_block_addname( * This needs to happen before the next call to use_free. */ if (needscan) { - xfs_dir2_data_freescan(mp, (xfs_dir2_data_t *)block, - &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); needscan =3D 0; } /* @@ -334,12 +409,14 @@ xfs_dir2_block_addname( else { for (lowstale =3D mid; lowstale >=3D 0 && - be32_to_cpu(blp[lowstale].address) !=3D XFS_DIR2_NULL_DATAPTR; + blp[lowstale].address !=3D + cpu_to_be32(XFS_DIR2_NULL_DATAPTR); lowstale--) continue; for (highstale =3D mid + 1; highstale < be32_to_cpu(btp->count) && - be32_to_cpu(blp[highstale].address) !=3D XFS_DIR2_NULL_DATAPTR && + blp[highstale].address !=3D + cpu_to_be32(XFS_DIR2_NULL_DATAPTR) && (lowstale < 0 || mid - lowstale > highstale - mid); highstale++) continue; @@ -378,13 +455,13 @@ xfs_dir2_block_addname( */ blp[mid].hashval =3D cpu_to_be32(args->hashval); blp[mid].address =3D cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, - (char *)dep - (char *)block)); + (char *)dep - (char *)hdr)); xfs_dir2_block_log_leaf(tp, bp, lfloglow, lfloghigh); /* * Mark space for the data entry used. */ xfs_dir2_data_use_free(tp, bp, dup, - (xfs_dir2_data_aoff_t)((char *)dup - (char *)block), + (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), (xfs_dir2_data_aoff_t)len, &needlog, &needscan); /* * Create the new data entry. @@ -393,18 +470,17 @@ xfs_dir2_block_addname( dep->namelen =3D args->namelen; memcpy(dep->name, args->name, args->namelen); tagp =3D xfs_dir2_data_entry_tag_p(dep); - *tagp =3D cpu_to_be16((char *)dep - (char *)block); + *tagp =3D cpu_to_be16((char *)dep - (char *)hdr); /* * Clean up the bestfree array and log the header, tail, and entry. */ if (needscan) - xfs_dir2_data_freescan(mp, (xfs_dir2_data_t *)block, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, bp); xfs_dir2_block_log_tail(tp, bp); xfs_dir2_data_log_entry(tp, bp, dep); xfs_dir2_data_check(dp, bp); - xfs_da_buf_done(bp); return 0; } =20 @@ -414,21 +490,18 @@ xfs_dir2_block_addname( static void xfs_dir2_block_log_leaf( xfs_trans_t *tp, /* transaction structure */ - xfs_dabuf_t *bp, /* block buffer */ + struct xfs_buf *bp, /* block buffer */ int first, /* index of first logged leaf */ int last) /* index of last logged leaf */ { - xfs_dir2_block_t *block; /* directory block structure */ - xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ - xfs_dir2_block_tail_t *btp; /* block tail */ - xfs_mount_t *mp; /* filesystem mount point */ + xfs_dir2_data_hdr_t *hdr =3D bp->b_addr; + xfs_dir2_leaf_entry_t *blp; + xfs_dir2_block_tail_t *btp; =20 - mp =3D tp->t_mountp; - block =3D bp->data; - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(tp->t_mountp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); - xfs_da_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)block), - (uint)((char *)&blp[last + 1] - (char *)block - 1)); + xfs_trans_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)hdr), + (uint)((char *)&blp[last + 1] - (char *)hdr - 1)); } =20 /* @@ -437,17 +510,14 @@ xfs_dir2_block_log_leaf( static void xfs_dir2_block_log_tail( xfs_trans_t *tp, /* transaction structure */ - xfs_dabuf_t *bp) /* block buffer */ + struct xfs_buf *bp) /* block buffer */ { - xfs_dir2_block_t *block; /* directory block structure */ - xfs_dir2_block_tail_t *btp; /* block tail */ - xfs_mount_t *mp; /* filesystem mount point */ + xfs_dir2_data_hdr_t *hdr =3D bp->b_addr; + xfs_dir2_block_tail_t *btp; =20 - mp =3D tp->t_mountp; - block =3D bp->data; - btp =3D xfs_dir2_block_tail_p(mp, block); - xfs_da_log_buf(tp, bp, (uint)((char *)btp - (char *)block), - (uint)((char *)(btp + 1) - (char *)block - 1)); + btp =3D xfs_dir2_block_tail_p(tp->t_mountp, hdr); + xfs_trans_log_buf(tp, bp, (uint)((char *)btp - (char *)hdr), + (uint)((char *)(btp + 1) - (char *)hdr - 1)); } =20 /* @@ -458,9 +528,9 @@ int /* error */ xfs_dir2_block_lookup( xfs_da_args_t *args) /* dir lookup arguments */ { - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ - xfs_dabuf_t *bp; /* block buffer */ + struct xfs_buf *bp; /* block buffer */ xfs_dir2_block_tail_t *btp; /* block tail */ xfs_dir2_data_entry_t *dep; /* block data entry */ xfs_inode_t *dp; /* incore inode */ @@ -478,21 +548,21 @@ xfs_dir2_block_lookup( return error; dp =3D args->dp; mp =3D dp->i_mount; - block =3D bp->data; + hdr =3D bp->b_addr; xfs_dir2_data_check(dp, bp); - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(mp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); /* * Get the offset from the leaf entry, to point to the data. */ - dep =3D (xfs_dir2_data_entry_t *)((char *)block + + dep =3D (xfs_dir2_data_entry_t *)((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); /* * Fill in inode number, CI name if appropriate, release the block. */ args->inumber =3D be64_to_cpu(dep->inumber); error =3D xfs_dir_cilookup_result(args, dep->name, dep->namelen); - xfs_da_brelse(args->trans, bp); + xfs_trans_brelse(args->trans, bp); return XFS_ERROR(error); } =20 @@ -502,13 +572,13 @@ xfs_dir2_block_lookup( static int /* error */ xfs_dir2_block_lookup_int( xfs_da_args_t *args, /* dir lookup arguments */ - xfs_dabuf_t **bpp, /* returned block buffer */ + struct xfs_buf **bpp, /* returned block buffer */ int *entno) /* returned entry number */ { xfs_dir2_dataptr_t addr; /* data entry address */ - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ - xfs_dabuf_t *bp; /* block buffer */ + struct xfs_buf *bp; /* block buffer */ xfs_dir2_block_tail_t *btp; /* block tail */ xfs_dir2_data_entry_t *dep; /* block data entry */ xfs_inode_t *dp; /* incore inode */ @@ -524,17 +594,14 @@ xfs_dir2_block_lookup_int( dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; - /* - * Read the buffer, return error if we can't get it. - */ - if ((error =3D - xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &bp, XFS_DATA_FORK))) { + + error =3D xfs_dir2_block_read(tp, dp, &bp); + if (error) return error; - } - ASSERT(bp !=3D NULL); - block =3D bp->data; + + hdr =3D bp->b_addr; xfs_dir2_data_check(dp, bp); - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(mp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); /* * Loop doing a binary search for our hash value. @@ -551,7 +618,7 @@ xfs_dir2_block_lookup_int( high =3D mid - 1; if (low > high) { ASSERT(args->op_flags & XFS_DA_OP_OKNOENT); - xfs_da_brelse(tp, bp); + xfs_trans_brelse(tp, bp); return XFS_ERROR(ENOENT); } } @@ -572,7 +639,7 @@ xfs_dir2_block_lookup_int( * Get pointer to the entry from the leaf. */ dep =3D (xfs_dir2_data_entry_t *) - ((char *)block + xfs_dir2_dataptr_to_off(mp, addr)); + ((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); /* * Compare name and if it's an exact match, return the index * and buffer. If it's the first case-insensitive match, store @@ -599,7 +666,7 @@ xfs_dir2_block_lookup_int( /* * No match, release the buffer and return ENOENT. */ - xfs_da_brelse(tp, bp); + xfs_trans_brelse(tp, bp); return XFS_ERROR(ENOENT); } =20 @@ -611,9 +678,9 @@ int /* error */ xfs_dir2_block_removename( xfs_da_args_t *args) /* directory operation args */ { - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block leaf pointer */ - xfs_dabuf_t *bp; /* block buffer */ + struct xfs_buf *bp; /* block buffer */ xfs_dir2_block_tail_t *btp; /* block tail */ xfs_dir2_data_entry_t *dep; /* block data entry */ xfs_inode_t *dp; /* incore inode */ @@ -638,20 +705,20 @@ xfs_dir2_block_removename( dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; - block =3D bp->data; - btp =3D xfs_dir2_block_tail_p(mp, block); + hdr =3D bp->b_addr; + btp =3D xfs_dir2_block_tail_p(mp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); /* * Point to the data entry using the leaf entry. */ dep =3D (xfs_dir2_data_entry_t *) - ((char *)block + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].a= ddress))); + ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].add= ress))); /* * Mark the data entry's space free. */ needlog =3D needscan =3D 0; xfs_dir2_data_make_free(tp, bp, - (xfs_dir2_data_aoff_t)((char *)dep - (char *)block), + (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); /* * Fix up the block tail. @@ -667,18 +734,17 @@ xfs_dir2_block_removename( * Fix up bestfree, log the header if necessary. */ if (needscan) - xfs_dir2_data_freescan(mp, (xfs_dir2_data_t *)block, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, bp); xfs_dir2_data_check(dp, bp); /* * See if the size as a shortform is good enough. */ - if ((size =3D xfs_dir2_block_sfsize(dp, block, &sfh)) > - XFS_IFORK_DSIZE(dp)) { - xfs_da_buf_done(bp); + size =3D xfs_dir2_block_sfsize(dp, hdr, &sfh); + if (size > XFS_IFORK_DSIZE(dp)) return 0; - } + /* * If it works, do the conversion. */ @@ -693,9 +759,9 @@ int /* error */ xfs_dir2_block_replace( xfs_da_args_t *args) /* directory operation args */ { - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ - xfs_dabuf_t *bp; /* block buffer */ + struct xfs_buf *bp; /* block buffer */ xfs_dir2_block_tail_t *btp; /* block tail */ xfs_dir2_data_entry_t *dep; /* block data entry */ xfs_inode_t *dp; /* incore inode */ @@ -714,14 +780,14 @@ xfs_dir2_block_replace( } dp =3D args->dp; mp =3D dp->i_mount; - block =3D bp->data; - btp =3D xfs_dir2_block_tail_p(mp, block); + hdr =3D bp->b_addr; + btp =3D xfs_dir2_block_tail_p(mp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); /* * Point to the data entry we need to change. */ dep =3D (xfs_dir2_data_entry_t *) - ((char *)block + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].a= ddress))); + ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].add= ress))); ASSERT(be64_to_cpu(dep->inumber) !=3D args->inumber); /* * Change the inode number to the new value. @@ -729,7 +795,6 @@ xfs_dir2_block_replace( dep->inumber =3D cpu_to_be64(args->inumber); xfs_dir2_data_log_entry(args->trans, bp, dep); xfs_dir2_data_check(dp, bp); - xfs_da_buf_done(bp); return 0; } =20 @@ -756,11 +821,11 @@ xfs_dir2_block_sort( int /* error */ xfs_dir2_leaf_to_block( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *lbp, /* leaf buffer */ - xfs_dabuf_t *dbp) /* data buffer */ + struct xfs_buf *lbp, /* leaf buffer */ + struct xfs_buf *dbp) /* data buffer */ { __be16 *bestsp; /* leaf bests table */ - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_block_tail_t *btp; /* block tail */ xfs_inode_t *dp; /* incore directory inode */ xfs_dir2_data_unused_t *dup; /* unused data entry */ @@ -783,8 +848,8 @@ xfs_dir2_leaf_to_block( dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; - leaf =3D lbp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAF1_MAGIC); + leaf =3D lbp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); /* * If there are data blocks other than the first one, take this @@ -795,48 +860,46 @@ xfs_dir2_leaf_to_block( while (dp->i_d.di_size > mp->m_dirblksize) { bestsp =3D xfs_dir2_leaf_bests_p(ltp); if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) =3D=3D - mp->m_dirblksize - (uint)sizeof(block->hdr)) { + mp->m_dirblksize - (uint)sizeof(*hdr)) { if ((error =3D xfs_dir2_leaf_trim_data(args, lbp, (xfs_dir2_db_t)(be32_to_cpu(ltp->bestcount) - 1)))) - goto out; - } else { - error =3D 0; - goto out; - } + return error; + } else + return 0; } /* * Read the data block if we don't already have it, give up if it fails. */ - if (dbp =3D=3D NULL && - (error =3D xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &dbp, - XFS_DATA_FORK))) { - goto out; + if (!dbp) { + error =3D xfs_dir2_data_read(tp, dp, mp->m_dirdatablk, -1, &dbp); + if (error) + return error; } - block =3D dbp->data; - ASSERT(be32_to_cpu(block->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC); + hdr =3D dbp->b_addr; + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC)); /* * Size of the "leaf" area in the block. */ - size =3D (uint)sizeof(block->tail) + + size =3D (uint)sizeof(xfs_dir2_block_tail_t) + (uint)sizeof(*lep) * (be16_to_cpu(leaf->hdr.count) - be16_to_cpu(l= eaf->hdr.stale)); /* * Look at the last data entry. */ - tagp =3D (__be16 *)((char *)block + mp->m_dirblksize) - 1; - dup =3D (xfs_dir2_data_unused_t *)((char *)block + be16_to_cpu(*tagp)); + tagp =3D (__be16 *)((char *)hdr + mp->m_dirblksize) - 1; + dup =3D (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); /* * If it's not free or is too short we can't do it. */ if (be16_to_cpu(dup->freetag) !=3D XFS_DIR2_DATA_FREE_TAG || - be16_to_cpu(dup->length) < size) { - error =3D 0; - goto out; - } + be16_to_cpu(dup->length) < size) + return 0; + /* * Start converting it to block form. */ - block->hdr.magic =3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); + dbp->b_ops =3D &xfs_dir2_block_buf_ops; + hdr->magic =3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); needlog =3D 1; needscan =3D 0; /* @@ -847,7 +910,7 @@ xfs_dir2_leaf_to_block( /* * Initialize the block tail. */ - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(mp, hdr); btp->count =3D cpu_to_be32(be16_to_cpu(leaf->hdr.count) - be16_to_cpu(lea= f->hdr.stale)); btp->stale =3D 0; xfs_dir2_block_log_tail(tp, dbp); @@ -856,7 +919,8 @@ xfs_dir2_leaf_to_block( */ lep =3D xfs_dir2_block_leaf_p(btp); for (from =3D to =3D 0; from < be16_to_cpu(leaf->hdr.count); from++) { - if (be32_to_cpu(leaf->ents[from].address) =3D=3D XFS_DIR2_NULL_DATAPTR) + if (leaf->ents[from].address =3D=3D + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) continue; lep[to++] =3D leaf->ents[from]; } @@ -866,32 +930,24 @@ xfs_dir2_leaf_to_block( * Scan the bestfree if we need it and log the data block header. */ if (needscan) - xfs_dir2_data_freescan(mp, (xfs_dir2_data_t *)block, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, dbp); /* * Pitch the old leaf block. */ error =3D xfs_da_shrink_inode(args, mp->m_dirleafblk, lbp); - lbp =3D NULL; - if (error) { - goto out; - } + if (error) + return error; + /* * Now see if the resulting block can be shrunken to shortform. */ - if ((size =3D xfs_dir2_block_sfsize(dp, block, &sfh)) > - XFS_IFORK_DSIZE(dp)) { - error =3D 0; - goto out; - } + size =3D xfs_dir2_block_sfsize(dp, hdr, &sfh); + if (size > XFS_IFORK_DSIZE(dp)) + return 0; + return xfs_dir2_block_to_sf(args, dbp, size, &sfh); -out: - if (lbp) - xfs_da_buf_done(lbp); - if (dbp) - xfs_da_buf_done(dbp); - return error; } =20 /* @@ -902,12 +958,10 @@ xfs_dir2_sf_to_block( xfs_da_args_t *args) /* operation arguments */ { xfs_dir2_db_t blkno; /* dir-relative block # (0) */ - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ - xfs_dabuf_t *bp; /* block buffer */ + struct xfs_buf *bp; /* block buffer */ xfs_dir2_block_tail_t *btp; /* block tail pointer */ - char *buf; /* sf buffer */ - int buf_len; xfs_dir2_data_entry_t *dep; /* data entry pointer */ xfs_inode_t *dp; /* incore directory inode */ int dummy; /* trash */ @@ -921,7 +975,8 @@ xfs_dir2_sf_to_block( int newoffset; /* offset from current entry */ int offset; /* target block offset */ xfs_dir2_sf_entry_t *sfep; /* sf entry pointer */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *oldsfp; /* old shortform header */ + xfs_dir2_sf_hdr_t *sfp; /* shortform header */ __be16 *tagp; /* end of data entry */ xfs_trans_t *tp; /* transaction pointer */ struct xfs_name name; @@ -939,32 +994,30 @@ xfs_dir2_sf_to_block( ASSERT(XFS_FORCED_SHUTDOWN(mp)); return XFS_ERROR(EIO); } + + oldsfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(dp->i_df.if_bytes =3D=3D dp->i_d.di_size); ASSERT(dp->i_df.if_u1.if_data !=3D NULL); - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(dp->i_d.di_size >=3D xfs_dir2_sf_hdr_size(sfp->hdr.i8count)); + ASSERT(dp->i_d.di_size >=3D xfs_dir2_sf_hdr_size(oldsfp->i8count)); + /* - * Copy the directory into the stack buffer. + * Copy the directory into a temporary buffer. * Then pitch the incore inode data so we can make extents. */ + sfp =3D kmem_alloc(dp->i_df.if_bytes, KM_SLEEP); + memcpy(sfp, oldsfp, dp->i_df.if_bytes); =20 - buf_len =3D dp->i_df.if_bytes; - buf =3D kmem_alloc(buf_len, KM_SLEEP); - - memcpy(buf, sfp, buf_len); - xfs_idata_realloc(dp, -buf_len, XFS_DATA_FORK); + xfs_idata_realloc(dp, -dp->i_df.if_bytes, XFS_DATA_FORK); dp->i_d.di_size =3D 0; xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); - /* - * Reset pointer - old sfp is gone. - */ - sfp =3D (xfs_dir2_sf_t *)buf; + /* * Add block 0 to the inode. */ error =3D xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, &blkno); if (error) { - kmem_free(buf); + kmem_free(sfp); return error; } /* @@ -972,21 +1025,22 @@ xfs_dir2_sf_to_block( */ error =3D xfs_dir2_data_init(args, blkno, &bp); if (error) { - kmem_free(buf); + kmem_free(sfp); return error; } - block =3D bp->data; - block->hdr.magic =3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); + bp->b_ops =3D &xfs_dir2_block_buf_ops; + hdr =3D bp->b_addr; + hdr->magic =3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); /* * Compute size of block "tail" area. */ i =3D (uint)sizeof(*btp) + - (sfp->hdr.count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t); + (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t); /* * The whole thing is initialized to free by the init routine. * Say we're using the leaf and tail area. */ - dup =3D (xfs_dir2_data_unused_t *)block->u; + dup =3D (xfs_dir2_data_unused_t *)(hdr + 1); needlog =3D needscan =3D 0; xfs_dir2_data_use_free(tp, bp, dup, mp->m_dirblksize - i, i, &needlog, &needscan); @@ -994,50 +1048,51 @@ xfs_dir2_sf_to_block( /* * Fill in the tail. */ - btp =3D xfs_dir2_block_tail_p(mp, block); - btp->count =3D cpu_to_be32(sfp->hdr.count + 2); /* ., .. */ + btp =3D xfs_dir2_block_tail_p(mp, hdr); + btp->count =3D cpu_to_be32(sfp->count + 2); /* ., .. */ btp->stale =3D 0; blp =3D xfs_dir2_block_leaf_p(btp); - endoffset =3D (uint)((char *)blp - (char *)block); + endoffset =3D (uint)((char *)blp - (char *)hdr); /* * Remove the freespace, we'll manage it. */ xfs_dir2_data_use_free(tp, bp, dup, - (xfs_dir2_data_aoff_t)((char *)dup - (char *)block), + (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), be16_to_cpu(dup->length), &needlog, &needscan); /* * Create entry for . */ dep =3D (xfs_dir2_data_entry_t *) - ((char *)block + XFS_DIR2_DATA_DOT_OFFSET); + ((char *)hdr + XFS_DIR2_DATA_DOT_OFFSET); dep->inumber =3D cpu_to_be64(dp->i_ino); dep->namelen =3D 1; dep->name[0] =3D '.'; tagp =3D xfs_dir2_data_entry_tag_p(dep); - *tagp =3D cpu_to_be16((char *)dep - (char *)block); + *tagp =3D cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); blp[0].hashval =3D cpu_to_be32(xfs_dir_hash_dot); blp[0].address =3D cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, - (char *)dep - (char *)block)); + (char *)dep - (char *)hdr)); /* * Create entry for .. */ dep =3D (xfs_dir2_data_entry_t *) - ((char *)block + XFS_DIR2_DATA_DOTDOT_OFFSET); - dep->inumber =3D cpu_to_be64(xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.paren= t)); + ((char *)hdr + XFS_DIR2_DATA_DOTDOT_OFFSET); + dep->inumber =3D cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); dep->namelen =3D 2; dep->name[0] =3D dep->name[1] =3D '.'; tagp =3D xfs_dir2_data_entry_tag_p(dep); - *tagp =3D cpu_to_be16((char *)dep - (char *)block); + *tagp =3D cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); blp[1].hashval =3D cpu_to_be32(xfs_dir_hash_dotdot); blp[1].address =3D cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, - (char *)dep - (char *)block)); + (char *)dep - (char *)hdr)); offset =3D XFS_DIR2_DATA_FIRST_OFFSET; /* * Loop over existing entries, stuff them in. */ - if ((i =3D 0) =3D=3D sfp->hdr.count) + i =3D 0; + if (!sfp->count) sfep =3D NULL; else sfep =3D xfs_dir2_sf_firstentry(sfp); @@ -1057,43 +1112,40 @@ xfs_dir2_sf_to_block( * There should be a hole here, make one. */ if (offset < newoffset) { - dup =3D (xfs_dir2_data_unused_t *) - ((char *)block + offset); + dup =3D (xfs_dir2_data_unused_t *)((char *)hdr + offset); dup->freetag =3D cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); dup->length =3D cpu_to_be16(newoffset - offset); *xfs_dir2_data_unused_tag_p(dup) =3D cpu_to_be16( - ((char *)dup - (char *)block)); + ((char *)dup - (char *)hdr)); xfs_dir2_data_log_unused(tp, bp, dup); - (void)xfs_dir2_data_freeinsert((xfs_dir2_data_t *)block, - dup, &dummy); + xfs_dir2_data_freeinsert(hdr, dup, &dummy); offset +=3D be16_to_cpu(dup->length); continue; } /* * Copy a real entry. */ - dep =3D (xfs_dir2_data_entry_t *)((char *)block + newoffset); - dep->inumber =3D cpu_to_be64(xfs_dir2_sf_get_inumber(sfp, - xfs_dir2_sf_inumberp(sfep))); + dep =3D (xfs_dir2_data_entry_t *)((char *)hdr + newoffset); + dep->inumber =3D cpu_to_be64(xfs_dir2_sfe_get_ino(sfp, sfep)); dep->namelen =3D sfep->namelen; memcpy(dep->name, sfep->name, dep->namelen); tagp =3D xfs_dir2_data_entry_tag_p(dep); - *tagp =3D cpu_to_be16((char *)dep - (char *)block); + *tagp =3D cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); name.name =3D sfep->name; name.len =3D sfep->namelen; blp[2 + i].hashval =3D cpu_to_be32(mp->m_dirnameops-> hashname(&name)); blp[2 + i].address =3D cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, - (char *)dep - (char *)block)); - offset =3D (int)((char *)(tagp + 1) - (char *)block); - if (++i =3D=3D sfp->hdr.count) + (char *)dep - (char *)hdr)); + offset =3D (int)((char *)(tagp + 1) - (char *)hdr); + if (++i =3D=3D sfp->count) sfep =3D NULL; else sfep =3D xfs_dir2_sf_nextentry(sfp, sfep); } /* Done with the temporary buffer */ - kmem_free(buf); + kmem_free(sfp); /* * Sort the leaf entries by hash value. */ @@ -1106,6 +1158,5 @@ xfs_dir2_sf_to_block( xfs_dir2_block_log_leaf(tp, bp, 0, be32_to_cpu(btp->count) - 1); xfs_dir2_block_log_tail(tp, bp); xfs_dir2_data_check(dp, bp); - xfs_da_buf_done(bp); return 0; } diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index d89b5b1..eb86739 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -18,23 +18,21 @@ =20 #include =20 - -#ifdef DEBUG /* * Check the consistency of the data block. * The input can also be a block-format directory. - * Pop an assert if we find anything bad. + * Return 0 is the buffer is good, otherwise an error. */ -void -xfs_dir2_data_check( - xfs_inode_t *dp, /* incore inode pointer */ - xfs_dabuf_t *bp) /* data block's buffer */ +int +__xfs_dir2_data_check( + struct xfs_inode *dp, /* incore inode pointer */ + struct xfs_buf *bp) /* data block's buffer */ { xfs_dir2_dataptr_t addr; /* addr for leaf lookup */ xfs_dir2_data_free_t *bf; /* bestfree table */ xfs_dir2_block_tail_t *btp=3DNULL; /* block tail */ int count; /* count of entries found */ - xfs_dir2_data_t *d; /* data block pointer */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_data_entry_t *dep; /* data entry */ xfs_dir2_data_free_t *dfp; /* bestfree entry */ xfs_dir2_data_unused_t *dup; /* unused entry */ @@ -49,36 +47,46 @@ xfs_dir2_data_check( int stale; /* count of stale leaves */ struct xfs_name name; =20 - mp =3D dp->i_mount; - d =3D bp->data; - ASSERT(be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); - bf =3D d->hdr.bestfree; - p =3D (char *)d->u; - if (be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC) { - btp =3D xfs_dir2_block_tail_p(mp, (xfs_dir2_block_t *)d); + mp =3D bp->b_target->bt_mount; + hdr =3D bp->b_addr; + bf =3D hdr->bestfree; + p =3D (char *)(hdr + 1); + + switch (be32_to_cpu(hdr->magic)) { + case XFS_DIR2_BLOCK_MAGIC: + btp =3D xfs_dir2_block_tail_p(mp, hdr); lep =3D xfs_dir2_block_leaf_p(btp); endp =3D (char *)lep; - } else - endp =3D (char *)d + mp->m_dirblksize; + break; + case XFS_DIR2_DATA_MAGIC: + endp =3D (char *)hdr + mp->m_dirblksize; + break; + default: + XFS_ERROR_REPORT("Bad Magic", XFS_ERRLEVEL_LOW, mp); + return EFSCORRUPTED; + } + count =3D lastfree =3D freeseen =3D 0; /* * Account for zero bestfree entries. */ if (!bf[0].length) { - ASSERT(!bf[0].offset); + XFS_WANT_CORRUPTED_RETURN(!bf[0].offset); freeseen |=3D 1 << 0; } if (!bf[1].length) { - ASSERT(!bf[1].offset); + XFS_WANT_CORRUPTED_RETURN(!bf[1].offset); freeseen |=3D 1 << 1; } if (!bf[2].length) { - ASSERT(!bf[2].offset); + XFS_WANT_CORRUPTED_RETURN(!bf[2].offset); freeseen |=3D 1 << 2; } - ASSERT(be16_to_cpu(bf[0].length) >=3D be16_to_cpu(bf[1].length)); - ASSERT(be16_to_cpu(bf[1].length) >=3D be16_to_cpu(bf[2].length)); + + XFS_WANT_CORRUPTED_RETURN(be16_to_cpu(bf[0].length) >=3D + be16_to_cpu(bf[1].length)); + XFS_WANT_CORRUPTED_RETURN(be16_to_cpu(bf[1].length) >=3D + be16_to_cpu(bf[2].length)); /* * Loop over the data/unused entries. */ @@ -90,17 +98,20 @@ xfs_dir2_data_check( * doesn't need to be there. */ if (be16_to_cpu(dup->freetag) =3D=3D XFS_DIR2_DATA_FREE_TAG) { - ASSERT(lastfree =3D=3D 0); - ASSERT(be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)) =3D=3D - (char *)dup - (char *)d); - dfp =3D xfs_dir2_data_freefind(d, dup); + XFS_WANT_CORRUPTED_RETURN(lastfree =3D=3D 0); + XFS_WANT_CORRUPTED_RETURN( + be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)) =3D=3D + (char *)dup - (char *)hdr); + dfp =3D xfs_dir2_data_freefind(hdr, dup); if (dfp) { i =3D (int)(dfp - bf); - ASSERT((freeseen & (1 << i)) =3D=3D 0); + XFS_WANT_CORRUPTED_RETURN( + (freeseen & (1 << i)) =3D=3D 0); freeseen |=3D 1 << i; } else { - ASSERT(be16_to_cpu(dup->length) <=3D - be16_to_cpu(bf[2].length)); + XFS_WANT_CORRUPTED_RETURN( + be16_to_cpu(dup->length) <=3D + be16_to_cpu(bf[2].length)); } p +=3D be16_to_cpu(dup->length); lastfree =3D 1; @@ -113,16 +124,18 @@ xfs_dir2_data_check( * The linear search is crude but this is DEBUG code. */ dep =3D (xfs_dir2_data_entry_t *)p; - ASSERT(dep->namelen !=3D 0); - ASSERT(xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber)) =3D=3D 0); - ASSERT(be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep)) =3D=3D - (char *)dep - (char *)d); + XFS_WANT_CORRUPTED_RETURN(dep->namelen !=3D 0); + XFS_WANT_CORRUPTED_RETURN( + !xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber))); + XFS_WANT_CORRUPTED_RETURN( + be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep)) =3D=3D + (char *)dep - (char *)hdr); count++; lastfree =3D 0; - if (be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC) { + if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) { addr =3D xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, (xfs_dir2_data_aoff_t) - ((char *)dep - (char *)d)); + ((char *)dep - (char *)hdr)); name.name =3D dep->name; name.len =3D dep->namelen; hash =3D mp->m_dirnameops->hashname(&name); @@ -131,26 +144,122 @@ xfs_dir2_data_check( be32_to_cpu(lep[i].hashval) =3D=3D hash) break; } - ASSERT(i < be32_to_cpu(btp->count)); + XFS_WANT_CORRUPTED_RETURN(i < be32_to_cpu(btp->count)); } p +=3D xfs_dir2_data_entsize(dep->namelen); } /* * Need to have seen all the entries and all the bestfree slots. */ - ASSERT(freeseen =3D=3D 7); - if (be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC) { + XFS_WANT_CORRUPTED_RETURN(freeseen =3D=3D 7); + if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) { for (i =3D stale =3D 0; i < be32_to_cpu(btp->count); i++) { - if (be32_to_cpu(lep[i].address) =3D=3D XFS_DIR2_NULL_DATAPTR) + if (lep[i].address =3D=3D + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) stale++; if (i > 0) - ASSERT(be32_to_cpu(lep[i].hashval) >=3D be32_to_cpu(lep[i - 1].hashval= )); + XFS_WANT_CORRUPTED_RETURN( + be32_to_cpu(lep[i].hashval) >=3D + be32_to_cpu(lep[i - 1].hashval)); } - ASSERT(count =3D=3D be32_to_cpu(btp->count) - be32_to_cpu(btp->stale)); - ASSERT(stale =3D=3D be32_to_cpu(btp->stale)); + XFS_WANT_CORRUPTED_RETURN(count =3D=3D + be32_to_cpu(btp->count) - be32_to_cpu(btp->stale)); + XFS_WANT_CORRUPTED_RETURN(stale =3D=3D be32_to_cpu(btp->stale)); + } + return 0; +} + +static void +xfs_dir2_data_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_dir2_data_hdr *hdr =3D bp->b_addr; + int block_ok =3D 0; + + block_ok =3D hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC); + block_ok =3D block_ok && __xfs_dir2_data_check(NULL, bp) =3D=3D 0; + + if (!block_ok) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +/* + * Readahead of the first block of the directory when it is opened is comp= letely + * oblivious to the format of the directory. Hence we can either get a blo= ck + * format buffer or a data format buffer on readahead. + */ +static void +xfs_dir2_data_reada_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_dir2_data_hdr *hdr =3D bp->b_addr; + + switch (be32_to_cpu(hdr->magic)) { + case XFS_DIR2_BLOCK_MAGIC: + bp->b_ops =3D &xfs_dir2_block_buf_ops; + bp->b_ops->verify_read(bp); + return; + case XFS_DIR2_DATA_MAGIC: + xfs_dir2_data_verify(bp); + return; + default: + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + break; } } -#endif + +static void +xfs_dir2_data_read_verify( + struct xfs_buf *bp) +{ + xfs_dir2_data_verify(bp); +} + +static void +xfs_dir2_data_write_verify( + struct xfs_buf *bp) +{ + xfs_dir2_data_verify(bp); +} + +const struct xfs_buf_ops xfs_dir2_data_buf_ops =3D { + .verify_read =3D xfs_dir2_data_read_verify, + .verify_write =3D xfs_dir2_data_write_verify, +}; + +static const struct xfs_buf_ops xfs_dir2_data_reada_buf_ops =3D { + .verify_read =3D xfs_dir2_data_reada_verify, + .verify_write =3D xfs_dir2_data_write_verify, +}; + + +int +xfs_dir2_data_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mapped_bno, + struct xfs_buf **bpp) +{ + return xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp, + XFS_DATA_FORK, &xfs_dir2_data_buf_ops); +} + +int +xfs_dir2_data_readahead( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t bno, + xfs_daddr_t mapped_bno) +{ + return xfs_da_reada_buf(tp, dp, bno, mapped_bno, + XFS_DATA_FORK, &xfs_dir2_data_reada_buf_ops); +} =20 /* * Given a data block and an unused entry from that block, @@ -158,7 +267,7 @@ xfs_dir2_data_check( */ xfs_dir2_data_free_t * xfs_dir2_data_freefind( - xfs_dir2_data_t *d, /* data block */ + xfs_dir2_data_hdr_t *hdr, /* data block */ xfs_dir2_data_unused_t *dup) /* data unused entry */ { xfs_dir2_data_free_t *dfp; /* bestfree entry */ @@ -168,17 +277,17 @@ xfs_dir2_data_freefind( int seenzero; /* saw a 0 bestfree entry */ #endif =20 - off =3D (xfs_dir2_data_aoff_t)((char *)dup - (char *)d); + off =3D (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr); #if defined(DEBUG) && defined(__KERNEL__) /* * Validate some consistency in the bestfree table. * Check order, non-overlapping entries, and if we find the * one we're looking for it has to be exact. */ - ASSERT(be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); - for (dfp =3D &d->hdr.bestfree[0], seenzero =3D matched =3D 0; - dfp < &d->hdr.bestfree[XFS_DIR2_DATA_FD_COUNT]; + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + for (dfp =3D &hdr->bestfree[0], seenzero =3D matched =3D 0; + dfp < &hdr->bestfree[XFS_DIR2_DATA_FD_COUNT]; dfp++) { if (!dfp->offset) { ASSERT(!dfp->length); @@ -194,7 +303,7 @@ xfs_dir2_data_freefind( else ASSERT(be16_to_cpu(dfp->offset) + be16_to_cpu(dfp->length) <=3D off); ASSERT(matched || be16_to_cpu(dfp->length) >=3D be16_to_cpu(dup->length)= ); - if (dfp > &d->hdr.bestfree[0]) + if (dfp > &hdr->bestfree[0]) ASSERT(be16_to_cpu(dfp[-1].length) >=3D be16_to_cpu(dfp[0].length)); } #endif @@ -203,13 +312,13 @@ xfs_dir2_data_freefind( * it can't be there since they're sorted. */ if (be16_to_cpu(dup->length) < - be16_to_cpu(d->hdr.bestfree[XFS_DIR2_DATA_FD_COUNT - 1].length)) + be16_to_cpu(hdr->bestfree[XFS_DIR2_DATA_FD_COUNT - 1].length)) return NULL; /* * Look at the three bestfree entries for our guy. */ - for (dfp =3D &d->hdr.bestfree[0]; - dfp < &d->hdr.bestfree[XFS_DIR2_DATA_FD_COUNT]; + for (dfp =3D &hdr->bestfree[0]; + dfp < &hdr->bestfree[XFS_DIR2_DATA_FD_COUNT]; dfp++) { if (!dfp->offset) return NULL; @@ -227,7 +336,7 @@ xfs_dir2_data_freefind( */ xfs_dir2_data_free_t * /* entry inserted */ xfs_dir2_data_freeinsert( - xfs_dir2_data_t *d, /* data block pointer */ + xfs_dir2_data_hdr_t *hdr, /* data block pointer */ xfs_dir2_data_unused_t *dup, /* unused space */ int *loghead) /* log the data header (out) */ { @@ -235,12 +344,13 @@ xfs_dir2_data_freeinsert( xfs_dir2_data_free_t new; /* new bestfree entry */ =20 #ifdef __KERNEL__ - ASSERT(be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); #endif - dfp =3D d->hdr.bestfree; + dfp =3D hdr->bestfree; new.length =3D dup->length; - new.offset =3D cpu_to_be16((char *)dup - (char *)d); + new.offset =3D cpu_to_be16((char *)dup - (char *)hdr); + /* * Insert at position 0, 1, or 2; or not at all. */ @@ -270,36 +380,36 @@ xfs_dir2_data_freeinsert( */ STATIC void xfs_dir2_data_freeremove( - xfs_dir2_data_t *d, /* data block pointer */ + xfs_dir2_data_hdr_t *hdr, /* data block header */ xfs_dir2_data_free_t *dfp, /* bestfree entry pointer */ int *loghead) /* out: log data header */ { #ifdef __KERNEL__ - ASSERT(be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); #endif /* * It's the first entry, slide the next 2 up. */ - if (dfp =3D=3D &d->hdr.bestfree[0]) { - d->hdr.bestfree[0] =3D d->hdr.bestfree[1]; - d->hdr.bestfree[1] =3D d->hdr.bestfree[2]; + if (dfp =3D=3D &hdr->bestfree[0]) { + hdr->bestfree[0] =3D hdr->bestfree[1]; + hdr->bestfree[1] =3D hdr->bestfree[2]; } /* * It's the second entry, slide the 3rd entry up. */ - else if (dfp =3D=3D &d->hdr.bestfree[1]) - d->hdr.bestfree[1] =3D d->hdr.bestfree[2]; + else if (dfp =3D=3D &hdr->bestfree[1]) + hdr->bestfree[1] =3D hdr->bestfree[2]; /* * Must be the last entry. */ else - ASSERT(dfp =3D=3D &d->hdr.bestfree[2]); + ASSERT(dfp =3D=3D &hdr->bestfree[2]); /* * Clear the 3rd entry, must be zero now. */ - d->hdr.bestfree[2].length =3D 0; - d->hdr.bestfree[2].offset =3D 0; + hdr->bestfree[2].length =3D 0; + hdr->bestfree[2].offset =3D 0; *loghead =3D 1; } =20 @@ -309,7 +419,7 @@ xfs_dir2_data_freeremove( void xfs_dir2_data_freescan( xfs_mount_t *mp, /* filesystem mount point */ - xfs_dir2_data_t *d, /* data block pointer */ + xfs_dir2_data_hdr_t *hdr, /* data block header */ int *loghead) /* out: log data header */ { xfs_dir2_block_tail_t *btp; /* block tail */ @@ -319,23 +429,23 @@ xfs_dir2_data_freescan( char *p; /* current entry pointer */ =20 #ifdef __KERNEL__ - ASSERT(be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); #endif /* * Start by clearing the table. */ - memset(d->hdr.bestfree, 0, sizeof(d->hdr.bestfree)); + memset(hdr->bestfree, 0, sizeof(hdr->bestfree)); *loghead =3D 1; /* * Set up pointers. */ - p =3D (char *)d->u; - if (be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC) { - btp =3D xfs_dir2_block_tail_p(mp, (xfs_dir2_block_t *)d); + p =3D (char *)(hdr + 1); + if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) { + btp =3D xfs_dir2_block_tail_p(mp, hdr); endp =3D (char *)xfs_dir2_block_leaf_p(btp); } else - endp =3D (char *)d + mp->m_dirblksize; + endp =3D (char *)hdr + mp->m_dirblksize; /* * Loop over the block's entries. */ @@ -345,9 +455,9 @@ xfs_dir2_data_freescan( * If it's a free entry, insert it. */ if (be16_to_cpu(dup->freetag) =3D=3D XFS_DIR2_DATA_FREE_TAG) { - ASSERT((char *)dup - (char *)d =3D=3D + ASSERT((char *)dup - (char *)hdr =3D=3D be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup))); - xfs_dir2_data_freeinsert(d, dup, loghead); + xfs_dir2_data_freeinsert(hdr, dup, loghead); p +=3D be16_to_cpu(dup->length); } /* @@ -355,7 +465,7 @@ xfs_dir2_data_freescan( */ else { dep =3D (xfs_dir2_data_entry_t *)p; - ASSERT((char *)dep - (char *)d =3D=3D + ASSERT((char *)dep - (char *)hdr =3D=3D be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep))); p +=3D xfs_dir2_data_entsize(dep->namelen); } @@ -370,10 +480,10 @@ int /* error */ xfs_dir2_data_init( xfs_da_args_t *args, /* directory operation args */ xfs_dir2_db_t blkno, /* logical dir block number */ - xfs_dabuf_t **bpp) /* output block buffer */ + struct xfs_buf **bpp) /* output block buffer */ { - xfs_dabuf_t *bp; /* block buffer */ - xfs_dir2_data_t *d; /* pointer to block */ + struct xfs_buf *bp; /* block buffer */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_inode_t *dp; /* incore directory inode */ xfs_dir2_data_unused_t *dup; /* unused entry pointer */ int error; /* error return value */ @@ -390,30 +500,31 @@ xfs_dir2_data_init( */ error =3D xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, blkno), -1, &bp, XFS_DATA_FORK); - if (error) { + if (error) return error; - } - ASSERT(bp !=3D NULL); + bp->b_ops =3D &xfs_dir2_data_buf_ops; + /* * Initialize the header. */ - d =3D bp->data; - d->hdr.magic =3D cpu_to_be32(XFS_DIR2_DATA_MAGIC); - d->hdr.bestfree[0].offset =3D cpu_to_be16(sizeof(d->hdr)); + hdr =3D bp->b_addr; + hdr->magic =3D cpu_to_be32(XFS_DIR2_DATA_MAGIC); + hdr->bestfree[0].offset =3D cpu_to_be16(sizeof(*hdr)); for (i =3D 1; i < XFS_DIR2_DATA_FD_COUNT; i++) { - d->hdr.bestfree[i].length =3D 0; - d->hdr.bestfree[i].offset =3D 0; + hdr->bestfree[i].length =3D 0; + hdr->bestfree[i].offset =3D 0; } + /* * Set up an unused entry for the block's body. */ - dup =3D &d->u[0].unused; + dup =3D (xfs_dir2_data_unused_t *)(hdr + 1); dup->freetag =3D cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); =20 - t=3Dmp->m_dirblksize - (uint)sizeof(d->hdr); - d->hdr.bestfree[0].length =3D cpu_to_be16(t); + t =3D mp->m_dirblksize - (uint)sizeof(*hdr); + hdr->bestfree[0].length =3D cpu_to_be16(t); dup->length =3D cpu_to_be16(t); - *xfs_dir2_data_unused_tag_p(dup) =3D cpu_to_be16((char *)dup - (char *)d); + *xfs_dir2_data_unused_tag_p(dup) =3D cpu_to_be16((char *)dup - (char *)hd= r); /* * Log it and return it. */ @@ -428,18 +539,18 @@ xfs_dir2_data_init( */ void xfs_dir2_data_log_entry( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* block buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp, xfs_dir2_data_entry_t *dep) /* data entry pointer */ { - xfs_dir2_data_t *d; /* data block pointer */ + xfs_dir2_data_hdr_t *hdr =3D bp->b_addr; + + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); =20 - d =3D bp->data; - ASSERT(be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); - xfs_da_log_buf(tp, bp, (uint)((char *)dep - (char *)d), + xfs_trans_log_buf(tp, bp, (uint)((char *)dep - (char *)hdr), (uint)((char *)(xfs_dir2_data_entry_tag_p(dep) + 1) - - (char *)d - 1)); + (char *)hdr - 1)); } =20 /* @@ -447,16 +558,15 @@ xfs_dir2_data_log_entry( */ void xfs_dir2_data_log_header( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp) /* block buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp) { - xfs_dir2_data_t *d; /* data block pointer */ + xfs_dir2_data_hdr_t *hdr =3D bp->b_addr; + + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); =20 - d =3D bp->data; - ASSERT(be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); - xfs_da_log_buf(tp, bp, (uint)((char *)&d->hdr - (char *)d), - (uint)(sizeof(d->hdr) - 1)); + xfs_trans_log_buf(tp, bp, 0, sizeof(*hdr) - 1); } =20 /* @@ -464,27 +574,27 @@ xfs_dir2_data_log_header( */ void xfs_dir2_data_log_unused( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* block buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp, xfs_dir2_data_unused_t *dup) /* data unused pointer */ { - xfs_dir2_data_t *d; /* data block pointer */ + xfs_dir2_data_hdr_t *hdr =3D bp->b_addr; + + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); =20 - d =3D bp->data; - ASSERT(be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); /* * Log the first part of the unused entry. */ - xfs_da_log_buf(tp, bp, (uint)((char *)dup - (char *)d), + xfs_trans_log_buf(tp, bp, (uint)((char *)dup - (char *)hdr), (uint)((char *)&dup->length + sizeof(dup->length) - - 1 - (char *)d)); + 1 - (char *)hdr)); /* * Log the end (tag) of the unused entry. */ - xfs_da_log_buf(tp, bp, - (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)d), - (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)d + + xfs_trans_log_buf(tp, bp, + (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)hdr), + (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)hdr + sizeof(xfs_dir2_data_off_t) - 1)); } =20 @@ -494,14 +604,14 @@ xfs_dir2_data_log_unused( */ void xfs_dir2_data_make_free( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* block buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp, xfs_dir2_data_aoff_t offset, /* starting byte offset */ xfs_dir2_data_aoff_t len, /* length in bytes */ int *needlogp, /* out: log header */ int *needscanp) /* out: regen bestfree */ { - xfs_dir2_data_t *d; /* data block pointer */ + xfs_dir2_data_hdr_t *hdr; /* data block pointer */ xfs_dir2_data_free_t *dfp; /* bestfree pointer */ char *endptr; /* end of data area */ xfs_mount_t *mp; /* filesystem mount point */ @@ -511,28 +621,29 @@ xfs_dir2_data_make_free( xfs_dir2_data_unused_t *prevdup; /* unused entry before us */ =20 mp =3D tp->t_mountp; - d =3D bp->data; + hdr =3D bp->b_addr; + /* * Figure out where the end of the data area is. */ - if (be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC) - endptr =3D (char *)d + mp->m_dirblksize; + if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC)) + endptr =3D (char *)hdr + mp->m_dirblksize; else { xfs_dir2_block_tail_t *btp; /* block tail */ =20 - ASSERT(be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); - btp =3D xfs_dir2_block_tail_p(mp, (xfs_dir2_block_t *)d); + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + btp =3D xfs_dir2_block_tail_p(mp, hdr); endptr =3D (char *)xfs_dir2_block_leaf_p(btp); } /* * If this isn't the start of the block, then back up to * the previous entry and see if it's free. */ - if (offset > sizeof(d->hdr)) { + if (offset > sizeof(*hdr)) { __be16 *tagp; /* tag just before us */ =20 - tagp =3D (__be16 *)((char *)d + offset) - 1; - prevdup =3D (xfs_dir2_data_unused_t *)((char *)d + be16_to_cpu(*tagp)); + tagp =3D (__be16 *)((char *)hdr + offset) - 1; + prevdup =3D (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); if (be16_to_cpu(prevdup->freetag) !=3D XFS_DIR2_DATA_FREE_TAG) prevdup =3D NULL; } else @@ -541,9 +652,9 @@ xfs_dir2_data_make_free( * If this isn't the end of the block, see if the entry after * us is free. */ - if ((char *)d + offset + len < endptr) { + if ((char *)hdr + offset + len < endptr) { postdup =3D - (xfs_dir2_data_unused_t *)((char *)d + offset + len); + (xfs_dir2_data_unused_t *)((char *)hdr + offset + len); if (be16_to_cpu(postdup->freetag) !=3D XFS_DIR2_DATA_FREE_TAG) postdup =3D NULL; } else @@ -560,21 +671,21 @@ xfs_dir2_data_make_free( /* * See if prevdup and/or postdup are in bestfree table. */ - dfp =3D xfs_dir2_data_freefind(d, prevdup); - dfp2 =3D xfs_dir2_data_freefind(d, postdup); + dfp =3D xfs_dir2_data_freefind(hdr, prevdup); + dfp2 =3D xfs_dir2_data_freefind(hdr, postdup); /* * We need a rescan unless there are exactly 2 free entries * namely our two. Then we know what's happening, otherwise * since the third bestfree is there, there might be more * entries. */ - needscan =3D (d->hdr.bestfree[2].length !=3D 0); + needscan =3D (hdr->bestfree[2].length !=3D 0); /* * Fix up the new big freespace. */ be16_add_cpu(&prevdup->length, len + be16_to_cpu(postdup->length)); *xfs_dir2_data_unused_tag_p(prevdup) =3D - cpu_to_be16((char *)prevdup - (char *)d); + cpu_to_be16((char *)prevdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, prevdup); if (!needscan) { /* @@ -584,18 +695,18 @@ xfs_dir2_data_make_free( * Remove entry 1 first then entry 0. */ ASSERT(dfp && dfp2); - if (dfp =3D=3D &d->hdr.bestfree[1]) { - dfp =3D &d->hdr.bestfree[0]; + if (dfp =3D=3D &hdr->bestfree[1]) { + dfp =3D &hdr->bestfree[0]; ASSERT(dfp2 =3D=3D dfp); - dfp2 =3D &d->hdr.bestfree[1]; + dfp2 =3D &hdr->bestfree[1]; } - xfs_dir2_data_freeremove(d, dfp2, needlogp); - xfs_dir2_data_freeremove(d, dfp, needlogp); + xfs_dir2_data_freeremove(hdr, dfp2, needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); /* * Now insert the new entry. */ - dfp =3D xfs_dir2_data_freeinsert(d, prevdup, needlogp); - ASSERT(dfp =3D=3D &d->hdr.bestfree[0]); + dfp =3D xfs_dir2_data_freeinsert(hdr, prevdup, needlogp); + ASSERT(dfp =3D=3D &hdr->bestfree[0]); ASSERT(dfp->length =3D=3D prevdup->length); ASSERT(!dfp[1].length); ASSERT(!dfp[2].length); @@ -605,10 +716,10 @@ xfs_dir2_data_make_free( * The entry before us is free, merge with it. */ else if (prevdup) { - dfp =3D xfs_dir2_data_freefind(d, prevdup); + dfp =3D xfs_dir2_data_freefind(hdr, prevdup); be16_add_cpu(&prevdup->length, len); *xfs_dir2_data_unused_tag_p(prevdup) =3D - cpu_to_be16((char *)prevdup - (char *)d); + cpu_to_be16((char *)prevdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, prevdup); /* * If the previous entry was in the table, the new entry @@ -616,27 +727,27 @@ xfs_dir2_data_make_free( * the old one and add the new one. */ if (dfp) { - xfs_dir2_data_freeremove(d, dfp, needlogp); - (void)xfs_dir2_data_freeinsert(d, prevdup, needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); + xfs_dir2_data_freeinsert(hdr, prevdup, needlogp); } /* * Otherwise we need a scan if the new entry is big enough. */ else { needscan =3D be16_to_cpu(prevdup->length) > - be16_to_cpu(d->hdr.bestfree[2].length); + be16_to_cpu(hdr->bestfree[2].length); } } /* * The following entry is free, merge with it. */ else if (postdup) { - dfp =3D xfs_dir2_data_freefind(d, postdup); - newdup =3D (xfs_dir2_data_unused_t *)((char *)d + offset); + dfp =3D xfs_dir2_data_freefind(hdr, postdup); + newdup =3D (xfs_dir2_data_unused_t *)((char *)hdr + offset); newdup->freetag =3D cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); newdup->length =3D cpu_to_be16(len + be16_to_cpu(postdup->length)); *xfs_dir2_data_unused_tag_p(newdup) =3D - cpu_to_be16((char *)newdup - (char *)d); + cpu_to_be16((char *)newdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup); /* * If the following entry was in the table, the new entry @@ -644,28 +755,28 @@ xfs_dir2_data_make_free( * the old one and add the new one. */ if (dfp) { - xfs_dir2_data_freeremove(d, dfp, needlogp); - (void)xfs_dir2_data_freeinsert(d, newdup, needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); + xfs_dir2_data_freeinsert(hdr, newdup, needlogp); } /* * Otherwise we need a scan if the new entry is big enough. */ else { needscan =3D be16_to_cpu(newdup->length) > - be16_to_cpu(d->hdr.bestfree[2].length); + be16_to_cpu(hdr->bestfree[2].length); } } /* * Neither neighbor is free. Make a new entry. */ else { - newdup =3D (xfs_dir2_data_unused_t *)((char *)d + offset); + newdup =3D (xfs_dir2_data_unused_t *)((char *)hdr + offset); newdup->freetag =3D cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); newdup->length =3D cpu_to_be16(len); *xfs_dir2_data_unused_tag_p(newdup) =3D - cpu_to_be16((char *)newdup - (char *)d); + cpu_to_be16((char *)newdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup); - (void)xfs_dir2_data_freeinsert(d, newdup, needlogp); + xfs_dir2_data_freeinsert(hdr, newdup, needlogp); } *needscanp =3D needscan; } @@ -675,15 +786,15 @@ xfs_dir2_data_make_free( */ void xfs_dir2_data_use_free( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* data block buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp, xfs_dir2_data_unused_t *dup, /* unused entry */ xfs_dir2_data_aoff_t offset, /* starting offset to use */ xfs_dir2_data_aoff_t len, /* length to use */ int *needlogp, /* out: need to log header */ int *needscanp) /* out: need regen bestfree */ { - xfs_dir2_data_t *d; /* data block */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_data_free_t *dfp; /* bestfree pointer */ int matchback; /* matches end of freespace */ int matchfront; /* matches start of freespace */ @@ -692,24 +803,24 @@ xfs_dir2_data_use_free( xfs_dir2_data_unused_t *newdup2; /* another new unused entry */ int oldlen; /* old unused entry's length */ =20 - d =3D bp->data; - ASSERT(be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC || - be32_to_cpu(d->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC); + hdr =3D bp->b_addr; + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); ASSERT(be16_to_cpu(dup->freetag) =3D=3D XFS_DIR2_DATA_FREE_TAG); - ASSERT(offset >=3D (char *)dup - (char *)d); - ASSERT(offset + len <=3D (char *)dup + be16_to_cpu(dup->length) - (char *= )d); - ASSERT((char *)dup - (char *)d =3D=3D be16_to_cpu(*xfs_dir2_data_unused_t= ag_p(dup))); + ASSERT(offset >=3D (char *)dup - (char *)hdr); + ASSERT(offset + len <=3D (char *)dup + be16_to_cpu(dup->length) - (char *= )hdr); + ASSERT((char *)dup - (char *)hdr =3D=3D be16_to_cpu(*xfs_dir2_data_unused= _tag_p(dup))); /* * Look up the entry in the bestfree table. */ - dfp =3D xfs_dir2_data_freefind(d, dup); + dfp =3D xfs_dir2_data_freefind(hdr, dup); oldlen =3D be16_to_cpu(dup->length); - ASSERT(dfp || oldlen <=3D be16_to_cpu(d->hdr.bestfree[2].length)); + ASSERT(dfp || oldlen <=3D be16_to_cpu(hdr->bestfree[2].length)); /* * Check for alignment with front and back of the entry. */ - matchfront =3D (char *)dup - (char *)d =3D=3D offset; - matchback =3D (char *)dup + oldlen - (char *)d =3D=3D offset + len; + matchfront =3D (char *)dup - (char *)hdr =3D=3D offset; + matchback =3D (char *)dup + oldlen - (char *)hdr =3D=3D offset + len; ASSERT(*needscanp =3D=3D 0); needscan =3D 0; /* @@ -718,9 +829,9 @@ xfs_dir2_data_use_free( */ if (matchfront && matchback) { if (dfp) { - needscan =3D (d->hdr.bestfree[2].offset !=3D 0); + needscan =3D (hdr->bestfree[2].offset !=3D 0); if (!needscan) - xfs_dir2_data_freeremove(d, dfp, needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); } } /* @@ -728,27 +839,27 @@ xfs_dir2_data_use_free( * Make a new entry with the remaining freespace. */ else if (matchfront) { - newdup =3D (xfs_dir2_data_unused_t *)((char *)d + offset + len); + newdup =3D (xfs_dir2_data_unused_t *)((char *)hdr + offset + len); newdup->freetag =3D cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); newdup->length =3D cpu_to_be16(oldlen - len); *xfs_dir2_data_unused_tag_p(newdup) =3D - cpu_to_be16((char *)newdup - (char *)d); + cpu_to_be16((char *)newdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup); /* * If it was in the table, remove it and add the new one. */ if (dfp) { - xfs_dir2_data_freeremove(d, dfp, needlogp); - dfp =3D xfs_dir2_data_freeinsert(d, newdup, needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); + dfp =3D xfs_dir2_data_freeinsert(hdr, newdup, needlogp); ASSERT(dfp !=3D NULL); ASSERT(dfp->length =3D=3D newdup->length); - ASSERT(be16_to_cpu(dfp->offset) =3D=3D (char *)newdup - (char *)d); + ASSERT(be16_to_cpu(dfp->offset) =3D=3D (char *)newdup - (char *)hdr); /* * If we got inserted at the last slot, * that means we don't know if there was a better * choice for the last slot, or not. Rescan. */ - needscan =3D dfp =3D=3D &d->hdr.bestfree[2]; + needscan =3D dfp =3D=3D &hdr->bestfree[2]; } } /* @@ -757,25 +868,25 @@ xfs_dir2_data_use_free( */ else if (matchback) { newdup =3D dup; - newdup->length =3D cpu_to_be16(((char *)d + offset) - (char *)newdup); + newdup->length =3D cpu_to_be16(((char *)hdr + offset) - (char *)newdup); *xfs_dir2_data_unused_tag_p(newdup) =3D - cpu_to_be16((char *)newdup - (char *)d); + cpu_to_be16((char *)newdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup); /* * If it was in the table, remove it and add the new one. */ if (dfp) { - xfs_dir2_data_freeremove(d, dfp, needlogp); - dfp =3D xfs_dir2_data_freeinsert(d, newdup, needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); + dfp =3D xfs_dir2_data_freeinsert(hdr, newdup, needlogp); ASSERT(dfp !=3D NULL); ASSERT(dfp->length =3D=3D newdup->length); - ASSERT(be16_to_cpu(dfp->offset) =3D=3D (char *)newdup - (char *)d); + ASSERT(be16_to_cpu(dfp->offset) =3D=3D (char *)newdup - (char *)hdr); /* * If we got inserted at the last slot, * that means we don't know if there was a better * choice for the last slot, or not. Rescan. */ - needscan =3D dfp =3D=3D &d->hdr.bestfree[2]; + needscan =3D dfp =3D=3D &hdr->bestfree[2]; } } /* @@ -784,15 +895,15 @@ xfs_dir2_data_use_free( */ else { newdup =3D dup; - newdup->length =3D cpu_to_be16(((char *)d + offset) - (char *)newdup); + newdup->length =3D cpu_to_be16(((char *)hdr + offset) - (char *)newdup); *xfs_dir2_data_unused_tag_p(newdup) =3D - cpu_to_be16((char *)newdup - (char *)d); + cpu_to_be16((char *)newdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup); - newdup2 =3D (xfs_dir2_data_unused_t *)((char *)d + offset + len); + newdup2 =3D (xfs_dir2_data_unused_t *)((char *)hdr + offset + len); newdup2->freetag =3D cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); newdup2->length =3D cpu_to_be16(oldlen - len - be16_to_cpu(newdup->lengt= h)); *xfs_dir2_data_unused_tag_p(newdup2) =3D - cpu_to_be16((char *)newdup2 - (char *)d); + cpu_to_be16((char *)newdup2 - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup2); /* * If the old entry was in the table, we need to scan @@ -803,13 +914,12 @@ xfs_dir2_data_use_free( * the 2 new will work. */ if (dfp) { - needscan =3D (d->hdr.bestfree[2].length !=3D 0); + needscan =3D (hdr->bestfree[2].length !=3D 0); if (!needscan) { - xfs_dir2_data_freeremove(d, dfp, needlogp); - (void)xfs_dir2_data_freeinsert(d, newdup, - needlogp); - (void)xfs_dir2_data_freeinsert(d, newdup2, - needlogp); + xfs_dir2_data_freeremove(hdr, dfp, needlogp); + xfs_dir2_data_freeinsert(hdr, newdup, needlogp); + xfs_dir2_data_freeinsert(hdr, newdup2, + needlogp); } } } diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 9ce2320..d303813 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -22,16 +22,93 @@ * Local function declarations. */ #ifdef DEBUG -static void xfs_dir2_leaf_check(xfs_inode_t *dp, xfs_dabuf_t *bp); +static void xfs_dir2_leaf_check(struct xfs_inode *dp, struct xfs_buf *bp); #else #define xfs_dir2_leaf_check(dp, bp) #endif -static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, xfs_dabuf_t **lbp= p, - int *indexp, xfs_dabuf_t **dbpp); -static void xfs_dir2_leaf_log_bests(struct xfs_trans *tp, struct xfs_dabuf= *bp, +static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, struct xfs_buf **= lbpp, + int *indexp, struct xfs_buf **dbpp); +static void xfs_dir2_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *= bp, int first, int last); -static void xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_dabuf = *bp); +static void xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *b= p); =20 +static void +xfs_dir2_leaf_verify( + struct xfs_buf *bp, + __be16 magic) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_dir2_leaf_hdr *hdr =3D bp->b_addr; + int block_ok =3D 0; + + block_ok =3D hdr->info.magic =3D=3D magic; + if (!block_ok) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_dir2_leaf1_read_verify( + struct xfs_buf *bp) +{ + xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); +} + +static void +xfs_dir2_leaf1_write_verify( + struct xfs_buf *bp) +{ + xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); +} + +void +xfs_dir2_leafn_read_verify( + struct xfs_buf *bp) +{ + xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); +} + +void +xfs_dir2_leafn_write_verify( + struct xfs_buf *bp) +{ + xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); +} + +static const struct xfs_buf_ops xfs_dir2_leaf1_buf_ops =3D { + .verify_read =3D xfs_dir2_leaf1_read_verify, + .verify_write =3D xfs_dir2_leaf1_write_verify, +}; + +const struct xfs_buf_ops xfs_dir2_leafn_buf_ops =3D { + .verify_read =3D xfs_dir2_leafn_read_verify, + .verify_write =3D xfs_dir2_leafn_write_verify, +}; + +static int +xfs_dir2_leaf_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t fbno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp) +{ + return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, + XFS_DATA_FORK, &xfs_dir2_leaf1_buf_ops); +} + +int +xfs_dir2_leafn_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t fbno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp) +{ + return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, + XFS_DATA_FORK, &xfs_dir2_leafn_buf_ops); +} =20 /* * Convert a block form directory to a leaf form directory. @@ -39,16 +116,16 @@ static void xfs_dir2_leaf_log_tail(struct xfs_trans *t= p, struct xfs_dabuf *bp); int /* error */ xfs_dir2_block_to_leaf( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *dbp) /* input block's buffer */ + struct xfs_buf *dbp) /* input block's buffer */ { __be16 *bestsp; /* leaf's bestsp entries */ xfs_dablk_t blkno; /* leaf block's bno */ - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_leaf_entry_t *blp; /* block's leaf entries */ xfs_dir2_block_tail_t *btp; /* block's tail */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ - xfs_dabuf_t *lbp; /* leaf block's buffer */ + struct xfs_buf *lbp; /* leaf block's buffer */ xfs_dir2_db_t ldb; /* leaf block's bno */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_tail_t *ltp; /* leaf's tail */ @@ -79,10 +156,10 @@ xfs_dir2_block_to_leaf( return error; } ASSERT(lbp !=3D NULL); - leaf =3D lbp->data; - block =3D dbp->data; + leaf =3D lbp->b_addr; + hdr =3D dbp->b_addr; xfs_dir2_data_check(dp, dbp); - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(mp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); /* * Set the counts in the leaf header. @@ -102,23 +179,24 @@ xfs_dir2_block_to_leaf( * tail be free. */ xfs_dir2_data_make_free(tp, dbp, - (xfs_dir2_data_aoff_t)((char *)blp - (char *)block), - (xfs_dir2_data_aoff_t)((char *)block + mp->m_dirblksize - + (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), + (xfs_dir2_data_aoff_t)((char *)hdr + mp->m_dirblksize - (char *)blp), &needlog, &needscan); /* * Fix up the block header, make it a data block. */ - block->hdr.magic =3D cpu_to_be32(XFS_DIR2_DATA_MAGIC); + dbp->b_ops =3D &xfs_dir2_data_buf_ops; + hdr->magic =3D cpu_to_be32(XFS_DIR2_DATA_MAGIC); if (needscan) - xfs_dir2_data_freescan(mp, (xfs_dir2_data_t *)block, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); /* * Set up leaf tail and bests table. */ ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount =3D cpu_to_be32(1); bestsp =3D xfs_dir2_leaf_bests_p(ltp); - bestsp[0] =3D block->hdr.bestfree[0].length; + bestsp[0] =3D hdr->bestfree[0].length; /* * Log the data header and leaf bests table. */ @@ -127,10 +205,134 @@ xfs_dir2_block_to_leaf( xfs_dir2_leaf_check(dp, lbp); xfs_dir2_data_check(dp, dbp); xfs_dir2_leaf_log_bests(tp, lbp, 0, 0); - xfs_da_buf_done(lbp); return 0; } =20 +STATIC void +xfs_dir2_leaf_find_stale( + struct xfs_dir2_leaf *leaf, + int index, + int *lowstale, + int *highstale) +{ + /* + * Find the first stale entry before our index, if any. + */ + for (*lowstale =3D index - 1; *lowstale >=3D 0; --*lowstale) { + if (leaf->ents[*lowstale].address =3D=3D + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + break; + } + + /* + * Find the first stale entry at or after our index, if any. + * Stop if the result would require moving more entries than using + * lowstale. + */ + for (*highstale =3D index; + *highstale < be16_to_cpu(leaf->hdr.count); + ++*highstale) { + if (leaf->ents[*highstale].address =3D=3D + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + break; + if (*lowstale >=3D 0 && index - *lowstale <=3D *highstale - index) + break; + } +} + +struct xfs_dir2_leaf_entry * +xfs_dir2_leaf_find_entry( + xfs_dir2_leaf_t *leaf, /* leaf structure */ + int index, /* leaf table position */ + int compact, /* need to compact leaves */ + int lowstale, /* index of prev stale leaf */ + int highstale, /* index of next stale leaf */ + int *lfloglow, /* low leaf logging index */ + int *lfloghigh) /* high leaf logging index */ +{ + if (!leaf->hdr.stale) { + xfs_dir2_leaf_entry_t *lep; /* leaf entry table pointer */ + + /* + * Now we need to make room to insert the leaf entry. + * + * If there are no stale entries, just insert a hole at index. + */ + lep =3D &leaf->ents[index]; + if (index < be16_to_cpu(leaf->hdr.count)) + memmove(lep + 1, lep, + (be16_to_cpu(leaf->hdr.count) - index) * + sizeof(*lep)); + + /* + * Record low and high logging indices for the leaf. + */ + *lfloglow =3D index; + *lfloghigh =3D be16_to_cpu(leaf->hdr.count); + be16_add_cpu(&leaf->hdr.count, 1); + return lep; + } + + /* + * There are stale entries. + * + * We will use one of them for the new entry. It's probably not at + * the right location, so we'll have to shift some up or down first. + * + * If we didn't compact before, we need to find the nearest stale + * entries before and after our insertion point. + */ + if (compact =3D=3D 0) + xfs_dir2_leaf_find_stale(leaf, index, &lowstale, &highstale); + + /* + * If the low one is better, use it. + */ + if (lowstale >=3D 0 && + (highstale =3D=3D be16_to_cpu(leaf->hdr.count) || + index - lowstale - 1 < highstale - index)) { + ASSERT(index - lowstale - 1 >=3D 0); + ASSERT(leaf->ents[lowstale].address =3D=3D + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); + + /* + * Copy entries up to cover the stale entry and make room + * for the new entry. + */ + if (index - lowstale - 1 > 0) { + memmove(&leaf->ents[lowstale], + &leaf->ents[lowstale + 1], + (index - lowstale - 1) * + sizeof(xfs_dir2_leaf_entry_t)); + } + *lfloglow =3D MIN(lowstale, *lfloglow); + *lfloghigh =3D MAX(index - 1, *lfloghigh); + be16_add_cpu(&leaf->hdr.stale, -1); + return &leaf->ents[index - 1]; + } + + /* + * The high one is better, so use that one. + */ + ASSERT(highstale - index >=3D 0); + ASSERT(leaf->ents[highstale].address =3D=3D + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); + + /* + * Copy entries down to cover the stale entry and make room for the + * new entry. + */ + if (highstale - index > 0) { + memmove(&leaf->ents[index + 1], + &leaf->ents[index], + (highstale - index) * sizeof(xfs_dir2_leaf_entry_t)); + } + *lfloglow =3D MIN(index, *lfloglow); + *lfloghigh =3D MAX(highstale, *lfloghigh); + be16_add_cpu(&leaf->hdr.stale, -1); + return &leaf->ents[index]; +} + /* * Add an entry to a leaf form directory. */ @@ -140,8 +342,8 @@ xfs_dir2_leaf_addname( { __be16 *bestsp; /* freespace table in leaf */ int compact; /* need to compact leaves */ - xfs_dir2_data_t *data; /* data block structure */ - xfs_dabuf_t *dbp; /* data block buffer */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ + struct xfs_buf *dbp; /* data block buffer */ xfs_dir2_data_entry_t *dep; /* data block entry */ xfs_inode_t *dp; /* incore directory inode */ xfs_dir2_data_unused_t *dup; /* data unused entry */ @@ -150,7 +352,7 @@ xfs_dir2_leaf_addname( int highstale; /* index of next stale leaf */ int i; /* temporary, index */ int index; /* leaf table position */ - xfs_dabuf_t *lbp; /* leaf's buffer */ + struct xfs_buf *lbp; /* leaf's buffer */ xfs_dir2_leaf_t *leaf; /* leaf structure */ int length; /* length of new entry */ xfs_dir2_leaf_entry_t *lep; /* leaf entry table pointer */ @@ -171,15 +373,11 @@ xfs_dir2_leaf_addname( dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; - /* - * Read the leaf block. - */ - error =3D xfs_da_read_buf(tp, dp, mp->m_dirleafblk, -1, &lbp, - XFS_DATA_FORK); - if (error) { + + error =3D xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + if (error) return error; - } - ASSERT(lbp !=3D NULL); + /* * Look up the entry by hash value and name. * We know it's not there, our caller has already done a lookup. @@ -187,7 +385,7 @@ xfs_dir2_leaf_addname( * But if there are dup hash values the index is of the first of those. */ index =3D xfs_dir2_leaf_search_hash(args, lbp); - leaf =3D lbp->data; + leaf =3D lbp->b_addr; ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); bestsp =3D xfs_dir2_leaf_bests_p(ltp); length =3D xfs_dir2_data_entsize(args->namelen); @@ -204,7 +402,7 @@ xfs_dir2_leaf_addname( continue; i =3D xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); ASSERT(i < be32_to_cpu(ltp->bestcount)); - ASSERT(be16_to_cpu(bestsp[i]) !=3D NULLDATAOFF); + ASSERT(bestsp[i] !=3D cpu_to_be16(NULLDATAOFF)); if (be16_to_cpu(bestsp[i]) >=3D length) { use_block =3D i; break; @@ -218,7 +416,8 @@ xfs_dir2_leaf_addname( /* * Remember a block we see that's missing. */ - if (be16_to_cpu(bestsp[i]) =3D=3D NULLDATAOFF && use_block =3D=3D -1) + if (bestsp[i] =3D=3D cpu_to_be16(NULLDATAOFF) && + use_block =3D=3D -1) use_block =3D i; else if (be16_to_cpu(bestsp[i]) >=3D length) { use_block =3D i; @@ -229,14 +428,17 @@ xfs_dir2_leaf_addname( /* * How many bytes do we need in the leaf block? */ - needbytes =3D - (leaf->hdr.stale ? 0 : (uint)sizeof(leaf->ents[0])) + - (use_block !=3D -1 ? 0 : (uint)sizeof(leaf->bests[0])); + needbytes =3D 0; + if (!leaf->hdr.stale) + needbytes +=3D sizeof(xfs_dir2_leaf_entry_t); + if (use_block =3D=3D -1) + needbytes +=3D sizeof(xfs_dir2_data_off_t); + /* * Now kill use_block if it refers to a missing block, so we * can use it as an indication of allocation needed. */ - if (use_block !=3D -1 && be16_to_cpu(bestsp[use_block]) =3D=3D NULLDATAOF= F) + if (use_block !=3D -1 && bestsp[use_block] =3D=3D cpu_to_be16(NULLDATAOFF= )) use_block =3D -1; /* * If we don't have enough free bytes but we can make enough @@ -257,14 +459,13 @@ xfs_dir2_leaf_addname( */ if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || args->total =3D=3D 0) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return XFS_ERROR(ENOSPC); } /* * Convert to node form. */ error =3D xfs_dir2_leaf_to_node(args, lbp); - xfs_da_buf_done(lbp); if (error) return error; /* @@ -282,7 +483,7 @@ xfs_dir2_leaf_addname( * a new data block. */ if (args->op_flags & XFS_DA_OP_JUSTCHECK) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return use_block =3D=3D -1 ? XFS_ERROR(ENOSPC) : 0; } /* @@ -290,7 +491,7 @@ xfs_dir2_leaf_addname( * changed anything. */ if (args->total =3D=3D 0 && use_block =3D=3D -1) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return XFS_ERROR(ENOSPC); } /* @@ -321,14 +522,14 @@ xfs_dir2_leaf_addname( */ if ((error =3D xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, &use_block))) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return error; } /* * Initialize the block. */ if ((error =3D xfs_dir2_data_init(args, use_block, &dbp))) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return error; } /* @@ -348,37 +549,36 @@ xfs_dir2_leaf_addname( */ else xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); - data =3D dbp->data; - bestsp[use_block] =3D data->hdr.bestfree[0].length; + hdr =3D dbp->b_addr; + bestsp[use_block] =3D hdr->bestfree[0].length; grown =3D 1; - } - /* - * Already had space in some data block. - * Just read that one in. - */ - else { - if ((error =3D - xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, use_block), - -1, &dbp, XFS_DATA_FORK))) { - xfs_da_brelse(tp, lbp); + } else { + /* + * Already had space in some data block. + * Just read that one in. + */ + error =3D xfs_dir2_data_read(tp, dp, + xfs_dir2_db_to_da(mp, use_block), + -1, &dbp); + if (error) { + xfs_trans_brelse(tp, lbp); return error; } - data =3D dbp->data; + hdr =3D dbp->b_addr; grown =3D 0; } - xfs_dir2_data_check(dp, dbp); /* * Point to the biggest freespace in our data block. */ dup =3D (xfs_dir2_data_unused_t *) - ((char *)data + be16_to_cpu(data->hdr.bestfree[0].offset)); + ((char *)hdr + be16_to_cpu(hdr->bestfree[0].offset)); ASSERT(be16_to_cpu(dup->length) >=3D length); needscan =3D needlog =3D 0; /* * Mark the initial part of our freespace in use for the new entry. */ xfs_dir2_data_use_free(tp, dbp, dup, - (xfs_dir2_data_aoff_t)((char *)dup - (char *)data), length, + (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, &needlog, &needscan); /* * Initialize our new entry (at last). @@ -388,12 +588,12 @@ xfs_dir2_leaf_addname( dep->namelen =3D args->namelen; memcpy(dep->name, args->name, dep->namelen); tagp =3D xfs_dir2_data_entry_tag_p(dep); - *tagp =3D cpu_to_be16((char *)dep - (char *)data); + *tagp =3D cpu_to_be16((char *)dep - (char *)hdr); /* * Need to scan fix up the bestfree table. */ if (needscan) - xfs_dir2_data_freescan(mp, data, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); /* * Need to log the data block's header. */ @@ -404,107 +604,15 @@ xfs_dir2_leaf_addname( * If the bests table needs to be changed, do it. * Log the change unless we've already done that. */ - if (be16_to_cpu(bestsp[use_block]) !=3D be16_to_cpu(data->hdr.bestfree[0]= =2Elength)) { - bestsp[use_block] =3D data->hdr.bestfree[0].length; + if (be16_to_cpu(bestsp[use_block]) !=3D be16_to_cpu(hdr->bestfree[0].leng= th)) { + bestsp[use_block] =3D hdr->bestfree[0].length; if (!grown) xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); } - /* - * Now we need to make room to insert the leaf entry. - * If there are no stale entries, we just insert a hole at index. - */ - if (!leaf->hdr.stale) { - /* - * lep is still good as the index leaf entry. - */ - if (index < be16_to_cpu(leaf->hdr.count)) - memmove(lep + 1, lep, - (be16_to_cpu(leaf->hdr.count) - index) * sizeof(*lep)); - /* - * Record low and high logging indices for the leaf. - */ - lfloglow =3D index; - lfloghigh =3D be16_to_cpu(leaf->hdr.count); - be16_add_cpu(&leaf->hdr.count, 1); - } - /* - * There are stale entries. - * We will use one of them for the new entry. - * It's probably not at the right location, so we'll have to - * shift some up or down first. - */ - else { - /* - * If we didn't compact before, we need to find the nearest - * stale entries before and after our insertion point. - */ - if (compact =3D=3D 0) { - /* - * Find the first stale entry before the insertion - * point, if any. - */ - for (lowstale =3D index - 1; - lowstale >=3D 0 && - be32_to_cpu(leaf->ents[lowstale].address) !=3D - XFS_DIR2_NULL_DATAPTR; - lowstale--) - continue; - /* - * Find the next stale entry at or after the insertion - * point, if any. Stop if we go so far that the - * lowstale entry would be better. - */ - for (highstale =3D index; - highstale < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(leaf->ents[highstale].address) !=3D - XFS_DIR2_NULL_DATAPTR && - (lowstale < 0 || - index - lowstale - 1 >=3D highstale - index); - highstale++) - continue; - } - /* - * If the low one is better, use it. - */ - if (lowstale >=3D 0 && - (highstale =3D=3D be16_to_cpu(leaf->hdr.count) || - index - lowstale - 1 < highstale - index)) { - ASSERT(index - lowstale - 1 >=3D 0); - ASSERT(be32_to_cpu(leaf->ents[lowstale].address) =3D=3D - XFS_DIR2_NULL_DATAPTR); - /* - * Copy entries up to cover the stale entry - * and make room for the new entry. - */ - if (index - lowstale - 1 > 0) - memmove(&leaf->ents[lowstale], - &leaf->ents[lowstale + 1], - (index - lowstale - 1) * sizeof(*lep)); - lep =3D &leaf->ents[index - 1]; - lfloglow =3D MIN(lowstale, lfloglow); - lfloghigh =3D MAX(index - 1, lfloghigh); - } - /* - * The high one is better, so use that one. - */ - else { - ASSERT(highstale - index >=3D 0); - ASSERT(be32_to_cpu(leaf->ents[highstale].address) =3D=3D - XFS_DIR2_NULL_DATAPTR); - /* - * Copy entries down to cover the stale entry - * and make room for the new entry. - */ - if (highstale - index > 0) - memmove(&leaf->ents[index + 1], - &leaf->ents[index], - (highstale - index) * sizeof(*lep)); - lep =3D &leaf->ents[index]; - lfloglow =3D MIN(index, lfloglow); - lfloghigh =3D MAX(highstale, lfloghigh); - } - be16_add_cpu(&leaf->hdr.stale, -1); - } + + lep =3D xfs_dir2_leaf_find_entry(leaf, index, compact, lowstale, + highstale, &lfloglow, &lfloghigh); + /* * Fill in the new leaf entry. */ @@ -517,9 +625,7 @@ xfs_dir2_leaf_addname( xfs_dir2_leaf_log_header(tp, lbp); xfs_dir2_leaf_log_ents(tp, lbp, lfloglow, lfloghigh); xfs_dir2_leaf_check(dp, lbp); - xfs_da_buf_done(lbp); xfs_dir2_data_check(dp, dbp); - xfs_da_buf_done(dbp); return 0; } =20 @@ -530,8 +636,8 @@ xfs_dir2_leaf_addname( */ STATIC void xfs_dir2_leaf_check( - xfs_inode_t *dp, /* incore directory inode */ - xfs_dabuf_t *bp) /* leaf's buffer */ + struct xfs_inode *dp, /* incore directory inode */ + struct xfs_buf *bp) /* leaf's buffer */ { int i; /* leaf index */ xfs_dir2_leaf_t *leaf; /* leaf structure */ @@ -539,9 +645,9 @@ xfs_dir2_leaf_check( xfs_mount_t *mp; /* filesystem mount point */ int stale; /* count of stale leaves */ =20 - leaf =3D bp->data; + leaf =3D bp->b_addr; mp =3D dp->i_mount; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAF1_MAGIC); + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); /* * This value is not restrictive enough. * Should factor in the size of the bests table as well. @@ -561,7 +667,7 @@ xfs_dir2_leaf_check( if (i + 1 < be16_to_cpu(leaf->hdr.count)) ASSERT(be32_to_cpu(leaf->ents[i].hashval) <=3D be32_to_cpu(leaf->ents[i + 1].hashval)); - if (be32_to_cpu(leaf->ents[i].address) =3D=3D XFS_DIR2_NULL_DATAPTR) + if (leaf->ents[i].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) stale++; } ASSERT(be16_to_cpu(leaf->hdr.stale) =3D=3D stale); @@ -575,14 +681,14 @@ xfs_dir2_leaf_check( void xfs_dir2_leaf_compact( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *bp) /* leaf buffer */ + struct xfs_buf *bp) /* leaf buffer */ { int from; /* source leaf index */ xfs_dir2_leaf_t *leaf; /* leaf structure */ int loglow; /* first leaf entry to log */ int to; /* target leaf index */ =20 - leaf =3D bp->data; + leaf =3D bp->b_addr; if (!leaf->hdr.stale) { return; } @@ -590,7 +696,8 @@ xfs_dir2_leaf_compact( * Compress out the stale entries in place. */ for (from =3D to =3D 0, loglow =3D -1; from < be16_to_cpu(leaf->hdr.count= ); from++) { - if (be32_to_cpu(leaf->ents[from].address) =3D=3D XFS_DIR2_NULL_DATAPTR) + if (leaf->ents[from].address =3D=3D + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) continue; /* * Only actually copy the entries that are different. @@ -623,7 +730,7 @@ xfs_dir2_leaf_compact( */ void xfs_dir2_leaf_compact_x1( - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ int *indexp, /* insertion index */ int *lowstalep, /* out: stale entry before us */ int *highstalep, /* out: stale entry after us */ @@ -639,27 +746,12 @@ xfs_dir2_leaf_compact_x1( int newindex=3D0; /* new insertion index */ int to; /* destination copy index */ =20 - leaf =3D bp->data; + leaf =3D bp->b_addr; ASSERT(be16_to_cpu(leaf->hdr.stale) > 1); index =3D *indexp; - /* - * Find the first stale entry before our index, if any. - */ - for (lowstale =3D index - 1; - lowstale >=3D 0 && - be32_to_cpu(leaf->ents[lowstale].address) !=3D XFS_DIR2_NULL_DATAPTR; - lowstale--) - continue; - /* - * Find the first stale entry at or after our index, if any. - * Stop if the answer would be worse than lowstale. - */ - for (highstale =3D index; - highstale < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(leaf->ents[highstale].address) !=3D XFS_DIR2_NULL_DATAPTR && - (lowstale < 0 || index - lowstale > highstale - index); - highstale++) - continue; + + xfs_dir2_leaf_find_stale(leaf, index, &lowstale, &highstale); + /* * Pick the better of lowstale and highstale. */ @@ -680,7 +772,8 @@ xfs_dir2_leaf_compact_x1( if (index =3D=3D from) newindex =3D to; if (from !=3D keepstale && - be32_to_cpu(leaf->ents[from].address) =3D=3D XFS_DIR2_NULL_DATAPTR) { + leaf->ents[from].address =3D=3D + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) { if (from =3D=3D to) *lowlogp =3D to; continue; @@ -730,10 +823,10 @@ int xfs_dir2_leaf_init( xfs_da_args_t *args, /* operation arguments */ xfs_dir2_db_t bno, /* directory block number */ - xfs_dabuf_t **bpp, /* out: leaf buffer */ + struct xfs_buf **bpp, /* out: leaf buffer */ int magic) /* magic number for block */ { - xfs_dabuf_t *bp; /* leaf buffer */ + struct xfs_buf *bp; /* leaf buffer */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ xfs_dir2_leaf_t *leaf; /* leaf structure */ @@ -751,15 +844,14 @@ xfs_dir2_leaf_init( * Get the buffer for the block. */ error =3D xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, - XFS_DATA_FORK); - if (error) { + XFS_DATA_FORK); + if (error) return error; - } - ASSERT(bp !=3D NULL); - leaf =3D bp->data; + /* * Initialize the header. */ + leaf =3D bp->b_addr; leaf->hdr.info.magic =3D cpu_to_be16(magic); leaf->hdr.info.forw =3D 0; leaf->hdr.info.back =3D 0; @@ -772,10 +864,12 @@ xfs_dir2_leaf_init( * the block. */ if (magic =3D=3D XFS_DIR2_LEAF1_MAGIC) { + bp->b_ops =3D &xfs_dir2_leaf1_buf_ops; ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount =3D 0; xfs_dir2_leaf_log_tail(tp, bp); - } + } else + bp->b_ops =3D &xfs_dir2_leafn_buf_ops; *bpp =3D bp; return 0; } @@ -786,7 +880,7 @@ xfs_dir2_leaf_init( static void xfs_dir2_leaf_log_bests( xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ int last) /* last entry to log */ { @@ -795,12 +889,12 @@ xfs_dir2_leaf_log_bests( xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAF1_MAGIC); + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); ltp =3D xfs_dir2_leaf_tail_p(tp->t_mountp, leaf); firstb =3D xfs_dir2_leaf_bests_p(ltp) + first; lastb =3D xfs_dir2_leaf_bests_p(ltp) + last; - xfs_da_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf), + xfs_trans_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf), (uint)((char *)lastb - (char *)leaf + sizeof(*lastb) - 1)); } =20 @@ -810,7 +904,7 @@ xfs_dir2_leaf_log_bests( void xfs_dir2_leaf_log_ents( xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ int last) /* last entry to log */ { @@ -818,12 +912,12 @@ xfs_dir2_leaf_log_ents( xfs_dir2_leaf_entry_t *lastlep; /* pointer to last entry */ xfs_dir2_leaf_t *leaf; /* leaf structure */ =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAF1_MAGIC || - be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); firstlep =3D &leaf->ents[first]; lastlep =3D &leaf->ents[last]; - xfs_da_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), + xfs_trans_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), (uint)((char *)lastlep - (char *)leaf + sizeof(*lastlep) - 1)); } =20 @@ -832,15 +926,15 @@ xfs_dir2_leaf_log_ents( */ void xfs_dir2_leaf_log_header( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp) /* leaf buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp) { xfs_dir2_leaf_t *leaf; /* leaf structure */ =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAF1_MAGIC || - be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); - xfs_da_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), (uint)(sizeof(leaf->hdr) - 1)); } =20 @@ -849,18 +943,18 @@ xfs_dir2_leaf_log_header( */ STATIC void xfs_dir2_leaf_log_tail( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp) /* leaf buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp) { xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ xfs_mount_t *mp; /* filesystem mount point */ =20 mp =3D tp->t_mountp; - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAF1_MAGIC); + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); - xfs_da_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), + xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), (uint)(mp->m_dirblksize - 1)); } =20 @@ -873,12 +967,12 @@ int xfs_dir2_leaf_lookup( xfs_da_args_t *args) /* operation arguments */ { - xfs_dabuf_t *dbp; /* data block buffer */ + struct xfs_buf *dbp; /* data block buffer */ xfs_dir2_data_entry_t *dep; /* data block entry */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ int index; /* found entry index */ - xfs_dabuf_t *lbp; /* leaf buffer */ + struct xfs_buf *lbp; /* leaf buffer */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ @@ -894,7 +988,7 @@ xfs_dir2_leaf_lookup( tp =3D args->trans; dp =3D args->dp; xfs_dir2_leaf_check(dp, lbp); - leaf =3D lbp->data; + leaf =3D lbp->b_addr; /* * Get to the leaf entry and contained data entry address. */ @@ -903,15 +997,15 @@ xfs_dir2_leaf_lookup( * Point to the data entry. */ dep =3D (xfs_dir2_data_entry_t *) - ((char *)dbp->data + + ((char *)dbp->b_addr + xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); /* * Return the found inode number & CI name if appropriate */ args->inumber =3D be64_to_cpu(dep->inumber); error =3D xfs_dir_cilookup_result(args, dep->name, dep->namelen); - xfs_da_brelse(tp, dbp); - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, dbp); + xfs_trans_brelse(tp, lbp); return XFS_ERROR(error); } =20 @@ -924,17 +1018,17 @@ xfs_dir2_leaf_lookup( static int /* error */ xfs_dir2_leaf_lookup_int( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t **lbpp, /* out: leaf buffer */ + struct xfs_buf **lbpp, /* out: leaf buffer */ int *indexp, /* out: index in leaf block */ - xfs_dabuf_t **dbpp) /* out: data buffer */ + struct xfs_buf **dbpp) /* out: data buffer */ { xfs_dir2_db_t curdb =3D -1; /* current data block number */ - xfs_dabuf_t *dbp =3D NULL; /* data buffer */ + struct xfs_buf *dbp =3D NULL; /* data buffer */ xfs_dir2_data_entry_t *dep; /* data entry */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ int index; /* index in leaf block */ - xfs_dabuf_t *lbp; /* leaf buffer */ + struct xfs_buf *lbp; /* leaf buffer */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_mount_t *mp; /* filesystem mount point */ @@ -946,15 +1040,13 @@ xfs_dir2_leaf_lookup_int( dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; - /* - * Read the leaf block into the buffer. - */ - error =3D xfs_da_read_buf(tp, dp, mp->m_dirleafblk, -1, &lbp, - XFS_DATA_FORK); + + error =3D xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); if (error) return error; + *lbpp =3D lbp; - leaf =3D lbp->data; + leaf =3D lbp->b_addr; xfs_dir2_leaf_check(dp, lbp); /* * Look for the first leaf entry with our hash value. @@ -982,21 +1074,20 @@ xfs_dir2_leaf_lookup_int( */ if (newdb !=3D curdb) { if (dbp) - xfs_da_brelse(tp, dbp); - error =3D xfs_da_read_buf(tp, dp, - xfs_dir2_db_to_da(mp, newdb), - -1, &dbp, XFS_DATA_FORK); + xfs_trans_brelse(tp, dbp); + error =3D xfs_dir2_data_read(tp, dp, + xfs_dir2_db_to_da(mp, newdb), + -1, &dbp); if (error) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return error; } - xfs_dir2_data_check(dp, dbp); curdb =3D newdb; } /* * Point to the data entry. */ - dep =3D (xfs_dir2_data_entry_t *)((char *)dbp->data + + dep =3D (xfs_dir2_data_entry_t *)((char *)dbp->b_addr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); /* * Compare name and if it's an exact match, return the index @@ -1024,12 +1115,12 @@ xfs_dir2_leaf_lookup_int( if (args->cmpresult =3D=3D XFS_CMP_CASE) { ASSERT(cidb !=3D -1); if (cidb !=3D curdb) { - xfs_da_brelse(tp, dbp); - error =3D xfs_da_read_buf(tp, dp, - xfs_dir2_db_to_da(mp, cidb), - -1, &dbp, XFS_DATA_FORK); + xfs_trans_brelse(tp, dbp); + error =3D xfs_dir2_data_read(tp, dp, + xfs_dir2_db_to_da(mp, cidb), + -1, &dbp); if (error) { - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return error; } } @@ -1041,8 +1132,8 @@ xfs_dir2_leaf_lookup_int( */ ASSERT(cidb =3D=3D -1); if (dbp) - xfs_da_brelse(tp, dbp); - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, dbp); + xfs_trans_brelse(tp, lbp); return XFS_ERROR(ENOENT); } =20 @@ -1054,15 +1145,15 @@ xfs_dir2_leaf_removename( xfs_da_args_t *args) /* operation arguments */ { __be16 *bestsp; /* leaf block best freespace */ - xfs_dir2_data_t *data; /* data block structure */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_db_t db; /* data block number */ - xfs_dabuf_t *dbp; /* data block buffer */ + struct xfs_buf *dbp; /* data block buffer */ xfs_dir2_data_entry_t *dep; /* data entry structure */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ xfs_dir2_db_t i; /* temporary data block # */ int index; /* index into leaf entries */ - xfs_dabuf_t *lbp; /* leaf buffer */ + struct xfs_buf *lbp; /* leaf buffer */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ @@ -1083,8 +1174,8 @@ xfs_dir2_leaf_removename( dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; - leaf =3D lbp->data; - data =3D dbp->data; + leaf =3D lbp->b_addr; + hdr =3D dbp->b_addr; xfs_dir2_data_check(dp, dbp); /* * Point to the leaf entry, use that to point to the data entry. @@ -1092,9 +1183,9 @@ xfs_dir2_leaf_removename( lep =3D &leaf->ents[index]; db =3D xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); dep =3D (xfs_dir2_data_entry_t *) - ((char *)data + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->addres= s))); + ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address= ))); needscan =3D needlog =3D 0; - oldbest =3D be16_to_cpu(data->hdr.bestfree[0].length); + oldbest =3D be16_to_cpu(hdr->bestfree[0].length); ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); bestsp =3D xfs_dir2_leaf_bests_p(ltp); ASSERT(be16_to_cpu(bestsp[db]) =3D=3D oldbest); @@ -1102,7 +1193,7 @@ xfs_dir2_leaf_removename( * Mark the former data entry unused. */ xfs_dir2_data_make_free(tp, dbp, - (xfs_dir2_data_aoff_t)((char *)dep - (char *)data), + (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); /* * We just mark the leaf entry stale by putting a null in it. @@ -1116,23 +1207,23 @@ xfs_dir2_leaf_removename( * log the data block header if necessary. */ if (needscan) - xfs_dir2_data_freescan(mp, data, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, dbp); /* * If the longest freespace in the data block has changed, * put the new value in the bests table and log that. */ - if (be16_to_cpu(data->hdr.bestfree[0].length) !=3D oldbest) { - bestsp[db] =3D data->hdr.bestfree[0].length; + if (be16_to_cpu(hdr->bestfree[0].length) !=3D oldbest) { + bestsp[db] =3D hdr->bestfree[0].length; xfs_dir2_leaf_log_bests(tp, lbp, db, db); } xfs_dir2_data_check(dp, dbp); /* * If the data block is now empty then get rid of the data block. */ - if (be16_to_cpu(data->hdr.bestfree[0].length) =3D=3D - mp->m_dirblksize - (uint)sizeof(data->hdr)) { + if (be16_to_cpu(hdr->bestfree[0].length) =3D=3D + mp->m_dirblksize - (uint)sizeof(*hdr)) { ASSERT(db !=3D mp->m_dirdatablk); if ((error =3D xfs_dir2_shrink_inode(args, db, dbp))) { /* @@ -1141,12 +1232,9 @@ xfs_dir2_leaf_removename( * Just go on, returning success, leaving the * empty block in place. */ - if (error =3D=3D ENOSPC && args->total =3D=3D 0) { - xfs_da_buf_done(dbp); + if (error =3D=3D ENOSPC && args->total =3D=3D 0) error =3D 0; - } xfs_dir2_leaf_check(dp, lbp); - xfs_da_buf_done(lbp); return error; } dbp =3D NULL; @@ -1159,7 +1247,7 @@ xfs_dir2_leaf_removename( * Look for the last active entry (i). */ for (i =3D db - 1; i > 0; i--) { - if (be16_to_cpu(bestsp[i]) !=3D NULLDATAOFF) + if (bestsp[i] !=3D cpu_to_be16(NULLDATAOFF)) break; } /* @@ -1177,10 +1265,9 @@ xfs_dir2_leaf_removename( /* * If the data block was not the first one, drop it. */ - else if (db !=3D mp->m_dirdatablk && dbp !=3D NULL) { - xfs_da_buf_done(dbp); + else if (db !=3D mp->m_dirdatablk) dbp =3D NULL; - } + xfs_dir2_leaf_check(dp, lbp); /* * See if we can convert to block form. @@ -1195,12 +1282,12 @@ int /* error */ xfs_dir2_leaf_replace( xfs_da_args_t *args) /* operation arguments */ { - xfs_dabuf_t *dbp; /* data block buffer */ + struct xfs_buf *dbp; /* data block buffer */ xfs_dir2_data_entry_t *dep; /* data block entry */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ int index; /* index of leaf entry */ - xfs_dabuf_t *lbp; /* leaf buffer */ + struct xfs_buf *lbp; /* leaf buffer */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ @@ -1214,7 +1301,7 @@ xfs_dir2_leaf_replace( return error; } dp =3D args->dp; - leaf =3D lbp->data; + leaf =3D lbp->b_addr; /* * Point to the leaf entry, get data address from it. */ @@ -1223,7 +1310,7 @@ xfs_dir2_leaf_replace( * Point to the data entry. */ dep =3D (xfs_dir2_data_entry_t *) - ((char *)dbp->data + + ((char *)dbp->b_addr + xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); ASSERT(args->inumber !=3D be64_to_cpu(dep->inumber)); /* @@ -1232,9 +1319,8 @@ xfs_dir2_leaf_replace( dep->inumber =3D cpu_to_be64(args->inumber); tp =3D args->trans; xfs_dir2_data_log_entry(tp, dbp, dep); - xfs_da_buf_done(dbp); xfs_dir2_leaf_check(dp, lbp); - xfs_da_brelse(tp, lbp); + xfs_trans_brelse(tp, lbp); return 0; } =20 @@ -1246,7 +1332,7 @@ xfs_dir2_leaf_replace( int /* index value */ xfs_dir2_leaf_search_hash( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *lbp) /* leaf buffer */ + struct xfs_buf *lbp) /* leaf buffer */ { xfs_dahash_t hash=3D0; /* hash from this entry */ xfs_dahash_t hashwant; /* hash value looking for */ @@ -1256,7 +1342,7 @@ xfs_dir2_leaf_search_hash( xfs_dir2_leaf_entry_t *lep; /* leaf entry */ int mid=3D0; /* current leaf index */ =20 - leaf =3D lbp->data; + leaf =3D lbp->b_addr; #ifndef __KERNEL__ if (!leaf->hdr.count) return 0; @@ -1299,14 +1385,11 @@ xfs_dir2_leaf_search_hash( int /* error */ xfs_dir2_leaf_trim_data( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *lbp, /* leaf buffer */ + struct xfs_buf *lbp, /* leaf buffer */ xfs_dir2_db_t db) /* data block number */ { __be16 *bestsp; /* leaf bests table */ -#ifdef DEBUG - xfs_dir2_data_t *data; /* data block structure */ -#endif - xfs_dabuf_t *dbp; /* data block buffer */ + struct xfs_buf *dbp; /* data block buffer */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return value */ xfs_dir2_leaf_t *leaf; /* leaf structure */ @@ -1320,30 +1403,30 @@ xfs_dir2_leaf_trim_data( /* * Read the offending data block. We need its buffer. */ - if ((error =3D xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &db= p, - XFS_DATA_FORK))) { + error =3D xfs_dir2_data_read(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp); + if (error) return error; - } -#ifdef DEBUG - data =3D dbp->data; - ASSERT(be32_to_cpu(data->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC); -#endif - /* this seems to be an error - * data is only valid if DEBUG is defined? - * RMC 09/08/1999 - */ =20 - leaf =3D lbp->data; + leaf =3D lbp->b_addr; ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); - ASSERT(be16_to_cpu(data->hdr.bestfree[0].length) =3D=3D - mp->m_dirblksize - (uint)sizeof(data->hdr)); + +#ifdef DEBUG +{ + struct xfs_dir2_data_hdr *hdr =3D dbp->b_addr; + + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC)); + ASSERT(be16_to_cpu(hdr->bestfree[0].length) =3D=3D + mp->m_dirblksize - (uint)sizeof(*hdr)); ASSERT(db =3D=3D be32_to_cpu(ltp->bestcount) - 1); +} +#endif + /* * Get rid of the data block. */ if ((error =3D xfs_dir2_shrink_inode(args, db, dbp))) { ASSERT(error !=3D ENOSPC); - xfs_da_brelse(tp, dbp); + xfs_trans_brelse(tp, dbp); return error; } /* @@ -1357,6 +1440,20 @@ xfs_dir2_leaf_trim_data( return 0; } =20 +static inline size_t +xfs_dir2_leaf_size( + struct xfs_dir2_leaf_hdr *hdr, + int counts) +{ + int entries; + + entries =3D be16_to_cpu(hdr->count) - be16_to_cpu(hdr->stale); + return sizeof(xfs_dir2_leaf_hdr_t) + + entries * sizeof(xfs_dir2_leaf_entry_t) + + counts * sizeof(xfs_dir2_data_off_t) + + sizeof(xfs_dir2_leaf_tail_t); +} + /* * Convert node form directory to leaf form directory. * The root of the node form dir needs to already be a LEAFN block. @@ -1369,10 +1466,10 @@ xfs_dir2_node_to_leaf( xfs_da_args_t *args; /* operation arguments */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ - xfs_dabuf_t *fbp; /* buffer for freespace block */ + struct xfs_buf *fbp; /* buffer for freespace block */ xfs_fileoff_t fo; /* freespace file offset */ xfs_dir2_free_t *free; /* freespace structure */ - xfs_dabuf_t *lbp; /* buffer for leaf block */ + struct xfs_buf *lbp; /* buffer for leaf block */ xfs_dir2_leaf_tail_t *ltp; /* tail of leaf structure */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_mount_t *mp; /* filesystem mount point */ @@ -1426,30 +1523,28 @@ xfs_dir2_node_to_leaf( if (XFS_FSB_TO_B(mp, fo) > XFS_DIR2_LEAF_OFFSET + mp->m_dirblksize) return 0; lbp =3D state->path.blk[0].bp; - leaf =3D lbp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); + leaf =3D lbp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); /* * Read the freespace block. */ - if ((error =3D xfs_da_read_buf(tp, dp, mp->m_dirfreeblk, -1, &fbp, - XFS_DATA_FORK))) { + error =3D xfs_dir2_free_read(tp, dp, mp->m_dirfreeblk, &fbp); + if (error) return error; - } - free =3D fbp->data; - ASSERT(be32_to_cpu(free->hdr.magic) =3D=3D XFS_DIR2_FREE_MAGIC); + free =3D fbp->b_addr; + ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); ASSERT(!free->hdr.firstdb); + /* * Now see if the leafn and free data will fit in a leaf1. * If not, release the buffer and give up. */ - if ((uint)sizeof(leaf->hdr) + - (be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale)) * (uint= )sizeof(leaf->ents[0]) + - be32_to_cpu(free->hdr.nvalid) * (uint)sizeof(leaf->bests[0]) + - (uint)sizeof(leaf->tail) > - mp->m_dirblksize) { - xfs_da_brelse(tp, fbp); + if (xfs_dir2_leaf_size(&leaf->hdr, be32_to_cpu(free->hdr.nvalid)) > + mp->m_dirblksize) { + xfs_trans_brelse(tp, fbp); return 0; } + /* * If the leaf has any stale entries in it, compress them out. * The compact routine will log the header. @@ -1458,7 +1553,10 @@ xfs_dir2_node_to_leaf( xfs_dir2_leaf_compact(args, lbp); else xfs_dir2_leaf_log_header(tp, lbp); + + lbp->b_ops =3D &xfs_dir2_leaf1_buf_ops; leaf->hdr.info.magic =3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC); + /* * Set up the leaf tail from the freespace block. */ @@ -1468,7 +1566,7 @@ xfs_dir2_node_to_leaf( * Set up the leaf bests table. */ memcpy(xfs_dir2_leaf_bests_p(ltp), free->bests, - be32_to_cpu(ltp->bestcount) * sizeof(leaf->bests[0])); + be32_to_cpu(ltp->bestcount) * sizeof(xfs_dir2_data_off_t)); xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); xfs_dir2_leaf_log_tail(tp, lbp); xfs_dir2_leaf_check(dp, lbp); diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index e4e20d6..649f677 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -21,40 +21,108 @@ /* * Function declarations. */ -static void xfs_dir2_free_log_header(xfs_trans_t *tp, xfs_dabuf_t *bp); -static int xfs_dir2_leafn_add(xfs_dabuf_t *bp, xfs_da_args_t *args, int in= dex); +static int xfs_dir2_leafn_add(struct xfs_buf *bp, xfs_da_args_t *args, + int index); #ifdef DEBUG -static void xfs_dir2_leafn_check(xfs_inode_t *dp, xfs_dabuf_t *bp); +static void xfs_dir2_leafn_check(struct xfs_inode *dp, struct xfs_buf *bp); #else #define xfs_dir2_leafn_check(dp, bp) #endif -static void xfs_dir2_leafn_moveents(xfs_da_args_t *args, xfs_dabuf_t *bp_s, - int start_s, xfs_dabuf_t *bp_d, int start_d, - int count); +static void xfs_dir2_leafn_moveents(xfs_da_args_t *args, struct xfs_buf *b= p_s, + int start_s, struct xfs_buf *bp_d, + int start_d, int count); static void xfs_dir2_leafn_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_da_state_blk_t *blk2); -static int xfs_dir2_leafn_remove(xfs_da_args_t *args, xfs_dabuf_t *bp, +static int xfs_dir2_leafn_remove(xfs_da_args_t *args, struct xfs_buf *bp, int index, xfs_da_state_blk_t *dblk, int *rval); static int xfs_dir2_node_addname_int(xfs_da_args_t *args, xfs_da_state_blk_t *fblk); =20 +static void +xfs_dir2_free_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_dir2_free_hdr *hdr =3D bp->b_addr; + int block_ok =3D 0; + + block_ok =3D hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC); + if (!block_ok) { + XFS_CORRUPTION_ERROR("xfs_dir2_free_verify magic", + XFS_ERRLEVEL_LOW, mp, hdr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_dir2_free_read_verify( + struct xfs_buf *bp) +{ + xfs_dir2_free_verify(bp); +} + +static void +xfs_dir2_free_write_verify( + struct xfs_buf *bp) +{ + xfs_dir2_free_verify(bp); +} + +static const struct xfs_buf_ops xfs_dir2_free_buf_ops =3D { + .verify_read =3D xfs_dir2_free_read_verify, + .verify_write =3D xfs_dir2_free_write_verify, +}; + + +static int +__xfs_dir2_free_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t fbno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp) +{ + return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, + XFS_DATA_FORK, &xfs_dir2_free_buf_ops); +} + +int +xfs_dir2_free_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t fbno, + struct xfs_buf **bpp) +{ + return __xfs_dir2_free_read(tp, dp, fbno, -1, bpp); +} + +static int +xfs_dir2_free_try_read( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dablk_t fbno, + struct xfs_buf **bpp) +{ + return __xfs_dir2_free_read(tp, dp, fbno, -2, bpp); +} + /* * Log entries from a freespace block. */ STATIC void xfs_dir2_free_log_bests( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp, /* freespace buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp, int first, /* first entry to log */ int last) /* last entry to log */ { xfs_dir2_free_t *free; /* freespace structure */ =20 - free =3D bp->data; - ASSERT(be32_to_cpu(free->hdr.magic) =3D=3D XFS_DIR2_FREE_MAGIC); - xfs_da_log_buf(tp, bp, + free =3D bp->b_addr; + ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); + xfs_trans_log_buf(tp, bp, (uint)((char *)&free->bests[first] - (char *)free), (uint)((char *)&free->bests[last] - (char *)free + sizeof(free->bests[0]) - 1)); @@ -65,14 +133,14 @@ xfs_dir2_free_log_bests( */ static void xfs_dir2_free_log_header( - xfs_trans_t *tp, /* transaction pointer */ - xfs_dabuf_t *bp) /* freespace buffer */ + struct xfs_trans *tp, + struct xfs_buf *bp) { xfs_dir2_free_t *free; /* freespace structure */ =20 - free =3D bp->data; - ASSERT(be32_to_cpu(free->hdr.magic) =3D=3D XFS_DIR2_FREE_MAGIC); - xfs_da_log_buf(tp, bp, (uint)((char *)&free->hdr - (char *)free), + free =3D bp->b_addr; + ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); + xfs_trans_log_buf(tp, bp, (uint)((char *)&free->hdr - (char *)free), (uint)(sizeof(xfs_dir2_free_hdr_t) - 1)); } =20 @@ -84,11 +152,11 @@ xfs_dir2_free_log_header( int /* error */ xfs_dir2_leaf_to_node( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *lbp) /* leaf buffer */ + struct xfs_buf *lbp) /* leaf buffer */ { xfs_inode_t *dp; /* incore directory inode */ int error; /* error return value */ - xfs_dabuf_t *fbp; /* freespace buffer */ + struct xfs_buf *fbp; /* freespace buffer */ xfs_dir2_db_t fdb; /* freespace block number */ xfs_dir2_free_t *free; /* freespace structure */ __be16 *from; /* pointer to freespace entry */ @@ -116,13 +184,14 @@ xfs_dir2_leaf_to_node( /* * Get the buffer for the new freespace block. */ - if ((error =3D xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, fdb), -1, &fb= p, - XFS_DATA_FORK))) { + error =3D xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, fdb), -1, &fbp, + XFS_DATA_FORK); + if (error) return error; - } - ASSERT(fbp !=3D NULL); - free =3D fbp->data; - leaf =3D lbp->data; + fbp->b_ops =3D &xfs_dir2_free_buf_ops; + + free =3D fbp->b_addr; + leaf =3D lbp->b_addr; ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); /* * Initialize the freespace block header. @@ -142,14 +211,16 @@ xfs_dir2_leaf_to_node( *to =3D cpu_to_be16(off); } free->hdr.nused =3D cpu_to_be32(n); + + lbp->b_ops =3D &xfs_dir2_leafn_buf_ops; leaf->hdr.info.magic =3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); + /* * Log everything. */ xfs_dir2_leaf_log_header(tp, lbp); xfs_dir2_free_log_header(tp, fbp); xfs_dir2_free_log_bests(tp, fbp, 0, be32_to_cpu(free->hdr.nvalid) - 1); - xfs_da_buf_done(fbp); xfs_dir2_leafn_check(dp, lbp); return 0; } @@ -160,7 +231,7 @@ xfs_dir2_leaf_to_node( */ static int /* error */ xfs_dir2_leafn_add( - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ xfs_da_args_t *args, /* operation arguments */ int index) /* insertion pt for new entry */ { @@ -180,7 +251,7 @@ xfs_dir2_leafn_add( dp =3D args->dp; mp =3D dp->i_mount; tp =3D args->trans; - leaf =3D bp->data; + leaf =3D bp->b_addr; =20 /* * Quick check just to make sure we are not going to index @@ -224,89 +295,13 @@ xfs_dir2_leafn_add( lfloglow =3D be16_to_cpu(leaf->hdr.count); lfloghigh =3D -1; } - /* - * No stale entries, just insert a space for the new entry. - */ - if (!leaf->hdr.stale) { - lep =3D &leaf->ents[index]; - if (index < be16_to_cpu(leaf->hdr.count)) - memmove(lep + 1, lep, - (be16_to_cpu(leaf->hdr.count) - index) * sizeof(*lep)); - lfloglow =3D index; - lfloghigh =3D be16_to_cpu(leaf->hdr.count); - be16_add_cpu(&leaf->hdr.count, 1); - } - /* - * There are stale entries. We'll use one for the new entry. - */ - else { - /* - * If we didn't do a compact then we need to figure out - * which stale entry will be used. - */ - if (compact =3D=3D 0) { - /* - * Find first stale entry before our insertion point. - */ - for (lowstale =3D index - 1; - lowstale >=3D 0 && - be32_to_cpu(leaf->ents[lowstale].address) !=3D - XFS_DIR2_NULL_DATAPTR; - lowstale--) - continue; - /* - * Find next stale entry after insertion point. - * Stop looking if the answer would be worse than - * lowstale already found. - */ - for (highstale =3D index; - highstale < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(leaf->ents[highstale].address) !=3D - XFS_DIR2_NULL_DATAPTR && - (lowstale < 0 || - index - lowstale - 1 >=3D highstale - index); - highstale++) - continue; - } - /* - * Using the low stale entry. - * Shift entries up toward the stale slot. - */ - if (lowstale >=3D 0 && - (highstale =3D=3D be16_to_cpu(leaf->hdr.count) || - index - lowstale - 1 < highstale - index)) { - ASSERT(be32_to_cpu(leaf->ents[lowstale].address) =3D=3D - XFS_DIR2_NULL_DATAPTR); - ASSERT(index - lowstale - 1 >=3D 0); - if (index - lowstale - 1 > 0) - memmove(&leaf->ents[lowstale], - &leaf->ents[lowstale + 1], - (index - lowstale - 1) * sizeof(*lep)); - lep =3D &leaf->ents[index - 1]; - lfloglow =3D MIN(lowstale, lfloglow); - lfloghigh =3D MAX(index - 1, lfloghigh); - } - /* - * Using the high stale entry. - * Shift entries down toward the stale slot. - */ - else { - ASSERT(be32_to_cpu(leaf->ents[highstale].address) =3D=3D - XFS_DIR2_NULL_DATAPTR); - ASSERT(highstale - index >=3D 0); - if (highstale - index > 0) - memmove(&leaf->ents[index + 1], - &leaf->ents[index], - (highstale - index) * sizeof(*lep)); - lep =3D &leaf->ents[index]; - lfloglow =3D MIN(index, lfloglow); - lfloghigh =3D MAX(highstale, lfloghigh); - } - be16_add_cpu(&leaf->hdr.stale, -1); - } + /* * Insert the new entry, log everything. */ + lep =3D xfs_dir2_leaf_find_entry(leaf, index, compact, lowstale, + highstale, &lfloglow, &lfloghigh); + lep->hashval =3D cpu_to_be32(args->hashval); lep->address =3D cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, args->blkno, args->index)); @@ -322,24 +317,24 @@ xfs_dir2_leafn_add( */ void xfs_dir2_leafn_check( - xfs_inode_t *dp, /* incore directory inode */ - xfs_dabuf_t *bp) /* leaf buffer */ + struct xfs_inode *dp, + struct xfs_buf *bp) { int i; /* leaf index */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_mount_t *mp; /* filesystem mount point */ int stale; /* count of stale leaves */ =20 - leaf =3D bp->data; + leaf =3D bp->b_addr; mp =3D dp->i_mount; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); ASSERT(be16_to_cpu(leaf->hdr.count) <=3D xfs_dir2_max_leaf_ents(mp)); for (i =3D stale =3D 0; i < be16_to_cpu(leaf->hdr.count); i++) { if (i + 1 < be16_to_cpu(leaf->hdr.count)) { ASSERT(be32_to_cpu(leaf->ents[i].hashval) <=3D be32_to_cpu(leaf->ents[i + 1].hashval)); } - if (be32_to_cpu(leaf->ents[i].address) =3D=3D XFS_DIR2_NULL_DATAPTR) + if (leaf->ents[i].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) stale++; } ASSERT(be16_to_cpu(leaf->hdr.stale) =3D=3D stale); @@ -352,13 +347,13 @@ xfs_dir2_leafn_check( */ xfs_dahash_t /* hash value */ xfs_dir2_leafn_lasthash( - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ int *count) /* count of entries in leaf */ { xfs_dir2_leaf_t *leaf; /* leaf structure */ =20 - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); if (count) *count =3D be16_to_cpu(leaf->hdr.count); if (!leaf->hdr.count) @@ -372,12 +367,12 @@ xfs_dir2_leafn_lasthash( */ STATIC int xfs_dir2_leafn_lookup_for_addname( - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ xfs_da_args_t *args, /* operation arguments */ int *indexp, /* out: leaf entry index */ xfs_da_state_t *state) /* state to fill in */ { - xfs_dabuf_t *curbp =3D NULL; /* current data/free buffer */ + struct xfs_buf *curbp =3D NULL; /* current data/free buffer */ xfs_dir2_db_t curdb =3D -1; /* current data block number */ xfs_dir2_db_t curfdb =3D -1; /* current free block number */ xfs_inode_t *dp; /* incore directory inode */ @@ -396,8 +391,8 @@ xfs_dir2_leafn_lookup_for_addname( dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); #ifdef __KERNEL__ ASSERT(be16_to_cpu(leaf->hdr.count) > 0); #endif @@ -413,8 +408,8 @@ xfs_dir2_leafn_lookup_for_addname( /* If so, it's a free block buffer, get the block number. */ curbp =3D state->extrablk.bp; curfdb =3D state->extrablk.blkno; - free =3D curbp->data; - ASSERT(be32_to_cpu(free->hdr.magic) =3D=3D XFS_DIR2_FREE_MAGIC); + free =3D curbp->b_addr; + ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); } length =3D xfs_dir2_data_entsize(args->namelen); /* @@ -455,20 +450,18 @@ xfs_dir2_leafn_lookup_for_addname( * If we had one before, drop it. */ if (curbp) - xfs_da_brelse(tp, curbp); - /* - * Read the free block. - */ - error =3D xfs_da_read_buf(tp, dp, + xfs_trans_brelse(tp, curbp); + + error =3D xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(mp, newfdb), - -1, &curbp, XFS_DATA_FORK); + &curbp); if (error) return error; - free =3D curbp->data; + free =3D curbp->b_addr; ASSERT(be32_to_cpu(free->hdr.magic) =3D=3D XFS_DIR2_FREE_MAGIC); ASSERT((be32_to_cpu(free->hdr.firstdb) % - XFS_DIR2_MAX_FREE_BESTS(mp)) =3D=3D 0); + xfs_dir2_free_max_bests(mp)) =3D=3D 0); ASSERT(be32_to_cpu(free->hdr.firstdb) <=3D curdb); ASSERT(curdb < be32_to_cpu(free->hdr.firstdb) + be32_to_cpu(free->hdr.nvalid)); @@ -480,11 +473,12 @@ xfs_dir2_leafn_lookup_for_addname( /* * If it has room, return it. */ - if (unlikely(be16_to_cpu(free->bests[fi]) =3D=3D NULLDATAOFF)) { + if (unlikely(free->bests[fi] =3D=3D + cpu_to_be16(NULLDATAOFF))) { XFS_ERROR_REPORT("xfs_dir2_leafn_lookup_int", XFS_ERRLEVEL_LOW, mp); if (curfdb !=3D newfdb) - xfs_da_brelse(tp, curbp); + xfs_trans_brelse(tp, curbp); return XFS_ERROR(EFSCORRUPTED); } curfdb =3D newfdb; @@ -519,12 +513,12 @@ out: */ STATIC int xfs_dir2_leafn_lookup_for_entry( - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ xfs_da_args_t *args, /* operation arguments */ int *indexp, /* out: leaf entry index */ xfs_da_state_t *state) /* state to fill in */ { - xfs_dabuf_t *curbp =3D NULL; /* current data/free buffer */ + struct xfs_buf *curbp =3D NULL; /* current data/free buffer */ xfs_dir2_db_t curdb =3D -1; /* current data block number */ xfs_dir2_data_entry_t *dep; /* data block entry */ xfs_inode_t *dp; /* incore directory inode */ @@ -540,8 +534,8 @@ xfs_dir2_leafn_lookup_for_entry( dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); #ifdef __KERNEL__ ASSERT(be16_to_cpu(leaf->hdr.count) > 0); #endif @@ -585,7 +579,7 @@ xfs_dir2_leafn_lookup_for_entry( */ if (curbp && (args->cmpresult =3D=3D XFS_CMP_DIFFERENT || curdb !=3D state->extrablk.blkno)) - xfs_da_brelse(tp, curbp); + xfs_trans_brelse(tp, curbp); /* * If needing the block that is saved with a CI match, * use it otherwise read in the new data block. @@ -595,9 +589,9 @@ xfs_dir2_leafn_lookup_for_entry( ASSERT(state->extravalid); curbp =3D state->extrablk.bp; } else { - error =3D xfs_da_read_buf(tp, dp, + error =3D xfs_dir2_data_read(tp, dp, xfs_dir2_db_to_da(mp, newdb), - -1, &curbp, XFS_DATA_FORK); + -1, &curbp); if (error) return error; } @@ -607,7 +601,7 @@ xfs_dir2_leafn_lookup_for_entry( /* * Point to the data entry. */ - dep =3D (xfs_dir2_data_entry_t *)((char *)curbp->data + + dep =3D (xfs_dir2_data_entry_t *)((char *)curbp->b_addr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); /* * Compare the entry and if it's an exact match, return @@ -619,7 +613,7 @@ xfs_dir2_leafn_lookup_for_entry( /* If there is a CI match block, drop it */ if (args->cmpresult !=3D XFS_CMP_DIFFERENT && curdb !=3D state->extrablk.blkno) - xfs_da_brelse(tp, state->extrablk.bp); + xfs_trans_brelse(tp, state->extrablk.bp); args->cmpresult =3D cmp; args->inumber =3D be64_to_cpu(dep->inumber); *indexp =3D index; @@ -627,8 +621,9 @@ xfs_dir2_leafn_lookup_for_entry( state->extrablk.bp =3D curbp; state->extrablk.blkno =3D curdb; state->extrablk.index =3D (int)((char *)dep - - (char *)curbp->data); + (char *)curbp->b_addr); state->extrablk.magic =3D XFS_DIR2_DATA_MAGIC; + curbp->b_ops =3D &xfs_dir2_data_buf_ops; if (cmp =3D=3D XFS_CMP_EXACT) return XFS_ERROR(EEXIST); } @@ -643,10 +638,11 @@ xfs_dir2_leafn_lookup_for_entry( state->extrablk.index =3D -1; state->extrablk.blkno =3D curdb; state->extrablk.magic =3D XFS_DIR2_DATA_MAGIC; + curbp->b_ops =3D &xfs_dir2_data_buf_ops; } else { /* If the curbp is not the CI match block, drop it */ if (state->extrablk.bp !=3D curbp) - xfs_da_brelse(tp, curbp); + xfs_trans_brelse(tp, curbp); } } else { state->extravalid =3D 0; @@ -662,7 +658,7 @@ xfs_dir2_leafn_lookup_for_entry( */ int xfs_dir2_leafn_lookup_int( - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ xfs_da_args_t *args, /* operation arguments */ int *indexp, /* out: leaf entry index */ xfs_da_state_t *state) /* state to fill in */ @@ -680,9 +676,9 @@ xfs_dir2_leafn_lookup_int( static void xfs_dir2_leafn_moveents( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *bp_s, /* source leaf buffer */ + struct xfs_buf *bp_s, /* source leaf buffer */ int start_s, /* source leaf index */ - xfs_dabuf_t *bp_d, /* destination leaf buffer */ + struct xfs_buf *bp_d, /* destination leaf buffer */ int start_d, /* destination leaf index */ int count) /* count of leaves to copy */ { @@ -700,8 +696,8 @@ xfs_dir2_leafn_moveents( return; } tp =3D args->trans; - leaf_s =3D bp_s->data; - leaf_d =3D bp_d->data; + leaf_s =3D bp_s->b_addr; + leaf_d =3D bp_d->b_addr; /* * If the destination index is not the end of the current * destination leaf entries, open up a hole in the destination @@ -722,7 +718,8 @@ xfs_dir2_leafn_moveents( int i; /* temp leaf index */ =20 for (i =3D start_s, stale =3D 0; i < start_s + count; i++) { - if (be32_to_cpu(leaf_s->ents[i].address) =3D=3D XFS_DIR2_NULL_DATAPTR) + if (leaf_s->ents[i].address =3D=3D + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) stale++; } } else @@ -761,16 +758,16 @@ xfs_dir2_leafn_moveents( */ int /* sort order */ xfs_dir2_leafn_order( - xfs_dabuf_t *leaf1_bp, /* leaf1 buffer */ - xfs_dabuf_t *leaf2_bp) /* leaf2 buffer */ + struct xfs_buf *leaf1_bp, /* leaf1 buffer */ + struct xfs_buf *leaf2_bp) /* leaf2 buffer */ { xfs_dir2_leaf_t *leaf1; /* leaf1 structure */ xfs_dir2_leaf_t *leaf2; /* leaf2 structure */ =20 - leaf1 =3D leaf1_bp->data; - leaf2 =3D leaf2_bp->data; - ASSERT(be16_to_cpu(leaf1->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); - ASSERT(be16_to_cpu(leaf2->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); + leaf1 =3D leaf1_bp->b_addr; + leaf2 =3D leaf2_bp->b_addr; + ASSERT(leaf1->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + ASSERT(leaf2->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); if (be16_to_cpu(leaf1->hdr.count) > 0 && be16_to_cpu(leaf2->hdr.count) > 0 && (be32_to_cpu(leaf2->ents[0].hashval) < be32_to_cpu(leaf1->ents[0].has= hval) || @@ -816,8 +813,8 @@ xfs_dir2_leafn_rebalance( blk1 =3D blk2; blk2 =3D tmp; } - leaf1 =3D blk1->bp->data; - leaf2 =3D blk2->bp->data; + leaf1 =3D blk1->bp->b_addr; + leaf2 =3D blk2->bp->b_addr; oldsum =3D be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count); #ifdef DEBUG oldstale =3D be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale= ); @@ -879,11 +876,81 @@ xfs_dir2_leafn_rebalance( if(blk2->index < 0) { state->inleaf =3D 1; blk2->index =3D 0; - cmn_err(CE_ALERT, - "xfs_dir2_leafn_rebalance: picked the wrong leaf? reverting original le= af: " - "blk1->index %d\n", - blk1->index); + xfs_alert(args->dp->i_mount, + "%s: picked the wrong leaf? reverting original leaf: blk1->index %d\n", + __func__, blk1->index); + } +} + +static int +xfs_dir2_data_block_free( + xfs_da_args_t *args, + struct xfs_dir2_data_hdr *hdr, + struct xfs_dir2_free *free, + xfs_dir2_db_t fdb, + int findex, + struct xfs_buf *fbp, + int longest) +{ + struct xfs_trans *tp =3D args->trans; + int logfree =3D 0; + + if (!hdr) { + /* One less used entry in the free table. */ + be32_add_cpu(&free->hdr.nused, -1); + xfs_dir2_free_log_header(tp, fbp); + + /* + * If this was the last entry in the table, we can trim the + * table size back. There might be other entries at the end + * referring to non-existent data blocks, get those too. + */ + if (findex =3D=3D be32_to_cpu(free->hdr.nvalid) - 1) { + int i; /* free entry index */ + + for (i =3D findex - 1; i >=3D 0; i--) { + if (free->bests[i] !=3D cpu_to_be16(NULLDATAOFF)) + break; + } + free->hdr.nvalid =3D cpu_to_be32(i + 1); + logfree =3D 0; + } else { + /* Not the last entry, just punch it out. */ + free->bests[findex] =3D cpu_to_be16(NULLDATAOFF); + logfree =3D 1; + } + /* + * If there are no useful entries left in the block, + * get rid of the block if we can. + */ + if (!free->hdr.nused) { + int error; + + error =3D xfs_dir2_shrink_inode(args, fdb, fbp); + if (error =3D=3D 0) { + fbp =3D NULL; + logfree =3D 0; + } else if (error !=3D ENOSPC || args->total !=3D 0) + return error; + /* + * It's possible to get ENOSPC if there is no + * space reservation. In this case some one + * else will eventually get rid of this block. + */ + } + } else { + /* + * Data block is not empty, just set the free entry to the new + * value. + */ + free->bests[findex] =3D cpu_to_be16(longest); + logfree =3D 1; } + + /* Log the free entry that changed, unless we got rid of it. */ + if (logfree) + xfs_dir2_free_log_bests(tp, fbp, findex, findex); + return 0; } =20 /* @@ -894,14 +961,14 @@ xfs_dir2_leafn_rebalance( static int /* error */ xfs_dir2_leafn_remove( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *bp, /* leaf buffer */ + struct xfs_buf *bp, /* leaf buffer */ int index, /* leaf entry index */ xfs_da_state_blk_t *dblk, /* data block */ int *rval) /* resulting block needs join */ { - xfs_dir2_data_t *data; /* data block structure */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_db_t db; /* data block number */ - xfs_dabuf_t *dbp; /* data block buffer */ + struct xfs_buf *dbp; /* data block buffer */ xfs_dir2_data_entry_t *dep; /* data block entry */ xfs_inode_t *dp; /* incore directory inode */ xfs_dir2_leaf_t *leaf; /* leaf structure */ @@ -918,8 +985,8 @@ xfs_dir2_leafn_remove( dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); /* * Point to the entry we're removing. */ @@ -944,9 +1011,9 @@ xfs_dir2_leafn_remove( * in the data block in case it changes. */ dbp =3D dblk->bp; - data =3D dbp->data; - dep =3D (xfs_dir2_data_entry_t *)((char *)data + off); - longest =3D be16_to_cpu(data->hdr.bestfree[0].length); + hdr =3D dbp->b_addr; + dep =3D (xfs_dir2_data_entry_t *)((char *)hdr + off); + longest =3D be16_to_cpu(hdr->bestfree[0].length); needlog =3D needscan =3D 0; xfs_dir2_data_make_free(tp, dbp, off, xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); @@ -955,7 +1022,7 @@ xfs_dir2_leafn_remove( * Log the data block header if needed. */ if (needscan) - xfs_dir2_data_freescan(mp, data, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, dbp); xfs_dir2_data_check(dp, dbp); @@ -963,126 +1030,63 @@ xfs_dir2_leafn_remove( * If the longest data block freespace changes, need to update * the corresponding freeblock entry. */ - if (longest < be16_to_cpu(data->hdr.bestfree[0].length)) { + if (longest < be16_to_cpu(hdr->bestfree[0].length)) { int error; /* error return value */ - xfs_dabuf_t *fbp; /* freeblock buffer */ + struct xfs_buf *fbp; /* freeblock buffer */ xfs_dir2_db_t fdb; /* freeblock block number */ int findex; /* index in freeblock entries */ xfs_dir2_free_t *free; /* freeblock structure */ - int logfree; /* need to log free entry */ =20 /* * Convert the data block number to a free block, * read in the free block. */ fdb =3D xfs_dir2_db_to_fdb(mp, db); - if ((error =3D xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, fdb), - -1, &fbp, XFS_DATA_FORK))) { + error =3D xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(mp, fdb), + &fbp); + if (error) return error; - } - free =3D fbp->data; - ASSERT(be32_to_cpu(free->hdr.magic) =3D=3D XFS_DIR2_FREE_MAGIC); + free =3D fbp->b_addr; + ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); ASSERT(be32_to_cpu(free->hdr.firstdb) =3D=3D - XFS_DIR2_MAX_FREE_BESTS(mp) * + xfs_dir2_free_max_bests(mp) * (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); /* * Calculate which entry we need to fix. */ findex =3D xfs_dir2_db_to_fdindex(mp, db); - longest =3D be16_to_cpu(data->hdr.bestfree[0].length); + longest =3D be16_to_cpu(hdr->bestfree[0].length); /* * If the data block is now empty we can get rid of it * (usually). */ - if (longest =3D=3D mp->m_dirblksize - (uint)sizeof(data->hdr)) { + if (longest =3D=3D mp->m_dirblksize - (uint)sizeof(*hdr)) { /* * Try to punch out the data block. */ error =3D xfs_dir2_shrink_inode(args, db, dbp); if (error =3D=3D 0) { dblk->bp =3D NULL; - data =3D NULL; + hdr =3D NULL; } /* * We can get ENOSPC if there's no space reservation. * In this case just drop the buffer and some one else * will eventually get rid of the empty block. */ - else if (error =3D=3D ENOSPC && args->total =3D=3D 0) - xfs_da_buf_done(dbp); - else + else if (!(error =3D=3D ENOSPC && args->total =3D=3D 0)) return error; } /* * If we got rid of the data block, we can eliminate that entry * in the free block. */ - if (data =3D=3D NULL) { - /* - * One less used entry in the free table. - */ - be32_add_cpu(&free->hdr.nused, -1); - xfs_dir2_free_log_header(tp, fbp); - /* - * If this was the last entry in the table, we can - * trim the table size back. There might be other - * entries at the end referring to non-existent - * data blocks, get those too. - */ - if (findex =3D=3D be32_to_cpu(free->hdr.nvalid) - 1) { - int i; /* free entry index */ - - for (i =3D findex - 1; - i >=3D 0 && be16_to_cpu(free->bests[i]) =3D=3D NULLDATAOFF; - i--) - continue; - free->hdr.nvalid =3D cpu_to_be32(i + 1); - logfree =3D 0; - } - /* - * Not the last entry, just punch it out. - */ - else { - free->bests[findex] =3D cpu_to_be16(NULLDATAOFF); - logfree =3D 1; - } - /* - * If there are no useful entries left in the block, - * get rid of the block if we can. - */ - if (!free->hdr.nused) { - error =3D xfs_dir2_shrink_inode(args, fdb, fbp); - if (error =3D=3D 0) { - fbp =3D NULL; - logfree =3D 0; - } else if (error !=3D ENOSPC || args->total !=3D 0) - return error; - /* - * It's possible to get ENOSPC if there is no - * space reservation. In this case some one - * else will eventually get rid of this block. - */ - } - } - /* - * Data block is not empty, just set the free entry to - * the new value. - */ - else { - free->bests[findex] =3D cpu_to_be16(longest); - logfree =3D 1; - } - /* - * Log the free entry that changed, unless we got rid of it. - */ - if (logfree) - xfs_dir2_free_log_bests(tp, fbp, findex, findex); - /* - * Drop the buffer if we still have it. - */ - if (fbp) - xfs_da_buf_done(fbp); + error =3D xfs_dir2_data_block_free(args, hdr, free, + fdb, findex, fbp, longest); + if (error) + return error; } + xfs_dir2_leafn_check(dp, bp); /* * Return indication of whether this leaf block is empty enough @@ -1173,7 +1177,7 @@ xfs_dir2_leafn_toosmall( { xfs_da_state_blk_t *blk; /* leaf block */ xfs_dablk_t blkno; /* leaf block number */ - xfs_dabuf_t *bp; /* leaf buffer */ + struct xfs_buf *bp; /* leaf buffer */ int bytes; /* bytes in use */ int count; /* leaf live entry count */ int error; /* error return value */ @@ -1189,8 +1193,8 @@ xfs_dir2_leafn_toosmall( * to coalesce with a sibling. */ blk =3D &state->path.blk[state->path.active - 1]; - info =3D blk->bp->data; - ASSERT(be16_to_cpu(info->magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); + info =3D blk->bp->b_addr; + ASSERT(info->magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); leaf =3D (xfs_dir2_leaf_t *)info; count =3D be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); bytes =3D (uint)sizeof(leaf->hdr) + count * (uint)sizeof(leaf->ents[0]); @@ -1236,20 +1240,19 @@ xfs_dir2_leafn_toosmall( /* * Read the sibling leaf block. */ - if ((error =3D - xfs_da_read_buf(state->args->trans, state->args->dp, blkno, - -1, &bp, XFS_DATA_FORK))) { + error =3D xfs_dir2_leafn_read(state->args->trans, state->args->dp, + blkno, -1, &bp); + if (error) return error; - } - ASSERT(bp !=3D NULL); + /* * Count bytes in the two blocks combined. */ leaf =3D (xfs_dir2_leaf_t *)info; count =3D be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); bytes =3D state->blocksize - (state->blocksize >> 2); - leaf =3D bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC); + leaf =3D bp->b_addr; + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); count +=3D be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); bytes -=3D count * (uint)sizeof(leaf->ents[0]); /* @@ -1257,7 +1260,7 @@ xfs_dir2_leafn_toosmall( */ if (bytes >=3D 0) break; - xfs_da_brelse(state->args->trans, bp); + xfs_trans_brelse(state->args->trans, bp); } /* * Didn't like either block, give up. @@ -1266,11 +1269,7 @@ xfs_dir2_leafn_toosmall( *action =3D 0; return 0; } - /* - * Done with the sibling leaf block here, drop the dabuf - * so path_shift can get it. - */ - xfs_da_buf_done(bp); + /* * Make altpath point to the block we want to keep (the lower * numbered block) and path point to the block we want to drop. @@ -1306,10 +1305,10 @@ xfs_dir2_leafn_unbalance( args =3D state->args; ASSERT(drop_blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC); ASSERT(save_blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC); - drop_leaf =3D drop_blk->bp->data; - save_leaf =3D save_blk->bp->data; - ASSERT(be16_to_cpu(drop_leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC= ); - ASSERT(be16_to_cpu(save_leaf->hdr.info.magic) =3D=3D XFS_DIR2_LEAFN_MAGIC= ); + drop_leaf =3D drop_blk->bp->b_addr; + save_leaf =3D save_blk->bp->b_addr; + ASSERT(drop_leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)= ); + ASSERT(save_leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)= ); /* * If there are any stale leaf entries, take this opportunity * to purge them. @@ -1413,15 +1412,15 @@ xfs_dir2_node_addname_int( xfs_da_args_t *args, /* operation arguments */ xfs_da_state_blk_t *fblk) /* optional freespace block */ { - xfs_dir2_data_t *data; /* data block structure */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_db_t dbno; /* data block number */ - xfs_dabuf_t *dbp; /* data block buffer */ + struct xfs_buf *dbp; /* data block buffer */ xfs_dir2_data_entry_t *dep; /* data entry pointer */ xfs_inode_t *dp; /* incore directory inode */ xfs_dir2_data_unused_t *dup; /* data unused entry pointer */ int error; /* error return value */ xfs_dir2_db_t fbno; /* freespace block number */ - xfs_dabuf_t *fbp; /* freespace buffer */ + struct xfs_buf *fbp; /* freespace buffer */ int findex; /* freespace entry index */ xfs_dir2_free_t *free=3DNULL; /* freespace block structure */ xfs_dir2_db_t ifbno; /* initial freespace block no */ @@ -1449,8 +1448,8 @@ xfs_dir2_node_addname_int( * Remember initial freespace block number. */ ifbno =3D fblk->blkno; - free =3D fbp->data; - ASSERT(be32_to_cpu(free->hdr.magic) =3D=3D XFS_DIR2_FREE_MAGIC); + free =3D fbp->b_addr; + ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); findex =3D fblk->index; /* * This means the free entry showed that the data block had @@ -1525,16 +1524,15 @@ xfs_dir2_node_addname_int( * This should be really rare, so there's no reason * to avoid it. */ - if ((error =3D xfs_da_read_buf(tp, dp, - xfs_dir2_db_to_da(mp, fbno), -2, &fbp, - XFS_DATA_FORK))) { + error =3D xfs_dir2_free_try_read(tp, dp, + xfs_dir2_db_to_da(mp, fbno), + &fbp); + if (error) return error; - } - if (unlikely(fbp =3D=3D NULL)) { + if (!fbp) continue; - } - free =3D fbp->data; - ASSERT(be32_to_cpu(free->hdr.magic) =3D=3D XFS_DIR2_FREE_MAGIC); + free =3D fbp->b_addr; + ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); findex =3D 0; } /* @@ -1551,7 +1549,7 @@ xfs_dir2_node_addname_int( /* * Drop the block. */ - xfs_da_brelse(tp, fbp); + xfs_trans_brelse(tp, fbp); fbp =3D NULL; if (fblk && fblk->bp) fblk->bp =3D NULL; @@ -1566,36 +1564,23 @@ xfs_dir2_node_addname_int( /* * Not allowed to allocate, return failure. */ - if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || - args->total =3D=3D 0) { - /* - * Drop the freespace buffer unless it came from our - * caller. - */ - if ((fblk =3D=3D NULL || fblk->bp =3D=3D NULL) && fbp !=3D NULL) - xfs_da_buf_done(fbp); + if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || args->total =3D=3D 0) return XFS_ERROR(ENOSPC); - } + /* * Allocate and initialize the new data block. */ if (unlikely((error =3D xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, &dbno)) || - (error =3D xfs_dir2_data_init(args, dbno, &dbp)))) { - /* - * Drop the freespace buffer unless it came from our - * caller. - */ - if ((fblk =3D=3D NULL || fblk->bp =3D=3D NULL) && fbp !=3D NULL) - xfs_da_buf_done(fbp); + (error =3D xfs_dir2_data_init(args, dbno, &dbp)))) return error; - } + /* * If (somehow) we have a freespace block, get rid of it. */ if (fbp) - xfs_da_brelse(tp, fbp); + xfs_trans_brelse(tp, fbp); if (fblk && fblk->bp) fblk->bp =3D NULL; =20 @@ -1604,12 +1589,12 @@ xfs_dir2_node_addname_int( * that was just allocated. */ fbno =3D xfs_dir2_db_to_fdb(mp, dbno); - if (unlikely(error =3D xfs_da_read_buf(tp, dp, - xfs_dir2_db_to_da(mp, fbno), -2, &fbp, - XFS_DATA_FORK))) { - xfs_da_buf_done(dbp); + error =3D xfs_dir2_free_try_read(tp, dp, + xfs_dir2_db_to_da(mp, fbno), + &fbp); + if (error) return error; - } + /* * If there wasn't a freespace block, the read will * return a NULL fbp. Allocate and initialize a new one. @@ -1621,26 +1606,22 @@ xfs_dir2_node_addname_int( } =20 if (unlikely(xfs_dir2_db_to_fdb(mp, dbno) !=3D fbno)) { - cmn_err(CE_ALERT, - "xfs_dir2_node_addname_int: dir ino " - "%llu needed freesp block %lld for\n" - " data block %lld, got %lld\n" - " ifbno %llu lastfbno %d\n", - (unsigned long long)dp->i_ino, + xfs_alert(mp, + "%s: dir ino %llu needed freesp block %lld for\n" + " data block %lld, got %lld ifbno %llu lastfbno %d", + __func__, (unsigned long long)dp->i_ino, (long long)xfs_dir2_db_to_fdb(mp, dbno), (long long)dbno, (long long)fbno, (unsigned long long)ifbno, lastfbno); if (fblk) { - cmn_err(CE_ALERT, - " fblk 0x%p blkno %llu " - "index %d magic 0x%x\n", + xfs_alert(mp, + " fblk 0x%p blkno %llu index %d magic 0x%x", fblk, (unsigned long long)fblk->blkno, fblk->index, fblk->magic); } else { - cmn_err(CE_ALERT, - " ... fblk is NULL\n"); + xfs_alert(mp, " ... fblk is NULL"); } XFS_ERROR_REPORT("xfs_dir2_node_addname_int", XFS_ERRLEVEL_LOW, mp); @@ -1650,27 +1631,27 @@ xfs_dir2_node_addname_int( /* * Get a buffer for the new block. */ - if ((error =3D xfs_da_get_buf(tp, dp, - xfs_dir2_db_to_da(mp, fbno), - -1, &fbp, XFS_DATA_FORK))) { + error =3D xfs_da_get_buf(tp, dp, + xfs_dir2_db_to_da(mp, fbno), + -1, &fbp, XFS_DATA_FORK); + if (error) return error; - } - ASSERT(fbp !=3D NULL); + fbp->b_ops =3D &xfs_dir2_free_buf_ops; =20 /* * Initialize the new block to be empty, and remember * its first slot as our empty slot. */ - free =3D fbp->data; + free =3D fbp->b_addr; free->hdr.magic =3D cpu_to_be32(XFS_DIR2_FREE_MAGIC); free->hdr.firstdb =3D cpu_to_be32( (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * - XFS_DIR2_MAX_FREE_BESTS(mp)); + xfs_dir2_free_max_bests(mp)); free->hdr.nvalid =3D 0; free->hdr.nused =3D 0; } else { - free =3D fbp->data; - ASSERT(be32_to_cpu(free->hdr.magic) =3D=3D XFS_DIR2_FREE_MAGIC); + free =3D fbp->b_addr; + ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); } =20 /* @@ -1682,7 +1663,7 @@ xfs_dir2_node_addname_int( * freespace block, extend that table. */ if (findex >=3D be32_to_cpu(free->hdr.nvalid)) { - ASSERT(findex < XFS_DIR2_MAX_FREE_BESTS(mp)); + ASSERT(findex < xfs_dir2_free_max_bests(mp)); free->hdr.nvalid =3D cpu_to_be32(findex + 1); /* * Tag new entry so nused will go up. @@ -1693,7 +1674,7 @@ xfs_dir2_node_addname_int( * If this entry was for an empty data block * (this should always be true) then update the header. */ - if (be16_to_cpu(free->bests[findex]) =3D=3D NULLDATAOFF) { + if (free->bests[findex] =3D=3D cpu_to_be16(NULLDATAOFF)) { be32_add_cpu(&free->hdr.nused, 1); xfs_dir2_free_log_header(tp, fbp); } @@ -1702,8 +1683,8 @@ xfs_dir2_node_addname_int( * We haven't allocated the data entry yet so this will * change again. */ - data =3D dbp->data; - free->bests[findex] =3D data->hdr.bestfree[0].length; + hdr =3D dbp->b_addr; + free->bests[findex] =3D hdr->bestfree[0].length; logfree =3D 1; } /* @@ -1713,36 +1694,31 @@ xfs_dir2_node_addname_int( /* * If just checking, we succeeded. */ - if (args->op_flags & XFS_DA_OP_JUSTCHECK) { - if ((fblk =3D=3D NULL || fblk->bp =3D=3D NULL) && fbp !=3D NULL) - xfs_da_buf_done(fbp); + if (args->op_flags & XFS_DA_OP_JUSTCHECK) return 0; - } + /* * Read the data block in. */ - if (unlikely( - error =3D xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, dbno), - -1, &dbp, XFS_DATA_FORK))) { - if ((fblk =3D=3D NULL || fblk->bp =3D=3D NULL) && fbp !=3D NULL) - xfs_da_buf_done(fbp); + error =3D xfs_dir2_data_read(tp, dp, xfs_dir2_db_to_da(mp, dbno), + -1, &dbp); + if (error) return error; - } - data =3D dbp->data; + hdr =3D dbp->b_addr; logfree =3D 0; } - ASSERT(be16_to_cpu(data->hdr.bestfree[0].length) >=3D length); + ASSERT(be16_to_cpu(hdr->bestfree[0].length) >=3D length); /* * Point to the existing unused space. */ dup =3D (xfs_dir2_data_unused_t *) - ((char *)data + be16_to_cpu(data->hdr.bestfree[0].offset)); + ((char *)hdr + be16_to_cpu(hdr->bestfree[0].offset)); needscan =3D needlog =3D 0; /* * Mark the first part of the unused space, inuse for us. */ xfs_dir2_data_use_free(tp, dbp, dup, - (xfs_dir2_data_aoff_t)((char *)dup - (char *)data), length, + (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, &needlog, &needscan); /* * Fill in the new entry and log it. @@ -1752,13 +1728,13 @@ xfs_dir2_node_addname_int( dep->namelen =3D args->namelen; memcpy(dep->name, args->name, dep->namelen); tagp =3D xfs_dir2_data_entry_tag_p(dep); - *tagp =3D cpu_to_be16((char *)dep - (char *)data); + *tagp =3D cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, dbp, dep); /* * Rescan the block for bestfree if needed. */ if (needscan) - xfs_dir2_data_freescan(mp, data, &needlog); + xfs_dir2_data_freescan(mp, hdr, &needlog); /* * Log the data block header if needed. */ @@ -1767,8 +1743,8 @@ xfs_dir2_node_addname_int( /* * If the freespace entry is now wrong, update it. */ - if (be16_to_cpu(free->bests[findex]) !=3D be16_to_cpu(data->hdr.bestfree[= 0].length)) { - free->bests[findex] =3D data->hdr.bestfree[0].length; + if (be16_to_cpu(free->bests[findex]) !=3D be16_to_cpu(hdr->bestfree[0].le= ngth)) { + free->bests[findex] =3D hdr->bestfree[0].length; logfree =3D 1; } /* @@ -1777,16 +1753,10 @@ xfs_dir2_node_addname_int( if (logfree) xfs_dir2_free_log_bests(tp, fbp, findex, findex); /* - * If the caller didn't hand us the freespace block, drop it. - */ - if ((fblk =3D=3D NULL || fblk->bp =3D=3D NULL) && fbp !=3D NULL) - xfs_da_buf_done(fbp); - /* * Return the data block and offset in args, then drop the data block. */ args->blkno =3D (xfs_dablk_t)dbno; args->index =3D be16_to_cpu(*tagp); - xfs_da_buf_done(dbp); return 0; } =20 @@ -1824,22 +1794,23 @@ xfs_dir2_node_lookup( /* If a CI match, dup the actual name and return EEXIST */ xfs_dir2_data_entry_t *dep; =20 - dep =3D (xfs_dir2_data_entry_t *)((char *)state->extrablk.bp-> - data + state->extrablk.index); + dep =3D (xfs_dir2_data_entry_t *) + ((char *)state->extrablk.bp->b_addr + + state->extrablk.index); rval =3D xfs_dir_cilookup_result(args, dep->name, dep->namelen); } /* * Release the btree blocks and leaf block. */ for (i =3D 0; i < state->path.active; i++) { - xfs_da_brelse(args->trans, state->path.blk[i].bp); + xfs_trans_brelse(args->trans, state->path.blk[i].bp); state->path.blk[i].bp =3D NULL; } /* * Release the data block if we have it. */ if (state->extravalid && state->extrablk.bp) { - xfs_da_brelse(args->trans, state->extrablk.bp); + xfs_trans_brelse(args->trans, state->extrablk.bp); state->extrablk.bp =3D NULL; } xfs_da_state_free(state); @@ -1918,7 +1889,7 @@ xfs_dir2_node_replace( xfs_da_args_t *args) /* operation arguments */ { xfs_da_state_blk_t *blk; /* leaf block */ - xfs_dir2_data_t *data; /* data block structure */ + xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_data_entry_t *dep; /* data entry changed */ int error; /* error return value */ int i; /* btree level */ @@ -1956,16 +1927,16 @@ xfs_dir2_node_replace( */ blk =3D &state->path.blk[state->path.active - 1]; ASSERT(blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC); - leaf =3D blk->bp->data; + leaf =3D blk->bp->b_addr; lep =3D &leaf->ents[blk->index]; ASSERT(state->extravalid); /* * Point to the data entry. */ - data =3D state->extrablk.bp->data; - ASSERT(be32_to_cpu(data->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC); + hdr =3D state->extrablk.bp->b_addr; + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC)); dep =3D (xfs_dir2_data_entry_t *) - ((char *)data + + ((char *)hdr + xfs_dir2_dataptr_to_off(state->mp, be32_to_cpu(lep->address))); ASSERT(inum !=3D be64_to_cpu(dep->inumber)); /* @@ -1979,14 +1950,14 @@ xfs_dir2_node_replace( * Didn't find it, and we're holding a data block. Drop it. */ else if (state->extravalid) { - xfs_da_brelse(args->trans, state->extrablk.bp); + xfs_trans_brelse(args->trans, state->extrablk.bp); state->extrablk.bp =3D NULL; } /* * Release all the buffers in the cursor. */ for (i =3D 0; i < state->path.active; i++) { - xfs_da_brelse(args->trans, state->path.blk[i].bp); + xfs_trans_brelse(args->trans, state->path.blk[i].bp); state->path.blk[i].bp =3D NULL; } xfs_da_state_free(state); @@ -2003,7 +1974,7 @@ xfs_dir2_node_trim_free( xfs_fileoff_t fo, /* free block number */ int *rvalp) /* out: did something */ { - xfs_dabuf_t *bp; /* freespace buffer */ + struct xfs_buf *bp; /* freespace buffer */ xfs_inode_t *dp; /* incore directory inode */ int error; /* error return code */ xfs_dir2_free_t *free; /* freespace structure */ @@ -2016,25 +1987,22 @@ xfs_dir2_node_trim_free( /* * Read the freespace block. */ - if (unlikely(error =3D xfs_da_read_buf(tp, dp, (xfs_dablk_t)fo, -2, &bp, - XFS_DATA_FORK))) { + error =3D xfs_dir2_free_try_read(tp, dp, fo, &bp); + if (error) return error; - } - /* * There can be holes in freespace. If fo is a hole, there's * nothing to do. */ - if (bp =3D=3D NULL) { + if (!bp) return 0; - } - free =3D bp->data; - ASSERT(be32_to_cpu(free->hdr.magic) =3D=3D XFS_DIR2_FREE_MAGIC); + free =3D bp->b_addr; + ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); /* * If there are used entries, there's nothing to do. */ if (be32_to_cpu(free->hdr.nused) > 0) { - xfs_da_brelse(tp, bp); + xfs_trans_brelse(tp, bp); *rvalp =3D 0; return 0; } @@ -2050,7 +2018,7 @@ xfs_dir2_node_trim_free( * pieces. This is the last block of an extent. */ ASSERT(error !=3D ENOSPC); - xfs_da_brelse(tp, bp); + xfs_trans_brelse(tp, bp); return error; } /* diff --git a/libxfs/xfs_dir2_priv.h b/libxfs/xfs_dir2_priv.h new file mode 100644 index 0000000..7da79f6 --- /dev/null +++ b/libxfs/xfs_dir2_priv.h @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2000-2001,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_DIR2_PRIV_H__ +#define __XFS_DIR2_PRIV_H__ + +/* xfs_dir2.c */ +extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino); +extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp, in= t *r); +extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, int= *r); +extern int xfs_dir2_grow_inode(struct xfs_da_args *args, int space, + xfs_dir2_db_t *dbp); +extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t d= b, + struct xfs_buf *bp); +extern int xfs_dir_cilookup_result(struct xfs_da_args *args, + const unsigned char *name, int len); + +/* xfs_dir2_block.c */ +extern const struct xfs_buf_ops xfs_dir2_block_buf_ops; + +extern int xfs_dir2_block_addname(struct xfs_da_args *args); +extern int xfs_dir2_block_getdents(struct xfs_inode *dp, void *dirent, + xfs_off_t *offset, filldir_t filldir); +extern int xfs_dir2_block_lookup(struct xfs_da_args *args); +extern int xfs_dir2_block_removename(struct xfs_da_args *args); +extern int xfs_dir2_block_replace(struct xfs_da_args *args); +extern int xfs_dir2_leaf_to_block(struct xfs_da_args *args, + struct xfs_buf *lbp, struct xfs_buf *dbp); + +/* xfs_dir2_data.c */ +#ifdef DEBUG +#define xfs_dir2_data_check(dp,bp) __xfs_dir2_data_check(dp, bp); +#else +#define xfs_dir2_data_check(dp,bp) +#endif + +extern const struct xfs_buf_ops xfs_dir2_data_buf_ops; + +extern int __xfs_dir2_data_check(struct xfs_inode *dp, struct xfs_buf *bp); +extern int xfs_dir2_data_read(struct xfs_trans *tp, struct xfs_inode *dp, + xfs_dablk_t bno, xfs_daddr_t mapped_bno, struct xfs_buf **bpp); +extern int xfs_dir2_data_readahead(struct xfs_trans *tp, struct xfs_inode = *dp, + xfs_dablk_t bno, xfs_daddr_t mapped_bno); + +extern struct xfs_dir2_data_free * +xfs_dir2_data_freeinsert(struct xfs_dir2_data_hdr *hdr, + struct xfs_dir2_data_unused *dup, int *loghead); +extern void xfs_dir2_data_freescan(struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr, int *loghead); +extern int xfs_dir2_data_init(struct xfs_da_args *args, xfs_dir2_db_t blkn= o, + struct xfs_buf **bpp); +extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_buf *= bp, + struct xfs_dir2_data_entry *dep); +extern void xfs_dir2_data_log_header(struct xfs_trans *tp, + struct xfs_buf *bp); +extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_buf = *bp, + struct xfs_dir2_data_unused *dup); +extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_buf *= bp, + xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, + int *needlogp, int *needscanp); +extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_buf *b= p, + struct xfs_dir2_data_unused *dup, xfs_dir2_data_aoff_t offset, + xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); + +/* xfs_dir2_leaf.c */ +extern const struct xfs_buf_ops xfs_dir2_leafn_buf_ops; + +extern int xfs_dir2_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp, + xfs_dablk_t fbno, xfs_daddr_t mappedbno, struct xfs_buf **bpp); +extern int xfs_dir2_block_to_leaf(struct xfs_da_args *args, + struct xfs_buf *dbp); +extern int xfs_dir2_leaf_addname(struct xfs_da_args *args); +extern void xfs_dir2_leaf_compact(struct xfs_da_args *args, + struct xfs_buf *bp); +extern void xfs_dir2_leaf_compact_x1(struct xfs_buf *bp, int *indexp, + int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); +extern int xfs_dir2_leaf_getdents(struct xfs_inode *dp, void *dirent, + size_t bufsize, xfs_off_t *offset, filldir_t filldir); +extern int xfs_dir2_leaf_init(struct xfs_da_args *args, xfs_dir2_db_t bno, + struct xfs_buf **bpp, int magic); +extern void xfs_dir2_leaf_log_ents(struct xfs_trans *tp, struct xfs_buf *b= p, + int first, int last); +extern void xfs_dir2_leaf_log_header(struct xfs_trans *tp, + struct xfs_buf *bp); +extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); +extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); +extern int xfs_dir2_leaf_replace(struct xfs_da_args *args); +extern int xfs_dir2_leaf_search_hash(struct xfs_da_args *args, + struct xfs_buf *lbp); +extern int xfs_dir2_leaf_trim_data(struct xfs_da_args *args, + struct xfs_buf *lbp, xfs_dir2_db_t db); +extern struct xfs_dir2_leaf_entry * +xfs_dir2_leaf_find_entry(struct xfs_dir2_leaf *leaf, int index, int compac= t, + int lowstale, int highstale, + int *lfloglow, int *lfloghigh); +extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); + +/* xfs_dir2_node.c */ +extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, + struct xfs_buf *lbp); +extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_buf *bp, int *count= ); +extern int xfs_dir2_leafn_lookup_int(struct xfs_buf *bp, + struct xfs_da_args *args, int *indexp, + struct xfs_da_state *state); +extern int xfs_dir2_leafn_order(struct xfs_buf *leaf1_bp, + struct xfs_buf *leaf2_bp); +extern int xfs_dir2_leafn_split(struct xfs_da_state *state, + struct xfs_da_state_blk *oldblk, struct xfs_da_state_blk *newblk); +extern int xfs_dir2_leafn_toosmall(struct xfs_da_state *state, int *action= ); +extern void xfs_dir2_leafn_unbalance(struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk, + struct xfs_da_state_blk *save_blk); +extern int xfs_dir2_node_addname(struct xfs_da_args *args); +extern int xfs_dir2_node_lookup(struct xfs_da_args *args); +extern int xfs_dir2_node_removename(struct xfs_da_args *args); +extern int xfs_dir2_node_replace(struct xfs_da_args *args); +extern int xfs_dir2_node_trim_free(struct xfs_da_args *args, xfs_fileoff_t= fo, + int *rvalp); +extern int xfs_dir2_free_read(struct xfs_trans *tp, struct xfs_inode *dp, + xfs_dablk_t fbno, struct xfs_buf **bpp); + +/* xfs_dir2_sf.c */ +extern xfs_ino_t xfs_dir2_sf_get_parent_ino(struct xfs_dir2_sf_hdr *sfp); +extern xfs_ino_t xfs_dir2_sfe_get_ino(struct xfs_dir2_sf_hdr *sfp, + struct xfs_dir2_sf_entry *sfep); +extern int xfs_dir2_block_sfsize(struct xfs_inode *dp, + struct xfs_dir2_data_hdr *block, struct xfs_dir2_sf_hdr *sfhp); +extern int xfs_dir2_block_to_sf(struct xfs_da_args *args, struct xfs_buf *= bp, + int size, xfs_dir2_sf_hdr_t *sfhp); +extern int xfs_dir2_sf_addname(struct xfs_da_args *args); +extern int xfs_dir2_sf_create(struct xfs_da_args *args, xfs_ino_t pino); +extern int xfs_dir2_sf_getdents(struct xfs_inode *dp, void *dirent, + xfs_off_t *offset, filldir_t filldir); +extern int xfs_dir2_sf_lookup(struct xfs_da_args *args); +extern int xfs_dir2_sf_removename(struct xfs_da_args *args); +extern int xfs_dir2_sf_replace(struct xfs_da_args *args); + +#endif /* __XFS_DIR2_PRIV_H__ */ diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index 6b5e6d4..a96be76 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -41,6 +41,82 @@ static void xfs_dir2_sf_toino8(xfs_da_args_t *args); #endif /* XFS_BIG_INUMS */ =20 /* + * Inode numbers in short-form directories can come in two versions, + * either 4 bytes or 8 bytes wide. These helpers deal with the + * two forms transparently by looking at the headers i8count field. + * + * For 64-bit inode number the most significant byte must be zero. + */ +static xfs_ino_t +xfs_dir2_sf_get_ino( + struct xfs_dir2_sf_hdr *hdr, + xfs_dir2_inou_t *from) +{ + if (hdr->i8count) + return get_unaligned_be64(&from->i8.i) & 0x00ffffffffffffffULL; + else + return get_unaligned_be32(&from->i4.i); +} + +static void +xfs_dir2_sf_put_ino( + struct xfs_dir2_sf_hdr *hdr, + xfs_dir2_inou_t *to, + xfs_ino_t ino) +{ + ASSERT((ino & 0xff00000000000000ULL) =3D=3D 0); + + if (hdr->i8count) + put_unaligned_be64(ino, &to->i8.i); + else + put_unaligned_be32(ino, &to->i4.i); +} + +xfs_ino_t +xfs_dir2_sf_get_parent_ino( + struct xfs_dir2_sf_hdr *hdr) +{ + return xfs_dir2_sf_get_ino(hdr, &hdr->parent); +} + +void +xfs_dir2_sf_put_parent_ino( + struct xfs_dir2_sf_hdr *hdr, + xfs_ino_t ino) +{ + xfs_dir2_sf_put_ino(hdr, &hdr->parent, ino); +} + +/* + * In short-form directory entries the inode numbers are stored at variable + * offset behind the entry name. The inode numbers may only be accessed + * through the helpers below. + */ +static xfs_dir2_inou_t * +xfs_dir2_sfe_inop( + struct xfs_dir2_sf_entry *sfep) +{ + return (xfs_dir2_inou_t *)&sfep->name[sfep->namelen]; +} + +xfs_ino_t +xfs_dir2_sfe_get_ino( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return xfs_dir2_sf_get_ino(hdr, xfs_dir2_sfe_inop(sfep)); +} + +void +xfs_dir2_sfe_put_ino( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep, + xfs_ino_t ino) +{ + xfs_dir2_sf_put_ino(hdr, xfs_dir2_sfe_inop(sfep), ino); +} + +/* * Given a block directory (dp/block), calculate its size as a shortform (= sf) * directory and a header for the sf directory, if it will fit it the * space currently present in the inode. If it won't fit, the output @@ -49,7 +125,7 @@ static void xfs_dir2_sf_toino8(xfs_da_args_t *args); int /* size for sf form */ xfs_dir2_block_sfsize( xfs_inode_t *dp, /* incore inode pointer */ - xfs_dir2_block_t *block, /* block directory data */ + xfs_dir2_data_hdr_t *hdr, /* block directory data */ xfs_dir2_sf_hdr_t *sfhp) /* output: header for sf form */ { xfs_dir2_dataptr_t addr; /* data entry address */ @@ -69,7 +145,7 @@ xfs_dir2_block_sfsize( mp =3D dp->i_mount; =20 count =3D i8count =3D namelen =3D 0; - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(mp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); =20 /* @@ -82,7 +158,7 @@ xfs_dir2_block_sfsize( * Calculate the pointer to the entry at hand. */ dep =3D (xfs_dir2_data_entry_t *) - ((char *)block + xfs_dir2_dataptr_to_off(mp, addr)); + ((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); /* * Detect . and .., so we can special-case them. * . is not included in sf directories. @@ -119,7 +195,7 @@ xfs_dir2_block_sfsize( */ sfhp->count =3D count; sfhp->i8count =3D i8count; - xfs_dir2_sf_put_inumber((xfs_dir2_sf_t *)sfhp, &parent, &sfhp->parent); + xfs_dir2_sf_put_parent_ino(sfhp, parent); return size; } =20 @@ -130,11 +206,11 @@ xfs_dir2_block_sfsize( int /* error */ xfs_dir2_block_to_sf( xfs_da_args_t *args, /* operation arguments */ - xfs_dabuf_t *bp, /* block buffer */ + struct xfs_buf *bp, int size, /* shortform directory size */ xfs_dir2_sf_hdr_t *sfhp) /* shortform directory hdr */ { - xfs_dir2_block_t *block; /* block structure */ + xfs_dir2_data_hdr_t *hdr; /* block header */ xfs_dir2_block_tail_t *btp; /* block tail pointer */ xfs_dir2_data_entry_t *dep; /* data entry pointer */ xfs_inode_t *dp; /* incore directory inode */ @@ -145,8 +221,7 @@ xfs_dir2_block_to_sf( xfs_mount_t *mp; /* filesystem mount point */ char *ptr; /* current data pointer */ xfs_dir2_sf_entry_t *sfep; /* shortform entry */ - xfs_dir2_sf_t *sfp; /* shortform structure */ - xfs_ino_t temp; + xfs_dir2_sf_hdr_t *sfp; /* shortform directory header */ =20 trace_xfs_dir2_block_to_sf(args); =20 @@ -157,13 +232,14 @@ xfs_dir2_block_to_sf( * Make a copy of the block data, so we can shrink the inode * and add local data. */ - block =3D kmem_alloc(mp->m_dirblksize, KM_SLEEP); - memcpy(block, bp->data, mp->m_dirblksize); + hdr =3D kmem_alloc(mp->m_dirblksize, KM_SLEEP); + memcpy(hdr, bp->b_addr, mp->m_dirblksize); logflags =3D XFS_ILOG_CORE; if ((error =3D xfs_dir2_shrink_inode(args, mp->m_dirdatablk, bp))) { ASSERT(error !=3D ENOSPC); goto out; } + /* * The buffer is now unconditionally gone, whether * xfs_dir2_shrink_inode worked or not. @@ -179,14 +255,14 @@ xfs_dir2_block_to_sf( /* * Copy the header into the newly allocate local space. */ - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; memcpy(sfp, sfhp, xfs_dir2_sf_hdr_size(sfhp->i8count)); dp->i_d.di_size =3D size; /* * Set up to loop over the block's entries. */ - btp =3D xfs_dir2_block_tail_p(mp, block); - ptr =3D (char *)block->u; + btp =3D xfs_dir2_block_tail_p(mp, hdr); + ptr =3D (char *)(hdr + 1); endptr =3D (char *)xfs_dir2_block_leaf_p(btp); sfep =3D xfs_dir2_sf_firstentry(sfp); /* @@ -214,7 +290,7 @@ xfs_dir2_block_to_sf( else if (dep->namelen =3D=3D 2 && dep->name[0] =3D=3D '.' && dep->name[1] =3D=3D '.') ASSERT(be64_to_cpu(dep->inumber) =3D=3D - xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent)); + xfs_dir2_sf_get_parent_ino(sfp)); /* * Normal entry, copy it into shortform. */ @@ -222,11 +298,11 @@ xfs_dir2_block_to_sf( sfep->namelen =3D dep->namelen; xfs_dir2_sf_put_offset(sfep, (xfs_dir2_data_aoff_t) - ((char *)dep - (char *)block)); + ((char *)dep - (char *)hdr)); memcpy(sfep->name, dep->name, dep->namelen); - temp =3D be64_to_cpu(dep->inumber); - xfs_dir2_sf_put_inumber(sfp, &temp, - xfs_dir2_sf_inumberp(sfep)); + xfs_dir2_sfe_put_ino(sfp, sfep, + be64_to_cpu(dep->inumber)); + sfep =3D xfs_dir2_sf_nextentry(sfp, sfep); } ptr +=3D xfs_dir2_data_entsize(dep->namelen); @@ -235,7 +311,7 @@ xfs_dir2_block_to_sf( xfs_dir2_sf_check(args); out: xfs_trans_log_inode(args->trans, dp, logflags); - kmem_free(block); + kmem_free(hdr); return error; } =20 @@ -258,7 +334,7 @@ xfs_dir2_sf_addname( xfs_dir2_data_aoff_t offset =3D 0; /* offset for new entry */ int old_isize; /* di_size before adding name */ int pick; /* which algorithm to use */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ xfs_dir2_sf_entry_t *sfep =3D NULL; /* shortform entry */ =20 trace_xfs_dir2_sf_addname(args); @@ -275,19 +351,19 @@ xfs_dir2_sf_addname( } ASSERT(dp->i_df.if_bytes =3D=3D dp->i_d.di_size); ASSERT(dp->i_df.if_u1.if_data !=3D NULL); - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(dp->i_d.di_size >=3D xfs_dir2_sf_hdr_size(sfp->hdr.i8count)); + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(dp->i_d.di_size >=3D xfs_dir2_sf_hdr_size(sfp->i8count)); /* * Compute entry (and change in) size. */ - add_entsize =3D xfs_dir2_sf_entsize_byname(sfp, args->namelen); + add_entsize =3D xfs_dir2_sf_entsize(sfp, args->namelen); incr_isize =3D add_entsize; objchange =3D 0; #if XFS_BIG_INUMS /* * Do we have to change to 8 byte inodes? */ - if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && sfp->hdr.i8count =3D=3D 0)= { + if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && sfp->i8count =3D=3D 0) { /* * Yes, adjust the entry size and the total size. */ @@ -295,7 +371,7 @@ xfs_dir2_sf_addname( (uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t); incr_isize +=3D - (sfp->hdr.count + 2) * + (sfp->count + 2) * ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t)); objchange =3D 1; @@ -365,21 +441,21 @@ xfs_dir2_sf_addname_easy( { int byteoff; /* byte offset in sf dir */ xfs_inode_t *dp; /* incore directory inode */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ =20 dp =3D args->dp; =20 - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; byteoff =3D (int)((char *)sfep - (char *)sfp); /* * Grow the in-inode space. */ - xfs_idata_realloc(dp, xfs_dir2_sf_entsize_byname(sfp, args->namelen), + xfs_idata_realloc(dp, xfs_dir2_sf_entsize(sfp, args->namelen), XFS_DATA_FORK); /* * Need to set up again due to realloc of the inode data. */ - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; sfep =3D (xfs_dir2_sf_entry_t *)((char *)sfp + byteoff); /* * Fill in the new entry. @@ -387,15 +463,14 @@ xfs_dir2_sf_addname_easy( sfep->namelen =3D args->namelen; xfs_dir2_sf_put_offset(sfep, offset); memcpy(sfep->name, args->name, sfep->namelen); - xfs_dir2_sf_put_inumber(sfp, &args->inumber, - xfs_dir2_sf_inumberp(sfep)); + xfs_dir2_sfe_put_ino(sfp, sfep, args->inumber); /* * Update the header and inode. */ - sfp->hdr.count++; + sfp->count++; #if XFS_BIG_INUMS if (args->inumber > XFS_DIR2_MAX_SHORT_INUM) - sfp->hdr.i8count++; + sfp->i8count++; #endif dp->i_d.di_size =3D new_isize; xfs_dir2_sf_check(args); @@ -425,19 +500,19 @@ xfs_dir2_sf_addname_hard( xfs_dir2_data_aoff_t offset; /* current offset value */ int old_isize; /* previous di_size */ xfs_dir2_sf_entry_t *oldsfep; /* entry in original dir */ - xfs_dir2_sf_t *oldsfp; /* original shortform dir */ + xfs_dir2_sf_hdr_t *oldsfp; /* original shortform dir */ xfs_dir2_sf_entry_t *sfep; /* entry in new dir */ - xfs_dir2_sf_t *sfp; /* new shortform dir */ + xfs_dir2_sf_hdr_t *sfp; /* new shortform dir */ =20 /* * Copy the old directory to the stack buffer. */ dp =3D args->dp; =20 - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; old_isize =3D (int)dp->i_d.di_size; buf =3D kmem_alloc(old_isize, KM_SLEEP); - oldsfp =3D (xfs_dir2_sf_t *)buf; + oldsfp =3D (xfs_dir2_sf_hdr_t *)buf; memcpy(oldsfp, sfp, old_isize); /* * Loop over the old directory finding the place we're going @@ -466,7 +541,7 @@ xfs_dir2_sf_addname_hard( /* * Reset the pointer since the buffer was reallocated. */ - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; /* * Copy the first part of the directory, including the header. */ @@ -479,12 +554,11 @@ xfs_dir2_sf_addname_hard( sfep->namelen =3D args->namelen; xfs_dir2_sf_put_offset(sfep, offset); memcpy(sfep->name, args->name, sfep->namelen); - xfs_dir2_sf_put_inumber(sfp, &args->inumber, - xfs_dir2_sf_inumberp(sfep)); - sfp->hdr.count++; + xfs_dir2_sfe_put_ino(sfp, sfep, args->inumber); + sfp->count++; #if XFS_BIG_INUMS if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && !objchange) - sfp->hdr.i8count++; + sfp->i8count++; #endif /* * If there's more left to copy, do that. @@ -518,14 +592,14 @@ xfs_dir2_sf_addname_pick( xfs_mount_t *mp; /* filesystem mount point */ xfs_dir2_data_aoff_t offset; /* data block offset */ xfs_dir2_sf_entry_t *sfep; /* shortform entry */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ int size; /* entry's data size */ int used; /* data bytes used */ =20 dp =3D args->dp; mp =3D dp->i_mount; =20 - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; size =3D xfs_dir2_data_entsize(args->namelen); offset =3D XFS_DIR2_DATA_FIRST_OFFSET; sfep =3D xfs_dir2_sf_firstentry(sfp); @@ -535,7 +609,7 @@ xfs_dir2_sf_addname_pick( * Keep track of data offset and whether we've seen a place * to insert the new entry. */ - for (i =3D 0; i < sfp->hdr.count; i++) { + for (i =3D 0; i < sfp->count; i++) { if (!holefit) holefit =3D offset + size <=3D xfs_dir2_sf_get_offset(sfep); offset =3D xfs_dir2_sf_get_offset(sfep) + @@ -547,7 +621,7 @@ xfs_dir2_sf_addname_pick( * was a data block (block form directory). */ used =3D offset + - (sfp->hdr.count + 3) * (uint)sizeof(xfs_dir2_leaf_entry_t) + + (sfp->count + 3) * (uint)sizeof(xfs_dir2_leaf_entry_t) + (uint)sizeof(xfs_dir2_block_tail_t); /* * If it won't fit in a block form then we can't insert it, @@ -593,30 +667,30 @@ xfs_dir2_sf_check( xfs_ino_t ino; /* entry inode number */ int offset; /* data offset */ xfs_dir2_sf_entry_t *sfep; /* shortform dir entry */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ =20 dp =3D args->dp; =20 - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; offset =3D XFS_DIR2_DATA_FIRST_OFFSET; - ino =3D xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent); + ino =3D xfs_dir2_sf_get_parent_ino(sfp); i8count =3D ino > XFS_DIR2_MAX_SHORT_INUM; =20 for (i =3D 0, sfep =3D xfs_dir2_sf_firstentry(sfp); - i < sfp->hdr.count; + i < sfp->count; i++, sfep =3D xfs_dir2_sf_nextentry(sfp, sfep)) { ASSERT(xfs_dir2_sf_get_offset(sfep) >=3D offset); - ino =3D xfs_dir2_sf_get_inumber(sfp, xfs_dir2_sf_inumberp(sfep)); + ino =3D xfs_dir2_sfe_get_ino(sfp, sfep); i8count +=3D ino > XFS_DIR2_MAX_SHORT_INUM; offset =3D xfs_dir2_sf_get_offset(sfep) + xfs_dir2_data_entsize(sfep->namelen); } - ASSERT(i8count =3D=3D sfp->hdr.i8count); + ASSERT(i8count =3D=3D sfp->i8count); ASSERT(XFS_BIG_INUMS || i8count =3D=3D 0); ASSERT((char *)sfep - (char *)sfp =3D=3D dp->i_d.di_size); ASSERT(offset + - (sfp->hdr.count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) + + (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) + (uint)sizeof(xfs_dir2_block_tail_t) <=3D dp->i_mount->m_dirblksize); } @@ -632,7 +706,7 @@ xfs_dir2_sf_create( { xfs_inode_t *dp; /* incore directory inode */ int i8count; /* parent inode is an 8-byte number */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ int size; /* directory size */ =20 trace_xfs_dir2_sf_create(args); @@ -662,13 +736,13 @@ xfs_dir2_sf_create( /* * Fill in the header, */ - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - sfp->hdr.i8count =3D i8count; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + sfp->i8count =3D i8count; /* * Now can put in the inode number, since i8count is set. */ - xfs_dir2_sf_put_inumber(sfp, &pino, &sfp->hdr.parent); - sfp->hdr.count =3D 0; + xfs_dir2_sf_put_parent_ino(sfp, pino); + sfp->count =3D 0; dp->i_d.di_size =3D size; xfs_dir2_sf_check(args); xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA); @@ -687,7 +761,7 @@ xfs_dir2_sf_lookup( int i; /* entry index */ int error; xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ enum xfs_dacmp cmp; /* comparison result */ xfs_dir2_sf_entry_t *ci_sfep; /* case-insens. entry */ =20 @@ -706,8 +780,8 @@ xfs_dir2_sf_lookup( } ASSERT(dp->i_df.if_bytes =3D=3D dp->i_d.di_size); ASSERT(dp->i_df.if_u1.if_data !=3D NULL); - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(dp->i_d.di_size >=3D xfs_dir2_sf_hdr_size(sfp->hdr.i8count)); + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(dp->i_d.di_size >=3D xfs_dir2_sf_hdr_size(sfp->i8count)); /* * Special case for . */ @@ -721,7 +795,7 @@ xfs_dir2_sf_lookup( */ if (args->namelen =3D=3D 2 && args->name[0] =3D=3D '.' && args->name[1] =3D=3D '.') { - args->inumber =3D xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent); + args->inumber =3D xfs_dir2_sf_get_parent_ino(sfp); args->cmpresult =3D XFS_CMP_EXACT; return XFS_ERROR(EEXIST); } @@ -729,7 +803,7 @@ xfs_dir2_sf_lookup( * Loop over all the entries trying to match ours. */ ci_sfep =3D NULL; - for (i =3D 0, sfep =3D xfs_dir2_sf_firstentry(sfp); i < sfp->hdr.count; + for (i =3D 0, sfep =3D xfs_dir2_sf_firstentry(sfp); i < sfp->count; i++, sfep =3D xfs_dir2_sf_nextentry(sfp, sfep)) { /* * Compare name and if it's an exact match, return the inode @@ -740,8 +814,7 @@ xfs_dir2_sf_lookup( sfep->namelen); if (cmp !=3D XFS_CMP_DIFFERENT && cmp !=3D args->cmpresult) { args->cmpresult =3D cmp; - args->inumber =3D xfs_dir2_sf_get_inumber(sfp, - xfs_dir2_sf_inumberp(sfep)); + args->inumber =3D xfs_dir2_sfe_get_ino(sfp, sfep); if (cmp =3D=3D XFS_CMP_EXACT) return XFS_ERROR(EEXIST); ci_sfep =3D sfep; @@ -773,7 +846,7 @@ xfs_dir2_sf_removename( int newsize; /* new inode size */ int oldsize; /* old inode size */ xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ =20 trace_xfs_dir2_sf_removename(args); =20 @@ -790,32 +863,31 @@ xfs_dir2_sf_removename( } ASSERT(dp->i_df.if_bytes =3D=3D oldsize); ASSERT(dp->i_df.if_u1.if_data !=3D NULL); - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(oldsize >=3D xfs_dir2_sf_hdr_size(sfp->hdr.i8count)); + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(oldsize >=3D xfs_dir2_sf_hdr_size(sfp->i8count)); /* * Loop over the old directory entries. * Find the one we're deleting. */ - for (i =3D 0, sfep =3D xfs_dir2_sf_firstentry(sfp); i < sfp->hdr.count; + for (i =3D 0, sfep =3D xfs_dir2_sf_firstentry(sfp); i < sfp->count; i++, sfep =3D xfs_dir2_sf_nextentry(sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) =3D=3D XFS_CMP_EXACT) { - ASSERT(xfs_dir2_sf_get_inumber(sfp, - xfs_dir2_sf_inumberp(sfep)) =3D=3D - args->inumber); + ASSERT(xfs_dir2_sfe_get_ino(sfp, sfep) =3D=3D + args->inumber); break; } } /* * Didn't find it. */ - if (i =3D=3D sfp->hdr.count) + if (i =3D=3D sfp->count) return XFS_ERROR(ENOENT); /* * Calculate sizes. */ byteoff =3D (int)((char *)sfep - (char *)sfp); - entsize =3D xfs_dir2_sf_entsize_byname(sfp, args->namelen); + entsize =3D xfs_dir2_sf_entsize(sfp, args->namelen); newsize =3D oldsize - entsize; /* * Copy the part if any after the removed entry, sliding it down. @@ -826,22 +898,22 @@ xfs_dir2_sf_removename( /* * Fix up the header and file size. */ - sfp->hdr.count--; + sfp->count--; dp->i_d.di_size =3D newsize; /* * Reallocate, making it smaller. */ xfs_idata_realloc(dp, newsize - oldsize, XFS_DATA_FORK); - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; #if XFS_BIG_INUMS /* * Are we changing inode number size? */ if (args->inumber > XFS_DIR2_MAX_SHORT_INUM) { - if (sfp->hdr.i8count =3D=3D 1) + if (sfp->i8count =3D=3D 1) xfs_dir2_sf_toino4(args); else - sfp->hdr.i8count--; + sfp->i8count--; } #endif xfs_dir2_sf_check(args); @@ -865,7 +937,7 @@ xfs_dir2_sf_replace( int i8elevated; /* sf_toino8 set i8count=3D1 */ #endif xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ - xfs_dir2_sf_t *sfp; /* shortform structure */ + xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ =20 trace_xfs_dir2_sf_replace(args); =20 @@ -881,19 +953,19 @@ xfs_dir2_sf_replace( } ASSERT(dp->i_df.if_bytes =3D=3D dp->i_d.di_size); ASSERT(dp->i_df.if_u1.if_data !=3D NULL); - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(dp->i_d.di_size >=3D xfs_dir2_sf_hdr_size(sfp->hdr.i8count)); + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(dp->i_d.di_size >=3D xfs_dir2_sf_hdr_size(sfp->i8count)); #if XFS_BIG_INUMS /* * New inode number is large, and need to convert to 8-byte inodes. */ - if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && sfp->hdr.i8count =3D=3D 0)= { + if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && sfp->i8count =3D=3D 0) { int error; /* error return value */ int newsize; /* new inode size */ =20 newsize =3D dp->i_df.if_bytes + - (sfp->hdr.count + 1) * + (sfp->count + 1) * ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t)); /* @@ -911,7 +983,7 @@ xfs_dir2_sf_replace( */ xfs_dir2_sf_toino8(args); i8elevated =3D 1; - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; } else i8elevated =3D 0; #endif @@ -922,34 +994,32 @@ xfs_dir2_sf_replace( if (args->namelen =3D=3D 2 && args->name[0] =3D=3D '.' && args->name[1] =3D=3D '.') { #if XFS_BIG_INUMS || defined(DEBUG) - ino =3D xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent); + ino =3D xfs_dir2_sf_get_parent_ino(sfp); ASSERT(args->inumber !=3D ino); #endif - xfs_dir2_sf_put_inumber(sfp, &args->inumber, &sfp->hdr.parent); + xfs_dir2_sf_put_parent_ino(sfp, args->inumber); } /* * Normal entry, look for the name. */ else { for (i =3D 0, sfep =3D xfs_dir2_sf_firstentry(sfp); - i < sfp->hdr.count; + i < sfp->count; i++, sfep =3D xfs_dir2_sf_nextentry(sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) =3D=3D XFS_CMP_EXACT) { #if XFS_BIG_INUMS || defined(DEBUG) - ino =3D xfs_dir2_sf_get_inumber(sfp, - xfs_dir2_sf_inumberp(sfep)); + ino =3D xfs_dir2_sfe_get_ino(sfp, sfep); ASSERT(args->inumber !=3D ino); #endif - xfs_dir2_sf_put_inumber(sfp, &args->inumber, - xfs_dir2_sf_inumberp(sfep)); + xfs_dir2_sfe_put_ino(sfp, sfep, args->inumber); break; } } /* * Didn't find it. */ - if (i =3D=3D sfp->hdr.count) { + if (i =3D=3D sfp->count) { ASSERT(args->op_flags & XFS_DA_OP_OKNOENT); #if XFS_BIG_INUMS if (i8elevated) @@ -967,10 +1037,10 @@ xfs_dir2_sf_replace( /* * And the old count was one, so need to convert to small. */ - if (sfp->hdr.i8count =3D=3D 1) + if (sfp->i8count =3D=3D 1) xfs_dir2_sf_toino4(args); else - sfp->hdr.i8count--; + sfp->i8count--; } /* * See if the old number was small, the new number is large. @@ -981,9 +1051,9 @@ xfs_dir2_sf_replace( * add to the i8count unless we just converted to 8-byte * inodes (which does an implied i8count =3D 1) */ - ASSERT(sfp->hdr.i8count !=3D 0); + ASSERT(sfp->i8count !=3D 0); if (!i8elevated) - sfp->hdr.i8count++; + sfp->i8count++; } #endif xfs_dir2_sf_check(args); @@ -1003,13 +1073,12 @@ xfs_dir2_sf_toino4( char *buf; /* old dir's buffer */ xfs_inode_t *dp; /* incore directory inode */ int i; /* entry index */ - xfs_ino_t ino; /* entry inode number */ int newsize; /* new inode size */ xfs_dir2_sf_entry_t *oldsfep; /* old sf entry */ - xfs_dir2_sf_t *oldsfp; /* old sf directory */ + xfs_dir2_sf_hdr_t *oldsfp; /* old sf directory */ int oldsize; /* old inode size */ xfs_dir2_sf_entry_t *sfep; /* new sf entry */ - xfs_dir2_sf_t *sfp; /* new sf directory */ + xfs_dir2_sf_hdr_t *sfp; /* new sf directory */ =20 trace_xfs_dir2_sf_toino4(args); =20 @@ -1022,44 +1091,42 @@ xfs_dir2_sf_toino4( */ oldsize =3D dp->i_df.if_bytes; buf =3D kmem_alloc(oldsize, KM_SLEEP); - oldsfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(oldsfp->hdr.i8count =3D=3D 1); + oldsfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(oldsfp->i8count =3D=3D 1); memcpy(buf, oldsfp, oldsize); /* * Compute the new inode size. */ newsize =3D oldsize - - (oldsfp->hdr.count + 1) * + (oldsfp->count + 1) * ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t)); xfs_idata_realloc(dp, -oldsize, XFS_DATA_FORK); xfs_idata_realloc(dp, newsize, XFS_DATA_FORK); /* * Reset our pointers, the data has moved. */ - oldsfp =3D (xfs_dir2_sf_t *)buf; - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + oldsfp =3D (xfs_dir2_sf_hdr_t *)buf; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; /* * Fill in the new header. */ - sfp->hdr.count =3D oldsfp->hdr.count; - sfp->hdr.i8count =3D 0; - ino =3D xfs_dir2_sf_get_inumber(oldsfp, &oldsfp->hdr.parent); - xfs_dir2_sf_put_inumber(sfp, &ino, &sfp->hdr.parent); + sfp->count =3D oldsfp->count; + sfp->i8count =3D 0; + xfs_dir2_sf_put_parent_ino(sfp, xfs_dir2_sf_get_parent_ino(oldsfp)); /* * Copy the entries field by field. */ for (i =3D 0, sfep =3D xfs_dir2_sf_firstentry(sfp), oldsfep =3D xfs_dir2_sf_firstentry(oldsfp); - i < sfp->hdr.count; + i < sfp->count; i++, sfep =3D xfs_dir2_sf_nextentry(sfp, sfep), oldsfep =3D xfs_dir2_sf_nextentry(oldsfp, oldsfep)) { sfep->namelen =3D oldsfep->namelen; sfep->offset =3D oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); - ino =3D xfs_dir2_sf_get_inumber(oldsfp, - xfs_dir2_sf_inumberp(oldsfep)); - xfs_dir2_sf_put_inumber(sfp, &ino, xfs_dir2_sf_inumberp(sfep)); + xfs_dir2_sfe_put_ino(sfp, sfep, + xfs_dir2_sfe_get_ino(oldsfp, oldsfep)); } /* * Clean up the inode. @@ -1081,13 +1148,12 @@ xfs_dir2_sf_toino8( char *buf; /* old dir's buffer */ xfs_inode_t *dp; /* incore directory inode */ int i; /* entry index */ - xfs_ino_t ino; /* entry inode number */ int newsize; /* new inode size */ xfs_dir2_sf_entry_t *oldsfep; /* old sf entry */ - xfs_dir2_sf_t *oldsfp; /* old sf directory */ + xfs_dir2_sf_hdr_t *oldsfp; /* old sf directory */ int oldsize; /* old inode size */ xfs_dir2_sf_entry_t *sfep; /* new sf entry */ - xfs_dir2_sf_t *sfp; /* new sf directory */ + xfs_dir2_sf_hdr_t *sfp; /* new sf directory */ =20 trace_xfs_dir2_sf_toino8(args); =20 @@ -1100,44 +1166,42 @@ xfs_dir2_sf_toino8( */ oldsize =3D dp->i_df.if_bytes; buf =3D kmem_alloc(oldsize, KM_SLEEP); - oldsfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; - ASSERT(oldsfp->hdr.i8count =3D=3D 0); + oldsfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(oldsfp->i8count =3D=3D 0); memcpy(buf, oldsfp, oldsize); /* * Compute the new inode size. */ newsize =3D oldsize + - (oldsfp->hdr.count + 1) * + (oldsfp->count + 1) * ((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t)); xfs_idata_realloc(dp, -oldsize, XFS_DATA_FORK); xfs_idata_realloc(dp, newsize, XFS_DATA_FORK); /* * Reset our pointers, the data has moved. */ - oldsfp =3D (xfs_dir2_sf_t *)buf; - sfp =3D (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; + oldsfp =3D (xfs_dir2_sf_hdr_t *)buf; + sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; /* * Fill in the new header. */ - sfp->hdr.count =3D oldsfp->hdr.count; - sfp->hdr.i8count =3D 1; - ino =3D xfs_dir2_sf_get_inumber(oldsfp, &oldsfp->hdr.parent); - xfs_dir2_sf_put_inumber(sfp, &ino, &sfp->hdr.parent); + sfp->count =3D oldsfp->count; + sfp->i8count =3D 1; + xfs_dir2_sf_put_parent_ino(sfp, xfs_dir2_sf_get_parent_ino(oldsfp)); /* * Copy the entries field by field. */ for (i =3D 0, sfep =3D xfs_dir2_sf_firstentry(sfp), oldsfep =3D xfs_dir2_sf_firstentry(oldsfp); - i < sfp->hdr.count; + i < sfp->count; i++, sfep =3D xfs_dir2_sf_nextentry(sfp, sfep), oldsfep =3D xfs_dir2_sf_nextentry(oldsfp, oldsfep)) { sfep->namelen =3D oldsfep->namelen; sfep->offset =3D oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); - ino =3D xfs_dir2_sf_get_inumber(oldsfp, - xfs_dir2_sf_inumberp(oldsfep)); - xfs_dir2_sf_put_inumber(sfp, &ino, xfs_dir2_sf_inumberp(sfep)); + xfs_dir2_sfe_put_ino(sfp, sfep, + xfs_dir2_sfe_get_ino(oldsfp, oldsfep)); } /* * Clean up the inode. diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 1fcafb6..529d92d 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -131,7 +131,7 @@ xfs_check_agi_freecount( /* * Initialise a new set of inodes. */ -STATIC void +STATIC int xfs_ialloc_inode_init( struct xfs_mount *mp, struct xfs_trans *tp, @@ -182,10 +182,9 @@ xfs_ialloc_inode_init( d =3D XFS_AGB_TO_DADDR(mp, agno, agbno + (j * blks_per_cluster)); fbuf =3D xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize * blks_per_cluster, - XBF_LOCK); - ASSERT(fbuf); - ASSERT(!XFS_BUF_GETERROR(fbuf)); - + XBF_UNMAPPED); + if (!fbuf) + return ENOMEM; /* * Initialize all inodes in this buffer and then log them. * @@ -193,6 +192,7 @@ xfs_ialloc_inode_init( * to log a whole cluster of inodes instead of all the * individual transactions causing a lot of log traffic. */ + fbuf->b_ops =3D &xfs_inode_buf_ops; xfs_buf_zero(fbuf, 0, ninodes << mp->m_sb.sb_inodelog); for (i =3D 0; i < ninodes; i++) { int ioffset =3D i << mp->m_sb.sb_inodelog; @@ -207,6 +207,7 @@ xfs_ialloc_inode_init( } xfs_trans_inode_alloc_buf(tp, fbuf); } + return 0; } =20 /* @@ -232,6 +233,7 @@ xfs_ialloc_ag_alloc( /* boundary */ struct xfs_perag *pag; =20 + memset(&args, 0, sizeof(args)); args.tp =3D tp; args.mp =3D tp->t_mountp; =20 @@ -258,8 +260,6 @@ xfs_ialloc_ag_alloc( (args.agbno < be32_to_cpu(agi->agi_length)))) { args.fsbno =3D XFS_AGB_TO_FSB(args.mp, agno, args.agbno); args.type =3D XFS_ALLOCTYPE_THIS_BNO; - args.mod =3D args.total =3D args.wasdel =3D args.isfl =3D - args.userdata =3D args.minalignslop =3D 0; args.prod =3D 1; =20 /* @@ -312,8 +312,6 @@ xfs_ialloc_ag_alloc( * Allocate a fixed-size extent of inodes. */ args.type =3D XFS_ALLOCTYPE_NEAR_BNO; - args.mod =3D args.total =3D args.wasdel =3D args.isfl =3D - args.userdata =3D args.minalignslop =3D 0; args.prod =3D 1; /* * Allow space for the inode btree to split. @@ -351,9 +349,11 @@ xfs_ialloc_ag_alloc( * rather than a linear progression to prevent the next generation * number from being easily guessable. */ - xfs_ialloc_inode_init(args.mp, tp, agno, args.agbno, args.len, - random32()); + error =3D xfs_ialloc_inode_init(args.mp, tp, agno, args.agbno, + args.len, random32()); =20 + if (error) + return error; /* * Convert the results. */ @@ -411,7 +411,7 @@ xfs_ialloc_next_ag( =20 spin_lock(&mp->m_agirotor_lock); agno =3D mp->m_agirotor; - if (++mp->m_agirotor =3D=3D mp->m_maxagi) + if (++mp->m_agirotor >=3D mp->m_maxagi) mp->m_agirotor =3D 0; spin_unlock(&mp->m_agirotor_lock); =20 @@ -422,14 +422,13 @@ xfs_ialloc_next_ag( * Select an allocation group to look for a free inode in, based on the pa= rent * inode and then mode. Return the allocation group buffer. */ -STATIC xfs_buf_t * /* allocation group buffer */ +STATIC xfs_agnumber_t xfs_ialloc_ag_select( xfs_trans_t *tp, /* transaction pointer */ xfs_ino_t parent, /* parent directory inode number */ - mode_t mode, /* bits set to indicate file type */ + umode_t mode, /* bits set to indicate file type */ int okalloc) /* ok to allocate more space */ { - xfs_buf_t *agbp; /* allocation group header buffer */ xfs_agnumber_t agcount; /* number of ag's in the filesystem */ xfs_agnumber_t agno; /* current ag number */ int flags; /* alloc buffer locking flags */ @@ -439,6 +438,7 @@ xfs_ialloc_ag_select( int needspace; /* file mode implies space allocated */ xfs_perag_t *pag; /* per allocation group data */ xfs_agnumber_t pagno; /* parent (starting) ag number */ + int error; =20 /* * Files of these types need at least one block if length > 0 @@ -454,7 +454,9 @@ xfs_ialloc_ag_select( if (pagno >=3D agcount) pagno =3D 0; } + ASSERT(pagno < agcount); + /* * Loop through allocation groups, looking for one with a little * free space in it. Note we don't look for free inodes, exactly. @@ -466,51 +468,45 @@ xfs_ialloc_ag_select( flags =3D XFS_ALLOC_FLAG_TRYLOCK; for (;;) { pag =3D xfs_perag_get(mp, agno); + if (!pag->pagi_inodeok) { + xfs_ialloc_next_ag(mp); + goto nextag; + } + if (!pag->pagi_init) { - if (xfs_ialloc_read_agi(mp, tp, agno, &agbp)) { - agbp =3D NULL; + error =3D xfs_ialloc_pagi_init(mp, tp, agno); + if (error) goto nextag; - } - } else - agbp =3D NULL; + } =20 - if (!pag->pagi_inodeok) { - xfs_ialloc_next_ag(mp); - goto unlock_nextag; + if (pag->pagi_freecount) { + xfs_perag_put(pag); + return agno; } =20 - /* - * Is there enough free space for the file plus a block - * of inodes (if we need to allocate some)? - */ - ineed =3D pag->pagi_freecount ? 0 : XFS_IALLOC_BLOCKS(mp); - if (ineed && !pag->pagf_init) { - if (agbp =3D=3D NULL && - xfs_ialloc_read_agi(mp, tp, agno, &agbp)) { - agbp =3D NULL; + if (!okalloc) + goto nextag; + + if (!pag->pagf_init) { + error =3D xfs_alloc_pagf_init(mp, tp, agno, flags); + if (error) goto nextag; - } - (void)xfs_alloc_pagf_init(mp, tp, agno, flags); } - if (!ineed || pag->pagf_init) { - if (ineed && !(longest =3D pag->pagf_longest)) - longest =3D pag->pagf_flcount > 0; - if (!ineed || - (pag->pagf_freeblks >=3D needspace + ineed && - longest >=3D ineed && - okalloc)) { - if (agbp =3D=3D NULL && - xfs_ialloc_read_agi(mp, tp, agno, &agbp)) { - agbp =3D NULL; - goto nextag; - } - xfs_perag_put(pag); - return agbp; - } + + /* + * Is there enough free space for the file plus a block of + * inodes? (if we need to allocate some)? + */ + ineed =3D XFS_IALLOC_BLOCKS(mp); + longest =3D pag->pagf_longest; + if (!longest) + longest =3D pag->pagf_flcount > 0; + + if (pag->pagf_freeblks >=3D needspace + ineed && + longest >=3D ineed) { + xfs_perag_put(pag); + return agno; } -unlock_nextag: - if (agbp) - xfs_trans_brelse(tp, agbp); nextag: xfs_perag_put(pag); /* @@ -518,13 +514,13 @@ nextag: * down. */ if (XFS_FORCED_SHUTDOWN(mp)) - return NULL; + return NULLAGNUMBER; agno++; if (agno >=3D agcount) agno =3D 0; if (agno =3D=3D pagno) { if (flags =3D=3D 0) - return NULL; + return NULLAGNUMBER; flags =3D 0; } } @@ -587,188 +583,39 @@ xfs_ialloc_get_rec( } =20 /* - * Visible inode allocation functions. - */ - -/* - * Allocate an inode on disk. - * Mode is used to tell whether the new inode will need space, and whether - * it is a directory. + * Allocate an inode. * - * The arguments IO_agbp and alloc_done are defined to work within - * the constraint of one allocation per transaction. - * xfs_dialloc() is designed to be called twice if it has to do an - * allocation to make more free inodes. On the first call, - * IO_agbp should be set to NULL. If an inode is available, - * i.e., xfs_dialloc() did not need to do an allocation, an inode - * number is returned. In this case, IO_agbp would be set to the - * current ag_buf and alloc_done set to false. - * If an allocation needed to be done, xfs_dialloc would return - * the current ag_buf in IO_agbp and set alloc_done to true. - * The caller should then commit the current transaction, allocate a new - * transaction, and call xfs_dialloc() again, passing in the previous - * value of IO_agbp. IO_agbp should be held across the transactions. - * Since the agbp is locked across the two calls, the second call is - * guaranteed to have a free inode available. - * - * Once we successfully pick an inode its number is returned and the - * on-disk data structures are updated. The inode itself is not read - * in, since doing so would break ordering constraints with xfs_reclaim. + * The caller selected an AG for us, and made sure that free inodes are + * available. */ -int -xfs_dialloc( - xfs_trans_t *tp, /* transaction pointer */ - xfs_ino_t parent, /* parent inode (directory) */ - mode_t mode, /* mode bits for new inode */ - int okalloc, /* ok to allocate more space */ - xfs_buf_t **IO_agbp, /* in/out ag header's buffer */ - boolean_t *alloc_done, /* true if we needed to replenish - inode freelist */ - xfs_ino_t *inop) /* inode number allocated */ +STATIC int +xfs_dialloc_ag( + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_ino_t parent, + xfs_ino_t *inop) { - xfs_agnumber_t agcount; /* number of allocation groups */ - xfs_buf_t *agbp; /* allocation group header's buffer */ - xfs_agnumber_t agno; /* allocation group number */ - xfs_agi_t *agi; /* allocation group header structure */ - xfs_btree_cur_t *cur; /* inode allocation btree cursor */ - int error; /* error return value */ - int i; /* result code */ - int ialloced; /* inode allocation status */ - int noroom =3D 0; /* no space for inode blk allocation */ - xfs_ino_t ino; /* fs-relative inode to be returned */ - /* REFERENCED */ - int j; /* result code */ - xfs_mount_t *mp; /* file system mount structure */ - int offset; /* index of inode in chunk */ - xfs_agino_t pagino; /* parent's AG relative inode # */ - xfs_agnumber_t pagno; /* parent's AG number */ - xfs_inobt_rec_incore_t rec; /* inode allocation record */ - xfs_agnumber_t tagno; /* testing allocation group number */ - xfs_btree_cur_t *tcur; /* temp cursor */ - xfs_inobt_rec_incore_t trec; /* temp inode allocation record */ - struct xfs_perag *pag; - - - if (*IO_agbp =3D=3D NULL) { - /* - * We do not have an agbp, so select an initial allocation - * group for inode allocation. - */ - agbp =3D xfs_ialloc_ag_select(tp, parent, mode, okalloc); - /* - * Couldn't find an allocation group satisfying the - * criteria, give up. - */ - if (!agbp) { - *inop =3D NULLFSINO; - return 0; - } - agi =3D XFS_BUF_TO_AGI(agbp); - ASSERT(be32_to_cpu(agi->agi_magicnum) =3D=3D XFS_AGI_MAGIC); - } else { - /* - * Continue where we left off before. In this case, we - * know that the allocation group has free inodes. - */ - agbp =3D *IO_agbp; - agi =3D XFS_BUF_TO_AGI(agbp); - ASSERT(be32_to_cpu(agi->agi_magicnum) =3D=3D XFS_AGI_MAGIC); - ASSERT(be32_to_cpu(agi->agi_freecount) > 0); - } - mp =3D tp->t_mountp; - agcount =3D mp->m_sb.sb_agcount; - agno =3D be32_to_cpu(agi->agi_seqno); - tagno =3D agno; - pagno =3D XFS_INO_TO_AGNO(mp, parent); - pagino =3D XFS_INO_TO_AGINO(mp, parent); - - /* - * If we have already hit the ceiling of inode blocks then clear - * okalloc so we scan all available agi structures for a free - * inode. - */ - - if (mp->m_maxicount && - mp->m_sb.sb_icount + XFS_IALLOC_INODES(mp) > mp->m_maxicount) { - noroom =3D 1; - okalloc =3D 0; - } + struct xfs_mount *mp =3D tp->t_mountp; + struct xfs_agi *agi =3D XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno =3D be32_to_cpu(agi->agi_seqno); + xfs_agnumber_t pagno =3D XFS_INO_TO_AGNO(mp, parent); + xfs_agino_t pagino =3D XFS_INO_TO_AGINO(mp, parent); + struct xfs_perag *pag; + struct xfs_btree_cur *cur, *tcur; + struct xfs_inobt_rec_incore rec, trec; + xfs_ino_t ino; + int error; + int offset; + int i, j; =20 - /* - * Loop until we find an allocation group that either has free inodes - * or in which we can allocate some inodes. Iterate through the - * allocation groups upward, wrapping at the end. - */ - *alloc_done =3D B_FALSE; - while (!agi->agi_freecount) { - /* - * Don't do anything if we're not supposed to allocate - * any blocks, just go on to the next ag. - */ - if (okalloc) { - /* - * Try to allocate some new inodes in the allocation - * group. - */ - if ((error =3D xfs_ialloc_ag_alloc(tp, agbp, &ialloced))) { - xfs_trans_brelse(tp, agbp); - if (error =3D=3D ENOSPC) { - *inop =3D NULLFSINO; - return 0; - } else - return error; - } - if (ialloced) { - /* - * We successfully allocated some inodes, return - * the current context to the caller so that it - * can commit the current transaction and call - * us again where we left off. - */ - ASSERT(be32_to_cpu(agi->agi_freecount) > 0); - *alloc_done =3D B_TRUE; - *IO_agbp =3D agbp; - *inop =3D NULLFSINO; - return 0; - } - } - /* - * If it failed, give up on this ag. - */ - xfs_trans_brelse(tp, agbp); - /* - * Go on to the next ag: get its ag header. - */ -nextag: - if (++tagno =3D=3D agcount) - tagno =3D 0; - if (tagno =3D=3D agno) { - *inop =3D NULLFSINO; - return noroom ? ENOSPC : 0; - } - pag =3D xfs_perag_get(mp, tagno); - if (pag->pagi_inodeok =3D=3D 0) { - xfs_perag_put(pag); - goto nextag; - } - error =3D xfs_ialloc_read_agi(mp, tp, tagno, &agbp); - xfs_perag_put(pag); - if (error) - goto nextag; - agi =3D XFS_BUF_TO_AGI(agbp); - ASSERT(be32_to_cpu(agi->agi_magicnum) =3D=3D XFS_AGI_MAGIC); - } - /* - * Here with an allocation group that has a free inode. - * Reset agno since we may have chosen a new ag in the - * loop above. - */ - agno =3D tagno; - *IO_agbp =3D NULL; pag =3D xfs_perag_get(mp, agno); =20 + ASSERT(pag->pagi_init); + ASSERT(pag->pagi_inodeok); + ASSERT(pag->pagi_freecount > 0); + restart_pagno: - cur =3D xfs_inobt_init_cursor(mp, tp, agbp, be32_to_cpu(agi->agi_seqno)); + cur =3D xfs_inobt_init_cursor(mp, tp, agbp, agno); /* * If pagino is 0 (this is the root inode allocation) use newino. * This must work because we've just allocated some. @@ -925,7 +772,7 @@ nextag: * See if the most recently allocated block has any free. */ newino: - if (be32_to_cpu(agi->agi_newino) !=3D NULLAGINO) { + if (agi->agi_newino !=3D cpu_to_be32(NULLAGINO)) { error =3D xfs_inobt_lookup(cur, be32_to_cpu(agi->agi_newino), XFS_LOOKUP_EQ, &i); if (error) @@ -968,7 +815,7 @@ newino: } =20 alloc_inode: - offset =3D xfs_ialloc_find_free(&rec.ir_free); + offset =3D xfs_lowbit64(rec.ir_free); ASSERT(offset >=3D 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % @@ -1000,6 +847,165 @@ error0: return error; } =20 +/* + * Allocate an inode on disk. + * + * Mode is used to tell whether the new inode will need space, and whether= it + * is a directory. + * + * This function is designed to be called twice if it has to do an allocat= ion + * to make more free inodes. On the first call, *IO_agbp should be set to= NULL. + * If an inode is available without having to performn an allocation, an i= node + * number is returned. In this case, *IO_agbp is set to NULL. If an allo= cation + * needs to be done, xfs_dialloc returns the current AGI buffer in *IO_agb= p. + * The caller should then commit the current transaction, allocate a + * new transaction, and call xfs_dialloc() again, passing in the previous = value + * of *IO_agbp. IO_agbp should be held across the transactions. Since the= AGI + * buffer is locked across the two calls, the second call is guaranteed to= have + * a free inode available. + * + * Once we successfully pick an inode its number is returned and the on-di= sk + * data structures are updated. The inode itself is not read in, since do= ing so + * would break ordering constraints with xfs_reclaim. + */ +int +xfs_dialloc( + struct xfs_trans *tp, + xfs_ino_t parent, + umode_t mode, + int okalloc, + struct xfs_buf **IO_agbp, + xfs_ino_t *inop) +{ + struct xfs_mount *mp =3D tp->t_mountp; + struct xfs_buf *agbp; + xfs_agnumber_t agno; + int error; + int ialloced; + int noroom =3D 0; + xfs_agnumber_t start_agno; + struct xfs_perag *pag; + + if (*IO_agbp) { + /* + * If the caller passes in a pointer to the AGI buffer, + * continue where we left off before. In this case, we + * know that the allocation group has free inodes. + */ + agbp =3D *IO_agbp; + goto out_alloc; + } + + /* + * We do not have an agbp, so select an initial allocation + * group for inode allocation. + */ + start_agno =3D xfs_ialloc_ag_select(tp, parent, mode, okalloc); + if (start_agno =3D=3D NULLAGNUMBER) { + *inop =3D NULLFSINO; + return 0; + } + + /* + * If we have already hit the ceiling of inode blocks then clear + * okalloc so we scan all available agi structures for a free + * inode. + */ + if (mp->m_maxicount && + mp->m_sb.sb_icount + XFS_IALLOC_INODES(mp) > mp->m_maxicount) { + noroom =3D 1; + okalloc =3D 0; + } + + /* + * Loop until we find an allocation group that either has free inodes + * or in which we can allocate some inodes. Iterate through the + * allocation groups upward, wrapping at the end. + */ + agno =3D start_agno; + for (;;) { + pag =3D xfs_perag_get(mp, agno); + if (!pag->pagi_inodeok) { + xfs_ialloc_next_ag(mp); + goto nextag; + } + + if (!pag->pagi_init) { + error =3D xfs_ialloc_pagi_init(mp, tp, agno); + if (error) + goto out_error; + } + + /* + * Do a first racy fast path check if this AG is usable. + */ + if (!pag->pagi_freecount && !okalloc) + goto nextag; + + /* + * Then read in the AGI buffer and recheck with the AGI buffer + * lock held. + */ + error =3D xfs_ialloc_read_agi(mp, tp, agno, &agbp); + if (error) + goto out_error; + + if (pag->pagi_freecount) { + xfs_perag_put(pag); + goto out_alloc; + } + + if (!okalloc) + goto nextag_relse_buffer; + + + error =3D xfs_ialloc_ag_alloc(tp, agbp, &ialloced); + if (error) { + xfs_trans_brelse(tp, agbp); + + if (error !=3D ENOSPC) + goto out_error; + + xfs_perag_put(pag); + *inop =3D NULLFSINO; + return 0; + } + + if (ialloced) { + /* + * We successfully allocated some inodes, return + * the current context to the caller so that it + * can commit the current transaction and call + * us again where we left off. + */ + ASSERT(pag->pagi_freecount > 0); + xfs_perag_put(pag); + + *IO_agbp =3D agbp; + *inop =3D NULLFSINO; + return 0; + } + +nextag_relse_buffer: + xfs_trans_brelse(tp, agbp); +nextag: + xfs_perag_put(pag); + if (++agno =3D=3D mp->m_sb.sb_agcount) + agno =3D 0; + if (agno =3D=3D start_agno) { + *inop =3D NULLFSINO; + return noroom ? ENOSPC : 0; + } + } + +out_alloc: + *IO_agbp =3D NULL; + return xfs_dialloc_ag(tp, agbp, parent, inop); +out_error: + xfs_perag_put(pag); + return XFS_ERROR(error); +} + STATIC int xfs_imap_lookup( struct xfs_mount *mp, @@ -1019,10 +1025,9 @@ xfs_imap_lookup( =20 error =3D xfs_ialloc_read_agi(mp, tp, agno, &agbp); if (error) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "xfs_ialloc_read_agi() returned " - "error %d, agno %d", - error, agno); + xfs_alert(mp, + "%s: xfs_ialloc_read_agi() returned error %d, agno %d", + __func__, error, agno); return error; } =20 @@ -1100,24 +1105,21 @@ xfs_imap( if (flags & XFS_IGET_UNTRUSTED) return XFS_ERROR(EINVAL); if (agno >=3D mp->m_sb.sb_agcount) { - xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_imap: agno (%d) >=3D " - "mp->m_sb.sb_agcount (%d)", - agno, mp->m_sb.sb_agcount); + xfs_alert(mp, + "%s: agno (%d) >=3D mp->m_sb.sb_agcount (%d)", + __func__, agno, mp->m_sb.sb_agcount); } if (agbno >=3D mp->m_sb.sb_agblocks) { - xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_imap: agbno (0x%llx) >=3D " - "mp->m_sb.sb_agblocks (0x%lx)", - (unsigned long long) agbno, - (unsigned long) mp->m_sb.sb_agblocks); + xfs_alert(mp, + "%s: agbno (0x%llx) >=3D mp->m_sb.sb_agblocks (0x%lx)", + __func__, (unsigned long long)agbno, + (unsigned long)mp->m_sb.sb_agblocks); } if (ino !=3D XFS_AGINO_TO_INO(mp, agno, agino)) { - xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_imap: ino (0x%llx) !=3D " - "XFS_AGINO_TO_INO(mp, agno, agino) " - "(0x%llx)", - ino, XFS_AGINO_TO_INO(mp, agno, agino)); + xfs_alert(mp, + "%s: ino (0x%llx) !=3D XFS_AGINO_TO_INO() (0x%llx)", + __func__, ino, + XFS_AGINO_TO_INO(mp, agno, agino)); } xfs_stack_trace(); #endif /* DEBUG */ @@ -1189,10 +1191,9 @@ out_map: */ if ((imap->im_blkno + imap->im_len) > XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "(imap->im_blkno (0x%llx) + imap->im_len (0x%llx)) > " - " XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) (0x%llx)", - (unsigned long long) imap->im_blkno, + xfs_alert(mp, + "%s: (im_blkno (0x%llx) + im_len (0x%llx)) > sb_dblocks (0x%llx)", + __func__, (unsigned long long) imap->im_blkno, (unsigned long long) imap->im_len, XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)); return XFS_ERROR(EINVAL); @@ -1253,7 +1254,7 @@ xfs_ialloc_log_agi( xfs_agi_t *agi; /* allocation group header */ =20 agi =3D XFS_BUF_TO_AGI(bp); - ASSERT(be32_to_cpu(agi->agi_magicnum) =3D=3D XFS_AGI_MAGIC); + ASSERT(agi->agi_magicnum =3D=3D cpu_to_be32(XFS_AGI_MAGIC)); #endif /* * Compute byte offsets for the first and last fields. @@ -1279,6 +1280,57 @@ xfs_check_agi_unlinked( #define xfs_check_agi_unlinked(agi) #endif =20 +static void +xfs_agi_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_agi *agi =3D XFS_BUF_TO_AGI(bp); + int agi_ok; + + /* + * Validate the magic number of the agi block. + */ + agi_ok =3D agi->agi_magicnum =3D=3D cpu_to_be32(XFS_AGI_MAGIC) && + XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)); + + /* + * during growfs operations, the perag is not fully initialised, + * so we can't use it for any useful checking. growfs ensures we can't + * use it by using uncached buffers that don't have the perag attached + * so we can detect and avoid this problem. + */ + if (bp->b_pag) + agi_ok =3D agi_ok && be32_to_cpu(agi->agi_seqno) =3D=3D + bp->b_pag->pag_agno; + + if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, + XFS_RANDOM_IALLOC_READ_AGI))) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agi); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + xfs_check_agi_unlinked(agi); +} + +static void +xfs_agi_read_verify( + struct xfs_buf *bp) +{ + xfs_agi_verify(bp); +} + +static void +xfs_agi_write_verify( + struct xfs_buf *bp) +{ + xfs_agi_verify(bp); +} + +const struct xfs_buf_ops xfs_agi_buf_ops =3D { + .verify_read =3D xfs_agi_read_verify, + .verify_write =3D xfs_agi_write_verify, +}; + /* * Read in the allocation group header (inode allocation section) */ @@ -1289,38 +1341,18 @@ xfs_read_agi( xfs_agnumber_t agno, /* allocation group number */ struct xfs_buf **bpp) /* allocation group hdr buf */ { - struct xfs_agi *agi; /* allocation group header */ - int agi_ok; /* agi is consistent */ int error; =20 ASSERT(agno !=3D NULLAGNUMBER); =20 error =3D xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0, bpp); + XFS_FSS_TO_BB(mp, 1), 0, bpp, &xfs_agi_buf_ops); if (error) return error; =20 - ASSERT(*bpp && !XFS_BUF_GETERROR(*bpp)); - agi =3D XFS_BUF_TO_AGI(*bpp); - - /* - * Validate the magic number of the agi block. - */ - agi_ok =3D be32_to_cpu(agi->agi_magicnum) =3D=3D XFS_AGI_MAGIC && - XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)) && - be32_to_cpu(agi->agi_seqno) =3D=3D agno; - if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, - XFS_RANDOM_IALLOC_READ_AGI))) { - XFS_CORRUPTION_ERROR("xfs_read_agi", XFS_ERRLEVEL_LOW, - mp, agi); - xfs_trans_brelse(tp, *bpp); - return XFS_ERROR(EFSCORRUPTED); - } - - XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_AGI, XFS_AGI_REF); - - xfs_check_agi_unlinked(agi); + ASSERT(!xfs_buf_geterror(*bpp)); + xfs_buf_set_ref(*bpp, XFS_AGI_REF); return 0; } =20 diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 35dd96f..0bc24cc 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -163,6 +163,59 @@ xfs_inobt_key_diff( cur->bc_rec.i.ir_startino; } =20 +void +xfs_inobt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); + unsigned int level; + int sblock_ok; /* block passes checks */ + + /* magic number and level verification */ + level =3D be16_to_cpu(block->bb_level); + sblock_ok =3D block->bb_magic =3D=3D cpu_to_be32(XFS_IBT_MAGIC) && + level < mp->m_in_maxlevels; + + /* numrecs verification */ + sblock_ok =3D sblock_ok && + be16_to_cpu(block->bb_numrecs) <=3D mp->m_inobt_mxr[level !=3D 0]; + + /* sibling pointer verification */ + sblock_ok =3D sblock_ok && + (block->bb_u.s.bb_leftsib =3D=3D cpu_to_be32(NULLAGBLOCK) || + be32_to_cpu(block->bb_u.s.bb_leftsib) < mp->m_sb.sb_agblocks) && + block->bb_u.s.bb_leftsib && + (block->bb_u.s.bb_rightsib =3D=3D cpu_to_be32(NULLAGBLOCK) || + be32_to_cpu(block->bb_u.s.bb_rightsib) < mp->m_sb.sb_agblocks) && + block->bb_u.s.bb_rightsib; + + if (!sblock_ok) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_inobt_read_verify( + struct xfs_buf *bp) +{ + xfs_inobt_verify(bp); +} + +static void +xfs_inobt_write_verify( + struct xfs_buf *bp) +{ + xfs_inobt_verify(bp); +} + +const struct xfs_buf_ops xfs_inobt_buf_ops =3D { + .verify_read =3D xfs_inobt_read_verify, + .verify_write =3D xfs_inobt_write_verify, +}; + #ifdef DEBUG STATIC int xfs_inobt_keys_inorder( @@ -266,7 +319,7 @@ static const struct xfs_btree_ops xfs_inobt_ops =3D { .init_rec_from_cur =3D xfs_inobt_init_rec_from_cur, .init_ptr_from_cur =3D xfs_inobt_init_ptr_from_cur, .key_diff =3D xfs_inobt_key_diff, - + .buf_ops =3D &xfs_inobt_buf_ops, #ifdef DEBUG .keys_inorder =3D xfs_inobt_keys_inorder, .recs_inorder =3D xfs_inobt_recs_inorder, diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c index e4474fd..2970f46 100644 --- a/libxfs/xfs_inode.c +++ b/libxfs/xfs_inode.c @@ -21,6 +21,12 @@ kmem_zone_t *xfs_ifork_zone; kmem_zone_t *xfs_inode_zone; =20 +/* + * Used in xfs_itruncate_extents(). This is the maximum number of extents + * freed from a file in a single transaction. + */ +#define XFS_ITRUNC_MAX_EXTENTS 2 + STATIC int xfs_iformat_local(xfs_inode_t *, xfs_dinode_t *, int, int); STATIC int xfs_iformat_extents(xfs_inode_t *, xfs_dinode_t *, int); STATIC int xfs_iformat_btree(xfs_inode_t *, xfs_dinode_t *, int); @@ -73,8 +79,8 @@ xfs_inobp_check( dip =3D (xfs_dinode_t *)xfs_buf_offset(bp, i * mp->m_sb.sb_inodesize); if (!dip->di_next_unlinked) { - xfs_fs_cmn_err(CE_ALERT, mp, - "Detected a bogus zero next_unlinked field in incore inode buffer 0x%p= =2E About to pop an ASSERT.", + xfs_alert(mp, + "Detected bogus zero next_unlinked field in incore inode buffer 0x%p.", bp); ASSERT(dip->di_next_unlinked); } @@ -82,176 +88,108 @@ xfs_inobp_check( } #endif =20 -/* - * Find the buffer associated with the given inode map - * We do basic validation checks on the buffer once it has been - * retrieved from disk. - */ -int -xfs_imap_to_bp( - xfs_mount_t *mp, - xfs_trans_t *tp, - struct xfs_imap *imap, - xfs_buf_t **bpp, - uint buf_flags, - uint iget_flags) +static void +xfs_inode_buf_verify( + struct xfs_buf *bp) { - int error; + struct xfs_mount *mp =3D bp->b_target->bt_mount; int i; int ni; - xfs_buf_t *bp; - - error =3D xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno, - (int)imap->im_len, buf_flags, &bp); - if (error) { - if (error !=3D EAGAIN) { - cmn_err(CE_WARN, - "xfs_imap_to_bp: xfs_trans_read_buf()returned " - "an error %d on %s. Returning error.", - error, mp->m_fsname); - } else { - ASSERT(buf_flags & XBF_TRYLOCK); - } - return error; - } =20 /* * Validate the magic number and version of every inode in the buffer - * (if DEBUG kernel) or the first inode in the buffer, otherwise. */ -#ifdef DEBUG - ni =3D BBTOB(imap->im_len) >> mp->m_sb.sb_inodelog; -#else /* usual case */ - ni =3D 1; -#endif - + ni =3D XFS_BB_TO_FSB(mp, bp->b_length) * mp->m_sb.sb_inopblock; for (i =3D 0; i < ni; i++) { int di_ok; xfs_dinode_t *dip; =20 - dip =3D (xfs_dinode_t *)xfs_buf_offset(bp, + dip =3D (struct xfs_dinode *)xfs_buf_offset(bp, (i << mp->m_sb.sb_inodelog)); - di_ok =3D be16_to_cpu(dip->di_magic) =3D=3D XFS_DINODE_MAGIC && + di_ok =3D dip->di_magic =3D=3D cpu_to_be16(XFS_DINODE_MAGIC) && XFS_DINODE_GOOD_VERSION(dip->di_version); if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, XFS_RANDOM_ITOBP_INOTOBP))) { - if (iget_flags & XFS_IGET_UNTRUSTED) { - xfs_trans_brelse(tp, bp); - return XFS_ERROR(EINVAL); - } - XFS_CORRUPTION_ERROR("xfs_imap_to_bp", - XFS_ERRLEVEL_HIGH, mp, dip); + xfs_buf_ioerror(bp, EFSCORRUPTED); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_HIGH, + mp, dip); #ifdef DEBUG - cmn_err(CE_PANIC, - "Device %s - bad inode magic/vsn " - "daddr %lld #%d (magic=3D%x)", - XFS_BUFTARG_NAME(mp->m_ddev_targp), - (unsigned long long)imap->im_blkno, i, + xfs_emerg(mp, + "bad inode magic/vsn daddr %lld #%d (magic=3D%x)", + (unsigned long long)bp->b_bn, i, be16_to_cpu(dip->di_magic)); + ASSERT(0); #endif - xfs_trans_brelse(tp, bp); - return XFS_ERROR(EFSCORRUPTED); } } - xfs_inobp_check(mp, bp); +} =20 - /* - * Mark the buffer as an inode buffer now that it looks good - */ - XFS_BUF_SET_VTYPE(bp, B_FS_INO); =20 - *bpp =3D bp; - return 0; +static void +xfs_inode_buf_read_verify( + struct xfs_buf *bp) +{ + xfs_inode_buf_verify(bp); } =20 -/* - * This routine is called to map an inode number within a file - * system to the buffer containing the on-disk version of the - * inode. It returns a pointer to the buffer containing the - * on-disk inode in the bpp parameter, and in the dip parameter - * it returns a pointer to the on-disk inode within that buffer. - * - * If a non-zero error is returned, then the contents of bpp and - * dipp are undefined. - * - * Use xfs_imap() to determine the size and location of the - * buffer to read from disk. - */ -int -xfs_inotobp( - xfs_mount_t *mp, - xfs_trans_t *tp, - xfs_ino_t ino, - xfs_dinode_t **dipp, - xfs_buf_t **bpp, - int *offset, - uint imap_flags) +static void +xfs_inode_buf_write_verify( + struct xfs_buf *bp) { - struct xfs_imap imap; - xfs_buf_t *bp; - int error; - - imap.im_blkno =3D 0; - error =3D xfs_imap(mp, tp, ino, &imap, imap_flags); - if (error) - return error; - - error =3D xfs_imap_to_bp(mp, tp, &imap, &bp, XBF_LOCK, imap_flags); - if (error) - return error; - - *dipp =3D (xfs_dinode_t *)xfs_buf_offset(bp, imap.im_boffset); - *bpp =3D bp; - *offset =3D imap.im_boffset; - return 0; + xfs_inode_buf_verify(bp); } =20 +const struct xfs_buf_ops xfs_inode_buf_ops =3D { + .verify_read =3D xfs_inode_buf_read_verify, + .verify_write =3D xfs_inode_buf_write_verify, +}; + =20 /* - * This routine is called to map an inode to the buffer containing - * the on-disk version of the inode. It returns a pointer to the - * buffer containing the on-disk inode in the bpp parameter, and in - * the dip parameter it returns a pointer to the on-disk inode within - * that buffer. + * This routine is called to map an inode to the buffer containing the on-= disk + * version of the inode. It returns a pointer to the buffer containing the + * on-disk inode in the bpp parameter, and in the dipp parameter it return= s a + * pointer to the on-disk inode within that buffer. * - * If a non-zero error is returned, then the contents of bpp and - * dipp are undefined. - * - * The inode is expected to already been mapped to its buffer and read - * in once, thus we can use the mapping information stored in the inode - * rather than calling xfs_imap(). This allows us to avoid the overhead - * of looking at the inode btree for small block file systems - * (see xfs_imap()). + * If a non-zero error is returned, then the contents of bpp and dipp are + * undefined. */ int -xfs_itobp( - xfs_mount_t *mp, - xfs_trans_t *tp, - xfs_inode_t *ip, - xfs_dinode_t **dipp, - xfs_buf_t **bpp, - uint buf_flags) +xfs_imap_to_bp( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_imap *imap, + struct xfs_dinode **dipp, + struct xfs_buf **bpp, + uint buf_flags, + uint iget_flags) { - xfs_buf_t *bp; - int error; + struct xfs_buf *bp; + int error; =20 - ASSERT(ip->i_imap.im_blkno !=3D 0); + buf_flags |=3D XBF_UNMAPPED; + error =3D xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno, + (int)imap->im_len, buf_flags, &bp, + &xfs_inode_buf_ops); + if (error) { + if (error =3D=3D EAGAIN) { + ASSERT(buf_flags & XBF_TRYLOCK); + return error; + } =20 - error =3D xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp, buf_flags, 0); - if (error) - return error; + if (error =3D=3D EFSCORRUPTED && + (iget_flags & XFS_IGET_UNTRUSTED)) + return XFS_ERROR(EINVAL); =20 - if (!bp) { - ASSERT(buf_flags & XBF_TRYLOCK); - ASSERT(tp =3D=3D NULL); - *bpp =3D NULL; - return EAGAIN; + xfs_warn(mp, "%s: xfs_trans_read_buf() returned error %d.", + __func__, error); + return error; } =20 - *dipp =3D (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); *bpp =3D bp; + *dipp =3D (struct xfs_dinode *)xfs_buf_offset(bp, imap->im_boffset); return 0; } =20 @@ -264,23 +202,20 @@ xfs_itobp( * brought in-core. The rest will be in-lined in if_extents when it * is first referenced (see xfs_iread_extents()). */ -int +STATIC int xfs_iformat( xfs_inode_t *ip, xfs_dinode_t *dip) { xfs_attr_shortform_t *atp; int size; - int error; + int error =3D 0; xfs_fsize_t di_size; - ip->i_df.if_ext_max =3D - XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); - error =3D 0; =20 if (unlikely(be32_to_cpu(dip->di_nextents) + be16_to_cpu(dip->di_anextents) > be64_to_cpu(dip->di_nblocks))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + xfs_warn(ip->i_mount, "corrupt dinode %Lu, extent total =3D %d, nblocks =3D %Lu.", (unsigned long long)ip->i_ino, (int)(be32_to_cpu(dip->di_nextents) + @@ -293,8 +228,7 @@ xfs_iformat( } =20 if (unlikely(dip->di_forkoff > ip->i_mount->m_sb.sb_inodesize)) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt dinode %Lu, forkoff =3D 0x%x.", + xfs_warn(ip->i_mount, "corrupt dinode %Lu, forkoff =3D 0x%x.", (unsigned long long)ip->i_ino, dip->di_forkoff); XFS_CORRUPTION_ERROR("xfs_iformat(2)", XFS_ERRLEVEL_LOW, @@ -304,7 +238,7 @@ xfs_iformat( =20 if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) && !ip->i_mount->m_rtdev)) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + xfs_warn(ip->i_mount, "corrupt dinode %Lu, has realtime flag set.", ip->i_ino); XFS_CORRUPTION_ERROR("xfs_iformat(realtime)", @@ -323,7 +257,6 @@ xfs_iformat( return XFS_ERROR(EFSCORRUPTED); } ip->i_d.di_size =3D 0; - ip->i_size =3D 0; ip->i_df.if_u2.if_rdev =3D xfs_dinode_get_rdev(dip); break; =20 @@ -335,10 +268,9 @@ xfs_iformat( /* * no local regular files yet */ - if (unlikely((be16_to_cpu(dip->di_mode) & S_IFMT) =3D=3D S_IFREG)) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu " - "(local format for regular file).", + if (unlikely(S_ISREG(be16_to_cpu(dip->di_mode)))) { + xfs_warn(ip->i_mount, + "corrupt inode %Lu (local format for regular file).", (unsigned long long) ip->i_ino); XFS_CORRUPTION_ERROR("xfs_iformat(4)", XFS_ERRLEVEL_LOW, @@ -348,9 +280,8 @@ xfs_iformat( =20 di_size =3D be64_to_cpu(dip->di_size); if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu " - "(bad size %Ld for local inode).", + xfs_warn(ip->i_mount, + "corrupt inode %Lu (bad size %Ld for local inode).", (unsigned long long) ip->i_ino, (long long) di_size); XFS_CORRUPTION_ERROR("xfs_iformat(5)", @@ -384,19 +315,18 @@ xfs_iformat( } if (!XFS_DFORK_Q(dip)) return 0; + ASSERT(ip->i_afp =3D=3D NULL); ip->i_afp =3D kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP | KM_NOFS); - ip->i_afp->if_ext_max =3D - XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); + switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: atp =3D (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip); size =3D be16_to_cpu(atp->hdr.totsize); =20 if (unlikely(size < sizeof(struct xfs_attr_sf_hdr))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu " - "(bad attr fork size %Ld).", + xfs_warn(ip->i_mount, + "corrupt inode %Lu (bad attr fork size %Ld).", (unsigned long long) ip->i_ino, (long long) size); XFS_CORRUPTION_ERROR("xfs_iformat(8)", @@ -451,9 +381,8 @@ xfs_iformat_local( * kmem_alloc() or memcpy() below. */ if (unlikely(size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu " - "(bad size %d for local fork, size =3D %d).", + xfs_warn(ip->i_mount, + "corrupt inode %Lu (bad size %d for local fork, size =3D %d).", (unsigned long long) ip->i_ino, size, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork)); XFS_CORRUPTION_ERROR("xfs_iformat_local", XFS_ERRLEVEL_LOW, @@ -510,8 +439,7 @@ xfs_iformat_extents( * kmem_alloc() or memcpy() below. */ if (unlikely(size < 0 || size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfor= k))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu ((a)extents =3D %d).", + xfs_warn(ip->i_mount, "corrupt inode %Lu ((a)extents =3D %d).", (unsigned long long) ip->i_ino, nex); XFS_CORRUPTION_ERROR("xfs_iformat_extents(1)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); @@ -582,15 +510,15 @@ xfs_iformat_btree( * or the number of extents is greater than the number of * blocks. */ - if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <=3D ifp->if_ext_max - || XFS_BMDR_SPACE_CALC(nrecs) > - XFS_DFORK_SIZE(dip, ip->i_mount, whichfork) - || XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu (btree).", + if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <=3D + XFS_IFORK_MAXEXT(ip, whichfork) || + XFS_BMDR_SPACE_CALC(nrecs) > + XFS_DFORK_SIZE(dip, ip->i_mount, whichfork) || + XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) { + xfs_warn(ip->i_mount, "corrupt inode %Lu (btree).", (unsigned long long) ip->i_ino); - XFS_ERROR_REPORT("xfs_iformat_btree", XFS_ERRLEVEL_LOW, - ip->i_mount); + XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW, + ip->i_mount, dip); return XFS_ERROR(EFSCORRUPTED); } =20 @@ -683,6 +611,124 @@ xfs_dinode_to_disk( } =20 /* + * Read the disk inode attributes into the in-core inode structure. + */ +int +xfs_iread( + xfs_mount_t *mp, + xfs_trans_t *tp, + xfs_inode_t *ip, + uint iget_flags) +{ + xfs_buf_t *bp; + xfs_dinode_t *dip; + int error; + + /* + * Fill in the location information in the in-core inode. + */ + error =3D xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags); + if (error) + return error; + + /* + * Get pointers to the on-disk inode and the buffer containing it. + */ + error =3D xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &bp, 0, iget_flags); + if (error) + return error; + + /* + * If we got something that isn't an inode it means someone + * (nfs or dmi) has a stale handle. + */ + if (dip->di_magic !=3D cpu_to_be16(XFS_DINODE_MAGIC)) { +#ifdef DEBUG + xfs_alert(mp, + "%s: dip->di_magic (0x%x) !=3D XFS_DINODE_MAGIC (0x%x)", + __func__, be16_to_cpu(dip->di_magic), XFS_DINODE_MAGIC); +#endif /* DEBUG */ + error =3D XFS_ERROR(EINVAL); + goto out_brelse; + } + + /* + * If the on-disk inode is already linked to a directory + * entry, copy all of the inode into the in-core inode. + * xfs_iformat() handles copying in the inode format + * specific information. + * Otherwise, just get the truly permanent information. + */ + if (dip->di_mode) { + xfs_dinode_from_disk(&ip->i_d, dip); + error =3D xfs_iformat(ip, dip); + if (error) { +#ifdef DEBUG + xfs_alert(mp, "%s: xfs_iformat() returned error %d", + __func__, error); +#endif /* DEBUG */ + goto out_brelse; + } + } else { + ip->i_d.di_magic =3D be16_to_cpu(dip->di_magic); + ip->i_d.di_version =3D dip->di_version; + ip->i_d.di_gen =3D be32_to_cpu(dip->di_gen); + ip->i_d.di_flushiter =3D be16_to_cpu(dip->di_flushiter); + /* + * Make sure to pull in the mode here as well in + * case the inode is released without being used. + * This ensures that xfs_inactive() will see that + * the inode is already free and not try to mess + * with the uninitialized part of it. + */ + ip->i_d.di_mode =3D 0; + } + + /* + * The inode format changed when we moved the link count and + * made it 32 bits long. If this is an old format inode, + * convert it in memory to look like a new one. If it gets + * flushed to disk we will convert back before flushing or + * logging it. We zero out the new projid field and the old link + * count field. We'll handle clearing the pad field (the remains + * of the old uuid field) when we actually convert the inode to + * the new format. We don't change the version number so that we + * can distinguish this from a real new format inode. + */ + if (ip->i_d.di_version =3D=3D 1) { + ip->i_d.di_nlink =3D ip->i_d.di_onlink; + ip->i_d.di_onlink =3D 0; + xfs_set_projid(&ip->i_d, 0); + } + + ip->i_delayed_blks =3D 0; + + /* + * Mark the buffer containing the inode as something to keep + * around for a while. This helps to keep recently accessed + * meta-data in-core longer. + */ + xfs_buf_set_ref(bp, XFS_INO_REF); + + /* + * Use xfs_trans_brelse() to release the buffer containing the + * on-disk inode, because it was acquired with xfs_trans_read_buf() + * in xfs_imap_to_bp() above. If tp is NULL, this is just a normal + * brelse(). If we're within a transaction, then xfs_trans_brelse() + * will only release the buffer if it is not dirty within the + * transaction. It will be OK to release the buffer in this case, + * because inodes on disk are never destroyed and we will be + * locking the new in-core inode before putting it in the hash + * table where other processes can find it. Thus we don't have + * to worry about the inode being changed just because we released + * the buffer. + */ + out_brelse: + xfs_trans_brelse(tp, bp); + return error; +} + +/* * Read in extents from a btree-format inode. * Allocate and fill in if_extents. Real work is done in xfs_bmap.c. */ @@ -707,7 +753,6 @@ xfs_iread_extents( /* * We know that the size is valid (it's checked in iformat_btree) */ - ifp->if_lastex =3D NULLEXTNUM; ifp->if_bytes =3D ifp->if_real_bytes =3D 0; ifp->if_flags |=3D XFS_IFEXTENTS; xfs_iext_add(ifp, 0, nextents); @@ -1067,9 +1112,6 @@ xfs_iflush_fork( char *cp; xfs_ifork_t *ifp; xfs_mount_t *mp; -#ifdef XFS_TRANS_DEBUG - int first; -#endif static const short brootflag[2] =3D { XFS_ILOG_DBROOT, XFS_ILOG_ABROOT }; static const short dataflag[2] =3D @@ -1092,7 +1134,7 @@ xfs_iflush_fork( mp =3D ip->i_mount; switch (XFS_IFORK_FORMAT(ip, whichfork)) { case XFS_DINODE_FMT_LOCAL: - if ((iip->ili_format.ilf_fields & dataflag[whichfork]) && + if ((iip->ili_fields & dataflag[whichfork]) && (ifp->if_bytes > 0)) { ASSERT(ifp->if_u1.if_data !=3D NULL); ASSERT(ifp->if_bytes <=3D XFS_IFORK_SIZE(ip, whichfork)); @@ -1102,13 +1144,10 @@ xfs_iflush_fork( =20 case XFS_DINODE_FMT_EXTENTS: ASSERT((ifp->if_flags & XFS_IFEXTENTS) || - !(iip->ili_format.ilf_fields & extflag[whichfork])); - ASSERT((xfs_iext_get_ext(ifp, 0) !=3D NULL) || - (ifp->if_bytes =3D=3D 0)); - ASSERT((xfs_iext_get_ext(ifp, 0) =3D=3D NULL) || - (ifp->if_bytes > 0)); - if ((iip->ili_format.ilf_fields & extflag[whichfork]) && + !(iip->ili_fields & extflag[whichfork])); + if ((iip->ili_fields & extflag[whichfork]) && (ifp->if_bytes > 0)) { + ASSERT(xfs_iext_get_ext(ifp, 0)); ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) > 0); (void)xfs_iextents_copy(ip, (xfs_bmbt_rec_t *)cp, whichfork); @@ -1116,7 +1155,7 @@ xfs_iflush_fork( break; =20 case XFS_DINODE_FMT_BTREE: - if ((iip->ili_format.ilf_fields & brootflag[whichfork]) && + if ((iip->ili_fields & brootflag[whichfork]) && (ifp->if_broot_bytes > 0)) { ASSERT(ifp->if_broot !=3D NULL); ASSERT(ifp->if_broot_bytes <=3D @@ -1129,14 +1168,14 @@ xfs_iflush_fork( break; =20 case XFS_DINODE_FMT_DEV: - if (iip->ili_format.ilf_fields & XFS_ILOG_DEV) { + if (iip->ili_fields & XFS_ILOG_DEV) { ASSERT(whichfork =3D=3D XFS_DATA_FORK); xfs_dinode_put_rdev(dip, ip->i_df.if_u2.if_rdev); } break; =20 case XFS_DINODE_FMT_UUID: - if (iip->ili_format.ilf_fields & XFS_ILOG_UUID) { + if (iip->ili_fields & XFS_ILOG_UUID) { ASSERT(whichfork =3D=3D XFS_DATA_FORK); memcpy(XFS_DFORK_DPTR(dip), &ip->i_df.if_u2.if_uuid, @@ -1159,6 +1198,8 @@ xfs_iext_get_ext( xfs_extnum_t idx) /* index of target extent */ { ASSERT(idx >=3D 0); + ASSERT(idx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t)); + if ((ifp->if_flags & XFS_IFEXTIREC) && (idx =3D=3D 0)) { return ifp->if_u1.if_ext_irec->er_extbuf; } else if (ifp->if_flags & XFS_IFEXTIREC) { @@ -1238,7 +1279,6 @@ xfs_iext_add( } ifp->if_u1.if_extents =3D ifp->if_u2.if_inline_ext; ifp->if_real_bytes =3D 0; - ifp->if_lastex =3D nextents + ext_diff; } /* * Otherwise use a linear (direct) extent list. @@ -1933,8 +1973,10 @@ xfs_iext_idx_to_irec( xfs_extnum_t page_idx =3D *idxp; /* extent index in target list */ =20 ASSERT(ifp->if_flags & XFS_IFEXTIREC); - ASSERT(page_idx >=3D 0 && page_idx <=3D - ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); + ASSERT(page_idx >=3D 0); + ASSERT(page_idx <=3D ifp->if_bytes / sizeof(xfs_bmbt_rec_t)); + ASSERT(page_idx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t) || realloc); + nlists =3D ifp->if_real_bytes / XFS_IEXT_BUFSZ; erp_idx =3D 0; low =3D 0; diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index 32d2255..a9155b3 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -90,8 +90,8 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) ASSERT(atomic_read(&pag->pag_ref) >=3D 0); ref =3D atomic_inc_return(&pag->pag_ref); } - trace_xfs_perag_get(mp, agno, ref, _RET_IP_); rcu_read_unlock(); + trace_xfs_perag_get(mp, agno, ref, _RET_IP_); return pag; } =20 @@ -105,6 +105,114 @@ xfs_perag_put(struct xfs_perag *pag) trace_xfs_perag_put(pag->pag_mount, pag->pag_agno, ref, _RET_IP_); } =20 +/* + * Check the validity of the SB found. + */ +STATIC int +xfs_mount_validate_sb( + xfs_mount_t *mp, + xfs_sb_t *sbp, + bool check_inprogress) +{ + + /* + * If the log device and data device have the + * same device number, the log is internal. + * Consequently, the sb_logstart should be non-zero. If + * we have a zero sb_logstart in this case, we may be trying to mount + * a volume filesystem in a non-volume manner. + */ + if (sbp->sb_magicnum !=3D XFS_SB_MAGIC) { + xfs_warn(mp, "bad magic number"); + return XFS_ERROR(EWRONGFS); + } + + if (!xfs_sb_good_version(sbp)) { + xfs_warn(mp, "bad version"); + return XFS_ERROR(EWRONGFS); + } + + if (unlikely( + sbp->sb_logstart =3D=3D 0 && mp->m_logdev =3D=3D mp->m_dev)) { + xfs_warn(mp, + "filesystem is marked as having an external log; " + "specify logdev on the mount command line."); + return XFS_ERROR(EINVAL); + } + + if (unlikely( + sbp->sb_logstart !=3D 0 && mp->m_logdev !=3D mp->m_dev)) { + xfs_warn(mp, + "filesystem is marked as having an internal log; " + "do not specify logdev on the mount command line."); + return XFS_ERROR(EINVAL); + } + + /* + * More sanity checking. Most of these were stolen directly from + * xfs_repair. + */ + if (unlikely( + sbp->sb_agcount <=3D 0 || + sbp->sb_sectsize < XFS_MIN_SECTORSIZE || + sbp->sb_sectsize > XFS_MAX_SECTORSIZE || + sbp->sb_sectlog < XFS_MIN_SECTORSIZE_LOG || + sbp->sb_sectlog > XFS_MAX_SECTORSIZE_LOG || + sbp->sb_sectsize !=3D (1 << sbp->sb_sectlog) || + sbp->sb_blocksize < XFS_MIN_BLOCKSIZE || + sbp->sb_blocksize > XFS_MAX_BLOCKSIZE || + sbp->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG || + sbp->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG || + sbp->sb_blocksize !=3D (1 << sbp->sb_blocklog) || + sbp->sb_inodesize < XFS_DINODE_MIN_SIZE || + sbp->sb_inodesize > XFS_DINODE_MAX_SIZE || + sbp->sb_inodelog < XFS_DINODE_MIN_LOG || + sbp->sb_inodelog > XFS_DINODE_MAX_LOG || + sbp->sb_inodesize !=3D (1 << sbp->sb_inodelog) || + (sbp->sb_blocklog - sbp->sb_inodelog !=3D sbp->sb_inopblog) || + (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) || + (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) || + (sbp->sb_imax_pct > 100 /* zero sb_imax_pct is valid */) || + sbp->sb_dblocks =3D=3D 0 || + sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) || + sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))) { + XFS_CORRUPTION_ERROR("SB sanity check failed", + XFS_ERRLEVEL_LOW, mp, sbp); + return XFS_ERROR(EFSCORRUPTED); + } + + /* + * Currently only very few inode sizes are supported. + */ + switch (sbp->sb_inodesize) { + case 256: + case 512: + case 1024: + case 2048: + break; + default: + xfs_warn(mp, "inode size of %d bytes not supported", + sbp->sb_inodesize); + return XFS_ERROR(ENOSYS); + } + + + if (check_inprogress && sbp->sb_inprogress) { + xfs_warn(mp, "Offline file system operation in progress!"); + return XFS_ERROR(EFSCORRUPTED); + } + + /* + * Version 1 directory format has never worked on Linux. + */ + if (unlikely(!xfs_sb_version_hasdirv2(sbp))) { + xfs_warn(mp, "file system using version 1 directory format"); + return XFS_ERROR(ENOSYS); + } + + return 0; +} + void xfs_sb_from_disk( xfs_sb_t *to, @@ -211,6 +319,72 @@ xfs_sb_to_disk( } } =20 +static void +xfs_sb_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_sb sb; + int error; + + xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); + + /* + * Only check the in progress field for the primary superblock as + * mkfs.xfs doesn't clear it from secondary superblocks. + */ + error =3D xfs_mount_validate_sb(mp, &sb, bp->b_blkno =3D=3D XFS_SB_DADDR); + if (error) + xfs_buf_ioerror(bp, error); +} + +static void +xfs_sb_read_verify( + struct xfs_buf *bp) +{ + xfs_sb_verify(bp); +} + +/* + * We may be probed for a filesystem match, so we may not want to emit + * messages when the superblock buffer is not actually an XFS superblock. + * If we find an XFS superblock, the run a normal, noisy mount because we = are + * really going to mount it and want to know about errors. + */ +static void +xfs_sb_quiet_read_verify( + struct xfs_buf *bp) +{ + struct xfs_sb sb; + + xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); + + if (sb.sb_magicnum =3D=3D XFS_SB_MAGIC) { + /* XFS filesystem, verify noisily! */ + xfs_sb_read_verify(bp); + return; + } + /* quietly fail */ + xfs_buf_ioerror(bp, EFSCORRUPTED); +} + +static void +xfs_sb_write_verify( + struct xfs_buf *bp) +{ + xfs_sb_verify(bp); +} + +const struct xfs_buf_ops xfs_sb_buf_ops =3D { + .verify_read =3D xfs_sb_read_verify, + .verify_write =3D xfs_sb_write_verify, +}; + +static const struct xfs_buf_ops xfs_sb_quiet_buf_ops =3D { + .verify_read =3D xfs_sb_quiet_read_verify, + .verify_write =3D xfs_sb_write_verify, +}; + /* * xfs_mount_common * diff --git a/libxfs/xfs_rtalloc.c b/libxfs/xfs_rtalloc.c index 4fbdaa9..1de85fd 100644 --- a/libxfs/xfs_rtalloc.c +++ b/libxfs/xfs_rtalloc.c @@ -49,34 +49,24 @@ xfs_rtbuf_get( xfs_buf_t **bpp) /* output: buffer for the block */ { xfs_buf_t *bp; /* block buffer, result */ - xfs_daddr_t d; /* disk addr of block */ - int error; /* error value */ - xfs_fsblock_t fsb; /* fs block number for block */ xfs_inode_t *ip; /* bitmap or summary inode */ + xfs_bmbt_irec_t map; + int nmap =3D 1; + int error; /* error value */ =20 ip =3D issum ? mp->m_rsumip : mp->m_rbmip; - /* - * Map from the file offset (block) and inode number to the - * file system block. - */ - error =3D xfs_bmapi_single(tp, ip, XFS_DATA_FORK, &fsb, block); - if (error) { + + error =3D xfs_bmapi_read(ip, block, 1, &map, &nmap, XFS_DATA_FORK); + if (error) return error; - } - ASSERT(fsb !=3D NULLFSBLOCK); - /* - * Convert to disk address for buffer cache. - */ - d =3D XFS_FSB_TO_DADDR(mp, fsb); - /* - * Read the buffer. - */ - error =3D xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, d, - mp->m_bsize, 0, &bp); - if (error) { + + ASSERT(map.br_startblock !=3D NULLFSBLOCK); + error =3D xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, + XFS_FSB_TO_DADDR(mp, map.br_startblock), + mp->m_bsize, 0, &bp, NULL); + if (error) return error; - } - ASSERT(bp && !XFS_BUF_GETERROR(bp)); + ASSERT(!xfs_buf_geterror(bp)); *bpp =3D bp; return 0; } @@ -115,7 +105,7 @@ xfs_rtfind_back( if (error) { return error; } - bufp =3D (xfs_rtword_t *)XFS_BUF_PTR(bp); + bufp =3D bp->b_addr; /* * Get the first word's index & point to it. */ @@ -167,7 +157,7 @@ xfs_rtfind_back( if (error) { return error; } - bufp =3D (xfs_rtword_t *)XFS_BUF_PTR(bp); + bufp =3D bp->b_addr; word =3D XFS_BLOCKWMASK(mp); b =3D &bufp[word]; } else { @@ -213,7 +203,7 @@ xfs_rtfind_back( if (error) { return error; } - bufp =3D (xfs_rtword_t *)XFS_BUF_PTR(bp); + bufp =3D bp->b_addr; word =3D XFS_BLOCKWMASK(mp); b =3D &bufp[word]; } else { @@ -290,7 +280,7 @@ xfs_rtfind_forw( if (error) { return error; } - bufp =3D (xfs_rtword_t *)XFS_BUF_PTR(bp); + bufp =3D bp->b_addr; /* * Get the first word's index & point to it. */ @@ -341,7 +331,7 @@ xfs_rtfind_forw( if (error) { return error; } - b =3D bufp =3D (xfs_rtword_t *)XFS_BUF_PTR(bp); + b =3D bufp =3D bp->b_addr; word =3D 0; } else { /* @@ -386,7 +376,7 @@ xfs_rtfind_forw( if (error) { return error; } - b =3D bufp =3D (xfs_rtword_t *)XFS_BUF_PTR(bp); + b =3D bufp =3D bp->b_addr; word =3D 0; } else { /* @@ -537,7 +527,7 @@ xfs_rtmodify_range( if (error) { return error; } - bufp =3D (xfs_rtword_t *)XFS_BUF_PTR(bp); + bufp =3D bp->b_addr; /* * Compute the starting word's address, and starting bit. */ @@ -582,7 +572,7 @@ xfs_rtmodify_range( if (error) { return error; } - first =3D b =3D bufp =3D (xfs_rtword_t *)XFS_BUF_PTR(bp); + first =3D b =3D bufp =3D bp->b_addr; word =3D 0; } else { /* @@ -622,7 +612,7 @@ xfs_rtmodify_range( if (error) { return error; } - first =3D b =3D bufp =3D (xfs_rtword_t *)XFS_BUF_PTR(bp); + first =3D b =3D bufp =3D bp->b_addr; word =3D 0; } else { /* @@ -720,8 +710,8 @@ xfs_rtmodify_summary( */ sp =3D XFS_SUMPTR(mp, bp, so); *sp +=3D delta; - xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)XFS_BUF_PTR(bp)), - (uint)((char *)sp - (char *)XFS_BUF_PTR(bp) + sizeof(*sp) - 1)); + xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr), + (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1)); return 0; } =20 @@ -736,18 +726,15 @@ xfs_rtfree_extent( xfs_extlen_t len) /* length of extent freed */ { int error; /* error value */ - xfs_inode_t *ip; /* bitmap file inode */ xfs_mount_t *mp; /* file system mount structure */ xfs_fsblock_t sb; /* summary file block number */ xfs_buf_t *sumbp; /* summary file block buffer */ =20 mp =3D tp->t_mountp; - /* - * Synchronize by locking the bitmap inode. - */ - if ((error =3D xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, - XFS_ILOCK_EXCL, &ip))) - return error; + + ASSERT(mp->m_rbmip->i_itemp !=3D NULL); + ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); + #if defined(__KERNEL__) && defined(DEBUG) /* * Check to see that this whole range is currently allocated. @@ -780,10 +767,10 @@ xfs_rtfree_extent( */ if (tp->t_frextents_delta + mp->m_sb.sb_frextents =3D=3D mp->m_sb.sb_rextents) { - if (!(ip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) - ip->i_d.di_flags |=3D XFS_DIFLAG_NEWRTBM; - *(__uint64_t *)&ip->i_d.di_atime =3D 0; - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) + mp->m_rbmip->i_d.di_flags |=3D XFS_DIFLAG_NEWRTBM; + *(__uint64_t *)&mp->m_rbmip->i_d.di_atime =3D 0; + xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); } return 0; } diff --git a/libxfs/xfs_trans.c b/libxfs/xfs_trans.c index 7249196..bdd0ebc 100644 --- a/libxfs/xfs_trans.c +++ b/libxfs/xfs_trans.c @@ -583,14 +583,13 @@ xfs_trans_add_item( { struct xfs_log_item_desc *lidp; =20 - ASSERT(lip->li_mountp =3D tp->t_mountp); - ASSERT(lip->li_ailp =3D tp->t_mountp->m_ail); + ASSERT(lip->li_mountp =3D=3D tp->t_mountp); + ASSERT(lip->li_ailp =3D=3D tp->t_mountp->m_ail); =20 lidp =3D kmem_zone_zalloc(xfs_log_item_desc_zone, KM_SLEEP | KM_NOFS); =20 lidp->lid_item =3D lip; lidp->lid_flags =3D 0; - lidp->lid_size =3D 0; list_add_tail(&lidp->lid_trans, &tp->t_items); =20 lip->li_desc =3D lidp; @@ -673,8 +672,6 @@ xfs_trans_roll( if (error) return error; =20 - xfs_trans_ijoin(trans, dp, XFS_ILOCK_EXCL); - xfs_trans_ihold(trans, dp); + xfs_trans_ijoin(trans, dp, 0); return 0; } - diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 2e3dbdf..8e72788 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -17,6 +17,7 @@ */ =20 #include "logprint.h" +#include =20 #define CLEARED_BLKS (-5) #define ZEROED_LOG (-4) @@ -1039,7 +1040,7 @@ xlog_print_rec_head(xlog_rec_header_t *head, int *len) } =20 /* check for cleared blocks written by xlog_clear_stale_blocks() */ - if (!head->h_len && !head->h_chksum && !head->h_prev_block && + if (!head->h_len && !head->h_crc && !head->h_prev_block && !head->h_num_logops && !head->h_size) return CLEARED_BLKS; =20 diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index 69d6e71..cbc51d9 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -243,7 +243,7 @@ xlog_recover_print_inode_core( (di->di_magic>>8) & 0xff, di->di_magic & 0xff, di->di_mode, di->di_version, di->di_format, di->di_onlink); printf(_(" uid:%d gid:%d nlink:%d projid:%u\n"), - di->di_uid, di->di_gid, di->di_nlink, xfs_get_projid(*di)); + di->di_uid, di->di_gid, di->di_nlink, xfs_get_projid(di)); printf(_(" atime:%d mtime:%d ctime:%d\n"), di->di_atime.t_sec, di->di_mtime.t_sec, di->di_ctime.t_sec); printf(_(" flushiter:%d\n"), di->di_flushiter); diff --git a/mkfs/proto.c b/mkfs/proto.c index 3021028..56eed31 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -243,7 +243,7 @@ newfile( } else if (len > 0) { nb =3D XFS_B_TO_FSB(mp, len); nmap =3D 1; - error =3D libxfs_bmapi(tp, ip, 0, nb, XFS_BMAPI_WRITE, first, nb, + error =3D libxfs_bmapi_write(tp, ip, 0, nb, 0, first, nb, &map, &nmap, flist); if (error) { fail(_("error allocating space for a file"), error); @@ -667,9 +667,9 @@ rtinit( xfs_bmap_init(&flist, &first); while (bno < mp->m_sb.sb_rbmblocks) { nmap =3D XFS_BMAP_MAX_NMAP; - error =3D libxfs_bmapi(tp, rbmip, bno, + error =3D libxfs_bmapi_write(tp, rbmip, bno, (xfs_extlen_t)(mp->m_sb.sb_rbmblocks - bno), - XFS_BMAPI_WRITE, &first, mp->m_sb.sb_rbmblocks, + 0, &first, mp->m_sb.sb_rbmblocks, map, &nmap, &flist); if (error) { fail(_("Allocation of the realtime bitmap failed"), @@ -704,9 +704,9 @@ rtinit( xfs_bmap_init(&flist, &first); while (bno < nsumblocks) { nmap =3D XFS_BMAP_MAX_NMAP; - error =3D libxfs_bmapi(tp, rsumip, bno, + error =3D libxfs_bmapi_write(tp, rsumip, bno, (xfs_extlen_t)(nsumblocks - bno), - XFS_BMAPI_WRITE, &first, nsumblocks, + 0, &first, nsumblocks, map, &nmap, &flist); if (error) { fail(_("Allocation of the realtime summary failed"), diff --git a/repair/dir.c b/repair/dir.c index 01c8f10..daca17d 100644 --- a/repair/dir.c +++ b/repair/dir.c @@ -17,6 +17,7 @@ */ =20 #include +#include #include "avl.h" #include "globals.h" #include "agheader.h" diff --git a/repair/dir2.c b/repair/dir2.c index 7a614a8..c455c83 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -79,182 +79,36 @@ dir2_is_badino( * Multibuffer handling. * V2 directory blocks can be noncontiguous, needing multiple buffers. */ -static xfs_dabuf_t * +static struct xfs_buf * da_read_buf( xfs_mount_t *mp, int nex, bmap_ext_t *bmp) { - xfs_buf_t *bp; - xfs_buf_t *bparray[4]; - xfs_buf_t **bplist; - xfs_dabuf_t *dabuf; +#define MAP_ARRAY_SZ 4 + struct xfs_buf_map map_array[MAP_ARRAY_SZ]; + struct xfs_buf_map *map; + struct xfs_buf *bp; int i; - int off; =20 - if (nex > (sizeof(bparray)/sizeof(xfs_buf_t *))) { - bplist =3D calloc(nex, sizeof(*bplist)); - if (bplist =3D=3D NULL) { + if (nex > MAP_ARRAY_SZ) { + map =3D calloc(nex, sizeof(*map)); + if (map =3D=3D NULL) { do_error(_("couldn't malloc dir2 buffer list\n")); exit(1); } - } - else { + } else { /* common case avoids calloc/free */ - bplist =3D bparray; + map =3D map_array; } for (i =3D 0; i < nex; i++) { - pftrace("about to read off %llu (len =3D %d)", - (long long)XFS_FSB_TO_DADDR(mp, bmp[i].startblock), - XFS_FSB_TO_BB(mp, bmp[i].blockcount)); - - bplist[i] =3D libxfs_readbuf(mp->m_dev, - XFS_FSB_TO_DADDR(mp, bmp[i].startblock), - XFS_FSB_TO_BB(mp, bmp[i].blockcount), 0); - if (!bplist[i]) { - nex =3D i; - goto failed; - } - - pftrace("readbuf %p (%llu, %d)", bplist[i], - (long long)XFS_BUF_ADDR(bplist[i]), - XFS_BUF_COUNT(bplist[i])); - } - dabuf =3D malloc(XFS_DA_BUF_SIZE(nex)); - if (dabuf =3D=3D NULL) { - do_error(_("couldn't malloc dir2 buffer header\n")); - exit(1); - } - dabuf->dirty =3D 0; - dabuf->nbuf =3D nex; - if (nex =3D=3D 1) { - bp =3D bplist[0]; - dabuf->bbcount =3D (short)BTOBB(XFS_BUF_COUNT(bp)); - dabuf->data =3D XFS_BUF_PTR(bp); - dabuf->bps[0] =3D bp; - } else { - for (i =3D 0, dabuf->bbcount =3D 0; i < nex; i++) { - dabuf->bps[i] =3D bp =3D bplist[i]; - dabuf->bbcount +=3D BTOBB(XFS_BUF_COUNT(bp)); - } - dabuf->data =3D malloc(BBTOB(dabuf->bbcount)); - if (dabuf->data =3D=3D NULL) { - do_error(_("couldn't malloc dir2 buffer data\n")); - exit(1); - } - for (i =3D off =3D 0; i < nex; i++, off +=3D XFS_BUF_COUNT(bp)) { - bp =3D bplist[i]; - memmove((char *)dabuf->data + off, XFS_BUF_PTR(bp), - XFS_BUF_COUNT(bp)); - } - } - if (bplist !=3D bparray) - free(bplist); - return dabuf; -failed: - for (i =3D 0; i < nex; i++) - libxfs_putbuf(bplist[i]); - if (bplist !=3D bparray) - free(bplist); - return NULL; -} - -static void -da_buf_clean( - xfs_dabuf_t *dabuf) -{ - xfs_buf_t *bp; - int i; - int off; - - if (dabuf->dirty) { - dabuf->dirty =3D 0; - for (i=3Doff=3D0; i < dabuf->nbuf; i++, off +=3D XFS_BUF_COUNT(bp)) { - bp =3D dabuf->bps[i]; - memmove(XFS_BUF_PTR(bp), (char *)dabuf->data + off, - XFS_BUF_COUNT(bp)); - } - } -} - -static void -da_buf_done( - xfs_dabuf_t *dabuf) -{ - da_buf_clean(dabuf); - if (dabuf->nbuf > 1) - free(dabuf->data); - free(dabuf); -} - -static int -da_bwrite( - xfs_mount_t *mp, - xfs_dabuf_t *dabuf) -{ - xfs_buf_t *bp; - xfs_buf_t **bplist; - int e; - int error; - int i; - int nbuf; - int off; - - if ((nbuf =3D dabuf->nbuf) =3D=3D 1) { - bplist =3D &bp; - bp =3D dabuf->bps[0]; - } else { - bplist =3D malloc(nbuf * sizeof(*bplist)); - if (bplist =3D=3D NULL) { - do_error(_("couldn't malloc dir2 buffer list\n")); - exit(1); - } - memmove(bplist, dabuf->bps, nbuf * sizeof(*bplist)); - for (i =3D off =3D 0; i < nbuf; i++, off +=3D XFS_BUF_COUNT(bp)) { - bp =3D bplist[i]; - memmove(XFS_BUF_PTR(bp), (char *)dabuf->data + off, - XFS_BUF_COUNT(bp)); - } - } - da_buf_done(dabuf); - for (i =3D error =3D 0; i < nbuf; i++) { - e =3D libxfs_writebuf(bplist[i], 0); - if (e) - error =3D e; - } - if (bplist !=3D &bp) - free(bplist); - return error; -} - -static void -da_brelse( - xfs_dabuf_t *dabuf) -{ - xfs_buf_t *bp; - xfs_buf_t **bplist; - int i; - int nbuf; - - if ((nbuf =3D dabuf->nbuf) =3D=3D 1) { - bplist =3D &bp; - bp =3D dabuf->bps[0]; - } else { - bplist =3D malloc(nbuf * sizeof(*bplist)); - if (bplist =3D=3D NULL) { - do_error(_("couldn't malloc dir2 buffer list\n")); - exit(1); - } - memmove(bplist, dabuf->bps, nbuf * sizeof(*bplist)); - } - da_buf_done(dabuf); - for (i =3D 0; i < nbuf; i++) { - pftrace("putbuf %p (%llu)", bplist[i], - (long long)XFS_BUF_ADDR(bplist[i])); - libxfs_putbuf(bplist[i]); + map[i].bm_bn =3D XFS_FSB_TO_DADDR(mp, bmp[i].startblock); + map[i].bm_len =3D XFS_FSB_TO_BB(mp, bmp[i].blockcount); } - if (bplist !=3D &bp) - free(bplist); + bp =3D libxfs_readbuf_map(mp->m_dev, map, nex, 0); + if (map !=3D map_array) + free(map); + return bp; } =20 /* @@ -270,7 +124,7 @@ traverse_int_dir2block(xfs_mount_t *mp, { bmap_ext_t *bmp; xfs_dablk_t bno; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int i; int nex; xfs_da_blkinfo_t *info; @@ -307,7 +161,7 @@ _("can't read block %u for directory inode %" PRIu64 "\= n"), goto error_out; } =20 - info =3D bp->data; + info =3D bp->b_addr; =20 if (be16_to_cpu(info->magic) =3D=3D XFS_DIR2_LEAFN_MAGIC) { if ( i !=3D -1 ) { @@ -316,10 +170,10 @@ _("found non-root LEAFN node in inode %" PRIu64 " bno= =3D %u\n"), da_cursor->ino, bno); } *rbno =3D 0; - da_brelse(bp); + libxfs_putbuf(bp); return(1); } else if (be16_to_cpu(info->magic) !=3D XFS_DA_NODE_MAGIC) { - da_brelse(bp); + libxfs_putbuf(bp); do_warn( _("bad dir magic number 0x%x in inode %" PRIu64 " bno =3D %u\n"), be16_to_cpu(info->magic), @@ -328,7 +182,7 @@ _("bad dir magic number 0x%x in inode %" PRIu64 " bno = =3D %u\n"), } node =3D (xfs_da_intnode_t*)info; if (be16_to_cpu(node->hdr.count) > mp->m_dir_node_ents) { - da_brelse(bp); + libxfs_putbuf(bp); do_warn( _("bad record count in inode %" PRIu64 ", count =3D %d, max =3D %d\n"), da= _cursor->ino, be16_to_cpu(node->hdr.count), @@ -344,7 +198,7 @@ _("bad record count in inode %" PRIu64 ", count =3D %d,= max =3D %d\n"), da_cursor->i do_warn( _("bad header depth for directory inode %" PRIu64 "\n"), da_cursor->ino); - da_brelse(bp); + libxfs_putbuf(bp); i =3D -1; goto error_out; } @@ -355,7 +209,7 @@ _("bad header depth for directory inode %" PRIu64 "\n"), do_warn( _("bad directory btree for directory inode %" PRIu64 "\n"), da_cursor->ino); - da_brelse(bp); + libxfs_putbuf(bp); goto error_out; } } @@ -380,7 +234,7 @@ _("bad directory btree for directory inode %" PRIu64 "\= n"), =20 error_out: while (i > 1 && i <=3D da_cursor->active) { - da_brelse(da_cursor->level[i].bp); + libxfs_putbuf(da_cursor->level[i].bp); i++; } =20 @@ -409,7 +263,7 @@ release_dir2_cursor_int(xfs_mount_t *mp, } ASSERT(error !=3D 0); =20 - da_brelse(cursor->level[level].bp); + libxfs_putbuf(cursor->level[level].bp); cursor->level[level].bp =3D NULL; } =20 @@ -458,7 +312,7 @@ verify_final_dir2_path(xfs_mount_t *mp, * in the block which should be the final (rightmost) entry */ entry =3D cursor->level[this_level].index; - node =3D (xfs_da_intnode_t *)(cursor->level[this_level].bp->data); + node =3D (xfs_da_intnode_t *)(cursor->level[this_level].bp->b_addr); /* * check internal block consistency on this level -- ensure * that all entries are used, encountered and expected hashvals @@ -530,9 +384,9 @@ _("would correct bad hashval in non-leaf dir block\n" (cursor->level[this_level].dirty && !no_modify)); =20 if (cursor->level[this_level].dirty && !no_modify) - da_bwrite(mp, cursor->level[this_level].bp); + libxfs_writebuf(cursor->level[this_level].bp, 0); else - da_brelse(cursor->level[this_level].bp); + libxfs_putbuf(cursor->level[this_level].bp); =20 cursor->level[this_level].bp =3D NULL; =20 @@ -598,7 +452,7 @@ verify_dir2_path(xfs_mount_t *mp, xfs_da_intnode_t *node; xfs_da_intnode_t *newnode; xfs_dablk_t dabno; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int bad; int entry; int this_level =3D p_level + 1; @@ -611,7 +465,7 @@ verify_dir2_path(xfs_mount_t *mp, * should be processed now in this level. */ entry =3D cursor->level[this_level].index; - node =3D cursor->level[this_level].bp->data; + node =3D cursor->level[this_level].bp->b_addr; =20 /* * if this block is out of entries, validate this @@ -665,7 +519,7 @@ _("can't read block %u for directory inode %" PRIu64 "\= n"), return(1); } =20 - newnode =3D bp->data; + newnode =3D bp->b_addr; /* * verify magic number and back pointer, sanity-check * entry count, verify level @@ -700,7 +554,7 @@ _("bad level %d in block %u for directory inode %" PRIu= 64 "\n"), bad++; } if (bad) { - da_brelse(bp); + libxfs_putbuf(bp); return(1); } /* @@ -711,9 +565,9 @@ _("bad level %d in block %u for directory inode %" PRIu= 64 "\n"), (cursor->level[this_level].dirty && !no_modify)); =20 if (cursor->level[this_level].dirty && !no_modify) - da_bwrite(mp, cursor->level[this_level].bp); + libxfs_writebuf(cursor->level[this_level].bp, 0); else - da_brelse(cursor->level[this_level].bp); + libxfs_putbuf(cursor->level[this_level].bp); cursor->level[this_level].bp =3D bp; cursor->level[this_level].dirty =3D 0; cursor->level[this_level].bno =3D dabno; @@ -785,21 +639,19 @@ process_sf_dir2_fixi8( memmove(oldsfp, newsfp, oldsize); newsfp->hdr.count =3D oldsfp->hdr.count; newsfp->hdr.i8count =3D 0; - ino =3D xfs_dir2_sf_get_inumber(oldsfp, &oldsfp->hdr.parent); - xfs_dir2_sf_put_inumber(newsfp, &ino, &newsfp->hdr.parent); - oldsfep =3D xfs_dir2_sf_firstentry(oldsfp); - newsfep =3D xfs_dir2_sf_firstentry(newsfp); + ino =3D xfs_dir2_sf_get_parent_ino(&sfp->hdr); + xfs_dir2_sf_put_parent_ino(&newsfp->hdr, ino); + oldsfep =3D xfs_dir2_sf_firstentry(&oldsfp->hdr); + newsfep =3D xfs_dir2_sf_firstentry(&newsfp->hdr); while ((int)((char *)oldsfep - (char *)oldsfp) < oldsize) { newsfep->namelen =3D oldsfep->namelen; xfs_dir2_sf_put_offset(newsfep, xfs_dir2_sf_get_offset(oldsfep)); memmove(newsfep->name, oldsfep->name, newsfep->namelen); - ino =3D xfs_dir2_sf_get_inumber(oldsfp, - xfs_dir2_sf_inumberp(oldsfep)); - xfs_dir2_sf_put_inumber(newsfp, &ino, - xfs_dir2_sf_inumberp(newsfep)); - oldsfep =3D xfs_dir2_sf_nextentry(oldsfp, oldsfep); - newsfep =3D xfs_dir2_sf_nextentry(newsfp, newsfep); + ino =3D xfs_dir2_sfe_get_ino(&oldsfp->hdr, oldsfep); + xfs_dir2_sfe_put_ino(&newsfp->hdr, newsfep, ino); + oldsfep =3D xfs_dir2_sf_nextentry(&oldsfp->hdr, oldsfep); + newsfep =3D xfs_dir2_sf_nextentry(&newsfp->hdr, newsfep); } *next_sfep =3D newsfep; free(oldsfp); @@ -818,13 +670,13 @@ process_sf_dir2_fixoff( xfs_dir2_sf_t *sfp; =20 sfp =3D (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); - sfep =3D xfs_dir2_sf_firstentry(sfp); + sfep =3D xfs_dir2_sf_firstentry(&sfp->hdr); offset =3D XFS_DIR2_DATA_FIRST_OFFSET; =20 for (i =3D 0; i < sfp->hdr.count; i++) { xfs_dir2_sf_put_offset(sfep, offset); offset +=3D xfs_dir2_data_entsize(sfep->namelen); - sfep =3D xfs_dir2_sf_nextentry(sfp, sfep); + sfep =3D xfs_dir2_sf_nextentry(&sfp->hdr, sfep); } } =20 @@ -881,13 +733,12 @@ process_sf_dir2( /* * Initialize i8 based on size of parent inode number. */ - i8 =3D (xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent) - > XFS_DIR2_MAX_SHORT_INUM); + i8 =3D (xfs_dir2_sf_get_parent_ino(&sfp->hdr) > XFS_DIR2_MAX_SHORT_INUM); =20 /* * check for bad entry count */ - if (num_entries * xfs_dir2_sf_entsize_byname(sfp, 1) + + if (num_entries * xfs_dir2_sf_entsize(&sfp->hdr, 1) + xfs_dir2_sf_hdr_size(0) > max_size || num_entries =3D=3D 0) num_entries =3D 0xFF; =20 @@ -895,7 +746,7 @@ process_sf_dir2( * run through entries, stop at first bad entry, don't need * to check for .. since that's encoded in its own field */ - sfep =3D next_sfep =3D xfs_dir2_sf_firstentry(sfp); + sfep =3D next_sfep =3D xfs_dir2_sf_firstentry(&sfp->hdr); for (i =3D 0; i < num_entries && ino_dir_size > (char *)next_sfep - (char *)sfp; i++) { @@ -903,7 +754,7 @@ process_sf_dir2( sfep =3D next_sfep; junkit =3D 0; bad_sfnamelen =3D 0; - lino =3D xfs_dir2_sf_get_inumber(sfp, xfs_dir2_sf_inumberp(sfep)); + lino =3D xfs_dir2_sfe_get_ino(&sfp->hdr, sfep); /* * if entry points to self, junk it since only '.' or '..' * should do that and shortform dirs don't contain either @@ -1017,7 +868,7 @@ _("zero length entry in shortform dir %" PRIu64 ""), break; } } else if ((__psint_t) sfep - (__psint_t) sfp + - xfs_dir2_sf_entsize_byentry(sfp, sfep) + xfs_dir2_sf_entsize(&sfp->hdr, sfep->namelen) > ino_dir_size) { bad_sfnamelen =3D 1; =20 @@ -1105,8 +956,8 @@ _("entry contains offset out of order in shortform dir= %" PRIu64 "\n"), name[namelen] =3D '\0'; =20 if (!no_modify) { - tmp_elen =3D - xfs_dir2_sf_entsize_byentry(sfp, sfep); + tmp_elen =3D xfs_dir2_sf_entsize(&sfp->hdr, + sfep->namelen); be64_add_cpu(&dip->di_size, -tmp_elen); ino_dir_size -=3D tmp_elen; =20 @@ -1158,11 +1009,9 @@ _("would have junked entry \"%s\" in directory inode= %" PRIu64 "\n"), */ next_sfep =3D (tmp_sfep =3D=3D NULL) ? (xfs_dir2_sf_entry_t *) ((__psint_t) sfep - + ((!bad_sfnamelen) - ? xfs_dir2_sf_entsize_byentry(sfp, - sfep) - : xfs_dir2_sf_entsize_byname(sfp, - namelen))) + + ((!bad_sfnamelen) + ? xfs_dir2_sf_entsize(&sfp->hdr, sfep->namelen) + : xfs_dir2_sf_entsize(&sfp->hdr, namelen))) : tmp_sfep; } =20 @@ -1242,7 +1091,7 @@ _("corrected entry offsets in directory %" PRIu64 "\n= "), /* * check parent (..) entry */ - *parent =3D xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent); + *parent =3D xfs_dir2_sf_get_parent_ino(&sfp->hdr); =20 /* * if parent entry is bogus, null it out. we'll fix it later . @@ -1256,7 +1105,7 @@ _("bogus .. inode number (%" PRIu64 ") in directory i= node %" PRIu64 ", "), if (!no_modify) { do_warn(_("clearing inode number\n")); =20 - xfs_dir2_sf_put_inumber(sfp, &zero, &sfp->hdr.parent); + xfs_dir2_sf_put_parent_ino(&sfp->hdr, zero); *dino_dirty =3D 1; *repair =3D 1; } else { @@ -1271,7 +1120,7 @@ _("bogus .. inode number (%" PRIu64 ") in directory i= node %" PRIu64 ", "), _("corrected root directory %" PRIu64 " .. entry, was %" PRIu64 ", now %" = PRIu64 "\n"), ino, *parent, ino); *parent =3D ino; - xfs_dir2_sf_put_inumber(sfp, parent, &sfp->hdr.parent); + xfs_dir2_sf_put_parent_ino(&sfp->hdr, ino); *dino_dirty =3D 1; *repair =3D 1; } else { @@ -1291,7 +1140,7 @@ _("bad .. entry in directory inode %" PRIu64 ", point= s to self, "), if (!no_modify) { do_warn(_("clearing inode number\n")); =20 - xfs_dir2_sf_put_inumber(sfp, &zero, &sfp->hdr.parent); + xfs_dir2_sf_put_parent_ino(&sfp->hdr, zero); *dino_dirty =3D 1; *repair =3D 1; } else { @@ -1314,11 +1163,12 @@ process_dir2_data( int ino_discovery, char *dirname, /* directory pathname */ xfs_ino_t *parent, /* out - NULLFSINO if entry not exist */ - xfs_dabuf_t *bp, + struct xfs_buf *bp, int *dot, /* out - 1 if there is a dot, else 0 */ int *dotdot, /* out - 1 if there's a dotdot, else 0 */ xfs_dablk_t da_bno, - char *endptr) + char *endptr, + int *dirty) { int badbest; xfs_dir2_data_free_t *bf; @@ -1338,7 +1188,7 @@ process_dir2_data( char *ptr; xfs_ino_t ent_ino; =20 - d =3D bp->data; + d =3D bp->b_addr; bf =3D d->hdr.bestfree; ptr =3D (char *)d->u; badbest =3D lastfree =3D freeseen =3D 0; @@ -1372,7 +1222,7 @@ process_dir2_data( (char *)dup - (char *)d) break; badbest |=3D lastfree !=3D 0; - dfp =3D xfs_dir2_data_freefind(d, dup); + dfp =3D xfs_dir2_data_freefind(&d->hdr, dup); if (dfp) { i =3D dfp - bf; badbest |=3D (freeseen & (1 << i)) !=3D 0; @@ -1515,7 +1365,7 @@ _("\tclearing inode number in entry at offset %" PRId= PTR "...\n"), (intptr_t)ptr - (intptr_t)d); dep->inumber =3D cpu_to_be64(BADFSINO); ent_ino =3D BADFSINO; - bp->dirty =3D 1; + *dirty =3D 1; } else { do_warn( _("\twould clear inode number in entry at offset %" PRIdPTR "...\n"), @@ -1541,7 +1391,7 @@ _("entry at block %u offset %" PRIdPTR " in directory= inode %" PRIu64 " has ille */ if (!no_modify && ent_ino =3D=3D BADFSINO) { dep->name[0] =3D '/'; - bp->dirty =3D 1; + *dirty =3D 1; junkit =3D 0; } /* @@ -1577,7 +1427,7 @@ _("bad .. entry in root directory inode %" PRIu64 ", = was %" PRIu64 ": "), if (!no_modify) { do_warn(_("correcting\n")); dep->inumber =3D cpu_to_be64(ino); - bp->dirty =3D 1; + *dirty =3D 1; } else { do_warn(_("would correct\n")); } @@ -1609,7 +1459,7 @@ _("bad . entry in directory inode %" PRIu64 ", was %"= PRIu64 ": "), if (!no_modify) { do_warn(_("correcting\n")); dep->inumber =3D cpu_to_be64(ino); - bp->dirty =3D 1; + *dirty =3D 1; } else { do_warn(_("would correct\n")); } @@ -1636,7 +1486,7 @@ _("entry \"%*.*s\" in directory inode %" PRIu64 " poi= nts to self: "), if (junkit) { if (!no_modify) { dep->name[0] =3D '/'; - bp->dirty =3D 1; + *dirty =3D 1; do_warn(_("clearing entry\n")); } else { do_warn(_("would clear entry\n")); @@ -1656,8 +1506,8 @@ _("bad bestfree table in block %u in directory inode = %" PRIu64 ": "), da_bno, ino); if (!no_modify) { do_warn(_("repairing table\n")); - libxfs_dir2_data_freescan(mp, d, &i); - bp->dirty =3D 1; + libxfs_dir2_data_freescan(mp, &d->hdr, &i); + *dirty =3D 1; } else { do_warn(_("would repair table\n")); } @@ -1686,11 +1536,12 @@ process_block_dir2( xfs_dir2_block_t *block; xfs_dir2_leaf_entry_t *blp; bmap_ext_t *bmp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; xfs_dir2_block_tail_t *btp; int nex; int rval; bmap_ext_t lbmp; + int dirty =3D 0; =20 *repair =3D *dot =3D *dotdot =3D 0; *parent =3D NULLFSINO; @@ -1713,7 +1564,7 @@ _("can't read block %u for directory inode %" PRIu64 = "\n"), /* * Verify the block */ - block =3D bp->data; + block =3D bp->b_addr; if (be32_to_cpu(block->hdr.magic) !=3D XFS_DIR2_BLOCK_MAGIC) do_warn( _("bad directory block magic # %#x in block %u for directory inode %" PRIu= 64 "\n"), @@ -1722,7 +1573,7 @@ _("bad directory block magic # %#x in block %u for di= rectory inode %" PRIu64 "\n * process the data area * this also checks & fixes the bestfree */ - btp =3D xfs_dir2_block_tail_p(mp, block); + btp =3D xfs_dir2_block_tail_p(mp, &block->hdr); blp =3D xfs_dir2_block_leaf_p(btp); /* * Don't let this go past the end of the block. @@ -1730,12 +1581,12 @@ _("bad directory block magic # %#x in block %u for = directory inode %" PRIu64 "\n if ((char *)blp > (char *)btp) blp =3D (xfs_dir2_leaf_entry_t *)btp; rval =3D process_dir2_data(mp, ino, dip, ino_discovery, dirname, parent, - bp, dot, dotdot, mp->m_dirdatablk, (char *)blp); - if (bp->dirty && !no_modify) { + bp, dot, dotdot, mp->m_dirdatablk, (char *)blp, &dirty); + if (dirty && !no_modify) { *repair =3D 1; - da_bwrite(mp, bp); + libxfs_writebuf(bp, 0); } else - da_brelse(bp); + libxfs_putbuf(bp); return rval; } =20 @@ -1794,7 +1645,7 @@ process_leaf_level_dir2( int *repair) { bmap_ext_t *bmp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; int buf_dirty; xfs_dahash_t current_hashval; xfs_dablk_t da_bno; @@ -1839,7 +1690,7 @@ _("can't read file block %u for directory inode %" PR= Iu64 "\n"), da_bno, ino); goto error_out; } - leaf =3D bp->data; + leaf =3D bp->b_addr; /* * Check magic number for leaf directory btree block. */ @@ -1849,7 +1700,7 @@ _("can't read file block %u for directory inode %" PR= Iu64 "\n"), _("bad directory leaf magic # %#x for directory inode %" PRIu64 " block %u= \n"), be16_to_cpu(leaf->hdr.info.magic), ino, da_bno); - da_brelse(bp); + libxfs_putbuf(bp); goto error_out; } buf_dirty =3D 0; @@ -1859,7 +1710,7 @@ _("bad directory leaf magic # %#x for directory inode= %" PRIu64 " block %u\n"), */ if (process_leaf_block_dir2(mp, leaf, da_bno, ino, current_hashval, &greatest_hashval)) { - da_brelse(bp); + libxfs_putbuf(bp); goto error_out; } /* @@ -1878,14 +1729,14 @@ _("bad directory leaf magic # %#x for directory ino= de %" PRIu64 " block %u\n"), do_warn( _("bad sibling back pointer for block %u in directory inode %" PRIu64 "\n"= ), da_bno, ino); - da_brelse(bp); + libxfs_putbuf(bp); goto error_out; } prev_bno =3D da_bno; da_bno =3D be32_to_cpu(leaf->hdr.info.forw); if (da_bno !=3D 0) { if (verify_dir2_path(mp, da_cursor, 0)) { - da_brelse(bp); + libxfs_putbuf(bp); goto error_out; } } @@ -1893,9 +1744,9 @@ _("bad sibling back pointer for block %u in directory= inode %" PRIu64 "\n"), ASSERT(buf_dirty =3D=3D 0 || (buf_dirty && !no_modify)); if (buf_dirty && !no_modify) { *repair =3D 1; - da_bwrite(mp, bp); + libxfs_writebuf(bp, 0); } else - da_brelse(bp); + libxfs_putbuf(bp); } while (da_bno !=3D 0); if (verify_final_dir2_path(mp, da_cursor, 0)) { /* @@ -1988,7 +1839,7 @@ process_leaf_node_dir2( int isnode) /* node directory not leaf */ { bmap_ext_t *bmp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; xfs_dir2_data_t *data; xfs_dfiloff_t dbno; int good; @@ -1997,6 +1848,7 @@ process_leaf_node_dir2( int nex; int t; bmap_ext_t lbmp; + int dirty =3D 0; =20 *repair =3D *dot =3D *dotdot =3D good =3D 0; *parent =3D NULLFSINO; @@ -2023,21 +1875,21 @@ _("can't read block %" PRIu64 " for directory inode= %" PRIu64 "\n"), dbno, ino); continue; } - data =3D bp->data; + data =3D bp->b_addr; if (be32_to_cpu(data->hdr.magic) !=3D XFS_DIR2_DATA_MAGIC) do_warn( _("bad directory block magic # %#x in block %" PRIu64 " for directory inod= e %" PRIu64 "\n"), be32_to_cpu(data->hdr.magic), dbno, ino); i =3D process_dir2_data(mp, ino, dip, ino_discovery, dirname, parent, bp, dot, dotdot, (xfs_dablk_t)dbno, - (char *)data + mp->m_dirblksize); + (char *)data + mp->m_dirblksize, &dirty); if (i =3D=3D 0) good++; - if (bp->dirty && !no_modify) { + if (dirty && !no_modify) { *repair =3D 1; - da_bwrite(mp, bp); + libxfs_writebuf(bp, 0); } else - da_brelse(bp); + libxfs_putbuf(bp); } if (good =3D=3D 0) return 1; diff --git a/repair/dir2.h b/repair/dir2.h index a88579f..63e35d4 100644 --- a/repair/dir2.h +++ b/repair/dir2.h @@ -23,6 +23,32 @@ struct blkmap; struct bmap_ext; =20 /* + * generic dir2 structures used by xfs_repair. + * XXX: shared with xfsdb + */ +typedef union { + xfs_dir2_data_entry_t entry; + xfs_dir2_data_unused_t unused; +} xfs_dir2_data_union_t; + +typedef struct xfs_dir2_data { + xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_DATA_MAGIC */ + xfs_dir2_data_union_t u[1]; +} xfs_dir2_data_t; + +typedef struct xfs_dir2_block { + xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_BLOCK_MAGIC */ + xfs_dir2_data_union_t u[1]; + xfs_dir2_leaf_entry_t leaf[1]; + xfs_dir2_block_tail_t tail; +} xfs_dir2_block_t; + +typedef struct xfs_dir2_sf { + xfs_dir2_sf_hdr_t hdr; /* shortform header */ + xfs_dir2_sf_entry_t list[1]; /* shortform entries */ +} xfs_dir2_sf_t; + +/* * the cursor gets passed up and down the da btree processing * routines. The interior block processing routines use the * cursor to determine if the pointers to and from the preceding @@ -42,7 +68,7 @@ struct bmap_ext; * Currently, we just trash it. */ typedef struct dir2_level_state { - xfs_dabuf_t *bp; /* block bp */ + xfs_buf_t *bp; /* block bp */ xfs_dablk_t bno; /* file block number */ xfs_dahash_t hashval; /* last verified hashval */ int index; /* current index in block */ diff --git a/repair/phase6.c b/repair/phase6.c index cbe0b35..00f70a2 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -17,6 +17,7 @@ */ =20 #include +#include #include "avl.h" #include "globals.h" #include "agheader.h" @@ -484,9 +485,9 @@ mk_rbmino(xfs_mount_t *mp) xfs_bmap_init(&flist, &first); while (bno < mp->m_sb.sb_rbmblocks) { nmap =3D XFS_BMAP_MAX_NMAP; - error =3D libxfs_bmapi(tp, ip, bno, + error =3D libxfs_bmapi_write(tp, ip, bno, (xfs_extlen_t)(mp->m_sb.sb_rbmblocks - bno), - XFS_BMAPI_WRITE, &first, mp->m_sb.sb_rbmblocks, + 0, &first, mp->m_sb.sb_rbmblocks, map, &nmap, &flist); if (error) { do_error( @@ -542,7 +543,7 @@ fill_rbmino(xfs_mount_t *mp) * fill the file one block at a time */ nmap =3D 1; - error =3D libxfs_bmapi(tp, ip, bno, 1, XFS_BMAPI_WRITE, + error =3D libxfs_bmapi_write(tp, ip, bno, 1, 0, &first, 1, &map, &nmap, NULL); if (error || nmap !=3D 1) { do_error( @@ -555,7 +556,7 @@ fill_rbmino(xfs_mount_t *mp) error =3D libxfs_trans_read_buf( mp, tp, mp->m_dev, XFS_FSB_TO_DADDR(mp, map.br_startblock), - XFS_FSB_TO_BB(mp, 1), 1, &bp); + XFS_FSB_TO_BB(mp, 1), 1, &bp, NULL); =20 if (error) { do_warn( @@ -611,7 +612,7 @@ fill_rsumino(xfs_mount_t *mp) * fill the file one block at a time */ nmap =3D 1; - error =3D libxfs_bmapi(tp, ip, bno, 1, XFS_BMAPI_WRITE, + error =3D libxfs_bmapi_write(tp, ip, bno, 1, 0, &first, 1, &map, &nmap, NULL); if (error || nmap !=3D 1) { do_error( @@ -624,7 +625,7 @@ fill_rsumino(xfs_mount_t *mp) error =3D libxfs_trans_read_buf( mp, tp, mp->m_dev, XFS_FSB_TO_DADDR(mp, map.br_startblock), - XFS_FSB_TO_BB(mp, 1), 1, &bp); + XFS_FSB_TO_BB(mp, 1), 1, &bp, NULL); =20 if (error) { do_warn( @@ -723,10 +724,9 @@ mk_rsumino(xfs_mount_t *mp) xfs_bmap_init(&flist, &first); while (bno < nsumblocks) { nmap =3D XFS_BMAP_MAX_NMAP; - error =3D libxfs_bmapi(tp, ip, bno, + error =3D libxfs_bmapi_write(tp, ip, bno, (xfs_extlen_t)(nsumblocks - bno), - XFS_BMAPI_WRITE, &first, nsumblocks, - map, &nmap, &flist); + 0, &first, nsumblocks, map, &nmap, &flist); if (error) { do_error( _("couldn't allocate realtime summary inode, error =3D %d\n"), @@ -1139,7 +1139,6 @@ map_first_dblock_fsbno(xfs_mount_t *mp, xfs_inode_t *ip, xfs_dablk_t *bno) { - xfs_fsblock_t fblock; xfs_da_intnode_t *node; xfs_buf_t *bp; xfs_dablk_t da_bno; @@ -1159,13 +1158,11 @@ map_first_dblock_fsbno(xfs_mount_t *mp, *bno =3D 0; i =3D -1; node =3D NULL; - fblock =3D NULLFSBLOCK; ftype =3D _("dir"); =20 nmap =3D 1; - error =3D libxfs_bmapi(NULL, ip, (xfs_fileoff_t) da_bno, 1, - XFS_BMAPI_METADATA, &fblock, 0, - &map, &nmap, NULL); + error =3D libxfs_bmapi_read(ip, (xfs_fileoff_t) da_bno, 1, + &map, &nmap, 0); if (error || nmap !=3D 1) { if (!no_modify) do_error( @@ -1235,9 +1232,8 @@ _("bad dir/attr magic number in inode %" PRIu64 ", fi= le bno =3D %u, fsbno =3D %" PRI bp =3D NULL; =20 nmap =3D 1; - error =3D libxfs_bmapi(NULL, ip, (xfs_fileoff_t) da_bno, 1, - XFS_BMAPI_METADATA, &fblock, 0, - &map, &nmap, NULL); + error =3D libxfs_bmapi_read(ip, (xfs_fileoff_t) da_bno, 1, + &map, &nmap, 0); if (error || nmap !=3D 1) { if (!no_modify) do_error( @@ -1549,7 +1545,6 @@ longform_dir_entry_check(xfs_mount_t *mp, xfs_dir_leafblock_t *leaf; xfs_buf_t *bp; xfs_dfsbno_t fsbno; - xfs_fsblock_t fblock; xfs_dablk_t da_bno; int dirty; int nmap; @@ -1559,7 +1554,6 @@ longform_dir_entry_check(xfs_mount_t *mp, char *ftype; =20 da_bno =3D 0; - fblock =3D NULLFSBLOCK; *need_dot =3D 1; ftype =3D _("dir"); =20 @@ -1621,9 +1615,8 @@ _("bad magic # (0x%x) for dir ino %" PRIu64 " leaf bl= ock (bno %u fsbno %" PRIu64 =20 if (da_bno !=3D 0) { nmap =3D 1; - error =3D libxfs_bmapi(NULL, ip, (xfs_fileoff_t)da_bno, 1, - XFS_BMAPI_METADATA, &fblock, 0, - &map, &nmap, NULL); + error =3D libxfs_bmapi_read(ip, (xfs_fileoff_t)da_bno, 1, + &map, &nmap, 0); if (error || nmap !=3D 1) { if (!no_modify) do_error( @@ -1790,7 +1783,7 @@ dir2_kill_block( xfs_mount_t *mp, xfs_inode_t *ip, xfs_dablk_t da_bno, - xfs_dabuf_t *bp) + struct xfs_buf *bp) { xfs_da_args_t args; int committed; @@ -1808,7 +1801,7 @@ dir2_kill_block( res_failed(error); libxfs_trans_ijoin(tp, ip, 0); libxfs_trans_ihold(tp, ip); - libxfs_da_bjoin(tp, bp); + libxfs_trans_bjoin(tp, bp); memset(&args, 0, sizeof(args)); xfs_bmap_init(&flist, &firstblock); args.dp =3D ip; @@ -1840,7 +1833,7 @@ longform_dir2_entry_check_data( int *need_dot, ino_tree_node_t *current_irec, int current_ino_offset, - xfs_dabuf_t **bpp, + struct xfs_buf **bpp, dir_hash_tab_t *hashtab, freetab_t **freetabp, xfs_dablk_t da_bno, @@ -1848,7 +1841,7 @@ longform_dir2_entry_check_data( { xfs_dir2_dataptr_t addr; xfs_dir2_leaf_entry_t *blp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; xfs_dir2_block_tail_t *btp; int committed; xfs_dir2_data_t *d; @@ -1877,14 +1870,14 @@ longform_dir2_entry_check_data( int wantmagic; =20 bp =3D *bpp; - d =3D bp->data; + d =3D bp->b_addr; ptr =3D (char *)d->u; nbad =3D 0; needscan =3D needlog =3D 0; junkit =3D 0; freetab =3D *freetabp; if (isblock) { - btp =3D xfs_dir2_block_tail_p(mp, (xfs_dir2_block_t *)d); + btp =3D xfs_dir2_block_tail_p(mp, (struct xfs_dir2_data_hdr *)d); blp =3D xfs_dir2_block_leaf_p(btp); endptr =3D (char *)blp; if (endptr > (char *)btp) @@ -1972,7 +1965,7 @@ longform_dir2_entry_check_data( dir2_kill_block(mp, ip, da_bno, bp); } else { do_warn(_("would junk block\n")); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); } freetab->ents[db].v =3D NULLDATAOFF; *bpp =3D NULL; @@ -1990,8 +1983,8 @@ longform_dir2_entry_check_data( res_failed(error); libxfs_trans_ijoin(tp, ip, 0); libxfs_trans_ihold(tp, ip); - libxfs_da_bjoin(tp, bp); - libxfs_da_bhold(tp, bp); + libxfs_trans_bjoin(tp, bp); + libxfs_trans_bhold(tp, bp); xfs_bmap_init(&flist, &firstblock); if (be32_to_cpu(d->hdr.magic) !=3D wantmagic) { do_warn( @@ -2256,7 +2249,7 @@ _("entry \"%s\" in dir inode %" PRIu64 " inconsistent= with .. value (%" PRIu64 " } *num_illegal +=3D nbad; if (needscan) - libxfs_dir2_data_freescan(mp, d, &needlog); + libxfs_dir2_data_freescan(mp, &d->hdr, &needlog); if (needlog) libxfs_dir2_data_log_header(tp, bp); libxfs_bmap_finish(&tp, &flist, &committed); @@ -2277,7 +2270,7 @@ longform_dir2_check_leaf( { int badtail; __be16 *bestsp; - xfs_dabuf_t *bp; + struct xfs_buf *bp; xfs_dablk_t da_bno; int i; xfs_dir2_leaf_t *leaf; @@ -2285,13 +2278,13 @@ longform_dir2_check_leaf( int seeval; =20 da_bno =3D mp->m_dirleafblk; - if (libxfs_da_read_bufr(NULL, ip, da_bno, -1, &bp, XFS_DATA_FORK)) { + if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, XFS_DATA_FORK, NULL)) { do_error( _("can't read block %u for directory inode %" PRIu64 "\n"), da_bno, ip->i_ino); /* NOTREACHED */ } - leaf =3D bp->data; + leaf =3D bp->b_addr; ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); bestsp =3D xfs_dir2_leaf_bests_p(ltp); if (be16_to_cpu(leaf->hdr.info.magic) !=3D XFS_DIR2_LEAF1_MAGIC || @@ -2299,21 +2292,21 @@ longform_dir2_check_leaf( be32_to_cpu(leaf->hdr.info.back) || be16_to_cpu(leaf->hdr.count) < be16_to_cpu(leaf->hdr.stale) || - be16_to_cpu(leaf->hdr.count) > + be16_to_cpu(leaf->hdr.count) > xfs_dir2_max_leaf_ents(mp) || - (char *)&leaf->ents[be16_to_cpu( + (char *)&leaf->ents[be16_to_cpu( leaf->hdr.count)] > (char *)bestsp) { do_warn( _("leaf block %u for directory inode %" PRIu64 " bad header\n"), da_bno, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } seeval =3D dir_hash_see_all(hashtab, leaf->ents, be16_to_cpu(leaf->hdr.count), be16_to_cpu(leaf->hdr.stale)); if (dir_hash_check(hashtab, ip, seeval)) { - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } badtail =3D freetab->nents !=3D be32_to_cpu(ltp->bestcount); @@ -2325,10 +2318,10 @@ longform_dir2_check_leaf( do_warn( _("leaf block %u for directory inode %" PRIu64 " bad tail\n"), da_bno, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 0; } =20 @@ -2343,7 +2336,7 @@ longform_dir2_check_node( dir_hash_tab_t *hashtab, freetab_t *freetab) { - xfs_dabuf_t *bp; + struct xfs_buf *bp; xfs_dablk_t da_bno; xfs_dir2_db_t fdb; xfs_dir2_free_t *free; @@ -2359,25 +2352,25 @@ longform_dir2_check_node( next_da_bno =3D da_bno + mp->m_dirblkfsbs - 1; if (bmap_next_offset(NULL, ip, &next_da_bno, XFS_DATA_FORK)) break; - if (libxfs_da_read_bufr(NULL, ip, da_bno, -1, &bp, - XFS_DATA_FORK)) { + if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, + XFS_DATA_FORK, NULL)) { do_warn( _("can't read leaf block %u for directory inode %" PRIu64 "\n"), da_bno, ip->i_ino); return 1; } - leaf =3D bp->data; + leaf =3D bp->b_addr; if (be16_to_cpu(leaf->hdr.info.magic) !=3D XFS_DIR2_LEAFN_MAGIC) { if (be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC) { - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); continue; } do_warn( _("unknown magic number %#x for block %u in directory inode %" PRIu64 "\n= "), be16_to_cpu(leaf->hdr.info.magic), da_bno, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } if (be16_to_cpu(leaf->hdr.count) > xfs_dir2_max_leaf_ents(mp) || @@ -2386,13 +2379,13 @@ longform_dir2_check_node( do_warn( _("leaf block %u for directory inode %" PRIu64 " bad header\n"), da_bno, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } seeval =3D dir_hash_see_all(hashtab, leaf->ents, be16_to_cpu(leaf->hdr.count), be16_to_cpu(leaf->hdr.stale)); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); if (seeval !=3D DIR_HASH_CK_OK) return 1; } @@ -2405,25 +2398,25 @@ longform_dir2_check_node( next_da_bno =3D da_bno + mp->m_dirblkfsbs - 1; if (bmap_next_offset(NULL, ip, &next_da_bno, XFS_DATA_FORK)) break; - if (libxfs_da_read_bufr(NULL, ip, da_bno, -1, &bp, - XFS_DATA_FORK)) { + if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, + XFS_DATA_FORK, NULL)) { do_warn( _("can't read freespace block %u for directory inode %" PRIu64 "\n"), da_bno, ip->i_ino); return 1; } - free =3D bp->data; + free =3D bp->b_addr; fdb =3D xfs_dir2_da_to_db(mp, da_bno); if (be32_to_cpu(free->hdr.magic) !=3D XFS_DIR2_FREE_MAGIC || be32_to_cpu(free->hdr.firstdb) !=3D (fdb - XFS_DIR2_FREE_FIRSTDB(mp)) * - XFS_DIR2_MAX_FREE_BESTS(mp) || + xfs_dir2_free_max_bests(mp) || be32_to_cpu(free->hdr.nvalid) < be32_to_cpu(free->hdr.nused)) { do_warn( _("free block %u for directory inode %" PRIu64 " bad header\n"), da_bno, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } for (i =3D used =3D 0; i < be32_to_cpu(free->hdr.nvalid); i++) { @@ -2431,11 +2424,11 @@ longform_dir2_check_node( freetab->nents || freetab->ents[i + be32_to_cpu( free->hdr.firstdb)].v !=3D - be16_to_cpu(free->bests[i])) { + be16_to_cpu(free->bests[i])) { do_warn( _("free block %u entry %i for directory ino %" PRIu64 " bad\n"), da_bno, i, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } used +=3D be16_to_cpu(free->bests[i]) !=3D NULLDATAOFF; @@ -2445,10 +2438,10 @@ longform_dir2_check_node( do_warn( _("free block %u for directory inode %" PRIu64 " bad nused\n"), da_bno, ip->i_ino); - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); return 1; } - libxfs_da_brelse(NULL, bp); + libxfs_putbuf(bp); } for (i =3D 0; i < freetab->nents; i++) { if ((freetab->ents[i].s =3D=3D 0) && @@ -2478,7 +2471,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, dir_hash_tab_t *hashtab) { xfs_dir2_block_t *block; - xfs_dabuf_t **bplist; + struct xfs_buf **bplist; xfs_dablk_t da_bno; freetab_t *freetab; int num_bps; @@ -2505,7 +2498,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, freetab->ents[i].s =3D 0; } num_bps =3D freetab->naents; - bplist =3D calloc(num_bps, sizeof(xfs_dabuf_t*)); + bplist =3D calloc(num_bps, sizeof(struct xfs_buf*)); /* is this a block, leaf, or node directory? */ libxfs_dir2_isblock(NULL, ip, &isblock); libxfs_dir2_isleaf(NULL, ip, &isleaf); @@ -2521,14 +2514,14 @@ longform_dir2_entry_check(xfs_mount_t *mp, if (db >=3D num_bps) { /* more data blocks than expected */ num_bps =3D db + 1; - bplist =3D realloc(bplist, num_bps * sizeof(xfs_dabuf_t*)); + bplist =3D realloc(bplist, num_bps * sizeof(struct xfs_buf*)); if (!bplist) do_error( _("realloc failed in longform_dir2_entry_check (%zu bytes)\n"), - num_bps * sizeof(xfs_dabuf_t*)); + num_bps * sizeof(struct xfs_buf*)); } - if (libxfs_da_read_bufr(NULL, ip, da_bno, -1, &bplist[db], - XFS_DATA_FORK)) { + if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bplist[db], + XFS_DATA_FORK, NULL)) { do_warn( _("can't read data block %u for directory inode %" PRIu64 "\n"), da_bno, ino); @@ -2547,8 +2540,8 @@ longform_dir2_entry_check(xfs_mount_t *mp, xfs_dir2_block_tail_t *btp; xfs_dir2_leaf_entry_t *blp; =20 - block =3D bplist[0]->data; - btp =3D xfs_dir2_block_tail_p(mp, block); + block =3D bplist[0]->b_addr; + btp =3D xfs_dir2_block_tail_p(mp, &block->hdr); blp =3D xfs_dir2_block_leaf_p(btp); seeval =3D dir_hash_see_all(hashtab, blp, be32_to_cpu(btp->count), @@ -2567,14 +2560,14 @@ longform_dir2_entry_check(xfs_mount_t *mp, dir_hash_dup_names(hashtab); for (i =3D 0; i < freetab->naents; i++) if (bplist[i]) - libxfs_da_brelse(NULL, bplist[i]); + libxfs_putbuf(bplist[i]); longform_dir2_rebuild(mp, ino, ip, irec, ino_offset, hashtab); *num_illegal =3D 0; *need_dot =3D 0; } else { for (i =3D 0; i < freetab->naents; i++) if (bplist[i]) - libxfs_da_brelse(NULL, bplist[i]); + libxfs_putbuf(bplist[i]); } =20 free(bplist); @@ -2931,7 +2924,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, do_warn( _("setting .. in sf dir inode %" PRIu64 " to %" PRIu64 "\n"), ino, parent); - xfs_dir2_sf_put_inumber(sfp, &parent, &sfp->hdr.parent); + xfs_dir2_sf_put_parent_ino(&sfp->hdr, parent); *ino_dirty =3D 1; } return; @@ -2948,15 +2941,14 @@ shortform_dir2_entry_check(xfs_mount_t *mp, /* * Initialise i8 counter -- the parent inode number counts as well. */ - i8 =3D (xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent) > - XFS_DIR2_MAX_SHORT_INUM); + i8 =3D xfs_dir2_sf_get_parent_ino(&sfp->hdr) > XFS_DIR2_MAX_SHORT_INUM; =20 /* * now run through entries, stop at first bad entry, don't need * to skip over '..' since that's encoded in its own field and * no need to worry about '.' since it doesn't exist. */ - sfep =3D next_sfep =3D xfs_dir2_sf_firstentry(sfp); + sfep =3D next_sfep =3D xfs_dir2_sf_firstentry(&sfp->hdr); =20 for (i =3D 0; i < sfp->hdr.count && max_size > (__psint_t)next_sfep - (__psint_t)sfp; @@ -2965,7 +2957,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, bad_sfnamelen =3D 0; tmp_sfep =3D NULL; =20 - lino =3D xfs_dir2_sf_get_inumber(sfp, xfs_dir2_sf_inumberp(sfep)); + lino =3D xfs_dir2_sfe_get_ino(&sfp->hdr, sfep); =20 namelen =3D sfep->namelen; =20 @@ -2994,7 +2986,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, break; } } else if (no_modify && (__psint_t) sfep - (__psint_t) sfp + - + xfs_dir2_sf_entsize_byentry(sfp, sfep) + + xfs_dir2_sf_entsize(&sfp->hdr, sfep->namelen) > ip->i_d.di_size) { bad_sfnamelen =3D 1; =20 @@ -3024,7 +3016,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, =20 if (no_modify && verify_inum(mp, lino)) { next_sfep =3D (xfs_dir2_sf_entry_t *)((__psint_t)sfep + - xfs_dir2_sf_entsize_byentry(sfp, sfep)); + xfs_dir2_sf_entsize(&sfp->hdr, sfep->namelen)); continue; } =20 @@ -3075,8 +3067,8 @@ shortform_dir2_entry_check(xfs_mount_t *mp, * check for duplicate names in directory. */ if (!dir_hash_add(mp, hashtab, (xfs_dir2_dataptr_t) - (sfep - xfs_dir2_sf_firstentry(sfp)), - lino, sfep->namelen, sfep->name)) { + (sfep - xfs_dir2_sf_firstentry(&sfp->hdr)), + lino, sfep->namelen, sfep->name)) { do_warn( _("entry \"%s\" (ino %" PRIu64 ") in dir %" PRIu64 " is a duplicate name"), fname, lino, ino); @@ -3132,7 +3124,8 @@ do_junkit: if (lino =3D=3D orphanage_ino) orphanage_ino =3D 0; if (!no_modify) { - tmp_elen =3D xfs_dir2_sf_entsize_byentry(sfp, sfep); + tmp_elen =3D xfs_dir2_sf_entsize(&sfp->hdr, + sfep->namelen); tmp_sfep =3D (xfs_dir2_sf_entry_t *) ((__psint_t) sfep + tmp_elen); tmp_len =3D max_size - ((__psint_t) tmp_sfep @@ -3183,9 +3176,9 @@ do_junkit: =20 next_sfep =3D (tmp_sfep =3D=3D NULL) ? (xfs_dir2_sf_entry_t *) ((__psint_t) sfep - + ((!bad_sfnamelen) - ? xfs_dir2_sf_entsize_byentry(sfp, sfep) - : xfs_dir2_sf_entsize_byname(sfp, namelen))) + + ((!bad_sfnamelen) + ? xfs_dir2_sf_entsize(&sfp->hdr, sfep->namelen) + : xfs_dir2_sf_entsize(&sfp->hdr, namelen))) : tmp_sfep; } =20 =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00xfsprogs-crc-patchset-v2/xfsprogs-kernel-3.9-= rc1-dev-update=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=0000= 01750=000001750=0000001107275=0012132011546=00022356=00 0=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs: update libxfs to 3.9= -rc1 + xfsdev =46rom: Dave Chinner Update the code from 3.8-rc2 to 3.9-rc1 and the current xfs-dev tree (to pick up xfs_bmap.c rework). Signed-off-by: Dave Chinner --- db/check.c | 3 +- db/metadump.c | 3 +- include/libxfs.h | 2 +- include/xfs_dinode.h | 6 +- include/xfs_inode.h | 6 +- include/xfs_mount.h | 7 +- include/xfs_types.h | 1 - libxfs/xfs.h | 4 +- libxfs/xfs_alloc.c | 2 +- libxfs/xfs_attr.c | 1 + libxfs/xfs_attr_leaf.c | 6 +- libxfs/xfs_bmap.c | 8388 +++++++++++++++++++++++--------------------= ---- libxfs/xfs_dir2_block.c | 6 +- libxfs/xfs_ialloc.c | 6 +- libxfs/xfs_inode.c | 1 + libxfs/xfs_mount.c | 2 +- repair/dinode.c | 8 +- repair/prefetch.c | 2 +- 18 files changed, 4218 insertions(+), 4236 deletions(-) diff --git a/db/check.c b/db/check.c index f1cec8f..1dfef74 100644 --- a/db/check.c +++ b/db/check.c @@ -2715,7 +2715,8 @@ process_inode( error++; return; } - if ((unsigned int)XFS_DFORK_ASIZE(dip, mp) >=3D XFS_LITINO(mp)) { + if ((unsigned int)XFS_DFORK_ASIZE(dip, mp) >=3D + XFS_LITINO(mp, idic.di_version)) { if (v) dbprintf(_("bad fork offset %d for inode %lld\n"), idic.di_forkoff, id->ino); diff --git a/db/metadump.c b/db/metadump.c index 5739f86..0635e7b 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -1637,7 +1637,8 @@ process_inode( nametable_clear(); =20 /* copy extended attributes if they exist and forkoff is valid */ - if (success && XFS_DFORK_DSIZE(dip, mp) < XFS_LITINO(mp)) { + if (success && + XFS_DFORK_DSIZE(dip, mp) < XFS_LITINO(mp, dip->di_version)) { attr_data.remote_val_count =3D 0; switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: diff --git a/include/libxfs.h b/include/libxfs.h index 0e2fc5f..b60bcf5 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -610,7 +610,7 @@ int libxfs_attr_remove(struct xfs_inode *, const unsign= ed char *, int); /* xfs_bmap.c */ xfs_bmbt_rec_host_t *xfs_bmap_search_extents(xfs_inode_t *, xfs_fileoff_t, int, int *, xfs_extnum_t *, xfs_bmbt_irec_t *, - xfs_bmbt_irec_t *); + xfs_bmbt_irec_t *); void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); =20 /* xfs_attr_leaf.h */ diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index 1d9643b..88a3368 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -104,7 +104,7 @@ typedef enum xfs_dinode_fmt { /* * Inode size for given fs. */ -#define XFS_LITINO(mp) \ +#define XFS_LITINO(mp, version) \ ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) =20 #define XFS_BROOT_SIZE_ADJ \ @@ -119,10 +119,10 @@ typedef enum xfs_dinode_fmt { #define XFS_DFORK_DSIZE(dip,mp) \ (XFS_DFORK_Q(dip) ? \ XFS_DFORK_BOFF(dip) : \ - XFS_LITINO(mp)) + XFS_LITINO(mp, (dip)->di_version)) #define XFS_DFORK_ASIZE(dip,mp) \ (XFS_DFORK_Q(dip) ? \ - XFS_LITINO(mp) - XFS_DFORK_BOFF(dip) : \ + XFS_LITINO(mp, (dip)->di_version) - XFS_DFORK_BOFF(dip) : \ 0) #define XFS_DFORK_SIZE(dip,mp,w) \ ((w) =3D=3D XFS_DATA_FORK ? \ diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 437b3af..4733f85 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -180,10 +180,11 @@ typedef struct xfs_icdinode { #define XFS_IFORK_DSIZE(ip) \ (XFS_IFORK_Q(ip) ? \ XFS_IFORK_BOFF(ip) : \ - XFS_LITINO((ip)->i_mount)) + XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version)) #define XFS_IFORK_ASIZE(ip) \ (XFS_IFORK_Q(ip) ? \ - XFS_LITINO((ip)->i_mount) - XFS_IFORK_BOFF(ip) : \ + XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version) - \ + XFS_IFORK_BOFF(ip) : \ 0) #define XFS_IFORK_SIZE(ip,w) \ ((w) =3D=3D XFS_DATA_FORK ? \ @@ -419,6 +420,7 @@ static inline void xfs_iflock(struct xfs_inode *ip) static inline void xfs_ifunlock(struct xfs_inode *ip) { xfs_iflags_clear(ip, XFS_IFLOCK); + smp_mb(); wake_up_bit(&ip->i_flags, __XFS_IFLOCK_BIT); } =20 diff --git a/include/xfs_mount.h b/include/xfs_mount.h index c267379..28bbf46 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -41,6 +41,12 @@ typedef struct xfs_trans_reservations { uint tr_growrtalloc; /* grow realtime allocations */ uint tr_growrtzero; /* grow realtime zeroing */ uint tr_growrtfree; /* grow realtime freeing */ + uint tr_qm_sbchange; /* change quota flags */ + uint tr_qm_setqlim; /* adjust quota limits */ + uint tr_qm_dqalloc; /* allocate quota on disk */ + uint tr_qm_quotaoff; /* turn quota off */ + uint tr_qm_equotaoff;/* end of turn quota off */ + uint tr_sb; /* modify superblock */ } xfs_trans_reservations_t; =20 #ifndef __KERNEL__ @@ -201,7 +207,6 @@ typedef struct xfs_mount { trimming */ __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ - struct shrinker m_inode_shrink; /* inode reclaim shrinker */ int64_t m_low_space[XFS_LOWSP_MAX]; /* low free space thresholds */ =20 diff --git a/include/xfs_types.h b/include/xfs_types.h index e9bd5c3..dd6bf71 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -32,7 +32,6 @@ typedef unsigned int __uint32_t; typedef signed long long int __int64_t; typedef unsigned long long int __uint64_t; =20 -typedef enum { B_FALSE,B_TRUE } boolean_t; typedef __uint32_t inst_t; /* an instruction */ =20 typedef __s64 xfs_off_t; /* type */ diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 6213284..9fbe261 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -107,10 +107,10 @@ typedef __uint32_t inst_t; /* an instruction */ #define rcu_read_unlock() ((void) 0) =20 /* - * random32 is used for di_gen inode allocation, it must be zero for libxfs + * prandom_u32 is used for di_gen inode allocation, it must be zero for li= bxfs * or all sorts of badness can occur! */ -#define random32() 0=09 +#define prandom_u32() 0 =20 #define PAGE_CACHE_SIZE getpagesize() =20 diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 61cdc6c..e59fdac 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -822,7 +822,7 @@ xfs_alloc_ag_vextent_near( */ int dofirst; /* set to do first algorithm */ =20 - dofirst =3D random32() & 1; + dofirst =3D prandom_u32() & 1; #endif =20 restart: diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index 42546a9..2adf92b 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -275,6 +275,7 @@ xfs_attr_set_int( if (rsvd) args.trans->t_flags |=3D XFS_TRANS_RESERVE; =20 + error =3D xfs_trans_reserve(args.trans, args.total, XFS_ATTRSETM_LOG_RES(mp) + XFS_ATTRSETRT_LOG_RES(mp) * args.total, diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 824c122..426130f 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -141,7 +141,8 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) int dsize; xfs_mount_t *mp =3D dp->i_mount; =20 - offset =3D (XFS_LITINO(mp) - bytes) >> 3; /* rounded down */ + /* rounded down */ + offset =3D (XFS_LITINO(mp, dp->i_d.di_version) - bytes) >> 3; =20 switch (dp->i_d.di_format) { case XFS_DINODE_FMT_DEV: @@ -212,7 +213,8 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) minforkoff =3D roundup(minforkoff, 8) >> 3; =20 /* attr fork btree root can have at least this many key/ptr pairs */ - maxforkoff =3D XFS_LITINO(mp) - XFS_BMDR_SPACE_CALC(MINABTPTRS); + maxforkoff =3D XFS_LITINO(mp, dp->i_d.di_version) - + XFS_BMDR_SPACE_CALC(MINABTPTRS); maxforkoff =3D maxforkoff >> 3; /* rounded down */ =20 if (offset >=3D maxforkoff) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index b328a0b..c8232a9 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -15,152 +15,77 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #include =20 - kmem_zone_t *xfs_bmap_free_item_zone; =20 /* - * Prototypes for internal bmap routines. - */ - -#ifdef DEBUG -STATIC void -xfs_bmap_check_leaf_extents( - struct xfs_btree_cur *cur, - struct xfs_inode *ip, - int whichfork); -#else -#define xfs_bmap_check_leaf_extents(cur, ip, whichfork) do { } while (0) -#endif - - -/* - * Called from xfs_bmap_add_attrfork to handle extents format files. - */ -STATIC int /* error */ -xfs_bmap_add_attrfork_extents( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fsblock_t *firstblock, /* first block allocated */ - xfs_bmap_free_t *flist, /* blocks to free at commit */ - int *flags); /* inode logging flags */ - -/* - * Called from xfs_bmap_add_attrfork to handle local format files. - */ -STATIC int /* error */ -xfs_bmap_add_attrfork_local( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fsblock_t *firstblock, /* first block allocated */ - xfs_bmap_free_t *flist, /* blocks to free at commit */ - int *flags); /* inode logging flags */ - -/* - * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. - * It figures out where to ask the underlying allocator to put the new ext= ent. - */ -STATIC int /* error */ -xfs_bmap_alloc( - xfs_bmalloca_t *ap); /* bmap alloc argument struct */ - -/* - * Transform a btree format file with only one leaf node, where the - * extents list will fit in the inode, into an extents format file. - * Since the file extents are already in-core, all we have to do is - * give up the space for the btree root and pitch the leaf block. - */ -STATIC int /* error */ -xfs_bmap_btree_to_extents( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_btree_cur_t *cur, /* btree cursor */ - int *logflagsp, /* inode logging flags */ - int whichfork); /* data or attr fork */ - -/* - * Convert an extents-format file into a btree-format file. - * The new file will have a root block (in the inode) and a single child b= lock. - */ -STATIC int /* error */ -xfs_bmap_extents_to_btree( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fsblock_t *firstblock, /* first-block-allocated */ - xfs_bmap_free_t *flist, /* blocks freed in xaction */ - xfs_btree_cur_t **curp, /* cursor returned to caller */ - int wasdel, /* converting a delayed alloc */ - int *logflagsp, /* inode logging flags */ - int whichfork); /* data or attr fork */ - -/* - * Convert a local file to an extents file. - * This code is sort of bogus, since the file data needs to get - * logged so it won't be lost. The bmap-level manipulations are ok, thoug= h. - */ -STATIC int /* error */ -xfs_bmap_local_to_extents( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fsblock_t *firstblock, /* first block allocated in xaction */ - xfs_extlen_t total, /* total blocks needed by transaction */ - int *logflagsp, /* inode logging flags */ - int whichfork); /* data or attr fork */ - -/* - * Compute the worst-case number of indirect blocks that will be used - * for ip's delayed extent of length "len". + * Miscellaneous helper functions */ -STATIC xfs_filblks_t -xfs_bmap_worst_indlen( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_filblks_t len); /* delayed extent length */ =20 -#ifdef DEBUG /* - * Perform various validation checks on the values being returned - * from xfs_bmapi(). + * Compute and fill in the value of the maximum depth of a bmap btree + * in this filesystem. Done once, during mount. */ -STATIC void -xfs_bmap_validate_ret( - xfs_fileoff_t bno, - xfs_filblks_t len, - int flags, - xfs_bmbt_irec_t *mval, - int nmap, - int ret_nmap); -#else -#define xfs_bmap_validate_ret(bno,len,flags,mval,onmap,nmap) -#endif /* DEBUG */ - -STATIC int -xfs_bmap_count_tree( - xfs_mount_t *mp, - xfs_trans_t *tp, - xfs_ifork_t *ifp, - xfs_fsblock_t blockno, - int levelin, - int *count); - -STATIC void -xfs_bmap_count_leaves( - xfs_ifork_t *ifp, - xfs_extnum_t idx, - int numrecs, - int *count); +void +xfs_bmap_compute_maxlevels( + xfs_mount_t *mp, /* file system mount structure */ + int whichfork) /* data or attr fork */ +{ + int level; /* btree level */ + uint maxblocks; /* max blocks at this level */ + uint maxleafents; /* max leaf entries possible */ + int maxrootrecs; /* max records in root block */ + int minleafrecs; /* min records in leaf block */ + int minnoderecs; /* min records in node block */ + int sz; /* root block size */ =20 -STATIC void -xfs_bmap_disk_count_leaves( - struct xfs_mount *mp, - struct xfs_btree_block *block, - int numrecs, - int *count); + /* + * The maximum number of extents in a file, hence the maximum + * number of leaf entries, is controlled by the type of di_nextents + * (a signed 32-bit number, xfs_extnum_t), or by di_anextents + * (a signed 16-bit number, xfs_aextnum_t). + * + * Note that we can no longer assume that if we are in ATTR1 that + * the fork offset of all the inodes will be + * (xfs_default_attroffset(ip) >> 3) because we could have mounted + * with ATTR2 and then mounted back with ATTR1, keeping the + * di_forkoff's fixed but probably at various positions. Therefore, + * for both ATTR1 and ATTR2 we have to assume the worst case scenario + * of a minimum size available. + */ + if (whichfork =3D=3D XFS_DATA_FORK) { + maxleafents =3D MAXEXTNUM; + sz =3D XFS_BMDR_SPACE_CALC(MINDBTPTRS); + } else { + maxleafents =3D MAXAEXTNUM; + sz =3D XFS_BMDR_SPACE_CALC(MINABTPTRS); + } + maxrootrecs =3D xfs_bmdr_maxrecs(mp, sz, 0); + minleafrecs =3D mp->m_bmap_dmnr[0]; + minnoderecs =3D mp->m_bmap_dmnr[1]; + maxblocks =3D (maxleafents + minleafrecs - 1) / minleafrecs; + for (level =3D 1; maxblocks > 1; level++) { + if (maxblocks <=3D maxrootrecs) + maxblocks =3D 1; + else + maxblocks =3D (maxblocks + minnoderecs - 1) / minnoderecs; + } + mp->m_bm_maxlevels[whichfork] =3D level; +} =20 /* - * Bmap internal routines. + * Convert the given file system block to a disk block. We have to treat = it + * differently based on whether the file is a real time file or not, becau= se the + * bmap code does. */ +xfs_daddr_t +xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) +{ + return (XFS_IS_REALTIME_INODE(ip) ? \ + (xfs_daddr_t)XFS_FSB_TO_BB((ip)->i_mount, (fsb)) : \ + XFS_FSB_TO_DADDR((ip)->i_mount, (fsb))); +} =20 STATIC int /* error */ xfs_bmbt_lookup_eq( @@ -230,3769 +155,3881 @@ xfs_bmbt_update( } =20 /* - * Called from xfs_bmap_add_attrfork to handle btree format files. + * Compute the worst-case number of indirect blocks that will be used + * for ip's delayed extent of length "len". */ -STATIC int /* error */ -xfs_bmap_add_attrfork_btree( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fsblock_t *firstblock, /* first block allocated */ - xfs_bmap_free_t *flist, /* blocks to free at commit */ - int *flags) /* inode logging flags */ +STATIC xfs_filblks_t +xfs_bmap_worst_indlen( + xfs_inode_t *ip, /* incore inode pointer */ + xfs_filblks_t len) /* delayed extent length */ { - xfs_btree_cur_t *cur; /* btree cursor */ - int error; /* error return value */ - xfs_mount_t *mp; /* file system mount struct */ - int stat; /* newroot status */ + int level; /* btree level number */ + int maxrecs; /* maximum record count at this level */ + xfs_mount_t *mp; /* mount structure */ + xfs_filblks_t rval; /* return value */ =20 mp =3D ip->i_mount; - if (ip->i_df.if_broot_bytes <=3D XFS_IFORK_DSIZE(ip)) - *flags |=3D XFS_ILOG_DBROOT; - else { - cur =3D xfs_bmbt_init_cursor(mp, tp, ip, XFS_DATA_FORK); - cur->bc_private.b.flist =3D flist; - cur->bc_private.b.firstblock =3D *firstblock; - if ((error =3D xfs_bmbt_lookup_ge(cur, 0, 0, 0, &stat))) - goto error0; - /* must be at least one entry */ - XFS_WANT_CORRUPTED_GOTO(stat =3D=3D 1, error0); - if ((error =3D xfs_btree_new_iroot(cur, flags, &stat))) - goto error0; - if (stat =3D=3D 0) { - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); - return XFS_ERROR(ENOSPC); - } - *firstblock =3D cur->bc_private.b.firstblock; - cur->bc_private.b.allocated =3D 0; - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + maxrecs =3D mp->m_bmap_dmxr[0]; + for (level =3D 0, rval =3D 0; + level < XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK); + level++) { + len +=3D maxrecs - 1; + do_div(len, maxrecs); + rval +=3D len; + if (len =3D=3D 1) + return rval + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - + level - 1; + if (level =3D=3D 0) + maxrecs =3D mp->m_bmap_dmxr[1]; } - return 0; -error0: - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); - return error; + return rval; } =20 /* - * Called from xfs_bmap_add_attrfork to handle extents format files. + * Calculate the default attribute fork offset for newly created inodes. */ -STATIC int /* error */ -xfs_bmap_add_attrfork_extents( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fsblock_t *firstblock, /* first block allocated */ - xfs_bmap_free_t *flist, /* blocks to free at commit */ - int *flags) /* inode logging flags */ +uint +xfs_default_attroffset( + struct xfs_inode *ip) { - xfs_btree_cur_t *cur; /* bmap btree cursor */ - int error; /* error return value */ + struct xfs_mount *mp =3D ip->i_mount; + uint offset; =20 - if (ip->i_d.di_nextents * sizeof(xfs_bmbt_rec_t) <=3D XFS_IFORK_DSIZE(ip)) - return 0; - cur =3D NULL; - error =3D xfs_bmap_extents_to_btree(tp, ip, firstblock, flist, &cur, 0, - flags, XFS_DATA_FORK); - if (cur) { - cur->bc_private.b.allocated =3D 0; - xfs_btree_del_cursor(cur, - error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + if (mp->m_sb.sb_inodesize =3D=3D 256) { + offset =3D XFS_LITINO(mp, ip->i_d.di_version) - + XFS_BMDR_SPACE_CALC(MINABTPTRS); + } else { + offset =3D XFS_BMDR_SPACE_CALC(6 * MINABTPTRS); } - return error; + + ASSERT(offset < XFS_LITINO(mp, ip->i_d.di_version)); + return offset; } =20 /* - * Called from xfs_bmap_add_attrfork to handle local format files. + * Helper routine to reset inode di_forkoff field when switching + * attribute fork from local to extent format - we reset it where + * possible to make space available for inline data fork extents. */ -STATIC int /* error */ -xfs_bmap_add_attrfork_local( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fsblock_t *firstblock, /* first block allocated */ - xfs_bmap_free_t *flist, /* blocks to free at commit */ - int *flags) /* inode logging flags */ +STATIC void +xfs_bmap_forkoff_reset( + xfs_mount_t *mp, + xfs_inode_t *ip, + int whichfork) { - xfs_da_args_t dargs; /* args for dir/attr code */ - int error; /* error return value */ - xfs_mount_t *mp; /* mount structure pointer */ + if (whichfork =3D=3D XFS_ATTR_FORK && + ip->i_d.di_format !=3D XFS_DINODE_FMT_DEV && + ip->i_d.di_format !=3D XFS_DINODE_FMT_UUID && + ip->i_d.di_format !=3D XFS_DINODE_FMT_BTREE) { + uint dfl_forkoff =3D xfs_default_attroffset(ip) >> 3; =20 - if (ip->i_df.if_bytes <=3D XFS_IFORK_DSIZE(ip)) - return 0; - if (S_ISDIR(ip->i_d.di_mode)) { - mp =3D ip->i_mount; - memset(&dargs, 0, sizeof(dargs)); - dargs.dp =3D ip; - dargs.firstblock =3D firstblock; - dargs.flist =3D flist; - dargs.total =3D mp->m_dirblkfsbs; - dargs.whichfork =3D XFS_DATA_FORK; - dargs.trans =3D tp; - error =3D xfs_dir2_sf_to_block(&dargs); - } else - error =3D xfs_bmap_local_to_extents(tp, ip, firstblock, 1, flags, - XFS_DATA_FORK); - return error; + if (dfl_forkoff > ip->i_d.di_forkoff) + ip->i_d.di_forkoff =3D dfl_forkoff; + } } =20 /* - * Convert a delayed allocation to a real allocation. + * Extent tree block counting routines. */ -STATIC int /* error */ -xfs_bmap_add_extent_delay_real( - struct xfs_bmalloca *bma) + +/* + * Count leaf blocks given a range of extent records. + */ +STATIC void +xfs_bmap_count_leaves( + xfs_ifork_t *ifp, + xfs_extnum_t idx, + int numrecs, + int *count) { - struct xfs_bmbt_irec *new =3D &bma->got; - int diff; /* temp value */ - xfs_bmbt_rec_host_t *ep; /* extent entry for idx */ - int error; /* error return value */ - int i; /* temp state */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_fileoff_t new_endoff; /* end offset of new entry */ - xfs_bmbt_irec_t r[3]; /* neighbor extent entries */ - /* left is 0, right is 1, prev is 2 */ - int rval=3D0; /* return value (logging flags) */ - int state =3D 0;/* state bits, accessed thru macros */ - xfs_filblks_t da_new; /* new count del alloc blocks used */ - xfs_filblks_t da_old; /* old count del alloc blocks used */ - xfs_filblks_t temp=3D0; /* value for da_new calculations */ - xfs_filblks_t temp2=3D0;/* value for da_new calculations */ - int tmp_rval; /* partial logging flags */ + int b; =20 - ifp =3D XFS_IFORK_PTR(bma->ip, XFS_DATA_FORK); + for (b =3D 0; b < numrecs; b++) { + xfs_bmbt_rec_host_t *frp =3D xfs_iext_get_ext(ifp, idx + b); + *count +=3D xfs_bmbt_get_blockcount(frp); + } +} =20 - ASSERT(bma->idx >=3D 0); - ASSERT(bma->idx <=3D ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); - ASSERT(!isnullstartblock(new->br_startblock)); - ASSERT(!bma->cur || - (bma->cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL)); +/* + * Count leaf blocks given a range of extent records originally + * in btree format. + */ +STATIC void +xfs_bmap_disk_count_leaves( + struct xfs_mount *mp, + struct xfs_btree_block *block, + int numrecs, + int *count) +{ + int b; + xfs_bmbt_rec_t *frp; =20 - XFS_STATS_INC(xs_add_exlist); + for (b =3D 1; b <=3D numrecs; b++) { + frp =3D XFS_BMBT_REC_ADDR(mp, block, b); + *count +=3D xfs_bmbt_disk_get_blockcount(frp); + } +} =20 -#define LEFT r[0] -#define RIGHT r[1] -#define PREV r[2] +/* + * Recursively walks each level of a btree + * to count total fsblocks is use. + */ +STATIC int /* error */ +xfs_bmap_count_tree( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_fsblock_t blockno, /* file system block number */ + int levelin, /* level in btree */ + int *count) /* Count of blocks */ +{ + int error; + xfs_buf_t *bp, *nbp; + int level =3D levelin; + __be64 *pp; + xfs_fsblock_t bno =3D blockno; + xfs_fsblock_t nextbno; + struct xfs_btree_block *block, *nextblock; + int numrecs; =20 - /* - * Set up a bunch of variables to make the tests simpler. - */ - ep =3D xfs_iext_get_ext(ifp, bma->idx); - xfs_bmbt_get_all(ep, &PREV); - new_endoff =3D new->br_startoff + new->br_blockcount; - ASSERT(PREV.br_startoff <=3D new->br_startoff); - ASSERT(PREV.br_startoff + PREV.br_blockcount >=3D new_endoff); + error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) + return error; + *count +=3D 1; + block =3D XFS_BUF_TO_BLOCK(bp); =20 - da_old =3D startblockval(PREV.br_startblock); - da_new =3D 0; + if (--level) { + /* Not at node above leaves, count this level of nodes */ + nextbno =3D be64_to_cpu(block->bb_u.l.bb_rightsib); + while (nextbno !=3D NULLFSBLOCK) { + error =3D xfs_btree_read_bufl(mp, tp, nextbno, 0, &nbp, + XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) + return error; + *count +=3D 1; + nextblock =3D XFS_BUF_TO_BLOCK(nbp); + nextbno =3D be64_to_cpu(nextblock->bb_u.l.bb_rightsib); + xfs_trans_brelse(tp, nbp); + } =20 - /* - * Set flags determining what part of the previous delayed allocation - * extent is being replaced by a real allocation. - */ - if (PREV.br_startoff =3D=3D new->br_startoff) - state |=3D BMAP_LEFT_FILLING; - if (PREV.br_startoff + PREV.br_blockcount =3D=3D new_endoff) - state |=3D BMAP_RIGHT_FILLING; + /* Dive to the next level */ + pp =3D XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); + bno =3D be64_to_cpu(*pp); + if (unlikely((error =3D + xfs_bmap_count_tree(mp, tp, ifp, bno, level, count)) < 0)) { + xfs_trans_brelse(tp, bp); + XFS_ERROR_REPORT("xfs_bmap_count_tree(1)", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + xfs_trans_brelse(tp, bp); + } else { + /* count all level 1 nodes and their leaves */ + for (;;) { + nextbno =3D be64_to_cpu(block->bb_u.l.bb_rightsib); + numrecs =3D be16_to_cpu(block->bb_numrecs); + xfs_bmap_disk_count_leaves(mp, block, numrecs, count); + xfs_trans_brelse(tp, bp); + if (nextbno =3D=3D NULLFSBLOCK) + break; + bno =3D nextbno; + error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, + XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) + return error; + *count +=3D 1; + block =3D XFS_BUF_TO_BLOCK(bp); + } + } + return 0; +} =20 - /* - * Check and set flags if this segment has a left neighbor. - * Don't set contiguous if the combined extent would be too large. - */ - if (bma->idx > 0) { - state |=3D BMAP_LEFT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx - 1), &LEFT); +/* + * Count fsblocks of the given fork. + */ +int /* error */ +xfs_bmap_count_blocks( + xfs_trans_t *tp, /* transaction pointer */ + xfs_inode_t *ip, /* incore inode */ + int whichfork, /* data or attr fork */ + int *count) /* out: count of blocks */ +{ + struct xfs_btree_block *block; /* current btree block */ + xfs_fsblock_t bno; /* block # of "block" */ + xfs_ifork_t *ifp; /* fork structure */ + int level; /* btree level, for checking */ + xfs_mount_t *mp; /* file system mount structure */ + __be64 *pp; /* pointer to block address */ =20 - if (isnullstartblock(LEFT.br_startblock)) - state |=3D BMAP_LEFT_DELAY; + bno =3D NULLFSBLOCK; + mp =3D ip->i_mount; + ifp =3D XFS_IFORK_PTR(ip, whichfork); + if ( XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS ) { + xfs_bmap_count_leaves(ifp, 0, + ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t), + count); + return 0; } =20 - if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && - LEFT.br_startoff + LEFT.br_blockcount =3D=3D new->br_startoff && - LEFT.br_startblock + LEFT.br_blockcount =3D=3D new->br_startblock && - LEFT.br_state =3D=3D new->br_state && - LEFT.br_blockcount + new->br_blockcount <=3D MAXEXTLEN) - state |=3D BMAP_LEFT_CONTIG; - /* - * Check and set flags if this segment has a right neighbor. - * Don't set contiguous if the combined extent would be too large. - * Also check for all-three-contiguous being too large. + * Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out. */ - if (bma->idx < bma->ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)= { - state |=3D BMAP_RIGHT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx + 1), &RIGHT); + block =3D ifp->if_broot; + level =3D be16_to_cpu(block->bb_level); + ASSERT(level > 0); + pp =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes); + bno =3D be64_to_cpu(*pp); + ASSERT(bno !=3D NULLDFSBNO); + ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount); + ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks); =20 - if (isnullstartblock(RIGHT.br_startblock)) - state |=3D BMAP_RIGHT_DELAY; + if (unlikely(xfs_bmap_count_tree(mp, tp, ifp, bno, level, count) < 0)) { + XFS_ERROR_REPORT("xfs_bmap_count_blocks(2)", XFS_ERRLEVEL_LOW, + mp); + return XFS_ERROR(EFSCORRUPTED); } =20 - if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && - new_endoff =3D=3D RIGHT.br_startoff && - new->br_startblock + new->br_blockcount =3D=3D RIGHT.br_startblock && - new->br_state =3D=3D RIGHT.br_state && - new->br_blockcount + RIGHT.br_blockcount <=3D MAXEXTLEN && - ((state & (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | - BMAP_RIGHT_FILLING)) !=3D - (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | - BMAP_RIGHT_FILLING) || - LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount - <=3D MAXEXTLEN)) - state |=3D BMAP_RIGHT_CONTIG; + return 0; +} =20 - error =3D 0; - /* - * Switch out based on the FILLING and CONTIG state bits. - */ - switch (state & (BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | - BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG)) { - case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | - BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: - /* - * Filling in all of a previously delayed allocation extent. - * The left and right neighbors are both contiguous with new. - */ - bma->idx--; - trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), - LEFT.br_blockcount + PREV.br_blockcount + - RIGHT.br_blockcount); - trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); +/* + * Debug/sanity checking code + */ =20 - xfs_iext_remove(bma->ip, bma->idx + 1, 2, state); - bma->ip->i_d.di_nextents--; - if (bma->cur =3D=3D NULL) - rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; - else { - rval =3D XFS_ILOG_CORE; - error =3D xfs_bmbt_lookup_eq(bma->cur, RIGHT.br_startoff, - RIGHT.br_startblock, - RIGHT.br_blockcount, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - error =3D xfs_btree_delete(bma->cur, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - error =3D xfs_btree_decrement(bma->cur, 0, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - error =3D xfs_bmbt_update(bma->cur, LEFT.br_startoff, - LEFT.br_startblock, - LEFT.br_blockcount + - PREV.br_blockcount + - RIGHT.br_blockcount, LEFT.br_state); - if (error) - goto done; - } - break; +STATIC int +xfs_bmap_sanity_check( + struct xfs_mount *mp, + struct xfs_buf *bp, + int level) +{ + struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); =20 - case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: - /* - * Filling in all of a previously delayed allocation extent. - * The left neighbor is contiguous, the right is not. - */ - bma->idx--; + if (block->bb_magic !=3D cpu_to_be32(XFS_BMAP_MAGIC) || + be16_to_cpu(block->bb_level) !=3D level || + be16_to_cpu(block->bb_numrecs) =3D=3D 0 || + be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level !=3D 0]) + return 0; + return 1; +} =20 - trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), - LEFT.br_blockcount + PREV.br_blockcount); - trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); +#ifdef DEBUG +STATIC struct xfs_buf * +xfs_bmap_get_bp( + struct xfs_btree_cur *cur, + xfs_fsblock_t bno) +{ + struct xfs_log_item_desc *lidp; + int i; =20 - xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); - if (bma->cur =3D=3D NULL) - rval =3D XFS_ILOG_DEXT; - else { - rval =3D 0; - error =3D xfs_bmbt_lookup_eq(bma->cur, LEFT.br_startoff, - LEFT.br_startblock, LEFT.br_blockcount, - &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - error =3D xfs_bmbt_update(bma->cur, LEFT.br_startoff, - LEFT.br_startblock, - LEFT.br_blockcount + - PREV.br_blockcount, LEFT.br_state); - if (error) - goto done; - } - break; + if (!cur) + return NULL; =20 - case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: - /* - * Filling in all of a previously delayed allocation extent. - * The right neighbor is contiguous, the left is not. - */ - trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_bmbt_set_startblock(ep, new->br_startblock); - xfs_bmbt_set_blockcount(ep, - PREV.br_blockcount + RIGHT.br_blockcount); - trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + for (i =3D 0; i < XFS_BTREE_MAXLEVELS; i++) { + if (!cur->bc_bufs[i]) + break; + if (XFS_BUF_ADDR(cur->bc_bufs[i]) =3D=3D bno) + return cur->bc_bufs[i]; + } =20 - xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); - if (bma->cur =3D=3D NULL) - rval =3D XFS_ILOG_DEXT; - else { - rval =3D 0; - error =3D xfs_bmbt_lookup_eq(bma->cur, RIGHT.br_startoff, - RIGHT.br_startblock, - RIGHT.br_blockcount, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - error =3D xfs_bmbt_update(bma->cur, PREV.br_startoff, - new->br_startblock, - PREV.br_blockcount + - RIGHT.br_blockcount, PREV.br_state); - if (error) - goto done; - } - break; + /* Chase down all the log items to see if the bp is there */ + list_for_each_entry(lidp, &cur->bc_tp->t_items, lid_trans) { + struct xfs_buf_log_item *bip; + bip =3D (struct xfs_buf_log_item *)lidp->lid_item; + if (bip->bli_item.li_type =3D=3D XFS_LI_BUF && + XFS_BUF_ADDR(bip->bli_buf) =3D=3D bno) + return bip->bli_buf; + } =20 - case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: - /* - * Filling in all of a previously delayed allocation extent. - * Neither the left nor right neighbors are contiguous with - * the new one. - */ - trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_bmbt_set_startblock(ep, new->br_startblock); - trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + return NULL; +} =20 - bma->ip->i_d.di_nextents++; - if (bma->cur =3D=3D NULL) - rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; - else { - rval =3D XFS_ILOG_CORE; - error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, - new->br_startblock, new->br_blockcount, - &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); - bma->cur->bc_rec.b.br_state =3D XFS_EXT_NORM; - error =3D xfs_btree_insert(bma->cur, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - } - break; +STATIC void +xfs_check_block( + struct xfs_btree_block *block, + xfs_mount_t *mp, + int root, + short sz) +{ + int i, j, dmxr; + __be64 *pp, *thispa; /* pointer to block address */ + xfs_bmbt_key_t *prevp, *keyp; =20 - case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: - /* - * Filling in the first part of a previous delayed allocation. - * The left neighbor is contiguous. - */ - trace_xfs_bmap_pre_update(bma->ip, bma->idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx - 1), - LEFT.br_blockcount + new->br_blockcount); - xfs_bmbt_set_startoff(ep, - PREV.br_startoff + new->br_blockcount); - trace_xfs_bmap_post_update(bma->ip, bma->idx - 1, state, _THIS_IP_); + ASSERT(be16_to_cpu(block->bb_level) > 0); =20 - temp =3D PREV.br_blockcount - new->br_blockcount; - trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, temp); - if (bma->cur =3D=3D NULL) - rval =3D XFS_ILOG_DEXT; - else { - rval =3D 0; - error =3D xfs_bmbt_lookup_eq(bma->cur, LEFT.br_startoff, - LEFT.br_startblock, LEFT.br_blockcount, - &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - error =3D xfs_bmbt_update(bma->cur, LEFT.br_startoff, - LEFT.br_startblock, - LEFT.br_blockcount + - new->br_blockcount, - LEFT.br_state); - if (error) - goto done; - } - da_new =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), - startblockval(PREV.br_startblock)); - xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); - trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + prevp =3D NULL; + for( i =3D 1; i <=3D xfs_btree_get_numrecs(block); i++) { + dmxr =3D mp->m_bmap_dmxr[0]; + keyp =3D XFS_BMBT_KEY_ADDR(mp, block, i); =20 - bma->idx--; - break; + if (prevp) { + ASSERT(be64_to_cpu(prevp->br_startoff) < + be64_to_cpu(keyp->br_startoff)); + } + prevp =3D keyp; =20 - case BMAP_LEFT_FILLING: /* - * Filling in the first part of a previous delayed allocation. - * The left neighbor is not contiguous. + * Compare the block numbers to see if there are dups. */ - trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_bmbt_set_startoff(ep, new_endoff); - temp =3D PREV.br_blockcount - new->br_blockcount; - xfs_bmbt_set_blockcount(ep, temp); - xfs_iext_insert(bma->ip, bma->idx, 1, new, state); - bma->ip->i_d.di_nextents++; - if (bma->cur =3D=3D NULL) - rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; - else { - rval =3D XFS_ILOG_CORE; - error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, - new->br_startblock, new->br_blockcount, - &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); - bma->cur->bc_rec.b.br_state =3D XFS_EXT_NORM; - error =3D xfs_btree_insert(bma->cur, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if (root) + pp =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, i, sz); + else + pp =3D XFS_BMBT_PTR_ADDR(mp, block, i, dmxr); + + for (j =3D i+1; j <=3D be16_to_cpu(block->bb_numrecs); j++) { + if (root) + thispa =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, j, sz); + else + thispa =3D XFS_BMBT_PTR_ADDR(mp, block, j, dmxr); + if (*thispa =3D=3D *pp) { + xfs_warn(mp, "%s: thispa(%d) =3D=3D pp(%d) %Ld", + __func__, j, i, + (unsigned long long)be64_to_cpu(*thispa)); + panic("%s: ptrs are equal in node\n", + __func__); + } } + } +} =20 - if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { - error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, - bma->firstblock, bma->flist, - &bma->cur, 1, &tmp_rval, XFS_DATA_FORK); - rval |=3D tmp_rval; +/* + * Check that the extents for the inode ip are in the right order in all + * btree leaves. + */ + +STATIC void +xfs_bmap_check_leaf_extents( + xfs_btree_cur_t *cur, /* btree cursor or null */ + xfs_inode_t *ip, /* incore inode pointer */ + int whichfork) /* data or attr fork */ +{ + struct xfs_btree_block *block; /* current btree block */ + xfs_fsblock_t bno; /* block # of "block" */ + xfs_buf_t *bp; /* buffer for "block" */ + int error; /* error return value */ + xfs_extnum_t i=3D0, j; /* index into the extents list */ + xfs_ifork_t *ifp; /* fork structure */ + int level; /* btree level, for checking */ + xfs_mount_t *mp; /* file system mount structure */ + __be64 *pp; /* pointer to block address */ + xfs_bmbt_rec_t *ep; /* pointer to current extent */ + xfs_bmbt_rec_t last =3D {0, 0}; /* last extent in prev block */ + xfs_bmbt_rec_t *nextp; /* pointer to next extent */ + int bp_release =3D 0; + + if (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE) { + return; + } + + bno =3D NULLFSBLOCK; + mp =3D ip->i_mount; + ifp =3D XFS_IFORK_PTR(ip, whichfork); + block =3D ifp->if_broot; + /* + * Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out. + */ + level =3D be16_to_cpu(block->bb_level); + ASSERT(level > 0); + xfs_check_block(block, mp, 1, ifp->if_broot_bytes); + pp =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes); + bno =3D be64_to_cpu(*pp); + + ASSERT(bno !=3D NULLDFSBNO); + ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount); + ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks); + + /* + * Go down the tree until leaf level is reached, following the first + * pointer (leftmost) at each level. + */ + while (level-- > 0) { + /* See if buf is in cur first */ + bp_release =3D 0; + bp =3D xfs_bmap_get_bp(cur, XFS_FSB_TO_DADDR(mp, bno)); + if (!bp) { + bp_release =3D 1; + error =3D xfs_btree_read_bufl(mp, NULL, bno, 0, &bp, + XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); if (error) - goto done; + goto error_norelse; } - da_new =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), - startblockval(PREV.br_startblock) - - (bma->cur ? bma->cur->bc_private.b.allocated : 0)); - ep =3D xfs_iext_get_ext(ifp, bma->idx + 1); - xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); - trace_xfs_bmap_post_update(bma->ip, bma->idx + 1, state, _THIS_IP_); - break; + block =3D XFS_BUF_TO_BLOCK(bp); + XFS_WANT_CORRUPTED_GOTO( + xfs_bmap_sanity_check(mp, bp, level), + error0); + if (level =3D=3D 0) + break; =20 - case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* - * Filling in the last part of a previous delayed allocation. - * The right neighbor is contiguous with the new allocation. + * Check this block for basic sanity (increasing keys and + * no duplicate blocks). */ - temp =3D PREV.br_blockcount - new->br_blockcount; - trace_xfs_bmap_pre_update(bma->ip, bma->idx + 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, temp); - xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, bma->idx + 1), - new->br_startoff, new->br_startblock, - new->br_blockcount + RIGHT.br_blockcount, - RIGHT.br_state); - trace_xfs_bmap_post_update(bma->ip, bma->idx + 1, state, _THIS_IP_); - if (bma->cur =3D=3D NULL) - rval =3D XFS_ILOG_DEXT; - else { - rval =3D 0; - error =3D xfs_bmbt_lookup_eq(bma->cur, RIGHT.br_startoff, - RIGHT.br_startblock, - RIGHT.br_blockcount, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - error =3D xfs_bmbt_update(bma->cur, new->br_startoff, - new->br_startblock, - new->br_blockcount + - RIGHT.br_blockcount, - RIGHT.br_state); - if (error) - goto done; + + xfs_check_block(block, mp, 0, 0); + pp =3D XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); + bno =3D be64_to_cpu(*pp); + XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); + if (bp_release) { + bp_release =3D 0; + xfs_trans_brelse(NULL, bp); } + } =20 - da_new =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), - startblockval(PREV.br_startblock)); - trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); - trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + /* + * Here with bp and block set to the leftmost leaf node in the tree. + */ + i =3D 0; =20 - bma->idx++; - break; + /* + * Loop over all leaf nodes checking that all extents are in the right or= der. + */ + for (;;) { + xfs_fsblock_t nextbno; + xfs_extnum_t num_recs; + + + num_recs =3D xfs_btree_get_numrecs(block); =20 - case BMAP_RIGHT_FILLING: /* - * Filling in the last part of a previous delayed allocation. - * The right neighbor is not contiguous. + * Read-ahead the next leaf block, if any. */ - temp =3D PREV.br_blockcount - new->br_blockcount; - trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, temp); - xfs_iext_insert(bma->ip, bma->idx + 1, 1, new, state); - bma->ip->i_d.di_nextents++; - if (bma->cur =3D=3D NULL) - rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; - else { - rval =3D XFS_ILOG_CORE; - error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, - new->br_startblock, new->br_blockcount, - &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); - bma->cur->bc_rec.b.br_state =3D XFS_EXT_NORM; - error =3D xfs_btree_insert(bma->cur, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - } =20 - if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { - error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, - bma->firstblock, bma->flist, &bma->cur, 1, - &tmp_rval, XFS_DATA_FORK); - rval |=3D tmp_rval; - if (error) - goto done; - } - da_new =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), - startblockval(PREV.br_startblock) - - (bma->cur ? bma->cur->bc_private.b.allocated : 0)); - ep =3D xfs_iext_get_ext(ifp, bma->idx); - xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); - trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + nextbno =3D be64_to_cpu(block->bb_u.l.bb_rightsib); =20 - bma->idx++; - break; + /* + * Check all the extents to make sure they are OK. + * If we had a previous block, the last entry should + * conform with the first entry in this one. + */ =20 - case 0: + ep =3D XFS_BMBT_REC_ADDR(mp, block, 1); + if (i) { + ASSERT(xfs_bmbt_disk_get_startoff(&last) + + xfs_bmbt_disk_get_blockcount(&last) <=3D + xfs_bmbt_disk_get_startoff(ep)); + } + for (j =3D 1; j < num_recs; j++) { + nextp =3D XFS_BMBT_REC_ADDR(mp, block, j + 1); + ASSERT(xfs_bmbt_disk_get_startoff(ep) + + xfs_bmbt_disk_get_blockcount(ep) <=3D + xfs_bmbt_disk_get_startoff(nextp)); + ep =3D nextp; + } + + last =3D *ep; + i +=3D num_recs; + if (bp_release) { + bp_release =3D 0; + xfs_trans_brelse(NULL, bp); + } + bno =3D nextbno; /* - * Filling in the middle part of a previous delayed allocation. - * Contiguity is impossible here. - * This case is avoided almost all the time. - * - * We start with a delayed allocation: - * - * +ddddddddddddddddddddddddddddddddddddddddddddddddddddddd+ - * PREV @ idx - * - * and we are allocating: - * +rrrrrrrrrrrrrrrrr+ - * new - * - * and we set it up for insertion as: - * +ddddddddddddddddddd+rrrrrrrrrrrrrrrrr+ddddddddddddddddd+ - * new - * PREV @ idx LEFT RIGHT - * inserted at idx + 1 + * If we've reached the end, stop. */ - temp =3D new->br_startoff - PREV.br_startoff; - temp2 =3D PREV.br_startoff + PREV.br_blockcount - new_endoff; - trace_xfs_bmap_pre_update(bma->ip, bma->idx, 0, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, temp); /* truncate PREV */ - LEFT =3D *new; - RIGHT.br_state =3D PREV.br_state; - RIGHT.br_startblock =3D nullstartblock( - (int)xfs_bmap_worst_indlen(bma->ip, temp2)); - RIGHT.br_startoff =3D new_endoff; - RIGHT.br_blockcount =3D temp2; - /* insert LEFT (r[0]) and RIGHT (r[1]) at the same time */ - xfs_iext_insert(bma->ip, bma->idx + 1, 2, &LEFT, state); - bma->ip->i_d.di_nextents++; - if (bma->cur =3D=3D NULL) - rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; - else { - rval =3D XFS_ILOG_CORE; - error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, - new->br_startblock, new->br_blockcount, - &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); - bma->cur->bc_rec.b.br_state =3D XFS_EXT_NORM; - error =3D xfs_btree_insert(bma->cur, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - } + if (bno =3D=3D NULLFSBLOCK) + break; =20 - if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { - error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, - bma->firstblock, bma->flist, &bma->cur, - 1, &tmp_rval, XFS_DATA_FORK); - rval |=3D tmp_rval; - if (error) - goto done; - } - temp =3D xfs_bmap_worst_indlen(bma->ip, temp); - temp2 =3D xfs_bmap_worst_indlen(bma->ip, temp2); - diff =3D (int)(temp + temp2 - startblockval(PREV.br_startblock) - - (bma->cur ? bma->cur->bc_private.b.allocated : 0)); - if (diff > 0) { - error =3D xfs_icsb_modify_counters(bma->ip->i_mount, - XFS_SBS_FDBLOCKS, - -((int64_t)diff), 0); - ASSERT(!error); + bp_release =3D 0; + bp =3D xfs_bmap_get_bp(cur, XFS_FSB_TO_DADDR(mp, bno)); + if (!bp) { + bp_release =3D 1; + error =3D xfs_btree_read_bufl(mp, NULL, bno, 0, &bp, + XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); if (error) - goto done; + goto error_norelse; } - - ep =3D xfs_iext_get_ext(ifp, bma->idx); - xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); - trace_xfs_bmap_pre_update(bma->ip, bma->idx + 2, state, _THIS_IP_); - xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, bma->idx + 2), - nullstartblock((int)temp2)); - trace_xfs_bmap_post_update(bma->ip, bma->idx + 2, state, _THIS_IP_); - - bma->idx++; - da_new =3D temp + temp2; - break; - - case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: - case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: - case BMAP_LEFT_FILLING | BMAP_RIGHT_CONTIG: - case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: - case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: - case BMAP_LEFT_CONTIG: - case BMAP_RIGHT_CONTIG: - /* - * These cases are all impossible. - */ - ASSERT(0); - } - - /* convert to a btree if necessary */ - if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { - int tmp_logflags; /* partial log flag return val */ - - ASSERT(bma->cur =3D=3D NULL); - error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, - bma->firstblock, bma->flist, &bma->cur, - da_old > 0, &tmp_logflags, XFS_DATA_FORK); - bma->logflags |=3D tmp_logflags; - if (error) - goto done; + block =3D XFS_BUF_TO_BLOCK(bp); } - - /* adjust for changes in reserved delayed indirect blocks */ - if (da_old || da_new) { - temp =3D da_new; - if (bma->cur) - temp +=3D bma->cur->bc_private.b.allocated; - ASSERT(temp <=3D da_old); - if (temp < da_old) - xfs_icsb_modify_counters(bma->ip->i_mount, - XFS_SBS_FDBLOCKS, - (int64_t)(da_old - temp), 0); + if (bp_release) { + bp_release =3D 0; + xfs_trans_brelse(NULL, bp); } + return; =20 - /* clear out the allocated field, done with it now in any case. */ - if (bma->cur) - bma->cur->bc_private.b.allocated =3D 0; - - xfs_bmap_check_leaf_extents(bma->cur, bma->ip, XFS_DATA_FORK); -done: - bma->logflags |=3D rval; - return error; -#undef LEFT -#undef RIGHT -#undef PREV +error0: + xfs_warn(mp, "%s: at error0", __func__); + if (bp_release) + xfs_trans_brelse(NULL, bp); +error_norelse: + xfs_warn(mp, "%s: BAD after btree leaves for %d extents", + __func__, i); + panic("%s: CORRUPTED BTREE OR SOMETHING", __func__); + return; } =20 /* - * Convert an unwritten allocation to a real allocation or vice versa. + * Add bmap trace insert entries for all the contents of the extent record= s. */ -STATIC int /* error */ -xfs_bmap_add_extent_unwritten_real( - struct xfs_trans *tp, - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t *idx, /* extent number to update/insert */ - xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ - xfs_bmbt_irec_t *new, /* new data to add to file extents */ - xfs_fsblock_t *first, /* pointer to firstblock variable */ - xfs_bmap_free_t *flist, /* list of extents to be freed */ - int *logflagsp) /* inode logging flags */ +void +xfs_bmap_trace_exlist( + xfs_inode_t *ip, /* incore inode pointer */ + xfs_extnum_t cnt, /* count of entries in the list */ + int whichfork, /* data or attr fork */ + unsigned long caller_ip) { - xfs_btree_cur_t *cur; /* btree cursor */ - xfs_bmbt_rec_host_t *ep; /* extent entry for idx */ - int error; /* error return value */ - int i; /* temp state */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_fileoff_t new_endoff; /* end offset of new entry */ - xfs_exntst_t newext; /* new extent state */ - xfs_exntst_t oldext; /* old extent state */ - xfs_bmbt_irec_t r[3]; /* neighbor extent entries */ - /* left is 0, right is 1, prev is 2 */ - int rval=3D0; /* return value (logging flags) */ - int state =3D 0;/* state bits, accessed thru macros */ - - *logflagsp =3D 0; + xfs_extnum_t idx; /* extent record index */ + xfs_ifork_t *ifp; /* inode fork pointer */ + int state =3D 0; =20 - cur =3D *curp; - ifp =3D XFS_IFORK_PTR(ip, XFS_DATA_FORK); + if (whichfork =3D=3D XFS_ATTR_FORK) + state |=3D BMAP_ATTRFORK; =20 - ASSERT(*idx >=3D 0); - ASSERT(*idx <=3D ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); - ASSERT(!isnullstartblock(new->br_startblock)); + ifp =3D XFS_IFORK_PTR(ip, whichfork); + ASSERT(cnt =3D=3D (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))); + for (idx =3D 0; idx < cnt; idx++) + trace_xfs_extlist(ip, idx, whichfork, caller_ip); +} =20 - XFS_STATS_INC(xs_add_exlist); +/* + * Validate that the bmbt_irecs being returned from bmapi are valid + * given the callers original parameters. Specifically check the + * ranges of the returned irecs to ensure that they only extent beyond + * the given parameters if the XFS_BMAPI_ENTIRE flag was set. + */ +STATIC void +xfs_bmap_validate_ret( + xfs_fileoff_t bno, + xfs_filblks_t len, + int flags, + xfs_bmbt_irec_t *mval, + int nmap, + int ret_nmap) +{ + int i; /* index to map values */ =20 -#define LEFT r[0] -#define RIGHT r[1] -#define PREV r[2] + ASSERT(ret_nmap <=3D nmap); =20 - /* - * Set up a bunch of variables to make the tests simpler. - */ - error =3D 0; - ep =3D xfs_iext_get_ext(ifp, *idx); - xfs_bmbt_get_all(ep, &PREV); - newext =3D new->br_state; - oldext =3D (newext =3D=3D XFS_EXT_UNWRITTEN) ? - XFS_EXT_NORM : XFS_EXT_UNWRITTEN; - ASSERT(PREV.br_state =3D=3D oldext); - new_endoff =3D new->br_startoff + new->br_blockcount; - ASSERT(PREV.br_startoff <=3D new->br_startoff); - ASSERT(PREV.br_startoff + PREV.br_blockcount >=3D new_endoff); + for (i =3D 0; i < ret_nmap; i++) { + ASSERT(mval[i].br_blockcount > 0); + if (!(flags & XFS_BMAPI_ENTIRE)) { + ASSERT(mval[i].br_startoff >=3D bno); + ASSERT(mval[i].br_blockcount <=3D len); + ASSERT(mval[i].br_startoff + mval[i].br_blockcount <=3D + bno + len); + } else { + ASSERT(mval[i].br_startoff < bno + len); + ASSERT(mval[i].br_startoff + mval[i].br_blockcount > + bno); + } + ASSERT(i =3D=3D 0 || + mval[i - 1].br_startoff + mval[i - 1].br_blockcount =3D=3D + mval[i].br_startoff); + ASSERT(mval[i].br_startblock !=3D DELAYSTARTBLOCK && + mval[i].br_startblock !=3D HOLESTARTBLOCK); + ASSERT(mval[i].br_state =3D=3D XFS_EXT_NORM || + mval[i].br_state =3D=3D XFS_EXT_UNWRITTEN); + } +} =20 - /* - * Set flags determining what part of the previous oldext allocation - * extent is being replaced by a newext allocation. - */ - if (PREV.br_startoff =3D=3D new->br_startoff) - state |=3D BMAP_LEFT_FILLING; - if (PREV.br_startoff + PREV.br_blockcount =3D=3D new_endoff) - state |=3D BMAP_RIGHT_FILLING; +#else +#define xfs_bmap_check_leaf_extents(cur, ip, whichfork) do { } while (0) +#define xfs_bmap_validate_ret(bno,len,flags,mval,onmap,nmap) +#endif /* DEBUG */ =20 - /* - * Check and set flags if this segment has a left neighbor. - * Don't set contiguous if the combined extent would be too large. - */ - if (*idx > 0) { - state |=3D BMAP_LEFT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx - 1), &LEFT); +/* + * bmap free list manipulation functions + */ =20 - if (isnullstartblock(LEFT.br_startblock)) - state |=3D BMAP_LEFT_DELAY; - } - - if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && - LEFT.br_startoff + LEFT.br_blockcount =3D=3D new->br_startoff && - LEFT.br_startblock + LEFT.br_blockcount =3D=3D new->br_startblock && - LEFT.br_state =3D=3D newext && - LEFT.br_blockcount + new->br_blockcount <=3D MAXEXTLEN) - state |=3D BMAP_LEFT_CONTIG; +/* + * Add the extent to the list of extents to be free at transaction end. + * The list is maintained sorted (by block number). + */ +void +xfs_bmap_add_free( + xfs_fsblock_t bno, /* fs block number of extent */ + xfs_filblks_t len, /* length of extent */ + xfs_bmap_free_t *flist, /* list of extents */ + xfs_mount_t *mp) /* mount point structure */ +{ + xfs_bmap_free_item_t *cur; /* current (next) element */ + xfs_bmap_free_item_t *new; /* new element */ + xfs_bmap_free_item_t *prev; /* previous element */ +#ifdef DEBUG + xfs_agnumber_t agno; + xfs_agblock_t agbno; =20 - /* - * Check and set flags if this segment has a right neighbor. - * Don't set contiguous if the combined extent would be too large. - * Also check for all-three-contiguous being too large. - */ - if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { - state |=3D BMAP_RIGHT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx + 1), &RIGHT); - if (isnullstartblock(RIGHT.br_startblock)) - state |=3D BMAP_RIGHT_DELAY; + ASSERT(bno !=3D NULLFSBLOCK); + ASSERT(len > 0); + ASSERT(len <=3D MAXEXTLEN); + ASSERT(!isnullstartblock(bno)); + agno =3D XFS_FSB_TO_AGNO(mp, bno); + agbno =3D XFS_FSB_TO_AGBNO(mp, bno); + ASSERT(agno < mp->m_sb.sb_agcount); + ASSERT(agbno < mp->m_sb.sb_agblocks); + ASSERT(len < mp->m_sb.sb_agblocks); + ASSERT(agbno + len <=3D mp->m_sb.sb_agblocks); +#endif + ASSERT(xfs_bmap_free_item_zone !=3D NULL); + new =3D kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP); + new->xbfi_startblock =3D bno; + new->xbfi_blockcount =3D (xfs_extlen_t)len; + for (prev =3D NULL, cur =3D flist->xbf_first; + cur !=3D NULL; + prev =3D cur, cur =3D cur->xbfi_next) { + if (cur->xbfi_startblock >=3D bno) + break; } + if (prev) + prev->xbfi_next =3D new; + else + flist->xbf_first =3D new; + new->xbfi_next =3D cur; + flist->xbf_count++; +} =20 - if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && - new_endoff =3D=3D RIGHT.br_startoff && - new->br_startblock + new->br_blockcount =3D=3D RIGHT.br_startblock && - newext =3D=3D RIGHT.br_state && - new->br_blockcount + RIGHT.br_blockcount <=3D MAXEXTLEN && - ((state & (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | - BMAP_RIGHT_FILLING)) !=3D - (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | - BMAP_RIGHT_FILLING) || - LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount - <=3D MAXEXTLEN)) - state |=3D BMAP_RIGHT_CONTIG; +/* + * Remove the entry "free" from the free item list. Prev points to the + * previous entry, unless "free" is the head of the list. + */ +void +xfs_bmap_del_free( + xfs_bmap_free_t *flist, /* free item list header */ + xfs_bmap_free_item_t *prev, /* previous item on list, if any */ + xfs_bmap_free_item_t *free) /* list item to be freed */ +{ + if (prev) + prev->xbfi_next =3D free->xbfi_next; + else + flist->xbf_first =3D free->xbfi_next; + flist->xbf_count--; + kmem_zone_free(xfs_bmap_free_item_zone, free); +} =20 - /* - * Switch out based on the FILLING and CONTIG state bits. - */ - switch (state & (BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | - BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG)) { - case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | - BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: - /* - * Setting all of a previous oldext extent to newext. - * The left and right neighbors are both contiguous with new. - */ - --*idx; =20 - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), - LEFT.br_blockcount + PREV.br_blockcount + - RIGHT.br_blockcount); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); +/* + * Free up any items left in the list. + */ +void +xfs_bmap_cancel( + xfs_bmap_free_t *flist) /* list of bmap_free_items */ +{ + xfs_bmap_free_item_t *free; /* free list item */ + xfs_bmap_free_item_t *next; =20 - xfs_iext_remove(ip, *idx + 1, 2, state); - ip->i_d.di_nextents -=3D 2; - if (cur =3D=3D NULL) - rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; - else { - rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, RIGHT.br_startoff, - RIGHT.br_startblock, - RIGHT.br_blockcount, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_btree_delete(cur, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_btree_decrement(cur, 0, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_btree_delete(cur, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_btree_decrement(cur, 0, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, LEFT.br_startoff, - LEFT.br_startblock, - LEFT.br_blockcount + PREV.br_blockcount + - RIGHT.br_blockcount, LEFT.br_state))) - goto done; - } - break; + if (flist->xbf_count =3D=3D 0) + return; + ASSERT(flist->xbf_first !=3D NULL); + for (free =3D flist->xbf_first; free; free =3D next) { + next =3D free->xbfi_next; + xfs_bmap_del_free(flist, NULL, free); + } + ASSERT(flist->xbf_count =3D=3D 0); +} =20 - case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: - /* - * Setting all of a previous oldext extent to newext. - * The left neighbor is contiguous, the right is not. - */ - --*idx; +/* + * Inode fork format manipulation functions + */ =20 - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), - LEFT.br_blockcount + PREV.br_blockcount); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); +/* + * Transform a btree format file with only one leaf node, where the + * extents list will fit in the inode, into an extents format file. + * Since the file extents are already in-core, all we have to do is + * give up the space for the btree root and pitch the leaf block. + */ +STATIC int /* error */ +xfs_bmap_btree_to_extents( + xfs_trans_t *tp, /* transaction pointer */ + xfs_inode_t *ip, /* incore inode pointer */ + xfs_btree_cur_t *cur, /* btree cursor */ + int *logflagsp, /* inode logging flags */ + int whichfork) /* data or attr fork */ +{ + /* REFERENCED */ + struct xfs_btree_block *cblock;/* child btree block */ + xfs_fsblock_t cbno; /* child block number */ + xfs_buf_t *cbp; /* child block's buffer */ + int error; /* error return value */ + xfs_ifork_t *ifp; /* inode fork data */ + xfs_mount_t *mp; /* mount point structure */ + __be64 *pp; /* ptr to block address */ + struct xfs_btree_block *rblock;/* root btree block */ =20 - xfs_iext_remove(ip, *idx + 1, 1, state); - ip->i_d.di_nextents--; - if (cur =3D=3D NULL) - rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; - else { - rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, PREV.br_startoff, - PREV.br_startblock, PREV.br_blockcount, - &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_btree_delete(cur, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_btree_decrement(cur, 0, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, LEFT.br_startoff, - LEFT.br_startblock, - LEFT.br_blockcount + PREV.br_blockcount, - LEFT.br_state))) - goto done; - } - break; - - case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: - /* - * Setting all of a previous oldext extent to newext. - * The right neighbor is contiguous, the left is not. - */ - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, - PREV.br_blockcount + RIGHT.br_blockcount); - xfs_bmbt_set_state(ep, newext); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - xfs_iext_remove(ip, *idx + 1, 1, state); - ip->i_d.di_nextents--; - if (cur =3D=3D NULL) - rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; - else { - rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, RIGHT.br_startoff, - RIGHT.br_startblock, - RIGHT.br_blockcount, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_btree_delete(cur, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_btree_decrement(cur, 0, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, new->br_startoff, - new->br_startblock, - new->br_blockcount + RIGHT.br_blockcount, - newext))) - goto done; - } - break; - - case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: - /* - * Setting all of a previous oldext extent to newext. - * Neither the left nor right neighbors are contiguous with - * the new one. - */ - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_state(ep, newext); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - - if (cur =3D=3D NULL) - rval =3D XFS_ILOG_DEXT; - else { - rval =3D 0; - if ((error =3D xfs_bmbt_lookup_eq(cur, new->br_startoff, - new->br_startblock, new->br_blockcount, - &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, new->br_startoff, - new->br_startblock, new->br_blockcount, - newext))) - goto done; - } - break; - - case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: - /* - * Setting the first part of a previous oldext extent to newext. - * The left neighbor is contiguous. - */ - trace_xfs_bmap_pre_update(ip, *idx - 1, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx - 1), - LEFT.br_blockcount + new->br_blockcount); - xfs_bmbt_set_startoff(ep, - PREV.br_startoff + new->br_blockcount); - trace_xfs_bmap_post_update(ip, *idx - 1, state, _THIS_IP_); - - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_startblock(ep, - new->br_startblock + new->br_blockcount); - xfs_bmbt_set_blockcount(ep, - PREV.br_blockcount - new->br_blockcount); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - - --*idx; - - if (cur =3D=3D NULL) - rval =3D XFS_ILOG_DEXT; - else { - rval =3D 0; - if ((error =3D xfs_bmbt_lookup_eq(cur, PREV.br_startoff, - PREV.br_startblock, PREV.br_blockcount, - &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, - PREV.br_startoff + new->br_blockcount, - PREV.br_startblock + new->br_blockcount, - PREV.br_blockcount - new->br_blockcount, - oldext))) - goto done; - if ((error =3D xfs_btree_decrement(cur, 0, &i))) - goto done; - error =3D xfs_bmbt_update(cur, LEFT.br_startoff, - LEFT.br_startblock, - LEFT.br_blockcount + new->br_blockcount, - LEFT.br_state); - if (error) - goto done; - } - break; - - case BMAP_LEFT_FILLING: - /* - * Setting the first part of a previous oldext extent to newext. - * The left neighbor is not contiguous. - */ - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - ASSERT(ep && xfs_bmbt_get_state(ep) =3D=3D oldext); - xfs_bmbt_set_startoff(ep, new_endoff); - xfs_bmbt_set_blockcount(ep, - PREV.br_blockcount - new->br_blockcount); - xfs_bmbt_set_startblock(ep, - new->br_startblock + new->br_blockcount); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - - xfs_iext_insert(ip, *idx, 1, new, state); - ip->i_d.di_nextents++; - if (cur =3D=3D NULL) - rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; - else { - rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, PREV.br_startoff, - PREV.br_startblock, PREV.br_blockcount, - &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, - PREV.br_startoff + new->br_blockcount, - PREV.br_startblock + new->br_blockcount, - PREV.br_blockcount - new->br_blockcount, - oldext))) - goto done; - cur->bc_rec.b =3D *new; - if ((error =3D xfs_btree_insert(cur, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - } - break; - - case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: - /* - * Setting the last part of a previous oldext extent to newext. - * The right neighbor is contiguous with the new allocation. - */ - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, - PREV.br_blockcount - new->br_blockcount); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - - ++*idx; - - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, *idx), - new->br_startoff, new->br_startblock, - new->br_blockcount + RIGHT.br_blockcount, newext); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - - if (cur =3D=3D NULL) - rval =3D XFS_ILOG_DEXT; - else { - rval =3D 0; - if ((error =3D xfs_bmbt_lookup_eq(cur, PREV.br_startoff, - PREV.br_startblock, - PREV.br_blockcount, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, PREV.br_startoff, - PREV.br_startblock, - PREV.br_blockcount - new->br_blockcount, - oldext))) - goto done; - if ((error =3D xfs_btree_increment(cur, 0, &i))) - goto done; - if ((error =3D xfs_bmbt_update(cur, new->br_startoff, - new->br_startblock, - new->br_blockcount + RIGHT.br_blockcount, - newext))) - goto done; - } - break; - - case BMAP_RIGHT_FILLING: - /* - * Setting the last part of a previous oldext extent to newext. - * The right neighbor is not contiguous. - */ - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, - PREV.br_blockcount - new->br_blockcount); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - - ++*idx; - xfs_iext_insert(ip, *idx, 1, new, state); - - ip->i_d.di_nextents++; - if (cur =3D=3D NULL) - rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; - else { - rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, PREV.br_startoff, - PREV.br_startblock, PREV.br_blockcount, - &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - if ((error =3D xfs_bmbt_update(cur, PREV.br_startoff, - PREV.br_startblock, - PREV.br_blockcount - new->br_blockcount, - oldext))) - goto done; - if ((error =3D xfs_bmbt_lookup_eq(cur, new->br_startoff, - new->br_startblock, new->br_blockcount, - &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); - cur->bc_rec.b.br_state =3D XFS_EXT_NORM; - if ((error =3D xfs_btree_insert(cur, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - } - break; - - case 0: - /* - * Setting the middle part of a previous oldext extent to - * newext. Contiguity is impossible here. - * One extent becomes three extents. - */ - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, - new->br_startoff - PREV.br_startoff); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - - r[0] =3D *new; - r[1].br_startoff =3D new_endoff; - r[1].br_blockcount =3D - PREV.br_startoff + PREV.br_blockcount - new_endoff; - r[1].br_startblock =3D new->br_startblock + new->br_blockcount; - r[1].br_state =3D oldext; - - ++*idx; - xfs_iext_insert(ip, *idx, 2, &r[0], state); - - ip->i_d.di_nextents +=3D 2; - if (cur =3D=3D NULL) - rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; - else { - rval =3D XFS_ILOG_CORE; - if ((error =3D xfs_bmbt_lookup_eq(cur, PREV.br_startoff, - PREV.br_startblock, PREV.br_blockcount, - &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - /* new right extent - oldext */ - if ((error =3D xfs_bmbt_update(cur, r[1].br_startoff, - r[1].br_startblock, r[1].br_blockcount, - r[1].br_state))) - goto done; - /* new left extent - oldext */ - cur->bc_rec.b =3D PREV; - cur->bc_rec.b.br_blockcount =3D - new->br_startoff - PREV.br_startoff; - if ((error =3D xfs_btree_insert(cur, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - /* - * Reset the cursor to the position of the new extent - * we are about to insert as we can't trust it after - * the previous insert. - */ - if ((error =3D xfs_bmbt_lookup_eq(cur, new->br_startoff, - new->br_startblock, new->br_blockcount, - &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); - /* new middle extent - newext */ - cur->bc_rec.b.br_state =3D new->br_state; - if ((error =3D xfs_btree_insert(cur, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - } - break; - - case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: - case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: - case BMAP_LEFT_FILLING | BMAP_RIGHT_CONTIG: - case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: - case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: - case BMAP_LEFT_CONTIG: - case BMAP_RIGHT_CONTIG: - /* - * These cases are all impossible. - */ - ASSERT(0); - } - - /* convert to a btree if necessary */ - if (xfs_bmap_needs_btree(ip, XFS_DATA_FORK)) { - int tmp_logflags; /* partial log flag return val */ - - ASSERT(cur =3D=3D NULL); - error =3D xfs_bmap_extents_to_btree(tp, ip, first, flist, &cur, - 0, &tmp_logflags, XFS_DATA_FORK); - *logflagsp |=3D tmp_logflags; - if (error) - goto done; - } - - /* clear out the allocated field, done with it now in any case. */ - if (cur) { - cur->bc_private.b.allocated =3D 0; - *curp =3D cur; - } - - xfs_bmap_check_leaf_extents(*curp, ip, XFS_DATA_FORK); -done: - *logflagsp |=3D rval; - return error; -#undef LEFT -#undef RIGHT -#undef PREV -} + mp =3D ip->i_mount; + ifp =3D XFS_IFORK_PTR(ip, whichfork); + ASSERT(ifp->if_flags & XFS_IFEXTENTS); + ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_BTREE); + rblock =3D ifp->if_broot; + ASSERT(be16_to_cpu(rblock->bb_level) =3D=3D 1); + ASSERT(be16_to_cpu(rblock->bb_numrecs) =3D=3D 1); + ASSERT(xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0) =3D=3D 1); + pp =3D XFS_BMAP_BROOT_PTR_ADDR(mp, rblock, 1, ifp->if_broot_bytes); + cbno =3D be64_to_cpu(*pp); + *logflagsp =3D 0; +#ifdef DEBUG + if ((error =3D xfs_btree_check_lptr(cur, cbno, 1))) + return error; +#endif + error =3D xfs_btree_read_bufl(mp, tp, cbno, 0, &cbp, XFS_BMAP_BTREE_REF, + &xfs_bmbt_buf_ops); + if (error) + return error; + cblock =3D XFS_BUF_TO_BLOCK(cbp); + if ((error =3D xfs_btree_check_block(cur, cblock, 0, cbp))) + return error; + xfs_bmap_add_free(cbno, 1, cur->bc_private.b.flist, mp); + ip->i_d.di_nblocks--; + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); + xfs_trans_binval(tp, cbp); + if (cur->bc_bufs[0] =3D=3D cbp) + cur->bc_bufs[0] =3D NULL; + xfs_iroot_realloc(ip, -1, whichfork); + ASSERT(ifp->if_broot =3D=3D NULL); + ASSERT((ifp->if_flags & XFS_IFBROOT) =3D=3D 0); + XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); + *logflagsp =3D XFS_ILOG_CORE | xfs_ilog_fext(whichfork); + return 0; +} =20 /* - * Convert a hole to a delayed allocation. + * Convert an extents-format file into a btree-format file. + * The new file will have a root block (in the inode) and a single child b= lock. */ -STATIC void -xfs_bmap_add_extent_hole_delay( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t *idx, /* extent number to update/insert */ - xfs_bmbt_irec_t *new) /* new data to add to file extents */ +STATIC int /* error */ +xfs_bmap_extents_to_btree( + xfs_trans_t *tp, /* transaction pointer */ + xfs_inode_t *ip, /* incore inode pointer */ + xfs_fsblock_t *firstblock, /* first-block-allocated */ + xfs_bmap_free_t *flist, /* blocks freed in xaction */ + xfs_btree_cur_t **curp, /* cursor returned to caller */ + int wasdel, /* converting a delayed alloc */ + int *logflagsp, /* inode logging flags */ + int whichfork) /* data or attr fork */ { - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_bmbt_irec_t left; /* left neighbor extent entry */ - xfs_filblks_t newlen=3D0; /* new indirect size */ - xfs_filblks_t oldlen=3D0; /* old indirect size */ - xfs_bmbt_irec_t right; /* right neighbor extent entry */ - int state; /* state bits, accessed thru macros */ - xfs_filblks_t temp=3D0; /* temp for indirect calculations */ + struct xfs_btree_block *ablock; /* allocated (child) bt block */ + xfs_buf_t *abp; /* buffer for ablock */ + xfs_alloc_arg_t args; /* allocation arguments */ + xfs_bmbt_rec_t *arp; /* child record pointer */ + struct xfs_btree_block *block; /* btree root block */ + xfs_btree_cur_t *cur; /* bmap btree cursor */ + xfs_bmbt_rec_host_t *ep; /* extent record pointer */ + int error; /* error return value */ + xfs_extnum_t i, cnt; /* extent record index */ + xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_bmbt_key_t *kp; /* root block key pointer */ + xfs_mount_t *mp; /* mount structure */ + xfs_extnum_t nextents; /* number of file extents */ + xfs_bmbt_ptr_t *pp; /* root block address pointer */ =20 - ifp =3D XFS_IFORK_PTR(ip, XFS_DATA_FORK); - state =3D 0; - ASSERT(isnullstartblock(new->br_startblock)); + ifp =3D XFS_IFORK_PTR(ip, whichfork); + ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS); =20 /* - * Check and set flags if this segment has a left neighbor + * Make space in the inode incore. */ - if (*idx > 0) { - state |=3D BMAP_LEFT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx - 1), &left); - - if (isnullstartblock(left.br_startblock)) - state |=3D BMAP_LEFT_DELAY; - } + xfs_iroot_realloc(ip, 1, whichfork); + ifp->if_flags |=3D XFS_IFBROOT; =20 /* - * Check and set flags if the current (right) segment exists. - * If it doesn't exist, we're converting the hole at end-of-file. + * Fill in the root. */ - if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { - state |=3D BMAP_RIGHT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx), &right); + block =3D ifp->if_broot; + block->bb_magic =3D cpu_to_be32(XFS_BMAP_MAGIC); + block->bb_level =3D cpu_to_be16(1); + block->bb_numrecs =3D cpu_to_be16(1); + block->bb_u.l.bb_leftsib =3D cpu_to_be64(NULLDFSBNO); + block->bb_u.l.bb_rightsib =3D cpu_to_be64(NULLDFSBNO); =20 - if (isnullstartblock(right.br_startblock)) - state |=3D BMAP_RIGHT_DELAY; + /* + * Need a cursor. Can't allocate until bb_level is filled in. + */ + mp =3D ip->i_mount; + cur =3D xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock =3D *firstblock; + cur->bc_private.b.flist =3D flist; + cur->bc_private.b.flags =3D wasdel ? XFS_BTCUR_BPRV_WASDEL : 0; + /* + * Convert to a btree with two levels, one record in root. + */ + XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_BTREE); + memset(&args, 0, sizeof(args)); + args.tp =3D tp; + args.mp =3D mp; + args.firstblock =3D *firstblock; + if (*firstblock =3D=3D NULLFSBLOCK) { + args.type =3D XFS_ALLOCTYPE_START_BNO; + args.fsbno =3D XFS_INO_TO_FSB(mp, ip->i_ino); + } else if (flist->xbf_low) { + args.type =3D XFS_ALLOCTYPE_START_BNO; + args.fsbno =3D *firstblock; + } else { + args.type =3D XFS_ALLOCTYPE_NEAR_BNO; + args.fsbno =3D *firstblock; + } + args.minlen =3D args.maxlen =3D args.prod =3D 1; + args.wasdel =3D wasdel; + *logflagsp =3D 0; + if ((error =3D xfs_alloc_vextent(&args))) { + xfs_iroot_realloc(ip, -1, whichfork); + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; } - /* - * Set contiguity flags on the left and right neighbors. - * Don't let extents get too large, even if the pieces are contiguous. + * Allocation can't fail, the space was reserved. */ - if ((state & BMAP_LEFT_VALID) && (state & BMAP_LEFT_DELAY) && - left.br_startoff + left.br_blockcount =3D=3D new->br_startoff && - left.br_blockcount + new->br_blockcount <=3D MAXEXTLEN) - state |=3D BMAP_LEFT_CONTIG; - - if ((state & BMAP_RIGHT_VALID) && (state & BMAP_RIGHT_DELAY) && - new->br_startoff + new->br_blockcount =3D=3D right.br_startoff && - new->br_blockcount + right.br_blockcount <=3D MAXEXTLEN && - (!(state & BMAP_LEFT_CONTIG) || - (left.br_blockcount + new->br_blockcount + - right.br_blockcount <=3D MAXEXTLEN))) - state |=3D BMAP_RIGHT_CONTIG; - + ASSERT(args.fsbno !=3D NULLFSBLOCK); + ASSERT(*firstblock =3D=3D NULLFSBLOCK || + args.agno =3D=3D XFS_FSB_TO_AGNO(mp, *firstblock) || + (flist->xbf_low && + args.agno > XFS_FSB_TO_AGNO(mp, *firstblock))); + *firstblock =3D cur->bc_private.b.firstblock =3D args.fsbno; + cur->bc_private.b.allocated++; + ip->i_d.di_nblocks++; + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L); + abp =3D xfs_btree_get_bufl(mp, tp, args.fsbno, 0); /* - * Switch out based on the contiguity flags. + * Fill in the child block. */ - switch (state & (BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG)) { - case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: - /* - * New allocation is contiguous with delayed allocations - * on the left and on the right. - * Merge all three into a single extent record. - */ - --*idx; - temp =3D left.br_blockcount + new->br_blockcount + - right.br_blockcount; - - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), temp); - oldlen =3D startblockval(left.br_startblock) + - startblockval(new->br_startblock) + - startblockval(right.br_startblock); - newlen =3D xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, *idx), - nullstartblock((int)newlen)); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + abp->b_ops =3D &xfs_bmbt_buf_ops; + ablock =3D XFS_BUF_TO_BLOCK(abp); + ablock->bb_magic =3D cpu_to_be32(XFS_BMAP_MAGIC); + ablock->bb_level =3D 0; + ablock->bb_u.l.bb_leftsib =3D cpu_to_be64(NULLDFSBNO); + ablock->bb_u.l.bb_rightsib =3D cpu_to_be64(NULLDFSBNO); + arp =3D XFS_BMBT_REC_ADDR(mp, ablock, 1); + nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + for (cnt =3D i =3D 0; i < nextents; i++) { + ep =3D xfs_iext_get_ext(ifp, i); + if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) { + arp->l0 =3D cpu_to_be64(ep->l0); + arp->l1 =3D cpu_to_be64(ep->l1); + arp++; cnt++; + } + } + ASSERT(cnt =3D=3D XFS_IFORK_NEXTENTS(ip, whichfork)); + xfs_btree_set_numrecs(ablock, cnt); =20 - xfs_iext_remove(ip, *idx + 1, 1, state); - break; + /* + * Fill in the root key and pointer. + */ + kp =3D XFS_BMBT_KEY_ADDR(mp, block, 1); + arp =3D XFS_BMBT_REC_ADDR(mp, ablock, 1); + kp->br_startoff =3D cpu_to_be64(xfs_bmbt_disk_get_startoff(arp)); + pp =3D XFS_BMBT_PTR_ADDR(mp, block, 1, xfs_bmbt_get_maxrecs(cur, + be16_to_cpu(block->bb_level))); + *pp =3D cpu_to_be64(args.fsbno); =20 - case BMAP_LEFT_CONTIG: - /* - * New allocation is contiguous with a delayed allocation - * on the left. - * Merge the new allocation with the left neighbor. - */ - --*idx; - temp =3D left.br_blockcount + new->br_blockcount; + /* + * Do all this logging at the end so that + * the root is at the right level. + */ + xfs_btree_log_block(cur, abp, XFS_BB_ALL_BITS); + xfs_btree_log_recs(cur, abp, 1, be16_to_cpu(ablock->bb_numrecs)); + ASSERT(*curp =3D=3D NULL); + *curp =3D cur; + *logflagsp =3D XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork); + return 0; +} =20 - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), temp); - oldlen =3D startblockval(left.br_startblock) + - startblockval(new->br_startblock); - newlen =3D xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, *idx), - nullstartblock((int)newlen)); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - break; +/* + * Convert a local file to an extents file. + * This code is out of bounds for data forks of regular files, + * since the file data needs to get logged so things will stay consistent. + * (The bmap-level manipulations are ok, though). + */ +STATIC int /* error */ +xfs_bmap_local_to_extents( + xfs_trans_t *tp, /* transaction pointer */ + xfs_inode_t *ip, /* incore inode pointer */ + xfs_fsblock_t *firstblock, /* first block allocated in xaction */ + xfs_extlen_t total, /* total blocks needed by transaction */ + int *logflagsp, /* inode logging flags */ + int whichfork, + void (*init_fn)(struct xfs_buf *bp, + struct xfs_inode *ip, + struct xfs_ifork *ifp)) +{ + int error; /* error return value */ + int flags; /* logging flags returned */ + xfs_ifork_t *ifp; /* inode fork pointer */ =20 - case BMAP_RIGHT_CONTIG: - /* - * New allocation is contiguous with a delayed allocation - * on the right. - * Merge the new allocation with the right neighbor. - */ - trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - temp =3D new->br_blockcount + right.br_blockcount; - oldlen =3D startblockval(new->br_startblock) + - startblockval(right.br_startblock); - newlen =3D xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, *idx), - new->br_startoff, - nullstartblock((int)newlen), temp, right.br_state); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - break; + /* + * We don't want to deal with the case of keeping inode data inline yet. + * So sending the data fork of a regular inode is invalid. + */ + ASSERT(!(S_ISREG(ip->i_d.di_mode) && whichfork =3D=3D XFS_DATA_FORK)); + ifp =3D XFS_IFORK_PTR(ip, whichfork); + ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL); + flags =3D 0; + error =3D 0; + if (ifp->if_bytes) { + xfs_alloc_arg_t args; /* allocation arguments */ + xfs_buf_t *bp; /* buffer for extent block */ + xfs_bmbt_rec_host_t *ep;/* extent record pointer */ =20 - case 0: - /* - * New allocation is not contiguous with another - * delayed allocation. - * Insert a new entry. - */ - oldlen =3D newlen =3D 0; - xfs_iext_insert(ip, *idx, 1, new, state); - break; - } - if (oldlen !=3D newlen) { - ASSERT(oldlen > newlen); - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, - (int64_t)(oldlen - newlen), 0); + ASSERT((ifp->if_flags & + (XFS_IFINLINE|XFS_IFEXTENTS|XFS_IFEXTIREC)) =3D=3D XFS_IFINLINE); + memset(&args, 0, sizeof(args)); + args.tp =3D tp; + args.mp =3D ip->i_mount; + args.firstblock =3D *firstblock; /* - * Nothing to do for disk quota accounting here. + * Allocate a block. We know we need only one, since the + * file currently fits in an inode. */ + if (*firstblock =3D=3D NULLFSBLOCK) { + args.fsbno =3D XFS_INO_TO_FSB(args.mp, ip->i_ino); + args.type =3D XFS_ALLOCTYPE_START_BNO; + } else { + args.fsbno =3D *firstblock; + args.type =3D XFS_ALLOCTYPE_NEAR_BNO; + } + args.total =3D total; + args.minlen =3D args.maxlen =3D args.prod =3D 1; + error =3D xfs_alloc_vextent(&args); + if (error) + goto done; + + /* Can't fail, the space was reserved. */ + ASSERT(args.fsbno !=3D NULLFSBLOCK); + ASSERT(args.len =3D=3D 1); + *firstblock =3D args.fsbno; + bp =3D xfs_btree_get_bufl(args.mp, tp, args.fsbno, 0); + + /* initialise the block and copy the data */ + init_fn(bp, ip, ifp); + + /* account for the change in fork size and log everything */ + xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1); + xfs_bmap_forkoff_reset(args.mp, ip, whichfork); + xfs_idata_realloc(ip, -ifp->if_bytes, whichfork); + xfs_iext_add(ifp, 0, 1); + ep =3D xfs_iext_get_ext(ifp, 0); + xfs_bmbt_set_allf(ep, 0, args.fsbno, 1, XFS_EXT_NORM); + trace_xfs_bmap_post_update(ip, 0, + whichfork =3D=3D XFS_ATTR_FORK ? BMAP_ATTRFORK : 0, + _THIS_IP_); + XFS_IFORK_NEXT_SET(ip, whichfork, 1); + ip->i_d.di_nblocks =3D 1; + xfs_trans_mod_dquot_byino(tp, ip, + XFS_TRANS_DQ_BCOUNT, 1L); + flags |=3D xfs_ilog_fext(whichfork); + } else { + ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) =3D=3D 0); + xfs_bmap_forkoff_reset(ip->i_mount, ip, whichfork); } + ifp->if_flags &=3D ~XFS_IFINLINE; + ifp->if_flags |=3D XFS_IFEXTENTS; + XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); + flags |=3D XFS_ILOG_CORE; +done: + *logflagsp =3D flags; + return error; } =20 /* - * Convert a hole to a real allocation. + * Called from xfs_bmap_add_attrfork to handle btree format files. */ -STATIC int /* error */ -xfs_bmap_add_extent_hole_real( - struct xfs_bmalloca *bma, - int whichfork) +STATIC int /* error */ +xfs_bmap_add_attrfork_btree( + xfs_trans_t *tp, /* transaction pointer */ + xfs_inode_t *ip, /* incore inode pointer */ + xfs_fsblock_t *firstblock, /* first block allocated */ + xfs_bmap_free_t *flist, /* blocks to free at commit */ + int *flags) /* inode logging flags */ { - struct xfs_bmbt_irec *new =3D &bma->got; - int error; /* error return value */ - int i; /* temp state */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_bmbt_irec_t left; /* left neighbor extent entry */ - xfs_bmbt_irec_t right; /* right neighbor extent entry */ - int rval=3D0; /* return value (logging flags) */ - int state; /* state bits, accessed thru macros */ - - ifp =3D XFS_IFORK_PTR(bma->ip, whichfork); - - ASSERT(bma->idx >=3D 0); - ASSERT(bma->idx <=3D ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); - ASSERT(!isnullstartblock(new->br_startblock)); - ASSERT(!bma->cur || - !(bma->cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL)); - - XFS_STATS_INC(xs_add_exlist); - - state =3D 0; - if (whichfork =3D=3D XFS_ATTR_FORK) - state |=3D BMAP_ATTRFORK; + xfs_btree_cur_t *cur; /* btree cursor */ + int error; /* error return value */ + xfs_mount_t *mp; /* file system mount struct */ + int stat; /* newroot status */ =20 - /* - * Check and set flags if this segment has a left neighbor. - */ - if (bma->idx > 0) { - state |=3D BMAP_LEFT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx - 1), &left); - if (isnullstartblock(left.br_startblock)) - state |=3D BMAP_LEFT_DELAY; + mp =3D ip->i_mount; + if (ip->i_df.if_broot_bytes <=3D XFS_IFORK_DSIZE(ip)) + *flags |=3D XFS_ILOG_DBROOT; + else { + cur =3D xfs_bmbt_init_cursor(mp, tp, ip, XFS_DATA_FORK); + cur->bc_private.b.flist =3D flist; + cur->bc_private.b.firstblock =3D *firstblock; + if ((error =3D xfs_bmbt_lookup_ge(cur, 0, 0, 0, &stat))) + goto error0; + /* must be at least one entry */ + XFS_WANT_CORRUPTED_GOTO(stat =3D=3D 1, error0); + if ((error =3D xfs_btree_new_iroot(cur, flags, &stat))) + goto error0; + if (stat =3D=3D 0) { + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + return XFS_ERROR(ENOSPC); + } + *firstblock =3D cur->bc_private.b.firstblock; + cur->bc_private.b.allocated =3D 0; + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); } + return 0; +error0: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; +} =20 - /* - * Check and set flags if this segment has a current value. - * Not true if we're inserting into the "hole" at eof. - */ - if (bma->idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { - state |=3D BMAP_RIGHT_VALID; - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx), &right); - if (isnullstartblock(right.br_startblock)) - state |=3D BMAP_RIGHT_DELAY; +/* + * Called from xfs_bmap_add_attrfork to handle extents format files. + */ +STATIC int /* error */ +xfs_bmap_add_attrfork_extents( + xfs_trans_t *tp, /* transaction pointer */ + xfs_inode_t *ip, /* incore inode pointer */ + xfs_fsblock_t *firstblock, /* first block allocated */ + xfs_bmap_free_t *flist, /* blocks to free at commit */ + int *flags) /* inode logging flags */ +{ + xfs_btree_cur_t *cur; /* bmap btree cursor */ + int error; /* error return value */ + + if (ip->i_d.di_nextents * sizeof(xfs_bmbt_rec_t) <=3D XFS_IFORK_DSIZE(ip)) + return 0; + cur =3D NULL; + error =3D xfs_bmap_extents_to_btree(tp, ip, firstblock, flist, &cur, 0, + flags, XFS_DATA_FORK); + if (cur) { + cur->bc_private.b.allocated =3D 0; + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); } + return error; +} =20 - /* - * We're inserting a real allocation between "left" and "right". - * Set the contiguity flags. Don't let extents get too large. - */ - if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && - left.br_startoff + left.br_blockcount =3D=3D new->br_startoff && - left.br_startblock + left.br_blockcount =3D=3D new->br_startblock && - left.br_state =3D=3D new->br_state && - left.br_blockcount + new->br_blockcount <=3D MAXEXTLEN) - state |=3D BMAP_LEFT_CONTIG; +/* + * Block initialisation functions for local to extent format conversion. + * As these get more complex, they will be moved to the relevant files, + * but for now they are too simple to worry about. + */ +STATIC void +xfs_bmap_local_to_extents_init_fn( + struct xfs_buf *bp, + struct xfs_inode *ip, + struct xfs_ifork *ifp) +{ + bp->b_ops =3D &xfs_bmbt_buf_ops; + memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); +} =20 - if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && - new->br_startoff + new->br_blockcount =3D=3D right.br_startoff && - new->br_startblock + new->br_blockcount =3D=3D right.br_startblock && - new->br_state =3D=3D right.br_state && - new->br_blockcount + right.br_blockcount <=3D MAXEXTLEN && - (!(state & BMAP_LEFT_CONTIG) || - left.br_blockcount + new->br_blockcount + - right.br_blockcount <=3D MAXEXTLEN)) - state |=3D BMAP_RIGHT_CONTIG; +STATIC void +xfs_symlink_local_to_remote( + struct xfs_buf *bp, + struct xfs_inode *ip, + struct xfs_ifork *ifp) +{ + /* remote symlink blocks are not verifiable until CRCs come along */ + bp->b_ops =3D NULL; + memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); +} =20 - error =3D 0; - /* - * Select which case we're in here, and implement it. - */ - switch (state & (BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG)) { - case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: - /* - * New allocation is contiguous with real allocations on the - * left and on the right. - * Merge all three into a single extent record. - */ - --bma->idx; - trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), - left.br_blockcount + new->br_blockcount + - right.br_blockcount); - trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); +/* + * Called from xfs_bmap_add_attrfork to handle local format files. Each + * different data fork content type needs a different callout to do the + * conversion. Some are basic and only require special block initialisation + * callouts for the data formating, others (directories) are so specialise= d they + * handle everything themselves. + * + * XXX (dgc): investigate whether directory conversion can use the generic + * formatting callout. It should be possible - it's just a very complex + * formatter. it would also require passing the transaction through to the= init + * function. + */ +STATIC int /* error */ +xfs_bmap_add_attrfork_local( + xfs_trans_t *tp, /* transaction pointer */ + xfs_inode_t *ip, /* incore inode pointer */ + xfs_fsblock_t *firstblock, /* first block allocated */ + xfs_bmap_free_t *flist, /* blocks to free at commit */ + int *flags) /* inode logging flags */ +{ + xfs_da_args_t dargs; /* args for dir/attr code */ =20 - xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); + if (ip->i_df.if_bytes <=3D XFS_IFORK_DSIZE(ip)) + return 0; =20 - XFS_IFORK_NEXT_SET(bma->ip, whichfork, - XFS_IFORK_NEXTENTS(bma->ip, whichfork) - 1); - if (bma->cur =3D=3D NULL) { - rval =3D XFS_ILOG_CORE | xfs_ilog_fext(whichfork); - } else { - rval =3D XFS_ILOG_CORE; - error =3D xfs_bmbt_lookup_eq(bma->cur, right.br_startoff, - right.br_startblock, right.br_blockcount, - &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - error =3D xfs_btree_delete(bma->cur, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - error =3D xfs_btree_decrement(bma->cur, 0, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - error =3D xfs_bmbt_update(bma->cur, left.br_startoff, - left.br_startblock, - left.br_blockcount + - new->br_blockcount + - right.br_blockcount, - left.br_state); - if (error) - goto done; - } - break; + if (S_ISDIR(ip->i_d.di_mode)) { + memset(&dargs, 0, sizeof(dargs)); + dargs.dp =3D ip; + dargs.firstblock =3D firstblock; + dargs.flist =3D flist; + dargs.total =3D ip->i_mount->m_dirblkfsbs; + dargs.whichfork =3D XFS_DATA_FORK; + dargs.trans =3D tp; + return xfs_dir2_sf_to_block(&dargs); + } =20 - case BMAP_LEFT_CONTIG: - /* - * New allocation is contiguous with a real allocation - * on the left. - * Merge the new allocation with the left neighbor. - */ - --bma->idx; - trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), - left.br_blockcount + new->br_blockcount); - trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + if (S_ISLNK(ip->i_d.di_mode)) + return xfs_bmap_local_to_extents(tp, ip, firstblock, 1, + flags, XFS_DATA_FORK, + xfs_symlink_local_to_remote); =20 - if (bma->cur =3D=3D NULL) { - rval =3D xfs_ilog_fext(whichfork); - } else { - rval =3D 0; - error =3D xfs_bmbt_lookup_eq(bma->cur, left.br_startoff, - left.br_startblock, left.br_blockcount, - &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - error =3D xfs_bmbt_update(bma->cur, left.br_startoff, - left.br_startblock, - left.br_blockcount + - new->br_blockcount, - left.br_state); - if (error) - goto done; - } - break; + return xfs_bmap_local_to_extents(tp, ip, firstblock, 1, flags, + XFS_DATA_FORK, + xfs_bmap_local_to_extents_init_fn); +} =20 - case BMAP_RIGHT_CONTIG: - /* - * New allocation is contiguous with a real allocation - * on the right. - * Merge the new allocation with the right neighbor. - */ - trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); - xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, bma->idx), - new->br_startoff, new->br_startblock, - new->br_blockcount + right.br_blockcount, - right.br_state); - trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); +/* + * Convert inode from non-attributed to attributed. + * Must not be in a transaction, ip must not be locked. + */ +int /* error code */ +xfs_bmap_add_attrfork( + xfs_inode_t *ip, /* incore inode pointer */ + int size, /* space new attribute needs */ + int rsvd) /* xact may use reserved blks */ +{ + xfs_fsblock_t firstblock; /* 1st block/ag allocated */ + xfs_bmap_free_t flist; /* freed extent records */ + xfs_mount_t *mp; /* mount structure */ + xfs_trans_t *tp; /* transaction pointer */ + int blks; /* space reservation */ + int version =3D 1; /* superblock attr version */ + int committed; /* xaction was committed */ + int logflags; /* logging flags */ + int error; /* error return value */ =20 - if (bma->cur =3D=3D NULL) { - rval =3D xfs_ilog_fext(whichfork); - } else { - rval =3D 0; - error =3D xfs_bmbt_lookup_eq(bma->cur, - right.br_startoff, - right.br_startblock, - right.br_blockcount, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - error =3D xfs_bmbt_update(bma->cur, new->br_startoff, - new->br_startblock, - new->br_blockcount + - right.br_blockcount, - right.br_state); - if (error) - goto done; - } - break; + ASSERT(XFS_IFORK_Q(ip) =3D=3D 0); =20 - case 0: + mp =3D ip->i_mount; + ASSERT(!XFS_NOT_DQATTACHED(mp, ip)); + tp =3D xfs_trans_alloc(mp, XFS_TRANS_ADDAFORK); + blks =3D XFS_ADDAFORK_SPACE_RES(mp); + if (rsvd) + tp->t_flags |=3D XFS_TRANS_RESERVE; + if ((error =3D xfs_trans_reserve(tp, blks, XFS_ADDAFORK_LOG_RES(mp), 0, + XFS_TRANS_PERM_LOG_RES, XFS_ADDAFORK_LOG_COUNT))) + goto error0; + xfs_ilock(ip, XFS_ILOCK_EXCL); + error =3D xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ? + XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES : + XFS_QMOPT_RES_REGBLKS); + if (error) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); + return error; + } + if (XFS_IFORK_Q(ip)) + goto error1; + if (ip->i_d.di_aformat !=3D XFS_DINODE_FMT_EXTENTS) { /* - * New allocation is not contiguous with another - * real allocation. - * Insert a new entry. + * For inodes coming from pre-6.2 filesystems. */ - xfs_iext_insert(bma->ip, bma->idx, 1, new, state); - XFS_IFORK_NEXT_SET(bma->ip, whichfork, - XFS_IFORK_NEXTENTS(bma->ip, whichfork) + 1); - if (bma->cur =3D=3D NULL) { - rval =3D XFS_ILOG_CORE | xfs_ilog_fext(whichfork); - } else { - rval =3D XFS_ILOG_CORE; - error =3D xfs_bmbt_lookup_eq(bma->cur, - new->br_startoff, - new->br_startblock, - new->br_blockcount, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); - bma->cur->bc_rec.b.br_state =3D new->br_state; - error =3D xfs_btree_insert(bma->cur, &i); - if (error) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - } - break; + ASSERT(ip->i_d.di_aformat =3D=3D 0); + ip->i_d.di_aformat =3D XFS_DINODE_FMT_EXTENTS; } + ASSERT(ip->i_d.di_anextents =3D=3D 0); =20 - /* convert to a btree if necessary */ - if (xfs_bmap_needs_btree(bma->ip, whichfork)) { - int tmp_logflags; /* partial log flag return val */ + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); =20 - ASSERT(bma->cur =3D=3D NULL); - error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, - bma->firstblock, bma->flist, &bma->cur, - 0, &tmp_logflags, whichfork); - bma->logflags |=3D tmp_logflags; - if (error) - goto done; + switch (ip->i_d.di_format) { + case XFS_DINODE_FMT_DEV: + ip->i_d.di_forkoff =3D roundup(sizeof(xfs_dev_t), 8) >> 3; + break; + case XFS_DINODE_FMT_UUID: + ip->i_d.di_forkoff =3D roundup(sizeof(uuid_t), 8) >> 3; + break; + case XFS_DINODE_FMT_LOCAL: + case XFS_DINODE_FMT_EXTENTS: + case XFS_DINODE_FMT_BTREE: + ip->i_d.di_forkoff =3D xfs_attr_shortform_bytesfit(ip, size); + if (!ip->i_d.di_forkoff) + ip->i_d.di_forkoff =3D xfs_default_attroffset(ip) >> 3; + else if (mp->m_flags & XFS_MOUNT_ATTR2) + version =3D 2; + break; + default: + ASSERT(0); + error =3D XFS_ERROR(EINVAL); + goto error1; } =20 - /* clear out the allocated field, done with it now in any case. */ - if (bma->cur) - bma->cur->bc_private.b.allocated =3D 0; + ASSERT(ip->i_afp =3D=3D NULL); + ip->i_afp =3D kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP); + ip->i_afp->if_flags =3D XFS_IFEXTENTS; + logflags =3D 0; + xfs_bmap_init(&flist, &firstblock); + switch (ip->i_d.di_format) { + case XFS_DINODE_FMT_LOCAL: + error =3D xfs_bmap_add_attrfork_local(tp, ip, &firstblock, &flist, + &logflags); + break; + case XFS_DINODE_FMT_EXTENTS: + error =3D xfs_bmap_add_attrfork_extents(tp, ip, &firstblock, + &flist, &logflags); + break; + case XFS_DINODE_FMT_BTREE: + error =3D xfs_bmap_add_attrfork_btree(tp, ip, &firstblock, &flist, + &logflags); + break; + default: + error =3D 0; + break; + } + if (logflags) + xfs_trans_log_inode(tp, ip, logflags); + if (error) + goto error2; + if (!xfs_sb_version_hasattr(&mp->m_sb) || + (!xfs_sb_version_hasattr2(&mp->m_sb) && version =3D=3D 2)) { + __int64_t sbfields =3D 0; =20 - xfs_bmap_check_leaf_extents(bma->cur, bma->ip, whichfork); -done: - bma->logflags |=3D rval; + spin_lock(&mp->m_sb_lock); + if (!xfs_sb_version_hasattr(&mp->m_sb)) { + xfs_sb_version_addattr(&mp->m_sb); + sbfields |=3D XFS_SB_VERSIONNUM; + } + if (!xfs_sb_version_hasattr2(&mp->m_sb) && version =3D=3D 2) { + xfs_sb_version_addattr2(&mp->m_sb); + sbfields |=3D (XFS_SB_VERSIONNUM | XFS_SB_FEATURES2); + } + if (sbfields) { + spin_unlock(&mp->m_sb_lock); + xfs_mod_sb(tp, sbfields); + } else + spin_unlock(&mp->m_sb_lock); + } + + error =3D xfs_bmap_finish(&tp, &flist, &committed); + if (error) + goto error2; + return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); +error2: + xfs_bmap_cancel(&flist); +error1: + xfs_iunlock(ip, XFS_ILOCK_EXCL); +error0: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); return error; } =20 /* - * Adjust the size of the new extent based on di_extsize and rt extsize. - */ -STATIC int -xfs_bmap_extsize_align( - xfs_mount_t *mp, - xfs_bmbt_irec_t *gotp, /* next extent pointer */ - xfs_bmbt_irec_t *prevp, /* previous extent pointer */ - xfs_extlen_t extsz, /* align to this extent size */ - int rt, /* is this a realtime inode? */ - int eof, /* is extent at end-of-file? */ - int delay, /* creating delalloc extent? */ - int convert, /* overwriting unwritten extent? */ - xfs_fileoff_t *offp, /* in/out: aligned offset */ - xfs_extlen_t *lenp) /* in/out: aligned length */ -{ - xfs_fileoff_t orig_off; /* original offset */ - xfs_extlen_t orig_alen; /* original length */ - xfs_fileoff_t orig_end; /* original off+len */ - xfs_fileoff_t nexto; /* next file offset */ - xfs_fileoff_t prevo; /* previous file offset */ - xfs_fileoff_t align_off; /* temp for offset */ - xfs_extlen_t align_alen; /* temp for length */ - xfs_extlen_t temp; /* temp for calculations */ - - if (convert) - return 0; - - orig_off =3D align_off =3D *offp; - orig_alen =3D align_alen =3D *lenp; - orig_end =3D orig_off + orig_alen; + * Internal and external extent tree search functions. + */ =20 - /* - * If this request overlaps an existing extent, then don't - * attempt to perform any additional alignment. - */ - if (!delay && !eof && - (orig_off >=3D gotp->br_startoff) && - (orig_end <=3D gotp->br_startoff + gotp->br_blockcount)) { - return 0; - } +/* + * Read in the extents to if_extents. + * All inode fields are set up by caller, we just traverse the btree + * and copy the records in. If the file system cannot contain unwritten + * extents, the records are checked for no "state" flags. + */ +int /* error */ +xfs_bmap_read_extents( + xfs_trans_t *tp, /* transaction pointer */ + xfs_inode_t *ip, /* incore inode */ + int whichfork) /* data or attr fork */ +{ + struct xfs_btree_block *block; /* current btree block */ + xfs_fsblock_t bno; /* block # of "block" */ + xfs_buf_t *bp; /* buffer for "block" */ + int error; /* error return value */ + xfs_exntfmt_t exntf; /* XFS_EXTFMT_NOSTATE, if checking */ + xfs_extnum_t i, j; /* index into the extents list */ + xfs_ifork_t *ifp; /* fork structure */ + int level; /* btree level, for checking */ + xfs_mount_t *mp; /* file system mount structure */ + __be64 *pp; /* pointer to block address */ + /* REFERENCED */ + xfs_extnum_t room; /* number of entries there's room for */ =20 + bno =3D NULLFSBLOCK; + mp =3D ip->i_mount; + ifp =3D XFS_IFORK_PTR(ip, whichfork); + exntf =3D (whichfork !=3D XFS_DATA_FORK) ? XFS_EXTFMT_NOSTATE : + XFS_EXTFMT_INODE(ip); + block =3D ifp->if_broot; /* - * If the file offset is unaligned vs. the extent size - * we need to align it. This will be possible unless - * the file was previously written with a kernel that didn't - * perform this alignment, or if a truncate shot us in the - * foot. + * Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out. */ - temp =3D do_mod(orig_off, extsz); - if (temp) { - align_alen +=3D temp; - align_off -=3D temp; - } + level =3D be16_to_cpu(block->bb_level); + ASSERT(level > 0); + pp =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes); + bno =3D be64_to_cpu(*pp); + ASSERT(bno !=3D NULLDFSBNO); + ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount); + ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks); /* - * Same adjustment for the end of the requested area. + * Go down the tree until leaf level is reached, following the first + * pointer (leftmost) at each level. */ - if ((temp =3D (align_alen % extsz))) { - align_alen +=3D extsz - temp; + while (level-- > 0) { + error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, + XFS_BMAP_BTREE_REF, &xfs_bmbt_buf_ops); + if (error) + return error; + block =3D XFS_BUF_TO_BLOCK(bp); + XFS_WANT_CORRUPTED_GOTO( + xfs_bmap_sanity_check(mp, bp, level), + error0); + if (level =3D=3D 0) + break; + pp =3D XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); + bno =3D be64_to_cpu(*pp); + XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); + xfs_trans_brelse(tp, bp); } /* - * If the previous block overlaps with this proposed allocation - * then move the start forward without adjusting the length. - */ - if (prevp->br_startoff !=3D NULLFILEOFF) { - if (prevp->br_startblock =3D=3D HOLESTARTBLOCK) - prevo =3D prevp->br_startoff; - else - prevo =3D prevp->br_startoff + prevp->br_blockcount; - } else - prevo =3D 0; - if (align_off !=3D orig_off && align_off < prevo) - align_off =3D prevo; - /* - * If the next block overlaps with this proposed allocation - * then move the start back without adjusting the length, - * but not before offset 0. - * This may of course make the start overlap previous block, - * and if we hit the offset 0 limit then the next block - * can still overlap too. + * Here with bp and block set to the leftmost leaf node in the tree. */ - if (!eof && gotp->br_startoff !=3D NULLFILEOFF) { - if ((delay && gotp->br_startblock =3D=3D HOLESTARTBLOCK) || - (!delay && gotp->br_startblock =3D=3D DELAYSTARTBLOCK)) - nexto =3D gotp->br_startoff + gotp->br_blockcount; - else - nexto =3D gotp->br_startoff; - } else - nexto =3D NULLFILEOFF; - if (!eof && - align_off + align_alen !=3D orig_end && - align_off + align_alen > nexto) - align_off =3D nexto > align_alen ? nexto - align_alen : 0; + room =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + i =3D 0; /* - * If we're now overlapping the next or previous extent that - * means we can't fit an extsz piece in this hole. Just move - * the start forward to the first valid spot and set - * the length so we hit the end. + * Loop over all leaf nodes. Copy information to the extent records. */ - if (align_off !=3D orig_off && align_off < prevo) - align_off =3D prevo; - if (align_off + align_alen !=3D orig_end && - align_off + align_alen > nexto && - nexto !=3D NULLFILEOFF) { - ASSERT(nexto > prevo); - align_alen =3D nexto - align_off; - } + for (;;) { + xfs_bmbt_rec_t *frp; + xfs_fsblock_t nextbno; + xfs_extnum_t num_recs; + xfs_extnum_t start; =20 - /* - * If realtime, and the result isn't a multiple of the realtime - * extent size we need to remove blocks until it is. - */ - if (rt && (temp =3D (align_alen % mp->m_sb.sb_rextsize))) { - /* - * We're not covering the original request, or - * we won't be able to once we fix the length. - */ - if (orig_off < align_off || - orig_end > align_off + align_alen || - align_alen - temp < orig_alen) - return XFS_ERROR(EINVAL); - /* - * Try to fix it by moving the start up. - */ - if (align_off + temp <=3D orig_off) { - align_alen -=3D temp; - align_off +=3D temp; + num_recs =3D xfs_btree_get_numrecs(block); + if (unlikely(i + num_recs > room)) { + ASSERT(i + num_recs <=3D room); + xfs_warn(ip->i_mount, + "corrupt dinode %Lu, (btree extents).", + (unsigned long long) ip->i_ino); + XFS_CORRUPTION_ERROR("xfs_bmap_read_extents(1)", + XFS_ERRLEVEL_LOW, ip->i_mount, block); + goto error0; } + XFS_WANT_CORRUPTED_GOTO( + xfs_bmap_sanity_check(mp, bp, 0), + error0); /* - * Try to fix it by moving the end in. + * Read-ahead the next leaf block, if any. */ - else if (align_off + align_alen - temp >=3D orig_end) - align_alen -=3D temp; + nextbno =3D be64_to_cpu(block->bb_u.l.bb_rightsib); + if (nextbno !=3D NULLFSBLOCK) + xfs_btree_reada_bufl(mp, nextbno, 1, + &xfs_bmbt_buf_ops); /* - * Set the start to the minimum then trim the length. + * Copy records into the extent records. */ - else { - align_alen -=3D orig_off - align_off; - align_off =3D orig_off; - align_alen -=3D align_alen % mp->m_sb.sb_rextsize; + frp =3D XFS_BMBT_REC_ADDR(mp, block, 1); + start =3D i; + for (j =3D 0; j < num_recs; j++, i++, frp++) { + xfs_bmbt_rec_host_t *trp =3D xfs_iext_get_ext(ifp, i); + trp->l0 =3D be64_to_cpu(frp->l0); + trp->l1 =3D be64_to_cpu(frp->l1); + } + if (exntf =3D=3D XFS_EXTFMT_NOSTATE) { + /* + * Check all attribute bmap btree records and + * any "older" data bmap btree records for a + * set bit in the "extent flag" position. + */ + if (unlikely(xfs_check_nostate_extents(ifp, + start, num_recs))) { + XFS_ERROR_REPORT("xfs_bmap_read_extents(2)", + XFS_ERRLEVEL_LOW, + ip->i_mount); + goto error0; + } } + xfs_trans_brelse(tp, bp); + bno =3D nextbno; /* - * Result doesn't cover the request, fail it. + * If we've reached the end, stop. */ - if (orig_off < align_off || orig_end > align_off + align_alen) - return XFS_ERROR(EINVAL); - } else { - ASSERT(orig_off >=3D align_off); - ASSERT(orig_end <=3D align_off + align_alen); + if (bno =3D=3D NULLFSBLOCK) + break; + error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, + XFS_BMAP_BTREE_REF, &xfs_bmbt_buf_ops); + if (error) + return error; + block =3D XFS_BUF_TO_BLOCK(bp); } + ASSERT(i =3D=3D (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))); + ASSERT(i =3D=3D XFS_IFORK_NEXTENTS(ip, whichfork)); + XFS_BMAP_TRACE_EXLIST(ip, i, whichfork); + return 0; +error0: + xfs_trans_brelse(tp, bp); + return XFS_ERROR(EFSCORRUPTED); +} =20 -#ifdef DEBUG - if (!eof && gotp->br_startoff !=3D NULLFILEOFF) - ASSERT(align_off + align_alen <=3D gotp->br_startoff); - if (prevp->br_startoff !=3D NULLFILEOFF) - ASSERT(align_off >=3D prevp->br_startoff + prevp->br_blockcount); + +/* + * Search the extent records for the entry containing block bno. + * If bno lies in a hole, point to the next entry. If bno lies + * past eof, *eofp will be set, and *prevp will contain the last + * entry (null if none). Else, *lastxp will be set to the index + * of the found entry; *gotp will contain the entry. + */ +STATIC xfs_bmbt_rec_host_t * /* pointer to found extent entry */ +xfs_bmap_search_multi_extents( + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_fileoff_t bno, /* block number searched for */ + int *eofp, /* out: end of file found */ + xfs_extnum_t *lastxp, /* out: last extent index */ + xfs_bmbt_irec_t *gotp, /* out: extent entry found */ + xfs_bmbt_irec_t *prevp) /* out: previous extent entry found */ +{ + xfs_bmbt_rec_host_t *ep; /* extent record pointer */ + xfs_extnum_t lastx; /* last extent index */ + + /* + * Initialize the extent entry structure to catch access to + * uninitialized br_startblock field. + */ + gotp->br_startoff =3D 0xffa5a5a5a5a5a5a5LL; + gotp->br_blockcount =3D 0xa55a5a5a5a5a5a5aLL; + gotp->br_state =3D XFS_EXT_INVALID; +#if XFS_BIG_BLKNOS + gotp->br_startblock =3D 0xffffa5a5a5a5a5a5LL; +#else + gotp->br_startblock =3D 0xffffa5a5; #endif + prevp->br_startoff =3D NULLFILEOFF; =20 - *lenp =3D align_alen; - *offp =3D align_off; - return 0; + ep =3D xfs_iext_bno_to_ext(ifp, bno, &lastx); + if (lastx > 0) { + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, lastx - 1), prevp); + } + if (lastx < (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) { + xfs_bmbt_get_all(ep, gotp); + *eofp =3D 0; + } else { + if (lastx > 0) { + *gotp =3D *prevp; + } + *eofp =3D 1; + ep =3D NULL; + } + *lastxp =3D lastx; + return ep; } =20 -#define XFS_ALLOC_GAP_UNITS 4 - -STATIC void -xfs_bmap_adjacent( - xfs_bmalloca_t *ap) /* bmap alloc argument struct */ +/* + * Search the extents list for the inode, for the extent containing bno. + * If bno lies in a hole, point to the next entry. If bno lies past eof, + * *eofp will be set, and *prevp will contain the last entry (null if none= ). + * Else, *lastxp will be set to the index of the found + * entry; *gotp will contain the entry. + */ +xfs_bmbt_rec_host_t * /* pointer to found extent entry */ +xfs_bmap_search_extents( + xfs_inode_t *ip, /* incore inode pointer */ + xfs_fileoff_t bno, /* block number searched for */ + int fork, /* data or attr fork */ + int *eofp, /* out: end of file found */ + xfs_extnum_t *lastxp, /* out: last extent index */ + xfs_bmbt_irec_t *gotp, /* out: extent entry found */ + xfs_bmbt_irec_t *prevp) /* out: previous extent entry found */ { - xfs_fsblock_t adjust; /* adjustment to block numbers */ - xfs_agnumber_t fb_agno; /* ag number of ap->firstblock */ - xfs_mount_t *mp; /* mount point structure */ - int nullfb; /* true if ap->firstblock isn't set */ - int rt; /* true if inode is realtime */ + xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_bmbt_rec_host_t *ep; /* extent record pointer */ =20 -#define ISVALID(x,y) \ - (rt ? \ - (x) < mp->m_sb.sb_rblocks : \ - XFS_FSB_TO_AGNO(mp, x) =3D=3D XFS_FSB_TO_AGNO(mp, y) && \ - XFS_FSB_TO_AGNO(mp, x) < mp->m_sb.sb_agcount && \ - XFS_FSB_TO_AGBNO(mp, x) < mp->m_sb.sb_agblocks) + XFS_STATS_INC(xs_look_exlist); + ifp =3D XFS_IFORK_PTR(ip, fork); =20 - mp =3D ap->ip->i_mount; - nullfb =3D *ap->firstblock =3D=3D NULLFSBLOCK; - rt =3D XFS_IS_REALTIME_INODE(ap->ip) && ap->userdata; - fb_agno =3D nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock); - /* - * If allocating at eof, and there's a previous real block, - * try to use its last block as our starting point. - */ - if (ap->eof && ap->prev.br_startoff !=3D NULLFILEOFF && - !isnullstartblock(ap->prev.br_startblock) && - ISVALID(ap->prev.br_startblock + ap->prev.br_blockcount, - ap->prev.br_startblock)) { - ap->blkno =3D ap->prev.br_startblock + ap->prev.br_blockcount; - /* - * Adjust for the gap between prevp and us. - */ - adjust =3D ap->offset - - (ap->prev.br_startoff + ap->prev.br_blockcount); - if (adjust && - ISVALID(ap->blkno + adjust, ap->prev.br_startblock)) - ap->blkno +=3D adjust; + ep =3D xfs_bmap_search_multi_extents(ifp, bno, eofp, lastxp, gotp, prevp); + + if (unlikely(!(gotp->br_startblock) && (*lastxp !=3D NULLEXTNUM) && + !(XFS_IS_REALTIME_INODE(ip) && fork =3D=3D XFS_DATA_FORK))) { + xfs_alert_tag(ip->i_mount, XFS_PTAG_FSBLOCK_ZERO, + "Access to block zero in inode %llu " + "start_block: %llx start_off: %llx " + "blkcnt: %llx extent-state: %x lastx: %x\n", + (unsigned long long)ip->i_ino, + (unsigned long long)gotp->br_startblock, + (unsigned long long)gotp->br_startoff, + (unsigned long long)gotp->br_blockcount, + gotp->br_state, *lastxp); + *lastxp =3D NULLEXTNUM; + *eofp =3D 1; + return NULL; } - /* - * If not at eof, then compare the two neighbor blocks. - * Figure out whether either one gives us a good starting point, - * and pick the better one. - */ - else if (!ap->eof) { - xfs_fsblock_t gotbno; /* right side block number */ - xfs_fsblock_t gotdiff=3D0; /* right side difference */ - xfs_fsblock_t prevbno; /* left side block number */ - xfs_fsblock_t prevdiff=3D0; /* left side difference */ + return ep; +} =20 +/* + * Returns the file-relative block number of the first unused block(s) + * in the file with at least "len" logically contiguous blocks free. + * This is the lowest-address hole if the file has holes, else the first b= lock + * past the end of file. + * Return 0 if the file is currently local (in-inode). + */ +int /* error */ +xfs_bmap_first_unused( + xfs_trans_t *tp, /* transaction pointer */ + xfs_inode_t *ip, /* incore inode */ + xfs_extlen_t len, /* size of hole to find */ + xfs_fileoff_t *first_unused, /* unused block */ + int whichfork) /* data or attr fork */ +{ + int error; /* error return value */ + int idx; /* extent record index */ + xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_fileoff_t lastaddr; /* last block number seen */ + xfs_fileoff_t lowest; /* lowest useful block */ + xfs_fileoff_t max; /* starting useful block */ + xfs_fileoff_t off; /* offset for this block */ + xfs_extnum_t nextents; /* number of extent entries */ + + ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_BTREE || + XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS || + XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL); + if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL) { + *first_unused =3D 0; + return 0; + } + ifp =3D XFS_IFORK_PTR(ip, whichfork); + if (!(ifp->if_flags & XFS_IFEXTENTS) && + (error =3D xfs_iread_extents(tp, ip, whichfork))) + return error; + lowest =3D *first_unused; + nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + for (idx =3D 0, lastaddr =3D 0, max =3D lowest; idx < nextents; idx++) { + xfs_bmbt_rec_host_t *ep =3D xfs_iext_get_ext(ifp, idx); + off =3D xfs_bmbt_get_startoff(ep); /* - * If there's a previous (left) block, select a requested - * start block based on it. - */ - if (ap->prev.br_startoff !=3D NULLFILEOFF && - !isnullstartblock(ap->prev.br_startblock) && - (prevbno =3D ap->prev.br_startblock + - ap->prev.br_blockcount) && - ISVALID(prevbno, ap->prev.br_startblock)) { - /* - * Calculate gap to end of previous block. - */ - adjust =3D prevdiff =3D ap->offset - - (ap->prev.br_startoff + - ap->prev.br_blockcount); - /* - * Figure the startblock based on the previous block's - * end and the gap size. - * Heuristic! - * If the gap is large relative to the piece we're - * allocating, or using it gives us an invalid block - * number, then just use the end of the previous block. - */ - if (prevdiff <=3D XFS_ALLOC_GAP_UNITS * ap->length && - ISVALID(prevbno + prevdiff, - ap->prev.br_startblock)) - prevbno +=3D adjust; - else - prevdiff +=3D adjust; - /* - * If the firstblock forbids it, can't use it, - * must use default. - */ - if (!rt && !nullfb && - XFS_FSB_TO_AGNO(mp, prevbno) !=3D fb_agno) - prevbno =3D NULLFSBLOCK; - } - /* - * No previous block or can't follow it, just default. - */ - else - prevbno =3D NULLFSBLOCK; - /* - * If there's a following (right) block, select a requested - * start block based on it. + * See if the hole before this extent will work. */ - if (!isnullstartblock(ap->got.br_startblock)) { - /* - * Calculate gap to start of next block. - */ - adjust =3D gotdiff =3D ap->got.br_startoff - ap->offset; - /* - * Figure the startblock based on the next block's - * start and the gap size. - */ - gotbno =3D ap->got.br_startblock; - /* - * Heuristic! - * If the gap is large relative to the piece we're - * allocating, or using it gives us an invalid block - * number, then just use the start of the next block - * offset by our length. - */ - if (gotdiff <=3D XFS_ALLOC_GAP_UNITS * ap->length && - ISVALID(gotbno - gotdiff, gotbno)) - gotbno -=3D adjust; - else if (ISVALID(gotbno - ap->length, gotbno)) { - gotbno -=3D ap->length; - gotdiff +=3D adjust - ap->length; - } else - gotdiff +=3D adjust; - /* - * If the firstblock forbids it, can't use it, - * must use default. - */ - if (!rt && !nullfb && - XFS_FSB_TO_AGNO(mp, gotbno) !=3D fb_agno) - gotbno =3D NULLFSBLOCK; + if (off >=3D lowest + len && off - max >=3D len) { + *first_unused =3D max; + return 0; } - /* - * No next block, just default. - */ + lastaddr =3D off + xfs_bmbt_get_blockcount(ep); + max =3D XFS_FILEOFF_MAX(lastaddr, lowest); + } + *first_unused =3D max; + return 0; +} + +/* + * Returns the file-relative block number of the last block + 1 before + * last_block (input value) in the file. + * This is not based on i_size, it is based on the extent records. + * Returns 0 for local files, as they do not have extent records. + */ +int /* error */ +xfs_bmap_last_before( + xfs_trans_t *tp, /* transaction pointer */ + xfs_inode_t *ip, /* incore inode */ + xfs_fileoff_t *last_block, /* last block */ + int whichfork) /* data or attr fork */ +{ + xfs_fileoff_t bno; /* input file offset */ + int eof; /* hit end of file */ + xfs_bmbt_rec_host_t *ep; /* pointer to last extent */ + int error; /* error return value */ + xfs_bmbt_irec_t got; /* current extent value */ + xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_extnum_t lastx; /* last extent used */ + xfs_bmbt_irec_t prev; /* previous extent value */ + + if (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE && + XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_LOCAL) + return XFS_ERROR(EIO); + if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL) { + *last_block =3D 0; + return 0; + } + ifp =3D XFS_IFORK_PTR(ip, whichfork); + if (!(ifp->if_flags & XFS_IFEXTENTS) && + (error =3D xfs_iread_extents(tp, ip, whichfork))) + return error; + bno =3D *last_block - 1; + ep =3D xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, + &prev); + if (eof || xfs_bmbt_get_startoff(ep) > bno) { + if (prev.br_startoff =3D=3D NULLFILEOFF) + *last_block =3D 0; else - gotbno =3D NULLFSBLOCK; - /* - * If both valid, pick the better one, else the only good - * one, else ap->rval is already set (to 0 or the inode block). - */ - if (prevbno !=3D NULLFSBLOCK && gotbno !=3D NULLFSBLOCK) - ap->blkno =3D prevdiff <=3D gotdiff ? prevbno : gotbno; - else if (prevbno !=3D NULLFSBLOCK) - ap->blkno =3D prevbno; - else if (gotbno !=3D NULLFSBLOCK) - ap->blkno =3D gotbno; + *last_block =3D prev.br_startoff + prev.br_blockcount; } -#undef ISVALID + /* + * Otherwise *last_block is already the right answer. + */ + return 0; } =20 STATIC int -xfs_bmap_btalloc_nullfb( - struct xfs_bmalloca *ap, - struct xfs_alloc_arg *args, - xfs_extlen_t *blen) +xfs_bmap_last_extent( + struct xfs_trans *tp, + struct xfs_inode *ip, + int whichfork, + struct xfs_bmbt_irec *rec, + int *is_empty) { - struct xfs_mount *mp =3D ap->ip->i_mount; - struct xfs_perag *pag; - xfs_agnumber_t ag, startag; - int notinit =3D 0; + struct xfs_ifork *ifp =3D XFS_IFORK_PTR(ip, whichfork); int error; + int nextents; =20 - if (ap->userdata && xfs_inode_is_filestream(ap->ip)) - args->type =3D XFS_ALLOCTYPE_NEAR_BNO; - else - args->type =3D XFS_ALLOCTYPE_START_BNO; - args->total =3D ap->total; + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + error =3D xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + nextents =3D ifp->if_bytes / sizeof(xfs_bmbt_rec_t); + if (nextents =3D=3D 0) { + *is_empty =3D 1; + return 0; + } + + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, nextents - 1), rec); + *is_empty =3D 0; + return 0; +} + +/* + * Check the last inode extent to determine whether this allocation will r= esult + * in blocks being allocated at the end of the file. When we allocate new = data + * blocks at the end of the file which do not start at the previous data b= lock, + * we will try to align the new blocks at stripe unit boundaries. + * + * Returns 0 in bma->aeof if the file (fork) is empty as any new write wil= l be + * at, or past the EOF. + */ +STATIC int +xfs_bmap_isaeof( + struct xfs_bmalloca *bma, + int whichfork) +{ + struct xfs_bmbt_irec rec; + int is_empty; + int error; + + bma->aeof =3D 0; + error =3D xfs_bmap_last_extent(NULL, bma->ip, whichfork, &rec, + &is_empty); + if (error || is_empty) + return error; =20 /* - * Search for an allocation group with a single extent large enough - * for the request. If one isn't found, then adjust the minimum - * allocation size to the largest space found. + * Check if we are allocation or past the last extent, or at least into + * the last delayed allocated extent. */ - startag =3D ag =3D XFS_FSB_TO_AGNO(mp, args->fsbno); - if (startag =3D=3D NULLAGNUMBER) - startag =3D ag =3D 0; + bma->aeof =3D bma->offset >=3D rec.br_startoff + rec.br_blockcount || + (bma->offset >=3D rec.br_startoff && + isnullstartblock(rec.br_startblock)); + return 0; +} =20 - pag =3D xfs_perag_get(mp, ag); - while (*blen < args->maxlen) { - if (!pag->pagf_init) { - error =3D xfs_alloc_pagf_init(mp, args->tp, ag, - XFS_ALLOC_FLAG_TRYLOCK); - if (error) { - xfs_perag_put(pag); - return error; - } - } +/* + * Check if the endoff is outside the last extent. If so the caller will g= row + * the allocation to a stripe unit boundary. All offsets are considered o= utside + * the end of file for an empty fork, so 1 is returned in *eof in that cas= e. + */ +int +xfs_bmap_eof( + struct xfs_inode *ip, + xfs_fileoff_t endoff, + int whichfork, + int *eof) +{ + struct xfs_bmbt_irec rec; + int error; =20 - /* - * See xfs_alloc_fix_freelist... - */ - if (pag->pagf_init) { - xfs_extlen_t longest; - longest =3D xfs_alloc_longest_free_extent(mp, pag); - if (*blen < longest) - *blen =3D longest; - } else - notinit =3D 1; + error =3D xfs_bmap_last_extent(NULL, ip, whichfork, &rec, eof); + if (error || *eof) + return error; =20 - if (xfs_inode_is_filestream(ap->ip)) { - if (*blen >=3D args->maxlen) - break; + *eof =3D endoff >=3D rec.br_startoff + rec.br_blockcount; + return 0; +} =20 - if (ap->userdata) { - /* - * If startag is an invalid AG, we've - * come here once before and - * xfs_filestream_new_ag picked the - * best currently available. - * - * Don't continue looping, since we - * could loop forever. - */ - if (startag =3D=3D NULLAGNUMBER) - break; +/* + * Returns the file-relative block number of the first block past eof in + * the file. This is not based on i_size, it is based on the extent recor= ds. + * Returns 0 for local files, as they do not have extent records. + */ +int +xfs_bmap_last_offset( + struct xfs_trans *tp, + struct xfs_inode *ip, + xfs_fileoff_t *last_block, + int whichfork) +{ + struct xfs_bmbt_irec rec; + int is_empty; + int error; + + *last_block =3D 0; + + if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL) + return 0; + + if (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE && + XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS) + return XFS_ERROR(EIO); + + error =3D xfs_bmap_last_extent(NULL, ip, whichfork, &rec, &is_empty); + if (error || is_empty) + return error; + + *last_block =3D rec.br_startoff + rec.br_blockcount; + return 0; +} + +/* + * Returns whether the selected fork of the inode has exactly one + * block or not. For the data fork we check this matches di_size, + * implying the file's range is 0..bsize-1. + */ +int /* 1=3D>1 block, 0=3D>otherwise */ +xfs_bmap_one_block( + xfs_inode_t *ip, /* incore inode */ + int whichfork) /* data or attr fork */ +{ + xfs_bmbt_rec_host_t *ep; /* ptr to fork's extent */ + xfs_ifork_t *ifp; /* inode fork pointer */ + int rval; /* return value */ + xfs_bmbt_irec_t s; /* internal version of extent */ + +#ifndef DEBUG + if (whichfork =3D=3D XFS_DATA_FORK) + return XFS_ISIZE(ip) =3D=3D ip->i_mount->m_sb.sb_blocksize; +#endif /* !DEBUG */ + if (XFS_IFORK_NEXTENTS(ip, whichfork) !=3D 1) + return 0; + if (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS) + return 0; + ifp =3D XFS_IFORK_PTR(ip, whichfork); + ASSERT(ifp->if_flags & XFS_IFEXTENTS); + ep =3D xfs_iext_get_ext(ifp, 0); + xfs_bmbt_get_all(ep, &s); + rval =3D s.br_startoff =3D=3D 0 && s.br_blockcount =3D=3D 1; + if (rval && whichfork =3D=3D XFS_DATA_FORK) + ASSERT(XFS_ISIZE(ip) =3D=3D ip->i_mount->m_sb.sb_blocksize); + return rval; +} + +/* + * Extent tree manipulation functions used during allocation. + */ + +/* + * Convert a delayed allocation to a real allocation. + */ +STATIC int /* error */ +xfs_bmap_add_extent_delay_real( + struct xfs_bmalloca *bma) +{ + struct xfs_bmbt_irec *new =3D &bma->got; + int diff; /* temp value */ + xfs_bmbt_rec_host_t *ep; /* extent entry for idx */ + int error; /* error return value */ + int i; /* temp state */ + xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_fileoff_t new_endoff; /* end offset of new entry */ + xfs_bmbt_irec_t r[3]; /* neighbor extent entries */ + /* left is 0, right is 1, prev is 2 */ + int rval=3D0; /* return value (logging flags) */ + int state =3D 0;/* state bits, accessed thru macros */ + xfs_filblks_t da_new; /* new count del alloc blocks used */ + xfs_filblks_t da_old; /* old count del alloc blocks used */ + xfs_filblks_t temp=3D0; /* value for da_new calculations */ + xfs_filblks_t temp2=3D0;/* value for da_new calculations */ + int tmp_rval; /* partial logging flags */ + + ifp =3D XFS_IFORK_PTR(bma->ip, XFS_DATA_FORK); =20 - error =3D xfs_filestream_new_ag(ap, &ag); - xfs_perag_put(pag); - if (error) - return error; + ASSERT(bma->idx >=3D 0); + ASSERT(bma->idx <=3D ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); + ASSERT(!isnullstartblock(new->br_startblock)); + ASSERT(!bma->cur || + (bma->cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL)); =20 - /* loop again to set 'blen'*/ - startag =3D NULLAGNUMBER; - pag =3D xfs_perag_get(mp, ag); - continue; - } - } - if (++ag =3D=3D mp->m_sb.sb_agcount) - ag =3D 0; - if (ag =3D=3D startag) - break; - xfs_perag_put(pag); - pag =3D xfs_perag_get(mp, ag); - } - xfs_perag_put(pag); + XFS_STATS_INC(xs_add_exlist); + +#define LEFT r[0] +#define RIGHT r[1] +#define PREV r[2] =20 /* - * Since the above loop did a BUF_TRYLOCK, it is - * possible that there is space for this request. + * Set up a bunch of variables to make the tests simpler. */ - if (notinit || *blen < ap->minlen) - args->minlen =3D ap->minlen; + ep =3D xfs_iext_get_ext(ifp, bma->idx); + xfs_bmbt_get_all(ep, &PREV); + new_endoff =3D new->br_startoff + new->br_blockcount; + ASSERT(PREV.br_startoff <=3D new->br_startoff); + ASSERT(PREV.br_startoff + PREV.br_blockcount >=3D new_endoff); + + da_old =3D startblockval(PREV.br_startblock); + da_new =3D 0; + /* - * If the best seen length is less than the request - * length, use the best as the minimum. + * Set flags determining what part of the previous delayed allocation + * extent is being replaced by a real allocation. */ - else if (*blen < args->maxlen) - args->minlen =3D *blen; + if (PREV.br_startoff =3D=3D new->br_startoff) + state |=3D BMAP_LEFT_FILLING; + if (PREV.br_startoff + PREV.br_blockcount =3D=3D new_endoff) + state |=3D BMAP_RIGHT_FILLING; + /* - * Otherwise we've seen an extent as big as maxlen, - * use that as the minimum. + * Check and set flags if this segment has a left neighbor. + * Don't set contiguous if the combined extent would be too large. */ - else - args->minlen =3D args->maxlen; + if (bma->idx > 0) { + state |=3D BMAP_LEFT_VALID; + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx - 1), &LEFT); + + if (isnullstartblock(LEFT.br_startblock)) + state |=3D BMAP_LEFT_DELAY; + } + + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && + LEFT.br_startoff + LEFT.br_blockcount =3D=3D new->br_startoff && + LEFT.br_startblock + LEFT.br_blockcount =3D=3D new->br_startblock && + LEFT.br_state =3D=3D new->br_state && + LEFT.br_blockcount + new->br_blockcount <=3D MAXEXTLEN) + state |=3D BMAP_LEFT_CONTIG; =20 /* - * set the failure fallback case to look in the selected - * AG as the stream may have moved. + * Check and set flags if this segment has a right neighbor. + * Don't set contiguous if the combined extent would be too large. + * Also check for all-three-contiguous being too large. */ - if (xfs_inode_is_filestream(ap->ip)) - ap->blkno =3D args->fsbno =3D XFS_AGB_TO_FSB(mp, ag, 0); + if (bma->idx < bma->ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)= { + state |=3D BMAP_RIGHT_VALID; + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx + 1), &RIGHT); =20 - return 0; -} + if (isnullstartblock(RIGHT.br_startblock)) + state |=3D BMAP_RIGHT_DELAY; + } =20 -STATIC int -xfs_bmap_btalloc( - xfs_bmalloca_t *ap) /* bmap alloc argument struct */ -{ - xfs_mount_t *mp; /* mount point structure */ - xfs_alloctype_t atype =3D 0; /* type for allocation routines */ - xfs_extlen_t align; /* minimum allocation alignment */ - xfs_agnumber_t fb_agno; /* ag number of ap->firstblock */ - xfs_agnumber_t ag; - xfs_alloc_arg_t args; - xfs_extlen_t blen; - xfs_extlen_t nextminlen =3D 0; - int nullfb; /* true if ap->firstblock isn't set */ - int isaligned; - int tryagain; - int error; + if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && + new_endoff =3D=3D RIGHT.br_startoff && + new->br_startblock + new->br_blockcount =3D=3D RIGHT.br_startblock && + new->br_state =3D=3D RIGHT.br_state && + new->br_blockcount + RIGHT.br_blockcount <=3D MAXEXTLEN && + ((state & (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | + BMAP_RIGHT_FILLING)) !=3D + (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | + BMAP_RIGHT_FILLING) || + LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount + <=3D MAXEXTLEN)) + state |=3D BMAP_RIGHT_CONTIG; =20 - ASSERT(ap->length); + error =3D 0; + /* + * Switch out based on the FILLING and CONTIG state bits. + */ + switch (state & (BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | + BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG)) { + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | + BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: + /* + * Filling in all of a previously delayed allocation extent. + * The left and right neighbors are both contiguous with new. + */ + bma->idx--; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), + LEFT.br_blockcount + PREV.br_blockcount + + RIGHT.br_blockcount); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); =20 - mp =3D ap->ip->i_mount; - align =3D ap->userdata ? xfs_get_extsz_hint(ap->ip) : 0; - if (unlikely(align)) { - error =3D xfs_bmap_extsize_align(mp, &ap->got, &ap->prev, - align, 0, ap->eof, 0, ap->conv, - &ap->offset, &ap->length); - ASSERT(!error); - ASSERT(ap->length); - } - nullfb =3D *ap->firstblock =3D=3D NULLFSBLOCK; - fb_agno =3D nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock); - if (nullfb) { - if (ap->userdata && xfs_inode_is_filestream(ap->ip)) { - ag =3D xfs_filestream_lookup_ag(ap->ip); - ag =3D (ag !=3D NULLAGNUMBER) ? ag : 0; - ap->blkno =3D XFS_AGB_TO_FSB(mp, ag, 0); - } else { - ap->blkno =3D XFS_INO_TO_FSB(mp, ap->ip->i_ino); + xfs_iext_remove(bma->ip, bma->idx + 1, 2, state); + bma->ip->i_d.di_nextents--; + if (bma->cur =3D=3D NULL) + rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; + else { + rval =3D XFS_ILOG_CORE; + error =3D xfs_bmbt_lookup_eq(bma->cur, RIGHT.br_startoff, + RIGHT.br_startblock, + RIGHT.br_blockcount, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + error =3D xfs_btree_delete(bma->cur, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + error =3D xfs_btree_decrement(bma->cur, 0, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + error =3D xfs_bmbt_update(bma->cur, LEFT.br_startoff, + LEFT.br_startblock, + LEFT.br_blockcount + + PREV.br_blockcount + + RIGHT.br_blockcount, LEFT.br_state); + if (error) + goto done; } - } else - ap->blkno =3D *ap->firstblock; + break; + + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: + /* + * Filling in all of a previously delayed allocation extent. + * The left neighbor is contiguous, the right is not. + */ + bma->idx--; + + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), + LEFT.br_blockcount + PREV.br_blockcount); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); + if (bma->cur =3D=3D NULL) + rval =3D XFS_ILOG_DEXT; + else { + rval =3D 0; + error =3D xfs_bmbt_lookup_eq(bma->cur, LEFT.br_startoff, + LEFT.br_startblock, LEFT.br_blockcount, + &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + error =3D xfs_bmbt_update(bma->cur, LEFT.br_startoff, + LEFT.br_startblock, + LEFT.br_blockcount + + PREV.br_blockcount, LEFT.br_state); + if (error) + goto done; + } + break; + + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: + /* + * Filling in all of a previously delayed allocation extent. + * The right neighbor is contiguous, the left is not. + */ + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_startblock(ep, new->br_startblock); + xfs_bmbt_set_blockcount(ep, + PREV.br_blockcount + RIGHT.br_blockcount); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); + if (bma->cur =3D=3D NULL) + rval =3D XFS_ILOG_DEXT; + else { + rval =3D 0; + error =3D xfs_bmbt_lookup_eq(bma->cur, RIGHT.br_startoff, + RIGHT.br_startblock, + RIGHT.br_blockcount, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + error =3D xfs_bmbt_update(bma->cur, PREV.br_startoff, + new->br_startblock, + PREV.br_blockcount + + RIGHT.br_blockcount, PREV.br_state); + if (error) + goto done; + } + break; + + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: + /* + * Filling in all of a previously delayed allocation extent. + * Neither the left nor right neighbors are contiguous with + * the new one. + */ + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_startblock(ep, new->br_startblock); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); =20 - xfs_bmap_adjacent(ap); + bma->ip->i_d.di_nextents++; + if (bma->cur =3D=3D NULL) + rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; + else { + rval =3D XFS_ILOG_CORE; + error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, + new->br_startblock, new->br_blockcount, + &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); + bma->cur->bc_rec.b.br_state =3D XFS_EXT_NORM; + error =3D xfs_btree_insert(bma->cur, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + } + break; =20 - /* - * If allowed, use ap->blkno; otherwise must use firstblock since - * it's in the right allocation group. - */ - if (nullfb || XFS_FSB_TO_AGNO(mp, ap->blkno) =3D=3D fb_agno) - ; - else - ap->blkno =3D *ap->firstblock; - /* - * Normal allocation, done through xfs_alloc_vextent. - */ - tryagain =3D isaligned =3D 0; - memset(&args, 0, sizeof(args)); - args.tp =3D ap->tp; - args.mp =3D mp; - args.fsbno =3D ap->blkno; + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: + /* + * Filling in the first part of a previous delayed allocation. + * The left neighbor is contiguous. + */ + trace_xfs_bmap_pre_update(bma->ip, bma->idx - 1, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx - 1), + LEFT.br_blockcount + new->br_blockcount); + xfs_bmbt_set_startoff(ep, + PREV.br_startoff + new->br_blockcount); + trace_xfs_bmap_post_update(bma->ip, bma->idx - 1, state, _THIS_IP_); =20 - /* Trim the allocation back to the maximum an AG can fit. */ - args.maxlen =3D MIN(ap->length, XFS_ALLOC_AG_MAX_USABLE(mp)); - args.firstblock =3D *ap->firstblock; - blen =3D 0; - if (nullfb) { - error =3D xfs_bmap_btalloc_nullfb(ap, &args, &blen); - if (error) - return error; - } else if (ap->flist->xbf_low) { - if (xfs_inode_is_filestream(ap->ip)) - args.type =3D XFS_ALLOCTYPE_FIRST_AG; - else - args.type =3D XFS_ALLOCTYPE_START_BNO; - args.total =3D args.minlen =3D ap->minlen; - } else { - args.type =3D XFS_ALLOCTYPE_NEAR_BNO; - args.total =3D ap->total; - args.minlen =3D ap->minlen; - } - /* apply extent size hints if obtained earlier */ - if (unlikely(align)) { - args.prod =3D align; - if ((args.mod =3D (xfs_extlen_t)do_mod(ap->offset, args.prod))) - args.mod =3D (xfs_extlen_t)(args.prod - args.mod); - } else if (mp->m_sb.sb_blocksize >=3D PAGE_CACHE_SIZE) { - args.prod =3D 1; - args.mod =3D 0; - } else { - args.prod =3D PAGE_CACHE_SIZE >> mp->m_sb.sb_blocklog; - if ((args.mod =3D (xfs_extlen_t)(do_mod(ap->offset, args.prod)))) - args.mod =3D (xfs_extlen_t)(args.prod - args.mod); - } - /* - * If we are not low on available data blocks, and the - * underlying logical volume manager is a stripe, and - * the file offset is zero then try to allocate data - * blocks on stripe unit boundary. - * NOTE: ap->aeof is only set if the allocation length - * is >=3D the stripe unit and the allocation offset is - * at the end of file. - */ - if (!ap->flist->xbf_low && ap->aeof) { - if (!ap->offset) { - args.alignment =3D mp->m_dalign; - atype =3D args.type; - isaligned =3D 1; - /* - * Adjust for alignment - */ - if (blen > args.alignment && blen <=3D args.maxlen) - args.minlen =3D blen - args.alignment; - args.minalignslop =3D 0; - } else { - /* - * First try an exact bno allocation. - * If it fails then do a near or start bno - * allocation with alignment turned on. - */ - atype =3D args.type; - tryagain =3D 1; - args.type =3D XFS_ALLOCTYPE_THIS_BNO; - args.alignment =3D 1; - /* - * Compute the minlen+alignment for the - * next case. Set slop so that the value - * of minlen+alignment+slop doesn't go up - * between the calls. - */ - if (blen > mp->m_dalign && blen <=3D args.maxlen) - nextminlen =3D blen - mp->m_dalign; - else - nextminlen =3D args.minlen; - if (nextminlen + mp->m_dalign > args.minlen + 1) - args.minalignslop =3D - nextminlen + mp->m_dalign - - args.minlen - 1; - else - args.minalignslop =3D 0; + temp =3D PREV.br_blockcount - new->br_blockcount; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); + if (bma->cur =3D=3D NULL) + rval =3D XFS_ILOG_DEXT; + else { + rval =3D 0; + error =3D xfs_bmbt_lookup_eq(bma->cur, LEFT.br_startoff, + LEFT.br_startblock, LEFT.br_blockcount, + &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + error =3D xfs_bmbt_update(bma->cur, LEFT.br_startoff, + LEFT.br_startblock, + LEFT.br_blockcount + + new->br_blockcount, + LEFT.br_state); + if (error) + goto done; } - } else { - args.alignment =3D 1; - args.minalignslop =3D 0; - } - args.minleft =3D ap->minleft; - args.wasdel =3D ap->wasdel; - args.isfl =3D 0; - args.userdata =3D ap->userdata; - if ((error =3D xfs_alloc_vextent(&args))) - return error; - if (tryagain && args.fsbno =3D=3D NULLFSBLOCK) { + da_new =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), + startblockval(PREV.br_startblock)); + xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + bma->idx--; + break; + + case BMAP_LEFT_FILLING: /* - * Exact allocation failed. Now try with alignment - * turned on. + * Filling in the first part of a previous delayed allocation. + * The left neighbor is not contiguous. */ - args.type =3D atype; - args.fsbno =3D ap->blkno; - args.alignment =3D mp->m_dalign; - args.minlen =3D nextminlen; - args.minalignslop =3D 0; - isaligned =3D 1; - if ((error =3D xfs_alloc_vextent(&args))) - return error; - } - if (isaligned && args.fsbno =3D=3D NULLFSBLOCK) { + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_startoff(ep, new_endoff); + temp =3D PREV.br_blockcount - new->br_blockcount; + xfs_bmbt_set_blockcount(ep, temp); + xfs_iext_insert(bma->ip, bma->idx, 1, new, state); + bma->ip->i_d.di_nextents++; + if (bma->cur =3D=3D NULL) + rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; + else { + rval =3D XFS_ILOG_CORE; + error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, + new->br_startblock, new->br_blockcount, + &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); + bma->cur->bc_rec.b.br_state =3D XFS_EXT_NORM; + error =3D xfs_btree_insert(bma->cur, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + } + + if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { + error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, + &bma->cur, 1, &tmp_rval, XFS_DATA_FORK); + rval |=3D tmp_rval; + if (error) + goto done; + } + da_new =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), + startblockval(PREV.br_startblock) - + (bma->cur ? bma->cur->bc_private.b.allocated : 0)); + ep =3D xfs_iext_get_ext(ifp, bma->idx + 1); + xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); + trace_xfs_bmap_post_update(bma->ip, bma->idx + 1, state, _THIS_IP_); + break; + + case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* - * allocation failed, so turn off alignment and - * try again. + * Filling in the last part of a previous delayed allocation. + * The right neighbor is contiguous with the new allocation. */ - args.type =3D atype; - args.fsbno =3D ap->blkno; - args.alignment =3D 0; - if ((error =3D xfs_alloc_vextent(&args))) - return error; - } - if (args.fsbno =3D=3D NULLFSBLOCK && nullfb && - args.minlen > ap->minlen) { - args.minlen =3D ap->minlen; - args.type =3D XFS_ALLOCTYPE_START_BNO; - args.fsbno =3D ap->blkno; - if ((error =3D xfs_alloc_vextent(&args))) - return error; - } - if (args.fsbno =3D=3D NULLFSBLOCK && nullfb) { - args.fsbno =3D 0; - args.type =3D XFS_ALLOCTYPE_FIRST_AG; - args.total =3D ap->minlen; - args.minleft =3D 0; - if ((error =3D xfs_alloc_vextent(&args))) - return error; - ap->flist->xbf_low =3D 1; - } - if (args.fsbno !=3D NULLFSBLOCK) { + temp =3D PREV.br_blockcount - new->br_blockcount; + trace_xfs_bmap_pre_update(bma->ip, bma->idx + 1, state, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); + xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, bma->idx + 1), + new->br_startoff, new->br_startblock, + new->br_blockcount + RIGHT.br_blockcount, + RIGHT.br_state); + trace_xfs_bmap_post_update(bma->ip, bma->idx + 1, state, _THIS_IP_); + if (bma->cur =3D=3D NULL) + rval =3D XFS_ILOG_DEXT; + else { + rval =3D 0; + error =3D xfs_bmbt_lookup_eq(bma->cur, RIGHT.br_startoff, + RIGHT.br_startblock, + RIGHT.br_blockcount, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + error =3D xfs_bmbt_update(bma->cur, new->br_startoff, + new->br_startblock, + new->br_blockcount + + RIGHT.br_blockcount, + RIGHT.br_state); + if (error) + goto done; + } + + da_new =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), + startblockval(PREV.br_startblock)); + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + bma->idx++; + break; + + case BMAP_RIGHT_FILLING: /* - * check the allocation happened at the same or higher AG than - * the first block that was allocated. + * Filling in the last part of a previous delayed allocation. + * The right neighbor is not contiguous. */ - ASSERT(*ap->firstblock =3D=3D NULLFSBLOCK || - XFS_FSB_TO_AGNO(mp, *ap->firstblock) =3D=3D - XFS_FSB_TO_AGNO(mp, args.fsbno) || - (ap->flist->xbf_low && - XFS_FSB_TO_AGNO(mp, *ap->firstblock) < - XFS_FSB_TO_AGNO(mp, args.fsbno))); + temp =3D PREV.br_blockcount - new->br_blockcount; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); + xfs_iext_insert(bma->ip, bma->idx + 1, 1, new, state); + bma->ip->i_d.di_nextents++; + if (bma->cur =3D=3D NULL) + rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; + else { + rval =3D XFS_ILOG_CORE; + error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, + new->br_startblock, new->br_blockcount, + &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); + bma->cur->bc_rec.b.br_state =3D XFS_EXT_NORM; + error =3D xfs_btree_insert(bma->cur, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + } =20 - ap->blkno =3D args.fsbno; - if (*ap->firstblock =3D=3D NULLFSBLOCK) - *ap->firstblock =3D args.fsbno; - ASSERT(nullfb || fb_agno =3D=3D args.agno || - (ap->flist->xbf_low && fb_agno < args.agno)); - ap->length =3D args.len; - ap->ip->i_d.di_nblocks +=3D args.len; - xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE); - if (ap->wasdel) - ap->ip->i_delayed_blks -=3D args.len; + if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { + error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, &bma->cur, 1, + &tmp_rval, XFS_DATA_FORK); + rval |=3D tmp_rval; + if (error) + goto done; + } + da_new =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(bma->ip, temp), + startblockval(PREV.br_startblock) - + (bma->cur ? bma->cur->bc_private.b.allocated : 0)); + ep =3D xfs_iext_get_ext(ifp, bma->idx); + xfs_bmbt_set_startblock(ep, nullstartblock(da_new)); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + bma->idx++; + break; + + case 0: /* - * Adjust the disk quota also. This was reserved - * earlier. + * Filling in the middle part of a previous delayed allocation. + * Contiguity is impossible here. + * This case is avoided almost all the time. + * + * We start with a delayed allocation: + * + * +ddddddddddddddddddddddddddddddddddddddddddddddddddddddd+ + * PREV @ idx + * + * and we are allocating: + * +rrrrrrrrrrrrrrrrr+ + * new + * + * and we set it up for insertion as: + * +ddddddddddddddddddd+rrrrrrrrrrrrrrrrr+ddddddddddddddddd+ + * new + * PREV @ idx LEFT RIGHT + * inserted at idx + 1 */ - xfs_trans_mod_dquot_byino(ap->tp, ap->ip, - ap->wasdel ? XFS_TRANS_DQ_DELBCOUNT : - XFS_TRANS_DQ_BCOUNT, - (long) args.len); - } else { - ap->blkno =3D NULLFSBLOCK; - ap->length =3D 0; - } - return 0; -} + temp =3D new->br_startoff - PREV.br_startoff; + temp2 =3D PREV.br_startoff + PREV.br_blockcount - new_endoff; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, 0, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); /* truncate PREV */ + LEFT =3D *new; + RIGHT.br_state =3D PREV.br_state; + RIGHT.br_startblock =3D nullstartblock( + (int)xfs_bmap_worst_indlen(bma->ip, temp2)); + RIGHT.br_startoff =3D new_endoff; + RIGHT.br_blockcount =3D temp2; + /* insert LEFT (r[0]) and RIGHT (r[1]) at the same time */ + xfs_iext_insert(bma->ip, bma->idx + 1, 2, &LEFT, state); + bma->ip->i_d.di_nextents++; + if (bma->cur =3D=3D NULL) + rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; + else { + rval =3D XFS_ILOG_CORE; + error =3D xfs_bmbt_lookup_eq(bma->cur, new->br_startoff, + new->br_startblock, new->br_blockcount, + &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); + bma->cur->bc_rec.b.br_state =3D XFS_EXT_NORM; + error =3D xfs_btree_insert(bma->cur, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + } =20 -/* - * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. - * It figures out where to ask the underlying allocator to put the new ext= ent. - */ -STATIC int -xfs_bmap_alloc( - xfs_bmalloca_t *ap) /* bmap alloc argument struct */ -{ - if (XFS_IS_REALTIME_INODE(ap->ip) && ap->userdata) - return xfs_bmap_rtalloc(ap); - return xfs_bmap_btalloc(ap); -} + if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { + error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, &bma->cur, + 1, &tmp_rval, XFS_DATA_FORK); + rval |=3D tmp_rval; + if (error) + goto done; + } + temp =3D xfs_bmap_worst_indlen(bma->ip, temp); + temp2 =3D xfs_bmap_worst_indlen(bma->ip, temp2); + diff =3D (int)(temp + temp2 - startblockval(PREV.br_startblock) - + (bma->cur ? bma->cur->bc_private.b.allocated : 0)); + if (diff > 0) { + error =3D xfs_icsb_modify_counters(bma->ip->i_mount, + XFS_SBS_FDBLOCKS, + -((int64_t)diff), 0); + ASSERT(!error); + if (error) + goto done; + } =20 -/* - * Transform a btree format file with only one leaf node, where the - * extents list will fit in the inode, into an extents format file. - * Since the file extents are already in-core, all we have to do is - * give up the space for the btree root and pitch the leaf block. - */ -STATIC int /* error */ -xfs_bmap_btree_to_extents( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_btree_cur_t *cur, /* btree cursor */ - int *logflagsp, /* inode logging flags */ - int whichfork) /* data or attr fork */ -{ - /* REFERENCED */ - struct xfs_btree_block *cblock;/* child btree block */ - xfs_fsblock_t cbno; /* child block number */ - xfs_buf_t *cbp; /* child block's buffer */ - int error; /* error return value */ - xfs_ifork_t *ifp; /* inode fork data */ - xfs_mount_t *mp; /* mount point structure */ - __be64 *pp; /* ptr to block address */ - struct xfs_btree_block *rblock;/* root btree block */ + ep =3D xfs_iext_get_ext(ifp, bma->idx); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(bma->ip, bma->idx + 2, state, _THIS_IP_); + xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, bma->idx + 2), + nullstartblock((int)temp2)); + trace_xfs_bmap_post_update(bma->ip, bma->idx + 2, state, _THIS_IP_); =20 - mp =3D ip->i_mount; - ifp =3D XFS_IFORK_PTR(ip, whichfork); - ASSERT(ifp->if_flags & XFS_IFEXTENTS); - ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_BTREE); - rblock =3D ifp->if_broot; - ASSERT(be16_to_cpu(rblock->bb_level) =3D=3D 1); - ASSERT(be16_to_cpu(rblock->bb_numrecs) =3D=3D 1); - ASSERT(xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0) =3D=3D 1); - pp =3D XFS_BMAP_BROOT_PTR_ADDR(mp, rblock, 1, ifp->if_broot_bytes); - cbno =3D be64_to_cpu(*pp); - *logflagsp =3D 0; -#ifdef DEBUG - if ((error =3D xfs_btree_check_lptr(cur, cbno, 1))) - return error; -#endif - error =3D xfs_btree_read_bufl(mp, tp, cbno, 0, &cbp, XFS_BMAP_BTREE_REF, - &xfs_bmbt_buf_ops); - if (error) - return error; - cblock =3D XFS_BUF_TO_BLOCK(cbp); - if ((error =3D xfs_btree_check_block(cur, cblock, 0, cbp))) - return error; - xfs_bmap_add_free(cbno, 1, cur->bc_private.b.flist, mp); - ip->i_d.di_nblocks--; - xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); - xfs_trans_binval(tp, cbp); - if (cur->bc_bufs[0] =3D=3D cbp) - cur->bc_bufs[0] =3D NULL; - xfs_iroot_realloc(ip, -1, whichfork); - ASSERT(ifp->if_broot =3D=3D NULL); - ASSERT((ifp->if_flags & XFS_IFBROOT) =3D=3D 0); - XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); - *logflagsp =3D XFS_ILOG_CORE | xfs_ilog_fext(whichfork); - return 0; + bma->idx++; + da_new =3D temp + temp2; + break; + + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_LEFT_FILLING | BMAP_RIGHT_CONTIG: + case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: + case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_LEFT_CONTIG: + case BMAP_RIGHT_CONTIG: + /* + * These cases are all impossible. + */ + ASSERT(0); + } + + /* convert to a btree if necessary */ + if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(bma->cur =3D=3D NULL); + error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, &bma->cur, + da_old > 0, &tmp_logflags, XFS_DATA_FORK); + bma->logflags |=3D tmp_logflags; + if (error) + goto done; + } + + /* adjust for changes in reserved delayed indirect blocks */ + if (da_old || da_new) { + temp =3D da_new; + if (bma->cur) + temp +=3D bma->cur->bc_private.b.allocated; + ASSERT(temp <=3D da_old); + if (temp < da_old) + xfs_icsb_modify_counters(bma->ip->i_mount, + XFS_SBS_FDBLOCKS, + (int64_t)(da_old - temp), 0); + } + + /* clear out the allocated field, done with it now in any case. */ + if (bma->cur) + bma->cur->bc_private.b.allocated =3D 0; + + xfs_bmap_check_leaf_extents(bma->cur, bma->ip, XFS_DATA_FORK); +done: + bma->logflags |=3D rval; + return error; +#undef LEFT +#undef RIGHT +#undef PREV } =20 /* - * Called by xfs_bmapi to update file extent records and the btree - * after removing space (or undoing a delayed allocation). + * Convert an unwritten allocation to a real allocation or vice versa. */ STATIC int /* error */ -xfs_bmap_del_extent( +xfs_bmap_add_extent_unwritten_real( + struct xfs_trans *tp, xfs_inode_t *ip, /* incore inode pointer */ - xfs_trans_t *tp, /* current transaction pointer */ - xfs_extnum_t *idx, /* extent number to update/delete */ + xfs_extnum_t *idx, /* extent number to update/insert */ + xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ + xfs_bmbt_irec_t *new, /* new data to add to file extents */ + xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ - xfs_btree_cur_t *cur, /* if null, not a btree */ - xfs_bmbt_irec_t *del, /* data to remove from extents */ - int *logflagsp, /* inode logging flags */ - int whichfork) /* data or attr fork */ + int *logflagsp) /* inode logging flags */ { - xfs_filblks_t da_new; /* new delay-alloc indirect blocks */ - xfs_filblks_t da_old; /* old delay-alloc indirect blocks */ - xfs_fsblock_t del_endblock=3D0; /* first block past del */ - xfs_fileoff_t del_endoff; /* first offset past del */ - int delay; /* current block is delayed allocated */ - int do_fx; /* free extent at end of routine */ - xfs_bmbt_rec_host_t *ep; /* current extent entry pointer */ + xfs_btree_cur_t *cur; /* btree cursor */ + xfs_bmbt_rec_host_t *ep; /* extent entry for idx */ int error; /* error return value */ - int flags; /* inode logging flags */ - xfs_bmbt_irec_t got; /* current extent entry */ - xfs_fileoff_t got_endoff; /* first offset past got */ int i; /* temp state */ xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_mount_t *mp; /* mount structure */ - xfs_filblks_t nblks; /* quota/sb block count */ - xfs_bmbt_irec_t new; /* new record to be inserted */ - /* REFERENCED */ - uint qfield; /* quota field to update */ - xfs_filblks_t temp; /* for indirect length calculations */ - xfs_filblks_t temp2; /* for indirect length calculations */ - int state =3D 0; + xfs_fileoff_t new_endoff; /* end offset of new entry */ + xfs_exntst_t newext; /* new extent state */ + xfs_exntst_t oldext; /* old extent state */ + xfs_bmbt_irec_t r[3]; /* neighbor extent entries */ + /* left is 0, right is 1, prev is 2 */ + int rval=3D0; /* return value (logging flags) */ + int state =3D 0;/* state bits, accessed thru macros */ =20 - XFS_STATS_INC(xs_del_exlist); + *logflagsp =3D 0; =20 - if (whichfork =3D=3D XFS_ATTR_FORK) - state |=3D BMAP_ATTRFORK; + cur =3D *curp; + ifp =3D XFS_IFORK_PTR(ip, XFS_DATA_FORK); =20 - mp =3D ip->i_mount; - ifp =3D XFS_IFORK_PTR(ip, whichfork); - ASSERT((*idx >=3D 0) && (*idx < ifp->if_bytes / - (uint)sizeof(xfs_bmbt_rec_t))); - ASSERT(del->br_blockcount > 0); - ep =3D xfs_iext_get_ext(ifp, *idx); - xfs_bmbt_get_all(ep, &got); - ASSERT(got.br_startoff <=3D del->br_startoff); - del_endoff =3D del->br_startoff + del->br_blockcount; - got_endoff =3D got.br_startoff + got.br_blockcount; - ASSERT(got_endoff >=3D del_endoff); - delay =3D isnullstartblock(got.br_startblock); - ASSERT(isnullstartblock(del->br_startblock) =3D=3D delay); - flags =3D 0; - qfield =3D 0; + ASSERT(*idx >=3D 0); + ASSERT(*idx <=3D ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); + ASSERT(!isnullstartblock(new->br_startblock)); + + XFS_STATS_INC(xs_add_exlist); + +#define LEFT r[0] +#define RIGHT r[1] +#define PREV r[2] + + /* + * Set up a bunch of variables to make the tests simpler. + */ error =3D 0; + ep =3D xfs_iext_get_ext(ifp, *idx); + xfs_bmbt_get_all(ep, &PREV); + newext =3D new->br_state; + oldext =3D (newext =3D=3D XFS_EXT_UNWRITTEN) ? + XFS_EXT_NORM : XFS_EXT_UNWRITTEN; + ASSERT(PREV.br_state =3D=3D oldext); + new_endoff =3D new->br_startoff + new->br_blockcount; + ASSERT(PREV.br_startoff <=3D new->br_startoff); + ASSERT(PREV.br_startoff + PREV.br_blockcount >=3D new_endoff); + /* - * If deleting a real allocation, must free up the disk space. + * Set flags determining what part of the previous oldext allocation + * extent is being replaced by a newext allocation. */ - if (!delay) { - flags =3D XFS_ILOG_CORE; - /* - * Realtime allocation. Free it and record di_nblocks update. - */ - if (whichfork =3D=3D XFS_DATA_FORK && XFS_IS_REALTIME_INODE(ip)) { - xfs_fsblock_t bno; - xfs_filblks_t len; + if (PREV.br_startoff =3D=3D new->br_startoff) + state |=3D BMAP_LEFT_FILLING; + if (PREV.br_startoff + PREV.br_blockcount =3D=3D new_endoff) + state |=3D BMAP_RIGHT_FILLING; =20 - ASSERT(do_mod(del->br_blockcount, - mp->m_sb.sb_rextsize) =3D=3D 0); - ASSERT(do_mod(del->br_startblock, - mp->m_sb.sb_rextsize) =3D=3D 0); - bno =3D del->br_startblock; - len =3D del->br_blockcount; - do_div(bno, mp->m_sb.sb_rextsize); - do_div(len, mp->m_sb.sb_rextsize); - error =3D xfs_rtfree_extent(tp, bno, (xfs_extlen_t)len); - if (error) - goto done; - do_fx =3D 0; - nblks =3D len * mp->m_sb.sb_rextsize; - qfield =3D XFS_TRANS_DQ_RTBCOUNT; - } - /* - * Ordinary allocation. - */ - else { - do_fx =3D 1; - nblks =3D del->br_blockcount; - qfield =3D XFS_TRANS_DQ_BCOUNT; - } - /* - * Set up del_endblock and cur for later. - */ - del_endblock =3D del->br_startblock + del->br_blockcount; - if (cur) { - if ((error =3D xfs_bmbt_lookup_eq(cur, got.br_startoff, - got.br_startblock, got.br_blockcount, - &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - } - da_old =3D da_new =3D 0; - } else { - da_old =3D startblockval(got.br_startblock); - da_new =3D 0; - nblks =3D 0; - do_fx =3D 0; + /* + * Check and set flags if this segment has a left neighbor. + * Don't set contiguous if the combined extent would be too large. + */ + if (*idx > 0) { + state |=3D BMAP_LEFT_VALID; + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx - 1), &LEFT); + + if (isnullstartblock(LEFT.br_startblock)) + state |=3D BMAP_LEFT_DELAY; } + + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && + LEFT.br_startoff + LEFT.br_blockcount =3D=3D new->br_startoff && + LEFT.br_startblock + LEFT.br_blockcount =3D=3D new->br_startblock && + LEFT.br_state =3D=3D newext && + LEFT.br_blockcount + new->br_blockcount <=3D MAXEXTLEN) + state |=3D BMAP_LEFT_CONTIG; + /* - * Set flag value to use in switch statement. - * Left-contig is 2, right-contig is 1. + * Check and set flags if this segment has a right neighbor. + * Don't set contiguous if the combined extent would be too large. + * Also check for all-three-contiguous being too large. */ - switch (((got.br_startoff =3D=3D del->br_startoff) << 1) | - (got_endoff =3D=3D del_endoff)) { - case 3: - /* - * Matches the whole extent. Delete the entry. - */ - xfs_iext_remove(ip, *idx, 1, - whichfork =3D=3D XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); - --*idx; - if (delay) - break; + if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { + state |=3D BMAP_RIGHT_VALID; + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx + 1), &RIGHT); + if (isnullstartblock(RIGHT.br_startblock)) + state |=3D BMAP_RIGHT_DELAY; + } =20 - XFS_IFORK_NEXT_SET(ip, whichfork, - XFS_IFORK_NEXTENTS(ip, whichfork) - 1); - flags |=3D XFS_ILOG_CORE; - if (!cur) { - flags |=3D xfs_ilog_fext(whichfork); - break; - } - if ((error =3D xfs_btree_delete(cur, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - break; + if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && + new_endoff =3D=3D RIGHT.br_startoff && + new->br_startblock + new->br_blockcount =3D=3D RIGHT.br_startblock && + newext =3D=3D RIGHT.br_state && + new->br_blockcount + RIGHT.br_blockcount <=3D MAXEXTLEN && + ((state & (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | + BMAP_RIGHT_FILLING)) !=3D + (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | + BMAP_RIGHT_FILLING) || + LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount + <=3D MAXEXTLEN)) + state |=3D BMAP_RIGHT_CONTIG; =20 - case 2: + /* + * Switch out based on the FILLING and CONTIG state bits. + */ + switch (state & (BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | + BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG)) { + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | + BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* - * Deleting the first part of the extent. + * Setting all of a previous oldext extent to newext. + * The left and right neighbors are both contiguous with new. */ + --*idx; + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_startoff(ep, del_endoff); - temp =3D got.br_blockcount - del->br_blockcount; - xfs_bmbt_set_blockcount(ep, temp); - if (delay) { - temp =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - da_old); - xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - da_new =3D temp; - break; - } - xfs_bmbt_set_startblock(ep, del_endblock); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), + LEFT.br_blockcount + PREV.br_blockcount + + RIGHT.br_blockcount); trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - if (!cur) { - flags |=3D xfs_ilog_fext(whichfork); - break; + + xfs_iext_remove(ip, *idx + 1, 2, state); + ip->i_d.di_nextents -=3D 2; + if (cur =3D=3D NULL) + rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; + else { + rval =3D XFS_ILOG_CORE; + if ((error =3D xfs_bmbt_lookup_eq(cur, RIGHT.br_startoff, + RIGHT.br_startblock, + RIGHT.br_blockcount, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_btree_delete(cur, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_btree_decrement(cur, 0, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_btree_delete(cur, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_btree_decrement(cur, 0, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_bmbt_update(cur, LEFT.br_startoff, + LEFT.br_startblock, + LEFT.br_blockcount + PREV.br_blockcount + + RIGHT.br_blockcount, LEFT.br_state))) + goto done; } - if ((error =3D xfs_bmbt_update(cur, del_endoff, del_endblock, - got.br_blockcount - del->br_blockcount, - got.br_state))) - goto done; break; =20 - case 1: + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: /* - * Deleting the last part of the extent. + * Setting all of a previous oldext extent to newext. + * The left neighbor is contiguous, the right is not. */ - temp =3D got.br_blockcount - del->br_blockcount; + --*idx; + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, temp); - if (delay) { - temp =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - da_old); - xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - da_new =3D temp; - break; - } + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), + LEFT.br_blockcount + PREV.br_blockcount); trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - if (!cur) { - flags |=3D xfs_ilog_fext(whichfork); - break; + + xfs_iext_remove(ip, *idx + 1, 1, state); + ip->i_d.di_nextents--; + if (cur =3D=3D NULL) + rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; + else { + rval =3D XFS_ILOG_CORE; + if ((error =3D xfs_bmbt_lookup_eq(cur, PREV.br_startoff, + PREV.br_startblock, PREV.br_blockcount, + &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_btree_delete(cur, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_btree_decrement(cur, 0, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_bmbt_update(cur, LEFT.br_startoff, + LEFT.br_startblock, + LEFT.br_blockcount + PREV.br_blockcount, + LEFT.br_state))) + goto done; } - if ((error =3D xfs_bmbt_update(cur, got.br_startoff, - got.br_startblock, - got.br_blockcount - del->br_blockcount, - got.br_state))) - goto done; break; =20 - case 0: + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* - * Deleting the middle of the extent. + * Setting all of a previous oldext extent to newext. + * The right neighbor is contiguous, the left is not. */ - temp =3D del->br_startoff - got.br_startoff; trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, temp); - new.br_startoff =3D del_endoff; - temp2 =3D got_endoff - del_endoff; - new.br_blockcount =3D temp2; - new.br_state =3D got.br_state; - if (!delay) { - new.br_startblock =3D del_endblock; - flags |=3D XFS_ILOG_CORE; - if (cur) { - if ((error =3D xfs_bmbt_update(cur, - got.br_startoff, - got.br_startblock, temp, - got.br_state))) - goto done; - if ((error =3D xfs_btree_increment(cur, 0, &i))) - goto done; - cur->bc_rec.b =3D new; - error =3D xfs_btree_insert(cur, &i); - if (error && error !=3D ENOSPC) - goto done; - /* - * If get no-space back from btree insert, - * it tried a split, and we have a zero - * block reservation. - * Fix up our state and return the error. - */ - if (error =3D=3D ENOSPC) { - /* - * Reset the cursor, don't trust - * it after any insert operation. - */ - if ((error =3D xfs_bmbt_lookup_eq(cur, - got.br_startoff, - got.br_startblock, - temp, &i))) - goto done; - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - /* - * Update the btree record back - * to the original value. - */ - if ((error =3D xfs_bmbt_update(cur, - got.br_startoff, - got.br_startblock, - got.br_blockcount, - got.br_state))) - goto done; - /* - * Reset the extent record back - * to the original value. - */ - xfs_bmbt_set_blockcount(ep, - got.br_blockcount); - flags =3D 0; - error =3D XFS_ERROR(ENOSPC); - goto done; - } - XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); - } else - flags |=3D xfs_ilog_fext(whichfork); - XFS_IFORK_NEXT_SET(ip, whichfork, - XFS_IFORK_NEXTENTS(ip, whichfork) + 1); - } else { - ASSERT(whichfork =3D=3D XFS_DATA_FORK); - temp =3D xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); - temp2 =3D xfs_bmap_worst_indlen(ip, temp2); - new.br_startblock =3D nullstartblock((int)temp2); - da_new =3D temp + temp2; - while (da_new > da_old) { - if (temp) { - temp--; - da_new--; - xfs_bmbt_set_startblock(ep, - nullstartblock((int)temp)); - } - if (da_new =3D=3D da_old) - break; - if (temp2) { - temp2--; - da_new--; - new.br_startblock =3D - nullstartblock((int)temp2); - } - } - } + xfs_bmbt_set_blockcount(ep, + PREV.br_blockcount + RIGHT.br_blockcount); + xfs_bmbt_set_state(ep, newext); trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); - xfs_iext_insert(ip, *idx + 1, 1, &new, state); - ++*idx; - break; - } - /* - * If we need to, add to list of extents to delete. - */ - if (do_fx) - xfs_bmap_add_free(del->br_startblock, del->br_blockcount, flist, - mp); - /* - * Adjust inode # blocks in the file. - */ - if (nblks) - ip->i_d.di_nblocks -=3D nblks; - /* - * Adjust quota data. - */ - if (qfield) - xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks); - - /* - * Account for change in delayed indirect blocks. - * Nothing to do for disk quota accounting here. - */ - ASSERT(da_old >=3D da_new); - if (da_old > da_new) { - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - (int64_t)(da_old - da_new), 0); - } -done: - *logflagsp =3D flags; - return error; -} + xfs_iext_remove(ip, *idx + 1, 1, state); + ip->i_d.di_nextents--; + if (cur =3D=3D NULL) + rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; + else { + rval =3D XFS_ILOG_CORE; + if ((error =3D xfs_bmbt_lookup_eq(cur, RIGHT.br_startoff, + RIGHT.br_startblock, + RIGHT.br_blockcount, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_btree_delete(cur, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_btree_decrement(cur, 0, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_bmbt_update(cur, new->br_startoff, + new->br_startblock, + new->br_blockcount + RIGHT.br_blockcount, + newext))) + goto done; + } + break; =20 -/* - * Remove the entry "free" from the free item list. Prev points to the - * previous entry, unless "free" is the head of the list. - */ -void -xfs_bmap_del_free( - xfs_bmap_free_t *flist, /* free item list header */ - xfs_bmap_free_item_t *prev, /* previous item on list, if any */ - xfs_bmap_free_item_t *free) /* list item to be freed */ -{ - if (prev) - prev->xbfi_next =3D free->xbfi_next; - else - flist->xbf_first =3D free->xbfi_next; - flist->xbf_count--; - kmem_zone_free(xfs_bmap_free_item_zone, free); -} + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: + /* + * Setting all of a previous oldext extent to newext. + * Neither the left nor right neighbors are contiguous with + * the new one. + */ + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_state(ep, newext); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 -/* - * Convert an extents-format file into a btree-format file. - * The new file will have a root block (in the inode) and a single child b= lock. - */ -STATIC int /* error */ -xfs_bmap_extents_to_btree( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fsblock_t *firstblock, /* first-block-allocated */ - xfs_bmap_free_t *flist, /* blocks freed in xaction */ - xfs_btree_cur_t **curp, /* cursor returned to caller */ - int wasdel, /* converting a delayed alloc */ - int *logflagsp, /* inode logging flags */ - int whichfork) /* data or attr fork */ -{ - struct xfs_btree_block *ablock; /* allocated (child) bt block */ - xfs_buf_t *abp; /* buffer for ablock */ - xfs_alloc_arg_t args; /* allocation arguments */ - xfs_bmbt_rec_t *arp; /* child record pointer */ - struct xfs_btree_block *block; /* btree root block */ - xfs_btree_cur_t *cur; /* bmap btree cursor */ - xfs_bmbt_rec_host_t *ep; /* extent record pointer */ - int error; /* error return value */ - xfs_extnum_t i, cnt; /* extent record index */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_bmbt_key_t *kp; /* root block key pointer */ - xfs_mount_t *mp; /* mount structure */ - xfs_extnum_t nextents; /* number of file extents */ - xfs_bmbt_ptr_t *pp; /* root block address pointer */ + if (cur =3D=3D NULL) + rval =3D XFS_ILOG_DEXT; + else { + rval =3D 0; + if ((error =3D xfs_bmbt_lookup_eq(cur, new->br_startoff, + new->br_startblock, new->br_blockcount, + &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_bmbt_update(cur, new->br_startoff, + new->br_startblock, new->br_blockcount, + newext))) + goto done; + } + break; =20 - ifp =3D XFS_IFORK_PTR(ip, whichfork); - ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS); + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: + /* + * Setting the first part of a previous oldext extent to newext. + * The left neighbor is contiguous. + */ + trace_xfs_bmap_pre_update(ip, *idx - 1, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx - 1), + LEFT.br_blockcount + new->br_blockcount); + xfs_bmbt_set_startoff(ep, + PREV.br_startoff + new->br_blockcount); + trace_xfs_bmap_post_update(ip, *idx - 1, state, _THIS_IP_); =20 - /* - * Make space in the inode incore. - */ - xfs_iroot_realloc(ip, 1, whichfork); - ifp->if_flags |=3D XFS_IFBROOT; + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_startblock(ep, + new->br_startblock + new->br_blockcount); + xfs_bmbt_set_blockcount(ep, + PREV.br_blockcount - new->br_blockcount); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 - /* - * Fill in the root. - */ - block =3D ifp->if_broot; - block->bb_magic =3D cpu_to_be32(XFS_BMAP_MAGIC); - block->bb_level =3D cpu_to_be16(1); - block->bb_numrecs =3D cpu_to_be16(1); - block->bb_u.l.bb_leftsib =3D cpu_to_be64(NULLDFSBNO); - block->bb_u.l.bb_rightsib =3D cpu_to_be64(NULLDFSBNO); + --*idx; =20 - /* - * Need a cursor. Can't allocate until bb_level is filled in. - */ - mp =3D ip->i_mount; - cur =3D xfs_bmbt_init_cursor(mp, tp, ip, whichfork); - cur->bc_private.b.firstblock =3D *firstblock; - cur->bc_private.b.flist =3D flist; - cur->bc_private.b.flags =3D wasdel ? XFS_BTCUR_BPRV_WASDEL : 0; - /* - * Convert to a btree with two levels, one record in root. - */ - XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_BTREE); - memset(&args, 0, sizeof(args)); - args.tp =3D tp; - args.mp =3D mp; - args.firstblock =3D *firstblock; - if (*firstblock =3D=3D NULLFSBLOCK) { - args.type =3D XFS_ALLOCTYPE_START_BNO; - args.fsbno =3D XFS_INO_TO_FSB(mp, ip->i_ino); - } else if (flist->xbf_low) { - args.type =3D XFS_ALLOCTYPE_START_BNO; - args.fsbno =3D *firstblock; - } else { - args.type =3D XFS_ALLOCTYPE_NEAR_BNO; - args.fsbno =3D *firstblock; - } - args.minlen =3D args.maxlen =3D args.prod =3D 1; - args.wasdel =3D wasdel; - *logflagsp =3D 0; - if ((error =3D xfs_alloc_vextent(&args))) { - xfs_iroot_realloc(ip, -1, whichfork); - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); - return error; - } - /* - * Allocation can't fail, the space was reserved. - */ - ASSERT(args.fsbno !=3D NULLFSBLOCK); - ASSERT(*firstblock =3D=3D NULLFSBLOCK || - args.agno =3D=3D XFS_FSB_TO_AGNO(mp, *firstblock) || - (flist->xbf_low && - args.agno > XFS_FSB_TO_AGNO(mp, *firstblock))); - *firstblock =3D cur->bc_private.b.firstblock =3D args.fsbno; - cur->bc_private.b.allocated++; - ip->i_d.di_nblocks++; - xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L); - abp =3D xfs_btree_get_bufl(mp, tp, args.fsbno, 0); - /* - * Fill in the child block. - */ - abp->b_ops =3D &xfs_bmbt_buf_ops; - ablock =3D XFS_BUF_TO_BLOCK(abp); - ablock->bb_magic =3D cpu_to_be32(XFS_BMAP_MAGIC); - ablock->bb_level =3D 0; - ablock->bb_u.l.bb_leftsib =3D cpu_to_be64(NULLDFSBNO); - ablock->bb_u.l.bb_rightsib =3D cpu_to_be64(NULLDFSBNO); - arp =3D XFS_BMBT_REC_ADDR(mp, ablock, 1); - nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - for (cnt =3D i =3D 0; i < nextents; i++) { - ep =3D xfs_iext_get_ext(ifp, i); - if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) { - arp->l0 =3D cpu_to_be64(ep->l0); - arp->l1 =3D cpu_to_be64(ep->l1); - arp++; cnt++; + if (cur =3D=3D NULL) + rval =3D XFS_ILOG_DEXT; + else { + rval =3D 0; + if ((error =3D xfs_bmbt_lookup_eq(cur, PREV.br_startoff, + PREV.br_startblock, PREV.br_blockcount, + &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_bmbt_update(cur, + PREV.br_startoff + new->br_blockcount, + PREV.br_startblock + new->br_blockcount, + PREV.br_blockcount - new->br_blockcount, + oldext))) + goto done; + if ((error =3D xfs_btree_decrement(cur, 0, &i))) + goto done; + error =3D xfs_bmbt_update(cur, LEFT.br_startoff, + LEFT.br_startblock, + LEFT.br_blockcount + new->br_blockcount, + LEFT.br_state); + if (error) + goto done; } - } - ASSERT(cnt =3D=3D XFS_IFORK_NEXTENTS(ip, whichfork)); - xfs_btree_set_numrecs(ablock, cnt); - - /* - * Fill in the root key and pointer. - */ - kp =3D XFS_BMBT_KEY_ADDR(mp, block, 1); - arp =3D XFS_BMBT_REC_ADDR(mp, ablock, 1); - kp->br_startoff =3D cpu_to_be64(xfs_bmbt_disk_get_startoff(arp)); - pp =3D XFS_BMBT_PTR_ADDR(mp, block, 1, xfs_bmbt_get_maxrecs(cur, - be16_to_cpu(block->bb_level))); - *pp =3D cpu_to_be64(args.fsbno); + break; =20 - /* - * Do all this logging at the end so that - * the root is at the right level. - */ - xfs_btree_log_block(cur, abp, XFS_BB_ALL_BITS); - xfs_btree_log_recs(cur, abp, 1, be16_to_cpu(ablock->bb_numrecs)); - ASSERT(*curp =3D=3D NULL); - *curp =3D cur; - *logflagsp =3D XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork); - return 0; -} + case BMAP_LEFT_FILLING: + /* + * Setting the first part of a previous oldext extent to newext. + * The left neighbor is not contiguous. + */ + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + ASSERT(ep && xfs_bmbt_get_state(ep) =3D=3D oldext); + xfs_bmbt_set_startoff(ep, new_endoff); + xfs_bmbt_set_blockcount(ep, + PREV.br_blockcount - new->br_blockcount); + xfs_bmbt_set_startblock(ep, + new->br_startblock + new->br_blockcount); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 -/* - * Calculate the default attribute fork offset for newly created inodes. - */ -uint -xfs_default_attroffset( - struct xfs_inode *ip) -{ - struct xfs_mount *mp =3D ip->i_mount; - uint offset; + xfs_iext_insert(ip, *idx, 1, new, state); + ip->i_d.di_nextents++; + if (cur =3D=3D NULL) + rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; + else { + rval =3D XFS_ILOG_CORE; + if ((error =3D xfs_bmbt_lookup_eq(cur, PREV.br_startoff, + PREV.br_startblock, PREV.br_blockcount, + &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_bmbt_update(cur, + PREV.br_startoff + new->br_blockcount, + PREV.br_startblock + new->br_blockcount, + PREV.br_blockcount - new->br_blockcount, + oldext))) + goto done; + cur->bc_rec.b =3D *new; + if ((error =3D xfs_btree_insert(cur, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + } + break; =20 - if (mp->m_sb.sb_inodesize =3D=3D 256) { - offset =3D XFS_LITINO(mp) - - XFS_BMDR_SPACE_CALC(MINABTPTRS); - } else { - offset =3D XFS_BMDR_SPACE_CALC(6 * MINABTPTRS); - } + case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: + /* + * Setting the last part of a previous oldext extent to newext. + * The right neighbor is contiguous with the new allocation. + */ + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, + PREV.br_blockcount - new->br_blockcount); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 - ASSERT(offset < XFS_LITINO(mp)); - return offset; -} + ++*idx; =20 -/* - * Helper routine to reset inode di_forkoff field when switching - * attribute fork from local to extent format - we reset it where - * possible to make space available for inline data fork extents. - */ -STATIC void -xfs_bmap_forkoff_reset( - xfs_mount_t *mp, - xfs_inode_t *ip, - int whichfork) -{ - if (whichfork =3D=3D XFS_ATTR_FORK && - ip->i_d.di_format !=3D XFS_DINODE_FMT_DEV && - ip->i_d.di_format !=3D XFS_DINODE_FMT_UUID && - ip->i_d.di_format !=3D XFS_DINODE_FMT_BTREE) { - uint dfl_forkoff =3D xfs_default_attroffset(ip) >> 3; + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, *idx), + new->br_startoff, new->br_startblock, + new->br_blockcount + RIGHT.br_blockcount, newext); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 - if (dfl_forkoff > ip->i_d.di_forkoff) - ip->i_d.di_forkoff =3D dfl_forkoff; - } -} + if (cur =3D=3D NULL) + rval =3D XFS_ILOG_DEXT; + else { + rval =3D 0; + if ((error =3D xfs_bmbt_lookup_eq(cur, PREV.br_startoff, + PREV.br_startblock, + PREV.br_blockcount, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_bmbt_update(cur, PREV.br_startoff, + PREV.br_startblock, + PREV.br_blockcount - new->br_blockcount, + oldext))) + goto done; + if ((error =3D xfs_btree_increment(cur, 0, &i))) + goto done; + if ((error =3D xfs_bmbt_update(cur, new->br_startoff, + new->br_startblock, + new->br_blockcount + RIGHT.br_blockcount, + newext))) + goto done; + } + break; =20 -/* - * Convert a local file to an extents file. - * This code is out of bounds for data forks of regular files, - * since the file data needs to get logged so things will stay consistent. - * (The bmap-level manipulations are ok, though). - */ -STATIC int /* error */ -xfs_bmap_local_to_extents( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fsblock_t *firstblock, /* first block allocated in xaction */ - xfs_extlen_t total, /* total blocks needed by transaction */ - int *logflagsp, /* inode logging flags */ - int whichfork) /* data or attr fork */ -{ - int error; /* error return value */ - int flags; /* logging flags returned */ - xfs_ifork_t *ifp; /* inode fork pointer */ + case BMAP_RIGHT_FILLING: + /* + * Setting the last part of a previous oldext extent to newext. + * The right neighbor is not contiguous. + */ + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, + PREV.br_blockcount - new->br_blockcount); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); =20 - /* - * We don't want to deal with the case of keeping inode data inline yet. - * So sending the data fork of a regular inode is invalid. - */ - ASSERT(!(S_ISREG(ip->i_d.di_mode) && whichfork =3D=3D XFS_DATA_FORK)); - ifp =3D XFS_IFORK_PTR(ip, whichfork); - ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL); - flags =3D 0; - error =3D 0; - if (ifp->if_bytes) { - xfs_alloc_arg_t args; /* allocation arguments */ - xfs_buf_t *bp; /* buffer for extent block */ - xfs_bmbt_rec_host_t *ep;/* extent record pointer */ + ++*idx; + xfs_iext_insert(ip, *idx, 1, new, state); =20 - memset(&args, 0, sizeof(args)); - args.tp =3D tp; - args.mp =3D ip->i_mount; - args.firstblock =3D *firstblock; - ASSERT((ifp->if_flags & - (XFS_IFINLINE|XFS_IFEXTENTS|XFS_IFEXTIREC)) =3D=3D XFS_IFINLINE); + ip->i_d.di_nextents++; + if (cur =3D=3D NULL) + rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; + else { + rval =3D XFS_ILOG_CORE; + if ((error =3D xfs_bmbt_lookup_eq(cur, PREV.br_startoff, + PREV.br_startblock, PREV.br_blockcount, + &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + if ((error =3D xfs_bmbt_update(cur, PREV.br_startoff, + PREV.br_startblock, + PREV.br_blockcount - new->br_blockcount, + oldext))) + goto done; + if ((error =3D xfs_bmbt_lookup_eq(cur, new->br_startoff, + new->br_startblock, new->br_blockcount, + &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); + cur->bc_rec.b.br_state =3D XFS_EXT_NORM; + if ((error =3D xfs_btree_insert(cur, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + } + break; + + case 0: /* - * Allocate a block. We know we need only one, since the - * file currently fits in an inode. + * Setting the middle part of a previous oldext extent to + * newext. Contiguity is impossible here. + * One extent becomes three extents. */ - if (*firstblock =3D=3D NULLFSBLOCK) { - args.fsbno =3D XFS_INO_TO_FSB(args.mp, ip->i_ino); - args.type =3D XFS_ALLOCTYPE_START_BNO; - } else { - args.fsbno =3D *firstblock; - args.type =3D XFS_ALLOCTYPE_NEAR_BNO; + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, + new->br_startoff - PREV.br_startoff); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + + r[0] =3D *new; + r[1].br_startoff =3D new_endoff; + r[1].br_blockcount =3D + PREV.br_startoff + PREV.br_blockcount - new_endoff; + r[1].br_startblock =3D new->br_startblock + new->br_blockcount; + r[1].br_state =3D oldext; + + ++*idx; + xfs_iext_insert(ip, *idx, 2, &r[0], state); + + ip->i_d.di_nextents +=3D 2; + if (cur =3D=3D NULL) + rval =3D XFS_ILOG_CORE | XFS_ILOG_DEXT; + else { + rval =3D XFS_ILOG_CORE; + if ((error =3D xfs_bmbt_lookup_eq(cur, PREV.br_startoff, + PREV.br_startblock, PREV.br_blockcount, + &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + /* new right extent - oldext */ + if ((error =3D xfs_bmbt_update(cur, r[1].br_startoff, + r[1].br_startblock, r[1].br_blockcount, + r[1].br_state))) + goto done; + /* new left extent - oldext */ + cur->bc_rec.b =3D PREV; + cur->bc_rec.b.br_blockcount =3D + new->br_startoff - PREV.br_startoff; + if ((error =3D xfs_btree_insert(cur, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + /* + * Reset the cursor to the position of the new extent + * we are about to insert as we can't trust it after + * the previous insert. + */ + if ((error =3D xfs_bmbt_lookup_eq(cur, new->br_startoff, + new->br_startblock, new->br_blockcount, + &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); + /* new middle extent - newext */ + cur->bc_rec.b.br_state =3D new->br_state; + if ((error =3D xfs_btree_insert(cur, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); } - args.total =3D total; - args.minlen =3D args.maxlen =3D args.prod =3D 1; - if ((error =3D xfs_alloc_vextent(&args))) - goto done; + break; + + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_LEFT_FILLING | BMAP_RIGHT_CONTIG: + case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: + case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_LEFT_CONTIG: + case BMAP_RIGHT_CONTIG: /* - * Can't fail, the space was reserved. + * These cases are all impossible. */ - ASSERT(args.fsbno !=3D NULLFSBLOCK); - ASSERT(args.len =3D=3D 1); - *firstblock =3D args.fsbno; - bp =3D xfs_btree_get_bufl(args.mp, tp, args.fsbno, 0); - bp->b_ops =3D &xfs_bmbt_buf_ops; - memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); - xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1); - xfs_bmap_forkoff_reset(args.mp, ip, whichfork); - xfs_idata_realloc(ip, -ifp->if_bytes, whichfork); - xfs_iext_add(ifp, 0, 1); - ep =3D xfs_iext_get_ext(ifp, 0); - xfs_bmbt_set_allf(ep, 0, args.fsbno, 1, XFS_EXT_NORM); - trace_xfs_bmap_post_update(ip, 0, - whichfork =3D=3D XFS_ATTR_FORK ? BMAP_ATTRFORK : 0, - _THIS_IP_); - XFS_IFORK_NEXT_SET(ip, whichfork, 1); - ip->i_d.di_nblocks =3D 1; - xfs_trans_mod_dquot_byino(tp, ip, - XFS_TRANS_DQ_BCOUNT, 1L); - flags |=3D xfs_ilog_fext(whichfork); - } else { - ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) =3D=3D 0); - xfs_bmap_forkoff_reset(ip->i_mount, ip, whichfork); + ASSERT(0); + } + + /* convert to a btree if necessary */ + if (xfs_bmap_needs_btree(ip, XFS_DATA_FORK)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(cur =3D=3D NULL); + error =3D xfs_bmap_extents_to_btree(tp, ip, first, flist, &cur, + 0, &tmp_logflags, XFS_DATA_FORK); + *logflagsp |=3D tmp_logflags; + if (error) + goto done; } - ifp->if_flags &=3D ~XFS_IFINLINE; - ifp->if_flags |=3D XFS_IFEXTENTS; - XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); - flags |=3D XFS_ILOG_CORE; + + /* clear out the allocated field, done with it now in any case. */ + if (cur) { + cur->bc_private.b.allocated =3D 0; + *curp =3D cur; + } + + xfs_bmap_check_leaf_extents(*curp, ip, XFS_DATA_FORK); done: - *logflagsp =3D flags; + *logflagsp |=3D rval; return error; +#undef LEFT +#undef RIGHT +#undef PREV } =20 /* - * Search the extent records for the entry containing block bno. - * If bno lies in a hole, point to the next entry. If bno lies - * past eof, *eofp will be set, and *prevp will contain the last - * entry (null if none). Else, *lastxp will be set to the index - * of the found entry; *gotp will contain the entry. + * Convert a hole to a delayed allocation. */ -STATIC xfs_bmbt_rec_host_t * /* pointer to found extent entry */ -xfs_bmap_search_multi_extents( - xfs_ifork_t *ifp, /* inode fork pointer */ - xfs_fileoff_t bno, /* block number searched for */ - int *eofp, /* out: end of file found */ - xfs_extnum_t *lastxp, /* out: last extent index */ - xfs_bmbt_irec_t *gotp, /* out: extent entry found */ - xfs_bmbt_irec_t *prevp) /* out: previous extent entry found */ +STATIC void +xfs_bmap_add_extent_hole_delay( + xfs_inode_t *ip, /* incore inode pointer */ + xfs_extnum_t *idx, /* extent number to update/insert */ + xfs_bmbt_irec_t *new) /* new data to add to file extents */ { - xfs_bmbt_rec_host_t *ep; /* extent record pointer */ - xfs_extnum_t lastx; /* last extent index */ + xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_bmbt_irec_t left; /* left neighbor extent entry */ + xfs_filblks_t newlen=3D0; /* new indirect size */ + xfs_filblks_t oldlen=3D0; /* old indirect size */ + xfs_bmbt_irec_t right; /* right neighbor extent entry */ + int state; /* state bits, accessed thru macros */ + xfs_filblks_t temp=3D0; /* temp for indirect calculations */ + + ifp =3D XFS_IFORK_PTR(ip, XFS_DATA_FORK); + state =3D 0; + ASSERT(isnullstartblock(new->br_startblock)); =20 /* - * Initialize the extent entry structure to catch access to - * uninitialized br_startblock field. + * Check and set flags if this segment has a left neighbor */ - gotp->br_startoff =3D 0xffa5a5a5a5a5a5a5LL; - gotp->br_blockcount =3D 0xa55a5a5a5a5a5a5aLL; - gotp->br_state =3D XFS_EXT_INVALID; -#if XFS_BIG_BLKNOS - gotp->br_startblock =3D 0xffffa5a5a5a5a5a5LL; -#else - gotp->br_startblock =3D 0xffffa5a5; -#endif - prevp->br_startoff =3D NULLFILEOFF; + if (*idx > 0) { + state |=3D BMAP_LEFT_VALID; + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx - 1), &left); =20 - ep =3D xfs_iext_bno_to_ext(ifp, bno, &lastx); - if (lastx > 0) { - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, lastx - 1), prevp); + if (isnullstartblock(left.br_startblock)) + state |=3D BMAP_LEFT_DELAY; } - if (lastx < (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) { - xfs_bmbt_get_all(ep, gotp); - *eofp =3D 0; - } else { - if (lastx > 0) { - *gotp =3D *prevp; - } - *eofp =3D 1; - ep =3D NULL; + + /* + * Check and set flags if the current (right) segment exists. + * If it doesn't exist, we're converting the hole at end-of-file. + */ + if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { + state |=3D BMAP_RIGHT_VALID; + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx), &right); + + if (isnullstartblock(right.br_startblock)) + state |=3D BMAP_RIGHT_DELAY; + } + + /* + * Set contiguity flags on the left and right neighbors. + * Don't let extents get too large, even if the pieces are contiguous. + */ + if ((state & BMAP_LEFT_VALID) && (state & BMAP_LEFT_DELAY) && + left.br_startoff + left.br_blockcount =3D=3D new->br_startoff && + left.br_blockcount + new->br_blockcount <=3D MAXEXTLEN) + state |=3D BMAP_LEFT_CONTIG; + + if ((state & BMAP_RIGHT_VALID) && (state & BMAP_RIGHT_DELAY) && + new->br_startoff + new->br_blockcount =3D=3D right.br_startoff && + new->br_blockcount + right.br_blockcount <=3D MAXEXTLEN && + (!(state & BMAP_LEFT_CONTIG) || + (left.br_blockcount + new->br_blockcount + + right.br_blockcount <=3D MAXEXTLEN))) + state |=3D BMAP_RIGHT_CONTIG; + + /* + * Switch out based on the contiguity flags. + */ + switch (state & (BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG)) { + case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + /* + * New allocation is contiguous with delayed allocations + * on the left and on the right. + * Merge all three into a single extent record. + */ + --*idx; + temp =3D left.br_blockcount + new->br_blockcount + + right.br_blockcount; + + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), temp); + oldlen =3D startblockval(left.br_startblock) + + startblockval(new->br_startblock) + + startblockval(right.br_startblock); + newlen =3D xfs_bmap_worst_indlen(ip, temp); + xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, *idx), + nullstartblock((int)newlen)); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + + xfs_iext_remove(ip, *idx + 1, 1, state); + break; + + case BMAP_LEFT_CONTIG: + /* + * New allocation is contiguous with a delayed allocation + * on the left. + * Merge the new allocation with the left neighbor. + */ + --*idx; + temp =3D left.br_blockcount + new->br_blockcount; + + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, *idx), temp); + oldlen =3D startblockval(left.br_startblock) + + startblockval(new->br_startblock); + newlen =3D xfs_bmap_worst_indlen(ip, temp); + xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, *idx), + nullstartblock((int)newlen)); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + break; + + case BMAP_RIGHT_CONTIG: + /* + * New allocation is contiguous with a delayed allocation + * on the right. + * Merge the new allocation with the right neighbor. + */ + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + temp =3D new->br_blockcount + right.br_blockcount; + oldlen =3D startblockval(new->br_startblock) + + startblockval(right.br_startblock); + newlen =3D xfs_bmap_worst_indlen(ip, temp); + xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, *idx), + new->br_startoff, + nullstartblock((int)newlen), temp, right.br_state); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + break; + + case 0: + /* + * New allocation is not contiguous with another + * delayed allocation. + * Insert a new entry. + */ + oldlen =3D newlen =3D 0; + xfs_iext_insert(ip, *idx, 1, new, state); + break; + } + if (oldlen !=3D newlen) { + ASSERT(oldlen > newlen); + xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, + (int64_t)(oldlen - newlen), 0); + /* + * Nothing to do for disk quota accounting here. + */ } - *lastxp =3D lastx; - return ep; } =20 /* - * Search the extents list for the inode, for the extent containing bno. - * If bno lies in a hole, point to the next entry. If bno lies past eof, - * *eofp will be set, and *prevp will contain the last entry (null if none= ). - * Else, *lastxp will be set to the index of the found - * entry; *gotp will contain the entry. + * Convert a hole to a real allocation. */ -xfs_bmbt_rec_host_t * /* pointer to found extent entry */ -xfs_bmap_search_extents( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_fileoff_t bno, /* block number searched for */ - int fork, /* data or attr fork */ - int *eofp, /* out: end of file found */ - xfs_extnum_t *lastxp, /* out: last extent index */ - xfs_bmbt_irec_t *gotp, /* out: extent entry found */ - xfs_bmbt_irec_t *prevp) /* out: previous extent entry found */ +STATIC int /* error */ +xfs_bmap_add_extent_hole_real( + struct xfs_bmalloca *bma, + int whichfork) { - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_bmbt_rec_host_t *ep; /* extent record pointer */ + struct xfs_bmbt_irec *new =3D &bma->got; + int error; /* error return value */ + int i; /* temp state */ + xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_bmbt_irec_t left; /* left neighbor extent entry */ + xfs_bmbt_irec_t right; /* right neighbor extent entry */ + int rval=3D0; /* return value (logging flags) */ + int state; /* state bits, accessed thru macros */ =20 - XFS_STATS_INC(xs_look_exlist); - ifp =3D XFS_IFORK_PTR(ip, fork); + ifp =3D XFS_IFORK_PTR(bma->ip, whichfork); =20 - ep =3D xfs_bmap_search_multi_extents(ifp, bno, eofp, lastxp, gotp, prevp); + ASSERT(bma->idx >=3D 0); + ASSERT(bma->idx <=3D ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); + ASSERT(!isnullstartblock(new->br_startblock)); + ASSERT(!bma->cur || + !(bma->cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL)); =20 - if (unlikely(!(gotp->br_startblock) && (*lastxp !=3D NULLEXTNUM) && - !(XFS_IS_REALTIME_INODE(ip) && fork =3D=3D XFS_DATA_FORK))) { - xfs_alert_tag(ip->i_mount, XFS_PTAG_FSBLOCK_ZERO, - "Access to block zero in inode %llu " - "start_block: %llx start_off: %llx " - "blkcnt: %llx extent-state: %x lastx: %x\n", - (unsigned long long)ip->i_ino, - (unsigned long long)gotp->br_startblock, - (unsigned long long)gotp->br_startoff, - (unsigned long long)gotp->br_blockcount, - gotp->br_state, *lastxp); - *lastxp =3D NULLEXTNUM; - *eofp =3D 1; - return NULL; + XFS_STATS_INC(xs_add_exlist); + + state =3D 0; + if (whichfork =3D=3D XFS_ATTR_FORK) + state |=3D BMAP_ATTRFORK; + + /* + * Check and set flags if this segment has a left neighbor. + */ + if (bma->idx > 0) { + state |=3D BMAP_LEFT_VALID; + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx - 1), &left); + if (isnullstartblock(left.br_startblock)) + state |=3D BMAP_LEFT_DELAY; } - return ep; -} - -/* - * Compute the worst-case number of indirect blocks that will be used - * for ip's delayed extent of length "len". - */ -STATIC xfs_filblks_t -xfs_bmap_worst_indlen( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_filblks_t len) /* delayed extent length */ -{ - int level; /* btree level number */ - int maxrecs; /* maximum record count at this level */ - xfs_mount_t *mp; /* mount structure */ - xfs_filblks_t rval; /* return value */ =20 - mp =3D ip->i_mount; - maxrecs =3D mp->m_bmap_dmxr[0]; - for (level =3D 0, rval =3D 0; - level < XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK); - level++) { - len +=3D maxrecs - 1; - do_div(len, maxrecs); - rval +=3D len; - if (len =3D=3D 1) - return rval + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - - level - 1; - if (level =3D=3D 0) - maxrecs =3D mp->m_bmap_dmxr[1]; + /* + * Check and set flags if this segment has a current value. + * Not true if we're inserting into the "hole" at eof. + */ + if (bma->idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { + state |=3D BMAP_RIGHT_VALID; + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, bma->idx), &right); + if (isnullstartblock(right.br_startblock)) + state |=3D BMAP_RIGHT_DELAY; } - return rval; -} =20 -/* - * Convert inode from non-attributed to attributed. - * Must not be in a transaction, ip must not be locked. - */ -int /* error code */ -xfs_bmap_add_attrfork( - xfs_inode_t *ip, /* incore inode pointer */ - int size, /* space new attribute needs */ - int rsvd) /* xact may use reserved blks */ -{ - xfs_fsblock_t firstblock; /* 1st block/ag allocated */ - xfs_bmap_free_t flist; /* freed extent records */ - xfs_mount_t *mp; /* mount structure */ - xfs_trans_t *tp; /* transaction pointer */ - int blks; /* space reservation */ - int version =3D 1; /* superblock attr version */ - int committed; /* xaction was committed */ - int logflags; /* logging flags */ - int error; /* error return value */ + /* + * We're inserting a real allocation between "left" and "right". + * Set the contiguity flags. Don't let extents get too large. + */ + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && + left.br_startoff + left.br_blockcount =3D=3D new->br_startoff && + left.br_startblock + left.br_blockcount =3D=3D new->br_startblock && + left.br_state =3D=3D new->br_state && + left.br_blockcount + new->br_blockcount <=3D MAXEXTLEN) + state |=3D BMAP_LEFT_CONTIG; =20 - ASSERT(XFS_IFORK_Q(ip) =3D=3D 0); + if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && + new->br_startoff + new->br_blockcount =3D=3D right.br_startoff && + new->br_startblock + new->br_blockcount =3D=3D right.br_startblock && + new->br_state =3D=3D right.br_state && + new->br_blockcount + right.br_blockcount <=3D MAXEXTLEN && + (!(state & BMAP_LEFT_CONTIG) || + left.br_blockcount + new->br_blockcount + + right.br_blockcount <=3D MAXEXTLEN)) + state |=3D BMAP_RIGHT_CONTIG; =20 - mp =3D ip->i_mount; - ASSERT(!XFS_NOT_DQATTACHED(mp, ip)); - tp =3D xfs_trans_alloc(mp, XFS_TRANS_ADDAFORK); - blks =3D XFS_ADDAFORK_SPACE_RES(mp); - if (rsvd) - tp->t_flags |=3D XFS_TRANS_RESERVE; - if ((error =3D xfs_trans_reserve(tp, blks, XFS_ADDAFORK_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_ADDAFORK_LOG_COUNT))) - goto error0; - xfs_ilock(ip, XFS_ILOCK_EXCL); - error =3D xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ? - XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES : - XFS_QMOPT_RES_REGBLKS); - if (error) { - xfs_iunlock(ip, XFS_ILOCK_EXCL); - xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); - return error; - } - if (XFS_IFORK_Q(ip)) - goto error1; - if (ip->i_d.di_aformat !=3D XFS_DINODE_FMT_EXTENTS) { + error =3D 0; + /* + * Select which case we're in here, and implement it. + */ + switch (state & (BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG)) { + case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: /* - * For inodes coming from pre-6.2 filesystems. + * New allocation is contiguous with real allocations on the + * left and on the right. + * Merge all three into a single extent record. */ - ASSERT(ip->i_d.di_aformat =3D=3D 0); - ip->i_d.di_aformat =3D XFS_DINODE_FMT_EXTENTS; - } - ASSERT(ip->i_d.di_anextents =3D=3D 0); + --bma->idx; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), + left.br_blockcount + new->br_blockcount + + right.br_blockcount); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); =20 - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); =20 - switch (ip->i_d.di_format) { - case XFS_DINODE_FMT_DEV: - ip->i_d.di_forkoff =3D roundup(sizeof(xfs_dev_t), 8) >> 3; + XFS_IFORK_NEXT_SET(bma->ip, whichfork, + XFS_IFORK_NEXTENTS(bma->ip, whichfork) - 1); + if (bma->cur =3D=3D NULL) { + rval =3D XFS_ILOG_CORE | xfs_ilog_fext(whichfork); + } else { + rval =3D XFS_ILOG_CORE; + error =3D xfs_bmbt_lookup_eq(bma->cur, right.br_startoff, + right.br_startblock, right.br_blockcount, + &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + error =3D xfs_btree_delete(bma->cur, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + error =3D xfs_btree_decrement(bma->cur, 0, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + error =3D xfs_bmbt_update(bma->cur, left.br_startoff, + left.br_startblock, + left.br_blockcount + + new->br_blockcount + + right.br_blockcount, + left.br_state); + if (error) + goto done; + } break; - case XFS_DINODE_FMT_UUID: - ip->i_d.di_forkoff =3D roundup(sizeof(uuid_t), 8) >> 3; + + case BMAP_LEFT_CONTIG: + /* + * New allocation is contiguous with a real allocation + * on the left. + * Merge the new allocation with the left neighbor. + */ + --bma->idx; + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, bma->idx), + left.br_blockcount + new->br_blockcount); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + if (bma->cur =3D=3D NULL) { + rval =3D xfs_ilog_fext(whichfork); + } else { + rval =3D 0; + error =3D xfs_bmbt_lookup_eq(bma->cur, left.br_startoff, + left.br_startblock, left.br_blockcount, + &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + error =3D xfs_bmbt_update(bma->cur, left.br_startoff, + left.br_startblock, + left.br_blockcount + + new->br_blockcount, + left.br_state); + if (error) + goto done; + } break; - case XFS_DINODE_FMT_LOCAL: - case XFS_DINODE_FMT_EXTENTS: - case XFS_DINODE_FMT_BTREE: - ip->i_d.di_forkoff =3D xfs_attr_shortform_bytesfit(ip, size); - if (!ip->i_d.di_forkoff) - ip->i_d.di_forkoff =3D xfs_default_attroffset(ip) >> 3; - else if (mp->m_flags & XFS_MOUNT_ATTR2) - version =3D 2; + + case BMAP_RIGHT_CONTIG: + /* + * New allocation is contiguous with a real allocation + * on the right. + * Merge the new allocation with the right neighbor. + */ + trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); + xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, bma->idx), + new->br_startoff, new->br_startblock, + new->br_blockcount + right.br_blockcount, + right.br_state); + trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); + + if (bma->cur =3D=3D NULL) { + rval =3D xfs_ilog_fext(whichfork); + } else { + rval =3D 0; + error =3D xfs_bmbt_lookup_eq(bma->cur, + right.br_startoff, + right.br_startblock, + right.br_blockcount, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + error =3D xfs_bmbt_update(bma->cur, new->br_startoff, + new->br_startblock, + new->br_blockcount + + right.br_blockcount, + right.br_state); + if (error) + goto done; + } + break; + + case 0: + /* + * New allocation is not contiguous with another + * real allocation. + * Insert a new entry. + */ + xfs_iext_insert(bma->ip, bma->idx, 1, new, state); + XFS_IFORK_NEXT_SET(bma->ip, whichfork, + XFS_IFORK_NEXTENTS(bma->ip, whichfork) + 1); + if (bma->cur =3D=3D NULL) { + rval =3D XFS_ILOG_CORE | xfs_ilog_fext(whichfork); + } else { + rval =3D XFS_ILOG_CORE; + error =3D xfs_bmbt_lookup_eq(bma->cur, + new->br_startoff, + new->br_startblock, + new->br_blockcount, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 0, done); + bma->cur->bc_rec.b.br_state =3D new->br_state; + error =3D xfs_btree_insert(bma->cur, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + } break; - default: - ASSERT(0); - error =3D XFS_ERROR(EINVAL); - goto error1; } =20 - ASSERT(ip->i_afp =3D=3D NULL); - ip->i_afp =3D kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP); - ip->i_afp->if_flags =3D XFS_IFEXTENTS; - logflags =3D 0; - xfs_bmap_init(&flist, &firstblock); - switch (ip->i_d.di_format) { - case XFS_DINODE_FMT_LOCAL: - error =3D xfs_bmap_add_attrfork_local(tp, ip, &firstblock, &flist, - &logflags); - break; - case XFS_DINODE_FMT_EXTENTS: - error =3D xfs_bmap_add_attrfork_extents(tp, ip, &firstblock, - &flist, &logflags); - break; - case XFS_DINODE_FMT_BTREE: - error =3D xfs_bmap_add_attrfork_btree(tp, ip, &firstblock, &flist, - &logflags); - break; - default: - error =3D 0; - break; - } - if (logflags) - xfs_trans_log_inode(tp, ip, logflags); - if (error) - goto error2; - if (!xfs_sb_version_hasattr(&mp->m_sb) || - (!xfs_sb_version_hasattr2(&mp->m_sb) && version =3D=3D 2)) { - __int64_t sbfields =3D 0; + /* convert to a btree if necessary */ + if (xfs_bmap_needs_btree(bma->ip, whichfork)) { + int tmp_logflags; /* partial log flag return val */ =20 - spin_lock(&mp->m_sb_lock); - if (!xfs_sb_version_hasattr(&mp->m_sb)) { - xfs_sb_version_addattr(&mp->m_sb); - sbfields |=3D XFS_SB_VERSIONNUM; - } - if (!xfs_sb_version_hasattr2(&mp->m_sb) && version =3D=3D 2) { - xfs_sb_version_addattr2(&mp->m_sb); - sbfields |=3D (XFS_SB_VERSIONNUM | XFS_SB_FEATURES2); - } - if (sbfields) { - spin_unlock(&mp->m_sb_lock); - xfs_mod_sb(tp, sbfields); - } else - spin_unlock(&mp->m_sb_lock); + ASSERT(bma->cur =3D=3D NULL); + error =3D xfs_bmap_extents_to_btree(bma->tp, bma->ip, + bma->firstblock, bma->flist, &bma->cur, + 0, &tmp_logflags, whichfork); + bma->logflags |=3D tmp_logflags; + if (error) + goto done; } =20 - error =3D xfs_bmap_finish(&tp, &flist, &committed); - if (error) - goto error2; - return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); -error2: - xfs_bmap_cancel(&flist); -error1: - xfs_iunlock(ip, XFS_ILOCK_EXCL); -error0: - xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); + /* clear out the allocated field, done with it now in any case. */ + if (bma->cur) + bma->cur->bc_private.b.allocated =3D 0; + + xfs_bmap_check_leaf_extents(bma->cur, bma->ip, whichfork); +done: + bma->logflags |=3D rval; return error; } =20 /* - * Add the extent to the list of extents to be free at transaction end. - * The list is maintained sorted (by block number). + * Functions used in the extent read, allocate and remove paths */ -/* ARGSUSED */ -void -xfs_bmap_add_free( - xfs_fsblock_t bno, /* fs block number of extent */ - xfs_filblks_t len, /* length of extent */ - xfs_bmap_free_t *flist, /* list of extents */ - xfs_mount_t *mp) /* mount point structure */ -{ - xfs_bmap_free_item_t *cur; /* current (next) element */ - xfs_bmap_free_item_t *new; /* new element */ - xfs_bmap_free_item_t *prev; /* previous element */ -#ifdef DEBUG - xfs_agnumber_t agno; - xfs_agblock_t agbno; - - ASSERT(bno !=3D NULLFSBLOCK); - ASSERT(len > 0); - ASSERT(len <=3D MAXEXTLEN); - ASSERT(!isnullstartblock(bno)); - agno =3D XFS_FSB_TO_AGNO(mp, bno); - agbno =3D XFS_FSB_TO_AGBNO(mp, bno); - ASSERT(agno < mp->m_sb.sb_agcount); - ASSERT(agbno < mp->m_sb.sb_agblocks); - ASSERT(len < mp->m_sb.sb_agblocks); - ASSERT(agbno + len <=3D mp->m_sb.sb_agblocks); -#endif - ASSERT(xfs_bmap_free_item_zone !=3D NULL); - new =3D kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP); - new->xbfi_startblock =3D bno; - new->xbfi_blockcount =3D (xfs_extlen_t)len; - for (prev =3D NULL, cur =3D flist->xbf_first; - cur !=3D NULL; - prev =3D cur, cur =3D cur->xbfi_next) { - if (cur->xbfi_startblock >=3D bno) - break; - } - if (prev) - prev->xbfi_next =3D new; - else - flist->xbf_first =3D new; - new->xbfi_next =3D cur; - flist->xbf_count++; -} =20 /* - * Compute and fill in the value of the maximum depth of a bmap btree - * in this filesystem. Done once, during mount. + * Adjust the size of the new extent based on di_extsize and rt extsize. */ -void -xfs_bmap_compute_maxlevels( - xfs_mount_t *mp, /* file system mount structure */ - int whichfork) /* data or attr fork */ +STATIC int +xfs_bmap_extsize_align( + xfs_mount_t *mp, + xfs_bmbt_irec_t *gotp, /* next extent pointer */ + xfs_bmbt_irec_t *prevp, /* previous extent pointer */ + xfs_extlen_t extsz, /* align to this extent size */ + int rt, /* is this a realtime inode? */ + int eof, /* is extent at end-of-file? */ + int delay, /* creating delalloc extent? */ + int convert, /* overwriting unwritten extent? */ + xfs_fileoff_t *offp, /* in/out: aligned offset */ + xfs_extlen_t *lenp) /* in/out: aligned length */ { - int level; /* btree level */ - uint maxblocks; /* max blocks at this level */ - uint maxleafents; /* max leaf entries possible */ - int maxrootrecs; /* max records in root block */ - int minleafrecs; /* min records in leaf block */ - int minnoderecs; /* min records in node block */ - int sz; /* root block size */ + xfs_fileoff_t orig_off; /* original offset */ + xfs_extlen_t orig_alen; /* original length */ + xfs_fileoff_t orig_end; /* original off+len */ + xfs_fileoff_t nexto; /* next file offset */ + xfs_fileoff_t prevo; /* previous file offset */ + xfs_fileoff_t align_off; /* temp for offset */ + xfs_extlen_t align_alen; /* temp for length */ + xfs_extlen_t temp; /* temp for calculations */ + + if (convert) + return 0; + + orig_off =3D align_off =3D *offp; + orig_alen =3D align_alen =3D *lenp; + orig_end =3D orig_off + orig_alen; =20 /* - * The maximum number of extents in a file, hence the maximum - * number of leaf entries, is controlled by the type of di_nextents - * (a signed 32-bit number, xfs_extnum_t), or by di_anextents - * (a signed 16-bit number, xfs_aextnum_t). - * - * Note that we can no longer assume that if we are in ATTR1 that - * the fork offset of all the inodes will be - * (xfs_default_attroffset(ip) >> 3) because we could have mounted - * with ATTR2 and then mounted back with ATTR1, keeping the - * di_forkoff's fixed but probably at various positions. Therefore, - * for both ATTR1 and ATTR2 we have to assume the worst case scenario - * of a minimum size available. + * If this request overlaps an existing extent, then don't + * attempt to perform any additional alignment. */ - if (whichfork =3D=3D XFS_DATA_FORK) { - maxleafents =3D MAXEXTNUM; - sz =3D XFS_BMDR_SPACE_CALC(MINDBTPTRS); - } else { - maxleafents =3D MAXAEXTNUM; - sz =3D XFS_BMDR_SPACE_CALC(MINABTPTRS); - } - maxrootrecs =3D xfs_bmdr_maxrecs(mp, sz, 0); - minleafrecs =3D mp->m_bmap_dmnr[0]; - minnoderecs =3D mp->m_bmap_dmnr[1]; - maxblocks =3D (maxleafents + minleafrecs - 1) / minleafrecs; - for (level =3D 1; maxblocks > 1; level++) { - if (maxblocks <=3D maxrootrecs) - maxblocks =3D 1; - else - maxblocks =3D (maxblocks + minnoderecs - 1) / minnoderecs; + if (!delay && !eof && + (orig_off >=3D gotp->br_startoff) && + (orig_end <=3D gotp->br_startoff + gotp->br_blockcount)) { + return 0; } - mp->m_bm_maxlevels[whichfork] =3D level; -} - -/* - * Free up any items left in the list. - */ -void -xfs_bmap_cancel( - xfs_bmap_free_t *flist) /* list of bmap_free_items */ -{ - xfs_bmap_free_item_t *free; /* free list item */ - xfs_bmap_free_item_t *next; =20 - if (flist->xbf_count =3D=3D 0) - return; - ASSERT(flist->xbf_first !=3D NULL); - for (free =3D flist->xbf_first; free; free =3D next) { - next =3D free->xbfi_next; - xfs_bmap_del_free(flist, NULL, free); + /* + * If the file offset is unaligned vs. the extent size + * we need to align it. This will be possible unless + * the file was previously written with a kernel that didn't + * perform this alignment, or if a truncate shot us in the + * foot. + */ + temp =3D do_mod(orig_off, extsz); + if (temp) { + align_alen +=3D temp; + align_off -=3D temp; + } + /* + * Same adjustment for the end of the requested area. + */ + if ((temp =3D (align_alen % extsz))) { + align_alen +=3D extsz - temp; + } + /* + * If the previous block overlaps with this proposed allocation + * then move the start forward without adjusting the length. + */ + if (prevp->br_startoff !=3D NULLFILEOFF) { + if (prevp->br_startblock =3D=3D HOLESTARTBLOCK) + prevo =3D prevp->br_startoff; + else + prevo =3D prevp->br_startoff + prevp->br_blockcount; + } else + prevo =3D 0; + if (align_off !=3D orig_off && align_off < prevo) + align_off =3D prevo; + /* + * If the next block overlaps with this proposed allocation + * then move the start back without adjusting the length, + * but not before offset 0. + * This may of course make the start overlap previous block, + * and if we hit the offset 0 limit then the next block + * can still overlap too. + */ + if (!eof && gotp->br_startoff !=3D NULLFILEOFF) { + if ((delay && gotp->br_startblock =3D=3D HOLESTARTBLOCK) || + (!delay && gotp->br_startblock =3D=3D DELAYSTARTBLOCK)) + nexto =3D gotp->br_startoff + gotp->br_blockcount; + else + nexto =3D gotp->br_startoff; + } else + nexto =3D NULLFILEOFF; + if (!eof && + align_off + align_alen !=3D orig_end && + align_off + align_alen > nexto) + align_off =3D nexto > align_alen ? nexto - align_alen : 0; + /* + * If we're now overlapping the next or previous extent that + * means we can't fit an extsz piece in this hole. Just move + * the start forward to the first valid spot and set + * the length so we hit the end. + */ + if (align_off !=3D orig_off && align_off < prevo) + align_off =3D prevo; + if (align_off + align_alen !=3D orig_end && + align_off + align_alen > nexto && + nexto !=3D NULLFILEOFF) { + ASSERT(nexto > prevo); + align_alen =3D nexto - align_off; } - ASSERT(flist->xbf_count =3D=3D 0); -} - -/* - * Returns the file-relative block number of the first unused block(s) - * in the file with at least "len" logically contiguous blocks free. - * This is the lowest-address hole if the file has holes, else the first b= lock - * past the end of file. - * Return 0 if the file is currently local (in-inode). - */ -int /* error */ -xfs_bmap_first_unused( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode */ - xfs_extlen_t len, /* size of hole to find */ - xfs_fileoff_t *first_unused, /* unused block */ - int whichfork) /* data or attr fork */ -{ - int error; /* error return value */ - int idx; /* extent record index */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_fileoff_t lastaddr; /* last block number seen */ - xfs_fileoff_t lowest; /* lowest useful block */ - xfs_fileoff_t max; /* starting useful block */ - xfs_fileoff_t off; /* offset for this block */ - xfs_extnum_t nextents; /* number of extent entries */ =20 - ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_BTREE || - XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS || - XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL); - if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL) { - *first_unused =3D 0; - return 0; - } - ifp =3D XFS_IFORK_PTR(ip, whichfork); - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error =3D xfs_iread_extents(tp, ip, whichfork))) - return error; - lowest =3D *first_unused; - nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - for (idx =3D 0, lastaddr =3D 0, max =3D lowest; idx < nextents; idx++) { - xfs_bmbt_rec_host_t *ep =3D xfs_iext_get_ext(ifp, idx); - off =3D xfs_bmbt_get_startoff(ep); + /* + * If realtime, and the result isn't a multiple of the realtime + * extent size we need to remove blocks until it is. + */ + if (rt && (temp =3D (align_alen % mp->m_sb.sb_rextsize))) { /* - * See if the hole before this extent will work. + * We're not covering the original request, or + * we won't be able to once we fix the length. */ - if (off >=3D lowest + len && off - max >=3D len) { - *first_unused =3D max; - return 0; + if (orig_off < align_off || + orig_end > align_off + align_alen || + align_alen - temp < orig_alen) + return XFS_ERROR(EINVAL); + /* + * Try to fix it by moving the start up. + */ + if (align_off + temp <=3D orig_off) { + align_alen -=3D temp; + align_off +=3D temp; } - lastaddr =3D off + xfs_bmbt_get_blockcount(ep); - max =3D XFS_FILEOFF_MAX(lastaddr, lowest); + /* + * Try to fix it by moving the end in. + */ + else if (align_off + align_alen - temp >=3D orig_end) + align_alen -=3D temp; + /* + * Set the start to the minimum then trim the length. + */ + else { + align_alen -=3D orig_off - align_off; + align_off =3D orig_off; + align_alen -=3D align_alen % mp->m_sb.sb_rextsize; + } + /* + * Result doesn't cover the request, fail it. + */ + if (orig_off < align_off || orig_end > align_off + align_alen) + return XFS_ERROR(EINVAL); + } else { + ASSERT(orig_off >=3D align_off); + ASSERT(orig_end <=3D align_off + align_alen); } - *first_unused =3D max; + +#ifdef DEBUG + if (!eof && gotp->br_startoff !=3D NULLFILEOFF) + ASSERT(align_off + align_alen <=3D gotp->br_startoff); + if (prevp->br_startoff !=3D NULLFILEOFF) + ASSERT(align_off >=3D prevp->br_startoff + prevp->br_blockcount); +#endif + + *lenp =3D align_alen; + *offp =3D align_off; return 0; } =20 -/* - * Returns the file-relative block number of the last block + 1 before - * last_block (input value) in the file. - * This is not based on i_size, it is based on the extent records. - * Returns 0 for local files, as they do not have extent records. - */ -int /* error */ -xfs_bmap_last_before( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode */ - xfs_fileoff_t *last_block, /* last block */ - int whichfork) /* data or attr fork */ +#define XFS_ALLOC_GAP_UNITS 4 + +STATIC void +xfs_bmap_adjacent( + xfs_bmalloca_t *ap) /* bmap alloc argument struct */ { - xfs_fileoff_t bno; /* input file offset */ - int eof; /* hit end of file */ - xfs_bmbt_rec_host_t *ep; /* pointer to last extent */ - int error; /* error return value */ - xfs_bmbt_irec_t got; /* current extent value */ - xfs_ifork_t *ifp; /* inode fork pointer */ - xfs_extnum_t lastx; /* last extent used */ - xfs_bmbt_irec_t prev; /* previous extent value */ + xfs_fsblock_t adjust; /* adjustment to block numbers */ + xfs_agnumber_t fb_agno; /* ag number of ap->firstblock */ + xfs_mount_t *mp; /* mount point structure */ + int nullfb; /* true if ap->firstblock isn't set */ + int rt; /* true if inode is realtime */ =20 - if (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE && - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_LOCAL) - return XFS_ERROR(EIO); - if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL) { - *last_block =3D 0; - return 0; +#define ISVALID(x,y) \ + (rt ? \ + (x) < mp->m_sb.sb_rblocks : \ + XFS_FSB_TO_AGNO(mp, x) =3D=3D XFS_FSB_TO_AGNO(mp, y) && \ + XFS_FSB_TO_AGNO(mp, x) < mp->m_sb.sb_agcount && \ + XFS_FSB_TO_AGBNO(mp, x) < mp->m_sb.sb_agblocks) + + mp =3D ap->ip->i_mount; + nullfb =3D *ap->firstblock =3D=3D NULLFSBLOCK; + rt =3D XFS_IS_REALTIME_INODE(ap->ip) && ap->userdata; + fb_agno =3D nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock); + /* + * If allocating at eof, and there's a previous real block, + * try to use its last block as our starting point. + */ + if (ap->eof && ap->prev.br_startoff !=3D NULLFILEOFF && + !isnullstartblock(ap->prev.br_startblock) && + ISVALID(ap->prev.br_startblock + ap->prev.br_blockcount, + ap->prev.br_startblock)) { + ap->blkno =3D ap->prev.br_startblock + ap->prev.br_blockcount; + /* + * Adjust for the gap between prevp and us. + */ + adjust =3D ap->offset - + (ap->prev.br_startoff + ap->prev.br_blockcount); + if (adjust && + ISVALID(ap->blkno + adjust, ap->prev.br_startblock)) + ap->blkno +=3D adjust; } - ifp =3D XFS_IFORK_PTR(ip, whichfork); - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error =3D xfs_iread_extents(tp, ip, whichfork))) - return error; - bno =3D *last_block - 1; - ep =3D xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, - &prev); - if (eof || xfs_bmbt_get_startoff(ep) > bno) { - if (prev.br_startoff =3D=3D NULLFILEOFF) - *last_block =3D 0; + /* + * If not at eof, then compare the two neighbor blocks. + * Figure out whether either one gives us a good starting point, + * and pick the better one. + */ + else if (!ap->eof) { + xfs_fsblock_t gotbno; /* right side block number */ + xfs_fsblock_t gotdiff=3D0; /* right side difference */ + xfs_fsblock_t prevbno; /* left side block number */ + xfs_fsblock_t prevdiff=3D0; /* left side difference */ + + /* + * If there's a previous (left) block, select a requested + * start block based on it. + */ + if (ap->prev.br_startoff !=3D NULLFILEOFF && + !isnullstartblock(ap->prev.br_startblock) && + (prevbno =3D ap->prev.br_startblock + + ap->prev.br_blockcount) && + ISVALID(prevbno, ap->prev.br_startblock)) { + /* + * Calculate gap to end of previous block. + */ + adjust =3D prevdiff =3D ap->offset - + (ap->prev.br_startoff + + ap->prev.br_blockcount); + /* + * Figure the startblock based on the previous block's + * end and the gap size. + * Heuristic! + * If the gap is large relative to the piece we're + * allocating, or using it gives us an invalid block + * number, then just use the end of the previous block. + */ + if (prevdiff <=3D XFS_ALLOC_GAP_UNITS * ap->length && + ISVALID(prevbno + prevdiff, + ap->prev.br_startblock)) + prevbno +=3D adjust; + else + prevdiff +=3D adjust; + /* + * If the firstblock forbids it, can't use it, + * must use default. + */ + if (!rt && !nullfb && + XFS_FSB_TO_AGNO(mp, prevbno) !=3D fb_agno) + prevbno =3D NULLFSBLOCK; + } + /* + * No previous block or can't follow it, just default. + */ + else + prevbno =3D NULLFSBLOCK; + /* + * If there's a following (right) block, select a requested + * start block based on it. + */ + if (!isnullstartblock(ap->got.br_startblock)) { + /* + * Calculate gap to start of next block. + */ + adjust =3D gotdiff =3D ap->got.br_startoff - ap->offset; + /* + * Figure the startblock based on the next block's + * start and the gap size. + */ + gotbno =3D ap->got.br_startblock; + /* + * Heuristic! + * If the gap is large relative to the piece we're + * allocating, or using it gives us an invalid block + * number, then just use the start of the next block + * offset by our length. + */ + if (gotdiff <=3D XFS_ALLOC_GAP_UNITS * ap->length && + ISVALID(gotbno - gotdiff, gotbno)) + gotbno -=3D adjust; + else if (ISVALID(gotbno - ap->length, gotbno)) { + gotbno -=3D ap->length; + gotdiff +=3D adjust - ap->length; + } else + gotdiff +=3D adjust; + /* + * If the firstblock forbids it, can't use it, + * must use default. + */ + if (!rt && !nullfb && + XFS_FSB_TO_AGNO(mp, gotbno) !=3D fb_agno) + gotbno =3D NULLFSBLOCK; + } + /* + * No next block, just default. + */ else - *last_block =3D prev.br_startoff + prev.br_blockcount; - } - /* - * Otherwise *last_block is already the right answer. - */ - return 0; -} - -STATIC int -xfs_bmap_last_extent( - struct xfs_trans *tp, - struct xfs_inode *ip, - int whichfork, - struct xfs_bmbt_irec *rec, - int *is_empty) -{ - struct xfs_ifork *ifp =3D XFS_IFORK_PTR(ip, whichfork); - int error; - int nextents; - - if (!(ifp->if_flags & XFS_IFEXTENTS)) { - error =3D xfs_iread_extents(tp, ip, whichfork); - if (error) - return error; - } - - nextents =3D ifp->if_bytes / sizeof(xfs_bmbt_rec_t); - if (nextents =3D=3D 0) { - *is_empty =3D 1; - return 0; + gotbno =3D NULLFSBLOCK; + /* + * If both valid, pick the better one, else the only good + * one, else ap->blkno is already set (to 0 or the inode block). + */ + if (prevbno !=3D NULLFSBLOCK && gotbno !=3D NULLFSBLOCK) + ap->blkno =3D prevdiff <=3D gotdiff ? prevbno : gotbno; + else if (prevbno !=3D NULLFSBLOCK) + ap->blkno =3D prevbno; + else if (gotbno !=3D NULLFSBLOCK) + ap->blkno =3D gotbno; } - - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, nextents - 1), rec); - *is_empty =3D 0; - return 0; +#undef ISVALID } =20 -/* - * Check the last inode extent to determine whether this allocation will r= esult - * in blocks being allocated at the end of the file. When we allocate new = data - * blocks at the end of the file which do not start at the previous data b= lock, - * we will try to align the new blocks at stripe unit boundaries. - * - * Returns 0 in bma->aeof if the file (fork) is empty as any new write wil= l be - * at, or past the EOF. - */ STATIC int -xfs_bmap_isaeof( - struct xfs_bmalloca *bma, - int whichfork) +xfs_bmap_btalloc_nullfb( + struct xfs_bmalloca *ap, + struct xfs_alloc_arg *args, + xfs_extlen_t *blen) { - struct xfs_bmbt_irec rec; - int is_empty; + struct xfs_mount *mp =3D ap->ip->i_mount; + struct xfs_perag *pag; + xfs_agnumber_t ag, startag; + int notinit =3D 0; int error; =20 - bma->aeof =3D 0; - error =3D xfs_bmap_last_extent(NULL, bma->ip, whichfork, &rec, - &is_empty); - if (error || is_empty) - return error; + if (ap->userdata && xfs_inode_is_filestream(ap->ip)) + args->type =3D XFS_ALLOCTYPE_NEAR_BNO; + else + args->type =3D XFS_ALLOCTYPE_START_BNO; + args->total =3D ap->total; =20 /* - * Check if we are allocation or past the last extent, or at least into - * the last delayed allocated extent. + * Search for an allocation group with a single extent large enough + * for the request. If one isn't found, then adjust the minimum + * allocation size to the largest space found. */ - bma->aeof =3D bma->offset >=3D rec.br_startoff + rec.br_blockcount || - (bma->offset >=3D rec.br_startoff && - isnullstartblock(rec.br_startblock)); - return 0; -} - -/* - * Check if the endoff is outside the last extent. If so the caller will g= row - * the allocation to a stripe unit boundary. All offsets are considered o= utside - * the end of file for an empty fork, so 1 is returned in *eof in that cas= e. - */ -int -xfs_bmap_eof( - struct xfs_inode *ip, - xfs_fileoff_t endoff, - int whichfork, - int *eof) -{ - struct xfs_bmbt_irec rec; - int error; - - error =3D xfs_bmap_last_extent(NULL, ip, whichfork, &rec, eof); - if (error || *eof) - return error; - - *eof =3D endoff >=3D rec.br_startoff + rec.br_blockcount; - return 0; -} + startag =3D ag =3D XFS_FSB_TO_AGNO(mp, args->fsbno); + if (startag =3D=3D NULLAGNUMBER) + startag =3D ag =3D 0; =20 -/* - * Returns the file-relative block number of the first block past eof in - * the file. This is not based on i_size, it is based on the extent recor= ds. - * Returns 0 for local files, as they do not have extent records. - */ -int -xfs_bmap_last_offset( - struct xfs_trans *tp, - struct xfs_inode *ip, - xfs_fileoff_t *last_block, - int whichfork) -{ - struct xfs_bmbt_irec rec; - int is_empty; - int error; + pag =3D xfs_perag_get(mp, ag); + while (*blen < args->maxlen) { + if (!pag->pagf_init) { + error =3D xfs_alloc_pagf_init(mp, args->tp, ag, + XFS_ALLOC_FLAG_TRYLOCK); + if (error) { + xfs_perag_put(pag); + return error; + } + } =20 - *last_block =3D 0; + /* + * See xfs_alloc_fix_freelist... + */ + if (pag->pagf_init) { + xfs_extlen_t longest; + longest =3D xfs_alloc_longest_free_extent(mp, pag); + if (*blen < longest) + *blen =3D longest; + } else + notinit =3D 1; =20 - if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL) - return 0; + if (xfs_inode_is_filestream(ap->ip)) { + if (*blen >=3D args->maxlen) + break; =20 - if (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE && - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS) - return XFS_ERROR(EIO); + if (ap->userdata) { + /* + * If startag is an invalid AG, we've + * come here once before and + * xfs_filestream_new_ag picked the + * best currently available. + * + * Don't continue looping, since we + * could loop forever. + */ + if (startag =3D=3D NULLAGNUMBER) + break; =20 - error =3D xfs_bmap_last_extent(NULL, ip, whichfork, &rec, &is_empty); - if (error || is_empty) - return error; + error =3D xfs_filestream_new_ag(ap, &ag); + xfs_perag_put(pag); + if (error) + return error; =20 - *last_block =3D rec.br_startoff + rec.br_blockcount; - return 0; -} + /* loop again to set 'blen'*/ + startag =3D NULLAGNUMBER; + pag =3D xfs_perag_get(mp, ag); + continue; + } + } + if (++ag =3D=3D mp->m_sb.sb_agcount) + ag =3D 0; + if (ag =3D=3D startag) + break; + xfs_perag_put(pag); + pag =3D xfs_perag_get(mp, ag); + } + xfs_perag_put(pag); =20 -/* - * Returns whether the selected fork of the inode has exactly one - * block or not. For the data fork we check this matches di_size, - * implying the file's range is 0..bsize-1. - */ -int /* 1=3D>1 block, 0=3D>otherwise */ -xfs_bmap_one_block( - xfs_inode_t *ip, /* incore inode */ - int whichfork) /* data or attr fork */ -{ - xfs_bmbt_rec_host_t *ep; /* ptr to fork's extent */ - xfs_ifork_t *ifp; /* inode fork pointer */ - int rval; /* return value */ - xfs_bmbt_irec_t s; /* internal version of extent */ + /* + * Since the above loop did a BUF_TRYLOCK, it is + * possible that there is space for this request. + */ + if (notinit || *blen < ap->minlen) + args->minlen =3D ap->minlen; + /* + * If the best seen length is less than the request + * length, use the best as the minimum. + */ + else if (*blen < args->maxlen) + args->minlen =3D *blen; + /* + * Otherwise we've seen an extent as big as maxlen, + * use that as the minimum. + */ + else + args->minlen =3D args->maxlen; =20 -#ifndef DEBUG - if (whichfork =3D=3D XFS_DATA_FORK) - return XFS_ISIZE(ip) =3D=3D ip->i_mount->m_sb.sb_blocksize; -#endif /* !DEBUG */ - if (XFS_IFORK_NEXTENTS(ip, whichfork) !=3D 1) - return 0; - if (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS) - return 0; - ifp =3D XFS_IFORK_PTR(ip, whichfork); - ASSERT(ifp->if_flags & XFS_IFEXTENTS); - ep =3D xfs_iext_get_ext(ifp, 0); - xfs_bmbt_get_all(ep, &s); - rval =3D s.br_startoff =3D=3D 0 && s.br_blockcount =3D=3D 1; - if (rval && whichfork =3D=3D XFS_DATA_FORK) - ASSERT(XFS_ISIZE(ip) =3D=3D ip->i_mount->m_sb.sb_blocksize); - return rval; + /* + * set the failure fallback case to look in the selected + * AG as the stream may have moved. + */ + if (xfs_inode_is_filestream(ap->ip)) + ap->blkno =3D args->fsbno =3D XFS_AGB_TO_FSB(mp, ag, 0); + + return 0; } =20 STATIC int -xfs_bmap_sanity_check( - struct xfs_mount *mp, - struct xfs_buf *bp, - int level) +xfs_bmap_btalloc( + xfs_bmalloca_t *ap) /* bmap alloc argument struct */ { - struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); + xfs_mount_t *mp; /* mount point structure */ + xfs_alloctype_t atype =3D 0; /* type for allocation routines */ + xfs_extlen_t align; /* minimum allocation alignment */ + xfs_agnumber_t fb_agno; /* ag number of ap->firstblock */ + xfs_agnumber_t ag; + xfs_alloc_arg_t args; + xfs_extlen_t blen; + xfs_extlen_t nextminlen =3D 0; + int nullfb; /* true if ap->firstblock isn't set */ + int isaligned; + int tryagain; + int error; =20 - if (block->bb_magic !=3D cpu_to_be32(XFS_BMAP_MAGIC) || - be16_to_cpu(block->bb_level) !=3D level || - be16_to_cpu(block->bb_numrecs) =3D=3D 0 || - be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level !=3D 0]) - return 0; - return 1; -} + ASSERT(ap->length); =20 -/* - * Read in the extents to if_extents. - * All inode fields are set up by caller, we just traverse the btree - * and copy the records in. If the file system cannot contain unwritten - * extents, the records are checked for no "state" flags. - */ -int /* error */ -xfs_bmap_read_extents( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode */ - int whichfork) /* data or attr fork */ -{ - struct xfs_btree_block *block; /* current btree block */ - xfs_fsblock_t bno; /* block # of "block" */ - xfs_buf_t *bp; /* buffer for "block" */ - int error; /* error return value */ - xfs_exntfmt_t exntf; /* XFS_EXTFMT_NOSTATE, if checking */ - xfs_extnum_t i, j; /* index into the extents list */ - xfs_ifork_t *ifp; /* fork structure */ - int level; /* btree level, for checking */ - xfs_mount_t *mp; /* file system mount structure */ - __be64 *pp; /* pointer to block address */ - /* REFERENCED */ - xfs_extnum_t room; /* number of entries there's room for */ + mp =3D ap->ip->i_mount; + align =3D ap->userdata ? xfs_get_extsz_hint(ap->ip) : 0; + if (unlikely(align)) { + error =3D xfs_bmap_extsize_align(mp, &ap->got, &ap->prev, + align, 0, ap->eof, 0, ap->conv, + &ap->offset, &ap->length); + ASSERT(!error); + ASSERT(ap->length); + } + nullfb =3D *ap->firstblock =3D=3D NULLFSBLOCK; + fb_agno =3D nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, *ap->firstblock); + if (nullfb) { + if (ap->userdata && xfs_inode_is_filestream(ap->ip)) { + ag =3D xfs_filestream_lookup_ag(ap->ip); + ag =3D (ag !=3D NULLAGNUMBER) ? ag : 0; + ap->blkno =3D XFS_AGB_TO_FSB(mp, ag, 0); + } else { + ap->blkno =3D XFS_INO_TO_FSB(mp, ap->ip->i_ino); + } + } else + ap->blkno =3D *ap->firstblock; + + xfs_bmap_adjacent(ap); =20 - bno =3D NULLFSBLOCK; - mp =3D ip->i_mount; - ifp =3D XFS_IFORK_PTR(ip, whichfork); - exntf =3D (whichfork !=3D XFS_DATA_FORK) ? XFS_EXTFMT_NOSTATE : - XFS_EXTFMT_INODE(ip); - block =3D ifp->if_broot; /* - * Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out. + * If allowed, use ap->blkno; otherwise must use firstblock since + * it's in the right allocation group. */ - level =3D be16_to_cpu(block->bb_level); - ASSERT(level > 0); - pp =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes); - bno =3D be64_to_cpu(*pp); - ASSERT(bno !=3D NULLDFSBNO); - ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount); - ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks); + if (nullfb || XFS_FSB_TO_AGNO(mp, ap->blkno) =3D=3D fb_agno) + ; + else + ap->blkno =3D *ap->firstblock; /* - * Go down the tree until leaf level is reached, following the first - * pointer (leftmost) at each level. + * Normal allocation, done through xfs_alloc_vextent. */ - while (level-- > 0) { - error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, - XFS_BMAP_BTREE_REF, &xfs_bmbt_buf_ops); + tryagain =3D isaligned =3D 0; + memset(&args, 0, sizeof(args)); + args.tp =3D ap->tp; + args.mp =3D mp; + args.fsbno =3D ap->blkno; + + /* Trim the allocation back to the maximum an AG can fit. */ + args.maxlen =3D MIN(ap->length, XFS_ALLOC_AG_MAX_USABLE(mp)); + args.firstblock =3D *ap->firstblock; + blen =3D 0; + if (nullfb) { + error =3D xfs_bmap_btalloc_nullfb(ap, &args, &blen); if (error) return error; - block =3D XFS_BUF_TO_BLOCK(bp); - XFS_WANT_CORRUPTED_GOTO( - xfs_bmap_sanity_check(mp, bp, level), - error0); - if (level =3D=3D 0) - break; - pp =3D XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); - bno =3D be64_to_cpu(*pp); - XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); - xfs_trans_brelse(tp, bp); + } else if (ap->flist->xbf_low) { + if (xfs_inode_is_filestream(ap->ip)) + args.type =3D XFS_ALLOCTYPE_FIRST_AG; + else + args.type =3D XFS_ALLOCTYPE_START_BNO; + args.total =3D args.minlen =3D ap->minlen; + } else { + args.type =3D XFS_ALLOCTYPE_NEAR_BNO; + args.total =3D ap->total; + args.minlen =3D ap->minlen; + } + /* apply extent size hints if obtained earlier */ + if (unlikely(align)) { + args.prod =3D align; + if ((args.mod =3D (xfs_extlen_t)do_mod(ap->offset, args.prod))) + args.mod =3D (xfs_extlen_t)(args.prod - args.mod); + } else if (mp->m_sb.sb_blocksize >=3D PAGE_CACHE_SIZE) { + args.prod =3D 1; + args.mod =3D 0; + } else { + args.prod =3D PAGE_CACHE_SIZE >> mp->m_sb.sb_blocklog; + if ((args.mod =3D (xfs_extlen_t)(do_mod(ap->offset, args.prod)))) + args.mod =3D (xfs_extlen_t)(args.prod - args.mod); } /* - * Here with bp and block set to the leftmost leaf node in the tree. - */ - room =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - i =3D 0; - /* - * Loop over all leaf nodes. Copy information to the extent records. + * If we are not low on available data blocks, and the + * underlying logical volume manager is a stripe, and + * the file offset is zero then try to allocate data + * blocks on stripe unit boundary. + * NOTE: ap->aeof is only set if the allocation length + * is >=3D the stripe unit and the allocation offset is + * at the end of file. */ - for (;;) { - xfs_bmbt_rec_t *frp; - xfs_fsblock_t nextbno; - xfs_extnum_t num_recs; - xfs_extnum_t start; - - num_recs =3D xfs_btree_get_numrecs(block); - if (unlikely(i + num_recs > room)) { - ASSERT(i + num_recs <=3D room); - xfs_warn(ip->i_mount, - "corrupt dinode %Lu, (btree extents).", - (unsigned long long) ip->i_ino); - XFS_CORRUPTION_ERROR("xfs_bmap_read_extents(1)", - XFS_ERRLEVEL_LOW, ip->i_mount, block); - goto error0; + if (!ap->flist->xbf_low && ap->aeof) { + if (!ap->offset) { + args.alignment =3D mp->m_dalign; + atype =3D args.type; + isaligned =3D 1; + /* + * Adjust for alignment + */ + if (blen > args.alignment && blen <=3D args.maxlen) + args.minlen =3D blen - args.alignment; + args.minalignslop =3D 0; + } else { + /* + * First try an exact bno allocation. + * If it fails then do a near or start bno + * allocation with alignment turned on. + */ + atype =3D args.type; + tryagain =3D 1; + args.type =3D XFS_ALLOCTYPE_THIS_BNO; + args.alignment =3D 1; + /* + * Compute the minlen+alignment for the + * next case. Set slop so that the value + * of minlen+alignment+slop doesn't go up + * between the calls. + */ + if (blen > mp->m_dalign && blen <=3D args.maxlen) + nextminlen =3D blen - mp->m_dalign; + else + nextminlen =3D args.minlen; + if (nextminlen + mp->m_dalign > args.minlen + 1) + args.minalignslop =3D + nextminlen + mp->m_dalign - + args.minlen - 1; + else + args.minalignslop =3D 0; } - XFS_WANT_CORRUPTED_GOTO( - xfs_bmap_sanity_check(mp, bp, 0), - error0); + } else { + args.alignment =3D 1; + args.minalignslop =3D 0; + } + args.minleft =3D ap->minleft; + args.wasdel =3D ap->wasdel; + args.isfl =3D 0; + args.userdata =3D ap->userdata; + if ((error =3D xfs_alloc_vextent(&args))) + return error; + if (tryagain && args.fsbno =3D=3D NULLFSBLOCK) { + /* + * Exact allocation failed. Now try with alignment + * turned on. + */ + args.type =3D atype; + args.fsbno =3D ap->blkno; + args.alignment =3D mp->m_dalign; + args.minlen =3D nextminlen; + args.minalignslop =3D 0; + isaligned =3D 1; + if ((error =3D xfs_alloc_vextent(&args))) + return error; + } + if (isaligned && args.fsbno =3D=3D NULLFSBLOCK) { /* - * Read-ahead the next leaf block, if any. + * allocation failed, so turn off alignment and + * try again. */ - nextbno =3D be64_to_cpu(block->bb_u.l.bb_rightsib); - if (nextbno !=3D NULLFSBLOCK) - xfs_btree_reada_bufl(mp, nextbno, 1, - &xfs_bmbt_buf_ops); + args.type =3D atype; + args.fsbno =3D ap->blkno; + args.alignment =3D 0; + if ((error =3D xfs_alloc_vextent(&args))) + return error; + } + if (args.fsbno =3D=3D NULLFSBLOCK && nullfb && + args.minlen > ap->minlen) { + args.minlen =3D ap->minlen; + args.type =3D XFS_ALLOCTYPE_START_BNO; + args.fsbno =3D ap->blkno; + if ((error =3D xfs_alloc_vextent(&args))) + return error; + } + if (args.fsbno =3D=3D NULLFSBLOCK && nullfb) { + args.fsbno =3D 0; + args.type =3D XFS_ALLOCTYPE_FIRST_AG; + args.total =3D ap->minlen; + args.minleft =3D 0; + if ((error =3D xfs_alloc_vextent(&args))) + return error; + ap->flist->xbf_low =3D 1; + } + if (args.fsbno !=3D NULLFSBLOCK) { /* - * Copy records into the extent records. + * check the allocation happened at the same or higher AG than + * the first block that was allocated. */ - frp =3D XFS_BMBT_REC_ADDR(mp, block, 1); - start =3D i; - for (j =3D 0; j < num_recs; j++, i++, frp++) { - xfs_bmbt_rec_host_t *trp =3D xfs_iext_get_ext(ifp, i); - trp->l0 =3D be64_to_cpu(frp->l0); - trp->l1 =3D be64_to_cpu(frp->l1); - } - if (exntf =3D=3D XFS_EXTFMT_NOSTATE) { - /* - * Check all attribute bmap btree records and - * any "older" data bmap btree records for a - * set bit in the "extent flag" position. - */ - if (unlikely(xfs_check_nostate_extents(ifp, - start, num_recs))) { - XFS_ERROR_REPORT("xfs_bmap_read_extents(2)", - XFS_ERRLEVEL_LOW, - ip->i_mount); - goto error0; - } - } - xfs_trans_brelse(tp, bp); - bno =3D nextbno; + ASSERT(*ap->firstblock =3D=3D NULLFSBLOCK || + XFS_FSB_TO_AGNO(mp, *ap->firstblock) =3D=3D + XFS_FSB_TO_AGNO(mp, args.fsbno) || + (ap->flist->xbf_low && + XFS_FSB_TO_AGNO(mp, *ap->firstblock) < + XFS_FSB_TO_AGNO(mp, args.fsbno))); + + ap->blkno =3D args.fsbno; + if (*ap->firstblock =3D=3D NULLFSBLOCK) + *ap->firstblock =3D args.fsbno; + ASSERT(nullfb || fb_agno =3D=3D args.agno || + (ap->flist->xbf_low && fb_agno < args.agno)); + ap->length =3D args.len; + ap->ip->i_d.di_nblocks +=3D args.len; + xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE); + if (ap->wasdel) + ap->ip->i_delayed_blks -=3D args.len; /* - * If we've reached the end, stop. + * Adjust the disk quota also. This was reserved + * earlier. */ - if (bno =3D=3D NULLFSBLOCK) - break; - error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, - XFS_BMAP_BTREE_REF, &xfs_bmbt_buf_ops); - if (error) - return error; - block =3D XFS_BUF_TO_BLOCK(bp); + xfs_trans_mod_dquot_byino(ap->tp, ap->ip, + ap->wasdel ? XFS_TRANS_DQ_DELBCOUNT : + XFS_TRANS_DQ_BCOUNT, + (long) args.len); + } else { + ap->blkno =3D NULLFSBLOCK; + ap->length =3D 0; } - ASSERT(i =3D=3D (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))); - ASSERT(i =3D=3D XFS_IFORK_NEXTENTS(ip, whichfork)); - XFS_BMAP_TRACE_EXLIST(ip, i, whichfork); return 0; -error0: - xfs_trans_brelse(tp, bp); - return XFS_ERROR(EFSCORRUPTED); -} - -#ifdef DEBUG -/* - * Add bmap trace insert entries for all the contents of the extent record= s. - */ -void -xfs_bmap_trace_exlist( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t cnt, /* count of entries in the list */ - int whichfork, /* data or attr fork */ - unsigned long caller_ip) -{ - xfs_extnum_t idx; /* extent record index */ - xfs_ifork_t *ifp; /* inode fork pointer */ - int state =3D 0; - - if (whichfork =3D=3D XFS_ATTR_FORK) - state |=3D BMAP_ATTRFORK; - - ifp =3D XFS_IFORK_PTR(ip, whichfork); - ASSERT(cnt =3D=3D (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))); - for (idx =3D 0; idx < cnt; idx++) - trace_xfs_extlist(ip, idx, whichfork, caller_ip); } =20 /* - * Validate that the bmbt_irecs being returned from bmapi are valid - * given the callers original parameters. Specifically check the - * ranges of the returned irecs to ensure that they only extent beyond - * the given parameters if the XFS_BMAPI_ENTIRE flag was set. + * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. + * It figures out where to ask the underlying allocator to put the new ext= ent. */ -STATIC void -xfs_bmap_validate_ret( - xfs_fileoff_t bno, - xfs_filblks_t len, - int flags, - xfs_bmbt_irec_t *mval, - int nmap, - int ret_nmap) +STATIC int +xfs_bmap_alloc( + xfs_bmalloca_t *ap) /* bmap alloc argument struct */ { - int i; /* index to map values */ - - ASSERT(ret_nmap <=3D nmap); - - for (i =3D 0; i < ret_nmap; i++) { - ASSERT(mval[i].br_blockcount > 0); - if (!(flags & XFS_BMAPI_ENTIRE)) { - ASSERT(mval[i].br_startoff >=3D bno); - ASSERT(mval[i].br_blockcount <=3D len); - ASSERT(mval[i].br_startoff + mval[i].br_blockcount <=3D - bno + len); - } else { - ASSERT(mval[i].br_startoff < bno + len); - ASSERT(mval[i].br_startoff + mval[i].br_blockcount > - bno); - } - ASSERT(i =3D=3D 0 || - mval[i - 1].br_startoff + mval[i - 1].br_blockcount =3D=3D - mval[i].br_startoff); - ASSERT(mval[i].br_startblock !=3D DELAYSTARTBLOCK && - mval[i].br_startblock !=3D HOLESTARTBLOCK); - ASSERT(mval[i].br_state =3D=3D XFS_EXT_NORM || - mval[i].br_state =3D=3D XFS_EXT_UNWRITTEN); - } + if (XFS_IS_REALTIME_INODE(ap->ip) && ap->userdata) + return xfs_bmap_rtalloc(ap); + return xfs_bmap_btalloc(ap); } -#endif /* DEBUG */ - =20 /* * Trim the returned map to the required bounds @@ -4385,9 +4422,12 @@ xfs_bmapi_allocate( struct xfs_ifork *ifp =3D XFS_IFORK_PTR(bma->ip, whichfork); int tmp_logflags =3D 0; int error; + int rt; =20 ASSERT(bma->length > 0); =20 + rt =3D (whichfork =3D=3D XFS_DATA_FORK) && XFS_IS_REALTIME_INODE(bma->ip); + /* * For the wasdelay case, we could also just allocate the stuff asked * for in this bmap call but that wouldn't be as good. @@ -4428,9 +4468,6 @@ xfs_bmapi_allocate( return error; } =20 - if (bma->flags & XFS_BMAPI_STACK_SWITCH) - bma->stack_switch =3D 1; - error =3D xfs_bmap_alloc(bma); if (error) return error; @@ -4493,7 +4530,6 @@ xfs_bmapi_allocate( return 0; } =20 - STATIC int xfs_bmapi_convert_unwritten( struct xfs_bmalloca *bma, @@ -4632,8 +4668,32 @@ xfs_bmapi_write( XFS_STATS_INC(xs_blk_mapw); =20 if (XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_LOCAL) { + /* + * XXX (dgc): This assumes we are only called for inodes that + * contain content neutral data in local format. Anything that + * contains caller-specific data in local format that needs + * transformation to move to a block format needs to do the + * conversion to extent format itself. + * + * Directory data forks and attribute forks handle this + * themselves, but with the addition of metadata verifiers every + * data fork in local format now contains caller specific data + * and as such conversion through this function is likely to be + * broken. + * + * The only likely user of this branch is for remote symlinks, + * but we cannot overwrite the data fork contents of the symlink + * (EEXIST occurs higher up the stack) and so it will never go + * from local format to extent format here. Hence I don't think + * this branch is ever executed intentionally and we should + * consider removing it and asserting that xfs_bmapi_write() + * cannot be called directly on local format forks. i.e. callers + * are completely responsible for local to extent format + * conversion, not xfs_bmapi_write(). + */ error =3D xfs_bmap_local_to_extents(tp, ip, firstblock, total, - &bma.logflags, whichfork); + &bma.logflags, whichfork, + xfs_bmap_local_to_extents_init_fn); if (error) goto error0; } @@ -4666,6 +4726,9 @@ xfs_bmapi_write( bma.flist =3D flist; bma.firstblock =3D firstblock; =20 + if (flags & XFS_BMAPI_STACK_SWITCH) + bma.stack_switch =3D 1; + while (bno < end && n < *nmap) { inhole =3D eof || bma.got.br_startoff > bno; wasdelay =3D !inhole && isnullstartblock(bma.got.br_startblock); @@ -4793,804 +4856,703 @@ error0: } =20 /* - * Unmap (remove) blocks from a file. - * If nexts is nonzero then the number of extents to remove is limited to - * that value. If not all extents in the block range can be removed then - * *done is set. + * Called by xfs_bmapi to update file extent records and the btree + * after removing space (or undoing a delayed allocation). */ -int /* error */ -xfs_bunmapi( - xfs_trans_t *tp, /* transaction pointer */ - struct xfs_inode *ip, /* incore inode */ - xfs_fileoff_t bno, /* starting offset to unmap */ - xfs_filblks_t len, /* length to unmap in file */ - int flags, /* misc flags */ - xfs_extnum_t nexts, /* number of extents max */ - xfs_fsblock_t *firstblock, /* first allocated block - controls a.g. for allocs */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - int *done) /* set if not done yet */ +STATIC int /* error */ +xfs_bmap_del_extent( + xfs_inode_t *ip, /* incore inode pointer */ + xfs_trans_t *tp, /* current transaction pointer */ + xfs_extnum_t *idx, /* extent number to update/delete */ + xfs_bmap_free_t *flist, /* list of extents to be freed */ + xfs_btree_cur_t *cur, /* if null, not a btree */ + xfs_bmbt_irec_t *del, /* data to remove from extents */ + int *logflagsp, /* inode logging flags */ + int whichfork) /* data or attr fork */ { - xfs_btree_cur_t *cur; /* bmap btree cursor */ - xfs_bmbt_irec_t del; /* extent being deleted */ - int eof; /* is deleting at eof */ - xfs_bmbt_rec_host_t *ep; /* extent record pointer */ - int error; /* error return value */ - xfs_extnum_t extno; /* extent number in list */ - xfs_bmbt_irec_t got; /* current extent record */ - xfs_ifork_t *ifp; /* inode fork pointer */ - int isrt; /* freeing in rt area */ - xfs_extnum_t lastx; /* last extent index used */ - int logflags; /* transaction logging flags */ - xfs_extlen_t mod; /* rt extent offset */ - xfs_mount_t *mp; /* mount structure */ - xfs_extnum_t nextents; /* number of file extents */ - xfs_bmbt_irec_t prev; /* previous extent record */ - xfs_fileoff_t start; /* first file offset deleted */ - int tmp_logflags; /* partial logging flags */ - int wasdel; /* was a delayed alloc extent */ - int whichfork; /* data or attribute fork */ - xfs_fsblock_t sum; - - trace_xfs_bunmap(ip, bno, len, flags, _RET_IP_); - - whichfork =3D (flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; - ifp =3D XFS_IFORK_PTR(ip, whichfork); - if (unlikely( - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE)) { - XFS_ERROR_REPORT("xfs_bunmapi", XFS_ERRLEVEL_LOW, - ip->i_mount); - return XFS_ERROR(EFSCORRUPTED); - } - mp =3D ip->i_mount; - if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + xfs_filblks_t da_new; /* new delay-alloc indirect blocks */ + xfs_filblks_t da_old; /* old delay-alloc indirect blocks */ + xfs_fsblock_t del_endblock=3D0; /* first block past del */ + xfs_fileoff_t del_endoff; /* first offset past del */ + int delay; /* current block is delayed allocated */ + int do_fx; /* free extent at end of routine */ + xfs_bmbt_rec_host_t *ep; /* current extent entry pointer */ + int error; /* error return value */ + int flags; /* inode logging flags */ + xfs_bmbt_irec_t got; /* current extent entry */ + xfs_fileoff_t got_endoff; /* first offset past got */ + int i; /* temp state */ + xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_mount_t *mp; /* mount structure */ + xfs_filblks_t nblks; /* quota/sb block count */ + xfs_bmbt_irec_t new; /* new record to be inserted */ + /* REFERENCED */ + uint qfield; /* quota field to update */ + xfs_filblks_t temp; /* for indirect length calculations */ + xfs_filblks_t temp2; /* for indirect length calculations */ + int state =3D 0; =20 - ASSERT(len > 0); - ASSERT(nexts >=3D 0); + XFS_STATS_INC(xs_del_exlist); =20 - if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error =3D xfs_iread_extents(tp, ip, whichfork))) - return error; - nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - if (nextents =3D=3D 0) { - *done =3D 1; - return 0; - } - XFS_STATS_INC(xs_blk_unmap); - isrt =3D (whichfork =3D=3D XFS_DATA_FORK) && XFS_IS_REALTIME_INODE(ip); - start =3D bno; - bno =3D start + len - 1; - ep =3D xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, - &prev); + if (whichfork =3D=3D XFS_ATTR_FORK) + state |=3D BMAP_ATTRFORK; =20 + mp =3D ip->i_mount; + ifp =3D XFS_IFORK_PTR(ip, whichfork); + ASSERT((*idx >=3D 0) && (*idx < ifp->if_bytes / + (uint)sizeof(xfs_bmbt_rec_t))); + ASSERT(del->br_blockcount > 0); + ep =3D xfs_iext_get_ext(ifp, *idx); + xfs_bmbt_get_all(ep, &got); + ASSERT(got.br_startoff <=3D del->br_startoff); + del_endoff =3D del->br_startoff + del->br_blockcount; + got_endoff =3D got.br_startoff + got.br_blockcount; + ASSERT(got_endoff >=3D del_endoff); + delay =3D isnullstartblock(got.br_startblock); + ASSERT(isnullstartblock(del->br_startblock) =3D=3D delay); + flags =3D 0; + qfield =3D 0; + error =3D 0; /* - * Check to see if the given block number is past the end of the - * file, back up to the last block if so... + * If deleting a real allocation, must free up the disk space. */ - if (eof) { - ep =3D xfs_iext_get_ext(ifp, --lastx); - xfs_bmbt_get_all(ep, &got); - bno =3D got.br_startoff + got.br_blockcount - 1; - } - logflags =3D 0; - if (ifp->if_flags & XFS_IFBROOT) { - ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_BTREE); - cur =3D xfs_bmbt_init_cursor(mp, tp, ip, whichfork); - cur->bc_private.b.firstblock =3D *firstblock; - cur->bc_private.b.flist =3D flist; - cur->bc_private.b.flags =3D 0; - } else - cur =3D NULL; - - if (isrt) { + if (!delay) { + flags =3D XFS_ILOG_CORE; /* - * Synchronize by locking the bitmap inode. + * Realtime allocation. Free it and record di_nblocks update. */ - xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, mp->m_rbmip, XFS_ILOCK_EXCL); - } + if (whichfork =3D=3D XFS_DATA_FORK && XFS_IS_REALTIME_INODE(ip)) { + xfs_fsblock_t bno; + xfs_filblks_t len; =20 - extno =3D 0; - while (bno !=3D (xfs_fileoff_t)-1 && bno >=3D start && lastx >=3D 0 && - (nexts =3D=3D 0 || extno < nexts)) { - /* - * Is the found extent after a hole in which bno lives? - * Just back up to the previous extent, if so. - */ - if (got.br_startoff > bno) { - if (--lastx < 0) - break; - ep =3D xfs_iext_get_ext(ifp, lastx); - xfs_bmbt_get_all(ep, &got); + ASSERT(do_mod(del->br_blockcount, + mp->m_sb.sb_rextsize) =3D=3D 0); + ASSERT(do_mod(del->br_startblock, + mp->m_sb.sb_rextsize) =3D=3D 0); + bno =3D del->br_startblock; + len =3D del->br_blockcount; + do_div(bno, mp->m_sb.sb_rextsize); + do_div(len, mp->m_sb.sb_rextsize); + error =3D xfs_rtfree_extent(tp, bno, (xfs_extlen_t)len); + if (error) + goto done; + do_fx =3D 0; + nblks =3D len * mp->m_sb.sb_rextsize; + qfield =3D XFS_TRANS_DQ_RTBCOUNT; } /* - * Is the last block of this extent before the range - * we're supposed to delete? If so, we're done. + * Ordinary allocation. */ - bno =3D XFS_FILEOFF_MIN(bno, - got.br_startoff + got.br_blockcount - 1); - if (bno < start) - break; + else { + do_fx =3D 1; + nblks =3D del->br_blockcount; + qfield =3D XFS_TRANS_DQ_BCOUNT; + } /* - * Then deal with the (possibly delayed) allocated space - * we found. + * Set up del_endblock and cur for later. */ - ASSERT(ep !=3D NULL); - del =3D got; - wasdel =3D isnullstartblock(del.br_startblock); - if (got.br_startoff < start) { - del.br_startoff =3D start; - del.br_blockcount -=3D start - got.br_startoff; - if (!wasdel) - del.br_startblock +=3D start - got.br_startoff; - } - if (del.br_startoff + del.br_blockcount > bno + 1) - del.br_blockcount =3D bno + 1 - del.br_startoff; - sum =3D del.br_startblock + del.br_blockcount; - if (isrt && - (mod =3D do_mod(sum, mp->m_sb.sb_rextsize))) { - /* - * Realtime extent not lined up at the end. - * The extent could have been split into written - * and unwritten pieces, or we could just be - * unmapping part of it. But we can't really - * get rid of part of a realtime extent. - */ - if (del.br_state =3D=3D XFS_EXT_UNWRITTEN || - !xfs_sb_version_hasextflgbit(&mp->m_sb)) { - /* - * This piece is unwritten, or we're not - * using unwritten extents. Skip over it. - */ - ASSERT(bno >=3D mod); - bno -=3D mod > del.br_blockcount ? - del.br_blockcount : mod; - if (bno < got.br_startoff) { - if (--lastx >=3D 0) - xfs_bmbt_get_all(xfs_iext_get_ext( - ifp, lastx), &got); - } - continue; - } - /* - * It's written, turn it unwritten. - * This is better than zeroing it. - */ - ASSERT(del.br_state =3D=3D XFS_EXT_NORM); - ASSERT(xfs_trans_get_block_res(tp) > 0); - /* - * If this spans a realtime extent boundary, - * chop it back to the start of the one we end at. - */ - if (del.br_blockcount > mod) { - del.br_startoff +=3D del.br_blockcount - mod; - del.br_startblock +=3D del.br_blockcount - mod; - del.br_blockcount =3D mod; - } - del.br_state =3D XFS_EXT_UNWRITTEN; - error =3D xfs_bmap_add_extent_unwritten_real(tp, ip, - &lastx, &cur, &del, firstblock, flist, - &logflags); - if (error) - goto error0; - goto nodelete; + del_endblock =3D del->br_startblock + del->br_blockcount; + if (cur) { + if ((error =3D xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, got.br_blockcount, + &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); } - if (isrt && (mod =3D do_mod(del.br_startblock, mp->m_sb.sb_rextsize))) { - /* - * Realtime extent is lined up at the end but not - * at the front. We'll get rid of full extents if - * we can. - */ - mod =3D mp->m_sb.sb_rextsize - mod; - if (del.br_blockcount > mod) { - del.br_blockcount -=3D mod; - del.br_startoff +=3D mod; - del.br_startblock +=3D mod; - } else if ((del.br_startoff =3D=3D start && - (del.br_state =3D=3D XFS_EXT_UNWRITTEN || - xfs_trans_get_block_res(tp) =3D=3D 0)) || - !xfs_sb_version_hasextflgbit(&mp->m_sb)) { - /* - * Can't make it unwritten. There isn't - * a full extent here so just skip it. - */ - ASSERT(bno >=3D del.br_blockcount); - bno -=3D del.br_blockcount; - if (got.br_startoff > bno) { - if (--lastx >=3D 0) { - ep =3D xfs_iext_get_ext(ifp, - lastx); - xfs_bmbt_get_all(ep, &got); - } - } - continue; - } else if (del.br_state =3D=3D XFS_EXT_UNWRITTEN) { - /* - * This one is already unwritten. - * It must have a written left neighbor. - * Unwrite the killed part of that one and - * try again. - */ - ASSERT(lastx > 0); - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, - lastx - 1), &prev); - ASSERT(prev.br_state =3D=3D XFS_EXT_NORM); - ASSERT(!isnullstartblock(prev.br_startblock)); - ASSERT(del.br_startblock =3D=3D - prev.br_startblock + prev.br_blockcount); - if (prev.br_startoff < start) { - mod =3D start - prev.br_startoff; - prev.br_blockcount -=3D mod; - prev.br_startblock +=3D mod; - prev.br_startoff =3D start; - } - prev.br_state =3D XFS_EXT_UNWRITTEN; - lastx--; - error =3D xfs_bmap_add_extent_unwritten_real(tp, - ip, &lastx, &cur, &prev, - firstblock, flist, &logflags); - if (error) - goto error0; - goto nodelete; - } else { - ASSERT(del.br_state =3D=3D XFS_EXT_NORM); - del.br_state =3D XFS_EXT_UNWRITTEN; - error =3D xfs_bmap_add_extent_unwritten_real(tp, - ip, &lastx, &cur, &del, - firstblock, flist, &logflags); - if (error) - goto error0; - goto nodelete; - } + da_old =3D da_new =3D 0; + } else { + da_old =3D startblockval(got.br_startblock); + da_new =3D 0; + nblks =3D 0; + do_fx =3D 0; + } + /* + * Set flag value to use in switch statement. + * Left-contig is 2, right-contig is 1. + */ + switch (((got.br_startoff =3D=3D del->br_startoff) << 1) | + (got_endoff =3D=3D del_endoff)) { + case 3: + /* + * Matches the whole extent. Delete the entry. + */ + xfs_iext_remove(ip, *idx, 1, + whichfork =3D=3D XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); + --*idx; + if (delay) + break; + + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); + flags |=3D XFS_ILOG_CORE; + if (!cur) { + flags |=3D xfs_ilog_fext(whichfork); + break; } - if (wasdel) { - ASSERT(startblockval(del.br_startblock) > 0); - /* Update realtime/data freespace, unreserve quota */ - if (isrt) { - xfs_filblks_t rtexts; + if ((error =3D xfs_btree_delete(cur, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + break; =20 - rtexts =3D XFS_FSB_TO_B(mp, del.br_blockcount); - do_div(rtexts, mp->m_sb.sb_rextsize); - xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, - (int64_t)rtexts, 0); - (void)xfs_trans_reserve_quota_nblks(NULL, - ip, -((long)del.br_blockcount), 0, - XFS_QMOPT_RES_RTBLKS); - } else { - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - (int64_t)del.br_blockcount, 0); - (void)xfs_trans_reserve_quota_nblks(NULL, - ip, -((long)del.br_blockcount), 0, - XFS_QMOPT_RES_REGBLKS); - } - ip->i_delayed_blks -=3D del.br_blockcount; - if (cur) - cur->bc_private.b.flags |=3D - XFS_BTCUR_BPRV_WASDEL; - } else if (cur) - cur->bc_private.b.flags &=3D ~XFS_BTCUR_BPRV_WASDEL; + case 2: /* - * If it's the case where the directory code is running - * with no block reservation, and the deleted block is in - * the middle of its extent, and the resulting insert - * of an extent would cause transformation to btree format, - * then reject it. The calling code will then swap - * blocks around instead. - * We have to do this now, rather than waiting for the - * conversion to btree format, since the transaction - * will be dirty. + * Deleting the first part of the extent. */ - if (!wasdel && xfs_trans_get_block_res(tp) =3D=3D 0 && - XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_NEXTENTS(ip, whichfork) >=3D /* Note the >=3D */ - XFS_IFORK_MAXEXT(ip, whichfork) && - del.br_startoff > got.br_startoff && - del.br_startoff + del.br_blockcount < - got.br_startoff + got.br_blockcount) { - error =3D XFS_ERROR(ENOSPC); - goto error0; + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_startoff(ep, del_endoff); + temp =3D got.br_blockcount - del->br_blockcount; + xfs_bmbt_set_blockcount(ep, temp); + if (delay) { + temp =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + da_old); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + da_new =3D temp; + break; } - error =3D xfs_bmap_del_extent(ip, tp, &lastx, flist, cur, &del, - &tmp_logflags, whichfork); - logflags |=3D tmp_logflags; - if (error) - goto error0; - bno =3D del.br_startoff - 1; -nodelete: + xfs_bmbt_set_startblock(ep, del_endblock); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + if (!cur) { + flags |=3D xfs_ilog_fext(whichfork); + break; + } + if ((error =3D xfs_bmbt_update(cur, del_endoff, del_endblock, + got.br_blockcount - del->br_blockcount, + got.br_state))) + goto done; + break; + + case 1: /* - * If not done go on to the next (previous) record. + * Deleting the last part of the extent. */ - if (bno !=3D (xfs_fileoff_t)-1 && bno >=3D start) { - if (lastx >=3D 0) { - ep =3D xfs_iext_get_ext(ifp, lastx); - if (xfs_bmbt_get_startoff(ep) > bno) { - if (--lastx >=3D 0) - ep =3D xfs_iext_get_ext(ifp, - lastx); + temp =3D got.br_blockcount - del->br_blockcount; + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); + if (delay) { + temp =3D XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + da_old); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + da_new =3D temp; + break; + } + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + if (!cur) { + flags |=3D xfs_ilog_fext(whichfork); + break; + } + if ((error =3D xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount - del->br_blockcount, + got.br_state))) + goto done; + break; + + case 0: + /* + * Deleting the middle of the extent. + */ + temp =3D del->br_startoff - got.br_startoff; + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); + new.br_startoff =3D del_endoff; + temp2 =3D got_endoff - del_endoff; + new.br_blockcount =3D temp2; + new.br_state =3D got.br_state; + if (!delay) { + new.br_startblock =3D del_endblock; + flags |=3D XFS_ILOG_CORE; + if (cur) { + if ((error =3D xfs_bmbt_update(cur, + got.br_startoff, + got.br_startblock, temp, + got.br_state))) + goto done; + if ((error =3D xfs_btree_increment(cur, 0, &i))) + goto done; + cur->bc_rec.b =3D new; + error =3D xfs_btree_insert(cur, &i); + if (error && error !=3D ENOSPC) + goto done; + /* + * If get no-space back from btree insert, + * it tried a split, and we have a zero + * block reservation. + * Fix up our state and return the error. + */ + if (error =3D=3D ENOSPC) { + /* + * Reset the cursor, don't trust + * it after any insert operation. + */ + if ((error =3D xfs_bmbt_lookup_eq(cur, + got.br_startoff, + got.br_startblock, + temp, &i))) + goto done; + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + /* + * Update the btree record back + * to the original value. + */ + if ((error =3D xfs_bmbt_update(cur, + got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state))) + goto done; + /* + * Reset the extent record back + * to the original value. + */ + xfs_bmbt_set_blockcount(ep, + got.br_blockcount); + flags =3D 0; + error =3D XFS_ERROR(ENOSPC); + goto done; + } + XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, done); + } else + flags |=3D xfs_ilog_fext(whichfork); + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); + } else { + ASSERT(whichfork =3D=3D XFS_DATA_FORK); + temp =3D xfs_bmap_worst_indlen(ip, temp); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + temp2 =3D xfs_bmap_worst_indlen(ip, temp2); + new.br_startblock =3D nullstartblock((int)temp2); + da_new =3D temp + temp2; + while (da_new > da_old) { + if (temp) { + temp--; + da_new--; + xfs_bmbt_set_startblock(ep, + nullstartblock((int)temp)); + } + if (da_new =3D=3D da_old) + break; + if (temp2) { + temp2--; + da_new--; + new.br_startblock =3D + nullstartblock((int)temp2); } - xfs_bmbt_get_all(ep, &got); } - extno++; } - } - *done =3D bno =3D=3D (xfs_fileoff_t)-1 || bno < start || lastx < 0; - - /* - * Convert to a btree if necessary. - */ - if (xfs_bmap_needs_btree(ip, whichfork)) { - ASSERT(cur =3D=3D NULL); - error =3D xfs_bmap_extents_to_btree(tp, ip, firstblock, flist, - &cur, 0, &tmp_logflags, whichfork); - logflags |=3D tmp_logflags; - if (error) - goto error0; + trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); + xfs_iext_insert(ip, *idx + 1, 1, &new, state); + ++*idx; + break; } /* - * transform from btree to extents, give it cur + * If we need to, add to list of extents to delete. */ - else if (xfs_bmap_wants_extents(ip, whichfork)) { - ASSERT(cur !=3D NULL); - error =3D xfs_bmap_btree_to_extents(tp, ip, cur, &tmp_logflags, - whichfork); - logflags |=3D tmp_logflags; - if (error) - goto error0; - } + if (do_fx) + xfs_bmap_add_free(del->br_startblock, del->br_blockcount, flist, + mp); /* - * transform from extents to local? + * Adjust inode # blocks in the file. */ - error =3D 0; -error0: + if (nblks) + ip->i_d.di_nblocks -=3D nblks; /* - * Log everything. Do this after conversion, there's no point in - * logging the extent records if we've converted to btree format. + * Adjust quota data. */ - if ((logflags & xfs_ilog_fext(whichfork)) && - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS) - logflags &=3D ~xfs_ilog_fext(whichfork); - else if ((logflags & xfs_ilog_fbroot(whichfork)) && - XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE) - logflags &=3D ~xfs_ilog_fbroot(whichfork); + if (qfield) + xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks); + /* - * Log inode even in the error case, if the transaction - * is dirty we'll need to shut down the filesystem. + * Account for change in delayed indirect blocks. + * Nothing to do for disk quota accounting here. */ - if (logflags) - xfs_trans_log_inode(tp, ip, logflags); - if (cur) { - if (!error) { - *firstblock =3D cur->bc_private.b.firstblock; - cur->bc_private.b.allocated =3D 0; - } - xfs_btree_del_cursor(cur, - error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + ASSERT(da_old >=3D da_new); + if (da_old > da_new) { + xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + (int64_t)(da_old - da_new), 0); } +done: + *logflagsp =3D flags; return error; } =20 -#ifdef DEBUG -STATIC struct xfs_buf * -xfs_bmap_get_bp( - struct xfs_btree_cur *cur, - xfs_fsblock_t bno) -{ - struct xfs_log_item_desc *lidp; - int i; - - if (!cur) - return NULL; - - for (i =3D 0; i < XFS_BTREE_MAXLEVELS; i++) { - if (!cur->bc_bufs[i]) - break; - if (XFS_BUF_ADDR(cur->bc_bufs[i]) =3D=3D bno) - return cur->bc_bufs[i]; - } - - /* Chase down all the log items to see if the bp is there */ - list_for_each_entry(lidp, &cur->bc_tp->t_items, lid_trans) { - struct xfs_buf_log_item *bip; - bip =3D (struct xfs_buf_log_item *)lidp->lid_item; - if (bip->bli_item.li_type =3D=3D XFS_LI_BUF && - XFS_BUF_ADDR(bip->bli_buf) =3D=3D bno) - return bip->bli_buf; - } - - return NULL; -} - -STATIC void -xfs_check_block( - struct xfs_btree_block *block, - xfs_mount_t *mp, - int root, - short sz) -{ - int i, j, dmxr; - __be64 *pp, *thispa; /* pointer to block address */ - xfs_bmbt_key_t *prevp, *keyp; - - ASSERT(be16_to_cpu(block->bb_level) > 0); - - prevp =3D NULL; - for( i =3D 1; i <=3D xfs_btree_get_numrecs(block); i++) { - dmxr =3D mp->m_bmap_dmxr[0]; - keyp =3D XFS_BMBT_KEY_ADDR(mp, block, i); - - if (prevp) { - ASSERT(be64_to_cpu(prevp->br_startoff) < - be64_to_cpu(keyp->br_startoff)); - } - prevp =3D keyp; - - /* - * Compare the block numbers to see if there are dups. - */ - if (root) - pp =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, i, sz); - else - pp =3D XFS_BMBT_PTR_ADDR(mp, block, i, dmxr); - - for (j =3D i+1; j <=3D be16_to_cpu(block->bb_numrecs); j++) { - if (root) - thispa =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, j, sz); - else - thispa =3D XFS_BMBT_PTR_ADDR(mp, block, j, dmxr); - if (*thispa =3D=3D *pp) { - xfs_warn(mp, "%s: thispa(%d) =3D=3D pp(%d) %Ld", - __func__, j, i, - (unsigned long long)be64_to_cpu(*thispa)); - panic("%s: ptrs are equal in node\n", - __func__); - } - } - } -} - /* - * Check that the extents for the inode ip are in the right order in all - * btree leaves. + * Unmap (remove) blocks from a file. + * If nexts is nonzero then the number of extents to remove is limited to + * that value. If not all extents in the block range can be removed then + * *done is set. */ - -STATIC void -xfs_bmap_check_leaf_extents( - xfs_btree_cur_t *cur, /* btree cursor or null */ - xfs_inode_t *ip, /* incore inode pointer */ - int whichfork) /* data or attr fork */ +int /* error */ +xfs_bunmapi( + xfs_trans_t *tp, /* transaction pointer */ + struct xfs_inode *ip, /* incore inode */ + xfs_fileoff_t bno, /* starting offset to unmap */ + xfs_filblks_t len, /* length to unmap in file */ + int flags, /* misc flags */ + xfs_extnum_t nexts, /* number of extents max */ + xfs_fsblock_t *firstblock, /* first allocated block + controls a.g. for allocs */ + xfs_bmap_free_t *flist, /* i/o: list extents to free */ + int *done) /* set if not done yet */ { - struct xfs_btree_block *block; /* current btree block */ - xfs_fsblock_t bno; /* block # of "block" */ - xfs_buf_t *bp; /* buffer for "block" */ - int error; /* error return value */ - xfs_extnum_t i=3D0, j; /* index into the extents list */ - xfs_ifork_t *ifp; /* fork structure */ - int level; /* btree level, for checking */ - xfs_mount_t *mp; /* file system mount structure */ - __be64 *pp; /* pointer to block address */ - xfs_bmbt_rec_t *ep; /* pointer to current extent */ - xfs_bmbt_rec_t last =3D {0, 0}; /* last extent in prev block */ - xfs_bmbt_rec_t *nextp; /* pointer to next extent */ - int bp_release =3D 0; + xfs_btree_cur_t *cur; /* bmap btree cursor */ + xfs_bmbt_irec_t del; /* extent being deleted */ + int eof; /* is deleting at eof */ + xfs_bmbt_rec_host_t *ep; /* extent record pointer */ + int error; /* error return value */ + xfs_extnum_t extno; /* extent number in list */ + xfs_bmbt_irec_t got; /* current extent record */ + xfs_ifork_t *ifp; /* inode fork pointer */ + int isrt; /* freeing in rt area */ + xfs_extnum_t lastx; /* last extent index used */ + int logflags; /* transaction logging flags */ + xfs_extlen_t mod; /* rt extent offset */ + xfs_mount_t *mp; /* mount structure */ + xfs_extnum_t nextents; /* number of file extents */ + xfs_bmbt_irec_t prev; /* previous extent record */ + xfs_fileoff_t start; /* first file offset deleted */ + int tmp_logflags; /* partial logging flags */ + int wasdel; /* was a delayed alloc extent */ + int whichfork; /* data or attribute fork */ + xfs_fsblock_t sum; =20 - if (XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE) { - return; - } + trace_xfs_bunmap(ip, bno, len, flags, _RET_IP_); =20 - bno =3D NULLFSBLOCK; - mp =3D ip->i_mount; + whichfork =3D (flags & XFS_BMAPI_ATTRFORK) ? + XFS_ATTR_FORK : XFS_DATA_FORK; ifp =3D XFS_IFORK_PTR(ip, whichfork); - block =3D ifp->if_broot; - /* - * Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out. - */ - level =3D be16_to_cpu(block->bb_level); - ASSERT(level > 0); - xfs_check_block(block, mp, 1, ifp->if_broot_bytes); - pp =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes); - bno =3D be64_to_cpu(*pp); - - ASSERT(bno !=3D NULLDFSBNO); - ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount); - ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks); - - /* - * Go down the tree until leaf level is reached, following the first - * pointer (leftmost) at each level. - */ - while (level-- > 0) { - /* See if buf is in cur first */ - bp_release =3D 0; - bp =3D xfs_bmap_get_bp(cur, XFS_FSB_TO_DADDR(mp, bno)); - if (!bp) { - bp_release =3D 1; - error =3D xfs_btree_read_bufl(mp, NULL, bno, 0, &bp, - XFS_BMAP_BTREE_REF, - &xfs_bmbt_buf_ops); - if (error) - goto error_norelse; - } - block =3D XFS_BUF_TO_BLOCK(bp); - XFS_WANT_CORRUPTED_GOTO( - xfs_bmap_sanity_check(mp, bp, level), - error0); - if (level =3D=3D 0) - break; + if (unlikely( + XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE)) { + XFS_ERROR_REPORT("xfs_bunmapi", XFS_ERRLEVEL_LOW, + ip->i_mount); + return XFS_ERROR(EFSCORRUPTED); + } + mp =3D ip->i_mount; + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); =20 - /* - * Check this block for basic sanity (increasing keys and - * no duplicate blocks). - */ + ASSERT(len > 0); + ASSERT(nexts >=3D 0); =20 - xfs_check_block(block, mp, 0, 0); - pp =3D XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); - bno =3D be64_to_cpu(*pp); - XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); - if (bp_release) { - bp_release =3D 0; - xfs_trans_brelse(NULL, bp); - } + if (!(ifp->if_flags & XFS_IFEXTENTS) && + (error =3D xfs_iread_extents(tp, ip, whichfork))) + return error; + nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + if (nextents =3D=3D 0) { + *done =3D 1; + return 0; } + XFS_STATS_INC(xs_blk_unmap); + isrt =3D (whichfork =3D=3D XFS_DATA_FORK) && XFS_IS_REALTIME_INODE(ip); + start =3D bno; + bno =3D start + len - 1; + ep =3D xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, + &prev); =20 /* - * Here with bp and block set to the leftmost leaf node in the tree. - */ - i =3D 0; - - /* - * Loop over all leaf nodes checking that all extents are in the right or= der. + * Check to see if the given block number is past the end of the + * file, back up to the last block if so... */ - for (;;) { - xfs_fsblock_t nextbno; - xfs_extnum_t num_recs; - - - num_recs =3D xfs_btree_get_numrecs(block); + if (eof) { + ep =3D xfs_iext_get_ext(ifp, --lastx); + xfs_bmbt_get_all(ep, &got); + bno =3D got.br_startoff + got.br_blockcount - 1; + } + logflags =3D 0; + if (ifp->if_flags & XFS_IFBROOT) { + ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_BTREE); + cur =3D xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock =3D *firstblock; + cur->bc_private.b.flist =3D flist; + cur->bc_private.b.flags =3D 0; + } else + cur =3D NULL; =20 + if (isrt) { /* - * Read-ahead the next leaf block, if any. + * Synchronize by locking the bitmap inode. */ + xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, mp->m_rbmip, XFS_ILOCK_EXCL); + } =20 - nextbno =3D be64_to_cpu(block->bb_u.l.bb_rightsib); - + extno =3D 0; + while (bno !=3D (xfs_fileoff_t)-1 && bno >=3D start && lastx >=3D 0 && + (nexts =3D=3D 0 || extno < nexts)) { /* - * Check all the extents to make sure they are OK. - * If we had a previous block, the last entry should - * conform with the first entry in this one. + * Is the found extent after a hole in which bno lives? + * Just back up to the previous extent, if so. */ - - ep =3D XFS_BMBT_REC_ADDR(mp, block, 1); - if (i) { - ASSERT(xfs_bmbt_disk_get_startoff(&last) + - xfs_bmbt_disk_get_blockcount(&last) <=3D - xfs_bmbt_disk_get_startoff(ep)); + if (got.br_startoff > bno) { + if (--lastx < 0) + break; + ep =3D xfs_iext_get_ext(ifp, lastx); + xfs_bmbt_get_all(ep, &got); } - for (j =3D 1; j < num_recs; j++) { - nextp =3D XFS_BMBT_REC_ADDR(mp, block, j + 1); - ASSERT(xfs_bmbt_disk_get_startoff(ep) + - xfs_bmbt_disk_get_blockcount(ep) <=3D - xfs_bmbt_disk_get_startoff(nextp)); - ep =3D nextp; + /* + * Is the last block of this extent before the range + * we're supposed to delete? If so, we're done. + */ + bno =3D XFS_FILEOFF_MIN(bno, + got.br_startoff + got.br_blockcount - 1); + if (bno < start) + break; + /* + * Then deal with the (possibly delayed) allocated space + * we found. + */ + ASSERT(ep !=3D NULL); + del =3D got; + wasdel =3D isnullstartblock(del.br_startblock); + if (got.br_startoff < start) { + del.br_startoff =3D start; + del.br_blockcount -=3D start - got.br_startoff; + if (!wasdel) + del.br_startblock +=3D start - got.br_startoff; + } + if (del.br_startoff + del.br_blockcount > bno + 1) + del.br_blockcount =3D bno + 1 - del.br_startoff; + sum =3D del.br_startblock + del.br_blockcount; + if (isrt && + (mod =3D do_mod(sum, mp->m_sb.sb_rextsize))) { + /* + * Realtime extent not lined up at the end. + * The extent could have been split into written + * and unwritten pieces, or we could just be + * unmapping part of it. But we can't really + * get rid of part of a realtime extent. + */ + if (del.br_state =3D=3D XFS_EXT_UNWRITTEN || + !xfs_sb_version_hasextflgbit(&mp->m_sb)) { + /* + * This piece is unwritten, or we're not + * using unwritten extents. Skip over it. + */ + ASSERT(bno >=3D mod); + bno -=3D mod > del.br_blockcount ? + del.br_blockcount : mod; + if (bno < got.br_startoff) { + if (--lastx >=3D 0) + xfs_bmbt_get_all(xfs_iext_get_ext( + ifp, lastx), &got); + } + continue; + } + /* + * It's written, turn it unwritten. + * This is better than zeroing it. + */ + ASSERT(del.br_state =3D=3D XFS_EXT_NORM); + ASSERT(xfs_trans_get_block_res(tp) > 0); + /* + * If this spans a realtime extent boundary, + * chop it back to the start of the one we end at. + */ + if (del.br_blockcount > mod) { + del.br_startoff +=3D del.br_blockcount - mod; + del.br_startblock +=3D del.br_blockcount - mod; + del.br_blockcount =3D mod; + } + del.br_state =3D XFS_EXT_UNWRITTEN; + error =3D xfs_bmap_add_extent_unwritten_real(tp, ip, + &lastx, &cur, &del, firstblock, flist, + &logflags); + if (error) + goto error0; + goto nodelete; } + if (isrt && (mod =3D do_mod(del.br_startblock, mp->m_sb.sb_rextsize))) { + /* + * Realtime extent is lined up at the end but not + * at the front. We'll get rid of full extents if + * we can. + */ + mod =3D mp->m_sb.sb_rextsize - mod; + if (del.br_blockcount > mod) { + del.br_blockcount -=3D mod; + del.br_startoff +=3D mod; + del.br_startblock +=3D mod; + } else if ((del.br_startoff =3D=3D start && + (del.br_state =3D=3D XFS_EXT_UNWRITTEN || + xfs_trans_get_block_res(tp) =3D=3D 0)) || + !xfs_sb_version_hasextflgbit(&mp->m_sb)) { + /* + * Can't make it unwritten. There isn't + * a full extent here so just skip it. + */ + ASSERT(bno >=3D del.br_blockcount); + bno -=3D del.br_blockcount; + if (got.br_startoff > bno) { + if (--lastx >=3D 0) { + ep =3D xfs_iext_get_ext(ifp, + lastx); + xfs_bmbt_get_all(ep, &got); + } + } + continue; + } else if (del.br_state =3D=3D XFS_EXT_UNWRITTEN) { + /* + * This one is already unwritten. + * It must have a written left neighbor. + * Unwrite the killed part of that one and + * try again. + */ + ASSERT(lastx > 0); + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, + lastx - 1), &prev); + ASSERT(prev.br_state =3D=3D XFS_EXT_NORM); + ASSERT(!isnullstartblock(prev.br_startblock)); + ASSERT(del.br_startblock =3D=3D + prev.br_startblock + prev.br_blockcount); + if (prev.br_startoff < start) { + mod =3D start - prev.br_startoff; + prev.br_blockcount -=3D mod; + prev.br_startblock +=3D mod; + prev.br_startoff =3D start; + } + prev.br_state =3D XFS_EXT_UNWRITTEN; + lastx--; + error =3D xfs_bmap_add_extent_unwritten_real(tp, + ip, &lastx, &cur, &prev, + firstblock, flist, &logflags); + if (error) + goto error0; + goto nodelete; + } else { + ASSERT(del.br_state =3D=3D XFS_EXT_NORM); + del.br_state =3D XFS_EXT_UNWRITTEN; + error =3D xfs_bmap_add_extent_unwritten_real(tp, + ip, &lastx, &cur, &del, + firstblock, flist, &logflags); + if (error) + goto error0; + goto nodelete; + } + } + if (wasdel) { + ASSERT(startblockval(del.br_startblock) > 0); + /* Update realtime/data freespace, unreserve quota */ + if (isrt) { + xfs_filblks_t rtexts; =20 - last =3D *ep; - i +=3D num_recs; - if (bp_release) { - bp_release =3D 0; - xfs_trans_brelse(NULL, bp); + rtexts =3D XFS_FSB_TO_B(mp, del.br_blockcount); + do_div(rtexts, mp->m_sb.sb_rextsize); + xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, + (int64_t)rtexts, 0); + (void)xfs_trans_reserve_quota_nblks(NULL, + ip, -((long)del.br_blockcount), 0, + XFS_QMOPT_RES_RTBLKS); + } else { + xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + (int64_t)del.br_blockcount, 0); + (void)xfs_trans_reserve_quota_nblks(NULL, + ip, -((long)del.br_blockcount), 0, + XFS_QMOPT_RES_REGBLKS); + } + ip->i_delayed_blks -=3D del.br_blockcount; + if (cur) + cur->bc_private.b.flags |=3D + XFS_BTCUR_BPRV_WASDEL; + } else if (cur) + cur->bc_private.b.flags &=3D ~XFS_BTCUR_BPRV_WASDEL; + /* + * If it's the case where the directory code is running + * with no block reservation, and the deleted block is in + * the middle of its extent, and the resulting insert + * of an extent would cause transformation to btree format, + * then reject it. The calling code will then swap + * blocks around instead. + * We have to do this now, rather than waiting for the + * conversion to btree format, since the transaction + * will be dirty. + */ + if (!wasdel && xfs_trans_get_block_res(tp) =3D=3D 0 && + XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_NEXTENTS(ip, whichfork) >=3D /* Note the >=3D */ + XFS_IFORK_MAXEXT(ip, whichfork) && + del.br_startoff > got.br_startoff && + del.br_startoff + del.br_blockcount < + got.br_startoff + got.br_blockcount) { + error =3D XFS_ERROR(ENOSPC); + goto error0; } - bno =3D nextbno; + error =3D xfs_bmap_del_extent(ip, tp, &lastx, flist, cur, &del, + &tmp_logflags, whichfork); + logflags |=3D tmp_logflags; + if (error) + goto error0; + bno =3D del.br_startoff - 1; +nodelete: /* - * If we've reached the end, stop. + * If not done go on to the next (previous) record. */ - if (bno =3D=3D NULLFSBLOCK) - break; - - bp_release =3D 0; - bp =3D xfs_bmap_get_bp(cur, XFS_FSB_TO_DADDR(mp, bno)); - if (!bp) { - bp_release =3D 1; - error =3D xfs_btree_read_bufl(mp, NULL, bno, 0, &bp, - XFS_BMAP_BTREE_REF, - &xfs_bmbt_buf_ops); - if (error) - goto error_norelse; + if (bno !=3D (xfs_fileoff_t)-1 && bno >=3D start) { + if (lastx >=3D 0) { + ep =3D xfs_iext_get_ext(ifp, lastx); + if (xfs_bmbt_get_startoff(ep) > bno) { + if (--lastx >=3D 0) + ep =3D xfs_iext_get_ext(ifp, + lastx); + } + xfs_bmbt_get_all(ep, &got); + } + extno++; } - block =3D XFS_BUF_TO_BLOCK(bp); } - if (bp_release) { - bp_release =3D 0; - xfs_trans_brelse(NULL, bp); - } - return; - -error0: - xfs_warn(mp, "%s: at error0", __func__); - if (bp_release) - xfs_trans_brelse(NULL, bp); -error_norelse: - xfs_warn(mp, "%s: BAD after btree leaves for %d extents", - __func__, i); - panic("%s: CORRUPTED BTREE OR SOMETHING", __func__); - return; -} -#endif - -/* - * Count fsblocks of the given fork. - */ -int /* error */ -xfs_bmap_count_blocks( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode */ - int whichfork, /* data or attr fork */ - int *count) /* out: count of blocks */ -{ - struct xfs_btree_block *block; /* current btree block */ - xfs_fsblock_t bno; /* block # of "block" */ - xfs_ifork_t *ifp; /* fork structure */ - int level; /* btree level, for checking */ - xfs_mount_t *mp; /* file system mount structure */ - __be64 *pp; /* pointer to block address */ + *done =3D bno =3D=3D (xfs_fileoff_t)-1 || bno < start || lastx < 0; =20 - bno =3D NULLFSBLOCK; - mp =3D ip->i_mount; - ifp =3D XFS_IFORK_PTR(ip, whichfork); - if ( XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS ) { - xfs_bmap_count_leaves(ifp, 0, - ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t), - count); - return 0; + /* + * Convert to a btree if necessary. + */ + if (xfs_bmap_needs_btree(ip, whichfork)) { + ASSERT(cur =3D=3D NULL); + error =3D xfs_bmap_extents_to_btree(tp, ip, firstblock, flist, + &cur, 0, &tmp_logflags, whichfork); + logflags |=3D tmp_logflags; + if (error) + goto error0; } - /* - * Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out. + * transform from btree to extents, give it cur */ - block =3D ifp->if_broot; - level =3D be16_to_cpu(block->bb_level); - ASSERT(level > 0); - pp =3D XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes); - bno =3D be64_to_cpu(*pp); - ASSERT(bno !=3D NULLDFSBNO); - ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount); - ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks); - - if (unlikely(xfs_bmap_count_tree(mp, tp, ifp, bno, level, count) < 0)) { - XFS_ERROR_REPORT("xfs_bmap_count_blocks(2)", XFS_ERRLEVEL_LOW, - mp); - return XFS_ERROR(EFSCORRUPTED); + else if (xfs_bmap_wants_extents(ip, whichfork)) { + ASSERT(cur !=3D NULL); + error =3D xfs_bmap_btree_to_extents(tp, ip, cur, &tmp_logflags, + whichfork); + logflags |=3D tmp_logflags; + if (error) + goto error0; } - - return 0; -} - -/* - * Recursively walks each level of a btree - * to count total fsblocks is use. - */ -STATIC int /* error */ -xfs_bmap_count_tree( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_ifork_t *ifp, /* inode fork pointer */ - xfs_fsblock_t blockno, /* file system block number */ - int levelin, /* level in btree */ - int *count) /* Count of blocks */ -{ - int error; - xfs_buf_t *bp, *nbp; - int level =3D levelin; - __be64 *pp; - xfs_fsblock_t bno =3D blockno; - xfs_fsblock_t nextbno; - struct xfs_btree_block *block, *nextblock; - int numrecs; - - error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, XFS_BMAP_BTREE_REF, - &xfs_bmbt_buf_ops); - if (error) - return error; - *count +=3D 1; - block =3D XFS_BUF_TO_BLOCK(bp); - - if (--level) { - /* Not at node above leaves, count this level of nodes */ - nextbno =3D be64_to_cpu(block->bb_u.l.bb_rightsib); - while (nextbno !=3D NULLFSBLOCK) { - error =3D xfs_btree_read_bufl(mp, tp, nextbno, 0, &nbp, - XFS_BMAP_BTREE_REF, - &xfs_bmbt_buf_ops); - if (error) - return error; - *count +=3D 1; - nextblock =3D XFS_BUF_TO_BLOCK(nbp); - nextbno =3D be64_to_cpu(nextblock->bb_u.l.bb_rightsib); - xfs_trans_brelse(tp, nbp); - } - - /* Dive to the next level */ - pp =3D XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); - bno =3D be64_to_cpu(*pp); - if (unlikely((error =3D - xfs_bmap_count_tree(mp, tp, ifp, bno, level, count)) < 0)) { - xfs_trans_brelse(tp, bp); - XFS_ERROR_REPORT("xfs_bmap_count_tree(1)", - XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); - } - xfs_trans_brelse(tp, bp); - } else { - /* count all level 1 nodes and their leaves */ - for (;;) { - nextbno =3D be64_to_cpu(block->bb_u.l.bb_rightsib); - numrecs =3D be16_to_cpu(block->bb_numrecs); - xfs_bmap_disk_count_leaves(mp, block, numrecs, count); - xfs_trans_brelse(tp, bp); - if (nextbno =3D=3D NULLFSBLOCK) - break; - bno =3D nextbno; - error =3D xfs_btree_read_bufl(mp, tp, bno, 0, &bp, - XFS_BMAP_BTREE_REF, - &xfs_bmbt_buf_ops); - if (error) - return error; - *count +=3D 1; - block =3D XFS_BUF_TO_BLOCK(bp); + /* + * transform from extents to local? + */ + error =3D 0; +error0: + /* + * Log everything. Do this after conversion, there's no point in + * logging the extent records if we've converted to btree format. + */ + if ((logflags & xfs_ilog_fext(whichfork)) && + XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_EXTENTS) + logflags &=3D ~xfs_ilog_fext(whichfork); + else if ((logflags & xfs_ilog_fbroot(whichfork)) && + XFS_IFORK_FORMAT(ip, whichfork) !=3D XFS_DINODE_FMT_BTREE) + logflags &=3D ~xfs_ilog_fbroot(whichfork); + /* + * Log inode even in the error case, if the transaction + * is dirty we'll need to shut down the filesystem. + */ + if (logflags) + xfs_trans_log_inode(tp, ip, logflags); + if (cur) { + if (!error) { + *firstblock =3D cur->bc_private.b.firstblock; + cur->bc_private.b.allocated =3D 0; } + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); } - return 0; -} - -/* - * Count leaf blocks given a range of extent records. - */ -STATIC void -xfs_bmap_count_leaves( - xfs_ifork_t *ifp, - xfs_extnum_t idx, - int numrecs, - int *count) -{ - int b; - - for (b =3D 0; b < numrecs; b++) { - xfs_bmbt_rec_host_t *frp =3D xfs_iext_get_ext(ifp, idx + b); - *count +=3D xfs_bmbt_get_blockcount(frp); - } -} - -/* - * Count leaf blocks given a range of extent records originally - * in btree format. - */ -STATIC void -xfs_bmap_disk_count_leaves( - struct xfs_mount *mp, - struct xfs_btree_block *block, - int numrecs, - int *count) -{ - int b; - xfs_bmbt_rec_t *frp; - - for (b =3D 1; b <=3D numrecs; b++) { - frp =3D XFS_BMBT_REC_ADDR(mp, block, b); - *count +=3D xfs_bmbt_disk_get_blockcount(frp); - } -} - -/* - * Convert the given file system block to a disk block. We have to treat = it - * differently based on whether the file is a real time file or not, becau= se the - * bmap code does. - */ -xfs_daddr_t -xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) -{ - return (XFS_IS_REALTIME_INODE(ip) ? \ - (xfs_daddr_t)XFS_FSB_TO_BB((ip)->i_mount, (fsb)) : \ - XFS_FSB_TO_DADDR((ip)->i_mount, (fsb))); + return error; } diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index 7397faa..2a99dea 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -339,10 +339,12 @@ xfs_dir2_block_addname( /* * If need to compact the leaf entries, do it now. */ - if (compact) + if (compact) { xfs_dir2_block_compact(tp, bp, hdr, btp, blp, &needlog, &lfloghigh, &lfloglow); - else if (btp->stale) { + /* recalculate blp post-compaction */ + blp =3D xfs_dir2_block_leaf_p(btp); + } else if (btp->stale) { /* * Set leaf logging boundaries to impossible state. * For the no-stale case they're set explicitly. diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 529d92d..f0322c9 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -260,6 +260,8 @@ xfs_ialloc_ag_alloc( (args.agbno < be32_to_cpu(agi->agi_length)))) { args.fsbno =3D XFS_AGB_TO_FSB(args.mp, agno, args.agbno); args.type =3D XFS_ALLOCTYPE_THIS_BNO; + args.mod =3D args.total =3D args.wasdel =3D args.isfl =3D + args.userdata =3D args.minalignslop =3D 0; args.prod =3D 1; =20 /* @@ -312,6 +314,8 @@ xfs_ialloc_ag_alloc( * Allocate a fixed-size extent of inodes. */ args.type =3D XFS_ALLOCTYPE_NEAR_BNO; + args.mod =3D args.total =3D args.wasdel =3D args.isfl =3D + args.userdata =3D args.minalignslop =3D 0; args.prod =3D 1; /* * Allow space for the inode btree to split. @@ -350,7 +354,7 @@ xfs_ialloc_ag_alloc( * number from being easily guessable. */ error =3D xfs_ialloc_inode_init(args.mp, tp, agno, args.agbno, - args.len, random32()); + args.len, prandom_u32()); =20 if (error) return error; diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c index 2970f46..3cf2423 100644 --- a/libxfs/xfs_inode.c +++ b/libxfs/xfs_inode.c @@ -1112,6 +1112,7 @@ xfs_iflush_fork( char *cp; xfs_ifork_t *ifp; xfs_mount_t *mp; + static const short brootflag[2] =3D { XFS_ILOG_DBROOT, XFS_ILOG_ABROOT }; static const short dataflag[2] =3D diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index a9155b3..b7514fb 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -365,7 +365,7 @@ xfs_sb_quiet_read_verify( return; } /* quietly fail */ - xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_buf_ioerror(bp, EWRONGFS); } =20 static void diff --git a/repair/dinode.c b/repair/dinode.c index 5a2da39..f564216 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -250,7 +250,8 @@ clear_dinode(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_i= no_t ino_num) /* and clear the forks */ =20 if (dirty && !no_modify) - memset(XFS_DFORK_DPTR(dino), 0, XFS_LITINO(mp)); + memset(XFS_DFORK_DPTR(dino), 0, + XFS_LITINO(mp, dino->di_version)); =20 return(dirty); } @@ -1919,11 +1920,12 @@ _("bad attr fork offset %d in dev inode %" PRIu64 "= , should be %d\n"), case XFS_DINODE_FMT_LOCAL: /* fall through ... */ case XFS_DINODE_FMT_EXTENTS: /* fall through ... */ case XFS_DINODE_FMT_BTREE: - if (dino->di_forkoff >=3D (XFS_LITINO(mp) >> 3)) { + if (dino->di_forkoff >=3D + (XFS_LITINO(mp, dino->di_version) >> 3)) { do_warn( _("bad attr fork offset %d in inode %" PRIu64 ", max=3D%d\n"), dino->di_forkoff, lino, - XFS_LITINO(mp) >> 3); + XFS_LITINO(mp, dino->di_version) >> 3); return 1; } break; diff --git a/repair/prefetch.c b/repair/prefetch.c index c0b1002..e0eff96 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -374,7 +374,7 @@ pf_read_inode_dirs( continue; =20 if ((dino->di_forkoff !=3D 0) && - (dino->di_forkoff >=3D (XFS_LITINO(mp) >> 3))) + (dino->di_forkoff >=3D XFS_LITINO(mp, dino->di_version) >> 3)) continue; =20 switch (dino->di_format) { =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfspro= gs-crc-patchset-v2/xfsprogs-crc-infrastructure=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001750=00000= 00155746=0012132011546=00021702=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00xfsprogs: add CRC32c infrastructure =46rom: Dave Chinner Pull the generic crc32(c) code from the kernel and add it to libxfs. Modify it to build in the libxfs environment, and drop the bigendian CRC version as it is unused by XFS, which uses the little endian version so that it can be hardware accelerated using native instructions on x86-64 CPUs. Also wire up the self-test code in the crc32 module to the build infrastructure and make passing the self test a build dependency. This prevents xfsprogs from being built on platforms that the CRC algorithm does not work on and hence ensures the tools do not write bad CRCs to disk as a result of a broken calculation. Also pull the XFS CRC helper functions across in preparation for using the CRC functions in libxfs. XXX: something in the CRC table generation breaks the debian package build. It fails to build libxfs as a dependency of mkfs.xfs. Works fine outside the debian build environment, so I'm not sure what the issue is yet. Most likely it is the execution path of the gen_crc32table binary that is built... Signed-off-by: Dave Chinner --- include/Makefile | 6 +- include/libxfs.h | 10 + include/xfs_arch.h | 16 + include/xfs_cksum.h | 63 +++ libxfs/Makefile | 26 +- libxfs/crc32.c | 1036 +++++++++++++++++++++++++++++++++++++++++++= ++++ libxfs/crc32defs.h | 72 ++++ libxfs/gen_crc32table.c | 144 +++++++ 8 files changed, 1367 insertions(+), 6 deletions(-) diff --git a/include/Makefile b/include/Makefile index de2c4f0..9ed5077 100644 --- a/include/Makefile +++ b/include/Makefile @@ -23,9 +23,9 @@ QAHFILES =3D libxfs.h libxlog.h \ swab.h \ xfs_ag.h xfs_alloc.h xfs_alloc_btree.h xfs_arch.h xfs_attr_leaf.h \ xfs_attr_sf.h xfs_bit.h xfs_bmap.h xfs_bmap_btree.h xfs_btree.h \ - xfs_btree_trace.h xfs_buf_item.h xfs_da_btree.h xfs_dinode.h \ - xfs_dir2.h xfs_dir2_format.h xfs_dir1.h xfs_dir_leaf.h xfs_dir_sf.h \ - xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ + xfs_btree_trace.h xfs_buf_item.h xfs_cksum.h xfs_da_btree.h \ + xfs_dinode.h xfs_dir2.h xfs_dir2_format.h xfs_dir1.h xfs_dir_leaf.h \ + xfs_dir_sf.h xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ xfs_inode.h xfs_inode_item.h xfs_inum.h \ xfs_log.h xfs_log_priv.h xfs_log_recover.h xfs_metadump.h \ xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h xfs_trace.h \ diff --git a/include/libxfs.h b/include/libxfs.h index 0e2fc5f..e671391 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -668,4 +668,14 @@ void xfs_dinode_from_disk(struct xfs_icdinode *, /* xfs_rtalloc.c */ int libxfs_rtfree_extent(struct xfs_trans *, xfs_rtblock_t, xfs_extlen_t); =20 +/* CRC wrappers */ + +extern uint32_t crc32_le(uint32_t crc, unsigned char const *p, size_t len); +extern uint32_t crc32c_le(uint32_t crc, unsigned char const *p, size_t len= ); + +#define crc32(c,p,l) crc32_le((c),(unsigned char const *)(p),(l)) +#define crc32c(c,p,l) crc32c_le((c),(unsigned char const *)(p),(l)) + +#include + #endif /* __LIBXFS_H__ */ diff --git a/include/xfs_arch.h b/include/xfs_arch.h index 0902249..d5e591a 100644 --- a/include/xfs_arch.h +++ b/include/xfs_arch.h @@ -47,6 +47,14 @@ #define be16_to_cpu(val) ((__force __u16)(__be16)(val)) #define be32_to_cpu(val) ((__force __u32)(__be32)(val)) #define be64_to_cpu(val) ((__force __u64)(__be64)(val)) + +#define cpu_to_le32(val) ((__force __be32)__swab32((__u32)(val))) +#define le32_to_cpu(val) (__swab32((__force __u32)(__le32)(val))) + +#define __constant_cpu_to_le32(val) \ + ((__force __le32)___constant_swab32((__u32)(val))) +#define __constant_cpu_to_be32(val) \ + ((__force __be32)(__u32)(val)) #else #define cpu_to_be16(val) ((__force __be16)__swab16((__u16)(val))) #define cpu_to_be32(val) ((__force __be32)__swab32((__u32)(val))) @@ -54,6 +62,14 @@ #define be16_to_cpu(val) (__swab16((__force __u16)(__be16)(val))) #define be32_to_cpu(val) (__swab32((__force __u32)(__be32)(val))) #define be64_to_cpu(val) (__swab64((__force __u64)(__be64)(val))) + +#define cpu_to_le32(val) ((__force __le32)(__u32)(val)) +#define le32_to_cpu(val) ((__force __u32)(__le32)(val)) + +#define __constant_cpu_to_le32(val) \ + ((__force __le32)(__u32)(val)) +#define __constant_cpu_to_be32(val) \ + ((__force __be32)___constant_swab32((__u32)(val))) #endif =20 static inline void be16_add_cpu(__be16 *a, __s16 b) diff --git a/include/xfs_cksum.h b/include/xfs_cksum.h new file mode 100644 index 0000000..fad1676 --- /dev/null +++ b/include/xfs_cksum.h @@ -0,0 +1,63 @@ +#ifndef _XFS_CKSUM_H +#define _XFS_CKSUM_H 1 + +#define XFS_CRC_SEED (~(__uint32_t)0) + +/* + * Calculate the intermediate checksum for a buffer that has the CRC field + * inside it. The offset of the 32bit crc fields is passed as the + * cksum_offset parameter. + */ +static inline __uint32_t +xfs_start_cksum(char *buffer, size_t length, unsigned long cksum_offset) +{ + __uint32_t zero =3D 0; + __uint32_t crc; + + /* Calculate CRC up to the checksum. */ + crc =3D crc32c(XFS_CRC_SEED, buffer, cksum_offset); + + /* Skip checksum field */ + crc =3D crc32c(crc, &zero, sizeof(__u32)); + + /* Calculate the rest of the CRC. */ + return crc32c(crc, &buffer[cksum_offset + sizeof(__be32)], + length - (cksum_offset + sizeof(__be32))); +} + +/* + * Convert the intermediate checksum to the final ondisk format. + * + * The CRC32c calculation uses LE format even on BE machines, but returns = the + * result in host endian format. Hence we need to byte swap it back to LE = format + * so that it is consistent on disk. + */ +static inline __le32 +xfs_end_cksum(__uint32_t crc) +{ + return ~cpu_to_le32(crc); +} + +/* + * Helper to generate the checksum for a buffer. + */ +static inline void +xfs_update_cksum(char *buffer, size_t length, unsigned long cksum_offset) +{ + __uint32_t crc =3D xfs_start_cksum(buffer, length, cksum_offset); + + *(__le32 *)(buffer + cksum_offset) =3D xfs_end_cksum(crc); +} + +/* + * Helper to verify the checksum for a buffer. + */ +static inline int +xfs_verify_cksum(char *buffer, size_t length, unsigned long cksum_offset) +{ + __uint32_t crc =3D xfs_start_cksum(buffer, length, cksum_offset); + + return *(__le32 *)(buffer + cksum_offset) =3D=3D xfs_end_cksum(crc); +} + +#endif /* _XFS_CKSUM_H */ diff --git a/libxfs/Makefile b/libxfs/Makefile index dc9b22c..28f71c8 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -10,17 +10,19 @@ LT_CURRENT =3D 0 LT_REVISION =3D 0 LT_AGE =3D 0 =20 -HFILES =3D xfs.h init.h xfs_dir2_priv.h +HFILES =3D xfs.h init.h xfs_dir2_priv.h crc32defs.h crc32table.h CFILES =3D cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c uti= l.c \ xfs_alloc.c xfs_ialloc.c xfs_inode.c xfs_btree.c xfs_alloc_btree.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ - xfs_mount.c xfs_rtalloc.c xfs_trans.c xfs_attr.c + xfs_mount.c xfs_rtalloc.c xfs_trans.c xfs_attr.c \ + crc32.c =20 CFILES +=3D $(PKG_PLATFORM).c PCFILES =3D darwin.c freebsd.c irix.c linux.c LSRCFILES =3D $(shell echo $(PCFILES) | sed -e "s/$(PKG_PLATFORM).c//g") +LSRCFILES +=3D gen_crc32table.c =20 # # Tracing flags: @@ -38,7 +40,25 @@ LTLIBS =3D $(LIBPTHREAD) $(LIBRT) # don't try linking xfs_repair with a debug libxfs. DEBUG =3D -DNDEBUG =20 -default: ltdepend $(LTLIBRARY) +LDIRT =3D gen_crc32table crc32table.h crc32selftest + +default: crc32selftest ltdepend $(LTLIBRARY) + +crc32table.h: gen_crc32table.c + @echo " [CC] gen_crc32table" + $(Q) $(CC) $(CFLAGS) -o gen_crc32table $< + @echo " [GENERATE] $@" + $(Q) ./gen_crc32table > crc32table.h + +# The selftest binary will return an error if it fails. This is made a +# dependency of the build process so that we refuse to build the tools on = broken +# systems/architectures. Hence we make sure that xfsprogs will never use a +# busted CRC calculation at build time and hence avoid putting bad CRCs do= wn on +# disk. +crc32selftest: gen_crc32table.c crc32table.h crc32.c + @echo " [TEST] CRC32" + $(Q) $(CC) $(CFLAGS) -D CRC32_SELFTEST=3D1 crc32.c -o $@ + $(Q) ./$@ =20 include $(BUILDRULES) =20 diff --git a/libxfs/crc32.c b/libxfs/crc32.c new file mode 100644 index 0000000..1c0d958 --- /dev/null +++ b/libxfs/crc32.c @@ -0,0 +1,1036 @@ +/* + * Aug 8, 2011 Bob Pearson with help from Joakim Tjernlund and George Spel= vin + * cleaned up code to current version of sparse and added the slicing-by-8 + * algorithm to the closely similar existing slicing-by-4 algorithm. + * + * Oct 15, 2000 Matt Domsch + * Nicer crc32 functions/docs submitted by linux@horizon.com. Thanks! + * Code was from the public domain, copyright abandoned. Code was + * subsequently included in the kernel, thus was re-licensed under the + * GNU GPL v2. + * + * Oct 12, 2000 Matt Domsch + * Same crc32 function was used in 5 other places in the kernel. + * I made one version, and deleted the others. + * There are various incantations of crc32(). Some use a seed of 0 or ~0. + * Some xor at the end with ~0. The generic crc32() function takes + * seed as an argument, and doesn't xor at the end. Then individual + * users can do whatever they need. + * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0. + * fs/jffs2 uses seed 0, doesn't xor with ~0. + * fs/partitions/efi.c uses seed ~0, xor's with ~0. + * + * This source code is licensed under the GNU General Public License, + * Version 2. See the file COPYING for more details. + */ + +/* see: Documentation/crc32.txt for a description of algorithms */ + +/* + * lifted from the 3.8-rc2 kernel source for xfsprogs. Killed CONFIG_X86 + * specific bits for just the generic algorithm. Also removed the big endi= an + * version of the algorithm as XFS only uses the little endian CRC version= to + * match the hardware acceleration available on Intel CPUs. + */ + +#include +#include "crc32defs.h" + +/* types specifc to this file */ +typedef __u8 u8; +typedef __u16 u16; +typedef __u32 u32; +typedef __u32 u64; +#define __pure + +#if CRC_LE_BITS > 8 +# define tole(x) ((__force u32) __constant_cpu_to_le32(x)) +#else +# define tole(x) (x) +#endif + +#if CRC_BE_BITS > 8 +# define tobe(x) ((__force u32) __constant_cpu_to_be32(x)) +#else +# define tobe(x) (x) +#endif + +#include "crc32table.h" + +#if CRC_LE_BITS > 8 || CRC_BE_BITS > 8 + +/* implements slicing-by-4 or slicing-by-8 algorithm */ +static inline u32 +crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)= [256]) +{ +# ifdef __LITTLE_ENDIAN +# define DO_CRC(x) crc =3D t0[(crc ^ (x)) & 255] ^ (crc >> 8) +# define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \ + t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255]) +# define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \ + t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255]) +# else +# define DO_CRC(x) crc =3D t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8) +# define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \ + t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255]) +# define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \ + t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255]) +# endif + const u32 *b; + size_t rem_len; + const u32 *t0=3Dtab[0], *t1=3Dtab[1], *t2=3Dtab[2], *t3=3Dtab[3]; +# if CRC_LE_BITS !=3D 32 + const u32 *t4 =3D tab[4], *t5 =3D tab[5], *t6 =3D tab[6], *t7 =3D tab[7]; +# endif + u32 q; + + /* Align it */ + if (((long)buf & 3) && len) { + do { + DO_CRC(*buf++); + } while ((--len) && ((long)buf)&3); + } + +# if CRC_LE_BITS =3D=3D 32 + rem_len =3D len & 3; + len =3D len >> 2; +# else + rem_len =3D len & 7; + len =3D len >> 3; +# endif + + b =3D (const u32 *)buf; + for (--b; len; --len) { + q =3D crc ^ *++b; /* use pre increment for speed */ +# if CRC_LE_BITS =3D=3D 32 + crc =3D DO_CRC4; +# else + crc =3D DO_CRC8; + q =3D *++b; + crc ^=3D DO_CRC4; +# endif + } + len =3D rem_len; + /* And the last few bytes */ + if (len) { + u8 *p =3D (u8 *)(b + 1) - 1; + do { + DO_CRC(*++p); /* use pre increment for speed */ + } while (--len); + } + return crc; +#undef DO_CRC +#undef DO_CRC4 +#undef DO_CRC8 +} +#endif + +/** + * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32 + * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for + * other uses, or the previous crc32 value if computing incrementally. + * @p: pointer to buffer over which CRC is run + * @len: length of buffer @p + */ +static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p, + size_t len, const u32 (*tab)[256], + u32 polynomial) +{ +#if CRC_LE_BITS =3D=3D 1 + int i; + while (len--) { + crc ^=3D *p++; + for (i =3D 0; i < 8; i++) + crc =3D (crc >> 1) ^ ((crc & 1) ? polynomial : 0); + } +# elif CRC_LE_BITS =3D=3D 2 + while (len--) { + crc ^=3D *p++; + crc =3D (crc >> 2) ^ tab[0][crc & 3]; + crc =3D (crc >> 2) ^ tab[0][crc & 3]; + crc =3D (crc >> 2) ^ tab[0][crc & 3]; + crc =3D (crc >> 2) ^ tab[0][crc & 3]; + } +# elif CRC_LE_BITS =3D=3D 4 + while (len--) { + crc ^=3D *p++; + crc =3D (crc >> 4) ^ tab[0][crc & 15]; + crc =3D (crc >> 4) ^ tab[0][crc & 15]; + } +# elif CRC_LE_BITS =3D=3D 8 + /* aka Sarwate algorithm */ + while (len--) { + crc ^=3D *p++; + crc =3D (crc >> 8) ^ tab[0][crc & 255]; + } +# else + crc =3D (__force u32) cpu_to_le32(crc); + crc =3D crc32_body(crc, p, len, tab); + crc =3D le32_to_cpu((__force __le32)crc); +#endif + return crc; +} + +#if CRC_LE_BITS =3D=3D 1 +u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len) +{ + return crc32_le_generic(crc, p, len, NULL, CRCPOLY_LE); +} +u32 __pure crc32c_le(u32 crc, unsigned char const *p, size_t len) +{ + return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE); +} +#else +u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len) +{ + return crc32_le_generic(crc, p, len, + (const u32 (*)[256])crc32table_le, CRCPOLY_LE); +} +u32 __pure crc32c_le(u32 crc, unsigned char const *p, size_t len) +{ + return crc32_le_generic(crc, p, len, + (const u32 (*)[256])crc32ctable_le, CRC32C_POLY_LE); +} +#endif + + +#ifdef CRC32_SELFTEST + +/* 4096 random bytes */ +static u8 __attribute__((__aligned__(8))) test_buf[] =3D +{ + 0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30, + 0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4, + 0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60, + 0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c, + 0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4, + 0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a, + 0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a, + 0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4, + 0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9, + 0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4, + 0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca, + 0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61, + 0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e, + 0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a, + 0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f, + 0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd, + 0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c, + 0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88, + 0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53, + 0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f, + 0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4, + 0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74, + 0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60, + 0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09, + 0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07, + 0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1, + 0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f, + 0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2, + 0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0, + 0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95, + 0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22, + 0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93, + 0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86, + 0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d, + 0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40, + 0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b, + 0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35, + 0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40, + 0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63, + 0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b, + 0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8, + 0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72, + 0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86, + 0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff, + 0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed, + 0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c, + 0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed, + 0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30, + 0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99, + 0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4, + 0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80, + 0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37, + 0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04, + 0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e, + 0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd, + 0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c, + 0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09, + 0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb, + 0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b, + 0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53, + 0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b, + 0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f, + 0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff, + 0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40, + 0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6, + 0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb, + 0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73, + 0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f, + 0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4, + 0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66, + 0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1, + 0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80, + 0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f, + 0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5, + 0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7, + 0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce, + 0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff, + 0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48, + 0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26, + 0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72, + 0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88, + 0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9, + 0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc, + 0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8, + 0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09, + 0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8, + 0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c, + 0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48, + 0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d, + 0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f, + 0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae, + 0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97, + 0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8, + 0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75, + 0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc, + 0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27, + 0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf, + 0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7, + 0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0, + 0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8, + 0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c, + 0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44, + 0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54, + 0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38, + 0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f, + 0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b, + 0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7, + 0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef, + 0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e, + 0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c, + 0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c, + 0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0, + 0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37, + 0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf, + 0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e, + 0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4, + 0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60, + 0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe, + 0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61, + 0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3, + 0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe, + 0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40, + 0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec, + 0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f, + 0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7, + 0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79, + 0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c, + 0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f, + 0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21, + 0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9, + 0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30, + 0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b, + 0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee, + 0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6, + 0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3, + 0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09, + 0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd, + 0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f, + 0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9, + 0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc, + 0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59, + 0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60, + 0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5, + 0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1, + 0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8, + 0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9, + 0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab, + 0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80, + 0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01, + 0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e, + 0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d, + 0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35, + 0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38, + 0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a, + 0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac, + 0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca, + 0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57, + 0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed, + 0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20, + 0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef, + 0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c, + 0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a, + 0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64, + 0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4, + 0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54, + 0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16, + 0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26, + 0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc, + 0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87, + 0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60, + 0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d, + 0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54, + 0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13, + 0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59, + 0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb, + 0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f, + 0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15, + 0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78, + 0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93, + 0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e, + 0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31, + 0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1, + 0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37, + 0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15, + 0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78, + 0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f, + 0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31, + 0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f, + 0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc, + 0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9, + 0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3, + 0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe, + 0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4, + 0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24, + 0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1, + 0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85, + 0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8, + 0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09, + 0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c, + 0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46, + 0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5, + 0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39, + 0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2, + 0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc, + 0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35, + 0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde, + 0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80, + 0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15, + 0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63, + 0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58, + 0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d, + 0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf, + 0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12, + 0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c, + 0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b, + 0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1, + 0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6, + 0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73, + 0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9, + 0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e, + 0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22, + 0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb, + 0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2, + 0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c, + 0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c, + 0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93, + 0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f, + 0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38, + 0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57, + 0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03, + 0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90, + 0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8, + 0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4, + 0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36, + 0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7, + 0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47, + 0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46, + 0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73, + 0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72, + 0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23, + 0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a, + 0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58, + 0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f, + 0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96, + 0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9, + 0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b, + 0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c, + 0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef, + 0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3, + 0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4, + 0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f, + 0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17, + 0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18, + 0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8, + 0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98, + 0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42, + 0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97, + 0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97, + 0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1, + 0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77, + 0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb, + 0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c, + 0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb, + 0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56, + 0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04, + 0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48, + 0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe, + 0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d, + 0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97, + 0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8, + 0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f, + 0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e, + 0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca, + 0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44, + 0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f, + 0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6, + 0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63, + 0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19, + 0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58, + 0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b, + 0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28, + 0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf, + 0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6, + 0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3, + 0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe, + 0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f, + 0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf, + 0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9, + 0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e, + 0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7, + 0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70, + 0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0, + 0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d, + 0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4, + 0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5, + 0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85, + 0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc, + 0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f, + 0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56, + 0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb, + 0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b, + 0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5, + 0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03, + 0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23, + 0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03, + 0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87, + 0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4, + 0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43, + 0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11, + 0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40, + 0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59, + 0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9, + 0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30, + 0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd, + 0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45, + 0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83, + 0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b, + 0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5, + 0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3, + 0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84, + 0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8, + 0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34, + 0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b, + 0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31, + 0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b, + 0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40, + 0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b, + 0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e, + 0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38, + 0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb, + 0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2, + 0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c, + 0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1, + 0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc, + 0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec, + 0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34, + 0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95, + 0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92, + 0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f, + 0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c, + 0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b, + 0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c, + 0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5, + 0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb, + 0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4, + 0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9, + 0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4, + 0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41, + 0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a, + 0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8, + 0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06, + 0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62, + 0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47, + 0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4, + 0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00, + 0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67, + 0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81, + 0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0, + 0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10, + 0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79, + 0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19, + 0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8, + 0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1, + 0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83, + 0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86, + 0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55, + 0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66, + 0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0, + 0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49, + 0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea, + 0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24, + 0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e, + 0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88, + 0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87, + 0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34, + 0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f, + 0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a, + 0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a, + 0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93, + 0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37, + 0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38, + 0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4, + 0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48, + 0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65, + 0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09, + 0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e, + 0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5, + 0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b, + 0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4, + 0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e, + 0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d, + 0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0, + 0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5, + 0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48, + 0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e, + 0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f, + 0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a, + 0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d, + 0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14, + 0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69, + 0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53, + 0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56, + 0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48, + 0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4, + 0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26, + 0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e, + 0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40, + 0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7, + 0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62, + 0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe, + 0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf, + 0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2, + 0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d, + 0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32, + 0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa, + 0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45, + 0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04, + 0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33, + 0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad, + 0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4, + 0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c, + 0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b, + 0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36, + 0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa, + 0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9, + 0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28, + 0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b, + 0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03, + 0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d, + 0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff, + 0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39, + 0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b, + 0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2, + 0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34, + 0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe, + 0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0, + 0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27, + 0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86, + 0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90, + 0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03, + 0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb, + 0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57, + 0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9, + 0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5, + 0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16, + 0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5, + 0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a, + 0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d, + 0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0, + 0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f, + 0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48, + 0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1, + 0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09, + 0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51, + 0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b, + 0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf, + 0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe, + 0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad, + 0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e, + 0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57, + 0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f, + 0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef, + 0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8, + 0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69, + 0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d, + 0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59, + 0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9, + 0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d, + 0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea, + 0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56, + 0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4, + 0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8, + 0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78, + 0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f, + 0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4, + 0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91, + 0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f, + 0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c, + 0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57, + 0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4, + 0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23, + 0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17, + 0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66, + 0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39, + 0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36, + 0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00, + 0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7, + 0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60, + 0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c, + 0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e, + 0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7, + 0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a, + 0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d, + 0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37, + 0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82, + 0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8, + 0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e, + 0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85, + 0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98, + 0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22, + 0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7, + 0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49, + 0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33, + 0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc, + 0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8, + 0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f, + 0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3, + 0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98, + 0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c, + 0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6, + 0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc, + 0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d, +}; + +/* 100 test cases */ +static struct crc_test { + u32 crc; /* random starting crc */ + u32 start; /* random 6 bit offset in buf */ + u32 length; /* random 11 bit length of test */ + u32 crc_le; /* expected crc32_le result */ + u32 crc_be; /* expected crc32_be result */ + u32 crc32c_le; /* expected crc32c_le result */ +} test[] =3D +{ + {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1, + 0xf6e93d6c}, + {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad, + 0x0fe92aca}, + {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f, + 0x52e1ebb8}, + {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a, + 0x0798af9a}, + {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2, + 0x18eb3152}, + {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793, + 0xd00d08c7}, + {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed, + 0x8ba966bc}, + {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35, + 0x11d694a2}, + {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2, + 0x6ab3208d}, + {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10, + 0xba4603c5}, + {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb, + 0xe6071c6f}, + {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0, + 0x179ec30a}, + {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb, + 0x0903beb8}, + {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed, + 0x6a7cb4fa}, + {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591, + 0xdb535801}, + {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67, + 0x92bed597}, + {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd, + 0x192a3f1b}, + {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a, + 0xccbaec1a}, + {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b, + 0x7eabae4d}, + {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f, + 0x28c72982}, + {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d, + 0xc3cd4d18}, + {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a, + 0xbca8f0e7}, + {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97, + 0x713f60b3}, + {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2, + 0xebd08fd5}, + {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138, + 0x64406c59}, + {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032, + 0x7421890e}, + {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f, + 0xe9347603}, + {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f, + 0x1bef9060}, + {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32, + 0x34720072}, + {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef, + 0x48310f59}, + {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0, + 0x783a4213}, + {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59, + 0x9e8efd41}, + {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4, + 0xfc3d34a5}, + {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c, + 0x17a52ae2}, + {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51, + 0x886d935a}, + {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11, + 0xeaaeaeb2}, + {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659, + 0x8e900a4b}, + {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af, + 0xd74662b1}, + {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99, + 0xd26752ba}, + {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b, + 0x8b1fcd62}, + {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521, + 0xf54342fe}, + {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3, + 0x5b95b988}, + {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d, + 0x2e1176be}, + {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f, + 0x66120546}, + {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b, + 0xf256a5cc}, + {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0, + 0x4af1dd69}, + {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195, + 0x56f0a04a}, + {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d, + 0x74f6b6b2}, + {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4, + 0x085951fd}, + {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3, + 0xc65387eb}, + {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643, + 0x1ca9257b}, + {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10, + 0xfd196d76}, + {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d, + 0x5ef88339}, + {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5, + 0x2c3714d9}, + {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b, + 0x58576548}, + {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee, + 0xfd7c57de}, + {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14, + 0xd5fedd59}, + {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a, + 0x1cc3b17b}, + {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b, + 0x270eed73}, + {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3, + 0x91ecbb11}, + {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826, + 0x05ed8d0c}, + {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06, + 0x0b09ad5b}, + {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35, + 0xf8d511fb}, + {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801, + 0x5ad832cc}, + {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2, + 0x1214d196}, + {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d, + 0x5747218a}, + {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c, + 0xde8f14de}, + {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba, + 0x3563b7b9}, + {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5, + 0x071475d0}, + {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b, + 0x54c79d60}, + {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178, + 0x4c53eee6}, + {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3, + 0x10137a3c}, + {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605, + 0xaa9d6c73}, + {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1, + 0xb63d23e7}, + {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9, + 0x7f53e9cf}, + {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78, + 0x13c1cd83}, + {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9, + 0x49ff5867}, + {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd, + 0x8467f211}, + {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab, + 0x3f9683b2}, + {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb, + 0x76a3f874}, + {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77, + 0x863b702f}, + {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da, + 0xdc6c58ff}, + {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39, + 0x0622cc95}, + {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16, + 0xe85605cd}, + {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208, + 0x31da5f06}, + {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e, + 0xa1f2e784}, + {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5, + 0xb07cc616}, + {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892, + 0xbf943b6c}, + {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db, + 0x2c01af1c}, + {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43, + 0x0fe5f56d}, + {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac, + 0xf8943b2d}, + {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7, + 0xe4d89272}, + {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2, + 0x7c2f6bbb}, + {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2, + 0xabbf388b}, + {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640, + 0x1dca1f4e}, + {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f, + 0x5c170e23}, + {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99, + 0xc0e9d672}, + {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7, + 0xc18bdc86}, + {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499, + 0xa874fcdd}, + {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a, + 0x9dc0bb48}, +}; + +static int crc32c_test(void) +{ + int i; + int errors =3D 0; + int bytes =3D 0; + struct timeval start, stop; + uint64_t usec; + + /* keep static to prevent cache warming code from + * getting eliminated by the compiler */ + static u32 crc; + + /* pre-warm the cache */ + for (i =3D 0; i < 100; i++) { + bytes +=3D 2*test[i].length; + + crc ^=3D crc32c_le(test[i].crc, test_buf + + test[i].start, test[i].length); + } + + gettimeofday(&start, NULL); + for (i =3D 0; i < 100; i++) { + if (test[i].crc32c_le !=3D crc32c_le(test[i].crc, test_buf + + test[i].start, test[i].length)) + errors++; + } + gettimeofday(&stop, NULL); + + usec =3D stop.tv_usec - start.tv_usec + + 1000000 * (stop.tv_sec - start.tv_sec); + + if (errors) + printf("crc32c: %d self tests failed\n", errors); + else { + printf("crc32c: tests passed, %d bytes in %" PRIu64 " usec\n", + bytes, usec); + } + + return errors; +} + +static int crc32_test(void) +{ + int i; + int errors =3D 0; + int bytes =3D 0; + struct timeval start, stop; + uint64_t usec; + + /* keep static to prevent cache warming code from + * getting eliminated by the compiler */ + static u32 crc; + + /* pre-warm the cache */ + for (i =3D 0; i < 100; i++) { + bytes +=3D 2*test[i].length; + + crc ^=3D crc32_le(test[i].crc, test_buf + + test[i].start, test[i].length); + +#if 0 /* not used */ + crc ^=3D crc32_be(test[i].crc, test_buf + + test[i].start, test[i].length); +#endif + } + + gettimeofday(&start, NULL); + for (i =3D 0; i < 100; i++) { + if (test[i].crc_le !=3D crc32_le(test[i].crc, test_buf + + test[i].start, test[i].length)) + errors++; + +#if 0 /* not used */ + if (test[i].crc_be !=3D crc32_be(test[i].crc, test_buf + + test[i].start, test[i].length)) + errors++; +#endif + } + gettimeofday(&stop, NULL); + + usec =3D stop.tv_usec - start.tv_usec + + 1000000000 * (stop.tv_sec - start.tv_sec); + + if (errors) + printf("crc32: %d self tests failed\n", errors); + else { + printf("crc32: tests passed, %d bytes in %" PRIu64 " usec\n", + bytes, usec); + } + + return errors; +} +/* + * make sure we always return 0 for a successful test run, and non-zero fo= r a + * failed run. The build infrastructure is looking for this information to + * determine whether to allow the build to proceed. + */ +int main(int argc, char **argv) +{ + int errors; + + printf("CRC_LE_BITS =3D %d\n", CRC_LE_BITS); + + errors =3D crc32_test(); + errors +=3D crc32c_test(); + + return errors !=3D 0; +} +#endif /* CRC32_SELFTEST */ diff --git a/libxfs/crc32defs.h b/libxfs/crc32defs.h new file mode 100644 index 0000000..64cba2c --- /dev/null +++ b/libxfs/crc32defs.h @@ -0,0 +1,72 @@ +/* + * There are multiple 16-bit CRC polynomials in common use, but this is + * *the* standard CRC-32 polynomial, first popularized by Ethernet. + * x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0 + */ +#define CRCPOLY_LE 0xedb88320 +#define CRCPOLY_BE 0x04c11db7 + +/* + * This is the CRC32c polynomial, as outlined by Castagnoli. + * x^32+x^28+x^27+x^26+x^25+x^23+x^22+x^20+x^19+x^18+x^14+x^13+x^11+x^10+x= ^9+ + * x^8+x^6+x^0 + */ +#define CRC32C_POLY_LE 0x82F63B78 + +/* Try to choose an implementation variant via Kconfig */ +#ifdef CONFIG_CRC32_SLICEBY8 +# define CRC_LE_BITS 64 +# define CRC_BE_BITS 64 +#endif +#ifdef CONFIG_CRC32_SLICEBY4 +# define CRC_LE_BITS 32 +# define CRC_BE_BITS 32 +#endif +#ifdef CONFIG_CRC32_SARWATE +# define CRC_LE_BITS 8 +# define CRC_BE_BITS 8 +#endif +#ifdef CONFIG_CRC32_BIT +# define CRC_LE_BITS 1 +# define CRC_BE_BITS 1 +#endif + +/* + * How many bits at a time to use. Valid values are 1, 2, 4, 8, 32 and 64. + * For less performance-sensitive, use 4 or 8 to save table size. + * For larger systems choose same as CPU architecture as default. + * This works well on X86_64, SPARC64 systems. This may require some + * elaboration after experiments with other architectures. + */ +#ifndef CRC_LE_BITS +# ifdef CONFIG_64BIT +# define CRC_LE_BITS 64 +# else +# define CRC_LE_BITS 32 +# endif +#endif +#ifndef CRC_BE_BITS +# ifdef CONFIG_64BIT +# define CRC_BE_BITS 64 +# else +# define CRC_BE_BITS 32 +# endif +#endif + +/* + * Little-endian CRC computation. Used with serial bit streams sent + * lsbit-first. Be sure to use cpu_to_le32() to append the computed CRC. + */ +#if CRC_LE_BITS > 64 || CRC_LE_BITS < 1 || CRC_LE_BITS =3D=3D 16 || \ + CRC_LE_BITS & CRC_LE_BITS-1 +# error "CRC_LE_BITS must be one of {1, 2, 4, 8, 32, 64}" +#endif + +/* + * Big-endian CRC computation. Used with serial bit streams sent + * msbit-first. Be sure to use cpu_to_be32() to append the computed CRC. + */ +#if CRC_BE_BITS > 64 || CRC_BE_BITS < 1 || CRC_BE_BITS =3D=3D 16 || \ + CRC_BE_BITS & CRC_BE_BITS-1 +# error "CRC_BE_BITS must be one of {1, 2, 4, 8, 32, 64}" +#endif diff --git a/libxfs/gen_crc32table.c b/libxfs/gen_crc32table.c new file mode 100644 index 0000000..574a2d1 --- /dev/null +++ b/libxfs/gen_crc32table.c @@ -0,0 +1,144 @@ +#include +#include "crc32defs.h" +#include + +#define ENTRIES_PER_LINE 4 + +#if CRC_LE_BITS > 8 +# define LE_TABLE_ROWS (CRC_LE_BITS/8) +# define LE_TABLE_SIZE 256 +#else +# define LE_TABLE_ROWS 1 +# define LE_TABLE_SIZE (1 << CRC_LE_BITS) +#endif + +#if CRC_BE_BITS > 8 +# define BE_TABLE_ROWS (CRC_BE_BITS/8) +# define BE_TABLE_SIZE 256 +#else +# define BE_TABLE_ROWS 1 +# define BE_TABLE_SIZE (1 << CRC_BE_BITS) +#endif + +static uint32_t crc32table_le[LE_TABLE_ROWS][256]; +static uint32_t crc32ctable_le[LE_TABLE_ROWS][256]; + +/* + * big endian ordered CRC not used by XFS. +static uint32_t crc32table_be[BE_TABLE_ROWS][256]; + */ + +/** + * crc32init_le() - allocate and initialize LE table data + * + * crc is the crc of the byte i; other entries are filled in based on the + * fact that crctable[i^j] =3D crctable[i] ^ crctable[j]. + * + */ +static void crc32init_le_generic(const uint32_t polynomial, + uint32_t (*tab)[256]) +{ + unsigned i, j; + uint32_t crc =3D 1; + + tab[0][0] =3D 0; + + for (i =3D LE_TABLE_SIZE >> 1; i; i >>=3D 1) { + crc =3D (crc >> 1) ^ ((crc & 1) ? polynomial : 0); + for (j =3D 0; j < LE_TABLE_SIZE; j +=3D 2 * i) + tab[0][i + j] =3D crc ^ tab[0][j]; + } + for (i =3D 0; i < LE_TABLE_SIZE; i++) { + crc =3D tab[0][i]; + for (j =3D 1; j < LE_TABLE_ROWS; j++) { + crc =3D tab[0][crc & 0xff] ^ (crc >> 8); + tab[j][i] =3D crc; + } + } +} + +static void crc32init_le(void) +{ + crc32init_le_generic(CRCPOLY_LE, crc32table_le); +} + +static void crc32cinit_le(void) +{ + crc32init_le_generic(CRC32C_POLY_LE, crc32ctable_le); +} + +/** + * crc32init_be() - allocate and initialize BE table data + */ +#if 0 /* not used */ +static void crc32init_be(void) +{ + unsigned i, j; + uint32_t crc =3D 0x80000000; + + crc32table_be[0][0] =3D 0; + + for (i =3D 1; i < BE_TABLE_SIZE; i <<=3D 1) { + crc =3D (crc << 1) ^ ((crc & 0x80000000) ? CRCPOLY_BE : 0); + for (j =3D 0; j < i; j++) + crc32table_be[0][i + j] =3D crc ^ crc32table_be[0][j]; + } + for (i =3D 0; i < BE_TABLE_SIZE; i++) { + crc =3D crc32table_be[0][i]; + for (j =3D 1; j < BE_TABLE_ROWS; j++) { + crc =3D crc32table_be[0][(crc >> 24) & 0xff] ^ (crc << 8); + crc32table_be[j][i] =3D crc; + } + } +} +#endif + +static void output_table(uint32_t (*table)[256], int rows, int len, char *= trans) +{ + int i, j; + + for (j =3D 0 ; j < rows; j++) { + printf("{"); + for (i =3D 0; i < len - 1; i++) { + if (i % ENTRIES_PER_LINE =3D=3D 0) + printf("\n"); + printf("%s(0x%8.8xL), ", trans, table[j][i]); + } + printf("%s(0x%8.8xL)},\n", trans, table[j][len - 1]); + } +} + +int main(int argc, char** argv) +{ + printf("/* this file is generated - do not edit */\n\n"); + + if (CRC_LE_BITS > 1) { + crc32init_le(); + printf("static u32 crc32table_le[%d][%d] =3D {", + LE_TABLE_ROWS, LE_TABLE_SIZE); + output_table(crc32table_le, LE_TABLE_ROWS, + LE_TABLE_SIZE, "tole"); + printf("};\n"); + } + +#if 0 /* not used by xfsprogs */ + if (CRC_BE_BITS > 1) { + crc32init_be(); + printf("static u32 crc32table_be[%d][%d] =3D {", + BE_TABLE_ROWS, BE_TABLE_SIZE); + output_table(crc32table_be, LE_TABLE_ROWS, + BE_TABLE_SIZE, "tobe"); + printf("};\n"); + } +#endif + if (CRC_LE_BITS > 1) { + crc32cinit_le(); + printf("static u32 crc32ctable_le[%d][%d] =3D {", + LE_TABLE_ROWS, LE_TABLE_SIZE); + output_table(crc32ctable_le, LE_TABLE_ROWS, + LE_TABLE_SIZE, "tole"); + printf("};\n"); + } + + return 0; +} =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00xfsprogs-crc-patchset-v2/xfsprogs-libxlog-kernel-sync=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001750= =0000000066352=0012132011546=00021737=00 0=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00xfsprogs: updata libxlog to current kernel co= de =46rom: Dave Chinner Update the log recovery code to match the current 3.8-rc2 kernel code. Note: while this introduces CRC validation infrastructure, it is currently short-circuited as we cannot validate the CRC from userspace because we do not know what the size of the log buffer was that wrote the header. This information is not written into the log header anywhere, so we have no way of working out the correct number of extra headers that need to be summed. This is also a problem for the kernel code, and needs fixing. Signed-off-by: Dave Chinner --- db/sb.c | 7 +- include/libxlog.h | 32 ++--- libxlog/xfs_log_recover.c | 301 +++++++++++++++++++++++++++-------------= ---- logprint/log_copy.c | 2 +- logprint/log_dump.c | 2 +- logprint/log_misc.c | 4 +- logprint/log_print_all.c | 2 +- logprint/log_print_trans.c | 4 +- logprint/logprint.c | 2 +- logprint/logprint.h | 10 +- repair/phase2.c | 7 +- 11 files changed, 229 insertions(+), 144 deletions(-) diff --git a/db/sb.c b/db/sb.c index 21f38c5..d83db9c 100644 --- a/db/sb.c +++ b/db/sb.c @@ -205,12 +205,15 @@ get_sb(xfs_agnumber_t agno, xfs_sb_t *sb) } =20 /* workaround craziness in the xlog routines */ -int xlog_recover_do_trans(xlog_t *log, xlog_recover_t *t, int p) { return = 0; } +int xlog_recover_do_trans(struct xlog *log, xlog_recover_t *t, int p) +{ + return 0; +} =20 int sb_logcheck(void) { - xlog_t log; + struct xlog log; xfs_daddr_t head_blk, tail_blk; =20 if (mp->m_sb.sb_logstart) { diff --git a/include/libxlog.h b/include/libxlog.h index d1142ab..36ede59 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -24,7 +24,7 @@ * xlog_t that we actually need to get our work done, avoiding * the need to define any exotic kernel types in userland. */ -typedef struct log { +struct xlog { xfs_lsn_t l_tail_lsn; /* lsn of 1st LR w/ unflush buffers */ xfs_lsn_t l_last_sync_lsn;/* lsn of last LR on disk */ xfs_mount_t *l_mp; /* mount point */ @@ -45,7 +45,7 @@ typedef struct log { uint l_sectbb_mask; /* sector size (in BBs) * alignment mask */ int l_sectBBsize; /* size of log sector in 512 byte chunks */ -} xlog_t; +}; =20 #include #include @@ -76,6 +76,10 @@ typedef union { #define unlikely(x) (x) #define min(a,b) ((a) < (b) ? (a) : (b)) =20 +#define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) +#define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) +#define xfs_hex_dump(d,n) ((void) 0) + extern void xlog_warn(char *fmt,...); extern void xlog_exit(char *fmt,...); extern void xlog_panic(char *fmt,...); @@ -88,34 +92,34 @@ extern int print_record_header; /* libxfs parameters */ extern libxfs_init_t x; =20 -extern struct xfs_buf *xlog_get_bp(xlog_t *, int); +extern struct xfs_buf *xlog_get_bp(struct xlog *, int); extern void xlog_put_bp(struct xfs_buf *); -extern int xlog_bread(xlog_t *log, xfs_daddr_t blk_no, int nbblks, +extern int xlog_bread(struct xlog *log, xfs_daddr_t blk_no, int nbblks, xfs_buf_t *bp, xfs_caddr_t *offset); -extern int xlog_bread_noalign(xlog_t *log, xfs_daddr_t blk_no, int nbblks, - xfs_buf_t *bp); +extern int xlog_bread_noalign(struct xlog *log, xfs_daddr_t blk_no, + int nbblks, xfs_buf_t *bp); =20 -extern int xlog_find_zeroed(xlog_t *log, xfs_daddr_t *blk_no); -extern int xlog_find_cycle_start(xlog_t *log, xfs_buf_t *bp, +extern int xlog_find_zeroed(struct xlog *log, xfs_daddr_t *blk_no); +extern int xlog_find_cycle_start(struct xlog *log, xfs_buf_t *bp, xfs_daddr_t first_blk, xfs_daddr_t *last_blk,=20 uint cycle); -extern int xlog_find_tail(xlog_t *log, xfs_daddr_t *head_blk, +extern int xlog_find_tail(struct xlog *log, xfs_daddr_t *head_blk, xfs_daddr_t *tail_blk); =20 -extern int xlog_test_footer(xlog_t *log); -extern int xlog_recover(xlog_t *log, int readonly); +extern int xlog_test_footer(struct xlog *log); +extern int xlog_recover(struct xlog *log, int readonly); extern void xlog_recover_print_data(xfs_caddr_t p, int len); extern void xlog_recover_print_logitem(xlog_recover_item_t *item); extern void xlog_recover_print_trans_head(xlog_recover_t *tr); -extern int xlog_print_find_oldest(xlog_t *log, xfs_daddr_t *last_blk); +extern int xlog_print_find_oldest(struct xlog *log, xfs_daddr_t *last_blk); =20 /* for transactional view */ extern void xlog_recover_print_trans_head(xlog_recover_t *tr); extern void xlog_recover_print_trans(xlog_recover_t *trans, struct list_head *itemq, int print); -extern int xlog_do_recovery_pass(xlog_t *log, xfs_daddr_t head_blk, +extern int xlog_do_recovery_pass(struct xlog *log, xfs_daddr_t head_blk, xfs_daddr_t tail_blk, int pass); -extern int xlog_recover_do_trans(xlog_t *log, xlog_recover_t *trans, +extern int xlog_recover_do_trans(struct xlog *log, xlog_recover_t *trans, int pass); extern int xlog_header_check_recover(xfs_mount_t *mp,=20 xlog_rec_header_t *head); diff --git a/libxlog/xfs_log_recover.c b/libxlog/xfs_log_recover.c index 23fe6fd..ad53e86 100644 --- a/libxlog/xfs_log_recover.c +++ b/libxlog/xfs_log_recover.c @@ -18,10 +18,11 @@ =20 #include =20 -#define xlog_unpack_data_checksum(rhead, dp, log) ((void)0) -#define xlog_clear_stale_blocks(log, tail_lsn) (0) #define xfs_readonly_buftarg(buftarg) (0) =20 +/* avoid set-but-unused var warning. gcc is not very bright. */ +#define xlog_clear_stale_blocks(log, taillsn) ((taillsn) =3D (taillsn)) + =20 /* * Verify the given count of basic blocks is valid number of blocks @@ -31,7 +32,7 @@ =20 static inline int xlog_buf_bbcount_valid( - xlog_t *log, + struct xlog *log, int bbcount) { return bbcount > 0 && bbcount <=3D log->l_logBBsize; @@ -44,11 +45,11 @@ xlog_buf_bbcount_valid( */ xfs_buf_t * xlog_get_bp( - xlog_t *log, + struct xlog *log, int nbblks) { if (!xlog_buf_bbcount_valid(log, nbblks)) { - xlog_warn("XFS: Invalid block length (0x%x) given for buffer", + xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer", nbblks); XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp); return NULL; @@ -57,7 +58,7 @@ xlog_get_bp( /* * We do log I/O in units of log sectors (a power-of-2 * multiple of the basic block size), so we round up the - * requested size to acommodate the basic blocks required + * requested size to accommodate the basic blocks required * for complete log sectors. * * In addition, the buffer may be used for a non-sector- @@ -68,12 +69,11 @@ xlog_get_bp( * an issue. Nor will this be a problem if the log I/O is * done in basic blocks (sector size 1). But otherwise we * extend the buffer by one extra log sector to ensure - * there's space to accomodate this possiblility. + * there's space to accommodate this possibility. */ if (nbblks > 1 && log->l_sectBBsize > 1) nbblks +=3D log->l_sectBBsize; - if (log->l_sectBBsize) - nbblks =3D round_up(nbblks, log->l_sectBBsize); + nbblks =3D round_up(nbblks, log->l_sectBBsize); =20 return libxfs_getbufr(log->l_dev, (xfs_daddr_t)-1, nbblks); } @@ -91,57 +91,54 @@ xlog_put_bp( */ STATIC xfs_caddr_t xlog_align( - xlog_t *log, + struct xlog *log, xfs_daddr_t blk_no, int nbblks, - xfs_buf_t *bp) + struct xfs_buf *bp) { - xfs_daddr_t offset =3D 0; - - if (log->l_sectBBsize) - offset =3D blk_no & ((xfs_daddr_t)log->l_sectBBsize - 1); + xfs_daddr_t offset =3D blk_no & ((xfs_daddr_t)log->l_sectBBsize - 1); =20 - ASSERT(BBTOB(offset + nbblks) <=3D XFS_BUF_SIZE(bp)); - return XFS_BUF_PTR(bp) + BBTOB(offset); + ASSERT(offset + nbblks <=3D bp->b_length); + return bp->b_addr + BBTOB(offset); } =20 + /* * nbblks should be uint, but oh well. Just want to catch that 32-bit len= gth. */ int xlog_bread_noalign( - xlog_t *log, + struct xlog *log, xfs_daddr_t blk_no, int nbblks, - xfs_buf_t *bp) + struct xfs_buf *bp) { if (!xlog_buf_bbcount_valid(log, nbblks)) { - xlog_warn("XFS: Invalid block length (0x%x) given for buffer", + xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer", nbblks); XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp); return EFSCORRUPTED; } =20 - if (log->l_sectBBsize > 1) { - blk_no =3D round_down(blk_no, log->l_sectBBsize); - nbblks =3D round_up(nbblks, log->l_sectBBsize); - } + blk_no =3D round_down(blk_no, log->l_sectBBsize); + nbblks =3D round_up(nbblks, log->l_sectBBsize); =20 ASSERT(nbblks > 0); ASSERT(BBTOB(nbblks) <=3D XFS_BUF_SIZE(bp)); =20 XFS_BUF_SET_ADDR(bp, log->l_logBBstart + blk_no); XFS_BUF_SET_COUNT(bp, BBTOB(nbblks)); + bp->b_error =3D 0; =20 return libxfs_readbufr(log->l_dev, XFS_BUF_ADDR(bp), bp, nbblks, 0); } =20 int xlog_bread( - xlog_t *log, + struct xlog *log, xfs_daddr_t blk_no, int nbblks, - xfs_buf_t *bp, + struct xfs_buf *bp, xfs_caddr_t *offset) { int error; @@ -155,6 +152,35 @@ xlog_bread( } =20 /* + * Read at an offset into the buffer. Returns with the buffer in it's orig= inal + * state regardless of the result of the read. + */ +STATIC int +xlog_bread_offset( + struct xlog *log, + xfs_daddr_t blk_no, /* block to read from */ + int nbblks, /* blocks to read */ + struct xfs_buf *bp, + xfs_caddr_t offset) +{ + xfs_caddr_t orig_offset =3D bp->b_addr; + int orig_len =3D bp->b_bcount; + int error, error2; + + error =3D XFS_BUF_SET_PTR(bp, offset, BBTOB(nbblks)); + if (error) + return error; + + error =3D xlog_bread_noalign(log, blk_no, nbblks, bp); + + /* must reset buffer pointer even on error */ + error2 =3D XFS_BUF_SET_PTR(bp, orig_offset, orig_len); + if (error) + return error; + return error2; +} + +/* * This routine finds (to an approximation) the first block in the physical * log which contains the given cycle. It uses a binary search algorithm. * Note that the algorithm can not be perfect because the disk will not @@ -162,8 +188,8 @@ xlog_bread( */ int xlog_find_cycle_start( - xlog_t *log, - xfs_buf_t *bp, + struct xlog *log, + struct xfs_buf *bp, xfs_daddr_t first_blk, xfs_daddr_t *last_blk, uint cycle) @@ -205,7 +231,7 @@ xlog_find_cycle_start( */ STATIC int xlog_find_verify_cycle( - xlog_t *log, + struct xlog *log, xfs_daddr_t start_blk, int nbblks, uint stop_on_cycle_no, @@ -225,9 +251,11 @@ xlog_find_verify_cycle( * a log sector, or we're out of luck. */ bufblks =3D 1 << ffs(nbblks); + while (bufblks > log->l_logBBsize) + bufblks >>=3D 1; while (!(bp =3D xlog_get_bp(log, bufblks))) { bufblks >>=3D 1; - if (bufblks < MAX(log->l_sectBBsize, 1)) + if (bufblks < log->l_sectBBsize) return ENOMEM; } =20 @@ -272,7 +300,7 @@ out: */ STATIC int xlog_find_verify_log_record( - xlog_t *log, + struct xlog *log, xfs_daddr_t start_blk, xfs_daddr_t *last_blk, int extra_bblks) @@ -302,8 +330,8 @@ xlog_find_verify_log_record( for (i =3D (*last_blk) - 1; i >=3D 0; i--) { if (i < start_blk) { /* valid log record not found */ - xlog_warn( - "XFS: Log inconsistent (didn't find previous header)"); + xfs_warn(log->l_mp, + "Log inconsistent (didn't find previous header)"); ASSERT(0); error =3D XFS_ERROR(EIO); goto out; @@ -317,7 +345,7 @@ xlog_find_verify_log_record( =20 head =3D (xlog_rec_header_t *)offset; =20 - if (XLOG_HEADER_MAGIC_NUM =3D=3D be32_to_cpu(head->h_magicno)) + if (head->h_magicno =3D=3D cpu_to_be32(XLOG_HEADER_MAGIC_NUM)) break; =20 if (!smallmem) @@ -382,7 +410,7 @@ out: */ STATIC int xlog_find_head( - xlog_t *log, + struct xlog *log, xfs_daddr_t *return_head_blk) { xfs_buf_t *bp; @@ -403,12 +431,12 @@ xlog_find_head( * mkfs etc write a dummy unmount record to a fresh * log so we can store the uuid in there */ - xlog_warn("XFS: totally zeroed log"); + xfs_warn(log->l_mp, "totally zeroed log"); } =20 return 0; } else if (error) { - xlog_warn("XFS: empty log check failed"); + xfs_warn(log->l_mp, "empty log check failed"); return error; } =20 @@ -631,7 +659,7 @@ validate_head: xlog_put_bp(bp); =20 if (error) - xlog_warn("XFS: failed to find log head"); + xfs_warn(log->l_mp, "failed to find log head"); return error; } =20 @@ -653,7 +681,7 @@ validate_head: */ int xlog_find_tail( - xlog_t *log, + struct xlog *log, xfs_daddr_t *head_blk, xfs_daddr_t *tail_blk) { @@ -699,7 +727,7 @@ xlog_find_tail( if (error) goto done; =20 - if (XLOG_HEADER_MAGIC_NUM =3D=3D be32_to_cpu(*(__be32 *)offset)) { + if (*(__be32 *)offset =3D=3D cpu_to_be32(XLOG_HEADER_MAGIC_NUM)) { found =3D 1; break; } @@ -716,15 +744,15 @@ xlog_find_tail( if (error) goto done; =20 - if (XLOG_HEADER_MAGIC_NUM =3D=3D - be32_to_cpu(*(__be32 *)offset)) { + if (*(__be32 *)offset =3D=3D + cpu_to_be32(XLOG_HEADER_MAGIC_NUM)) { found =3D 2; break; } } } if (!found) { - xlog_warn("XFS: xlog_find_tail: couldn't find sync record"); + xfs_warn(log->l_mp, "%s: couldn't find sync record", __func__); ASSERT(0); return XFS_ERROR(EIO); } @@ -750,9 +778,9 @@ xlog_find_tail( log->l_curr_cycle++; atomic64_set(&log->l_tail_lsn, be64_to_cpu(rhead->h_tail_lsn)); atomic64_set(&log->l_last_sync_lsn, be64_to_cpu(rhead->h_lsn)); - xlog_assign_grant_head(&log->l_grant_reserve_head, log->l_curr_cycle, + xlog_assign_grant_head(&log->l_reserve_head.grant, log->l_curr_cycle, BBTOB(log->l_curr_block)); - xlog_assign_grant_head(&log->l_grant_write_head, log->l_curr_cycle, + xlog_assign_grant_head(&log->l_write_head.grant, log->l_curr_cycle, BBTOB(log->l_curr_block)); =20 /* @@ -840,7 +868,7 @@ done: xlog_put_bp(bp); =20 if (error) - xlog_warn("XFS: failed to locate log tail"); + xfs_warn(log->l_mp, "failed to locate log tail"); return error; } =20 @@ -862,7 +890,7 @@ done: */ int xlog_find_zeroed( - xlog_t *log, + struct xlog *log, xfs_daddr_t *blk_no) { xfs_buf_t *bp; @@ -904,7 +932,8 @@ xlog_find_zeroed( * the first block must be 1. If it's not, maybe we're * not looking at a log... Bail out. */ - xlog_warn("XFS: Log inconsistent or not a log (last=3D=3D0, first!=3D1)"= ); + xfs_warn(log->l_mp, + "Log inconsistent or not a log (last=3D=3D0, first!=3D1)"); return XFS_ERROR(EINVAL); } =20 @@ -1002,8 +1031,8 @@ xlog_recover_add_item( =20 STATIC int xlog_recover_add_to_cont_trans( - struct log *log, - xlog_recover_t *trans, + struct xlog *log, + struct xlog_recover *trans, xfs_caddr_t dp, int len) { @@ -1025,7 +1054,7 @@ xlog_recover_add_to_cont_trans( old_ptr =3D item->ri_buf[item->ri_cnt-1].i_addr; old_len =3D item->ri_buf[item->ri_cnt-1].i_len; =20 - ptr =3D kmem_realloc(old_ptr, len+old_len, old_len, 0u); + ptr =3D kmem_realloc(old_ptr, len+old_len, old_len, KM_SLEEP); memcpy(&ptr[old_len], dp, len); /* d, s, l */ item->ri_buf[item->ri_cnt-1].i_len +=3D len; item->ri_buf[item->ri_cnt-1].i_addr =3D ptr; @@ -1048,8 +1077,8 @@ xlog_recover_add_to_cont_trans( */ STATIC int xlog_recover_add_to_trans( - struct log *log, - xlog_recover_t *trans, + struct xlog *log, + struct xlog_recover *trans, xfs_caddr_t dp, int len) { @@ -1062,8 +1091,8 @@ xlog_recover_add_to_trans( if (list_empty(&trans->r_itemq)) { /* we need to catch log corruptions here */ if (*(uint *)dp !=3D XFS_TRANS_HEADER_MAGIC) { - xlog_warn("XFS: xlog_recover_add_to_trans: " - "bad header magic number"); + xfs_warn(log->l_mp, "%s: bad header magic number", + __func__); ASSERT(0); return XFS_ERROR(EIO); } @@ -1090,8 +1119,8 @@ xlog_recover_add_to_trans( if (item->ri_total =3D=3D 0) { /* first region to be added */ if (in_f->ilf_size =3D=3D 0 || in_f->ilf_size > XLOG_MAX_REGIONS_IN_ITEM) { - xlog_warn( - "XFS: bad number of regions (%d) in inode log format", + xfs_warn(log->l_mp, + "bad number of regions (%d) in inode log format", in_f->ilf_size); ASSERT(0); return XFS_ERROR(EIO); @@ -1144,7 +1173,7 @@ xlog_recover_free_trans( */ STATIC int xlog_recover_commit_trans( - struct log *log, + struct xlog *log, struct xlog_recover *trans, int pass) { @@ -1163,7 +1192,7 @@ xlog_recover_unmount_trans( xlog_recover_t *trans) { /* Do nothing now */ - xlog_warn("XFS: xlog_recover_unmount_trans: Unmount LR"); + xfs_warn(log->l_mp, "%s: Unmount LR", __func__); return 0; } =20 @@ -1178,9 +1207,9 @@ xlog_recover_unmount_trans( */ STATIC int xlog_recover_process_data( - xlog_t *log, + struct xlog *log, struct hlist_head rhash[], - xlog_rec_header_t *rhead, + struct xlog_rec_header *rhead, xfs_caddr_t dp, int pass) { @@ -1206,8 +1235,8 @@ xlog_recover_process_data( dp +=3D sizeof(xlog_op_header_t); if (ohead->oh_clientid !=3D XFS_TRANSACTION && ohead->oh_clientid !=3D XFS_LOG) { - xlog_warn( - "XFS: xlog_recover_process_data: bad clientid"); + xfs_warn(log->l_mp, "%s: bad clientid 0x%x", + __func__, ohead->oh_clientid); ASSERT(0); return (XFS_ERROR(EIO)); } @@ -1220,8 +1249,8 @@ xlog_recover_process_data( be64_to_cpu(rhead->h_lsn)); } else { if (dp + be32_to_cpu(ohead->oh_len) > lp) { - xlog_warn( - "XFS: xlog_recover_process_data: bad length"); + xfs_warn(log->l_mp, "%s: bad length 0x%x", + __func__, be32_to_cpu(ohead->oh_len)); return (XFS_ERROR(EIO)); } flags =3D ohead->oh_flags & ~XLOG_END_TRANS; @@ -1241,8 +1270,8 @@ xlog_recover_process_data( be32_to_cpu(ohead->oh_len)); break; case XLOG_START_TRANS: - xlog_warn( - "XFS: xlog_recover_process_data: bad transaction"); + xfs_warn(log->l_mp, "%s: bad transaction", + __func__); ASSERT(0); error =3D XFS_ERROR(EIO); break; @@ -1252,8 +1281,8 @@ xlog_recover_process_data( dp, be32_to_cpu(ohead->oh_len)); break; default: - xlog_warn( - "XFS: xlog_recover_process_data: bad flag"); + xfs_warn(log->l_mp, "%s: bad flag 0x%x", + __func__, flags); ASSERT(0); error =3D XFS_ERROR(EIO); break; @@ -1267,13 +1296,64 @@ xlog_recover_process_data( return 0; } =20 -STATIC void +/* + * Upack the log buffer data and crc check it. If the check fails, issue a + * warning if and only if the CRC in the header is non-zero. This makes the + * check an advisory warning, and the zero CRC check will prevent failure + * warnings from being emitted when upgrading the kernel from one that doe= s not + * add CRCs by default. + * + * When filesystems are CRC enabled, this CRC mismatch becomes a fatal log + * corruption failure + * + * XXX: we cannot calculate the CRC here without knowing the number of ext= ra + * headers taht were CRC'd in log write. This information is derived from = the + * in-core log buffer size, and is not written to the log! Hence for now we + * simple *cannot* verify the CRCs, and so we short circuit it. + */ +#define xlog_cksum(l,r,dp,len) ((r)->h_crc) +STATIC int +xlog_unpack_data_crc( + struct xlog_rec_header *rhead, + xfs_caddr_t dp, + struct xlog *log) +{ + __le32 crc; + + crc =3D xlog_cksum(log, rhead, dp, be32_to_cpu(rhead->h_len)); + if (crc !=3D rhead->h_crc) { + if (rhead->h_crc || xfs_sb_version_hascrc(&log->l_mp->m_sb)) { + xfs_alert(log->l_mp, + "log record CRC mismatch: found 0x%x, expected 0x%x.\n", + le32_to_cpu(rhead->h_crc), + le32_to_cpu(crc)); + xfs_hex_dump(dp, 32); + } + + /* + * If we've detected a log record corruption, then we can't + * recover past this point. Abort recovery if we are enforcing + * CRC protection by punting an error back up the stack. + */ + if (xfs_sb_version_hascrc(&log->l_mp->m_sb)) + return EFSCORRUPTED; + } + + return 0; +} + +STATIC int xlog_unpack_data( - xlog_rec_header_t *rhead, + struct xlog_rec_header *rhead, xfs_caddr_t dp, - xlog_t *log) + struct xlog *log) { int i, j, k; + int error; + + error =3D xlog_unpack_data_crc(rhead, dp, log); + if (error) + return error; =20 for (i =3D 0; i < BTOBB(be32_to_cpu(rhead->h_len)) && i < (XLOG_HEADER_CYCLE_SIZE / BBSIZE); i++) { @@ -1290,17 +1370,19 @@ xlog_unpack_data( dp +=3D BBSIZE; } } + + return 0; } =20 STATIC int xlog_valid_rec_header( - xlog_t *log, - xlog_rec_header_t *rhead, + struct xlog *log, + struct xlog_rec_header *rhead, xfs_daddr_t blkno) { int hlen; =20 - if (unlikely(be32_to_cpu(rhead->h_magicno) !=3D XLOG_HEADER_MAGIC_NUM)) { + if (unlikely(rhead->h_magicno !=3D cpu_to_be32(XLOG_HEADER_MAGIC_NUM))) { XFS_ERROR_REPORT("xlog_valid_rec_header(1)", XFS_ERRLEVEL_LOW, log->l_mp); return XFS_ERROR(EFSCORRUPTED); @@ -1308,7 +1390,7 @@ xlog_valid_rec_header( if (unlikely( (!rhead->h_version || (be32_to_cpu(rhead->h_version) & (~XLOG_VERSION_OKBITS))))) { - xlog_warn("XFS: %s: unrecognised log version (%d).", + xfs_warn(log->l_mp, "%s: unrecognised log version (%d).", __func__, be32_to_cpu(rhead->h_version)); return XFS_ERROR(EIO); } @@ -1338,7 +1420,7 @@ xlog_valid_rec_header( */ int xlog_do_recovery_pass( - xlog_t *log, + struct xlog *log, xfs_daddr_t head_blk, xfs_daddr_t tail_blk, int pass) @@ -1421,9 +1503,13 @@ xlog_do_recovery_pass( if (error) goto bread_err2; =20 - xlog_unpack_data(rhead, offset, log); - if ((error =3D xlog_recover_process_data(log, - rhash, rhead, offset, pass))) + error =3D xlog_unpack_data(rhead, offset, log); + if (error) + goto bread_err2; + + error =3D xlog_recover_process_data(log, + rhash, rhead, offset, pass); + if (error) goto bread_err2; blk_no +=3D bblks + hblks; } @@ -1438,7 +1524,7 @@ xlog_do_recovery_pass( /* * Check for header wrapping around physical end-of-log */ - offset =3D XFS_BUF_PTR(hbp); + offset =3D hbp->b_addr; split_hblks =3D 0; wrapped_hblks =3D 0; if (blk_no + hblks <=3D log->l_logBBsize) { @@ -1474,19 +1560,9 @@ xlog_do_recovery_pass( * - order is important. */ wrapped_hblks =3D hblks - split_hblks; - error =3D XFS_BUF_SET_PTR(hbp, - offset + BBTOB(split_hblks), - BBTOB(hblks - split_hblks)); - if (error) - goto bread_err2; - - error =3D xlog_bread_noalign(log, 0, - wrapped_hblks, hbp); - if (error) - goto bread_err2; - - error =3D XFS_BUF_SET_PTR(hbp, offset, - BBTOB(hblks)); + error =3D xlog_bread_offset(log, 0, + wrapped_hblks, hbp, + offset + BBTOB(split_hblks)); if (error) goto bread_err2; } @@ -1508,7 +1584,7 @@ xlog_do_recovery_pass( } else { /* This log record is split across the * physical end of log */ - offset =3D XFS_BUF_PTR(dbp); + offset =3D dbp->b_addr; split_bblks =3D 0; if (blk_no !=3D log->l_logBBsize) { /* some data is before the physical @@ -1537,25 +1613,20 @@ xlog_do_recovery_pass( * _first_, then the log start (LR header end) * - order is important. */ - error =3D XFS_BUF_SET_PTR(dbp, - offset + BBTOB(split_bblks), - BBTOB(bblks - split_bblks)); + error =3D xlog_bread_offset(log, 0, + bblks - split_bblks, dbp, + offset + BBTOB(split_bblks)); if (error) goto bread_err2; + } =20 - error =3D xlog_bread_noalign(log, wrapped_hblks, - bblks - split_bblks, - dbp); - if (error) - goto bread_err2; + error =3D xlog_unpack_data(rhead, offset, log); + if (error) + goto bread_err2; =20 - error =3D XFS_BUF_SET_PTR(dbp, offset, h_size); - if (error) - goto bread_err2; - } - xlog_unpack_data(rhead, offset, log); - if ((error =3D xlog_recover_process_data(log, rhash, - rhead, offset, pass))) + error =3D xlog_recover_process_data(log, rhash, + rhead, offset, pass); + if (error) goto bread_err2; blk_no +=3D bblks; } @@ -1580,9 +1651,13 @@ xlog_do_recovery_pass( if (error) goto bread_err2; =20 - xlog_unpack_data(rhead, offset, log); - if ((error =3D xlog_recover_process_data(log, rhash, - rhead, offset, pass))) + error =3D xlog_unpack_data(rhead, offset, log); + if (error) + goto bread_err2; + + error =3D xlog_recover_process_data(log, rhash, + rhead, offset, pass); + if (error) goto bread_err2; blk_no +=3D bblks + hblks; } diff --git a/logprint/log_copy.c b/logprint/log_copy.c index fd36317..f6ef0e9 100644 --- a/logprint/log_copy.c +++ b/logprint/log_copy.c @@ -24,7 +24,7 @@ =20 void xfs_log_copy( - xlog_t *log, + struct xlog *log, int fd, char *filename) { diff --git a/logprint/log_dump.c b/logprint/log_dump.c index 1975b1b..a333077 100644 --- a/logprint/log_dump.c +++ b/logprint/log_dump.c @@ -24,7 +24,7 @@ =20 void xfs_log_dump( - xlog_t *log, + struct xlog *log, int fd, int print_block_start) { diff --git a/logprint/log_misc.c b/logprint/log_misc.c index c480795..4277a48 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -816,7 +816,7 @@ xlog_print_trans_dquot(xfs_caddr_t *ptr, int len, int *= i, int num_ops) */ =20 void -xlog_print_lseek(xlog_t *log, int fd, xfs_daddr_t blkno, int whence) +xlog_print_lseek(struct xlog *log, int fd, xfs_daddr_t blkno, int whence) { #define BBTOOFF64(bbs) (((xfs_off_t)(bbs)) << BBSHIFT) xfs_off_t offset; @@ -1265,7 +1265,7 @@ xlog_print_extended_headers( /* * This code is gross and needs to be rewritten. */ -void xfs_log_print(xlog_t *log, +void xfs_log_print(struct xlog *log, int fd, int print_block_start) { diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index cbc51d9..44fb4c4 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -23,7 +23,7 @@ */ int xlog_print_find_oldest( - struct log *log, + struct xlog *log, xfs_daddr_t *last_blk) { xfs_buf_t *bp; diff --git a/logprint/log_print_trans.c b/logprint/log_print_trans.c index 7405772..86e1c42 100644 --- a/logprint/log_print_trans.c +++ b/logprint/log_print_trans.c @@ -30,7 +30,7 @@ xlog_recover_print_trans_head( =20 int xlog_recover_do_trans( - xlog_t *log, + struct xlog *log, xlog_recover_t *trans, int pass) { @@ -40,7 +40,7 @@ xlog_recover_do_trans( =20 void xfs_log_print_trans( - xlog_t *log, + struct xlog *log, int print_block_start) { xfs_daddr_t head_blk, tail_blk; diff --git a/logprint/logprint.c b/logprint/logprint.c index 482fd4e..2a01780 100644 --- a/logprint/logprint.c +++ b/logprint/logprint.c @@ -128,7 +128,7 @@ main(int argc, char **argv) int c; int logfd; char *copy_file =3D NULL; - xlog_t log =3D {0}; + struct xlog log =3D {0}; xfs_mount_t mount; =20 setlocale(LC_ALL, ""); diff --git a/logprint/logprint.h b/logprint/logprint.h index df4cea3..933c9e6 100644 --- a/logprint/logprint.h +++ b/logprint/logprint.h @@ -34,12 +34,12 @@ extern int print_no_print; /* exports */ extern char *trans_type[]; =20 -extern void xlog_print_lseek(xlog_t *, int, xfs_daddr_t, int); +extern void xlog_print_lseek(struct xlog *, int, xfs_daddr_t, int); =20 -extern void xfs_log_copy(xlog_t *, int, char *); -extern void xfs_log_dump(xlog_t *, int, int); -extern void xfs_log_print(xlog_t *, int, int); -extern void xfs_log_print_trans(xlog_t *, int); +extern void xfs_log_copy(struct xlog *, int, char *); +extern void xfs_log_dump(struct xlog *, int, int); +extern void xfs_log_print(struct xlog *, int, int); +extern void xfs_log_print_trans(struct xlog *, int); =20 extern void print_xlog_record_line(void); extern void print_xlog_op_line(void); diff --git a/repair/phase2.c b/repair/phase2.c index 9fd591c..23b457a 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -29,13 +29,16 @@ void set_mp(xfs_mount_t *mpp); =20 /* workaround craziness in the xlog routines */ -int xlog_recover_do_trans(xlog_t *log, xlog_recover_t *t, int p) { return = 0; } +int xlog_recover_do_trans(struct xlog *log, xlog_recover_t *t, int p) +{ + return 0; +} =20 static void zero_log(xfs_mount_t *mp) { int error; - xlog_t log; + struct xlog log; xfs_daddr_t head_blk, tail_blk; dev_t logdev =3D (mp->m_sb.sb_logstart =3D=3D 0) ? x.logdev : x.ddev; =20 =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00xfsprogs-crc-patchset-v2/btree-format-changes=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00000060= 0=000001750=000001750=0000000153721=0012132011546=00020170=00 0=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00da= ve=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00libxfs: add crc format c= hanges to generic btrees =46rom: Dave Chinner Signed-off-by: Dave Chinner --- include/libxfs.h | 15 +-- include/xfs_alloc_btree.h | 13 ++- include/xfs_bmap_btree.h | 20 ++-- include/xfs_btree.h | 60 +++++++++-- include/xfs_buf_item.h | 24 ++++- include/xfs_dinode.h | 4 +- include/xfs_ialloc_btree.h | 10 +- include/xfs_trans.h | 2 + libxfs/rdwr.c | 24 ++--- libxfs/xfs.h | 4 + libxfs/xfs_alloc_btree.c | 99 +++++++++++------ libxfs/xfs_attr_leaf.c | 2 +- libxfs/xfs_bmap.c | 49 ++++++--- libxfs/xfs_bmap_btree.c | 107 ++++++++++++------ libxfs/xfs_btree.c | 257 ++++++++++++++++++++++++++++++++++++----= ---- libxfs/xfs_ialloc_btree.c | 80 +++++++++----- libxfs/xfs_inode.c | 33 +++--- libxfs/xfs_mount.c | 2 +- mdrestore/Makefile | 2 +- 19 files changed, 587 insertions(+), 220 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index b6e83f4..a4564fd 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -240,14 +240,14 @@ struct xfs_buf_ops { typedef struct xfs_buf { struct cache_node b_node; unsigned int b_flags; - xfs_daddr_t b_blkno; + xfs_daddr_t b_bn; unsigned b_bcount; unsigned int b_length; dev_t b_dev; pthread_mutex_t b_lock; pthread_t b_holder; unsigned int b_recur; - void *b_fsprivate; + void *b_fspriv; void *b_fsprivate2; void *b_fsprivate3; void *b_addr; @@ -273,9 +273,11 @@ enum xfs_buf_flags_t { /* b_flags bits */ LIBXFS_B_DISCONTIG =3D 0x0010, /* discontiguous buffer */ }; =20 +#define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) + #define XFS_BUF_PTR(bp) ((char *)(bp)->b_addr) #define xfs_buf_offset(bp, offset) (XFS_BUF_PTR(bp) + (offset)) -#define XFS_BUF_ADDR(bp) ((bp)->b_blkno) +#define XFS_BUF_ADDR(bp) ((bp)->b_bn) #define XFS_BUF_SIZE(bp) ((bp)->b_bcount) #define XFS_BUF_COUNT(bp) ((bp)->b_bcount) #define XFS_BUF_TARGET(bp) ((bp)->b_dev) @@ -284,11 +286,11 @@ enum xfs_buf_flags_t { /* b_flags bits */ XFS_BUF_SET_COUNT(bp,cnt); \ }) =20 -#define XFS_BUF_SET_ADDR(bp,blk) ((bp)->b_blkno =3D (blk)) +#define XFS_BUF_SET_ADDR(bp,blk) ((bp)->b_bn =3D (blk)) #define XFS_BUF_SET_COUNT(bp,cnt) ((bp)->b_bcount =3D (cnt)) =20 -#define XFS_BUF_FSPRIVATE(bp,type) ((type)(bp)->b_fsprivate) -#define XFS_BUF_SET_FSPRIVATE(bp,val) (bp)->b_fsprivate =3D (void *)(val) +#define XFS_BUF_FSPRIVATE(bp,type) ((type)(bp)->b_fspriv) +#define XFS_BUF_SET_FSPRIVATE(bp,val) (bp)->b_fspriv =3D (void *)(val) #define XFS_BUF_FSPRIVATE2(bp,type) ((type)(bp)->b_fsprivate2) #define XFS_BUF_SET_FSPRIVATE2(bp,val) (bp)->b_fsprivate2 =3D (void *)(val) #define XFS_BUF_FSPRIVATE3(bp,type) ((type)(bp)->b_fsprivate3) @@ -392,6 +394,7 @@ typedef struct xfs_log_item { struct xfs_log_item_desc *li_desc; /* ptr to current desc*/ struct xfs_mount *li_mountp; /* ptr to fs mount */ uint li_type; /* item type */ + xfs_lsn_t li_lsn; } xfs_log_item_t; =20 typedef struct xfs_inode_log_item { diff --git a/include/xfs_alloc_btree.h b/include/xfs_alloc_btree.h index 7e89a2b..70c3ea0 100644 --- a/include/xfs_alloc_btree.h +++ b/include/xfs_alloc_btree.h @@ -31,8 +31,10 @@ struct xfs_mount; * by blockcount and blockno. All blocks look the same to make the code * simpler; if we have time later, we'll make the optimizations. */ -#define XFS_ABTB_MAGIC 0x41425442 /* 'ABTB' for bno tree */ -#define XFS_ABTC_MAGIC 0x41425443 /* 'ABTC' for cnt tree */ +#define XFS_ABTB_MAGIC 0x41425442 /* 'ABTB' for bno tree */ +#define XFS_ABTB_CRC_MAGIC 0x41423342 /* 'AB3B' */ +#define XFS_ABTC_MAGIC 0x41425443 /* 'ABTC' for cnt tree */ +#define XFS_ABTC_CRC_MAGIC 0x41423343 /* 'AB3C' */ =20 /* * Data record/key structure @@ -59,10 +61,11 @@ typedef __be32 xfs_alloc_ptr_t; =20 /* * Btree block header size depends on a superblock flag. - * - * (not quite yet, but soon) */ -#define XFS_ALLOC_BLOCK_LEN(mp) XFS_BTREE_SBLOCK_LEN +#define XFS_ALLOC_BLOCK_LEN(mp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + XFS_BTREE_SBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD : \ + XFS_BTREE_SBLOCK_LEN) =20 /* * Record, key, and pointer address macros for btree blocks. diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index 88469ca..8a28b89 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -18,7 +18,8 @@ #ifndef __XFS_BMAP_BTREE_H__ #define __XFS_BMAP_BTREE_H__ =20 -#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ +#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ +#define XFS_BMAP_CRC_MAGIC 0x424d4133 /* 'BMA3' */ =20 struct xfs_btree_cur; struct xfs_btree_block; @@ -136,10 +137,11 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; =20 /* * Btree block header size depends on a superblock flag. - * - * (not quite yet, but soon) */ -#define XFS_BMBT_BLOCK_LEN(mp) XFS_BTREE_LBLOCK_LEN +#define XFS_BMBT_BLOCK_LEN(mp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + XFS_BTREE_LBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD : \ + XFS_BTREE_LBLOCK_LEN) =20 #define XFS_BMBT_REC_ADDR(mp, block, index) \ ((xfs_bmbt_rec_t *) \ @@ -186,12 +188,12 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; #define XFS_BMAP_BROOT_PTR_ADDR(mp, bb, i, sz) \ XFS_BMBT_PTR_ADDR(mp, bb, i, xfs_bmbt_maxrecs(mp, sz, 0)) =20 -#define XFS_BMAP_BROOT_SPACE_CALC(nrecs) \ - (int)(XFS_BTREE_LBLOCK_LEN + \ +#define XFS_BMAP_BROOT_SPACE_CALC(mp, nrecs) \ + (int)(XFS_BMBT_BLOCK_LEN(mp) + \ ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))) =20 -#define XFS_BMAP_BROOT_SPACE(bb) \ - (XFS_BMAP_BROOT_SPACE_CALC(be16_to_cpu((bb)->bb_numrecs))) +#define XFS_BMAP_BROOT_SPACE(mp, bb) \ + (XFS_BMAP_BROOT_SPACE_CALC(mp, be16_to_cpu((bb)->bb_numrecs))) #define XFS_BMDR_SPACE_CALC(nrecs) \ (int)(sizeof(xfs_bmdr_block_t) + \ ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))) @@ -204,7 +206,7 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; /* * Prototypes for xfs_bmap.c to call. */ -extern void xfs_bmdr_to_bmbt(struct xfs_mount *, xfs_bmdr_block_t *, int, +extern void xfs_bmdr_to_bmbt(struct xfs_inode *, xfs_bmdr_block_t *, int, struct xfs_btree_block *, int); extern void xfs_bmbt_get_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s); extern xfs_filblks_t xfs_bmbt_get_blockcount(xfs_bmbt_rec_host_t *r); diff --git a/include/xfs_btree.h b/include/xfs_btree.h index be1eb23..02f89d8 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -42,11 +42,15 @@ extern kmem_zone_t *xfs_btree_cur_zone; * Generic btree header. * * This is a combination of the actual format used on disk for short and l= ong - * format btrees. The first three fields are shared by both format, but - * the pointers are different and should be used with care. + * format btrees. The first three fields are shared by both format, but t= he + * pointers are different and should be used with care. * - * To get the size of the actual short or long form headers please use - * the size macros below. Never use sizeof(xfs_btree_block). + * To get the size of the actual short or long form headers please use the= size + * macros below. Never use sizeof(xfs_btree_block). + * + * The blkno, crc, lsn, owner and uuid fields are only available in filesy= stems + * with the crc feature bit, and all accesses to them must be conditional = on + * that flag. */ struct xfs_btree_block { __be32 bb_magic; /* magic number for block type */ @@ -56,16 +60,35 @@ struct xfs_btree_block { struct { __be32 bb_leftsib; __be32 bb_rightsib; + + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be32 bb_owner; + __le32 bb_crc; } s; /* short form pointers */ struct { __be64 bb_leftsib; __be64 bb_rightsib; + + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be64 bb_owner; + __le32 bb_crc; + __be32 bb_pad; /* padding for alignment */ } l; /* long form pointers */ } bb_u; /* rest */ }; =20 #define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */ #define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */ +#define XFS_BTREE_CRCBLOCK_ADD 32 /* size of blkno + crc + uuid */ + +#define XFS_BTREE_SBLOCK_CRC_OFF \ + offsetof(struct xfs_btree_block, bb_u.s.bb_crc) +#define XFS_BTREE_LBLOCK_CRC_OFF \ + offsetof(struct xfs_btree_block, bb_u.l.bb_crc) =20 =20 /* @@ -101,13 +124,11 @@ union xfs_btree_rec { #define XFS_BB_NUMRECS 0x04 #define XFS_BB_LEFTSIB 0x08 #define XFS_BB_RIGHTSIB 0x10 +#define XFS_BB_BLKNO 0x20 #define XFS_BB_NUM_BITS 5 #define XFS_BB_ALL_BITS ((1 << XFS_BB_NUM_BITS) - 1) - -/* - * Magic numbers for btree blocks. - */ -extern const __uint32_t xfs_magics[]; +#define XFS_BB_NUM_BITS_CRC 8 +#define XFS_BB_ALL_BITS_CRC ((1 << XFS_BB_NUM_BITS_CRC) - 1) =20 /* * Generic stats interface @@ -275,6 +296,7 @@ typedef struct xfs_btree_cur #define XFS_BTREE_LONG_PTRS (1<<0) /* pointers are 64bits long */ #define XFS_BTREE_ROOT_IN_INODE (1<<1) /* root may be variable size */ #define XFS_BTREE_LASTREC_UPDATE (1<<2) /* track last rec externally */ +#define XFS_BTREE_CRC_BLOCKS (1<<3) /* uses extended btree blocks */ =20 =20 #define XFS_BTREE_NOERROR 0 @@ -412,8 +434,20 @@ xfs_btree_init_block( __u32 magic, __u16 level, __u16 numrecs, + __u64 owner, unsigned int flags); =20 +void +xfs_btree_init_block_int( + struct xfs_mount *mp, + struct xfs_btree_block *buf, + xfs_daddr_t blkno, + __u32 magic, + __u16 level, + __u16 numrecs, + __u64 owner, + unsigned int flags); + /* * Common btree core entry points. */ @@ -427,6 +461,14 @@ int xfs_btree_delete(struct xfs_btree_cur *, int *); int xfs_btree_get_rec(struct xfs_btree_cur *, union xfs_btree_rec **, int = *); =20 /* + * btree block CRC helpers + */ +void xfs_btree_lblock_calc_crc(struct xfs_buf *); +bool xfs_btree_lblock_verify_crc(struct xfs_buf *); +void xfs_btree_sblock_calc_crc(struct xfs_buf *); +bool xfs_btree_sblock_verify_crc(struct xfs_buf *); + +/* * Internal btree helpers also used by xfs_bmap.c. */ void xfs_btree_log_block(struct xfs_btree_cur *, struct xfs_buf *, int); diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index ee36c88..101ef83 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -24,19 +24,33 @@ extern kmem_zone_t *xfs_buf_item_zone; * This flag indicates that the buffer contains on disk inodes * and requires special recovery handling. */ -#define XFS_BLF_INODE_BUF 0x1 +#define XFS_BLF_INODE_BUF (1<<0) /* * This flag indicates that the buffer should not be replayed * during recovery because its blocks are being freed. */ -#define XFS_BLF_CANCEL 0x2 +#define XFS_BLF_CANCEL (1<<1) + /* * This flag indicates that the buffer contains on disk * user or group dquots and may require special recovery handling. */ -#define XFS_BLF_UDQUOT_BUF 0x4 -#define XFS_BLF_PDQUOT_BUF 0x8 -#define XFS_BLF_GDQUOT_BUF 0x10 +#define XFS_BLF_UDQUOT_BUF (1<<2) +#define XFS_BLF_PDQUOT_BUF (1<<3) +#define XFS_BLF_GDQUOT_BUF (1<<4) + +/* + * all buffers now need flags to tell recovery where the magic number + * is so that it can verify and calculate the CRCs on the buffer correctly + * once the changes have been replayed into the buffer. + */ +#define XFS_BLF_BTREE_BUF (1<<5) + +#define XFS_BLF_TYPE_MASK \ + (XFS_BLF_UDQUOT_BUF | \ + XFS_BLF_PDQUOT_BUF | \ + XFS_BLF_GDQUOT_BUF | \ + XFS_BLF_BTREE_BUF) =20 #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index 88a3368..6b5bd17 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -107,8 +107,8 @@ typedef enum xfs_dinode_fmt { #define XFS_LITINO(mp, version) \ ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) =20 -#define XFS_BROOT_SIZE_ADJ \ - (XFS_BTREE_LBLOCK_LEN - sizeof(xfs_bmdr_block_t)) +#define XFS_BROOT_SIZE_ADJ(ip) \ + (XFS_BMBT_BLOCK_LEN((ip)->i_mount) - sizeof(xfs_bmdr_block_t)) =20 /* * Inode data & attribute fork sizes, per inode. diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index 25c0239..a1bfa7a 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -29,7 +29,8 @@ struct xfs_mount; /* * There is a btree for the inode map per allocation group. */ -#define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ +#define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ +#define XFS_IBT_CRC_MAGIC 0x49414233 /* 'IAB3' */ =20 typedef __uint64_t xfs_inofree_t; #define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) @@ -76,10 +77,11 @@ typedef __be32 xfs_inobt_ptr_t; =20 /* * Btree block header size depends on a superblock flag. - * - * (not quite yet, but soon) */ -#define XFS_INOBT_BLOCK_LEN(mp) XFS_BTREE_SBLOCK_LEN +#define XFS_INOBT_BLOCK_LEN(mp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + XFS_BTREE_SBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD : \ + XFS_BTREE_SBLOCK_LEN) =20 /* * Record, key, and pointer address macros for btree blocks. diff --git a/include/xfs_trans.h b/include/xfs_trans.h index acf1381..a9bd826 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -500,6 +500,8 @@ void xfs_trans_inode_buf(xfs_trans_t *, struct xfs_buf= *); void xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); +void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, + uint); void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index e75edd0..e9cc7b1 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -323,17 +323,17 @@ libxfs_bcompare(struct cache_node *node, cache_key_t = key) =20 #ifdef IO_BCOMPARE_CHECK if (bp->b_dev =3D=3D bkey->device && - bp->b_blkno =3D=3D bkey->blkno && + bp->b_bn =3D=3D bkey->blkno && bp->b_bcount !=3D BBTOB(bkey->bblen)) fprintf(stderr, "%lx: Badness in key lookup (length)\n" "bp=3D(bno 0x%llx, len %u bytes) key=3D(bno 0x%llx, len %u bytes)\n", pthread_self(), - (unsigned long long)bp->b_blkno, (int)bp->b_bcount, + (unsigned long long)bp->b_bn, (int)bp->b_bcount, (unsigned long long)bkey->blkno, BBTOB(bkey->bblen)); #endif =20 return (bp->b_dev =3D=3D bkey->device && - bp->b_blkno =3D=3D bkey->blkno && + bp->b_bn =3D=3D bkey->blkno && bp->b_bcount =3D=3D BBTOB(bkey->bblen)); } =20 @@ -341,7 +341,7 @@ void libxfs_bprint(xfs_buf_t *bp) { fprintf(stderr, "Buffer 0x%p blkno=3D%llu bytes=3D%u flags=3D0x%x count= =3D%u\n", - bp, (unsigned long long)bp->b_blkno, (unsigned)bp->b_bcount, + bp, (unsigned long long)bp->b_bn, (unsigned)bp->b_bcount, bp->b_flags, bp->b_node.cn_count); } =20 @@ -349,7 +349,7 @@ static void __initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int bytes) { bp->b_flags =3D 0; - bp->b_blkno =3D bno; + bp->b_bn =3D bno; bp->b_bcount =3D bytes; bp->b_length =3D BTOBB(bytes); bp->b_dev =3D device; @@ -613,7 +613,7 @@ libxfs_purgebuf(xfs_buf_t *bp) struct xfs_bufkey key =3D {0}; =20 key.device =3D bp->b_dev; - key.blkno =3D bp->b_blkno; + key.blkno =3D bp->b_bn; key.bblen =3D bp->b_bcount >> BBSHIFT; =20 cache_node_purge(libxfs_bcache, &key, (struct cache_node *)bp); @@ -669,7 +669,7 @@ libxfs_readbufr(dev_t dev, xfs_daddr_t blkno, xfs_buf_t= *bp, int len, int flags) error =3D __read_buf(fd, bp->b_addr, bytes, LIBXFS_BBTOOFF64(blkno), flag= s); if (!error && bp->b_dev =3D=3D dev && - bp->b_blkno =3D=3D blkno && + bp->b_bn =3D=3D blkno && bp->b_bcount =3D=3D bytes) bp->b_flags |=3D LIBXFS_B_UPTODATE; #ifdef IO_DEBUG @@ -736,7 +736,7 @@ libxfs_readbuf_map(dev_t dev, struct xfs_buf_map *map, = int nmaps, int flags) #ifdef IO_DEBUG printf("%lx: %s: read %lu bytes, error %d, blkno=3D%llu(%llu), %p\n", pthread_self(), __FUNCTION__, buf - (char *)bp->b_addr, error, - (long long)LIBXFS_BBTOOFF64(bp->b_blkno), (long long)bp->b_blkno, bp); + (long long)LIBXFS_BBTOOFF64(bp->b_bn), (long long)bp->b_bn, bp); #endif return bp; } @@ -772,7 +772,7 @@ libxfs_writebufr(xfs_buf_t *bp) =20 if (!(bp->b_flags & LIBXFS_B_DISCONTIG)) { error =3D __write_buf(fd, bp->b_addr, bp->b_bcount, - LIBXFS_BBTOOFF64(bp->b_blkno), bp->b_flags); + LIBXFS_BBTOOFF64(bp->b_bn), bp->b_flags); } else { int i; char *buf =3D bp->b_addr; @@ -794,8 +794,8 @@ libxfs_writebufr(xfs_buf_t *bp) #ifdef IO_DEBUG printf("%lx: %s: wrote %u bytes, blkno=3D%llu(%llu), %p\n", pthread_self(), __FUNCTION__, bp->b_bcount, - (long long)LIBXFS_BBTOOFF64(bp->b_blkno), - (long long)bp->b_blkno, bp); + (long long)LIBXFS_BBTOOFF64(bp->b_bn), + (long long)bp->b_bn, bp); #endif if (!error) { bp->b_flags |=3D LIBXFS_B_UPTODATE; @@ -826,7 +826,7 @@ libxfs_iomove(xfs_buf_t *bp, uint boff, int len, void *= data, int flags) if (boff + len > bp->b_bcount) { printf("Badness, iomove out of range!\n" "bp=3D(bno 0x%llx, bytes %u) range=3D(boff %u, bytes %u)\n", - (long long)bp->b_blkno, bp->b_bcount, boff, len); + (long long)bp->b_bn, bp->b_bcount, boff, len); abort(); } #endif diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 9fbe261..b3b45bb 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -249,6 +249,7 @@ roundup_pow_of_two(uint v) #define xfs_trans_agblocks_delta(tp, d) #define xfs_trans_agflist_delta(tp, d) #define xfs_trans_agbtree_delta(tp, d) +#define xfs_trans_buf_set_type(tp, bp, t) =20 #define xfs_buf_readahead(a,b,c,ops) ((void) 0) /* no readahead */ #define xfs_buf_readahead_map(a,b,c,ops) ((void) 0) /* no readahead */ @@ -314,6 +315,9 @@ do { \ #define xfs_trans_unreserve_quota_nblks(t,i,b,n,f) ((void) 0) #define xfs_qm_dqattach(i,f) (0) =20 +#define uuid_copy(s,d) platform_uuid_copy((s),(d)) +#define uuid_equal(s,d) (platform_uuid_compare((s),(d)) =3D=3D 0) + /* * Prototypes for kernel static functions that are aren't in their * associated header files diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index dc9ed48..949c96d 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -254,7 +254,7 @@ xfs_allocbt_key_diff( return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; } =20 -static void +static bool xfs_allocbt_verify( struct xfs_buf *bp) { @@ -262,66 +262,98 @@ xfs_allocbt_verify( struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); struct xfs_perag *pag =3D bp->b_pag; unsigned int level; - int sblock_ok; /* block passes checks */ =20 /* * magic number and level verification * - * During growfs operations, we can't verify the exact level as the - * perag is not fully initialised and hence not attached to the buffer. - * In this case, check against the maximum tree depth. + * During growfs operations, we can't verify the exact level or owner as + * the perag is not fully initialised and hence not attached to the + * buffer. In this case, check against the maximum tree depth. */ level =3D be16_to_cpu(block->bb_level); switch (cpu_to_be32(block->bb_magic)) { + case XFS_ABTB_CRC_MAGIC: + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.s.bb_blkno !=3D cpu_to_be64(bp->b_bn)) + return false; + if (pag && + be32_to_cpu(block->bb_u.s.bb_owner) !=3D pag->pag_agno) + return false; + /* fall through */ case XFS_ABTB_MAGIC: - if (pag) - sblock_ok =3D level < pag->pagf_levels[XFS_BTNUM_BNOi]; - else - sblock_ok =3D level < mp->m_ag_maxlevels; + if (pag) { + if (level >=3D pag->pagf_levels[XFS_BTNUM_BNOi]) + return false; + } else if (level >=3D mp->m_ag_maxlevels) + return false; break; + case XFS_ABTC_CRC_MAGIC: + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.s.bb_blkno !=3D cpu_to_be64(bp->b_bn)) + return false; + if (pag && + be32_to_cpu(block->bb_u.s.bb_owner) !=3D pag->pag_agno) + return false; + /* fall through */ case XFS_ABTC_MAGIC: - if (pag) - sblock_ok =3D level < pag->pagf_levels[XFS_BTNUM_CNTi]; - else - sblock_ok =3D level < mp->m_ag_maxlevels; + if (pag) { + if (level >=3D pag->pagf_levels[XFS_BTNUM_CNTi]) + return false; + } else if (level >=3D mp->m_ag_maxlevels) + return false; break; default: - sblock_ok =3D 0; - break; + return false; } =20 /* numrecs verification */ - sblock_ok =3D sblock_ok && - be16_to_cpu(block->bb_numrecs) <=3D mp->m_alloc_mxr[level !=3D 0]; + if (be16_to_cpu(block->bb_numrecs) > mp->m_alloc_mxr[level !=3D 0]) + return false; =20 /* sibling pointer verification */ - sblock_ok =3D sblock_ok && - (block->bb_u.s.bb_leftsib =3D=3D cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_leftsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_leftsib && - (block->bb_u.s.bb_rightsib =3D=3D cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_rightsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_rightsib; - - if (!sblock_ok) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } + if (!block->bb_u.s.bb_leftsib || + (be32_to_cpu(block->bb_u.s.bb_leftsib) >=3D mp->m_sb.sb_agblocks && + block->bb_u.s.bb_leftsib !=3D cpu_to_be32(NULLAGBLOCK))) + return false; + if (!block->bb_u.s.bb_rightsib || + (be32_to_cpu(block->bb_u.s.bb_rightsib) >=3D mp->m_sb.sb_agblocks && + block->bb_u.s.bb_rightsib !=3D cpu_to_be32(NULLAGBLOCK))) + return false; + + return true; } =20 static void xfs_allocbt_read_verify( struct xfs_buf *bp) { - xfs_allocbt_verify(bp); + if (!(xfs_btree_sblock_verify_crc(bp) && + xfs_allocbt_verify(bp))) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } =20 static void xfs_allocbt_write_verify( struct xfs_buf *bp) { - xfs_allocbt_verify(bp); + if (!xfs_allocbt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + xfs_btree_sblock_calc_crc(bp); + } =20 const struct xfs_buf_ops xfs_allocbt_buf_ops =3D { @@ -499,6 +531,9 @@ xfs_allocbt_init_cursor( cur->bc_private.a.agbp =3D agbp; cur->bc_private.a.agno =3D agno; =20 + if (xfs_sb_version_hascrc(&mp->m_sb)) + cur->bc_flags |=3D XFS_BTREE_CRC_BLOCKS; + return cur; } =20 diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 426130f..85cb31d 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -201,7 +201,7 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) return 0; return dp->i_d.di_forkoff; } - dsize =3D XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot); + dsize =3D XFS_BMAP_BROOT_SPACE(mp, dp->i_df.if_broot); break; } =20 diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index c8232a9..5e736a5 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -407,11 +407,15 @@ xfs_bmap_sanity_check( { struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); =20 - if (block->bb_magic !=3D cpu_to_be32(XFS_BMAP_MAGIC) || - be16_to_cpu(block->bb_level) !=3D level || + if (block->bb_magic !=3D cpu_to_be32(XFS_BMAP_CRC_MAGIC) && + block->bb_magic !=3D cpu_to_be32(XFS_BMAP_MAGIC)) + return 0; + + if (be16_to_cpu(block->bb_level) !=3D level || be16_to_cpu(block->bb_numrecs) =3D=3D 0 || be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level !=3D 0]) return 0; + return 1; } =20 @@ -914,6 +918,7 @@ xfs_bmap_extents_to_btree( xfs_extnum_t nextents; /* number of file extents */ xfs_bmbt_ptr_t *pp; /* root block address pointer */ =20 + mp =3D ip->i_mount; ifp =3D XFS_IFORK_PTR(ip, whichfork); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) =3D=3D XFS_DINODE_FMT_EXTENTS); =20 @@ -927,16 +932,18 @@ xfs_bmap_extents_to_btree( * Fill in the root. */ block =3D ifp->if_broot; - block->bb_magic =3D cpu_to_be32(XFS_BMAP_MAGIC); - block->bb_level =3D cpu_to_be16(1); - block->bb_numrecs =3D cpu_to_be16(1); - block->bb_u.l.bb_leftsib =3D cpu_to_be64(NULLDFSBNO); - block->bb_u.l.bb_rightsib =3D cpu_to_be64(NULLDFSBNO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block_int(mp, block, XFS_BUF_DADDR_NULL, + XFS_BMAP_CRC_MAGIC, 1, 1, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block_int(mp, block, XFS_BUF_DADDR_NULL, + XFS_BMAP_MAGIC, 1, 1, ip->i_ino, + XFS_BTREE_LONG_PTRS); =20 /* * Need a cursor. Can't allocate until bb_level is filled in. */ - mp =3D ip->i_mount; cur =3D xfs_bmbt_init_cursor(mp, tp, ip, whichfork); cur->bc_private.b.firstblock =3D *firstblock; cur->bc_private.b.flist =3D flist; @@ -985,10 +992,15 @@ xfs_bmap_extents_to_btree( */ abp->b_ops =3D &xfs_bmbt_buf_ops; ablock =3D XFS_BUF_TO_BLOCK(abp); - ablock->bb_magic =3D cpu_to_be32(XFS_BMAP_MAGIC); - ablock->bb_level =3D 0; - ablock->bb_u.l.bb_leftsib =3D cpu_to_be64(NULLDFSBNO); - ablock->bb_u.l.bb_rightsib =3D cpu_to_be64(NULLDFSBNO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block_int(mp, ablock, abp->b_bn, + XFS_BMAP_CRC_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block_int(mp, ablock, abp->b_bn, + XFS_BMAP_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS); + arp =3D XFS_BMBT_REC_ADDR(mp, ablock, 1); nextents =3D ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); for (cnt =3D i =3D 0; i < nextents; i++) { @@ -1016,8 +1028,8 @@ xfs_bmap_extents_to_btree( * Do all this logging at the end so that * the root is at the right level. */ - xfs_btree_log_block(cur, abp, XFS_BB_ALL_BITS); xfs_btree_log_recs(cur, abp, 1, be16_to_cpu(ablock->bb_numrecs)); + xfs_btree_log_block(cur, abp, XFS_BB_ALL_BITS); ASSERT(*curp =3D=3D NULL); *curp =3D cur; *logflagsp =3D XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork); @@ -1038,7 +1050,8 @@ xfs_bmap_local_to_extents( xfs_extlen_t total, /* total blocks needed by transaction */ int *logflagsp, /* inode logging flags */ int whichfork, - void (*init_fn)(struct xfs_buf *bp, + void (*init_fn)(struct xfs_trans *tp, + struct xfs_buf *bp, struct xfs_inode *ip, struct xfs_ifork *ifp)) { @@ -1090,7 +1103,7 @@ xfs_bmap_local_to_extents( bp =3D xfs_btree_get_bufl(args.mp, tp, args.fsbno, 0); =20 /* initialise the block and copy the data */ - init_fn(bp, ip, ifp); + init_fn(tp, bp, ip, ifp); =20 /* account for the change in fork size and log everything */ xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1); @@ -1197,16 +1210,19 @@ xfs_bmap_add_attrfork_extents( */ STATIC void xfs_bmap_local_to_extents_init_fn( + struct xfs_trans *tp, struct xfs_buf *bp, struct xfs_inode *ip, struct xfs_ifork *ifp) { bp->b_ops =3D &xfs_bmbt_buf_ops; memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); + xfs_trans_buf_set_type(tp, bp, XFS_BLF_BTREE_BUF); } =20 STATIC void xfs_symlink_local_to_remote( + struct xfs_trans *tp, struct xfs_buf *bp, struct xfs_inode *ip, struct xfs_ifork *ifp) @@ -1225,8 +1241,7 @@ xfs_symlink_local_to_remote( * * XXX (dgc): investigate whether directory conversion can use the generic * formatting callout. It should be possible - it's just a very complex - * formatter. it would also require passing the transaction through to the= init - * function. + * formatter. */ STATIC int /* error */ xfs_bmap_add_attrfork_local( diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 836f52f..473db4a 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -38,24 +38,31 @@ xfs_extent_state( */ void xfs_bmdr_to_bmbt( - struct xfs_mount *mp, + struct xfs_inode *ip, xfs_bmdr_block_t *dblock, int dblocklen, struct xfs_btree_block *rblock, int rblocklen) { + struct xfs_mount *mp =3D ip->i_mount; int dmxr; xfs_bmbt_key_t *fkp; __be64 *fpp; xfs_bmbt_key_t *tkp; __be64 *tpp; =20 - rblock->bb_magic =3D cpu_to_be32(XFS_BMAP_MAGIC); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block_int(mp, rblock, XFS_BUF_DADDR_NULL, + XFS_BMAP_CRC_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block_int(mp, rblock, XFS_BUF_DADDR_NULL, + XFS_BMAP_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS); + rblock->bb_level =3D dblock->bb_level; ASSERT(be16_to_cpu(rblock->bb_level) > 0); rblock->bb_numrecs =3D dblock->bb_numrecs; - rblock->bb_u.l.bb_leftsib =3D cpu_to_be64(NULLDFSBNO); - rblock->bb_u.l.bb_rightsib =3D cpu_to_be64(NULLDFSBNO); dmxr =3D xfs_bmdr_maxrecs(mp, dblocklen, 0); fkp =3D XFS_BMDR_KEY_ADDR(dblock, 1); tkp =3D XFS_BMBT_KEY_ADDR(mp, rblock, 1); @@ -403,7 +410,13 @@ xfs_bmbt_to_bmdr( xfs_bmbt_key_t *tkp; __be64 *tpp; =20 - ASSERT(rblock->bb_magic =3D=3D cpu_to_be32(XFS_BMAP_MAGIC)); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + ASSERT(rblock->bb_magic =3D=3D cpu_to_be32(XFS_BMAP_CRC_MAGIC)); + ASSERT(uuid_equal(&rblock->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid)); + ASSERT(rblock->bb_u.l.bb_blkno =3D=3D + cpu_to_be64(XFS_BUF_DADDR_NULL)); + } else + ASSERT(rblock->bb_magic =3D=3D cpu_to_be32(XFS_BMAP_MAGIC)); ASSERT(rblock->bb_u.l.bb_leftsib =3D=3D cpu_to_be64(NULLDFSBNO)); ASSERT(rblock->bb_u.l.bb_rightsib =3D=3D cpu_to_be64(NULLDFSBNO)); ASSERT(rblock->bb_level !=3D 0); @@ -687,45 +700,59 @@ xfs_bmbt_key_diff( cur->bc_rec.b.br_startoff; } =20 -static void +static bool xfs_bmbt_verify( struct xfs_buf *bp) { struct xfs_mount *mp =3D bp->b_target->bt_mount; struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); unsigned int level; - int lblock_ok; /* block passes checks */ =20 - /* magic number and level verification. + switch (be32_to_cpu(block->bb_magic)) { + case XFS_BMAP_CRC_MAGIC: + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.l.bb_blkno !=3D cpu_to_be64(bp->b_bn)) + return false; + /* + * XXX: need a better way of verifying the owner here. Right now + * just make sure there has been one set. + */ + if (be64_to_cpu(block->bb_u.l.bb_owner) =3D=3D 0) + return false; + /* fall through */ + case XFS_BMAP_MAGIC: + break; + default: + return false; + } + + /* + * numrecs and level verification. * - * We don't know waht fork we belong to, so just verify that the level + * We don't know what fork we belong to, so just verify that the level * is less than the maximum of the two. Later checks will be more * precise. */ level =3D be16_to_cpu(block->bb_level); - lblock_ok =3D block->bb_magic =3D=3D cpu_to_be32(XFS_BMAP_MAGIC) && - level < MAX(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1]); - - /* numrecs verification */ - lblock_ok =3D lblock_ok && - be16_to_cpu(block->bb_numrecs) <=3D mp->m_bmap_dmxr[level !=3D 0]; + if (level > MAX(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1])) + return false; + if (be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level !=3D 0]) + return false; =20 /* sibling pointer verification */ - lblock_ok =3D lblock_ok && - block->bb_u.l.bb_leftsib && - (block->bb_u.l.bb_leftsib =3D=3D cpu_to_be64(NULLDFSBNO) || - XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_leftsib))) && - block->bb_u.l.bb_rightsib && - (block->bb_u.l.bb_rightsib =3D=3D cpu_to_be64(NULLDFSBNO) || - XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_rightsib))); - - if (!lblock_ok) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } + if (!block->bb_u.l.bb_leftsib || + (block->bb_u.l.bb_leftsib !=3D cpu_to_be64(NULLDFSBNO) && + !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_leftsib)))) + return false; + if (!block->bb_u.l.bb_rightsib || + (block->bb_u.l.bb_rightsib !=3D cpu_to_be64(NULLDFSBNO) && + !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_rightsib)))) + return false; + + return true; } =20 static void @@ -733,13 +760,29 @@ xfs_bmbt_read_verify( struct xfs_buf *bp) { xfs_bmbt_verify(bp); + if (!(xfs_btree_lblock_verify_crc(bp) && + xfs_bmbt_verify(bp))) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + } =20 static void xfs_bmbt_write_verify( struct xfs_buf *bp) { - xfs_bmbt_verify(bp); + if (!xfs_bmbt_verify(bp)) { + xfs_warn(bp->b_target->bt_mount, "bmbt daddr 0x%llx failed", bp->b_bn); + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + xfs_btree_lblock_calc_crc(bp); } =20 const struct xfs_buf_ops xfs_bmbt_buf_ops =3D { @@ -913,6 +956,8 @@ xfs_bmbt_init_cursor( =20 cur->bc_ops =3D &xfs_bmbt_ops; cur->bc_flags =3D XFS_BTREE_LONG_PTRS | XFS_BTREE_ROOT_IN_INODE; + if (xfs_sb_version_hascrc(&mp->m_sb)) + cur->bc_flags |=3D XFS_BTREE_CRC_BLOCKS; =20 cur->bc_private.b.forksize =3D XFS_IFORK_SIZE(ip, whichfork); cur->bc_private.b.ip =3D ip; diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index c35269b..a7c19e9 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -26,9 +26,13 @@ kmem_zone_t *xfs_btree_cur_zone; /* * Btree magic numbers. */ -const __uint32_t xfs_magics[XFS_BTNUM_MAX] =3D { - XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC +static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] =3D { + { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC }, + { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, + XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC } }; +#define xfs_btree_magic(cur) \ + xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] =20 =20 STATIC int /* error (0 or EFSCORRUPTED) */ @@ -38,30 +42,38 @@ xfs_btree_check_lblock( int level, /* level of the btree block */ struct xfs_buf *bp) /* buffer for block, if any */ { - int lblock_ok; /* block passes checks */ + int lblock_ok =3D 1; /* block passes checks */ struct xfs_mount *mp; /* file system mount point */ =20 mp =3D cur->bc_mp; - lblock_ok =3D - be32_to_cpu(block->bb_magic) =3D=3D xfs_magics[cur->bc_btnum] && + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + lblock_ok =3D lblock_ok && + uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid) && + block->bb_u.l.bb_blkno =3D=3D cpu_to_be64( + bp ? bp->b_bn : XFS_BUF_DADDR_NULL); + } + + lblock_ok =3D lblock_ok && + be32_to_cpu(block->bb_magic) =3D=3D xfs_btree_magic(cur) && be16_to_cpu(block->bb_level) =3D=3D level && be16_to_cpu(block->bb_numrecs) <=3D cur->bc_ops->get_maxrecs(cur, level) && block->bb_u.l.bb_leftsib && (block->bb_u.l.bb_leftsib =3D=3D cpu_to_be64(NULLDFSBNO) || XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_leftsib))) && + be64_to_cpu(block->bb_u.l.bb_leftsib))) && block->bb_u.l.bb_rightsib && (block->bb_u.l.bb_rightsib =3D=3D cpu_to_be64(NULLDFSBNO) || XFS_FSB_SANITY_CHECK(mp, - be64_to_cpu(block->bb_u.l.bb_rightsib))); + be64_to_cpu(block->bb_u.l.bb_rightsib))); + if (unlikely(XFS_TEST_ERROR(!lblock_ok, mp, XFS_ERRTAG_BTREE_CHECK_LBLOCK, XFS_RANDOM_BTREE_CHECK_LBLOCK))) { if (bp) trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_ERROR_REPORT("xfs_btree_check_lblock", XFS_ERRLEVEL_LOW, - mp); + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); } return 0; @@ -74,16 +86,26 @@ xfs_btree_check_sblock( int level, /* level of the btree block */ struct xfs_buf *bp) /* buffer containing block */ { + struct xfs_mount *mp; /* file system mount point */ struct xfs_buf *agbp; /* buffer for ag. freespace struct */ struct xfs_agf *agf; /* ag. freespace structure */ xfs_agblock_t agflen; /* native ag. freespace length */ - int sblock_ok; /* block passes checks */ + int sblock_ok =3D 1; /* block passes checks */ =20 + mp =3D cur->bc_mp; agbp =3D cur->bc_private.a.agbp; agf =3D XFS_BUF_TO_AGF(agbp); agflen =3D be32_to_cpu(agf->agf_length); - sblock_ok =3D - be32_to_cpu(block->bb_magic) =3D=3D xfs_magics[cur->bc_btnum] && + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + sblock_ok =3D sblock_ok && + uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid) && + block->bb_u.s.bb_blkno =3D=3D cpu_to_be64( + bp ? bp->b_bn : XFS_BUF_DADDR_NULL); + } + + sblock_ok =3D sblock_ok && + be32_to_cpu(block->bb_magic) =3D=3D xfs_btree_magic(cur) && be16_to_cpu(block->bb_level) =3D=3D level && be16_to_cpu(block->bb_numrecs) <=3D cur->bc_ops->get_maxrecs(cur, level) && @@ -93,13 +115,13 @@ xfs_btree_check_sblock( (block->bb_u.s.bb_rightsib =3D=3D cpu_to_be32(NULLAGBLOCK) || be32_to_cpu(block->bb_u.s.bb_rightsib) < agflen) && block->bb_u.s.bb_rightsib; - if (unlikely(XFS_TEST_ERROR(!sblock_ok, cur->bc_mp, + + if (unlikely(XFS_TEST_ERROR(!sblock_ok, mp, XFS_ERRTAG_BTREE_CHECK_SBLOCK, XFS_RANDOM_BTREE_CHECK_SBLOCK))) { if (bp) trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR("xfs_btree_check_sblock", - XFS_ERRLEVEL_LOW, cur->bc_mp, block); + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); } return 0; @@ -178,6 +200,72 @@ xfs_btree_check_ptr( #endif =20 /* + * Calculate CRC on the whole btree block and stuff it into the + * long-form btree header. + * + * Prior to calculting the CRC, pull the LSN out of the buffer log item an= d put + * it into the buffer so recovery knows what the last modifcation was that= made + * it to disk. + */ +void +xfs_btree_lblock_calc_crc( + struct xfs_buf *bp) +{ + struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + + if (!xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return; + if (bip) + block->bb_u.l.bb_lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_LBLOCK_CRC_OFF); +} + +bool +xfs_btree_lblock_verify_crc( + struct xfs_buf *bp) +{ + if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_LBLOCK_CRC_OFF); + return true; +} + +/* + * Calculate CRC on the whole btree block and stuff it into the + * short-form btree header. + * + * Prior to calculting the CRC, pull the LSN out of the buffer log item an= d put + * it into the buffer so recovery knows what the last modifcation was that= made + * it to disk. + */ +void +xfs_btree_sblock_calc_crc( + struct xfs_buf *bp) +{ + struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + + if (!xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return; + if (bip) + block->bb_u.s.bb_lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_SBLOCK_CRC_OFF); +} + +bool +xfs_btree_sblock_verify_crc( + struct xfs_buf *bp) +{ + if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_BTREE_SBLOCK_CRC_OFF); + return true; +} + +/* * Delete the btree cursor. */ void @@ -261,10 +349,8 @@ xfs_btree_dup_cursor( *ncur =3D NULL; return error; } - new->bc_bufs[i] =3D bp; - ASSERT(!xfs_buf_geterror(bp)); - } else - new->bc_bufs[i] =3D NULL; + } + new->bc_bufs[i] =3D bp; } *ncur =3D new; return 0; @@ -305,9 +391,17 @@ xfs_btree_dup_cursor( */ static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) { - return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? - XFS_BTREE_LBLOCK_LEN : - XFS_BTREE_SBLOCK_LEN; + size_t len; + + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) + len =3D XFS_BTREE_LBLOCK_LEN; + else + len =3D XFS_BTREE_SBLOCK_LEN; + + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) + len +=3D XFS_BTREE_CRCBLOCK_ADD; + + return len; } =20 /* @@ -807,43 +901,85 @@ xfs_btree_set_sibling( } =20 void +xfs_btree_init_block_int( + struct xfs_mount *mp, + struct xfs_btree_block *buf, + xfs_daddr_t blkno, + __u32 magic, + __u16 level, + __u16 numrecs, + __u64 owner, + unsigned int flags) +{ + buf->bb_magic =3D cpu_to_be32(magic); + buf->bb_level =3D cpu_to_be16(level); + buf->bb_numrecs =3D cpu_to_be16(numrecs); + + if (flags & XFS_BTREE_LONG_PTRS) { + buf->bb_u.l.bb_leftsib =3D cpu_to_be64(NULLDFSBNO); + buf->bb_u.l.bb_rightsib =3D cpu_to_be64(NULLDFSBNO); + if (flags & XFS_BTREE_CRC_BLOCKS) { + buf->bb_u.l.bb_blkno =3D cpu_to_be64(blkno); + buf->bb_u.l.bb_owner =3D cpu_to_be64(owner); + uuid_copy(&buf->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid); + buf->bb_u.l.bb_pad =3D 0; + } + } else { + /* owner is a 32 bit value on short blocks */ + __u32 __owner =3D (__u32)owner; + + buf->bb_u.s.bb_leftsib =3D cpu_to_be32(NULLAGBLOCK); + buf->bb_u.s.bb_rightsib =3D cpu_to_be32(NULLAGBLOCK); + if (flags & XFS_BTREE_CRC_BLOCKS) { + buf->bb_u.s.bb_blkno =3D cpu_to_be64(blkno); + buf->bb_u.s.bb_owner =3D cpu_to_be32(__owner); + uuid_copy(&buf->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid); + } + } +} + +void xfs_btree_init_block( struct xfs_mount *mp, struct xfs_buf *bp, __u32 magic, __u16 level, __u16 numrecs, + __u64 owner, unsigned int flags) { - struct xfs_btree_block *new =3D XFS_BUF_TO_BLOCK(bp); - - new->bb_magic =3D cpu_to_be32(magic); - new->bb_level =3D cpu_to_be16(level); - new->bb_numrecs =3D cpu_to_be16(numrecs); - - if (flags & XFS_BTREE_LONG_PTRS) { - new->bb_u.l.bb_leftsib =3D cpu_to_be64(NULLDFSBNO); - new->bb_u.l.bb_rightsib =3D cpu_to_be64(NULLDFSBNO); - } else { - new->bb_u.s.bb_leftsib =3D cpu_to_be32(NULLAGBLOCK); - new->bb_u.s.bb_rightsib =3D cpu_to_be32(NULLAGBLOCK); - } + xfs_btree_init_block_int(mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, + magic, level, numrecs, owner, flags); } =20 STATIC void xfs_btree_init_block_cur( struct xfs_btree_cur *cur, + struct xfs_buf *bp, int level, - int numrecs, - struct xfs_buf *bp) + int numrecs) { - xfs_btree_init_block(cur->bc_mp, bp, xfs_magics[cur->bc_btnum], - level, numrecs, cur->bc_flags); + __u64 owner; + + /* + * we can pull the owner from the cursor right now as the different + * owners align directly with the pointer size of the btree. This may + * change in future, but is safe for current users of the generic btree + * code. + */ + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) + owner =3D cur->bc_private.b.ip->i_ino; + else + owner =3D cur->bc_private.a.agno; + + xfs_btree_init_block_int(cur->bc_mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, + xfs_btree_magic(cur), level, numrecs, + owner, cur->bc_flags); } =20 /* * Return true if ptr is the last record in the btree and - * we need to track update=D1=95 to this record. The decision + * we need to track updates to this record. The decision * will be further refined in the update_lastrec method. */ STATIC int @@ -1091,6 +1227,7 @@ xfs_btree_log_keys( XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); =20 if (bp) { + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_key_offset(cur, first), xfs_btree_key_offset(cur, last + 1) - 1); @@ -1115,6 +1252,7 @@ xfs_btree_log_recs( XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); =20 + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_rec_offset(cur, first), xfs_btree_rec_offset(cur, last + 1) - 1); @@ -1139,6 +1277,7 @@ xfs_btree_log_ptrs( struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); int level =3D xfs_btree_get_level(block); =20 + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_ptr_offset(cur, first, level), xfs_btree_ptr_offset(cur, last + 1, level) - 1); @@ -1167,7 +1306,12 @@ xfs_btree_log_block( offsetof(struct xfs_btree_block, bb_numrecs), offsetof(struct xfs_btree_block, bb_u.s.bb_leftsib), offsetof(struct xfs_btree_block, bb_u.s.bb_rightsib), - XFS_BTREE_SBLOCK_LEN + offsetof(struct xfs_btree_block, bb_u.s.bb_blkno), + offsetof(struct xfs_btree_block, bb_u.s.bb_lsn), + offsetof(struct xfs_btree_block, bb_u.s.bb_uuid), + offsetof(struct xfs_btree_block, bb_u.s.bb_owner), + offsetof(struct xfs_btree_block, bb_u.s.bb_crc), + XFS_BTREE_SBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD }; static const short loffsets[] =3D { /* table of offsets (long) */ offsetof(struct xfs_btree_block, bb_magic), @@ -1175,17 +1319,40 @@ xfs_btree_log_block( offsetof(struct xfs_btree_block, bb_numrecs), offsetof(struct xfs_btree_block, bb_u.l.bb_leftsib), offsetof(struct xfs_btree_block, bb_u.l.bb_rightsib), - XFS_BTREE_LBLOCK_LEN + offsetof(struct xfs_btree_block, bb_u.l.bb_blkno), + offsetof(struct xfs_btree_block, bb_u.l.bb_lsn), + offsetof(struct xfs_btree_block, bb_u.l.bb_uuid), + offsetof(struct xfs_btree_block, bb_u.l.bb_owner), + offsetof(struct xfs_btree_block, bb_u.l.bb_crc), + offsetof(struct xfs_btree_block, bb_u.l.bb_pad), + XFS_BTREE_LBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD }; =20 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGBI(cur, bp, fields); =20 if (bp) { + int nbits; + + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { + /* + * We don't log the CRC when updating a btree + * block but instead recreate it during log + * recovery. As the log buffers have checksums + * of their this is safe and avoids logging a crc + * update in a lot of places. + */ + if (fields =3D=3D XFS_BB_ALL_BITS) + fields =3D XFS_BB_ALL_BITS_CRC; + nbits =3D XFS_BB_NUM_BITS_CRC; + } else { + nbits =3D XFS_BB_NUM_BITS; + } xfs_btree_offsets(fields, (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? loffsets : soffsets, - XFS_BB_NUM_BITS, &first, &last); + nbits, &first, &last); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, first, last); } else { xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, @@ -2148,7 +2315,7 @@ xfs_btree_split( goto error0; =20 /* Fill in the btree header for the new right block. */ - xfs_btree_init_block_cur(cur, xfs_btree_get_level(left), 0, rbp); + xfs_btree_init_block_cur(cur, rbp, xfs_btree_get_level(left), 0); =20 /* * Split the entries between the old and the new block evenly. @@ -2457,7 +2624,7 @@ xfs_btree_new_root( nptr =3D 2; } /* Fill in the new block's btree header and log it. */ - xfs_btree_init_block_cur(cur, cur->bc_nlevels, 2, nbp); + xfs_btree_init_block_cur(cur, nbp, cur->bc_nlevels, 2); xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS); ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) && !xfs_btree_ptr_is_null(cur, &rptr)); diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 0bc24cc..ee036bf 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -163,52 +163,82 @@ xfs_inobt_key_diff( cur->bc_rec.i.ir_startino; } =20 -void +static int xfs_inobt_verify( struct xfs_buf *bp) { struct xfs_mount *mp =3D bp->b_target->bt_mount; struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); + struct xfs_perag *pag =3D bp->b_pag; unsigned int level; - int sblock_ok; /* block passes checks */ =20 - /* magic number and level verification */ - level =3D be16_to_cpu(block->bb_level); - sblock_ok =3D block->bb_magic =3D=3D cpu_to_be32(XFS_IBT_MAGIC) && - level < mp->m_in_maxlevels; + /* + * During growfs operations, we can't verify the exact owner as the + * perag is not fully initialised and hence not attached to the buffer. + */ + switch (be32_to_cpu(block->bb_magic)) { + case XFS_IBT_CRC_MAGIC: + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) + return false; + if (block->bb_u.s.bb_blkno !=3D cpu_to_be64(bp->b_bn)) + return false; + if (pag && + be32_to_cpu(block->bb_u.s.bb_owner) !=3D pag->pag_agno) + return false; + /* fall through */ + case XFS_IBT_MAGIC: + break; + default: + return 0; + } =20 - /* numrecs verification */ - sblock_ok =3D sblock_ok && - be16_to_cpu(block->bb_numrecs) <=3D mp->m_inobt_mxr[level !=3D 0]; + /* numrecs and level verification */ + level =3D be16_to_cpu(block->bb_level); + if (level >=3D mp->m_in_maxlevels) + return false; + if (be16_to_cpu(block->bb_numrecs) > mp->m_inobt_mxr[level !=3D 0]) + return false; =20 /* sibling pointer verification */ - sblock_ok =3D sblock_ok && - (block->bb_u.s.bb_leftsib =3D=3D cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_leftsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_leftsib && - (block->bb_u.s.bb_rightsib =3D=3D cpu_to_be32(NULLAGBLOCK) || - be32_to_cpu(block->bb_u.s.bb_rightsib) < mp->m_sb.sb_agblocks) && - block->bb_u.s.bb_rightsib; - - if (!sblock_ok) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, block); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } + if (!block->bb_u.s.bb_leftsib || + (be32_to_cpu(block->bb_u.s.bb_leftsib) >=3D mp->m_sb.sb_agblocks && + block->bb_u.s.bb_leftsib !=3D cpu_to_be32(NULLAGBLOCK))) + return false; + if (!block->bb_u.s.bb_rightsib || + (be32_to_cpu(block->bb_u.s.bb_rightsib) >=3D mp->m_sb.sb_agblocks && + block->bb_u.s.bb_rightsib !=3D cpu_to_be32(NULLAGBLOCK))) + return false; + + return true; } =20 static void xfs_inobt_read_verify( struct xfs_buf *bp) { - xfs_inobt_verify(bp); + if (!(xfs_btree_sblock_verify_crc(bp) && + xfs_inobt_verify(bp))) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } =20 static void xfs_inobt_write_verify( struct xfs_buf *bp) { - xfs_inobt_verify(bp); + if (!xfs_inobt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + bp->b_target->bt_mount, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } + xfs_btree_sblock_calc_crc(bp); + } =20 const struct xfs_buf_ops xfs_inobt_buf_ops =3D { @@ -355,6 +385,8 @@ xfs_inobt_init_cursor( cur->bc_blocklog =3D mp->m_sb.sb_blocklog; =20 cur->bc_ops =3D &xfs_inobt_ops; + if (xfs_sb_version_hascrc(&mp->m_sb)) + cur->bc_flags |=3D XFS_BTREE_CRC_BLOCKS; =20 cur->bc_private.a.agbp =3D agbp; cur->bc_private.a.agno =3D agno; diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c index 3cf2423..f9f792c 100644 --- a/libxfs/xfs_inode.c +++ b/libxfs/xfs_inode.c @@ -492,6 +492,7 @@ xfs_iformat_btree( xfs_dinode_t *dip, int whichfork) { + struct xfs_mount *mp =3D ip->i_mount; xfs_bmdr_block_t *dfp; xfs_ifork_t *ifp; /* REFERENCED */ @@ -500,7 +501,7 @@ xfs_iformat_btree( =20 ifp =3D XFS_IFORK_PTR(ip, whichfork); dfp =3D (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); - size =3D XFS_BMAP_BROOT_SPACE(dfp); + size =3D XFS_BMAP_BROOT_SPACE(mp, dfp); nrecs =3D be16_to_cpu(dfp->bb_numrecs); =20 /* @@ -511,14 +512,14 @@ xfs_iformat_btree( * blocks. */ if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <=3D - XFS_IFORK_MAXEXT(ip, whichfork) || + XFS_IFORK_MAXEXT(ip, whichfork) || XFS_BMDR_SPACE_CALC(nrecs) > - XFS_DFORK_SIZE(dip, ip->i_mount, whichfork) || + XFS_DFORK_SIZE(dip, mp, whichfork) || XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) { - xfs_warn(ip->i_mount, "corrupt inode %Lu (btree).", - (unsigned long long) ip->i_ino); + xfs_warn(mp, "corrupt inode %Lu (btree).", + (unsigned long long) ip->i_ino); XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW, - ip->i_mount, dip); + mp, dip); return XFS_ERROR(EFSCORRUPTED); } =20 @@ -529,8 +530,7 @@ xfs_iformat_btree( * Copy and convert from the on-disk structure * to the in-memory structure. */ - xfs_bmdr_to_bmbt(ip->i_mount, dfp, - XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), + xfs_bmdr_to_bmbt(ip, dfp, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), ifp->if_broot, size); ifp->if_flags &=3D ~XFS_IFEXTENTS; ifp->if_flags |=3D XFS_IFBROOT; @@ -813,7 +813,7 @@ xfs_iroot_realloc( * allocate it now and get out. */ if (ifp->if_broot_bytes =3D=3D 0) { - new_size =3D (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff); + new_size =3D XFS_BMAP_BROOT_SPACE_CALC(mp, rec_diff); ifp->if_broot =3D kmem_alloc(new_size, KM_SLEEP | KM_NOFS); ifp->if_broot_bytes =3D (int)new_size; return; @@ -827,9 +827,9 @@ xfs_iroot_realloc( */ cur_max =3D xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); new_max =3D cur_max + rec_diff; - new_size =3D (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); + new_size =3D XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); ifp->if_broot =3D kmem_realloc(ifp->if_broot, new_size, - (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */ + XFS_BMAP_BROOT_SPACE_CALC(mp, cur_max), KM_SLEEP | KM_NOFS); op =3D (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, ifp->if_broot_bytes); @@ -837,7 +837,7 @@ xfs_iroot_realloc( (int)new_size); ifp->if_broot_bytes =3D (int)new_size; ASSERT(ifp->if_broot_bytes <=3D - XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ); + XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ(ip)); memmove(np, op, cur_max * (uint)sizeof(xfs_dfsbno_t)); return; } @@ -852,7 +852,7 @@ xfs_iroot_realloc( new_max =3D cur_max + rec_diff; ASSERT(new_max >=3D 0); if (new_max > 0) - new_size =3D (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); + new_size =3D XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); else new_size =3D 0; if (new_size > 0) { @@ -860,7 +860,8 @@ xfs_iroot_realloc( /* * First copy over the btree block header. */ - memcpy(new_broot, ifp->if_broot, XFS_BTREE_LBLOCK_LEN); + memcpy(new_broot, ifp->if_broot, + XFS_BMBT_BLOCK_LEN(ip->i_mount)); } else { new_broot =3D NULL; ifp->if_flags &=3D ~XFS_IFBROOT; @@ -890,7 +891,7 @@ xfs_iroot_realloc( ifp->if_broot =3D new_broot; ifp->if_broot_bytes =3D (int)new_size; ASSERT(ifp->if_broot_bytes <=3D - XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ); + XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ(ip)); return; } =20 @@ -1161,7 +1162,7 @@ xfs_iflush_fork( ASSERT(ifp->if_broot !=3D NULL); ASSERT(ifp->if_broot_bytes <=3D (XFS_IFORK_SIZE(ip, whichfork) + - XFS_BROOT_SIZE_ADJ)); + XFS_BROOT_SIZE_ADJ(ip))); xfs_bmbt_to_bmdr(mp, ifp->if_broot, ifp->if_broot_bytes, (xfs_bmdr_block_t *)cp, XFS_DFORK_SIZE(dip, mp, whichfork)); diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index b7514fb..7ab3519 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -333,7 +333,7 @@ xfs_sb_verify( * Only check the in progress field for the primary superblock as * mkfs.xfs doesn't clear it from secondary superblocks. */ - error =3D xfs_mount_validate_sb(mp, &sb, bp->b_blkno =3D=3D XFS_SB_DADDR); + error =3D xfs_mount_validate_sb(mp, &sb, bp->b_bn =3D=3D XFS_SB_DADDR); if (error) xfs_buf_ioerror(bp, error); } diff --git a/mdrestore/Makefile b/mdrestore/Makefile index ca2d1a0..5171306 100644 --- a/mdrestore/Makefile +++ b/mdrestore/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs LTCOMMAND =3D xfs_mdrestore CFILES =3D xfs_mdrestore.c =20 -LLDLIBS =3D $(LIBXFS) $(LIBRT) $(LIBPTHREAD) +LLDLIBS =3D $(LIBXFS) $(LIBRT) $(LIBPTHREAD) $(LIBUUID) LTDEPENDENCIES =3D $(LIBXFS) LLDFLAGS =3D -static =20 =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-= crc-patchset-v2/ag-hdr-format-changes=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001= 750=0000000043045=0012132011546=00020226=00 0=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00xfsprogs: add crc format chagnes to ag hea= ders =46rom: Dave Chinner Signed-off-by: Dave Chinner --- include/xfs_ag.h | 54 ++++- include/xfs_buf_item.h | 8 +- libxfs/xfs_alloc.c | 197 ++++++++++----- libxfs/xfs_bmap.c | 625 ++++++++++++++++++++++++++++++++++++++++++++= +++- libxfs/xfs_ialloc.c | 55 +++-- 5 files changed, 851 insertions(+), 88 deletions(-) diff --git a/include/xfs_ag.h b/include/xfs_ag.h index f2aeedb..1e0fa34 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -30,6 +30,7 @@ struct xfs_trans; =20 #define XFS_AGF_MAGIC 0x58414746 /* 'XAGF' */ #define XFS_AGI_MAGIC 0x58414749 /* 'XAGI' */ +#define XFS_AGFL_MAGIC 0x5841464c /* 'XAFL' */ #define XFS_AGF_VERSION 1 #define XFS_AGI_VERSION 1 =20 @@ -63,12 +64,29 @@ typedef struct xfs_agf { __be32 agf_spare0; /* spare field */ __be32 agf_levels[XFS_BTNUM_AGF]; /* btree levels */ __be32 agf_spare1; /* spare field */ + __be32 agf_flfirst; /* first freelist block's index */ __be32 agf_fllast; /* last freelist block's index */ __be32 agf_flcount; /* count of blocks in freelist */ __be32 agf_freeblks; /* total free blocks */ + __be32 agf_longest; /* longest free space */ __be32 agf_btreeblks; /* # of blocks held in AGF btrees */ + uuid_t agf_uuid; /* uuid of filesystem */ + + /* + * reserve some contiguous space for future logged fields before we add + * the unlogged fields. This makes the range logging via flags and + * structure offsets much simpler. + */ + __be64 agf_spare64[16]; + + /* unlogged fields, written during buffer writeback. */ + __be64 agf_lsn; /* last write sequence */ + __be32 agf_crc; /* crc of agf sector */ + __be32 agf_spare2; + + /* structure must be padded to 64 bit alignment */ } xfs_agf_t; =20 #define XFS_AGF_MAGICNUM 0x00000001 @@ -83,6 +101,7 @@ typedef struct xfs_agf { #define XFS_AGF_FREEBLKS 0x00000200 #define XFS_AGF_LONGEST 0x00000400 #define XFS_AGF_BTREEBLKS 0x00000800 +#define XFS_AGF_UUID 0x00001000 #define XFS_AGF_NUM_BITS 12 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) =20 @@ -98,7 +117,8 @@ typedef struct xfs_agf { { XFS_AGF_FLCOUNT, "FLCOUNT" }, \ { XFS_AGF_FREEBLKS, "FREEBLKS" }, \ { XFS_AGF_LONGEST, "LONGEST" }, \ - { XFS_AGF_BTREEBLKS, "BTREEBLKS" } + { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ + { XFS_AGF_UUID, "UUID" } =20 /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) @@ -132,6 +152,7 @@ typedef struct xfs_agi { __be32 agi_root; /* root of inode btree */ __be32 agi_level; /* levels in inode btree */ __be32 agi_freecount; /* number of free inodes */ + __be32 agi_newino; /* new inode just allocated */ __be32 agi_dirino; /* last directory inode chunk */ /* @@ -139,6 +160,13 @@ typedef struct xfs_agi { * still being referenced. */ __be32 agi_unlinked[XFS_AGI_UNLINKED_BUCKETS]; + + uuid_t agi_uuid; /* uuid of filesystem */ + __be32 agi_crc; /* crc of agi sector */ + __be32 agi_pad32; + __be64 agi_lsn; /* last write sequence */ + + /* structure must be padded to 64 bit alignment */ } xfs_agi_t; =20 #define XFS_AGI_MAGICNUM 0x00000001 @@ -171,11 +199,31 @@ extern const struct xfs_buf_ops xfs_agi_buf_ops; */ #define XFS_AGFL_DADDR(mp) ((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) #define XFS_AGFL_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp)) -#define XFS_AGFL_SIZE(mp) ((mp)->m_sb.sb_sectsize / sizeof(xfs_agblock_t)) #define XFS_BUF_TO_AGFL(bp) ((xfs_agfl_t *)((bp)->b_addr)) =20 +#define XFS_BUF_TO_AGFL_BNO(mp, bp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + &(XFS_BUF_TO_AGFL(bp)->agfl_bno[0]) : \ + (__be32 *)(bp)->b_addr) + +/* + * Size of the AGFL. For CRC-enabled filesystes we steal a couple of + * slots in the beginning of the block for a proper header with the + * location information and CRC. + */ +#define XFS_AGFL_SIZE(mp) \ + (((mp)->m_sb.sb_sectsize - \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + sizeof(struct xfs_agfl) : 0)) / \ + sizeof(xfs_agblock_t)) + typedef struct xfs_agfl { - __be32 agfl_bno[1]; /* actually XFS_AGFL_SIZE(mp) */ + __be32 agfl_magicnum; + __be32 agfl_seqno; + uuid_t agfl_uuid; + __be64 agfl_lsn; + __be32 agfl_crc; + __be32 agfl_bno[]; /* actually XFS_AGFL_SIZE(mp) */ } xfs_agfl_t; =20 /* diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index 101ef83..c256606 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -45,12 +45,18 @@ extern kmem_zone_t *xfs_buf_item_zone; * once the changes have been replayed into the buffer. */ #define XFS_BLF_BTREE_BUF (1<<5) +#define XFS_BLF_AGF_BUF (1<<6) +#define XFS_BLF_AGFL_BUF (1<<7) +#define XFS_BLF_AGI_BUF (1<<8) =20 #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ XFS_BLF_PDQUOT_BUF | \ XFS_BLF_GDQUOT_BUF | \ - XFS_BLF_BTREE_BUF) + XFS_BLF_BTREE_BUF | \ + XFS_BLF_AGF_BUF | \ + XFS_BLF_AGFL_BUF | \ + XFS_BLF_AGI_BUF) =20 #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index e59fdac..30fc5f4 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -410,53 +410,84 @@ xfs_alloc_fixup_trees( return 0; } =20 -static void +static bool xfs_agfl_verify( struct xfs_buf *bp) { -#ifdef WHEN_CRCS_COME_ALONG - /* - * we cannot actually do any verification of the AGFL because mkfs does - * not initialise the AGFL to zero or NULL. Hence the only valid part of - * the AGFL is what the AGF says is active. We can't get to the AGF, so - * we can't verify just those entries are valid. - * - * This problem goes away when the CRC format change comes along as that - * requires the AGFL to be initialised by mkfs. At that point, we can - * verify the blocks in the agfl -active or not- lie within the bounds - * of the AG. Until then, just leave this check ifdef'd out. - */ struct xfs_mount *mp =3D bp->b_target->bt_mount; struct xfs_agfl *agfl =3D XFS_BUF_TO_AGFL(bp); - int agfl_ok =3D 1; - int i; =20 + if (!uuid_equal(&agfl->agfl_uuid, &mp->m_sb.sb_uuid)) + return false; + if (be32_to_cpu(agfl->agfl_magicnum) !=3D XFS_AGFL_MAGIC) + return false; + /* + * during growfs operations, the perag is not fully initialised, + * so we can't use it for any useful checking. growfs ensures we can't + * use it by using uncached buffers that don't have the perag attached + * so we can detect and avoid this problem. + */ + if (bp->b_pag && be32_to_cpu(agfl->agfl_seqno) !=3D bp->b_pag->pag_agno) + return false; + for (i =3D 0; i < XFS_AGFL_SIZE(mp); i++) { - if (be32_to_cpu(agfl->agfl_bno[i]) =3D=3D NULLAGBLOCK || + if (be32_to_cpu(agfl->agfl_bno[i]) !=3D NULLAGBLOCK && be32_to_cpu(agfl->agfl_bno[i]) >=3D mp->m_sb.sb_agblocks) - agfl_ok =3D 0; + return false; } + return true; +} + +static void +xfs_agfl_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + int agfl_ok =3D 1; + + /* + * There is no verification of non-crc AGFLs because mkfs does not + * initialise the AGFL to zero or NULL. Hence the only valid part of the + * AGFL is what the AGF says is active. We can't get to the AGF, so we + * can't verify just those entries are valid. + */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + agfl_ok =3D xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agfl, agfl_crc)); + + agfl_ok =3D agfl_ok && xfs_agfl_verify(bp); =20 if (!agfl_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agfl); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } -#endif } =20 static void xfs_agfl_write_verify( struct xfs_buf *bp) { - xfs_agfl_verify(bp); -} + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_buf_log_item *bip =3D bp->b_fspriv; =20 -static void -xfs_agfl_read_verify( - struct xfs_buf *bp) -{ - xfs_agfl_verify(bp); + /* no verification of non-crc AGFLs */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_agfl_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (bip) + XFS_BUF_TO_AGFL(bp)->agfl_lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agfl, agfl_crc)); } =20 const struct xfs_buf_ops xfs_agfl_buf_ops =3D { @@ -1964,18 +1995,18 @@ xfs_alloc_get_freelist( int btreeblk) /* destination is a AGF btree */ { xfs_agf_t *agf; /* a.g. freespace structure */ - xfs_agfl_t *agfl; /* a.g. freelist structure */ xfs_buf_t *agflbp;/* buffer for a.g. freelist structure */ xfs_agblock_t bno; /* block number returned */ + __be32 *agfl_bno; int error; int logflags; - xfs_mount_t *mp; /* mount structure */ + xfs_mount_t *mp =3D tp->t_mountp; xfs_perag_t *pag; /* per allocation group data */ =20 - agf =3D XFS_BUF_TO_AGF(agbp); /* * Freelist is empty, give up. */ + agf =3D XFS_BUF_TO_AGF(agbp); if (!agf->agf_flcount) { *bnop =3D NULLAGBLOCK; return 0; @@ -1983,15 +2014,17 @@ xfs_alloc_get_freelist( /* * Read the array of free blocks. */ - mp =3D tp->t_mountp; - if ((error =3D xfs_alloc_read_agfl(mp, tp, - be32_to_cpu(agf->agf_seqno), &agflbp))) + error =3D xfs_alloc_read_agfl(mp, tp, be32_to_cpu(agf->agf_seqno), + &agflbp); + if (error) return error; - agfl =3D XFS_BUF_TO_AGFL(agflbp); + + /* * Get the block number and update the data structures. */ - bno =3D be32_to_cpu(agfl->agfl_bno[be32_to_cpu(agf->agf_flfirst)]); + agfl_bno =3D XFS_BUF_TO_AGFL_BNO(mp, agflbp); + bno =3D be32_to_cpu(agfl_bno[be32_to_cpu(agf->agf_flfirst)]); be32_add_cpu(&agf->agf_flfirst, 1); xfs_trans_brelse(tp, agflbp); if (be32_to_cpu(agf->agf_flfirst) =3D=3D XFS_AGFL_SIZE(mp)) @@ -2040,11 +2073,14 @@ xfs_alloc_log_agf( offsetof(xfs_agf_t, agf_freeblks), offsetof(xfs_agf_t, agf_longest), offsetof(xfs_agf_t, agf_btreeblks), + offsetof(xfs_agf_t, agf_uuid), sizeof(xfs_agf_t) }; =20 trace_xfs_agf(tp->t_mountp, XFS_BUF_TO_AGF(bp), fields, _RET_IP_); =20 + xfs_trans_buf_set_type(tp, bp, XFS_BLF_AGF_BUF); + xfs_btree_offsets(fields, offsets, XFS_AGF_NUM_BITS, &first, &last); xfs_trans_log_buf(tp, bp, (uint)first, (uint)last); } @@ -2081,12 +2117,13 @@ xfs_alloc_put_freelist( int btreeblk) /* block came from a AGF btree */ { xfs_agf_t *agf; /* a.g. freespace structure */ - xfs_agfl_t *agfl; /* a.g. free block array */ __be32 *blockp;/* pointer to array entry */ int error; int logflags; xfs_mount_t *mp; /* mount structure */ xfs_perag_t *pag; /* per allocation group data */ + __be32 *agfl_bno; + int startoff; =20 agf =3D XFS_BUF_TO_AGF(agbp); mp =3D tp->t_mountp; @@ -2094,7 +2131,6 @@ xfs_alloc_put_freelist( if (!agflbp && (error =3D xfs_alloc_read_agfl(mp, tp, be32_to_cpu(agf->agf_seqno), &agflbp))) return error; - agfl =3D XFS_BUF_TO_AGFL(agflbp); be32_add_cpu(&agf->agf_fllast, 1); if (be32_to_cpu(agf->agf_fllast) =3D=3D XFS_AGFL_SIZE(mp)) agf->agf_fllast =3D 0; @@ -2115,32 +2151,38 @@ xfs_alloc_put_freelist( xfs_alloc_log_agf(tp, agbp, logflags); =20 ASSERT(be32_to_cpu(agf->agf_flcount) <=3D XFS_AGFL_SIZE(mp)); - blockp =3D &agfl->agfl_bno[be32_to_cpu(agf->agf_fllast)]; + + agfl_bno =3D XFS_BUF_TO_AGFL_BNO(mp, agflbp); + blockp =3D &agfl_bno[be32_to_cpu(agf->agf_fllast)]; *blockp =3D cpu_to_be32(bno); + startoff =3D (char *)blockp - (char *)agflbp->b_addr; + xfs_alloc_log_agf(tp, agbp, logflags); - xfs_trans_log_buf(tp, agflbp, - (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl), - (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl + - sizeof(xfs_agblock_t) - 1)); + + xfs_trans_buf_set_type(tp, agflbp, XFS_BLF_AGFL_BUF); + xfs_trans_log_buf(tp, agflbp, startoff, + startoff + sizeof(xfs_agblock_t) - 1); return 0; } =20 -static void +static bool xfs_agf_verify( + struct xfs_mount *mp, struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; - struct xfs_agf *agf; - int agf_ok; + struct xfs_agf *agf =3D XFS_BUF_TO_AGF(bp); =20 - agf =3D XFS_BUF_TO_AGF(bp); + if (xfs_sb_version_hascrc(&mp->m_sb) && + !uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_uuid)) + return false; =20 - agf_ok =3D agf->agf_magicnum =3D=3D cpu_to_be32(XFS_AGF_MAGIC) && - XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && - be32_to_cpu(agf->agf_freeblks) <=3D be32_to_cpu(agf->agf_length) && - be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_flcount) <=3D XFS_AGFL_SIZE(mp); + if (!(agf->agf_magicnum =3D=3D cpu_to_be32(XFS_AGF_MAGIC) && + XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && + be32_to_cpu(agf->agf_freeblks) <=3D be32_to_cpu(agf->agf_length) && + be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_flcount) <=3D XFS_AGFL_SIZE(mp))) + return false; =20 /* * during growfs operations, the perag is not fully initialised, @@ -2148,33 +2190,58 @@ xfs_agf_verify( * use it by using uncached buffers that don't have the perag attached * so we can detect and avoid this problem. */ - if (bp->b_pag) - agf_ok =3D agf_ok && be32_to_cpu(agf->agf_seqno) =3D=3D - bp->b_pag->pag_agno; + if (bp->b_pag && be32_to_cpu(agf->agf_seqno) !=3D bp->b_pag->pag_agno) + return false; =20 - if (xfs_sb_version_haslazysbcount(&mp->m_sb)) - agf_ok =3D agf_ok && be32_to_cpu(agf->agf_btreeblks) <=3D - be32_to_cpu(agf->agf_length); + if (xfs_sb_version_haslazysbcount(&mp->m_sb) && + be32_to_cpu(agf->agf_btreeblks) > be32_to_cpu(agf->agf_length)) + return false; + + return true;; =20 - if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, - XFS_RANDOM_ALLOC_READ_AGF))) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agf); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } } =20 static void xfs_agf_read_verify( struct xfs_buf *bp) { - xfs_agf_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + int agf_ok =3D 1; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + agf_ok =3D xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agf, agf_crc)); + + agf_ok =3D agf_ok && xfs_agf_verify(mp, bp); + + if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, + XFS_RANDOM_ALLOC_READ_AGF))) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } =20 static void xfs_agf_write_verify( struct xfs_buf *bp) { - xfs_agf_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + + if (!xfs_agf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_AGF(bp)->agf_lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agf, agf_crc)); } =20 const struct xfs_buf_ops xfs_agf_buf_ops =3D { diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index f0322c9..feb4a4e 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1267,6 +1267,7 @@ xfs_ialloc_log_agi( /* * Log the allocation group inode header buffer. */ + xfs_trans_buf_set_type(tp, bp, XFS_BLF_AGI_BUF); xfs_trans_log_buf(tp, bp, first, last); } =20 @@ -1284,19 +1285,23 @@ xfs_check_agi_unlinked( #define xfs_check_agi_unlinked(agi) #endif =20 -static void +static bool xfs_agi_verify( struct xfs_buf *bp) { struct xfs_mount *mp =3D bp->b_target->bt_mount; struct xfs_agi *agi =3D XFS_BUF_TO_AGI(bp); - int agi_ok; =20 + if (xfs_sb_version_hascrc(&mp->m_sb) && + !uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_uuid)) + return false; /* * Validate the magic number of the agi block. */ - agi_ok =3D agi->agi_magicnum =3D=3D cpu_to_be32(XFS_AGI_MAGIC) && - XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)); + if (agi->agi_magicnum !=3D cpu_to_be32(XFS_AGI_MAGIC)) + return false; + if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum))) + return false; =20 /* * during growfs operations, the perag is not fully initialised, @@ -1304,30 +1309,52 @@ xfs_agi_verify( * use it by using uncached buffers that don't have the perag attached * so we can detect and avoid this problem. */ - if (bp->b_pag) - agi_ok =3D agi_ok && be32_to_cpu(agi->agi_seqno) =3D=3D - bp->b_pag->pag_agno; + if (bp->b_pag && be32_to_cpu(agi->agi_seqno) !=3D bp->b_pag->pag_agno) + return false; =20 - if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, - XFS_RANDOM_IALLOC_READ_AGI))) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, agi); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } xfs_check_agi_unlinked(agi); + return true; } =20 static void xfs_agi_read_verify( struct xfs_buf *bp) { - xfs_agi_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + int agi_ok =3D 1; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + agi_ok =3D xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agi, agi_crc)); + agi_ok =3D agi_ok && xfs_agi_verify(bp); + + if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, + XFS_RANDOM_IALLOC_READ_AGI))) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } =20 static void xfs_agi_write_verify( struct xfs_buf *bp) { - xfs_agi_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + + if (!xfs_agi_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_AGI(bp)->agi_lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_agi, agi_crc)); } =20 const struct xfs_buf_ops xfs_agi_buf_ops =3D { =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= xfsprogs-crc-patchset-v2/quota-format-changes=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=0000017= 50=000001750=0000000002173=0012132011546=00020212=00 0=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00libxfs: change quota buffer forma= ts =46rom: Dave Chinner Signed-off-by: Dave Chinner --- include/xfs_quota.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/include/xfs_quota.h b/include/xfs_quota.h index b50ec5b..c61e31c 100644 --- a/include/xfs_quota.h +++ b/include/xfs_quota.h @@ -77,7 +77,14 @@ typedef struct xfs_disk_dquot { */ typedef struct xfs_dqblk { xfs_disk_dquot_t dd_diskdq; /* portion that lives incore as well */ - char dd_fill[32]; /* filling for posterity */ + char dd_fill[4]; /* filling for posterity */ + + /* + * These two are only present on filesystems with the CRC bits set. + */ + __be32 dd_crc; /* checksum */ + __be64 dd_lsn; /* last modification in log */ + uuid_t dd_uuid; /* location information */ } xfs_dqblk_t; =20 /* @@ -380,5 +387,7 @@ extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_= dquot_t *, xfs_dqid_t, uint, uint, char *); extern int xfs_mount_reset_sbqflags(struct xfs_mount *); =20 +extern const struct xfs_buf_ops xfs_dquot_buf_ops; + #endif /* __KERNEL__ */ #endif /* __XFS_QUOTA_H__ */ =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-crc-patchset-v2/inode-v3= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001= 750=0000000050210=0012132011546=00015604=00 0=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00libxfs: add version 3 inode support =46rom: Dave Chinner Signed-off-by: Dave Chinner Header from folded patch 'debug': xfs_quota: fix report command parsing =46rom: Dave Chinner The report command line needs to be parsed as a whole not as individual elements - report_f() is set up to do this correctly. When treated as non-global command line, the report function is called once for each command line arg, resulting in reports being issued multiple times. Set the command to be a global command so that it is only called once. Signed-off-by: Dave Chinner --- db/dir2sf.c | 9 +++-- include/xfs_buf_item.h | 4 +- include/xfs_dinode.h | 33 +++++++++++++++-- include/xfs_inode.h | 26 +++++++++++++ libxfs/trans.c | 1 + libxfs/util.c | 30 ++++++++++++++- libxfs/xfs_ialloc.c | 25 ++++++++++++- libxfs/xfs_inode.c | 91 ++++++++++++++++++++++++++++++++++++++++--= ---- logprint/log_misc.c | 2 +- logprint/log_print_all.c | 3 +- repair/phase6.c | 63 +++++++++++++++++++++++++++++--- 11 files changed, 257 insertions(+), 30 deletions(-) diff --git a/db/dir2sf.c b/db/dir2sf.c index 92f8a66..271e08a 100644 --- a/db/dir2sf.c +++ b/db/dir2sf.c @@ -74,10 +74,11 @@ dir2_inou_i4_count( void *obj, int startoff) { + struct xfs_dinode *dip =3D obj; xfs_dir2_sf_t *sf; =20 ASSERT(bitoffs(startoff) =3D=3D 0); - sf =3D (xfs_dir2_sf_t *)XFS_DFORK_DPTR(obj); + sf =3D (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); return sf->hdr.i8count =3D=3D 0; } =20 @@ -87,10 +88,11 @@ dir2_inou_i8_count( void *obj, int startoff) { + struct xfs_dinode *dip =3D obj; xfs_dir2_sf_t *sf; =20 ASSERT(bitoffs(startoff) =3D=3D 0); - sf =3D (xfs_dir2_sf_t *)XFS_DFORK_DPTR(obj); + sf =3D (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); return sf->hdr.i8count !=3D 0; } =20 @@ -101,11 +103,12 @@ dir2_inou_size( int startoff, int idx) { + struct xfs_dinode *dip =3D obj; xfs_dir2_sf_t *sf; =20 ASSERT(bitoffs(startoff) =3D=3D 0); ASSERT(idx =3D=3D 0); - sf =3D (xfs_dir2_sf_t *)XFS_DFORK_DPTR(obj); + sf =3D (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); return bitize(sf->hdr.i8count ? (uint)sizeof(xfs_dir2_ino8_t) : (uint)sizeof(xfs_dir2_ino4_t)); diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index c256606..abae8c8 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -48,6 +48,7 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_AGF_BUF (1<<6) #define XFS_BLF_AGFL_BUF (1<<7) #define XFS_BLF_AGI_BUF (1<<8) +#define XFS_BLF_DINO_BUF (1<<9) =20 #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -56,7 +57,8 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_BTREE_BUF | \ XFS_BLF_AGF_BUF | \ XFS_BLF_AGFL_BUF | \ - XFS_BLF_AGI_BUF) + XFS_BLF_AGI_BUF | \ + XFS_BLF_DINO_BUF) =20 #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index 6b5bd17..f7a0e95 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -19,7 +19,7 @@ #define __XFS_DINODE_H__ =20 #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ -#define XFS_DINODE_GOOD_VERSION(v) (((v) =3D=3D 1 || (v) =3D=3D 2)) +#define XFS_DINODE_GOOD_VERSION(v) ((v) >=3D 1 && (v) <=3D 3) =20 typedef struct xfs_timestamp { __be32 t_sec; /* timestamp seconds */ @@ -70,11 +70,36 @@ typedef struct xfs_dinode { =20 /* di_next_unlinked is the only non-core field in the old dinode */ __be32 di_next_unlinked;/* agi unlinked list ptr */ -} __attribute__((packed)) xfs_dinode_t; + + /* start of the extended dinode, writable fields */ + __le32 di_crc; /* CRC of the inode */ + __be64 di_changecount; /* number of attribute changes */ + __be64 di_lsn; /* flush sequence */ + __be64 di_flags2; /* more random flags */ + __u8 di_pad2[16]; /* more padding for future expansion */ + + /* fields only written to during inode creation */ + xfs_timestamp_t di_crtime; /* time created */ + __be64 di_ino; /* inode number */ + uuid_t di_uuid; /* UUID of the filesystem */ + + /* structure must be padded to 64 bit alignment */ +} xfs_dinode_t; =20 #define DI_MAX_FLUSH 0xffff =20 /* + * Size of the core inode on disk. Version 1 and 2 inodes have + * the same size, but version 3 has grown a few additional fields. + */ +static inline uint xfs_dinode_size(int version) +{ + if (version =3D=3D 3) + return sizeof(struct xfs_dinode); + return offsetof(struct xfs_dinode, di_crc); +} + +/* * The 32 bit link count in the inode theoretically maxes out at UINT_MAX. * Since the pathconf interface is signed, we use 2^31 - 1 instead. * The old inode format had a 16 bit link count, so its maximum is USHRT_M= AX. @@ -105,7 +130,7 @@ typedef enum xfs_dinode_fmt { * Inode size for given fs. */ #define XFS_LITINO(mp, version) \ - ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) + ((int)(((mp)->m_sb.sb_inodesize) - xfs_dinode_size(version))) =20 #define XFS_BROOT_SIZE_ADJ(ip) \ (XFS_BMBT_BLOCK_LEN((ip)->i_mount) - sizeof(xfs_bmdr_block_t)) @@ -133,7 +158,7 @@ typedef enum xfs_dinode_fmt { * Return pointers to the data or attribute forks. */ #define XFS_DFORK_DPTR(dip) \ - ((char *)(dip) + sizeof(struct xfs_dinode)) + ((char *)dip + xfs_dinode_size(dip->di_version)) #define XFS_DFORK_APTR(dip) \ (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip)) #define XFS_DFORK_PTR(dip,w) \ diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 4733f85..cc14743 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -150,13 +150,38 @@ typedef struct xfs_icdinode { __uint16_t di_dmstate; /* DMIG state info */ __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ __uint32_t di_gen; /* generation number */ + + /* di_next_unlinked is the only non-core field in the old dinode */ + __be32 di_next_unlinked;/* agi unlinked list ptr */ + + /* start of the extended dinode, writable fields */ + __uint32_t di_crc; /* CRC of the inode */ + __uint64_t di_changecount; /* number of attribute changes */ + xfs_lsn_t di_lsn; /* flush sequence */ + __uint64_t di_flags2; /* more random flags */ + __uint8_t di_pad2[16]; /* more padding for future expansion */ + + /* fields only written to during inode creation */ + xfs_ictimestamp_t di_crtime; /* time created */ + xfs_ino_t di_ino; /* inode number */ + uuid_t di_uuid; /* UUID of the filesystem */ + + /* structure must be padded to 64 bit alignment */ } xfs_icdinode_t; =20 +static inline uint xfs_icdinode_size(struct xfs_icdinode *dicp) +{ + if (dicp->di_version =3D=3D 3) + return sizeof(struct xfs_icdinode); + return offsetof(struct xfs_icdinode, di_next_unlinked); +} + /* * Flags for xfs_ichgtime(). */ #define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */ #define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */ +#define XFS_ICHGTIME_CREATE 0x4 /* inode create timestamp */ =20 /* * Per-fork incore inode flags. @@ -556,6 +581,7 @@ int xfs_imap_to_bp(struct xfs_mount *, struct xfs_tran= s *, struct xfs_buf **, uint, uint); int xfs_iread(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, uint); +void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *); void xfs_dinode_to_disk(struct xfs_dinode *, struct xfs_icdinode *); void xfs_idestroy_fork(struct xfs_inode *, int); diff --git a/libxfs/trans.c b/libxfs/trans.c index 7cb3c8c..619aad1 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -218,6 +218,7 @@ libxfs_trans_inode_alloc_buf( ASSERT(XFS_BUF_FSPRIVATE(bp, void *) !=3D NULL); bip =3D XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); bip->bli_flags |=3D XFS_BLI_INODE_ALLOC_BUF; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DINO_BUF); } =20 /* diff --git a/libxfs/util.c b/libxfs/util.c index 2ad4bfd..abe16cf 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -47,6 +47,10 @@ libxfs_trans_ichgtime( ip->i_d.di_ctime.t_sec =3D (__int32_t)tv.tv_sec; ip->i_d.di_ctime.t_nsec =3D (__int32_t)tv.tv_nsec; } + if (flags & XFS_ICHGTIME_CREATE) { + ip->i_d.di_crtime.t_sec =3D (__int32_t)tv.tv_sec; + ip->i_d.di_crtime.t_nsec =3D (__int32_t)tv.tv_nsec; + } } =20 /* @@ -75,6 +79,7 @@ libxfs_ialloc( xfs_inode_t *ip; uint flags; int error; + int times; =20 /* * Call the space management code to pick @@ -103,6 +108,7 @@ libxfs_ialloc( ip->i_d.di_gid =3D cr->cr_gid; xfs_set_projid(&ip->i_d, pip ? 0 : fsx->fsx_projid); memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); + xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG | XFS_ICHGTIME_MOD); =20 /* * If the superblock version is up to where we support new format @@ -128,7 +134,6 @@ libxfs_ialloc( ip->i_d.di_size =3D 0; ip->i_d.di_nextents =3D 0; ASSERT(ip->i_d.di_nblocks =3D=3D 0); - xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG|XFS_ICHGTIME_MOD); /* * di_gen will have been taken care of in xfs_iread. */ @@ -136,6 +141,18 @@ libxfs_ialloc( ip->i_d.di_dmevmask =3D 0; ip->i_d.di_dmstate =3D 0; ip->i_d.di_flags =3D pip ? 0 : fsx->fsx_xflags; + + if (ip->i_d.di_version =3D=3D 3) { + ASSERT(ip->i_d.di_ino =3D=3D ino); + ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid)); + ip->i_d.di_crc =3D 0; + ip->i_d.di_changecount =3D 1; + ip->i_d.di_lsn =3D 0; + ip->i_d.di_flags2 =3D 0; + memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2)); + ip->i_d.di_crtime =3D ip->i_d.di_mtime; + } + flags =3D XFS_ILOG_CORE; switch (mode & S_IFMT) { case S_IFIFO: @@ -295,6 +312,10 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp) ASSERT(ip->i_d.di_nextents+ip->i_d.di_anextents <=3D ip->i_d.di_nblocks); ASSERT(ip->i_d.di_forkoff <=3D mp->m_sb.sb_inodesize); =20 + /* bump the change count on v3 inodes */ + if (ip->i_d.di_version =3D=3D 3) + ip->i_d.di_changecount++; + /* * Copy the dirty parts of the inode into the on-disk * inode. We always copy out the core of the inode, @@ -338,6 +359,13 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp) if (XFS_IFORK_Q(ip))=20 xfs_iflush_fork(ip, dip, iip, XFS_ATTR_FORK, bp); =20 + /* update the lsn in the on disk inode if required */ + if (ip->i_d.di_version =3D=3D 3) + dip->di_lsn =3D cpu_to_be64(iip->ili_item.li_lsn); + + /* generate the checksum. */ + xfs_dinode_calc_crc(mp, dip); + return 0; } =20 diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index feb4a4e..008c4ea 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -146,6 +146,7 @@ xfs_ialloc_inode_init( int version; int i, j; xfs_daddr_t d; + xfs_ino_t ino =3D 0; =20 /* * Loop over the new block(s), filling in the inodes. @@ -169,8 +170,20 @@ xfs_ialloc_inode_init( * the new inode format, then use the new inode version. Otherwise * use the old version so that old kernels will continue to be * able to use the file system. + * + * For v3 inodes, we also need to write the inode number into the inode, + * so calculate the first inode number of the chunk here as + * XFS_OFFBNO_TO_AGINO() only works on filesystem block boundaries, not + * cluster boundaries and so cannot be used in the cluster buffer loop + * below. */ - if (xfs_sb_version_hasnlink(&mp->m_sb)) + if (xfs_sb_version_hascrc(&mp->m_sb)) { + version =3D 3; + ino =3D XFS_AGINO_TO_INO(mp, agno, + XFS_OFFBNO_TO_AGINO(mp, agbno, 0)); + } else if (xfs_sb_version_hasnlink(&mp->m_sb)) + version =3D 3; + else if (xfs_sb_version_hasnlink(&mp->m_sb)) version =3D 2; else version =3D 1; @@ -196,13 +209,21 @@ xfs_ialloc_inode_init( xfs_buf_zero(fbuf, 0, ninodes << mp->m_sb.sb_inodelog); for (i =3D 0; i < ninodes; i++) { int ioffset =3D i << mp->m_sb.sb_inodelog; - uint isize =3D sizeof(struct xfs_dinode); + uint isize =3D xfs_dinode_size(version); =20 free =3D xfs_make_iptr(mp, fbuf, i); free->di_magic =3D cpu_to_be16(XFS_DINODE_MAGIC); free->di_version =3D version; free->di_gen =3D cpu_to_be32(gen); free->di_next_unlinked =3D cpu_to_be32(NULLAGINO); + + if (version =3D=3D 3) { + free->di_ino =3D cpu_to_be64(ino); + ino++; + uuid_copy(&free->di_uuid, &mp->m_sb.sb_uuid); + xfs_dinode_calc_crc(mp, free); + } + xfs_trans_log_buf(tp, fbuf, ioffset, ioffset + isize - 1); } xfs_trans_inode_alloc_buf(tp, fbuf); diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c index f9f792c..d6513b9 100644 --- a/libxfs/xfs_inode.c +++ b/libxfs/xfs_inode.c @@ -572,6 +572,17 @@ xfs_dinode_from_disk( to->di_dmstate =3D be16_to_cpu(from->di_dmstate); to->di_flags =3D be16_to_cpu(from->di_flags); to->di_gen =3D be32_to_cpu(from->di_gen); + + if (to->di_version =3D=3D 3) { + to->di_changecount =3D be64_to_cpu(from->di_changecount); + to->di_crtime.t_sec =3D be32_to_cpu(from->di_crtime.t_sec); + to->di_crtime.t_nsec =3D be32_to_cpu(from->di_crtime.t_nsec); + to->di_flags2 =3D be64_to_cpu(from->di_flags2); + to->di_ino =3D be64_to_cpu(from->di_ino); + to->di_lsn =3D be64_to_cpu(from->di_lsn); + memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); + platform_uuid_copy(&to->di_uuid, &from->di_uuid); + } } =20 void @@ -608,6 +619,58 @@ xfs_dinode_to_disk( to->di_dmstate =3D cpu_to_be16(from->di_dmstate); to->di_flags =3D cpu_to_be16(from->di_flags); to->di_gen =3D cpu_to_be32(from->di_gen); + + if (from->di_version =3D=3D 3) { + to->di_changecount =3D cpu_to_be64(from->di_changecount); + to->di_crtime.t_sec =3D cpu_to_be32(from->di_crtime.t_sec); + to->di_crtime.t_nsec =3D cpu_to_be32(from->di_crtime.t_nsec); + to->di_flags2 =3D cpu_to_be64(from->di_flags2); + to->di_ino =3D cpu_to_be64(from->di_ino); + to->di_lsn =3D cpu_to_be64(from->di_lsn); + memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); + platform_uuid_copy(&to->di_uuid, &from->di_uuid); + } +} + +static bool +xfs_dinode_verify( + struct xfs_mount *mp, + struct xfs_inode *ip, + struct xfs_dinode *dip) +{ + if (dip->di_magic !=3D cpu_to_be16(XFS_DINODE_MAGIC)) + return false; + + /* only version 3 or greater inodes are extensively verified here */ + if (dip->di_version < 3) + return true; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize, + offsetof(struct xfs_dinode, di_crc))) + return false; + if (be64_to_cpu(dip->di_ino) !=3D ip->i_ino) + return false; + if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_uuid)) + return false; + return true; +} + +void +xfs_dinode_calc_crc( + struct xfs_mount *mp, + struct xfs_dinode *dip) +{ + __uint32_t crc; + + if (dip->di_version < 3) + return; + + ASSERT(xfs_sb_version_hascrc(&mp->m_sb)); + crc =3D xfs_start_cksum((char *)dip, mp->m_sb.sb_inodesize, + offsetof(struct xfs_dinode, di_crc)); + dip->di_crc =3D xfs_end_cksum(crc); } =20 /* @@ -638,17 +701,13 @@ xfs_iread( if (error) return error; =20 - /* - * If we got something that isn't an inode it means someone - * (nfs or dmi) has a stale handle. - */ - if (dip->di_magic !=3D cpu_to_be16(XFS_DINODE_MAGIC)) { -#ifdef DEBUG - xfs_alert(mp, - "%s: dip->di_magic (0x%x) !=3D XFS_DINODE_MAGIC (0x%x)", - __func__, be16_to_cpu(dip->di_magic), XFS_DINODE_MAGIC); -#endif /* DEBUG */ - error =3D XFS_ERROR(EINVAL); + /* even unallocated inodes are verified */ + if (!xfs_dinode_verify(mp, ip, dip)) { + xfs_alert(mp, "%s: validation failed for inode %lld failed", + __func__, ip->i_ino); + + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, dip); + error =3D XFS_ERROR(EFSCORRUPTED); goto out_brelse; } =20 @@ -670,10 +729,20 @@ xfs_iread( goto out_brelse; } } else { + /* + * Partial initialisation of the in-core inode. Just the bits + * that xfs_ialloc won't overwrite or relies on being correct. + */ ip->i_d.di_magic =3D be16_to_cpu(dip->di_magic); ip->i_d.di_version =3D dip->di_version; ip->i_d.di_gen =3D be32_to_cpu(dip->di_gen); ip->i_d.di_flushiter =3D be16_to_cpu(dip->di_flushiter); + + if (dip->di_version =3D=3D 3) { + ip->i_d.di_ino =3D be64_to_cpu(dip->di_ino); + uuid_copy(&ip->i_d.di_uuid, &dip->di_uuid); + } + /* * Make sure to pull in the mode here as well in * case the inode is released without being used. diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 94fcf5b..ffc6916 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -653,7 +653,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, mode =3D dino.di_mode & S_IFMT; size =3D (int)dino.di_size; xlog_print_trans_inode_core(&dino); - *ptr +=3D sizeof(xfs_icdinode_t); + *ptr +=3D xfs_icdinode_size(&dino); =20 if (*i =3D=3D num_ops-1 && f->ilf_size =3D=3D 3) { return 1; diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index 44fb4c4..5b2d942 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -276,7 +276,8 @@ xlog_recover_print_inode( f->ilf_dsize); =20 /* core inode comes 2nd */ - ASSERT(item->ri_buf[1].i_len =3D=3D sizeof(xfs_icdinode_t)); + ASSERT(item->ri_buf[1].i_len =3D=3D xfs_icdinode_size((xfs_icdinode_t *) + item->ri_buf[1].i_addr)); xlog_recover_print_inode_core((xfs_icdinode_t *) item->ri_buf[1].i_addr); =20 diff --git a/repair/phase6.c b/repair/phase6.c index 00f70a2..136bb4f 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -429,6 +429,8 @@ mk_rbmino(xfs_mount_t *mp) xfs_bmap_free_t flist; xfs_dfiloff_t bno; xfs_bmbt_irec_t map[XFS_BMAP_MAX_NMAP]; + int vers; + int times; =20 /* * first set up inode @@ -445,16 +447,31 @@ mk_rbmino(xfs_mount_t *mp) error); } =20 - memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); + vers =3D xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; + ip->i_d.di_version =3D vers; + memset(&ip->i_d, 0, xfs_icdinode_size(&ip->i_d)); =20 ip->i_d.di_magic =3D XFS_DINODE_MAGIC; ip->i_d.di_mode =3D S_IFREG; - ip->i_d.di_version =3D 1; + ip->i_d.di_version =3D vers; ip->i_d.di_format =3D XFS_DINODE_FMT_EXTENTS; ip->i_d.di_aformat =3D XFS_DINODE_FMT_EXTENTS; =20 ip->i_d.di_nlink =3D 1; /* account for sb ptr */ =20 + times =3D XFS_ICHGTIME_CHG | XFS_ICHGTIME_MOD; + if (ip->i_d.di_version =3D=3D 3) { + ip->i_d.di_crc =3D 0; + ip->i_d.di_changecount =3D 1; + ip->i_d.di_lsn =3D 0; + ip->i_d.di_flags2 =3D 0; + ip->i_d.di_ino =3D mp->m_sb.sb_rbmino; + memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2)); + platform_uuid_copy(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid); + times |=3D XFS_ICHGTIME_CREATE; + } + libxfs_trans_ichgtime(tp, ip, times); + /* * now the ifork */ @@ -661,6 +678,8 @@ mk_rsumino(xfs_mount_t *mp) xfs_bmap_free_t flist; xfs_dfiloff_t bno; xfs_bmbt_irec_t map[XFS_BMAP_MAX_NMAP]; + int vers; + int times; =20 /* * first set up inode @@ -678,16 +697,31 @@ mk_rsumino(xfs_mount_t *mp) error); } =20 - memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); + vers =3D xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; + ip->i_d.di_version =3D vers; + memset(&ip->i_d, 0, xfs_icdinode_size(&ip->i_d)); =20 ip->i_d.di_magic =3D XFS_DINODE_MAGIC; ip->i_d.di_mode =3D S_IFREG; - ip->i_d.di_version =3D 1; + ip->i_d.di_version =3D vers; ip->i_d.di_format =3D XFS_DINODE_FMT_EXTENTS; ip->i_d.di_aformat =3D XFS_DINODE_FMT_EXTENTS; =20 ip->i_d.di_nlink =3D 1; /* account for sb ptr */ =20 + times =3D XFS_ICHGTIME_CHG | XFS_ICHGTIME_MOD; + if (ip->i_d.di_version =3D=3D 3) { + ip->i_d.di_crc =3D 0; + ip->i_d.di_changecount =3D 1; + ip->i_d.di_lsn =3D 0; + ip->i_d.di_flags2 =3D 0; + ip->i_d.di_ino =3D mp->m_sb.sb_rsumino; + memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2)); + platform_uuid_copy(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid); + times |=3D XFS_ICHGTIME_CREATE; + } + libxfs_trans_ichgtime(tp, ip, times); + /* * now the ifork */ @@ -760,6 +794,8 @@ mk_root_dir(xfs_mount_t *mp) int error; const mode_t mode =3D 0755; ino_tree_node_t *irec; + int vers; + int times; =20 ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb)); =20 @@ -778,16 +814,31 @@ mk_root_dir(xfs_mount_t *mp) /* * take care of the core -- initialization from xfs_ialloc() */ - memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); + vers =3D xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; + ip->i_d.di_version =3D vers; + memset(&ip->i_d, 0, xfs_icdinode_size(&ip->i_d)); =20 ip->i_d.di_magic =3D XFS_DINODE_MAGIC; ip->i_d.di_mode =3D (__uint16_t) mode|S_IFDIR; - ip->i_d.di_version =3D 1; + ip->i_d.di_version =3D vers; ip->i_d.di_format =3D XFS_DINODE_FMT_EXTENTS; ip->i_d.di_aformat =3D XFS_DINODE_FMT_EXTENTS; =20 ip->i_d.di_nlink =3D 1; /* account for . */ =20 + times =3D XFS_ICHGTIME_CHG | XFS_ICHGTIME_MOD; + if (ip->i_d.di_version =3D=3D 3) { + ip->i_d.di_crc =3D 0; + ip->i_d.di_changecount =3D 1; + ip->i_d.di_lsn =3D 0; + ip->i_d.di_flags2 =3D 0; + ip->i_d.di_ino =3D mp->m_sb.sb_rootino; + memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2)); + platform_uuid_copy(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid); + times |=3D XFS_ICHGTIME_CREATE; + } + libxfs_trans_ichgtime(tp, ip, times); + libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); =20 /* =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00xfsprogs-crc-patchset-v2/remote-symlink-crc=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00000060= 0=000001750=000001750=0000000017013=0012132011546=00017710=00 0=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00da= ve=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00libxfs: add support for = crc headers on remote symlinks =46rom: Dave Chinner Signed-off-by: Dave Chinner --- include/Makefile | 4 +- include/libxfs.h | 1 + include/xfs_buf_item.h | 4 +- include/xfs_symlink.h | 43 ++++++++++++++ libxfs/Makefile | 2 +- libxfs/xfs_symlink.c | 154 ++++++++++++++++++++++++++++++++++++++++++++= ++++ 6 files changed, 204 insertions(+), 4 deletions(-) diff --git a/include/Makefile b/include/Makefile index 61b30a8..b1c685d 100644 --- a/include/Makefile +++ b/include/Makefile @@ -28,8 +28,8 @@ QAHFILES =3D libxfs.h libxlog.h \ xfs_dir_sf.h xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ xfs_inode.h xfs_inode_item.h xfs_inum.h \ xfs_log.h xfs_log_priv.h xfs_log_recover.h xfs_metadump.h \ - xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h xfs_trace.h \ - xfs_trans.h xfs_trans_space.h xfs_dfrag.h + xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h xfs_symlink.h \ + xfs_trace.h xfs_trans.h xfs_trans_space.h xfs_dfrag.h =20 HFILES =3D handle.h jdm.h xqm.h xfs.h xfs_fs.h xfs_types.h HFILES +=3D $(PKG_PLATFORM).h diff --git a/include/libxfs.h b/include/libxfs.h index a4564fd..41cb585 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -56,6 +56,7 @@ #include #include #include +#include =20 #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index abae8c8..09cab4e 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -49,6 +49,7 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_AGFL_BUF (1<<7) #define XFS_BLF_AGI_BUF (1<<8) #define XFS_BLF_DINO_BUF (1<<9) +#define XFS_BLF_SYMLINK_BUF (1<<10) =20 #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -58,7 +59,8 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_AGF_BUF | \ XFS_BLF_AGFL_BUF | \ XFS_BLF_AGI_BUF | \ - XFS_BLF_DINO_BUF) + XFS_BLF_DINO_BUF | \ + XFS_BLF_SYMLINK_BUF) =20 #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/include/xfs_symlink.h b/include/xfs_symlink.h new file mode 100644 index 0000000..bb21e6a --- /dev/null +++ b/include/xfs_symlink.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2012 Red Hat, Inc. All rights reserved. + */ +#ifndef __XFS_SYMLINK_H +#define __XFS_SYMLINK_H 1 + +#define XFS_SYMLINK_MAGIC 0x58534c4d /* XSLM */ + +struct xfs_dsymlink_hdr { + __be32 sl_magic; + __be32 sl_offset; + __be32 sl_bytes; + __be32 sl_crc; + uuid_t sl_uuid; + __be64 sl_owner; + __be64 sl_blkno; + __be64 sl_lsn; +}; + +/* + * The maximum pathlen is 1024 bytes. Since the minimum file system + * blocksize is 512 bytes, we can get a max of 3 extents back from + * bmapi when crc headers are taken into account. + */ +#define XFS_SYMLINK_MAPS 3 + +#define XFS_SYMLINK_BUF_SPACE(mp, bufsize) \ + ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ + sizeof(struct xfs_dsymlink_hdr) : 0)) + +int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); + +extern const struct xfs_buf_ops xfs_symlink_buf_ops; + +#ifdef __KERNEL__ + +int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, + const char *target_path, umode_t mode, struct xfs_inode **ipp); +int xfs_readlink(struct xfs_inode *ip, char *link); +int xfs_inactive_symlink_rmt(struct xfs_inode *ip, struct xfs_trans **tpp); + +#endif /* __KERNEL__ */ +#endif /* __XFS_SYMLINK_H */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 28f71c8..75f365c 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -17,7 +17,7 @@ CFILES =3D cache.c init.c kmem.c logitem.c radix-tree.c r= dwr.c trans.c util.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ xfs_mount.c xfs_rtalloc.c xfs_trans.c xfs_attr.c \ - crc32.c + crc32.c xfs_symlink.c =20 CFILES +=3D $(PKG_PLATFORM).c PCFILES =3D darwin.c freebsd.c irix.c linux.c diff --git a/libxfs/xfs_symlink.c b/libxfs/xfs_symlink.c new file mode 100644 index 0000000..e018abc --- /dev/null +++ b/libxfs/xfs_symlink.c @@ -0,0 +1,154 @@ +/* + * Copyright 2013 Red Hat, Inc. + * All rights reserved. + */ + +#include "xfs.h" + +/* + * Each contiguous block has a header, so it is not just a simple pathlen + * to FSB conversion. + */ +int +xfs_symlink_blocks( + struct xfs_mount *mp, + int pathlen) +{ + int fsblocks =3D 0; + int len =3D pathlen; + + do { + fsblocks++; + len -=3D XFS_SYMLINK_BUF_SPACE(mp, mp->m_sb.sb_blocksize); + } while (len > 0); + + ASSERT(fsblocks <=3D XFS_SYMLINK_MAPS); + return fsblocks; +} + +/* + * XXX: this need to be used by mkfs/proto.c to create symlinks. + */ +static int +xfs_symlink_hdr_set( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_dsymlink_hdr *dsl =3D bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return 0; + + dsl->sl_magic =3D cpu_to_be32(XFS_SYMLINK_MAGIC); + dsl->sl_offset =3D cpu_to_be32(offset); + dsl->sl_bytes =3D cpu_to_be32(size); + uuid_copy(&dsl->sl_uuid, &mp->m_sb.sb_uuid); + dsl->sl_owner =3D cpu_to_be64(ino); + dsl->sl_blkno =3D cpu_to_be64(bp->b_bn); + bp->b_ops =3D &xfs_symlink_buf_ops; + + return sizeof(struct xfs_dsymlink_hdr); +} + +/* + * Checking of the symlink header is split into two parts. the verifier do= es + * CRC, location and bounds checking, the unpacking function checks the pa= th + * parameters and owner. + */ +bool +xfs_symlink_hdr_ok( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_dsymlink_hdr *dsl =3D bp->b_addr; + + if (offset !=3D be32_to_cpu(dsl->sl_offset)) + return false; + if (size !=3D be32_to_cpu(dsl->sl_bytes)) + return false; + if (ino !=3D be64_to_cpu(dsl->sl_owner)) + return false; + + /* ok */ + return true; + +} + +static bool +xfs_symlink_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_dsymlink_hdr *dsl =3D bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (dsl->sl_magic !=3D cpu_to_be32(XFS_SYMLINK_MAGIC)) + return false; + if (!uuid_equal(&dsl->sl_uuid, &mp->m_sb.sb_uuid)) + return false; + if (bp->b_bn !=3D be64_to_cpu(dsl->sl_blkno)) + return false; + if (be32_to_cpu(dsl->sl_offset) + + be32_to_cpu(dsl->sl_bytes) >=3D MAXPATHLEN) + return false; + if (dsl->sl_owner =3D=3D 0) + return false; + + return true; +} + +static void +xfs_symlink_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_dsymlink_hdr, sl_crc)) || + !xfs_symlink_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_symlink_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_symlink_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (bip) { + struct xfs_dsymlink_hdr *dsl =3D bp->b_addr; + dsl->sl_lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + } + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_dsymlink_hdr, sl_crc)); +} + +const struct xfs_buf_ops xfs_symlink_buf_ops =3D { + .verify_read =3D xfs_symlink_read_verify, + .verify_write =3D xfs_symlink_write_verify, +}; + =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00xfsprogs-crc-patchset-v2/xfs-add-crc-to-dir2-block-2=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001= 750=0000000100777=0012132011546=00020776=00 0=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00xfs: add CRC checks to block format direct= ory blocks =46rom: Dave Chinner Now that directory buffers are made from a single struct xfs_buf, we can add CRC calculation and checking callbacks. While there, add all the fields to the on disk structures for future functionality such as d_type support, uuids, block numbers, owner inode, etc. To distinguish between the different on disk formats, change the magic numbers for the new format directory blocks. Signed-off-by: Dave Chinner --- include/xfs_dir2_format.h | 155 +++++++++++++++++++++++++++++++++++++++++= -- libxfs/xfs_dir2_block.c | 126 +++++++++++++++++++++++++---------- libxfs/xfs_dir2_data.c | 160 ++++++++++++++++++++++++++++-------------= ---- libxfs/xfs_dir2_leaf.c | 6 +- libxfs/xfs_dir2_node.c | 2 +- libxfs/xfs_dir2_priv.h | 4 +- libxfs/xfs_dir2_sf.c | 2 +- 7 files changed, 346 insertions(+), 109 deletions(-) diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h index 0727098..7dc26b0 100644 --- a/include/xfs_dir2_format.h +++ b/include/xfs_dir2_format.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -36,6 +37,37 @@ #define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F: free index blocks */ =20 /* + * Directory Version 3 With CRCs. + * + * The tree formats are the same as for version 2 directories. The differ= ence + * is in the block header and dirent formats. In many cases the v3 structu= res + * use v2 definitions as they are no different and this makes code sharing= much + * easier. + * + * Also, the xfs_dir3_*() functions handle both v2 and v3 formats - if the + * format is v2 then they switch to the existing v2 code, or the format is= v3 + * they implement the v3 functionality. This means the existing dir2 is a = mix of + * xfs_dir2/xfs_dir3 calls and functions. The xfs_dir3 functions are called + * where there is a difference in the formats, otherwise the code is uncha= nged. + * + * Where it is possible, the code decides what to do based on the magic nu= mbers + * in the blocks rather than feature bits in the superblock. This means th= e code + * is as independent of the external XFS code as possible as doesn't requi= re + * passing struct xfs_mount pointers into places where it isn't really + * necessary. + * + * Version 3 includes: + * + * - a larger block header for CRC and identification purposes and so the + * offsets of all the structures inside the blocks are different. + * + * - new magic numbers to be able to detect the v2/v3 types on the fly. + */ + +#define XFS_DIR3_BLOCK_MAGIC 0x58444233 /* XDB3: single block dirs */ +#define XFS_DIR3_DATA_MAGIC 0x58444433 /* XDD3: multiblock dirs */ + +/* * Byte offset in data block and shortform entry. */ typedef __uint16_t xfs_dir2_data_off_t; @@ -117,19 +149,19 @@ static inline int xfs_dir2_sf_hdr_size(int i8count) (sizeof(xfs_dir2_ino8_t) - sizeof(xfs_dir2_ino4_t)); } =20 -static inline xfs_dir2_data_aoff_t + static inline xfs_dir2_data_aoff_t xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) { return get_unaligned_be16(&sfep->offset.i); } =20 -static inline void + static inline void xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) { put_unaligned_be16(off, &sfep->offset.i); } =20 -static inline int + static inline int xfs_dir2_sf_entsize(struct xfs_dir2_sf_hdr *hdr, int len) { return sizeof(struct xfs_dir2_sf_entry) + /* namelen + offset */ @@ -139,14 +171,14 @@ xfs_dir2_sf_entsize(struct xfs_dir2_sf_hdr *hdr, int = len) sizeof(xfs_dir2_ino4_t)); } =20 -static inline struct xfs_dir2_sf_entry * + static inline struct xfs_dir2_sf_entry * xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) { return (struct xfs_dir2_sf_entry *) ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); } =20 -static inline struct xfs_dir2_sf_entry * + static inline struct xfs_dir2_sf_entry * xfs_dir2_sf_nextentry(struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep) { @@ -221,11 +253,43 @@ typedef struct xfs_dir2_data_free { */ typedef struct xfs_dir2_data_hdr { __be32 magic; /* XFS_DIR2_DATA_MAGIC or */ - /* XFS_DIR2_BLOCK_MAGIC */ + /* XFS_DIR2_BLOCK_MAGIC */ xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; } xfs_dir2_data_hdr_t; =20 /* + * define a structure for all the verification fields we are adding to the + * directory block structures. This will be used in several structures. + * The magic number must be the first entry to align with all the dir2 + * structures so we determine how to decode them just by the magic number. + */ +struct xfs_dir3_blk_hdr { + __be32 magic; /* magic number */ + __be32 crc; /* CRC of block */ + __be64 blkno; /* first block of the buffer */ + __be64 lsn; /* sequence number of last write */ + uuid_t uuid; /* filesystem we belong to */ + __be64 owner; /* inode that owns the block */ +}; + +struct xfs_dir3_data_hdr { + struct xfs_dir3_blk_hdr hdr; + xfs_dir2_data_free_t best_free[XFS_DIR2_DATA_FD_COUNT]; +}; + +#define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) + + static inline struct xfs_dir2_data_free * +xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) +{ + if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { + struct xfs_dir3_data_hdr *hdr3 =3D (struct xfs_dir3_data_hdr *)hdr; + return hdr3->best_free; + } + return hdr->bestfree; +} + +/* * Active entry in a data block. * * Aligned to 8 bytes. After the variable length name field there is a @@ -280,6 +344,85 @@ xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused= *dup) be16_to_cpu(dup->length) - sizeof(__be16)); } =20 +static inline struct xfs_dir2_data_unused * +xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) +{ + if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { + return (struct xfs_dir2_data_unused *) + ((char *)hdr + sizeof(struct xfs_dir3_data_hdr)); + } + return (struct xfs_dir2_data_unused *) + ((char *)hdr + sizeof(struct xfs_dir2_data_hdr)); +} + +static inline size_t +xfs_dir3_data_hdr_size(bool dir3) +{ + if (dir3) + return sizeof(struct xfs_dir3_data_hdr); + return sizeof(struct xfs_dir2_data_hdr); +} + +static inline size_t +xfs_dir3_data_entry_offset(struct xfs_dir2_data_hdr *hdr) +{ + bool dir3 =3D hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + return xfs_dir3_data_hdr_size(dir3); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); +} + +/* + * Offsets of . and .. in data space (always block 0) + */ +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) +{ + return xfs_dir3_data_entry_offset(hdr); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_dotdot_offset(struct xfs_dir2_data_hdr *hdr) +{ + return xfs_dir3_data_dot_offset(hdr) + xfs_dir2_data_entsize(1); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_first_offset(struct xfs_dir2_data_hdr *hdr) +{ + return xfs_dir3_data_dotdot_offset(hdr) + xfs_dir2_data_entsize(2); +} + +/* + * location of . and .. in data space (always block 0) + */ +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_dot_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_dot_offset(hdr)); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_dotdot_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_dotdot_offset(hdr)); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_first_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_first_offset(hdr)); +} + /* * Leaf block structures. * diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index 2a99dea..c79199a 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -40,44 +41,74 @@ xfs_dir_startup(void) xfs_dir_hash_dotdot =3D xfs_da_hashname((unsigned char *)"..", 2); } =20 -static void -xfs_dir2_block_verify( +static bool +xfs_dir3_block_verify( struct xfs_buf *bp) { struct xfs_mount *mp =3D bp->b_target->bt_mount; - struct xfs_dir2_data_hdr *hdr =3D bp->b_addr; - int block_ok =3D 0; - - block_ok =3D hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); - block_ok =3D block_ok && __xfs_dir2_data_check(NULL, bp) =3D=3D 0; - - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (hdr3->magic !=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) + return false; + if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(hdr3->blkno) !=3D bp->b_bn) + return false; + } else { + if (hdr3->magic !=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) + return false; } + if (__xfs_dir2_data_check(NULL, bp)) + return false; + return true; } =20 static void -xfs_dir2_block_read_verify( +xfs_dir3_block_read_verify( struct xfs_buf *bp) { - xfs_dir2_block_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_DIR3_DATA_CRC_OFF)) || + !xfs_dir3_block_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } =20 static void -xfs_dir2_block_write_verify( +xfs_dir3_block_write_verify( struct xfs_buf *bp) { - xfs_dir2_block_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; + + if (!xfs_dir3_block_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_DATA_CRC_OFF); } =20 -const struct xfs_buf_ops xfs_dir2_block_buf_ops =3D { - .verify_read =3D xfs_dir2_block_read_verify, - .verify_write =3D xfs_dir2_block_write_verify, +const struct xfs_buf_ops xfs_dir3_block_buf_ops =3D { + .verify_read =3D xfs_dir3_block_read_verify, + .verify_write =3D xfs_dir3_block_write_verify, }; =20 static int -xfs_dir2_block_read( +xfs_dir3_block_read( struct xfs_trans *tp, struct xfs_inode *dp, struct xfs_buf **bpp) @@ -85,7 +116,29 @@ xfs_dir2_block_read( struct xfs_mount *mp =3D dp->i_mount; =20 return xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, - XFS_DATA_FORK, &xfs_dir2_block_buf_ops); + XFS_DATA_FORK, &xfs_dir3_block_buf_ops); +} + +static void +xfs_dir3_block_init( + struct xfs_mount *mp, + struct xfs_buf *bp, + struct xfs_inode *dp) +{ + struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; + + bp->b_ops =3D &xfs_dir3_block_buf_ops; + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + memset(hdr3, 0, sizeof(*hdr3)); + hdr3->magic =3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + hdr3->blkno =3D cpu_to_be64(bp->b_bn); + hdr3->owner =3D cpu_to_be64(dp->i_ino); + uuid_copy(&hdr3->uuid, &mp->m_sb.sb_uuid); + return; + + } + hdr3->magic =3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); } =20 static void @@ -105,7 +158,7 @@ xfs_dir2_block_need_space( struct xfs_dir2_data_unused *enddup =3D NULL; =20 *compact =3D 0; - bf =3D hdr->bestfree; + bf =3D xfs_dir3_data_bestfree_p(hdr); =20 /* * If there are stale entries we'll use one for the leaf. @@ -287,7 +340,7 @@ xfs_dir2_block_addname( mp =3D dp->i_mount; =20 /* Read the (one and only) directory block into bp. */ - error =3D xfs_dir2_block_read(tp, dp, &bp); + error =3D xfs_dir3_block_read(tp, dp, &bp); if (error) return error; =20 @@ -597,7 +650,7 @@ xfs_dir2_block_lookup_int( tp =3D args->trans; mp =3D dp->i_mount; =20 - error =3D xfs_dir2_block_read(tp, dp, &bp); + error =3D xfs_dir3_block_read(tp, dp, &bp); if (error) return error; =20 @@ -860,9 +913,12 @@ xfs_dir2_leaf_to_block( * These will show up in the leaf bests table. */ while (dp->i_d.di_size > mp->m_dirblksize) { + int hdrsz; + + hdrsz =3D xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); bestsp =3D xfs_dir2_leaf_bests_p(ltp); if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) =3D=3D - mp->m_dirblksize - (uint)sizeof(*hdr)) { + mp->m_dirblksize - hdrsz) { if ((error =3D xfs_dir2_leaf_trim_data(args, lbp, (xfs_dir2_db_t)(be32_to_cpu(ltp->bestcount) - 1)))) @@ -900,8 +956,8 @@ xfs_dir2_leaf_to_block( /* * Start converting it to block form. */ - dbp->b_ops =3D &xfs_dir2_block_buf_ops; - hdr->magic =3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); + xfs_dir3_block_init(mp, dbp, dp); + needlog =3D 1; needscan =3D 0; /* @@ -1023,16 +1079,16 @@ xfs_dir2_sf_to_block( return error; } /* - * Initialize the data block. + * Initialize the data block, then convert it to block format. */ - error =3D xfs_dir2_data_init(args, blkno, &bp); + error =3D xfs_dir3_data_init(args, blkno, &bp); if (error) { kmem_free(sfp); return error; } - bp->b_ops =3D &xfs_dir2_block_buf_ops; + xfs_dir3_block_init(mp, bp, dp); hdr =3D bp->b_addr; - hdr->magic =3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); + /* * Compute size of block "tail" area. */ @@ -1042,7 +1098,7 @@ xfs_dir2_sf_to_block( * The whole thing is initialized to free by the init routine. * Say we're using the leaf and tail area. */ - dup =3D (xfs_dir2_data_unused_t *)(hdr + 1); + dup =3D xfs_dir3_data_unused_p(hdr); needlog =3D needscan =3D 0; xfs_dir2_data_use_free(tp, bp, dup, mp->m_dirblksize - i, i, &needlog, &needscan); @@ -1064,8 +1120,7 @@ xfs_dir2_sf_to_block( /* * Create entry for . */ - dep =3D (xfs_dir2_data_entry_t *) - ((char *)hdr + XFS_DIR2_DATA_DOT_OFFSET); + dep =3D xfs_dir3_data_dot_entry_p(hdr); dep->inumber =3D cpu_to_be64(dp->i_ino); dep->namelen =3D 1; dep->name[0] =3D '.'; @@ -1078,8 +1133,7 @@ xfs_dir2_sf_to_block( /* * Create entry for .. */ - dep =3D (xfs_dir2_data_entry_t *) - ((char *)hdr + XFS_DIR2_DATA_DOTDOT_OFFSET); + dep =3D xfs_dir3_data_dotdot_entry_p(hdr); dep->inumber =3D cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); dep->namelen =3D 2; dep->name[0] =3D dep->name[1] =3D '.'; @@ -1089,7 +1143,7 @@ xfs_dir2_sf_to_block( blp[1].hashval =3D cpu_to_be32(xfs_dir_hash_dotdot); blp[1].address =3D cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, (char *)dep - (char *)hdr)); - offset =3D XFS_DIR2_DATA_FIRST_OFFSET; + offset =3D xfs_dir3_data_first_offset(hdr); /* * Loop over existing entries, stuff them in. */ diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index eb86739..66aab07 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -49,11 +50,12 @@ __xfs_dir2_data_check( =20 mp =3D bp->b_target->bt_mount; hdr =3D bp->b_addr; - bf =3D hdr->bestfree; - p =3D (char *)(hdr + 1); + bf =3D xfs_dir3_data_bestfree_p(hdr); + p =3D (char *)xfs_dir3_data_entry_p(hdr); =20 switch (be32_to_cpu(hdr->magic)) { case XFS_DIR2_BLOCK_MAGIC: + case XFS_DIR3_BLOCK_MAGIC: btp =3D xfs_dir2_block_tail_p(mp, hdr); lep =3D xfs_dir2_block_leaf_p(btp); endp =3D (char *)lep; @@ -132,7 +134,8 @@ __xfs_dir2_data_check( (char *)dep - (char *)hdr); count++; lastfree =3D 0; - if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) { + if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { addr =3D xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, (xfs_dir2_data_aoff_t) ((char *)dep - (char *)hdr)); @@ -152,7 +155,8 @@ __xfs_dir2_data_check( * Need to have seen all the entries and all the bestfree slots. */ XFS_WANT_CORRUPTED_RETURN(freeseen =3D=3D 7); - if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) { + if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { for (i =3D stale =3D 0; i < be32_to_cpu(btp->count); i++) { if (lep[i].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) @@ -200,7 +204,8 @@ xfs_dir2_data_reada_verify( =20 switch (be32_to_cpu(hdr->magic)) { case XFS_DIR2_BLOCK_MAGIC: - bp->b_ops =3D &xfs_dir2_block_buf_ops; + case XFS_DIR3_BLOCK_MAGIC: + bp->b_ops =3D &xfs_dir3_block_buf_ops; bp->b_ops->verify_read(bp); return; case XFS_DIR2_DATA_MAGIC: @@ -272,12 +277,15 @@ xfs_dir2_data_freefind( { xfs_dir2_data_free_t *dfp; /* bestfree entry */ xfs_dir2_data_aoff_t off; /* offset value needed */ + struct xfs_dir2_data_free *bf; #if defined(DEBUG) && defined(__KERNEL__) int matched; /* matched the value */ int seenzero; /* saw a 0 bestfree entry */ #endif =20 off =3D (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr); + bf =3D xfs_dir3_data_bestfree_p(hdr); + #if defined(DEBUG) && defined(__KERNEL__) /* * Validate some consistency in the bestfree table. @@ -285,9 +293,10 @@ xfs_dir2_data_freefind( * one we're looking for it has to be exact. */ ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); - for (dfp =3D &hdr->bestfree[0], seenzero =3D matched =3D 0; - dfp < &hdr->bestfree[XFS_DIR2_DATA_FD_COUNT]; + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); + for (dfp =3D &bf[0], seenzero =3D matched =3D 0; + dfp < &bf[XFS_DIR2_DATA_FD_COUNT]; dfp++) { if (!dfp->offset) { ASSERT(!dfp->length); @@ -303,7 +312,7 @@ xfs_dir2_data_freefind( else ASSERT(be16_to_cpu(dfp->offset) + be16_to_cpu(dfp->length) <=3D off); ASSERT(matched || be16_to_cpu(dfp->length) >=3D be16_to_cpu(dup->length)= ); - if (dfp > &hdr->bestfree[0]) + if (dfp > &bf[0]) ASSERT(be16_to_cpu(dfp[-1].length) >=3D be16_to_cpu(dfp[0].length)); } #endif @@ -312,14 +321,12 @@ xfs_dir2_data_freefind( * it can't be there since they're sorted. */ if (be16_to_cpu(dup->length) < - be16_to_cpu(hdr->bestfree[XFS_DIR2_DATA_FD_COUNT - 1].length)) + be16_to_cpu(bf[XFS_DIR2_DATA_FD_COUNT - 1].length)) return NULL; /* * Look at the three bestfree entries for our guy. */ - for (dfp =3D &hdr->bestfree[0]; - dfp < &hdr->bestfree[XFS_DIR2_DATA_FD_COUNT]; - dfp++) { + for (dfp =3D &bf[0]; dfp < &bf[XFS_DIR2_DATA_FD_COUNT]; dfp++) { if (!dfp->offset) return NULL; if (be16_to_cpu(dfp->offset) =3D=3D off) @@ -343,11 +350,12 @@ xfs_dir2_data_freeinsert( xfs_dir2_data_free_t *dfp; /* bestfree table pointer */ xfs_dir2_data_free_t new; /* new bestfree entry */ =20 -#ifdef __KERNEL__ ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); -#endif - dfp =3D hdr->bestfree; + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); + + dfp =3D xfs_dir3_data_bestfree_p(hdr); new.length =3D dup->length; new.offset =3D cpu_to_be16((char *)dup - (char *)hdr); =20 @@ -384,32 +392,36 @@ xfs_dir2_data_freeremove( xfs_dir2_data_free_t *dfp, /* bestfree entry pointer */ int *loghead) /* out: log data header */ { -#ifdef __KERNEL__ + struct xfs_dir2_data_free *bf; + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); -#endif + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); + /* * It's the first entry, slide the next 2 up. */ - if (dfp =3D=3D &hdr->bestfree[0]) { - hdr->bestfree[0] =3D hdr->bestfree[1]; - hdr->bestfree[1] =3D hdr->bestfree[2]; + bf =3D xfs_dir3_data_bestfree_p(hdr); + if (dfp =3D=3D &bf[0]) { + bf[0] =3D bf[1]; + bf[1] =3D bf[2]; } /* * It's the second entry, slide the 3rd entry up. */ - else if (dfp =3D=3D &hdr->bestfree[1]) - hdr->bestfree[1] =3D hdr->bestfree[2]; + else if (dfp =3D=3D &bf[1]) + bf[1] =3D bf[2]; /* * Must be the last entry. */ else - ASSERT(dfp =3D=3D &hdr->bestfree[2]); + ASSERT(dfp =3D=3D &bf[2]); /* * Clear the 3rd entry, must be zero now. */ - hdr->bestfree[2].length =3D 0; - hdr->bestfree[2].offset =3D 0; + bf[2].length =3D 0; + bf[2].offset =3D 0; *loghead =3D 1; } =20 @@ -425,23 +437,26 @@ xfs_dir2_data_freescan( xfs_dir2_block_tail_t *btp; /* block tail */ xfs_dir2_data_entry_t *dep; /* active data entry */ xfs_dir2_data_unused_t *dup; /* unused data entry */ + struct xfs_dir2_data_free *bf; char *endp; /* end of block's data */ char *p; /* current entry pointer */ =20 -#ifdef __KERNEL__ ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); -#endif + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); + /* * Start by clearing the table. */ - memset(hdr->bestfree, 0, sizeof(hdr->bestfree)); + bf =3D xfs_dir3_data_bestfree_p(hdr); + memset(bf, 0, sizeof(*bf) * XFS_DIR2_DATA_FD_COUNT); *loghead =3D 1; /* * Set up pointers. */ - p =3D (char *)(hdr + 1); - if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) { + p =3D (char *)xfs_dir3_data_entry_p(hdr); + if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { btp =3D xfs_dir2_block_tail_p(mp, hdr); endp =3D (char *)xfs_dir2_block_leaf_p(btp); } else @@ -477,7 +492,7 @@ xfs_dir2_data_freescan( * Give back the buffer for the created block. */ int /* error */ -xfs_dir2_data_init( +xfs_dir3_data_init( xfs_da_args_t *args, /* directory operation args */ xfs_dir2_db_t blkno, /* logical dir block number */ struct xfs_buf **bpp) /* output block buffer */ @@ -486,6 +501,7 @@ xfs_dir2_data_init( xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_inode_t *dp; /* incore directory inode */ xfs_dir2_data_unused_t *dup; /* unused entry pointer */ + struct xfs_dir2_data_free *bf; int error; /* error return value */ int i; /* bestfree index */ xfs_mount_t *mp; /* filesystem mount point */ @@ -508,21 +524,34 @@ xfs_dir2_data_init( * Initialize the header. */ hdr =3D bp->b_addr; - hdr->magic =3D cpu_to_be32(XFS_DIR2_DATA_MAGIC); - hdr->bestfree[0].offset =3D cpu_to_be16(sizeof(*hdr)); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; + + memset(hdr3, 0, sizeof(*hdr3)); + hdr3->magic =3D cpu_to_be32(XFS_DIR3_DATA_MAGIC); + hdr3->blkno =3D cpu_to_be64(bp->b_bn); + hdr3->owner =3D cpu_to_be64(dp->i_ino); + uuid_copy(&hdr3->uuid, &mp->m_sb.sb_uuid); + + } else + hdr->magic =3D cpu_to_be32(XFS_DIR2_DATA_MAGIC); + + bf =3D xfs_dir3_data_bestfree_p(hdr); + bf[0].offset =3D cpu_to_be16(xfs_dir3_data_entry_offset(hdr)); for (i =3D 1; i < XFS_DIR2_DATA_FD_COUNT; i++) { - hdr->bestfree[i].length =3D 0; - hdr->bestfree[i].offset =3D 0; + bf[i].length =3D 0; + bf[i].offset =3D 0; } =20 /* * Set up an unused entry for the block's body. */ - dup =3D (xfs_dir2_data_unused_t *)(hdr + 1); + dup =3D xfs_dir3_data_unused_p(hdr); dup->freetag =3D cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); =20 - t =3D mp->m_dirblksize - (uint)sizeof(*hdr); - hdr->bestfree[0].length =3D cpu_to_be16(t); + t =3D mp->m_dirblksize - (uint)xfs_dir3_data_entry_offset(hdr); + bf[0].length =3D cpu_to_be16(t); dup->length =3D cpu_to_be16(t); *xfs_dir2_data_unused_tag_p(dup) =3D cpu_to_be16((char *)dup - (char *)hd= r); /* @@ -546,7 +575,8 @@ xfs_dir2_data_log_entry( xfs_dir2_data_hdr_t *hdr =3D bp->b_addr; =20 ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); =20 xfs_trans_log_buf(tp, bp, (uint)((char *)dep - (char *)hdr), (uint)((char *)(xfs_dir2_data_entry_tag_p(dep) + 1) - @@ -564,9 +594,10 @@ xfs_dir2_data_log_header( xfs_dir2_data_hdr_t *hdr =3D bp->b_addr; =20 ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); =20 - xfs_trans_log_buf(tp, bp, 0, sizeof(*hdr) - 1); + xfs_trans_log_buf(tp, bp, 0, xfs_dir3_data_entry_offset(hdr) - 1); } =20 /* @@ -581,7 +612,8 @@ xfs_dir2_data_log_unused( xfs_dir2_data_hdr_t *hdr =3D bp->b_addr; =20 ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); =20 /* * Log the first part of the unused entry. @@ -619,6 +651,7 @@ xfs_dir2_data_make_free( xfs_dir2_data_unused_t *newdup; /* new unused entry */ xfs_dir2_data_unused_t *postdup; /* unused entry after us */ xfs_dir2_data_unused_t *prevdup; /* unused entry before us */ + struct xfs_dir2_data_free *bf; =20 mp =3D tp->t_mountp; hdr =3D bp->b_addr; @@ -631,7 +664,8 @@ xfs_dir2_data_make_free( else { xfs_dir2_block_tail_t *btp; /* block tail */ =20 - ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); btp =3D xfs_dir2_block_tail_p(mp, hdr); endptr =3D (char *)xfs_dir2_block_leaf_p(btp); } @@ -639,7 +673,7 @@ xfs_dir2_data_make_free( * If this isn't the start of the block, then back up to * the previous entry and see if it's free. */ - if (offset > sizeof(*hdr)) { + if (offset > xfs_dir3_data_entry_offset(hdr)) { __be16 *tagp; /* tag just before us */ =20 tagp =3D (__be16 *)((char *)hdr + offset) - 1; @@ -665,6 +699,7 @@ xfs_dir2_data_make_free( * Previous and following entries are both free, * merge everything into a single free entry. */ + bf =3D xfs_dir3_data_bestfree_p(hdr); if (prevdup && postdup) { xfs_dir2_data_free_t *dfp2; /* another bestfree pointer */ =20 @@ -679,7 +714,7 @@ xfs_dir2_data_make_free( * since the third bestfree is there, there might be more * entries. */ - needscan =3D (hdr->bestfree[2].length !=3D 0); + needscan =3D (bf[2].length !=3D 0); /* * Fix up the new big freespace. */ @@ -695,10 +730,10 @@ xfs_dir2_data_make_free( * Remove entry 1 first then entry 0. */ ASSERT(dfp && dfp2); - if (dfp =3D=3D &hdr->bestfree[1]) { - dfp =3D &hdr->bestfree[0]; + if (dfp =3D=3D &bf[1]) { + dfp =3D &bf[0]; ASSERT(dfp2 =3D=3D dfp); - dfp2 =3D &hdr->bestfree[1]; + dfp2 =3D &bf[1]; } xfs_dir2_data_freeremove(hdr, dfp2, needlogp); xfs_dir2_data_freeremove(hdr, dfp, needlogp); @@ -706,7 +741,7 @@ xfs_dir2_data_make_free( * Now insert the new entry. */ dfp =3D xfs_dir2_data_freeinsert(hdr, prevdup, needlogp); - ASSERT(dfp =3D=3D &hdr->bestfree[0]); + ASSERT(dfp =3D=3D &bf[0]); ASSERT(dfp->length =3D=3D prevdup->length); ASSERT(!dfp[1].length); ASSERT(!dfp[2].length); @@ -735,7 +770,7 @@ xfs_dir2_data_make_free( */ else { needscan =3D be16_to_cpu(prevdup->length) > - be16_to_cpu(hdr->bestfree[2].length); + be16_to_cpu(bf[2].length); } } /* @@ -763,7 +798,7 @@ xfs_dir2_data_make_free( */ else { needscan =3D be16_to_cpu(newdup->length) > - be16_to_cpu(hdr->bestfree[2].length); + be16_to_cpu(bf[2].length); } } /* @@ -802,10 +837,12 @@ xfs_dir2_data_use_free( xfs_dir2_data_unused_t *newdup; /* new unused entry */ xfs_dir2_data_unused_t *newdup2; /* another new unused entry */ int oldlen; /* old unused entry's length */ + struct xfs_dir2_data_free *bf; =20 hdr =3D bp->b_addr; ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || - hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)); + hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); ASSERT(be16_to_cpu(dup->freetag) =3D=3D XFS_DIR2_DATA_FREE_TAG); ASSERT(offset >=3D (char *)dup - (char *)hdr); ASSERT(offset + len <=3D (char *)dup + be16_to_cpu(dup->length) - (char *= )hdr); @@ -815,7 +852,8 @@ xfs_dir2_data_use_free( */ dfp =3D xfs_dir2_data_freefind(hdr, dup); oldlen =3D be16_to_cpu(dup->length); - ASSERT(dfp || oldlen <=3D be16_to_cpu(hdr->bestfree[2].length)); + bf =3D xfs_dir3_data_bestfree_p(hdr); + ASSERT(dfp || oldlen <=3D be16_to_cpu(bf[2].length)); /* * Check for alignment with front and back of the entry. */ @@ -829,7 +867,7 @@ xfs_dir2_data_use_free( */ if (matchfront && matchback) { if (dfp) { - needscan =3D (hdr->bestfree[2].offset !=3D 0); + needscan =3D (bf[2].offset !=3D 0); if (!needscan) xfs_dir2_data_freeremove(hdr, dfp, needlogp); } @@ -859,7 +897,7 @@ xfs_dir2_data_use_free( * that means we don't know if there was a better * choice for the last slot, or not. Rescan. */ - needscan =3D dfp =3D=3D &hdr->bestfree[2]; + needscan =3D dfp =3D=3D &bf[2]; } } /* @@ -886,7 +924,7 @@ xfs_dir2_data_use_free( * that means we don't know if there was a better * choice for the last slot, or not. Rescan. */ - needscan =3D dfp =3D=3D &hdr->bestfree[2]; + needscan =3D dfp =3D=3D &bf[2]; } } /* @@ -914,7 +952,7 @@ xfs_dir2_data_use_free( * the 2 new will work. */ if (dfp) { - needscan =3D (hdr->bestfree[2].length !=3D 0); + needscan =3D (bf[2].length !=3D 0); if (!needscan) { xfs_dir2_data_freeremove(hdr, dfp, needlogp); xfs_dir2_data_freeinsert(hdr, newdup, needlogp); diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index d303813..d83fce4 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -133,6 +133,7 @@ xfs_dir2_block_to_leaf( int needlog; /* need to log block header */ int needscan; /* need to rescan bestfree */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_data_free *bf; =20 trace_xfs_dir2_block_to_leaf(args); =20 @@ -161,6 +162,7 @@ xfs_dir2_block_to_leaf( xfs_dir2_data_check(dp, dbp); btp =3D xfs_dir2_block_tail_p(mp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); + bf =3D xfs_dir3_data_bestfree_p(hdr); /* * Set the counts in the leaf header. */ @@ -196,7 +198,7 @@ xfs_dir2_block_to_leaf( ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount =3D cpu_to_be32(1); bestsp =3D xfs_dir2_leaf_bests_p(ltp); - bestsp[0] =3D hdr->bestfree[0].length; + bestsp[0] =3D bf[0].length; /* * Log the data header and leaf bests table. */ @@ -528,7 +530,7 @@ xfs_dir2_leaf_addname( /* * Initialize the block. */ - if ((error =3D xfs_dir2_data_init(args, use_block, &dbp))) { + if ((error =3D xfs_dir3_data_init(args, use_block, &dbp))) { xfs_trans_brelse(tp, lbp); return error; } diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index 649f677..e7820b2 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -1573,7 +1573,7 @@ xfs_dir2_node_addname_int( if (unlikely((error =3D xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, &dbno)) || - (error =3D xfs_dir2_data_init(args, dbno, &dbp)))) + (error =3D xfs_dir3_data_init(args, dbno, &dbp)))) return error; =20 /* diff --git a/libxfs/xfs_dir2_priv.h b/libxfs/xfs_dir2_priv.h index 7da79f6..e6f2e0a 100644 --- a/libxfs/xfs_dir2_priv.h +++ b/libxfs/xfs_dir2_priv.h @@ -30,7 +30,7 @@ extern int xfs_dir_cilookup_result(struct xfs_da_args *ar= gs, const unsigned char *name, int len); =20 /* xfs_dir2_block.c */ -extern const struct xfs_buf_ops xfs_dir2_block_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_block_buf_ops; =20 extern int xfs_dir2_block_addname(struct xfs_da_args *args); extern int xfs_dir2_block_getdents(struct xfs_inode *dp, void *dirent, @@ -61,7 +61,7 @@ xfs_dir2_data_freeinsert(struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_data_unused *dup, int *loghead); extern void xfs_dir2_data_freescan(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr, int *loghead); -extern int xfs_dir2_data_init(struct xfs_da_args *args, xfs_dir2_db_t blkn= o, +extern int xfs_dir3_data_init(struct xfs_da_args *args, xfs_dir2_db_t blkn= o, struct xfs_buf **bpp); extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_buf *= bp, struct xfs_dir2_data_entry *dep); diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index a96be76..6848d05 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -262,7 +262,7 @@ xfs_dir2_block_to_sf( * Set up to loop over the block's entries. */ btp =3D xfs_dir2_block_tail_p(mp, hdr); - ptr =3D (char *)(hdr + 1); + ptr =3D (char *)xfs_dir3_data_entry_p(hdr); endptr =3D (char *)xfs_dir2_block_leaf_p(btp); sfep =3D xfs_dir2_sf_firstentry(sfp); /* =00xfsprogs-crc-patchset-v2/xfs-add-crc-to-dir2-free-2=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001= 750=0000000071727=0012132011546=00020627=00 0=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00xfs: add CRC checking to dir2 free blocks =46rom: Dave Chinner This addition follows the same pattern as the dir2 block CRCs, but with a few differences. The main difference is that the free block header is different between the v2 and v3 formats, so an "in-core" free block header has been added and _todisk/_from_disk functions used to abstract the differences in structure format from the code. This is similar to the on-disk superblock versus the in-core superblock setup. The in-core strucutre is populated when the buffer is read from disk, all the in memory checks and modifications are done on the in-core version of the structure which is written back to the buffer before the buffer is logged. Signed-off-by: Dave Chinner --- db/check.c | 2 +- include/xfs_dir2_format.h | 55 +++++- libxfs/xfs_dir2_leaf.c | 15 +- libxfs/xfs_dir2_node.c | 474 ++++++++++++++++++++++++++++++-----------= ---- repair/phase6.c | 2 +- 5 files changed, 384 insertions(+), 164 deletions(-) diff --git a/db/check.c b/db/check.c index 1dfef74..368d2b7 100644 --- a/db/check.c +++ b/db/check.c @@ -3169,7 +3169,7 @@ process_leaf_node_dir_v2_free( error++; return; } - maxent =3D xfs_dir2_free_max_bests(mp); + maxent =3D xfs_dir3_free_max_bests(mp); if (be32_to_cpu(free->hdr.firstdb) !=3D xfs_dir2_da_to_db(mp,=20 dabno - mp->m_dirfreeblk) * maxent) { if (!sflag || v) diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h index 7dc26b0..bec058f 100644 --- a/include/xfs_dir2_format.h +++ b/include/xfs_dir2_format.h @@ -66,6 +66,7 @@ =20 #define XFS_DIR3_BLOCK_MAGIC 0x58444233 /* XDB3: single block dirs */ #define XFS_DIR3_DATA_MAGIC 0x58444433 /* XDD3: multiblock dirs */ +#define XFS_DIR3_FREE_MAGIC 0x58444633 /* XDF3: free index blocks */ =20 /* * Byte offset in data block and shortform entry. @@ -663,19 +664,65 @@ typedef struct xfs_dir2_free { /* unused entries are -1 */ } xfs_dir2_free_t; =20 -static inline int xfs_dir2_free_max_bests(struct xfs_mount *mp) +struct xfs_dir3_free_hdr { + struct xfs_dir3_blk_hdr hdr; + __be32 firstdb; /* db of first entry */ + __be32 nvalid; /* count of valid entries */ + __be32 nused; /* count of used entries */ +}; + +struct xfs_dir3_free { + struct xfs_dir3_free_hdr hdr; + __be16 bests[]; /* best free counts */ + /* unused entries are -1 */ +}; + +#define XFS_DIR3_FREE_CRC_OFF offsetof(struct xfs_dir3_free, hdr.hdr.crc) + +/* + * In core version of the free block header, abstracted away from on-disk = format + * differences. Use this in the code, and convert to/from the disk version= using + * xfs_dir3_free_hdr_from_disk/xfs_dir3_free_hdr_to_disk. + */ +struct xfs_dir3_icfree_hdr { + __uint32_t magic; + __uint32_t firstdb; + __uint32_t nvalid; + __uint32_t nused; + +}; + +void xfs_dir3_free_hdr_from_disk(struct xfs_dir3_icfree_hdr *to, + struct xfs_dir2_free *from); + +static inline int +xfs_dir3_free_hdr_size(struct xfs_mount *mp) { - return (mp->m_dirblksize - sizeof(struct xfs_dir2_free_hdr)) / + if (xfs_sb_version_hascrc(&mp->m_sb)) + return sizeof(struct xfs_dir3_free_hdr); + return sizeof(struct xfs_dir2_free_hdr); +} + +static inline int +xfs_dir3_free_max_bests(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - xfs_dir3_free_hdr_size(mp)) / sizeof(xfs_dir2_data_off_t); } =20 +static inline __be16 * +xfs_dir3_free_bests_p(struct xfs_mount *mp, struct xfs_dir2_free *free) +{ + return (__be16 *)((char *)free + xfs_dir3_free_hdr_size(mp)); +} + /* * Convert data space db to the corresponding free db. */ static inline xfs_dir2_db_t xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir2_free_max_bests(mp); + return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); } =20 /* @@ -684,7 +731,7 @@ xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t = db) static inline int xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) { - return db % xfs_dir2_free_max_bests(mp); + return db % xfs_dir3_free_max_bests(mp); } =20 /* diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index d83fce4..a1df347 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -1477,6 +1477,7 @@ xfs_dir2_node_to_leaf( xfs_mount_t *mp; /* filesystem mount point */ int rval; /* successful free trim? */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir3_icfree_hdr freehdr; =20 /* * There's more than a leaf level in the btree, so there must @@ -1534,15 +1535,15 @@ xfs_dir2_node_to_leaf( if (error) return error; free =3D fbp->b_addr; - ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); - ASSERT(!free->hdr.firstdb); + xfs_dir3_free_hdr_from_disk(&freehdr, free); + + ASSERT(!freehdr.firstdb); =20 /* * Now see if the leafn and free data will fit in a leaf1. * If not, release the buffer and give up. */ - if (xfs_dir2_leaf_size(&leaf->hdr, be32_to_cpu(free->hdr.nvalid)) > - mp->m_dirblksize) { + if (xfs_dir2_leaf_size(&leaf->hdr, freehdr.nvalid) > mp->m_dirblksize) { xfs_trans_brelse(tp, fbp); return 0; } @@ -1563,12 +1564,12 @@ xfs_dir2_node_to_leaf( * Set up the leaf tail from the freespace block. */ ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); - ltp->bestcount =3D free->hdr.nvalid; + ltp->bestcount =3D cpu_to_be32(freehdr.nvalid); /* * Set up the leaf bests table. */ - memcpy(xfs_dir2_leaf_bests_p(ltp), free->bests, - be32_to_cpu(ltp->bestcount) * sizeof(xfs_dir2_data_off_t)); + memcpy(xfs_dir2_leaf_bests_p(ltp), xfs_dir3_free_bests_p(mp, free), + freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); xfs_dir2_leaf_log_tail(tp, lbp); xfs_dir2_leaf_check(dp, lbp); diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index e7820b2..e1d1f22 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -40,44 +41,78 @@ static int xfs_dir2_leafn_remove(xfs_da_args_t *args, s= truct xfs_buf *bp, static int xfs_dir2_node_addname_int(xfs_da_args_t *args, xfs_da_state_blk_t *fblk); =20 -static void -xfs_dir2_free_verify( +static bool +xfs_dir3_free_verify( struct xfs_buf *bp) { struct xfs_mount *mp =3D bp->b_target->bt_mount; struct xfs_dir2_free_hdr *hdr =3D bp->b_addr; - int block_ok =3D 0; =20 - block_ok =3D hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC); - if (!block_ok) { - XFS_CORRUPTION_ERROR("xfs_dir2_free_verify magic", - XFS_ERRLEVEL_LOW, mp, hdr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; + + if (hdr3->magic !=3D cpu_to_be32(XFS_DIR3_FREE_MAGIC)) + return false; + if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(hdr3->blkno) !=3D bp->b_bn) + return false; + } else { + if (hdr->magic !=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)) + return false; } + + /* XXX: should bounds check the xfs_dir3_icfree_hdr here */ + + return true; } =20 static void -xfs_dir2_free_read_verify( +xfs_dir3_free_read_verify( struct xfs_buf *bp) { - xfs_dir2_free_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_DIR3_FREE_CRC_OFF)) || + !xfs_dir3_free_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } =20 static void -xfs_dir2_free_write_verify( +xfs_dir3_free_write_verify( struct xfs_buf *bp) { - xfs_dir2_free_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; + + if (!xfs_dir3_free_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_FREE_CRC_OFF); } =20 -static const struct xfs_buf_ops xfs_dir2_free_buf_ops =3D { - .verify_read =3D xfs_dir2_free_read_verify, - .verify_write =3D xfs_dir2_free_write_verify, +static const struct xfs_buf_ops xfs_dir3_free_buf_ops =3D { + .verify_read =3D xfs_dir3_free_read_verify, + .verify_write =3D xfs_dir3_free_write_verify, }; =20 =20 static int -__xfs_dir2_free_read( +__xfs_dir3_free_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, @@ -85,7 +120,7 @@ __xfs_dir2_free_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, - XFS_DATA_FORK, &xfs_dir2_free_buf_ops); + XFS_DATA_FORK, &xfs_dir3_free_buf_ops); } =20 int @@ -95,7 +130,7 @@ xfs_dir2_free_read( xfs_dablk_t fbno, struct xfs_buf **bpp) { - return __xfs_dir2_free_read(tp, dp, fbno, -1, bpp); + return __xfs_dir3_free_read(tp, dp, fbno, -1, bpp); } =20 static int @@ -105,7 +140,95 @@ xfs_dir2_free_try_read( xfs_dablk_t fbno, struct xfs_buf **bpp) { - return __xfs_dir2_free_read(tp, dp, fbno, -2, bpp); + return __xfs_dir3_free_read(tp, dp, fbno, -2, bpp); +} + + +void +xfs_dir3_free_hdr_from_disk( + struct xfs_dir3_icfree_hdr *to, + struct xfs_dir2_free *from) +{ + if (from->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)) { + to->magic =3D be32_to_cpu(from->hdr.magic); + to->firstdb =3D be32_to_cpu(from->hdr.firstdb); + to->nvalid =3D be32_to_cpu(from->hdr.nvalid); + to->nused =3D be32_to_cpu(from->hdr.nused); + } else { + struct xfs_dir3_free_hdr *hdr3 =3D (struct xfs_dir3_free_hdr *)from; + + to->magic =3D be32_to_cpu(hdr3->hdr.magic); + to->firstdb =3D be32_to_cpu(hdr3->firstdb); + to->nvalid =3D be32_to_cpu(hdr3->nvalid); + to->nused =3D be32_to_cpu(hdr3->nused); + } + + ASSERT(to->magic =3D=3D XFS_DIR2_FREE_MAGIC || + to->magic =3D=3D XFS_DIR3_FREE_MAGIC); +} + +static void +xfs_dir3_free_hdr_to_disk( + struct xfs_dir2_free *to, + struct xfs_dir3_icfree_hdr *from) +{ + ASSERT(from->magic =3D=3D XFS_DIR2_FREE_MAGIC || + from->magic =3D=3D XFS_DIR3_FREE_MAGIC); + + if (from->magic =3D=3D XFS_DIR2_FREE_MAGIC) { + to->hdr.magic =3D cpu_to_be32(from->magic); + to->hdr.firstdb =3D cpu_to_be32(from->firstdb); + to->hdr.nvalid =3D cpu_to_be32(from->nvalid); + to->hdr.nused =3D cpu_to_be32(from->nused); + } else { + struct xfs_dir3_free_hdr *hdr3 =3D (struct xfs_dir3_free_hdr *)to; + + hdr3->hdr.magic =3D cpu_to_be32(from->magic); + hdr3->firstdb =3D cpu_to_be32(from->firstdb); + hdr3->nvalid =3D cpu_to_be32(from->nvalid); + hdr3->nused =3D cpu_to_be32(from->nused); + } +} + +static int +xfs_dir3_free_get_buf( + struct xfs_trans *tp, + struct xfs_inode *dp, + xfs_dir2_db_t fbno, + struct xfs_buf **bpp) +{ + struct xfs_mount *mp =3D dp->i_mount; + struct xfs_buf *bp; + int error; + struct xfs_dir3_icfree_hdr hdr; + + error =3D xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, fbno), + -1, &bp, XFS_DATA_FORK); + if (error) + return error; + + bp->b_ops =3D &xfs_dir3_free_buf_ops;; + + /* + * Initialize the new block to be empty, and remember + * its first slot as our empty slot. + */ + hdr.magic =3D XFS_DIR2_FREE_MAGIC; + hdr.firstdb =3D 0; + hdr.nused =3D 0; + hdr.nvalid =3D 0; + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dir3_free_hdr *hdr3 =3D bp->b_addr; + + hdr.magic =3D XFS_DIR3_FREE_MAGIC; + hdr3->hdr.blkno =3D cpu_to_be64(bp->b_bn); + hdr3->hdr.owner =3D cpu_to_be64(dp->i_ino); + uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_uuid); + + } + xfs_dir3_free_hdr_to_disk(bp->b_addr, &hdr); + *bpp =3D bp; + return 0; } =20 /* @@ -119,13 +242,16 @@ xfs_dir2_free_log_bests( int last) /* last entry to log */ { xfs_dir2_free_t *free; /* freespace structure */ + __be16 *bests; =20 free =3D bp->b_addr; - ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); + bests =3D xfs_dir3_free_bests_p(tp->t_mountp, free); + ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC) || + free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR3_FREE_MAGIC)); xfs_trans_log_buf(tp, bp, - (uint)((char *)&free->bests[first] - (char *)free), - (uint)((char *)&free->bests[last] - (char *)free + - sizeof(free->bests[0]) - 1)); + (uint)((char *)&bests[first] - (char *)free), + (uint)((char *)&bests[last] - (char *)free + + sizeof(bests[0]) - 1)); } =20 /* @@ -139,9 +265,9 @@ xfs_dir2_free_log_header( xfs_dir2_free_t *free; /* freespace structure */ =20 free =3D bp->b_addr; - ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); - xfs_trans_log_buf(tp, bp, (uint)((char *)&free->hdr - (char *)free), - (uint)(sizeof(xfs_dir2_free_hdr_t) - 1)); + ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC) || + free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR3_FREE_MAGIC)); + xfs_trans_log_buf(tp, bp, 0, xfs_dir3_free_hdr_size(tp->t_mountp) - 1); } =20 /* @@ -168,6 +294,7 @@ xfs_dir2_leaf_to_node( xfs_dir2_data_off_t off; /* freespace entry value */ __be16 *to; /* pointer to freespace entry */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir3_icfree_hdr freehdr; =20 trace_xfs_dir2_leaf_to_node(args); =20 @@ -184,43 +311,43 @@ xfs_dir2_leaf_to_node( /* * Get the buffer for the new freespace block. */ - error =3D xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, fdb), -1, &fbp, - XFS_DATA_FORK); + error =3D xfs_dir3_free_get_buf(tp, dp, fdb, &fbp); if (error) return error; - fbp->b_ops =3D &xfs_dir2_free_buf_ops; =20 free =3D fbp->b_addr; + xfs_dir3_free_hdr_from_disk(&freehdr, free); leaf =3D lbp->b_addr; ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); - /* - * Initialize the freespace block header. - */ - free->hdr.magic =3D cpu_to_be32(XFS_DIR2_FREE_MAGIC); - free->hdr.firstdb =3D 0; - ASSERT(be32_to_cpu(ltp->bestcount) <=3D (uint)dp->i_d.di_size / mp->m_dir= blksize); - free->hdr.nvalid =3D ltp->bestcount; + ASSERT(be32_to_cpu(ltp->bestcount) <=3D + (uint)dp->i_d.di_size / mp->m_dirblksize); + /* * Copy freespace entries from the leaf block to the new block. * Count active entries. */ - for (i =3D n =3D 0, from =3D xfs_dir2_leaf_bests_p(ltp), to =3D free->bes= ts; - i < be32_to_cpu(ltp->bestcount); i++, from++, to++) { + from =3D xfs_dir2_leaf_bests_p(ltp); + to =3D xfs_dir3_free_bests_p(mp, free); + for (i =3D n =3D 0; i < be32_to_cpu(ltp->bestcount); i++, from++, to++) { if ((off =3D be16_to_cpu(*from)) !=3D NULLDATAOFF) n++; *to =3D cpu_to_be16(off); } - free->hdr.nused =3D cpu_to_be32(n); - - lbp->b_ops =3D &xfs_dir2_leafn_buf_ops; - leaf->hdr.info.magic =3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); =20 /* - * Log everything. + * Now initialize the freespace block header. */ - xfs_dir2_leaf_log_header(tp, lbp); + freehdr.nused =3D n; + freehdr.nvalid =3D be32_to_cpu(ltp->bestcount); + + xfs_dir3_free_hdr_to_disk(fbp->b_addr, &freehdr); + xfs_dir2_free_log_bests(tp, fbp, 0, freehdr.nvalid - 1); xfs_dir2_free_log_header(tp, fbp); - xfs_dir2_free_log_bests(tp, fbp, 0, be32_to_cpu(free->hdr.nvalid) - 1); + + /* convert the leaf to a leafnode */ + leaf->hdr.info.magic =3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); + lbp->b_ops =3D &xfs_dir2_leafn_buf_ops; + xfs_dir2_leaf_log_header(tp, lbp); xfs_dir2_leafn_check(dp, lbp); return 0; } @@ -339,6 +466,23 @@ xfs_dir2_leafn_check( } ASSERT(be16_to_cpu(leaf->hdr.stale) =3D=3D stale); } + +static void +xfs_dir2_free_hdr_check( + struct xfs_mount *mp, + struct xfs_buf *bp, + xfs_dir2_db_t db) +{ + struct xfs_dir3_icfree_hdr hdr; + + xfs_dir3_free_hdr_from_disk(&hdr, bp->b_addr); + + ASSERT((hdr.firstdb % xfs_dir3_free_max_bests(mp)) =3D=3D 0); + ASSERT(hdr.firstdb <=3D db); + ASSERT(db < hdr.firstdb + hdr.nvalid); +} +#else +#define xfs_dir2_free_hdr_check(mp, dp, db) #endif /* DEBUG */ =20 /* @@ -409,7 +553,8 @@ xfs_dir2_leafn_lookup_for_addname( curbp =3D state->extrablk.bp; curfdb =3D state->extrablk.blkno; free =3D curbp->b_addr; - ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); + ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC) || + free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR3_FREE_MAGIC)); } length =3D xfs_dir2_data_entsize(args->namelen); /* @@ -436,6 +581,8 @@ xfs_dir2_leafn_lookup_for_addname( * in hand, take a look at it. */ if (newdb !=3D curdb) { + __be16 *bests; + curdb =3D newdb; /* * Convert the data block to the free block @@ -458,13 +605,8 @@ xfs_dir2_leafn_lookup_for_addname( if (error) return error; free =3D curbp->b_addr; - ASSERT(be32_to_cpu(free->hdr.magic) =3D=3D - XFS_DIR2_FREE_MAGIC); - ASSERT((be32_to_cpu(free->hdr.firstdb) % - xfs_dir2_free_max_bests(mp)) =3D=3D 0); - ASSERT(be32_to_cpu(free->hdr.firstdb) <=3D curdb); - ASSERT(curdb < be32_to_cpu(free->hdr.firstdb) + - be32_to_cpu(free->hdr.nvalid)); + + xfs_dir2_free_hdr_check(mp, curbp, curdb); } /* * Get the index for our entry. @@ -473,8 +615,8 @@ xfs_dir2_leafn_lookup_for_addname( /* * If it has room, return it. */ - if (unlikely(free->bests[fi] =3D=3D - cpu_to_be16(NULLDATAOFF))) { + bests =3D xfs_dir3_free_bests_p(mp, free); + if (unlikely(bests[fi] =3D=3D cpu_to_be16(NULLDATAOFF))) { XFS_ERROR_REPORT("xfs_dir2_leafn_lookup_int", XFS_ERRLEVEL_LOW, mp); if (curfdb !=3D newfdb) @@ -482,7 +624,7 @@ xfs_dir2_leafn_lookup_for_addname( return XFS_ERROR(EFSCORRUPTED); } curfdb =3D newfdb; - if (be16_to_cpu(free->bests[fi]) >=3D length) + if (be16_to_cpu(bests[fi]) >=3D length) goto out; } } @@ -496,6 +638,12 @@ out: state->extrablk.bp =3D curbp; state->extrablk.index =3D fi; state->extrablk.blkno =3D curfdb; + + /* + * Important: this magic number is not in the buffer - it's for + * buffer type information and therefore only the free/data type + * matters here, not whether CRCs are enabled or not. + */ state->extrablk.magic =3D XFS_DIR2_FREE_MAGIC; } else { state->extravalid =3D 0; @@ -883,7 +1031,7 @@ xfs_dir2_leafn_rebalance( } =20 static int -xfs_dir2_data_block_free( +xfs_dir3_data_block_free( xfs_da_args_t *args, struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_free *free, @@ -894,59 +1042,68 @@ xfs_dir2_data_block_free( { struct xfs_trans *tp =3D args->trans; int logfree =3D 0; + __be16 *bests; + struct xfs_dir3_icfree_hdr freehdr; =20 - if (!hdr) { - /* One less used entry in the free table. */ - be32_add_cpu(&free->hdr.nused, -1); - xfs_dir2_free_log_header(tp, fbp); =20 - /* - * If this was the last entry in the table, we can trim the - * table size back. There might be other entries at the end - * referring to non-existent data blocks, get those too. - */ - if (findex =3D=3D be32_to_cpu(free->hdr.nvalid) - 1) { - int i; /* free entry index */ + xfs_dir3_free_hdr_from_disk(&freehdr, free); =20 - for (i =3D findex - 1; i >=3D 0; i--) { - if (free->bests[i] !=3D cpu_to_be16(NULLDATAOFF)) - break; - } - free->hdr.nvalid =3D cpu_to_be32(i + 1); - logfree =3D 0; - } else { - /* Not the last entry, just punch it out. */ - free->bests[findex] =3D cpu_to_be16(NULLDATAOFF); - logfree =3D 1; - } + bests =3D xfs_dir3_free_bests_p(tp->t_mountp, free); + if (hdr) { /* - * If there are no useful entries left in the block, - * get rid of the block if we can. + * Data block is not empty, just set the free entry to the new + * value. */ - if (!free->hdr.nused) { - int error; + bests[findex] =3D cpu_to_be16(longest); + xfs_dir2_free_log_bests(tp, fbp, findex, findex); + return 0; + } =20 - error =3D xfs_dir2_shrink_inode(args, fdb, fbp); - if (error =3D=3D 0) { - fbp =3D NULL; - logfree =3D 0; - } else if (error !=3D ENOSPC || args->total !=3D 0) - return error; - /* - * It's possible to get ENOSPC if there is no - * space reservation. In this case some one - * else will eventually get rid of this block. - */ + /* + * One less used entry in the free table. Unused is not converted + * because we only need to know if it zero + */ + freehdr.nused--; + + if (findex =3D=3D freehdr.nvalid - 1) { + int i; /* free entry index */ + + for (i =3D findex - 1; i >=3D 0; i--) { + if (bests[i] !=3D cpu_to_be16(NULLDATAOFF)) + break; } + freehdr.nvalid =3D i + 1; + logfree =3D 0; } else { + /* Not the last entry, just punch it out. */ + bests[findex] =3D cpu_to_be16(NULLDATAOFF); + logfree =3D 1; + } + + xfs_dir3_free_hdr_to_disk(free, &freehdr); + xfs_dir2_free_log_header(tp, fbp); + + /* + * If there are no useful entries left in the block, get rid of the + * block if we can. + */ + if (!freehdr.nused) { + int error; + + error =3D xfs_dir2_shrink_inode(args, fdb, fbp); + if (error =3D=3D 0) { + fbp =3D NULL; + logfree =3D 0; + } else if (error !=3D ENOSPC || args->total !=3D 0) + return error; /* - * Data block is not empty, just set the free entry to the new - * value. + * It's possible to get ENOSPC if there is no + * space reservation. In this case some one + * else will eventually get rid of this block. */ - free->bests[findex] =3D cpu_to_be16(longest); - logfree =3D 1; } =20 + /* Log the free entry that changed, unless we got rid of it. */ if (logfree) xfs_dir2_free_log_bests(tp, fbp, findex, findex); @@ -1047,10 +1204,15 @@ xfs_dir2_leafn_remove( if (error) return error; free =3D fbp->b_addr; - ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); - ASSERT(be32_to_cpu(free->hdr.firstdb) =3D=3D - xfs_dir2_free_max_bests(mp) * - (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); +#ifdef DEBUG + { + struct xfs_dir3_icfree_hdr freehdr; + xfs_dir3_free_hdr_from_disk(&freehdr, free); + ASSERT(freehdr.firstdb =3D=3D + xfs_dir3_free_max_bests(mp) * + (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); + } +#endif /* * Calculate which entry we need to fix. */ @@ -1081,7 +1243,7 @@ xfs_dir2_leafn_remove( * If we got rid of the data block, we can eliminate that entry * in the free block. */ - error =3D xfs_dir2_data_block_free(args, hdr, free, + error =3D xfs_dir3_data_block_free(args, hdr, free, fdb, findex, fbp, longest); if (error) return error; @@ -1432,6 +1594,8 @@ xfs_dir2_node_addname_int( int needscan; /* need to rescan data frees */ __be16 *tagp; /* data entry tag pointer */ xfs_trans_t *tp; /* transaction pointer */ + __be16 *bests; + struct xfs_dir3_icfree_hdr freehdr; =20 dp =3D args->dp; mp =3D dp->i_mount; @@ -1449,36 +1613,37 @@ xfs_dir2_node_addname_int( */ ifbno =3D fblk->blkno; free =3D fbp->b_addr; - ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); findex =3D fblk->index; + bests =3D xfs_dir3_free_bests_p(mp, free); + xfs_dir3_free_hdr_from_disk(&freehdr, free); + /* * This means the free entry showed that the data block had * space for our entry, so we remembered it. * Use that data block. */ if (findex >=3D 0) { - ASSERT(findex < be32_to_cpu(free->hdr.nvalid)); - ASSERT(be16_to_cpu(free->bests[findex]) !=3D NULLDATAOFF); - ASSERT(be16_to_cpu(free->bests[findex]) >=3D length); - dbno =3D be32_to_cpu(free->hdr.firstdb) + findex; - } - /* - * The data block looked at didn't have enough room. - * We'll start at the beginning of the freespace entries. - */ - else { + ASSERT(findex < freehdr.nvalid); + ASSERT(be16_to_cpu(bests[findex]) !=3D NULLDATAOFF); + ASSERT(be16_to_cpu(bests[findex]) >=3D length); + dbno =3D freehdr.firstdb + findex; + } else { + /* + * The data block looked at didn't have enough room. + * We'll start at the beginning of the freespace entries. + */ dbno =3D -1; findex =3D 0; } - } - /* - * Didn't come in with a freespace block, so don't have a data block. - */ - else { + } else { + /* + * Didn't come in with a freespace block, so no data block. + */ ifbno =3D dbno =3D -1; fbp =3D NULL; findex =3D 0; } + /* * If we don't have a data block yet, we're going to scan the * freespace blocks looking for one. Figure out what the @@ -1532,20 +1697,26 @@ xfs_dir2_node_addname_int( if (!fbp) continue; free =3D fbp->b_addr; - ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); findex =3D 0; } /* * Look at the current free entry. Is it good enough? + * + * The bests initialisation should be wher eteh bufer is read in + * the above branch. But gcc is too stupid to realise that bests + * iand the freehdr are actually initialised if they are placed + * there, so we have to do it here to avoid warnings. Blech. */ - if (be16_to_cpu(free->bests[findex]) !=3D NULLDATAOFF && - be16_to_cpu(free->bests[findex]) >=3D length) - dbno =3D be32_to_cpu(free->hdr.firstdb) + findex; + bests =3D xfs_dir3_free_bests_p(mp, free); + xfs_dir3_free_hdr_from_disk(&freehdr, free); + if (be16_to_cpu(bests[findex]) !=3D NULLDATAOFF && + be16_to_cpu(bests[findex]) >=3D length) + dbno =3D freehdr.firstdb + findex; else { /* * Are we done with the freeblock? */ - if (++findex =3D=3D be32_to_cpu(free->hdr.nvalid)) { + if (++findex =3D=3D freehdr.nvalid) { /* * Drop the block. */ @@ -1599,11 +1770,11 @@ xfs_dir2_node_addname_int( * If there wasn't a freespace block, the read will * return a NULL fbp. Allocate and initialize a new one. */ - if( fbp =3D=3D NULL ) { - if ((error =3D xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, - &fbno))) { + if(!fbp) { + error =3D xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, + &fbno); + if (error) return error; - } =20 if (unlikely(xfs_dir2_db_to_fdb(mp, dbno) !=3D fbno)) { xfs_alert(mp, @@ -1631,27 +1802,24 @@ xfs_dir2_node_addname_int( /* * Get a buffer for the new block. */ - error =3D xfs_da_get_buf(tp, dp, - xfs_dir2_db_to_da(mp, fbno), - -1, &fbp, XFS_DATA_FORK); + error =3D xfs_dir3_free_get_buf(tp, dp, fbno, &fbp); if (error) return error; - fbp->b_ops =3D &xfs_dir2_free_buf_ops; + free =3D fbp->b_addr; + bests =3D xfs_dir3_free_bests_p(mp, free); + xfs_dir3_free_hdr_from_disk(&freehdr, free); =20 /* - * Initialize the new block to be empty, and remember - * its first slot as our empty slot. + * Remember the first slot as our empty slot. */ - free =3D fbp->b_addr; - free->hdr.magic =3D cpu_to_be32(XFS_DIR2_FREE_MAGIC); - free->hdr.firstdb =3D cpu_to_be32( - (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * - xfs_dir2_free_max_bests(mp)); + freehdr.firstdb =3D (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * + xfs_dir3_free_max_bests(mp); free->hdr.nvalid =3D 0; free->hdr.nused =3D 0; } else { free =3D fbp->b_addr; - ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); + bests =3D xfs_dir3_free_bests_p(mp, free); + xfs_dir3_free_hdr_from_disk(&freehdr, free); } =20 /* @@ -1662,20 +1830,21 @@ xfs_dir2_node_addname_int( * If it's after the end of the current entries in the * freespace block, extend that table. */ - if (findex >=3D be32_to_cpu(free->hdr.nvalid)) { - ASSERT(findex < xfs_dir2_free_max_bests(mp)); - free->hdr.nvalid =3D cpu_to_be32(findex + 1); + if (findex >=3D freehdr.nvalid) { + ASSERT(findex < xfs_dir3_free_max_bests(mp)); + freehdr.nvalid =3D findex + 1; /* * Tag new entry so nused will go up. */ - free->bests[findex] =3D cpu_to_be16(NULLDATAOFF); + bests[findex] =3D cpu_to_be16(NULLDATAOFF); } /* * If this entry was for an empty data block * (this should always be true) then update the header. */ - if (free->bests[findex] =3D=3D cpu_to_be16(NULLDATAOFF)) { - be32_add_cpu(&free->hdr.nused, 1); + if (bests[findex] =3D=3D cpu_to_be16(NULLDATAOFF)) { + freehdr.nused++; + xfs_dir3_free_hdr_to_disk(fbp->b_addr, &freehdr); xfs_dir2_free_log_header(tp, fbp); } /* @@ -1684,7 +1853,7 @@ xfs_dir2_node_addname_int( * change again. */ hdr =3D dbp->b_addr; - free->bests[findex] =3D hdr->bestfree[0].length; + bests[findex] =3D hdr->bestfree[0].length; logfree =3D 1; } /* @@ -1743,8 +1912,9 @@ xfs_dir2_node_addname_int( /* * If the freespace entry is now wrong, update it. */ - if (be16_to_cpu(free->bests[findex]) !=3D be16_to_cpu(hdr->bestfree[0].le= ngth)) { - free->bests[findex] =3D hdr->bestfree[0].length; + bests =3D xfs_dir3_free_bests_p(mp, free); /* gcc is so stupid */ + if (be16_to_cpu(bests[findex]) !=3D be16_to_cpu(hdr->bestfree[0].length))= { + bests[findex] =3D hdr->bestfree[0].length; logfree =3D 1; } /* @@ -1980,6 +2150,7 @@ xfs_dir2_node_trim_free( xfs_dir2_free_t *free; /* freespace structure */ xfs_mount_t *mp; /* filesystem mount point */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir3_icfree_hdr freehdr; =20 dp =3D args->dp; mp =3D dp->i_mount; @@ -1997,11 +2168,12 @@ xfs_dir2_node_trim_free( if (!bp) return 0; free =3D bp->b_addr; - ASSERT(free->hdr.magic =3D=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)); + xfs_dir3_free_hdr_from_disk(&freehdr, free); + /* * If there are used entries, there's nothing to do. */ - if (be32_to_cpu(free->hdr.nused) > 0) { + if (freehdr.nused > 0) { xfs_trans_brelse(tp, bp); *rvalp =3D 0; return 0; diff --git a/repair/phase6.c b/repair/phase6.c index 136bb4f..80701a4 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -2461,7 +2461,7 @@ longform_dir2_check_node( if (be32_to_cpu(free->hdr.magic) !=3D XFS_DIR2_FREE_MAGIC || be32_to_cpu(free->hdr.firstdb) !=3D (fdb - XFS_DIR2_FREE_FIRSTDB(mp)) * - xfs_dir2_free_max_bests(mp) || + xfs_dir3_free_max_bests(mp) || be32_to_cpu(free->hdr.nvalid) < be32_to_cpu(free->hdr.nused)) { do_warn( =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-crc-patchset-v2/xf= s-add-crc-to-dir2-data-2=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=000000600=000001750=000001750=0000000060310=001213201154= 6=00020601=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00xfs: add CRC checking to dir2 data blocks =46rom: Dave Chinner This addition follows the same pattern as the dir2 block CRCs. Signed-off-by: Dave Chinner --- include/xfs_dir2_format.h | 21 +++++----- libxfs/xfs_dir2_block.c | 20 ++++----- libxfs/xfs_dir2_data.c | 98 +++++++++++++++++++++++++++++++----------= ---- libxfs/xfs_dir2_leaf.c | 59 ++++++++++++++++----------- libxfs/xfs_dir2_node.c | 39 ++++++++++-------- libxfs/xfs_dir2_priv.h | 12 +++--- 6 files changed, 152 insertions(+), 97 deletions(-) diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h index bec058f..dfc8ccf 100644 --- a/include/xfs_dir2_format.h +++ b/include/xfs_dir2_format.h @@ -283,7 +283,8 @@ struct xfs_dir3_data_hdr { static inline struct xfs_dir2_data_free * xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) { - if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { + if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { struct xfs_dir3_data_hdr *hdr3 =3D (struct xfs_dir3_data_hdr *)hdr; return hdr3->best_free; } @@ -345,17 +346,6 @@ xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused= *dup) be16_to_cpu(dup->length) - sizeof(__be16)); } =20 -static inline struct xfs_dir2_data_unused * -xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) -{ - if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - return (struct xfs_dir2_data_unused *) - ((char *)hdr + sizeof(struct xfs_dir3_data_hdr)); - } - return (struct xfs_dir2_data_unused *) - ((char *)hdr + sizeof(struct xfs_dir2_data_hdr)); -} - static inline size_t xfs_dir3_data_hdr_size(bool dir3) { @@ -379,6 +369,13 @@ xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); } =20 +static inline struct xfs_dir2_data_unused * +xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_unused *) + ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); +} + /* * Offsets of . and .. in data space (always block 0) */ diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index 9978a02..e1e1161 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -59,7 +59,7 @@ xfs_dir3_block_verify( if (hdr3->magic !=3D be32_to_cpu(XFS_DIR2_BLOCK_MAGIC)) return false; } - if (__xfs_dir2_data_check(NULL, bp)) + if (__xfs_dir3_data_check(NULL, bp)) return false; return true; } @@ -535,7 +535,7 @@ xfs_dir2_block_addname( xfs_dir2_data_log_header(tp, bp); xfs_dir2_block_log_tail(tp, bp); xfs_dir2_data_log_entry(tp, bp, dep); - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); return 0; } =20 @@ -604,7 +604,7 @@ xfs_dir2_block_lookup( dp =3D args->dp; mp =3D dp->i_mount; hdr =3D bp->b_addr; - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); btp =3D xfs_dir2_block_tail_p(mp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); /* @@ -655,7 +655,7 @@ xfs_dir2_block_lookup_int( return error; =20 hdr =3D bp->b_addr; - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); btp =3D xfs_dir2_block_tail_p(mp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); /* @@ -792,7 +792,7 @@ xfs_dir2_block_removename( xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, bp); - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); /* * See if the size as a shortform is good enough. */ @@ -849,7 +849,7 @@ xfs_dir2_block_replace( */ dep->inumber =3D cpu_to_be64(args->inumber); xfs_dir2_data_log_entry(args->trans, bp, dep); - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); return 0; } =20 @@ -930,12 +930,14 @@ xfs_dir2_leaf_to_block( * Read the data block if we don't already have it, give up if it fails. */ if (!dbp) { - error =3D xfs_dir2_data_read(tp, dp, mp->m_dirdatablk, -1, &dbp); + error =3D xfs_dir3_data_read(tp, dp, mp->m_dirdatablk, -1, &dbp); if (error) return error; } hdr =3D dbp->b_addr; - ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC)); + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC)); + /* * Size of the "leaf" area in the block. */ @@ -1213,6 +1215,6 @@ xfs_dir2_sf_to_block( ASSERT(needscan =3D=3D 0); xfs_dir2_block_log_leaf(tp, bp, 0, be32_to_cpu(btp->count) - 1); xfs_dir2_block_log_tail(tp, bp); - xfs_dir2_data_check(dp, bp); + xfs_dir3_data_check(dp, bp); return 0; } diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index 66aab07..69841df 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -25,7 +25,7 @@ * Return 0 is the buffer is good, otherwise an error. */ int -__xfs_dir2_data_check( +__xfs_dir3_data_check( struct xfs_inode *dp, /* incore inode pointer */ struct xfs_buf *bp) /* data block's buffer */ { @@ -61,6 +61,7 @@ __xfs_dir2_data_check( endp =3D (char *)lep; break; case XFS_DIR2_DATA_MAGIC: + case XFS_DIR3_DATA_MAGIC: endp =3D (char *)hdr + mp->m_dirblksize; break; default: @@ -173,21 +174,27 @@ __xfs_dir2_data_check( return 0; } =20 -static void -xfs_dir2_data_verify( +static bool +xfs_dir3_data_verify( struct xfs_buf *bp) { struct xfs_mount *mp =3D bp->b_target->bt_mount; - struct xfs_dir2_data_hdr *hdr =3D bp->b_addr; - int block_ok =3D 0; + struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; =20 - block_ok =3D hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC); - block_ok =3D block_ok && __xfs_dir2_data_check(NULL, bp) =3D=3D 0; - - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (hdr3->magic !=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC)) + return false; + if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(hdr3->blkno) !=3D bp->b_bn) + return false; + } else { + if (hdr3->magic !=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC)) + return false; } + if (__xfs_dir3_data_check(NULL, bp)) + return false; + return true; } =20 /* @@ -196,7 +203,7 @@ xfs_dir2_data_verify( * format buffer or a data format buffer on readahead. */ static void -xfs_dir2_data_reada_verify( +xfs_dir3_data_reada_verify( struct xfs_buf *bp) { struct xfs_mount *mp =3D bp->b_target->bt_mount; @@ -209,7 +216,8 @@ xfs_dir2_data_reada_verify( bp->b_ops->verify_read(bp); return; case XFS_DIR2_DATA_MAGIC: - xfs_dir2_data_verify(bp); + case XFS_DIR3_DATA_MAGIC: + xfs_dir3_data_verify(bp); return; default: XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); @@ -219,32 +227,56 @@ xfs_dir2_data_reada_verify( } =20 static void -xfs_dir2_data_read_verify( +xfs_dir3_data_read_verify( struct xfs_buf *bp) { - xfs_dir2_data_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_DIR3_DATA_CRC_OFF)) || + !xfs_dir3_data_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } =20 static void -xfs_dir2_data_write_verify( +xfs_dir3_data_write_verify( struct xfs_buf *bp) { - xfs_dir2_data_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; + + if (!xfs_dir3_data_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_DATA_CRC_OFF); } =20 -const struct xfs_buf_ops xfs_dir2_data_buf_ops =3D { - .verify_read =3D xfs_dir2_data_read_verify, - .verify_write =3D xfs_dir2_data_write_verify, +const struct xfs_buf_ops xfs_dir3_data_buf_ops =3D { + .verify_read =3D xfs_dir3_data_read_verify, + .verify_write =3D xfs_dir3_data_write_verify, }; =20 -static const struct xfs_buf_ops xfs_dir2_data_reada_buf_ops =3D { - .verify_read =3D xfs_dir2_data_reada_verify, - .verify_write =3D xfs_dir2_data_write_verify, +static const struct xfs_buf_ops xfs_dir3_data_reada_buf_ops =3D { + .verify_read =3D xfs_dir3_data_reada_verify, + .verify_write =3D xfs_dir3_data_write_verify, }; =20 =20 int -xfs_dir2_data_read( +xfs_dir3_data_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, @@ -252,18 +284,18 @@ xfs_dir2_data_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp, - XFS_DATA_FORK, &xfs_dir2_data_buf_ops); + XFS_DATA_FORK, &xfs_dir3_data_buf_ops); } =20 int -xfs_dir2_data_readahead( +xfs_dir3_data_readahead( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mapped_bno) { return xfs_da_reada_buf(tp, dp, bno, mapped_bno, - XFS_DATA_FORK, &xfs_dir2_data_reada_buf_ops); + XFS_DATA_FORK, &xfs_dir3_data_reada_buf_ops); } =20 /* @@ -293,6 +325,7 @@ xfs_dir2_data_freefind( * one we're looking for it has to be exact. */ ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); for (dfp =3D &bf[0], seenzero =3D matched =3D 0; @@ -442,6 +475,7 @@ xfs_dir2_data_freescan( char *p; /* current entry pointer */ =20 ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); =20 @@ -518,13 +552,12 @@ xfs_dir3_data_init( XFS_DATA_FORK); if (error) return error; - bp->b_ops =3D &xfs_dir2_data_buf_ops; + bp->b_ops =3D &xfs_dir3_data_buf_ops; =20 /* * Initialize the header. */ hdr =3D bp->b_addr; - if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; =20 @@ -575,6 +608,7 @@ xfs_dir2_data_log_entry( xfs_dir2_data_hdr_t *hdr =3D bp->b_addr; =20 ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); =20 @@ -594,6 +628,7 @@ xfs_dir2_data_log_header( xfs_dir2_data_hdr_t *hdr =3D bp->b_addr; =20 ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); =20 @@ -612,6 +647,7 @@ xfs_dir2_data_log_unused( xfs_dir2_data_hdr_t *hdr =3D bp->b_addr; =20 ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); =20 @@ -659,7 +695,8 @@ xfs_dir2_data_make_free( /* * Figure out where the end of the data area is. */ - if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC)) + if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC)) endptr =3D (char *)hdr + mp->m_dirblksize; else { xfs_dir2_block_tail_t *btp; /* block tail */ @@ -841,6 +878,7 @@ xfs_dir2_data_use_free( =20 hdr =3D bp->b_addr; ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); ASSERT(be16_to_cpu(dup->freetag) =3D=3D XFS_DIR2_DATA_FREE_TAG); diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index a1df347..0f848b4 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -133,7 +133,7 @@ xfs_dir2_block_to_leaf( int needlog; /* need to log block header */ int needscan; /* need to rescan bestfree */ xfs_trans_t *tp; /* transaction pointer */ - struct xfs_dir2_data_free *bf; + struct xfs_dir2_data_free *bf; =20 trace_xfs_dir2_block_to_leaf(args); =20 @@ -159,7 +159,7 @@ xfs_dir2_block_to_leaf( ASSERT(lbp !=3D NULL); leaf =3D lbp->b_addr; hdr =3D dbp->b_addr; - xfs_dir2_data_check(dp, dbp); + xfs_dir3_data_check(dp, dbp); btp =3D xfs_dir2_block_tail_p(mp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); bf =3D xfs_dir3_data_bestfree_p(hdr); @@ -188,8 +188,12 @@ xfs_dir2_block_to_leaf( /* * Fix up the block header, make it a data block. */ - dbp->b_ops =3D &xfs_dir2_data_buf_ops; - hdr->magic =3D cpu_to_be32(XFS_DIR2_DATA_MAGIC); + dbp->b_ops =3D &xfs_dir3_data_buf_ops; + if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) + hdr->magic =3D cpu_to_be32(XFS_DIR2_DATA_MAGIC); + else + hdr->magic =3D cpu_to_be32(XFS_DIR3_DATA_MAGIC); + if (needscan) xfs_dir2_data_freescan(mp, hdr, &needlog); /* @@ -205,7 +209,7 @@ xfs_dir2_block_to_leaf( if (needlog) xfs_dir2_data_log_header(tp, dbp); xfs_dir2_leaf_check(dp, lbp); - xfs_dir2_data_check(dp, dbp); + xfs_dir3_data_check(dp, dbp); xfs_dir2_leaf_log_bests(tp, lbp, 0, 0); return 0; } @@ -369,6 +373,7 @@ xfs_dir2_leaf_addname( __be16 *tagp; /* end of data entry */ xfs_trans_t *tp; /* transaction pointer */ xfs_dir2_db_t use_block; /* data block number */ + struct xfs_dir2_data_free *bf; /* bestfree table */ =20 trace_xfs_dir2_leaf_addname(args); =20 @@ -552,14 +557,15 @@ xfs_dir2_leaf_addname( else xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); hdr =3D dbp->b_addr; - bestsp[use_block] =3D hdr->bestfree[0].length; + bf =3D xfs_dir3_data_bestfree_p(hdr); + bestsp[use_block] =3D bf[0].length; grown =3D 1; } else { /* * Already had space in some data block. * Just read that one in. */ - error =3D xfs_dir2_data_read(tp, dp, + error =3D xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, use_block), -1, &dbp); if (error) { @@ -567,13 +573,14 @@ xfs_dir2_leaf_addname( return error; } hdr =3D dbp->b_addr; + bf =3D xfs_dir3_data_bestfree_p(hdr); grown =3D 0; } /* * Point to the biggest freespace in our data block. */ dup =3D (xfs_dir2_data_unused_t *) - ((char *)hdr + be16_to_cpu(hdr->bestfree[0].offset)); + ((char *)hdr + be16_to_cpu(bf[0].offset)); ASSERT(be16_to_cpu(dup->length) >=3D length); needscan =3D needlog =3D 0; /* @@ -606,8 +613,8 @@ xfs_dir2_leaf_addname( * If the bests table needs to be changed, do it. * Log the change unless we've already done that. */ - if (be16_to_cpu(bestsp[use_block]) !=3D be16_to_cpu(hdr->bestfree[0].leng= th)) { - bestsp[use_block] =3D hdr->bestfree[0].length; + if (be16_to_cpu(bestsp[use_block]) !=3D be16_to_cpu(bf[0].length)) { + bestsp[use_block] =3D bf[0].length; if (!grown) xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); } @@ -627,7 +634,7 @@ xfs_dir2_leaf_addname( xfs_dir2_leaf_log_header(tp, lbp); xfs_dir2_leaf_log_ents(tp, lbp, lfloglow, lfloghigh); xfs_dir2_leaf_check(dp, lbp); - xfs_dir2_data_check(dp, dbp); + xfs_dir3_data_check(dp, dbp); return 0; } =20 @@ -1077,7 +1084,7 @@ xfs_dir2_leaf_lookup_int( if (newdb !=3D curdb) { if (dbp) xfs_trans_brelse(tp, dbp); - error =3D xfs_dir2_data_read(tp, dp, + error =3D xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, newdb), -1, &dbp); if (error) { @@ -1118,7 +1125,7 @@ xfs_dir2_leaf_lookup_int( ASSERT(cidb !=3D -1); if (cidb !=3D curdb) { xfs_trans_brelse(tp, dbp); - error =3D xfs_dir2_data_read(tp, dp, + error =3D xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, cidb), -1, &dbp); if (error) { @@ -1164,6 +1171,7 @@ xfs_dir2_leaf_removename( int needscan; /* need to rescan data frees */ xfs_dir2_data_off_t oldbest; /* old value of best free */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_data_free *bf; /* bestfree table */ =20 trace_xfs_dir2_leaf_removename(args); =20 @@ -1178,7 +1186,8 @@ xfs_dir2_leaf_removename( mp =3D dp->i_mount; leaf =3D lbp->b_addr; hdr =3D dbp->b_addr; - xfs_dir2_data_check(dp, dbp); + bf =3D xfs_dir3_data_bestfree_p(hdr); + xfs_dir3_data_check(dp, dbp); /* * Point to the leaf entry, use that to point to the data entry. */ @@ -1187,7 +1196,7 @@ xfs_dir2_leaf_removename( dep =3D (xfs_dir2_data_entry_t *) ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address= ))); needscan =3D needlog =3D 0; - oldbest =3D be16_to_cpu(hdr->bestfree[0].length); + oldbest =3D be16_to_cpu(bf[0].length); ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); bestsp =3D xfs_dir2_leaf_bests_p(ltp); ASSERT(be16_to_cpu(bestsp[db]) =3D=3D oldbest); @@ -1216,16 +1225,16 @@ xfs_dir2_leaf_removename( * If the longest freespace in the data block has changed, * put the new value in the bests table and log that. */ - if (be16_to_cpu(hdr->bestfree[0].length) !=3D oldbest) { - bestsp[db] =3D hdr->bestfree[0].length; + if (be16_to_cpu(bf[0].length) !=3D oldbest) { + bestsp[db] =3D bf[0].length; xfs_dir2_leaf_log_bests(tp, lbp, db, db); } - xfs_dir2_data_check(dp, dbp); + xfs_dir3_data_check(dp, dbp); /* * If the data block is now empty then get rid of the data block. */ - if (be16_to_cpu(hdr->bestfree[0].length) =3D=3D - mp->m_dirblksize - (uint)sizeof(*hdr)) { + if (be16_to_cpu(bf[0].length) =3D=3D + mp->m_dirblksize - xfs_dir3_data_entry_offset(hdr)) { ASSERT(db !=3D mp->m_dirdatablk); if ((error =3D xfs_dir2_shrink_inode(args, db, dbp))) { /* @@ -1405,7 +1414,7 @@ xfs_dir2_leaf_trim_data( /* * Read the offending data block. We need its buffer. */ - error =3D xfs_dir2_data_read(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp); + error =3D xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp); if (error) return error; =20 @@ -1415,10 +1424,12 @@ xfs_dir2_leaf_trim_data( #ifdef DEBUG { struct xfs_dir2_data_hdr *hdr =3D dbp->b_addr; + struct xfs_dir2_data_free *bf =3D xfs_dir3_data_bestfree_p(hdr); =20 - ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC)); - ASSERT(be16_to_cpu(hdr->bestfree[0].length) =3D=3D - mp->m_dirblksize - (uint)sizeof(*hdr)); + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC)); + ASSERT(be16_to_cpu(bf[0].length) =3D=3D + mp->m_dirblksize - xfs_dir3_data_entry_offset(hdr)); ASSERT(db =3D=3D be32_to_cpu(ltp->bestcount) - 1); } #endif diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index 0edaddc..9dda757 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -737,13 +737,13 @@ xfs_dir2_leafn_lookup_for_entry( ASSERT(state->extravalid); curbp =3D state->extrablk.bp; } else { - error =3D xfs_dir2_data_read(tp, dp, + error =3D xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, newdb), -1, &curbp); if (error) return error; } - xfs_dir2_data_check(dp, curbp); + xfs_dir3_data_check(dp, curbp); curdb =3D newdb; } /* @@ -771,7 +771,7 @@ xfs_dir2_leafn_lookup_for_entry( state->extrablk.index =3D (int)((char *)dep - (char *)curbp->b_addr); state->extrablk.magic =3D XFS_DIR2_DATA_MAGIC; - curbp->b_ops =3D &xfs_dir2_data_buf_ops; + curbp->b_ops =3D &xfs_dir3_data_buf_ops; if (cmp =3D=3D XFS_CMP_EXACT) return XFS_ERROR(EEXIST); } @@ -786,7 +786,7 @@ xfs_dir2_leafn_lookup_for_entry( state->extrablk.index =3D -1; state->extrablk.blkno =3D curdb; state->extrablk.magic =3D XFS_DIR2_DATA_MAGIC; - curbp->b_ops =3D &xfs_dir2_data_buf_ops; + curbp->b_ops =3D &xfs_dir3_data_buf_ops; } else { /* If the curbp is not the CI match block, drop it */ if (state->extrablk.bp !=3D curbp) @@ -1136,6 +1136,7 @@ xfs_dir2_leafn_remove( int needlog; /* need to log data header */ int needscan; /* need to rescan data frees */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_data_free *bf; /* bestfree table */ =20 trace_xfs_dir2_leafn_remove(args, index); =20 @@ -1170,7 +1171,8 @@ xfs_dir2_leafn_remove( dbp =3D dblk->bp; hdr =3D dbp->b_addr; dep =3D (xfs_dir2_data_entry_t *)((char *)hdr + off); - longest =3D be16_to_cpu(hdr->bestfree[0].length); + bf =3D xfs_dir3_data_bestfree_p(hdr); + longest =3D be16_to_cpu(bf[0].length); needlog =3D needscan =3D 0; xfs_dir2_data_make_free(tp, dbp, off, xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); @@ -1182,12 +1184,12 @@ xfs_dir2_leafn_remove( xfs_dir2_data_freescan(mp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, dbp); - xfs_dir2_data_check(dp, dbp); + xfs_dir3_data_check(dp, dbp); /* * If the longest data block freespace changes, need to update * the corresponding freeblock entry. */ - if (longest < be16_to_cpu(hdr->bestfree[0].length)) { + if (longest < be16_to_cpu(bf[0].length)) { int error; /* error return value */ struct xfs_buf *fbp; /* freeblock buffer */ xfs_dir2_db_t fdb; /* freeblock block number */ @@ -1217,12 +1219,13 @@ xfs_dir2_leafn_remove( * Calculate which entry we need to fix. */ findex =3D xfs_dir2_db_to_fdindex(mp, db); - longest =3D be16_to_cpu(hdr->bestfree[0].length); + longest =3D be16_to_cpu(bf[0].length); /* * If the data block is now empty we can get rid of it * (usually). */ - if (longest =3D=3D mp->m_dirblksize - (uint)sizeof(*hdr)) { + if (longest =3D=3D mp->m_dirblksize - + xfs_dir3_data_entry_offset(hdr)) { /* * Try to punch out the data block. */ @@ -1596,6 +1599,7 @@ xfs_dir2_node_addname_int( xfs_trans_t *tp; /* transaction pointer */ __be16 *bests; struct xfs_dir3_icfree_hdr freehdr; + struct xfs_dir2_data_free *bf; =20 dp =3D args->dp; mp =3D dp->i_mount; @@ -1853,7 +1857,8 @@ xfs_dir2_node_addname_int( * change again. */ hdr =3D dbp->b_addr; - bests[findex] =3D hdr->bestfree[0].length; + bf =3D xfs_dir3_data_bestfree_p(hdr); + bests[findex] =3D bf[0].length; logfree =3D 1; } /* @@ -1869,19 +1874,20 @@ xfs_dir2_node_addname_int( /* * Read the data block in. */ - error =3D xfs_dir2_data_read(tp, dp, xfs_dir2_db_to_da(mp, dbno), + error =3D xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, dbno), -1, &dbp); if (error) return error; hdr =3D dbp->b_addr; + bf =3D xfs_dir3_data_bestfree_p(hdr); logfree =3D 0; } - ASSERT(be16_to_cpu(hdr->bestfree[0].length) >=3D length); + ASSERT(be16_to_cpu(bf[0].length) >=3D length); /* * Point to the existing unused space. */ dup =3D (xfs_dir2_data_unused_t *) - ((char *)hdr + be16_to_cpu(hdr->bestfree[0].offset)); + ((char *)hdr + be16_to_cpu(bf[0].offset)); needscan =3D needlog =3D 0; /* * Mark the first part of the unused space, inuse for us. @@ -1913,8 +1919,8 @@ xfs_dir2_node_addname_int( * If the freespace entry is now wrong, update it. */ bests =3D xfs_dir3_free_bests_p(mp, free); /* gcc is so stupid */ - if (be16_to_cpu(bests[findex]) !=3D be16_to_cpu(hdr->bestfree[0].length))= { - bests[findex] =3D hdr->bestfree[0].length; + if (be16_to_cpu(bests[findex]) !=3D be16_to_cpu(bf[0].length)) { + bests[findex] =3D bf[0].length; logfree =3D 1; } /* @@ -2104,7 +2110,8 @@ xfs_dir2_node_replace( * Point to the data entry. */ hdr =3D state->extrablk.bp->b_addr; - ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC)); + ASSERT(hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_DATA_MAGIC) || + hdr->magic =3D=3D cpu_to_be32(XFS_DIR3_DATA_MAGIC)); dep =3D (xfs_dir2_data_entry_t *) ((char *)hdr + xfs_dir2_dataptr_to_off(state->mp, be32_to_cpu(lep->address))); diff --git a/libxfs/xfs_dir2_priv.h b/libxfs/xfs_dir2_priv.h index e6f2e0a..910e644 100644 --- a/libxfs/xfs_dir2_priv.h +++ b/libxfs/xfs_dir2_priv.h @@ -43,17 +43,17 @@ extern int xfs_dir2_leaf_to_block(struct xfs_da_args *a= rgs, =20 /* xfs_dir2_data.c */ #ifdef DEBUG -#define xfs_dir2_data_check(dp,bp) __xfs_dir2_data_check(dp, bp); +#define xfs_dir3_data_check(dp,bp) __xfs_dir3_data_check(dp, bp); #else -#define xfs_dir2_data_check(dp,bp) +#define xfs_dir3_data_check(dp,bp) #endif =20 -extern const struct xfs_buf_ops xfs_dir2_data_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_data_buf_ops; =20 -extern int __xfs_dir2_data_check(struct xfs_inode *dp, struct xfs_buf *bp); -extern int xfs_dir2_data_read(struct xfs_trans *tp, struct xfs_inode *dp, +extern int __xfs_dir3_data_check(struct xfs_inode *dp, struct xfs_buf *bp); +extern int xfs_dir3_data_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mapped_bno, struct xfs_buf **bpp); -extern int xfs_dir2_data_readahead(struct xfs_trans *tp, struct xfs_inode = *dp, +extern int xfs_dir3_data_readahead(struct xfs_trans *tp, struct xfs_inode = *dp, xfs_dablk_t bno, xfs_daddr_t mapped_bno); =20 extern struct xfs_dir2_data_free * =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-crc-patchset-v2/xfs-add-crc-to= -dir2-leaf-3=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=000000600=000001750=000001750=0000000262660=0012132011546=00020614= =00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfs: a= dd CRC checking to dir2 leaf blocks =46rom: Dave Chinner This addition follows the same pattern as the dir2 block CRCs. Seeing as both LEAF1 and LEAFN types need to changed at the same time, this is a pretty large amount of change. leaf block headers need to be abstracted away from the on-disk structures (struct xfs_dir3_icleaf_hdr), as do the base leaf entry locations. This header abstract allows the in-core header and leaf entry location to be passed around instead of the leaf block itself. This saves a lot of converting individual variables from on-disk format to host format where they are used, so there's a good chance that the compiler will be able to produce much more optimal code as it's not having to byteswap variables all over the place. Signed-off-by: Dave Chinner --- db/check.c | 2 +- db/dir2.c | 2 +- include/xfs_da_btree.h | 23 ++ include/xfs_dir2_format.h | 60 +++- libxfs/xfs_da_btree.c | 45 ++- libxfs/xfs_dir2_block.c | 19 +- libxfs/xfs_dir2_leaf.c | 786 ++++++++++++++++++++++++++++-------------= ---- libxfs/xfs_dir2_node.c | 475 +++++++++++++++------------ libxfs/xfs_dir2_priv.h | 32 +- repair/dir2.c | 12 +- repair/phase6.c | 14 +- 11 files changed, 938 insertions(+), 532 deletions(-) diff --git a/db/check.c b/db/check.c index 368d2b7..73d9da2 100644 --- a/db/check.c +++ b/db/check.c @@ -3304,7 +3304,7 @@ process_leaf_node_dir_v2_int( error++; return; } - lep =3D leaf->ents; + lep =3D xfs_dir3_leaf_ents_p(leaf); for (i =3D stale =3D 0; i < be16_to_cpu(leaf->hdr.count); i++) { if (be32_to_cpu(lep[i].address) =3D=3D XFS_DIR2_NULL_DATAPTR) stale++; diff --git a/db/dir2.c b/db/dir2.c index be58639..abdbfee 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -81,7 +81,7 @@ const field_t dir2_flds[] =3D { FLD_COUNT, TYP_NONE }, { "lbests", FLDT_DIR2_DATA_OFF, dir2_leaf_bests_offset, dir2_leaf_bests_count, FLD_ARRAY|FLD_OFFSET|FLD_COUNT, TYP_NONE }, - { "lents", FLDT_DIR2_LEAF_ENTRY, OI(LOFF(ents)), dir2_leaf_ents_count, + { "lents", FLDT_DIR2_LEAF_ENTRY, OI(LOFF(__ents)), dir2_leaf_ents_count, FLD_ARRAY|FLD_COUNT, TYP_NONE }, { "ltail", FLDT_DIR2_LEAF_TAIL, dir2_leaf_tail_offset, dir2_leaf_tail_count, FLD_OFFSET|FLD_COUNT, TYP_NONE }, diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index ee5170c..0854b95 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -47,6 +47,29 @@ typedef struct xfs_da_blkinfo { } xfs_da_blkinfo_t; =20 /* + * CRC enabled directory structure types + * + * The headers change size for the additional verification information, but + * otherwise the tree layouts and contents are unchanged. + */ +#define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks = */ +#define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ + +struct xfs_da3_blkinfo { + /* + * the node link manipulation code relies on the fact that the first + * element of this structure is the struct xfs_da_blkinfo so it can + * ignore the differences in the rest of the structures. + */ + struct xfs_da_blkinfo hdr; + __be32 crc; /* CRC of block */ + __be64 blkno; /* first block of the buffer */ + __be64 lsn; /* sequence number of last write */ + uuid_t uuid; /* filesystem we belong to */ + __be64 owner; /* inode that owns the block */ +}; + +/* * This is the structure of the root and intermediate nodes in the Btree. * The leaf nodes are defined above. * diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h index dfc8ccf..8bb4efe 100644 --- a/include/xfs_dir2_format.h +++ b/include/xfs_dir2_format.h @@ -470,6 +470,21 @@ typedef struct xfs_dir2_leaf_hdr { __be16 stale; /* count of stale entries */ } xfs_dir2_leaf_hdr_t; =20 +struct xfs_dir3_leaf_hdr { + struct xfs_da3_blkinfo info; /* header for da routines */ + __be16 count; /* count of entries */ + __be16 stale; /* count of stale entries */ + __be32 pad; +}; + +struct xfs_dir3_icleaf_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t stale; +}; + /* * Leaf block entry. */ @@ -489,23 +504,50 @@ typedef struct xfs_dir2_leaf_tail { * Leaf block. */ typedef struct xfs_dir2_leaf { - xfs_dir2_leaf_hdr_t hdr; /* leaf header */ - xfs_dir2_leaf_entry_t ents[]; /* entries */ + xfs_dir2_leaf_hdr_t hdr; /* leaf header */ + xfs_dir2_leaf_entry_t __ents[]; /* entries */ } xfs_dir2_leaf_t; =20 -/* - * DB blocks here are logical directory block numbers, not filesystem bloc= ks. - */ +struct xfs_dir3_leaf { + struct xfs_dir3_leaf_hdr hdr; /* leaf header */ + struct xfs_dir2_leaf_entry __ents[]; /* entries */ +}; + +#define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) + +static inline int +xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) + return sizeof(struct xfs_dir3_leaf_hdr); + return sizeof(struct xfs_dir2_leaf_hdr); +} =20 -static inline int xfs_dir2_max_leaf_ents(struct xfs_mount *mp) +static inline int +xfs_dir3_max_leaf_ents(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) { - return (mp->m_dirblksize - (uint)sizeof(struct xfs_dir2_leaf_hdr)) / + return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size(lp)) / (uint)sizeof(struct xfs_dir2_leaf_entry); } =20 /* * Get address of the bestcount field in the single-leaf block. */ +static inline struct xfs_dir2_leaf_entry * +xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_dir3_leaf *lp3 =3D (struct xfs_dir3_leaf *)lp; + return lp3->__ents; + } + return lp->__ents; +} + +/* + * Get address of the bestcount field in the single-leaf block. + */ static inline struct xfs_dir2_leaf_tail * xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) { @@ -524,6 +566,10 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) } =20 /* + * DB blocks here are logical directory block numbers, not filesystem bloc= ks. + */ + +/* * Convert dataptr to byte in file space */ static inline xfs_dir2_off_t diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index a31d353..63cd299 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -118,7 +118,8 @@ xfs_da_node_read_verify( bp->b_ops->verify_read(bp); return; case XFS_DIR2_LEAFN_MAGIC: - bp->b_ops =3D &xfs_dir2_leafn_buf_ops; + case XFS_DIR3_LEAFN_MAGIC: + bp->b_ops =3D &xfs_dir3_leafn_buf_ops; bp->b_ops->verify_read(bp); return; default: @@ -375,11 +376,18 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state= _blk_t *blk1, size =3D (int)((char *)&oldroot->btree[be16_to_cpu(oldroot->hdr.count)] - (char *)oldroot); } else { - ASSERT(oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; + leaf =3D (xfs_dir2_leaf_t *)oldroot; - size =3D (int)((char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] - - (char *)leaf); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents =3D xfs_dir3_leaf_ents_p(leaf); + + ASSERT(leafhdr.magic =3D=3D XFS_DIR2_LEAFN_MAGIC || + leafhdr.magic =3D=3D XFS_DIR3_LEAFN_MAGIC); + size =3D (int)((char *)&ents[leafhdr.count] - (char *)leaf); } + /* XXX: can't just copy CRC headers from one block to another */ memcpy(node, oldroot, size); xfs_trans_log_buf(tp, bp, 0, size - 1); =20 @@ -403,7 +411,8 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_b= lk_t *blk1, node->hdr.count =3D cpu_to_be16(2); =20 #ifdef DEBUG - if (oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { + if (oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { ASSERT(blk1->blkno >=3D mp->m_dirleafblk && blk1->blkno < mp->m_dirfreeblk); ASSERT(blk2->blkno >=3D mp->m_dirleafblk && @@ -761,6 +770,7 @@ xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo= *blkinfo, __u16 level) =20 if (level =3D=3D 1) { ASSERT(magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); } else ASSERT(magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); @@ -1544,6 +1554,7 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state= _path_t *path, info =3D blk->bp->b_addr; ASSERT(info->magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC) || info->magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + info->magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || info->magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); blk->magic =3D be16_to_cpu(info->magic); if (blk->magic =3D=3D XFS_DA_NODE_MAGIC) { @@ -1563,12 +1574,13 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_sta= te_path_t *path, NULL); break; case XFS_DIR2_LEAFN_MAGIC: + case XFS_DIR3_LEAFN_MAGIC: + blk->magic =3D XFS_DIR2_LEAFN_MAGIC; blk->hashval =3D xfs_dir2_leafn_lasthash(blk->bp, NULL); break; default: - ASSERT(blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC || - blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC); + ASSERT(0); break; } } @@ -1812,10 +1824,16 @@ xfs_da_swap_lastblock( /* * Get values from the moved block. */ - if (dead_info->magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { + if (dead_info->magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + dead_info->magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; + dead_leaf2 =3D (xfs_dir2_leaf_t *)dead_info; + xfs_dir3_leaf_hdr_from_disk(&leafhdr, dead_leaf2); + ents =3D xfs_dir3_leaf_ents_p(dead_leaf2); dead_level =3D 0; - dead_hash =3D be32_to_cpu(dead_leaf2->ents[be16_to_cpu(dead_leaf2->hdr.c= ount) - 1].hashval); + dead_hash =3D be32_to_cpu(ents[leafhdr.count - 1].hashval); } else { ASSERT(dead_info->magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); dead_node =3D (xfs_da_intnode_t *)dead_info; @@ -2260,10 +2278,17 @@ xfs_da_read_buf( XFS_TEST_ERROR((magic !=3D XFS_DA_NODE_MAGIC) && (magic !=3D XFS_ATTR_LEAF_MAGIC) && (magic !=3D XFS_DIR2_LEAF1_MAGIC) && + (magic !=3D XFS_DIR3_LEAF1_MAGIC) && (magic !=3D XFS_DIR2_LEAFN_MAGIC) && + (magic !=3D XFS_DIR3_LEAFN_MAGIC) && (magic1 !=3D XFS_DIR2_BLOCK_MAGIC) && + (magic1 !=3D XFS_DIR3_BLOCK_MAGIC) && (magic1 !=3D XFS_DIR2_DATA_MAGIC) && - (free->hdr.magic !=3D cpu_to_be32(XFS_DIR2_FREE_MAGIC)), + (magic1 !=3D XFS_DIR3_DATA_MAGIC) && + (free->hdr.magic !=3D + cpu_to_be32(XFS_DIR2_FREE_MAGIC)) && + (free->hdr.magic !=3D + cpu_to_be32(XFS_DIR3_FREE_MAGIC)), mp, XFS_ERRTAG_DA_READ_BUF, XFS_RANDOM_DA_READ_BUF))) { trace_xfs_da_btree_corrupt(bp, _RET_IP_); diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index 18eabd1..b98b749 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -897,6 +897,8 @@ xfs_dir2_leaf_to_block( __be16 *tagp; /* end of entry (tag) */ int to; /* block/leaf to index */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; =20 trace_xfs_dir2_leaf_to_block(args); =20 @@ -904,8 +906,12 @@ xfs_dir2_leaf_to_block( tp =3D args->trans; mp =3D dp->i_mount; leaf =3D lbp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents =3D xfs_dir3_leaf_ents_p(leaf); ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); + + ASSERT(leafhdr.magic =3D=3D XFS_DIR2_LEAF1_MAGIC || + leafhdr.magic =3D=3D XFS_DIR3_LEAF1_MAGIC); /* * If there are data blocks other than the first one, take this * opportunity to remove trailing empty data blocks that may have @@ -942,7 +948,7 @@ xfs_dir2_leaf_to_block( * Size of the "leaf" area in the block. */ size =3D (uint)sizeof(xfs_dir2_block_tail_t) + - (uint)sizeof(*lep) * (be16_to_cpu(leaf->hdr.count) - be16_to_cpu(l= eaf->hdr.stale)); + (uint)sizeof(*lep) * (leafhdr.count - leafhdr.stale); /* * Look at the last data entry. */ @@ -971,18 +977,17 @@ xfs_dir2_leaf_to_block( * Initialize the block tail. */ btp =3D xfs_dir2_block_tail_p(mp, hdr); - btp->count =3D cpu_to_be32(be16_to_cpu(leaf->hdr.count) - be16_to_cpu(lea= f->hdr.stale)); + btp->count =3D cpu_to_be32(leafhdr.count - leafhdr.stale); btp->stale =3D 0; xfs_dir2_block_log_tail(tp, dbp); /* * Initialize the block leaf area. We compact out stale entries. */ lep =3D xfs_dir2_block_leaf_p(btp); - for (from =3D to =3D 0; from < be16_to_cpu(leaf->hdr.count); from++) { - if (leaf->ents[from].address =3D=3D - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + for (from =3D to =3D 0; from < leafhdr.count; from++) { + if (ents[from].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) continue; - lep[to++] =3D leaf->ents[from]; + lep[to++] =3D ents[from]; } ASSERT(to =3D=3D be32_to_cpu(btp->count)); xfs_dir2_block_log_leaf(tp, dbp, 0, be32_to_cpu(btp->count) - 1); diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 0f848b4..f00b23c 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -21,73 +22,257 @@ /* * Local function declarations. */ -#ifdef DEBUG -static void xfs_dir2_leaf_check(struct xfs_inode *dp, struct xfs_buf *bp); -#else -#define xfs_dir2_leaf_check(dp, bp) -#endif static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, struct xfs_buf **= lbpp, int *indexp, struct xfs_buf **dbpp); -static void xfs_dir2_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *= bp, +static void xfs_dir3_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *= bp, int first, int last); -static void xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *b= p); +static void xfs_dir3_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *b= p); =20 -static void -xfs_dir2_leaf_verify( +/* + * Check the internal consistency of a leaf1 block. + * Pop an assert if something is wrong. + */ +#ifdef DEBUG +#define xfs_dir3_leaf_check(mp, bp) \ +do { \ + if (!xfs_dir3_leaf1_check((mp), (bp))) \ + ASSERT(0); \ +} while (0); + +STATIC bool +xfs_dir3_leaf1_check( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dir2_leaf *leaf =3D bp->b_addr; + struct xfs_dir3_icleaf_hdr leafhdr; + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + + if (leafhdr.magic =3D=3D XFS_DIR3_LEAF1_MAGIC) { + struct xfs_dir3_leaf_hdr *leaf3 =3D bp->b_addr; + if (be64_to_cpu(leaf3->info.blkno) !=3D bp->b_bn) + return false; + } else if (leafhdr.magic !=3D XFS_DIR2_LEAF1_MAGIC) + return false; + + return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); +} +#else +#define xfs_dir3_leaf_check(mp, bp) +#endif + +void +xfs_dir3_leaf_hdr_from_disk( + struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from) +{ + if (from->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + from->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { + to->forw =3D be32_to_cpu(from->hdr.info.forw); + to->back =3D be32_to_cpu(from->hdr.info.back); + to->magic =3D be16_to_cpu(from->hdr.info.magic); + to->count =3D be16_to_cpu(from->hdr.count); + to->stale =3D be16_to_cpu(from->hdr.stale); + } else { + struct xfs_dir3_leaf_hdr *hdr3 =3D (struct xfs_dir3_leaf_hdr *)from; + + to->forw =3D be32_to_cpu(hdr3->info.hdr.forw); + to->back =3D be32_to_cpu(hdr3->info.hdr.back); + to->magic =3D be16_to_cpu(hdr3->info.hdr.magic); + to->count =3D be16_to_cpu(hdr3->count); + to->stale =3D be16_to_cpu(hdr3->stale); + } + + ASSERT(to->magic =3D=3D XFS_DIR2_LEAF1_MAGIC || + to->magic =3D=3D XFS_DIR3_LEAF1_MAGIC || + to->magic =3D=3D XFS_DIR2_LEAFN_MAGIC || + to->magic =3D=3D XFS_DIR3_LEAFN_MAGIC); +} + +void +xfs_dir3_leaf_hdr_to_disk( + struct xfs_dir2_leaf *to, + struct xfs_dir3_icleaf_hdr *from) +{ + ASSERT(from->magic =3D=3D XFS_DIR2_LEAF1_MAGIC || + from->magic =3D=3D XFS_DIR3_LEAF1_MAGIC || + from->magic =3D=3D XFS_DIR2_LEAFN_MAGIC || + from->magic =3D=3D XFS_DIR3_LEAFN_MAGIC); + + if (from->magic =3D=3D XFS_DIR2_LEAF1_MAGIC || + from->magic =3D=3D XFS_DIR2_LEAFN_MAGIC) { + to->hdr.info.forw =3D cpu_to_be32(from->forw); + to->hdr.info.back =3D cpu_to_be32(from->back); + to->hdr.info.magic =3D cpu_to_be16(from->magic); + to->hdr.count =3D cpu_to_be16(from->count); + to->hdr.stale =3D cpu_to_be16(from->stale); + } else { + struct xfs_dir3_leaf_hdr *hdr3 =3D (struct xfs_dir3_leaf_hdr *)to; + + hdr3->info.hdr.forw =3D cpu_to_be32(from->forw); + hdr3->info.hdr.back =3D cpu_to_be32(from->back); + hdr3->info.hdr.magic =3D cpu_to_be16(from->magic); + hdr3->count =3D cpu_to_be16(from->count); + hdr3->stale =3D cpu_to_be16(from->stale); + } +} + +bool +xfs_dir3_leaf_check_int( + struct xfs_mount *mp, + struct xfs_dir3_icleaf_hdr *hdr, + struct xfs_dir2_leaf *leaf) +{ + struct xfs_dir2_leaf_entry *ents; + xfs_dir2_leaf_tail_t *ltp; + int stale; + int i; + + ents =3D xfs_dir3_leaf_ents_p(leaf); + ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); + + /* + * XXX (dgc): This value is not restrictive enough. + * Should factor in the size of the bests table as well. + * We can deduce a value for that from di_size. + */ + if (hdr->count > xfs_dir3_max_leaf_ents(mp, leaf)) + return false; + + /* Leaves and bests don't overlap in leaf format. */ + if ((hdr->magic =3D=3D XFS_DIR2_LEAF1_MAGIC || + hdr->magic =3D=3D XFS_DIR3_LEAF1_MAGIC) && + (char *)&ents[hdr->count] > (char *)xfs_dir2_leaf_bests_p(ltp)) + return false; + + /* Check hash value order, count stale entries. */ + for (i =3D stale =3D 0; i < hdr->count; i++) { + if (i + 1 < hdr->count) { + if (be32_to_cpu(ents[i].hashval) > + be32_to_cpu(ents[i + 1].hashval)) + return false; + } + if (ents[i].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + stale++; + } + if (hdr->stale !=3D stale) + return false; + return true; +} + +static bool +xfs_dir3_leaf_verify( struct xfs_buf *bp, - __be16 magic) + __uint16_t magic) { struct xfs_mount *mp =3D bp->b_target->bt_mount; - struct xfs_dir2_leaf_hdr *hdr =3D bp->b_addr; - int block_ok =3D 0; + struct xfs_dir2_leaf *leaf =3D bp->b_addr; + struct xfs_dir3_icleaf_hdr leafhdr; + + ASSERT(magic =3D=3D XFS_DIR2_LEAF1_MAGIC || magic =3D=3D XFS_DIR2_LEAFN_M= AGIC); + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dir3_leaf_hdr *leaf3 =3D bp->b_addr; =20 - block_ok =3D hdr->info.magic =3D=3D magic; - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); + if ((magic =3D=3D XFS_DIR2_LEAF1_MAGIC && + leafhdr.magic !=3D XFS_DIR3_LEAF1_MAGIC) || + (magic =3D=3D XFS_DIR2_LEAFN_MAGIC && + leafhdr.magic !=3D XFS_DIR3_LEAFN_MAGIC)) + return false; + + if (!uuid_equal(&leaf3->info.uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(leaf3->info.blkno) !=3D bp->b_bn) + return false; + } else { + if (leafhdr.magic !=3D magic) + return false; + } + return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); +} + +static void +__read_verify( + struct xfs_buf *bp, + __uint16_t magic) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_DIR3_LEAF_CRC_OFF)) || + !xfs_dir3_leaf_verify(bp, magic)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } } =20 static void -xfs_dir2_leaf1_read_verify( +__write_verify( + struct xfs_buf *bp, + __uint16_t magic) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + struct xfs_dir3_leaf_hdr *hdr3 =3D bp->b_addr; + + if (!xfs_dir3_leaf_verify(bp, magic)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->info.lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_LEAF_CRC_OFF); +} + +static void +xfs_dir3_leaf1_read_verify( struct xfs_buf *bp) { - xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); + __read_verify(bp, XFS_DIR2_LEAF1_MAGIC); } =20 static void -xfs_dir2_leaf1_write_verify( +xfs_dir3_leaf1_write_verify( struct xfs_buf *bp) { - xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); + __write_verify(bp, XFS_DIR2_LEAF1_MAGIC); } =20 void -xfs_dir2_leafn_read_verify( +xfs_dir3_leafn_read_verify( struct xfs_buf *bp) { - xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + __read_verify(bp, XFS_DIR2_LEAFN_MAGIC); } =20 void -xfs_dir2_leafn_write_verify( +xfs_dir3_leafn_write_verify( struct xfs_buf *bp) { - xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + __write_verify(bp, XFS_DIR2_LEAFN_MAGIC); } =20 -static const struct xfs_buf_ops xfs_dir2_leaf1_buf_ops =3D { - .verify_read =3D xfs_dir2_leaf1_read_verify, - .verify_write =3D xfs_dir2_leaf1_write_verify, +const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops =3D { + .verify_read =3D xfs_dir3_leaf1_read_verify, + .verify_write =3D xfs_dir3_leaf1_write_verify, }; =20 -const struct xfs_buf_ops xfs_dir2_leafn_buf_ops =3D { - .verify_read =3D xfs_dir2_leafn_read_verify, - .verify_write =3D xfs_dir2_leafn_write_verify, +const struct xfs_buf_ops xfs_dir3_leafn_buf_ops =3D { + .verify_read =3D xfs_dir3_leafn_read_verify, + .verify_write =3D xfs_dir3_leafn_write_verify, }; =20 static int -xfs_dir2_leaf_read( +xfs_dir3_leaf_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, @@ -95,11 +280,11 @@ xfs_dir2_leaf_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, - XFS_DATA_FORK, &xfs_dir2_leaf1_buf_ops); + XFS_DATA_FORK, &xfs_dir3_leaf1_buf_ops); } =20 int -xfs_dir2_leafn_read( +xfs_dir3_leafn_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, @@ -107,7 +292,81 @@ xfs_dir2_leafn_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, - XFS_DATA_FORK, &xfs_dir2_leafn_buf_ops); + XFS_DATA_FORK, &xfs_dir3_leafn_buf_ops); +} + +/* + * Initialize a new leaf block, leaf1 or leafn magic accepted. + */ +static void +xfs_dir3_leaf_init( + struct xfs_mount *mp, + struct xfs_buf *bp, + xfs_ino_t owner, + __uint16_t type) +{ + struct xfs_dir2_leaf *leaf =3D bp->b_addr; + + ASSERT(type =3D=3D XFS_DIR2_LEAF1_MAGIC || type =3D=3D XFS_DIR2_LEAFN_MAG= IC); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_dir3_leaf_hdr *leaf3 =3D bp->b_addr; + + memset(leaf3, 0, sizeof(*leaf3)); + + leaf3->info.hdr.magic =3D (type =3D=3D XFS_DIR2_LEAF1_MAGIC) + ? cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) + : cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); + leaf3->info.blkno =3D cpu_to_be64(bp->b_bn); + leaf3->info.owner =3D cpu_to_be64(owner); + uuid_copy(&leaf3->info.uuid, &mp->m_sb.sb_uuid); + } else { + memset(leaf, 0, sizeof(*leaf)); + leaf->hdr.info.magic =3D cpu_to_be16(type); + } + + /* + * If it's a leaf-format directory initialize the tail. + * Caller is responsible for initialising the bests table. + */ + if (type =3D=3D XFS_DIR2_LEAF1_MAGIC) { + struct xfs_dir2_leaf_tail *ltp; + + ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); + ltp->bestcount =3D 0; + bp->b_ops =3D &xfs_dir3_leaf1_buf_ops; + } else + bp->b_ops =3D &xfs_dir3_leafn_buf_ops; +} + +int +xfs_dir3_leaf_get_buf( + xfs_da_args_t *args, + xfs_dir2_db_t bno, + struct xfs_buf **bpp, + __uint16_t magic) +{ + struct xfs_inode *dp =3D args->dp; + struct xfs_trans *tp =3D args->trans; + struct xfs_mount *mp =3D dp->i_mount; + struct xfs_buf *bp; + int error; + + ASSERT(magic =3D=3D XFS_DIR2_LEAF1_MAGIC || magic =3D=3D XFS_DIR2_LEAFN_M= AGIC); + ASSERT(bno >=3D XFS_DIR2_LEAF_FIRSTDB(mp) && + bno < XFS_DIR2_FREE_FIRSTDB(mp)); + + error =3D xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, + XFS_DATA_FORK); + if (error) + return error; + + xfs_dir3_leaf_init(mp, bp, dp->i_ino, magic); + xfs_dir3_leaf_log_header(tp, bp); + if (magic =3D=3D XFS_DIR2_LEAF1_MAGIC) + xfs_dir3_leaf_log_tail(tp, bp); + *bpp =3D bp; + return 0; } =20 /* @@ -134,6 +393,8 @@ xfs_dir2_block_to_leaf( int needscan; /* need to rescan bestfree */ xfs_trans_t *tp; /* transaction pointer */ struct xfs_dir2_data_free *bf; + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; =20 trace_xfs_dir2_block_to_leaf(args); =20 @@ -153,27 +414,33 @@ xfs_dir2_block_to_leaf( /* * Initialize the leaf block, get a buffer for it. */ - if ((error =3D xfs_dir2_leaf_init(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC))= ) { + error =3D xfs_dir3_leaf_get_buf(args, ldb, &lbp, XFS_DIR2_LEAF1_MAGIC); + if (error) return error; - } - ASSERT(lbp !=3D NULL); + leaf =3D lbp->b_addr; hdr =3D dbp->b_addr; xfs_dir3_data_check(dp, dbp); btp =3D xfs_dir2_block_tail_p(mp, hdr); blp =3D xfs_dir2_block_leaf_p(btp); bf =3D xfs_dir3_data_bestfree_p(hdr); + ents =3D xfs_dir3_leaf_ents_p(leaf); + /* * Set the counts in the leaf header. */ - leaf->hdr.count =3D cpu_to_be16(be32_to_cpu(btp->count)); - leaf->hdr.stale =3D cpu_to_be16(be32_to_cpu(btp->stale)); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + leafhdr.count =3D be32_to_cpu(btp->count); + leafhdr.stale =3D be32_to_cpu(btp->stale); + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, lbp); + /* * Could compact these but I think we always do the conversion * after squeezing out stale entries. */ - memcpy(leaf->ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_en= try_t)); - xfs_dir2_leaf_log_ents(tp, lbp, 0, be16_to_cpu(leaf->hdr.count) - 1); + memcpy(ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t)= ); + xfs_dir3_leaf_log_ents(tp, lbp, 0, leafhdr.count - 1); needscan =3D 0; needlog =3D 1; /* @@ -208,15 +475,16 @@ xfs_dir2_block_to_leaf( */ if (needlog) xfs_dir2_data_log_header(tp, dbp); - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(mp, lbp); xfs_dir3_data_check(dp, dbp); - xfs_dir2_leaf_log_bests(tp, lbp, 0, 0); + xfs_dir3_leaf_log_bests(tp, lbp, 0, 0); return 0; } =20 STATIC void -xfs_dir2_leaf_find_stale( - struct xfs_dir2_leaf *leaf, +xfs_dir3_leaf_find_stale( + struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int index, int *lowstale, int *highstale) @@ -225,7 +493,7 @@ xfs_dir2_leaf_find_stale( * Find the first stale entry before our index, if any. */ for (*lowstale =3D index - 1; *lowstale >=3D 0; --*lowstale) { - if (leaf->ents[*lowstale].address =3D=3D + if (ents[*lowstale].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) break; } @@ -235,10 +503,8 @@ xfs_dir2_leaf_find_stale( * Stop if the result would require moving more entries than using * lowstale. */ - for (*highstale =3D index; - *highstale < be16_to_cpu(leaf->hdr.count); - ++*highstale) { - if (leaf->ents[*highstale].address =3D=3D + for (*highstale =3D index; *highstale < leafhdr->count; ++*highstale) { + if (ents[*highstale].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) break; if (*lowstale >=3D 0 && index - *lowstale <=3D *highstale - index) @@ -247,8 +513,9 @@ xfs_dir2_leaf_find_stale( } =20 struct xfs_dir2_leaf_entry * -xfs_dir2_leaf_find_entry( - xfs_dir2_leaf_t *leaf, /* leaf structure */ +xfs_dir3_leaf_find_entry( + struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int index, /* leaf table position */ int compact, /* need to compact leaves */ int lowstale, /* index of prev stale leaf */ @@ -256,7 +523,7 @@ xfs_dir2_leaf_find_entry( int *lfloglow, /* low leaf logging index */ int *lfloghigh) /* high leaf logging index */ { - if (!leaf->hdr.stale) { + if (!leafhdr->stale) { xfs_dir2_leaf_entry_t *lep; /* leaf entry table pointer */ =20 /* @@ -264,18 +531,16 @@ xfs_dir2_leaf_find_entry( * * If there are no stale entries, just insert a hole at index. */ - lep =3D &leaf->ents[index]; - if (index < be16_to_cpu(leaf->hdr.count)) + lep =3D &ents[index]; + if (index < leafhdr->count) memmove(lep + 1, lep, - (be16_to_cpu(leaf->hdr.count) - index) * - sizeof(*lep)); + (leafhdr->count - index) * sizeof(*lep)); =20 /* * Record low and high logging indices for the leaf. */ *lfloglow =3D index; - *lfloghigh =3D be16_to_cpu(leaf->hdr.count); - be16_add_cpu(&leaf->hdr.count, 1); + *lfloghigh =3D leafhdr->count++; return lep; } =20 @@ -289,16 +554,17 @@ xfs_dir2_leaf_find_entry( * entries before and after our insertion point. */ if (compact =3D=3D 0) - xfs_dir2_leaf_find_stale(leaf, index, &lowstale, &highstale); + xfs_dir3_leaf_find_stale(leafhdr, ents, index, + &lowstale, &highstale); =20 /* * If the low one is better, use it. */ if (lowstale >=3D 0 && - (highstale =3D=3D be16_to_cpu(leaf->hdr.count) || + (highstale =3D=3D leafhdr->count || index - lowstale - 1 < highstale - index)) { ASSERT(index - lowstale - 1 >=3D 0); - ASSERT(leaf->ents[lowstale].address =3D=3D + ASSERT(ents[lowstale].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); =20 /* @@ -306,37 +572,34 @@ xfs_dir2_leaf_find_entry( * for the new entry. */ if (index - lowstale - 1 > 0) { - memmove(&leaf->ents[lowstale], - &leaf->ents[lowstale + 1], + memmove(&ents[lowstale], &ents[lowstale + 1], (index - lowstale - 1) * - sizeof(xfs_dir2_leaf_entry_t)); + sizeof(xfs_dir2_leaf_entry_t)); } *lfloglow =3D MIN(lowstale, *lfloglow); *lfloghigh =3D MAX(index - 1, *lfloghigh); - be16_add_cpu(&leaf->hdr.stale, -1); - return &leaf->ents[index - 1]; + leafhdr->stale--; + return &ents[index - 1]; } =20 /* * The high one is better, so use that one. */ ASSERT(highstale - index >=3D 0); - ASSERT(leaf->ents[highstale].address =3D=3D - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); + ASSERT(ents[highstale].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)); =20 /* * Copy entries down to cover the stale entry and make room for the * new entry. */ if (highstale - index > 0) { - memmove(&leaf->ents[index + 1], - &leaf->ents[index], + memmove(&ents[index + 1], &ents[index], (highstale - index) * sizeof(xfs_dir2_leaf_entry_t)); } *lfloglow =3D MIN(index, *lfloglow); *lfloghigh =3D MAX(highstale, *lfloghigh); - be16_add_cpu(&leaf->hdr.stale, -1); - return &leaf->ents[index]; + leafhdr->stale--; + return &ents[index]; } =20 /* @@ -374,6 +637,8 @@ xfs_dir2_leaf_addname( xfs_trans_t *tp; /* transaction pointer */ xfs_dir2_db_t use_block; /* data block number */ struct xfs_dir2_data_free *bf; /* bestfree table */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; =20 trace_xfs_dir2_leaf_addname(args); =20 @@ -381,7 +646,7 @@ xfs_dir2_leaf_addname( tp =3D args->trans; mp =3D dp->i_mount; =20 - error =3D xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + error =3D xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); if (error) return error; =20 @@ -394,16 +659,19 @@ xfs_dir2_leaf_addname( index =3D xfs_dir2_leaf_search_hash(args, lbp); leaf =3D lbp->b_addr; ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); + ents =3D xfs_dir3_leaf_ents_p(leaf); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); bestsp =3D xfs_dir2_leaf_bests_p(ltp); length =3D xfs_dir2_data_entsize(args->namelen); + /* * See if there are any entries with the same hash value * and space in their block for the new entry. * This is good because it puts multiple same-hash value entries * in a data block, improving the lookup of those entries. */ - for (use_block =3D -1, lep =3D &leaf->ents[index]; - index < be16_to_cpu(leaf->hdr.count) && be32_to_cpu(lep->hashval) = =3D=3D args->hashval; + for (use_block =3D -1, lep =3D &ents[index]; + index < leafhdr.count && be32_to_cpu(lep->hashval) =3D=3D args->hash= val; index++, lep++) { if (be32_to_cpu(lep->address) =3D=3D XFS_DIR2_NULL_DATAPTR) continue; @@ -436,7 +704,7 @@ xfs_dir2_leaf_addname( * How many bytes do we need in the leaf block? */ needbytes =3D 0; - if (!leaf->hdr.stale) + if (!leafhdr.stale) needbytes +=3D sizeof(xfs_dir2_leaf_entry_t); if (use_block =3D=3D -1) needbytes +=3D sizeof(xfs_dir2_data_off_t); @@ -451,16 +719,15 @@ xfs_dir2_leaf_addname( * If we don't have enough free bytes but we can make enough * by compacting out stale entries, we'll do that. */ - if ((char *)bestsp - (char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] < - needbytes && be16_to_cpu(leaf->hdr.stale) > 1) { + if ((char *)bestsp - (char *)&ents[leafhdr.count] < needbytes && + leafhdr.stale > 1) compact =3D 1; - } + /* * Otherwise if we don't have enough free bytes we need to * convert to node form. */ - else if ((char *)bestsp - (char *)&leaf->ents[be16_to_cpu( - leaf->hdr.count)] < needbytes) { + else if ((char *)bestsp - (char *)&ents[leafhdr.count] < needbytes) { /* * Just checking or no space reservation, give up. */ @@ -508,15 +775,15 @@ xfs_dir2_leaf_addname( * point later. */ if (compact) { - xfs_dir2_leaf_compact_x1(lbp, &index, &lowstale, &highstale, - &lfloglow, &lfloghigh); + xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale, + &highstale, &lfloglow, &lfloghigh); } /* * There are stale entries, so we'll need log-low and log-high * impossibly bad values later. */ - else if (be16_to_cpu(leaf->hdr.stale)) { - lfloglow =3D be16_to_cpu(leaf->hdr.count); + else if (leafhdr.stale) { + lfloglow =3D leafhdr.count; lfloghigh =3D -1; } /* @@ -548,14 +815,14 @@ xfs_dir2_leaf_addname( memmove(&bestsp[0], &bestsp[1], be32_to_cpu(ltp->bestcount) * sizeof(bestsp[0])); be32_add_cpu(<p->bestcount, 1); - xfs_dir2_leaf_log_tail(tp, lbp); - xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); } /* * If we're filling in a previously empty block just log it. */ else - xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); + xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); hdr =3D dbp->b_addr; bf =3D xfs_dir3_data_bestfree_p(hdr); bestsp[use_block] =3D bf[0].length; @@ -616,10 +883,10 @@ xfs_dir2_leaf_addname( if (be16_to_cpu(bestsp[use_block]) !=3D be16_to_cpu(bf[0].length)) { bestsp[use_block] =3D bf[0].length; if (!grown) - xfs_dir2_leaf_log_bests(tp, lbp, use_block, use_block); + xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); } =20 - lep =3D xfs_dir2_leaf_find_entry(leaf, index, compact, lowstale, + lep =3D xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale, highstale, &lfloglow, &lfloghigh); =20 /* @@ -631,82 +898,40 @@ xfs_dir2_leaf_addname( /* * Log the leaf fields and give up the buffers. */ - xfs_dir2_leaf_log_header(tp, lbp); - xfs_dir2_leaf_log_ents(tp, lbp, lfloglow, lfloghigh); - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, lbp); + xfs_dir3_leaf_log_ents(tp, lbp, lfloglow, lfloghigh); + xfs_dir3_leaf_check(mp, lbp); xfs_dir3_data_check(dp, dbp); return 0; } =20 -#ifdef DEBUG -/* - * Check the internal consistency of a leaf1 block. - * Pop an assert if something is wrong. - */ -STATIC void -xfs_dir2_leaf_check( - struct xfs_inode *dp, /* incore directory inode */ - struct xfs_buf *bp) /* leaf's buffer */ -{ - int i; /* leaf index */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ - xfs_dir2_leaf_tail_t *ltp; /* leaf tail pointer */ - xfs_mount_t *mp; /* filesystem mount point */ - int stale; /* count of stale leaves */ - - leaf =3D bp->b_addr; - mp =3D dp->i_mount; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); - /* - * This value is not restrictive enough. - * Should factor in the size of the bests table as well. - * We can deduce a value for that from di_size. - */ - ASSERT(be16_to_cpu(leaf->hdr.count) <=3D xfs_dir2_max_leaf_ents(mp)); - ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); - /* - * Leaves and bests don't overlap. - */ - ASSERT((char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] <=3D - (char *)xfs_dir2_leaf_bests_p(ltp)); - /* - * Check hash value order, count stale entries. - */ - for (i =3D stale =3D 0; i < be16_to_cpu(leaf->hdr.count); i++) { - if (i + 1 < be16_to_cpu(leaf->hdr.count)) - ASSERT(be32_to_cpu(leaf->ents[i].hashval) <=3D - be32_to_cpu(leaf->ents[i + 1].hashval)); - if (leaf->ents[i].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) - stale++; - } - ASSERT(be16_to_cpu(leaf->hdr.stale) =3D=3D stale); -} -#endif /* DEBUG */ - /* * Compact out any stale entries in the leaf. * Log the header and changed leaf entries, if any. */ void -xfs_dir2_leaf_compact( +xfs_dir3_leaf_compact( xfs_da_args_t *args, /* operation arguments */ + struct xfs_dir3_icleaf_hdr *leafhdr, struct xfs_buf *bp) /* leaf buffer */ { int from; /* source leaf index */ xfs_dir2_leaf_t *leaf; /* leaf structure */ int loglow; /* first leaf entry to log */ int to; /* target leaf index */ + struct xfs_dir2_leaf_entry *ents; =20 leaf =3D bp->b_addr; - if (!leaf->hdr.stale) { + if (!leafhdr->stale) return; - } + /* * Compress out the stale entries in place. */ - for (from =3D to =3D 0, loglow =3D -1; from < be16_to_cpu(leaf->hdr.count= ); from++) { - if (leaf->ents[from].address =3D=3D - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + ents =3D xfs_dir3_leaf_ents_p(leaf); + for (from =3D to =3D 0, loglow =3D -1; from < leafhdr->count; from++) { + if (ents[from].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) continue; /* * Only actually copy the entries that are different. @@ -714,19 +939,21 @@ xfs_dir2_leaf_compact( if (from > to) { if (loglow =3D=3D -1) loglow =3D to; - leaf->ents[to] =3D leaf->ents[from]; + ents[to] =3D ents[from]; } to++; } /* * Update and log the header, log the leaf entries. */ - ASSERT(be16_to_cpu(leaf->hdr.stale) =3D=3D from - to); - be16_add_cpu(&leaf->hdr.count, -(be16_to_cpu(leaf->hdr.stale))); - leaf->hdr.stale =3D 0; - xfs_dir2_leaf_log_header(args->trans, bp); + ASSERT(leafhdr->stale =3D=3D from - to); + leafhdr->count -=3D leafhdr->stale; + leafhdr->stale =3D 0; + + xfs_dir3_leaf_hdr_to_disk(leaf, leafhdr); + xfs_dir3_leaf_log_header(args->trans, bp); if (loglow !=3D -1) - xfs_dir2_leaf_log_ents(args->trans, bp, loglow, to - 1); + xfs_dir3_leaf_log_ents(args->trans, bp, loglow, to - 1); } =20 /* @@ -738,8 +965,9 @@ xfs_dir2_leaf_compact( * and leaf logging indices. */ void -xfs_dir2_leaf_compact_x1( - struct xfs_buf *bp, /* leaf buffer */ +xfs_dir3_leaf_compact_x1( + struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int *indexp, /* insertion index */ int *lowstalep, /* out: stale entry before us */ int *highstalep, /* out: stale entry after us */ @@ -750,22 +978,20 @@ xfs_dir2_leaf_compact_x1( int highstale; /* stale entry at/after index */ int index; /* insertion index */ int keepstale; /* source index of kept stale */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ int lowstale; /* stale entry before index */ int newindex=3D0; /* new insertion index */ int to; /* destination copy index */ =20 - leaf =3D bp->b_addr; - ASSERT(be16_to_cpu(leaf->hdr.stale) > 1); + ASSERT(leafhdr->stale > 1); index =3D *indexp; =20 - xfs_dir2_leaf_find_stale(leaf, index, &lowstale, &highstale); + xfs_dir3_leaf_find_stale(leafhdr, ents, index, &lowstale, &highstale); =20 /* * Pick the better of lowstale and highstale. */ if (lowstale >=3D 0 && - (highstale =3D=3D be16_to_cpu(leaf->hdr.count) || + (highstale =3D=3D leafhdr->count || index - lowstale <=3D highstale - index)) keepstale =3D lowstale; else @@ -774,15 +1000,14 @@ xfs_dir2_leaf_compact_x1( * Copy the entries in place, removing all the stale entries * except keepstale. */ - for (from =3D to =3D 0; from < be16_to_cpu(leaf->hdr.count); from++) { + for (from =3D to =3D 0; from < leafhdr->count; from++) { /* * Notice the new value of index. */ if (index =3D=3D from) newindex =3D to; if (from !=3D keepstale && - leaf->ents[from].address =3D=3D - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) { + ents[from].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) { if (from =3D=3D to) *lowlogp =3D to; continue; @@ -796,7 +1021,7 @@ xfs_dir2_leaf_compact_x1( * Copy only the entries that have moved. */ if (from > to) - leaf->ents[to] =3D leaf->ents[from]; + ents[to] =3D ents[from]; to++; } ASSERT(from > to); @@ -810,8 +1035,8 @@ xfs_dir2_leaf_compact_x1( /* * Adjust the leaf header values. */ - be16_add_cpu(&leaf->hdr.count, -(from - to)); - leaf->hdr.stale =3D cpu_to_be16(1); + leafhdr->count -=3D from - to; + leafhdr->stale =3D 1; /* * Remember the low/high stale value only in the "right" * direction. @@ -819,75 +1044,18 @@ xfs_dir2_leaf_compact_x1( if (lowstale >=3D newindex) lowstale =3D -1; else - highstale =3D be16_to_cpu(leaf->hdr.count); - *highlogp =3D be16_to_cpu(leaf->hdr.count) - 1; + highstale =3D leafhdr->count; + *highlogp =3D leafhdr->count - 1; *lowstalep =3D lowstale; *highstalep =3D highstale; } =20 -/* - * Initialize a new leaf block, leaf1 or leafn magic accepted. - */ -int -xfs_dir2_leaf_init( - xfs_da_args_t *args, /* operation arguments */ - xfs_dir2_db_t bno, /* directory block number */ - struct xfs_buf **bpp, /* out: leaf buffer */ - int magic) /* magic number for block */ -{ - struct xfs_buf *bp; /* leaf buffer */ - xfs_inode_t *dp; /* incore directory inode */ - int error; /* error return code */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ - xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ - xfs_mount_t *mp; /* filesystem mount point */ - xfs_trans_t *tp; /* transaction pointer */ - - dp =3D args->dp; - ASSERT(dp !=3D NULL); - tp =3D args->trans; - mp =3D dp->i_mount; - ASSERT(bno >=3D XFS_DIR2_LEAF_FIRSTDB(mp) && - bno < XFS_DIR2_FREE_FIRSTDB(mp)); - /* - * Get the buffer for the block. - */ - error =3D xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, - XFS_DATA_FORK); - if (error) - return error; - - /* - * Initialize the header. - */ - leaf =3D bp->b_addr; - leaf->hdr.info.magic =3D cpu_to_be16(magic); - leaf->hdr.info.forw =3D 0; - leaf->hdr.info.back =3D 0; - leaf->hdr.count =3D 0; - leaf->hdr.stale =3D 0; - xfs_dir2_leaf_log_header(tp, bp); - /* - * If it's a leaf-format directory initialize the tail. - * In this case our caller has the real bests table to copy into - * the block. - */ - if (magic =3D=3D XFS_DIR2_LEAF1_MAGIC) { - bp->b_ops =3D &xfs_dir2_leaf1_buf_ops; - ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); - ltp->bestcount =3D 0; - xfs_dir2_leaf_log_tail(tp, bp); - } else - bp->b_ops =3D &xfs_dir2_leafn_buf_ops; - *bpp =3D bp; - return 0; -} =20 /* * Log the bests entries indicated from a leaf1 block. */ static void -xfs_dir2_leaf_log_bests( +xfs_dir3_leaf_log_bests( xfs_trans_t *tp, /* transaction pointer */ struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ @@ -895,11 +1063,12 @@ xfs_dir2_leaf_log_bests( { __be16 *firstb; /* pointer to first entry */ __be16 *lastb; /* pointer to last entry */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf =3D bp->b_addr; xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ =20 - leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)); + ltp =3D xfs_dir2_leaf_tail_p(tp->t_mountp, leaf); firstb =3D xfs_dir2_leaf_bests_p(ltp) + first; lastb =3D xfs_dir2_leaf_bests_p(ltp) + last; @@ -911,7 +1080,7 @@ xfs_dir2_leaf_log_bests( * Log the leaf entries indicated from a leaf1 or leafn block. */ void -xfs_dir2_leaf_log_ents( +xfs_dir3_leaf_log_ents( xfs_trans_t *tp, /* transaction pointer */ struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ @@ -919,13 +1088,17 @@ xfs_dir2_leaf_log_ents( { xfs_dir2_leaf_entry_t *firstlep; /* pointer to first entry */ xfs_dir2_leaf_entry_t *lastlep; /* pointer to last entry */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf =3D bp->b_addr; + struct xfs_dir2_leaf_entry *ents; =20 - leaf =3D bp->b_addr; ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || - leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - firstlep =3D &leaf->ents[first]; - lastlep =3D &leaf->ents[last]; + leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); + + ents =3D xfs_dir3_leaf_ents_p(leaf); + firstlep =3D &ents[first]; + lastlep =3D &ents[last]; xfs_trans_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), (uint)((char *)lastlep - (char *)leaf + sizeof(*lastlep) - 1)); } @@ -934,34 +1107,38 @@ xfs_dir2_leaf_log_ents( * Log the header of the leaf1 or leafn block. */ void -xfs_dir2_leaf_log_header( +xfs_dir3_leaf_log_header( struct xfs_trans *tp, struct xfs_buf *bp) { - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf =3D bp->b_addr; =20 - leaf =3D bp->b_addr; ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || - leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); + xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), - (uint)(sizeof(leaf->hdr) - 1)); + xfs_dir3_leaf_hdr_size(leaf) - 1); } =20 /* * Log the tail of the leaf1 block. */ STATIC void -xfs_dir2_leaf_log_tail( +xfs_dir3_leaf_log_tail( struct xfs_trans *tp, struct xfs_buf *bp) { - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf =3D bp->b_addr; xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ - xfs_mount_t *mp; /* filesystem mount point */ + struct xfs_mount *mp =3D tp->t_mountp; + + ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || + leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || + leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); =20 - mp =3D tp->t_mountp; - leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)); ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), (uint)(mp->m_dirblksize - 1)); @@ -985,6 +1162,7 @@ xfs_dir2_leaf_lookup( xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_leaf_entry *ents; =20 trace_xfs_dir2_leaf_lookup(args); =20 @@ -996,12 +1174,14 @@ xfs_dir2_leaf_lookup( } tp =3D args->trans; dp =3D args->dp; - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(dp->i_mount, lbp); leaf =3D lbp->b_addr; + ents =3D xfs_dir3_leaf_ents_p(leaf); /* * Get to the leaf entry and contained data entry address. */ - lep =3D &leaf->ents[index]; + lep =3D &ents[index]; + /* * Point to the data entry. */ @@ -1045,18 +1225,23 @@ xfs_dir2_leaf_lookup_int( xfs_trans_t *tp; /* transaction pointer */ xfs_dir2_db_t cidb =3D -1; /* case match data block no. */ enum xfs_dacmp cmp; /* name compare result */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; =20 dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; =20 - error =3D xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + error =3D xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); if (error) return error; =20 *lbpp =3D lbp; leaf =3D lbp->b_addr; - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(mp, lbp); + ents =3D xfs_dir3_leaf_ents_p(leaf); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + /* * Look for the first leaf entry with our hash value. */ @@ -1065,9 +1250,9 @@ xfs_dir2_leaf_lookup_int( * Loop over all the entries with the right hash value * looking to match the name. */ - for (lep =3D &leaf->ents[index]; index < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(lep->hashval) =3D=3D args->hashval; - lep++, index++) { + for (lep =3D &ents[index]; + index < leafhdr.count && be32_to_cpu(lep->hashval) =3D=3D args->hash= val; + lep++, index++) { /* * Skip over stale leaf entries. */ @@ -1172,6 +1357,8 @@ xfs_dir2_leaf_removename( xfs_dir2_data_off_t oldbest; /* old value of best free */ xfs_trans_t *tp; /* transaction pointer */ struct xfs_dir2_data_free *bf; /* bestfree table */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; =20 trace_xfs_dir2_leaf_removename(args); =20 @@ -1186,12 +1373,14 @@ xfs_dir2_leaf_removename( mp =3D dp->i_mount; leaf =3D lbp->b_addr; hdr =3D dbp->b_addr; - bf =3D xfs_dir3_data_bestfree_p(hdr); xfs_dir3_data_check(dp, dbp); + bf =3D xfs_dir3_data_bestfree_p(hdr); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents =3D xfs_dir3_leaf_ents_p(leaf); /* * Point to the leaf entry, use that to point to the data entry. */ - lep =3D &leaf->ents[index]; + lep =3D &ents[index]; db =3D xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); dep =3D (xfs_dir2_data_entry_t *) ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address= ))); @@ -1209,10 +1398,13 @@ xfs_dir2_leaf_removename( /* * We just mark the leaf entry stale by putting a null in it. */ - be16_add_cpu(&leaf->hdr.stale, 1); - xfs_dir2_leaf_log_header(tp, lbp); + leafhdr.stale++; + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, lbp); + lep->address =3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir2_leaf_log_ents(tp, lbp, index, index); + xfs_dir3_leaf_log_ents(tp, lbp, index, index); + /* * Scan the freespace in the data block again if necessary, * log the data block header if necessary. @@ -1227,7 +1419,7 @@ xfs_dir2_leaf_removename( */ if (be16_to_cpu(bf[0].length) !=3D oldbest) { bestsp[db] =3D bf[0].length; - xfs_dir2_leaf_log_bests(tp, lbp, db, db); + xfs_dir3_leaf_log_bests(tp, lbp, db, db); } xfs_dir3_data_check(dp, dbp); /* @@ -1245,7 +1437,7 @@ xfs_dir2_leaf_removename( */ if (error =3D=3D ENOSPC && args->total =3D=3D 0) error =3D 0; - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(mp, lbp); return error; } dbp =3D NULL; @@ -1268,8 +1460,8 @@ xfs_dir2_leaf_removename( memmove(&bestsp[db - i], bestsp, (be32_to_cpu(ltp->bestcount) - (db - i)) * sizeof(*bestsp)); be32_add_cpu(<p->bestcount, -(db - i)); - xfs_dir2_leaf_log_tail(tp, lbp); - xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); } else bestsp[db] =3D cpu_to_be16(NULLDATAOFF); } @@ -1279,7 +1471,7 @@ xfs_dir2_leaf_removename( else if (db !=3D mp->m_dirdatablk) dbp =3D NULL; =20 - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(mp, lbp); /* * See if we can convert to block form. */ @@ -1302,6 +1494,7 @@ xfs_dir2_leaf_replace( xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_leaf_entry *ents; =20 trace_xfs_dir2_leaf_replace(args); =20 @@ -1313,10 +1506,11 @@ xfs_dir2_leaf_replace( } dp =3D args->dp; leaf =3D lbp->b_addr; + ents =3D xfs_dir3_leaf_ents_p(leaf); /* * Point to the leaf entry, get data address from it. */ - lep =3D &leaf->ents[index]; + lep =3D &ents[index]; /* * Point to the data entry. */ @@ -1330,7 +1524,7 @@ xfs_dir2_leaf_replace( dep->inumber =3D cpu_to_be64(args->inumber); tp =3D args->trans; xfs_dir2_data_log_entry(tp, dbp, dep); - xfs_dir2_leaf_check(dp, lbp); + xfs_dir3_leaf_check(dp->i_mount, lbp); xfs_trans_brelse(tp, lbp); return 0; } @@ -1352,17 +1546,22 @@ xfs_dir2_leaf_search_hash( xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */ int mid=3D0; /* current leaf index */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; =20 leaf =3D lbp->b_addr; + ents =3D xfs_dir3_leaf_ents_p(leaf); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + #ifndef __KERNEL__ - if (!leaf->hdr.count) + if (!leafhdr.count) return 0; #endif /* * Note, the table cannot be empty, so we have to go through the loop. * Binary search the leaf entries looking for our hash value. */ - for (lep =3D leaf->ents, low =3D 0, high =3D be16_to_cpu(leaf->hdr.count)= - 1, + for (lep =3D ents, low =3D 0, high =3D leafhdr.count - 1, hashwant =3D args->hashval; low <=3D high; ) { mid =3D (low + high) >> 1; @@ -1448,23 +1647,29 @@ xfs_dir2_leaf_trim_data( bestsp =3D xfs_dir2_leaf_bests_p(ltp); be32_add_cpu(<p->bestcount, -1); memmove(&bestsp[1], &bestsp[0], be32_to_cpu(ltp->bestcount) * sizeof(*bes= tsp)); - xfs_dir2_leaf_log_tail(tp, lbp); - xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); return 0; } =20 static inline size_t -xfs_dir2_leaf_size( - struct xfs_dir2_leaf_hdr *hdr, +xfs_dir3_leaf_size( + struct xfs_dir3_icleaf_hdr *hdr, int counts) { - int entries; + int entries; + int hdrsize; + + entries =3D hdr->count - hdr->stale; + if (hdr->magic =3D=3D XFS_DIR2_LEAF1_MAGIC || + hdr->magic =3D=3D XFS_DIR2_LEAFN_MAGIC) + hdrsize =3D sizeof(struct xfs_dir2_leaf_hdr); + else + hdrsize =3D sizeof(struct xfs_dir3_leaf_hdr); =20 - entries =3D be16_to_cpu(hdr->count) - be16_to_cpu(hdr->stale); - return sizeof(xfs_dir2_leaf_hdr_t) + - entries * sizeof(xfs_dir2_leaf_entry_t) + - counts * sizeof(xfs_dir2_data_off_t) + - sizeof(xfs_dir2_leaf_tail_t); + return hdrsize + entries * sizeof(xfs_dir2_leaf_entry_t) + + counts * sizeof(xfs_dir2_data_off_t) + + sizeof(xfs_dir2_leaf_tail_t); } =20 /* @@ -1488,6 +1693,7 @@ xfs_dir2_node_to_leaf( xfs_mount_t *mp; /* filesystem mount point */ int rval; /* successful free trim? */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir3_icfree_hdr freehdr; =20 /* @@ -1538,7 +1744,11 @@ xfs_dir2_node_to_leaf( return 0; lbp =3D state->path.blk[0].bp; leaf =3D lbp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + + ASSERT(leafhdr.magic =3D=3D XFS_DIR2_LEAFN_MAGIC || + leafhdr.magic =3D=3D XFS_DIR3_LEAFN_MAGIC); + /* * Read the freespace block. */ @@ -1554,36 +1764,40 @@ xfs_dir2_node_to_leaf( * Now see if the leafn and free data will fit in a leaf1. * If not, release the buffer and give up. */ - if (xfs_dir2_leaf_size(&leaf->hdr, freehdr.nvalid) > mp->m_dirblksize) { + if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > mp->m_dirblksize) { xfs_trans_brelse(tp, fbp); return 0; } =20 /* * If the leaf has any stale entries in it, compress them out. - * The compact routine will log the header. */ - if (be16_to_cpu(leaf->hdr.stale)) - xfs_dir2_leaf_compact(args, lbp); - else - xfs_dir2_leaf_log_header(tp, lbp); + if (leafhdr.stale) + xfs_dir3_leaf_compact(args, &leafhdr, lbp); =20 - lbp->b_ops =3D &xfs_dir2_leaf1_buf_ops; - leaf->hdr.info.magic =3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC); + lbp->b_ops =3D &xfs_dir3_leaf1_buf_ops; + leafhdr.magic =3D (leafhdr.magic =3D=3D XFS_DIR2_LEAFN_MAGIC) + ? XFS_DIR2_LEAF1_MAGIC + : XFS_DIR3_LEAF1_MAGIC; =20 /* * Set up the leaf tail from the freespace block. */ ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount =3D cpu_to_be32(freehdr.nvalid); + /* * Set up the leaf bests table. */ memcpy(xfs_dir2_leaf_bests_p(ltp), xfs_dir3_free_bests_p(mp, free), freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); - xfs_dir2_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); - xfs_dir2_leaf_log_tail(tp, lbp); - xfs_dir2_leaf_check(dp, lbp); + + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, lbp); + xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_check(mp, lbp); + /* * Get rid of the freespace block. */ diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index f87a245..9b93816 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -24,14 +24,6 @@ */ static int xfs_dir2_leafn_add(struct xfs_buf *bp, xfs_da_args_t *args, int index); -#ifdef DEBUG -static void xfs_dir2_leafn_check(struct xfs_inode *dp, struct xfs_buf *bp); -#else -#define xfs_dir2_leafn_check(dp, bp) -#endif -static void xfs_dir2_leafn_moveents(xfs_da_args_t *args, struct xfs_buf *b= p_s, - int start_s, struct xfs_buf *bp_d, - int start_d, int count); static void xfs_dir2_leafn_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_da_state_blk_t *blk2); @@ -41,6 +33,39 @@ static int xfs_dir2_leafn_remove(xfs_da_args_t *args, st= ruct xfs_buf *bp, static int xfs_dir2_node_addname_int(xfs_da_args_t *args, xfs_da_state_blk_t *fblk); =20 +/* + * Check internal consistency of a leafn block. + */ +#ifdef DEBUG +#define xfs_dir3_leaf_check(mp, bp) \ +do { \ + if (!xfs_dir3_leafn_check((mp), (bp))) \ + ASSERT(0); \ +} while (0); + +static bool +xfs_dir3_leafn_check( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dir2_leaf *leaf =3D bp->b_addr; + struct xfs_dir3_icleaf_hdr leafhdr; + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + + if (leafhdr.magic =3D=3D XFS_DIR3_LEAFN_MAGIC) { + struct xfs_dir3_leaf_hdr *leaf3 =3D bp->b_addr; + if (be64_to_cpu(leaf3->info.blkno) !=3D bp->b_bn) + return false; + } else if (leafhdr.magic !=3D XFS_DIR2_LEAFN_MAGIC) + return false; + + return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); +} +#else +#define xfs_dir3_leaf_check(mp, bp) +#endif + static bool xfs_dir3_free_verify( struct xfs_buf *bp) @@ -344,11 +369,19 @@ xfs_dir2_leaf_to_node( xfs_dir2_free_log_bests(tp, fbp, 0, freehdr.nvalid - 1); xfs_dir2_free_log_header(tp, fbp); =20 - /* convert the leaf to a leafnode */ - leaf->hdr.info.magic =3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); - lbp->b_ops =3D &xfs_dir2_leafn_buf_ops; - xfs_dir2_leaf_log_header(tp, lbp); - xfs_dir2_leafn_check(dp, lbp); + /* + * Converting the leaf to a leafnode is just a matter of changing the + * magic number and the ops. Do the change directly to the buffer as + * it's less work (and less code) than decoding the header to host + * format and back again. + */ + if (leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAF1_MAGIC)) + leaf->hdr.info.magic =3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC); + else + leaf->hdr.info.magic =3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); + lbp->b_ops =3D &xfs_dir3_leafn_buf_ops; + xfs_dir3_leaf_log_header(tp, lbp); + xfs_dir3_leaf_check(mp, lbp); return 0; } =20 @@ -372,6 +405,8 @@ xfs_dir2_leafn_add( int lowstale; /* previous stale entry */ xfs_mount_t *mp; /* filesystem mount point */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; =20 trace_xfs_dir2_leafn_add(args, index); =20 @@ -379,6 +414,8 @@ xfs_dir2_leafn_add( mp =3D dp->i_mount; tp =3D args->trans; leaf =3D bp->b_addr; + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents =3D xfs_dir3_leaf_ents_p(leaf); =20 /* * Quick check just to make sure we are not going to index @@ -394,15 +431,15 @@ xfs_dir2_leafn_add( * a compact. */ =20 - if (be16_to_cpu(leaf->hdr.count) =3D=3D xfs_dir2_max_leaf_ents(mp)) { - if (!leaf->hdr.stale) + if (leafhdr.count =3D=3D xfs_dir3_max_leaf_ents(mp, leaf)) { + if (!leafhdr.stale) return XFS_ERROR(ENOSPC); - compact =3D be16_to_cpu(leaf->hdr.stale) > 1; + compact =3D leafhdr.stale > 1; } else compact =3D 0; - ASSERT(index =3D=3D 0 || be32_to_cpu(leaf->ents[index - 1].hashval) <=3D = args->hashval); - ASSERT(index =3D=3D be16_to_cpu(leaf->hdr.count) || - be32_to_cpu(leaf->ents[index].hashval) >=3D args->hashval); + ASSERT(index =3D=3D 0 || be32_to_cpu(ents[index - 1].hashval) <=3D args->= hashval); + ASSERT(index =3D=3D leafhdr.count || + be32_to_cpu(ents[index].hashval) >=3D args->hashval); =20 if (args->op_flags & XFS_DA_OP_JUSTCHECK) return 0; @@ -411,62 +448,35 @@ xfs_dir2_leafn_add( * Compact out all but one stale leaf entry. Leaves behind * the entry closest to index. */ - if (compact) { - xfs_dir2_leaf_compact_x1(bp, &index, &lowstale, &highstale, - &lfloglow, &lfloghigh); - } - /* - * Set impossible logging indices for this case. - */ - else if (leaf->hdr.stale) { - lfloglow =3D be16_to_cpu(leaf->hdr.count); + if (compact) + xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale, + &highstale, &lfloglow, &lfloghigh); + else if (leafhdr.stale) { + /* + * Set impossible logging indices for this case. + */ + lfloglow =3D leafhdr.count; lfloghigh =3D -1; } =20 /* * Insert the new entry, log everything. */ - lep =3D xfs_dir2_leaf_find_entry(leaf, index, compact, lowstale, + lep =3D xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale, highstale, &lfloglow, &lfloghigh); =20 lep->hashval =3D cpu_to_be32(args->hashval); lep->address =3D cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, args->blkno, args->index)); - xfs_dir2_leaf_log_header(tp, bp); - xfs_dir2_leaf_log_ents(tp, bp, lfloglow, lfloghigh); - xfs_dir2_leafn_check(dp, bp); + + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, bp); + xfs_dir3_leaf_log_ents(tp, bp, lfloglow, lfloghigh); + xfs_dir3_leaf_check(mp, bp); return 0; } =20 #ifdef DEBUG -/* - * Check internal consistency of a leafn block. - */ -void -xfs_dir2_leafn_check( - struct xfs_inode *dp, - struct xfs_buf *bp) -{ - int i; /* leaf index */ - xfs_dir2_leaf_t *leaf; /* leaf structure */ - xfs_mount_t *mp; /* filesystem mount point */ - int stale; /* count of stale leaves */ - - leaf =3D bp->b_addr; - mp =3D dp->i_mount; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - ASSERT(be16_to_cpu(leaf->hdr.count) <=3D xfs_dir2_max_leaf_ents(mp)); - for (i =3D stale =3D 0; i < be16_to_cpu(leaf->hdr.count); i++) { - if (i + 1 < be16_to_cpu(leaf->hdr.count)) { - ASSERT(be32_to_cpu(leaf->ents[i].hashval) <=3D - be32_to_cpu(leaf->ents[i + 1].hashval)); - } - if (leaf->ents[i].address =3D=3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) - stale++; - } - ASSERT(be16_to_cpu(leaf->hdr.stale) =3D=3D stale); -} - static void xfs_dir2_free_hdr_check( struct xfs_mount *mp, @@ -494,15 +504,22 @@ xfs_dir2_leafn_lasthash( struct xfs_buf *bp, /* leaf buffer */ int *count) /* count of entries in leaf */ { - xfs_dir2_leaf_t *leaf; /* leaf structure */ + struct xfs_dir2_leaf *leaf =3D bp->b_addr; + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + + ASSERT(leafhdr.magic =3D=3D XFS_DIR2_LEAFN_MAGIC || + leafhdr.magic =3D=3D XFS_DIR3_LEAFN_MAGIC); =20 - leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); if (count) - *count =3D be16_to_cpu(leaf->hdr.count); - if (!leaf->hdr.count) + *count =3D leafhdr.count; + if (!leafhdr.count) return 0; - return be32_to_cpu(leaf->ents[be16_to_cpu(leaf->hdr.count) - 1].hashval); + + ents =3D xfs_dir3_leaf_ents_p(leaf); + return be32_to_cpu(ents[leafhdr.count - 1].hashval); } =20 /* @@ -531,16 +548,19 @@ xfs_dir2_leafn_lookup_for_addname( xfs_dir2_db_t newdb; /* new data block number */ xfs_dir2_db_t newfdb; /* new free block number */ xfs_trans_t *tp; /* transaction pointer */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; =20 dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); -#ifdef __KERNEL__ - ASSERT(be16_to_cpu(leaf->hdr.count) > 0); -#endif - xfs_dir2_leafn_check(dp, bp); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents =3D xfs_dir3_leaf_ents_p(leaf); + + xfs_dir3_leaf_check(mp, bp); + ASSERT(leafhdr.count > 0); + /* * Look up the hash value in the leaf entries. */ @@ -560,9 +580,9 @@ xfs_dir2_leafn_lookup_for_addname( /* * Loop over leaf entries with the right hash value. */ - for (lep =3D &leaf->ents[index]; index < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(lep->hashval) =3D=3D args->hashval; - lep++, index++) { + for (lep =3D &ents[index]; + index < leafhdr.count && be32_to_cpu(lep->hashval) =3D=3D args->hash= val; + lep++, index++) { /* * Skip stale leaf entries. */ @@ -678,16 +698,19 @@ xfs_dir2_leafn_lookup_for_entry( xfs_dir2_db_t newdb; /* new data block number */ xfs_trans_t *tp; /* transaction pointer */ enum xfs_dacmp cmp; /* comparison result */ + struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; =20 dp =3D args->dp; tp =3D args->trans; mp =3D dp->i_mount; leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); -#ifdef __KERNEL__ - ASSERT(be16_to_cpu(leaf->hdr.count) > 0); -#endif - xfs_dir2_leafn_check(dp, bp); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents =3D xfs_dir3_leaf_ents_p(leaf); + + xfs_dir3_leaf_check(mp, bp); + ASSERT(leafhdr.count > 0); + /* * Look up the hash value in the leaf entries. */ @@ -702,9 +725,9 @@ xfs_dir2_leafn_lookup_for_entry( /* * Loop over leaf entries with the right hash value. */ - for (lep =3D &leaf->ents[index]; index < be16_to_cpu(leaf->hdr.count) && - be32_to_cpu(lep->hashval) =3D=3D args->hashval; - lep++, index++) { + for (lep =3D &ents[index]; + index < leafhdr.count && be32_to_cpu(lep->hashval) =3D=3D args->hash= val; + lep++, index++) { /* * Skip stale leaf entries. */ @@ -776,8 +799,7 @@ xfs_dir2_leafn_lookup_for_entry( return XFS_ERROR(EEXIST); } } - ASSERT(index =3D=3D be16_to_cpu(leaf->hdr.count) || - (args->op_flags & XFS_DA_OP_OKNOENT)); + ASSERT(index =3D=3D leafhdr.count || (args->op_flags & XFS_DA_OP_OKNOENT)= ); if (curbp) { if (args->cmpresult =3D=3D XFS_CMP_DIFFERENT) { /* Giving back last used data block. */ @@ -822,52 +844,50 @@ xfs_dir2_leafn_lookup_int( * Log entries and headers. Stale entries are preserved. */ static void -xfs_dir2_leafn_moveents( - xfs_da_args_t *args, /* operation arguments */ - struct xfs_buf *bp_s, /* source leaf buffer */ - int start_s, /* source leaf index */ - struct xfs_buf *bp_d, /* destination leaf buffer */ - int start_d, /* destination leaf index */ - int count) /* count of leaves to copy */ +xfs_dir3_leafn_moveents( + xfs_da_args_t *args, /* operation arguments */ + struct xfs_buf *bp_s, /* source */ + struct xfs_dir3_icleaf_hdr *shdr, + struct xfs_dir2_leaf_entry *sents, + int start_s,/* source leaf index */ + struct xfs_buf *bp_d, /* destination */ + struct xfs_dir3_icleaf_hdr *dhdr, + struct xfs_dir2_leaf_entry *dents, + int start_d,/* destination leaf index */ + int count) /* count of leaves to copy */ { - xfs_dir2_leaf_t *leaf_d; /* destination leaf structure */ - xfs_dir2_leaf_t *leaf_s; /* source leaf structure */ - int stale; /* count stale leaves copied */ - xfs_trans_t *tp; /* transaction pointer */ + struct xfs_trans *tp =3D args->trans; + int stale; /* count stale leaves copied */ =20 trace_xfs_dir2_leafn_moveents(args, start_s, start_d, count); =20 /* * Silently return if nothing to do. */ - if (count =3D=3D 0) { + if (count =3D=3D 0) return; - } - tp =3D args->trans; - leaf_s =3D bp_s->b_addr; - leaf_d =3D bp_d->b_addr; + /* * If the destination index is not the end of the current * destination leaf entries, open up a hole in the destination * to hold the new entries. */ - if (start_d < be16_to_cpu(leaf_d->hdr.count)) { - memmove(&leaf_d->ents[start_d + count], &leaf_d->ents[start_d], - (be16_to_cpu(leaf_d->hdr.count) - start_d) * - sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir2_leaf_log_ents(tp, bp_d, start_d + count, - count + be16_to_cpu(leaf_d->hdr.count) - 1); + if (start_d < dhdr->count) { + memmove(&dents[start_d + count], &dents[start_d], + (dhdr->count - start_d) * sizeof(xfs_dir2_leaf_entry_t)); + xfs_dir3_leaf_log_ents(tp, bp_d, start_d + count, + count + dhdr->count - 1); } /* * If the source has stale leaves, count the ones in the copy range * so we can update the header correctly. */ - if (leaf_s->hdr.stale) { + if (shdr->stale) { int i; /* temp leaf index */ =20 for (i =3D start_s, stale =3D 0; i < start_s + count; i++) { - if (leaf_s->ents[i].address =3D=3D - cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) + if (sents[i].address =3D=3D + cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) stale++; } } else @@ -875,29 +895,27 @@ xfs_dir2_leafn_moveents( /* * Copy the leaf entries from source to destination. */ - memcpy(&leaf_d->ents[start_d], &leaf_s->ents[start_s], + memcpy(&dents[start_d], &sents[start_s], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir2_leaf_log_ents(tp, bp_d, start_d, start_d + count - 1); + xfs_dir3_leaf_log_ents(tp, bp_d, start_d, start_d + count - 1); + /* * If there are source entries after the ones we copied, * delete the ones we copied by sliding the next ones down. */ - if (start_s + count < be16_to_cpu(leaf_s->hdr.count)) { - memmove(&leaf_s->ents[start_s], &leaf_s->ents[start_s + count], + if (start_s + count < shdr->count) { + memmove(&sents[start_s], &sents[start_s + count], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir2_leaf_log_ents(tp, bp_s, start_s, start_s + count - 1); + xfs_dir3_leaf_log_ents(tp, bp_s, start_s, start_s + count - 1); } + /* * Update the headers and log them. */ - be16_add_cpu(&leaf_s->hdr.count, -(count)); - be16_add_cpu(&leaf_s->hdr.stale, -(stale)); - be16_add_cpu(&leaf_d->hdr.count, count); - be16_add_cpu(&leaf_d->hdr.stale, stale); - xfs_dir2_leaf_log_header(tp, bp_s); - xfs_dir2_leaf_log_header(tp, bp_d); - xfs_dir2_leafn_check(args->dp, bp_s); - xfs_dir2_leafn_check(args->dp, bp_d); + shdr->count -=3D count; + shdr->stale -=3D stale; + dhdr->count +=3D count; + dhdr->stale +=3D stale; } =20 /* @@ -906,21 +924,25 @@ xfs_dir2_leafn_moveents( */ int /* sort order */ xfs_dir2_leafn_order( - struct xfs_buf *leaf1_bp, /* leaf1 buffer */ - struct xfs_buf *leaf2_bp) /* leaf2 buffer */ + struct xfs_buf *leaf1_bp, /* leaf1 buffer */ + struct xfs_buf *leaf2_bp) /* leaf2 buffer */ { - xfs_dir2_leaf_t *leaf1; /* leaf1 structure */ - xfs_dir2_leaf_t *leaf2; /* leaf2 structure */ - - leaf1 =3D leaf1_bp->b_addr; - leaf2 =3D leaf2_bp->b_addr; - ASSERT(leaf1->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - ASSERT(leaf2->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - if (be16_to_cpu(leaf1->hdr.count) > 0 && - be16_to_cpu(leaf2->hdr.count) > 0 && - (be32_to_cpu(leaf2->ents[0].hashval) < be32_to_cpu(leaf1->ents[0].has= hval) || - be32_to_cpu(leaf2->ents[be16_to_cpu(leaf2->hdr.count) - 1].hashval) < - be32_to_cpu(leaf1->ents[be16_to_cpu(leaf1->hdr.count) - 1].hashval))) + struct xfs_dir2_leaf *leaf1 =3D leaf1_bp->b_addr; + struct xfs_dir2_leaf *leaf2 =3D leaf2_bp->b_addr; + struct xfs_dir2_leaf_entry *ents1; + struct xfs_dir2_leaf_entry *ents2; + struct xfs_dir3_icleaf_hdr hdr1; + struct xfs_dir3_icleaf_hdr hdr2; + + xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); + xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); + ents1 =3D xfs_dir3_leaf_ents_p(leaf1); + ents2 =3D xfs_dir3_leaf_ents_p(leaf2); + + if (hdr1.count > 0 && hdr2.count > 0 && + (be32_to_cpu(ents2[0].hashval) < be32_to_cpu(ents1[0].hashval) || + be32_to_cpu(ents2[hdr2.count - 1].hashval) < + be32_to_cpu(ents1[hdr1.count - 1].hashval))) return 1; return 0; } @@ -949,6 +971,10 @@ xfs_dir2_leafn_rebalance( #endif int oldsum; /* old total leaf count */ int swap; /* swapped leaf blocks */ + struct xfs_dir2_leaf_entry *ents1; + struct xfs_dir2_leaf_entry *ents2; + struct xfs_dir3_icleaf_hdr hdr1; + struct xfs_dir3_icleaf_hdr hdr2; =20 args =3D state->args; /* @@ -963,11 +989,17 @@ xfs_dir2_leafn_rebalance( } leaf1 =3D blk1->bp->b_addr; leaf2 =3D blk2->bp->b_addr; - oldsum =3D be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count); + xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); + xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); + ents1 =3D xfs_dir3_leaf_ents_p(leaf1); + ents2 =3D xfs_dir3_leaf_ents_p(leaf2); + + oldsum =3D hdr1.count + hdr2.count; #ifdef DEBUG - oldstale =3D be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale= ); + oldstale =3D hdr1.stale + hdr2.stale; #endif mid =3D oldsum >> 1; + /* * If the old leaf count was odd then the new one will be even, * so we need to divide the new count evenly. @@ -975,10 +1007,10 @@ xfs_dir2_leafn_rebalance( if (oldsum & 1) { xfs_dahash_t midhash; /* middle entry hash value */ =20 - if (mid >=3D be16_to_cpu(leaf1->hdr.count)) - midhash =3D be32_to_cpu(leaf2->ents[mid - be16_to_cpu(leaf1->hdr.count)= ].hashval); + if (mid >=3D hdr1.count) + midhash =3D be32_to_cpu(ents2[mid - hdr1.count].hashval); else - midhash =3D be32_to_cpu(leaf1->ents[mid].hashval); + midhash =3D be32_to_cpu(ents1[mid].hashval); isleft =3D args->hashval <=3D midhash; } /* @@ -992,30 +1024,42 @@ xfs_dir2_leafn_rebalance( * Calculate moved entry count. Positive means left-to-right, * negative means right-to-left. Then move the entries. */ - count =3D be16_to_cpu(leaf1->hdr.count) - mid + (isleft =3D=3D 0); + count =3D hdr1.count - mid + (isleft =3D=3D 0); if (count > 0) - xfs_dir2_leafn_moveents(args, blk1->bp, - be16_to_cpu(leaf1->hdr.count) - count, blk2->bp, 0, count); + xfs_dir3_leafn_moveents(args, blk1->bp, &hdr1, ents1, + hdr1.count - count, blk2->bp, + &hdr2, ents2, 0, count); else if (count < 0) - xfs_dir2_leafn_moveents(args, blk2->bp, 0, blk1->bp, - be16_to_cpu(leaf1->hdr.count), count); - ASSERT(be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count) =3D= =3D oldsum); - ASSERT(be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale) =3D= =3D oldstale); + xfs_dir3_leafn_moveents(args, blk2->bp, &hdr2, ents2, 0, + blk1->bp, &hdr1, ents1, + hdr1.count, count); + + ASSERT(hdr1.count + hdr2.count =3D=3D oldsum); + ASSERT(hdr1.stale + hdr2.stale =3D=3D oldstale); + + /* log the changes made when moving the entries */ + xfs_dir3_leaf_hdr_to_disk(leaf1, &hdr1); + xfs_dir3_leaf_hdr_to_disk(leaf2, &hdr2); + xfs_dir3_leaf_log_header(args->trans, blk1->bp); + xfs_dir3_leaf_log_header(args->trans, blk2->bp); + + xfs_dir3_leaf_check(args->dp->i_mount, blk1->bp); + xfs_dir3_leaf_check(args->dp->i_mount, blk2->bp); + /* * Mark whether we're inserting into the old or new leaf. */ - if (be16_to_cpu(leaf1->hdr.count) < be16_to_cpu(leaf2->hdr.count)) + if (hdr1.count < hdr2.count) state->inleaf =3D swap; - else if (be16_to_cpu(leaf1->hdr.count) > be16_to_cpu(leaf2->hdr.count)) + else if (hdr1.count > hdr2.count) state->inleaf =3D !swap; else - state->inleaf =3D - swap ^ (blk1->index <=3D be16_to_cpu(leaf1->hdr.count)); + state->inleaf =3D swap ^ (blk1->index <=3D hdr1.count); /* * Adjust the expected index for insertion. */ if (!state->inleaf) - blk2->index =3D blk1->index - be16_to_cpu(leaf1->hdr.count); + blk2->index =3D blk1->index - hdr1.count; =20 /* * Finally sanity check just to make sure we are not returning a @@ -1137,6 +1181,8 @@ xfs_dir2_leafn_remove( int needscan; /* need to rescan data frees */ xfs_trans_t *tp; /* transaction pointer */ struct xfs_dir2_data_free *bf; /* bestfree table */ + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; =20 trace_xfs_dir2_leafn_remove(args, index); =20 @@ -1144,11 +1190,14 @@ xfs_dir2_leafn_remove( tp =3D args->trans; mp =3D dp->i_mount; leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents =3D xfs_dir3_leaf_ents_p(leaf); + /* * Point to the entry we're removing. */ - lep =3D &leaf->ents[index]; + lep =3D &ents[index]; + /* * Extract the data block and offset from the entry. */ @@ -1156,14 +1205,18 @@ xfs_dir2_leafn_remove( ASSERT(dblk->blkno =3D=3D db); off =3D xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address)); ASSERT(dblk->index =3D=3D off); + /* * Kill the leaf entry by marking it stale. * Log the leaf block changes. */ - be16_add_cpu(&leaf->hdr.stale, 1); - xfs_dir2_leaf_log_header(tp, bp); + leafhdr.stale++; + xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + xfs_dir3_leaf_log_header(tp, bp); + lep->address =3D cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir2_leaf_log_ents(tp, bp, index, index); + xfs_dir3_leaf_log_ents(tp, bp, index, index); + /* * Make the data entry free. Keep track of the longest freespace * in the data block in case it changes. @@ -1252,15 +1305,13 @@ xfs_dir2_leafn_remove( return error; } =20 - xfs_dir2_leafn_check(dp, bp); + xfs_dir3_leaf_check(mp, bp); /* * Return indication of whether this leaf block is empty enough * to justify trying to join it with a neighbor. */ - *rval =3D - ((uint)sizeof(leaf->hdr) + - (uint)sizeof(leaf->ents[0]) * - (be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale))) < + *rval =3D (xfs_dir3_leaf_hdr_size(leaf) + + (uint)sizeof(ents[0]) * (leafhdr.count - leafhdr.stale)) < mp->m_dir_magicpct; return 0; } @@ -1293,11 +1344,11 @@ xfs_dir2_leafn_split( /* * Initialize the new leaf block. */ - error =3D xfs_dir2_leaf_init(args, xfs_dir2_da_to_db(mp, blkno), - &newblk->bp, XFS_DIR2_LEAFN_MAGIC); - if (error) { + error =3D xfs_dir3_leaf_get_buf(args, xfs_dir2_da_to_db(mp, blkno), + &newblk->bp, XFS_DIR2_LEAFN_MAGIC); + if (error) return error; - } + newblk->blkno =3D blkno; newblk->magic =3D XFS_DIR2_LEAFN_MAGIC; /* @@ -1321,8 +1372,8 @@ xfs_dir2_leafn_split( */ oldblk->hashval =3D xfs_dir2_leafn_lasthash(oldblk->bp, NULL); newblk->hashval =3D xfs_dir2_leafn_lasthash(newblk->bp, NULL); - xfs_dir2_leafn_check(args->dp, oldblk->bp); - xfs_dir2_leafn_check(args->dp, newblk->bp); + xfs_dir3_leaf_check(mp, oldblk->bp); + xfs_dir3_leaf_check(mp, newblk->bp); return error; } =20 @@ -1348,9 +1399,10 @@ xfs_dir2_leafn_toosmall( int error; /* error return value */ int forward; /* sibling block direction */ int i; /* sibling counter */ - xfs_da_blkinfo_t *info; /* leaf block header */ xfs_dir2_leaf_t *leaf; /* leaf structure */ int rval; /* result from path_shift */ + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir2_leaf_entry *ents; =20 /* * Check for the degenerate case of the block being over 50% full. @@ -1358,11 +1410,13 @@ xfs_dir2_leafn_toosmall( * to coalesce with a sibling. */ blk =3D &state->path.blk[state->path.active - 1]; - info =3D blk->bp->b_addr; - ASSERT(info->magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - leaf =3D (xfs_dir2_leaf_t *)info; - count =3D be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); - bytes =3D (uint)sizeof(leaf->hdr) + count * (uint)sizeof(leaf->ents[0]); + leaf =3D blk->bp->b_addr; + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + ents =3D xfs_dir3_leaf_ents_p(leaf); + xfs_dir3_leaf_check(mp, blk->bp); + + count =3D leafhdr.count - leafhdr.stale; + bytes =3D xfs_dir3_leaf_hdr_size(leaf) + count * sizeof(ents[0]); if (bytes > (state->blocksize >> 1)) { /* * Blk over 50%, don't try to join. @@ -1381,7 +1435,7 @@ xfs_dir2_leafn_toosmall( * Make altpath point to the block we want to keep and * path point to the block we want to drop (this one). */ - forward =3D (info->forw !=3D 0); + forward =3D (leafhdr.forw !=3D 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); error =3D xfs_da_path_shift(state, &state->altpath, forward, 0, &rval); @@ -1397,15 +1451,17 @@ xfs_dir2_leafn_toosmall( * We prefer coalescing with the lower numbered sibling so as * to shrink a directory over time. */ - forward =3D be32_to_cpu(info->forw) < be32_to_cpu(info->back); + forward =3D leafhdr.forw < leafhdr.back; for (i =3D 0, bp =3D NULL; i < 2; forward =3D !forward, i++) { - blkno =3D forward ? be32_to_cpu(info->forw) : be32_to_cpu(info->back); + struct xfs_dir3_icleaf_hdr hdr2; + + blkno =3D forward ? leafhdr.forw : leafhdr.back; if (blkno =3D=3D 0) continue; /* * Read the sibling leaf block. */ - error =3D xfs_dir2_leafn_read(state->args->trans, state->args->dp, + error =3D xfs_dir3_leafn_read(state->args->trans, state->args->dp, blkno, -1, &bp); if (error) return error; @@ -1413,13 +1469,15 @@ xfs_dir2_leafn_toosmall( /* * Count bytes in the two blocks combined. */ - leaf =3D (xfs_dir2_leaf_t *)info; - count =3D be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); + count =3D leafhdr.count - leafhdr.stale; bytes =3D state->blocksize - (state->blocksize >> 2); + leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)); - count +=3D be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); - bytes -=3D count * (uint)sizeof(leaf->ents[0]); + xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf); + ents =3D xfs_dir3_leaf_ents_p(leaf); + count +=3D hdr2.count - hdr2.stale; + bytes -=3D count * sizeof(ents[0]); + /* * Fits with at least 25% to spare. */ @@ -1466,34 +1524,53 @@ xfs_dir2_leafn_unbalance( xfs_da_args_t *args; /* operation arguments */ xfs_dir2_leaf_t *drop_leaf; /* dead leaf structure */ xfs_dir2_leaf_t *save_leaf; /* surviving leaf structure */ + struct xfs_dir3_icleaf_hdr savehdr; + struct xfs_dir3_icleaf_hdr drophdr; + struct xfs_dir2_leaf_entry *sents; + struct xfs_dir2_leaf_entry *dents; =20 args =3D state->args; ASSERT(drop_blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC); ASSERT(save_blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC); drop_leaf =3D drop_blk->bp->b_addr; save_leaf =3D save_blk->bp->b_addr; - ASSERT(drop_leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)= ); - ASSERT(save_leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)= ); + + xfs_dir3_leaf_hdr_from_disk(&savehdr, save_leaf); + xfs_dir3_leaf_hdr_from_disk(&drophdr, drop_leaf); + sents =3D xfs_dir3_leaf_ents_p(save_leaf); + dents =3D xfs_dir3_leaf_ents_p(drop_leaf); + /* * If there are any stale leaf entries, take this opportunity * to purge them. */ - if (drop_leaf->hdr.stale) - xfs_dir2_leaf_compact(args, drop_blk->bp); - if (save_leaf->hdr.stale) - xfs_dir2_leaf_compact(args, save_blk->bp); + if (drophdr.stale) + xfs_dir3_leaf_compact(args, &drophdr, drop_blk->bp); + if (savehdr.stale) + xfs_dir3_leaf_compact(args, &savehdr, save_blk->bp); + /* * Move the entries from drop to the appropriate end of save. */ - drop_blk->hashval =3D be32_to_cpu(drop_leaf->ents[be16_to_cpu(drop_leaf->= hdr.count) - 1].hashval); + drop_blk->hashval =3D be32_to_cpu(dents[drophdr.count - 1].hashval); if (xfs_dir2_leafn_order(save_blk->bp, drop_blk->bp)) - xfs_dir2_leafn_moveents(args, drop_blk->bp, 0, save_blk->bp, 0, - be16_to_cpu(drop_leaf->hdr.count)); + xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0, + save_blk->bp, &savehdr, sents, 0, + drophdr.count); else - xfs_dir2_leafn_moveents(args, drop_blk->bp, 0, save_blk->bp, - be16_to_cpu(save_leaf->hdr.count), be16_to_cpu(drop_leaf->hdr.count)); - save_blk->hashval =3D be32_to_cpu(save_leaf->ents[be16_to_cpu(save_leaf->= hdr.count) - 1].hashval); - xfs_dir2_leafn_check(args->dp, save_blk->bp); + xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0, + save_blk->bp, &savehdr, sents, + savehdr.count, drophdr.count); + save_blk->hashval =3D be32_to_cpu(sents[savehdr.count - 1].hashval); + + /* log the changes made when moving the entries */ + xfs_dir3_leaf_hdr_to_disk(save_leaf, &savehdr); + xfs_dir3_leaf_hdr_to_disk(drop_leaf, &drophdr); + xfs_dir3_leaf_log_header(args->trans, save_blk->bp); + xfs_dir3_leaf_log_header(args->trans, drop_blk->bp); + + xfs_dir3_leaf_check(args->dp->i_mount, save_blk->bp); + xfs_dir3_leaf_check(args->dp->i_mount, drop_blk->bp); } =20 /* @@ -2098,13 +2175,15 @@ xfs_dir2_node_replace( * and locked it. But paranoia is good. */ if (rval =3D=3D EEXIST) { + struct xfs_dir2_leaf_entry *ents; /* * Find the leaf entry. */ blk =3D &state->path.blk[state->path.active - 1]; ASSERT(blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC); leaf =3D blk->bp->b_addr; - lep =3D &leaf->ents[blk->index]; + ents =3D xfs_dir3_leaf_ents_p(leaf); + lep =3D &ents[blk->index]; ASSERT(state->extravalid); /* * Point to the data entry. diff --git a/libxfs/xfs_dir2_priv.h b/libxfs/xfs_dir2_priv.h index 910e644..932565d 100644 --- a/libxfs/xfs_dir2_priv.h +++ b/libxfs/xfs_dir2_priv.h @@ -77,24 +77,25 @@ extern void xfs_dir2_data_use_free(struct xfs_trans *tp= , struct xfs_buf *bp, xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); =20 /* xfs_dir2_leaf.c */ -extern const struct xfs_buf_ops xfs_dir2_leafn_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_leafn_buf_ops; =20 -extern int xfs_dir2_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp, +extern int xfs_dir3_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, xfs_daddr_t mappedbno, struct xfs_buf **bpp); extern int xfs_dir2_block_to_leaf(struct xfs_da_args *args, struct xfs_buf *dbp); extern int xfs_dir2_leaf_addname(struct xfs_da_args *args); -extern void xfs_dir2_leaf_compact(struct xfs_da_args *args, - struct xfs_buf *bp); -extern void xfs_dir2_leaf_compact_x1(struct xfs_buf *bp, int *indexp, +extern void xfs_dir3_leaf_compact(struct xfs_da_args *args, + struct xfs_dir3_icleaf_hdr *leafhdr, struct xfs_buf *bp); +extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int *indexp, int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); extern int xfs_dir2_leaf_getdents(struct xfs_inode *dp, void *dirent, size_t bufsize, xfs_off_t *offset, filldir_t filldir); -extern int xfs_dir2_leaf_init(struct xfs_da_args *args, xfs_dir2_db_t bno, - struct xfs_buf **bpp, int magic); -extern void xfs_dir2_leaf_log_ents(struct xfs_trans *tp, struct xfs_buf *b= p, +extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t b= no, + struct xfs_buf **bpp, __uint16_t magic); +extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_buf *b= p, int first, int last); -extern void xfs_dir2_leaf_log_header(struct xfs_trans *tp, +extern void xfs_dir3_leaf_log_header(struct xfs_trans *tp, struct xfs_buf *bp); extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); @@ -104,11 +105,18 @@ extern int xfs_dir2_leaf_search_hash(struct xfs_da_ar= gs *args, extern int xfs_dir2_leaf_trim_data(struct xfs_da_args *args, struct xfs_buf *lbp, xfs_dir2_db_t db); extern struct xfs_dir2_leaf_entry * -xfs_dir2_leaf_find_entry(struct xfs_dir2_leaf *leaf, int index, int compac= t, - int lowstale, int highstale, - int *lfloglow, int *lfloghigh); +xfs_dir3_leaf_find_entry(struct xfs_dir3_icleaf_hdr *leafhdr, + struct xfs_dir2_leaf_entry *ents, int index, int compact, + int lowstale, int highstale, int *lfloglow, int *lfloghigh); extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); =20 +extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from); +extern void xfs_dir3_leaf_hdr_to_disk(struct xfs_dir2_leaf *to, + struct xfs_dir3_icleaf_hdr *from); +extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, + struct xfs_dir3_icleaf_hdr *hdr, struct xfs_dir2_leaf *leaf); + /* xfs_dir2_node.c */ extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, struct xfs_buf *lbp); diff --git a/repair/dir2.c b/repair/dir2.c index c455c83..a48971f 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -1607,24 +1607,26 @@ process_leaf_block_dir2( { int i; int stale; + struct xfs_dir2_leaf_entry *ents; + + ents =3D xfs_dir3_leaf_ents_p(leaf); =20 for (i =3D stale =3D 0; i < be16_to_cpu(leaf->hdr.count); i++) { - if ((char *)&leaf->ents[i] >=3D (char *)leaf + mp->m_dirblksize) { + if ((char *)&ents[i] >=3D (char *)leaf + mp->m_dirblksize) { do_warn( _("bad entry count in block %u of directory inode %" PRIu64 "\n"), da_bno, ino); return 1; } - if (be32_to_cpu(leaf->ents[i].address) =3D=3D XFS_DIR2_NULL_DATAPTR) + if (be32_to_cpu(ents[i].address) =3D=3D XFS_DIR2_NULL_DATAPTR) stale++; - else if (be32_to_cpu(leaf->ents[i].hashval) < last_hashval) { + else if (be32_to_cpu(ents[i].hashval) < last_hashval) { do_warn( _("bad hash ordering in block %u of directory inode %" PRIu64 "\n"), da_bno, ino); return 1; } - *next_hashval =3D last_hashval =3D - be32_to_cpu(leaf->ents[i].hashval); + *next_hashval =3D last_hashval =3D be32_to_cpu(ents[i].hashval); } if (stale !=3D be16_to_cpu(leaf->hdr.stale)) { do_warn( diff --git a/repair/phase6.c b/repair/phase6.c index 80701a4..243b808 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -2327,6 +2327,7 @@ longform_dir2_check_leaf( xfs_dir2_leaf_t *leaf; xfs_dir2_leaf_tail_t *ltp; int seeval; + struct xfs_dir2_leaf_entry *ents; =20 da_bno =3D mp->m_dirleafblk; if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, XFS_DATA_FORK, NULL)) { @@ -2336,6 +2337,7 @@ longform_dir2_check_leaf( /* NOTREACHED */ } leaf =3D bp->b_addr; + ents =3D xfs_dir3_leaf_ents_p(leaf); ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); bestsp =3D xfs_dir2_leaf_bests_p(ltp); if (be16_to_cpu(leaf->hdr.info.magic) !=3D XFS_DIR2_LEAF1_MAGIC || @@ -2344,8 +2346,8 @@ longform_dir2_check_leaf( be16_to_cpu(leaf->hdr.count) < be16_to_cpu(leaf->hdr.stale) || be16_to_cpu(leaf->hdr.count) > - xfs_dir2_max_leaf_ents(mp) || - (char *)&leaf->ents[be16_to_cpu( + xfs_dir3_max_leaf_ents(mp, leaf) || + (char *)&ents[be16_to_cpu( leaf->hdr.count)] > (char *)bestsp) { do_warn( _("leaf block %u for directory inode %" PRIu64 " bad header\n"), @@ -2353,7 +2355,7 @@ longform_dir2_check_leaf( libxfs_putbuf(bp); return 1; } - seeval =3D dir_hash_see_all(hashtab, leaf->ents, + seeval =3D dir_hash_see_all(hashtab, ents, be16_to_cpu(leaf->hdr.count), be16_to_cpu(leaf->hdr.stale)); if (dir_hash_check(hashtab, ip, seeval)) { @@ -2396,6 +2398,7 @@ longform_dir2_check_node( xfs_fileoff_t next_da_bno; int seeval =3D 0; int used; + struct xfs_dir2_leaf_entry *ents; =20 for (da_bno =3D mp->m_dirleafblk, next_da_bno =3D 0; next_da_bno !=3D NULLFILEOFF && da_bno < mp->m_dirfreeblk; @@ -2411,6 +2414,7 @@ longform_dir2_check_node( return 1; } leaf =3D bp->b_addr; + ents =3D xfs_dir3_leaf_ents_p(leaf); if (be16_to_cpu(leaf->hdr.info.magic) !=3D XFS_DIR2_LEAFN_MAGIC) { if (be16_to_cpu(leaf->hdr.info.magic) =3D=3D XFS_DA_NODE_MAGIC) { @@ -2424,7 +2428,7 @@ longform_dir2_check_node( libxfs_putbuf(bp); return 1; } - if (be16_to_cpu(leaf->hdr.count) > xfs_dir2_max_leaf_ents(mp) || + if (be16_to_cpu(leaf->hdr.count) > xfs_dir3_max_leaf_ents(mp, leaf) || be16_to_cpu(leaf->hdr.count) < be16_to_cpu(leaf->hdr.stale)) { do_warn( @@ -2433,7 +2437,7 @@ longform_dir2_check_node( libxfs_putbuf(bp); return 1; } - seeval =3D dir_hash_see_all(hashtab, leaf->ents, + seeval =3D dir_hash_see_all(hashtab, ents, be16_to_cpu(leaf->hdr.count), be16_to_cpu(leaf->hdr.stale)); libxfs_putbuf(bp); =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00xfsprogs-crc-patchset-v2/dir2-sf=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=000000600=000001750=000001750=0000000012163=001213= 2011546=00015433=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00xfs: shortform directory offsets change for dir3 format =46rom: Dave Chinner Because the header size for the CRC enabled directory blocks is larger, the offset of the first entry into a directory block is different to the dir2 format. The shortform directory stores the dirent's offset so that it doesn't change when moving from shortform to block form and back again, and hence it needs to take into account the different header sizes to maintain the correct offsets. Signed-off-by: Dave Chinner --- db/check.c | 2 +- include/xfs_dir2_format.h | 25 ++++++++++++++----------- libxfs/xfs_dir2_sf.c | 6 +++--- repair/dir2.c | 7 ++++--- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/db/check.c b/db/check.c index 73d9da2..69cfbdb 100644 --- a/db/check.c +++ b/db/check.c @@ -3647,7 +3647,7 @@ process_sf_dir_v2( dbprintf(_("dir %lld entry . %lld\n"), id->ino, id->ino); (*dot)++; sfe =3D xfs_dir2_sf_firstentry(&sf->hdr); - offset =3D XFS_DIR2_DATA_FIRST_OFFSET; + offset =3D XFS_DIR3_DATA_FIRST_OFFSET(mp); for (i =3D sf->hdr.count - 1, i8 =3D 0; i >=3D 0; i--) { if ((__psint_t)sfe + xfs_dir2_sf_entsize(&sf->hdr,sfe->namelen) - (__psint_t)sf > be64_to_cpu(dip->di_size)) { diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h index 8bb4efe..8d33f03 100644 --- a/include/xfs_dir2_format.h +++ b/include/xfs_dir2_format.h @@ -228,16 +228,6 @@ xfs_dir2_sf_nextentry(struct xfs_dir2_sf_hdr *hdr, xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) =20 /* - * Offsets of . and .. in data space (always block 0) - */ -#define XFS_DIR2_DATA_DOT_OFFSET \ - ((xfs_dir2_data_aoff_t)sizeof(struct xfs_dir2_data_hdr)) -#define XFS_DIR2_DATA_DOTDOT_OFFSET \ - (XFS_DIR2_DATA_DOT_OFFSET + xfs_dir2_data_entsize(1)) -#define XFS_DIR2_DATA_FIRST_OFFSET \ - (XFS_DIR2_DATA_DOTDOT_OFFSET + xfs_dir2_data_entsize(2)) - -/* * Describe a free area in the data block. * * The freespace will be formatted as a xfs_dir2_data_unused_t. @@ -378,7 +368,20 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) =20 /* * Offsets of . and .. in data space (always block 0) - */ + * + * The macros are used for shortform directories as they have no headers t= o read + * the magic number out of. Shortform directories need to know the size of= the + * data block header because the sfe embeds the block offset of the entry = into + * it so that it doesn't change when format conversion occurs. Bad Things = Happen + * if we don't follow this rule. + */ +#define XFS_DIR3_DATA_DOT_OFFSET(mp) \ + xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&(mp)->m_sb)) +#define XFS_DIR3_DATA_DOTDOT_OFFSET(mp) \ + (XFS_DIR3_DATA_DOT_OFFSET(mp) + xfs_dir2_data_entsize(1)) +#define XFS_DIR3_DATA_FIRST_OFFSET(mp) \ + (XFS_DIR3_DATA_DOTDOT_OFFSET(mp) + xfs_dir2_data_entsize(2)) + static inline xfs_dir2_data_aoff_t xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) { diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index 6848d05..cb23368 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -519,7 +519,7 @@ xfs_dir2_sf_addname_hard( * to insert the new entry. * If it's going to end up at the end then oldsfep will point there. */ - for (offset =3D XFS_DIR2_DATA_FIRST_OFFSET, + for (offset =3D XFS_DIR3_DATA_FIRST_OFFSET(dp->i_mount), oldsfep =3D xfs_dir2_sf_firstentry(oldsfp), add_datasize =3D xfs_dir2_data_entsize(args->namelen), eof =3D (char *)oldsfep =3D=3D &buf[old_isize]; @@ -601,7 +601,7 @@ xfs_dir2_sf_addname_pick( =20 sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; size =3D xfs_dir2_data_entsize(args->namelen); - offset =3D XFS_DIR2_DATA_FIRST_OFFSET; + offset =3D XFS_DIR3_DATA_FIRST_OFFSET(mp); sfep =3D xfs_dir2_sf_firstentry(sfp); holefit =3D 0; /* @@ -672,7 +672,7 @@ xfs_dir2_sf_check( dp =3D args->dp; =20 sfp =3D (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - offset =3D XFS_DIR2_DATA_FIRST_OFFSET; + offset =3D XFS_DIR3_DATA_FIRST_OFFSET(dp->i_mount); ino =3D xfs_dir2_sf_get_parent_ino(sfp); i8count =3D ino > XFS_DIR2_MAX_SHORT_INUM; =20 diff --git a/repair/dir2.c b/repair/dir2.c index 6b7c8d7..de5e737 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -662,6 +662,7 @@ process_sf_dir2_fixi8( */ static void process_sf_dir2_fixoff( + xfs_mount_t *mp, xfs_dinode_t *dip) { int i; @@ -671,7 +672,7 @@ process_sf_dir2_fixoff( =20 sfp =3D (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); sfep =3D xfs_dir2_sf_firstentry(&sfp->hdr); - offset =3D XFS_DIR2_DATA_FIRST_OFFSET; + offset =3D XFS_DIR3_DATA_FIRST_OFFSET(mp); =20 for (i =3D 0; i < sfp->hdr.count; i++) { xfs_dir2_sf_put_offset(sfep, offset); @@ -725,7 +726,7 @@ process_sf_dir2( max_size =3D XFS_DFORK_DSIZE(dip, mp); num_entries =3D sfp->hdr.count; ino_dir_size =3D be64_to_cpu(dip->di_size); - offset =3D XFS_DIR2_DATA_FIRST_OFFSET; + offset =3D XFS_DIR3_DATA_FIRST_OFFSET(mp); bad_offset =3D *repair =3D 0; =20 ASSERT(ino_dir_size <=3D max_size); @@ -1082,7 +1083,7 @@ _("would have corrected entry offsets in directory %"= PRIu64 "\n"), do_warn( _("corrected entry offsets in directory %" PRIu64 "\n"), ino); - process_sf_dir2_fixoff(dip); + process_sf_dir2_fixoff(mp, dip); *dino_dirty =3D 1; *repair =3D 1; } =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-= crc-patchset-v2/xfs-add-crc-to-da-node=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001750= =0000000332557=0012132011546=00020221=00 0=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00xfs: add CRCs to dir2/da node blocks =46rom: Dave Chinner Signed-off-by: Dave Chinner --- db/attr.c | 4 +- db/check.c | 8 +- db/dir.c | 4 +- db/dir2.c | 2 +- include/xfs_da_btree.h | 106 +++- libxfs/xfs_attr.c | 24 +- libxfs/xfs_attr_leaf.c | 17 +- libxfs/xfs_da_btree.c | 1393 +++++++++++++++++++++++++++++---------------= ---- libxfs/xfs_dir2_node.c | 26 +- repair/dir.c | 87 +-- repair/dir2.c | 96 ++-- repair/phase6.c | 6 +- 12 files changed, 1070 insertions(+), 703 deletions(-) diff --git a/db/attr.c b/db/attr.c index 74bf411..a5087b8 100644 --- a/db/attr.c +++ b/db/attr.c @@ -54,7 +54,7 @@ const field_t attr_flds[] =3D { FLD_COUNT, TYP_NONE }, { "entries", FLDT_ATTR_LEAF_ENTRY, OI(LOFF(entries)), attr_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE }, - { "btree", FLDT_ATTR_NODE_ENTRY, OI(NOFF(btree)), attr_node_btree_count, + { "btree", FLDT_ATTR_NODE_ENTRY, OI(NOFF(__btree)), attr_node_btree_count, FLD_ARRAY|FLD_COUNT, TYP_NONE }, { "nvlist", FLDT_ATTR_LEAF_NAME, attr_leaf_nvlist_offset, attr_leaf_nvlist_count, FLD_ARRAY|FLD_OFFSET|FLD_COUNT, TYP_NONE }, @@ -144,7 +144,7 @@ const field_t attr_node_entry_flds[] =3D { const field_t attr_node_hdr_flds[] =3D { { "info", FLDT_ATTR_BLKINFO, OI(HOFF(info)), C1, 0, TYP_NONE }, { "count", FLDT_UINT16D, OI(HOFF(count)), C1, 0, TYP_NONE }, - { "level", FLDT_UINT16D, OI(HOFF(level)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(HOFF(__level)), C1, 0, TYP_NONE }, { NULL } }; =20 diff --git a/db/check.c b/db/check.c index 69cfbdb..efbd0c9 100644 --- a/db/check.c +++ b/db/check.c @@ -3236,6 +3236,7 @@ process_leaf_node_dir_v2_int( xfs_dir2_leaf_tail_t *ltp; xfs_da_intnode_t *node; int stale; + struct xfs_da3_icnode_hdr nodehdr; =20 leaf =3D iocur_top->data; switch (be16_to_cpu(leaf->hdr.info.magic)) { @@ -3284,13 +3285,12 @@ process_leaf_node_dir_v2_int( break; case XFS_DA_NODE_MAGIC: node =3D iocur_top->data; - if (be16_to_cpu(node->hdr.level) < 1 || - be16_to_cpu(node->hdr.level) >=20 - XFS_DA_NODE_MAXDEPTH) { + xfs_da3_node_hdr_from_disk(&nodehdr, node); + if (nodehdr.level < 1 || nodehdr.level > XFS_DA_NODE_MAXDEPTH) { if (!sflag || v) dbprintf(_("bad node block level %d for dir ino " "%lld block %d\n"), - be16_to_cpu(node->hdr.level), id->ino,=20 + nodehdr.level, id->ino,=20 dabno); error++; } diff --git a/db/dir.c b/db/dir.c index 4b7e9dc..70ecc46 100644 --- a/db/dir.c +++ b/db/dir.c @@ -48,7 +48,7 @@ const field_t dir_flds[] =3D { FLD_COUNT, TYP_NONE }, { "entries", FLDT_DIR_LEAF_ENTRY, OI(LOFF(entries)), dir_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE }, - { "btree", FLDT_DIR_NODE_ENTRY, OI(NOFF(btree)), + { "btree", FLDT_DIR_NODE_ENTRY, OI(NOFF(__btree)), dir_node_btree_count, FLD_ARRAY|FLD_COUNT, TYP_NONE }, { "namelist", FLDT_DIR_LEAF_NAME, dir_leaf_namelist_offset, dir_leaf_namelist_count, FLD_ARRAY|FLD_OFFSET|FLD_COUNT, TYP_NONE }, @@ -112,7 +112,7 @@ const field_t dir_node_entry_flds[] =3D { const field_t dir_node_hdr_flds[] =3D { { "info", FLDT_DIR_BLKINFO, OI(HOFF(info)), C1, 0, TYP_NONE }, { "count", FLDT_UINT16D, OI(HOFF(count)), C1, 0, TYP_NONE }, - { "level", FLDT_UINT16D, OI(HOFF(level)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(HOFF(__level)), C1, 0, TYP_NONE }, { NULL } }; =20 diff --git a/db/dir2.c b/db/dir2.c index abdbfee..07809b0 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -87,7 +87,7 @@ const field_t dir2_flds[] =3D { dir2_leaf_tail_count, FLD_OFFSET|FLD_COUNT, TYP_NONE }, { "nhdr", FLDT_DIR_NODE_HDR, OI(NOFF(hdr)), dir2_node_hdr_count, FLD_COUNT, TYP_NONE }, - { "nbtree", FLDT_DIR_NODE_ENTRY, OI(NOFF(btree)), dir2_node_btree_count, + { "nbtree", FLDT_DIR_NODE_ENTRY, OI(NOFF(__btree)), dir2_node_btree_count, FLD_ARRAY|FLD_COUNT, TYP_NONE }, { "fhdr", FLDT_DIR2_FREE_HDR, OI(FOFF(hdr)), dir2_free_hdr_count, FLD_COUNT, TYP_NONE }, diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index 0854b95..6bedb3c 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2000,2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -20,7 +21,6 @@ =20 struct xfs_bmap_free; struct xfs_inode; -struct xfs_mount; struct xfs_trans; struct zone; =20 @@ -50,8 +50,11 @@ typedef struct xfs_da_blkinfo { * CRC enabled directory structure types * * The headers change size for the additional verification information, but - * otherwise the tree layouts and contents are unchanged. + * otherwise the tree layouts and contents are unchanged. Hence the da btr= ee + * code can use the struct xfs_da_blkinfo for manipulating the tree links = and + * magic numbers without modification for both v2 and v3 nodes. */ +#define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */ #define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks = */ #define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ =20 @@ -80,19 +83,76 @@ struct xfs_da3_blkinfo { */ #define XFS_DA_NODE_MAXDEPTH 5 /* max depth of Btree */ =20 +typedef struct xfs_da_node_hdr { + struct xfs_da_blkinfo info; /* block type, links, etc. */ + __be16 count; /* count of active entries */ + __be16 __level; /* level above leaves (leaf =3D=3D 0) */ +} xfs_da_node_hdr_t; + +struct xfs_da3_node_hdr { + struct xfs_da3_blkinfo info; /* block type, links, etc. */ + __be16 count; /* count of active entries */ + __be16 __level; /* level above leaves (leaf =3D=3D 0) */ + __be32 __pad32; +}; + +#define XFS_DA3_NODE_CRC_OFF (offsetof(struct xfs_da3_node_hdr, info.crc)) + +typedef struct xfs_da_node_entry { + __be32 hashval; /* hash value for this descendant */ + __be32 before; /* Btree block before this key */ +} xfs_da_node_entry_t; + typedef struct xfs_da_intnode { - struct xfs_da_node_hdr { /* constant-structure header block */ - xfs_da_blkinfo_t info; /* block type, links, etc. */ - __be16 count; /* count of active entries */ - __be16 level; /* level above leaves (leaf =3D=3D 0) */ - } hdr; - struct xfs_da_node_entry { - __be32 hashval; /* hash value for this descendant */ - __be32 before; /* Btree block before this key */ - } btree[1]; /* variable sized array of keys */ + struct xfs_da_node_hdr hdr; + struct xfs_da_node_entry __btree[]; } xfs_da_intnode_t; -typedef struct xfs_da_node_hdr xfs_da_node_hdr_t; -typedef struct xfs_da_node_entry xfs_da_node_entry_t; + +struct xfs_da3_intnode { + struct xfs_da3_node_hdr hdr; + struct xfs_da_node_entry __btree[]; +}; + +/* + * In-core version of the node header to abstract the differences in the v= 2 and + * v3 disk format of the headers. Callers need to convert to/from disk for= mat as + * appropriate. + */ +struct xfs_da3_icnode_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t level; +}; + +extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); +extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); + +static inline int +xfs_da3_node_hdr_size(struct xfs_da_intnode *dap) +{ + if (dap->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA3_NODE_MAGIC)) + return sizeof(struct xfs_da3_node_hdr); + return sizeof(struct xfs_da_node_hdr); +} + +static inline struct xfs_da_node_entry * +xfs_da3_node_tree_p(struct xfs_da_intnode *dap) +{ + if (dap->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA3_NODE_MAGIC)) { + struct xfs_da3_intnode *dap3 =3D (struct xfs_da3_intnode *)dap; + return dap3->__btree; + } + return dap->__btree; +} + +extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); +extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); =20 #define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize =20 @@ -214,29 +274,29 @@ struct xfs_nameops { /* * Routines used for growing the Btree. */ -int xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, - struct xfs_buf **bpp, int whichfork); -int xfs_da_split(xfs_da_state_t *state); +int xfs_da3_node_create(struct xfs_da_args *args, xfs_dablk_t blkno, + int level, struct xfs_buf **bpp, int whichfork); +int xfs_da3_split(xfs_da_state_t *state); =20 /* * Routines used for shrinking the Btree. */ -int xfs_da_join(xfs_da_state_t *state); -void xfs_da_fixhashpath(xfs_da_state_t *state, - xfs_da_state_path_t *path_to_to_fix); +int xfs_da3_join(xfs_da_state_t *state); +void xfs_da3_fixhashpath(struct xfs_da_state *state, + struct xfs_da_state_path *path_to_to_fix); =20 /* * Routines used for finding things in the Btree. */ -int xfs_da_node_lookup_int(xfs_da_state_t *state, int *result); -int xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, +int xfs_da3_node_lookup_int(xfs_da_state_t *state, int *result); +int xfs_da3_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, int forward, int release, int *result); /* * Utility routines. */ -int xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, +int xfs_da3_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, xfs_da_state_blk_t *new_blk); -int xfs_da_node_read(struct xfs_trans *tp, struct xfs_inode *dp, +int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp, int which_fork); =20 diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index 2adf92b..bb2ccf2 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -967,7 +967,7 @@ restart: * Search to see if name already exists, and get back a pointer * to where it should go. */ - error =3D xfs_da_node_lookup_int(state, &retval); + error =3D xfs_da3_node_lookup_int(state, &retval); if (error) goto out; blk =3D &state->path.blk[ state->path.active-1 ]; @@ -1038,7 +1038,7 @@ restart: * in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields. */ xfs_bmap_init(args->flist, args->firstblock); - error =3D xfs_da_split(state); + error =3D xfs_da3_split(state); if (!error) { error =3D xfs_bmap_finish(&args->trans, args->flist, &committed); @@ -1060,7 +1060,7 @@ restart: /* * Addition succeeded, update Btree hashvals. */ - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); } =20 /* @@ -1131,7 +1131,7 @@ restart: state->blocksize =3D state->mp->m_sb.sb_blocksize; state->node_ents =3D state->mp->m_attr_node_ents; state->inleaf =3D 0; - error =3D xfs_da_node_lookup_int(state, &retval); + error =3D xfs_da3_node_lookup_int(state, &retval); if (error) goto out; =20 @@ -1141,14 +1141,14 @@ restart: blk =3D &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); error =3D xfs_attr_leaf_remove(blk->bp, args); - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); =20 /* * Check to see if the tree needs to be collapsed. */ if (retval && (state->path.active > 1)) { xfs_bmap_init(args->flist, args->firstblock); - error =3D xfs_da_join(state); + error =3D xfs_da3_join(state); if (!error) { error =3D xfs_bmap_finish(&args->trans, args->flist, @@ -1226,7 +1226,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) /* * Search to see if name exists, and get back a pointer to it. */ - error =3D xfs_da_node_lookup_int(state, &retval); + error =3D xfs_da3_node_lookup_int(state, &retval); if (error || (retval !=3D EEXIST)) { if (error =3D=3D 0) error =3D retval; @@ -1277,14 +1277,14 @@ xfs_attr_node_removename(xfs_da_args_t *args) blk =3D &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); retval =3D xfs_attr_leaf_remove(blk->bp, args); - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); =20 /* * Check to see if the tree needs to be collapsed. */ if (retval && (state->path.active > 1)) { xfs_bmap_init(args->flist, args->firstblock); - error =3D xfs_da_join(state); + error =3D xfs_da3_join(state); if (!error) { error =3D xfs_bmap_finish(&args->trans, args->flist, &committed); @@ -1430,7 +1430,7 @@ xfs_attr_refillstate(xfs_da_state_t *state) ASSERT((path->active >=3D 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk =3D path->blk, level =3D 0; level < path->active; blk++, level++= ) { if (blk->disk_blkno) { - error =3D xfs_da_node_read(state->args->trans, + error =3D xfs_da3_node_read(state->args->trans, state->args->dp, blk->blkno, blk->disk_blkno, &blk->bp, XFS_ATTR_FORK); @@ -1449,7 +1449,7 @@ xfs_attr_refillstate(xfs_da_state_t *state) ASSERT((path->active >=3D 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk =3D path->blk, level =3D 0; level < path->active; blk++, level++= ) { if (blk->disk_blkno) { - error =3D xfs_da_node_read(state->args->trans, + error =3D xfs_da3_node_read(state->args->trans, state->args->dp, blk->blkno, blk->disk_blkno, &blk->bp, XFS_ATTR_FORK); @@ -1489,7 +1489,7 @@ xfs_attr_node_get(xfs_da_args_t *args) /* * Search to see if name exists, and get back a pointer to it. */ - error =3D xfs_da_node_lookup_int(state, &retval); + error =3D xfs_da3_node_lookup_int(state, &retval); if (error) { retval =3D error; } else if (retval =3D=3D EEXIST) { diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 85cb31d..cb37198 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -703,6 +703,7 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) struct xfs_buf *bp1, *bp2; xfs_dablk_t blkno; int error; + struct xfs_da_node_entry *btree; =20 trace_xfs_attr_leaf_to_node(args); =20 @@ -728,16 +729,16 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) /* * Set up the new root node. */ - error =3D xfs_da_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); + error =3D xfs_da3_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); if (error) goto out; node =3D bp1->b_addr; leaf =3D bp2->b_addr; ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); /* both on-disk, don't endian-flip twice */ - node->btree[0].hashval =3D - leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; - node->btree[0].before =3D cpu_to_be32(blkno); + btree =3D xfs_da3_node_tree_p(node); + btree[0].hashval =3D leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashv= al; + btree[0].before =3D cpu_to_be32(blkno); node->hdr.count =3D cpu_to_be16(1); xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(dp->i_mount) - 1); error =3D 0; @@ -825,7 +826,7 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state= _blk_t *oldblk, * NOTE: rebalance() currently depends on the 2nd block being empty. */ xfs_attr_leaf_rebalance(state, oldblk, newblk); - error =3D xfs_da_blk_link(state, oldblk, newblk); + error =3D xfs_da3_blk_link(state, oldblk, newblk); if (error) return(error); =20 @@ -1453,7 +1454,7 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *ac= tion) */ forward =3D (info->forw !=3D 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); - error =3D xfs_da_path_shift(state, &state->altpath, forward, + error =3D xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); if (error) return(error); @@ -1510,10 +1511,10 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *= action) */ memcpy(&state->altpath, &state->path, sizeof(state->path)); if (blkno < blk->blkno) { - error =3D xfs_da_path_shift(state, &state->altpath, forward, + error =3D xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); } else { - error =3D xfs_da_path_shift(state, &state->path, forward, + error =3D xfs_da3_path_shift(state, &state->path, forward, 0, &retval); } if (error) diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index 63cd299..3176626 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -31,69 +32,195 @@ /* * Routines used for growing the Btree. */ -STATIC int xfs_da_root_split(xfs_da_state_t *state, +STATIC int xfs_da3_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *existing_root, xfs_da_state_blk_t *new_child); -STATIC int xfs_da_node_split(xfs_da_state_t *state, +STATIC int xfs_da3_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *existing_blk, xfs_da_state_blk_t *split_blk, xfs_da_state_blk_t *blk_to_add, int treelevel, int *result); -STATIC void xfs_da_node_rebalance(xfs_da_state_t *state, +STATIC void xfs_da3_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *node_blk_1, xfs_da_state_blk_t *node_blk_2); -STATIC void xfs_da_node_add(xfs_da_state_t *state, +STATIC void xfs_da3_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *old_node_blk, xfs_da_state_blk_t *new_node_blk); =20 /* * Routines used for shrinking the Btree. */ -STATIC int xfs_da_root_join(xfs_da_state_t *state, +STATIC int xfs_da3_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk); -STATIC int xfs_da_node_toosmall(xfs_da_state_t *state, int *retval); -STATIC void xfs_da_node_remove(xfs_da_state_t *state, +STATIC int xfs_da3_node_toosmall(xfs_da_state_t *state, int *retval); +STATIC void xfs_da3_node_remove(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk); -STATIC void xfs_da_node_unbalance(xfs_da_state_t *state, +STATIC void xfs_da3_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *src_node_blk, xfs_da_state_blk_t *dst_node_blk); =20 /* * Utility routines. */ -STATIC uint xfs_da_node_lasthash(struct xfs_buf *bp, int *count); -STATIC int xfs_da_node_order(struct xfs_buf *node1_bp, - struct xfs_buf *node2_bp); -STATIC int xfs_da_blk_unlink(xfs_da_state_t *state, +STATIC int xfs_da3_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, xfs_da_state_blk_t *save_blk); -STATIC void xfs_da_state_kill_altpath(xfs_da_state_t *state); =20 -static void -xfs_da_node_verify( + +kmem_zone_t *xfs_da_state_zone; /* anchor for state struct zone */ + +/* + * Allocate a dir-state structure. + * We don't put them on the stack since they're large. + */ +xfs_da_state_t * +xfs_da_state_alloc(void) +{ + return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS); +} + +/* + * Kill the altpath contents of a da-state structure. + */ +STATIC void +xfs_da_state_kill_altpath(xfs_da_state_t *state) +{ + int i; + + for (i =3D 0; i < state->altpath.active; i++) + state->altpath.blk[i].bp =3D NULL; + state->altpath.active =3D 0; +} + +/* + * Free a da-state structure. + */ +void +xfs_da_state_free(xfs_da_state_t *state) +{ + xfs_da_state_kill_altpath(state); +#ifdef DEBUG + memset((char *)state, 0, sizeof(*state)); +#endif /* DEBUG */ + kmem_zone_free(xfs_da_state_zone, state); +} + +void +xfs_da3_node_hdr_from_disk( + struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from) +{ + ASSERT(from->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC) || + from->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA3_NODE_MAGIC)); + + if (from->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA3_NODE_MAGIC)) { + struct xfs_da3_node_hdr *hdr3 =3D (struct xfs_da3_node_hdr *)from; + + to->forw =3D be32_to_cpu(hdr3->info.hdr.forw); + to->back =3D be32_to_cpu(hdr3->info.hdr.back); + to->magic =3D be16_to_cpu(hdr3->info.hdr.magic); + to->count =3D be16_to_cpu(hdr3->count); + to->level =3D be16_to_cpu(hdr3->__level); + return; + } + to->forw =3D be32_to_cpu(from->hdr.info.forw); + to->back =3D be32_to_cpu(from->hdr.info.back); + to->magic =3D be16_to_cpu(from->hdr.info.magic); + to->count =3D be16_to_cpu(from->hdr.count); + to->level =3D be16_to_cpu(from->hdr.__level); +} + +void +xfs_da3_node_hdr_to_disk( + struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from) +{ + ASSERT(from->magic =3D=3D XFS_DA_NODE_MAGIC || + from->magic =3D=3D XFS_DA3_NODE_MAGIC); + + if (from->magic =3D=3D XFS_DA3_NODE_MAGIC) { + struct xfs_da3_node_hdr *hdr3 =3D (struct xfs_da3_node_hdr *)to; + + hdr3->info.hdr.forw =3D cpu_to_be32(from->forw); + hdr3->info.hdr.back =3D cpu_to_be32(from->back); + hdr3->info.hdr.magic =3D cpu_to_be16(from->magic); + hdr3->count =3D cpu_to_be16(from->count); + hdr3->__level =3D cpu_to_be16(from->level); + return; + } + to->hdr.info.forw =3D cpu_to_be32(from->forw); + to->hdr.info.back =3D cpu_to_be32(from->back); + to->hdr.info.magic =3D cpu_to_be16(from->magic); + to->hdr.count =3D cpu_to_be16(from->count); + to->hdr.__level =3D cpu_to_be16(from->level); +} + +static bool +xfs_da3_node_verify( struct xfs_buf *bp) { struct xfs_mount *mp =3D bp->b_target->bt_mount; - struct xfs_da_node_hdr *hdr =3D bp->b_addr; - int block_ok =3D 0; - - block_ok =3D hdr->info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC); - block_ok =3D block_ok && - be16_to_cpu(hdr->level) > 0 && - be16_to_cpu(hdr->count) > 0 ; - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + struct xfs_da_intnode *hdr =3D bp->b_addr; + struct xfs_da3_icnode_hdr ichdr; + + xfs_da3_node_hdr_from_disk(&ichdr, hdr); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_node_hdr *hdr3 =3D bp->b_addr; + + if (ichdr.magic !=3D XFS_DA3_NODE_MAGIC) + return false; + + if (!uuid_equal(&hdr3->info.uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(hdr3->info.blkno) !=3D bp->b_bn) + return false; + } else { + if (ichdr.magic !=3D XFS_DA_NODE_MAGIC) + return false; } + if (ichdr.level =3D=3D 0) + return false; + if (ichdr.level > XFS_DA_NODE_MAXDEPTH) + return false; + if (ichdr.count =3D=3D 0) + return false; + + /* + * we don't know if the node is for and attribute or directory tree, + * so only fail if the count is outside both bounds + */ + if (ichdr.count > mp->m_dir_node_ents && + ichdr.count > mp->m_attr_node_ents) + return false; + + /* XXX: hash order check? */ =20 + return true; } =20 static void -xfs_da_node_write_verify( +xfs_da3_node_write_verify( struct xfs_buf *bp) { - xfs_da_node_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + struct xfs_da3_node_hdr *hdr3 =3D bp->b_addr; + + if (!xfs_da3_node_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->info.lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DA3_NODE_CRC_OFF); } =20 /* @@ -103,16 +230,22 @@ xfs_da_node_write_verify( * format of the block being read. */ static void -xfs_da_node_read_verify( +xfs_da3_node_read_verify( struct xfs_buf *bp) { struct xfs_mount *mp =3D bp->b_target->bt_mount; struct xfs_da_blkinfo *info =3D bp->b_addr; =20 switch (be16_to_cpu(info->magic)) { + case XFS_DA3_NODE_MAGIC: + if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_DA3_NODE_CRC_OFF)) + break; + /* fall through */ case XFS_DA_NODE_MAGIC: - xfs_da_node_verify(bp); - break; + if (!xfs_da3_node_verify(bp)) + break; + return; case XFS_ATTR_LEAF_MAGIC: bp->b_ops =3D &xfs_attr_leaf_buf_ops; bp->b_ops->verify_read(bp); @@ -123,21 +256,22 @@ xfs_da_node_read_verify( bp->b_ops->verify_read(bp); return; default: - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - mp, info); - xfs_buf_ioerror(bp, EFSCORRUPTED); break; } + + /* corrupt block */ + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); } =20 -const struct xfs_buf_ops xfs_da_node_buf_ops =3D { - .verify_read =3D xfs_da_node_read_verify, - .verify_write =3D xfs_da_node_write_verify, +const struct xfs_buf_ops xfs_da3_node_buf_ops =3D { + .verify_read =3D xfs_da3_node_read_verify, + .verify_write =3D xfs_da3_node_write_verify, }; =20 =20 int -xfs_da_node_read( +xfs_da3_node_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, @@ -146,7 +280,7 @@ xfs_da_node_read( int which_fork) { return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, - which_fork, &xfs_da_node_buf_ops); + which_fork, &xfs_da3_node_buf_ops); } =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -157,33 +291,45 @@ xfs_da_node_read( * Create the initial contents of an intermediate node. */ int -xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, - struct xfs_buf **bpp, int whichfork) +xfs_da3_node_create( + struct xfs_da_args *args, + xfs_dablk_t blkno, + int level, + struct xfs_buf **bpp, + int whichfork) { - xfs_da_intnode_t *node; - struct xfs_buf *bp; - int error; - xfs_trans_t *tp; + struct xfs_da_intnode *node; + struct xfs_trans *tp =3D args->trans; + struct xfs_mount *mp =3D tp->t_mountp; + struct xfs_da3_icnode_hdr ichdr =3D {0}; + struct xfs_buf *bp; + int error; =20 trace_xfs_da_node_create(args); + ASSERT(level <=3D XFS_DA_NODE_MAXDEPTH); =20 - tp =3D args->trans; error =3D xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); if (error) return(error); - ASSERT(bp !=3D NULL); node =3D bp->b_addr; - node->hdr.info.forw =3D 0; - node->hdr.info.back =3D 0; - node->hdr.info.magic =3D cpu_to_be16(XFS_DA_NODE_MAGIC); - node->hdr.info.pad =3D 0; - node->hdr.count =3D 0; - node->hdr.level =3D cpu_to_be16(level); =20 + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_node_hdr *hdr3 =3D bp->b_addr; + + ichdr.magic =3D XFS_DA3_NODE_MAGIC; + hdr3->info.blkno =3D cpu_to_be64(bp->b_bn); + hdr3->info.owner =3D cpu_to_be64(args->dp->i_ino); + uuid_copy(&hdr3->info.uuid, &mp->m_sb.sb_uuid); + } else { + ichdr.magic =3D XFS_DA_NODE_MAGIC; + } + ichdr.level =3D level; + + xfs_da3_node_hdr_to_disk(node, &ichdr); xfs_trans_log_buf(tp, bp, - XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); + XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); =20 - bp->b_ops =3D &xfs_da_node_buf_ops; + bp->b_ops =3D &xfs_da3_node_buf_ops; *bpp =3D bp; return(0); } @@ -193,12 +339,18 @@ xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t b= lkno, int level, * intermediate nodes, rebalance, etc. */ int /* error */ -xfs_da_split(xfs_da_state_t *state) +xfs_da3_split( + struct xfs_da_state *state) { - xfs_da_state_blk_t *oldblk, *newblk, *addblk; - xfs_da_intnode_t *node; - struct xfs_buf *bp; - int max, action, error, i; + struct xfs_da_state_blk *oldblk; + struct xfs_da_state_blk *newblk; + struct xfs_da_state_blk *addblk; + struct xfs_da_intnode *node; + struct xfs_buf *bp; + int max; + int action; + int error; + int i; =20 trace_xfs_da_split(state->args); =20 @@ -260,7 +412,7 @@ xfs_da_split(xfs_da_state_t *state) addblk =3D newblk; break; case XFS_DA_NODE_MAGIC: - error =3D xfs_da_node_split(state, oldblk, newblk, addblk, + error =3D xfs_da3_node_split(state, oldblk, newblk, addblk, max - i, &action); addblk->bp =3D NULL; if (error) @@ -278,7 +430,7 @@ xfs_da_split(xfs_da_state_t *state) /* * Update the btree to show the new hashval for this child. */ - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); } if (!addblk) return(0); @@ -288,7 +440,7 @@ xfs_da_split(xfs_da_state_t *state) */ ASSERT(state->path.active =3D=3D 0); oldblk =3D &state->path.blk[0]; - error =3D xfs_da_root_split(state, oldblk, addblk); + error =3D xfs_da3_root_split(state, oldblk, addblk); if (error) { addblk->bp =3D NULL; return(error); /* GROT: dir is inconsistent */ @@ -299,8 +451,10 @@ xfs_da_split(xfs_da_state_t *state) * just got bumped because of the addition of a new root node. * There might be three blocks involved if a double split occurred, * and the original block 0 could be at any position in the list. + * + * Note: the info structures being modified here for both v2 and v3 da + * headers, so we can do this linkage just using the v2 structures. */ - node =3D oldblk->bp->b_addr; if (node->hdr.info.forw) { if (be32_to_cpu(node->hdr.info.forw) =3D=3D addblk->blkno) { @@ -339,18 +493,25 @@ xfs_da_split(xfs_da_state_t *state) * the EOF, extending the inode in process. */ STATIC int /* error */ -xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2) +xfs_da3_root_split( + struct xfs_da_state *state, + struct xfs_da_state_blk *blk1, + struct xfs_da_state_blk *blk2) { - xfs_da_intnode_t *node, *oldroot; - xfs_da_args_t *args; - xfs_dablk_t blkno; - struct xfs_buf *bp; - int error, size; - xfs_inode_t *dp; - xfs_trans_t *tp; - xfs_mount_t *mp; - xfs_dir2_leaf_t *leaf; + struct xfs_da_intnode *node; + struct xfs_da_intnode *oldroot; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_args *args; + struct xfs_buf *bp; + struct xfs_inode *dp; + struct xfs_trans *tp; + struct xfs_mount *mp; + struct xfs_dir2_leaf *leaf; + xfs_dablk_t blkno; + int level; + int error; + int size; =20 trace_xfs_da_root_split(state->args); =20 @@ -359,22 +520,26 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state= _blk_t *blk1, * to a free space somewhere. */ args =3D state->args; - ASSERT(args !=3D NULL); error =3D xfs_da_grow_inode(args, &blkno); if (error) - return(error); + return error; + dp =3D args->dp; tp =3D args->trans; mp =3D state->mp; error =3D xfs_da_get_buf(tp, dp, blkno, -1, &bp, args->whichfork); if (error) - return(error); - ASSERT(bp !=3D NULL); + return error; node =3D bp->b_addr; oldroot =3D blk1->bp->b_addr; - if (oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)) { - size =3D (int)((char *)&oldroot->btree[be16_to_cpu(oldroot->hdr.count)] - - (char *)oldroot); + if (oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC) || + oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA3_NODE_MAGIC)) { + struct xfs_da3_icnode_hdr nodehdr; + + xfs_da3_node_hdr_from_disk(&nodehdr, oldroot); + btree =3D xfs_da3_node_tree_p(oldroot); + size =3D (int)((char *)&btree[nodehdr.count] - (char *)oldroot); + level =3D nodehdr.level; } else { struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir2_leaf_entry *ents; @@ -386,9 +551,22 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_= blk_t *blk1, ASSERT(leafhdr.magic =3D=3D XFS_DIR2_LEAFN_MAGIC || leafhdr.magic =3D=3D XFS_DIR3_LEAFN_MAGIC); size =3D (int)((char *)&ents[leafhdr.count] - (char *)leaf); + level =3D 0; } - /* XXX: can't just copy CRC headers from one block to another */ + + /* + * we can copy most of the information in the node from one block to + * another, but for CRC enabled headers we have to make sure that the + * block specific identifiers are kept intact. We update the buffer + * directly for this. + */ memcpy(node, oldroot, size); + if (oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA3_NODE_MAGIC) || + oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_da3_intnode *node3 =3D (struct xfs_da3_intnode *)node; + + node3->hdr.info.blkno =3D cpu_to_be64(bp->b_bn); + } xfs_trans_log_buf(tp, bp, 0, size - 1); =20 bp->b_ops =3D blk1->bp->b_ops; @@ -398,17 +576,21 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state= _blk_t *blk1, /* * Set up the new root node. */ - error =3D xfs_da_node_create(args, + error =3D xfs_da3_node_create(args, (args->whichfork =3D=3D XFS_DATA_FORK) ? mp->m_dirleafblk : 0, - be16_to_cpu(node->hdr.level) + 1, &bp, args->whichfork); + level + 1, &bp, args->whichfork); if (error) - return(error); + return error; + node =3D bp->b_addr; - node->btree[0].hashval =3D cpu_to_be32(blk1->hashval); - node->btree[0].before =3D cpu_to_be32(blk1->blkno); - node->btree[1].hashval =3D cpu_to_be32(blk2->hashval); - node->btree[1].before =3D cpu_to_be32(blk2->blkno); - node->hdr.count =3D cpu_to_be16(2); + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree =3D xfs_da3_node_tree_p(node); + btree[0].hashval =3D cpu_to_be32(blk1->hashval); + btree[0].before =3D cpu_to_be32(blk1->blkno); + btree[1].hashval =3D cpu_to_be32(blk2->hashval); + btree[1].before =3D cpu_to_be32(blk2->blkno); + nodehdr.count =3D 2; + xfs_da3_node_hdr_to_disk(node, &nodehdr); =20 #ifdef DEBUG if (oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || @@ -422,30 +604,34 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state= _blk_t *blk1, =20 /* Header is already logged by xfs_da_node_create */ xfs_trans_log_buf(tp, bp, - XFS_DA_LOGRANGE(node, node->btree, - sizeof(xfs_da_node_entry_t) * 2)); + XFS_DA_LOGRANGE(node, btree, sizeof(xfs_da_node_entry_t) * 2)); =20 - return(0); + return 0; } =20 /* * Split the node, rebalance, then add the new entry. */ STATIC int /* error */ -xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, - xfs_da_state_blk_t *newblk, - xfs_da_state_blk_t *addblk, - int treelevel, int *result) +xfs_da3_node_split( + struct xfs_da_state *state, + struct xfs_da_state_blk *oldblk, + struct xfs_da_state_blk *newblk, + struct xfs_da_state_blk *addblk, + int treelevel, + int *result) { - xfs_da_intnode_t *node; - xfs_dablk_t blkno; - int newcount, error; - int useextra; + struct xfs_da_intnode *node; + struct xfs_da3_icnode_hdr nodehdr; + xfs_dablk_t blkno; + int newcount; + int error; + int useextra; =20 trace_xfs_da_node_split(state->args); =20 node =3D oldblk->bp->b_addr; - ASSERT(node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); + xfs_da3_node_hdr_from_disk(&nodehdr, node); =20 /* * With V2 dirs the extra block is data or freespace. @@ -455,7 +641,7 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_b= lk_t *oldblk, /* * Do we have to split the node? */ - if ((be16_to_cpu(node->hdr.count) + newcount) > state->node_ents) { + if (nodehdr.count + newcount > state->node_ents) { /* * Allocate a new node, add to the doubly linked chain of * nodes, then move some of our excess entries into it. @@ -464,14 +650,14 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state= _blk_t *oldblk, if (error) return(error); /* GROT: dir is inconsistent */ =20 - error =3D xfs_da_node_create(state->args, blkno, treelevel, + error =3D xfs_da3_node_create(state->args, blkno, treelevel, &newblk->bp, state->args->whichfork); if (error) return(error); /* GROT: dir is inconsistent */ newblk->blkno =3D blkno; newblk->magic =3D XFS_DA_NODE_MAGIC; - xfs_da_node_rebalance(state, oldblk, newblk); - error =3D xfs_da_blk_link(state, oldblk, newblk); + xfs_da3_node_rebalance(state, oldblk, newblk); + error =3D xfs_da3_blk_link(state, oldblk, newblk); if (error) return(error); *result =3D 1; @@ -483,7 +669,7 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_b= lk_t *oldblk, * Insert the new entry(s) into the correct block * (updating last hashval in the process). * - * xfs_da_node_add() inserts BEFORE the given index, + * xfs_da3_node_add() inserts BEFORE the given index, * and as a result of using node_lookup_int() we always * point to a valid entry (not after one), but a split * operation always results in a new block whose hashvals @@ -492,22 +678,23 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state= _blk_t *oldblk, * If we had double-split op below us, then add the extra block too. */ node =3D oldblk->bp->b_addr; - if (oldblk->index <=3D be16_to_cpu(node->hdr.count)) { + xfs_da3_node_hdr_from_disk(&nodehdr, node); + if (oldblk->index <=3D nodehdr.count) { oldblk->index++; - xfs_da_node_add(state, oldblk, addblk); + xfs_da3_node_add(state, oldblk, addblk); if (useextra) { if (state->extraafter) oldblk->index++; - xfs_da_node_add(state, oldblk, &state->extrablk); + xfs_da3_node_add(state, oldblk, &state->extrablk); state->extravalid =3D 0; } } else { newblk->index++; - xfs_da_node_add(state, newblk, addblk); + xfs_da3_node_add(state, newblk, addblk); if (useextra) { if (state->extraafter) newblk->index++; - xfs_da_node_add(state, newblk, &state->extrablk); + xfs_da3_node_add(state, newblk, &state->extrablk); state->extravalid =3D 0; } } @@ -522,33 +709,53 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state= _blk_t *oldblk, * NOTE: if blk2 is empty, then it will get the upper half of blk1. */ STATIC void -xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2) +xfs_da3_node_rebalance( + struct xfs_da_state *state, + struct xfs_da_state_blk *blk1, + struct xfs_da_state_blk *blk2) { - xfs_da_intnode_t *node1, *node2, *tmpnode; - xfs_da_node_entry_t *btree_s, *btree_d; - int count, tmp; - xfs_trans_t *tp; + struct xfs_da_intnode *node1; + struct xfs_da_intnode *node2; + struct xfs_da_intnode *tmpnode; + struct xfs_da_node_entry *btree1; + struct xfs_da_node_entry *btree2; + struct xfs_da_node_entry *btree_s; + struct xfs_da_node_entry *btree_d; + struct xfs_da3_icnode_hdr nodehdr1; + struct xfs_da3_icnode_hdr nodehdr2; + struct xfs_trans *tp; + int count; + int tmp; + int swap =3D 0; =20 trace_xfs_da_node_rebalance(state->args); =20 node1 =3D blk1->bp->b_addr; node2 =3D blk2->bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr1, node1); + xfs_da3_node_hdr_from_disk(&nodehdr2, node2); + btree1 =3D xfs_da3_node_tree_p(node1); + btree2 =3D xfs_da3_node_tree_p(node2); + /* * Figure out how many entries need to move, and in which direction. * Swap the nodes around if that makes it simpler. */ - if ((be16_to_cpu(node1->hdr.count) > 0) && (be16_to_cpu(node2->hdr.count)= > 0) && - ((be32_to_cpu(node2->btree[0].hashval) < be32_to_cpu(node1->btree[0].= hashval)) || - (be32_to_cpu(node2->btree[be16_to_cpu(node2->hdr.count)-1].hashval) < - be32_to_cpu(node1->btree[be16_to_cpu(node1->hdr.count)-1].hashval))= )) { + if (nodehdr1.count > 0 && nodehdr2.count > 0 && + ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) || + (be32_to_cpu(btree2[nodehdr2.count - 1].hashval) < + be32_to_cpu(btree1[nodehdr1.count - 1].hashval)))) { tmpnode =3D node1; node1 =3D node2; node2 =3D tmpnode; + xfs_da3_node_hdr_from_disk(&nodehdr1, node1); + xfs_da3_node_hdr_from_disk(&nodehdr2, node2); + btree1 =3D xfs_da3_node_tree_p(node1); + btree2 =3D xfs_da3_node_tree_p(node2); + swap =3D 1; } - ASSERT(node1->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); - ASSERT(node2->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); - count =3D (be16_to_cpu(node1->hdr.count) - be16_to_cpu(node2->hdr.count))= / 2; + + count =3D (nodehdr1.count - nodehdr2.count) / 2; if (count =3D=3D 0) return; tp =3D state->args->trans; @@ -559,10 +766,11 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_s= tate_blk_t *blk1, /* * Move elements in node2 up to make a hole. */ - if ((tmp =3D be16_to_cpu(node2->hdr.count)) > 0) { + tmp =3D nodehdr2.count; + if (tmp > 0) { tmp *=3D (uint)sizeof(xfs_da_node_entry_t); - btree_s =3D &node2->btree[0]; - btree_d =3D &node2->btree[count]; + btree_s =3D &btree2[0]; + btree_d =3D &btree2[count]; memmove(btree_d, btree_s, tmp); } =20 @@ -570,12 +778,12 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_s= tate_blk_t *blk1, * Move the req'd B-tree elements from high in node1 to * low in node2. */ - be16_add_cpu(&node2->hdr.count, count); + nodehdr2.count +=3D count; tmp =3D count * (uint)sizeof(xfs_da_node_entry_t); - btree_s =3D &node1->btree[be16_to_cpu(node1->hdr.count) - count]; - btree_d =3D &node2->btree[0]; + btree_s =3D &btree1[nodehdr1.count- count]; + btree_d =3D &btree2[0]; memcpy(btree_d, btree_s, tmp); - be16_add_cpu(&node1->hdr.count, -count); + nodehdr1.count -=3D count; } else { /* * Move the req'd B-tree elements from low in node2 to @@ -583,49 +791,60 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_s= tate_blk_t *blk1, */ count =3D -count; tmp =3D count * (uint)sizeof(xfs_da_node_entry_t); - btree_s =3D &node2->btree[0]; - btree_d =3D &node1->btree[be16_to_cpu(node1->hdr.count)]; + btree_s =3D &btree2[0]; + btree_d =3D &btree1[nodehdr1.count]; memcpy(btree_d, btree_s, tmp); - be16_add_cpu(&node1->hdr.count, count); + nodehdr1.count +=3D count; + xfs_trans_log_buf(tp, blk1->bp, XFS_DA_LOGRANGE(node1, btree_d, tmp)); =20 /* * Move elements in node2 down to fill the hole. */ - tmp =3D be16_to_cpu(node2->hdr.count) - count; + tmp =3D nodehdr2.count - count; tmp *=3D (uint)sizeof(xfs_da_node_entry_t); - btree_s =3D &node2->btree[count]; - btree_d =3D &node2->btree[0]; + btree_s =3D &btree2[count]; + btree_d =3D &btree2[0]; memmove(btree_d, btree_s, tmp); - be16_add_cpu(&node2->hdr.count, -count); + nodehdr2.count -=3D count; } =20 /* * Log header of node 1 and all current bits of node 2. */ + xfs_da3_node_hdr_to_disk(node1, &nodehdr1); xfs_trans_log_buf(tp, blk1->bp, - XFS_DA_LOGRANGE(node1, &node1->hdr, sizeof(node1->hdr))); + XFS_DA_LOGRANGE(node1, &node1->hdr, + xfs_da3_node_hdr_size(node1))); + + xfs_da3_node_hdr_to_disk(node2, &nodehdr2); xfs_trans_log_buf(tp, blk2->bp, XFS_DA_LOGRANGE(node2, &node2->hdr, - sizeof(node2->hdr) + - sizeof(node2->btree[0]) * be16_to_cpu(node2->hdr.count))); + xfs_da3_node_hdr_size(node2) + + (sizeof(btree2[0]) * nodehdr2.count))); =20 /* * Record the last hashval from each block for upward propagation. * (note: don't use the swapped node pointers) */ - node1 =3D blk1->bp->b_addr; - node2 =3D blk2->bp->b_addr; - blk1->hashval =3D be32_to_cpu(node1->btree[be16_to_cpu(node1->hdr.count)-= 1].hashval); - blk2->hashval =3D be32_to_cpu(node2->btree[be16_to_cpu(node2->hdr.count)-= 1].hashval); + if (swap) { + node1 =3D blk1->bp->b_addr; + node2 =3D blk2->bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr1, node1); + xfs_da3_node_hdr_from_disk(&nodehdr2, node2); + btree1 =3D xfs_da3_node_tree_p(node1); + btree2 =3D xfs_da3_node_tree_p(node2); + } + blk1->hashval =3D be32_to_cpu(btree1[nodehdr1.count - 1].hashval); + blk2->hashval =3D be32_to_cpu(btree2[nodehdr2.count - 1].hashval); =20 /* * Adjust the expected index for insertion. */ - if (blk1->index >=3D be16_to_cpu(node1->hdr.count)) { - blk2->index =3D blk1->index - be16_to_cpu(node1->hdr.count); - blk1->index =3D be16_to_cpu(node1->hdr.count) + 1; /* make it invalid */ + if (blk1->index >=3D nodehdr1.count) { + blk2->index =3D blk1->index - nodehdr1.count; + blk1->index =3D nodehdr1.count + 1; /* make it invalid */ } } =20 @@ -633,18 +852,23 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_s= tate_blk_t *blk1, * Add a new entry to an intermediate node. */ STATIC void -xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, - xfs_da_state_blk_t *newblk) +xfs_da3_node_add( + struct xfs_da_state *state, + struct xfs_da_state_blk *oldblk, + struct xfs_da_state_blk *newblk) { - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - int tmp; + struct xfs_da_intnode *node; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_node_entry *btree; + int tmp; =20 trace_xfs_da_node_add(state->args); =20 node =3D oldblk->bp->b_addr; - ASSERT(node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); - ASSERT((oldblk->index >=3D 0) && (oldblk->index <=3D be16_to_cpu(node->hd= r.count))); + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree =3D xfs_da3_node_tree_p(node); + + ASSERT(oldblk->index >=3D 0 && oldblk->index <=3D nodehdr.count); ASSERT(newblk->blkno !=3D 0); if (state->args->whichfork =3D=3D XFS_DATA_FORK) ASSERT(newblk->blkno >=3D state->mp->m_dirleafblk && @@ -654,23 +878,25 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_b= lk_t *oldblk, * We may need to make some room before we insert the new node. */ tmp =3D 0; - btree =3D &node->btree[ oldblk->index ]; - if (oldblk->index < be16_to_cpu(node->hdr.count)) { - tmp =3D (be16_to_cpu(node->hdr.count) - oldblk->index) * (uint)sizeof(*b= tree); - memmove(btree + 1, btree, tmp); + if (oldblk->index < nodehdr.count) { + tmp =3D (nodehdr.count - oldblk->index) * (uint)sizeof(*btree); + memmove(&btree[oldblk->index + 1], &btree[oldblk->index], tmp); } - btree->hashval =3D cpu_to_be32(newblk->hashval); - btree->before =3D cpu_to_be32(newblk->blkno); + btree[oldblk->index].hashval =3D cpu_to_be32(newblk->hashval); + btree[oldblk->index].before =3D cpu_to_be32(newblk->blkno); xfs_trans_log_buf(state->args->trans, oldblk->bp, - XFS_DA_LOGRANGE(node, btree, tmp + sizeof(*btree))); - be16_add_cpu(&node->hdr.count, 1); + XFS_DA_LOGRANGE(node, &btree[oldblk->index], + tmp + sizeof(*btree))); + + nodehdr.count +=3D 1; + xfs_da3_node_hdr_to_disk(node, &nodehdr); xfs_trans_log_buf(state->args->trans, oldblk->bp, - XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); + XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); =20 /* * Copy the last hash value from the oldblk to propagate upwards. */ - oldblk->hashval =3D be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-= 1 ].hashval); + oldblk->hashval =3D be32_to_cpu(btree[nodehdr.count - 1].hashval); } =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -682,14 +908,16 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_b= lk_t *oldblk, * possibly deallocating that block, etc... */ int -xfs_da_join(xfs_da_state_t *state) +xfs_da3_join( + struct xfs_da_state *state) { - xfs_da_state_blk_t *drop_blk, *save_blk; - int action, error; + struct xfs_da_state_blk *drop_blk; + struct xfs_da_state_blk *save_blk; + int action =3D 0; + int error; =20 trace_xfs_da_join(state->args); =20 - action =3D 0; drop_blk =3D &state->path.blk[ state->path.active-1 ]; save_blk =3D &state->altpath.blk[ state->path.active-1 ]; ASSERT(state->path.blk[0].magic =3D=3D XFS_DA_NODE_MAGIC); @@ -730,18 +958,18 @@ xfs_da_join(xfs_da_state_t *state) * Remove the offending node, fixup hashvals, * check for a toosmall neighbor. */ - xfs_da_node_remove(state, drop_blk); - xfs_da_fixhashpath(state, &state->path); - error =3D xfs_da_node_toosmall(state, &action); + xfs_da3_node_remove(state, drop_blk); + xfs_da3_fixhashpath(state, &state->path); + error =3D xfs_da3_node_toosmall(state, &action); if (error) return(error); if (action =3D=3D 0) return 0; - xfs_da_node_unbalance(state, drop_blk, save_blk); + xfs_da3_node_unbalance(state, drop_blk, save_blk); break; } - xfs_da_fixhashpath(state, &state->altpath); - error =3D xfs_da_blk_unlink(state, drop_blk, save_blk); + xfs_da3_fixhashpath(state, &state->altpath); + error =3D xfs_da3_blk_unlink(state, drop_blk, save_blk); xfs_da_state_kill_altpath(state); if (error) return(error); @@ -756,9 +984,9 @@ xfs_da_join(xfs_da_state_t *state) * we only have one entry in the root, make the child block * the new root. */ - xfs_da_node_remove(state, drop_blk); - xfs_da_fixhashpath(state, &state->path); - error =3D xfs_da_root_join(state, &state->path.blk[0]); + xfs_da3_node_remove(state, drop_blk); + xfs_da3_fixhashpath(state, &state->path); + error =3D xfs_da3_root_join(state, &state->path.blk[0]); return(error); } =20 @@ -772,8 +1000,10 @@ xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkin= fo *blkinfo, __u16 level) ASSERT(magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - } else - ASSERT(magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); + } else { + ASSERT(magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC) || + magic =3D=3D cpu_to_be16(XFS_DA3_NODE_MAGIC)); + } ASSERT(!blkinfo->forw); ASSERT(!blkinfo->back); } @@ -786,52 +1016,60 @@ xfs_da_blkinfo_onlychild_validate(struct xfs_da_blki= nfo *blkinfo, __u16 level) * the old root to block 0 as the new root node. */ STATIC int -xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) +xfs_da3_root_join( + struct xfs_da_state *state, + struct xfs_da_state_blk *root_blk) { - xfs_da_intnode_t *oldroot; - xfs_da_args_t *args; - xfs_dablk_t child; - struct xfs_buf *bp; - int error; + struct xfs_da_intnode *oldroot; + struct xfs_da_args *args; + xfs_dablk_t child; + struct xfs_buf *bp; + struct xfs_da3_icnode_hdr oldroothdr; + struct xfs_da_node_entry *btree; + int error; =20 trace_xfs_da_root_join(state->args); =20 - args =3D state->args; - ASSERT(args !=3D NULL); ASSERT(root_blk->magic =3D=3D XFS_DA_NODE_MAGIC); + + args =3D state->args; oldroot =3D root_blk->bp->b_addr; - ASSERT(oldroot->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); - ASSERT(!oldroot->hdr.info.forw); - ASSERT(!oldroot->hdr.info.back); + xfs_da3_node_hdr_from_disk(&oldroothdr, oldroot); + ASSERT(oldroothdr.forw =3D=3D 0); + ASSERT(oldroothdr.back =3D=3D 0); =20 /* * If the root has more than one child, then don't do anything. */ - if (be16_to_cpu(oldroot->hdr.count) > 1) - return(0); + if (oldroothdr.count > 1) + return 0; =20 /* * Read in the (only) child block, then copy those bytes into * the root block's buffer and free the original child block. */ - child =3D be32_to_cpu(oldroot->btree[0].before); + btree =3D xfs_da3_node_tree_p(oldroot); + child =3D be32_to_cpu(btree[0].before); ASSERT(child !=3D 0); - error =3D xfs_da_node_read(args->trans, args->dp, child, -1, &bp, + error =3D xfs_da3_node_read(args->trans, args->dp, child, -1, &bp, args->whichfork); if (error) - return(error); - ASSERT(bp !=3D NULL); - xfs_da_blkinfo_onlychild_validate(bp->b_addr, - be16_to_cpu(oldroot->hdr.level)); + return error; + xfs_da_blkinfo_onlychild_validate(bp->b_addr, oldroothdr.level); =20 /* * This could be copying a leaf back into the root block in the case of * there only being a single leaf block left in the tree. Hence we have * to update the b_ops pointer as well to match the buffer type change - * that could occur. + * that could occur. For dir3 blocks we also need to update the block + * number in the buffer header. */ memcpy(root_blk->bp->b_addr, bp->b_addr, state->blocksize); root_blk->bp->b_ops =3D bp->b_ops; + if (oldroothdr.magic =3D=3D XFS_DA3_NODE_MAGIC) { + struct xfs_da3_blkinfo *da3 =3D root_blk->bp->b_addr; + da3->blkno =3D cpu_to_be64(root_blk->bp->b_bn); + } xfs_trans_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); error =3D xfs_da_shrink_inode(args, child, bp); return(error); @@ -847,14 +1085,21 @@ xfs_da_root_join(xfs_da_state_t *state, xfs_da_state= _blk_t *root_blk) * If nothing can be done, return 0. */ STATIC int -xfs_da_node_toosmall(xfs_da_state_t *state, int *action) +xfs_da3_node_toosmall( + struct xfs_da_state *state, + int *action) { - xfs_da_intnode_t *node; - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *info; - int count, forward, error, retval, i; - xfs_dablk_t blkno; - struct xfs_buf *bp; + struct xfs_da_intnode *node; + struct xfs_da_state_blk *blk; + struct xfs_da_blkinfo *info; + xfs_dablk_t blkno; + struct xfs_buf *bp; + struct xfs_da3_icnode_hdr nodehdr; + int count; + int forward; + int error; + int retval; + int i; =20 trace_xfs_da_node_toosmall(state->args); =20 @@ -865,10 +1110,9 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *acti= on) */ blk =3D &state->path.blk[ state->path.active-1 ]; info =3D blk->bp->b_addr; - ASSERT(info->magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); node =3D (xfs_da_intnode_t *)info; - count =3D be16_to_cpu(node->hdr.count); - if (count > (state->node_ents >> 1)) { + xfs_da3_node_hdr_from_disk(&nodehdr, node); + if (nodehdr.count > (state->node_ents >> 1)) { *action =3D 0; /* blk over 50%, don't try to join */ return(0); /* blk over 50%, don't try to join */ } @@ -879,14 +1123,14 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *act= ion) * coalesce it with a sibling block. We choose (arbitrarily) * to merge with the forward block unless it is NULL. */ - if (count =3D=3D 0) { + if (nodehdr.count =3D=3D 0) { /* * Make altpath point to the block we want to keep and * path point to the block we want to drop (this one). */ forward =3D (info->forw !=3D 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); - error =3D xfs_da_path_shift(state, &state->altpath, forward, + error =3D xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); if (error) return(error); @@ -905,35 +1149,34 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *act= ion) * We prefer coalescing with the lower numbered sibling so as * to shrink a directory over time. */ + count =3D state->node_ents; + count -=3D state->node_ents >> 2; + count -=3D nodehdr.count; + /* start with smaller blk num */ - forward =3D (be32_to_cpu(info->forw) < be32_to_cpu(info->back)); + forward =3D nodehdr.forw < nodehdr.back; for (i =3D 0; i < 2; forward =3D !forward, i++) { if (forward) - blkno =3D be32_to_cpu(info->forw); + blkno =3D nodehdr.forw; else - blkno =3D be32_to_cpu(info->back); + blkno =3D nodehdr.back; if (blkno =3D=3D 0) continue; - error =3D xfs_da_node_read(state->args->trans, state->args->dp, + error =3D xfs_da3_node_read(state->args->trans, state->args->dp, blkno, -1, &bp, state->args->whichfork); if (error) return(error); - ASSERT(bp !=3D NULL); =20 - node =3D (xfs_da_intnode_t *)info; - count =3D state->node_ents; - count -=3D state->node_ents >> 2; - count -=3D be16_to_cpu(node->hdr.count); node =3D bp->b_addr; - ASSERT(node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); - count -=3D be16_to_cpu(node->hdr.count); + xfs_da3_node_hdr_from_disk(&nodehdr, node); xfs_trans_brelse(state->args->trans, bp); - if (count >=3D 0) + + if (count - nodehdr.count >=3D 0) break; /* fits with at least 25% to spare */ } if (i >=3D 2) { *action =3D 0; - return(0); + return 0; } =20 /* @@ -942,28 +1185,42 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *act= ion) */ memcpy(&state->altpath, &state->path, sizeof(state->path)); if (blkno < blk->blkno) { - error =3D xfs_da_path_shift(state, &state->altpath, forward, + error =3D xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); - if (error) { - return(error); - } - if (retval) { - *action =3D 0; - return(0); - } } else { - error =3D xfs_da_path_shift(state, &state->path, forward, + error =3D xfs_da3_path_shift(state, &state->path, forward, 0, &retval); - if (error) { - return(error); - } - if (retval) { - *action =3D 0; - return(0); - } + } + if (error) + return error; + if (retval) { + *action =3D 0; + return 0; } *action =3D 1; - return(0); + return 0; +} + +/* + * Pick up the last hashvalue from an intermediate node. + */ +STATIC uint +xfs_da3_node_lasthash( + struct xfs_buf *bp, + int *count) +{ + struct xfs_da_intnode *node; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; + + node =3D bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr, node); + if (count) + *count =3D nodehdr.count; + if (!nodehdr.count) + return 0; + btree =3D xfs_da3_node_tree_p(node); + return be32_to_cpu(btree[nodehdr.count - 1].hashval); } =20 /* @@ -971,13 +1228,16 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *act= ion) * when we stop making changes, return. */ void -xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_state_path_t *path) +xfs_da3_fixhashpath( + struct xfs_da_state *state, + struct xfs_da_state_path *path) { - xfs_da_state_blk_t *blk; - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - xfs_dahash_t lasthash=3D0; - int level, count; + struct xfs_da_state_blk *blk; + struct xfs_da_intnode *node; + struct xfs_da_node_entry *btree; + xfs_dahash_t lasthash=3D0; + int level; + int count; =20 trace_xfs_da_fixhashpath(state->args); =20 @@ -995,23 +1255,26 @@ xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_sta= te_path_t *path) return; break; case XFS_DA_NODE_MAGIC: - lasthash =3D xfs_da_node_lasthash(blk->bp, &count); + lasthash =3D xfs_da3_node_lasthash(blk->bp, &count); if (count =3D=3D 0) return; break; } for (blk--, level--; level >=3D 0; blk--, level--) { + struct xfs_da3_icnode_hdr nodehdr; + node =3D blk->bp->b_addr; - ASSERT(node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); - btree =3D &node->btree[ blk->index ]; + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree =3D xfs_da3_node_tree_p(node); if (be32_to_cpu(btree->hashval) =3D=3D lasthash) break; blk->hashval =3D lasthash; - btree->hashval =3D cpu_to_be32(lasthash); + btree[blk->index].hashval =3D cpu_to_be32(lasthash); xfs_trans_log_buf(state->args->trans, blk->bp, - XFS_DA_LOGRANGE(node, btree, sizeof(*btree))); + XFS_DA_LOGRANGE(node, &btree[blk->index], + sizeof(*btree))); =20 - lasthash =3D be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1].has= hval); + lasthash =3D be32_to_cpu(btree[nodehdr.count - 1].hashval); } } =20 @@ -1019,104 +1282,119 @@ xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_= state_path_t *path) * Remove an entry from an intermediate node. */ STATIC void -xfs_da_node_remove(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk) +xfs_da3_node_remove( + struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk) { - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - int tmp; + struct xfs_da_intnode *node; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_node_entry *btree; + int index; + int tmp; =20 trace_xfs_da_node_remove(state->args); =20 node =3D drop_blk->bp->b_addr; - ASSERT(drop_blk->index < be16_to_cpu(node->hdr.count)); + xfs_da3_node_hdr_from_disk(&nodehdr, node); + ASSERT(drop_blk->index < nodehdr.count); ASSERT(drop_blk->index >=3D 0); =20 /* * Copy over the offending entry, or just zero it out. */ - btree =3D &node->btree[drop_blk->index]; - if (drop_blk->index < (be16_to_cpu(node->hdr.count)-1)) { - tmp =3D be16_to_cpu(node->hdr.count) - drop_blk->index - 1; + index =3D drop_blk->index; + btree =3D xfs_da3_node_tree_p(node); + if (index < nodehdr.count - 1) { + tmp =3D nodehdr.count - index - 1; tmp *=3D (uint)sizeof(xfs_da_node_entry_t); - memmove(btree, btree + 1, tmp); + memmove(&btree[index], &btree[index + 1], tmp); xfs_trans_log_buf(state->args->trans, drop_blk->bp, - XFS_DA_LOGRANGE(node, btree, tmp)); - btree =3D &node->btree[be16_to_cpu(node->hdr.count)-1]; + XFS_DA_LOGRANGE(node, &btree[index], tmp)); + index =3D nodehdr.count - 1; } - memset((char *)btree, 0, sizeof(xfs_da_node_entry_t)); + memset(&btree[index], 0, sizeof(xfs_da_node_entry_t)); xfs_trans_log_buf(state->args->trans, drop_blk->bp, - XFS_DA_LOGRANGE(node, btree, sizeof(*btree))); - be16_add_cpu(&node->hdr.count, -1); + XFS_DA_LOGRANGE(node, &btree[index], sizeof(btree[index]))); + nodehdr.count -=3D 1; + xfs_da3_node_hdr_to_disk(node, &nodehdr); xfs_trans_log_buf(state->args->trans, drop_blk->bp, - XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); + XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); =20 /* * Copy the last hash value from the block to propagate upwards. */ - btree--; - drop_blk->hashval =3D be32_to_cpu(btree->hashval); + drop_blk->hashval =3D be32_to_cpu(btree[index - 1].hashval); } =20 /* - * Unbalance the btree elements between two intermediate nodes, + * Unbalance the elements between two intermediate nodes, * move all Btree elements from one node into another. */ STATIC void -xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, - xfs_da_state_blk_t *save_blk) +xfs_da3_node_unbalance( + struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk, + struct xfs_da_state_blk *save_blk) { - xfs_da_intnode_t *drop_node, *save_node; - xfs_da_node_entry_t *btree; - int tmp; - xfs_trans_t *tp; + struct xfs_da_intnode *drop_node; + struct xfs_da_intnode *save_node; + struct xfs_da_node_entry *dbtree; + struct xfs_da_node_entry *sbtree; + struct xfs_da3_icnode_hdr dhdr; + struct xfs_da3_icnode_hdr shdr; + struct xfs_trans *tp; + int sindex; + int tmp; =20 trace_xfs_da_node_unbalance(state->args); =20 drop_node =3D drop_blk->bp->b_addr; save_node =3D save_blk->bp->b_addr; - ASSERT(drop_node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); - ASSERT(save_node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); + xfs_da3_node_hdr_from_disk(&dhdr, drop_node); + xfs_da3_node_hdr_from_disk(&shdr, save_node); + dbtree =3D xfs_da3_node_tree_p(drop_node); + sbtree =3D xfs_da3_node_tree_p(save_node); tp =3D state->args->trans; =20 /* * If the dying block has lower hashvals, then move all the * elements in the remaining block up to make a hole. */ - if ((be32_to_cpu(drop_node->btree[0].hashval) < be32_to_cpu(save_node->bt= ree[ 0 ].hashval)) || - (be32_to_cpu(drop_node->btree[be16_to_cpu(drop_node->hdr.count)-1].ha= shval) < - be32_to_cpu(save_node->btree[be16_to_cpu(save_node->hdr.count)-1].ha= shval))) - { - btree =3D &save_node->btree[be16_to_cpu(drop_node->hdr.count)]; - tmp =3D be16_to_cpu(save_node->hdr.count) * (uint)sizeof(xfs_da_node_ent= ry_t); - memmove(btree, &save_node->btree[0], tmp); - btree =3D &save_node->btree[0]; + if ((be32_to_cpu(dbtree[0].hashval) < be32_to_cpu(sbtree[ 0 ].hashval)) || + (be32_to_cpu(dbtree[dhdr.count - 1].hashval) < + be32_to_cpu(sbtree[shdr.count - 1].hashval))) { + /* XXX: check this - is memmove dst correct? */ + tmp =3D shdr.count * (uint)sizeof(xfs_da_node_entry_t); + memmove(&sbtree[dhdr.count], &sbtree[0], tmp); + + sindex =3D 0; xfs_trans_log_buf(tp, save_blk->bp, - XFS_DA_LOGRANGE(save_node, btree, - (be16_to_cpu(save_node->hdr.count) + be16_to_cpu(drop_node->hdr.count)= ) * - sizeof(xfs_da_node_entry_t))); + XFS_DA_LOGRANGE(save_node, &sbtree[0], + (shdr.count + dhdr.count) * + sizeof(xfs_da_node_entry_t))); } else { - btree =3D &save_node->btree[be16_to_cpu(save_node->hdr.count)]; + sindex =3D shdr.count; xfs_trans_log_buf(tp, save_blk->bp, - XFS_DA_LOGRANGE(save_node, btree, - be16_to_cpu(drop_node->hdr.count) * - sizeof(xfs_da_node_entry_t))); + XFS_DA_LOGRANGE(save_node, &sbtree[sindex], + dhdr.count * sizeof(xfs_da_node_entry_t))); } =20 /* * Move all the B-tree elements from drop_blk to save_blk. */ - tmp =3D be16_to_cpu(drop_node->hdr.count) * (uint)sizeof(xfs_da_node_entr= y_t); - memcpy(btree, &drop_node->btree[0], tmp); - be16_add_cpu(&save_node->hdr.count, be16_to_cpu(drop_node->hdr.count)); + tmp =3D dhdr.count * (uint)sizeof(xfs_da_node_entry_t); + memcpy(&sbtree[sindex], &dbtree[0], tmp); + shdr.count +=3D dhdr.count; =20 + xfs_da3_node_hdr_to_disk(save_node, &shdr); xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, &save_node->hdr, - sizeof(save_node->hdr))); + xfs_da3_node_hdr_size(save_node))); =20 /* * Save the last hashval in the remaining block for upward propagation. */ - save_blk->hashval =3D be32_to_cpu(save_node->btree[be16_to_cpu(save_node-= >hdr.count)-1].hashval); + save_blk->hashval =3D be32_to_cpu(sbtree[shdr.count - 1].hashval); } =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -1135,16 +1413,24 @@ xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da= _state_blk_t *drop_blk, * pruned depth-first tree search. */ int /* error */ -xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) +xfs_da3_node_lookup_int( + struct xfs_da_state *state, + int *result) { - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *curr; - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - xfs_dablk_t blkno; - int probe, span, max, error, retval; - xfs_dahash_t hashval, btreehashval; - xfs_da_args_t *args; + struct xfs_da_state_blk *blk; + struct xfs_da_blkinfo *curr; + struct xfs_da_intnode *node; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_args *args; + xfs_dablk_t blkno; + xfs_dahash_t hashval; + xfs_dahash_t btreehashval; + int probe; + int span; + int max; + int error; + int retval; =20 args =3D state->args; =20 @@ -1160,7 +1446,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *re= sult) * Read the next node down in the tree. */ blk->blkno =3D blkno; - error =3D xfs_da_node_read(args->trans, args->dp, blkno, + error =3D xfs_da3_node_read(args->trans, args->dp, blkno, -1, &blk->bp, args->whichfork); if (error) { blk->blkno =3D 0; @@ -1169,66 +1455,73 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *= result) } curr =3D blk->bp->b_addr; blk->magic =3D be16_to_cpu(curr->magic); - ASSERT(blk->magic =3D=3D XFS_DA_NODE_MAGIC || - blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC || - blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); + + if (blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC) { + blk->hashval =3D xfs_attr_leaf_lasthash(blk->bp, NULL); + break; + } + + if (blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC || + blk->magic =3D=3D XFS_DIR3_LEAFN_MAGIC) { + blk->magic =3D XFS_DIR2_LEAFN_MAGIC; + blk->hashval =3D xfs_dir2_leafn_lasthash(blk->bp, NULL); + break; + } + + blk->magic =3D XFS_DA_NODE_MAGIC; + =20 /* * Search an intermediate node for a match. */ - if (blk->magic =3D=3D XFS_DA_NODE_MAGIC) { - node =3D blk->bp->b_addr; - max =3D be16_to_cpu(node->hdr.count); - blk->hashval =3D be32_to_cpu(node->btree[max-1].hashval); + node =3D blk->bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree =3D xfs_da3_node_tree_p(node); =20 - /* - * Binary search. (note: small blocks will skip loop) - */ - probe =3D span =3D max / 2; - hashval =3D args->hashval; - for (btree =3D &node->btree[probe]; span > 4; - btree =3D &node->btree[probe]) { - span /=3D 2; - btreehashval =3D be32_to_cpu(btree->hashval); - if (btreehashval < hashval) - probe +=3D span; - else if (btreehashval > hashval) - probe -=3D span; - else - break; - } - ASSERT((probe >=3D 0) && (probe < max)); - ASSERT((span <=3D 4) || (be32_to_cpu(btree->hashval) =3D=3D hashval)); + max =3D nodehdr.count; + blk->hashval =3D be32_to_cpu(btree[max - 1].hashval); =20 - /* - * Since we may have duplicate hashval's, find the first - * matching hashval in the node. - */ - while ((probe > 0) && (be32_to_cpu(btree->hashval) >=3D hashval)) { - btree--; - probe--; - } - while ((probe < max) && (be32_to_cpu(btree->hashval) < hashval)) { - btree++; - probe++; - } + /* + * Binary search. (note: small blocks will skip loop) + */ + probe =3D span =3D max / 2; + hashval =3D args->hashval; + while (span > 4) { + span /=3D 2; + btreehashval =3D be32_to_cpu(btree[probe].hashval); + if (btreehashval < hashval) + probe +=3D span; + else if (btreehashval > hashval) + probe -=3D span; + else + break; + } + ASSERT((probe >=3D 0) && (probe < max)); + ASSERT((span <=3D 4) || + (be32_to_cpu(btree[probe].hashval) =3D=3D hashval)); =20 - /* - * Pick the right block to descend on. - */ - if (probe =3D=3D max) { - blk->index =3D max-1; - blkno =3D be32_to_cpu(node->btree[max-1].before); - } else { - blk->index =3D probe; - blkno =3D be32_to_cpu(btree->before); - } - } else if (blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC) { - blk->hashval =3D xfs_attr_leaf_lasthash(blk->bp, NULL); - break; - } else if (blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC) { - blk->hashval =3D xfs_dir2_leafn_lasthash(blk->bp, NULL); - break; + /* + * Since we may have duplicate hashval's, find the first + * matching hashval in the node. + */ + while (probe > 0 && + be32_to_cpu(btree[probe].hashval) >=3D hashval) { + probe--; + } + while (probe < max && + be32_to_cpu(btree[probe].hashval) < hashval) { + probe++; + } + + /* + * Pick the right block to descend on. + */ + if (probe =3D=3D max) { + blk->index =3D max - 1; + blkno =3D be32_to_cpu(btree[max - 1].before); + } else { + blk->index =3D probe; + blkno =3D be32_to_cpu(btree[probe].before); } } =20 @@ -1252,7 +1545,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *re= sult) } if (((retval =3D=3D ENOENT) || (retval =3D=3D ENOATTR)) && (blk->hashval =3D=3D args->hashval)) { - error =3D xfs_da_path_shift(state, &state->path, 1, 1, + error =3D xfs_da3_path_shift(state, &state->path, 1, 1, &retval); if (error) return(error); @@ -1274,16 +1567,52 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *= result) *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/ =20 /* + * Compare two intermediate nodes for "order". + */ +STATIC int +xfs_da3_node_order( + struct xfs_buf *node1_bp, + struct xfs_buf *node2_bp) +{ + struct xfs_da_intnode *node1; + struct xfs_da_intnode *node2; + struct xfs_da_node_entry *btree1; + struct xfs_da_node_entry *btree2; + struct xfs_da3_icnode_hdr node1hdr; + struct xfs_da3_icnode_hdr node2hdr; + + node1 =3D node1_bp->b_addr; + node2 =3D node2_bp->b_addr; + xfs_da3_node_hdr_from_disk(&node1hdr, node1); + xfs_da3_node_hdr_from_disk(&node2hdr, node2); + btree1 =3D xfs_da3_node_tree_p(node1); + btree2 =3D xfs_da3_node_tree_p(node2); + + if (node1hdr.count > 0 && node2hdr.count > 0 && + ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) || + (be32_to_cpu(btree2[node2hdr.count - 1].hashval) < + be32_to_cpu(btree1[node1hdr.count - 1].hashval)))) { + return 1; + } + return 0; +} + +/* * Link a new block into a doubly linked list of blocks (of whatever type). */ int /* error */ -xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, - xfs_da_state_blk_t *new_blk) +xfs_da3_blk_link( + struct xfs_da_state *state, + struct xfs_da_state_blk *old_blk, + struct xfs_da_state_blk *new_blk) { - xfs_da_blkinfo_t *old_info, *new_info, *tmp_info; - xfs_da_args_t *args; - int before=3D0, error; - struct xfs_buf *bp; + struct xfs_da_blkinfo *old_info; + struct xfs_da_blkinfo *new_info; + struct xfs_da_blkinfo *tmp_info; + struct xfs_da_args *args; + struct xfs_buf *bp; + int before =3D 0; + int error; =20 /* * Set up environment. @@ -1295,9 +1624,6 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_b= lk_t *old_blk, ASSERT(old_blk->magic =3D=3D XFS_DA_NODE_MAGIC || old_blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC || old_blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); - ASSERT(old_blk->magic =3D=3D be16_to_cpu(old_info->magic)); - ASSERT(new_blk->magic =3D=3D be16_to_cpu(new_info->magic)); - ASSERT(old_blk->magic =3D=3D new_blk->magic); =20 switch (old_blk->magic) { case XFS_ATTR_LEAF_MAGIC: @@ -1307,7 +1633,7 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_b= lk_t *old_blk, before =3D xfs_dir2_leafn_order(old_blk->bp, new_blk->bp); break; case XFS_DA_NODE_MAGIC: - before =3D xfs_da_node_order(old_blk->bp, new_blk->bp); + before =3D xfs_da3_node_order(old_blk->bp, new_blk->bp); break; } =20 @@ -1322,14 +1648,14 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state= _blk_t *old_blk, new_info->forw =3D cpu_to_be32(old_blk->blkno); new_info->back =3D old_info->back; if (old_info->back) { - error =3D xfs_da_node_read(args->trans, args->dp, + error =3D xfs_da3_node_read(args->trans, args->dp, be32_to_cpu(old_info->back), -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp !=3D NULL); tmp_info =3D bp->b_addr; - ASSERT(be16_to_cpu(tmp_info->magic) =3D=3D be16_to_cpu(old_info->magic)= ); + ASSERT(tmp_info->magic =3D=3D old_info->magic); ASSERT(be32_to_cpu(tmp_info->forw) =3D=3D old_blk->blkno); tmp_info->forw =3D cpu_to_be32(new_blk->blkno); xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1); @@ -1343,7 +1669,7 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_b= lk_t *old_blk, new_info->forw =3D old_info->forw; new_info->back =3D cpu_to_be32(old_blk->blkno); if (old_info->forw) { - error =3D xfs_da_node_read(args->trans, args->dp, + error =3D xfs_da3_node_read(args->trans, args->dp, be32_to_cpu(old_info->forw), -1, &bp, args->whichfork); if (error) @@ -1364,59 +1690,20 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state= _blk_t *old_blk, } =20 /* - * Compare two intermediate nodes for "order". - */ -STATIC int -xfs_da_node_order( - struct xfs_buf *node1_bp, - struct xfs_buf *node2_bp) -{ - xfs_da_intnode_t *node1, *node2; - - node1 =3D node1_bp->b_addr; - node2 =3D node2_bp->b_addr; - ASSERT(node1->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC) && - node2->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); - if ((be16_to_cpu(node1->hdr.count) > 0) && (be16_to_cpu(node2->hdr.count)= > 0) && - ((be32_to_cpu(node2->btree[0].hashval) < - be32_to_cpu(node1->btree[0].hashval)) || - (be32_to_cpu(node2->btree[be16_to_cpu(node2->hdr.count)-1].hashval) < - be32_to_cpu(node1->btree[be16_to_cpu(node1->hdr.count)-1].hashval))= )) { - return(1); - } - return(0); -} - -/* - * Pick up the last hashvalue from an intermediate node. - */ -STATIC uint -xfs_da_node_lasthash( - struct xfs_buf *bp, - int *count) -{ - xfs_da_intnode_t *node; - - node =3D bp->b_addr; - ASSERT(node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); - if (count) - *count =3D be16_to_cpu(node->hdr.count); - if (!node->hdr.count) - return(0); - return be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1].hashval); -} - -/* * Unlink a block from a doubly linked list of blocks. */ STATIC int /* error */ -xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, - xfs_da_state_blk_t *save_blk) +xfs_da3_blk_unlink( + struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk, + struct xfs_da_state_blk *save_blk) { - xfs_da_blkinfo_t *drop_info, *save_info, *tmp_info; - xfs_da_args_t *args; - struct xfs_buf *bp; - int error; + struct xfs_da_blkinfo *drop_info; + struct xfs_da_blkinfo *save_info; + struct xfs_da_blkinfo *tmp_info; + struct xfs_da_args *args; + struct xfs_buf *bp; + int error; =20 /* * Set up environment. @@ -1428,8 +1715,6 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state= _blk_t *drop_blk, ASSERT(save_blk->magic =3D=3D XFS_DA_NODE_MAGIC || save_blk->magic =3D=3D XFS_DIR2_LEAFN_MAGIC || save_blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); - ASSERT(save_blk->magic =3D=3D be16_to_cpu(save_info->magic)); - ASSERT(drop_blk->magic =3D=3D be16_to_cpu(drop_info->magic)); ASSERT(save_blk->magic =3D=3D drop_blk->magic); ASSERT((be32_to_cpu(save_info->forw) =3D=3D drop_blk->blkno) || (be32_to_cpu(save_info->back) =3D=3D drop_blk->blkno)); @@ -1443,7 +1728,7 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state= _blk_t *drop_blk, trace_xfs_da_unlink_back(args); save_info->back =3D drop_info->back; if (drop_info->back) { - error =3D xfs_da_node_read(args->trans, args->dp, + error =3D xfs_da3_node_read(args->trans, args->dp, be32_to_cpu(drop_info->back), -1, &bp, args->whichfork); if (error) @@ -1460,7 +1745,7 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state= _blk_t *drop_blk, trace_xfs_da_unlink_forward(args); save_info->forw =3D drop_info->forw; if (drop_info->forw) { - error =3D xfs_da_node_read(args->trans, args->dp, + error =3D xfs_da3_node_read(args->trans, args->dp, be32_to_cpu(drop_info->forw), -1, &bp, args->whichfork); if (error) @@ -1488,15 +1773,22 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_sta= te_blk_t *drop_blk, * the new bottom and the root. */ int /* error */ -xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, - int forward, int release, int *result) +xfs_da3_path_shift( + struct xfs_da_state *state, + struct xfs_da_state_path *path, + int forward, + int release, + int *result) { - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *info; - xfs_da_intnode_t *node; - xfs_da_args_t *args; - xfs_dablk_t blkno=3D0; - int level, error; + struct xfs_da_state_blk *blk; + struct xfs_da_blkinfo *info; + struct xfs_da_intnode *node; + struct xfs_da_args *args; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; + xfs_dablk_t blkno =3D 0; + int level; + int error; =20 trace_xfs_da_path_shift(state->args); =20 @@ -1511,16 +1803,17 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_sta= te_path_t *path, ASSERT((path->active > 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); level =3D (path->active-1) - 1; /* skip bottom layer in path */ for (blk =3D &path->blk[level]; level >=3D 0; blk--, level--) { - ASSERT(blk->bp !=3D NULL); node =3D blk->bp->b_addr; - ASSERT(node->hdr.info.magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); - if (forward && (blk->index < be16_to_cpu(node->hdr.count)-1)) { + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree =3D xfs_da3_node_tree_p(node); + + if (forward && (blk->index < nodehdr.count - 1)) { blk->index++; - blkno =3D be32_to_cpu(node->btree[blk->index].before); + blkno =3D be32_to_cpu(btree[blk->index].before); break; } else if (!forward && (blk->index > 0)) { blk->index--; - blkno =3D be32_to_cpu(node->btree[blk->index].before); + blkno =3D be32_to_cpu(btree[blk->index].before); break; } } @@ -1546,47 +1839,58 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_sta= te_path_t *path, * Read the next child block. */ blk->blkno =3D blkno; - error =3D xfs_da_node_read(args->trans, args->dp, blkno, -1, + error =3D xfs_da3_node_read(args->trans, args->dp, blkno, -1, &blk->bp, args->whichfork); if (error) return(error); - ASSERT(blk->bp !=3D NULL); info =3D blk->bp->b_addr; ASSERT(info->magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC) || + info->magic =3D=3D cpu_to_be16(XFS_DA3_NODE_MAGIC) || info->magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || info->magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || info->magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - blk->magic =3D be16_to_cpu(info->magic); - if (blk->magic =3D=3D XFS_DA_NODE_MAGIC) { + + + /* + * Note: we flatten the magic number to a single type so we + * don't have to compare against crc/non-crc types elsewhere. + */ + switch (be16_to_cpu(info->magic)) { + case XFS_DA_NODE_MAGIC: + case XFS_DA3_NODE_MAGIC: + blk->magic =3D XFS_DA_NODE_MAGIC; node =3D (xfs_da_intnode_t *)info; - blk->hashval =3D be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1= ].hashval); + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree =3D xfs_da3_node_tree_p(node); + blk->hashval =3D be32_to_cpu(btree[nodehdr.count - 1].hashval); if (forward) blk->index =3D 0; else - blk->index =3D be16_to_cpu(node->hdr.count)-1; - blkno =3D be32_to_cpu(node->btree[blk->index].before); - } else { + blk->index =3D nodehdr.count - 1; + blkno =3D be32_to_cpu(btree[blk->index].before); + break; + case XFS_ATTR_LEAF_MAGIC: + blk->magic =3D XFS_ATTR_LEAF_MAGIC; ASSERT(level =3D=3D path->active-1); blk->index =3D 0; - switch(blk->magic) { - case XFS_ATTR_LEAF_MAGIC: - blk->hashval =3D xfs_attr_leaf_lasthash(blk->bp, - NULL); - break; - case XFS_DIR2_LEAFN_MAGIC: - case XFS_DIR3_LEAFN_MAGIC: - blk->magic =3D XFS_DIR2_LEAFN_MAGIC; - blk->hashval =3D xfs_dir2_leafn_lasthash(blk->bp, - NULL); - break; - default: - ASSERT(0); - break; - } + blk->hashval =3D xfs_attr_leaf_lasthash(blk->bp, + NULL); + break; + case XFS_DIR2_LEAFN_MAGIC: + case XFS_DIR3_LEAFN_MAGIC: + blk->magic =3D XFS_DIR2_LEAFN_MAGIC; + ASSERT(level =3D=3D path->active-1); + blk->index =3D 0; + blk->hashval =3D xfs_dir2_leafn_lasthash(blk->bp, + NULL); + break; + default: + ASSERT(0); + break; } } *result =3D 0; - return(0); + return 0; } =20 =20 @@ -1773,22 +2077,36 @@ xfs_da_grow_inode( * a bmap btree split to do that. */ STATIC int -xfs_da_swap_lastblock( - xfs_da_args_t *args, - xfs_dablk_t *dead_blknop, - struct xfs_buf **dead_bufp) +xfs_da3_swap_lastblock( + struct xfs_da_args *args, + xfs_dablk_t *dead_blknop, + struct xfs_buf **dead_bufp) { - xfs_dablk_t dead_blkno, last_blkno, sib_blkno, par_blkno; - struct xfs_buf *dead_buf, *last_buf, *sib_buf, *par_buf; - xfs_fileoff_t lastoff; - xfs_inode_t *ip; - xfs_trans_t *tp; - xfs_mount_t *mp; - int error, w, entno, level, dead_level; - xfs_da_blkinfo_t *dead_info, *sib_info; - xfs_da_intnode_t *par_node, *dead_node; - xfs_dir2_leaf_t *dead_leaf2; - xfs_dahash_t dead_hash; + struct xfs_da_blkinfo *dead_info; + struct xfs_da_blkinfo *sib_info; + struct xfs_da_intnode *par_node; + struct xfs_da_intnode *dead_node; + struct xfs_dir2_leaf *dead_leaf2; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr par_hdr; + struct xfs_inode *ip; + struct xfs_trans *tp; + struct xfs_mount *mp; + struct xfs_buf *dead_buf; + struct xfs_buf *last_buf; + struct xfs_buf *sib_buf; + struct xfs_buf *par_buf; + xfs_dahash_t dead_hash; + xfs_fileoff_t lastoff; + xfs_dablk_t dead_blkno; + xfs_dablk_t last_blkno; + xfs_dablk_t sib_blkno; + xfs_dablk_t par_blkno; + int error; + int w; + int entno; + int level; + int dead_level; =20 trace_xfs_da_swap_lastblock(args); =20 @@ -1812,7 +2130,7 @@ xfs_da_swap_lastblock( * Read the last block in the btree space. */ last_blkno =3D (xfs_dablk_t)lastoff - mp->m_dirblkfsbs; - error =3D xfs_da_node_read(tp, ip, last_blkno, -1, &last_buf, w); + error =3D xfs_da3_node_read(tp, ip, last_blkno, -1, &last_buf, w); if (error) return error; /* @@ -1835,17 +2153,22 @@ xfs_da_swap_lastblock( dead_level =3D 0; dead_hash =3D be32_to_cpu(ents[leafhdr.count - 1].hashval); } else { - ASSERT(dead_info->magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC)); + struct xfs_da3_icnode_hdr deadhdr; + + ASSERT(dead_info->magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC) || + dead_info->magic =3D=3D cpu_to_be16(XFS_DA3_NODE_MAGIC)); dead_node =3D (xfs_da_intnode_t *)dead_info; - dead_level =3D be16_to_cpu(dead_node->hdr.level); - dead_hash =3D be32_to_cpu(dead_node->btree[be16_to_cpu(dead_node->hdr.co= unt) - 1].hashval); + xfs_da3_node_hdr_from_disk(&deadhdr, dead_node); + btree =3D xfs_da3_node_tree_p(dead_node); + dead_level =3D deadhdr.level; + dead_hash =3D be32_to_cpu(btree[deadhdr.count - 1].hashval); } sib_buf =3D par_buf =3D NULL; /* * If the moved block has a left sibling, fix up the pointers. */ if ((sib_blkno =3D be32_to_cpu(dead_info->back))) { - error =3D xfs_da_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); + error =3D xfs_da3_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); if (error) goto done; sib_info =3D sib_buf->b_addr; @@ -1867,7 +2190,7 @@ xfs_da_swap_lastblock( * If the moved block has a right sibling, fix up the pointers. */ if ((sib_blkno =3D be32_to_cpu(dead_info->forw))) { - error =3D xfs_da_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); + error =3D xfs_da3_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); if (error) goto done; sib_info =3D sib_buf->b_addr; @@ -1891,31 +2214,31 @@ xfs_da_swap_lastblock( * Walk down the tree looking for the parent of the moved block. */ for (;;) { - error =3D xfs_da_node_read(tp, ip, par_blkno, -1, &par_buf, w); + error =3D xfs_da3_node_read(tp, ip, par_blkno, -1, &par_buf, w); if (error) goto done; par_node =3D par_buf->b_addr; - if (unlikely(par_node->hdr.info.magic !=3D - cpu_to_be16(XFS_DA_NODE_MAGIC) || - (level >=3D 0 && level !=3D be16_to_cpu(par_node->hdr.level) + 1))) { + xfs_da3_node_hdr_from_disk(&par_hdr, par_node); + if (level >=3D 0 && level !=3D par_hdr.level + 1) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(4)", XFS_ERRLEVEL_LOW, mp); error =3D XFS_ERROR(EFSCORRUPTED); goto done; } - level =3D be16_to_cpu(par_node->hdr.level); + level =3D par_hdr.level; + btree =3D xfs_da3_node_tree_p(par_node); for (entno =3D 0; - entno < be16_to_cpu(par_node->hdr.count) && - be32_to_cpu(par_node->btree[entno].hashval) < dead_hash; + entno < par_hdr.count && + be32_to_cpu(btree[entno].hashval) < dead_hash; entno++) continue; - if (unlikely(entno =3D=3D be16_to_cpu(par_node->hdr.count))) { + if (entno =3D=3D par_hdr.count) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(5)", XFS_ERRLEVEL_LOW, mp); error =3D XFS_ERROR(EFSCORRUPTED); goto done; } - par_blkno =3D be32_to_cpu(par_node->btree[entno].before); + par_blkno =3D be32_to_cpu(btree[entno].before); if (level =3D=3D dead_level + 1) break; xfs_trans_brelse(tp, par_buf); @@ -1927,13 +2250,13 @@ xfs_da_swap_lastblock( */ for (;;) { for (; - entno < be16_to_cpu(par_node->hdr.count) && - be32_to_cpu(par_node->btree[entno].before) !=3D last_blkno; + entno < par_hdr.count && + be32_to_cpu(btree[entno].before) !=3D last_blkno; entno++) continue; - if (entno < be16_to_cpu(par_node->hdr.count)) + if (entno < par_hdr.count) break; - par_blkno =3D be32_to_cpu(par_node->hdr.info.forw); + par_blkno =3D par_hdr.forw; xfs_trans_brelse(tp, par_buf); par_buf =3D NULL; if (unlikely(par_blkno =3D=3D 0)) { @@ -1942,27 +2265,27 @@ xfs_da_swap_lastblock( error =3D XFS_ERROR(EFSCORRUPTED); goto done; } - error =3D xfs_da_node_read(tp, ip, par_blkno, -1, &par_buf, w); + error =3D xfs_da3_node_read(tp, ip, par_blkno, -1, &par_buf, w); if (error) goto done; par_node =3D par_buf->b_addr; - if (unlikely( - be16_to_cpu(par_node->hdr.level) !=3D level || - par_node->hdr.info.magic !=3D cpu_to_be16(XFS_DA_NODE_MAGIC))) { + xfs_da3_node_hdr_from_disk(&par_hdr, par_node); + if (par_hdr.level !=3D level) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(7)", XFS_ERRLEVEL_LOW, mp); error =3D XFS_ERROR(EFSCORRUPTED); goto done; } + btree =3D xfs_da3_node_tree_p(par_node); entno =3D 0; } /* * Update the parent entry pointing to the moved block. */ - par_node->btree[entno].before =3D cpu_to_be32(dead_blkno); + btree[entno].before =3D cpu_to_be32(dead_blkno); xfs_trans_log_buf(tp, par_buf, - XFS_DA_LOGRANGE(par_node, &par_node->btree[entno].before, - sizeof(par_node->btree[entno].before))); + XFS_DA_LOGRANGE(par_node, &btree[entno].before, + sizeof(btree[entno].before))); *dead_blknop =3D last_blkno; *dead_bufp =3D last_buf; return 0; @@ -2004,14 +2327,15 @@ xfs_da_shrink_inode( * Remove extents. If we get ENOSPC for a dir we have to move * the last block to the place we want to kill. */ - if ((error =3D xfs_bunmapi(tp, dp, dead_blkno, count, - xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, - 0, args->firstblock, args->flist, - &done)) =3D=3D ENOSPC) { + error =3D xfs_bunmapi(tp, dp, dead_blkno, count, + xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, + 0, args->firstblock, args->flist, &done); + if (error =3D=3D ENOSPC) { if (w !=3D XFS_DATA_FORK) break; - if ((error =3D xfs_da_swap_lastblock(args, &dead_blkno, - &dead_buf))) + error =3D xfs_da3_swap_lastblock(args, &dead_blkno, + &dead_buf); + if (error) break; } else { break; @@ -2276,6 +2600,7 @@ xfs_da_read_buf( magic1 =3D be32_to_cpu(hdr->magic); if (unlikely( XFS_TEST_ERROR((magic !=3D XFS_DA_NODE_MAGIC) && + (magic !=3D XFS_DA3_NODE_MAGIC) && (magic !=3D XFS_ATTR_LEAF_MAGIC) && (magic !=3D XFS_DIR2_LEAF1_MAGIC) && (magic !=3D XFS_DIR3_LEAF1_MAGIC) && @@ -2346,41 +2671,3 @@ out_free: return -1; return mappedbno; } - -kmem_zone_t *xfs_da_state_zone; /* anchor for state struct zone */ - -/* - * Allocate a dir-state structure. - * We don't put them on the stack since they're large. - */ -xfs_da_state_t * -xfs_da_state_alloc(void) -{ - return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS); -} - -/* - * Kill the altpath contents of a da-state structure. - */ -STATIC void -xfs_da_state_kill_altpath(xfs_da_state_t *state) -{ - int i; - - for (i =3D 0; i < state->altpath.active; i++) - state->altpath.blk[i].bp =3D NULL; - state->altpath.active =3D 0; -} - -/* - * Free a da-state structure. - */ -void -xfs_da_state_free(xfs_da_state_t *state) -{ - xfs_da_state_kill_altpath(state); -#ifdef DEBUG - memset((char *)state, 0, sizeof(*state)); -#endif /* DEBUG */ - kmem_zone_free(xfs_da_state_zone, state); -} diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index edf6e03..c1c50ad 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -1348,7 +1348,7 @@ xfs_dir2_leafn_split( * block into the leaves. */ xfs_dir2_leafn_rebalance(state, oldblk, newblk); - error =3D xfs_da_blk_link(state, oldblk, newblk); + error =3D xfs_da3_blk_link(state, oldblk, newblk); if (error) { return error; } @@ -1430,7 +1430,7 @@ xfs_dir2_leafn_toosmall( */ forward =3D (leafhdr.forw !=3D 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); - error =3D xfs_da_path_shift(state, &state->altpath, forward, 0, + error =3D xfs_da3_path_shift(state, &state->altpath, forward, 0, &rval); if (error) return error; @@ -1492,10 +1492,10 @@ xfs_dir2_leafn_toosmall( */ memcpy(&state->altpath, &state->path, sizeof(state->path)); if (blkno < blk->blkno) - error =3D xfs_da_path_shift(state, &state->altpath, forward, 0, + error =3D xfs_da3_path_shift(state, &state->altpath, forward, 0, &rval); else - error =3D xfs_da_path_shift(state, &state->path, forward, 0, + error =3D xfs_da3_path_shift(state, &state->path, forward, 0, &rval); if (error) { return error; @@ -1591,7 +1591,7 @@ xfs_dir2_node_addname( * Look up the name. We're not supposed to find it, but * this gives us the insertion point. */ - error =3D xfs_da_node_lookup_int(state, &rval); + error =3D xfs_da3_node_lookup_int(state, &rval); if (error) rval =3D error; if (rval !=3D ENOENT) { @@ -1617,7 +1617,7 @@ xfs_dir2_node_addname( * It worked, fix the hash values up the btree. */ if (!(args->op_flags & XFS_DA_OP_JUSTCHECK)) - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); } else { /* * It didn't work, we need to split the leaf block. @@ -1629,7 +1629,7 @@ xfs_dir2_node_addname( /* * Split the leaf block and insert the new entry. */ - rval =3D xfs_da_split(state); + rval =3D xfs_da3_split(state); } done: xfs_da_state_free(state); @@ -2007,7 +2007,7 @@ xfs_dir2_node_addname_int( =20 /* * Lookup an entry in a node-format directory. - * All the real work happens in xfs_da_node_lookup_int. + * All the real work happens in xfs_da3_node_lookup_int. * The only real output is the inode number of the entry. */ int /* error */ @@ -2032,7 +2032,7 @@ xfs_dir2_node_lookup( /* * Fill in the path to the entry in the cursor. */ - error =3D xfs_da_node_lookup_int(state, &rval); + error =3D xfs_da3_node_lookup_int(state, &rval); if (error) rval =3D error; else if (rval =3D=3D ENOENT && args->cmpresult =3D=3D XFS_CMP_CASE) { @@ -2087,7 +2087,7 @@ xfs_dir2_node_removename( /* * Look up the entry we're deleting, set up the cursor. */ - error =3D xfs_da_node_lookup_int(state, &rval); + error =3D xfs_da3_node_lookup_int(state, &rval); if (error) rval =3D error; /* @@ -2111,12 +2111,12 @@ xfs_dir2_node_removename( /* * Fix the hash values up the btree. */ - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); /* * If we need to join leaf blocks, do it. */ if (rval && state->path.active > 1) - error =3D xfs_da_join(state); + error =3D xfs_da3_join(state); /* * If no errors so far, try conversion to leaf format. */ @@ -2158,7 +2158,7 @@ xfs_dir2_node_replace( /* * Lookup the entry to change in the btree. */ - error =3D xfs_da_node_lookup_int(state, &rval); + error =3D xfs_da3_node_lookup_int(state, &rval); if (error) { rval =3D error; } diff --git a/repair/dir.c b/repair/dir.c index daca17d..cb04267 100644 --- a/repair/dir.c +++ b/repair/dir.c @@ -740,6 +740,8 @@ traverse_int_dablock(xfs_mount_t *mp, xfs_da_intnode_t *node; xfs_dfsbno_t fsbno; xfs_buf_t *bp; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; =20 /* * traverse down left-side of tree until we hit the @@ -775,20 +777,21 @@ traverse_int_dablock(xfs_mount_t *mp, } =20 node =3D (xfs_da_intnode_t *)XFS_BUF_PTR(bp); + btree =3D xfs_da3_node_tree_p(node); + xfs_da3_node_hdr_from_disk(&nodehdr, node); =20 - if (be16_to_cpu(node->hdr.info.magic) !=3D XFS_DA_NODE_MAGIC) { + if (nodehdr.magic !=3D XFS_DA_NODE_MAGIC) { do_warn(_("bad dir/attr magic number in inode %" PRIu64 ", " "file bno =3D %u, fsbno =3D %" PRIu64 "\n"), da_cursor->ino, bno, fsbno); libxfs_putbuf(bp); goto error_out; } - if (be16_to_cpu(node->hdr.count) > - mp->m_dir_node_ents) { + if (nodehdr.count > mp->m_dir_node_ents) { do_warn(_("bad record count in inode %" PRIu64 ", " "count =3D %d, max =3D %d\n"), da_cursor->ino, - be16_to_cpu(node->hdr.count), + nodehdr.count, mp->m_dir_node_ents); libxfs_putbuf(bp); goto error_out; @@ -798,9 +801,9 @@ traverse_int_dablock(xfs_mount_t *mp, * maintain level counter */ if (i =3D=3D -1) - i =3D da_cursor->active =3D be16_to_cpu(node->hdr.level); + i =3D da_cursor->active =3D nodehdr.level; else { - if (be16_to_cpu(node->hdr.level) =3D=3D i - 1) { + if (nodehdr.level =3D=3D i - 1) { i--; } else { if (whichfork =3D=3D XFS_DATA_FORK) @@ -816,8 +819,7 @@ traverse_int_dablock(xfs_mount_t *mp, } } =20 - da_cursor->level[i].hashval =3D be32_to_cpu( - node->btree[0].hashval); + da_cursor->level[i].hashval =3D be32_to_cpu(btree[0].hashval); da_cursor->level[i].bp =3D bp; da_cursor->level[i].bno =3D bno; da_cursor->level[i].index =3D 0; @@ -828,7 +830,7 @@ traverse_int_dablock(xfs_mount_t *mp, /* * set up new bno for next level down */ - bno =3D be32_to_cpu(node->btree[0].before); + bno =3D be32_to_cpu(btree[0].before); } while (node !=3D NULL && i > 1); =20 /* @@ -912,6 +914,8 @@ verify_final_da_path(xfs_mount_t *mp, int bad =3D 0; int entry; int this_level =3D p_level + 1; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; =20 #ifdef XR_DIR_TRACE fprintf(stderr, "in verify_final_da_path, this_level =3D %d\n", @@ -923,32 +927,34 @@ verify_final_da_path(xfs_mount_t *mp, */ entry =3D cursor->level[this_level].index; node =3D (xfs_da_intnode_t *)XFS_BUF_PTR(cursor->level[this_level].bp); + btree =3D xfs_da3_node_tree_p(node); + xfs_da3_node_hdr_from_disk(&nodehdr, node); /* * check internal block consistency on this level -- ensure * that all entries are used, encountered and expected hashvals * match, etc. */ - if (entry !=3D be16_to_cpu(node->hdr.count) - 1) { + if (entry !=3D nodehdr.count - 1) { do_warn(_("directory/attribute block used/count " "inconsistency - %d/%hu\n"), - entry, be16_to_cpu(node->hdr.count)); + entry, nodehdr.count); bad++; } /* * hash values monotonically increasing ??? */ if (cursor->level[this_level].hashval >=3D=20 - be32_to_cpu(node->btree[entry].hashval)) { + be32_to_cpu(btree[entry].hashval)) { do_warn(_("directory/attribute block hashvalue inconsistency, " "expected > %u / saw %u\n"), cursor->level[this_level].hashval, - be32_to_cpu(node->btree[entry].hashval)); + be32_to_cpu(btree[entry].hashval)); bad++; } - if (be32_to_cpu(node->hdr.info.forw) !=3D 0) { + if (nodehdr.forw !=3D 0) { do_warn(_("bad directory/attribute forward block pointer, " "expected 0, saw %u\n"), - be32_to_cpu(node->hdr.info.forw)); + nodehdr.forw); bad++; } if (bad) { @@ -966,12 +972,11 @@ verify_final_da_path(xfs_mount_t *mp, /* * ok, now check descendant block number against this level */ - if (cursor->level[p_level].bno !=3D be32_to_cpu( - node->btree[entry].before)) { + if (cursor->level[p_level].bno !=3D be32_to_cpu( btree[entry].before)) { #ifdef XR_DIR_TRACE fprintf(stderr, "bad directory btree pointer, child bno should " "be %d, block bno is %d, hashval is %u\n", - be16_to_cpu(node->btree[entry].before), + be16_to_cpu(btree[entry].before), cursor->level[p_level].bno, cursor->level[p_level].hashval); fprintf(stderr, "verify_final_da_path returns 1 (bad) #1a\n"); @@ -979,14 +984,13 @@ verify_final_da_path(xfs_mount_t *mp, return(1); } =20 - if (cursor->level[p_level].hashval !=3D be32_to_cpu( - node->btree[entry].hashval)) { + if (cursor->level[p_level].hashval !=3D be32_to_cpu(btree[entry].hashval)= ) { if (!no_modify) { do_warn(_("correcting bad hashval in non-leaf " "dir/attr block\n\tin (level %d) in " "inode %" PRIu64 ".\n"), this_level, cursor->ino); - node->btree[entry].hashval =3D cpu_to_be32( + btree[entry].hashval =3D cpu_to_be32( cursor->level[p_level].hashval); cursor->level[this_level].dirty++; } else { @@ -1001,7 +1005,7 @@ verify_final_da_path(xfs_mount_t *mp, * Note: squirrel hashval away _before_ releasing the * buffer, preventing a use-after-free problem. */ - hashval =3D be32_to_cpu(node->btree[entry].hashval); + hashval =3D be32_to_cpu(btree[entry].hashval); =20 /* * release/write buffer @@ -1085,6 +1089,8 @@ verify_da_path(xfs_mount_t *mp, int bad; int entry; int this_level =3D p_level + 1; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; =20 /* * index is currently set to point to the entry that @@ -1092,20 +1098,22 @@ verify_da_path(xfs_mount_t *mp, */ entry =3D cursor->level[this_level].index; node =3D (xfs_da_intnode_t *)XFS_BUF_PTR(cursor->level[this_level].bp); + btree =3D xfs_da3_node_tree_p(node); + xfs_da3_node_hdr_from_disk(&nodehdr, node); =20 /* * if this block is out of entries, validate this * block and move on to the next block. * and update cursor value for said level */ - if (entry >=3D be16_to_cpu(node->hdr.count)) { + if (entry >=3D nodehdr.count) { /* * update the hash value for this level before * validating it. bno value should be ok since * it was set when the block was first read in. */ cursor->level[this_level].hashval =3D - be32_to_cpu(node->btree[entry - 1].hashval); + be32_to_cpu(btree[entry - 1].hashval); =20 /* * keep track of greatest block # -- that gets @@ -1123,7 +1131,7 @@ verify_da_path(xfs_mount_t *mp, /* * ok, now get the next buffer and check sibling pointers */ - dabno =3D be32_to_cpu(node->hdr.info.forw); + dabno =3D nodehdr.forw; ASSERT(dabno !=3D 0); fsbno =3D blkmap_get(cursor->blkmap, dabno); =20 @@ -1144,36 +1152,38 @@ verify_da_path(xfs_mount_t *mp, } =20 newnode =3D (xfs_da_intnode_t *)XFS_BUF_PTR(bp); + btree =3D xfs_da3_node_tree_p(node); + xfs_da3_node_hdr_from_disk(&nodehdr, newnode); + /* * verify magic number and back pointer, sanity-check * entry count, verify level */ bad =3D 0; - if (XFS_DA_NODE_MAGIC !=3D be16_to_cpu(newnode->hdr.info.magic)) { + if (XFS_DA_NODE_MAGIC !=3D nodehdr.magic) { do_warn( _("bad magic number %x in block %u (%" PRIu64 ") for directory inode %" P= RIu64 "\n"), - be16_to_cpu(newnode->hdr.info.magic), + nodehdr.magic, dabno, fsbno, cursor->ino); bad++; } - if (be32_to_cpu(newnode->hdr.info.back) !=3D=20 - cursor->level[this_level].bno) { + if (nodehdr.back !=3D cursor->level[this_level].bno) { do_warn( _("bad back pointer in block %u (%"PRIu64 ") for directory inode %" PRIu6= 4 "\n"), dabno, fsbno, cursor->ino); bad++; } - if (be16_to_cpu(newnode->hdr.count) > mp->m_dir_node_ents) { + if (nodehdr.count > mp->m_dir_node_ents) { do_warn( _("entry count %d too large in block %u (%" PRIu64 ") for directory inode= %" PRIu64 "\n"), - be16_to_cpu(newnode->hdr.count), + nodehdr.count, dabno, fsbno, cursor->ino); bad++; } - if (be16_to_cpu(newnode->hdr.level) !=3D this_level) { + if (nodehdr.level !=3D this_level) { do_warn( _("bad level %d in block %u (%" PRIu64 ") for directory inode %" PRIu64 "= \n"), - be16_to_cpu(newnode->hdr.level), + nodehdr.level, dabno, fsbno, cursor->ino); bad++; } @@ -1199,7 +1209,7 @@ verify_da_path(xfs_mount_t *mp, cursor->level[this_level].dirty =3D 0; cursor->level[this_level].bno =3D dabno; cursor->level[this_level].hashval =3D - be32_to_cpu(newnode->btree[0].hashval); + be32_to_cpu(btree[0].hashval); #ifdef XR_DIR_TRACE cursor->level[this_level].n =3D newnode; #endif @@ -1210,12 +1220,11 @@ verify_da_path(xfs_mount_t *mp, /* * ditto for block numbers */ - if (cursor->level[p_level].bno !=3D - be32_to_cpu(node->btree[entry].before)) { + if (cursor->level[p_level].bno !=3D be32_to_cpu(btree[entry].before)) { #ifdef XR_DIR_TRACE fprintf(stderr, "bad directory btree pointer, child bno " "should be %d, block bno is %d, hashval is %u\n", - be32_to_cpu(node->btree[entry].before), + be32_to_cpu(btree[entry].before), cursor->level[p_level].bno, cursor->level[p_level].hashval); fprintf(stderr, "verify_da_path returns 1 (bad) #1a\n"); @@ -1227,13 +1236,13 @@ verify_da_path(xfs_mount_t *mp, * block against the hashval in the current entry */ if (cursor->level[p_level].hashval !=3D - be32_to_cpu(node->btree[entry].hashval)) { + be32_to_cpu(btree[entry].hashval)) { if (!no_modify) { do_warn(_("correcting bad hashval in interior " "dir/attr block\n\tin (level %d) in " "inode %" PRIu64 ".\n"), this_level, cursor->ino); - node->btree[entry].hashval =3D cpu_to_be32( + btree[entry].hashval =3D cpu_to_be32( cursor->level[p_level].hashval); cursor->level[this_level].dirty++; } else { diff --git a/repair/dir2.c b/repair/dir2.c index de5e737..b774897 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -127,9 +127,10 @@ traverse_int_dir2block(xfs_mount_t *mp, struct xfs_buf *bp; int i; int nex; - xfs_da_blkinfo_t *info; xfs_da_intnode_t *node; bmap_ext_t lbmp; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; =20 /* * traverse down left-side of tree until we hit the @@ -138,7 +139,7 @@ traverse_int_dir2block(xfs_mount_t *mp, */ bno =3D mp->m_dirleafblk; i =3D -1; - info =3D NULL; + node =3D NULL; da_cursor->active =3D 0; =20 do { @@ -161,9 +162,10 @@ _("can't read block %u for directory inode %" PRIu64 "= \n"), goto error_out; } =20 - info =3D bp->b_addr; + node =3D bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr, node); =20 - if (be16_to_cpu(info->magic) =3D=3D XFS_DIR2_LEAFN_MAGIC) { + if (nodehdr.magic =3D=3D XFS_DIR2_LEAFN_MAGIC) { if ( i !=3D -1 ) { do_warn( _("found non-root LEAFN node in inode %" PRIu64 " bno =3D %u\n"), @@ -172,20 +174,21 @@ _("found non-root LEAFN node in inode %" PRIu64 " bno= =3D %u\n"), *rbno =3D 0; libxfs_putbuf(bp); return(1); - } else if (be16_to_cpu(info->magic) !=3D XFS_DA_NODE_MAGIC) { + } else if (nodehdr.magic !=3D XFS_DA_NODE_MAGIC) { libxfs_putbuf(bp); do_warn( _("bad dir magic number 0x%x in inode %" PRIu64 " bno =3D %u\n"), - be16_to_cpu(info->magic), + nodehdr.magic, da_cursor->ino, bno); goto error_out; } - node =3D (xfs_da_intnode_t*)info; - if (be16_to_cpu(node->hdr.count) > mp->m_dir_node_ents) { + btree =3D xfs_da3_node_tree_p(node); + if (nodehdr.count > mp->m_dir_node_ents) { libxfs_putbuf(bp); do_warn( -_("bad record count in inode %" PRIu64 ", count =3D %d, max =3D %d\n"), da= _cursor->ino, - be16_to_cpu(node->hdr.count), +_("bad record count in inode %" PRIu64 ", count =3D %d, max =3D %d\n"), + da_cursor->ino, + nodehdr.count, mp->m_dir_node_ents); goto error_out; } @@ -193,7 +196,7 @@ _("bad record count in inode %" PRIu64 ", count =3D %d,= max =3D %d\n"), da_cursor->i * maintain level counter */ if (i =3D=3D -1) { - i =3D da_cursor->active =3D be16_to_cpu(node->hdr.level); + i =3D da_cursor->active =3D nodehdr.level; if (i >=3D XFS_DA_NODE_MAXDEPTH) { do_warn( _("bad header depth for directory inode %" PRIu64 "\n"), @@ -203,7 +206,7 @@ _("bad header depth for directory inode %" PRIu64 "\n"), goto error_out; } } else { - if (be16_to_cpu(node->hdr.level) =3D=3D i - 1) { + if (nodehdr.level =3D=3D i - 1) { i--; } else { do_warn( @@ -214,8 +217,7 @@ _("bad directory btree for directory inode %" PRIu64 "\= n"), } } =20 - da_cursor->level[i].hashval =3D - be32_to_cpu(node->btree[0].hashval); + da_cursor->level[i].hashval =3D be32_to_cpu(btree[0].hashval); da_cursor->level[i].bp =3D bp; da_cursor->level[i].bno =3D bno; da_cursor->level[i].index =3D 0; @@ -223,8 +225,8 @@ _("bad directory btree for directory inode %" PRIu64 "\= n"), /* * set up new bno for next level down */ - bno =3D be32_to_cpu(node->btree[0].before); - } while (info !=3D NULL && i > 1); + bno =3D be32_to_cpu(btree[0].before); + } while (node !=3D NULL && i > 1); =20 /* * now return block number and get out @@ -306,6 +308,8 @@ verify_final_dir2_path(xfs_mount_t *mp, int bad =3D 0; int entry; int this_level =3D p_level + 1; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; =20 /* * the index should point to the next "unprocessed" entry @@ -313,32 +317,34 @@ verify_final_dir2_path(xfs_mount_t *mp, */ entry =3D cursor->level[this_level].index; node =3D (xfs_da_intnode_t *)(cursor->level[this_level].bp->b_addr); + btree =3D xfs_da3_node_tree_p(node); + xfs_da3_node_hdr_from_disk(&nodehdr, node); /* * check internal block consistency on this level -- ensure * that all entries are used, encountered and expected hashvals * match, etc. */ - if (entry !=3D be16_to_cpu(node->hdr.count) - 1) { + if (entry !=3D nodehdr.count - 1) { do_warn( _("directory block used/count inconsistency - %d / %hu\n"), - entry, be16_to_cpu(node->hdr.count)); + entry, nodehdr.count); bad++; } /* * hash values monotonically increasing ??? */ if (cursor->level[this_level].hashval >=3D - be32_to_cpu(node->btree[entry].hashval)) { + be32_to_cpu(btree[entry].hashval)) { do_warn(_("directory/attribute block hashvalue inconsistency, " "expected > %u / saw %u\n"), cursor->level[this_level].hashval, - be32_to_cpu(node->btree[entry].hashval)); + be32_to_cpu(btree[entry].hashval)); bad++; } - if (be32_to_cpu(node->hdr.info.forw) !=3D 0) { + if (nodehdr.forw !=3D 0) { do_warn(_("bad directory/attribute forward block pointer, " "expected 0, saw %u\n"), - be32_to_cpu(node->hdr.info.forw)); + nodehdr.forw); bad++; } if (bad) { @@ -355,18 +361,17 @@ verify_final_dir2_path(xfs_mount_t *mp, /* * ok, now check descendant block number against this level */ - if (cursor->level[p_level].bno !=3D - be32_to_cpu(node->btree[entry].before)) + if (cursor->level[p_level].bno !=3D be32_to_cpu(btree[entry].before)) return(1); =20 if (cursor->level[p_level].hashval !=3D - be32_to_cpu(node->btree[entry].hashval)) { + be32_to_cpu(btree[entry].hashval)) { if (!no_modify) { do_warn( _("correcting bad hashval in non-leaf dir block\n" "\tin (level %d) in inode %" PRIu64 ".\n"), this_level, cursor->ino); - node->btree[entry].hashval =3D cpu_to_be32( + btree[entry].hashval =3D cpu_to_be32( cursor->level[p_level].hashval); cursor->level[this_level].dirty++; } else { @@ -399,8 +404,7 @@ _("would correct bad hashval in non-leaf dir block\n" * set hashvalue to correctl reflect the now-validated * last entry in this block and continue upwards validation */ - cursor->level[this_level].hashval =3D - be32_to_cpu(node->btree[entry].hashval); + cursor->level[this_level].hashval =3D be32_to_cpu(btree[entry].hashval); =20 return(verify_final_dir2_path(mp, cursor, this_level)); } @@ -459,6 +463,8 @@ verify_dir2_path(xfs_mount_t *mp, bmap_ext_t *bmp; int nex; bmap_ext_t lbmp; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; =20 /* * index is currently set to point to the entry that @@ -466,20 +472,22 @@ verify_dir2_path(xfs_mount_t *mp, */ entry =3D cursor->level[this_level].index; node =3D cursor->level[this_level].bp->b_addr; + btree =3D xfs_da3_node_tree_p(node); + xfs_da3_node_hdr_from_disk(&nodehdr, node); =20 /* * if this block is out of entries, validate this * block and move on to the next block. * and update cursor value for said level */ - if (entry >=3D be16_to_cpu(node->hdr.count)) { + if (entry >=3D nodehdr.count) { /* * update the hash value for this level before * validating it. bno value should be ok since * it was set when the block was first read in. */ cursor->level[this_level].hashval =3D - be32_to_cpu(node->btree[entry - 1].hashval); + be32_to_cpu(btree[entry - 1].hashval); =20 /* * keep track of greatest block # -- that gets @@ -497,7 +505,7 @@ verify_dir2_path(xfs_mount_t *mp, /* * ok, now get the next buffer and check sibling pointers */ - dabno =3D be32_to_cpu(node->hdr.info.forw); + dabno =3D nodehdr.forw; ASSERT(dabno !=3D 0); nex =3D blkmap_getn(cursor->blkmap, dabno, mp->m_dirblkfsbs, &bmp, &lbmp); @@ -520,36 +528,37 @@ _("can't read block %u for directory inode %" PRIu64 = "\n"), } =20 newnode =3D bp->b_addr; + btree =3D xfs_da3_node_tree_p(newnode); + xfs_da3_node_hdr_from_disk(&nodehdr, node); /* * verify magic number and back pointer, sanity-check * entry count, verify level */ bad =3D 0; - if (XFS_DA_NODE_MAGIC !=3D be16_to_cpu(newnode->hdr.info.magic)) { + if (XFS_DA_NODE_MAGIC !=3D nodehdr.magic) { do_warn( _("bad magic number %x in block %u for directory inode %" PRIu64 "\n"), - be16_to_cpu(newnode->hdr.info.magic), + nodehdr.magic, dabno, cursor->ino); bad++; } - if (be32_to_cpu(newnode->hdr.info.back) !=3D - cursor->level[this_level].bno) { + if (nodehdr.back !=3D cursor->level[this_level].bno) { do_warn( _("bad back pointer in block %u for directory inode %" PRIu64 "\n"), dabno, cursor->ino); bad++; } - if (be16_to_cpu(newnode->hdr.count) > mp->m_dir_node_ents) { + if (nodehdr.count > mp->m_dir_node_ents) { do_warn( _("entry count %d too large in block %u for directory inode %" PRIu64 "\n"= ), - be16_to_cpu(newnode->hdr.count), + nodehdr.count, dabno, cursor->ino); bad++; } - if (be16_to_cpu(newnode->hdr.level) !=3D this_level) { + if (nodehdr.level !=3D this_level) { do_warn( _("bad level %d in block %u for directory inode %" PRIu64 "\n"), - be16_to_cpu(newnode->hdr.level), + nodehdr.level, dabno, cursor->ino); bad++; } @@ -572,7 +581,7 @@ _("bad level %d in block %u for directory inode %" PRIu= 64 "\n"), cursor->level[this_level].dirty =3D 0; cursor->level[this_level].bno =3D dabno; cursor->level[this_level].hashval =3D - be32_to_cpu(newnode->btree[0].hashval); + be32_to_cpu(btree[0].hashval); node =3D newnode; =20 entry =3D cursor->level[this_level].index =3D 0; @@ -580,21 +589,20 @@ _("bad level %d in block %u for directory inode %" PR= Iu64 "\n"), /* * ditto for block numbers */ - if (cursor->level[p_level].bno !=3D - be32_to_cpu(node->btree[entry].before)) + if (cursor->level[p_level].bno !=3D be32_to_cpu(btree[entry].before)) return(1); /* * ok, now validate last hashvalue in the descendant * block against the hashval in the current entry */ if (cursor->level[p_level].hashval !=3D - be32_to_cpu(node->btree[entry].hashval)) { + be32_to_cpu(btree[entry].hashval)) { if (!no_modify) { do_warn( _("correcting bad hashval in interior dir block\n" "\tin (level %d) in inode %" PRIu64 ".\n"), this_level, cursor->ino); - node->btree[entry].hashval =3D cpu_to_be32( + btree[entry].hashval =3D cpu_to_be32( cursor->level[p_level].hashval); cursor->level[this_level].dirty++; } else { diff --git a/repair/phase6.c b/repair/phase6.c index e3d0934..090e400 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -1199,6 +1199,7 @@ map_first_dblock_fsbno(xfs_mount_t *mp, int i; int error; char *ftype; + struct xfs_da_node_entry *btree; =20 /* * traverse down left-side of tree until we hit the @@ -1265,6 +1266,7 @@ _("can't map block %d in %s inode %" PRIu64 ", xfs_bm= api returns %d, nmap =3D %d\n } =20 node =3D (xfs_da_intnode_t *)XFS_BUF_PTR(bp); + btree =3D xfs_da3_node_tree_p(node); =20 if (be16_to_cpu(node->hdr.info.magic) !=3D XFS_DA_NODE_MAGIC) { libxfs_putbuf(bp); @@ -1275,9 +1277,9 @@ _("bad dir/attr magic number in inode %" PRIu64 ", fi= le bno =3D %u, fsbno =3D %" PRI } =20 if (i =3D=3D -1) - i =3D be16_to_cpu(node->hdr.level); + i =3D be16_to_cpu(node->hdr.__level); =20 - da_bno =3D be32_to_cpu(node->btree[0].before); + da_bno =3D be32_to_cpu(btree[0].before); =20 libxfs_putbuf(bp); bp =3D NULL; =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-crc-pa= tchset-v2/xfs-add-crc-to-attr-leaf=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001750=00000003= 30714=0012132011546=00020562=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00xfs: add CRCs to attr leaf blocks =46rom: Dave Chinner Signed-off-by: Dave Chinner --- db/attr.c | 16 +- db/dir.c | 4 +- db/dir2.c | 2 +- db/metadump.c | 4 +- include/xfs_attr_leaf.h | 122 +++- include/xfs_da_btree.h | 5 +- libxfs/xfs_attr.c | 66 +- libxfs/xfs_attr_leaf.c | 1529 +++++++++++++++++++++++++++----------------= ---- libxfs/xfs_da_btree.c | 34 +- repair/attr_repair.c | 4 +- 10 files changed, 1034 insertions(+), 752 deletions(-) diff --git a/db/attr.c b/db/attr.c index a5087b8..05049ba 100644 --- a/db/attr.c +++ b/db/attr.c @@ -143,7 +143,7 @@ const field_t attr_node_entry_flds[] =3D { #define HOFF(f) bitize(offsetof(xfs_da_node_hdr_t, f)) const field_t attr_node_hdr_flds[] =3D { { "info", FLDT_ATTR_BLKINFO, OI(HOFF(info)), C1, 0, TYP_NONE }, - { "count", FLDT_UINT16D, OI(HOFF(count)), C1, 0, TYP_NONE }, + { "count", FLDT_UINT16D, OI(HOFF(__count)), C1, 0, TYP_NONE }, { "level", FLDT_UINT16D, OI(HOFF(__level)), C1, 0, TYP_NONE }, { NULL } }; @@ -219,7 +219,7 @@ attr_leaf_name_local_name_count( e =3D &block->entries[i]; if (be16_to_cpu(e->nameidx) =3D=3D off) { if (e->flags & XFS_ATTR_LOCAL) { - l =3D xfs_attr_leaf_name_local(block, i); + l =3D xfs_attr3_leaf_name_local(block, i); return l->namelen; } else return 0; @@ -248,7 +248,7 @@ attr_leaf_name_local_value_count( e =3D &block->entries[i]; if (be16_to_cpu(e->nameidx) =3D=3D off) { if (e->flags & XFS_ATTR_LOCAL) { - l =3D xfs_attr_leaf_name_local(block, i); + l =3D xfs_attr3_leaf_name_local(block, i); return be16_to_cpu(l->valuelen); } else return 0; @@ -285,7 +285,7 @@ attr_leaf_name_local_value_offset( if (i >=3D be16_to_cpu(block->hdr.count))=20 return 0; =20 - l =3D xfs_attr_leaf_name_local(block, i); + l =3D xfs_attr3_leaf_name_local(block, i); vp =3D (char *)&l->nameval[l->namelen]; return (int)bitize(vp - (char *)l); } @@ -333,7 +333,7 @@ attr_leaf_name_remote_name_count( e =3D &block->entries[i]; if (be16_to_cpu(e->nameidx) =3D=3D off) { if (!(e->flags & XFS_ATTR_LOCAL)) { - r =3D xfs_attr_leaf_name_remote(block, i); + r =3D xfs_attr3_leaf_name_remote(block, i); return r->namelen; } else return 0; @@ -360,11 +360,11 @@ attr_leaf_name_size( return 0; e =3D &block->entries[idx]; if (e->flags & XFS_ATTR_LOCAL) { - l =3D xfs_attr_leaf_name_local(block, idx); + l =3D xfs_attr3_leaf_name_local(block, idx); return (int)bitize(xfs_attr_leaf_entsize_local(l->namelen, be16_to_cpu(l->valuelen))); } else { - r =3D xfs_attr_leaf_name_remote(block, idx); + r =3D xfs_attr3_leaf_name_remote(block, idx); return (int)bitize(xfs_attr_leaf_entsize_remote(r->namelen)); } } @@ -412,7 +412,7 @@ attr_node_btree_count( block =3D obj; if (be16_to_cpu(block->hdr.info.magic) !=3D XFS_DA_NODE_MAGIC) return 0; - return be16_to_cpu(block->hdr.count); + return be16_to_cpu(block->hdr.__count); } =20 /*ARGSUSED*/ diff --git a/db/dir.c b/db/dir.c index 70ecc46..a9b1654 100644 --- a/db/dir.c +++ b/db/dir.c @@ -111,7 +111,7 @@ const field_t dir_node_entry_flds[] =3D { #define HOFF(f) bitize(offsetof(xfs_da_node_hdr_t, f)) const field_t dir_node_hdr_flds[] =3D { { "info", FLDT_DIR_BLKINFO, OI(HOFF(info)), C1, 0, TYP_NONE }, - { "count", FLDT_UINT16D, OI(HOFF(count)), C1, 0, TYP_NONE }, + { "count", FLDT_UINT16D, OI(HOFF(__count)), C1, 0, TYP_NONE }, { "level", FLDT_UINT16D, OI(HOFF(__level)), C1, 0, TYP_NONE }, { NULL } }; @@ -228,7 +228,7 @@ dir_node_btree_count( block =3D obj; if (be16_to_cpu(block->hdr.info.magic) !=3D XFS_DA_NODE_MAGIC) return 0; - return be16_to_cpu(block->hdr.count); + return be16_to_cpu(block->hdr.__count); } =20 /*ARGSUSED*/ diff --git a/db/dir2.c b/db/dir2.c index 07809b0..2cbc22a 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -684,7 +684,7 @@ dir2_node_btree_count( node =3D obj; if (be16_to_cpu(node->hdr.info.magic) !=3D XFS_DA_NODE_MAGIC) return 0; - return be16_to_cpu(node->hdr.count); + return be16_to_cpu(node->hdr.__count); } =20 /*ARGSUSED*/ diff --git a/db/metadump.c b/db/metadump.c index 0635e7b..44e7162 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -1282,7 +1282,7 @@ obfuscate_attr_blocks( break; } if (entry->flags & XFS_ATTR_LOCAL) { - local =3D xfs_attr_leaf_name_local(leaf, i); + local =3D xfs_attr3_leaf_name_local(leaf, i); if (local->namelen =3D=3D 0) { if (show_warnings) print_warning("zero length for " @@ -1295,7 +1295,7 @@ obfuscate_attr_blocks( memset(&local->nameval[local->namelen], 0, be16_to_cpu(local->valuelen)); } else { - remote =3D xfs_attr_leaf_name_remote(leaf, i); + remote =3D xfs_attr3_leaf_name_remote(leaf, i); if (remote->namelen =3D=3D 0 || remote->valueblk =3D=3D 0) { if (show_warnings) diff --git a/include/xfs_attr_leaf.h b/include/xfs_attr_leaf.h index 77de139..f9d7846 100644 --- a/include/xfs_attr_leaf.h +++ b/include/xfs_attr_leaf.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2000,2002-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -89,7 +90,7 @@ typedef struct xfs_attr_leaf_hdr { /* constant-structure = header block */ =20 typedef struct xfs_attr_leaf_entry { /* sorted on key, not name */ __be32 hashval; /* hash value of name */ - __be16 nameidx; /* index into buffer of name/value */ + __be16 nameidx; /* index into buffer of name/value */ __u8 flags; /* LOCAL/ROOT/SECURE/INCOMPLETE flag */ __u8 pad2; /* unused pad byte */ } xfs_attr_leaf_entry_t; @@ -115,6 +116,54 @@ typedef struct xfs_attr_leafblock { } xfs_attr_leafblock_t; =20 /* + * CRC enabled leaf structures. Called "version 3" structures to match the + * version number of the directory and dablk structures for this feature, = and + * attr2 is already taken by the variable inode attribute fork size featur= e. + */ +struct xfs_attr3_leaf_hdr { + struct xfs_da3_blkinfo info; + __be16 count; + __be16 usedbytes; + __be16 firstused; + __u8 holes; + __u8 pad1; + struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE]; +}; + +#define XFS_ATTR3_LEAF_CRC_OFF (offsetof(struct xfs_attr3_leaf_hdr, info.c= rc)) + +struct xfs_attr3_leafblock { + struct xfs_attr3_leaf_hdr hdr; + struct xfs_attr_leaf_entry entries[1]; + + /* + * The rest of the block contains the following structures after the + * leaf entries, growing from the bottom up. The variables are never + * referenced, the locations accessed purely from helper functions. + * + * struct xfs_attr_leaf_name_local + * struct xfs_attr_leaf_name_remote + */ +}; + +/* + * incore, neutral version of the attribute leaf header + */ +struct xfs_attr3_icleaf_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t usedbytes; + __uint16_t firstused; + __u8 holes; + struct { + __uint16_t base; + __uint16_t size; + } freemap[XFS_ATTR_LEAF_MAPSIZE]; +}; + +/* * Flags used in the leaf_entry[i].flags field. * NOTE: the INCOMPLETE bit must not collide with the flags bits specified * on the system call, they are "or"ed together for various operations. @@ -147,26 +196,43 @@ typedef struct xfs_attr_leafblock { */ #define XFS_ATTR_LEAF_NAME_ALIGN ((uint)sizeof(xfs_dablk_t)) =20 +static inline int +xfs_attr3_leaf_hdr_size(struct xfs_attr_leafblock *leafp) +{ + if (leafp->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) + return sizeof(struct xfs_attr3_leaf_hdr); + return sizeof(struct xfs_attr_leaf_hdr); +} + +static inline struct xfs_attr_leaf_entry * +xfs_attr3_leaf_entryp(xfs_attr_leafblock_t *leafp) +{ + if (leafp->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) + return &((struct xfs_attr3_leafblock *)leafp)->entries[0]; + return &leafp->entries[0]; +} + /* * Cast typed pointers for "local" and "remote" name/value structs. */ -static inline xfs_attr_leaf_name_remote_t * -xfs_attr_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) +static inline char * +xfs_attr3_leaf_name(xfs_attr_leafblock_t *leafp, int idx) { - return (xfs_attr_leaf_name_remote_t *) - &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; + struct xfs_attr_leaf_entry *entries =3D xfs_attr3_leaf_entryp(leafp); + + return &((char *)leafp)[be16_to_cpu(entries[idx].nameidx)]; } =20 -static inline xfs_attr_leaf_name_local_t * -xfs_attr_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) +static inline xfs_attr_leaf_name_remote_t * +xfs_attr3_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) { - return (xfs_attr_leaf_name_local_t *) - &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; + return (xfs_attr_leaf_name_remote_t *)xfs_attr3_leaf_name(leafp, idx); } =20 -static inline char *xfs_attr_leaf_name(xfs_attr_leafblock_t *leafp, int id= x) +static inline xfs_attr_leaf_name_local_t * +xfs_attr3_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) { - return &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; + return (xfs_attr_leaf_name_local_t *)xfs_attr3_leaf_name(leafp, idx); } =20 /* @@ -221,37 +287,37 @@ int xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int = bytes); /* * Internal routines when attribute fork size =3D=3D XFS_LBSIZE(mp). */ -int xfs_attr_leaf_to_node(struct xfs_da_args *args); -int xfs_attr_leaf_to_shortform(struct xfs_buf *bp, +int xfs_attr3_leaf_to_node(struct xfs_da_args *args); +int xfs_attr3_leaf_to_shortform(struct xfs_buf *bp, struct xfs_da_args *args, int forkoff); -int xfs_attr_leaf_clearflag(struct xfs_da_args *args); -int xfs_attr_leaf_setflag(struct xfs_da_args *args); -int xfs_attr_leaf_flipflags(xfs_da_args_t *args); +int xfs_attr3_leaf_clearflag(struct xfs_da_args *args); +int xfs_attr3_leaf_setflag(struct xfs_da_args *args); +int xfs_attr3_leaf_flipflags(struct xfs_da_args *args); =20 /* * Routines used for growing the Btree. */ -int xfs_attr_leaf_split(struct xfs_da_state *state, +int xfs_attr3_leaf_split(struct xfs_da_state *state, struct xfs_da_state_blk *oldblk, struct xfs_da_state_blk *newblk); -int xfs_attr_leaf_lookup_int(struct xfs_buf *leaf, +int xfs_attr3_leaf_lookup_int(struct xfs_buf *leaf, struct xfs_da_args *args); -int xfs_attr_leaf_getvalue(struct xfs_buf *bp, struct xfs_da_args *args); -int xfs_attr_leaf_add(struct xfs_buf *leaf_buffer, +int xfs_attr3_leaf_getvalue(struct xfs_buf *bp, struct xfs_da_args *args); +int xfs_attr3_leaf_add(struct xfs_buf *leaf_buffer, struct xfs_da_args *args); -int xfs_attr_leaf_remove(struct xfs_buf *leaf_buffer, +int xfs_attr3_leaf_remove(struct xfs_buf *leaf_buffer, struct xfs_da_args *args); -int xfs_attr_leaf_list_int(struct xfs_buf *bp, +int xfs_attr3_leaf_list_int(struct xfs_buf *bp, struct xfs_attr_list_context *context); =20 /* * Routines used for shrinking the Btree. */ -int xfs_attr_leaf_toosmall(struct xfs_da_state *state, int *retval); -void xfs_attr_leaf_unbalance(struct xfs_da_state *state, +int xfs_attr3_leaf_toosmall(struct xfs_da_state *state, int *retval); +void xfs_attr3_leaf_unbalance(struct xfs_da_state *state, struct xfs_da_state_blk *drop_blk, struct xfs_da_state_blk *save_blk); -int xfs_attr_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp); +int xfs_attr3_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp= ); =20 /* * Utility routines. @@ -261,10 +327,12 @@ int xfs_attr_leaf_order(struct xfs_buf *leaf1_bp, struct xfs_buf *leaf2_bp); int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local); -int xfs_attr_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, +int xfs_attr3_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp); +void xfs_attr3_leaf_hdr_from_disk(struct xfs_attr3_icleaf_hdr *to, + struct xfs_attr_leafblock *from); =20 -extern const struct xfs_buf_ops xfs_attr_leaf_buf_ops; +extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; =20 #endif /* __XFS_ATTR_LEAF_H__ */ diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index 6bedb3c..0e8182c 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -55,6 +55,7 @@ typedef struct xfs_da_blkinfo { * magic numbers without modification for both v2 and v3 nodes. */ #define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */ +#define XFS_ATTR3_LEAF_MAGIC 0x3bee /* magic number: attribute leaf blks */ #define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks = */ #define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ =20 @@ -85,13 +86,13 @@ struct xfs_da3_blkinfo { =20 typedef struct xfs_da_node_hdr { struct xfs_da_blkinfo info; /* block type, links, etc. */ - __be16 count; /* count of active entries */ + __be16 __count; /* count of active entries */ __be16 __level; /* level above leaves (leaf =3D=3D 0) */ } xfs_da_node_hdr_t; =20 struct xfs_da3_node_hdr { struct xfs_da3_blkinfo info; /* block type, links, etc. */ - __be16 count; /* count of active entries */ + __be16 __count; /* count of active entries */ __be16 __level; /* level above leaves (leaf =3D=3D 0) */ __be32 __pad32; }; diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index bb2ccf2..4429cb7 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -659,7 +659,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) */ dp =3D args->dp; args->blkno =3D 0; - error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error =3D xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp= ); if (error) return error; =20 @@ -667,14 +667,14 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Look up the given attribute in the leaf block. Figure out if * the given flags produce an error or call for an atomic rename. */ - retval =3D xfs_attr_leaf_lookup_int(bp, args); + retval =3D xfs_attr3_leaf_lookup_int(bp, args); if ((args->flags & ATTR_REPLACE) && (retval =3D=3D ENOATTR)) { xfs_trans_brelse(args->trans, bp); - return(retval); + return retval; } else if (retval =3D=3D EEXIST) { if (args->flags & ATTR_CREATE) { /* pure create op */ xfs_trans_brelse(args->trans, bp); - return(retval); + return retval; } =20 trace_xfs_attr_leaf_replace(args); @@ -690,7 +690,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Add the attribute to the leaf block, transitioning to a Btree * if required. */ - retval =3D xfs_attr_leaf_add(bp, args); + retval =3D xfs_attr3_leaf_add(bp, args); if (retval =3D=3D ENOSPC) { /* * Promote the attribute list to the Btree format, then @@ -698,7 +698,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * can manage its own transactions. */ xfs_bmap_init(args->flist, args->firstblock); - error =3D xfs_attr_leaf_to_node(args); + error =3D xfs_attr3_leaf_to_node(args); if (!error) { error =3D xfs_bmap_finish(&args->trans, args->flist, &committed); @@ -763,7 +763,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * In a separate transaction, set the incomplete flag on the * "old" attr and clear the incomplete flag on the "new" attr. */ - error =3D xfs_attr_leaf_flipflags(args); + error =3D xfs_attr3_leaf_flipflags(args); if (error) return(error); =20 @@ -785,19 +785,19 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Read in the block containing the "old" attr, then * remove the "old" attr from that block (neat, huh!) */ - error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, + error =3D xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return error; =20 - xfs_attr_leaf_remove(bp, args); + xfs_attr3_leaf_remove(bp, args); =20 /* * If the result is small enough, shrink it all into the inode. */ if ((forkoff =3D xfs_attr_shortform_allfit(bp, dp))) { xfs_bmap_init(args->flist, args->firstblock); - error =3D xfs_attr_leaf_to_shortform(bp, args, forkoff); + error =3D xfs_attr3_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { error =3D xfs_bmap_finish(&args->trans, @@ -829,9 +829,9 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) /* * Added a "remote" value, just clear the incomplete flag. */ - error =3D xfs_attr_leaf_clearflag(args); + error =3D xfs_attr3_leaf_clearflag(args); } - return(error); + return error; } =20 /* @@ -854,24 +854,24 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) */ dp =3D args->dp; args->blkno =3D 0; - error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error =3D xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp= ); if (error) return error; =20 - error =3D xfs_attr_leaf_lookup_int(bp, args); + error =3D xfs_attr3_leaf_lookup_int(bp, args); if (error =3D=3D ENOATTR) { xfs_trans_brelse(args->trans, bp); return(error); } =20 - xfs_attr_leaf_remove(bp, args); + xfs_attr3_leaf_remove(bp, args); =20 /* * If the result is small enough, shrink it all into the inode. */ if ((forkoff =3D xfs_attr_shortform_allfit(bp, dp))) { xfs_bmap_init(args->flist, args->firstblock); - error =3D xfs_attr_leaf_to_shortform(bp, args, forkoff); + error =3D xfs_attr3_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { error =3D xfs_bmap_finish(&args->trans, args->flist, @@ -881,7 +881,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) ASSERT(committed); args->trans =3D NULL; xfs_bmap_cancel(args->flist); - return(error); + return error; } =20 /* @@ -891,7 +891,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) if (committed) xfs_trans_ijoin(args->trans, dp, 0); } - return(0); + return 0; } =20 /* @@ -909,21 +909,21 @@ xfs_attr_leaf_get(xfs_da_args_t *args) trace_xfs_attr_leaf_get(args); =20 args->blkno =3D 0; - error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error =3D xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp= ); if (error) return error; =20 - error =3D xfs_attr_leaf_lookup_int(bp, args); + error =3D xfs_attr3_leaf_lookup_int(bp, args); if (error !=3D EEXIST) { xfs_trans_brelse(args->trans, bp); - return(error); + return error; } - error =3D xfs_attr_leaf_getvalue(bp, args); + error =3D xfs_attr3_leaf_getvalue(bp, args); xfs_trans_brelse(args->trans, bp); if (!error && (args->rmtblkno > 0) && !(args->flags & ATTR_KERNOVAL)) { error =3D xfs_attr_rmtval_get(args); } - return(error); + return error; } =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -989,7 +989,7 @@ restart: args->rmtblkcnt =3D 0; } =20 - retval =3D xfs_attr_leaf_add(blk->bp, state->args); + retval =3D xfs_attr3_leaf_add(blk->bp, state->args); if (retval =3D=3D ENOSPC) { if (state->path.active =3D=3D 1) { /* @@ -999,7 +999,7 @@ restart: */ xfs_da_state_free(state); xfs_bmap_init(args->flist, args->firstblock); - error =3D xfs_attr_leaf_to_node(args); + error =3D xfs_attr3_leaf_to_node(args); if (!error) { error =3D xfs_bmap_finish(&args->trans, args->flist, @@ -1101,7 +1101,7 @@ restart: * In a separate transaction, set the incomplete flag on the * "old" attr and clear the incomplete flag on the "new" attr. */ - error =3D xfs_attr_leaf_flipflags(args); + error =3D xfs_attr3_leaf_flipflags(args); if (error) goto out; =20 @@ -1140,7 +1140,7 @@ restart: */ blk =3D &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); - error =3D xfs_attr_leaf_remove(blk->bp, args); + error =3D xfs_attr3_leaf_remove(blk->bp, args); xfs_da3_fixhashpath(state, &state->path); =20 /* @@ -1181,7 +1181,7 @@ restart: /* * Added a "remote" value, just clear the incomplete flag. */ - error =3D xfs_attr_leaf_clearflag(args); + error =3D xfs_attr3_leaf_clearflag(args); if (error) goto out; } @@ -1255,7 +1255,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) * Mark the attribute as INCOMPLETE, then bunmapi() the * remote value. */ - error =3D xfs_attr_leaf_setflag(args); + error =3D xfs_attr3_leaf_setflag(args); if (error) goto out; error =3D xfs_attr_rmtval_remove(args); @@ -1276,7 +1276,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) */ blk =3D &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); - retval =3D xfs_attr_leaf_remove(blk->bp, args); + retval =3D xfs_attr3_leaf_remove(blk->bp, args); xfs_da3_fixhashpath(state, &state->path); =20 /* @@ -1322,13 +1322,13 @@ xfs_attr_node_removename(xfs_da_args_t *args) ASSERT(state->path.blk[0].bp); state->path.blk[0].bp =3D NULL; =20 - error =3D xfs_attr_leaf_read(args->trans, args->dp, 0, -1, &bp); + error =3D xfs_attr3_leaf_read(args->trans, args->dp, 0, -1, &bp); if (error) goto out; =20 if ((forkoff =3D xfs_attr_shortform_allfit(bp, dp))) { xfs_bmap_init(args->flist, args->firstblock); - error =3D xfs_attr_leaf_to_shortform(bp, args, forkoff); + error =3D xfs_attr3_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { error =3D xfs_bmap_finish(&args->trans, @@ -1500,7 +1500,7 @@ xfs_attr_node_get(xfs_da_args_t *args) /* * Get the value, local or "remote" */ - retval =3D xfs_attr_leaf_getvalue(blk->bp, args); + retval =3D xfs_attr3_leaf_getvalue(blk->bp, args); if (!retval && (args->rmtblkno > 0) && !(args->flags & ATTR_KERNOVAL)) { retval =3D xfs_attr_rmtval_get(args); diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index cb37198..9de2244 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -31,68 +32,204 @@ /* * Routines used for growing the Btree. */ -STATIC int xfs_attr_leaf_create(xfs_da_args_t *args, xfs_dablk_t which_blo= ck, - struct xfs_buf **bpp); -STATIC int xfs_attr_leaf_add_work(struct xfs_buf *leaf_buffer, - xfs_da_args_t *args, int freemap_index); -STATIC void xfs_attr_leaf_compact(struct xfs_da_args *args, - struct xfs_buf *leaf_buffer); -STATIC void xfs_attr_leaf_rebalance(xfs_da_state_t *state, +STATIC int xfs_attr3_leaf_create(struct xfs_da_args *args, + xfs_dablk_t which_block, struct xfs_buf **bpp); +STATIC int xfs_attr3_leaf_add_work(struct xfs_buf *leaf_buffer, + struct xfs_attr3_icleaf_hdr *ichdr, + struct xfs_da_args *args, int freemap_index); +STATIC void xfs_attr3_leaf_compact(struct xfs_da_args *args, + struct xfs_attr3_icleaf_hdr *ichdr, + struct xfs_buf *leaf_buffer); +STATIC void xfs_attr3_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_da_state_blk_t *blk2); -STATIC int xfs_attr_leaf_figure_balance(xfs_da_state_t *state, - xfs_da_state_blk_t *leaf_blk_1, - xfs_da_state_blk_t *leaf_blk_2, - int *number_entries_in_blk1, - int *number_usedbytes_in_blk1); +STATIC int xfs_attr3_leaf_figure_balance(xfs_da_state_t *state, + xfs_da_state_blk_t *leaf_blk_1, + struct xfs_attr3_icleaf_hdr *ichdr1, + xfs_da_state_blk_t *leaf_blk_2, + struct xfs_attr3_icleaf_hdr *ichdr2, + int *number_entries_in_blk1, + int *number_usedbytes_in_blk1); =20 =20 /* * Utility routines. */ -STATIC void xfs_attr_leaf_moveents(xfs_attr_leafblock_t *src_leaf, - int src_start, - xfs_attr_leafblock_t *dst_leaf, - int dst_start, int move_count, - xfs_mount_t *mp); +STATIC void xfs_attr3_leaf_moveents(struct xfs_attr_leafblock *src_leaf, + struct xfs_attr3_icleaf_hdr *src_ichdr, int src_start, + struct xfs_attr_leafblock *dst_leaf, + struct xfs_attr3_icleaf_hdr *dst_ichdr, int dst_start, + int move_count, struct xfs_mount *mp); STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); =20 -static void -xfs_attr_leaf_verify( +void +xfs_attr3_leaf_hdr_from_disk( + struct xfs_attr3_icleaf_hdr *to, + struct xfs_attr_leafblock *from) +{ + int i; + + ASSERT(from->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC) || + from->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)); + + if (from->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) { + struct xfs_attr3_leaf_hdr *hdr3 =3D (struct xfs_attr3_leaf_hdr *)from; + + to->forw =3D be32_to_cpu(hdr3->info.hdr.forw); + to->back =3D be32_to_cpu(hdr3->info.hdr.back); + to->magic =3D be16_to_cpu(hdr3->info.hdr.magic); + to->count =3D be16_to_cpu(hdr3->count); + to->usedbytes =3D be16_to_cpu(hdr3->usedbytes); + to->firstused =3D be16_to_cpu(hdr3->firstused); + to->holes =3D hdr3->holes; + + for (i =3D 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + to->freemap[i].base =3D be16_to_cpu(hdr3->freemap[i].base); + to->freemap[i].size =3D be16_to_cpu(hdr3->freemap[i].size); + } + return; + } + to->forw =3D be32_to_cpu(from->hdr.info.forw); + to->back =3D be32_to_cpu(from->hdr.info.back); + to->magic =3D be16_to_cpu(from->hdr.info.magic); + to->count =3D be16_to_cpu(from->hdr.count); + to->usedbytes =3D be16_to_cpu(from->hdr.usedbytes); + to->firstused =3D be16_to_cpu(from->hdr.firstused); + to->holes =3D from->hdr.holes; + + for (i =3D 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + to->freemap[i].base =3D be16_to_cpu(from->hdr.freemap[i].base); + to->freemap[i].size =3D be16_to_cpu(from->hdr.freemap[i].size); + } +} + +void +xfs_attr3_leaf_hdr_to_disk( + struct xfs_attr_leafblock *to, + struct xfs_attr3_icleaf_hdr *from) +{ + int i; + + ASSERT(from->magic =3D=3D XFS_ATTR_LEAF_MAGIC || + from->magic =3D=3D XFS_ATTR3_LEAF_MAGIC); + + if (from->magic =3D=3D XFS_ATTR3_LEAF_MAGIC) { + struct xfs_attr3_leaf_hdr *hdr3 =3D (struct xfs_attr3_leaf_hdr *)to; + + hdr3->info.hdr.forw =3D cpu_to_be32(from->forw); + hdr3->info.hdr.back =3D cpu_to_be32(from->back); + hdr3->info.hdr.magic =3D cpu_to_be16(from->magic); + hdr3->count =3D cpu_to_be16(from->count); + hdr3->usedbytes =3D cpu_to_be16(from->usedbytes); + hdr3->firstused =3D cpu_to_be16(from->firstused); + hdr3->holes =3D from->holes; + hdr3->pad1 =3D 0; + + for (i =3D 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + hdr3->freemap[i].base =3D cpu_to_be16(from->freemap[i].base); + hdr3->freemap[i].size =3D cpu_to_be16(from->freemap[i].size); + } + return; + } + to->hdr.info.forw =3D cpu_to_be32(from->forw); + to->hdr.info.back =3D cpu_to_be32(from->back); + to->hdr.info.magic =3D cpu_to_be16(from->magic); + to->hdr.count =3D cpu_to_be16(from->count); + to->hdr.usedbytes =3D cpu_to_be16(from->usedbytes); + to->hdr.firstused =3D cpu_to_be16(from->firstused); + to->hdr.holes =3D from->holes; + to->hdr.pad1 =3D 0; + + for (i =3D 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + to->hdr.freemap[i].base =3D cpu_to_be16(from->freemap[i].base); + to->hdr.freemap[i].size =3D cpu_to_be16(from->freemap[i].size); + } +} + +static bool +xfs_attr3_leaf_verify( struct xfs_buf *bp) { struct xfs_mount *mp =3D bp->b_target->bt_mount; - struct xfs_attr_leaf_hdr *hdr =3D bp->b_addr; - int block_ok =3D 0; + struct xfs_attr_leafblock *leaf =3D bp->b_addr; + struct xfs_attr3_icleaf_hdr ichdr; =20 - block_ok =3D hdr->info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC); - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_node_hdr *hdr3 =3D bp->b_addr; + + if (ichdr.magic !=3D XFS_ATTR3_LEAF_MAGIC) + return false; + + if (!uuid_equal(&hdr3->info.uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(hdr3->info.blkno) !=3D bp->b_bn) + return false; + } else { + if (ichdr.magic !=3D XFS_ATTR_LEAF_MAGIC) + return false; } + if (ichdr.count =3D=3D 0) + return false; + + /* XXX: need to range check rest of attr header values */ + /* XXX: hash order check? */ + + return true; } =20 static void -xfs_attr_leaf_read_verify( +xfs_attr3_leaf_write_verify( struct xfs_buf *bp) { - xfs_attr_leaf_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + struct xfs_attr3_leaf_hdr *hdr3 =3D bp->b_addr; + + if (!xfs_attr3_leaf_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->info.lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_ATTR3_LEAF_CRC_OFF); } =20 +/* + * leaf/node format detection on trees is sketchy, so a node read can be d= one on + * leaf level blocks when detection identifies the tree as a node format t= ree + * incorrectly. In this case, we need to swap the verifier to match the co= rrect + * format of the block being read. + */ static void -xfs_attr_leaf_write_verify( - struct xfs_buf *bp) +xfs_attr3_leaf_read_verify( + struct xfs_buf *bp) { - xfs_attr_leaf_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_ATTR3_LEAF_CRC_OFF)) || + !xfs_attr3_leaf_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } =20 -const struct xfs_buf_ops xfs_attr_leaf_buf_ops =3D { - .verify_read =3D xfs_attr_leaf_read_verify, - .verify_write =3D xfs_attr_leaf_write_verify, +const struct xfs_buf_ops xfs_attr3_leaf_buf_ops =3D { + .verify_read =3D xfs_attr3_leaf_read_verify, + .verify_write =3D xfs_attr3_leaf_write_verify, }; =20 int -xfs_attr_leaf_read( +xfs_attr3_leaf_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, @@ -100,7 +237,7 @@ xfs_attr_leaf_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, - XFS_ATTR_FORK, &xfs_attr_leaf_buf_ops); + XFS_ATTR_FORK, &xfs_attr3_leaf_buf_ops); } =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -528,7 +665,7 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) } =20 ASSERT(blkno =3D=3D 0); - error =3D xfs_attr_leaf_create(args, blkno, &bp); + error =3D xfs_attr3_leaf_create(args, blkno, &bp); if (error) { error =3D xfs_da_shrink_inode(args, 0, bp); bp =3D NULL; @@ -557,9 +694,9 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) nargs.hashval =3D xfs_da_hashname(sfe->nameval, sfe->namelen); nargs.flags =3D XFS_ATTR_NSP_ONDISK_TO_ARGS(sfe->flags); - error =3D xfs_attr_leaf_lookup_int(bp, &nargs); /* set a->index */ + error =3D xfs_attr3_leaf_lookup_int(bp, &nargs); /* set a->index */ ASSERT(error =3D=3D ENOATTR); - error =3D xfs_attr_leaf_add(bp, &nargs); + error =3D xfs_attr3_leaf_add(bp, &nargs); ASSERT(error !=3D ENOSPC); if (error) goto out; @@ -596,7 +733,7 @@ xfs_attr_shortform_allfit( continue; /* don't copy partial entries */ if (!(entry->flags & XFS_ATTR_LOCAL)) return(0); - name_loc =3D xfs_attr_leaf_name_local(leaf, i); + name_loc =3D xfs_attr3_leaf_name_local(leaf, i); if (name_loc->namelen >=3D XFS_ATTR_SF_ENTSIZE_MAX) return(0); if (be16_to_cpu(name_loc->valuelen) >=3D XFS_ATTR_SF_ENTSIZE_MAX) @@ -616,29 +753,34 @@ xfs_attr_shortform_allfit( * Convert a leaf attribute list to shortform attribute list */ int -xfs_attr_leaf_to_shortform( - struct xfs_buf *bp, - xfs_da_args_t *args, - int forkoff) +xfs_attr3_leaf_to_shortform( + struct xfs_buf *bp, + struct xfs_da_args *args, + int forkoff) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_local_t *name_loc; - xfs_da_args_t nargs; - xfs_inode_t *dp; - char *tmpbuffer; - int error, i; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_local *name_loc; + struct xfs_da_args nargs; + struct xfs_inode *dp =3D args->dp; + char *tmpbuffer; + int error; + int i; =20 trace_xfs_attr_leaf_to_sf(args); =20 - dp =3D args->dp; tmpbuffer =3D kmem_alloc(XFS_LBSIZE(dp->i_mount), KM_SLEEP); - ASSERT(tmpbuffer !=3D NULL); + if (!tmpbuffer) + return ENOMEM; =20 - ASSERT(bp !=3D NULL); memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(dp->i_mount)); + leaf =3D (xfs_attr_leafblock_t *)tmpbuffer; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + entry =3D xfs_attr3_leaf_entryp(leaf); + + /* XXX (dgc): buffer is about to be marked stale - why zero it? */ memset(bp->b_addr, 0, XFS_LBSIZE(dp->i_mount)); =20 /* @@ -668,14 +810,14 @@ xfs_attr_leaf_to_shortform( nargs.whichfork =3D XFS_ATTR_FORK; nargs.trans =3D args->trans; nargs.op_flags =3D XFS_DA_OP_OKNOENT; - entry =3D &leaf->entries[0]; - for (i =3D 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { + + for (i =3D 0; i < ichdr.count; entry++, i++) { if (entry->flags & XFS_ATTR_INCOMPLETE) continue; /* don't copy partial entries */ if (!entry->nameidx) continue; ASSERT(entry->flags & XFS_ATTR_LOCAL); - name_loc =3D xfs_attr_leaf_name_local(leaf, i); + name_loc =3D xfs_attr3_leaf_name_local(leaf, i); nargs.name =3D name_loc->nameval; nargs.namelen =3D name_loc->namelen; nargs.value =3D &name_loc->nameval[nargs.namelen]; @@ -688,43 +830,50 @@ xfs_attr_leaf_to_shortform( =20 out: kmem_free(tmpbuffer); - return(error); + return error; } =20 /* * Convert from using a single leaf to a root node and a leaf. */ int -xfs_attr_leaf_to_node(xfs_da_args_t *args) +xfs_attr3_leaf_to_node( + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_da_intnode_t *node; - xfs_inode_t *dp; - struct xfs_buf *bp1, *bp2; - xfs_dablk_t blkno; - int error; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr icleafhdr; + struct xfs_attr_leaf_entry *entries; struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr icnodehdr; + struct xfs_da_intnode *node; + struct xfs_inode *dp =3D args->dp; + struct xfs_mount *mp =3D dp->i_mount; + struct xfs_buf *bp1 =3D NULL; + struct xfs_buf *bp2 =3D NULL; + xfs_dablk_t blkno; + int error; =20 trace_xfs_attr_leaf_to_node(args); =20 - dp =3D args->dp; - bp1 =3D bp2 =3D NULL; error =3D xfs_da_grow_inode(args, &blkno); if (error) goto out; - error =3D xfs_attr_leaf_read(args->trans, args->dp, 0, -1, &bp1); + error =3D xfs_attr3_leaf_read(args->trans, dp, 0, -1, &bp1); if (error) goto out; =20 - bp2 =3D NULL; - error =3D xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp2, - XFS_ATTR_FORK); + error =3D xfs_da_get_buf(args->trans, dp, blkno, -1, &bp2, XFS_ATTR_FORK); if (error) goto out; + + /* copy leaf to new buffer, update identifiers */ bp2->b_ops =3D bp1->b_ops; - memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(dp->i_mount)); - bp1 =3D NULL; - xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(dp->i_mount) - 1); + memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp)); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_blkinfo *hdr3 =3D bp2->b_addr; + hdr3->blkno =3D cpu_to_be64(bp2->b_bn); + } + xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(mp) - 1); =20 /* * Set up the new root node. @@ -733,17 +882,22 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) if (error) goto out; node =3D bp1->b_addr; + xfs_da3_node_hdr_from_disk(&icnodehdr, node); + btree =3D xfs_da3_node_tree_p(node); + leaf =3D bp2->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + xfs_attr3_leaf_hdr_from_disk(&icleafhdr, leaf); + entries =3D xfs_attr3_leaf_entryp(leaf); + /* both on-disk, don't endian-flip twice */ - btree =3D xfs_da3_node_tree_p(node); - btree[0].hashval =3D leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashv= al; + btree[0].hashval =3D entries[icleafhdr.count - 1].hashval; btree[0].before =3D cpu_to_be32(blkno); - node->hdr.count =3D cpu_to_be16(1); - xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(dp->i_mount) - 1); + icnodehdr.count =3D 1; + xfs_da3_node_hdr_to_disk(node, &icnodehdr); + xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(mp) - 1); error =3D 0; out: - return(error); + return error; } =20 =20 @@ -756,52 +910,62 @@ out: * or a leaf in a node attribute list. */ STATIC int -xfs_attr_leaf_create( - xfs_da_args_t *args, - xfs_dablk_t blkno, - struct xfs_buf **bpp) +xfs_attr3_leaf_create( + struct xfs_da_args *args, + xfs_dablk_t blkno, + struct xfs_buf **bpp) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_hdr_t *hdr; - xfs_inode_t *dp; - struct xfs_buf *bp; - int error; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_inode *dp =3D args->dp; + struct xfs_mount *mp =3D dp->i_mount; + struct xfs_buf *bp; + int error; =20 trace_xfs_attr_leaf_create(args); =20 - dp =3D args->dp; - ASSERT(dp !=3D NULL); error =3D xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp, XFS_ATTR_FORK); if (error) - return(error); - bp->b_ops =3D &xfs_attr_leaf_buf_ops; + return error; + bp->b_ops =3D &xfs_attr3_leaf_buf_ops; leaf =3D bp->b_addr; - memset((char *)leaf, 0, XFS_LBSIZE(dp->i_mount)); - hdr =3D &leaf->hdr; - hdr->info.magic =3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC); - hdr->firstused =3D cpu_to_be16(XFS_LBSIZE(dp->i_mount)); - if (!hdr->firstused) { - hdr->firstused =3D cpu_to_be16( - XFS_LBSIZE(dp->i_mount) - XFS_ATTR_LEAF_NAME_ALIGN); - } + memset(leaf, 0, XFS_LBSIZE(mp)); + + memset(&ichdr, 0, sizeof(ichdr)); + ichdr.firstused =3D XFS_LBSIZE(mp); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_blkinfo *hdr3 =3D bp->b_addr; =20 - hdr->freemap[0].base =3D cpu_to_be16(sizeof(xfs_attr_leaf_hdr_t)); - hdr->freemap[0].size =3D cpu_to_be16(be16_to_cpu(hdr->firstused) - - sizeof(xfs_attr_leaf_hdr_t)); + ichdr.magic =3D XFS_ATTR3_LEAF_MAGIC; + + hdr3->blkno =3D cpu_to_be64(bp->b_bn); + hdr3->owner =3D cpu_to_be64(dp->i_ino); + uuid_copy(&hdr3->uuid, &mp->m_sb.sb_uuid); + + ichdr.freemap[0].base =3D sizeof(struct xfs_attr3_leaf_hdr); + } else { + ichdr.magic =3D XFS_ATTR_LEAF_MAGIC; + ichdr.freemap[0].base =3D sizeof(struct xfs_attr_leaf_hdr); + } + ichdr.freemap[0].size =3D ichdr.firstused - ichdr.freemap[0].base; =20 - xfs_trans_log_buf(args->trans, bp, 0, XFS_LBSIZE(dp->i_mount) - 1); + xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); + xfs_trans_log_buf(args->trans, bp, 0, XFS_LBSIZE(mp) - 1); =20 *bpp =3D bp; - return(0); + return 0; } =20 /* * Split the leaf node, rebalance, then add the new entry. */ int -xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, - xfs_da_state_blk_t *newblk) +xfs_attr3_leaf_split( + struct xfs_da_state *state, + struct xfs_da_state_blk *oldblk, + struct xfs_da_state_blk *newblk) { xfs_dablk_t blkno; int error; @@ -815,7 +979,7 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state= _blk_t *oldblk, error =3D xfs_da_grow_inode(state->args, &blkno); if (error) return(error); - error =3D xfs_attr_leaf_create(state->args, blkno, &newblk->bp); + error =3D xfs_attr3_leaf_create(state->args, blkno, &newblk->bp); if (error) return(error); newblk->blkno =3D blkno; @@ -825,7 +989,7 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state= _blk_t *oldblk, * Rebalance the entries across the two leaves. * NOTE: rebalance() currently depends on the 2nd block being empty. */ - xfs_attr_leaf_rebalance(state, oldblk, newblk); + xfs_attr3_leaf_rebalance(state, oldblk, newblk); error =3D xfs_da3_blk_link(state, oldblk, newblk); if (error) return(error); @@ -839,10 +1003,10 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_st= ate_blk_t *oldblk, */ if (state->inleaf) { trace_xfs_attr_leaf_add_old(state->args); - error =3D xfs_attr_leaf_add(oldblk->bp, state->args); + error =3D xfs_attr3_leaf_add(oldblk->bp, state->args); } else { trace_xfs_attr_leaf_add_new(state->args); - error =3D xfs_attr_leaf_add(newblk->bp, state->args); + error =3D xfs_attr3_leaf_add(newblk->bp, state->args); } =20 /* @@ -857,22 +1021,23 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_st= ate_blk_t *oldblk, * Add a name to the leaf attribute list structure. */ int -xfs_attr_leaf_add( +xfs_attr3_leaf_add( struct xfs_buf *bp, struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_hdr_t *hdr; - xfs_attr_leaf_map_t *map; - int tablesize, entsize, sum, tmp, i; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + int tablesize; + int entsize; + int sum; + int tmp; + int i; =20 trace_xfs_attr_leaf_add(args); =20 leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT((args->index >=3D 0) - && (args->index <=3D be16_to_cpu(leaf->hdr.count))); - hdr =3D &leaf->hdr; + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + ASSERT(args->index >=3D 0 && args->index <=3D ichdr.count); entsize =3D xfs_attr_leaf_newentsize(args->namelen, args->valuelen, args->trans->t_mountp->m_sb.sb_blocksize, NULL); =20 @@ -880,25 +1045,23 @@ xfs_attr_leaf_add( * Search through freemap for first-fit on new name length. * (may need to figure in size of entry struct too) */ - tablesize =3D (be16_to_cpu(hdr->count) + 1) - * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t); - map =3D &hdr->freemap[XFS_ATTR_LEAF_MAPSIZE-1]; - for (sum =3D 0, i =3D XFS_ATTR_LEAF_MAPSIZE-1; i >=3D 0; map--, i--) { - if (tablesize > be16_to_cpu(hdr->firstused)) { - sum +=3D be16_to_cpu(map->size); + tablesize =3D (ichdr.count + 1) * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf); + for (sum =3D 0, i =3D XFS_ATTR_LEAF_MAPSIZE - 1; i >=3D 0; i--) { + if (tablesize > ichdr.firstused) { + sum +=3D ichdr.freemap[i].size; continue; } - if (!map->size) + if (!ichdr.freemap[i].size) continue; /* no space in this map */ tmp =3D entsize; - if (be16_to_cpu(map->base) < be16_to_cpu(hdr->firstused)) + if (ichdr.freemap[i].base < ichdr.firstused) tmp +=3D sizeof(xfs_attr_leaf_entry_t); - if (be16_to_cpu(map->size) >=3D tmp) { - tmp =3D xfs_attr_leaf_add_work(bp, args, i); - return(tmp); + if (ichdr.freemap[i].size >=3D tmp) { + tmp =3D xfs_attr3_leaf_add_work(bp, &ichdr, args, i); + goto out_log_hdr; } - sum +=3D be16_to_cpu(map->size); + sum +=3D ichdr.freemap[i].size; } =20 /* @@ -906,82 +1069,90 @@ xfs_attr_leaf_add( * and we don't have enough freespace, then compaction will do us * no good and we should just give up. */ - if (!hdr->holes && (sum < entsize)) - return(XFS_ERROR(ENOSPC)); + if (!ichdr.holes && sum < entsize) + return XFS_ERROR(ENOSPC); =20 /* * Compact the entries to coalesce free space. * This may change the hdr->count via dropping INCOMPLETE entries. */ - xfs_attr_leaf_compact(args, bp); + xfs_attr3_leaf_compact(args, &ichdr, bp); =20 /* * After compaction, the block is guaranteed to have only one * free region, in freemap[0]. If it is not big enough, give up. */ - if (be16_to_cpu(hdr->freemap[0].size) - < (entsize + sizeof(xfs_attr_leaf_entry_t))) - return(XFS_ERROR(ENOSPC)); + if (ichdr.freemap[0].size < (entsize + sizeof(xfs_attr_leaf_entry_t))) { + tmp =3D ENOSPC; + goto out_log_hdr; + } + + tmp =3D xfs_attr3_leaf_add_work(bp, &ichdr, args, 0); =20 - return(xfs_attr_leaf_add_work(bp, args, 0)); +out_log_hdr: + xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); + xfs_trans_log_buf(args->trans, bp, + XFS_DA_LOGRANGE(leaf, &leaf->hdr, + xfs_attr3_leaf_hdr_size(leaf))); + return tmp; } =20 /* * Add a name to a leaf attribute list structure. */ STATIC int -xfs_attr_leaf_add_work( - struct xfs_buf *bp, - xfs_da_args_t *args, - int mapindex) +xfs_attr3_leaf_add_work( + struct xfs_buf *bp, + struct xfs_attr3_icleaf_hdr *ichdr, + struct xfs_da_args *args, + int mapindex) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_hdr_t *hdr; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_local_t *name_loc; - xfs_attr_leaf_name_remote_t *name_rmt; - xfs_attr_leaf_map_t *map; - xfs_mount_t *mp; - int tmp, i; + struct xfs_attr_leafblock *leaf; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_local *name_loc; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_attr_leaf_map *map; + struct xfs_mount *mp; + int tmp; + int i; =20 trace_xfs_attr_leaf_add_work(args); =20 leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - hdr =3D &leaf->hdr; - ASSERT((mapindex >=3D 0) && (mapindex < XFS_ATTR_LEAF_MAPSIZE)); - ASSERT((args->index >=3D 0) && (args->index <=3D be16_to_cpu(hdr->count))= ); + ASSERT(mapindex >=3D 0 && mapindex < XFS_ATTR_LEAF_MAPSIZE); + ASSERT(args->index >=3D 0 && args->index <=3D ichdr->count); =20 /* * Force open some space in the entry array and fill it in. */ - entry =3D &leaf->entries[args->index]; - if (args->index < be16_to_cpu(hdr->count)) { - tmp =3D be16_to_cpu(hdr->count) - args->index; + entry =3D &xfs_attr3_leaf_entryp(leaf)[args->index]; + if (args->index < ichdr->count) { + tmp =3D ichdr->count - args->index; tmp *=3D sizeof(xfs_attr_leaf_entry_t); - memmove((char *)(entry+1), (char *)entry, tmp); + memmove(entry + 1, entry, tmp); xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry))); } - be16_add_cpu(&hdr->count, 1); + ichdr->count++; =20 /* * Allocate space for the new string (at the end of the run). */ - map =3D &hdr->freemap[mapindex]; mp =3D args->trans->t_mountp; - ASSERT(be16_to_cpu(map->base) < XFS_LBSIZE(mp)); - ASSERT((be16_to_cpu(map->base) & 0x3) =3D=3D 0); - ASSERT(be16_to_cpu(map->size) >=3D + ASSERT(ichdr->freemap[mapindex].base < XFS_LBSIZE(mp)); + ASSERT((ichdr->freemap[mapindex].base & 0x3) =3D=3D 0); + ASSERT(ichdr->freemap[mapindex].size >=3D xfs_attr_leaf_newentsize(args->namelen, args->valuelen, mp->m_sb.sb_blocksize, NULL)); - ASSERT(be16_to_cpu(map->size) < XFS_LBSIZE(mp)); - ASSERT((be16_to_cpu(map->size) & 0x3) =3D=3D 0); - be16_add_cpu(&map->size, - -xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, &tmp)); - entry->nameidx =3D cpu_to_be16(be16_to_cpu(map->base) + - be16_to_cpu(map->size)); + ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); + ASSERT((ichdr->freemap[mapindex].size & 0x3) =3D=3D 0); + + ichdr->freemap[mapindex].size -=3D + xfs_attr_leaf_newentsize(args->namelen, args->valuelen, + mp->m_sb.sb_blocksize, &tmp); + + entry->nameidx =3D cpu_to_be16(ichdr->freemap[mapindex].base + + ichdr->freemap[mapindex].size); entry->hashval =3D cpu_to_be32(args->hashval); entry->flags =3D tmp ? XFS_ATTR_LOCAL : 0; entry->flags |=3D XFS_ATTR_NSP_ARGS_TO_ONDISK(args->flags); @@ -996,7 +1167,7 @@ xfs_attr_leaf_add_work( XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); ASSERT((args->index =3D=3D 0) || (be32_to_cpu(entry->hashval) >=3D be32_to_cpu((entry-1)->hashval))= ); - ASSERT((args->index =3D=3D be16_to_cpu(hdr->count)-1) || + ASSERT((args->index =3D=3D ichdr->count - 1) || (be32_to_cpu(entry->hashval) <=3D be32_to_cpu((entry+1)->hashval))= ); =20 /* @@ -1007,14 +1178,14 @@ xfs_attr_leaf_add_work( * as part of this transaction (a split operation for example). */ if (entry->flags & XFS_ATTR_LOCAL) { - name_loc =3D xfs_attr_leaf_name_local(leaf, args->index); + name_loc =3D xfs_attr3_leaf_name_local(leaf, args->index); name_loc->namelen =3D args->namelen; name_loc->valuelen =3D cpu_to_be16(args->valuelen); memcpy((char *)name_loc->nameval, args->name, args->namelen); memcpy((char *)&name_loc->nameval[args->namelen], args->value, be16_to_cpu(name_loc->valuelen)); } else { - name_rmt =3D xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt =3D xfs_attr3_leaf_name_remote(leaf, args->index); name_rmt->namelen =3D args->namelen; memcpy((char *)name_rmt->name, args->name, args->namelen); entry->flags |=3D XFS_ATTR_INCOMPLETE; @@ -1025,44 +1196,41 @@ xfs_attr_leaf_add_work( args->rmtblkcnt =3D XFS_B_TO_FSB(mp, args->valuelen); } xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), + XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), xfs_attr_leaf_entsize(leaf, args->index))); =20 /* * Update the control info for this leaf node */ - if (be16_to_cpu(entry->nameidx) < be16_to_cpu(hdr->firstused)) { - /* both on-disk, don't endian-flip twice */ - hdr->firstused =3D entry->nameidx; - } - ASSERT(be16_to_cpu(hdr->firstused) >=3D - ((be16_to_cpu(hdr->count) * sizeof(*entry)) + sizeof(*hdr))); - tmp =3D (be16_to_cpu(hdr->count)-1) * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t); - map =3D &hdr->freemap[0]; + if (be16_to_cpu(entry->nameidx) < ichdr->firstused) + ichdr->firstused =3D be16_to_cpu(entry->nameidx); + + ASSERT(ichdr->firstused >=3D ichdr->count * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf)); + tmp =3D (ichdr->count - 1) * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf); + for (i =3D 0; i < XFS_ATTR_LEAF_MAPSIZE; map++, i++) { - if (be16_to_cpu(map->base) =3D=3D tmp) { - be16_add_cpu(&map->base, sizeof(xfs_attr_leaf_entry_t)); - be16_add_cpu(&map->size, - -((int)sizeof(xfs_attr_leaf_entry_t))); + if (ichdr->freemap[i].base =3D=3D tmp) { + ichdr->freemap[i].base +=3D sizeof(xfs_attr_leaf_entry_t); + ichdr->freemap[i].size -=3D sizeof(xfs_attr_leaf_entry_t); } } - be16_add_cpu(&hdr->usedbytes, xfs_attr_leaf_entsize(leaf, args->index)); - xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, hdr, sizeof(*hdr))); - return(0); + ichdr->usedbytes +=3D xfs_attr_leaf_entsize(leaf, args->index); + return 0; } =20 /* * Garbage collect a leaf attribute list block by copying it to a new buff= er. */ STATIC void -xfs_attr_leaf_compact( +xfs_attr3_leaf_compact( struct xfs_da_args *args, + struct xfs_attr3_icleaf_hdr *ichdr_d, struct xfs_buf *bp) { xfs_attr_leafblock_t *leaf_s, *leaf_d; - xfs_attr_leaf_hdr_t *hdr_s, *hdr_d; + struct xfs_attr3_icleaf_hdr ichdr_s; struct xfs_trans *trans =3D args->trans; struct xfs_mount *mp =3D trans->t_mountp; char *tmpbuffer; @@ -1079,34 +1247,69 @@ xfs_attr_leaf_compact( */ leaf_s =3D (xfs_attr_leafblock_t *)tmpbuffer; leaf_d =3D bp->b_addr; - hdr_s =3D &leaf_s->hdr; - hdr_d =3D &leaf_d->hdr; - hdr_d->info =3D hdr_s->info; /* struct copy */ - hdr_d->firstused =3D cpu_to_be16(XFS_LBSIZE(mp)); - /* handle truncation gracefully */ - if (!hdr_d->firstused) { - hdr_d->firstused =3D cpu_to_be16( - XFS_LBSIZE(mp) - XFS_ATTR_LEAF_NAME_ALIGN); - } - hdr_d->usedbytes =3D 0; - hdr_d->count =3D 0; - hdr_d->holes =3D 0; - hdr_d->freemap[0].base =3D cpu_to_be16(sizeof(xfs_attr_leaf_hdr_t)); - hdr_d->freemap[0].size =3D cpu_to_be16(be16_to_cpu(hdr_d->firstused) - - sizeof(xfs_attr_leaf_hdr_t)); + ichdr_s =3D *ichdr_d; /* struct copy */ + ichdr_d->firstused =3D XFS_LBSIZE(mp); + ichdr_d->usedbytes =3D 0; + ichdr_d->count =3D 0; + ichdr_d->holes =3D 0; + ichdr_d->freemap[0].base =3D xfs_attr3_leaf_hdr_size(leaf_s); + ichdr_d->freemap[0].size =3D ichdr_d->firstused - ichdr_d->freemap[0].bas= e; =20 /* * Copy all entry's in the same (sorted) order, * but allocate name/value pairs packed and in sequence. */ - xfs_attr_leaf_moveents(leaf_s, 0, leaf_d, 0, - be16_to_cpu(hdr_s->count), mp); + xfs_attr3_leaf_moveents(leaf_s, &ichdr_s, 0, leaf_d, ichdr_d, 0, + ichdr_s.count, mp); + /* + * this logs the entire buffer, but the caller must write the header + * back to the buffer when it is finished modifying it. + */ xfs_trans_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); =20 kmem_free(tmpbuffer); } =20 /* + * Compare two leaf blocks "order". + * Return 0 unless leaf2 should go before leaf1. + */ +static int +xfs_attr3_leaf_order( + struct xfs_buf *leaf1_bp, + struct xfs_attr3_icleaf_hdr *leaf1hdr, + struct xfs_buf *leaf2_bp, + struct xfs_attr3_icleaf_hdr *leaf2hdr) +{ + struct xfs_attr_leaf_entry *entries1; + struct xfs_attr_leaf_entry *entries2; + + entries1 =3D xfs_attr3_leaf_entryp(leaf1_bp->b_addr); + entries2 =3D xfs_attr3_leaf_entryp(leaf2_bp->b_addr); + if (leaf1hdr->count > 0 && leaf2hdr->count > 0 && + ((be32_to_cpu(entries2[0].hashval) < + be32_to_cpu(entries1[0].hashval)) || + (be32_to_cpu(entries2[leaf2hdr->count - 1].hashval) < + be32_to_cpu(entries1[leaf1hdr->count - 1].hashval)))) { + return 1; + } + return 0; +} + +int +xfs_attr_leaf_order( + struct xfs_buf *leaf1_bp, + struct xfs_buf *leaf2_bp) +{ + struct xfs_attr3_icleaf_hdr ichdr1; + struct xfs_attr3_icleaf_hdr ichdr2; + + xfs_attr3_leaf_hdr_from_disk(&ichdr1, leaf1_bp->b_addr); + xfs_attr3_leaf_hdr_from_disk(&ichdr2, leaf2_bp->b_addr); + return xfs_attr3_leaf_order(leaf1_bp, &ichdr1, leaf2_bp, &ichdr2); +} + +/* * Redistribute the attribute list entries between two leaf nodes, * taking into account the size of the new entry. * @@ -1119,14 +1322,23 @@ xfs_attr_leaf_compact( * the "new" and "old" values can end up in different blocks. */ STATIC void -xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2) +xfs_attr3_leaf_rebalance( + struct xfs_da_state *state, + struct xfs_da_state_blk *blk1, + struct xfs_da_state_blk *blk2) { - xfs_da_args_t *args; - xfs_da_state_blk_t *tmp_blk; - xfs_attr_leafblock_t *leaf1, *leaf2; - xfs_attr_leaf_hdr_t *hdr1, *hdr2; - int count, totallen, max, space, swap; + struct xfs_da_args *args; + struct xfs_attr_leafblock *leaf1; + struct xfs_attr_leafblock *leaf2; + struct xfs_attr3_icleaf_hdr ichdr1; + struct xfs_attr3_icleaf_hdr ichdr2; + struct xfs_attr_leaf_entry *entries1; + struct xfs_attr_leaf_entry *entries2; + int count; + int totallen; + int max; + int space; + int swap; =20 /* * Set up environment. @@ -1135,9 +1347,9 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da= _state_blk_t *blk1, ASSERT(blk2->magic =3D=3D XFS_ATTR_LEAF_MAGIC); leaf1 =3D blk1->bp->b_addr; leaf2 =3D blk2->bp->b_addr; - ASSERT(leaf1->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(leaf2->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(leaf2->hdr.count =3D=3D 0); + xfs_attr3_leaf_hdr_from_disk(&ichdr1, leaf1); + xfs_attr3_leaf_hdr_from_disk(&ichdr2, leaf2); + ASSERT(ichdr2.count =3D=3D 0); args =3D state->args; =20 trace_xfs_attr_leaf_rebalance(args); @@ -1149,16 +1361,23 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_= da_state_blk_t *blk1, * second block, this code should never set "swap". */ swap =3D 0; - if (xfs_attr_leaf_order(blk1->bp, blk2->bp)) { + if (xfs_attr3_leaf_order(blk1->bp, &ichdr1, blk2->bp, &ichdr2)) { + struct xfs_da_state_blk *tmp_blk; + struct xfs_attr3_icleaf_hdr tmp_ichdr; + tmp_blk =3D blk1; blk1 =3D blk2; blk2 =3D tmp_blk; + + /* struct copies to swap them rather than reconverting */ + tmp_ichdr =3D ichdr1; + ichdr1 =3D ichdr2; + ichdr2 =3D tmp_ichdr; + leaf1 =3D blk1->bp->b_addr; leaf2 =3D blk2->bp->b_addr; swap =3D 1; } - hdr1 =3D &leaf1->hdr; - hdr2 =3D &leaf2->hdr; =20 /* * Examine entries until we reduce the absolute difference in @@ -1168,41 +1387,39 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_= da_state_blk_t *blk1, * "inleaf" is true if the new entry should be inserted into blk1. * If "swap" is also true, then reverse the sense of "inleaf". */ - state->inleaf =3D xfs_attr_leaf_figure_balance(state, blk1, blk2, - &count, &totallen); + state->inleaf =3D xfs_attr3_leaf_figure_balance(state, blk1, &ichdr1, + blk2, &ichdr2, + &count, &totallen); if (swap) state->inleaf =3D !state->inleaf; =20 /* * Move any entries required from leaf to leaf: */ - if (count < be16_to_cpu(hdr1->count)) { + if (count < ichdr1.count) { /* * Figure the total bytes to be added to the destination leaf. */ /* number entries being moved */ - count =3D be16_to_cpu(hdr1->count) - count; - space =3D be16_to_cpu(hdr1->usedbytes) - totallen; + count =3D ichdr1.count - count; + space =3D ichdr1.usedbytes - totallen; space +=3D count * sizeof(xfs_attr_leaf_entry_t); =20 /* * leaf2 is the destination, compact it if it looks tight. */ - max =3D be16_to_cpu(hdr2->firstused) - - sizeof(xfs_attr_leaf_hdr_t); - max -=3D be16_to_cpu(hdr2->count) * sizeof(xfs_attr_leaf_entry_t); + max =3D ichdr2.firstused - xfs_attr3_leaf_hdr_size(leaf1); + max -=3D ichdr2.count * sizeof(xfs_attr_leaf_entry_t); if (space > max) - xfs_attr_leaf_compact(args, blk2->bp); + xfs_attr3_leaf_compact(args, &ichdr2, blk2->bp); =20 /* * Move high entries from leaf1 to low end of leaf2. */ - xfs_attr_leaf_moveents(leaf1, be16_to_cpu(hdr1->count) - count, - leaf2, 0, count, state->mp); + xfs_attr3_leaf_moveents(leaf1, &ichdr1, ichdr1.count - count, + leaf2, &ichdr2, 0, count, state->mp); =20 - xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); - xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); - } else if (count > be16_to_cpu(hdr1->count)) { + } else if (count > ichdr1.count) { /* * I assert that since all callers pass in an empty * second buffer, this code should never execute. @@ -1213,36 +1430,37 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_= da_state_blk_t *blk1, * Figure the total bytes to be added to the destination leaf. */ /* number entries being moved */ - count -=3D be16_to_cpu(hdr1->count); - space =3D totallen - be16_to_cpu(hdr1->usedbytes); + count -=3D ichdr1.count; + space =3D totallen - ichdr1.usedbytes; space +=3D count * sizeof(xfs_attr_leaf_entry_t); =20 /* * leaf1 is the destination, compact it if it looks tight. */ - max =3D be16_to_cpu(hdr1->firstused) - - sizeof(xfs_attr_leaf_hdr_t); - max -=3D be16_to_cpu(hdr1->count) * sizeof(xfs_attr_leaf_entry_t); + max =3D ichdr1.firstused - xfs_attr3_leaf_hdr_size(leaf1); + max -=3D ichdr1.count * sizeof(xfs_attr_leaf_entry_t); if (space > max) - xfs_attr_leaf_compact(args, blk1->bp); + xfs_attr3_leaf_compact(args, &ichdr1, blk1->bp); =20 /* * Move low entries from leaf2 to high end of leaf1. */ - xfs_attr_leaf_moveents(leaf2, 0, leaf1, - be16_to_cpu(hdr1->count), count, state->mp); - - xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); - xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); + xfs_attr3_leaf_moveents(leaf2, &ichdr2, 0, leaf1, &ichdr1, + ichdr1.count, count, state->mp); } =20 + xfs_attr3_leaf_hdr_to_disk(leaf1, &ichdr1); + xfs_attr3_leaf_hdr_to_disk(leaf2, &ichdr2); + xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); + xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); + /* * Copy out last hashval in each block for B-tree code. */ - blk1->hashval =3D be32_to_cpu( - leaf1->entries[be16_to_cpu(leaf1->hdr.count)-1].hashval); - blk2->hashval =3D be32_to_cpu( - leaf2->entries[be16_to_cpu(leaf2->hdr.count)-1].hashval); + entries1 =3D xfs_attr3_leaf_entryp(leaf1); + entries2 =3D xfs_attr3_leaf_entryp(leaf2); + blk1->hashval =3D be32_to_cpu(entries1[ichdr1.count - 1].hashval); + blk2->hashval =3D be32_to_cpu(entries2[ichdr2.count - 1].hashval); =20 /* * Adjust the expected index for insertion. @@ -1256,12 +1474,12 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_= da_state_blk_t *blk1, * inserting. The index/blkno fields refer to the "old" entry, * while the index2/blkno2 fields refer to the "new" entry. */ - if (blk1->index > be16_to_cpu(leaf1->hdr.count)) { + if (blk1->index > ichdr1.count) { ASSERT(state->inleaf =3D=3D 0); - blk2->index =3D blk1->index - be16_to_cpu(leaf1->hdr.count); + blk2->index =3D blk1->index - ichdr1.count; args->index =3D args->index2 =3D blk2->index; args->blkno =3D args->blkno2 =3D blk2->blkno; - } else if (blk1->index =3D=3D be16_to_cpu(leaf1->hdr.count)) { + } else if (blk1->index =3D=3D ichdr1.count) { if (state->inleaf) { args->index =3D blk1->index; args->blkno =3D blk1->blkno; @@ -1273,8 +1491,7 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da= _state_blk_t *blk1, * is already stored in blkno2/index2, so don't * overwrite it overwise we corrupt the tree. */ - blk2->index =3D blk1->index - - be16_to_cpu(leaf1->hdr.count); + blk2->index =3D blk1->index - ichdr1.count; args->index =3D blk2->index; args->blkno =3D blk2->blkno; if (!state->extravalid) { @@ -1302,42 +1519,40 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_= da_state_blk_t *blk1, * GROT: Do a double-split for this case? */ STATIC int -xfs_attr_leaf_figure_balance(xfs_da_state_t *state, - xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2, - int *countarg, int *usedbytesarg) +xfs_attr3_leaf_figure_balance( + struct xfs_da_state *state, + struct xfs_da_state_blk *blk1, + struct xfs_attr3_icleaf_hdr *ichdr1, + struct xfs_da_state_blk *blk2, + struct xfs_attr3_icleaf_hdr *ichdr2, + int *countarg, + int *usedbytesarg) { - xfs_attr_leafblock_t *leaf1, *leaf2; - xfs_attr_leaf_hdr_t *hdr1, *hdr2; - xfs_attr_leaf_entry_t *entry; - int count, max, index, totallen, half; - int lastdelta, foundit, tmp; - - /* - * Set up environment. - */ - leaf1 =3D blk1->bp->b_addr; - leaf2 =3D blk2->bp->b_addr; - hdr1 =3D &leaf1->hdr; - hdr2 =3D &leaf2->hdr; - foundit =3D 0; - totallen =3D 0; + struct xfs_attr_leafblock *leaf1 =3D blk1->bp->b_addr; + struct xfs_attr_leafblock *leaf2 =3D blk2->bp->b_addr; + struct xfs_attr_leaf_entry *entry; + int count; + int max; + int index; + int totallen =3D 0; + int half; + int lastdelta; + int foundit =3D 0; + int tmp; =20 /* * Examine entries until we reduce the absolute difference in * byte usage between the two blocks to a minimum. */ - max =3D be16_to_cpu(hdr1->count) + be16_to_cpu(hdr2->count); - half =3D (max+1) * sizeof(*entry); - half +=3D be16_to_cpu(hdr1->usedbytes) + - be16_to_cpu(hdr2->usedbytes) + - xfs_attr_leaf_newentsize( - state->args->namelen, - state->args->valuelen, - state->blocksize, NULL); + max =3D ichdr1->count + ichdr2->count; + half =3D (max + 1) * sizeof(*entry); + half +=3D ichdr1->usedbytes + ichdr2->usedbytes + + xfs_attr_leaf_newentsize(state->args->namelen, + state->args->valuelen, + state->blocksize, NULL); half /=3D 2; lastdelta =3D state->blocksize; - entry =3D &leaf1->entries[0]; + entry =3D xfs_attr3_leaf_entryp(leaf1); for (count =3D index =3D 0; count < max; entry++, index++, count++) { =20 #define XFS_ATTR_ABS(A) (((A) < 0) ? -(A) : (A)) @@ -1360,9 +1575,9 @@ xfs_attr_leaf_figure_balance(xfs_da_state_t *state, /* * Wrap around into the second block if necessary. */ - if (count =3D=3D be16_to_cpu(hdr1->count)) { + if (count =3D=3D ichdr1->count) { leaf1 =3D leaf2; - entry =3D &leaf1->entries[0]; + entry =3D xfs_attr3_leaf_entryp(leaf1); index =3D 0; } =20 @@ -1393,7 +1608,7 @@ xfs_attr_leaf_figure_balance(xfs_da_state_t *state, =20 *countarg =3D count; *usedbytesarg =3D totallen; - return(foundit); + return foundit; } =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -1412,14 +1627,20 @@ xfs_attr_leaf_figure_balance(xfs_da_state_t *state, * GROT: allow for INCOMPLETE entries in calculation. */ int -xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) +xfs_attr3_leaf_toosmall( + struct xfs_da_state *state, + int *action) { - xfs_attr_leafblock_t *leaf; - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *info; - int count, bytes, forward, error, retval, i; - xfs_dablk_t blkno; - struct xfs_buf *bp; + struct xfs_attr_leafblock *leaf; + struct xfs_da_state_blk *blk; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_buf *bp; + xfs_dablk_t blkno; + int bytes; + int forward; + int error; + int retval; + int i; =20 trace_xfs_attr_leaf_toosmall(state->args); =20 @@ -1429,13 +1650,11 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *= action) * to coalesce with a sibling. */ blk =3D &state->path.blk[ state->path.active-1 ]; - info =3D blk->bp->b_addr; - ASSERT(info->magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - leaf =3D (xfs_attr_leafblock_t *)info; - count =3D be16_to_cpu(leaf->hdr.count); - bytes =3D sizeof(xfs_attr_leaf_hdr_t) + - count * sizeof(xfs_attr_leaf_entry_t) + - be16_to_cpu(leaf->hdr.usedbytes); + leaf =3D blk->bp->b_addr; + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + bytes =3D xfs_attr3_leaf_hdr_size(leaf) + + ichdr.count * sizeof(xfs_attr_leaf_entry_t) + + ichdr.usedbytes; if (bytes > (state->blocksize >> 1)) { *action =3D 0; /* blk over 50%, don't try to join */ return(0); @@ -1447,12 +1666,12 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *= action) * coalesce it with a sibling block. We choose (arbitrarily) * to merge with the forward block unless it is NULL. */ - if (count =3D=3D 0) { + if (ichdr.count =3D=3D 0) { /* * Make altpath point to the block we want to keep and * path point to the block we want to drop (this one). */ - forward =3D (info->forw !=3D 0); + forward =3D (ichdr.forw !=3D 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); error =3D xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); @@ -1463,7 +1682,7 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *ac= tion) } else { *action =3D 2; } - return(0); + return 0; } =20 /* @@ -1474,28 +1693,28 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *= action) * to shrink an attribute list over time. */ /* start with smaller blk num */ - forward =3D (be32_to_cpu(info->forw) < be32_to_cpu(info->back)); + forward =3D ichdr.forw < ichdr.back; for (i =3D 0; i < 2; forward =3D !forward, i++) { + struct xfs_attr3_icleaf_hdr ichdr2; if (forward) - blkno =3D be32_to_cpu(info->forw); + blkno =3D ichdr.forw; else - blkno =3D be32_to_cpu(info->back); + blkno =3D ichdr.back; if (blkno =3D=3D 0) continue; - error =3D xfs_attr_leaf_read(state->args->trans, state->args->dp, + error =3D xfs_attr3_leaf_read(state->args->trans, state->args->dp, blkno, -1, &bp); if (error) return(error); =20 - leaf =3D (xfs_attr_leafblock_t *)info; - count =3D be16_to_cpu(leaf->hdr.count); - bytes =3D state->blocksize - (state->blocksize>>2); - bytes -=3D be16_to_cpu(leaf->hdr.usedbytes); - leaf =3D bp->b_addr; - count +=3D be16_to_cpu(leaf->hdr.count); - bytes -=3D be16_to_cpu(leaf->hdr.usedbytes); - bytes -=3D count * sizeof(xfs_attr_leaf_entry_t); - bytes -=3D sizeof(xfs_attr_leaf_hdr_t); + xfs_attr3_leaf_hdr_from_disk(&ichdr2, bp->b_addr); + + bytes =3D state->blocksize - (state->blocksize >> 2) - + ichdr.usedbytes - ichdr2.usedbytes - + ((ichdr.count + ichdr2.count) * + sizeof(xfs_attr_leaf_entry_t)) - + xfs_attr3_leaf_hdr_size(leaf); + xfs_trans_brelse(state->args->trans, bp); if (bytes >=3D 0) break; /* fits with at least 25% to spare */ @@ -1534,32 +1753,35 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *= action) * If two leaves are 37% full, when combined they will leave 25% free. */ int -xfs_attr_leaf_remove( - struct xfs_buf *bp, - xfs_da_args_t *args) +xfs_attr3_leaf_remove( + struct xfs_buf *bp, + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_hdr_t *hdr; - xfs_attr_leaf_map_t *map; - xfs_attr_leaf_entry_t *entry; - int before, after, smallest, entsize; - int tablesize, tmp, i; - xfs_mount_t *mp; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_mount *mp =3D args->trans->t_mountp; + int before; + int after; + int smallest; + int entsize; + int tablesize; + int tmp; + int i; =20 trace_xfs_attr_leaf_remove(args); =20 leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - hdr =3D &leaf->hdr; - mp =3D args->trans->t_mountp; - ASSERT((be16_to_cpu(hdr->count) > 0) - && (be16_to_cpu(hdr->count) < (XFS_LBSIZE(mp)/8))); - ASSERT((args->index >=3D 0) - && (args->index < be16_to_cpu(hdr->count))); - ASSERT(be16_to_cpu(hdr->firstused) >=3D - ((be16_to_cpu(hdr->count) * sizeof(*entry)) + sizeof(*hdr))); - entry =3D &leaf->entries[args->index]; - ASSERT(be16_to_cpu(entry->nameidx) >=3D be16_to_cpu(hdr->firstused)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + + ASSERT(ichdr.count > 0 && ichdr.count < XFS_LBSIZE(mp) / 8); + ASSERT(args->index >=3D 0 && args->index < ichdr.count); + ASSERT(ichdr.firstused >=3D ichdr.count * sizeof(*entry) + + xfs_attr3_leaf_hdr_size(leaf)); + + entry =3D &xfs_attr3_leaf_entryp(leaf)[args->index]; + + ASSERT(be16_to_cpu(entry->nameidx) >=3D ichdr.firstused); ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); =20 /* @@ -1568,30 +1790,28 @@ xfs_attr_leaf_remove( * find smallest free region in case we need to replace it, * adjust any map that borders the entry table, */ - tablesize =3D be16_to_cpu(hdr->count) * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t); - map =3D &hdr->freemap[0]; - tmp =3D be16_to_cpu(map->size); + tablesize =3D ichdr.count * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf); + tmp =3D ichdr.freemap[0].size; before =3D after =3D -1; smallest =3D XFS_ATTR_LEAF_MAPSIZE - 1; entsize =3D xfs_attr_leaf_entsize(leaf, args->index); - for (i =3D 0; i < XFS_ATTR_LEAF_MAPSIZE; map++, i++) { - ASSERT(be16_to_cpu(map->base) < XFS_LBSIZE(mp)); - ASSERT(be16_to_cpu(map->size) < XFS_LBSIZE(mp)); - if (be16_to_cpu(map->base) =3D=3D tablesize) { - be16_add_cpu(&map->base, - -((int)sizeof(xfs_attr_leaf_entry_t))); - be16_add_cpu(&map->size, sizeof(xfs_attr_leaf_entry_t)); + for (i =3D 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + ASSERT(ichdr.freemap[i].base < XFS_LBSIZE(mp)); + ASSERT(ichdr.freemap[i].size < XFS_LBSIZE(mp)); + if (ichdr.freemap[i].base =3D=3D tablesize) { + ichdr.freemap[i].base -=3D sizeof(xfs_attr_leaf_entry_t); + ichdr.freemap[i].size +=3D sizeof(xfs_attr_leaf_entry_t); } =20 - if ((be16_to_cpu(map->base) + be16_to_cpu(map->size)) - =3D=3D be16_to_cpu(entry->nameidx)) { + if (ichdr.freemap[i].base + ichdr.freemap[i].size =3D=3D + be16_to_cpu(entry->nameidx)) { before =3D i; - } else if (be16_to_cpu(map->base) - =3D=3D (be16_to_cpu(entry->nameidx) + entsize)) { + } else if (ichdr.freemap[i].base =3D=3D + (be16_to_cpu(entry->nameidx) + entsize)) { after =3D i; - } else if (be16_to_cpu(map->size) < tmp) { - tmp =3D be16_to_cpu(map->size); + } else if (ichdr.freemap[i].size < tmp) { + tmp =3D ichdr.freemap[i].size; smallest =3D i; } } @@ -1602,36 +1822,30 @@ xfs_attr_leaf_remove( */ if ((before >=3D 0) || (after >=3D 0)) { if ((before >=3D 0) && (after >=3D 0)) { - map =3D &hdr->freemap[before]; - be16_add_cpu(&map->size, entsize); - be16_add_cpu(&map->size, - be16_to_cpu(hdr->freemap[after].size)); - hdr->freemap[after].base =3D 0; - hdr->freemap[after].size =3D 0; + ichdr.freemap[before].size +=3D entsize; + ichdr.freemap[before].size +=3D ichdr.freemap[after].size; + ichdr.freemap[after].base =3D 0; + ichdr.freemap[after].size =3D 0; } else if (before >=3D 0) { - map =3D &hdr->freemap[before]; - be16_add_cpu(&map->size, entsize); + ichdr.freemap[before].size +=3D entsize; } else { - map =3D &hdr->freemap[after]; - /* both on-disk, don't endian flip twice */ - map->base =3D entry->nameidx; - be16_add_cpu(&map->size, entsize); + ichdr.freemap[after].base =3D be16_to_cpu(entry->nameidx); + ichdr.freemap[after].size +=3D entsize; } } else { /* * Replace smallest region (if it is smaller than free'd entry) */ - map =3D &hdr->freemap[smallest]; - if (be16_to_cpu(map->size) < entsize) { - map->base =3D cpu_to_be16(be16_to_cpu(entry->nameidx)); - map->size =3D cpu_to_be16(entsize); + if (ichdr.freemap[smallest].size < entsize) { + ichdr.freemap[smallest].base =3D be16_to_cpu(entry->nameidx); + ichdr.freemap[smallest].size =3D entsize; } } =20 /* * Did we remove the first entry? */ - if (be16_to_cpu(entry->nameidx) =3D=3D be16_to_cpu(hdr->firstused)) + if (be16_to_cpu(entry->nameidx) =3D=3D ichdr.firstused) smallest =3D 1; else smallest =3D 0; @@ -1639,20 +1853,20 @@ xfs_attr_leaf_remove( /* * Compress the remaining entries and zero out the removed stuff. */ - memset(xfs_attr_leaf_name(leaf, args->index), 0, entsize); - be16_add_cpu(&hdr->usedbytes, -entsize); + memset(xfs_attr3_leaf_name(leaf, args->index), 0, entsize); + ichdr.usedbytes -=3D entsize; xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), + XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), entsize)); =20 - tmp =3D (be16_to_cpu(hdr->count) - args->index) - * sizeof(xfs_attr_leaf_entry_t); - memmove((char *)entry, (char *)(entry+1), tmp); - be16_add_cpu(&hdr->count, -1); + tmp =3D (ichdr.count - args->index) * sizeof(xfs_attr_leaf_entry_t); + memmove(entry, entry + 1, tmp); + ichdr.count--; xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry))); - entry =3D &leaf->entries[be16_to_cpu(hdr->count)]; - memset((char *)entry, 0, sizeof(xfs_attr_leaf_entry_t)); + XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(xfs_attr_leaf_entry_t))); + + entry =3D &xfs_attr3_leaf_entryp(leaf)[ichdr.count]; + memset(entry, 0, sizeof(xfs_attr_leaf_entry_t)); =20 /* * If we removed the first entry, re-find the first used byte @@ -1662,130 +1876,130 @@ xfs_attr_leaf_remove( */ if (smallest) { tmp =3D XFS_LBSIZE(mp); - entry =3D &leaf->entries[0]; - for (i =3D be16_to_cpu(hdr->count)-1; i >=3D 0; entry++, i--) { - ASSERT(be16_to_cpu(entry->nameidx) >=3D - be16_to_cpu(hdr->firstused)); + entry =3D xfs_attr3_leaf_entryp(leaf); + for (i =3D ichdr.count - 1; i >=3D 0; entry++, i--) { + ASSERT(be16_to_cpu(entry->nameidx) >=3D ichdr.firstused); ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); =20 if (be16_to_cpu(entry->nameidx) < tmp) tmp =3D be16_to_cpu(entry->nameidx); } - hdr->firstused =3D cpu_to_be16(tmp); - if (!hdr->firstused) { - hdr->firstused =3D cpu_to_be16( - tmp - XFS_ATTR_LEAF_NAME_ALIGN); - } + ichdr.firstused =3D tmp; + if (!ichdr.firstused) + ichdr.firstused =3D tmp - XFS_ATTR_LEAF_NAME_ALIGN; } else { - hdr->holes =3D 1; /* mark as needing compaction */ + ichdr.holes =3D 1; /* mark as needing compaction */ } + xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, hdr, sizeof(*hdr))); + XFS_DA_LOGRANGE(leaf, &leaf->hdr, + xfs_attr3_leaf_hdr_size(leaf))); =20 /* * Check if leaf is less than 50% full, caller may want to * "join" the leaf with a sibling if so. */ - tmp =3D sizeof(xfs_attr_leaf_hdr_t); - tmp +=3D be16_to_cpu(leaf->hdr.count) * sizeof(xfs_attr_leaf_entry_t); - tmp +=3D be16_to_cpu(leaf->hdr.usedbytes); - return(tmp < mp->m_attr_magicpct); /* leaf is < 37% full */ + tmp =3D ichdr.usedbytes + xfs_attr3_leaf_hdr_size(leaf) + + ichdr.count * sizeof(xfs_attr_leaf_entry_t); + + return tmp < mp->m_attr_magicpct; /* leaf is < 37% full */ } =20 /* * Move all the attribute list entries from drop_leaf into save_leaf. */ void -xfs_attr_leaf_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_bl= k, - xfs_da_state_blk_t *save_blk) +xfs_attr3_leaf_unbalance( + struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk, + struct xfs_da_state_blk *save_blk) { - xfs_attr_leafblock_t *drop_leaf, *save_leaf, *tmp_leaf; - xfs_attr_leaf_hdr_t *drop_hdr, *save_hdr, *tmp_hdr; - xfs_mount_t *mp; - char *tmpbuffer; + struct xfs_attr_leafblock *drop_leaf =3D drop_blk->bp->b_addr; + struct xfs_attr_leafblock *save_leaf =3D save_blk->bp->b_addr; + struct xfs_attr3_icleaf_hdr drophdr; + struct xfs_attr3_icleaf_hdr savehdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_mount *mp =3D state->mp; =20 trace_xfs_attr_leaf_unbalance(state->args); =20 - /* - * Set up environment. - */ - mp =3D state->mp; - ASSERT(drop_blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); - ASSERT(save_blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC); drop_leaf =3D drop_blk->bp->b_addr; save_leaf =3D save_blk->bp->b_addr; - ASSERT(drop_leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(save_leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - drop_hdr =3D &drop_leaf->hdr; - save_hdr =3D &save_leaf->hdr; + xfs_attr3_leaf_hdr_from_disk(&drophdr, drop_leaf); + xfs_attr3_leaf_hdr_from_disk(&savehdr, save_leaf); + entry =3D xfs_attr3_leaf_entryp(drop_leaf); =20 /* * Save last hashval from dying block for later Btree fixup. */ - drop_blk->hashval =3D be32_to_cpu( - drop_leaf->entries[be16_to_cpu(drop_leaf->hdr.count)-1].hashval); + drop_blk->hashval =3D be32_to_cpu(entry[drophdr.count - 1].hashval); =20 /* * Check if we need a temp buffer, or can we do it in place. * Note that we don't check "leaf" for holes because we will * always be dropping it, toosmall() decided that for us already. */ - if (save_hdr->holes =3D=3D 0) { + if (savehdr.holes =3D=3D 0) { /* * dest leaf has no holes, so we add there. May need * to make some room in the entry array. */ - if (xfs_attr_leaf_order(save_blk->bp, drop_blk->bp)) { - xfs_attr_leaf_moveents(drop_leaf, 0, save_leaf, 0, - be16_to_cpu(drop_hdr->count), mp); + if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, + drop_blk->bp, &drophdr)) { + xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + save_leaf, &savehdr, 0, + drophdr.count, mp); } else { - xfs_attr_leaf_moveents(drop_leaf, 0, save_leaf, - be16_to_cpu(save_hdr->count), - be16_to_cpu(drop_hdr->count), mp); + xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + save_leaf, &savehdr, + savehdr.count, drophdr.count, mp); } } else { /* * Destination has holes, so we make a temporary copy * of the leaf and add them both to that. */ - tmpbuffer =3D kmem_alloc(state->blocksize, KM_SLEEP); - ASSERT(tmpbuffer !=3D NULL); - memset(tmpbuffer, 0, state->blocksize); - tmp_leaf =3D (xfs_attr_leafblock_t *)tmpbuffer; - tmp_hdr =3D &tmp_leaf->hdr; - tmp_hdr->info =3D save_hdr->info; /* struct copy */ - tmp_hdr->count =3D 0; - tmp_hdr->firstused =3D cpu_to_be16(state->blocksize); - if (!tmp_hdr->firstused) { - tmp_hdr->firstused =3D cpu_to_be16( - state->blocksize - XFS_ATTR_LEAF_NAME_ALIGN); - } - tmp_hdr->usedbytes =3D 0; - if (xfs_attr_leaf_order(save_blk->bp, drop_blk->bp)) { - xfs_attr_leaf_moveents(drop_leaf, 0, tmp_leaf, 0, - be16_to_cpu(drop_hdr->count), mp); - xfs_attr_leaf_moveents(save_leaf, 0, tmp_leaf, - be16_to_cpu(tmp_leaf->hdr.count), - be16_to_cpu(save_hdr->count), mp); + struct xfs_attr_leafblock *tmp_leaf; + struct xfs_attr3_icleaf_hdr tmphdr; + + tmp_leaf =3D kmem_alloc(state->blocksize, KM_SLEEP); + memset(tmp_leaf, 0, state->blocksize); + memset(&tmphdr, 0, sizeof(tmphdr)); + + tmphdr.magic =3D savehdr.magic; + tmphdr.forw =3D savehdr.forw; + tmphdr.back =3D savehdr.back; + tmphdr.firstused =3D state->blocksize; + if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, + drop_blk->bp, &drophdr)) { + xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + tmp_leaf, &tmphdr, 0, + drophdr.count, mp); + xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, + tmp_leaf, &tmphdr, tmphdr.count, + savehdr.count, mp); } else { - xfs_attr_leaf_moveents(save_leaf, 0, tmp_leaf, 0, - be16_to_cpu(save_hdr->count), mp); - xfs_attr_leaf_moveents(drop_leaf, 0, tmp_leaf, - be16_to_cpu(tmp_leaf->hdr.count), - be16_to_cpu(drop_hdr->count), mp); + xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, + tmp_leaf, &tmphdr, 0, + savehdr.count, mp); + xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + tmp_leaf, &tmphdr, tmphdr.count, + drophdr.count, mp); } - memcpy((char *)save_leaf, (char *)tmp_leaf, state->blocksize); - kmem_free(tmpbuffer); + memcpy(save_leaf, tmp_leaf, state->blocksize); + savehdr =3D tmphdr; /* struct copy */ + kmem_free(tmp_leaf); } =20 + xfs_attr3_leaf_hdr_to_disk(save_leaf, &savehdr); xfs_trans_log_buf(state->args->trans, save_blk->bp, 0, state->blocksize - 1); =20 /* * Copy out last hashval in each block for B-tree code. */ - save_blk->hashval =3D be32_to_cpu( - save_leaf->entries[be16_to_cpu(save_leaf->hdr.count)-1].hashval); + entry =3D xfs_attr3_leaf_entryp(save_leaf); + save_blk->hashval =3D be32_to_cpu(entry[savehdr.count - 1].hashval); } =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -1806,31 +2020,33 @@ xfs_attr_leaf_unbalance(xfs_da_state_t *state, xfs_= da_state_blk_t *drop_blk, * Don't change the args->value unless we find the attribute. */ int -xfs_attr_leaf_lookup_int( - struct xfs_buf *bp, - xfs_da_args_t *args) +xfs_attr3_leaf_lookup_int( + struct xfs_buf *bp, + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_local_t *name_loc; - xfs_attr_leaf_name_remote_t *name_rmt; - int probe, span; - xfs_dahash_t hashval; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_entry *entries; + struct xfs_attr_leaf_name_local *name_loc; + struct xfs_attr_leaf_name_remote *name_rmt; + xfs_dahash_t hashval; + int probe; + int span; =20 trace_xfs_attr_leaf_lookup(args); =20 leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(be16_to_cpu(leaf->hdr.count) - < (XFS_LBSIZE(args->dp->i_mount)/8)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + entries =3D xfs_attr3_leaf_entryp(leaf); + ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); =20 /* * Binary search. (note: small blocks will skip this loop) */ hashval =3D args->hashval; - probe =3D span =3D be16_to_cpu(leaf->hdr.count) / 2; - for (entry =3D &leaf->entries[probe]; span > 4; - entry =3D &leaf->entries[probe]) { + probe =3D span =3D ichdr.count / 2; + for (entry =3D &entries[probe]; span > 4; entry =3D &entries[probe]) { span /=3D 2; if (be32_to_cpu(entry->hashval) < hashval) probe +=3D span; @@ -1839,35 +2055,31 @@ xfs_attr_leaf_lookup_int( else break; } - ASSERT((probe >=3D 0) && - (!leaf->hdr.count - || (probe < be16_to_cpu(leaf->hdr.count)))); - ASSERT((span <=3D 4) || (be32_to_cpu(entry->hashval) =3D=3D hashval)); + ASSERT(probe >=3D 0 && (!ichdr.count || probe < ichdr.count)); + ASSERT(span <=3D 4 || be32_to_cpu(entry->hashval) =3D=3D hashval); =20 /* * Since we may have duplicate hashval's, find the first matching * hashval in the leaf. */ - while ((probe > 0) && (be32_to_cpu(entry->hashval) >=3D hashval)) { + while (probe > 0 && be32_to_cpu(entry->hashval) >=3D hashval) { entry--; probe--; } - while ((probe < be16_to_cpu(leaf->hdr.count)) && - (be32_to_cpu(entry->hashval) < hashval)) { + while (probe < ichdr.count && + be32_to_cpu(entry->hashval) < hashval) { entry++; probe++; } - if ((probe =3D=3D be16_to_cpu(leaf->hdr.count)) || - (be32_to_cpu(entry->hashval) !=3D hashval)) { + if (probe =3D=3D ichdr.count || be32_to_cpu(entry->hashval) !=3D hashval)= { args->index =3D probe; - return(XFS_ERROR(ENOATTR)); + return XFS_ERROR(ENOATTR); } =20 /* * Duplicate keys may be present, so search all of them for a match. */ - for ( ; (probe < be16_to_cpu(leaf->hdr.count)) && - (be32_to_cpu(entry->hashval) =3D=3D hashval); + for (; probe < ichdr.count && (be32_to_cpu(entry->hashval) =3D=3D hashval= ); entry++, probe++) { /* * GROT: Add code to remove incomplete entries. @@ -1881,21 +2093,22 @@ xfs_attr_leaf_lookup_int( continue; } if (entry->flags & XFS_ATTR_LOCAL) { - name_loc =3D xfs_attr_leaf_name_local(leaf, probe); + name_loc =3D xfs_attr3_leaf_name_local(leaf, probe); if (name_loc->namelen !=3D args->namelen) continue; - if (memcmp(args->name, (char *)name_loc->nameval, args->namelen) !=3D 0) + if (memcmp(args->name, name_loc->nameval, + args->namelen) !=3D 0) continue; if (!xfs_attr_namesp_match(args->flags, entry->flags)) continue; args->index =3D probe; - return(XFS_ERROR(EEXIST)); + return XFS_ERROR(EEXIST); } else { - name_rmt =3D xfs_attr_leaf_name_remote(leaf, probe); + name_rmt =3D xfs_attr3_leaf_name_remote(leaf, probe); if (name_rmt->namelen !=3D args->namelen) continue; - if (memcmp(args->name, (char *)name_rmt->name, - args->namelen) !=3D 0) + if (memcmp(args->name, name_rmt->name, + args->namelen) !=3D 0) continue; if (!xfs_attr_namesp_match(args->flags, entry->flags)) continue; @@ -1903,11 +2116,11 @@ xfs_attr_leaf_lookup_int( args->rmtblkno =3D be32_to_cpu(name_rmt->valueblk); args->rmtblkcnt =3D XFS_B_TO_FSB(args->dp->i_mount, be32_to_cpu(name_rmt->valuelen)); - return(XFS_ERROR(EEXIST)); + return XFS_ERROR(EEXIST); } } args->index =3D probe; - return(XFS_ERROR(ENOATTR)); + return XFS_ERROR(ENOATTR); } =20 /* @@ -1915,40 +2128,40 @@ xfs_attr_leaf_lookup_int( * list structure. */ int -xfs_attr_leaf_getvalue( - struct xfs_buf *bp, - xfs_da_args_t *args) +xfs_attr3_leaf_getvalue( + struct xfs_buf *bp, + struct xfs_da_args *args) { - int valuelen; - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_local_t *name_loc; - xfs_attr_leaf_name_remote_t *name_rmt; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_local *name_loc; + struct xfs_attr_leaf_name_remote *name_rmt; + int valuelen; =20 leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(be16_to_cpu(leaf->hdr.count) - < (XFS_LBSIZE(args->dp->i_mount)/8)); - ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); + ASSERT(args->index < ichdr.count); =20 - entry =3D &leaf->entries[args->index]; + entry =3D &xfs_attr3_leaf_entryp(leaf)[args->index]; if (entry->flags & XFS_ATTR_LOCAL) { - name_loc =3D xfs_attr_leaf_name_local(leaf, args->index); + name_loc =3D xfs_attr3_leaf_name_local(leaf, args->index); ASSERT(name_loc->namelen =3D=3D args->namelen); ASSERT(memcmp(args->name, name_loc->nameval, args->namelen) =3D=3D 0); valuelen =3D be16_to_cpu(name_loc->valuelen); if (args->flags & ATTR_KERNOVAL) { args->valuelen =3D valuelen; - return(0); + return 0; } if (args->valuelen < valuelen) { args->valuelen =3D valuelen; - return(XFS_ERROR(ERANGE)); + return XFS_ERROR(ERANGE); } args->valuelen =3D valuelen; memcpy(args->value, &name_loc->nameval[args->namelen], valuelen); } else { - name_rmt =3D xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt =3D xfs_attr3_leaf_name_remote(leaf, args->index); ASSERT(name_rmt->namelen =3D=3D args->namelen); ASSERT(memcmp(args->name, name_rmt->name, args->namelen) =3D=3D 0); valuelen =3D be32_to_cpu(name_rmt->valuelen); @@ -1956,15 +2169,15 @@ xfs_attr_leaf_getvalue( args->rmtblkcnt =3D XFS_B_TO_FSB(args->dp->i_mount, valuelen); if (args->flags & ATTR_KERNOVAL) { args->valuelen =3D valuelen; - return(0); + return 0; } if (args->valuelen < valuelen) { args->valuelen =3D valuelen; - return(XFS_ERROR(ERANGE)); + return XFS_ERROR(ERANGE); } args->valuelen =3D valuelen; } - return(0); + return 0; } =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -1977,13 +2190,21 @@ xfs_attr_leaf_getvalue( */ /*ARGSUSED*/ STATIC void -xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, - xfs_attr_leafblock_t *leaf_d, int start_d, - int count, xfs_mount_t *mp) +xfs_attr3_leaf_moveents( + struct xfs_attr_leafblock *leaf_s, + struct xfs_attr3_icleaf_hdr *ichdr_s, + int start_s, + struct xfs_attr_leafblock *leaf_d, + struct xfs_attr3_icleaf_hdr *ichdr_d, + int start_d, + int count, + struct xfs_mount *mp) { - xfs_attr_leaf_hdr_t *hdr_s, *hdr_d; - xfs_attr_leaf_entry_t *entry_s, *entry_d; - int desti, tmp, i; + struct xfs_attr_leaf_entry *entry_s; + struct xfs_attr_leaf_entry *entry_d; + int desti; + int tmp; + int i; =20 /* * Check for nothing to do. @@ -1994,45 +2215,41 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s= , int start_s, /* * Set up environment. */ - ASSERT(leaf_s->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(leaf_d->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - hdr_s =3D &leaf_s->hdr; - hdr_d =3D &leaf_d->hdr; - ASSERT((be16_to_cpu(hdr_s->count) > 0) && - (be16_to_cpu(hdr_s->count) < (XFS_LBSIZE(mp)/8))); - ASSERT(be16_to_cpu(hdr_s->firstused) >=3D - ((be16_to_cpu(hdr_s->count) - * sizeof(*entry_s))+sizeof(*hdr_s))); - ASSERT(be16_to_cpu(hdr_d->count) < (XFS_LBSIZE(mp)/8)); - ASSERT(be16_to_cpu(hdr_d->firstused) >=3D - ((be16_to_cpu(hdr_d->count) - * sizeof(*entry_d))+sizeof(*hdr_d))); - - ASSERT(start_s < be16_to_cpu(hdr_s->count)); - ASSERT(start_d <=3D be16_to_cpu(hdr_d->count)); - ASSERT(count <=3D be16_to_cpu(hdr_s->count)); + ASSERT(ichdr_s->magic =3D=3D XFS_ATTR_LEAF_MAGIC || + ichdr_s->magic =3D=3D XFS_ATTR3_LEAF_MAGIC); + ASSERT(ichdr_s->magic =3D=3D ichdr_d->magic); + ASSERT(ichdr_s->count > 0 && ichdr_s->count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr_s->firstused >=3D (ichdr_s->count * sizeof(*entry_s)) + + xfs_attr3_leaf_hdr_size(leaf_s)); + ASSERT(ichdr_d->count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr_d->firstused >=3D (ichdr_d->count * sizeof(*entry_d)) + + xfs_attr3_leaf_hdr_size(leaf_d)); + + ASSERT(start_s < ichdr_s->count); + ASSERT(start_d <=3D ichdr_d->count); + ASSERT(count <=3D ichdr_s->count); + =20 /* * Move the entries in the destination leaf up to make a hole? */ - if (start_d < be16_to_cpu(hdr_d->count)) { - tmp =3D be16_to_cpu(hdr_d->count) - start_d; + if (start_d < ichdr_d->count) { + tmp =3D ichdr_d->count - start_d; tmp *=3D sizeof(xfs_attr_leaf_entry_t); - entry_s =3D &leaf_d->entries[start_d]; - entry_d =3D &leaf_d->entries[start_d + count]; - memmove((char *)entry_d, (char *)entry_s, tmp); + entry_s =3D &xfs_attr3_leaf_entryp(leaf_d)[start_d]; + entry_d =3D &xfs_attr3_leaf_entryp(leaf_d)[start_d + count]; + memmove(entry_d, entry_s, tmp); } =20 /* * Copy all entry's in the same (sorted) order, * but allocate attribute info packed and in sequence. */ - entry_s =3D &leaf_s->entries[start_s]; - entry_d =3D &leaf_d->entries[start_d]; + entry_s =3D &xfs_attr3_leaf_entryp(leaf_s)[start_s]; + entry_d =3D &xfs_attr3_leaf_entryp(leaf_d)[start_d]; desti =3D start_d; for (i =3D 0; i < count; entry_s++, entry_d++, desti++, i++) { - ASSERT(be16_to_cpu(entry_s->nameidx) - >=3D be16_to_cpu(hdr_s->firstused)); + ASSERT(be16_to_cpu(entry_s->nameidx) >=3D ichdr_s->firstused); tmp =3D xfs_attr_leaf_entsize(leaf_s, start_s + i); #ifdef GROT /* @@ -2041,36 +2258,34 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s= , int start_s, * off for 6.2, should be revisited later. */ if (entry_s->flags & XFS_ATTR_INCOMPLETE) { /* skip partials? */ - memset(xfs_attr_leaf_name(leaf_s, start_s + i), 0, tmp); - be16_add_cpu(&hdr_s->usedbytes, -tmp); - be16_add_cpu(&hdr_s->count, -1); + memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp); + ichdr_s->usedbytes -=3D tmp; + ichdr_s->count -=3D 1; entry_d--; /* to compensate for ++ in loop hdr */ desti--; if ((start_s + i) < offset) result++; /* insertion index adjustment */ } else { #endif /* GROT */ - be16_add_cpu(&hdr_d->firstused, -tmp); + ichdr_d->firstused -=3D tmp; /* both on-disk, don't endian flip twice */ entry_d->hashval =3D entry_s->hashval; - /* both on-disk, don't endian flip twice */ - entry_d->nameidx =3D hdr_d->firstused; + entry_d->nameidx =3D cpu_to_be16(ichdr_d->firstused); entry_d->flags =3D entry_s->flags; ASSERT(be16_to_cpu(entry_d->nameidx) + tmp <=3D XFS_LBSIZE(mp)); - memmove(xfs_attr_leaf_name(leaf_d, desti), - xfs_attr_leaf_name(leaf_s, start_s + i), tmp); + memmove(xfs_attr3_leaf_name(leaf_d, desti), + xfs_attr3_leaf_name(leaf_s, start_s + i), tmp); ASSERT(be16_to_cpu(entry_s->nameidx) + tmp <=3D XFS_LBSIZE(mp)); - memset(xfs_attr_leaf_name(leaf_s, start_s + i), 0, tmp); - be16_add_cpu(&hdr_s->usedbytes, -tmp); - be16_add_cpu(&hdr_d->usedbytes, tmp); - be16_add_cpu(&hdr_s->count, -1); - be16_add_cpu(&hdr_d->count, 1); - tmp =3D be16_to_cpu(hdr_d->count) - * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t); - ASSERT(be16_to_cpu(hdr_d->firstused) >=3D tmp); + memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp); + ichdr_s->usedbytes -=3D tmp; + ichdr_d->usedbytes +=3D tmp; + ichdr_s->count -=3D 1; + ichdr_d->count +=3D 1; + tmp =3D ichdr_d->count * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf_d); + ASSERT(ichdr_d->firstused >=3D tmp); #ifdef GROT } #endif /* GROT */ @@ -2079,71 +2294,40 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s= , int start_s, /* * Zero out the entries we just copied. */ - if (start_s =3D=3D be16_to_cpu(hdr_s->count)) { + if (start_s =3D=3D ichdr_s->count) { tmp =3D count * sizeof(xfs_attr_leaf_entry_t); - entry_s =3D &leaf_s->entries[start_s]; + entry_s =3D &xfs_attr3_leaf_entryp(leaf_s)[start_s]; ASSERT(((char *)entry_s + tmp) <=3D ((char *)leaf_s + XFS_LBSIZE(mp))); - memset((char *)entry_s, 0, tmp); + memset(entry_s, 0, tmp); } else { /* * Move the remaining entries down to fill the hole, * then zero the entries at the top. */ - tmp =3D be16_to_cpu(hdr_s->count) - count; - tmp *=3D sizeof(xfs_attr_leaf_entry_t); - entry_s =3D &leaf_s->entries[start_s + count]; - entry_d =3D &leaf_s->entries[start_s]; - memmove((char *)entry_d, (char *)entry_s, tmp); + tmp =3D (ichdr_s->count - count) - sizeof(xfs_attr_leaf_entry_t); + entry_s =3D &xfs_attr3_leaf_entryp(leaf_s)[start_s + count]; + entry_d =3D &xfs_attr3_leaf_entryp(leaf_s)[start_s]; + memmove(entry_d, entry_s, tmp); =20 tmp =3D count * sizeof(xfs_attr_leaf_entry_t); - entry_s =3D &leaf_s->entries[be16_to_cpu(hdr_s->count)]; + entry_s =3D &xfs_attr3_leaf_entryp(leaf_s)[ichdr_s->count]; ASSERT(((char *)entry_s + tmp) <=3D ((char *)leaf_s + XFS_LBSIZE(mp))); - memset((char *)entry_s, 0, tmp); + memset(entry_s, 0, tmp); } =20 /* * Fill in the freemap information */ - hdr_d->freemap[0].base =3D cpu_to_be16(sizeof(xfs_attr_leaf_hdr_t)); - be16_add_cpu(&hdr_d->freemap[0].base, be16_to_cpu(hdr_d->count) * - sizeof(xfs_attr_leaf_entry_t)); - hdr_d->freemap[0].size =3D cpu_to_be16(be16_to_cpu(hdr_d->firstused) - - be16_to_cpu(hdr_d->freemap[0].base)); - hdr_d->freemap[1].base =3D 0; - hdr_d->freemap[2].base =3D 0; - hdr_d->freemap[1].size =3D 0; - hdr_d->freemap[2].size =3D 0; - hdr_s->holes =3D 1; /* leaf may not be compact */ -} - -/* - * Compare two leaf blocks "order". - * Return 0 unless leaf2 should go before leaf1. - */ -int -xfs_attr_leaf_order( - struct xfs_buf *leaf1_bp, - struct xfs_buf *leaf2_bp) -{ - xfs_attr_leafblock_t *leaf1, *leaf2; - - leaf1 =3D leaf1_bp->b_addr; - leaf2 =3D leaf2_bp->b_addr; - ASSERT((leaf1->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)) && - (leaf2->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC))); - if ((be16_to_cpu(leaf1->hdr.count) > 0) && - (be16_to_cpu(leaf2->hdr.count) > 0) && - ((be32_to_cpu(leaf2->entries[0].hashval) < - be32_to_cpu(leaf1->entries[0].hashval)) || - (be32_to_cpu(leaf2->entries[ - be16_to_cpu(leaf2->hdr.count)-1].hashval) < - be32_to_cpu(leaf1->entries[ - be16_to_cpu(leaf1->hdr.count)-1].hashval)))) { - return(1); - } - return(0); + ichdr_d->freemap[0].base =3D xfs_attr3_leaf_hdr_size(leaf_d); + ichdr_d->freemap[0].base +=3D ichdr_d->count * sizeof(xfs_attr_leaf_entry= _t); + ichdr_d->freemap[0].size =3D ichdr_d->firstused - ichdr_d->freemap[0].bas= e; + ichdr_d->freemap[1].base =3D 0; + ichdr_d->freemap[2].base =3D 0; + ichdr_d->freemap[1].size =3D 0; + ichdr_d->freemap[2].size =3D 0; + ichdr_s->holes =3D 1; /* leaf may not be compact */ } =20 /* @@ -2154,15 +2338,16 @@ xfs_attr_leaf_lasthash( struct xfs_buf *bp, int *count) { - xfs_attr_leafblock_t *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entries; =20 - leaf =3D bp->b_addr; - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, bp->b_addr); + entries =3D xfs_attr3_leaf_entryp(bp->b_addr); if (count) - *count =3D be16_to_cpu(leaf->hdr.count); - if (!leaf->hdr.count) - return(0); - return be32_to_cpu(leaf->entries[be16_to_cpu(leaf->hdr.count)-1].hashval); + *count =3D ichdr.count; + if (!ichdr.count) + return 0; + return be32_to_cpu(entries[ichdr.count - 1].hashval); } =20 /* @@ -2172,20 +2357,21 @@ xfs_attr_leaf_lasthash( STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) { + struct xfs_attr_leaf_entry *entries; xfs_attr_leaf_name_local_t *name_loc; xfs_attr_leaf_name_remote_t *name_rmt; int size; =20 - ASSERT(leaf->hdr.info.magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - if (leaf->entries[index].flags & XFS_ATTR_LOCAL) { - name_loc =3D xfs_attr_leaf_name_local(leaf, index); + entries =3D xfs_attr3_leaf_entryp(leaf); + if (entries[index].flags & XFS_ATTR_LOCAL) { + name_loc =3D xfs_attr3_leaf_name_local(leaf, index); size =3D xfs_attr_leaf_entsize_local(name_loc->namelen, be16_to_cpu(name_loc->valuelen)); } else { - name_rmt =3D xfs_attr_leaf_name_remote(leaf, index); + name_rmt =3D xfs_attr3_leaf_name_remote(leaf, index); size =3D xfs_attr_leaf_entsize_remote(name_rmt->namelen); } - return(size); + return size; } =20 /* @@ -2210,7 +2396,7 @@ xfs_attr_leaf_newentsize(int namelen, int valuelen, i= nt blocksize, int *local) *local =3D 0; } } - return(size); + return size; } =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -2221,14 +2407,16 @@ xfs_attr_leaf_newentsize(int namelen, int valuelen,= int blocksize, int *local) * Clear the INCOMPLETE flag on an entry in a leaf block. */ int -xfs_attr_leaf_clearflag(xfs_da_args_t *args) +xfs_attr3_leaf_clearflag( + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_remote_t *name_rmt; - struct xfs_buf *bp; - int error; + struct xfs_attr_leafblock *leaf; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_buf *bp; + int error; #ifdef DEBUG + struct xfs_attr3_icleaf_hdr ichdr; xfs_attr_leaf_name_local_t *name_loc; int namelen; char *name; @@ -2238,23 +2426,25 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) /* * Set up the operation. */ - error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error =3D xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp= ); if (error) return(error); =20 leaf =3D bp->b_addr; - ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); - ASSERT(args->index >=3D 0); - entry =3D &leaf->entries[ args->index ]; + entry =3D &xfs_attr3_leaf_entryp(leaf)[args->index]; ASSERT(entry->flags & XFS_ATTR_INCOMPLETE); =20 #ifdef DEBUG + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + ASSERT(args->index < ichdr.count); + ASSERT(args->index >=3D 0); + if (entry->flags & XFS_ATTR_LOCAL) { - name_loc =3D xfs_attr_leaf_name_local(leaf, args->index); + name_loc =3D xfs_attr3_leaf_name_local(leaf, args->index); namelen =3D name_loc->namelen; name =3D (char *)name_loc->nameval; } else { - name_rmt =3D xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt =3D xfs_attr3_leaf_name_remote(leaf, args->index); namelen =3D name_rmt->namelen; name =3D (char *)name_rmt->name; } @@ -2269,7 +2459,7 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) =20 if (args->rmtblkno) { ASSERT((entry->flags & XFS_ATTR_LOCAL) =3D=3D 0); - name_rmt =3D xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt =3D xfs_attr3_leaf_name_remote(leaf, args->index); name_rmt->valueblk =3D cpu_to_be32(args->rmtblkno); name_rmt->valuelen =3D cpu_to_be32(args->valuelen); xfs_trans_log_buf(args->trans, bp, @@ -2286,34 +2476,41 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) * Set the INCOMPLETE flag on an entry in a leaf block. */ int -xfs_attr_leaf_setflag(xfs_da_args_t *args) +xfs_attr3_leaf_setflag( + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_remote_t *name_rmt; - struct xfs_buf *bp; + struct xfs_attr_leafblock *leaf; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_buf *bp; int error; +#ifdef DEBUG + struct xfs_attr3_icleaf_hdr ichdr; +#endif =20 trace_xfs_attr_leaf_setflag(args); =20 /* * Set up the operation. */ - error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error =3D xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp= ); if (error) return(error); =20 leaf =3D bp->b_addr; - ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); +#ifdef DEBUG + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + ASSERT(args->index < ichdr.count); ASSERT(args->index >=3D 0); - entry =3D &leaf->entries[ args->index ]; +#endif + entry =3D &xfs_attr3_leaf_entryp(leaf)[args->index]; =20 ASSERT((entry->flags & XFS_ATTR_INCOMPLETE) =3D=3D 0); entry->flags |=3D XFS_ATTR_INCOMPLETE; xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); if ((entry->flags & XFS_ATTR_LOCAL) =3D=3D 0) { - name_rmt =3D xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt =3D xfs_attr3_leaf_name_remote(leaf, args->index); name_rmt->valueblk =3D 0; name_rmt->valuelen =3D 0; xfs_trans_log_buf(args->trans, bp, @@ -2334,14 +2531,20 @@ xfs_attr_leaf_setflag(xfs_da_args_t *args) * Note that they could be in different blocks, or in the same block. */ int -xfs_attr_leaf_flipflags(xfs_da_args_t *args) +xfs_attr3_leaf_flipflags( + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf1, *leaf2; - xfs_attr_leaf_entry_t *entry1, *entry2; - xfs_attr_leaf_name_remote_t *name_rmt; - struct xfs_buf *bp1, *bp2; + struct xfs_attr_leafblock *leaf1; + struct xfs_attr_leafblock *leaf2; + struct xfs_attr_leaf_entry *entry1; + struct xfs_attr_leaf_entry *entry2; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_buf *bp1; + struct xfs_buf *bp2; int error; #ifdef DEBUG + struct xfs_attr3_icleaf_hdr ichdr1; + struct xfs_attr3_icleaf_hdr ichdr2; xfs_attr_leaf_name_local_t *name_loc; int namelen1, namelen2; char *name1, *name2; @@ -2352,7 +2555,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) /* * Read the block containing the "old" attr */ - error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp1= ); + error =3D xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp= 1); if (error) return error; =20 @@ -2360,7 +2563,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) * Read the block containing the "new" attr, if it is different */ if (args->blkno2 !=3D args->blkno) { - error =3D xfs_attr_leaf_read(args->trans, args->dp, args->blkno2, + error =3D xfs_attr3_leaf_read(args->trans, args->dp, args->blkno2, -1, &bp2); if (error) return error; @@ -2369,31 +2572,35 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) } =20 leaf1 =3D bp1->b_addr; - ASSERT(args->index < be16_to_cpu(leaf1->hdr.count)); - ASSERT(args->index >=3D 0); - entry1 =3D &leaf1->entries[ args->index ]; + entry1 =3D &xfs_attr3_leaf_entryp(leaf1)[args->index]; =20 leaf2 =3D bp2->b_addr; - ASSERT(args->index2 < be16_to_cpu(leaf2->hdr.count)); - ASSERT(args->index2 >=3D 0); - entry2 =3D &leaf2->entries[ args->index2 ]; + entry2 =3D &xfs_attr3_leaf_entryp(leaf2)[args->index2]; =20 #ifdef DEBUG + xfs_attr3_leaf_hdr_from_disk(&ichdr1, leaf1); + ASSERT(args->index < ichdr1.count); + ASSERT(args->index >=3D 0); + + xfs_attr3_leaf_hdr_from_disk(&ichdr2, leaf2); + ASSERT(args->index2 < ichdr2.count); + ASSERT(args->index2 >=3D 0); + if (entry1->flags & XFS_ATTR_LOCAL) { - name_loc =3D xfs_attr_leaf_name_local(leaf1, args->index); + name_loc =3D xfs_attr3_leaf_name_local(leaf1, args->index); namelen1 =3D name_loc->namelen; name1 =3D (char *)name_loc->nameval; } else { - name_rmt =3D xfs_attr_leaf_name_remote(leaf1, args->index); + name_rmt =3D xfs_attr3_leaf_name_remote(leaf1, args->index); namelen1 =3D name_rmt->namelen; name1 =3D (char *)name_rmt->name; } if (entry2->flags & XFS_ATTR_LOCAL) { - name_loc =3D xfs_attr_leaf_name_local(leaf2, args->index2); + name_loc =3D xfs_attr3_leaf_name_local(leaf2, args->index2); namelen2 =3D name_loc->namelen; name2 =3D (char *)name_loc->nameval; } else { - name_rmt =3D xfs_attr_leaf_name_remote(leaf2, args->index2); + name_rmt =3D xfs_attr3_leaf_name_remote(leaf2, args->index2); namelen2 =3D name_rmt->namelen; name2 =3D (char *)name_rmt->name; } @@ -2410,7 +2617,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) XFS_DA_LOGRANGE(leaf1, entry1, sizeof(*entry1))); if (args->rmtblkno) { ASSERT((entry1->flags & XFS_ATTR_LOCAL) =3D=3D 0); - name_rmt =3D xfs_attr_leaf_name_remote(leaf1, args->index); + name_rmt =3D xfs_attr3_leaf_name_remote(leaf1, args->index); name_rmt->valueblk =3D cpu_to_be32(args->rmtblkno); name_rmt->valuelen =3D cpu_to_be32(args->valuelen); xfs_trans_log_buf(args->trans, bp1, @@ -2421,7 +2628,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) xfs_trans_log_buf(args->trans, bp2, XFS_DA_LOGRANGE(leaf2, entry2, sizeof(*entry2))); if ((entry2->flags & XFS_ATTR_LOCAL) =3D=3D 0) { - name_rmt =3D xfs_attr_leaf_name_remote(leaf2, args->index2); + name_rmt =3D xfs_attr3_leaf_name_remote(leaf2, args->index2); name_rmt->valueblk =3D 0; name_rmt->valuelen =3D 0; xfs_trans_log_buf(args->trans, bp2, @@ -2433,5 +2640,5 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) */ error =3D xfs_trans_roll(&args->trans, args->dp); =20 - return(error); + return error; } diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index 3176626..ea16bee 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -120,14 +120,14 @@ xfs_da3_node_hdr_from_disk( to->forw =3D be32_to_cpu(hdr3->info.hdr.forw); to->back =3D be32_to_cpu(hdr3->info.hdr.back); to->magic =3D be16_to_cpu(hdr3->info.hdr.magic); - to->count =3D be16_to_cpu(hdr3->count); + to->count =3D be16_to_cpu(hdr3->__count); to->level =3D be16_to_cpu(hdr3->__level); return; } to->forw =3D be32_to_cpu(from->hdr.info.forw); to->back =3D be32_to_cpu(from->hdr.info.back); to->magic =3D be16_to_cpu(from->hdr.info.magic); - to->count =3D be16_to_cpu(from->hdr.count); + to->count =3D be16_to_cpu(from->hdr.__count); to->level =3D be16_to_cpu(from->hdr.__level); } =20 @@ -145,14 +145,14 @@ xfs_da3_node_hdr_to_disk( hdr3->info.hdr.forw =3D cpu_to_be32(from->forw); hdr3->info.hdr.back =3D cpu_to_be32(from->back); hdr3->info.hdr.magic =3D cpu_to_be16(from->magic); - hdr3->count =3D cpu_to_be16(from->count); + hdr3->__count =3D cpu_to_be16(from->count); hdr3->__level =3D cpu_to_be16(from->level); return; } to->hdr.info.forw =3D cpu_to_be32(from->forw); to->hdr.info.back =3D cpu_to_be32(from->back); to->hdr.info.magic =3D cpu_to_be16(from->magic); - to->hdr.count =3D cpu_to_be16(from->count); + to->hdr.__count =3D cpu_to_be16(from->count); to->hdr.__level =3D cpu_to_be16(from->level); } =20 @@ -247,7 +247,7 @@ xfs_da3_node_read_verify( break; return; case XFS_ATTR_LEAF_MAGIC: - bp->b_ops =3D &xfs_attr_leaf_buf_ops; + bp->b_ops =3D &xfs_attr3_leaf_buf_ops; bp->b_ops->verify_read(bp); return; case XFS_DIR2_LEAFN_MAGIC: @@ -378,7 +378,7 @@ xfs_da3_split( */ switch (oldblk->magic) { case XFS_ATTR_LEAF_MAGIC: - error =3D xfs_attr_leaf_split(state, oldblk, newblk); + error =3D xfs_attr3_leaf_split(state, oldblk, newblk); if ((error !=3D 0) && (error !=3D ENOSPC)) { return(error); /* GROT: attr is inconsistent */ } @@ -393,12 +393,12 @@ xfs_da3_split( if (state->inleaf) { state->extraafter =3D 0; /* before newblk */ trace_xfs_attr_leaf_split_before(state->args); - error =3D xfs_attr_leaf_split(state, oldblk, + error =3D xfs_attr3_leaf_split(state, oldblk, &state->extrablk); } else { state->extraafter =3D 1; /* after newblk */ trace_xfs_attr_leaf_split_after(state->args); - error =3D xfs_attr_leaf_split(state, newblk, + error =3D xfs_attr3_leaf_split(state, newblk, &state->extrablk); } if (error) @@ -938,12 +938,12 @@ xfs_da3_join( */ switch (drop_blk->magic) { case XFS_ATTR_LEAF_MAGIC: - error =3D xfs_attr_leaf_toosmall(state, &action); + error =3D xfs_attr3_leaf_toosmall(state, &action); if (error) return(error); if (action =3D=3D 0) return(0); - xfs_attr_leaf_unbalance(state, drop_blk, save_blk); + xfs_attr3_leaf_unbalance(state, drop_blk, save_blk); break; case XFS_DIR2_LEAFN_MAGIC: error =3D xfs_dir2_leafn_toosmall(state, &action); @@ -999,7 +999,8 @@ xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo= *blkinfo, __u16 level) if (level =3D=3D 1) { ASSERT(magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || - magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC) || + magic =3D=3D cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)); } else { ASSERT(magic =3D=3D cpu_to_be16(XFS_DA_NODE_MAGIC) || magic =3D=3D cpu_to_be16(XFS_DA3_NODE_MAGIC)); @@ -1456,7 +1457,9 @@ xfs_da3_node_lookup_int( curr =3D blk->bp->b_addr; blk->magic =3D be16_to_cpu(curr->magic); =20 - if (blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC) { + if (blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC || + blk->magic =3D=3D XFS_ATTR3_LEAF_MAGIC) { + blk->magic =3D XFS_ATTR_LEAF_MAGIC; blk->hashval =3D xfs_attr_leaf_lasthash(blk->bp, NULL); break; } @@ -1536,7 +1539,7 @@ xfs_da3_node_lookup_int( retval =3D xfs_dir2_leafn_lookup_int(blk->bp, args, &blk->index, state); } else if (blk->magic =3D=3D XFS_ATTR_LEAF_MAGIC) { - retval =3D xfs_attr_leaf_lookup_int(blk->bp, args); + retval =3D xfs_attr3_leaf_lookup_int(blk->bp, args); blk->index =3D args->index; args->blkno =3D blk->blkno; } else { @@ -1848,7 +1851,8 @@ xfs_da3_path_shift( info->magic =3D=3D cpu_to_be16(XFS_DA3_NODE_MAGIC) || info->magic =3D=3D cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || info->magic =3D=3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || - info->magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + info->magic =3D=3D cpu_to_be16(XFS_ATTR_LEAF_MAGIC) || + info->magic =3D=3D cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)); =20 =20 /* @@ -1870,6 +1874,7 @@ xfs_da3_path_shift( blkno =3D be32_to_cpu(btree[blk->index].before); break; case XFS_ATTR_LEAF_MAGIC: + case XFS_ATTR3_LEAF_MAGIC: blk->magic =3D XFS_ATTR_LEAF_MAGIC; ASSERT(level =3D=3D path->active-1); blk->index =3D 0; @@ -2602,6 +2607,7 @@ xfs_da_read_buf( XFS_TEST_ERROR((magic !=3D XFS_DA_NODE_MAGIC) && (magic !=3D XFS_DA3_NODE_MAGIC) && (magic !=3D XFS_ATTR_LEAF_MAGIC) && + (magic !=3D XFS_ATTR3_LEAF_MAGIC) && (magic !=3D XFS_DIR2_LEAF1_MAGIC) && (magic !=3D XFS_DIR3_LEAF1_MAGIC) && (magic !=3D XFS_DIR2_LEAFN_MAGIC) && diff --git a/repair/attr_repair.c b/repair/attr_repair.c index ec7f4a3..033b7fe 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -381,7 +381,7 @@ process_leaf_attr_local( { xfs_attr_leaf_name_local_t *local; =20 - local =3D xfs_attr_leaf_name_local(leaf, i); + local =3D xfs_attr3_leaf_name_local(leaf, i); if (local->namelen =3D=3D 0 || namecheck((char *)&local->nameval[0],=20 local->namelen)) { do_warn( @@ -435,7 +435,7 @@ process_leaf_attr_remote( xfs_attr_leaf_name_remote_t *remotep; char* value; =20 - remotep =3D xfs_attr_leaf_name_remote(leaf, i); + remotep =3D xfs_attr3_leaf_name_remote(leaf, i); =20 if (remotep->namelen =3D=3D 0 || namecheck((char *)&remotep->name[0],=20 remotep->namelen) ||=20 =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00xfsprogs-crc-patchset-v2/xfs-attr-rmt-move=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00000= 0600=000001750=000001750=0000000047642=0012132011546=00017513=00 0=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar = =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfs: split remote = attribute code out =46rom: Dave Chinner Adding CRC support to remote attributes adds a significant amount of remote attribute specific code. Split the existing remote attribute code out into it's own file so that all the relevant remote attribute code is in a single, easy to find place. Signed-off-by: Dave Chinner --- include/libxfs.h | 1 + include/{xfs.h =3D> xfs_attr_remote.h} | 23 +-- libxfs/Makefile | 2 +- libxfs/xfs.h | 9 +- libxfs/xfs_attr.c | 296 ------------------------------= -- libxfs/xfs_attr_remote.c | 306 ++++++++++++++++++++++++++++++= ++++ 6 files changed, 322 insertions(+), 315 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index 41cb585..972d850 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -589,6 +589,7 @@ extern unsigned long libxfs_physmem(void); /* in kiloby= tes */ #include =20 #include +#include #include #include #include diff --git a/include/xfs.h b/include/xfs_attr_remote.h similarity index 69% copy from include/xfs.h copy to include/xfs_attr_remote.h index e32c4a8..b4be90e 100644 --- a/include/xfs.h +++ b/include/xfs_attr_remote.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2013 Red Hat, Inc. * * This program is free software; you can redistribute it and/or modify it * under the terms of version 2.1 of the GNU Lesser General Public License @@ -20,21 +20,12 @@ * License along with this program; if not, write the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, * USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ */ -#ifndef __XFS_H__ -#define __XFS_H__ +#ifndef __XFS_ATTR_REMOTE_H__ +#define __XFS_ATTR_REMOTE_H__ =20 -#include -#include -#include +int xfs_attr_rmtval_get(struct xfs_da_args *args); +int xfs_attr_rmtval_set(struct xfs_da_args *args); +int xfs_attr_rmtval_remove(struct xfs_da_args *args); =20 -#endif /* __XFS_H__ */ +#endif /* __XFS_ATTR_REMOTE_H__ */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 75f365c..d0b483d 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -16,7 +16,7 @@ CFILES =3D cache.c init.c kmem.c logitem.c radix-tree.c r= dwr.c trans.c util.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ - xfs_mount.c xfs_rtalloc.c xfs_trans.c xfs_attr.c \ + xfs_mount.c xfs_rtalloc.c xfs_trans.c xfs_attr.c xfs_attr_remote.c \ crc32.c xfs_symlink.c =20 CFILES +=3D $(PKG_PLATFORM).c diff --git a/libxfs/xfs.h b/libxfs/xfs.h index b3b45bb..c69dc4a 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -180,14 +180,19 @@ roundup_pow_of_two(uint v) #define XFS_BUF_SET_VTYPE_REF(a,b,c) ((void) 0) #define XFS_BUF_SET_BDSTRAT_FUNC(a,b) ((void) 0) =20 -#define xfs_incore(bt,blkno,len,lockit) 0 +/* avoid gcc warning */ +#define xfs_incore(bt,blkno,len,lockit) ({ \ + typeof(blkno) __foo =3D (blkno); \ + (blkno) =3D __foo; \ + NULL; \ +}) #define xfs_buf_relse(bp) libxfs_putbuf(bp) #define xfs_read_buf(mp,devp,blkno,len,f,bpp) \ (*(bpp) =3D libxfs_readbuf((devp), \ (blkno), (len), 1), 0) #define xfs_buf_get(devp,blkno,len,f) \ (libxfs_getbuf((devp), (blkno), (len))) -#define xfs_bwrite(mp,bp) libxfs_writebuf((bp), 0) +#define xfs_bwrite(bp) libxfs_writebuf((bp), 0) =20 #define XBRW_READ LIBXFS_BREAD #define XBRW_WRITE LIBXFS_BWRITE diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index 4429cb7..cfc2f4b 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -49,13 +49,6 @@ STATIC int xfs_attr_node_removename(xfs_da_args_t *args); STATIC int xfs_attr_fillstate(xfs_da_state_t *state); STATIC int xfs_attr_refillstate(xfs_da_state_t *state); =20 -/* - * Routines to manipulate out-of-line attribute values. - */ -STATIC int xfs_attr_rmtval_set(xfs_da_args_t *args); -STATIC int xfs_attr_rmtval_remove(xfs_da_args_t *args); - -#define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ =20 STATIC int xfs_attr_name_to_xname( @@ -1518,292 +1511,3 @@ xfs_attr_node_get(xfs_da_args_t *args) xfs_da_state_free(state); return(retval); } - -/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D - * External routines for manipulating out-of-line attribute values. - *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/ - -/* - * Read the value associated with an attribute from the out-of-line buffer - * that we stored it in. - */ -int -xfs_attr_rmtval_get(xfs_da_args_t *args) -{ - xfs_bmbt_irec_t map[ATTR_RMTVALUE_MAPSIZE]; - xfs_mount_t *mp; - xfs_daddr_t dblkno; - void *dst; - xfs_buf_t *bp; - int nmap, error, tmp, valuelen, blkcnt, i; - xfs_dablk_t lblkno; - - trace_xfs_attr_rmtval_get(args); - - ASSERT(!(args->flags & ATTR_KERNOVAL)); - - mp =3D args->dp->i_mount; - dst =3D args->value; - valuelen =3D args->valuelen; - lblkno =3D args->rmtblkno; - while (valuelen > 0) { - nmap =3D ATTR_RMTVALUE_MAPSIZE; - error =3D xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, - args->rmtblkcnt, map, &nmap, - XFS_BMAPI_ATTRFORK); - if (error) - return(error); - ASSERT(nmap >=3D 1); - - for (i =3D 0; (i < nmap) && (valuelen > 0); i++) { - ASSERT((map[i].br_startblock !=3D DELAYSTARTBLOCK) && - (map[i].br_startblock !=3D HOLESTARTBLOCK)); - dblkno =3D XFS_FSB_TO_DADDR(mp, map[i].br_startblock); - blkcnt =3D XFS_FSB_TO_BB(mp, map[i].br_blockcount); - error =3D xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, - dblkno, blkcnt, 0, &bp, NULL); - if (error) - return(error); - - tmp =3D min_t(int, valuelen, BBTOB(bp->b_length)); - xfs_buf_iomove(bp, 0, tmp, dst, XBRW_READ); - xfs_buf_relse(bp); - dst +=3D tmp; - valuelen -=3D tmp; - - lblkno +=3D map[i].br_blockcount; - } - } - ASSERT(valuelen =3D=3D 0); - return(0); -} - -/* - * Write the value associated with an attribute into the out-of-line buffer - * that we have defined for it. - */ -STATIC int -xfs_attr_rmtval_set(xfs_da_args_t *args) -{ - xfs_mount_t *mp; - xfs_fileoff_t lfileoff; - xfs_inode_t *dp; - xfs_bmbt_irec_t map; - xfs_daddr_t dblkno; - void *src; - xfs_buf_t *bp; - xfs_dablk_t lblkno; - int blkcnt, valuelen, nmap, error, tmp, committed; - - trace_xfs_attr_rmtval_set(args); - - dp =3D args->dp; - mp =3D dp->i_mount; - src =3D args->value; - - /* - * Find a "hole" in the attribute address space large enough for - * us to drop the new attribute's value into. - */ - blkcnt =3D XFS_B_TO_FSB(mp, args->valuelen); - lfileoff =3D 0; - error =3D xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, - XFS_ATTR_FORK); - if (error) { - return(error); - } - args->rmtblkno =3D lblkno =3D (xfs_dablk_t)lfileoff; - args->rmtblkcnt =3D blkcnt; - - /* - * Roll through the "value", allocating blocks on disk as required. - */ - while (blkcnt > 0) { - /* - * Allocate a single extent, up to the size of the value. - */ - xfs_bmap_init(args->flist, args->firstblock); - nmap =3D 1; - error =3D xfs_bmapi_write(args->trans, dp, (xfs_fileoff_t)lblkno, - blkcnt, - XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - args->firstblock, args->total, &map, &nmap, - args->flist); - if (!error) { - error =3D xfs_bmap_finish(&args->trans, args->flist, - &committed); - } - if (error) { - ASSERT(committed); - args->trans =3D NULL; - xfs_bmap_cancel(args->flist); - return(error); - } - - /* - * bmap_finish() may have committed the last trans and started - * a new one. We need the inode to be in all transactions. - */ - if (committed) - xfs_trans_ijoin(args->trans, dp, 0); - - ASSERT(nmap =3D=3D 1); - ASSERT((map.br_startblock !=3D DELAYSTARTBLOCK) && - (map.br_startblock !=3D HOLESTARTBLOCK)); - lblkno +=3D map.br_blockcount; - blkcnt -=3D map.br_blockcount; - - /* - * Start the next trans in the chain. - */ - error =3D xfs_trans_roll(&args->trans, dp); - if (error) - return (error); - } - - /* - * Roll through the "value", copying the attribute value to the - * already-allocated blocks. Blocks are written synchronously - * so that we can know they are all on disk before we turn off - * the INCOMPLETE flag. - */ - lblkno =3D args->rmtblkno; - valuelen =3D args->valuelen; - while (valuelen > 0) { - int buflen; - - /* - * Try to remember where we decided to put the value. - */ - xfs_bmap_init(args->flist, args->firstblock); - nmap =3D 1; - error =3D xfs_bmapi_read(dp, (xfs_fileoff_t)lblkno, - args->rmtblkcnt, &map, &nmap, - XFS_BMAPI_ATTRFORK); - if (error) - return(error); - ASSERT(nmap =3D=3D 1); - ASSERT((map.br_startblock !=3D DELAYSTARTBLOCK) && - (map.br_startblock !=3D HOLESTARTBLOCK)); - - dblkno =3D XFS_FSB_TO_DADDR(mp, map.br_startblock), - blkcnt =3D XFS_FSB_TO_BB(mp, map.br_blockcount); - - bp =3D xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, 0); - if (!bp) - return ENOMEM; - - buflen =3D BBTOB(bp->b_length); - tmp =3D min_t(int, valuelen, buflen); - xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); - if (tmp < buflen) - xfs_buf_zero(bp, tmp, buflen - tmp); - - error =3D xfs_bwrite(mp, bp); /* GROT: NOTE: synchronous write */ - xfs_buf_relse(bp); - if (error) - return error; - src +=3D tmp; - valuelen -=3D tmp; - - lblkno +=3D map.br_blockcount; - } - ASSERT(valuelen =3D=3D 0); - return(0); -} - -/* - * Remove the value associated with an attribute by deleting the - * out-of-line buffer that it is stored on. - */ -STATIC int -xfs_attr_rmtval_remove(xfs_da_args_t *args) -{ - xfs_mount_t *mp; - xfs_bmbt_irec_t map; - xfs_buf_t *bp; - xfs_daddr_t dblkno; - xfs_dablk_t lblkno; - int valuelen, blkcnt, nmap, error, done, committed; - - trace_xfs_attr_rmtval_remove(args); - - mp =3D args->dp->i_mount; - - /* - * Roll through the "value", invalidating the attribute value's - * blocks. - */ - lblkno =3D args->rmtblkno; - valuelen =3D args->rmtblkcnt; - while (valuelen > 0) { - /* - * Try to remember where we decided to put the value. - */ - nmap =3D 1; - error =3D xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, - args->rmtblkcnt, &map, &nmap, - XFS_BMAPI_ATTRFORK); - if (error) - return(error); - ASSERT(nmap =3D=3D 1); - ASSERT((map.br_startblock !=3D DELAYSTARTBLOCK) && - (map.br_startblock !=3D HOLESTARTBLOCK)); - - dblkno =3D XFS_FSB_TO_DADDR(mp, map.br_startblock), - blkcnt =3D XFS_FSB_TO_BB(mp, map.br_blockcount); - - /* - * If the "remote" value is in the cache, remove it. - */ - bp =3D xfs_incore(mp->m_ddev_targp, dblkno, blkcnt, XBF_TRYLOCK); - if (bp) { - xfs_buf_stale(bp); - xfs_buf_relse(bp); - bp =3D NULL; - } - - valuelen -=3D map.br_blockcount; - - lblkno +=3D map.br_blockcount; - } - - /* - * Keep de-allocating extents until the remote-value region is gone. - */ - lblkno =3D args->rmtblkno; - blkcnt =3D args->rmtblkcnt; - done =3D 0; - while (!done) { - xfs_bmap_init(args->flist, args->firstblock); - error =3D xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt, - XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - 1, args->firstblock, args->flist, - &done); - if (!error) { - error =3D xfs_bmap_finish(&args->trans, args->flist, - &committed); - } - if (error) { - ASSERT(committed); - args->trans =3D NULL; - xfs_bmap_cancel(args->flist); - return(error); - } - - /* - * bmap_finish() may have committed the last trans and started - * a new one. We need the inode to be in all transactions. - */ - if (committed) - xfs_trans_ijoin(args->trans, args->dp, 0); - - /* - * Close out trans and start the next one in the chain. - */ - error =3D xfs_trans_roll(&args->trans, args->dp); - if (error) - return (error); - } - return(0); -} diff --git a/libxfs/xfs_attr_remote.c b/libxfs/xfs_attr_remote.c new file mode 100644 index 0000000..36f8b5d --- /dev/null +++ b/libxfs/xfs_attr_remote.c @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2000-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 + */ +#include + +#define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ + +/* + * Read the value associated with an attribute from the out-of-line buffer + * that we stored it in. + */ +int +xfs_attr_rmtval_get(xfs_da_args_t *args) +{ + xfs_bmbt_irec_t map[ATTR_RMTVALUE_MAPSIZE]; + xfs_mount_t *mp; + xfs_daddr_t dblkno; + void *dst; + xfs_buf_t *bp; + int nmap, error, tmp, valuelen, blkcnt, i; + xfs_dablk_t lblkno; + + trace_xfs_attr_rmtval_get(args); + + ASSERT(!(args->flags & ATTR_KERNOVAL)); + + mp =3D args->dp->i_mount; + dst =3D args->value; + valuelen =3D args->valuelen; + lblkno =3D args->rmtblkno; + while (valuelen > 0) { + nmap =3D ATTR_RMTVALUE_MAPSIZE; + error =3D xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, + args->rmtblkcnt, map, &nmap, + XFS_BMAPI_ATTRFORK); + if (error) + return(error); + ASSERT(nmap >=3D 1); + + for (i =3D 0; (i < nmap) && (valuelen > 0); i++) { + ASSERT((map[i].br_startblock !=3D DELAYSTARTBLOCK) && + (map[i].br_startblock !=3D HOLESTARTBLOCK)); + dblkno =3D XFS_FSB_TO_DADDR(mp, map[i].br_startblock); + blkcnt =3D XFS_FSB_TO_BB(mp, map[i].br_blockcount); + error =3D xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, + dblkno, blkcnt, 0, &bp, NULL); + if (error) + return(error); + + tmp =3D min_t(int, valuelen, BBTOB(bp->b_length)); + xfs_buf_iomove(bp, 0, tmp, dst, XBRW_READ); + xfs_buf_relse(bp); + dst +=3D tmp; + valuelen -=3D tmp; + + lblkno +=3D map[i].br_blockcount; + } + } + ASSERT(valuelen =3D=3D 0); + return(0); +} + +/* + * Write the value associated with an attribute into the out-of-line buffer + * that we have defined for it. + */ +int +xfs_attr_rmtval_set(xfs_da_args_t *args) +{ + xfs_mount_t *mp; + xfs_fileoff_t lfileoff; + xfs_inode_t *dp; + xfs_bmbt_irec_t map; + xfs_daddr_t dblkno; + void *src; + xfs_buf_t *bp; + xfs_dablk_t lblkno; + int blkcnt, valuelen, nmap, error, tmp, committed; + + trace_xfs_attr_rmtval_set(args); + + dp =3D args->dp; + mp =3D dp->i_mount; + src =3D args->value; + + /* + * Find a "hole" in the attribute address space large enough for + * us to drop the new attribute's value into. + */ + blkcnt =3D XFS_B_TO_FSB(mp, args->valuelen); + lfileoff =3D 0; + error =3D xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, + XFS_ATTR_FORK); + if (error) { + return(error); + } + args->rmtblkno =3D lblkno =3D (xfs_dablk_t)lfileoff; + args->rmtblkcnt =3D blkcnt; + + /* + * Roll through the "value", allocating blocks on disk as required. + */ + while (blkcnt > 0) { + /* + * Allocate a single extent, up to the size of the value. + */ + xfs_bmap_init(args->flist, args->firstblock); + nmap =3D 1; + error =3D xfs_bmapi_write(args->trans, dp, (xfs_fileoff_t)lblkno, + blkcnt, + XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, + args->firstblock, args->total, &map, &nmap, + args->flist); + if (!error) { + error =3D xfs_bmap_finish(&args->trans, args->flist, + &committed); + } + if (error) { + ASSERT(committed); + args->trans =3D NULL; + xfs_bmap_cancel(args->flist); + return(error); + } + + /* + * bmap_finish() may have committed the last trans and started + * a new one. We need the inode to be in all transactions. + */ + if (committed) + xfs_trans_ijoin(args->trans, dp, 0); + + ASSERT(nmap =3D=3D 1); + ASSERT((map.br_startblock !=3D DELAYSTARTBLOCK) && + (map.br_startblock !=3D HOLESTARTBLOCK)); + lblkno +=3D map.br_blockcount; + blkcnt -=3D map.br_blockcount; + + /* + * Start the next trans in the chain. + */ + error =3D xfs_trans_roll(&args->trans, dp); + if (error) + return (error); + } + + /* + * Roll through the "value", copying the attribute value to the + * already-allocated blocks. Blocks are written synchronously + * so that we can know they are all on disk before we turn off + * the INCOMPLETE flag. + */ + lblkno =3D args->rmtblkno; + valuelen =3D args->valuelen; + while (valuelen > 0) { + int buflen; + + /* + * Try to remember where we decided to put the value. + */ + xfs_bmap_init(args->flist, args->firstblock); + nmap =3D 1; + error =3D xfs_bmapi_read(dp, (xfs_fileoff_t)lblkno, + args->rmtblkcnt, &map, &nmap, + XFS_BMAPI_ATTRFORK); + if (error) + return(error); + ASSERT(nmap =3D=3D 1); + ASSERT((map.br_startblock !=3D DELAYSTARTBLOCK) && + (map.br_startblock !=3D HOLESTARTBLOCK)); + + dblkno =3D XFS_FSB_TO_DADDR(mp, map.br_startblock), + blkcnt =3D XFS_FSB_TO_BB(mp, map.br_blockcount); + + bp =3D xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, 0); + if (!bp) + return ENOMEM; + + buflen =3D BBTOB(bp->b_length); + tmp =3D min_t(int, valuelen, buflen); + xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); + if (tmp < buflen) + xfs_buf_zero(bp, tmp, buflen - tmp); + + error =3D xfs_bwrite(bp); /* GROT: NOTE: synchronous write */ + xfs_buf_relse(bp); + if (error) + return error; + src +=3D tmp; + valuelen -=3D tmp; + + lblkno +=3D map.br_blockcount; + } + ASSERT(valuelen =3D=3D 0); + return(0); +} + +/* + * Remove the value associated with an attribute by deleting the + * out-of-line buffer that it is stored on. + */ +int +xfs_attr_rmtval_remove(xfs_da_args_t *args) +{ + xfs_mount_t *mp; + xfs_bmbt_irec_t map; + xfs_buf_t *bp; + xfs_daddr_t dblkno; + xfs_dablk_t lblkno; + int valuelen, blkcnt, nmap, error, done, committed; + + trace_xfs_attr_rmtval_remove(args); + + mp =3D args->dp->i_mount; + + /* + * Roll through the "value", invalidating the attribute value's + * blocks. + */ + lblkno =3D args->rmtblkno; + valuelen =3D args->rmtblkcnt; + while (valuelen > 0) { + /* + * Try to remember where we decided to put the value. + */ + nmap =3D 1; + error =3D xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, + args->rmtblkcnt, &map, &nmap, + XFS_BMAPI_ATTRFORK); + if (error) + return(error); + ASSERT(nmap =3D=3D 1); + ASSERT((map.br_startblock !=3D DELAYSTARTBLOCK) && + (map.br_startblock !=3D HOLESTARTBLOCK)); + + dblkno =3D XFS_FSB_TO_DADDR(mp, map.br_startblock), + blkcnt =3D XFS_FSB_TO_BB(mp, map.br_blockcount); + + /* + * If the "remote" value is in the cache, remove it. + */ + bp =3D xfs_incore(mp->m_ddev_targp, dblkno, blkcnt, XBF_TRYLOCK); + if (bp) { + xfs_buf_stale(bp); + xfs_buf_relse(bp); + bp =3D NULL; + } + + valuelen -=3D map.br_blockcount; + + lblkno +=3D map.br_blockcount; + } + + /* + * Keep de-allocating extents until the remote-value region is gone. + */ + lblkno =3D args->rmtblkno; + blkcnt =3D args->rmtblkcnt; + done =3D 0; + while (!done) { + xfs_bmap_init(args->flist, args->firstblock); + error =3D xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt, + XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, + 1, args->firstblock, args->flist, + &done); + if (!error) { + error =3D xfs_bmap_finish(&args->trans, args->flist, + &committed); + } + if (error) { + ASSERT(committed); + args->trans =3D NULL; + xfs_bmap_cancel(args->flist); + return(error); + } + + /* + * bmap_finish() may have committed the last trans and started + * a new one. We need the inode to be in all transactions. + */ + if (committed) + xfs_trans_ijoin(args->trans, args->dp, 0); + + /* + * Close out trans and start the next one in the chain. + */ + error =3D xfs_trans_roll(&args->trans, args->dp); + if (error) + return (error); + } + return(0); +} + =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-crc-patch= set-v2/xfs-add-crc-to-remote-attr=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=000000600=000001750=000001750=0000000034450=001= 2132011546=00021144=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00xfs: add CRC protection to remote attributes =46rom: Dave Chinner There are two ways of doing this - the first is to add a CRC to the remote attribute entry in the attribute block. The second is to treat them similar to the remote symlink, where each fragment has it's own header and identifies fragment location in the attribute. The problem with the CRC in the remote attr entry is that we cannot identify the owner of the metadata from the metadata blocks themselves, or where the blocks fit into the remote attribute. The down side to this approach is that we never know when the attribute has been read from disk or not and so we have to verify it every time it is read, and we must calculate it during the create transaction and log it. We do not log CRCs for any other metadata, and so this creates a unique set of coherency problems that, in general, are best avoided. Adding an identifying header to each allocated block allows us to identify each fragment and where in the attribute it is located. It enables us to rebuild the remote attribute from just the raw blocks containing the attribute. It also provides us to do per-block CRCs verification at IO time rather than during the transaction context that creates it or every time it is read into a user buffer. Hence it avoids all the problems that an external, logged CRC has, and provides all the benefits of self identifying metadata. The only complexity is that we have to add a header per fragment, and we don't know how many fragments will be needed prior to allocations. If we take the symlink example, the header is 56 bytes and hence for a 4k block size filesystem, in the worst case 16 headers requires 1 extra block for the 64k attribute data. For 512 byte filesystems the worst case is an extra block for every 9 fragments (i.e. 16 extra blocks in the worse case). This will be very rare and so it's not really a major concern. Because allocation is done in two steps - the first finds a hole large enough in the attribute file, the second does the allocation - we only need to find a hole big enough for a worst case allocation. We only need to allocate enough extra blocks for number of headers required by the fragments, and we can calculate that as we go.... Hence it really only makes sense to use the same model as for symlinks - it doesn't add that much complexity, does not require an attribute tree format change, and does not require logging calculated CRC values. Signed-off-by: Dave Chinner --- include/xfs_attr_remote.h | 19 +++ libxfs/xfs_attr_remote.c | 321 ++++++++++++++++++++++++++++++++++++++---= ---- 2 files changed, 290 insertions(+), 50 deletions(-) diff --git a/include/xfs_attr_remote.h b/include/xfs_attr_remote.h index b4be90e..9e71edf 100644 --- a/include/xfs_attr_remote.h +++ b/include/xfs_attr_remote.h @@ -24,6 +24,25 @@ #ifndef __XFS_ATTR_REMOTE_H__ #define __XFS_ATTR_REMOTE_H__ =20 +#define XFS_ATTR3_RMT_MAGIC 0x5841524d /* XARM */ + +struct xfs_attr3_rmt_hdr { + __be32 rm_magic; + __be32 rm_offset; + __be32 rm_bytes; + __be32 rm_crc; + uuid_t rm_uuid; + __be64 rm_owner; + __be64 rm_blkno; + __be64 rm_lsn; +}; + +#define XFS_ATTR3_RMT_CRC_OFF offsetof(struct xfs_attr3_rmt_hdr, rm_crc) + +#define XFS_ATTR3_RMT_BUF_SPACE(mp, bufsize) \ + ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ + sizeof(struct xfs_attr3_rmt_hdr) : 0)) + int xfs_attr_rmtval_get(struct xfs_da_args *args); int xfs_attr_rmtval_set(struct xfs_da_args *args); int xfs_attr_rmtval_remove(struct xfs_da_args *args); diff --git a/libxfs/xfs_attr_remote.c b/libxfs/xfs_attr_remote.c index 36f8b5d..fa112ad 100644 --- a/libxfs/xfs_attr_remote.c +++ b/libxfs/xfs_attr_remote.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -20,58 +21,226 @@ #define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ =20 /* + * Each contiguous block has a header, so it is not just a simple attribute + * length to FSB conversion. + */ +static int +xfs_attr3_rmt_blocks( + struct xfs_mount *mp, + int attrlen) +{ + int fsblocks =3D 0; + int len =3D attrlen; + + do { + fsblocks++; + len -=3D XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize); + } while (len > 0); + + return fsblocks; +} + +static bool +xfs_attr3_rmt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_attr3_rmt_hdr *rmt =3D bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (rmt->rm_magic !=3D cpu_to_be32(XFS_ATTR3_RMT_MAGIC)) + return false; + if (!uuid_equal(&rmt->rm_uuid, &mp->m_sb.sb_uuid)) + return false; + if (bp->b_bn !=3D be64_to_cpu(rmt->rm_blkno)) + return false; + if (be32_to_cpu(rmt->rm_offset) + + be32_to_cpu(rmt->rm_bytes) >=3D MAXPATHLEN) + return false; + if (rmt->rm_owner =3D=3D 0) + return false; + + return true; +} + +static void +xfs_attr3_rmt_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_ATTR3_RMT_CRC_OFF) || + !xfs_attr3_rmt_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_attr3_rmt_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_attr3_rmt_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (bip) { + struct xfs_attr3_rmt_hdr *rmt =3D bp->b_addr; + rmt->rm_lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + } + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_ATTR3_RMT_CRC_OFF); +} + +const struct xfs_buf_ops xfs_attr3_rmt_buf_ops =3D { + .verify_read =3D xfs_attr3_rmt_read_verify, + .verify_write =3D xfs_attr3_rmt_write_verify, +}; + +static int +xfs_attr3_rmt_hdr_set( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_attr3_rmt_hdr *rmt =3D bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return 0; + + rmt->rm_magic =3D cpu_to_be32(XFS_ATTR3_RMT_MAGIC); + rmt->rm_offset =3D cpu_to_be32(offset); + rmt->rm_bytes =3D cpu_to_be32(size); + uuid_copy(&rmt->rm_uuid, &mp->m_sb.sb_uuid); + rmt->rm_owner =3D cpu_to_be64(ino); + rmt->rm_blkno =3D cpu_to_be64(bp->b_bn); + bp->b_ops =3D &xfs_attr3_rmt_buf_ops; + + return sizeof(struct xfs_attr3_rmt_hdr); +} + +/* + * Checking of the remote attribute header is split into two parts. the ve= rifier + * does CRC, location and bounds checking, the unpacking function checks t= he + * attribute parameters and owner. + */ +static bool +xfs_attr3_rmt_hdr_ok( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_attr3_rmt_hdr *rmt =3D bp->b_addr; + + if (offset !=3D be32_to_cpu(rmt->rm_offset)) + return false; + if (size !=3D be32_to_cpu(rmt->rm_bytes)) + return false; + if (ino !=3D be64_to_cpu(rmt->rm_owner)) + return false; + + /* ok */ + return true; + +} + +/* * Read the value associated with an attribute from the out-of-line buffer * that we stored it in. */ int -xfs_attr_rmtval_get(xfs_da_args_t *args) +xfs_attr_rmtval_get( + struct xfs_da_args *args) { - xfs_bmbt_irec_t map[ATTR_RMTVALUE_MAPSIZE]; - xfs_mount_t *mp; - xfs_daddr_t dblkno; - void *dst; - xfs_buf_t *bp; - int nmap, error, tmp, valuelen, blkcnt, i; - xfs_dablk_t lblkno; + struct xfs_bmbt_irec map[ATTR_RMTVALUE_MAPSIZE]; + struct xfs_mount *mp =3D args->dp->i_mount; + struct xfs_buf *bp; + xfs_daddr_t dblkno; + xfs_dablk_t lblkno =3D args->rmtblkno; + void *dst =3D args->value; + int valuelen =3D args->valuelen; + int nmap; + int error; + int blkcnt; + int i; + int offset =3D 0; =20 trace_xfs_attr_rmtval_get(args); =20 ASSERT(!(args->flags & ATTR_KERNOVAL)); =20 - mp =3D args->dp->i_mount; - dst =3D args->value; - valuelen =3D args->valuelen; - lblkno =3D args->rmtblkno; while (valuelen > 0) { nmap =3D ATTR_RMTVALUE_MAPSIZE; error =3D xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, map, &nmap, XFS_BMAPI_ATTRFORK); if (error) - return(error); + return error; ASSERT(nmap >=3D 1); =20 for (i =3D 0; (i < nmap) && (valuelen > 0); i++) { + int byte_cnt; + char *src; + ASSERT((map[i].br_startblock !=3D DELAYSTARTBLOCK) && (map[i].br_startblock !=3D HOLESTARTBLOCK)); dblkno =3D XFS_FSB_TO_DADDR(mp, map[i].br_startblock); blkcnt =3D XFS_FSB_TO_BB(mp, map[i].br_blockcount); error =3D xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, - dblkno, blkcnt, 0, &bp, NULL); + dblkno, blkcnt, 0, &bp, + &xfs_attr3_rmt_buf_ops); if (error) - return(error); + return error; + + byte_cnt =3D min_t(int, valuelen, BBTOB(bp->b_length)); + byte_cnt =3D XFS_ATTR3_RMT_BUF_SPACE(mp, byte_cnt); =20 - tmp =3D min_t(int, valuelen, BBTOB(bp->b_length)); - xfs_buf_iomove(bp, 0, tmp, dst, XBRW_READ); + src =3D bp->b_addr; + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (!xfs_attr3_rmt_hdr_ok(mp, args->dp->i_ino, + offset, byte_cnt, bp)) { + xfs_alert(mp, +"remote attribute header does not match required off/len/owner (0x%x/Ox%x,= 0x%llx)", + offset, byte_cnt, args->dp->i_ino); + xfs_buf_relse(bp); + return EFSCORRUPTED; + + } + + src +=3D sizeof(struct xfs_attr3_rmt_hdr); + } + + memcpy(dst, src, byte_cnt); xfs_buf_relse(bp); - dst +=3D tmp; - valuelen -=3D tmp; + + offset +=3D byte_cnt; + dst +=3D byte_cnt; + valuelen -=3D byte_cnt; =20 lblkno +=3D map[i].br_blockcount; } } ASSERT(valuelen =3D=3D 0); - return(0); + return 0; } =20 /* @@ -79,35 +248,49 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) * that we have defined for it. */ int -xfs_attr_rmtval_set(xfs_da_args_t *args) +xfs_attr_rmtval_set( + struct xfs_da_args *args) { - xfs_mount_t *mp; - xfs_fileoff_t lfileoff; - xfs_inode_t *dp; - xfs_bmbt_irec_t map; - xfs_daddr_t dblkno; - void *src; - xfs_buf_t *bp; - xfs_dablk_t lblkno; - int blkcnt, valuelen, nmap, error, tmp, committed; + struct xfs_inode *dp =3D args->dp; + struct xfs_mount *mp =3D dp->i_mount; + struct xfs_bmbt_irec map; + struct xfs_buf *bp; + xfs_daddr_t dblkno; + xfs_dablk_t lblkno; + xfs_fileoff_t lfileoff =3D 0; + void *src =3D args->value; + int blkcnt; + int valuelen; + int nmap; + int error; + int hdrcnt =3D 0; + bool crcs =3D xfs_sb_version_hascrc(&mp->m_sb); + int offset =3D 0; =20 trace_xfs_attr_rmtval_set(args); =20 - dp =3D args->dp; - mp =3D dp->i_mount; - src =3D args->value; - /* * Find a "hole" in the attribute address space large enough for - * us to drop the new attribute's value into. + * us to drop the new attribute's value into. Because CRC enable + * attributes have headers, we can't just do a straight byte to FSB + * conversion. We calculate the worst case block count in this case + * and we may not need that many, so we have to handle this when + * allocating the blocks below.=20 */ - blkcnt =3D XFS_B_TO_FSB(mp, args->valuelen); - lfileoff =3D 0; + if (!crcs) + blkcnt =3D XFS_B_TO_FSB(mp, args->valuelen); + else + blkcnt =3D xfs_attr3_rmt_blocks(mp, args->valuelen); + error =3D xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, XFS_ATTR_FORK); - if (error) { - return(error); - } + if (error) + return error; + + /* Start with the attribute data. We'll allocate the rest afterwards. */ + if (crcs) + blkcnt =3D XFS_B_TO_FSB(mp, args->valuelen); + args->rmtblkno =3D lblkno =3D (xfs_dablk_t)lfileoff; args->rmtblkcnt =3D blkcnt; =20 @@ -115,6 +298,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) * Roll through the "value", allocating blocks on disk as required. */ while (blkcnt > 0) { + int committed; + /* * Allocate a single extent, up to the size of the value. */ @@ -148,6 +333,27 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) (map.br_startblock !=3D HOLESTARTBLOCK)); lblkno +=3D map.br_blockcount; blkcnt -=3D map.br_blockcount; + hdrcnt++; + + /* + * If we have enough blocks for the attribute data, calculate + * how many extra blocks we need for headers. We might run + * through this multiple times in the case that the additional + * headers in the blocks needed for the data fragments spills + * into requiring more blocks. e.g. for 512 byte blocks, we'll + * spill for another block every 9 headers we require in this + * loop. + */ + + if (crcs && blkcnt =3D=3D 0) { + int total_len; + + total_len =3D args->valuelen + + hdrcnt * sizeof(struct xfs_attr3_rmt_hdr); + blkcnt =3D XFS_B_TO_FSB(mp, total_len); + blkcnt -=3D args->rmtblkcnt; + args->rmtblkcnt +=3D blkcnt; + } =20 /* * Start the next trans in the chain. @@ -166,7 +372,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) lblkno =3D args->rmtblkno; valuelen =3D args->valuelen; while (valuelen > 0) { - int buflen; + int byte_cnt; + char *buf; =20 /* * Try to remember where we decided to put the value. @@ -188,24 +395,38 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) bp =3D xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, 0); if (!bp) return ENOMEM; + bp->b_ops =3D &xfs_attr3_rmt_buf_ops; + + byte_cnt =3D BBTOB(bp->b_length); + byte_cnt =3D XFS_ATTR3_RMT_BUF_SPACE(mp, byte_cnt); + if (valuelen < byte_cnt) { + byte_cnt =3D valuelen; + } + + buf =3D bp->b_addr; + buf +=3D xfs_attr3_rmt_hdr_set(mp, dp->i_ino, offset, + byte_cnt, bp); + memcpy(buf, src, byte_cnt); =20 - buflen =3D BBTOB(bp->b_length); - tmp =3D min_t(int, valuelen, buflen); - xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); - if (tmp < buflen) - xfs_buf_zero(bp, tmp, buflen - tmp); + if (byte_cnt < BBTOB(bp->b_length)) + xfs_buf_zero(bp, byte_cnt, + BBTOB(bp->b_length) - byte_cnt); =20 error =3D xfs_bwrite(bp); /* GROT: NOTE: synchronous write */ xfs_buf_relse(bp); if (error) return error; - src +=3D tmp; - valuelen -=3D tmp; + + src +=3D byte_cnt; + valuelen -=3D byte_cnt; + offset +=3D byte_cnt; + hdrcnt--; =20 lblkno +=3D map.br_blockcount; } ASSERT(valuelen =3D=3D 0); - return(0); + ASSERT(hdrcnt =3D=3D 0); + return 0; } =20 /* @@ -284,7 +505,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) ASSERT(committed); args->trans =3D NULL; xfs_bmap_cancel(args->flist); - return(error); + return error; } =20 /* =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-crc-patchset-v2/xf= s-da-blf-types=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001750=00000= 00036121=0012132011547=00017253=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00xfs: add buffer types to directory and attribute bu= ffers =46rom: Dave Chinner Add buffer types to the buffer log items so that log recovery can validate the buffers and calculate CRCs correctly after the buffers are recovered. Signed-off-by: Dave Chinner --- include/xfs_attr_remote.h | 2 ++ include/xfs_buf_item.h | 18 +++++++++++++++++- include/xfs_da_btree.h | 2 ++ include/xfs_trans.h | 2 ++ libxfs/xfs.h | 1 + libxfs/xfs_attr_leaf.c | 9 ++++++++- libxfs/xfs_da_btree.c | 46 +++++++++++++++++++++++++++++++++++++++++= +--- libxfs/xfs_dir2_block.c | 12 +++++++++--- libxfs/xfs_dir2_data.c | 8 +++++++- libxfs/xfs_dir2_leaf.c | 24 +++++++++++++++++++---- libxfs/xfs_dir2_node.c | 17 ++++++++++++++--- libxfs/xfs_dir2_priv.h | 2 ++ 12 files changed, 127 insertions(+), 16 deletions(-) diff --git a/include/xfs_attr_remote.h b/include/xfs_attr_remote.h index 9e71edf..28f6f10 100644 --- a/include/xfs_attr_remote.h +++ b/include/xfs_attr_remote.h @@ -43,6 +43,8 @@ struct xfs_attr3_rmt_hdr { ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ sizeof(struct xfs_attr3_rmt_hdr) : 0)) =20 +extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; + int xfs_attr_rmtval_get(struct xfs_da_args *args); int xfs_attr_rmtval_set(struct xfs_da_args *args); int xfs_attr_rmtval_remove(struct xfs_da_args *args); diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index 09cab4e..640adcf 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -50,6 +50,14 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_AGI_BUF (1<<8) #define XFS_BLF_DINO_BUF (1<<9) #define XFS_BLF_SYMLINK_BUF (1<<10) +#define XFS_BLF_DIR_BLOCK_BUF (1<<11) +#define XFS_BLF_DIR_DATA_BUF (1<<12) +#define XFS_BLF_DIR_FREE_BUF (1<<13) +#define XFS_BLF_DIR_LEAF1_BUF (1<<14) +#define XFS_BLF_DIR_LEAFN_BUF (1<<15) +#define XFS_BLF_DA_NODE_BUF (1<<16) +#define XFS_BLF_ATTR_LEAF_BUF (1<<17) +#define XFS_BLF_ATTR_RMT_BUF (1<<18) =20 #define XFS_BLF_TYPE_MASK \ (XFS_BLF_UDQUOT_BUF | \ @@ -60,7 +68,15 @@ extern kmem_zone_t *xfs_buf_item_zone; XFS_BLF_AGFL_BUF | \ XFS_BLF_AGI_BUF | \ XFS_BLF_DINO_BUF | \ - XFS_BLF_SYMLINK_BUF) + XFS_BLF_SYMLINK_BUF | \ + XFS_BLF_DIR_BLOCK_BUF | \ + XFS_BLF_DIR_DATA_BUF | \ + XFS_BLF_DIR_FREE_BUF | \ + XFS_BLF_DIR_LEAF1_BUF | \ + XFS_BLF_DIR_LEAFN_BUF | \ + XFS_BLF_DA_NODE_BUF | \ + XFS_BLF_ATTR_LEAF_BUF | \ + XFS_BLF_ATTR_RMT_BUF) =20 #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index 0e8182c..6fb3371 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -301,6 +301,8 @@ int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_= inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp, int which_fork); =20 +extern const struct xfs_buf_ops xfs_da3_node_buf_ops; + /* * Utility routines. */ diff --git a/include/xfs_trans.h b/include/xfs_trans.h index a9bd826..9e145e9 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -502,6 +502,8 @@ void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf= *, uint); void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, uint); +void xfs_trans_buf_copy_type(struct xfs_buf *dst_bp, + struct xfs_buf *src_bp); void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); diff --git a/libxfs/xfs.h b/libxfs/xfs.h index c69dc4a..6bec18e 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -255,6 +255,7 @@ roundup_pow_of_two(uint v) #define xfs_trans_agflist_delta(tp, d) #define xfs_trans_agbtree_delta(tp, d) #define xfs_trans_buf_set_type(tp, bp, t) +#define xfs_trans_buf_copy_type(dbp, sbp) =20 #define xfs_buf_readahead(a,b,c,ops) ((void) 0) /* no readahead */ #define xfs_buf_readahead_map(a,b,c,ops) ((void) 0) /* no readahead */ diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 9de2244..7724781 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -236,8 +236,13 @@ xfs_attr3_leaf_read( xfs_daddr_t mappedbno, struct xfs_buf **bpp) { - return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, + int err; + + err =3D xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, XFS_ATTR_FORK, &xfs_attr3_leaf_buf_ops); + if (!err && tp) + xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_ATTR_LEAF_BUF); + return err; } =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -867,6 +872,7 @@ xfs_attr3_leaf_to_node( goto out; =20 /* copy leaf to new buffer, update identifiers */ + xfs_trans_buf_set_type(args->trans, bp2, XFS_BLF_ATTR_LEAF_BUF); bp2->b_ops =3D bp1->b_ops; memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp)); if (xfs_sb_version_hascrc(&mp->m_sb)) { @@ -929,6 +935,7 @@ xfs_attr3_leaf_create( if (error) return error; bp->b_ops =3D &xfs_attr3_leaf_buf_ops; + xfs_trans_buf_set_type(args->trans, bp, XFS_BLF_ATTR_LEAF_BUF); leaf =3D bp->b_addr; memset(leaf, 0, XFS_LBSIZE(mp)); =20 diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index ea16bee..565010d 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -269,7 +269,6 @@ const struct xfs_buf_ops xfs_da3_node_buf_ops =3D { .verify_write =3D xfs_da3_node_write_verify, }; =20 - int xfs_da3_node_read( struct xfs_trans *tp, @@ -279,8 +278,35 @@ xfs_da3_node_read( struct xfs_buf **bpp, int which_fork) { - return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, + int err; + + err =3D xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, which_fork, &xfs_da3_node_buf_ops); + if (!err && tp) { + struct xfs_da_blkinfo *info =3D (*bpp)->b_addr; + int type; + + switch (be16_to_cpu(info->magic)) { + case XFS_DA3_NODE_MAGIC: + case XFS_DA_NODE_MAGIC: + type =3D XFS_BLF_DA_NODE_BUF; + break; + case XFS_ATTR_LEAF_MAGIC: + case XFS_ATTR3_LEAF_MAGIC: + type =3D XFS_BLF_ATTR_LEAF_BUF; + break; + case XFS_DIR2_LEAFN_MAGIC: + case XFS_DIR3_LEAFN_MAGIC: + type =3D XFS_BLF_DIR_LEAFN_BUF; + break; + default: + type =3D 0; + ASSERT(0); + break; + } + xfs_trans_buf_set_type(tp, *bpp, type); + } + return err; } =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -311,6 +337,8 @@ xfs_da3_node_create( error =3D xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); if (error) return(error); + bp->b_ops =3D &xfs_da3_node_buf_ops; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DA_NODE_BUF); node =3D bp->b_addr; =20 if (xfs_sb_version_hascrc(&mp->m_sb)) { @@ -329,7 +357,6 @@ xfs_da3_node_create( xfs_trans_log_buf(tp, bp, XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); =20 - bp->b_ops =3D &xfs_da3_node_buf_ops; *bpp =3D bp; return(0); } @@ -540,6 +567,12 @@ xfs_da3_root_split( btree =3D xfs_da3_node_tree_p(oldroot); size =3D (int)((char *)&btree[nodehdr.count] - (char *)oldroot); level =3D nodehdr.level; + + /* + * we are about to copy oldroot to bp, so set up the type + * of bp while we know exactly what it will be. + */ + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DA_NODE_BUF); } else { struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir2_leaf_entry *ents; @@ -552,6 +585,12 @@ xfs_da3_root_split( leafhdr.magic =3D=3D XFS_DIR3_LEAFN_MAGIC); size =3D (int)((char *)&ents[leafhdr.count] - (char *)leaf); level =3D 0; + + /* + * we are about to copy oldroot to bp, so set up the type + * of bp while we know exactly what it will be. + */ + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAFN_BUF); } =20 /* @@ -1067,6 +1106,7 @@ xfs_da3_root_join( */ memcpy(root_blk->bp->b_addr, bp->b_addr, state->blocksize); root_blk->bp->b_ops =3D bp->b_ops; + xfs_trans_buf_copy_type(root_blk->bp, bp); if (oldroothdr.magic =3D=3D XFS_DA3_NODE_MAGIC) { struct xfs_da3_blkinfo *da3 =3D root_blk->bp->b_addr; da3->blkno =3D cpu_to_be64(root_blk->bp->b_bn); diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index b98b749..574e414 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -114,20 +114,26 @@ xfs_dir3_block_read( struct xfs_buf **bpp) { struct xfs_mount *mp =3D dp->i_mount; + int err; =20 - return xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, + err =3D xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, XFS_DATA_FORK, &xfs_dir3_block_buf_ops); + if (!err && tp) + xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_BLOCK_BUF); + return err; } =20 static void xfs_dir3_block_init( struct xfs_mount *mp, + struct xfs_trans *tp, struct xfs_buf *bp, struct xfs_inode *dp) { struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; =20 bp->b_ops =3D &xfs_dir3_block_buf_ops; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_BLOCK_BUF); =20 if (xfs_sb_version_hascrc(&mp->m_sb)) { memset(hdr3, 0, sizeof(*hdr3)); @@ -964,7 +970,7 @@ xfs_dir2_leaf_to_block( /* * Start converting it to block form. */ - xfs_dir3_block_init(mp, dbp, dp); + xfs_dir3_block_init(mp, tp, dbp, dp); =20 needlog =3D 1; needscan =3D 0; @@ -1093,7 +1099,7 @@ xfs_dir2_sf_to_block( kmem_free(sfp); return error; } - xfs_dir3_block_init(mp, bp, dp); + xfs_dir3_block_init(mp, tp, bp, dp); hdr =3D bp->b_addr; =20 /* diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index 69841df..9752ae3 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -283,8 +283,13 @@ xfs_dir3_data_read( xfs_daddr_t mapped_bno, struct xfs_buf **bpp) { - return xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp, + int err; + + err =3D xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp, XFS_DATA_FORK, &xfs_dir3_data_buf_ops); + if (!err && tp) + xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_DATA_BUF); + return err; } =20 int @@ -553,6 +558,7 @@ xfs_dir3_data_init( if (error) return error; bp->b_ops =3D &xfs_dir3_data_buf_ops; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_DATA_BUF); =20 /* * Initialize the header. diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index f00b23c..3d1ec23 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -279,8 +279,13 @@ xfs_dir3_leaf_read( xfs_daddr_t mappedbno, struct xfs_buf **bpp) { - return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, + int err; + + err =3D xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, XFS_DATA_FORK, &xfs_dir3_leaf1_buf_ops); + if (!err && tp) + xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_LEAF1_BUF); + return err; } =20 int @@ -291,8 +296,13 @@ xfs_dir3_leafn_read( xfs_daddr_t mappedbno, struct xfs_buf **bpp) { - return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, + int err; + + err =3D xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, XFS_DATA_FORK, &xfs_dir3_leafn_buf_ops); + if (!err && tp) + xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_LEAFN_BUF); + return err; } =20 /* @@ -301,6 +311,7 @@ xfs_dir3_leafn_read( static void xfs_dir3_leaf_init( struct xfs_mount *mp, + struct xfs_trans *tp, struct xfs_buf *bp, xfs_ino_t owner, __uint16_t type) @@ -335,8 +346,11 @@ xfs_dir3_leaf_init( ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount =3D 0; bp->b_ops =3D &xfs_dir3_leaf1_buf_ops; - } else + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAF1_BUF); + } else { bp->b_ops =3D &xfs_dir3_leafn_buf_ops; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAFN_BUF); + } } =20 int @@ -361,7 +375,7 @@ xfs_dir3_leaf_get_buf( if (error) return error; =20 - xfs_dir3_leaf_init(mp, bp, dp->i_ino, magic); + xfs_dir3_leaf_init(mp, tp, bp, dp->i_ino, magic); xfs_dir3_leaf_log_header(tp, bp); if (magic =3D=3D XFS_DIR2_LEAF1_MAGIC) xfs_dir3_leaf_log_tail(tp, bp); @@ -456,6 +470,7 @@ xfs_dir2_block_to_leaf( * Fix up the block header, make it a data block. */ dbp->b_ops =3D &xfs_dir3_data_buf_ops; + xfs_trans_buf_set_type(tp, dbp, XFS_BLF_DIR_DATA_BUF); if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) hdr->magic =3D cpu_to_be32(XFS_DIR2_DATA_MAGIC); else @@ -1776,6 +1791,7 @@ xfs_dir2_node_to_leaf( xfs_dir3_leaf_compact(args, &leafhdr, lbp); =20 lbp->b_ops =3D &xfs_dir3_leaf1_buf_ops; + xfs_trans_buf_set_type(tp, lbp, XFS_BLF_DIR_LEAF1_BUF); leafhdr.magic =3D (leafhdr.magic =3D=3D XFS_DIR2_LEAFN_MAGIC) ? XFS_DIR2_LEAF1_MAGIC : XFS_DIR3_LEAF1_MAGIC; diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index 9e75553..a88049b 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -130,7 +130,7 @@ xfs_dir3_free_write_verify( xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_FREE_CRC_OFF); } =20 -static const struct xfs_buf_ops xfs_dir3_free_buf_ops =3D { +const struct xfs_buf_ops xfs_dir3_free_buf_ops =3D { .verify_read =3D xfs_dir3_free_read_verify, .verify_write =3D xfs_dir3_free_write_verify, }; @@ -144,8 +144,15 @@ __xfs_dir3_free_read( xfs_daddr_t mappedbno, struct xfs_buf **bpp) { - return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, + int err; + + err =3D xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, XFS_DATA_FORK, &xfs_dir3_free_buf_ops); + + /* try read returns without an error or *bpp if it lands in a hole */ + if (!err && tp && *bpp) + xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_FREE_BUF); + return err; } =20 int @@ -232,7 +239,8 @@ xfs_dir3_free_get_buf( if (error) return error; =20 - bp->b_ops =3D &xfs_dir3_free_buf_ops;; + xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_FREE_BUF); + bp->b_ops =3D &xfs_dir3_free_buf_ops; =20 /* * Initialize the new block to be empty, and remember @@ -380,6 +388,7 @@ xfs_dir2_leaf_to_node( else leaf->hdr.info.magic =3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); lbp->b_ops =3D &xfs_dir3_leafn_buf_ops; + xfs_trans_buf_set_type(tp, lbp, XFS_BLF_DIR_LEAFN_BUF); xfs_dir3_leaf_log_header(tp, lbp); xfs_dir3_leaf_check(mp, lbp); return 0; @@ -795,6 +804,7 @@ xfs_dir2_leafn_lookup_for_entry( (char *)curbp->b_addr); state->extrablk.magic =3D XFS_DIR2_DATA_MAGIC; curbp->b_ops =3D &xfs_dir3_data_buf_ops; + xfs_trans_buf_set_type(tp, curbp, XFS_BLF_DIR_DATA_BUF); if (cmp =3D=3D XFS_CMP_EXACT) return XFS_ERROR(EEXIST); } @@ -809,6 +819,7 @@ xfs_dir2_leafn_lookup_for_entry( state->extrablk.blkno =3D curdb; state->extrablk.magic =3D XFS_DIR2_DATA_MAGIC; curbp->b_ops =3D &xfs_dir3_data_buf_ops; + xfs_trans_buf_set_type(tp, curbp, XFS_BLF_DIR_DATA_BUF); } else { /* If the curbp is not the CI match block, drop it */ if (state->extrablk.bp !=3D curbp) diff --git a/libxfs/xfs_dir2_priv.h b/libxfs/xfs_dir2_priv.h index 932565d..7cf573c 100644 --- a/libxfs/xfs_dir2_priv.h +++ b/libxfs/xfs_dir2_priv.h @@ -49,6 +49,7 @@ extern int xfs_dir2_leaf_to_block(struct xfs_da_args *arg= s, #endif =20 extern const struct xfs_buf_ops xfs_dir3_data_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_free_buf_ops; =20 extern int __xfs_dir3_data_check(struct xfs_inode *dp, struct xfs_buf *bp); extern int xfs_dir3_data_read(struct xfs_trans *tp, struct xfs_inode *dp, @@ -77,6 +78,7 @@ extern void xfs_dir2_data_use_free(struct xfs_trans *tp, = struct xfs_buf *bp, xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); =20 /* xfs_dir2_leaf.c */ +extern const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops; extern const struct xfs_buf_ops xfs_dir3_leafn_buf_ops; =20 extern int xfs_dir3_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp, =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00xfsprogs-crc-patchset-v2/xfs-trans-type-blf-change=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00000060= 0=000001750=000001750=0000000041300=0012132011547=00021051=00 0=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00da= ve=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfs: buffer type overrun= s blf_flags field =46rom: Dave Chinner The buffer type passed to log recvoery in the buffer log item overruns the blf_flags field. I had assumed that flags field was a 32 bit value, and it turns out it is a unisgned short. Therefore having 19 flags doesn't really work. Convert the buffer type field to numeric value, and use the top 5 bits of the flags field for it. We currently have 17 types of buffers, so using 5 bits gives us plenty of room for expansion in future.... Signed-off-by: Dave Chinner --- include/xfs_buf_item.h | 92 +++++++++++++++++++++++++++----------------= ---- include/xfs_trans.h | 4 --- libxfs/trans.c | 2 +- libxfs/xfs_alloc.c | 4 +-- libxfs/xfs_attr_leaf.c | 6 ++-- libxfs/xfs_bmap.c | 2 +- libxfs/xfs_btree.c | 8 ++--- libxfs/xfs_da_btree.c | 12 +++---- libxfs/xfs_dir2_block.c | 4 +-- libxfs/xfs_dir2_data.c | 4 +-- libxfs/xfs_dir2_leaf.c | 12 +++---- libxfs/xfs_dir2_node.c | 10 +++--- libxfs/xfs_ialloc.c | 2 +- 13 files changed, 86 insertions(+), 76 deletions(-) diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index 640adcf..2573d2a 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -39,45 +39,6 @@ extern kmem_zone_t *xfs_buf_item_zone; #define XFS_BLF_PDQUOT_BUF (1<<3) #define XFS_BLF_GDQUOT_BUF (1<<4) =20 -/* - * all buffers now need flags to tell recovery where the magic number - * is so that it can verify and calculate the CRCs on the buffer correctly - * once the changes have been replayed into the buffer. - */ -#define XFS_BLF_BTREE_BUF (1<<5) -#define XFS_BLF_AGF_BUF (1<<6) -#define XFS_BLF_AGFL_BUF (1<<7) -#define XFS_BLF_AGI_BUF (1<<8) -#define XFS_BLF_DINO_BUF (1<<9) -#define XFS_BLF_SYMLINK_BUF (1<<10) -#define XFS_BLF_DIR_BLOCK_BUF (1<<11) -#define XFS_BLF_DIR_DATA_BUF (1<<12) -#define XFS_BLF_DIR_FREE_BUF (1<<13) -#define XFS_BLF_DIR_LEAF1_BUF (1<<14) -#define XFS_BLF_DIR_LEAFN_BUF (1<<15) -#define XFS_BLF_DA_NODE_BUF (1<<16) -#define XFS_BLF_ATTR_LEAF_BUF (1<<17) -#define XFS_BLF_ATTR_RMT_BUF (1<<18) - -#define XFS_BLF_TYPE_MASK \ - (XFS_BLF_UDQUOT_BUF | \ - XFS_BLF_PDQUOT_BUF | \ - XFS_BLF_GDQUOT_BUF | \ - XFS_BLF_BTREE_BUF | \ - XFS_BLF_AGF_BUF | \ - XFS_BLF_AGFL_BUF | \ - XFS_BLF_AGI_BUF | \ - XFS_BLF_DINO_BUF | \ - XFS_BLF_SYMLINK_BUF | \ - XFS_BLF_DIR_BLOCK_BUF | \ - XFS_BLF_DIR_DATA_BUF | \ - XFS_BLF_DIR_FREE_BUF | \ - XFS_BLF_DIR_LEAF1_BUF | \ - XFS_BLF_DIR_LEAFN_BUF | \ - XFS_BLF_DA_NODE_BUF | \ - XFS_BLF_ATTR_LEAF_BUF | \ - XFS_BLF_ATTR_RMT_BUF) - #define XFS_BLF_CHUNK 128 #define XFS_BLF_SHIFT 7 #define BIT_TO_WORD_SHIFT 5 @@ -101,6 +62,55 @@ typedef struct xfs_buf_log_format { } xfs_buf_log_format_t; =20 /* + * All buffers now need to tell recovery where the magic number + * is so that it can verify and calculate the CRCs on the buffer correctly + * once the changes have been replayed into the buffer. + * + * The type value is held in the upper 5 bits of the blf_flags field, whic= h is + * an unsigned 16 bit field. Hence we need to shift it 11 bits up and down. + */ +#define XFS_BLFT_BITS 5 +#define XFS_BLFT_SHIFT 11 +#define XFS_BLFT_MASK (((1 << XFS_BLFT_BITS) - 1) << XFS_BLFT_SHIFT) + +enum xfs_blft { + XFS_BLFT_UNKNOWN_BUF =3D 0, + XFS_BLFT_UDQUOT_BUF, + XFS_BLFT_PDQUOT_BUF, + XFS_BLFT_GDQUOT_BUF, + XFS_BLFT_BTREE_BUF, + XFS_BLFT_AGF_BUF, + XFS_BLFT_AGFL_BUF, + XFS_BLFT_AGI_BUF, + XFS_BLFT_DINO_BUF, + XFS_BLFT_SYMLINK_BUF, + XFS_BLFT_DIR_BLOCK_BUF, + XFS_BLFT_DIR_DATA_BUF, + XFS_BLFT_DIR_FREE_BUF, + XFS_BLFT_DIR_LEAF1_BUF, + XFS_BLFT_DIR_LEAFN_BUF, + XFS_BLFT_DA_NODE_BUF, + XFS_BLFT_ATTR_LEAF_BUF, + XFS_BLFT_ATTR_RMT_BUF, + XFS_BLFT_SB_BUF, + XFS_BLFT_MAX_BUF =3D (1 << XFS_BLFT_BITS), +}; + +static inline void +xfs_blft_to_flags(struct xfs_buf_log_format *blf, enum xfs_blft type) +{ + ASSERT(type > XFS_BLFT_UNKNOWN_BUF && type < XFS_BLFT_MAX_BUF); + blf->blf_flags &=3D ~XFS_BLFT_MASK; + blf->blf_flags |=3D ((type << XFS_BLFT_SHIFT) & XFS_BLFT_MASK); +} + +static inline __uint16_t +xfs_blft_from_flags(struct xfs_buf_log_format *blf) +{ + return (blf->blf_flags & XFS_BLFT_MASK) >> XFS_BLFT_SHIFT; +} + +/* * buf log item flags */ #define XFS_BLI_HOLD 0x01 @@ -153,6 +163,10 @@ void xfs_buf_attach_iodone(struct xfs_buf *, void xfs_buf_iodone_callbacks(struct xfs_buf *); void xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *); =20 +void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, + enum xfs_blft); +void xfs_trans_buf_copy_type(struct xfs_buf *dst_bp, struct xfs_buf *src_b= p); + #endif /* __KERNEL__ */ =20 #endif /* __XFS_BUF_ITEM_H__ */ diff --git a/include/xfs_trans.h b/include/xfs_trans.h index 9e145e9..acf1381 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -500,10 +500,6 @@ void xfs_trans_inode_buf(xfs_trans_t *, struct xfs_bu= f *); void xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *); void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); -void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, - uint); -void xfs_trans_buf_copy_type(struct xfs_buf *dst_bp, - struct xfs_buf *src_bp); void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); diff --git a/libxfs/trans.c b/libxfs/trans.c index 619aad1..831e42a 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -218,7 +218,7 @@ libxfs_trans_inode_alloc_buf( ASSERT(XFS_BUF_FSPRIVATE(bp, void *) !=3D NULL); bip =3D XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); bip->bli_flags |=3D XFS_BLI_INODE_ALLOC_BUF; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DINO_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DINO_BUF); } =20 /* diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 30fc5f4..1041f8f 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -2079,7 +2079,7 @@ xfs_alloc_log_agf( =20 trace_xfs_agf(tp->t_mountp, XFS_BUF_TO_AGF(bp), fields, _RET_IP_); =20 - xfs_trans_buf_set_type(tp, bp, XFS_BLF_AGF_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_AGF_BUF); =20 xfs_btree_offsets(fields, offsets, XFS_AGF_NUM_BITS, &first, &last); xfs_trans_log_buf(tp, bp, (uint)first, (uint)last); @@ -2159,7 +2159,7 @@ xfs_alloc_put_freelist( =20 xfs_alloc_log_agf(tp, agbp, logflags); =20 - xfs_trans_buf_set_type(tp, agflbp, XFS_BLF_AGFL_BUF); + xfs_trans_buf_set_type(tp, agflbp, XFS_BLFT_AGFL_BUF); xfs_trans_log_buf(tp, agflbp, startoff, startoff + sizeof(xfs_agblock_t) - 1); return 0; diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 7724781..b28266a 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -241,7 +241,7 @@ xfs_attr3_leaf_read( err =3D xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, XFS_ATTR_FORK, &xfs_attr3_leaf_buf_ops); if (!err && tp) - xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_ATTR_LEAF_BUF); + xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_ATTR_LEAF_BUF); return err; } =20 @@ -872,7 +872,7 @@ xfs_attr3_leaf_to_node( goto out; =20 /* copy leaf to new buffer, update identifiers */ - xfs_trans_buf_set_type(args->trans, bp2, XFS_BLF_ATTR_LEAF_BUF); + xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF); bp2->b_ops =3D bp1->b_ops; memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp)); if (xfs_sb_version_hascrc(&mp->m_sb)) { @@ -935,7 +935,7 @@ xfs_attr3_leaf_create( if (error) return error; bp->b_ops =3D &xfs_attr3_leaf_buf_ops; - xfs_trans_buf_set_type(args->trans, bp, XFS_BLF_ATTR_LEAF_BUF); + xfs_trans_buf_set_type(args->trans, bp, XFS_BLFT_ATTR_LEAF_BUF); leaf =3D bp->b_addr; memset(leaf, 0, XFS_LBSIZE(mp)); =20 diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 5e736a5..6664265 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -1217,7 +1217,7 @@ xfs_bmap_local_to_extents_init_fn( { bp->b_ops =3D &xfs_bmbt_buf_ops; memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); - xfs_trans_buf_set_type(tp, bp, XFS_BLF_BTREE_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_BTREE_BUF); } =20 STATIC void diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index a7c19e9..a613294 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -1227,7 +1227,7 @@ xfs_btree_log_keys( XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); =20 if (bp) { - xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_key_offset(cur, first), xfs_btree_key_offset(cur, last + 1) - 1); @@ -1252,7 +1252,7 @@ xfs_btree_log_recs( XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); =20 - xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_rec_offset(cur, first), xfs_btree_rec_offset(cur, last + 1) - 1); @@ -1277,7 +1277,7 @@ xfs_btree_log_ptrs( struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); int level =3D xfs_btree_get_level(block); =20 - xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, xfs_btree_ptr_offset(cur, first, level), xfs_btree_ptr_offset(cur, last + 1, level) - 1); @@ -1352,7 +1352,7 @@ xfs_btree_log_block( (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? loffsets : soffsets, nbits, &first, &last); - xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLF_BTREE_BUF); + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); xfs_trans_log_buf(cur->bc_tp, bp, first, last); } else { xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index 565010d..0a96f20 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -289,15 +289,15 @@ xfs_da3_node_read( switch (be16_to_cpu(info->magic)) { case XFS_DA3_NODE_MAGIC: case XFS_DA_NODE_MAGIC: - type =3D XFS_BLF_DA_NODE_BUF; + type =3D XFS_BLFT_DA_NODE_BUF; break; case XFS_ATTR_LEAF_MAGIC: case XFS_ATTR3_LEAF_MAGIC: - type =3D XFS_BLF_ATTR_LEAF_BUF; + type =3D XFS_BLFT_ATTR_LEAF_BUF; break; case XFS_DIR2_LEAFN_MAGIC: case XFS_DIR3_LEAFN_MAGIC: - type =3D XFS_BLF_DIR_LEAFN_BUF; + type =3D XFS_BLFT_DIR_LEAFN_BUF; break; default: type =3D 0; @@ -338,7 +338,7 @@ xfs_da3_node_create( if (error) return(error); bp->b_ops =3D &xfs_da3_node_buf_ops; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DA_NODE_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF); node =3D bp->b_addr; =20 if (xfs_sb_version_hascrc(&mp->m_sb)) { @@ -572,7 +572,7 @@ xfs_da3_root_split( * we are about to copy oldroot to bp, so set up the type * of bp while we know exactly what it will be. */ - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DA_NODE_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF); } else { struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir2_leaf_entry *ents; @@ -590,7 +590,7 @@ xfs_da3_root_split( * we are about to copy oldroot to bp, so set up the type * of bp while we know exactly what it will be. */ - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAFN_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAFN_BUF); } =20 /* diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index 574e414..dc69394 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -119,7 +119,7 @@ xfs_dir3_block_read( err =3D xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, XFS_DATA_FORK, &xfs_dir3_block_buf_ops); if (!err && tp) - xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_BLOCK_BUF); + xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_BLOCK_BUF); return err; } =20 @@ -133,7 +133,7 @@ xfs_dir3_block_init( struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; =20 bp->b_ops =3D &xfs_dir3_block_buf_ops; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_BLOCK_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_BLOCK_BUF); =20 if (xfs_sb_version_hascrc(&mp->m_sb)) { memset(hdr3, 0, sizeof(*hdr3)); diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index 9752ae3..155352c 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -288,7 +288,7 @@ xfs_dir3_data_read( err =3D xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp, XFS_DATA_FORK, &xfs_dir3_data_buf_ops); if (!err && tp) - xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_DATA_BUF); + xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_DATA_BUF); return err; } =20 @@ -558,7 +558,7 @@ xfs_dir3_data_init( if (error) return error; bp->b_ops =3D &xfs_dir3_data_buf_ops; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_DATA_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_DATA_BUF); =20 /* * Initialize the header. diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index d58c25b..12fb61d 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -280,7 +280,7 @@ xfs_dir3_leaf_read( err =3D xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, XFS_DATA_FORK, &xfs_dir3_leaf1_buf_ops); if (!err && tp) - xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_LEAF1_BUF); + xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_LEAF1_BUF); return err; } =20 @@ -297,7 +297,7 @@ xfs_dir3_leafn_read( err =3D xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp, XFS_DATA_FORK, &xfs_dir3_leafn_buf_ops); if (!err && tp) - xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_LEAFN_BUF); + xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_LEAFN_BUF); return err; } =20 @@ -342,10 +342,10 @@ xfs_dir3_leaf_init( ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); ltp->bestcount =3D 0; bp->b_ops =3D &xfs_dir3_leaf1_buf_ops; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAF1_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAF1_BUF); } else { bp->b_ops =3D &xfs_dir3_leafn_buf_ops; - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAFN_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAFN_BUF); } } =20 @@ -467,7 +467,7 @@ xfs_dir2_block_to_leaf( * Fix up the block header, make it a data block. */ dbp->b_ops =3D &xfs_dir3_data_buf_ops; - xfs_trans_buf_set_type(tp, dbp, XFS_BLF_DIR_DATA_BUF); + xfs_trans_buf_set_type(tp, dbp, XFS_BLFT_DIR_DATA_BUF); if (hdr->magic =3D=3D cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) hdr->magic =3D cpu_to_be32(XFS_DIR2_DATA_MAGIC); else @@ -1788,7 +1788,7 @@ xfs_dir2_node_to_leaf( xfs_dir3_leaf_compact(args, &leafhdr, lbp); =20 lbp->b_ops =3D &xfs_dir3_leaf1_buf_ops; - xfs_trans_buf_set_type(tp, lbp, XFS_BLF_DIR_LEAF1_BUF); + xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAF1_BUF); leafhdr.magic =3D (leafhdr.magic =3D=3D XFS_DIR2_LEAFN_MAGIC) ? XFS_DIR2_LEAF1_MAGIC : XFS_DIR3_LEAFN_MAGIC; diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index 707aae8..eb430f9 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -147,7 +147,7 @@ __xfs_dir3_free_read( =20 /* try read returns without an error or *bpp if it lands in a hole */ if (!err && tp && *bpp) - xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_DIR_FREE_BUF); + xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_FREE_BUF); return err; } =20 @@ -235,7 +235,7 @@ xfs_dir3_free_get_buf( if (error) return error; =20 - xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_FREE_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_FREE_BUF); bp->b_ops =3D &xfs_dir3_free_buf_ops; =20 /* @@ -384,7 +384,7 @@ xfs_dir2_leaf_to_node( else leaf->hdr.info.magic =3D cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); lbp->b_ops =3D &xfs_dir3_leafn_buf_ops; - xfs_trans_buf_set_type(tp, lbp, XFS_BLF_DIR_LEAFN_BUF); + xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAFN_BUF); xfs_dir3_leaf_log_header(tp, lbp); xfs_dir3_leaf_check(mp, lbp); return 0; @@ -796,7 +796,7 @@ xfs_dir2_leafn_lookup_for_entry( (char *)curbp->b_addr); state->extrablk.magic =3D XFS_DIR2_DATA_MAGIC; curbp->b_ops =3D &xfs_dir3_data_buf_ops; - xfs_trans_buf_set_type(tp, curbp, XFS_BLF_DIR_DATA_BUF); + xfs_trans_buf_set_type(tp, curbp, XFS_BLFT_DIR_DATA_BUF); if (cmp =3D=3D XFS_CMP_EXACT) return XFS_ERROR(EEXIST); } @@ -811,7 +811,7 @@ xfs_dir2_leafn_lookup_for_entry( state->extrablk.blkno =3D curdb; state->extrablk.magic =3D XFS_DIR2_DATA_MAGIC; curbp->b_ops =3D &xfs_dir3_data_buf_ops; - xfs_trans_buf_set_type(tp, curbp, XFS_BLF_DIR_DATA_BUF); + xfs_trans_buf_set_type(tp, curbp, XFS_BLFT_DIR_DATA_BUF); } else { /* If the curbp is not the CI match block, drop it */ if (state->extrablk.bp !=3D curbp) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 008c4ea..bea5254 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1288,7 +1288,7 @@ xfs_ialloc_log_agi( /* * Log the allocation group inode header buffer. */ - xfs_trans_buf_set_type(tp, bp, XFS_BLF_AGI_BUF); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_AGI_BUF); xfs_trans_log_buf(tp, bp, first, last); } =20 =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-crc-pa= tchset-v2/xfs__add_crc_checks_to_the_superblock-2=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=000000600=000001750=000001750=0000000037000=0012132011547=00024033= =00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfs: a= dd CRC checks to the superblock =46rom: Dave Chinner With the addition of CRCs, there is such a wide and varied change to the on disk format that it makes sense to bump the superblock version number rather than try to use feature bits for all the new functionality. This commit introduces all the new superblock fields needed for all the new functionality: feature masks similar to ext4, separate project quota inodes, a LSN field for recovery and the CRC field. This commit does not bump the superblock version number, however. That will be done as a separate commit at the end of the series after all the new functionality is present so we switch it all on in one commit. This means that we can slowly introduce the changes without them being active and hence maintain bisectability of the tree. This patch is based on a patch originally written by myself back =66rom SGI days, which was subsequently modified by Christoph Hellwig. There is relatively little of that patch remaining, but the history of the patch still should be acknowledged here. Signed-off-by: Dave Chinner --- include/xfs_mount.h | 1 + include/xfs_sb.h | 100 ++++++++++++++++++++++++++++++++++++-----------= ---- libxfs/xfs_mount.c | 92 +++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 153 insertions(+), 40 deletions(-) diff --git a/include/xfs_mount.h b/include/xfs_mount.h index 28bbf46..68c02a9 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -391,6 +391,7 @@ struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *m= p, xfs_agnumber_t agno, int tag); void xfs_perag_put(struct xfs_perag *pag); =20 +extern void xfs_sb_calc_crc(struct xfs_buf *); extern void xfs_mod_sb(struct xfs_trans *, __int64_t); extern int xfs_initialize_perag(struct xfs_mount *, xfs_agnumber_t, xfs_agnumber_t *); diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 6a7f8b0..d6709db 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -32,6 +32,7 @@ struct xfs_mount; #define XFS_SB_VERSION_2 2 /* 6.2 - attributes */ #define XFS_SB_VERSION_3 3 /* 6.2 - new inode version */ #define XFS_SB_VERSION_4 4 /* 6.2+ - bitmask version */ +#define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */ #define XFS_SB_VERSION_NUMBITS 0x000f #define XFS_SB_VERSION_ALLFBITS 0xfff0 #define XFS_SB_VERSION_SASHFBITS 0xf000 @@ -161,6 +162,18 @@ typedef struct xfs_sb { */ __uint32_t sb_bad_features2; =20 + /* version 5 superblock fields start here */ + + /* feature masks */ + __uint32_t sb_features_compat; + __uint32_t sb_features_ro_compat; + __uint32_t sb_features_incompat; + + __uint32_t sb_crc; /* superblock crc */ + + xfs_ino_t sb_pquotino; /* project quota inode */ + xfs_lsn_t sb_lsn; /* last write sequence */ + /* must be padded to 64 bit alignment */ } xfs_sb_t; =20 @@ -229,7 +242,19 @@ typedef struct xfs_dsb { * for features2 bits. Easiest just to mark it bad and not use * it for anything else. */ - __be32 sb_bad_features2; + __be32 sb_bad_features2; + + /* version 5 superblock fields start here */ + + /* feature masks */ + __be32 sb_features_compat; + __be32 sb_features_ro_compat; + __be32 sb_features_incompat; + + __le32 sb_crc; /* superblock crc */ + + __be64 sb_pquotino; /* project quota inode */ + __be64 sb_lsn; /* last write sequence */ =20 /* must be padded to 64 bit alignment */ } xfs_dsb_t; @@ -250,7 +275,9 @@ typedef enum { XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN, XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, - XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, + XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, + XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, XFS_SBS_CRC, + XFS_SBS_PQUOTINO, XFS_SBS_LSN, XFS_SBS_FIELDCOUNT } xfs_sb_field_t; =20 @@ -276,6 +303,11 @@ typedef enum { #define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) #define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2) #define XFS_SB_BAD_FEATURES2 XFS_SB_MVAL(BAD_FEATURES2) +#define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) +#define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) +#define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) +#define XFS_SB_CRC XFS_SB_MVAL(CRC) +#define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO) #define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) #define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1) #define XFS_SB_MOD_BITS \ @@ -283,7 +315,8 @@ typedef enum { XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ - XFS_SB_BAD_FEATURES2) + XFS_SB_BAD_FEATURES2 | XFS_SB_FEATURES_COMPAT | \ + XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | XFS_SB_PQUOTINO) =20 =20 /* @@ -325,6 +358,8 @@ static inline int xfs_sb_good_version(xfs_sb_t *sbp) =20 return 1; } + if (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5) + return 1; =20 return 0; } @@ -365,7 +400,7 @@ static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) { return sbp->sb_versionnum =3D=3D XFS_SB_VERSION_2 || sbp->sb_versionnum =3D=3D XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && + (XFS_SB_VERSION_NUM(sbp) >=3D XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); } =20 @@ -373,7 +408,7 @@ static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) { if (sbp->sb_versionnum =3D=3D XFS_SB_VERSION_1) sbp->sb_versionnum =3D XFS_SB_VERSION_2; - else if (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4) + else if (XFS_SB_VERSION_NUM(sbp) >=3D XFS_SB_VERSION_4) sbp->sb_versionnum |=3D XFS_SB_VERSION_ATTRBIT; else sbp->sb_versionnum =3D XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; @@ -382,7 +417,7 @@ static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) { return sbp->sb_versionnum =3D=3D XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && + (XFS_SB_VERSION_NUM(sbp) >=3D XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); } =20 @@ -396,13 +431,13 @@ static inline void xfs_sb_version_addnlink(xfs_sb_t *= sbp) =20 static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >=3D XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); } =20 static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) { - if (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4) + if (XFS_SB_VERSION_NUM(sbp) >=3D XFS_SB_VERSION_4) sbp->sb_versionnum |=3D XFS_SB_VERSION_QUOTABIT; else sbp->sb_versionnum =3D xfs_sb_version_tonew(sbp->sb_versionnum) | @@ -411,13 +446,14 @@ static inline void xfs_sb_version_addquota(xfs_sb_t *= sbp) =20 static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT); + return (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) >=3D XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT)); } =20 static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >=3D XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); } =20 @@ -429,38 +465,42 @@ static inline int xfs_sb_version_hasshared(xfs_sb_t *= sbp) =20 static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); + return (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)); } =20 static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); + return (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) >=3D XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT)); } =20 static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); + return (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT)); } =20 static inline int xfs_sb_version_hassector(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >=3D XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); } =20 static inline int xfs_sb_version_hasasciici(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && + return XFS_SB_VERSION_NUM(sbp) >=3D XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); } =20 static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); + return (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5) || + (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT)); } =20 /* @@ -475,14 +515,16 @@ static inline int xfs_sb_version_hasmorebits(xfs_sb_t= *sbp) =20 static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp) { - return xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT); + return (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); } =20 static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp) { - return xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT); + return (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)); } =20 static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) @@ -500,8 +542,9 @@ static inline void xfs_sb_version_removeattr2(xfs_sb_t = *sbp) =20 static inline int xfs_sb_version_hasprojid32bit(xfs_sb_t *sbp) { - return xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT); + return (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)); } =20 static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp) @@ -513,8 +556,7 @@ static inline void xfs_sb_version_addprojid32bit(xfs_sb= _t *sbp) =20 static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) { - return (xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_CRCBIT)); + return XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5; } =20 /* diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index 7ab3519..07b892b 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -70,6 +70,12 @@ static const struct { { offsetof(xfs_sb_t, sb_logsunit), 0 }, { offsetof(xfs_sb_t, sb_features2), 0 }, { offsetof(xfs_sb_t, sb_bad_features2), 0 }, + { offsetof(xfs_sb_t, sb_features_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_incompat), 0 }, + { offsetof(xfs_sb_t, sb_crc), 0 }, + { offsetof(xfs_sb_t, sb_pquotino), 0 }, + { offsetof(xfs_sb_t, sb_lsn), 0 }, { sizeof(xfs_sb_t), 0 } }; =20 @@ -127,11 +133,23 @@ xfs_mount_validate_sb( return XFS_ERROR(EWRONGFS); } =20 + if (!xfs_sb_good_version(sbp)) { xfs_warn(mp, "bad version"); return XFS_ERROR(EWRONGFS); } =20 + /* + * Do not allow Version 5 superblocks to mount right now, even though + * support is in place. We need to implement the proper feature masks + * first. + */ + if (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5) { + xfs_alert(mp, + "Version 5 superblock detected. Experimental support not yet enabled!"); + return XFS_ERROR(EINVAL); + } + if (unlikely( sbp->sb_logstart =3D=3D 0 && mp->m_logdev =3D=3D mp->m_dev)) { xfs_warn(mp, @@ -264,6 +282,11 @@ xfs_sb_from_disk( to->sb_logsunit =3D be32_to_cpu(from->sb_logsunit); to->sb_features2 =3D be32_to_cpu(from->sb_features2); to->sb_bad_features2 =3D be32_to_cpu(from->sb_bad_features2); + to->sb_features_compat =3D be32_to_cpu(from->sb_features_compat); + to->sb_features_ro_compat =3D be32_to_cpu(from->sb_features_ro_compat); + to->sb_features_incompat =3D be32_to_cpu(from->sb_features_incompat); + to->sb_pquotino =3D be64_to_cpu(from->sb_pquotino); + to->sb_lsn =3D be64_to_cpu(from->sb_lsn); } =20 /* @@ -319,13 +342,12 @@ xfs_sb_to_disk( } } =20 -static void +static int xfs_sb_verify( struct xfs_buf *bp) { struct xfs_mount *mp =3D bp->b_target->bt_mount; struct xfs_sb sb; - int error; =20 xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); =20 @@ -333,16 +355,46 @@ xfs_sb_verify( * Only check the in progress field for the primary superblock as * mkfs.xfs doesn't clear it from secondary superblocks. */ - error =3D xfs_mount_validate_sb(mp, &sb, bp->b_bn =3D=3D XFS_SB_DADDR); - if (error) - xfs_buf_ioerror(bp, error); + return xfs_mount_validate_sb(mp, &sb, bp->b_bn =3D=3D XFS_SB_DADDR); } =20 +/* + * If the superblock has the CRC feature bit set or the CRC field is non-n= ull, + * check that the CRC is valid. We check the CRC field is non-null becaus= e a + * single bit error could clear the feature bit and unused parts of the + * superblock are supposed to be zero. Hence a non-null crc field indicate= s that + * we've potentially lost a feature bit and we should check it anyway. + */ static void xfs_sb_read_verify( struct xfs_buf *bp) { - xfs_sb_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_dsb *dsb =3D XFS_BUF_TO_SBP(bp); + int error; + + /* + * open code the version check to avoid needing to convert the entire + * superblock from disk order just to check the version number + */ + if (dsb->sb_magicnum =3D=3D cpu_to_be32(XFS_SB_MAGIC) && + (((be16_to_cpu(dsb->sb_versionnum) & XFS_SB_VERSION_NUMBITS) =3D=3D + XFS_SB_VERSION_5) || + dsb->sb_crc !=3D 0)) { + + if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), + offsetof(struct xfs_sb, sb_crc))) { + error =3D EFSCORRUPTED; + goto out_error; + } + } + error =3D xfs_sb_verify(bp); + +out_error: + if (error) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, error); + } } =20 /* @@ -355,11 +407,10 @@ static void xfs_sb_quiet_read_verify( struct xfs_buf *bp) { - struct xfs_sb sb; + struct xfs_dsb *dsb =3D XFS_BUF_TO_SBP(bp); =20 - xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); =20 - if (sb.sb_magicnum =3D=3D XFS_SB_MAGIC) { + if (dsb->sb_magicnum =3D=3D cpu_to_be32(XFS_SB_MAGIC)) { /* XFS filesystem, verify noisily! */ xfs_sb_read_verify(bp); return; @@ -370,9 +421,27 @@ xfs_sb_quiet_read_verify( =20 static void xfs_sb_write_verify( - struct xfs_buf *bp) + struct xfs_buf *bp) { - xfs_sb_verify(bp); + struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_buf_log_item *bip =3D bp->b_fspriv; + int error; + + error =3D xfs_sb_verify(bp); + if (error) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, error); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_SBP(bp)->sb_lsn =3D cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_sb, sb_crc)); } =20 const struct xfs_buf_ops xfs_sb_buf_ops =3D { @@ -525,5 +594,6 @@ xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) ASSERT((1LL << f) & XFS_SB_MOD_BITS); first =3D xfs_sb_info[f].offset; =20 + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); xfs_trans_log_buf(tp, bp, first, last); } xfsprogs-crc-patchset-v2/xfs-sb-v5-feature-masks=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000= 001750=0000000020573=0012132011547=00020471=00 0=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dav= e=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00xfs: implement extended feature masks =46rom: Dave Chinner The version 5 superblock has extended feature masks for compatible, incompatible and read-only compatible feature sets. Implement the masking and mount-time checking for these feature masks. Signed-off-by: Dave Chinner --- include/xfs_sb.h | 70 ++++++++++++++++++++++++++++++++++++++++= ++-- libxfs/xfs_mount.c | 41 ++++++++++++++++++++++---- logprint/log_print_trans.c | 18 ++++++++++++ 3 files changed, 122 insertions(+), 7 deletions(-) diff --git a/include/xfs_sb.h b/include/xfs_sb.h index d6709db..51db6f2 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -168,8 +168,10 @@ typedef struct xfs_sb { __uint32_t sb_features_compat; __uint32_t sb_features_ro_compat; __uint32_t sb_features_incompat; + __uint32_t sb_features_log_incompat; =20 __uint32_t sb_crc; /* superblock crc */ + __uint32_t sb_pad; =20 xfs_ino_t sb_pquotino; /* project quota inode */ xfs_lsn_t sb_lsn; /* last write sequence */ @@ -250,8 +252,10 @@ typedef struct xfs_dsb { __be32 sb_features_compat; __be32 sb_features_ro_compat; __be32 sb_features_incompat; + __be32 sb_features_log_incompat; =20 __le32 sb_crc; /* superblock crc */ + __be32 sb_pad; =20 __be64 sb_pquotino; /* project quota inode */ __be64 sb_lsn; /* last write sequence */ @@ -276,7 +280,8 @@ typedef enum { XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, - XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, XFS_SBS_CRC, + XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, + XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, XFS_SBS_PQUOTINO, XFS_SBS_LSN, XFS_SBS_FIELDCOUNT } xfs_sb_field_t; @@ -306,6 +311,7 @@ typedef enum { #define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) #define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) #define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) +#define XFS_SB_FEATURES_LOG_INCOMPAT XFS_SB_MVAL(FEATURES_LOG_INCOMPAT) #define XFS_SB_CRC XFS_SB_MVAL(CRC) #define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO) #define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) @@ -316,7 +322,8 @@ typedef enum { XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ XFS_SB_BAD_FEATURES2 | XFS_SB_FEATURES_COMPAT | \ - XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | XFS_SB_PQUOTINO) + XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | \ + XFS_SB_FEATURES_LOG_INCOMPAT | XFS_SB_PQUOTINO) =20 =20 /* @@ -559,6 +566,65 @@ static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) return XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5; } =20 + +/* + * Extended v5 superblock feature masks. These are to be used for new v5 + * superblock features only. + * + * Compat features are new features that old kernels will not notice or af= fect + * and so can mount read-write without issues. + * + * RO-Compat (read only) are features that old kernels can read but will b= reak + * if they write. Hence only read-only mounts of such filesystems are allo= wed on + * kernels that don't support the feature bit. + * + * InCompat features are features which old kernels will not understand an= d so + * must not mount. + * + * Log-InCompat features are for changes to log formats or new transaction= s that + * can't be replayed on older kernels. The fields are set when the filesys= tem is + * mounted, and a clean unmount clears the fields. + */ +#define XFS_SB_FEAT_COMPAT_ALL 0 +#define XFS_SB_FEAT_COMPAT_UNKNOWN ~XFS_SB_FEAT_COMPAT_ALL +static inline bool +xfs_sb_has_compat_feature( + struct xfs_sb *sbp, + __uint32_t feature) +{ + return (sbp->sb_features_compat & feature) !=3D 0; +} + +#define XFS_SB_FEAT_RO_COMPAT_ALL 0 +#define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL +static inline bool +xfs_sb_has_ro_compat_feature( + struct xfs_sb *sbp, + __uint32_t feature) +{ + return (sbp->sb_features_ro_compat & feature) !=3D 0; +} + +#define XFS_SB_FEAT_INCOMPAT_ALL 0 +#define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL +static inline bool +xfs_sb_has_incompat_feature( + struct xfs_sb *sbp, + __uint32_t feature) +{ + return (sbp->sb_features_incompat & feature) !=3D 0; +} + +#define XFS_SB_FEAT_INCOMPAT_LOG_ALL 0 +#define XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_LOG_ALL +static inline bool +xfs_sb_has_incompat_log_feature( + struct xfs_sb *sbp, + __uint32_t feature) +{ + return (sbp->sb_features_log_incompat & feature) !=3D 0; +} + /* * end of superblock version macros */ diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index 07b892b..f7daa2f 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -73,7 +73,9 @@ static const struct { { offsetof(xfs_sb_t, sb_features_compat), 0 }, { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, { offsetof(xfs_sb_t, sb_features_incompat), 0 }, + { offsetof(xfs_sb_t, sb_features_log_incompat), 0 }, { offsetof(xfs_sb_t, sb_crc), 0 }, + { offsetof(xfs_sb_t, sb_pad), 0 }, { offsetof(xfs_sb_t, sb_pquotino), 0 }, { offsetof(xfs_sb_t, sb_lsn), 0 }, { sizeof(xfs_sb_t), 0 } @@ -140,14 +142,40 @@ xfs_mount_validate_sb( } =20 /* - * Do not allow Version 5 superblocks to mount right now, even though - * support is in place. We need to implement the proper feature masks - * first. + * Version 5 superblock feature mask validation. Reject combinations the + * kernel cannot support up front before checking anything else. */ if (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5) { xfs_alert(mp, - "Version 5 superblock detected. Experimental support not yet enabled!"); - return XFS_ERROR(EINVAL); +"Version 5 superblock detected. xfsprogs has EXPERIMENTAL support enabled!= \n" +"Use of these features is at your own risk!"); + + if (xfs_sb_has_compat_feature(sbp, + XFS_SB_FEAT_COMPAT_UNKNOWN)) { + xfs_warn(mp, +"Superblock has unknown compatible features (0x%x) enabled.\n" +"Using a more recent xfsprogs is recommended.", + (sbp->sb_features_compat & + XFS_SB_FEAT_COMPAT_UNKNOWN)); + } + + if (xfs_sb_has_ro_compat_feature(sbp, + XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) { + xfs_warn(mp, +"Superblock has unknown read-only compatible features (0x%x) enabled.\n" +"Using a more recent xfsprogs is recommended.", + (sbp->sb_features_ro_compat & + XFS_SB_FEAT_RO_COMPAT_UNKNOWN)); + } + if (xfs_sb_has_incompat_feature(sbp, + XFS_SB_FEAT_INCOMPAT_UNKNOWN)) { + xfs_warn(mp, +"Superblock has unknown incompatible features (0x%x) enabled.\n" +"Filesystem can not be safely operated on by this xfsprogs installation", + (sbp->sb_features_incompat & + XFS_SB_FEAT_INCOMPAT_UNKNOWN)); + return XFS_ERROR(EINVAL); + } } =20 if (unlikely( @@ -285,6 +313,9 @@ xfs_sb_from_disk( to->sb_features_compat =3D be32_to_cpu(from->sb_features_compat); to->sb_features_ro_compat =3D be32_to_cpu(from->sb_features_ro_compat); to->sb_features_incompat =3D be32_to_cpu(from->sb_features_incompat); + to->sb_features_log_incompat =3D + be32_to_cpu(from->sb_features_log_incompat); + to->sb_pad =3D 0; to->sb_pquotino =3D be64_to_cpu(from->sb_pquotino); to->sb_lsn =3D be64_to_cpu(from->sb_lsn); } diff --git a/logprint/log_print_trans.c b/logprint/log_print_trans.c index 86e1c42..2dd3a10 100644 --- a/logprint/log_print_trans.c +++ b/logprint/log_print_trans.c @@ -68,6 +68,24 @@ xfs_log_print_trans( =20 if (head_blk =3D=3D tail_blk) return; + + /* + * Version 5 superblock log feature mask validation. We know the + * log is dirty so check if there are any unknown log features + * in what we need to recover. If there are unknown features + * (e.g. unsupported transactions) then warn about it. + */ + if (XFS_SB_VERSION_NUM(&log->l_mp->m_sb) =3D=3D XFS_SB_VERSION_5 && + xfs_sb_has_incompat_log_feature(&log->l_mp->m_sb, + XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN)) { + printf(_( +"Superblock has unknown incompatible log features (0x%x) enabled.\n" +"Output may be incomplete or inaccurate. It is recommended that you\n" +"upgrade your xfsprogs installation to match the filesystem features.\n"), + (log->l_mp->m_sb.sb_features_log_incompat & + XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN)); + } + if ((error =3D xlog_do_recovery_pass(log, head_blk, tail_blk, XLOG_RECOVE= R_PASS1))) { fprintf(stderr, _("%s: failed in xfs_do_recovery_pass, error: %d\n"), progname, error); =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00xfsprogs-crc-patchset-v2/xfsprogs-mkfs-crc-support= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= 0000600=000001750=000001750=0000000225673=0012132011547=00021272=00 0=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar = =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs: introduc= e CRC support into mkfs.xfs =46rom: Dave Chinner Signed-off-by: Dave Chinner --- copy/xfs_copy.c | 5 +- db/sb.c | 6 +- include/libxfs.h | 85 ++++++++++++++---------- include/libxlog.h | 2 +- libxfs/init.c | 20 +++--- libxfs/logitem.c | 4 +- libxfs/rdwr.c | 143 ++++++++++++++++++++++++++------------- libxfs/trans.c | 8 +-- libxfs/xfs.h | 15 +++-- libxfs/xfs_alloc.c | 10 +-- libxfs/xfs_alloc_btree.c | 6 +- libxfs/xfs_attr_leaf.c | 6 +- libxfs/xfs_attr_remote.c | 6 +- libxfs/xfs_bmap_btree.c | 6 +- libxfs/xfs_btree.c | 8 +-- libxfs/xfs_da_btree.c | 6 +- libxfs/xfs_dir2_block.c | 6 +- libxfs/xfs_dir2_data.c | 10 +-- libxfs/xfs_dir2_leaf.c | 6 +- libxfs/xfs_dir2_node.c | 6 +- libxfs/xfs_ialloc.c | 6 +- libxfs/xfs_ialloc_btree.c | 6 +- libxfs/xfs_inode.c | 4 +- libxfs/xfs_mount.c | 18 +++-- libxfs/xfs_symlink.c | 8 +-- logprint/logprint.c | 3 +- mkfs/maxtrres.c | 4 +- mkfs/proto.c | 4 +- mkfs/xfs_mkfs.c | 162 +++++++++++++++++++++++++++++++++++------= ---- mkfs/xfs_mkfs.h | 12 ++-- repair/attr_repair.c | 6 +- repair/dino_chunks.c | 8 ++- repair/dinode.c | 10 +-- repair/dir.c | 8 +-- repair/dir2.c | 2 +- repair/phase2.c | 5 +- repair/phase3.c | 2 +- repair/phase6.c | 8 +-- repair/prefetch.c | 4 +- repair/rt.c | 4 +- repair/scan.c | 12 ++-- repair/xfs_repair.c | 7 +- 42 files changed, 423 insertions(+), 244 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index c01e0b9..7dc7d9a 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -674,8 +674,11 @@ main(int argc, char **argv) =20 /* prepare the mount structure */ =20 - sbp =3D libxfs_readbuf(xargs.ddev, XFS_SB_DADDR, 1, 0); memset(&mbuf, 0, sizeof(xfs_mount_t)); + mbuf.m_ddev_targ.dev =3D xargs.ddev; + mbuf.m_ddev_targ.bt_mount =3D &mbuf; + sbp =3D libxfs_readbuf(mbuf.m_ddev_targ, XFS_SB_DADDR, 1, 0, + &xfs_sb_buf_ops); sb =3D &mbuf.m_sb; libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbp)); =20 diff --git a/db/sb.c b/db/sb.c index d83db9c..f99210c 100644 --- a/db/sb.c +++ b/db/sb.c @@ -235,7 +235,8 @@ sb_logcheck(void) x.logdev =3D x.ddev; x.logBBsize =3D XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); x.logBBstart =3D XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart); - log.l_dev =3D (mp->m_sb.sb_logstart =3D=3D 0) ? x.logdev : x.ddev; + log.l_dev.dev =3D (mp->m_sb.sb_logstart =3D=3D 0) ? x.logdev : x.ddev; + log.l_dev.bt_mount =3D mp; log.l_logsize =3D BBTOB(log.l_logBBsize); log.l_logBBsize =3D x.logBBsize; log.l_logBBstart =3D x.logBBstart; @@ -266,8 +267,7 @@ sb_logzero(uuid_t *uuidp) =20 dbprintf(_("Clearing log and setting UUID\n")); =20 - if (libxfs_log_clear( - (mp->m_sb.sb_logstart =3D=3D 0) ? x.logdev : x.ddev, + if (libxfs_log_clear(mp->m_logdev_targ, XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart), (xfs_extlen_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks), uuidp, diff --git a/include/libxfs.h b/include/libxfs.h index 972d850..8ee4eaa 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -116,6 +116,16 @@ typedef struct { #define LIBXFS_EXCLUSIVELY 0x0010 /* disallow other accesses (O_EXCL) */ #define LIBXFS_DIRECT 0x0020 /* can use direct I/O, not buffered */ =20 +/* + * IO verifier callbacks need the xfs_mount pointer, so we have to behave + * somewhat like the kernel now for userspace IO in terms of having buftarg + * based devices... + */ +struct xfs_buftarg { + struct xfs_mount *bt_mount; + dev_t dev; +}; + extern char *progname; extern int libxfs_init (libxfs_init_t *); extern void libxfs_destroy (void); @@ -130,11 +140,12 @@ extern void platform_findsizes(char *path, int fd, lo= ng long *sz, int *bsz); /* check or write log footer: specify device, log size in blocks & uuid */ typedef xfs_caddr_t (libxfs_get_block_t)(xfs_caddr_t, int, void *); =20 -extern int libxfs_log_clear (dev_t, xfs_daddr_t, uint, uuid_t *, +extern int libxfs_log_clear (struct xfs_buftarg, xfs_daddr_t, uint, uuid_t= *, int, int, int); extern int libxfs_log_header (xfs_caddr_t, uuid_t *, int, int, int, libxfs_get_block_t *, void *); =20 + /* * Define a user-level mount structure with all we need * in order to make use of the numerous XFS_* macros. @@ -151,9 +162,12 @@ typedef struct xfs_mount { struct xfs_inode *m_rbmip; /* pointer to bitmap inode */ struct xfs_inode *m_rsumip; /* pointer to summary inode */ struct xfs_inode *m_rootip; /* pointer to root directory */ - dev_t m_dev; - dev_t m_logdev; - dev_t m_rtdev; + struct xfs_buftarg m_ddev_targ; + struct xfs_buftarg m_logdev_targ; + struct xfs_buftarg m_rtdev_targ; +#define m_dev m_ddev_targ +#define m_logdev m_logdev_targ +#define m_rtdev m_rtdev_targ __uint8_t m_dircook_elog; /* log d-cookie entry bits */ __uint8_t m_blkbit_log; /* blocklog + NBBY */ __uint8_t m_blkbb_log; /* blocklog - BBSHIFT */ @@ -218,11 +232,6 @@ extern void libxfs_rtmount_destroy (xfs_mount_t *); /* * Simple I/O interface */ -typedef struct xfs_buftarg { - struct xfs_mount *bt_mount; - dev_t dev; -} xfs_buftarg_t; - #define XB_PAGES 2 =20 struct xfs_buf_map { @@ -244,7 +253,8 @@ typedef struct xfs_buf { xfs_daddr_t b_bn; unsigned b_bcount; unsigned int b_length; - dev_t b_dev; + struct xfs_buftarg b_target; +#define b_dev b_target.dev pthread_mutex_t b_lock; pthread_t b_holder; unsigned int b_recur; @@ -254,7 +264,6 @@ typedef struct xfs_buf { void *b_addr; int b_error; const struct xfs_buf_ops *b_ops; - struct xfs_buftarg *b_target; struct xfs_perag *b_pag; struct xfs_buf_map *b_map; int b_nmaps; @@ -315,12 +324,12 @@ extern struct cache_operations libxfs_bcache_operatio= ns; =20 #ifdef XFS_BUF_TRACING =20 -#define libxfs_readbuf(dev, daddr, len, flags) \ +#define libxfs_readbuf(dev, daddr, len, flags, ops) \ libxfs_trace_readbuf(__FUNCTION__, __FILE__, __LINE__, \ - (dev), (daddr), (len), (flags)) -#define libxfs_readbuf_map(dev, map, nmaps, flags) \ + (dev), (daddr), (len), (flags), (ops)) +#define libxfs_readbuf_map(dev, map, nmaps, flags, ops) \ libxfs_trace_readbuf_map(__FUNCTION__, __FILE__, __LINE__, \ - (dev), (map), (nmaps), (flags)) + (dev), (map), (nmaps), (flags), (ops)) #define libxfs_writebuf(buf, flags) \ libxfs_trace_writebuf(__FUNCTION__, __FILE__, __LINE__, \ (buf), (flags)) @@ -337,28 +346,34 @@ extern struct cache_operations libxfs_bcache_operatio= ns; libxfs_trace_putbuf(__FUNCTION__, __FILE__, __LINE__, (buf)) =20 extern xfs_buf_t *libxfs_trace_readbuf(const char *, const char *, int, - dev_t, xfs_daddr_t, int, int); + struct xfs_buftarg, xfs_daddr_t, int, int, + const struct xfs_buf_ops *); extern xfs_buf_t *libxfs_trace_readbuf_map(const char *, const char *, int, - dev_t, struct xfs_buf_map *, int, int); + struct xfs_buftarg, struct xfs_buf_map *, int, int, + const struct xfs_buf_ops *); extern int libxfs_trace_writebuf(const char *, const char *, int, xfs_buf_t *, int); extern xfs_buf_t *libxfs_trace_getbuf(const char *, const char *, int, - dev_t, xfs_daddr_t, int); + struct xfs_buftarg, xfs_daddr_t, int); extern xfs_buf_t *libxfs_trace_getbuf_map(const char *, const char *, int, - dev_t, struct xfs_buf_map *, int); + struct xfs_buftarg, struct xfs_buf_map *, int); extern xfs_buf_t *libxfs_trace_getbuf_flags(const char *, const char *, in= t, - dev_t, xfs_daddr_t, int, unsigned int); + struct xfs_buftarg, xfs_daddr_t, int, unsigned int); extern void libxfs_trace_putbuf (const char *, const char *, int, xfs_buf_t *); =20 #else =20 -extern xfs_buf_t *libxfs_readbuf(dev_t, xfs_daddr_t, int, int); -extern xfs_buf_t *libxfs_readbuf_map(dev_t, struct xfs_buf_map *, int, int= ); +extern xfs_buf_t *libxfs_readbuf(struct xfs_buftarg, xfs_daddr_t, int, int, + const struct xfs_buf_ops *); +extern xfs_buf_t *libxfs_readbuf_map(struct xfs_buftarg, struct xfs_buf_ma= p *, + int, int, const struct xfs_buf_ops *); extern int libxfs_writebuf(xfs_buf_t *, int); -extern xfs_buf_t *libxfs_getbuf(dev_t, xfs_daddr_t, int); -extern xfs_buf_t *libxfs_getbuf_map(dev_t, struct xfs_buf_map *, int); -extern xfs_buf_t *libxfs_getbuf_flags(dev_t, xfs_daddr_t, int, unsigned in= t); +extern xfs_buf_t *libxfs_getbuf(struct xfs_buftarg, xfs_daddr_t, int); +extern xfs_buf_t *libxfs_getbuf_map(struct xfs_buftarg, + struct xfs_buf_map *, int); +extern xfs_buf_t *libxfs_getbuf_flags(struct xfs_buftarg, xfs_daddr_t, + int, unsigned int); extern void libxfs_putbuf (xfs_buf_t *); =20 #endif @@ -371,11 +386,11 @@ extern int libxfs_bcache_overflowed(void); extern int libxfs_bcache_usage(void); =20 /* Buffer (Raw) Interfaces */ -extern xfs_buf_t *libxfs_getbufr(dev_t, xfs_daddr_t, int); +extern xfs_buf_t *libxfs_getbufr(struct xfs_buftarg, xfs_daddr_t, int); extern void libxfs_putbufr(xfs_buf_t *); =20 extern int libxfs_writebuf_int(xfs_buf_t *, int); -extern int libxfs_readbufr(dev_t, xfs_daddr_t, xfs_buf_t *, int, int); +extern int libxfs_readbufr(struct xfs_buftarg, xfs_daddr_t, xfs_buf_t *, i= nt, int); =20 extern int libxfs_bhash_size; extern int libxfs_ihash_size; @@ -461,14 +476,15 @@ extern int libxfs_trans_read_buf (xfs_mount_t *, xfs_= trans_t *, dev_t, xfs_daddr_t, int, uint, struct xfs_buf **); */ =20 -struct xfs_buf *libxfs_trans_get_buf_map(struct xfs_trans *tp, dev_t dev, - struct xfs_buf_map *map, int nmaps, - uint flags); +struct xfs_buf *libxfs_trans_get_buf_map(struct xfs_trans *tp, + struct xfs_buftarg dev, + struct xfs_buf_map *map, int nmaps, + uint flags); =20 static inline struct xfs_buf * libxfs_trans_get_buf( struct xfs_trans *tp, - dev_t dev, + struct xfs_buftarg dev, xfs_daddr_t blkno, int numblks, uint flags) @@ -478,7 +494,8 @@ libxfs_trans_get_buf( } =20 int libxfs_trans_read_buf_map(struct xfs_mount *mp, - struct xfs_trans *tp, dev_t dev, + struct xfs_trans *tp, + struct xfs_buftarg dev, struct xfs_buf_map *map, int nmaps, uint flags, struct xfs_buf **bpp, const struct xfs_buf_ops *ops); @@ -487,7 +504,7 @@ static inline int libxfs_trans_read_buf( struct xfs_mount *mp, struct xfs_trans *tp, - dev_t dev, + struct xfs_buftarg dev, xfs_daddr_t blkno, int numblks, uint flags, @@ -507,7 +524,7 @@ typedef struct xfs_inode { xfs_mount_t *i_mount; /* fs mount struct ptr */ xfs_ino_t i_ino; /* inode number (agno/agino) */ struct xfs_imap i_imap; /* location for xfs_imap() */ - dev_t i_dev; /* dev for this inode */ + struct xfs_buftarg i_dev; /* dev for this inode */ xfs_ifork_t *i_afp; /* attribute fork pointer */ xfs_ifork_t i_df; /* data fork */ xfs_trans_t *i_transp; /* ptr to owning transaction */ diff --git a/include/libxlog.h b/include/libxlog.h index 36ede59..37cbc68 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -28,7 +28,7 @@ struct xlog { xfs_lsn_t l_tail_lsn; /* lsn of 1st LR w/ unflush buffers */ xfs_lsn_t l_last_sync_lsn;/* lsn of last LR on disk */ xfs_mount_t *l_mp; /* mount point */ - dev_t l_dev; /* dev_t of log */ + struct xfs_buftarg l_dev; /* dev_t of log */ xfs_daddr_t l_logBBstart; /* start block of log */ int l_logsize; /* size of log in bytes */ int l_logBBsize; /* size of log in 512 byte chunks */ diff --git a/libxfs/init.c b/libxfs/init.c index 1b11fb0..55a17d2 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -457,7 +457,7 @@ rtmount_init( sbp =3D &mp->m_sb; if (sbp->sb_rblocks =3D=3D 0) return 0; - if (mp->m_rtdev =3D=3D 0 && !(flags & LIBXFS_MOUNT_DEBUGGER)) { + if (mp->m_rtdev.dev =3D=3D 0 && !(flags & LIBXFS_MOUNT_DEBUGGER)) { fprintf(stderr, _("%s: filesystem has a realtime subvolume\n"), progname); return -1; @@ -486,7 +486,7 @@ rtmount_init( return -1; } bp =3D libxfs_readbuf(mp->m_rtdev, - d - XFS_FSB_TO_BB(mp, 1), XFS_FSB_TO_BB(mp, 1), 0); + d - XFS_FSB_TO_BB(mp, 1), XFS_FSB_TO_BB(mp, 1), 0, NULL); if (bp =3D=3D NULL) { fprintf(stderr, _("%s: realtime size check failed\n"), progname); @@ -634,9 +634,13 @@ libxfs_mount( xfs_sb_t *sbp; int error; =20 - mp->m_dev =3D dev; - mp->m_rtdev =3D rtdev; - mp->m_logdev =3D logdev; + mp->m_ddev_targ.dev =3D dev; + mp->m_ddev_targ.bt_mount =3D mp; + mp->m_logdev_targ.dev =3D logdev; + mp->m_logdev_targ.bt_mount =3D mp; + mp->m_rtdev_targ.dev =3D rtdev; + mp->m_rtdev_targ.bt_mount =3D mp; + mp->m_flags =3D (LIBXFS_MOUNT_32BITINODES|LIBXFS_MOUNT_32BITINOOPT); mp->m_sb =3D *sb; INIT_RADIX_TREE(&mp->m_perag_tree, GFP_KERNEL); @@ -720,7 +724,7 @@ libxfs_mount( =20 bp =3D libxfs_readbuf(mp->m_dev, d - XFS_FSS_TO_BB(mp, 1), XFS_FSS_TO_BB(mp, 1), - !(flags & LIBXFS_MOUNT_DEBUGGER)); + !(flags & LIBXFS_MOUNT_DEBUGGER), NULL); if (!bp) { fprintf(stderr, _("%s: data size check failed\n"), progname); if (!(flags & LIBXFS_MOUNT_DEBUGGER)) @@ -728,13 +732,13 @@ libxfs_mount( } else libxfs_putbuf(bp); =20 - if (mp->m_logdev && mp->m_logdev !=3D mp->m_dev) { + if (mp->m_logdev.dev && mp->m_logdev.dev !=3D mp->m_dev.dev) { d =3D (xfs_daddr_t) XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); if ( (XFS_BB_TO_FSB(mp, d) !=3D mp->m_sb.sb_logblocks) || (!(bp =3D libxfs_readbuf(mp->m_logdev, d - XFS_FSB_TO_BB(mp, 1), XFS_FSB_TO_BB(mp, 1), - !(flags & LIBXFS_MOUNT_DEBUGGER)))) ) { + !(flags & LIBXFS_MOUNT_DEBUGGER), NULL))) ) { fprintf(stderr, _("%s: log size checks failed\n"), progname); if (!(flags & LIBXFS_MOUNT_DEBUGGER)) diff --git a/libxfs/logitem.c b/libxfs/logitem.c index 84e4c14..f298aa0 100644 --- a/libxfs/logitem.c +++ b/libxfs/logitem.c @@ -32,7 +32,7 @@ kmem_zone_t *xfs_ili_zone; /* inode log item zone */ xfs_buf_t * xfs_trans_buf_item_match( xfs_trans_t *tp, - dev_t dev, + struct xfs_buftarg dev, struct xfs_buf_map *map, int nmaps) { @@ -47,7 +47,7 @@ xfs_trans_buf_item_match( list_for_each_entry(lidp, &tp->t_items, lid_trans) { blip =3D (struct xfs_buf_log_item *)lidp->lid_item; if (blip->bli_item.li_type =3D=3D XFS_LI_BUF && - blip->bli_buf->b_dev =3D=3D dev && + blip->bli_buf->b_target.dev =3D=3D dev.dev && XFS_BUF_ADDR(blip->bli_buf) =3D=3D map[0].bm_bn && blip->bli_buf->b_bcount =3D=3D BBTOB(len)) { ASSERT(blip->bli_buf->b_map_count =3D=3D nmaps); diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index e9cc7b1..db4ed6e 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -102,7 +102,7 @@ static xfs_caddr_t next(xfs_caddr_t ptr, int offset, vo= id *private) =20 int libxfs_log_clear( - dev_t device, + struct xfs_buftarg device, xfs_daddr_t start, uint length, uuid_t *fs_uuid, @@ -113,11 +113,11 @@ libxfs_log_clear( xfs_buf_t *bp; int len; =20 - if (!device || !fs_uuid) + if (!device.dev || !fs_uuid) return -EINVAL; =20 /* first zero the log */ - libxfs_device_zero(device, start, length); + libxfs_device_zero(device.dev, start, length); =20 /* then write a log record header */ len =3D ((version =3D=3D 2) && sunit) ? BTOBB(sunit) : 2; @@ -200,12 +200,15 @@ libxfs_log_header( #undef libxfs_getbuf_flags #undef libxfs_putbuf =20 -xfs_buf_t *libxfs_readbuf(dev_t, xfs_daddr_t, int, int); -xfs_buf_t *libxfs_readbuf_map(dev_t, struct xfs_buf_map *, int, int); +xfs_buf_t *libxfs_readbuf(struct xfs_buftarg, xfs_daddr_t, int, int, + const struct xfs_buf_map *); +xfs_buf_t *libxfs_readbuf_map(struct xfs_buftarg, struct xfs_buf_map *, + int, int, const struct xfs_buf_map *); int libxfs_writebuf(xfs_buf_t *, int); -xfs_buf_t *libxfs_getbuf(dev_t, xfs_daddr_t, int); -xfs_buf_t *libxfs_getbuf_map(dev_t, struct xfs_buf_map *, int); -xfs_buf_t *libxfs_getbuf_flags(dev_t, xfs_daddr_t, int, unsigned int); +xfs_buf_t *libxfs_getbuf(struct xfs_buftarg, xfs_daddr_t, int); +xfs_buf_t *libxfs_getbuf_map(struct xfs_buftarg, struct xfs_buf_map *, int= ); +xfs_buf_t *libxfs_getbuf_flags(struct xfs_buftarg, xfs_daddr_t, int, + unsigned int); void libxfs_putbuf (xfs_buf_t *); =20 #define __add_trace(bp, func, file, line) \ @@ -219,18 +222,20 @@ do { \ =20 xfs_buf_t * libxfs_trace_readbuf(const char *func, const char *file, int line, - dev_t dev, xfs_daddr_t blkno, int len, int flags) + struct xfs_buftarg dev, xfs_daddr_t blkno, int len, int flags, + const struct xfs_buf_ops *ops) { - xfs_buf_t *bp =3D libxfs_readbuf(dev, blkno, len, flags); + xfs_buf_t *bp =3D libxfs_readbuf(dev, blkno, len, flags, ops); __add_trace(bp, func, file, line); return bp; } =20 xfs_buf_t * libxfs_trace_readbuf_map(const char *func, const char *file, int line, - dev_t dev, struct xfs_buf_map *map, int nmaps, int flags) + struct xfs_buftarg dev, struct xfs_buf_map *map, int nmaps, int flags, + const struct xfs_buf_ops *ops) { - xfs_buf_t *bp =3D libxfs_readbuf_map(dev, map, nmaps, flags); + xfs_buf_t *bp =3D libxfs_readbuf_map(dev, map, nmaps, flags, ops); __add_trace(bp, func, file, line); return bp; } @@ -244,7 +249,7 @@ libxfs_trace_writebuf(const char *func, const char *fil= e, int line, xfs_buf_t *b =20 xfs_buf_t * libxfs_trace_getbuf(const char *func, const char *file, int line, - dev_t device, xfs_daddr_t blkno, int len) + struct xfs_buftarg device, xfs_daddr_t blkno, int len) { xfs_buf_t *bp =3D libxfs_getbuf(device, blkno, len); __add_trace(bp, func, file, line); @@ -253,7 +258,7 @@ libxfs_trace_getbuf(const char *func, const char *file,= int line, =20 xfs_buf_t * libxfs_trace_getbuf_map(const char *func, const char *file, int line, - dev_t device, struct xfs_buf_map *map, int nmaps) + struct xfs_buftarg device, struct xfs_buf_map *map, int nmaps) { xfs_buf_t *bp =3D libxfs_getbuf_map(device, map, nmaps); __add_trace(bp, func, file, line); @@ -262,7 +267,7 @@ libxfs_trace_getbuf_map(const char *func, const char *f= ile, int line, =20 xfs_buf_t * libxfs_trace_getbuf_flags(const char *func, const char *file, int line, - dev_t device, xfs_daddr_t blkno, int len, unsigned int flags) + struct xfs_buftarg device, xfs_daddr_t blkno, int len, unsigned int flag= s) { xfs_buf_t *bp =3D libxfs_getbuf_flags(device, blkno, len, flags); __add_trace(bp, func, file, line); @@ -284,7 +289,7 @@ xfs_buf_t * libxfs_getsb(xfs_mount_t *mp, int flags) { return libxfs_readbuf(mp->m_dev, XFS_SB_DADDR, - XFS_FSS_TO_BB(mp, 1), flags); + XFS_FSS_TO_BB(mp, 1), flags, &xfs_sb_buf_ops); } =20 kmem_zone_t *xfs_buf_zone; @@ -302,7 +307,7 @@ static struct cache_mru xfs_buf_freelist =3D * buffer initialisation instead of a contiguous buffer. */ struct xfs_bufkey { - dev_t device; + struct xfs_buftarg device; xfs_daddr_t blkno; unsigned int bblen; struct xfs_buf_map *map; @@ -322,7 +327,7 @@ libxfs_bcompare(struct cache_node *node, cache_key_t ke= y) struct xfs_bufkey *bkey =3D (struct xfs_bufkey *)key; =20 #ifdef IO_BCOMPARE_CHECK - if (bp->b_dev =3D=3D bkey->device && + if (bp->b_target.dev =3D=3D bkey->device.dev && bp->b_bn =3D=3D bkey->blkno && bp->b_bcount !=3D BBTOB(bkey->bblen)) fprintf(stderr, "%lx: Badness in key lookup (length)\n" @@ -332,7 +337,7 @@ libxfs_bcompare(struct cache_node *node, cache_key_t ke= y) (unsigned long long)bkey->blkno, BBTOB(bkey->bblen)); #endif =20 - return (bp->b_dev =3D=3D bkey->device && + return (bp->b_target.dev =3D=3D bkey->device.dev && bp->b_bn =3D=3D bkey->blkno && bp->b_bcount =3D=3D BBTOB(bkey->bblen)); } @@ -346,13 +351,14 @@ libxfs_bprint(xfs_buf_t *bp) } =20 static void -__initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int bytes) +__initbuf(xfs_buf_t *bp, struct xfs_buftarg device, xfs_daddr_t bno, + unsigned int bytes) { bp->b_flags =3D 0; bp->b_bn =3D bno; bp->b_bcount =3D bytes; bp->b_length =3D BTOBB(bytes); - bp->b_dev =3D device; + bp->b_target =3D device; bp->b_error =3D 0; if (!bp->b_addr) bp->b_addr =3D memalign(libxfs_device_alignment(), bytes); @@ -372,13 +378,15 @@ __initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bn= o, unsigned int bytes) } =20 static void -libxfs_initbuf(xfs_buf_t *bp, dev_t device, xfs_daddr_t bno, unsigned int = bytes) +libxfs_initbuf(xfs_buf_t *bp, struct xfs_buftarg device, xfs_daddr_t bno, + unsigned int bytes) { __initbuf(bp, device, bno, bytes); } =20 static void -libxfs_initbuf_map(xfs_buf_t *bp, dev_t device, struct xfs_buf_map *map, i= nt nmaps) +libxfs_initbuf_map(xfs_buf_t *bp, struct xfs_buftarg device, + struct xfs_buf_map *map, int nmaps) { unsigned int bytes =3D 0; int i; @@ -441,7 +449,7 @@ __libxfs_getbufr(int blen) } =20 xfs_buf_t * -libxfs_getbufr(dev_t device, xfs_daddr_t blkno, int bblen) +libxfs_getbufr(struct xfs_buftarg device, xfs_daddr_t blkno, int bblen) { xfs_buf_t *bp; int blen =3D BBTOB(bblen); @@ -459,7 +467,7 @@ libxfs_getbufr(dev_t device, xfs_daddr_t blkno, int bbl= en) } =20 xfs_buf_t * -libxfs_getbufr_map(dev_t device, xfs_daddr_t blkno, int bblen, +libxfs_getbufr_map(struct xfs_buftarg device, xfs_daddr_t blkno, int bblen, struct xfs_buf_map *map, int nmaps) { xfs_buf_t *bp; @@ -552,9 +560,10 @@ out_put: } =20 struct xfs_buf * -libxfs_getbuf_flags(dev_t device, xfs_daddr_t blkno, int len, unsigned int= flags) +libxfs_getbuf_flags(struct xfs_buftarg device, xfs_daddr_t blkno, int len, + unsigned int flags) { - struct xfs_bufkey key =3D {0}; + struct xfs_bufkey key =3D {{0}}; =20 key.device =3D device; key.blkno =3D blkno; @@ -564,15 +573,15 @@ libxfs_getbuf_flags(dev_t device, xfs_daddr_t blkno, = int len, unsigned int flags } =20 struct xfs_buf * -libxfs_getbuf(dev_t device, xfs_daddr_t blkno, int len) +libxfs_getbuf(struct xfs_buftarg device, xfs_daddr_t blkno, int len) { return libxfs_getbuf_flags(device, blkno, len, 0); } =20 struct xfs_buf * -libxfs_getbuf_map(dev_t device, struct xfs_buf_map *map, int nmaps) +libxfs_getbuf_map(struct xfs_buftarg device, struct xfs_buf_map *map, int = nmaps) { - struct xfs_bufkey key =3D {0}; + struct xfs_bufkey key =3D {{0}}; int i; =20 key.device =3D device; @@ -610,9 +619,9 @@ libxfs_putbuf(xfs_buf_t *bp) void libxfs_purgebuf(xfs_buf_t *bp) { - struct xfs_bufkey key =3D {0}; + struct xfs_bufkey key =3D {{0}}; =20 - key.device =3D bp->b_dev; + key.device =3D bp->b_target; key.blkno =3D bp->b_bn; key.bblen =3D bp->b_bcount >> BBSHIFT; =20 @@ -658,9 +667,10 @@ __read_buf(int fd, void *buf, int len, off64_t offset,= int flags) } =20 int -libxfs_readbufr(dev_t dev, xfs_daddr_t blkno, xfs_buf_t *bp, int len, int = flags) +libxfs_readbufr(struct xfs_buftarg dev, xfs_daddr_t blkno, xfs_buf_t *bp, + int len, int flags) { - int fd =3D libxfs_device_to_fd(dev); + int fd =3D libxfs_device_to_fd(dev.dev); int bytes =3D BBTOB(len); int error; =20 @@ -668,7 +678,7 @@ libxfs_readbufr(dev_t dev, xfs_daddr_t blkno, xfs_buf_t= *bp, int len, int flags) =20 error =3D __read_buf(fd, bp->b_addr, bytes, LIBXFS_BBTOOFF64(blkno), flag= s); if (!error && - bp->b_dev =3D=3D dev && + bp->b_target.dev =3D=3D dev.dev && bp->b_bn =3D=3D blkno && bp->b_bcount =3D=3D bytes) bp->b_flags |=3D LIBXFS_B_UPTODATE; @@ -681,22 +691,37 @@ libxfs_readbufr(dev_t dev, xfs_daddr_t blkno, xfs_buf= _t *bp, int len, int flags) } =20 xfs_buf_t * -libxfs_readbuf(dev_t dev, xfs_daddr_t blkno, int len, int flags) +libxfs_readbuf(struct xfs_buftarg dev, xfs_daddr_t blkno, int len, int fla= gs, + const struct xfs_buf_ops *ops) { xfs_buf_t *bp; int error; =20 bp =3D libxfs_getbuf(dev, blkno, len); - if (bp && !(bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { - error =3D libxfs_readbufr(dev, blkno, bp, len, flags); - if (error) - bp->b_error =3D error; - } + if (!bp) + return NULL; + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) + return bp; + + /* + * only set the ops on a cache miss (i.e. first physical read) as the + * verifier may change the ops to match the typ eof buffer it contains. + * A cache hit might reset the verifier to the original type if we set + * it again, but it won't get called again and set to match the buffer + * contents. *cough* xfs_da_node_buf_ops *cough*. + */ + bp->b_ops =3D ops; + error =3D libxfs_readbufr(dev, blkno, bp, len, flags); + if (error) + bp->b_error =3D error; + else if (bp->b_ops) + bp->b_ops->verify_read(bp); return bp; } =20 struct xfs_buf * -libxfs_readbuf_map(dev_t dev, struct xfs_buf_map *map, int nmaps, int flag= s) +libxfs_readbuf_map(struct xfs_buftarg dev, struct xfs_buf_map *map, int nm= aps, + int flags, const struct xfs_buf_ops *ops) { xfs_buf_t *bp; int error =3D 0; @@ -705,15 +730,19 @@ libxfs_readbuf_map(dev_t dev, struct xfs_buf_map *map= , int nmaps, int flags) char *buf; =20 if (nmaps =3D=3D 1) - return libxfs_readbuf(dev, map[0].bm_bn, map[0].bm_len, flags); + return libxfs_readbuf(dev, map[0].bm_bn, map[0].bm_len, + flags, ops); =20 bp =3D libxfs_getbuf_map(dev, map, nmaps); - if (!bp || (bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) + if (!bp) + return NULL; + bp->b_ops =3D ops; + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) return bp; =20 ASSERT(bp->b_nmaps =3D nmaps); =20 - fd =3D libxfs_device_to_fd(dev); + fd =3D libxfs_device_to_fd(dev.dev); buf =3D bp->b_addr; for (i =3D 0; i < bp->b_nmaps; i++) { off64_t offset =3D LIBXFS_BBTOOFF64(bp->b_map[i].bm_bn); @@ -731,8 +760,11 @@ libxfs_readbuf_map(dev_t dev, struct xfs_buf_map *map,= int nmaps, int flags) offset +=3D len; } =20 - if (!error) + if (!error) { bp->b_flags |=3D LIBXFS_B_UPTODATE; + if (bp->b_ops) + bp->b_ops->verify_read(bp); + } #ifdef IO_DEBUG printf("%lx: %s: read %lu bytes, error %d, blkno=3D%llu(%llu), %p\n", pthread_self(), __FUNCTION__, buf - (char *)bp->b_addr, error, @@ -767,9 +799,26 @@ __write_buf(int fd, void *buf, int len, off64_t offset= , int flags) int libxfs_writebufr(xfs_buf_t *bp) { - int fd =3D libxfs_device_to_fd(bp->b_dev); + int fd =3D libxfs_device_to_fd(bp->b_target.dev); int error =3D 0; =20 + /* + * we never write buffers that are marked stale. This indicates they + * contain data that has been invalidated, and even if the buffer is + * dirty it must *never* be written. Verifiers are wonderful for finding + * bugs like this. Make sure the error is obvious as to the cause. + */ + if (bp->b_flags & LIBXFS_B_STALE) { + bp->b_error =3D ESTALE; + return bp->b_error; + } + + if (bp->b_ops) { + bp->b_ops->verify_write(bp); + if (bp->b_error) + return bp->b_error; + } + if (!(bp->b_flags & LIBXFS_B_DISCONTIG)) { error =3D __write_buf(fd, bp->b_addr, bp->b_bcount, LIBXFS_BBTOOFF64(bp->b_bn), bp->b_flags); diff --git a/libxfs/trans.c b/libxfs/trans.c index 831e42a..7cef147 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -386,7 +386,7 @@ libxfs_trans_bhold( xfs_buf_t * libxfs_trans_get_buf_map( xfs_trans_t *tp, - dev_t dev, + struct xfs_buftarg dev, struct xfs_buf_map *map, int nmaps, uint f) @@ -465,7 +465,7 @@ int libxfs_trans_read_buf_map( xfs_mount_t *mp, xfs_trans_t *tp, - dev_t dev, + struct xfs_buftarg dev, struct xfs_buf_map *map, int nmaps, uint flags, @@ -479,7 +479,7 @@ libxfs_trans_read_buf_map( *bpp =3D NULL; =20 if (tp =3D=3D NULL) { - bp =3D libxfs_readbuf_map(dev, map, nmaps, flags); + bp =3D libxfs_readbuf_map(dev, map, nmaps, flags, ops); if (!bp) { return (flags & XBF_TRYLOCK) ? EAGAIN : XFS_ERROR(ENOMEM); @@ -498,7 +498,7 @@ libxfs_trans_read_buf_map( goto done; } =20 - bp =3D libxfs_readbuf_map(dev, map, nmaps, flags); + bp =3D libxfs_readbuf_map(dev, map, nmaps, flags, ops); if (!bp) { return (flags & XBF_TRYLOCK) ? EAGAIN : XFS_ERROR(ENOMEM); diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 6bec18e..4bad148 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -55,9 +55,16 @@ typedef __uint32_t inst_t; /* an instruction */ #define EWRONGFS EINVAL #endif =20 +#if 0 #define m_ddev_targp m_dev #define m_logdev_targp m_logdev #define m_rtdev_targp m_rtdev +#endif + +#define m_ddev_targp m_ddev_targ +#define m_logdev_targp m_logdev_targ +#define m_rtdev_targp m_rtdev_targ + #define xfs_error_level 0 =20 #define STATIC static @@ -187,11 +194,7 @@ roundup_pow_of_two(uint v) NULL; \ }) #define xfs_buf_relse(bp) libxfs_putbuf(bp) -#define xfs_read_buf(mp,devp,blkno,len,f,bpp) \ - (*(bpp) =3D libxfs_readbuf((devp), \ - (blkno), (len), 1), 0) -#define xfs_buf_get(devp,blkno,len,f) \ - (libxfs_getbuf((devp), (blkno), (len))) +#define xfs_buf_get(devp,blkno,len,f) (libxfs_getbuf((devp), (blkno), (len= ))) #define xfs_bwrite(bp) libxfs_writebuf((bp), 0) =20 #define XBRW_READ LIBXFS_BREAD @@ -372,7 +375,7 @@ void xfs_buf_item_init (xfs_buf_t *, xfs_mount_t *); void xfs_buf_item_log (xfs_buf_log_item_t *, uint, uint); =20 /* xfs_trans_buf.c */ -xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, dev_t, +xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, struct xfs_buftarg, struct xfs_buf_map *, int); =20 /* local source files */ diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 1041f8f..1429c9b 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -414,7 +414,7 @@ static bool xfs_agfl_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_agfl *agfl =3D XFS_BUF_TO_AGFL(bp); int i; =20 @@ -443,7 +443,7 @@ static void xfs_agfl_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; int agfl_ok =3D 1; =20 /* @@ -470,7 +470,7 @@ static void xfs_agfl_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_buf_log_item *bip =3D bp->b_fspriv; =20 /* no verification of non-crc AGFLs */ @@ -2205,7 +2205,7 @@ static void xfs_agf_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; int agf_ok =3D 1; =20 if (xfs_sb_version_hascrc(&mp->m_sb)) @@ -2225,7 +2225,7 @@ static void xfs_agf_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_buf_log_item *bip =3D bp->b_fspriv; =20 if (!xfs_agf_verify(mp, bp)) { diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index 949c96d..a845a15 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -258,7 +258,7 @@ static bool xfs_allocbt_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); struct xfs_perag *pag =3D bp->b_pag; unsigned int level; @@ -337,7 +337,7 @@ xfs_allocbt_read_verify( xfs_allocbt_verify(bp))) { trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + bp->b_target.bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } } @@ -349,7 +349,7 @@ xfs_allocbt_write_verify( if (!xfs_allocbt_verify(bp)) { trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + bp->b_target.bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } xfs_btree_sblock_calc_crc(bp); diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index b28266a..6d7ac3b 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -150,7 +150,7 @@ static bool xfs_attr3_leaf_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_attr_leafblock *leaf =3D bp->b_addr; struct xfs_attr3_icleaf_hdr ichdr; =20 @@ -183,7 +183,7 @@ static void xfs_attr3_leaf_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_buf_log_item *bip =3D bp->b_fspriv; struct xfs_attr3_leaf_hdr *hdr3 =3D bp->b_addr; =20 @@ -212,7 +212,7 @@ static void xfs_attr3_leaf_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; =20 if ((xfs_sb_version_hascrc(&mp->m_sb) && !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), diff --git a/libxfs/xfs_attr_remote.c b/libxfs/xfs_attr_remote.c index fa112ad..68956ac 100644 --- a/libxfs/xfs_attr_remote.c +++ b/libxfs/xfs_attr_remote.c @@ -44,7 +44,7 @@ static bool xfs_attr3_rmt_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_attr3_rmt_hdr *rmt =3D bp->b_addr; =20 if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -68,7 +68,7 @@ static void xfs_attr3_rmt_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; =20 /* no verification of non-crc buffers */ if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -86,7 +86,7 @@ static void xfs_attr3_rmt_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_buf_log_item *bip =3D bp->b_fspriv; =20 /* no verification of non-crc buffers */ diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 473db4a..761ef29 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -704,7 +704,7 @@ static bool xfs_bmbt_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); unsigned int level; =20 @@ -764,7 +764,7 @@ xfs_bmbt_read_verify( xfs_bmbt_verify(bp))) { trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + bp->b_target.bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } =20 @@ -778,7 +778,7 @@ xfs_bmbt_write_verify( xfs_warn(bp->b_target->bt_mount, "bmbt daddr 0x%llx failed", bp->b_bn); trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + bp->b_target.bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); return; } diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index a613294..60a7d61 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -214,7 +214,7 @@ xfs_btree_lblock_calc_crc( struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); struct xfs_buf_log_item *bip =3D bp->b_fspriv; =20 - if (!xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + if (!xfs_sb_version_hascrc(&bp->b_target.bt_mount->m_sb)) return; if (bip) block->bb_u.l.bb_lsn =3D cpu_to_be64(bip->bli_item.li_lsn); @@ -226,7 +226,7 @@ bool xfs_btree_lblock_verify_crc( struct xfs_buf *bp) { - if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + if (xfs_sb_version_hascrc(&bp->b_target.bt_mount->m_sb)) return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_BTREE_LBLOCK_CRC_OFF); return true; @@ -247,7 +247,7 @@ xfs_btree_sblock_calc_crc( struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); struct xfs_buf_log_item *bip =3D bp->b_fspriv; =20 - if (!xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + if (!xfs_sb_version_hascrc(&bp->b_target.bt_mount->m_sb)) return; if (bip) block->bb_u.s.bb_lsn =3D cpu_to_be64(bip->bli_item.li_lsn); @@ -259,7 +259,7 @@ bool xfs_btree_sblock_verify_crc( struct xfs_buf *bp) { - if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + if (xfs_sb_version_hascrc(&bp->b_target.bt_mount->m_sb)) return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_BTREE_SBLOCK_CRC_OFF); return true; diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index 0a96f20..fb2f95a 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -160,7 +160,7 @@ static bool xfs_da3_node_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_da_intnode *hdr =3D bp->b_addr; struct xfs_da3_icnode_hdr ichdr; =20 @@ -204,7 +204,7 @@ static void xfs_da3_node_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_buf_log_item *bip =3D bp->b_fspriv; struct xfs_da3_node_hdr *hdr3 =3D bp->b_addr; =20 @@ -233,7 +233,7 @@ static void xfs_da3_node_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_da_blkinfo *info =3D bp->b_addr; =20 switch (be16_to_cpu(info->magic)) { diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index dc69394..004e240 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -45,7 +45,7 @@ static bool xfs_dir3_block_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; =20 if (xfs_sb_version_hascrc(&mp->m_sb)) { @@ -68,7 +68,7 @@ static void xfs_dir3_block_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; =20 if ((xfs_sb_version_hascrc(&mp->m_sb) && !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), @@ -83,7 +83,7 @@ static void xfs_dir3_block_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_buf_log_item *bip =3D bp->b_fspriv; struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; =20 diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index 155352c..8182f60 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -48,7 +48,7 @@ __xfs_dir3_data_check( int stale; /* count of stale leaves */ struct xfs_name name; =20 - mp =3D bp->b_target->bt_mount; + mp =3D bp->b_target.bt_mount; hdr =3D bp->b_addr; bf =3D xfs_dir3_data_bestfree_p(hdr); p =3D (char *)xfs_dir3_data_entry_p(hdr); @@ -178,7 +178,7 @@ static bool xfs_dir3_data_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; =20 if (xfs_sb_version_hascrc(&mp->m_sb)) { @@ -206,7 +206,7 @@ static void xfs_dir3_data_reada_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_dir2_data_hdr *hdr =3D bp->b_addr; =20 switch (be32_to_cpu(hdr->magic)) { @@ -230,7 +230,7 @@ static void xfs_dir3_data_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; =20 if ((xfs_sb_version_hascrc(&mp->m_sb) && !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), @@ -245,7 +245,7 @@ static void xfs_dir3_data_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_buf_log_item *bip =3D bp->b_fspriv; struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; =20 diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 12fb61d..1862e0c 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -162,7 +162,7 @@ xfs_dir3_leaf_verify( struct xfs_buf *bp, __uint8_t magic) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_dir2_leaf *leaf =3D bp->b_addr; struct xfs_dir3_icleaf_hdr leafhdr; =20 @@ -194,7 +194,7 @@ __read_verify( struct xfs_buf *bp, __uint16_t magic) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; =20 if ((xfs_sb_version_hascrc(&mp->m_sb) && !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), @@ -210,7 +210,7 @@ __write_verify( struct xfs_buf *bp, __uint16_t magic) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_buf_log_item *bip =3D bp->b_fspriv; struct xfs_dir3_leaf_hdr *hdr3 =3D bp->b_addr; =20 diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index eb430f9..36747b1 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -66,7 +66,7 @@ static bool xfs_dir3_free_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_dir2_free_hdr *hdr =3D bp->b_addr; =20 if (xfs_sb_version_hascrc(&mp->m_sb)) { @@ -92,7 +92,7 @@ static void xfs_dir3_free_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; =20 if ((xfs_sb_version_hascrc(&mp->m_sb) && !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), @@ -107,7 +107,7 @@ static void xfs_dir3_free_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_buf_log_item *bip =3D bp->b_fspriv; struct xfs_dir3_blk_hdr *hdr3 =3D bp->b_addr; =20 diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index bea5254..8b0fa0e 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1310,7 +1310,7 @@ static bool xfs_agi_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_agi *agi =3D XFS_BUF_TO_AGI(bp); =20 if (xfs_sb_version_hascrc(&mp->m_sb) && @@ -1341,7 +1341,7 @@ static void xfs_agi_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; int agi_ok =3D 1; =20 if (xfs_sb_version_hascrc(&mp->m_sb)) @@ -1360,7 +1360,7 @@ static void xfs_agi_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_buf_log_item *bip =3D bp->b_fspriv; =20 if (!xfs_agi_verify(bp)) { diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index ee036bf..d7c865f 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -167,7 +167,7 @@ static int xfs_inobt_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_btree_block *block =3D XFS_BUF_TO_BLOCK(bp); struct xfs_perag *pag =3D bp->b_pag; unsigned int level; @@ -222,7 +222,7 @@ xfs_inobt_read_verify( xfs_inobt_verify(bp))) { trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + bp->b_target.bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } } @@ -234,7 +234,7 @@ xfs_inobt_write_verify( if (!xfs_inobt_verify(bp)) { trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + bp->b_target.bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } xfs_btree_sblock_calc_crc(bp); diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c index d6513b9..5ca8f32 100644 --- a/libxfs/xfs_inode.c +++ b/libxfs/xfs_inode.c @@ -92,7 +92,7 @@ static void xfs_inode_buf_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; int i; int ni; =20 @@ -237,7 +237,7 @@ xfs_iformat( } =20 if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) && - !ip->i_mount->m_rtdev)) { + !ip->i_mount->m_rtdev.dev)) { xfs_warn(ip->i_mount, "corrupt dinode %Lu, has realtime flag set.", ip->i_ino); diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index f7daa2f..029f891 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -115,6 +115,9 @@ xfs_perag_put(struct xfs_perag *pag) =20 /* * Check the validity of the SB found. + * + * We don't check the in-progress flag here because it is set by userspace + * utilities to indicate operations are in progress.... */ STATIC int xfs_mount_validate_sb( @@ -179,7 +182,7 @@ xfs_mount_validate_sb( } =20 if (unlikely( - sbp->sb_logstart =3D=3D 0 && mp->m_logdev =3D=3D mp->m_dev)) { + sbp->sb_logstart =3D=3D 0 && mp->m_logdev.dev =3D=3D mp->m_dev.dev)) { xfs_warn(mp, "filesystem is marked as having an external log; " "specify logdev on the mount command line."); @@ -187,7 +190,7 @@ xfs_mount_validate_sb( } =20 if (unlikely( - sbp->sb_logstart !=3D 0 && mp->m_logdev !=3D mp->m_dev)) { + sbp->sb_logstart !=3D 0 && mp->m_logdev.dev !=3D mp->m_dev.dev)) { xfs_warn(mp, "filesystem is marked as having an internal log; " "do not specify logdev on the mount command line."); @@ -243,11 +246,6 @@ xfs_mount_validate_sb( } =20 =20 - if (check_inprogress && sbp->sb_inprogress) { - xfs_warn(mp, "Offline file system operation in progress!"); - return XFS_ERROR(EFSCORRUPTED); - } - /* * Version 1 directory format has never worked on Linux. */ @@ -377,7 +375,7 @@ static int xfs_sb_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_sb sb; =20 xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); @@ -400,7 +398,7 @@ static void xfs_sb_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_dsb *dsb =3D XFS_BUF_TO_SBP(bp); int error; =20 @@ -454,7 +452,7 @@ static void xfs_sb_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_buf_log_item *bip =3D bp->b_fspriv; int error; =20 diff --git a/libxfs/xfs_symlink.c b/libxfs/xfs_symlink.c index e018abc..6c42de7 100644 --- a/libxfs/xfs_symlink.c +++ b/libxfs/xfs_symlink.c @@ -29,7 +29,7 @@ xfs_symlink_blocks( /* * XXX: this need to be used by mkfs/proto.c to create symlinks. */ -static int +int xfs_symlink_hdr_set( struct xfs_mount *mp, xfs_ino_t ino, @@ -84,7 +84,7 @@ static bool xfs_symlink_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_dsymlink_hdr *dsl =3D bp->b_addr; =20 if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -108,7 +108,7 @@ static void xfs_symlink_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; =20 /* no verification of non-crc buffers */ if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -126,7 +126,7 @@ static void xfs_symlink_write_verify( struct xfs_buf *bp) { - struct xfs_mount *mp =3D bp->b_target->bt_mount; + struct xfs_mount *mp =3D bp->b_target.bt_mount; struct xfs_buf_log_item *bip =3D bp->b_fspriv; =20 /* no verification of non-crc buffers */ diff --git a/logprint/logprint.c b/logprint/logprint.c index 2a01780..5452e87 100644 --- a/logprint/logprint.c +++ b/logprint/logprint.c @@ -230,7 +230,8 @@ main(int argc, char **argv) =20 ASSERT(x.logBBsize <=3D INT_MAX); =20 - log.l_dev =3D x.logdev; + log.l_dev.dev =3D x.logdev; + log.l_dev.bt_mount =3D &mount; log.l_logsize =3D BBTOB(x.logBBsize); log.l_logBBstart =3D x.logBBstart; log.l_logBBsize =3D x.logBBsize; diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c index f12cc70..d571d77 100644 --- a/mkfs/maxtrres.c +++ b/mkfs/maxtrres.c @@ -67,6 +67,7 @@ max_trans_res_by_mount( =20 int max_trans_res( + int crcs_enabled, int dirversion, int sectorlog, int blocklog, @@ -90,7 +91,8 @@ max_trans_res( sbp->sb_inodesize =3D 1 << inodelog; sbp->sb_inopblock =3D 1 << (blocklog - inodelog); sbp->sb_dirblklog =3D dirblocklog - blocklog; - sbp->sb_versionnum =3D XFS_SB_VERSION_4 | + sbp->sb_versionnum =3D + (crcs_enabled ? XFS_SB_VERSION_5 : XFS_SB_VERSION_4) | (dirversion =3D=3D 2 ? XFS_SB_VERSION_DIRV2BIT : 0); =20 libxfs_mount(&mount, sbp, 0,0,0,0); diff --git a/mkfs/proto.c b/mkfs/proto.c index 56eed31..4254f8a 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -676,7 +676,7 @@ rtinit( error); } for (i =3D 0, ep =3D map; i < nmap; i++, ep++) { - libxfs_device_zero(mp->m_dev, + libxfs_device_zero(mp->m_ddev_targ.dev, XFS_FSB_TO_DADDR(mp, ep->br_startblock), XFS_FSB_TO_BB(mp, ep->br_blockcount)); bno +=3D ep->br_blockcount; @@ -713,7 +713,7 @@ rtinit( error); } for (i =3D 0, ep =3D map; i < nmap; i++, ep++) { - libxfs_device_zero(mp->m_dev, + libxfs_device_zero(mp->m_ddev_targ.dev, XFS_FSB_TO_DADDR(mp, ep->br_startblock), XFS_FSB_TO_BB(mp, ep->br_blockcount)); bno +=3D ep->br_blockcount; diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index c84448e..bf23de1 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -178,6 +178,12 @@ char *sopts[] =3D { NULL }; =20 +char *mopts[] =3D { +#define M_CRC 0 + "crc", + NULL +}; + #define TERABYTES(count, blog) ((__uint64_t)(count) << (40 - (blog))) #define GIGABYTES(count, blog) ((__uint64_t)(count) << (30 - (blog))) #define MEGABYTES(count, blog) ((__uint64_t)(count) << (20 - (blog))) @@ -952,6 +958,7 @@ main( libxfs_init_t xi; struct fs_topology ft; int lazy_sb_counters; + int crcs_enabled; =20 progname =3D basename(argv[0]); setlocale(LC_ALL, ""); @@ -983,13 +990,14 @@ main( force_overwrite =3D 0; worst_freelist =3D 0; lazy_sb_counters =3D 1; + crcs_enabled =3D 0; memset(&fsx, 0, sizeof(fsx)); =20 memset(&xi, 0, sizeof(xi)); xi.isdirect =3D LIBXFS_DIRECT; xi.isreadonly =3D LIBXFS_EXCLUSIVELY; =20 - while ((c =3D getopt(argc, argv, "b:d:i:l:L:n:KNp:qr:s:CfV")) !=3D EOF) { + while ((c =3D getopt(argc, argv, "b:d:i:l:L:m:n:KNp:qr:s:CfV")) !=3D EOF)= { switch (c) { case 'C': case 'f': @@ -1455,6 +1463,25 @@ main( illegal(optarg, "L"); label =3D optarg; break; + case 'm': + p =3D optarg; + while (*p !=3D '\0') { + char *value; + + switch (getsubopt(&p, (constpp)mopts, &value)) { + case M_CRC: + if (!value || *value =3D=3D '\0') + reqval('m', mopts, M_CRC); + c =3D atoi(value); + if (c < 0 || c > 1) + illegal(value, "m crc"); + crcs_enabled =3D c; + break; + default: + unknown('m', value); + } + } + break; case 'n': p =3D optarg; while (*p !=3D '\0') { @@ -1774,9 +1801,17 @@ _("block size %d cannot be smaller than logical sect= or size %d\n"), inodelog =3D blocklog - libxfs_highbit32(inopblock); isize =3D 1 << inodelog; } else if (!ilflag && !isflag) { - inodelog =3D XFS_DINODE_DFL_LOG; + inodelog =3D crcs_enabled ? XFS_DINODE_DFL_CRC_LOG + : XFS_DINODE_DFL_LOG; isize =3D 1 << inodelog; } + if (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); + usage(); + } + if (xi.lisfile && (!logsize || !xi.logname)) { fprintf(stderr, _("if -l file then -l name and -l size are required\n")); @@ -2025,7 +2060,7 @@ reported by the device (%u).\n"), sectorsize, xi.rtbsize); } =20 - max_tr_res =3D max_trans_res(dirversion, + max_tr_res =3D max_trans_res(crcs_enabled, dirversion, sectorlog, blocklog, inodelog, dirblocklog); ASSERT(max_tr_res); min_logblocks =3D max_tr_res * XFS_MIN_LOG_FACTOR; @@ -2295,7 +2330,7 @@ an AG size that is one stripe unit smaller, for examp= le %llu.\n"), */ if (!logsize) { logblocks =3D MIN(logblocks, - agsize - XFS_PREALLOC_BLOCKS(mp)); + XFS_ALLOC_AG_MAX_USABLE(mp)); } if (logblocks > agsize - XFS_PREALLOC_BLOCKS(mp)) { fprintf(stderr, @@ -2338,6 +2373,7 @@ an AG size that is one stripe unit smaller, for examp= le %llu.\n"), printf(_( "meta-data=3D%-22s isize=3D%-6d agcount=3D%lld, agsize=3D%lld blks\n" " =3D%-22s sectsz=3D%-5u attr=3D%u, projid32bit=3D%u\n" + " =3D%-22s crc=3D%-5u\n" "data =3D%-22s bsize=3D%-6u blocks=3D%llu, imaxpct=3D%u\n" " =3D%-22s sunit=3D%-6u swidth=3D%u blks\n" "naming =3Dversion %-14u bsize=3D%-6u ascii-ci=3D%d\n" @@ -2346,6 +2382,7 @@ an AG size that is one stripe unit smaller, for examp= le %llu.\n"), "realtime =3D%-22s extsz=3D%-6d blocks=3D%lld, rtextents=3D%lld\n"), dfile, isize, (long long)agcount, (long long)agsize, "", sectorsize, attrversion, projid32bit, + "", crcs_enabled, "", blocksize, (long long)dblocks, imaxpct, "", dsunit, dswidth, dirversion, dirblocksize, nci, @@ -2411,9 +2448,10 @@ an AG size that is one stripe unit smaller, for exam= ple %llu.\n"), sbp->sb_logsectlog =3D 0; sbp->sb_logsectsize =3D 0; } - sbp->sb_features2 =3D XFS_SB_VERSION2_MKFS(lazy_sb_counters, + sbp->sb_features2 =3D XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters, attrversion =3D=3D 2, projid32bit =3D=3D 1, 0); - sbp->sb_versionnum =3D XFS_SB_VERSION_MKFS(iaflag, dsunit !=3D 0, + sbp->sb_versionnum =3D XFS_SB_VERSION_MKFS(crcs_enabled, iaflag, + dsunit !=3D 0, logversion =3D=3D 2, attrversion =3D=3D 1, (sectorsize !=3D BBSIZE || lsectorsize !=3D BBSIZE), @@ -2435,13 +2473,16 @@ an AG size that is one stripe unit smaller, for exa= mple %llu.\n"), * swap (somewhere around the page size), jfs (32k), * ext[2,3] and reiserfs (64k) - and hopefully all else. */ - buf =3D libxfs_getbuf(xi.ddev, 0, BTOBB(WHACK_SIZE)); + mp->m_ddev_targ.dev =3D xi.ddev; + mp->m_ddev_targ.bt_mount =3D mp; + buf =3D libxfs_getbuf(mp->m_ddev_targ, 0, BTOBB(WHACK_SIZE)); memset(XFS_BUF_PTR(buf), 0, WHACK_SIZE); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); libxfs_purgebuf(buf); =20 /* OK, now write the superblock */ - buf =3D libxfs_getbuf(xi.ddev, XFS_SB_DADDR, XFS_FSS_TO_BB(mp, 1)); + buf =3D libxfs_getbuf(mp->m_ddev_targ, XFS_SB_DADDR, XFS_FSS_TO_BB(mp, 1)= ); + buf->b_ops =3D &xfs_sb_buf_ops; memset(XFS_BUF_PTR(buf), 0, sectorsize); libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf), sbp, XFS_SB_ALL_BITS); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -2460,10 +2501,11 @@ an AG size that is one stripe unit smaller, for exa= mple %llu.\n"), /* * Zero out the end of the device, to obliterate any * old MD RAID (or other) metadata at the end of the device. - * (MD sb is ~64k from the end, take out a wider swath to be sure) + * (MD sb is ~64k from the end, take out a wider swath to be sure) */ if (!xi.disfile) { - buf =3D libxfs_getbuf(xi.ddev, (xi.dsize - BTOBB(WHACK_SIZE)), + buf =3D libxfs_getbuf(mp->m_ddev_targ, + (xi.dsize - BTOBB(WHACK_SIZE)), BTOBB(WHACK_SIZE)); memset(XFS_BUF_PTR(buf), 0, WHACK_SIZE); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -2475,10 +2517,13 @@ an AG size that is one stripe unit smaller, for exa= mple %llu.\n"), */ if (loginternal) xi.logdev =3D xi.ddev; - if (xi.logdev) - libxfs_log_clear(xi.logdev, XFS_FSB_TO_DADDR(mp, logstart), + if (xi.logdev) { + mp->m_logdev_targ.dev =3D xi.ddev; + libxfs_log_clear(mp->m_logdev_targ, + XFS_FSB_TO_DADDR(mp, logstart), (xfs_extlen_t)XFS_FSB_TO_BB(mp, logblocks), &sbp->sb_uuid, logversion, lsunit, XLOG_FMT); + } =20 mp =3D libxfs_mount(mp, sbp, xi.ddev, xi.logdev, xi.rtdev, 1); if (mp =3D=3D NULL) { @@ -2487,13 +2532,22 @@ an AG size that is one stripe unit smaller, for exa= mple %llu.\n"), exit(1); } =20 + /* + * XXX: this code is effectively shared with the kernel growfs code. + * These initialisations should be pulled into libxfs to keep the + * kernel/userspace header initialisation code the same. + */ for (agno =3D 0; agno < agcount; agno++) { + struct xfs_agfl *agfl; + int bucket; + /* * Superblock. */ - buf =3D libxfs_getbuf(xi.ddev, + buf =3D libxfs_getbuf(mp->m_ddev_targ, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), XFS_FSS_TO_BB(mp, 1)); + buf->b_ops =3D &xfs_sb_buf_ops; memset(XFS_BUF_PTR(buf), 0, sectorsize); libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf), sbp, XFS_SB_ALL_BITS); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -2501,9 +2555,10 @@ an AG size that is one stripe unit smaller, for exam= ple %llu.\n"), /* * AG header block: freespace */ - buf =3D libxfs_getbuf(mp->m_dev, + buf =3D libxfs_getbuf(mp->m_ddev_targ, XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), XFS_FSS_TO_BB(mp, 1)); + buf->b_ops =3D &xfs_agf_buf_ops; agf =3D XFS_BUF_TO_AGF(buf); memset(agf, 0, sectorsize); if (agno =3D=3D agcount - 1) @@ -2522,6 +2577,9 @@ an AG size that is one stripe unit smaller, for examp= le %llu.\n"), nbmblocks =3D (xfs_extlen_t)(agsize - XFS_PREALLOC_BLOCKS(mp)); agf->agf_freeblks =3D cpu_to_be32(nbmblocks); agf->agf_longest =3D cpu_to_be32(nbmblocks); + if (xfs_sb_version_hascrc(&mp->m_sb)) + platform_uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_uuid); + if (loginternal && agno =3D=3D logagno) { be32_add_cpu(&agf->agf_freeblks, -logblocks); agf->agf_longest =3D cpu_to_be32(agsize - @@ -2532,12 +2590,33 @@ an AG size that is one stripe unit smaller, for exa= mple %llu.\n"), libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); =20 /* + * AG freelist header block + */ + buf =3D libxfs_getbuf(mp->m_ddev_targ, + XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)), + XFS_FSS_TO_BB(mp, 1)); + buf->b_ops =3D &xfs_agfl_buf_ops; + agfl =3D XFS_BUF_TO_AGFL(buf); + /* setting to 0xff results in initialisation to NULLAGBLOCK */ + memset(agfl, 0xff, sectorsize); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + agfl->agfl_magicnum =3D cpu_to_be32(XFS_AGFL_MAGIC); + agfl->agfl_seqno =3D cpu_to_be32(agno); + platform_uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_uuid); + for (bucket =3D 0; bucket < XFS_AGFL_SIZE(mp); bucket++) + agfl->agfl_bno[bucket] =3D cpu_to_be32(NULLAGBLOCK); + } + + libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); + + /* * AG header block: inodes */ - buf =3D libxfs_getbuf(mp->m_dev, + buf =3D libxfs_getbuf(mp->m_ddev_targ, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), XFS_FSS_TO_BB(mp, 1)); agi =3D XFS_BUF_TO_AGI(buf); + buf->b_ops =3D &xfs_agi_buf_ops; memset(agi, 0, sectorsize); agi->agi_magicnum =3D cpu_to_be32(XFS_AGI_MAGIC); agi->agi_versionnum =3D cpu_to_be32(XFS_AGI_VERSION); @@ -2549,6 +2628,8 @@ an AG size that is one stripe unit smaller, for examp= le %llu.\n"), agi->agi_freecount =3D 0; agi->agi_newino =3D cpu_to_be32(NULLAGINO); agi->agi_dirino =3D cpu_to_be32(NULLAGINO); + if (xfs_sb_version_hascrc(&mp->m_sb)) + platform_uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid); for (c =3D 0; c < XFS_AGI_UNLINKED_BUCKETS; c++) agi->agi_unlinked[c] =3D cpu_to_be32(NULLAGINO); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -2556,16 +2637,19 @@ an AG size that is one stripe unit smaller, for exa= mple %llu.\n"), /* * BNO btree root block */ - buf =3D libxfs_getbuf(mp->m_dev, + buf =3D libxfs_getbuf(mp->m_ddev_targ, XFS_AGB_TO_DADDR(mp, agno, XFS_BNO_BLOCK(mp)), bsize); + buf->b_ops =3D &xfs_allocbt_buf_ops; block =3D XFS_BUF_TO_BLOCK(buf); memset(block, 0, blocksize); - block->bb_magic =3D cpu_to_be32(XFS_ABTB_MAGIC); - block->bb_level =3D 0; - block->bb_numrecs =3D cpu_to_be16(1); - block->bb_u.s.bb_leftsib =3D cpu_to_be32(NULLAGBLOCK); - block->bb_u.s.bb_rightsib =3D cpu_to_be32(NULLAGBLOCK); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, buf, XFS_ABTB_CRC_MAGIC, 0, 1, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, buf, XFS_ABTB_MAGIC, 0, 1, + agno, 0); + arec =3D XFS_ALLOC_REC_ADDR(mp, block, 1); arec->ar_startblock =3D cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); if (loginternal && agno =3D=3D logagno) { @@ -2599,16 +2683,19 @@ an AG size that is one stripe unit smaller, for exa= mple %llu.\n"), /* * CNT btree root block */ - buf =3D libxfs_getbuf(mp->m_dev, + buf =3D libxfs_getbuf(mp->m_ddev_targ, XFS_AGB_TO_DADDR(mp, agno, XFS_CNT_BLOCK(mp)), bsize); + buf->b_ops =3D &xfs_allocbt_buf_ops; block =3D XFS_BUF_TO_BLOCK(buf); memset(block, 0, blocksize); - block->bb_magic =3D cpu_to_be32(XFS_ABTC_MAGIC); - block->bb_level =3D 0; - block->bb_numrecs =3D cpu_to_be16(1); - block->bb_u.s.bb_leftsib =3D cpu_to_be32(NULLAGBLOCK); - block->bb_u.s.bb_rightsib =3D cpu_to_be32(NULLAGBLOCK); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, buf, XFS_ABTC_CRC_MAGIC, 0, 1, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, buf, XFS_ABTC_MAGIC, 0, 1, + agno, 0); + arec =3D XFS_ALLOC_REC_ADDR(mp, block, 1); arec->ar_startblock =3D cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); if (loginternal && agno =3D=3D logagno) { @@ -2632,16 +2719,18 @@ an AG size that is one stripe unit smaller, for exa= mple %llu.\n"), /* * INO btree root block */ - buf =3D libxfs_getbuf(mp->m_dev, + buf =3D libxfs_getbuf(mp->m_ddev_targ, XFS_AGB_TO_DADDR(mp, agno, XFS_IBT_BLOCK(mp)), bsize); + buf->b_ops =3D &xfs_inobt_buf_ops; block =3D XFS_BUF_TO_BLOCK(buf); memset(block, 0, blocksize); - block->bb_magic =3D cpu_to_be32(XFS_IBT_MAGIC); - block->bb_level =3D 0; - block->bb_numrecs =3D 0; - block->bb_u.s.bb_leftsib =3D cpu_to_be32(NULLAGBLOCK); - block->bb_u.s.bb_rightsib =3D cpu_to_be32(NULLAGBLOCK); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, buf, XFS_IBT_CRC_MAGIC, 0, 0, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, buf, XFS_IBT_MAGIC, 0, 0, + agno, 0); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); } =20 @@ -2656,7 +2745,7 @@ an AG size that is one stripe unit smaller, for examp= le %llu.\n"), /* * Make sure we can write the last block in the realtime area. */ - if (mp->m_rtdev && rtblocks > 0) { + if (mp->m_rtdev.dev && rtblocks > 0) { buf =3D libxfs_getbuf(mp->m_rtdev, XFS_FSB_TO_BB(mp, rtblocks - 1LL), bsize); memset(XFS_BUF_PTR(buf), 0, blocksize); @@ -2710,7 +2799,7 @@ an AG size that is one stripe unit smaller, for examp= le %llu.\n"), XFS_AGB_TO_DADDR(mp, mp->m_sb.sb_agcount-1, XFS_SB_DADDR), XFS_FSS_TO_BB(mp, 1), - LIBXFS_EXIT_ON_FAILURE); + LIBXFS_EXIT_ON_FAILURE, &xfs_sb_buf_ops); XFS_BUF_TO_SBP(buf)->sb_rootino =3D cpu_to_be64( mp->m_sb.sb_rootino); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -2722,7 +2811,7 @@ an AG size that is one stripe unit smaller, for examp= le %llu.\n"), XFS_AGB_TO_DADDR(mp, (mp->m_sb.sb_agcount-1)/2, XFS_SB_DADDR), XFS_FSS_TO_BB(mp, 1), - LIBXFS_EXIT_ON_FAILURE); + LIBXFS_EXIT_ON_FAILURE, &xfs_sb_buf_ops); XFS_BUF_TO_SBP(buf)->sb_rootino =3D cpu_to_be64( mp->m_sb.sb_rootino); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -2878,6 +2967,7 @@ usage( void ) { fprintf(stderr, _("Usage: %s\n\ /* blocksize */ [-b log=3Dn|size=3Dnum]\n\ +/* metadata */ [-m crc=3D[0|1]\n\ /* data subvol */ [-d agcount=3Dn,agsize=3Dn,file,name=3Dxxx,size=3Dnum,\n\ (sunit=3Dvalue,swidth=3Dvalue|su=3Dnum,sw=3Dnum),\n\ sectlog=3Dn|sectsize=3Dnum\n\ diff --git a/mkfs/xfs_mkfs.h b/mkfs/xfs_mkfs.h index f25a7f3..d10e444 100644 --- a/mkfs/xfs_mkfs.h +++ b/mkfs/xfs_mkfs.h @@ -23,9 +23,9 @@ XFS_SB_VERSION_EXTFLGBIT | \ XFS_SB_VERSION_DIRV2BIT) =20 -#define XFS_SB_VERSION_MKFS(ia,dia,log2,attr1,sflag,ci,more) (\ - ((ia)||(dia)||(log2)||(attr1)||(sflag)||(ci)||(more)) ? \ - ( XFS_SB_VERSION_4 | \ +#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) | \ @@ -36,15 +36,17 @@ XFS_DFL_SB_VERSION_BITS | \ 0 ) : XFS_SB_VERSION_1 ) =20 -#define XFS_SB_VERSION2_MKFS(lazycount, attr2, projid32bit, parent) (\ +#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent) (\ ((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) | \ 0 ) =20 #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 */ @@ -79,7 +81,7 @@ extern void parse_proto (xfs_mount_t *mp, struct fsxattr = *fsx, char **pp); extern void res_failed (int err); =20 /* maxtrres.c */ -extern int max_trans_res (int dirversion, +extern int max_trans_res (int crcs_enabled, int dirversion, int sectorlog, int blocklog, int inodelog, int dirblocklog); =20 #endif /* __XFS_MKFS_H__ */ diff --git a/repair/attr_repair.c b/repair/attr_repair.c index 033b7fe..70a2041 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -344,7 +344,7 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *bl= kmap, break; } bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn( _("can't read remote block for attributes of inode %" PRIu64 "\n"), ino); @@ -673,7 +673,7 @@ process_leaf_attr_level(xfs_mount_t *mp, } =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dev_bno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn( _("can't read file block %u (fsbno %" PRIu64 ") for attribute fork of ino= de %" PRIu64 "\n"), @@ -855,7 +855,7 @@ process_longform_attr( } =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn( _("can't read block 0 of inode %" PRIu64 " attribute fork\n"), diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c index 4d14c57..3e7e225 100644 --- a/repair/dino_chunks.c +++ b/repair/dino_chunks.c @@ -53,7 +53,7 @@ check_aginode_block(xfs_mount_t *mp, * so no one else will overlap them. */ bp =3D libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, agbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn(_("cannot read agbno (%u/%u), disk block %" PRId64 "\n"), agno, agbno, XFS_AGB_TO_DADDR(mp, agno, agbno)); @@ -66,6 +66,8 @@ check_aginode_block(xfs_mount_t *mp, XFS_OFFBNO_TO_AGINO(mp, agbno, i))) cnt++; } + if (cnt) + bp->b_ops =3D &xfs_inode_buf_ops; =20 libxfs_putbuf(bp); return(cnt); @@ -626,7 +628,8 @@ process_inode_chunk( =20 bplist[bp_index] =3D libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, agbno), - XFS_FSB_TO_BB(mp, blks_per_cluster), 0); + XFS_FSB_TO_BB(mp, blks_per_cluster), 0, + NULL); if (!bplist[bp_index]) { do_warn(_("cannot read inode %" PRIu64 ", disk block %" PRId64 ", cnt %= d\n"), XFS_AGINO_TO_INO(mp, agno, first_irec->ino_startnum), @@ -640,6 +643,7 @@ process_inode_chunk( return(1); } agbno +=3D blks_per_cluster; + bplist[bp_index]->b_ops =3D &xfs_inode_buf_ops; =20 pftrace("readbuf %p (%llu, %d) in AG %d", bplist[bp_index], (long long)XFS_BUF_ADDR(bplist[bp_index]), diff --git a/repair/dinode.c b/repair/dinode.c index f564216..7a75dc8 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -837,7 +837,8 @@ get_agino_buf(xfs_mount_t *mp, =20 size =3D XFS_FSB_TO_BB(mp, MAX(1, XFS_INODES_PER_CHUNK/inodes_per_block)); bp =3D libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, - XFS_AGINO_TO_AGBNO(mp, irec->ino_startnum)), size, 0); + XFS_AGINO_TO_AGBNO(mp, irec->ino_startnum)), size, 0, + &xfs_inode_buf_ops); if (!bp) { do_warn(_("cannot read inode (%u/%u), disk block %" PRIu64 "\n"), agno, irec->ino_startnum, @@ -948,7 +949,7 @@ getfunc_btree(xfs_mount_t *mp, ASSERT(verify_dfsbno(mp, fsbno)); =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_error(_("cannot read bmap block %" PRIu64 "\n"), fsbno); return(NULLDFSBNO); @@ -1005,7 +1006,7 @@ _("- # of bmap records in inode %" PRIu64 " less than= minimum (%u, min - %u), pr */ libxfs_putbuf(bp); bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_error(_("cannot read bmap block %" PRIu64 "\n"), fsbno); @@ -1502,7 +1503,8 @@ process_symlink( if (fsbno !=3D NULLDFSBNO) bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, + &xfs_symlink_buf_ops); if (!bp || fsbno =3D=3D NULLDFSBNO) { do_warn( _("cannot read inode %" PRIu64 ", file block %d, disk block %" PRIu64 "\n"= ), diff --git a/repair/dir.c b/repair/dir.c index cb04267..925ba5d 100644 --- a/repair/dir.c +++ b/repair/dir.c @@ -763,7 +763,7 @@ traverse_int_dablock(xfs_mount_t *mp, goto error_out; =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { if (whichfork =3D=3D XFS_DATA_FORK) do_warn( @@ -1143,7 +1143,7 @@ verify_da_path(xfs_mount_t *mp, } =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn( _("can't read block %u (%" PRIu64 ") for directory inode %" PRIu64 "\n"), @@ -2260,7 +2260,7 @@ process_leaf_dir_level(xfs_mount_t *mp, bd_addr =3D (xfs_daddr_t)XFS_FSB_TO_DADDR(mp, dev_bno); =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dev_bno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn( _("can't read file block %u (fsbno %" PRIu64 ", daddr %" PRId64 ") " @@ -2521,7 +2521,7 @@ process_leaf_dir( return(1); } bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_warn(_("can't read block 0 for directory inode %" PRIu64 "\n"), ino); diff --git a/repair/dir2.c b/repair/dir2.c index b774897..274273d 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -105,7 +105,7 @@ da_read_buf( map[i].bm_bn =3D XFS_FSB_TO_DADDR(mp, bmp[i].startblock); map[i].bm_len =3D XFS_FSB_TO_BB(mp, bmp[i].blockcount); } - bp =3D libxfs_readbuf_map(mp->m_dev, map, nex, 0); + bp =3D libxfs_readbuf_map(mp->m_dev, map, nex, 0, NULL); if (map !=3D map_array) free(map); return bp; diff --git a/repair/phase2.c b/repair/phase2.c index 23b457a..5a4cf10 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -48,7 +48,8 @@ zero_log(xfs_mount_t *mp) x.logBBsize =3D XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); x.logBBstart =3D XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart); =20 - log.l_dev =3D logdev; + log.l_dev.dev =3D logdev; + log.l_dev.bt_mount =3D mp; log.l_logsize =3D BBTOB(x.logBBsize); log.l_logBBsize =3D x.logBBsize; log.l_logBBstart =3D x.logBBstart; @@ -92,7 +93,7 @@ zero_log(xfs_mount_t *mp) } } =20 - libxfs_log_clear(logdev, + libxfs_log_clear(log.l_dev, XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart), (xfs_extlen_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks), &mp->m_sb.sb_uuid, diff --git a/repair/phase3.c b/repair/phase3.c index 80c66b5..3e43938 100644 --- a/repair/phase3.c +++ b/repair/phase3.c @@ -40,7 +40,7 @@ process_agi_unlinked( =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), - mp->m_sb.sb_sectsize/BBSIZE, 0); + mp->m_sb.sb_sectsize/BBSIZE, 0, &xfs_agi_buf_ops); if (!bp) do_error(_("cannot read agi block %" PRId64 " for ag %u\n"), XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), agno); diff --git a/repair/phase6.c b/repair/phase6.c index 090e400..8d4d941 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -512,7 +512,7 @@ mk_rbmino(xfs_mount_t *mp) error); } for (i =3D 0, ep =3D map; i < nmap; i++, ep++) { - libxfs_device_zero(mp->m_dev, + libxfs_device_zero(mp->m_ddev_targ.dev, XFS_FSB_TO_DADDR(mp, ep->br_startblock), XFS_FSB_TO_BB(mp, ep->br_blockcount)); bno +=3D ep->br_blockcount; @@ -767,7 +767,7 @@ mk_rsumino(xfs_mount_t *mp) error); } for (i =3D 0, ep =3D map; i < nmap; i++, ep++) { - libxfs_device_zero(mp->m_dev, + libxfs_device_zero(mp->m_ddev_targ.dev, XFS_FSB_TO_DADDR(mp, ep->br_startblock), XFS_FSB_TO_BB(mp, ep->br_blockcount)); bno +=3D ep->br_blockcount; @@ -1256,7 +1256,7 @@ _("can't map block %d in %s inode %" PRIu64 ", xfs_bm= api returns %d, nmap =3D %d\n */ =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); =20 if (!bp) { do_warn( @@ -1623,7 +1623,7 @@ longform_dir_entry_check(xfs_mount_t *mp, skipit =3D 0; =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); =20 if (!bp) { do_error( diff --git a/repair/prefetch.c b/repair/prefetch.c index e0eff96..f985e38 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -222,7 +222,7 @@ pf_scan_lbtree( int rc; =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dbno), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) return 0; =20 @@ -721,7 +721,7 @@ init_prefetch( xfs_mount_t *pmp) { mp =3D pmp; - mp_fd =3D libxfs_device_to_fd(mp->m_dev); + mp_fd =3D libxfs_device_to_fd(mp->m_ddev_targ.dev); pf_max_bytes =3D sysconf(_SC_PAGE_SIZE) << 7; pf_max_bbs =3D pf_max_bytes >> BBSHIFT; pf_max_fsbs =3D pf_max_bytes >> mp->m_sb.sb_blocklog; diff --git a/repair/rt.c b/repair/rt.c index d6ecd56..042ff46 100644 --- a/repair/rt.c +++ b/repair/rt.c @@ -206,7 +206,7 @@ process_rtbitmap(xfs_mount_t *mp, continue; } bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1)); + XFS_FSB_TO_BB(mp, 1), NULL); if (!bp) { do_warn(_("can't read block %d for rtbitmap inode\n"), bmbno); @@ -268,7 +268,7 @@ process_rtsummary(xfs_mount_t *mp, continue; } bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1)); + XFS_FSB_TO_BB(mp, 1), NULL); if (!bp) { do_warn(_("can't read block %d for rtsummary inode\n"), sumbno); diff --git a/repair/scan.c b/repair/scan.c index 76bb7f1..82a0fed 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -85,7 +85,7 @@ scan_sbtree( xfs_buf_t *bp; =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, root), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_error(_("can't read btree block %d/%d\n"), agno, root); return; @@ -130,7 +130,7 @@ scan_lbtree( int dirty =3D 0; =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, root), - XFS_FSB_TO_BB(mp, 1), 0); + XFS_FSB_TO_BB(mp, 1), 0, NULL); if (!bp) { do_error(_("can't read btree block %d/%d\n"), XFS_FSB_TO_AGNO(mp, root), @@ -1060,7 +1060,7 @@ scan_freelist( =20 agflbuf =3D libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0); + XFS_FSS_TO_BB(mp, 1), 0, &xfs_agfl_buf_ops); if (!agflbuf) { do_abort(_("can't read agfl block for ag %d\n"), agno); return; @@ -1207,7 +1207,7 @@ scan_ag( int status; =20 sbbuf =3D libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), - XFS_FSS_TO_BB(mp, 1), 0); + XFS_FSS_TO_BB(mp, 1), 0, &xfs_sb_buf_ops); if (!sbbuf) { do_error(_("can't get root superblock for ag %d\n"), agno); return; @@ -1223,7 +1223,7 @@ scan_ag( =20 agfbuf =3D libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0); + XFS_FSS_TO_BB(mp, 1), 0, &xfs_agf_buf_ops); if (!agfbuf) { do_error(_("can't read agf block for ag %d\n"), agno); libxfs_putbuf(sbbuf); @@ -1234,7 +1234,7 @@ scan_ag( =20 agibuf =3D libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0); + XFS_FSS_TO_BB(mp, 1), 0, &xfs_agi_buf_ops); if (!agibuf) { do_error(_("can't read agi block for ag %d\n"), agno); libxfs_putbuf(agfbuf); diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 67a7446..167b1f6 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -558,9 +558,12 @@ main(int argc, char **argv) } =20 /* prepare the mount structure */ - sbp =3D libxfs_readbuf(x.ddev, XFS_SB_DADDR, - 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0); memset(&xfs_m, 0, sizeof(xfs_mount_t)); + xfs_m.m_ddev_targ.dev =3D x.ddev; + xfs_m.m_ddev_targ.bt_mount =3D &xfs_m; + sbp =3D libxfs_readbuf(xfs_m.m_ddev_targ, XFS_SB_DADDR, + 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0, + &xfs_sb_buf_ops); libxfs_sb_from_disk(&xfs_m.m_sb, XFS_BUF_TO_SBP(sbp)); =20 /* =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-crc-patch= set-v2/xfsprogs-repair-crc-support=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=000000600=000001750=000001750=0000000130076=001= 2132011547=00021604=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00xfsprogs: add crc format support to repair =46rom: Dave Chinner Signed-off-by: Dave Chinner --- db/sb.c | 1 + include/libxfs.h | 5 ++ include/xfs_alloc_btree.h | 2 +- include/xfs_bmap_btree.h | 2 +- include/xfs_btree.h | 5 +- include/xfs_ialloc_btree.h | 2 +- include/xfs_symlink.h | 2 + libxfs/rdwr.c | 20 ++++- libxfs/xfs.h | 12 ++- libxfs/xfs_alloc.c | 7 +- libxfs/xfs_btree.c | 20 +++-- libxfs/xfs_ialloc.c | 2 - libxfs/xfs_mount.c | 16 ---- libxlog/xfs_log_recover.c | 4 +- logprint/logprint.c | 3 + repair/agheader.c | 36 ++++++++- repair/dino_chunks.c | 7 +- repair/dinode.c | 190 ++++++++++++++++++++++++++--------------= ---- repair/phase2.c | 1 + repair/phase5.c | 157 +++++++++++++++++++++++++++--------- repair/prefetch.c | 7 +- repair/scan.c | 158 +++++++++++++++++++----------------- repair/scan.h | 12 ++- repair/versions.c | 2 +- repair/xfs_repair.c | 2 +- 25 files changed, 435 insertions(+), 240 deletions(-) diff --git a/db/sb.c b/db/sb.c index f99210c..af86722 100644 --- a/db/sb.c +++ b/db/sb.c @@ -240,6 +240,7 @@ sb_logcheck(void) log.l_logsize =3D BBTOB(log.l_logBBsize); log.l_logBBsize =3D x.logBBsize; log.l_logBBstart =3D x.logBBstart; + log.l_sectBBsize =3D x.lbsize; log.l_mp =3D mp; =20 if (xlog_find_tail(&log, &head_blk, &tail_blk)) { diff --git a/include/libxfs.h b/include/libxfs.h index 8ee4eaa..0f870f6 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -679,6 +679,7 @@ void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_= irec_t *s); #define libxfs_dinode_to_disk xfs_dinode_to_disk void xfs_dinode_from_disk(struct xfs_icdinode *, struct xfs_dinode *); +#define libxfs_dinode_calc_crc xfs_dinode_calc_crc #define libxfs_idata_realloc xfs_idata_realloc #define libxfs_idestroy_fork xfs_idestroy_fork =20 @@ -687,6 +688,10 @@ void xfs_dinode_from_disk(struct xfs_icdinode *, #define libxfs_sb_from_disk xfs_sb_from_disk #define libxfs_sb_to_disk xfs_sb_to_disk =20 +/* xfs_symlink.h */ +#define libxfs_symlink_blocks xfs_symlink_blocks +#define libxfs_symlink_hdr_ok xfs_symlink_hdr_ok + /* xfs_rtalloc.c */ int libxfs_rtfree_extent(struct xfs_trans *, xfs_rtblock_t, xfs_extlen_t); =20 diff --git a/include/xfs_alloc_btree.h b/include/xfs_alloc_btree.h index 70c3ea0..e160339 100644 --- a/include/xfs_alloc_btree.h +++ b/include/xfs_alloc_btree.h @@ -64,7 +64,7 @@ typedef __be32 xfs_alloc_ptr_t; */ #define XFS_ALLOC_BLOCK_LEN(mp) \ (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ - XFS_BTREE_SBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD : \ + XFS_BTREE_SBLOCK_CRC_LEN : \ XFS_BTREE_SBLOCK_LEN) =20 /* diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index 8a28b89..20d66b0 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -140,7 +140,7 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; */ #define XFS_BMBT_BLOCK_LEN(mp) \ (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ - XFS_BTREE_LBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD : \ + XFS_BTREE_LBLOCK_CRC_LEN : \ XFS_BTREE_LBLOCK_LEN) =20 #define XFS_BMBT_REC_ADDR(mp, block, index) \ diff --git a/include/xfs_btree.h b/include/xfs_btree.h index 02f89d8..c0acbbf 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -83,7 +83,10 @@ struct xfs_btree_block { =20 #define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */ #define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */ -#define XFS_BTREE_CRCBLOCK_ADD 32 /* size of blkno + crc + uuid */ + +/* sizes of CRC enabled btree blocks */ +#define XFS_BTREE_SBLOCK_CRC_LEN (XFS_BTREE_SBLOCK_LEN + 40) +#define XFS_BTREE_LBLOCK_CRC_LEN (XFS_BTREE_LBLOCK_LEN + 48) =20 #define XFS_BTREE_SBLOCK_CRC_OFF \ offsetof(struct xfs_btree_block, bb_u.s.bb_crc) diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index a1bfa7a..7f5ae6b 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -80,7 +80,7 @@ typedef __be32 xfs_inobt_ptr_t; */ #define XFS_INOBT_BLOCK_LEN(mp) \ (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ - XFS_BTREE_SBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD : \ + XFS_BTREE_SBLOCK_CRC_LEN : \ XFS_BTREE_SBLOCK_LEN) =20 /* diff --git a/include/xfs_symlink.h b/include/xfs_symlink.h index bb21e6a..55f3f2d 100644 --- a/include/xfs_symlink.h +++ b/include/xfs_symlink.h @@ -29,6 +29,8 @@ struct xfs_dsymlink_hdr { sizeof(struct xfs_dsymlink_hdr) : 0)) =20 int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); +bool xfs_symlink_hdr_ok(struct xfs_mount *mp, xfs_ino_t ino, uint32_t offs= et, + uint32_t size, struct xfs_buf *bp); =20 extern const struct xfs_buf_ops xfs_symlink_buf_ops; =20 diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index db4ed6e..1b56e57 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -444,6 +444,7 @@ __libxfs_getbufr(int blen) } else bp =3D kmem_zone_zalloc(xfs_buf_zone, 0); pthread_mutex_unlock(&xfs_buf_freelist.cm_mutex); + bp->b_ops =3D NULL; =20 return bp; } @@ -736,6 +737,7 @@ libxfs_readbuf_map(struct xfs_buftarg dev, struct xfs_b= uf_map *map, int nmaps, bp =3D libxfs_getbuf_map(dev, map, nmaps); if (!bp) return NULL; + bp->b_error =3D 0; bp->b_ops =3D ops; if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) return bp; @@ -813,10 +815,20 @@ libxfs_writebufr(xfs_buf_t *bp) return bp->b_error; } =20 + /* + * clear any pre-existing error status on the buffer. This can occur if + * the buffer is corrupt on disk and the repair process doesn't clear + * the error before fixing and writing it back. + */ + bp->b_error =3D 0; if (bp->b_ops) { bp->b_ops->verify_write(bp); - if (bp->b_error) + if (bp->b_error) { + fprintf(stderr, + _("%s: write verifer failed on bno 0x%llx/0x%x\n"), + __func__, (long long)bp->b_bn, bp->b_bcount); return bp->b_error; + } } =20 if (!(bp->b_flags & LIBXFS_B_DISCONTIG)) { @@ -863,6 +875,12 @@ libxfs_writebuf_int(xfs_buf_t *bp, int flags) int libxfs_writebuf(xfs_buf_t *bp, int flags) { +#ifdef IO_DEBUG + printf("%lx: %s: dirty blkno=3D%llu(%llu)\n", + pthread_self(), __FUNCTION__, + (long long)LIBXFS_BBTOOFF64(bp->b_bn), + (long long)bp->b_bn); +#endif bp->b_flags |=3D (LIBXFS_B_DIRTY | flags); libxfs_putbuf(bp); return 0; diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 4bad148..7051ec5 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -79,8 +79,16 @@ typedef __uint32_t inst_t; /* an instruction */ #define IHOLD(ip) ((void) 0) =20 /* stop unused var warnings by assigning mp to itself */ -#define XFS_CORRUPTION_ERROR(e,l,mp,m) do { (mp) =3D (mp); } while (0) -#define XFS_ERROR_REPORT(e,l,mp) do { (mp) =3D (mp); } while (0) +#define XFS_CORRUPTION_ERROR(e,l,mp,m) do { \ + (mp) =3D (mp); \ + cmn_err(CE_ALERT, "%s: XFS_CORRUPTION_ERROR", (e)); \ +} while (0) + +#define XFS_ERROR_REPORT(e,l,mp) do { \ + (mp) =3D (mp); \ + cmn_err(CE_ALERT, "%s: XFS_ERROR_REPORT", (e)); \ +} while (0) + #define XFS_QM_DQATTACH(mp,ip,flags) 0 #define XFS_ERROR(e) (e) #define XFS_ERRLEVEL_LOW 1 diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 1429c9b..54f1b35 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -2173,8 +2173,13 @@ xfs_agf_verify( struct xfs_agf *agf =3D XFS_BUF_TO_AGF(bp); =20 if (xfs_sb_version_hascrc(&mp->m_sb) && - !uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_uuid)) + !uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_uuid)) { + char uu[64], uu2[64]; + platform_uuid_unparse(&agf->agf_uuid, uu); + platform_uuid_unparse(&mp->m_sb.sb_uuid, uu2); + return false; + } =20 if (!(agf->agf_magicnum =3D=3D cpu_to_be32(XFS_AGF_MAGIC) && XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 60a7d61..3814b53 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -391,17 +391,15 @@ xfs_btree_dup_cursor( */ static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) { - size_t len; - - if (cur->bc_flags & XFS_BTREE_LONG_PTRS) - len =3D XFS_BTREE_LBLOCK_LEN; - else - len =3D XFS_BTREE_SBLOCK_LEN; + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) + return XFS_BTREE_LBLOCK_CRC_LEN; + return XFS_BTREE_LBLOCK_LEN; + } =20 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) - len +=3D XFS_BTREE_CRCBLOCK_ADD; - - return len; + return XFS_BTREE_SBLOCK_CRC_LEN; + return XFS_BTREE_SBLOCK_LEN; } =20 /* @@ -1311,7 +1309,7 @@ xfs_btree_log_block( offsetof(struct xfs_btree_block, bb_u.s.bb_uuid), offsetof(struct xfs_btree_block, bb_u.s.bb_owner), offsetof(struct xfs_btree_block, bb_u.s.bb_crc), - XFS_BTREE_SBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD + XFS_BTREE_SBLOCK_CRC_LEN }; static const short loffsets[] =3D { /* table of offsets (long) */ offsetof(struct xfs_btree_block, bb_magic), @@ -1325,7 +1323,7 @@ xfs_btree_log_block( offsetof(struct xfs_btree_block, bb_u.l.bb_owner), offsetof(struct xfs_btree_block, bb_u.l.bb_crc), offsetof(struct xfs_btree_block, bb_u.l.bb_pad), - XFS_BTREE_LBLOCK_LEN + XFS_BTREE_CRCBLOCK_ADD + XFS_BTREE_LBLOCK_CRC_LEN }; =20 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 8b0fa0e..282d938 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -182,8 +182,6 @@ xfs_ialloc_inode_init( ino =3D XFS_AGINO_TO_INO(mp, agno, XFS_OFFBNO_TO_AGINO(mp, agbno, 0)); } else if (xfs_sb_version_hasnlink(&mp->m_sb)) - version =3D 3; - else if (xfs_sb_version_hasnlink(&mp->m_sb)) version =3D 2; else version =3D 1; diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index 029f891..774fd2c 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -181,22 +181,6 @@ xfs_mount_validate_sb( } } =20 - if (unlikely( - sbp->sb_logstart =3D=3D 0 && mp->m_logdev.dev =3D=3D mp->m_dev.dev)) { - xfs_warn(mp, - "filesystem is marked as having an external log; " - "specify logdev on the mount command line."); - return XFS_ERROR(EINVAL); - } - - if (unlikely( - sbp->sb_logstart !=3D 0 && mp->m_logdev.dev !=3D mp->m_dev.dev)) { - xfs_warn(mp, - "filesystem is marked as having an internal log; " - "do not specify logdev on the mount command line."); - return XFS_ERROR(EINVAL); - } - /* * More sanity checking. Most of these were stolen directly from * xfs_repair. diff --git a/libxlog/xfs_log_recover.c b/libxlog/xfs_log_recover.c index ad53e86..c66f9a1 100644 --- a/libxlog/xfs_log_recover.c +++ b/libxlog/xfs_log_recover.c @@ -19,9 +19,7 @@ #include =20 #define xfs_readonly_buftarg(buftarg) (0) - -/* avoid set-but-unused var warning. gcc is not very bright. */ -#define xlog_clear_stale_blocks(log, taillsn) ((taillsn) =3D (taillsn)) +#define xlog_clear_stale_blocks(log, taillsn) (0) =20 =20 /* diff --git a/logprint/logprint.c b/logprint/logprint.c index 5452e87..cf24b6e 100644 --- a/logprint/logprint.c +++ b/logprint/logprint.c @@ -93,6 +93,7 @@ logstat(xfs_mount_t *mp) =20 x.logBBsize =3D XFS_FSB_TO_BB(mp, sb->sb_logblocks); x.logBBstart =3D XFS_FSB_TO_DADDR(mp, sb->sb_logstart); + x.lbsize =3D 1 << mp->m_sb.sb_logsectlog; if (!x.logname && sb->sb_logstart =3D=3D 0) { fprintf(stderr, _(" external log device not specified\n\n")); usage(); @@ -104,6 +105,7 @@ logstat(xfs_mount_t *mp) stat(x.dname, &s); x.logBBsize =3D s.st_size >> 9; x.logBBstart =3D 0; + x.lbsize =3D 1; } =20 =20 @@ -235,6 +237,7 @@ main(int argc, char **argv) log.l_logsize =3D BBTOB(x.logBBsize); log.l_logBBstart =3D x.logBBstart; log.l_logBBsize =3D x.logBBsize; + log.l_sectBBsize =3D x.lbsize; log.l_mp =3D &mount; =20 switch (print_operation) { diff --git a/repair/agheader.c b/repair/agheader.c index 769022d..bc8b1bf 100644 --- a/repair/agheader.c +++ b/repair/agheader.c @@ -22,6 +22,11 @@ #include "protos.h" #include "err_protos.h" =20 +/* + * XXX (dgc): WTF is the point of all the check and repair here when phase= 5 + * recreates the AGF/AGI/AGFL completely from scratch? + */ + static int verify_set_agf(xfs_mount_t *mp, xfs_agf_t *agf, xfs_agnumber_t i) { @@ -104,7 +109,20 @@ verify_set_agf(xfs_mount_t *mp, xfs_agf_t *agf, xfs_ag= number_t i) =20 /* don't check freespace btrees -- will be checked by caller */ =20 - return(retval); + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return retval; + + if (platform_uuid_compare(&agf->agf_uuid, &mp->m_sb.sb_uuid)) { + char uu[64]; + + retval =3D XR_AG_AGF; + platform_uuid_unparse(&agf->agf_uuid, uu); + do_warn(_("bad uuid %s for agf %d\n"), uu, i); + + if (!no_modify) + platform_uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_uuid); + } + return retval; } =20 static int @@ -169,7 +187,21 @@ verify_set_agi(xfs_mount_t *mp, xfs_agi_t *agi, xfs_ag= number_t agno) =20 /* don't check inode btree -- will be checked by caller */ =20 - return(retval); + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return retval; + + if (platform_uuid_compare(&agi->agi_uuid, &mp->m_sb.sb_uuid)) { + char uu[64]; + + retval =3D XR_AG_AGI; + platform_uuid_unparse(&agi->agi_uuid, uu); + do_warn(_("bad uuid %s for agi %d\n"), uu, agno); + + if (!no_modify) + platform_uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid); + } + + return retval; } =20 /* diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c index 3e7e225..280423b 100644 --- a/repair/dino_chunks.c +++ b/repair/dino_chunks.c @@ -629,7 +629,7 @@ process_inode_chunk( bplist[bp_index] =3D libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, agbno), XFS_FSB_TO_BB(mp, blks_per_cluster), 0, - NULL); + &xfs_inode_buf_ops); if (!bplist[bp_index]) { do_warn(_("cannot read inode %" PRIu64 ", disk block %" PRId64 ", cnt %= d\n"), XFS_AGINO_TO_INO(mp, agno, first_irec->ino_startnum), @@ -776,8 +776,11 @@ process_inode_chunk( extra_attr_check, &isa_dir, &parent); =20 ASSERT(is_used !=3D 3); - if (ino_dirty) + if (ino_dirty) { dirty =3D 1; + libxfs_dinode_calc_crc(mp, dino); + } + /* * XXX - if we want to try and keep * track of whether we need to bang on diff --git a/repair/dinode.c b/repair/dinode.c index 7a75dc8..82bea55 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -86,139 +86,127 @@ _("would have cleared inode %" PRIu64 " attributes\n"= ), ino_num); } =20 static int -clear_dinode_core(xfs_dinode_t *dinoc, xfs_ino_t ino_num) +clear_dinode_core(struct xfs_mount *mp, xfs_dinode_t *dinoc, xfs_ino_t ino= _num) { int dirty =3D 0; + int i; =20 - if (be16_to_cpu(dinoc->di_magic) !=3D XFS_DINODE_MAGIC) { - dirty =3D 1; - - if (no_modify) - return(1); +#define __dirty_no_modify_ret(dirty) \ + ({ (dirty) =3D 1; if (no_modify) return 1; }) =20 + if (be16_to_cpu(dinoc->di_magic) !=3D XFS_DINODE_MAGIC) { + __dirty_no_modify_ret(dirty); dinoc->di_magic =3D cpu_to_be16(XFS_DINODE_MAGIC); } =20 if (!XFS_DINODE_GOOD_VERSION(dinoc->di_version) || (!fs_inode_nlink && dinoc->di_version > 1)) { - dirty =3D 1; - - if (no_modify) - return(1); - - dinoc->di_version =3D (fs_inode_nlink) ? 2 : 1; + __dirty_no_modify_ret(dirty); + if (xfs_sb_version_hascrc(&mp->m_sb)) + dinoc->di_version =3D 3; + else + dinoc->di_version =3D (fs_inode_nlink) ? 2 : 1; } =20 if (be16_to_cpu(dinoc->di_mode) !=3D 0) { - dirty =3D 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_mode =3D 0; } =20 if (be16_to_cpu(dinoc->di_flags) !=3D 0) { - dirty =3D 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_flags =3D 0; } =20 if (be32_to_cpu(dinoc->di_dmevmask) !=3D 0) { - dirty =3D 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_dmevmask =3D 0; } =20 if (dinoc->di_forkoff !=3D 0) { - dirty =3D 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_forkoff =3D 0; } =20 if (dinoc->di_format !=3D XFS_DINODE_FMT_EXTENTS) { - dirty =3D 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_format =3D XFS_DINODE_FMT_EXTENTS; } =20 if (dinoc->di_aformat !=3D XFS_DINODE_FMT_EXTENTS) { - dirty =3D 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_aformat =3D XFS_DINODE_FMT_EXTENTS; } =20 if (be64_to_cpu(dinoc->di_size) !=3D 0) { - dirty =3D 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_size =3D 0; } =20 if (be64_to_cpu(dinoc->di_nblocks) !=3D 0) { - dirty =3D 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_nblocks =3D 0; } =20 if (be16_to_cpu(dinoc->di_onlink) !=3D 0) { - dirty =3D 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_onlink =3D 0; } =20 if (be32_to_cpu(dinoc->di_nextents) !=3D 0) { - dirty =3D 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_nextents =3D 0; } =20 if (be16_to_cpu(dinoc->di_anextents) !=3D 0) { - dirty =3D 1; - - if (no_modify) - return(1); - + __dirty_no_modify_ret(dirty); dinoc->di_anextents =3D 0; } =20 if (dinoc->di_version > 1 && be32_to_cpu(dinoc->di_nlink) !=3D 0) { - dirty =3D 1; + __dirty_no_modify_ret(dirty); + dinoc->di_nlink =3D 0; + } =20 - if (no_modify) - return(1); + /* we are done for version 1/2 inodes */ + if (dinoc->di_version < 3) + return dirty; =20 - dinoc->di_nlink =3D 0; + if (be64_to_cpu(dinoc->di_ino) !=3D ino_num) { + __dirty_no_modify_ret(dirty); + dinoc->di_ino =3D cpu_to_be64(ino_num); } =20 - return(dirty); + if (platform_uuid_compare(&dinoc->di_uuid, &mp->m_sb.sb_uuid)) { + __dirty_no_modify_ret(dirty); + platform_uuid_copy(&dinoc->di_uuid, &mp->m_sb.sb_uuid); + } + + for (i =3D 0; i < 16; i++) { + if (dinoc->di_pad[i] !=3D 0) { + __dirty_no_modify_ret(dirty); + memset(dinoc->di_pad, 0, 16); + break; + } + } + + if (be64_to_cpu(dinoc->di_flags2) !=3D 0) { + __dirty_no_modify_ret(dirty); + dinoc->di_flags2 =3D 0; + } + + if (be64_to_cpu(dinoc->di_lsn) !=3D 0) { + __dirty_no_modify_ret(dirty); + dinoc->di_lsn =3D 0; + } + + if (be64_to_cpu(dinoc->di_changecount) !=3D 0) { + __dirty_no_modify_ret(dirty); + dinoc->di_changecount =3D 0; + } + + return dirty; } =20 static int @@ -244,7 +232,7 @@ clear_dinode(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_i= no_t ino_num) { int dirty; =20 - dirty =3D clear_dinode_core(dino, ino_num); + dirty =3D clear_dinode_core(mp, dino, ino_num); dirty +=3D clear_dinode_unlinked(mp, dino); =20 /* and clear the forks */ @@ -1127,6 +1115,7 @@ process_btinode( int level; int numrecs; bmap_cursor_t cursor; + __uint64_t magic; =20 dib =3D (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); lino =3D XFS_AGINO_TO_INO(mp, agno, ino); @@ -1138,6 +1127,9 @@ process_btinode( else forkname =3D _("attr"); =20 + magic =3D xfs_sb_version_hascrc(&mp->m_sb) ? XFS_BMAP_CRC_MAGIC + : XFS_BMAP_MAGIC; + level =3D be16_to_cpu(dib->bb_level); numrecs =3D be16_to_cpu(dib->bb_numrecs); =20 @@ -1191,9 +1183,9 @@ _("bad numrecs 0 in inode %" PRIu64 " bmap btree root= block\n"), return(1); } =20 - if (scan_lbtree(be64_to_cpu(pp[i]), level, scanfunc_bmap, type,=20 + if (scan_lbtree(be64_to_cpu(pp[i]), level, scan_bmapbt, type,=20 whichfork, lino, tot, nex, blkmapp, &cursor, - 1, check_dups)) + 1, check_dups, magic, &xfs_bmbt_buf_ops)) return(1); /* * fix key (offset) mismatches between the keys in root @@ -1512,9 +1504,21 @@ _("cannot read inode %" PRIu64 ", file block %d, dis= k block %" PRIu64 "\n"), return(1); } =20 + buf_data =3D (char *)XFS_BUF_PTR(bp); - size =3D MIN(be64_to_cpu(dino->di_size) - amountdone,=20 - XFS_FSB_TO_BB(mp, 1) * BBSIZE); + size =3D MIN(be64_to_cpu(dino->di_size) - amountdone, + XFS_SYMLINK_BUF_SPACE(mp, + mp->m_sb.sb_blocksize)); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (!libxfs_symlink_hdr_ok(mp, lino, amountdone, + size, bp)) { + do_warn( +_("bad symlink header ino %" PRIu64 ", file block %d, disk block %" PRIu64= "\n"), + lino, i, fsbno); + return(1); + } + buf_data +=3D sizeof(struct xfs_dsymlink_hdr); + } memmove(cptr, buf_data, size); cptr +=3D size; amountdone +=3D size; @@ -2464,7 +2468,8 @@ process_dinode_int(xfs_mount_t *mp, } =20 if (!XFS_DINODE_GOOD_VERSION(dino->di_version) || - (!fs_inode_nlink && dino->di_version > 1)) { + (!fs_inode_nlink && dino->di_version > 1) || + (xfs_sb_version_hascrc(&mp->m_sb) && dino->di_version < 3) ) { retval =3D 1; if (!uncertain) do_warn(_("bad version number 0x%x on inode %" PRIu64 "%c"), @@ -2473,7 +2478,9 @@ process_dinode_int(xfs_mount_t *mp, if (!verify_mode) { if (!no_modify) { do_warn(_(" resetting version number\n")); - dino->di_version =3D (fs_inode_nlink) ? 2 : 1; + dino->di_version =3D + xfs_sb_version_hascrc(&mp->m_sb) ? 3 : + (fs_inode_nlink) ? 2 : 1; *dirty =3D 1; } else do_warn(_(" would reset version number\n")); @@ -2481,6 +2488,31 @@ process_dinode_int(xfs_mount_t *mp, } =20 /* + * We don't bother checking the CRC here - we cannot guarantee that when + * we are called here that the inode has not already been modified in + * memory and hence invalidated the CRC. + */ + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (be64_to_cpu(dino->di_ino) !=3D lino) { + if (!uncertain) + do_warn( +_("inode identifier %llu mismatch on inode %" PRIu64 "\n"), + be64_to_cpu(dino->di_ino), lino); + if (verify_mode) + return 1; + goto clear_bad_out; + } + if (platform_uuid_compare(&dino->di_uuid, &mp->m_sb.sb_uuid)) { + if (!uncertain) + do_warn( + _("UUID mismatch on inode %" PRIu64 "\n"), lino); + if (verify_mode) + return 1; + goto clear_bad_out; + } + } + + /* * blow out of here if the inode size is < 0 */ if ((xfs_fsize_t)be64_to_cpu(dino->di_size) < 0) { diff --git a/repair/phase2.c b/repair/phase2.c index 5a4cf10..0481f51 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -64,6 +64,7 @@ zero_log(xfs_mount_t *mp) ASSERT(mp->m_sb.sb_logsectlog >=3D BBSHIFT); } log.l_sectbb_mask =3D (1 << log.l_sectbb_log) - 1; + log.l_sectBBsize =3D 1 << mp->m_sb.sb_logsectlog; =20 if ((error =3D xlog_find_tail(&log, &head_blk, &tail_blk))) { do_warn(_("zero_log: cannot find log head/tail " diff --git a/repair/phase5.c b/repair/phase5.c index 1f71cac..ce5352e 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -602,6 +602,12 @@ prop_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t = agno, xfs_alloc_ptr_t *bt_ptr; xfs_agblock_t agbno; bt_stat_level_t *lptr; + __uint32_t crc_magic; + + if (magic =3D=3D XFS_ABTB_MAGIC) + crc_magic =3D XFS_ABTB_CRC_MAGIC; + else + crc_magic =3D XFS_ABTC_CRC_MAGIC; =20 level++; =20 @@ -650,14 +656,17 @@ prop_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t= agno, /* * initialize block header */ + lptr->buf_p->b_ops =3D &xfs_allocbt_buf_ops; bt_hdr =3D XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, lptr->buf_p, crc_magic, level, + 0, agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, lptr->buf_p, magic, level, + 0, agno, 0); =20 - bt_hdr->bb_magic =3D cpu_to_be32(magic); - bt_hdr->bb_level =3D cpu_to_be16(level); bt_hdr->bb_u.s.bb_leftsib =3D cpu_to_be32(lptr->prev_agbno); - bt_hdr->bb_u.s.bb_rightsib =3D cpu_to_be32(NULLAGBLOCK); - bt_hdr->bb_numrecs =3D 0; =20 /* * propagate extent record for first extent in new block up @@ -699,6 +708,7 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t ag= no, extent_tree_node_t *ext_ptr; bt_stat_level_t *lptr; xfs_extlen_t freeblks; + __uint32_t crc_magic; =20 #ifdef XR_BLD_FREE_TRACE fprintf(stderr, "in build_freespace_tree, agno =3D %d\n", agno); @@ -707,6 +717,10 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t a= gno, freeblks =3D 0; =20 ASSERT(level > 0); + if (magic =3D=3D XFS_ABTB_MAGIC) + crc_magic =3D XFS_ABTB_CRC_MAGIC; + else + crc_magic =3D XFS_ABTC_CRC_MAGIC; =20 /* * initialize the first block on each btree level @@ -728,14 +742,15 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t = agno, /* * initialize block header */ + lptr->buf_p->b_ops =3D &xfs_allocbt_buf_ops; bt_hdr =3D XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); - - bt_hdr->bb_magic =3D cpu_to_be32(magic); - bt_hdr->bb_level =3D cpu_to_be16(i); - bt_hdr->bb_u.s.bb_leftsib =3D cpu_to_be32(NULLAGBLOCK); - bt_hdr->bb_u.s.bb_rightsib =3D cpu_to_be32(NULLAGBLOCK); - bt_hdr->bb_numrecs =3D 0; + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, lptr->buf_p, crc_magic, i, + 0, agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, lptr->buf_p, magic, i, + 0, agno, 0); } /* * run along leaf, setting up records. as we have to switch @@ -759,13 +774,17 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t = agno, /* * block initialization, lay in block header */ + lptr->buf_p->b_ops =3D &xfs_allocbt_buf_ops; bt_hdr =3D XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, lptr->buf_p, crc_magic, 0, + 0, agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, lptr->buf_p, magic, 0, + 0, agno, 0); =20 - bt_hdr->bb_magic =3D cpu_to_be32(magic); - bt_hdr->bb_level =3D 0; bt_hdr->bb_u.s.bb_leftsib =3D cpu_to_be32(lptr->prev_agbno); - bt_hdr->bb_u.s.bb_rightsib =3D cpu_to_be32(NULLAGBLOCK); bt_hdr->bb_numrecs =3D cpu_to_be16(lptr->num_recs_pb + (lptr->modulo > 0)); #ifdef XR_BLD_FREE_TRACE @@ -996,14 +1015,19 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno= , bt_status_t *btree_curs, /* * initialize block header */ + lptr->buf_p->b_ops =3D &xfs_inobt_buf_ops; bt_hdr =3D XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_CRC_MAGIC, + level, 0, agno, + XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, + level, 0, agno, 0); =20 - bt_hdr->bb_magic =3D cpu_to_be32(XFS_IBT_MAGIC); - bt_hdr->bb_level =3D cpu_to_be16(level); bt_hdr->bb_u.s.bb_leftsib =3D cpu_to_be32(lptr->prev_agbno); - bt_hdr->bb_u.s.bb_rightsib =3D cpu_to_be32(NULLAGBLOCK); - bt_hdr->bb_numrecs =3D 0; + /* * propagate extent record for first extent in new block up */ @@ -1024,6 +1048,9 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno,= bt_status_t *btree_curs, *bt_ptr =3D cpu_to_be32(btree_curs->level[level-1].agbno); } =20 +/* + * XXX: yet more code that can be shared with mkfs, growfs. + */ static void build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, xfs_agino_t first_agino, @@ -1036,6 +1063,7 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, agi_buf =3D libxfs_getbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), mp->m_sb.sb_sectsize/BBSIZE); + agi_buf->b_ops =3D &xfs_agi_buf_ops; agi =3D XFS_BUF_TO_AGI(agi_buf); memset(agi, 0, mp->m_sb.sb_sectsize); =20 @@ -1057,6 +1085,9 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, for (i =3D 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) =20 agi->agi_unlinked[i] =3D cpu_to_be32(NULLAGINO); =20 + if (xfs_sb_version_hascrc(&mp->m_sb)) + platform_uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid); + libxfs_writebuf(agi_buf, 0); } =20 @@ -1099,15 +1130,19 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, /* * initialize block header */ + + lptr->buf_p->b_ops =3D &xfs_inobt_buf_ops; bt_hdr =3D XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); - - bt_hdr->bb_magic =3D cpu_to_be32(XFS_IBT_MAGIC); - bt_hdr->bb_level =3D cpu_to_be16(i); - bt_hdr->bb_u.s.bb_leftsib =3D cpu_to_be32(NULLAGBLOCK); - bt_hdr->bb_u.s.bb_rightsib =3D cpu_to_be32(NULLAGBLOCK); - bt_hdr->bb_numrecs =3D 0; + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_CRC_MAGIC, + i, 0, agno, + XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, + i, 0, agno, 0); } + /* * run along leaf, setting up records. as we have to switch * blocks, call the prop_ino_cursor routine to set up the new @@ -1127,13 +1162,18 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, /* * block initialization, lay in block header */ + lptr->buf_p->b_ops =3D &xfs_inobt_buf_ops; bt_hdr =3D XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_CRC_MAGIC, + 0, 0, agno, + XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, + 0, 0, agno, 0); =20 - bt_hdr->bb_magic =3D cpu_to_be32(XFS_IBT_MAGIC); - bt_hdr->bb_level =3D 0; bt_hdr->bb_u.s.bb_leftsib =3D cpu_to_be32(lptr->prev_agbno); - bt_hdr->bb_u.s.bb_rightsib =3D cpu_to_be32(NULLAGBLOCK); bt_hdr->bb_numrecs =3D cpu_to_be16(lptr->num_recs_pb + (lptr->modulo > 0)); =20 @@ -1192,7 +1232,9 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, =20 /* * build both the agf and the agfl for an agno given both - * btree cursors + * btree cursors. + * + * XXX: yet more common code that can be shared with mkfs/growfs. */ static void build_agf_agfl(xfs_mount_t *mp, @@ -1208,10 +1250,12 @@ build_agf_agfl(xfs_mount_t *mp, int j; xfs_agfl_t *agfl; xfs_agf_t *agf; + __be32 *freelist; =20 agf_buf =3D libxfs_getbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), mp->m_sb.sb_sectsize/BBSIZE); + agf_buf->b_ops =3D &xfs_agf_buf_ops; agf =3D XFS_BUF_TO_AGF(agf_buf); memset(agf, 0, mp->m_sb.sb_sectsize); =20 @@ -1265,31 +1309,45 @@ build_agf_agfl(xfs_mount_t *mp, XFS_BTNUM_CNT); #endif =20 + if (xfs_sb_version_hascrc(&mp->m_sb)) + platform_uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_uuid); + + /* initialise the AGFL, then fill it if there are blocks left over. */ + agfl_buf =3D libxfs_getbuf(mp->m_dev, + XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)), + mp->m_sb.sb_sectsize/BBSIZE); + agfl_buf->b_ops =3D &xfs_agfl_buf_ops; + agfl =3D XFS_BUF_TO_AGFL(agfl_buf); + + /* setting to 0xff results in initialisation to NULLAGBLOCK */ + memset(agfl, 0xff, mp->m_sb.sb_sectsize); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + agfl->agfl_magicnum =3D cpu_to_be32(XFS_AGFL_MAGIC); + agfl->agfl_seqno =3D cpu_to_be32(agno); + platform_uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_uuid); + for (i =3D 0; i < XFS_AGFL_SIZE(mp); i++) + agfl->agfl_bno[i] =3D cpu_to_be32(NULLAGBLOCK); + } + freelist =3D XFS_BUF_TO_AGFL_BNO(mp, agfl_buf); + /* * do we have left-over blocks in the btree cursors that should * be used to fill the AGFL? */ if (bno_bt->num_free_blocks > 0 || bcnt_bt->num_free_blocks > 0) { + /* - * yes - grab the AGFL buffer - */ - agfl_buf =3D libxfs_getbuf(mp->m_dev, - XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)), - mp->m_sb.sb_sectsize/BBSIZE); - agfl =3D XFS_BUF_TO_AGFL(agfl_buf); - memset(agfl, 0, mp->m_sb.sb_sectsize); - /* - * ok, now grab as many blocks as we can + * yes, now grab as many blocks as we can */ i =3D j =3D 0; while (bno_bt->num_free_blocks > 0 && i < XFS_AGFL_SIZE(mp)) { - agfl->agfl_bno[i] =3D cpu_to_be32( + freelist[i] =3D cpu_to_be32( get_next_blockaddr(agno, 0, bno_bt)); i++; } =20 while (bcnt_bt->num_free_blocks > 0 && i < XFS_AGFL_SIZE(mp)) { - agfl->agfl_bno[i] =3D cpu_to_be32( + freelist[i] =3D cpu_to_be32( get_next_blockaddr(agno, 0, bcnt_bt)); i++; } @@ -1324,13 +1382,14 @@ build_agf_agfl(xfs_mount_t *mp, fprintf(stderr, "writing agfl for ag %u\n", agno); #endif =20 - libxfs_writebuf(agfl_buf, 0); } else { agf->agf_flfirst =3D 0; agf->agf_fllast =3D cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); agf->agf_flcount =3D 0; } =20 + libxfs_writebuf(agfl_buf, 0); + ext_ptr =3D findbiggest_bcnt_extent(agno); agf->agf_longest =3D cpu_to_be32((ext_ptr !=3D NULL) ? ext_ptr->ex_blockcount : 0); @@ -1340,6 +1399,26 @@ build_agf_agfl(xfs_mount_t *mp, =20 libxfs_writebuf(agf_buf, 0); =20 + /* + * now fix up the free list appropriately + * XXX: code lifted from mkfs, shoul dbe shared. + */ + { + xfs_alloc_arg_t args; + xfs_trans_t *tp; + + memset(&args, 0, sizeof(args)); + args.tp =3D tp =3D libxfs_trans_alloc(mp, 0); + args.mp =3D mp; + args.agno =3D agno; + args.alignment =3D 1; + args.pag =3D xfs_perag_get(mp,agno); + libxfs_trans_reserve(tp, XFS_MIN_FREELIST(agf, mp), 0, 0, 0, 0); + libxfs_alloc_fix_freelist(&args, 0); + xfs_perag_put(args.pag); + libxfs_trans_commit(tp, 0); + } + #ifdef XR_BLD_FREE_TRACE fprintf(stderr, "wrote agf for ag %u, error =3D %d\n", agno, error); #endif diff --git a/repair/prefetch.c b/repair/prefetch.c index f985e38..a1b2454 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -222,7 +222,7 @@ pf_scan_lbtree( int rc; =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dbno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, &xfs_bmbt_buf_ops); if (!bp) return 0; =20 @@ -338,6 +338,11 @@ pf_read_inode_dirs( int hasdir =3D 0; int isadir; =20 + bp->b_ops =3D &xfs_inode_buf_ops; + bp->b_ops->verify_read(bp); + if (bp->b_error) + return; + for (icnt =3D 0; icnt < (XFS_BUF_COUNT(bp) >> mp->m_sb.sb_inodelog); icnt= ++) { dino =3D xfs_make_iptr(mp, bp, icnt); =20 diff --git a/repair/scan.c b/repair/scan.c index 82a0fed..6c72d64 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -48,17 +48,6 @@ struct aghdr_cnts { __uint64_t ifreecount; }; =20 -static void -scanfunc_allocbt( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot, - __uint32_t magic, - struct aghdr_cnts *agcnts); - void set_mp(xfs_mount_t *mpp) { @@ -78,20 +67,23 @@ scan_sbtree( xfs_agnumber_t agno, int suspect, int isroot, + __uint32_t magic, void *priv), int isroot, - void *priv) + __uint32_t magic, + void *priv, + const struct xfs_buf_ops *ops) { xfs_buf_t *bp; =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, root), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, ops); if (!bp) { do_error(_("can't read btree block %d/%d\n"), agno, root); return; } (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, root, agno, suspect, - isroot, priv); + isroot, magic, priv); libxfs_putbuf(bp); } =20 @@ -114,7 +106,8 @@ scan_lbtree( bmap_cursor_t *bm_cursor, int isroot, int check_dups, - int *dirty), + int *dirty, + __uint64_t magic), int type, int whichfork, xfs_ino_t ino, @@ -123,14 +116,16 @@ scan_lbtree( blkmap_t **blkmapp, bmap_cursor_t *bm_cursor, int isroot, - int check_dups) + int check_dups, + __uint64_t magic, + const struct xfs_buf_ops *ops) { xfs_buf_t *bp; int err; int dirty =3D 0; =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, root), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, ops); if (!bp) { do_error(_("can't read btree block %d/%d\n"), XFS_FSB_TO_AGNO(mp, root), @@ -139,7 +134,8 @@ scan_lbtree( } err =3D (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, type, whichfork, root, ino, tot, nex, blkmapp, - bm_cursor, isroot, check_dups, &dirty); + bm_cursor, isroot, check_dups, &dirty, + magic); =20 ASSERT(dirty =3D=3D 0 || (dirty && !no_modify)); =20 @@ -152,7 +148,7 @@ scan_lbtree( } =20 int -scanfunc_bmap( +scan_bmapbt( struct xfs_btree_block *block, int level, int type, @@ -165,7 +161,8 @@ scanfunc_bmap( bmap_cursor_t *bm_cursor, int isroot, int check_dups, - int *dirty) + int *dirty, + __uint64_t magic) { int i; int err; @@ -192,7 +189,7 @@ scanfunc_bmap( * another inode are claiming the same block but that's * highly unlikely. */ - if (be32_to_cpu(block->bb_magic) !=3D XFS_BMAP_MAGIC) { + if (be32_to_cpu(block->bb_magic) !=3D magic) { do_warn( _("bad magic # %#x in inode %" PRIu64 " (%s fork) bmbt block %" PRIu64 "\n= "), be32_to_cpu(block->bb_magic), ino, forkname, bno); @@ -206,6 +203,16 @@ _("expected level %d got %d in inode %" PRIu64 ", (%s = fork) bmbt block %" PRIu64 return(1); } =20 + if (magic =3D=3D XFS_BMAP_CRC_MAGIC) { + /* verify owner */ + if (be64_to_cpu(block->bb_u.l.bb_owner) !=3D ino) { + do_warn( +_("expected owner inode %" PRIu64 ", got %llu, bmbt block %" PRIu64 "\n"), + ino, be64_to_cpu(block->bb_u.l.bb_owner), bno); + return(1); + } + } + if (check_dups =3D=3D 0) { /* * check sibling pointers. if bad we have a conflict @@ -408,9 +415,10 @@ _("bad bmap btree ptr 0x%llx in ino %" PRIu64 "\n"), return(1); } =20 - err =3D scan_lbtree(be64_to_cpu(pp[i]), level, scanfunc_bmap, + err =3D scan_lbtree(be64_to_cpu(pp[i]), level, scan_bmapbt, type, whichfork, ino, tot, nex, blkmapp, - bm_cursor, 0, check_dups); + bm_cursor, 0, check_dups, magic, + &xfs_bmbt_buf_ops); if (err) return(1); =20 @@ -481,35 +489,7 @@ _("bad fwd (right) sibling pointer (saw %" PRIu64 " sh= ould be NULLDFSBNO)\n" } =20 static void -scanfunc_bno( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot, - void *agcnts) -{ - return scanfunc_allocbt(block, level, bno, agno, - suspect, isroot, XFS_ABTB_MAGIC, agcnts); -} - -static void -scanfunc_cnt( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot, - void *agcnts) -{ - return scanfunc_allocbt(block, level, bno, agno, - suspect, isroot, XFS_ABTC_MAGIC, agcnts); -} - -static void -scanfunc_allocbt( +scan_allocbt( struct xfs_btree_block *block, int level, xfs_agblock_t bno, @@ -517,8 +497,9 @@ scanfunc_allocbt( int suspect, int isroot, __uint32_t magic, - struct aghdr_cnts *agcnts) + void *priv) { + struct aghdr_cnts *agcnts =3D priv; const char *name; int i; xfs_alloc_ptr_t *pp; @@ -529,9 +510,19 @@ scanfunc_allocbt( xfs_extlen_t lastcount =3D 0; xfs_agblock_t lastblock =3D 0; =20 - assert(magic =3D=3D XFS_ABTB_MAGIC || magic =3D=3D XFS_ABTC_MAGIC); - - name =3D (magic =3D=3D XFS_ABTB_MAGIC) ? "bno" : "cnt"; + switch (magic) { + case XFS_ABTB_CRC_MAGIC: + case XFS_ABTB_MAGIC: + name =3D "bno"; + break; + case XFS_ABTC_CRC_MAGIC: + case XFS_ABTC_MAGIC: + name =3D "cnt"; + break; + default: + assert(0); + break; + } =20 if (be32_to_cpu(block->bb_magic) !=3D magic) { do_warn(_("bad magic # %#x in bt%s block %d/%d\n"), @@ -615,7 +606,8 @@ _("%s freespace btree block claimed (state %d), agno %d= , bno %d, suspect %d\n"), continue; } =20 - if (magic =3D=3D XFS_ABTB_MAGIC) { + if (magic =3D=3D XFS_ABTB_MAGIC || + magic =3D=3D XFS_ABTB_CRC_MAGIC) { if (b <=3D lastblock) { do_warn(_( "out-of-order bno btree record %d (%u %u) block %u/%u\n"), @@ -648,7 +640,8 @@ _("%s freespace btree block claimed (state %d), agno %d= , bno %d, suspect %d\n"), * no warning messages -- we'll catch * FREE1 blocks later */ - if (magic =3D=3D XFS_ABTC_MAGIC) { + if (magic =3D=3D XFS_ABTC_MAGIC || + magic =3D=3D XFS_ABTC_CRC_MAGIC) { set_bmap_ext(agno, b, blen, XR_E_FREE); break; @@ -709,10 +702,20 @@ _("%s freespace btree block claimed (state %d), agno = %d, bno %d, suspect %d\n"), * as possible. */ if (bno !=3D 0 && verify_agbno(mp, agno, bno)) { - scan_sbtree(bno, level, agno, suspect, - (magic =3D=3D XFS_ABTB_MAGIC) ? - scanfunc_bno : scanfunc_cnt, 0, - (void *)agcnts); + switch (magic) { + case XFS_ABTB_CRC_MAGIC: + case XFS_ABTB_MAGIC: + scan_sbtree(bno, level, agno, suspect, + scan_allocbt, 0, magic, priv, + &xfs_allocbt_buf_ops); + break; + case XFS_ABTC_CRC_MAGIC: + case XFS_ABTC_MAGIC: + scan_sbtree(bno, level, agno, suspect, + scan_allocbt, 0, magic, priv, + &xfs_allocbt_buf_ops); + break; + } } } } @@ -896,13 +899,14 @@ _("inode rec for ino %" PRIu64 " (%d/%d) overlaps exi= sting rec (start %d/%d)\n") * that we aren't sure about go into the uncertain list. */ static void -scanfunc_ino( +scan_inobt( struct xfs_btree_block *block, int level, xfs_agblock_t bno, xfs_agnumber_t agno, int suspect, int isroot, + __uint32_t magic, void *priv) { struct aghdr_cnts *agcnts =3D priv; @@ -915,7 +919,7 @@ scanfunc_ino( =20 hdr_errors =3D 0; =20 - if (be32_to_cpu(block->bb_magic) !=3D XFS_IBT_MAGIC) { + if (be32_to_cpu(block->bb_magic) !=3D magic) { do_warn(_("bad magic # %#x in inobt block %d/%d\n"), be32_to_cpu(block->bb_magic), agno, bno); hdr_errors++; @@ -1032,7 +1036,8 @@ _("inode btree block claimed (state %d), agno %d, bno= %d, suspect %d\n"), if (be32_to_cpu(pp[i]) !=3D 0 && verify_agbno(mp, agno, be32_to_cpu(pp[i]))) scan_sbtree(be32_to_cpu(pp[i]), level, agno, - suspect, scanfunc_ino, 0, priv); + suspect, scan_inobt, 0, magic, priv, + &xfs_inobt_buf_ops); } } =20 @@ -1041,12 +1046,12 @@ scan_freelist( xfs_agf_t *agf, struct aghdr_cnts *agcnts) { - xfs_agfl_t *agfl; xfs_buf_t *agflbuf; xfs_agnumber_t agno; xfs_agblock_t bno; int count; int i; + __be32 *freelist; =20 agno =3D be32_to_cpu(agf->agf_seqno); =20 @@ -1065,7 +1070,7 @@ scan_freelist( do_abort(_("can't read agfl block for ag %d\n"), agno); return; } - agfl =3D XFS_BUF_TO_AGFL(agflbuf); + freelist =3D XFS_BUF_TO_AGFL_BNO(mp, agflbuf); i =3D be32_to_cpu(agf->agf_flfirst); =20 if (no_modify) { @@ -1080,7 +1085,7 @@ scan_freelist( =20 count =3D 0; for (;;) { - bno =3D be32_to_cpu(agfl->agfl_bno[i]); + bno =3D be32_to_cpu(freelist[i]); if (verify_agbno(mp, agno, bno)) set_bmap(agno, bno, XR_E_FREE); else @@ -1109,11 +1114,15 @@ validate_agf( struct aghdr_cnts *agcnts) { xfs_agblock_t bno; + __uint32_t magic; =20 bno =3D be32_to_cpu(agf->agf_roots[XFS_BTNUM_BNO]); if (bno !=3D 0 && verify_agbno(mp, agno, bno)) { + magic =3D xfs_sb_version_hascrc(&mp->m_sb) ? XFS_ABTB_CRC_MAGIC + : XFS_ABTB_MAGIC; scan_sbtree(bno, be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]), - agno, 0, scanfunc_bno, 1, agcnts); + agno, 0, scan_allocbt, 1, magic, agcnts, + &xfs_allocbt_buf_ops); } else { do_warn(_("bad agbno %u for btbno root, agno %d\n"), bno, agno); @@ -1121,8 +1130,11 @@ validate_agf( =20 bno =3D be32_to_cpu(agf->agf_roots[XFS_BTNUM_CNT]); if (bno !=3D 0 && verify_agbno(mp, agno, bno)) { + magic =3D xfs_sb_version_hascrc(&mp->m_sb) ? XFS_ABTC_CRC_MAGIC + : XFS_ABTC_MAGIC; scan_sbtree(bno, be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]), - agno, 0, scanfunc_cnt, 1, agcnts); + agno, 0, scan_allocbt, 1, magic, agcnts, + &xfs_allocbt_buf_ops); } else { do_warn(_("bad agbno %u for btbcnt root, agno %d\n"), bno, agno); @@ -1153,11 +1165,15 @@ validate_agi( { xfs_agblock_t bno; int i; + __uint32_t magic; =20 bno =3D be32_to_cpu(agi->agi_root); if (bno !=3D 0 && verify_agbno(mp, agno, bno)) { + magic =3D xfs_sb_version_hascrc(&mp->m_sb) ? XFS_IBT_CRC_MAGIC + : XFS_IBT_MAGIC; scan_sbtree(bno, be32_to_cpu(agi->agi_level), - agno, 0, scanfunc_ino, 1, agcnts); + agno, 0, scan_inobt, 1, magic, agcnts, + &xfs_inobt_buf_ops); } else { do_warn(_("bad agbno %u for inobt root, agno %d\n"), be32_to_cpu(agi->agi_root), agno); diff --git a/repair/scan.h b/repair/scan.h index 9f945cf..92593e9 100644 --- a/repair/scan.h +++ b/repair/scan.h @@ -35,7 +35,8 @@ int scan_lbtree( bmap_cursor_t *bm_cursor, int isroot, int check_dups, - int *dirty), + int *dirty, + __uint64_t magic), int type, int whichfork, xfs_ino_t ino, @@ -44,9 +45,11 @@ int scan_lbtree( struct blkmap **blkmapp, bmap_cursor_t *bm_cursor, int isroot, - int check_dups); + int check_dups, + __uint64_t magic, + const struct xfs_buf_ops *ops); =20 -int scanfunc_bmap( +int scan_bmapbt( struct xfs_btree_block *block, int level, int type, @@ -59,7 +62,8 @@ int scanfunc_bmap( bmap_cursor_t *bm_cursor, int isroot, int check_dups, - int *dirty); + int *dirty, + __uint64_t magic); =20 void scan_ags( diff --git a/repair/versions.c b/repair/versions.c index 957766a..c11a728 100644 --- a/repair/versions.c +++ b/repair/versions.c @@ -165,7 +165,7 @@ _("This filesystem contains features not understood by = this program.\n")); return(1); } =20 - if (XFS_SB_VERSION_NUM(sb) =3D=3D XFS_SB_VERSION_4) { + if (XFS_SB_VERSION_NUM(sb) >=3D XFS_SB_VERSION_4) { if (!fs_sb_feature_bits_allowed) { if (!no_modify) { do_warn( diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 167b1f6..8eefc48 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -612,7 +612,7 @@ main(int argc, char **argv) glob_agcount =3D mp->m_sb.sb_agcount; =20 chunks_pblock =3D mp->m_sb.sb_inopblock / XFS_INODES_PER_CHUNK; - max_symlink_blocks =3D howmany(MAXPATHLEN - 1, mp->m_sb.sb_blocksize); + max_symlink_blocks =3D libxfs_symlink_blocks(mp, MAXPATHLEN); inodes_per_cluster =3D MAX(mp->m_sb.sb_inopblock, XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog); =20 =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= xfsprogs-crc-patchset-v2/xfsprogs-db-crc-support=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000= 001750=0000000106751=0012132011547=00020712=00 0=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dav= e=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00xfsprogs: add crc format support to db =46rom: Dave Chinner Signed-off-by: Dave Chinner --- db/agf.c | 3 + db/agfl.c | 16 +++++ db/agfl.h | 2 + db/agi.c | 3 + db/btblock.c | 145 ++++++++++++++++++++++++++++++++++++++++++= ++++ db/btblock.h | 10 ++++ db/check.c | 20 ++++++- db/field.c | 16 +++++ db/field.h | 8 +++ db/freesp.c | 11 +++- db/init.c | 4 ++ db/inode.c | 27 +++++++++ db/inode.h | 3 + db/sb.c | 28 ++++++++- db/type.c | 35 ++++++++++- db/type.h | 3 +- include/xfs_dir2.h | 8 +++ include/xfs_inode.h | 4 +- libxfs/init.c | 3 +- logprint/log_misc.c | 2 +- logprint/log_print_all.c | 4 +- repair/dir2.c | 15 ++--- repair/phase6.c | 20 +++---- 23 files changed, 359 insertions(+), 31 deletions(-) diff --git a/db/agf.c b/db/agf.c index 668637a..389cb43 100644 --- a/db/agf.c +++ b/db/agf.c @@ -69,6 +69,9 @@ const field_t agf_flds[] =3D { { "freeblks", FLDT_EXTLEN, OI(OFF(freeblks)), C1, 0, TYP_NONE }, { "longest", FLDT_EXTLEN, OI(OFF(longest)), C1, 0, TYP_NONE }, { "btreeblks", FLDT_UINT32D, OI(OFF(btreeblks)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, + { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, { NULL } }; =20 diff --git a/db/agfl.c b/db/agfl.c index 72dca23..e2340e6 100644 --- a/db/agfl.c +++ b/db/agfl.c @@ -41,8 +41,24 @@ const field_t agfl_hfld[] =3D { { { NULL } }; =20 +const field_t agfl_crc_hfld[] =3D { { + "", FLDT_AGFL_CRC, OI(0), C1, 0, TYP_NONE, }, + { NULL } +}; + #define OFF(f) bitize(offsetof(xfs_agfl_t, agfl_ ## f)) const field_t agfl_flds[] =3D { + { "bno", FLDT_AGBLOCKNZ, OI(OFF(magicnum)), agfl_bno_size, + FLD_ARRAY|FLD_COUNT, TYP_DATA }, + { NULL } +}; + +const field_t agfl_crc_flds[] =3D { + { "magicnum", FLDT_UINT32X, OI(OFF(magicnum)), C1, 0, TYP_NONE }, + { "seqno", FLDT_AGNUMBER, OI(OFF(seqno)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, + { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, { "bno", FLDT_AGBLOCKNZ, OI(OFF(bno)), agfl_bno_size, FLD_ARRAY|FLD_COUNT, TYP_DATA }, { NULL } diff --git a/db/agfl.h b/db/agfl.h index 7b7631b..177ad41 100644 --- a/db/agfl.h +++ b/db/agfl.h @@ -18,6 +18,8 @@ =20 extern const struct field agfl_flds[]; extern const struct field agfl_hfld[]; +extern const struct field agfl_crc_flds[]; +extern const struct field agfl_crc_hfld[]; =20 extern void agfl_init(void); extern int agfl_size(void *obj, int startoff, int idx); diff --git a/db/agi.c b/db/agi.c index 02d5d30..6b2e889 100644 --- a/db/agi.c +++ b/db/agi.c @@ -54,6 +54,9 @@ const field_t agi_flds[] =3D { { "dirino", FLDT_AGINO, OI(OFF(dirino)), C1, 0, TYP_INODE }, { "unlinked", FLDT_AGINONN, OI(OFF(unlinked)), CI(XFS_AGI_UNLINKED_BUCKETS), FLD_ARRAY, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, + { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, { NULL } }; =20 diff --git a/db/btblock.c b/db/btblock.c index 2c199b2..37b9903 100644 --- a/db/btblock.c +++ b/db/btblock.c @@ -60,6 +60,31 @@ struct xfs_db_btree { sizeof(xfs_inobt_rec_t), sizeof(__be32), }, + [/*0x424d415*/8] =3D { /* BMAP_CRC */ + XFS_BTREE_LBLOCK_CRC_LEN, + sizeof(xfs_bmbt_key_t), + sizeof(xfs_bmbt_rec_t), + sizeof(__be64), + }, + [/*0x4142544*/0xa] =3D { /* ABTB_CRC */ + XFS_BTREE_SBLOCK_CRC_LEN, + sizeof(xfs_alloc_key_t), + sizeof(xfs_alloc_rec_t), + sizeof(__be32), + }, + [/*0x414254*/0xb] =3D { /* ABTC_CRC */ + XFS_BTREE_SBLOCK_CRC_LEN, + sizeof(xfs_alloc_key_t), + sizeof(xfs_alloc_rec_t), + sizeof(__be32), + }, + [/*0x4941425*/0xc] =3D { /* IABT_CRC */ + XFS_BTREE_SBLOCK_CRC_LEN, + sizeof(xfs_inobt_key_t), + sizeof(xfs_inobt_rec_t), + sizeof(__be32), + }, + }; =20 /* @@ -208,6 +233,15 @@ const field_t bmapbtd_hfld[] =3D { { NULL } }; =20 +const field_t bmapbta_crc_hfld[] =3D { + { "", FLDT_BMAPBTA_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; +const field_t bmapbtd_crc_hfld[] =3D { + { "", FLDT_BMAPBTD_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; + #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) const field_t bmapbta_flds[] =3D { { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, @@ -237,6 +271,45 @@ const field_t bmapbtd_flds[] =3D { FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BMAPBTD }, { NULL } }; +/* crc enabled versions */ +const field_t bmapbta_crc_flds[] =3D { + { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "leftsib", FLDT_DFSBNO, OI(OFF(u.l.bb_leftsib)), C1, 0, TYP_BMAPBTA }, + { "rightsib", FLDT_DFSBNO, OI(OFF(u.l.bb_rightsib)), C1, 0, TYP_BMAPBTA }, + { "bno", FLDT_DFSBNO, OI(OFF(u.l.bb_blkno)), C1, 0, TYP_BMAPBTD }, + { "lsn", FLDT_UINT64X, OI(OFF(u.l.bb_lsn)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(u.l.bb_uuid)), C1, 0, TYP_NONE }, + { "owner", FLDT_INO, OI(OFF(u.l.bb_owner)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, + { "recs", FLDT_BMAPBTAREC, btblock_rec_offset, btblock_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_BMAPBTAKEY, btblock_key_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_BMAPBTAPTR, btblock_ptr_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BMAPBTA }, + { NULL } +}; +const field_t bmapbtd_crc_flds[] =3D { + { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "leftsib", FLDT_DFSBNO, OI(OFF(u.l.bb_leftsib)), C1, 0, TYP_BMAPBTD }, + { "rightsib", FLDT_DFSBNO, OI(OFF(u.l.bb_rightsib)), C1, 0, TYP_BMAPBTD }, + { "bno", FLDT_DFSBNO, OI(OFF(u.l.bb_blkno)), C1, 0, TYP_BMAPBTD }, + { "lsn", FLDT_UINT64X, OI(OFF(u.l.bb_lsn)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(u.l.bb_uuid)), C1, 0, TYP_NONE }, + { "owner", FLDT_INO, OI(OFF(u.l.bb_owner)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, + { "recs", FLDT_BMAPBTDREC, btblock_rec_offset, btblock_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_BMAPBTDKEY, btblock_key_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_BMAPBTDPTR, btblock_ptr_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BMAPBTD }, + { NULL } +}; #undef OFF =20 #define KOFF(f) bitize(offsetof(xfs_bmbt_key_t, br_ ## f)) @@ -289,6 +362,11 @@ const field_t inobt_hfld[] =3D { { NULL } }; =20 +const field_t inobt_crc_hfld[] =3D { + { "", FLDT_INOBT_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; + #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) const field_t inobt_flds[] =3D { { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, @@ -304,6 +382,25 @@ const field_t inobt_flds[] =3D { FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_INOBT }, { NULL } }; +const field_t inobt_crc_flds[] =3D { + { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_INOBT }, + { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_INOBT }, + { "bno", FLDT_DFSBNO, OI(OFF(u.s.bb_blkno)), C1, 0, TYP_INOBT }, + { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, + { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "recs", FLDT_INOBTREC, btblock_rec_offset, btblock_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_INOBTKEY, btblock_key_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_INOBTPTR, btblock_ptr_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_INOBT }, + { NULL } +}; #undef OFF =20 #define KOFF(f) bitize(offsetof(xfs_inobt_key_t, ir_ ## f)) @@ -331,6 +428,11 @@ const field_t bnobt_hfld[] =3D { { NULL } }; =20 +const field_t bnobt_crc_hfld[] =3D { + { "", FLDT_BNOBT_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; + #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) const field_t bnobt_flds[] =3D { { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, @@ -346,6 +448,25 @@ const field_t bnobt_flds[] =3D { FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BNOBT }, { NULL } }; +const field_t bnobt_crc_flds[] =3D { + { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_BNOBT }, + { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_BNOBT }, + { "bno", FLDT_DFSBNO, OI(OFF(u.s.bb_blkno)), C1, 0, TYP_BNOBT }, + { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, + { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "recs", FLDT_BNOBTREC, btblock_rec_offset, btblock_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_BNOBTKEY, btblock_key_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_BNOBTPTR, btblock_ptr_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BNOBT }, + { NULL } +}; #undef OFF =20 #define KOFF(f) bitize(offsetof(xfs_alloc_key_t, ar_ ## f)) @@ -369,6 +490,11 @@ const field_t cntbt_hfld[] =3D { { NULL } }; =20 +const field_t cntbt_crc_hfld[] =3D { + { "", FLDT_CNTBT_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; + #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) const field_t cntbt_flds[] =3D { { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, @@ -384,6 +510,25 @@ const field_t cntbt_flds[] =3D { FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_CNTBT }, { NULL } }; +const field_t cntbt_crc_flds[] =3D { + { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_CNTBT }, + { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_CNTBT }, + { "bno", FLDT_DFSBNO, OI(OFF(u.s.bb_blkno)), C1, 0, TYP_CNTBT }, + { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, + { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, + { "crc", FLDT_UINT32X, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "recs", FLDT_CNTBTREC, btblock_rec_offset, btblock_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_CNTBTKEY, btblock_key_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_CNTBTPTR, btblock_ptr_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_CNTBT }, + { NULL } +}; #undef OFF =20 #define KOFF(f) bitize(offsetof(xfs_alloc_key_t, ar_ ## f)) diff --git a/db/btblock.h b/db/btblock.h index 0631e66..daee060 100644 --- a/db/btblock.h +++ b/db/btblock.h @@ -18,26 +18,36 @@ =20 extern const struct field bmapbta_flds[]; extern const struct field bmapbta_hfld[]; +extern const struct field bmapbta_crc_flds[]; +extern const struct field bmapbta_crc_hfld[]; extern const struct field bmapbta_key_flds[]; extern const struct field bmapbta_rec_flds[]; =20 extern const struct field bmapbtd_flds[]; extern const struct field bmapbtd_hfld[]; +extern const struct field bmapbtd_crc_flds[]; +extern const struct field bmapbtd_crc_hfld[]; extern const struct field bmapbtd_key_flds[]; extern const struct field bmapbtd_rec_flds[]; =20 extern const struct field inobt_flds[]; extern const struct field inobt_hfld[]; +extern const struct field inobt_crc_flds[]; +extern const struct field inobt_crc_hfld[]; extern const struct field inobt_key_flds[]; extern const struct field inobt_rec_flds[]; =20 extern const struct field bnobt_flds[]; extern const struct field bnobt_hfld[]; +extern const struct field bnobt_crc_flds[]; +extern const struct field bnobt_crc_hfld[]; extern const struct field bnobt_key_flds[]; extern const struct field bnobt_rec_flds[]; =20 extern const struct field cntbt_flds[]; extern const struct field cntbt_hfld[]; +extern const struct field cntbt_crc_flds[]; +extern const struct field cntbt_crc_hfld[]; extern const struct field cntbt_key_flds[]; extern const struct field cntbt_rec_flds[]; =20 diff --git a/db/check.c b/db/check.c index efbd0c9..41c150b 100644 --- a/db/check.c +++ b/db/check.c @@ -800,6 +800,19 @@ blockget_f( dbprintf(_("already have block usage information\n")); return 0; } + + /* + * XXX: check does not support CRC enabled filesystems. Return success + * silently without doing anything here initially so that xfstests can + * run without modification on metadata enabled filesystems. + * + * XXX: ultimately we need to dump an error message here that xfstests + * filters out, or we need to actually do the work to make check support + * crc enabled filesystems. + */ + if (xfs_sb_version_hascrc(&mp->m_sb)) + return 0; + if (!init(argc, argv)) { if (serious_error) exitcode =3D 3; @@ -1774,6 +1787,7 @@ init( serious_error =3D 1; return 0; } + if (!sb_logcheck()) return 0; rt =3D mp->m_sb.sb_rextents !=3D 0; @@ -4096,6 +4110,7 @@ scan_freelist( xfs_agblock_t bno; uint count; int i; + __be32 *freelist; =20 if (XFS_SB_BLOCK(mp) !=3D XFS_AGFL_BLOCK(mp) && XFS_AGF_BLOCK(mp) !=3D XFS_AGFL_BLOCK(mp) && @@ -4125,9 +4140,12 @@ scan_freelist( return; } =20 + /* open coded XFS_BUF_TO_AGFL_BNO */ + freelist =3D xfs_sb_version_hascrc(&((mp)->m_sb)) ? &agfl->agfl_bno[0] + : (__be32 *)agfl; count =3D 0; for (;;) { - bno =3D be32_to_cpu(agfl->agfl_bno[i]); + bno =3D be32_to_cpu(freelist[i]); set_dbmap(seqno, bno, 1, DBM_FREELIST, seqno, XFS_AGFL_BLOCK(mp)); count++; diff --git a/db/field.c b/db/field.c index 6903898..032b74e 100644 --- a/db/field.c +++ b/db/field.c @@ -48,6 +48,8 @@ const ftattr_t ftattrtab[] =3D { agf_flds }, { FLDT_AGFL, "agfl", NULL, (char *)agfl_flds, agfl_size, FTARG_SIZE, NULL, agfl_flds }, + { FLDT_AGFL_CRC, "agfl", NULL, (char *)agfl_crc_flds, agfl_size, + FTARG_SIZE, NULL, agfl_crc_flds }, { FLDT_AGI, "agi", NULL, (char *)agi_flds, agi_size, FTARG_SIZE, NULL, agi_flds }, { FLDT_AGINO, "agino", fp_num, "%u", SI(bitsz(xfs_agino_t)), @@ -86,6 +88,8 @@ const ftattr_t ftattrtab[] =3D { attrshort_size, FTARG_SIZE, NULL, attr_shortform_flds }, { FLDT_BMAPBTA, "bmapbta", NULL, (char *)bmapbta_flds, btblock_size, FTARG_SIZE, NULL, bmapbta_flds }, + { FLDT_BMAPBTA_CRC, "bmapbta", NULL, (char *)bmapbta_crc_flds, + btblock_size, FTARG_SIZE, NULL, bmapbta_crc_flds }, { FLDT_BMAPBTAKEY, "bmapbtakey", fp_sarray, (char *)bmapbta_key_flds, SI(bitsz(xfs_bmbt_key_t)), 0, NULL, bmapbta_key_flds }, { FLDT_BMAPBTAPTR, "bmapbtaptr", fp_num, "%llu", @@ -94,6 +98,8 @@ const ftattr_t ftattrtab[] =3D { SI(bitsz(xfs_bmbt_rec_t)), 0, NULL, bmapbta_rec_flds }, { FLDT_BMAPBTD, "bmapbtd", NULL, (char *)bmapbtd_flds, btblock_size, FTARG_SIZE, NULL, bmapbtd_flds }, + { FLDT_BMAPBTD_CRC, "bmapbtd", NULL, (char *)bmapbtd_crc_flds, + btblock_size, FTARG_SIZE, NULL, bmapbtd_crc_flds }, { FLDT_BMAPBTDKEY, "bmapbtdkey", fp_sarray, (char *)bmapbtd_key_flds, SI(bitsz(xfs_bmbt_key_t)), 0, NULL, bmapbtd_key_flds }, { FLDT_BMAPBTDPTR, "bmapbtdptr", fp_num, "%llu", @@ -114,6 +120,8 @@ const ftattr_t ftattrtab[] =3D { SI(bitsz(xfs_bmdr_ptr_t)), 0, fa_dfsbno, NULL }, { FLDT_BNOBT, "bnobt", NULL, (char *)bnobt_flds, btblock_size, FTARG_SIZE, NULL, bnobt_flds }, + { FLDT_BNOBT_CRC, "bnobt", NULL, (char *)bnobt_crc_flds, btblock_size, + FTARG_SIZE, NULL, bnobt_crc_flds }, { FLDT_BNOBTKEY, "bnobtkey", fp_sarray, (char *)bnobt_key_flds, SI(bitsz(xfs_alloc_key_t)), 0, NULL, bnobt_key_flds }, { FLDT_BNOBTPTR, "bnobtptr", fp_num, "%u", SI(bitsz(xfs_alloc_ptr_t)), @@ -135,6 +143,8 @@ const ftattr_t ftattrtab[] =3D { { FLDT_CHARS, "chars", fp_num, "%c", SI(bitsz(char)), 0, NULL, NULL }, { FLDT_CNTBT, "cntbt", NULL, (char *)cntbt_flds, btblock_size, FTARG_SIZE, NULL, cntbt_flds }, + { FLDT_CNTBT_CRC, "cntbt", NULL, (char *)cntbt_crc_flds, btblock_size, + FTARG_SIZE, NULL, cntbt_crc_flds }, { FLDT_CNTBTKEY, "cntbtkey", fp_sarray, (char *)cntbt_key_flds, SI(bitsz(xfs_alloc_key_t)), 0, NULL, cntbt_key_flds }, { FLDT_CNTBTPTR, "cntbtptr", fp_num, "%u", SI(bitsz(xfs_alloc_ptr_t)), @@ -156,6 +166,8 @@ const ftattr_t ftattrtab[] =3D { SI(bitsz(__int8_t)), 0, NULL, NULL }, { FLDT_DINODE_U, "dinode_u", NULL, (char *)inode_u_flds, inode_u_size, FTARG_SIZE|FTARG_OKEMPTY, NULL, inode_u_flds }, + { FLDT_DINODE_V3, "dinode_v3", NULL, (char *)inode_v3_flds, + SI(bitsz(xfs_dinode_t)), 0, NULL, inode_v3_flds }, { FLDT_DIR, "dir", NULL, (char *)dir_flds, dir_size, FTARG_SIZE, NULL, dir_flds }, { FLDT_DIR2, "dir2", NULL, (char *)dir2_flds, dir2_size, FTARG_SIZE, @@ -246,6 +258,8 @@ const ftattr_t ftattrtab[] =3D { fa_ino, NULL }, { FLDT_INOBT, "inobt", NULL, (char *)inobt_flds, btblock_size, FTARG_SIZE, NULL, inobt_flds }, + { FLDT_INOBT_CRC, "inobt", NULL, (char *)inobt_crc_flds, btblock_size, + FTARG_SIZE, NULL, inobt_crc_flds }, { FLDT_INOBTKEY, "inobtkey", fp_sarray, (char *)inobt_key_flds, SI(bitsz(xfs_inobt_key_t)), 0, NULL, inobt_key_flds }, { FLDT_INOBTPTR, "inobtptr", fp_num, "%u", SI(bitsz(xfs_inobt_ptr_t)), @@ -254,6 +268,8 @@ const ftattr_t ftattrtab[] =3D { SI(bitsz(xfs_inobt_rec_t)), 0, NULL, inobt_rec_flds }, { FLDT_INODE, "inode", NULL, (char *)inode_flds, inode_size, FTARG_SIZE, NULL, inode_flds }, + { FLDT_INODE_CRC, "inode", NULL, (char *)inode_crc_flds, inode_size, + FTARG_SIZE, NULL, inode_crc_flds }, { FLDT_INOFREE, "inofree", fp_num, "%#llx", SI(bitsz(xfs_inofree_t)), 0, NULL, NULL }, { FLDT_INT16D, "int16d", fp_num, "%d", SI(bitsz(__int16_t)), diff --git a/db/field.h b/db/field.h index 6962d69..f503c42 100644 --- a/db/field.h +++ b/db/field.h @@ -22,6 +22,7 @@ typedef enum fldt { FLDT_AGBLOCKNZ, FLDT_AGF, FLDT_AGFL, + FLDT_AGFL_CRC, FLDT_AGI, FLDT_AGINO, FLDT_AGINONN, @@ -39,10 +40,12 @@ typedef enum fldt { FLDT_ATTRBLOCK, FLDT_ATTRSHORT, FLDT_BMAPBTA, + FLDT_BMAPBTA_CRC, FLDT_BMAPBTAKEY, FLDT_BMAPBTAPTR, FLDT_BMAPBTAREC, FLDT_BMAPBTD, + FLDT_BMAPBTD_CRC, FLDT_BMAPBTDKEY, FLDT_BMAPBTDPTR, FLDT_BMAPBTDREC, @@ -53,6 +56,7 @@ typedef enum fldt { FLDT_BMROOTDKEY, FLDT_BMROOTDPTR, FLDT_BNOBT, + FLDT_BNOBT_CRC, FLDT_BNOBTKEY, FLDT_BNOBTPTR, FLDT_BNOBTREC, @@ -64,6 +68,7 @@ typedef enum fldt { FLDT_CHARNS, FLDT_CHARS, FLDT_CNTBT, + FLDT_CNTBT_CRC, FLDT_CNTBTKEY, FLDT_CNTBTPTR, FLDT_CNTBTREC, @@ -75,6 +80,7 @@ typedef enum fldt { FLDT_DINODE_CORE, FLDT_DINODE_FMT, FLDT_DINODE_U, + FLDT_DINODE_V3, FLDT_DIR, FLDT_DIR2, FLDT_DIR2_BLOCK_TAIL, @@ -116,10 +122,12 @@ typedef enum fldt { FLDT_FSIZE, FLDT_INO, FLDT_INOBT, + FLDT_INOBT_CRC, FLDT_INOBTKEY, FLDT_INOBTPTR, FLDT_INOBTREC, FLDT_INODE, + FLDT_INODE_CRC, FLDT_INOFREE, FLDT_INT16D, FLDT_INT32D, diff --git a/db/freesp.c b/db/freesp.c index 472b1f7..9813137 100644 --- a/db/freesp.c +++ b/db/freesp.c @@ -231,6 +231,7 @@ scan_freelist( xfs_agfl_t *agfl; xfs_agblock_t bno; int i; + __be32 *agfl_bno; =20 if (be32_to_cpu(agf->agf_flcount) =3D=3D 0) return; @@ -249,8 +250,10 @@ scan_freelist( return; } =20 + agfl_bno =3D xfs_sb_version_hascrc(&mp->m_sb) ? &agfl->agfl_bno[0] + : iocur_top->data; for (;;) { - bno =3D be32_to_cpu(agfl->agfl_bno[i]); + bno =3D be32_to_cpu(agfl_bno[i]); addtohist(seqno, bno, 1); if (i =3D=3D be32_to_cpu(agf->agf_fllast)) break; @@ -296,7 +299,8 @@ scanfunc_bno( xfs_alloc_ptr_t *pp; xfs_alloc_rec_t *rp; =20 - if (be32_to_cpu(block->bb_magic) !=3D XFS_ABTB_MAGIC) + if (!(be32_to_cpu(block->bb_magic) =3D=3D XFS_ABTB_MAGIC || + be32_to_cpu(block->bb_magic) =3D=3D XFS_ABTB_CRC_MAGIC)) return; =20 if (level =3D=3D 0) { @@ -323,7 +327,8 @@ scanfunc_cnt( xfs_alloc_ptr_t *pp; xfs_alloc_rec_t *rp; =20 - if (be32_to_cpu(block->bb_magic) !=3D XFS_ABTC_MAGIC) + if (!(be32_to_cpu(block->bb_magic) =3D=3D XFS_ABTC_MAGIC || + be32_to_cpu(block->bb_magic) =3D=3D XFS_ABTC_CRC_MAGIC)) return; =20 if (level =3D=3D 0) { diff --git a/db/init.c b/db/init.c index 2a31cb8..141b484 100644 --- a/db/init.c +++ b/db/init.c @@ -26,6 +26,7 @@ #include "sig.h" #include "output.h" #include "malloc.h" +#include "type.h" =20 static char **cmdline; static int ncmdline; @@ -145,6 +146,9 @@ init( } blkbb =3D 1 << mp->m_blkbb_log; =20 + if (xfs_sb_version_hascrc(&mp->m_sb)) + type_set_tab_crc(); + push_cur(); init_commands(); init_sig(); diff --git a/db/inode.c b/db/inode.c index 036717f..6596e4f 100644 --- a/db/inode.c +++ b/db/inode.c @@ -58,6 +58,10 @@ const field_t inode_hfld[] =3D { { "", FLDT_INODE, OI(0), C1, 0, TYP_NONE }, { NULL } }; +const field_t inode_crc_hfld[] =3D { + { "", FLDT_INODE_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; =20 /* XXX: fix this up! */ #define OFF(f) bitize(offsetof(xfs_dinode_t, di_ ## f)) @@ -70,6 +74,17 @@ const field_t inode_flds[] =3D { FLD_COUNT|FLD_OFFSET, TYP_NONE }, { NULL } }; +const field_t inode_crc_flds[] =3D { + { "core", FLDT_DINODE_CORE, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "next_unlinked", FLDT_AGINO, OI(OFF(next_unlinked)), C1, 0, + TYP_INODE }, + { "v3", FLDT_DINODE_V3, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "u", FLDT_DINODE_U, inode_u_offset, C1, FLD_OFFSET, TYP_NONE }, + { "a", FLDT_DINODE_A, inode_a_offset, inode_a_count, + FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { NULL } +}; + =20 #define COFF(f) bitize(offsetof(xfs_dinode_t, di_ ## f)) const field_t inode_core_flds[] =3D { @@ -152,6 +167,18 @@ const field_t inode_core_flds[] =3D { { NULL } }; =20 +const field_t inode_v3_flds[] =3D { + { "crc", FLDT_UINT32X, OI(COFF(crc)), C1, 0, TYP_NONE }, + { "change_count", FLDT_UINT64D, OI(COFF(changecount)), C1, 0, TYP_NONE }, + { "lsn", FLDT_UINT64X, OI(COFF(lsn)), C1, 0, TYP_NONE }, + { "flags2", FLDT_UINT64X, OI(COFF(flags2)), C1, 0, TYP_NONE }, + { "crtime", FLDT_TIMESTAMP, OI(COFF(crtime)), C1, 0, TYP_NONE }, + { "inumber", FLDT_INO, OI(COFF(ino)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(COFF(uuid)), C1, 0, TYP_NONE }, + { NULL } +}; + + #define TOFF(f) bitize(offsetof(xfs_timestamp_t, t_ ## f)) const field_t timestamp_flds[] =3D { { "sec", FLDT_TIME, OI(TOFF(sec)), C1, 0, TYP_NONE }, diff --git a/db/inode.h b/db/inode.h index 6c1ac5c..1624f1d 100644 --- a/db/inode.h +++ b/db/inode.h @@ -18,8 +18,11 @@ =20 extern const struct field inode_a_flds[]; extern const struct field inode_core_flds[]; +extern const struct field inode_v3_flds[]; extern const struct field inode_flds[]; +extern const struct field inode_crc_flds[]; extern const struct field inode_hfld[]; +extern const struct field inode_crc_hfld[]; extern const struct field inode_u_flds[]; extern const struct field timestamp_flds[]; =20 diff --git a/db/sb.c b/db/sb.c index af86722..c52d545 100644 --- a/db/sb.c +++ b/db/sb.c @@ -109,6 +109,14 @@ const field_t sb_flds[] =3D { { "logsunit", FLDT_UINT32D, OI(OFF(logsunit)), C1, 0, TYP_NONE }, { "features2", FLDT_UINT32X, OI(OFF(features2)), C1, 0, TYP_NONE }, { "bad_features2", FLDT_UINT32X, OI(OFF(bad_features2)), C1, 0, TYP_NONE = }, + + { "features_compat", FLDT_UINT32X, OI(OFF(features_compat)), C1, 0, TYP_N= ONE }, + { "features_ro_compat", FLDT_UINT32X, OI(OFF(features_ro_compat)), C1, 0,= TYP_NONE }, + { "features_incompat", FLDT_UINT32X, OI(OFF(features_incompat)), C1, 0, T= YP_NONE }, + + { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "pquotino", FLDT_INO, OI(OFF(pquotino)), C1, 0, TYP_INODE }, + { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, { NULL } }; =20 @@ -240,7 +248,7 @@ sb_logcheck(void) log.l_logsize =3D BBTOB(log.l_logBBsize); log.l_logBBsize =3D x.logBBsize; log.l_logBBstart =3D x.logBBstart; - log.l_sectBBsize =3D x.lbsize; + log.l_sectBBsize =3D 1 << mp->m_sb.sb_logsectlog; log.l_mp =3D mp; =20 if (xlog_find_tail(&log, &head_blk, &tail_blk)) { @@ -595,6 +603,8 @@ version_string( strcpy(s, "V3"); else if (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_4) strcpy(s, "V4"); + else if (XFS_SB_VERSION_NUM(sbp) =3D=3D XFS_SB_VERSION_5) + strcpy(s, "V5"); =20 if (xfs_sb_version_hasattr(sbp)) strcat(s, ",ATTR"); @@ -626,6 +636,8 @@ version_string( strcat(s, ",LAZYSBCOUNT"); if (xfs_sb_version_hasprojid32bit(sbp)) strcat(s, ",PROJID32BIT"); + if (xfs_sb_version_hascrc(sbp)) + strcat(s, ",CRC"); return s; } =20 @@ -666,6 +678,10 @@ version_f( version =3D mp->m_sb.sb_versionnum | XFS_SB_VERSION_EXTFLGBIT; break; + case XFS_SB_VERSION_5: + dbprintf( + _("unwritten extents always enabled for v5 superblocks.\n")); + break; } } else if (!strcasecmp(argv[1], "log2")) { switch (XFS_SB_VERSION_NUM(&mp->m_sb)) { @@ -686,8 +702,18 @@ version_f( version =3D mp->m_sb.sb_versionnum | XFS_SB_VERSION_LOGV2BIT; break; + case XFS_SB_VERSION_5: + dbprintf( + _("Version 2 logs always enabled for v5 superblocks.\n")); + break; } + } else if (XFS_SB_VERSION_NUM(&mp->m_sb) =3D=3D XFS_SB_VERSION_5) { + dbprintf( + _("%s: Cannot change %s on v5 superblocks.\n"), + progname, argv[1]); + return 0; } else if (!strcasecmp(argv[1], "attr1")) { + if (xfs_sb_version_hasattr2(&mp->m_sb)) { if (!(mp->m_sb.sb_features2 &=3D ~XFS_SB_VERSION2_ATTR2BIT)) diff --git a/db/type.c b/db/type.c index e5fd9eb..ad67543 100644 --- a/db/type.c +++ b/db/type.c @@ -50,7 +50,7 @@ static const cmdinfo_t type_cmd =3D { "type", NULL, type_f, 0, 1, 1, N_("[newtype]"), N_("set/show current data type"), NULL }; =20 -const typ_t typtab[] =3D { +static const typ_t __typtab[] =3D { { TYP_AGF, "agf", handle_struct, agf_hfld }, { TYP_AGFL, "agfl", handle_struct, agfl_hfld }, { TYP_AGI, "agi", handle_struct, agi_hfld }, @@ -75,6 +75,39 @@ const typ_t typtab[] =3D { { TYP_NONE, NULL } }; =20 +static const typ_t __typtab_crc[] =3D { + { TYP_AGF, "agf", handle_struct, agf_hfld }, + { TYP_AGFL, "agfl", handle_struct, agfl_crc_hfld }, + { TYP_AGI, "agi", handle_struct, agi_hfld }, + { TYP_ATTR, "attr", handle_struct, attr_hfld }, + { TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld }, + { TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld }, + { TYP_BNOBT, "bnobt", handle_struct, bnobt_crc_hfld }, + { TYP_CNTBT, "cntbt", handle_struct, cntbt_crc_hfld }, + { TYP_DATA, "data", handle_block, NULL }, + { TYP_DIR, "dir", handle_struct, dir_hfld }, + { TYP_DIR2, "dir2", handle_struct, dir2_hfld }, + { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld }, + { TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld }, + { TYP_INODATA, "inodata", NULL, NULL }, + { TYP_INODE, "inode", handle_struct, inode_crc_hfld }, + { TYP_LOG, "log", NULL, NULL }, + { TYP_RTBITMAP, "rtbitmap", NULL, NULL }, + { TYP_RTSUMMARY, "rtsummary", NULL, NULL }, + { TYP_SB, "sb", handle_struct, sb_hfld }, + { TYP_SYMLINK, "symlink", handle_string, NULL }, + { TYP_TEXT, "text", handle_text, NULL }, + { TYP_NONE, NULL } +}; + +const typ_t *typtab =3D __typtab; + +void +type_set_tab_crc(void) +{ + typtab =3D __typtab_crc; +} + static const typ_t * findtyp( char *name) diff --git a/db/type.h b/db/type.h index 8dd7925..ae92581 100644 --- a/db/type.h +++ b/db/type.h @@ -43,9 +43,10 @@ typedef struct typ pfunc_t pfunc; const struct field *fields; } typ_t; -extern const typ_t typtab[], *cur_typ; +extern const typ_t *typtab, *cur_typ; =20 extern void type_init(void); +extern void type_set_tab_crc(void); extern void handle_block(int action, const struct field *fields, int argc, char **argv); extern void handle_string(int action, const struct field *fields, int argc, diff --git a/include/xfs_dir2.h b/include/xfs_dir2.h index 2dd0cc0..2ed4d82 100644 --- a/include/xfs_dir2.h +++ b/include/xfs_dir2.h @@ -100,4 +100,12 @@ extern void xfs_dir2_data_use_free(struct xfs_trans *t= p, struct xfs_buf *bp, extern struct xfs_dir2_data_free *xfs_dir2_data_freefind( struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_data_unused *dup); =20 +extern const struct xfs_buf_ops xfs_da3_node_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_block_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_leafn_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_free_buf_ops; +extern const struct xfs_buf_ops xfs_dir3_data_buf_ops; + + #endif /* __XFS_DIR2_H__ */ diff --git a/include/xfs_inode.h b/include/xfs_inode.h index cc14743..fdca7f7 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -169,9 +169,9 @@ typedef struct xfs_icdinode { /* structure must be padded to 64 bit alignment */ } xfs_icdinode_t; =20 -static inline uint xfs_icdinode_size(struct xfs_icdinode *dicp) +static inline uint xfs_icdinode_size(int version) { - if (dicp->di_version =3D=3D 3) + if (version =3D=3D 3) return sizeof(struct xfs_icdinode); return offsetof(struct xfs_icdinode, di_next_unlinked); } diff --git a/libxfs/init.c b/libxfs/init.c index 55a17d2..372dd6b 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -746,7 +746,8 @@ libxfs_mount( } if (bp) libxfs_putbuf(bp); - } + } else + mp->m_logdev.dev =3D mp->m_dev.dev; =20 /* Initialize realtime fields in the mount structure */ if (rtmount_init(mp, flags)) { diff --git a/logprint/log_misc.c b/logprint/log_misc.c index ffc6916..a9c3710 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -653,7 +653,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, mode =3D dino.di_mode & S_IFMT; size =3D (int)dino.di_size; xlog_print_trans_inode_core(&dino); - *ptr +=3D xfs_icdinode_size(&dino); + *ptr +=3D xfs_icdinode_size(dino.di_version); =20 if (*i =3D=3D num_ops-1 && f->ilf_size =3D=3D 3) { return 1; diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index 70b0905..4626186 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -295,8 +295,8 @@ xlog_recover_print_inode( f->ilf_dsize); =20 /* core inode comes 2nd */ - ASSERT(item->ri_buf[1].i_len =3D=3D xfs_icdinode_size((xfs_icdinode_t *) - item->ri_buf[1].i_addr)); + ASSERT(item->ri_buf[1].i_len =3D=3D xfs_icdinode_size(1) || + item->ri_buf[1].i_len =3D=3D xfs_icdinode_size(3)); xlog_recover_print_inode_core((xfs_icdinode_t *) item->ri_buf[1].i_addr); =20 diff --git a/repair/dir2.c b/repair/dir2.c index 274273d..02c3bf3 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -83,7 +83,8 @@ static struct xfs_buf * da_read_buf( xfs_mount_t *mp, int nex, - bmap_ext_t *bmp) + bmap_ext_t *bmp, + const struct xfs_buf_ops *ops) { #define MAP_ARRAY_SZ 4 struct xfs_buf_map map_array[MAP_ARRAY_SZ]; @@ -105,7 +106,7 @@ da_read_buf( map[i].bm_bn =3D XFS_FSB_TO_DADDR(mp, bmp[i].startblock); map[i].bm_len =3D XFS_FSB_TO_BB(mp, bmp[i].blockcount); } - bp =3D libxfs_readbuf_map(mp->m_dev, map, nex, 0, NULL); + bp =3D libxfs_readbuf_map(mp->m_dev, map, nex, 0, ops); if (map !=3D map_array) free(map); return bp; @@ -152,7 +153,7 @@ traverse_int_dir2block(xfs_mount_t *mp, if (nex =3D=3D 0) goto error_out; =20 - bp =3D da_read_buf(mp, nex, bmp); + bp =3D da_read_buf(mp, nex, bmp, &xfs_da3_node_buf_ops); if (bmp !=3D &lbmp) free(bmp); if (bp =3D=3D NULL) { @@ -516,7 +517,7 @@ _("can't get map info for block %u of directory inode %= " PRIu64 "\n"), return(1); } =20 - bp =3D da_read_buf(mp, nex, bmp); + bp =3D da_read_buf(mp, nex, bmp, &xfs_da3_node_buf_ops); if (bmp !=3D &lbmp) free(bmp); =20 @@ -1561,7 +1562,7 @@ _("block %u for directory inode %" PRIu64 " is missin= g\n"), mp->m_dirdatablk, ino); return 1; } - bp =3D da_read_buf(mp, nex, bmp); + bp =3D da_read_buf(mp, nex, bmp, &xfs_dir3_block_buf_ops); if (bmp !=3D &lbmp) free(bmp); if (bp =3D=3D NULL) { @@ -1692,7 +1693,7 @@ _("can't map block %u for directory inode %" PRIu64 "= \n"), da_bno, ino); goto error_out; } - bp =3D da_read_buf(mp, nex, bmp); + bp =3D da_read_buf(mp, nex, bmp, &xfs_dir3_leafn_buf_ops); if (bmp !=3D &lbmp) free(bmp); bmp =3D NULL; @@ -1878,7 +1879,7 @@ _("block %" PRIu64 " for directory inode %" PRIu64 " = is missing\n"), dbno, ino); continue; } - bp =3D da_read_buf(mp, nex, bmp); + bp =3D da_read_buf(mp, nex, bmp, &xfs_dir3_data_buf_ops); if (bmp !=3D &lbmp) free(bmp); if (bp =3D=3D NULL) { diff --git a/repair/phase6.c b/repair/phase6.c index 8d4d941..48596e8 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -448,8 +448,7 @@ mk_rbmino(xfs_mount_t *mp) } =20 vers =3D xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; - ip->i_d.di_version =3D vers; - memset(&ip->i_d, 0, xfs_icdinode_size(&ip->i_d)); + memset(&ip->i_d, 0, xfs_icdinode_size(vers)); =20 ip->i_d.di_magic =3D XFS_DINODE_MAGIC; ip->i_d.di_mode =3D S_IFREG; @@ -698,8 +697,7 @@ mk_rsumino(xfs_mount_t *mp) } =20 vers =3D xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; - ip->i_d.di_version =3D vers; - memset(&ip->i_d, 0, xfs_icdinode_size(&ip->i_d)); + memset(&ip->i_d, 0, xfs_icdinode_size(vers)); =20 ip->i_d.di_magic =3D XFS_DINODE_MAGIC; ip->i_d.di_mode =3D S_IFREG; @@ -815,8 +813,7 @@ mk_root_dir(xfs_mount_t *mp) * take care of the core -- initialization from xfs_ialloc() */ vers =3D xfs_sb_version_hascrc(&mp->m_sb) ? 3 : 1; - ip->i_d.di_version =3D vers; - memset(&ip->i_d, 0, xfs_icdinode_size(&ip->i_d)); + memset(&ip->i_d, 0, xfs_icdinode_size(vers)); =20 ip->i_d.di_magic =3D XFS_DINODE_MAGIC; ip->i_d.di_mode =3D (__uint16_t) mode|S_IFDIR; @@ -1256,7 +1253,7 @@ _("can't map block %d in %s inode %" PRIu64 ", xfs_bm= api returns %d, nmap =3D %d\n */ =20 bp =3D libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, &xfs_da3_node_buf_ops); =20 if (!bp) { do_warn( @@ -2332,7 +2329,8 @@ longform_dir2_check_leaf( struct xfs_dir2_leaf_entry *ents; =20 da_bno =3D mp->m_dirleafblk; - if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, XFS_DATA_FORK, NULL)) { + if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, XFS_DATA_FORK, + &xfs_dir3_leaf1_buf_ops)) { do_error( _("can't read block %u for directory inode %" PRIu64 "\n"), da_bno, ip->i_ino); @@ -2409,7 +2407,7 @@ longform_dir2_check_node( if (bmap_next_offset(NULL, ip, &next_da_bno, XFS_DATA_FORK)) break; if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, - XFS_DATA_FORK, NULL)) { + XFS_DATA_FORK, &xfs_dir3_leafn_buf_ops)) { do_warn( _("can't read leaf block %u for directory inode %" PRIu64 "\n"), da_bno, ip->i_ino); @@ -2457,7 +2455,7 @@ longform_dir2_check_node( if (bmap_next_offset(NULL, ip, &next_da_bno, XFS_DATA_FORK)) break; if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, - XFS_DATA_FORK, NULL)) { + XFS_DATA_FORK, &xfs_dir3_free_buf_ops)) { do_warn( _("can't read freespace block %u for directory inode %" PRIu64 "\n"), da_bno, ip->i_ino); @@ -2579,7 +2577,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, num_bps * sizeof(struct xfs_buf*)); } if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bplist[db], - XFS_DATA_FORK, NULL)) { + XFS_DATA_FORK, &xfs_dir3_data_buf_ops)) { do_warn( _("can't read data block %u for directory inode %" PRIu64 "\n"), da_bno, ino); =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfspro= gs-crc-patchset-v2/xfsprogs-repair-dir-crc-support=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001750=0000000052626= =0012132011547=00022364=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00xfs_repair: update for dir/attr crc format changes. =46rom: Dave Chinner Signed-off-by: Dave Chinner --- include/xfs_attr_leaf.h | 2 + include/xfs_dir2_format.h | 3 ++ libxfs/xfs_dir2_priv.h | 2 - repair/attr_repair.c | 53 ++++++++++++++----------- repair/dir2.c | 43 +++++++++++--------- repair/dir2.h | 6 +-- repair/phase6.c | 95 ++++++++++++++++++++++++++---------------= ---- 7 files changed, 118 insertions(+), 86 deletions(-) diff --git a/include/xfs_attr_leaf.h b/include/xfs_attr_leaf.h index f9d7846..b3e93bb 100644 --- a/include/xfs_attr_leaf.h +++ b/include/xfs_attr_leaf.h @@ -332,6 +332,8 @@ int xfs_attr3_leaf_read(struct xfs_trans *tp, struct xf= s_inode *dp, struct xfs_buf **bpp); void xfs_attr3_leaf_hdr_from_disk(struct xfs_attr3_icleaf_hdr *to, struct xfs_attr_leafblock *from); +void xfs_attr3_leaf_hdr_to_disk(struct xfs_attr_leafblock *to, + struct xfs_attr3_icleaf_hdr *from); =20 extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; =20 diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h index 8d33f03..7137ba0 100644 --- a/include/xfs_dir2_format.h +++ b/include/xfs_dir2_format.h @@ -518,6 +518,9 @@ struct xfs_dir3_leaf { =20 #define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) =20 +extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from); + static inline int xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp) { diff --git a/libxfs/xfs_dir2_priv.h b/libxfs/xfs_dir2_priv.h index 7cf573c..a5f1e97 100644 --- a/libxfs/xfs_dir2_priv.h +++ b/libxfs/xfs_dir2_priv.h @@ -112,8 +112,6 @@ xfs_dir3_leaf_find_entry(struct xfs_dir3_icleaf_hdr *le= afhdr, int lowstale, int highstale, int *lfloglow, int *lfloghigh); extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); =20 -extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, - struct xfs_dir2_leaf *from); extern void xfs_dir3_leaf_hdr_to_disk(struct xfs_dir2_leaf *to, struct xfs_dir3_icleaf_hdr *from); extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, diff --git a/repair/attr_repair.c b/repair/attr_repair.c index 70a2041..3a48548 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -497,15 +497,17 @@ process_leaf_attr_block( xfs_attr_leaf_entry_t *entry; int i, start, stop, clearit, usedbs, firstb, thissize; da_freemap_t *attr_freemap; + struct xfs_attr3_icleaf_hdr leafhdr; =20 + xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); clearit =3D usedbs =3D 0; *repair =3D 0; firstb =3D mp->m_sb.sb_blocksize; - stop =3D sizeof(xfs_attr_leaf_hdr_t); + stop =3D xfs_attr3_leaf_hdr_size(leaf); =20 /* does the count look sorta valid? */ - if (be16_to_cpu(leaf->hdr.count) * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t) > XFS_LBSIZE(mp)) { + if (leafhdr.count * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf) > XFS_LBSIZE(mp)) { do_warn( _("bad attribute count %d in attr block %u, inode %" PRIu64 "\n"), be16_to_cpu(leaf->hdr.count), da_bno, ino); @@ -516,8 +518,8 @@ process_leaf_attr_block( (void) set_da_freemap(mp, attr_freemap, 0, stop); =20 /* go thru each entry checking for problems */ - for (i =3D 0, entry =3D &leaf->entries[0];=20 - i < be16_to_cpu(leaf->hdr.count); i++, entry++) { + for (i =3D 0, entry =3D xfs_attr3_leaf_entryp(leaf); + i < leafhdr.count; i++, entry++) { =20 /* check if index is within some boundary. */ if (be16_to_cpu(entry->nameidx) > XFS_LBSIZE(mp)) { @@ -538,7 +540,7 @@ process_leaf_attr_block( } =20 /* mark the entry used */ - start =3D (__psint_t)&leaf->entries[i] - (__psint_t)leaf; + start =3D (__psint_t)&entry[i] - (__psint_t)leaf; stop =3D start + sizeof(xfs_attr_leaf_entry_t); if (set_da_freemap(mp, attr_freemap, start, stop)) { do_warn( @@ -584,40 +586,40 @@ process_leaf_attr_block( * since the block will get compacted anyhow by the kernel. */ =20 - if ((leaf->hdr.holes =3D=3D 0 &&=20 - firstb !=3D be16_to_cpu(leaf->hdr.firstused)) || - be16_to_cpu(leaf->hdr.firstused) > firstb) { + if ((leafhdr.holes =3D=3D 0 &&=20 + firstb !=3D leafhdr.firstused) || + leafhdr.firstused > firstb) { if (!no_modify) { do_warn( _("- resetting first used heap value from %d to %d in " "block %u of attribute fork of inode %" PRIu64 "\n"), - be16_to_cpu(leaf->hdr.firstused),=20 + leafhdr.firstused,=20 firstb, da_bno, ino); - leaf->hdr.firstused =3D cpu_to_be16(firstb); + leafhdr.firstused =3D firstb; *repair =3D 1; } else { do_warn( _("- would reset first used value from %d to %d in " "block %u of attribute fork of inode %" PRIu64 "\n"), - be16_to_cpu(leaf->hdr.firstused),=20 + leafhdr.firstused,=20 firstb, da_bno, ino); } } =20 - if (usedbs !=3D be16_to_cpu(leaf->hdr.usedbytes)) { + if (usedbs !=3D leafhdr.usedbytes) { if (!no_modify) { do_warn( _("- resetting usedbytes cnt from %d to %d in " "block %u of attribute fork of inode %" PRIu64 "\n"), - be16_to_cpu(leaf->hdr.usedbytes),=20 + leafhdr.usedbytes,=20 usedbs, da_bno, ino); - leaf->hdr.usedbytes =3D cpu_to_be16(usedbs); + leafhdr.usedbytes =3D usedbs; *repair =3D 1; } else { do_warn( _("- would reset usedbytes cnt from %d to %d in " "block %u of attribute fork of %" PRIu64 "\n"), - be16_to_cpu(leaf->hdr.usedbytes),=20 + leafhdr.usedbytes,=20 usedbs, da_bno, ino); } } @@ -629,6 +631,8 @@ process_leaf_attr_block( * we can add it then. */ } + if (*repair) + xfs_attr3_leaf_hdr_to_disk(leaf, &leafhdr); =20 free(attr_freemap); return (clearit); /* and repair */ @@ -651,6 +655,7 @@ process_leaf_attr_level(xfs_mount_t *mp, xfs_dablk_t prev_bno; xfs_dahash_t current_hashval =3D 0; xfs_dahash_t greatest_hashval; + struct xfs_attr3_icleaf_hdr leafhdr; =20 da_bno =3D da_cursor->level[0].bno; ino =3D da_cursor->ino; @@ -681,13 +686,15 @@ process_leaf_attr_level(xfs_mount_t *mp, goto error_out; } =20 - leaf =3D (xfs_attr_leafblock_t *)XFS_BUF_PTR(bp); + leaf =3D bp->b_addr; + xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); =20 /* check magic number for leaf directory btree block */ - if (be16_to_cpu(leaf->hdr.info.magic) !=3D XFS_ATTR_LEAF_MAGIC) { + if (!(leafhdr.magic =3D=3D XFS_ATTR_LEAF_MAGIC || + leafhdr.magic =3D=3D XFS_ATTR3_LEAF_MAGIC)) { do_warn( _("bad attribute leaf magic %#x for inode %" PRIu64 "\n"), - leaf->hdr.info.magic, ino); + leafhdr.magic, ino); libxfs_putbuf(bp); goto error_out; } @@ -712,10 +719,10 @@ process_leaf_attr_level(xfs_mount_t *mp, da_cursor->level[0].hashval =3D greatest_hashval; da_cursor->level[0].bp =3D bp; da_cursor->level[0].bno =3D da_bno; - da_cursor->level[0].index =3D be16_to_cpu(leaf->hdr.count); + da_cursor->level[0].index =3D leafhdr.count; da_cursor->level[0].dirty =3D repair; =20 - if (be32_to_cpu(leaf->hdr.info.back) !=3D prev_bno) { + if (leafhdr.back !=3D prev_bno) { do_warn( _("bad sibling back pointer for block %u in attribute fork for inode %" P= RIu64 "\n"), da_bno, ino); @@ -724,7 +731,7 @@ process_leaf_attr_level(xfs_mount_t *mp, } =20 prev_bno =3D da_bno; - da_bno =3D be32_to_cpu(leaf->hdr.info.forw); + da_bno =3D leafhdr.forw; =20 if (da_bno !=3D 0 && verify_da_path(mp, da_cursor, 0)) { libxfs_putbuf(bp); @@ -891,6 +898,7 @@ process_longform_attr( */ switch (be16_to_cpu(leaf->hdr.info.magic)) { case XFS_ATTR_LEAF_MAGIC: /* leaf-form attribute */ + case XFS_ATTR3_LEAF_MAGIC: if (process_leaf_attr_block(mp, leaf, 0, ino, blkmap, 0, &next_hashval, repair)) { /* the block is bad. lose the attribute fork. */ @@ -901,6 +909,7 @@ process_longform_attr( break; =20 case XFS_DA_NODE_MAGIC: /* btree-form attribute */ + case XFS_DA3_NODE_MAGIC: /* must do this now, to release block 0 before the traversal */ if (repairlinks) { *repair =3D 1; diff --git a/repair/dir2.c b/repair/dir2.c index ec9c032..1edcd02 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -166,7 +166,8 @@ _("can't read block %u for directory inode %" PRIu64 "\= n"), node =3D bp->b_addr; xfs_da3_node_hdr_from_disk(&nodehdr, node); =20 - if (nodehdr.magic =3D=3D XFS_DIR2_LEAFN_MAGIC) { + if (nodehdr.magic =3D=3D XFS_DIR2_LEAFN_MAGIC || + nodehdr.magic =3D=3D XFS_DIR3_LEAFN_MAGIC) { if ( i !=3D -1 ) { do_warn( _("found non-root LEAFN node in inode %" PRIu64 " bno =3D %u\n"), @@ -175,7 +176,8 @@ _("found non-root LEAFN node in inode %" PRIu64 " bno = =3D %u\n"), *rbno =3D 0; libxfs_putbuf(bp); return(1); - } else if (nodehdr.magic !=3D XFS_DA_NODE_MAGIC) { + } else if (!(nodehdr.magic =3D=3D XFS_DA_NODE_MAGIC || + nodehdr.magic !=3D XFS_DA3_NODE_MAGIC)) { libxfs_putbuf(bp); do_warn( _("bad dir magic number 0x%x in inode %" PRIu64 " bno =3D %u\n"), @@ -536,7 +538,8 @@ _("can't read block %u for directory inode %" PRIu64 "\= n"), * entry count, verify level */ bad =3D 0; - if (XFS_DA_NODE_MAGIC !=3D nodehdr.magic) { + if (!(nodehdr.magic =3D=3D XFS_DA_NODE_MAGIC || + nodehdr.magic =3D=3D XFS_DA3_NODE_MAGIC)) { do_warn( _("bad magic number %x in block %u for directory inode %" PRIu64 "\n"), nodehdr.magic, @@ -1199,8 +1202,8 @@ process_dir2_data( xfs_ino_t ent_ino; =20 d =3D bp->b_addr; - bf =3D d->hdr.bestfree; - ptr =3D (char *)d->u; + bf =3D xfs_dir3_data_bestfree_p(&d->hdr); + ptr =3D (char *)xfs_dir3_data_entry_p(&d->hdr); badbest =3D lastfree =3D freeseen =3D 0; if (be16_to_cpu(bf[0].length) =3D=3D 0) { badbest |=3D be16_to_cpu(bf[0].offset) !=3D 0; @@ -1266,7 +1269,7 @@ process_dir2_data( do_warn(_("\twould junk block\n")); return 1; } - ptr =3D (char *)d->u; + ptr =3D (char *)xfs_dir3_data_entry_p(&d->hdr); /* * Process the entries now. */ @@ -1575,7 +1578,8 @@ _("can't read block %u for directory inode %" PRIu64 = "\n"), * Verify the block */ block =3D bp->b_addr; - if (be32_to_cpu(block->hdr.magic) !=3D XFS_DIR2_BLOCK_MAGIC) + if (!(be32_to_cpu(block->hdr.magic) =3D=3D XFS_DIR2_BLOCK_MAGIC || + be32_to_cpu(block->hdr.magic) =3D=3D XFS_DIR3_BLOCK_MAGIC)) do_warn( _("bad directory block magic # %#x in block %u for directory inode %" PRIu= 64 "\n"), be32_to_cpu(block->hdr.magic), mp->m_dirdatablk, ino); @@ -1618,10 +1622,12 @@ process_leaf_block_dir2( int i; int stale; struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; =20 + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); ents =3D xfs_dir3_leaf_ents_p(leaf); =20 - for (i =3D stale =3D 0; i < be16_to_cpu(leaf->hdr.count); i++) { + for (i =3D stale =3D 0; i < leafhdr.count; i++) { if ((char *)&ents[i] >=3D (char *)leaf + mp->m_dirblksize) { do_warn( _("bad entry count in block %u of directory inode %" PRIu64 "\n"), @@ -1638,7 +1644,7 @@ _("bad hash ordering in block %u of directory inode %= " PRIu64 "\n"), } *next_hashval =3D last_hashval =3D be32_to_cpu(ents[i].hashval); } - if (stale !=3D be16_to_cpu(leaf->hdr.stale)) { + if (stale !=3D leafhdr.stale) { do_warn( _("bad stale count in block %u of directory inode %" PRIu64 "\n"), da_bno, ino); @@ -1667,6 +1673,7 @@ process_leaf_level_dir2( int nex; xfs_dablk_t prev_bno; bmap_ext_t lbmp; + struct xfs_dir3_icleaf_hdr leafhdr; =20 da_bno =3D da_cursor->level[0].bno; ino =3D da_cursor->ino; @@ -1703,15 +1710,15 @@ _("can't read file block %u for directory inode %" = PRIu64 "\n"), goto error_out; } leaf =3D bp->b_addr; + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); /* * Check magic number for leaf directory btree block. */ - if (be16_to_cpu(leaf->hdr.info.magic) !=3D - XFS_DIR2_LEAFN_MAGIC) { + if (!(leafhdr.magic =3D=3D XFS_DIR2_LEAFN_MAGIC) || + leafhdr.magic =3D=3D XFS_DIR3_LEAFN_MAGIC) { do_warn( _("bad directory leaf magic # %#x for directory inode %" PRIu64 " block %u= \n"), - be16_to_cpu(leaf->hdr.info.magic), - ino, da_bno); + leafhdr.magic, ino, da_bno); libxfs_putbuf(bp); goto error_out; } @@ -1733,11 +1740,10 @@ _("bad directory leaf magic # %#x for directory ino= de %" PRIu64 " block %u\n"), da_cursor->level[0].hashval =3D greatest_hashval; da_cursor->level[0].bp =3D bp; da_cursor->level[0].bno =3D da_bno; - da_cursor->level[0].index =3D - be16_to_cpu(leaf->hdr.count); + da_cursor->level[0].index =3D leafhdr.count; da_cursor->level[0].dirty =3D buf_dirty; =20 - if (be32_to_cpu(leaf->hdr.info.back) !=3D prev_bno) { + if (leafhdr.back !=3D prev_bno) { do_warn( _("bad sibling back pointer for block %u in directory inode %" PRIu64 "\n"= ), da_bno, ino); @@ -1745,7 +1751,7 @@ _("bad sibling back pointer for block %u in directory= inode %" PRIu64 "\n"), goto error_out; } prev_bno =3D da_bno; - da_bno =3D be32_to_cpu(leaf->hdr.info.forw); + da_bno =3D leafhdr.forw; if (da_bno !=3D 0) { if (verify_dir2_path(mp, da_cursor, 0)) { libxfs_putbuf(bp); @@ -1888,7 +1894,8 @@ _("can't read block %" PRIu64 " for directory inode %= " PRIu64 "\n"), continue; } data =3D bp->b_addr; - if (be32_to_cpu(data->hdr.magic) !=3D XFS_DIR2_DATA_MAGIC) + if (!(be32_to_cpu(data->hdr.magic) =3D=3D XFS_DIR2_DATA_MAGIC || + be32_to_cpu(data->hdr.magic) =3D=3D XFS_DIR3_DATA_MAGIC)) do_warn( _("bad directory block magic # %#x in block %" PRIu64 " for directory inod= e %" PRIu64 "\n"), be32_to_cpu(data->hdr.magic), dbno, ino); diff --git a/repair/dir2.h b/repair/dir2.h index 63e35d4..6a85015 100644 --- a/repair/dir2.h +++ b/repair/dir2.h @@ -33,13 +33,13 @@ typedef union { =20 typedef struct xfs_dir2_data { xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_DATA_MAGIC */ - xfs_dir2_data_union_t u[1]; + xfs_dir2_data_union_t __u[1]; } xfs_dir2_data_t; =20 typedef struct xfs_dir2_block { xfs_dir2_data_hdr_t hdr; /* magic XFS_DIR2_BLOCK_MAGIC */ - xfs_dir2_data_union_t u[1]; - xfs_dir2_leaf_entry_t leaf[1]; + xfs_dir2_data_union_t __u[1]; + xfs_dir2_leaf_entry_t __leaf[1]; xfs_dir2_block_tail_t tail; } xfs_dir2_block_t; =20 diff --git a/repair/phase6.c b/repair/phase6.c index 64f7a49..8900deb 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -1337,6 +1337,8 @@ entry_junked( /* * process a leaf block, also checks for .. entry * and corrects it to match what we think .. should be + * + * This is a v1 directory function. */ static void lf_block_dir_entry_check(xfs_mount_t *mp, @@ -1581,6 +1583,8 @@ lf_block_dir_entry_check(xfs_mount_t *mp, * succeeds or dies, inode never gets dirtied since all changes * happen in file blocks. the inode size and other core info * is already correct, it's just the leaf entries that get altered. + * + * This is a function that verifies a v1 directory structure. */ static void longform_dir_entry_check(xfs_mount_t *mp, @@ -1921,7 +1925,7 @@ longform_dir2_entry_check_data( =20 bp =3D *bpp; d =3D bp->b_addr; - ptr =3D (char *)d->u; + ptr =3D (char *)xfs_dir3_data_entry_p(&d->hdr); nbad =3D 0; needscan =3D needlog =3D 0; junkit =3D 0; @@ -1932,10 +1936,16 @@ longform_dir2_entry_check_data( endptr =3D (char *)blp; if (endptr > (char *)btp) endptr =3D (char *)btp; - wantmagic =3D XFS_DIR2_BLOCK_MAGIC; + if (xfs_sb_version_hascrc(&mp->m_sb)) + wantmagic =3D XFS_DIR3_BLOCK_MAGIC; + else + wantmagic =3D XFS_DIR2_BLOCK_MAGIC; } else { endptr =3D (char *)d + mp->m_dirblksize; - wantmagic =3D XFS_DIR2_DATA_MAGIC; + if (xfs_sb_version_hascrc(&mp->m_sb)) + wantmagic =3D XFS_DIR3_DATA_MAGIC; + else + wantmagic =3D XFS_DIR2_DATA_MAGIC; } db =3D xfs_dir2_da_to_db(mp, da_bno); =20 @@ -1976,8 +1986,8 @@ longform_dir2_entry_check_data( break; =20 /* check for block with no data entries */ - if ((ptr =3D=3D (char *)d->u) && (ptr + - be16_to_cpu(dup->length) >=3D endptr)) { + if ((ptr =3D=3D (char *)xfs_dir3_data_entry_p(&d->hdr)) && + (ptr + be16_to_cpu(dup->length) >=3D endptr)) { junkit =3D 1; *num_illegal +=3D 1; break; @@ -2048,7 +2058,7 @@ longform_dir2_entry_check_data( do_warn(_("would fix magic # to %#x\n"), wantmagic); } lastfree =3D 0; - ptr =3D (char *)d->u; + ptr =3D (char *)xfs_dir3_data_entry_p(&d->hdr); /* * look at each entry. reference inode pointed to by each * entry in the incore inode tree. @@ -2218,7 +2228,8 @@ longform_dir2_entry_check_data( if (ip->i_ino =3D=3D inum) { ASSERT(dep->name[0] =3D=3D '.' && dep->namelen =3D=3D 1); add_inode_ref(current_irec, current_ino_offset); - if (da_bno !=3D 0 || dep !=3D (xfs_dir2_data_entry_t *)d->u) { + if (da_bno !=3D 0 || + dep !=3D xfs_dir3_data_entry_p(&d->hdr)) { /* "." should be the first entry */ nbad++; if (entry_junked( @@ -2327,6 +2338,7 @@ longform_dir2_check_leaf( xfs_dir2_leaf_tail_t *ltp; int seeval; struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; =20 da_bno =3D mp->m_dirleafblk; if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, XFS_DATA_FORK, @@ -2337,27 +2349,24 @@ longform_dir2_check_leaf( /* NOTREACHED */ } leaf =3D bp->b_addr; + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); ents =3D xfs_dir3_leaf_ents_p(leaf); ltp =3D xfs_dir2_leaf_tail_p(mp, leaf); bestsp =3D xfs_dir2_leaf_bests_p(ltp); - if (be16_to_cpu(leaf->hdr.info.magic) !=3D XFS_DIR2_LEAF1_MAGIC || - be32_to_cpu(leaf->hdr.info.forw) || - be32_to_cpu(leaf->hdr.info.back) || - be16_to_cpu(leaf->hdr.count) < - be16_to_cpu(leaf->hdr.stale) || - be16_to_cpu(leaf->hdr.count) > + if (!(leafhdr.magic =3D=3D XFS_DIR2_LEAF1_MAGIC || + leafhdr.magic =3D=3D XFS_DIR3_LEAF1_MAGIC) || + leafhdr.forw || leafhdr.back || + leafhdr.count < leaf->hdr.stale || + leafhdr.count > xfs_dir3_max_leaf_ents(mp, leaf) || - (char *)&ents[be16_to_cpu( - leaf->hdr.count)] > (char *)bestsp) { + (char *)&ents[leafhdr.count] > (char *)bestsp) { do_warn( _("leaf block %u for directory inode %" PRIu64 " bad header\n"), da_bno, ip->i_ino); libxfs_putbuf(bp); return 1; } - seeval =3D dir_hash_see_all(hashtab, ents, - be16_to_cpu(leaf->hdr.count), - be16_to_cpu(leaf->hdr.stale)); + seeval =3D dir_hash_see_all(hashtab, ents, leafhdr.count, leafhdr.stale); if (dir_hash_check(hashtab, ip, seeval)) { libxfs_putbuf(bp); return 1; @@ -2399,6 +2408,9 @@ longform_dir2_check_node( int seeval =3D 0; int used; struct xfs_dir2_leaf_entry *ents; + struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_dir3_icfree_hdr freehdr; + __be16 *bests; =20 for (da_bno =3D mp->m_dirleafblk, next_da_bno =3D 0; next_da_bno !=3D NULLFILEOFF && da_bno < mp->m_dirfreeblk; @@ -2414,23 +2426,23 @@ longform_dir2_check_node( return 1; } leaf =3D bp->b_addr; + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); ents =3D xfs_dir3_leaf_ents_p(leaf); - if (be16_to_cpu(leaf->hdr.info.magic) !=3D XFS_DIR2_LEAFN_MAGIC) { - if (be16_to_cpu(leaf->hdr.info.magic) =3D=3D - XFS_DA_NODE_MAGIC) { + if (!(leafhdr.magic =3D=3D XFS_DIR2_LEAFN_MAGIC || + leafhdr.magic =3D=3D XFS_DIR3_LEAFN_MAGIC)) { + if (leafhdr.magic =3D=3D XFS_DA_NODE_MAGIC || + leafhdr.magic =3D=3D XFS_DA3_NODE_MAGIC) { libxfs_putbuf(bp); continue; } do_warn( _("unknown magic number %#x for block %u in directory inode %" PRIu64 "\n= "), - be16_to_cpu(leaf->hdr.info.magic), - da_bno, ip->i_ino); + leafhdr.magic, da_bno, ip->i_ino); libxfs_putbuf(bp); return 1; } - if (be16_to_cpu(leaf->hdr.count) > xfs_dir3_max_leaf_ents(mp, leaf) || - be16_to_cpu(leaf->hdr.count) < - be16_to_cpu(leaf->hdr.stale)) { + if (leafhdr.count > xfs_dir3_max_leaf_ents(mp, leaf) || + leafhdr.count < leafhdr.stale) { do_warn( _("leaf block %u for directory inode %" PRIu64 " bad header\n"), da_bno, ip->i_ino); @@ -2438,8 +2450,7 @@ longform_dir2_check_node( return 1; } seeval =3D dir_hash_see_all(hashtab, ents, - be16_to_cpu(leaf->hdr.count), - be16_to_cpu(leaf->hdr.stale)); + leafhdr.count, leafhdr.stale); libxfs_putbuf(bp); if (seeval !=3D DIR_HASH_CK_OK) return 1; @@ -2461,35 +2472,35 @@ longform_dir2_check_node( return 1; } free =3D bp->b_addr; + xfs_dir3_free_hdr_from_disk(&freehdr, free); + bests =3D xfs_dir3_free_bests_p(mp, free); fdb =3D xfs_dir2_da_to_db(mp, da_bno); - if (be32_to_cpu(free->hdr.magic) !=3D XFS_DIR2_FREE_MAGIC || - be32_to_cpu(free->hdr.firstdb) !=3D + if (!(freehdr.magic =3D=3D XFS_DIR2_FREE_MAGIC || + freehdr.magic =3D=3D XFS_DIR3_FREE_MAGIC) || + freehdr.firstdb !=3D (fdb - XFS_DIR2_FREE_FIRSTDB(mp)) * xfs_dir3_free_max_bests(mp) || - be32_to_cpu(free->hdr.nvalid) < - be32_to_cpu(free->hdr.nused)) { + freehdr.nvalid < freehdr.nused) { do_warn( _("free block %u for directory inode %" PRIu64 " bad header\n"), da_bno, ip->i_ino); libxfs_putbuf(bp); return 1; } - for (i =3D used =3D 0; i < be32_to_cpu(free->hdr.nvalid); i++) { - if (i + be32_to_cpu(free->hdr.firstdb) >=3D - freetab->nents || - freetab->ents[i + be32_to_cpu( - free->hdr.firstdb)].v !=3D - be16_to_cpu(free->bests[i])) { + for (i =3D used =3D 0; i < freehdr.nvalid; i++) { + if (i + freehdr.firstdb >=3D freetab->nents || + freetab->ents[i + freehdr.firstdb].v !=3D + be16_to_cpu(bests[i])) { do_warn( _("free block %u entry %i for directory ino %" PRIu64 " bad\n"), da_bno, i, ip->i_ino); libxfs_putbuf(bp); return 1; } - used +=3D be16_to_cpu(free->bests[i]) !=3D NULLDATAOFF; - freetab->ents[i + be32_to_cpu(free->hdr.firstdb)].s =3D 1; + used +=3D be16_to_cpu(bests[i]) !=3D NULLDATAOFF; + freetab->ents[i + freehdr.firstdb].s =3D 1; } - if (used !=3D be32_to_cpu(free->hdr.nused)) { + if (used !=3D freehdr.nused) { do_warn( _("free block %u for directory inode %" PRIu64 " bad nused\n"), da_bno, ip->i_ino); @@ -2632,6 +2643,8 @@ longform_dir2_entry_check(xfs_mount_t *mp, /* * shortform directory processing routines -- entry verification and * bad entry deletion (pruning). + * + * This is a v1 directory structure function. */ static void shortform_dir_entry_check(xfs_mount_t *mp, =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00xfsprogs-crc-patchset-v2/debug=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001750=0000000000005= =0012132011547=00015244=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00--- =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00xfsprogs-crc-patchset-v2/bpm-progs-deb=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=000000600=000001750=000001750=0000000007771=001213201154= 7=00016635=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00xfsprogs: update 'make deb' to use tarball =46rom: Ben Myers This patch changes the build process so that 'make deb' uses the same process of creating a source tree as the release script. * Add a list of files which go in the release tarball in .gitcensus This is needed so that you can create a tarball in a bare release tree, when .git is not available. * Modify the SRCTAR target to include files from .git_census and use tar instead of git archive. * Modify the SRCTARINC files to include .git_census, and include=20 .git_census in the 'make realclean' target. * remove the 'make source-link' target. Signed-off-by: Ben Myers --- v2: don't muck with signing the deb in this patch, rename .git_census to =2Egitcensus, add .gitcensus to .gitignore. .gitignore | 1 + Makefile | 24 ++++++++++++------------ include/buildrules | 11 ----------- 3 files changed, 13 insertions(+), 23 deletions(-) Index: b/.gitignore =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- a/.gitignore 2013-02-14 10:40:25.861946781 -0600 +++ b/.gitignore 2013-02-14 10:40:39.352005790 -0600 @@ -5,6 +5,7 @@ =20 # build system .census +.gitcensus /include/platform_defs.h /include/builddefs /install-sh Index: b/Makefile =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- a/Makefile 2013-02-14 09:43:02.411946730 -0600 +++ b/Makefile 2013-02-14 10:41:15.151360977 -0600 @@ -30,8 +30,7 @@ SRCTAR =3D $(PKG_NAME)-$(PKG_VERSION).tar. CONFIGURE =3D aclocal.m4 configure config.guess config.sub install-sh ltma= in.sh LSRCFILES =3D configure.ac release.sh README VERSION $(CONFIGURE) SRCTARINC =3D m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m= 4 \ - m4/ltversion.m4 po/xfsprogs.pot $(CONFIGURE) - + m4/ltversion.m4 po/xfsprogs.pot .gitcensus $(CONFIGURE) LDIRT =3D config.log .ltdep .dep config.status config.cache confdefs.h \ conftest* built .census install.* install-dev.* *.gz \ autom4te.cache/* libtool include/builddefs include/platform_defs.h @@ -120,7 +119,7 @@ distclean: clean $(Q)rm -f $(LDIRT) =20 realclean: distclean - $(Q)rm -f $(CONFIGURE) + $(Q)rm -f $(CONFIGURE) .gitcensus =20 # # All this gunk is to allow for a make dist on an unconfigured tree @@ -137,18 +136,19 @@ ifeq ($(HAVE_BUILDDEFS), no) $(Q)$(MAKE) $(MAKEOPTS) -C . $@ else $(Q)$(MAKE) $(MAKEOPTS) $(SRCDIR) - $(Q)$(MAKE) $(MAKEOPTS) -C po - $(Q)$(MAKE) $(MAKEOPTS) source-link $(Q)cd $(SRCDIR) && dpkg-buildpackage endif =20 -$(SRCDIR) : $(_FORCE) +$(SRCDIR) : $(_FORCE) $(SRCTAR) rm -fr $@ - mkdir -p $@ + $(Q)$(TAR) -zxvf $(SRCTAR) =20 -$(SRCTAR) : default - $(Q)git archive --prefix=3D$(SRCDIR)/ --format=3Dtar v$(PKG_VERSION) > $(= SRCDIR).tar=20 - $(Q)$(TAR) --transform "s,^,$(SRCDIR)/," -rf $(SRCDIR).tar \ - $(SRCTARINC)=20 - $(Q)$(ZIP) $(SRCDIR).tar +$(SRCTAR) : default $(SRCTARINC) .gitcensus + $(Q)$(TAR) --transform "s,^,$(SRCDIR)/," -zcf $(SRCDIR).tar.gz \ + `cat .gitcensus` $(SRCTARINC) echo Wrote: $@ + +.gitcensus: $(_FORCE) + $(Q)if test -d .git; then \ + git ls-files > .gitcensus && echo "new .gitcensus"; \ + fi Index: b/include/buildrules =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- a/include/buildrules 2013-02-14 09:43:02.421945975 -0600 +++ b/include/buildrules 2013-02-14 09:44:13.291947757 -0600 @@ -23,17 +23,6 @@ $(SUBDIRS): $(Q)$(MAKE) $(MAKEOPTS) -q -C $@ || $(MAKE) $(MAKEOPTS) -C $@ endif =20 -source-link:=20 - @test -z "$$DIR" && DIR=3D"."; \ - for f in `echo $(SRCFILES) $(SUBDIRS) $(POTHEAD)`; do \ - if test -d $$f ; then \ - mkdir $(TOPDIR)/$(PKG_NAME)-$(PKG_VERSION)/$$DIR/$$f || exit $$?; \ - $(MAKEF) DIR=3D$$DIR/$$f -C $$f $@ || exit $$?; \ - else \ - ln $$f $(TOPDIR)/$(PKG_NAME)-$(PKG_VERSION)/$$DIR/$$f || exit $$?; \ - fi; \ - done - # # Standard targets # _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs --=20 This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. =00=00=00=00=00=00=00xfsprogs-crc-patchset-v2/xfsprogs-freespace=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=000000600=000001750=000001750=0000000024531=0012132011547=0001777= 6=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00ustar =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00dave=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfspro= gs: Space management tool =46rom: Dave Chinner xfs_spaceman is intended as a diagnostic and control tool for space management operations within XFS. Operations like examining free space, managing allocation policies, issuing block discards on free space, etc. The tool is modelled on the xfs_io interface, allowing both interactive and command line control of the tool, enabling it to be used in scripts and automated management tools. Signed-off-by: Dave Chinner --- Makefile | 3 +- spaceman/Makefile | 34 ++++++++++++ spaceman/file.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++++= ++++ spaceman/init.c | 119 ++++++++++++++++++++++++++++++++++++++++++ spaceman/init.h | 24 +++++++++ spaceman/space.h | 36 +++++++++++++ 6 files changed, 364 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c40fb2c..a81b8b2 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ endif =20 LIB_SUBDIRS =3D libxfs libxlog libxcmd libhandle libdisk TOOL_SUBDIRS =3D copy db estimate fsck fsr growfs io logprint mkfs quota \ - mdrestore repair rtcp m4 man doc po debian + mdrestore repair rtcp m4 man doc po debian spaceman =20 SUBDIRS =3D include $(LIB_SUBDIRS) $(TOOL_SUBDIRS) =20 @@ -62,6 +62,7 @@ io: libxcmd libhandle mkfs: libxfs quota: libxcmd repair: libxfs libxlog +space: libxcmd =20 ifneq ($(ENABLE_BLKID), yes) mkfs: libdisk diff --git a/spaceman/Makefile b/spaceman/Makefile new file mode 100644 index 0000000..ff8d23e --- /dev/null +++ b/spaceman/Makefile @@ -0,0 +1,34 @@ +# +# Copyright (c) 2012 Red Hat, Inc. All Rights Reserved. +# + +TOPDIR =3D .. +include $(TOPDIR)/include/builddefs + +LTCOMMAND =3D xfs_spaceman +HFILES =3D init.h space.h +CFILES =3D init.c \ + file.c + +LLDLIBS =3D $(LIBXCMD) +LTDEPENDENCIES =3D $(LIBXCMD) +LLDFLAGS =3D -static + +ifeq ($(ENABLE_READLINE),yes) +LLDLIBS +=3D $(LIBREADLINE) $(LIBTERMCAP) +endif + +ifeq ($(ENABLE_EDITLINE),yes) +LLDLIBS +=3D $(LIBEDITLINE) $(LIBTERMCAP) +endif + +default: depend $(LTCOMMAND) + +include $(BUILDRULES) + +install: default + $(INSTALL) -m 755 -d $(PKG_SBIN_DIR) + $(LTINSTALL) -m 755 $(LTCOMMAND) $(PKG_SBIN_DIR) +install-dev: + +-include .dep diff --git a/spaceman/file.c b/spaceman/file.c new file mode 100644 index 0000000..ea4ab0c --- /dev/null +++ b/spaceman/file.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2004-2005 Silicon Graphics, Inc. + * Copyright (c) 2012 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 +#include +#include +#include +#include "init.h" +#include "space.h" + +static cmdinfo_t print_cmd; + +fileio_t *filetable; +int filecount; +fileio_t *file; + +static void +print_fileio( + fileio_t *file, + int index, + int braces) +{ + printf(_("%c%03d%c %-14s (%s,%s,%s%s%s)\n"), + braces? '[' : ' ', index, braces? ']' : ' ', file->name, + file->flags & O_SYNC ? _("sync") : _("non-sync"), + file->flags & O_DIRECT ? _("direct") : _("non-direct"), + file->flags & O_RDONLY ? _("read-only") : _("read-write"), + file->flags & O_APPEND ? _(",append-only") : "", + file->flags & O_NONBLOCK ? _(",non-block") : ""); +} + +int +filelist_f(void) +{ + int i; + + for (i =3D 0; i < filecount; i++) + print_fileio(&filetable[i], i, &filetable[i] =3D=3D file); + return 0; +} + +static int +print_f( + int argc, + char **argv) +{ + filelist_f(); + return 0; +} + +int +openfile( + char *path, + xfs_fsop_geom_t *geom, + int flags, + mode_t mode) +{ + int fd; + + fd =3D open(path, flags, mode); + if (fd < 0) { + if ((errno =3D=3D EISDIR) && (flags & O_RDWR)) { + /* make it as if we asked for O_RDONLY & try again */ + flags &=3D ~O_RDWR; + flags |=3D O_RDONLY; + fd =3D open(path, flags, mode); + if (fd < 0) { + perror(path); + return -1; + } + } else { + perror(path); + return -1; + } + } + + if (xfsctl(path, fd, XFS_IOC_FSGEOMETRY, geom) < 0) { + perror("XFS_IOC_FSGEOMETRY"); + close(fd); + return -1; + } + return fd; +} + +int +addfile( + char *name, + int fd, + xfs_fsop_geom_t *geometry, + int flags) +{ + char *filename; + + filename =3D strdup(name); + if (!filename) { + perror("strdup"); + close(fd); + return -1; + } + + /* Extend the table of currently open files */ + filetable =3D (fileio_t *)realloc(filetable, /* growing */ + ++filecount * sizeof(fileio_t)); + if (!filetable) { + perror("realloc"); + filecount =3D 0; + free(filename); + close(fd); + return -1; + } + + /* Finally, make this the new active open file */ + file =3D &filetable[filecount - 1]; + file->fd =3D fd; + file->flags =3D flags; + file->name =3D filename; + file->geom =3D *geometry; + return 0; +} + +void +file_init(void) +{ + print_cmd.name =3D "print"; + print_cmd.altname =3D "p"; + print_cmd.cfunc =3D print_f; + print_cmd.argmin =3D 0; + print_cmd.argmax =3D 0; + print_cmd.flags =3D CMD_FLAG_GLOBAL; + print_cmd.oneline =3D _("list current open files"); + + add_command(&print_cmd); +} diff --git a/spaceman/init.c b/spaceman/init.c new file mode 100644 index 0000000..98c79e5 --- /dev/null +++ b/spaceman/init.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2012 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 +#include +#include +#include "init.h" +#include "space.h" + +char *progname; +int exitcode; + +void +usage(void) +{ + fprintf(stderr, + _("Usage: %s [-c cmd] file\n"), + progname); + exit(1); +} + +static void +init_commands(void) +{ + file_init(); + help_init(); + quit_init(); +} + +static int +init_args_command( + int index) +{ + if (index >=3D filecount) + return 0; + file =3D &filetable[index++]; + return index; +} + +static int +init_check_command( + const cmdinfo_t *ct) +{ + if (!(ct->flags & CMD_FLAG_GLOBAL)) + return 0; + return 1; +} + +void +init( + int argc, + char **argv) +{ + int c, flags =3D 0; + mode_t mode =3D 0600; + xfs_fsop_geom_t geometry =3D { 0 }; + + progname =3D basename(argv[0]); + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + + while ((c =3D getopt(argc, argv, "c:V")) !=3D EOF) { + switch (c) { + case 'c': + add_user_command(optarg); + break; + case 'V': + printf(_("%s version %s\n"), progname, VERSION); + exit(0); + default: + usage(); + } + } + + if (optind =3D=3D argc) + usage(); + + while (optind < argc) { + if ((c =3D openfile(argv[optind], &geometry, flags, mode)) < 0) + exit(1); + if (!platform_test_xfs_fd(c)) { + printf(_("Not an XFS filesystem!\n")); + exit(1); + } + if (addfile(argv[optind], c, &geometry, flags) < 0) + exit(1); + optind++; + } + + init_commands(); + add_args_command(init_args_command); + add_check_command(init_check_command); +} + +int +main( + int argc, + char **argv) +{ + init(argc, argv); + command_loop(); + return exitcode; +} diff --git a/spaceman/init.h b/spaceman/init.h new file mode 100644 index 0000000..ecd0b5d --- /dev/null +++ b/spaceman/init.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2012 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 + */ + +extern char *progname; +extern int exitcode; + +#define min(a,b) (((a)<(b))?(a):(b)) +#define max(a,b) (((a)>(b))?(a):(b)) + diff --git a/spaceman/space.h b/spaceman/space.h new file mode 100644 index 0000000..6e1bc52 --- /dev/null +++ b/spaceman/space.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2012 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 + */ + +typedef struct fileio { + int fd; /* open file descriptor */ + int flags; /* flags describing file state */ + char *name; /* file name at time of open */ + xfs_fsop_geom_t geom; /* XFS filesystem geometry */ +} fileio_t; + +extern fileio_t *filetable; /* open file table */ +extern int filecount; /* number of open files */ +extern fileio_t *file; /* active file in file table */ +extern int filelist_f(void); + +extern int openfile(char *, xfs_fsop_geom_t *, int, mode_t); +extern int addfile(char *, int , xfs_fsop_geom_t *, int); + +extern void file_init(void); +extern void help_init(void); +extern void quit_init(void); =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-crc-patchset-v2= /spaceman-trim=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001= 750=0000000011556=0012132011547=00016733=00 0=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00spaceman: add FITRIM support =46rom: Dave Chinner Add support for discarding free space extents via the FITRIM command. Make it easy to discard a single range, an entire AG or all the freespace in the filesystem. Signed-off-by: Dave Chinner --- spaceman/Makefile | 2 +- spaceman/init.c | 1 + spaceman/space.h | 1 + spaceman/trim.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 143 insertions(+), 1 deletion(-) diff --git a/spaceman/Makefile b/spaceman/Makefile index ff8d23e..9fb9142 100644 --- a/spaceman/Makefile +++ b/spaceman/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs LTCOMMAND =3D xfs_spaceman HFILES =3D init.h space.h CFILES =3D init.c \ - file.c + file.c trim.c =20 LLDLIBS =3D $(LIBXCMD) LTDEPENDENCIES =3D $(LIBXCMD) diff --git a/spaceman/init.c b/spaceman/init.c index f3d5397..307d91f 100644 --- a/spaceman/init.c +++ b/spaceman/init.c @@ -40,6 +40,7 @@ init_commands(void) file_init(); help_init(); quit_init(); + trim_init(); } =20 static int diff --git a/spaceman/space.h b/spaceman/space.h index 6e1bc52..7b4f034 100644 --- a/spaceman/space.h +++ b/spaceman/space.h @@ -34,3 +34,4 @@ extern int addfile(char *, int , xfs_fsop_geom_t *, int); extern void file_init(void); extern void help_init(void); extern void quit_init(void); +extern void trim_init(void); diff --git a/spaceman/trim.c b/spaceman/trim.c new file mode 100644 index 0000000..11385ff --- /dev/null +++ b/spaceman/trim.c @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2012 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 +#include +#include +#include +#include "init.h" +#include "space.h" +#include "input.h" + +#ifndef FITRIM +#define FITRIM _IOWR('X', 121, struct fstrim_range) /* Trim */ + +struct fstrim_range { + __u64 start; + __u64 len; + __u64 minlen; +}; +#endif + +static cmdinfo_t trim_cmd; + +/* + * Report on trimace usage in xfs filesystem. + */ +static int +trim_f( + int argc, + char **argv) +{ + struct fstrim_range trim =3D {0}; + xfs_agnumber_t agno =3D 0; + off64_t offset =3D 0; + ssize_t length =3D 0; + ssize_t minlen =3D 0; + int aflag =3D 0; + int fflag =3D 0; + int ret; + int c; + + while ((c =3D getopt(argc, argv, "a:fm:")) !=3D EOF) { + switch (c) { + case 'a': + if (fflag) + return command_usage(&trim_cmd); + aflag =3D 1; + agno =3D atoi(optarg); + break; + case 'f': + if (aflag) + return command_usage(&trim_cmd); + fflag =3D 1; + break; + case 'm': + minlen =3D cvtnum(file->geom.blocksize, + file->geom.sectsize, argv[optind]); + break; + default: + return command_usage(&trim_cmd); + } + } + + if (optind !=3D argc - 2 && !(aflag || fflag)) + return command_usage(&trim_cmd); + if (optind !=3D argc) { + offset =3D cvtnum(file->geom.blocksize, file->geom.sectsize, + argv[optind]); + length =3D cvtnum(file->geom.blocksize, file->geom.sectsize, + argv[optind + 1]); + } else if (agno) { + offset =3D agno * file->geom.agblocks * file->geom.blocksize; + length =3D file->geom.agblocks * file->geom.blocksize; + } else { + offset =3D 0; + length =3D file->geom.datablocks * file->geom.blocksize; + } + + trim.start =3D offset; + trim.len =3D length; + trim.minlen =3D minlen; + + ret =3D ioctl(file->fd, FITRIM, (unsigned long)&trim); + if (ret < 0) { + fprintf(stderr, "%s: ioctl(FITRIM) [\"%s\"]: " + "%s\n", progname, file->name, strerror(errno)); + exitcode =3D 1; + return 0; + } + return 0; +} + +static void +trim_help(void) +{ + printf(_( +"\n" +"Discard filesystem free space\n" +"\n" +"Options: [-m minlen] [-f]|[-a agno]|[offset length]\n" +"\n" +" -m minlen -- skip freespace extents smaller than minlen\n" +" -f -- trim all the freespace in the entire filesystem\n" +" -a agno -- trim all the freespace in the given AG agno\n" +" offset length -- trim the freespace in the range {offset, length}\n" +"\n")); + +} + +void +trim_init(void) +{ + trim_cmd.name =3D "trim"; + trim_cmd.altname =3D "tr"; + trim_cmd.cfunc =3D trim_f; + trim_cmd.argmin =3D 1; + trim_cmd.argmax =3D 4; + trim_cmd.args =3D "[-m minlen] [-f]|[-a agno]|[offset length]\n"; + trim_cmd.flags =3D CMD_FLAG_GLOBAL; + trim_cmd.oneline =3D _("Discard filesystem free space"); + trim_cmd.help =3D trim_help; + + add_command(&trim_cmd); +} + =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs-crc= -patchset-v2/spaceman-prealloc-flush=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750=000001750=00000= 00012100=0012132011547=00020662=00 0=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00dave=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00spaceman: add new speculative prealloc control =46rom: Dave Chinner Add an control interface for purging speculative preallocation via the new ioctls. Signed-off-by: Dave Chinner --- spaceman/Makefile | 2 +- spaceman/init.c | 1 + spaceman/prealloc.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++= ++++ spaceman/space.h | 1 + 4 files changed, 139 insertions(+), 1 deletion(-) diff --git a/spaceman/Makefile b/spaceman/Makefile index 9fb9142..b1f1136 100644 --- a/spaceman/Makefile +++ b/spaceman/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs LTCOMMAND =3D xfs_spaceman HFILES =3D init.h space.h CFILES =3D init.c \ - file.c trim.c + file.c prealloc.c trim.c =20 LLDLIBS =3D $(LIBXCMD) LTDEPENDENCIES =3D $(LIBXCMD) diff --git a/spaceman/init.c b/spaceman/init.c index 314b5aa..e16ad83 100644 --- a/spaceman/init.c +++ b/spaceman/init.c @@ -39,6 +39,7 @@ init_commands(void) { file_init(); help_init(); + prealloc_init(); quit_init(); trim_init(); } diff --git a/spaceman/prealloc.c b/spaceman/prealloc.c new file mode 100644 index 0000000..bef392a --- /dev/null +++ b/spaceman/prealloc.c @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2012 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 +#include +#include +#include "input.h" +#include "init.h" +#include "space.h" + +#ifndef XFS_IOC_FREE_EOFBLOCKS +#define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) + +#define XFS_EOFBLOCKS_VERSION 1 +struct xfs_eofblocks { + __u32 eof_version; + __u32 eof_flags; + uid_t eof_uid; + gid_t eof_gid; + prid_t eof_prid; + __u32 pad32; + __u64 eof_min_file_size; + __u64 pad64[12]; +}; + +/* eof_flags values */ +#define XFS_EOF_FLAGS_SYNC (1 << 0) /* sync/wait mode scan */ +#define XFS_EOF_FLAGS_UID (1 << 1) /* filter by uid */ +#define XFS_EOF_FLAGS_GID (1 << 2) /* filter by gid */ +#define XFS_EOF_FLAGS_PRID (1 << 3) /* filter by project id */ +#define XFS_EOF_FLAGS_MINFILESIZE (1 << 4) /* filter by min file size */ + +#endif + +static cmdinfo_t prealloc_cmd; + +/* + * Control preallocation amounts. + */ +static int +prealloc_f( + int argc, + char **argv) +{ + struct xfs_eofblocks eofb =3D {0}; + int c; + + eofb.eof_version =3D XFS_EOFBLOCKS_VERSION; + + while ((c =3D getopt(argc, argv, "g:m:p:su:")) !=3D EOF) { + switch (c) { + case 'g': + eofb.eof_flags |=3D XFS_EOF_FLAGS_GID; + eofb.eof_gid =3D atoi(optarg); + break; + case 'u': + eofb.eof_flags |=3D XFS_EOF_FLAGS_UID; + eofb.eof_uid =3D atoi(optarg); + break; + case 'p': + eofb.eof_flags |=3D XFS_EOF_FLAGS_PRID; + eofb.eof_prid =3D atoi(optarg); + break; + case 's': + eofb.eof_flags |=3D XFS_EOF_FLAGS_SYNC; + break; + case 'm': + eofb.eof_flags |=3D XFS_EOF_FLAGS_MINFILESIZE; + eofb.eof_min_file_size =3D cvtnum(file->geom.blocksize, + file->geom.sectsize, + optarg); + break; + case '?': + default: + return command_usage(&prealloc_cmd); + } + } + if (optind !=3D argc) + return command_usage(&prealloc_cmd); + + if (xfsctl(file->name, file->fd, XFS_IOC_FREE_EOFBLOCKS, &eofb) < 0) { + fprintf(stderr, _("%s: XFS_IOC_FREE_EOFBLOCKS on %s: %s\n"), + progname, file->name, strerror(errno)); + } + return 0; +} + +static void +prealloc_help(void) +{ + printf(_( +"\n" +"Control speculative preallocation\n" +"\n" +"Options: [-s] [-ugp id] [-m minlen]\n" +"\n" +" -s -- synchronous flush - wait for flush to complete\n" +" -u uid -- remove prealloc on files matching user \n" +" -g gid -- remove prealloc on files matching group \n" +" -p prid -- remove prealloc on files matching project \n" +" -m minlen -- only consider files larger than \n" +"\n")); + +} + +void +prealloc_init(void) +{ + prealloc_cmd.name =3D "prealloc"; + prealloc_cmd.altname =3D "prealloc"; + prealloc_cmd.cfunc =3D prealloc_f; + prealloc_cmd.argmin =3D 1; + prealloc_cmd.argmax =3D -1; + prealloc_cmd.args =3D "[-s] [-ugp id] [-m minlen]\n"; + prealloc_cmd.flags =3D CMD_FLAG_GLOBAL; + prealloc_cmd.oneline =3D _("Control specualtive preallocation"); + prealloc_cmd.help =3D prealloc_help; + + add_command(&prealloc_cmd); +} + diff --git a/spaceman/space.h b/spaceman/space.h index 7b4f034..0ae3116 100644 --- a/spaceman/space.h +++ b/spaceman/space.h @@ -33,5 +33,6 @@ extern int addfile(char *, int , xfs_fsop_geom_t *, int); =20 extern void file_init(void); extern void help_init(void); +extern void prealloc_init(void); extern void quit_init(void); extern void trim_init(void); =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfspro= gs-crc-patchset-v2/spaceman-ag-control=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750= =000001750=0000000015212=0012132011547=00020016=00 0=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00spaceman: AG state control =46rom: Dave Chinner Add support for a new allocation group state control ioctl. This allows control of various AG parameters, such as whether inode allocation is allowed in the AG, metadata preference, whether new allocations are allowed, etc. This requires a new ioctl. Signed-off-by: Dave Chinner --- spaceman/Makefile | 2 +- spaceman/ag.c | 222 +++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 223 insertions(+), 1 deletion(-) diff --git a/spaceman/Makefile b/spaceman/Makefile index b1f1136..08709b3 100644 --- a/spaceman/Makefile +++ b/spaceman/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs LTCOMMAND =3D xfs_spaceman HFILES =3D init.h space.h CFILES =3D init.c \ - file.c prealloc.c trim.c + ag.c file.c prealloc.c trim.c =20 LLDLIBS =3D $(LIBXCMD) LTDEPENDENCIES =3D $(LIBXCMD) diff --git a/spaceman/ag.c b/spaceman/ag.c new file mode 100644 index 0000000..a32d5da --- /dev/null +++ b/spaceman/ag.c @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2012 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 +#include +#include +#include +#include "input.h" +#include "init.h" +#include "space.h" + +#ifndef XFS_IOC_AGCONTROL +#define XFS_IOC_AGCONTROL _IOWR ('X', 60, struct xfs_agcontrol) + +#define XFS_AGCONTROL_VERSION 1 +struct xfs_agcontrol { + __u32 version; + __u32 flags; + __u32 agno; + __u32 state; + __u64 pad[8]; +}; + +/* control flags */ +#define XFS_AGCONTROL_GETAGFSTATE (1 << 0) /* get AGF state */ +#define XFS_AGCONTROL_SETAGFSTATE (1 << 1) /* set AGF state */ +#define XFS_AGCONTROL_GETAGISTATE (1 << 2) /* get AGI state */ +#define XFS_AGCONTROL_SETAGISTATE (1 << 3) /* set AGI state */ + +/* state flags */ + +/* + * inode and allocation states are split. AGF and AGI online state will mo= ve in + * sync as it is really a whole AG state. No allocation flags imply no new + * allocations, but inodes and extents can be removed. Readonly means no + * modification (alloc or free) is allowed. This is to allow different + * operations to be performed. e.g. emptying an AG in preparation for a sh= rink + * require NOALLOC state, but an AG that has a corrupted freespace btree m= ight + * be switched to READONLY until the freespace tree is rebuilt. An AGF/AGI= in + * this corrupt/ro state will set the relevant corruption flag in the state + * field.... + */ +#define XFS_AGFSTATE_ONLINE (1 << 0) /* AGF online */ +#define XFS_AGFSTATE_NOALLOC (1 << 1) /* No new allocation */ +#define XFS_AGFSTATE_READONLY (1 << 2) /* AGF is immutable */ +#define XFS_AGFSTATE_METADATA (1 << 3) /* metadata preferred */ +#define XFS_AGFSTATE_CORRUPT_BNO (1 << 4) /* bno freespace corrupt */ +#define XFS_AGFSTATE_CORRUPT_CNT (1 << 5) /* cnt freespace corrupt */ +#define XFS_AGFSTATE_CORRUPT_AGFL (1 << 6) /* AGFL freespace corrupt */ + +#define XFS_AGISTATE_ONLINE (1 << 0) /* AGI online */ +#define XFS_AGISTATE_NOALLOC (1 << 1) /* No new allocation */ +#define XFS_AGISTATE_READONLY (1 << 2) /* AGI is immutable */ +#define XFS_AGISTATE_CORRUPT_TREE (1 << 2) /* AGI btree corrupt */ + +#endif + +static cmdinfo_t agfctl_cmd; +static cmdinfo_t agictl_cmd; + +static int +agfctl_f( + int argc, + char **argv) +{ + struct xfs_agcontrol agctl =3D {0}; + xfs_agnumber_t agno; + int gflag =3D 0; + int c; + + while ((c =3D getopt(argc, argv, "gs")) !=3D EOF) { + switch (c) { + case 'g': + gflag =3D 1; + break; + default: + return command_usage(&agfctl_cmd); + } + } + if (optind !=3D argc - 1) + return command_usage(&agfctl_cmd); + + agno =3D atoi(argv[optind]); + if (agno >=3D file->geom.agcount) { + fprintf(stderr, _("%s: agno %d out of range (max %d)\n"), + progname, agno, file->geom.agcount); + exitcode =3D 1; + return 0; + } + + agctl.version =3D XFS_AGCONTROL_VERSION; + agctl.agno =3D agno; + if (gflag) + agctl.flags =3D XFS_AGCONTROL_GETAGFSTATE; + + if (xfsctl(file->name, file->fd, XFS_IOC_AGCONTROL, &agctl) < 0) { + fprintf(stderr, _("%s: XFS_IOC_AGCONTROL on %s: %s\n"), + progname, file->name, strerror(errno)); + } + return 0; +} + +static void +agfctl_help(void) +{ + printf(_( +"\n" +"AGF state control\n" +"\n" +"Options: [-g] agno\n" +"\n" +" -g -- get state\n" +" agno -- AG to operate on\n" +"\n")); + +} + +void +agfctl_init(void) +{ + agfctl_cmd.name =3D "agfctl"; + agfctl_cmd.altname =3D "agfctl"; + agfctl_cmd.cfunc =3D agfctl_f; + agfctl_cmd.argmin =3D 2; + agfctl_cmd.argmax =3D -1; + agfctl_cmd.args =3D "agno\n"; + agfctl_cmd.flags =3D CMD_FLAG_GLOBAL; + agfctl_cmd.oneline =3D _("AGF state control"); + agfctl_cmd.help =3D agfctl_help; + + add_command(&agfctl_cmd); +} + +static int +agictl_f( + int argc, + char **argv) +{ + struct xfs_agcontrol agctl =3D {0}; + xfs_agnumber_t agno; + int gflag =3D 0; + int c; + + while ((c =3D getopt(argc, argv, "gs")) !=3D EOF) { + switch (c) { + case 'g': + gflag =3D 1; + break; + default: + return command_usage(&agictl_cmd); + } + } + if (optind !=3D argc - 1) + return command_usage(&agictl_cmd); + + agno =3D atoi(argv[optind]); + if (agno >=3D file->geom.agcount) { + fprintf(stderr, _("%s: agno %d out of range (max %d)\n"), + progname, agno, file->geom.agcount); + exitcode =3D 1; + return 0; + } + + agctl.version =3D XFS_AGCONTROL_VERSION; + agctl.agno =3D agno; + if (gflag) + agctl.flags =3D XFS_AGCONTROL_GETAGISTATE; + + if (xfsctl(file->name, file->fd, XFS_IOC_AGCONTROL, &agctl) < 0) { + fprintf(stderr, _("%s: XFS_IOC_AGCONTROL on %s: %s\n"), + progname, file->name, strerror(errno)); + exitcode =3D 1; + return 0; + } + return 0; +} + +static void +agictl_help(void) +{ + printf(_( +"\n" +"AGI state control\n" +"\n" +"Options: [-g] agno\n" +"\n" +" -g -- get state\n" +" agno -- AG to operate on\n" +"\n")); + +} + +void +agictl_init(void) +{ + agictl_cmd.name =3D "agictl"; + agictl_cmd.altname =3D "agictl"; + agictl_cmd.cfunc =3D agictl_f; + agictl_cmd.argmin =3D 2; + agictl_cmd.argmax =3D -1; + agictl_cmd.args =3D "agno\n"; + agictl_cmd.flags =3D CMD_FLAG_GLOBAL; + agictl_cmd.oneline =3D _("AGI state control"); + agictl_cmd.help =3D agictl_help; + + add_command(&agictl_cmd); +} =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00xfs= progs-crc-patchset-v2/xfsprogs-freespace-2=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=000000600=000001750= =000001750=0000000024635=0012132011547=00020142=00 0=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00ustar =00dave=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00dave=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00xfsprogs: Space management tool =46rom: Dave Chinner Add freespace mapping tool modelled on the xfs_db freesp command. The advantage of this command over xfs_db is that it can be done online and is coherent with concurrent modifications to the filesystem. This requires kernel extensions to the fiemap command to map free space indexes. Signed-off-by: Dave Chinner --- spaceman/Makefile | 2 +- spaceman/freesp.c | 395 +++++++++++++++++++++++++++++++++++++++++++++++++= ++++ spaceman/init.c | 1 + spaceman/space.h | 1 + 4 files changed, 398 insertions(+), 1 deletion(-) diff --git a/spaceman/Makefile b/spaceman/Makefile index b1f1136..4743ad8 100644 --- a/spaceman/Makefile +++ b/spaceman/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs LTCOMMAND =3D xfs_spaceman HFILES =3D init.h space.h CFILES =3D init.c \ - file.c prealloc.c trim.c + file.c freesp.c prealloc.c trim.c =20 LLDLIBS =3D $(LIBXCMD) LTDEPENDENCIES =3D $(LIBXCMD) diff --git a/spaceman/freesp.c b/spaceman/freesp.c new file mode 100644 index 0000000..dc1d7a5 --- /dev/null +++ b/spaceman/freesp.c @@ -0,0 +1,395 @@ +/* + * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. + * Copyright (c) 2012 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 +#include +#include +#include +#include +#include "init.h" +#include "space.h" + +#ifndef FIEMAPFS_FLAG_FREESP +#define FIEMAPFS_FLAG_FREESP 0x80000000 +#define FIEMAPFS_FLAG_FREESP_SIZE 0x40000000 +#define FIEMAPFS_FLAG_FREESP_SIZE_HINT 0x20000000 + +#define FS_IOC_FIEMAPFS _IOWR('f', 12, struct fiemap) +#endif + +typedef struct histent +{ + int low; + int high; + long long count; + long long blocks; +} histent_t; + +static int agcount; +static xfs_agnumber_t *aglist; +static int countflag; +static int dumpflag; +static int equalsize; +static histent_t *hist; +static int histcount; +static int multsize; +static int seen1; +static int summaryflag; +static long long totblocks; +static long long totexts; + +static cmdinfo_t freesp_cmd; + +static void +addhistent( + int h) +{ + hist =3D realloc(hist, (histcount + 1) * sizeof(*hist)); + if (h =3D=3D 0) + h =3D 1; + hist[histcount].low =3D h; + hist[histcount].count =3D hist[histcount].blocks =3D 0; + histcount++; + if (h =3D=3D 1) + seen1 =3D 1; +} + +static void +addtohist( + xfs_agnumber_t agno, + xfs_agblock_t agbno, + off64_t len) +{ + int i; + + if (dumpflag) + printf("%8d %8d %8Zu\n", agno, agbno, len); + totexts++; + totblocks +=3D len; + for (i =3D 0; i < histcount; i++) { + if (hist[i].high >=3D len) { + hist[i].count++; + hist[i].blocks +=3D len; + break; + } + } +} + +static int +hcmp( + const void *a, + const void *b) +{ + return ((histent_t *)a)->low - ((histent_t *)b)->low; +} + +static void +histinit( + int maxlen) +{ + int i; + + if (equalsize) { + for (i =3D 1; i < maxlen; i +=3D equalsize) + addhistent(i); + } else if (multsize) { + for (i =3D 1; i < maxlen; i *=3D multsize) + addhistent(i); + } else { + if (!seen1) + addhistent(1); + qsort(hist, histcount, sizeof(*hist), hcmp); + } + for (i =3D 0; i < histcount; i++) { + if (i < histcount - 1) + hist[i].high =3D hist[i + 1].low - 1; + else + hist[i].high =3D maxlen; + } +} + +static void +printhist(void) +{ + int i; + + printf("%7s %7s %7s %7s %6s\n", + _("from"), _("to"), _("extents"), _("blocks"), _("pct")); + for (i =3D 0; i < histcount; i++) { + if (hist[i].count) + printf("%7d %7d %7lld %7lld %6.2f\n", hist[i].low, + hist[i].high, hist[i].count, hist[i].blocks, + hist[i].blocks * 100.0 / totblocks); + } +} + +static int +inaglist( + xfs_agnumber_t agno) +{ + int i; + + if (agcount =3D=3D 0) + return 1; + for (i =3D 0; i < agcount; i++) + if (aglist[i] =3D=3D agno) + return 1; + return 0; +} + +#define NR_EXTENTS 128 + +static void +scan_ag( + xfs_agnumber_t agno) +{ + struct fiemap *fiemap; + off64_t blocksize =3D file->geom.blocksize; + uint64_t last_logical =3D agno * file->geom.agblocks * blocksize; + uint64_t length =3D file->geom.agblocks * blocksize; + off64_t fsbperag; + int fiemap_flags; + int last =3D 0; + int map_size; + + + last_logical =3D (off64_t)file->geom.agblocks * blocksize * agno; + length =3D (off64_t)file->geom.agblocks * blocksize; + fsbperag =3D (off64_t)file->geom.agblocks * blocksize; + + map_size =3D sizeof(struct fiemap) + + sizeof(struct fiemap_extent) * NR_EXTENTS; + fiemap =3D malloc(map_size); + if (!fiemap) { + fprintf(stderr, _("%s: fiemap malloc failed.\n"), progname); + exitcode =3D 1; + return; + } + if (countflag) + fiemap_flags =3D FIEMAPFS_FLAG_FREESPACE_SIZE; + else + fiemap_flags =3D FIEMAPFS_FLAG_FREESPACE; + + while (!last) { + struct fiemap_extent *extent; + xfs_agblock_t agbno; + int ret; + int i; + + memset(fiemap, 0, map_size); + fiemap->fm_flags =3D fiemap_flags; + fiemap_flags &=3D ~FIEMAPFS_FLAGS_FREESP_CONTINUE; + + fiemap->fm_start =3D last_logical; + fiemap->fm_length =3D length; + fiemap->fm_extent_count =3D NR_EXTENTS; + + ret =3D ioctl(file->fd, FS_IOC_FIEMAPFS, (unsigned long)fiemap); + if (ret < 0) { + fprintf(stderr, "%s: ioctl(FS_IOC_FIEMAPFS) [\"%s\"]: " + "%s\n", progname, file->name, strerror(errno)); + free(fiemap); + exitcode =3D 1; + return; + } + + /* No more extents to map, exit */ + if (!fiemap->fm_mapped_extents) + break; + + for (i =3D 0; i < fiemap->fm_mapped_extents; i++) { + off64_t aglen; + + extent =3D &fiemap->fm_extents[i]; + + + agbno =3D (extent->fe_physical - (fsbperag * agno)) / + blocksize; + aglen =3D extent->fe_length / blocksize; + + addtohist(agno, agbno, aglen); + + + if (extent->fe_flags & FIEMAP_EXTENT_LAST) { + last =3D 1; + break; + } + } + + if (fiemap_flags =3D=3D FIEMAPFS_FLAG_FREESPACE) { + /* move our range past over what we just searched */ + last_logical =3D max(last_logical, + extent->fe_logical + extent->fe_length); + } else { + /* + * we want to start the search from the current + * extent, but size ordered free space can be found + * anywhere in the range we asked for so we cannot move + * last_logical around. This means we need to give the + * search the last extent we've found back to the kernel + * for it to start it's search again. Move + * it to extent zero, and flag it as a continued call. + */ + memcpy(&fiemap->fm_extents[0], extent, + sizeof(fiemap->fm_extents[0])); + fiemap_flags |=3D FIEMAPFS_FLAGS_FREESP_SIZE_HINT; + } + + } +} +static void +aglistadd( + char *a) +{ + aglist =3D realloc(aglist, (agcount + 1) * sizeof(*aglist)); + aglist[agcount] =3D (xfs_agnumber_t)atoi(a); + agcount++; +} + +static int +init( + int argc, + char **argv) +{ + int c; + int speced =3D 0; + + agcount =3D countflag =3D dumpflag =3D equalsize =3D multsize =3D optind = =3D 0; + histcount =3D seen1 =3D summaryflag =3D 0; + totblocks =3D totexts =3D 0; + aglist =3D NULL; + hist =3D NULL; + while ((c =3D getopt(argc, argv, "a:bcde:h:m:s")) !=3D EOF) { + switch (c) { + case 'a': + aglistadd(optarg); + break; + case 'b': + if (speced) + return 0; + multsize =3D 2; + speced =3D 1; + break; + case 'c': + countflag =3D 1; + break; + case 'd': + dumpflag =3D 1; + break; + case 'e': + if (speced) + return 0; + equalsize =3D atoi(optarg); + speced =3D 1; + break; + case 'h': + if (speced && !histcount) + return 0; + addhistent(atoi(optarg)); + speced =3D 1; + break; + case 'm': + if (speced) + return 0; + multsize =3D atoi(optarg); + speced =3D 1; + break; + case 's': + summaryflag =3D 1; + break; + case '?': + return 0; + } + } + if (optind !=3D argc) + return 0; + if (!speced) + multsize =3D 2; + histinit(file->geom.agblocks); + return 1; +} + +/* + * Report on freespace usage in xfs filesystem. + */ +static int +freesp_f( + int argc, + char **argv) +{ + xfs_agnumber_t agno; + + if (!init(argc, argv)) + return 0; + for (agno =3D 0; agno < file->geom.agcount; agno++) { + if (inaglist(agno)) + scan_ag(agno); + } + if (histcount) + printhist(); + if (summaryflag) { + printf(_("total free extents %lld\n"), totexts); + printf(_("total free blocks %lld\n"), totblocks); + printf(_("average free extent size %g\n"), + (double)totblocks / (double)totexts); + } + if (aglist) + free(aglist); + if (hist) + free(hist); + return 0; +} + +static void +freesp_help(void) +{ + printf(_( +"\n" +"Examine filesystem free space\n" +"\n" +"Options: [-bcds] [-a agno] [-e bsize] [-h h1]... [-m bmult]\n" +"\n" +" -b -- binary histogram bin size\n" +" -c -- scan the by-count (size) ordered freespace tree\n" +" -d -- debug output\n" +" -s -- emit freespace summary information\n" +" -a agno -- scan only the given AG agno\n" +" -e bsize -- use fixed histogram bin size of bsize\n" +" -h h1 -- use custom histogram bin size of h1. Multiple specifications al= lowed.\n" +" -m bmult -- use histogram bin size multiplier of bmult\n" +"\n")); + +} + +void +freesp_init(void) +{ + freesp_cmd.name =3D "freesp"; + freesp_cmd.altname =3D "fsp"; + freesp_cmd.cfunc =3D freesp_f; + freesp_cmd.argmin =3D 0; + freesp_cmd.argmax =3D -1; + freesp_cmd.args =3D "[-bcds] [-a agno] [-e bsize] [-h h1]... [-m bmult]\n= "; + freesp_cmd.flags =3D CMD_FLAG_GLOBAL; + freesp_cmd.oneline =3D _("Examine filesystem free space"); + freesp_cmd.help =3D freesp_help; + + add_command(&freesp_cmd); +} + diff --git a/spaceman/init.c b/spaceman/init.c index e16ad83..f8a3cb3 100644 --- a/spaceman/init.c +++ b/spaceman/init.c @@ -38,6 +38,7 @@ static void init_commands(void) { file_init(); + freesp_init(); help_init(); prealloc_init(); quit_init(); diff --git a/spaceman/space.h b/spaceman/space.h index 0ae3116..a1381a6 100644 --- a/spaceman/space.h +++ b/spaceman/space.h @@ -32,6 +32,7 @@ extern int openfile(char *, xfs_fsop_geom_t *, int, mode_= t); extern int addfile(char *, int , xfs_fsop_geom_t *, int); =20 extern void file_init(void); +extern void freesp_init(void); extern void help_init(void); extern void prealloc_init(void); extern void quit_init(void); =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00 --Dxnq1zWXvFF0Q93v-- From mlsemon35@gmail.com Fri Apr 12 10:20:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3631F29DFA for ; Fri, 12 Apr 2013 10:20:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 22693304053 for ; Fri, 12 Apr 2013 08:20:42 -0700 (PDT) X-ASG-Debug-ID: 1365780040-04cb6c2c1cffab0001-NocioJ Received: from mail-ve0-f181.google.com (mail-ve0-f181.google.com [209.85.128.181]) by cuda.sgi.com with ESMTP id tqjnrjvLCrEegv7D (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 08:20:41 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.181] Received: by mail-ve0-f181.google.com with SMTP id pa12so2472686veb.26 for ; Fri, 12 Apr 2013 08:20:40 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=9wGcU6OEnXxbE9SdjvzIW4dGnY6Zl4FoXPptkKSRkFM=; b=OJXkNZ/+nH6jKlxEp0CC+twKUDlEqzXmsAJY0kX1FOvNS57QhTK2fG/k7sOm7kTmQh LMTUyhGXuI48LvznjNhTo+t11nyf4CmsgV44nBYMXbYBCPiQrFquz9DoCFMJikSYoQjf uddnUQnOjiVR76ZkSgYSAZJ5FEVV24TpTX/GA2+JTOfcKGHeQU+iqOfhlKzyrYILvX1n WPylLvNTLqdoo6JVOsREmUDqfgXugZhAOp7DAQEXmGPEAwy36zVuLm8v3QXv62P/zWGY kFh/rEghPMIL8VRzFDw+voAYNUbi4IWzRqJ4cWL07b1qgGLW/sqm0yOd2PCPSDIAMJVc wiaw== X-Received: by 10.220.215.73 with SMTP id hd9mr8910917vcb.19.1365780040531; Fri, 12 Apr 2013 08:20:40 -0700 (PDT) Received: from [192.168.0.139] (rrcs-97-78-60-146.se.biz.rr.com. [97.78.60.146]) by mx.google.com with ESMTPS id co13sm335486vdb.11.2013.04.12.08.20.39 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 12 Apr 2013 08:20:39 -0700 (PDT) Message-ID: <5168263E.40208@gmail.com> Date: Fri, 12 Apr 2013 11:20:30 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Jeff Liu CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: fix s_max_bytes to MAX_LFS_FILESIZE if needed References: <5167E160.3020800@oracle.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix s_max_bytes to MAX_LFS_FILESIZE if needed In-Reply-To: <5167E160.3020800@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ve0-f181.google.com[209.85.128.181] X-Barracuda-Start-Time: 1365780041 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127915 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email I'll try this patch tonight. Thanks! BTW, after failures with CONFIG_LBDAF=n in previous xfstests, my kernels should have CONFIG_LBDAF=y, but I could be wrong. I'll check this when I get back to my test PC and test your patch with both settings. Michael On 04/12/2013 06:26 AM, Jeff Liu wrote: > From: Jie Liu > > This patch fix the s_max_bytes to MAX_LFS_FILESIZE if the pre-calculated value is greater > than it. > > Reported-by: Michael L. Semon > Signed-off-by: Jie Liu > > --- > fs/xfs/xfs_super.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index ea341ce..0644d61 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -585,6 +585,7 @@ xfs_max_file_offset( > { > unsigned int pagefactor = 1; > unsigned int bitshift = BITS_PER_LONG - 1; > + __uint64_t offset; > > /* Figure out maximum filesize, on Linux this can depend on > * the filesystem blocksize (on 32 bit platforms). > @@ -610,7 +611,10 @@ xfs_max_file_offset( > # endif > #endif > > - return (((__uint64_t)pagefactor) << bitshift) - 1; > + offset = (((__uint64_t)pagefactor) << bitshift) - 1; > + > + /* Check against VM & VFS exposed limits */ > + return (offset > MAX_LFS_FILESIZE) ? MAX_LFS_FILESIZE : offset; > } > > xfs_agnumber_t > From jeff.liu@oracle.com Fri Apr 12 10:48:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 130F829DFA for ; Fri, 12 Apr 2013 10:48:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 758108F808E for ; Fri, 12 Apr 2013 08:48:40 -0700 (PDT) X-ASG-Debug-ID: 1365781719-04cb6c2c1e103cc0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id q9Bd5u0rkouFXW62 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 12 Apr 2013 08:48:39 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r3CFmcNF024293 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 12 Apr 2013 15:48:38 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3CFmbdY009744 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Fri, 12 Apr 2013 15:48:37 GMT Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3CFma1D025844 for ; Fri, 12 Apr 2013 15:48:36 GMT Received: from [192.168.1.104] (/221.223.105.164) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 12 Apr 2013 08:48:36 -0700 Message-ID: <51682CCC.308@oracle.com> Date: Fri, 12 Apr 2013 23:48:28 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH] xfs: don't return 0 if generic_segment_checks() find nothing to write Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: don't return 0 if generic_segment_checks() find nothing to write Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1365781719 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127917 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu At xfs_file_aio_write(), we just return 0 which means a successfully operation if the ocount is evaluated to 0 at generic_segment_checks(). Generally, it'll occurred if the specified write count is 0 from the user space. However, for example, if the given offset is over the maximum file size limitation although nothing would be written into the file, in this case, the underlying file system should detect this issue and return a proper errno instead. Hence, the beginning pre-checking up against ocount would conceal some real cause and confuse the user space program maybe. To fix it, we can delay the write count verification until xfs_file_aio_write_checks() is done. This test is performed on 32-bit system without CONFIG_LBADF is enabled. Before patching: xfs_io -f -c "pwrite 17592186040320 0" /storage/test_file wrote 0/0 bytes at offset 17592186040320 0.000000 bytes, 0 ops; 0.0000 sec (0.000000 bytes/sec and 0.0000 ops/sec) After patching: xfs_io -f -c "pwrite 17592186040320 0" /storage/test_file pwrite64: File too large Signed-off-by: Jie Liu --- fs/xfs/xfs_file.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index f03bf1a..f8a933e 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -671,6 +671,9 @@ xfs_file_dio_aio_write( if (ret) goto out; + if (ocount == 0) + goto out; + if (mapping->nrpages) { ret = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, pos, -1); @@ -725,6 +728,9 @@ xfs_file_buffered_aio_write( if (ret) goto out; + if (ocount == 0) + goto out; + /* We can write back this queue in page reclaim */ current->backing_dev_info = mapping->backing_dev_info; @@ -772,9 +778,6 @@ xfs_file_aio_write( if (ret) return ret; - if (ocount == 0) - return 0; - sb_start_write(inode->i_sb); if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { -- 1.7.9.5 From shhuiw@gmail.com Fri Apr 12 11:38:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9A6117CBF for ; Fri, 12 Apr 2013 11:38:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7824A8F8084 for ; Fri, 12 Apr 2013 09:38:56 -0700 (PDT) X-ASG-Debug-ID: 1365784734-04cbb057f71087a0001-NocioJ Received: from mail-pb0-f48.google.com (mail-pb0-f48.google.com [209.85.160.48]) by cuda.sgi.com with ESMTP id xLyPl5GB8RS46qRq (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 09:38:55 -0700 (PDT) X-Barracuda-Envelope-From: shhuiw@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.48 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.48] Received: by mail-pb0-f48.google.com with SMTP id xb4so1498740pbc.21 for ; Fri, 12 Apr 2013 09:38:54 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.48] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.48] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=doZ25VAv8XWzUKZPLH1NWB1bdDxrruwvfewVlkKk8hc=; b=pyx/pKVYU8atMoX4MlJGqHEFT7p5ApUj5h4sOX+7WrFBCPmOgK7AEnmJPxvuH7eZfX bayMuhk8Zdm0fWBslNn3iCxh/khYvqb3gMQgcuycduNWokD4En0ETpA2yc6jh28pE6kk CgCuNvJfbFQwc1AIJJyg4tFPA1rAjcQWC3/gnPDzV0xRge3P+bDHqthXN6zbuJugShxx dDX3yyC3I74fpmmW6YXyU+laGH9eAzZSYx2MbBRxKT/glGu+Mn6Lw2109+2QOOjct3Vs jhKrpcZSv7GJpHOXkaLJnfkJMF2YmvlepfWzzMpz3w8Ek65nHH2WGZBriuHkGzrmDX/z FHrQ== X-Received: by 10.66.158.232 with SMTP id wx8mr16211090pab.156.1365784734743; Fri, 12 Apr 2013 09:38:54 -0700 (PDT) Received: from [192.168.1.104] ([122.70.123.170]) by mx.google.com with ESMTPS id c5sm3156325pbl.37.2013.04.12.09.38.52 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 12 Apr 2013 09:38:53 -0700 (PDT) Message-ID: <5168388C.5050404@gmail.com> Date: Sat, 13 Apr 2013 00:38:36 +0800 From: Wang Sheng-Hui User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: Rich Johnston , Dave Chinner , xfstests Subject: Re: [PATCH] xfstests: fix the regex pattern in get_group_list of check References: <5167A5D3.4070903@gmail.com> <20130412075728.GD30622@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix the regex pattern in get_group_list of check In-Reply-To: <20130412075728.GD30622@dastard> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-pb0-f48.google.com[209.85.160.48] X-Barracuda-Start-Time: 1365784735 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127919 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 2013å¹´04月12æ—¥ 15:57, Dave Chinner wrote: > On Fri, Apr 12, 2013 at 02:12:35PM +0800, Wang Sheng-Hui wrote: >> In group files, non comment line starts with a 3-digits, then followed by >> space and other characters, but no group names. > > I don't follow. A group file line looks like: > > 003 db auto quick > > Which defines the test name, followed by the group names the test > belongs to. > >> The old regex in get_group_list uses the group name as part of the regex, >> and fails './check -g xfs' run: >> Group "xfs" is empty or not defined? > > Well, yes, "xfs" is not a defined group name: > > $ grep xfs tests/*/group > $ > > If I define a "xfs" group by assigning tests to it, check runs just > fine. > > $ grep xfs tests/*/group > tests/xfs/group:003 db auto quick xfs > $ sudo ./check -g xfs > FSTYP -- xfs (debug) > PLATFORM -- Linux/x86_64 test-2 3.9.0-rc4-dgc+ > MKFS_OPTIONS -- -f -bsize=4096 /dev/vdb > MOUNT_OPTIONS -- /dev/vdb /mnt/scratch > > xfs/003 1s > Ran: xfs/003 > Passed all 1 tests > $ > > So what check is doing looks perfectly OK to me and doesn't need > changing. > >> The patch removes the pattern for group name, and thus we can trigger tests >> like "./check -g xfs" as normal. > > If you want to run all the tests in a specific subdirectory regardless > of groups, then you can do it like: > > $ sudo ./check xfs/[0-9][0-9][0-9] Thanks, Dave. I confused the group with fs type. > FSTYP -- xfs (debug) > PLATFORM -- Linux/x86_64 test-2 3.9.0-rc4-dgc+ > MKFS_OPTIONS -- -f -bsize=4096 /dev/vdb > MOUNT_OPTIONS -- /dev/vdb /mnt/scratch > > xfs/003 0s > xfs/004 0s > xfs/008 1s > ..... > > There's definitely better ways to do this, but conflating source tree > layout with runtime test group definitions is not it. ;) > > Perhaps something like "check xfs" will just run all tests in the > xfs test dir, similar for ext4, shared, etc? > > Cheers, > > Dave. > From shhuiw@gmail.com Fri Apr 12 11:42:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 AD1C77CBF for ; Fri, 12 Apr 2013 11:42:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 993E6304053 for ; Fri, 12 Apr 2013 09:42:26 -0700 (PDT) X-ASG-Debug-ID: 1365784945-04cbb057f7108de0001-NocioJ Received: from mail-da0-f43.google.com (mail-da0-f43.google.com [209.85.210.43]) by cuda.sgi.com with ESMTP id Dfee1COTTkT9j1cG (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 09:42:25 -0700 (PDT) X-Barracuda-Envelope-From: shhuiw@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.43 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.43] Received: by mail-da0-f43.google.com with SMTP id u36so1219649dak.30 for ; Fri, 12 Apr 2013 09:42:25 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.43] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.43] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=sP/K4R02otNkUvOyG4t1TI1+aoxKwfF0e/q/mxSOjkU=; b=xcoeMKg/Nt4Kl8PkWCB/kEVuQ/dowg4ahdOQskG2qhHYck+Lk1/btLXddjYmL9cpeG DUXa9A+G4T4sp8dPv1uOI3cP/pp4gjH1bWX9AcijB+CBHMxjUKJ88Rn5dw8MXZYHRcux kTnyHOwnZRuayEVv+bHqinXX60BeTGMbPxj8253oiTfO1XlXLqw/Zbnv00zG5B98yrhL 9iAcOQiDZh6UgMf4BAR++Gv+Q0o00m1J4yenGGTlaHhhP/h3ZZ9Cy+br0v037AJIh5Qg 7TmF5Jih7uRJ4/Z0fwIyxLUoU18iYA8PIXNYBxneHrgVJpY5SF6OKYib60ZNYHnyPCkX yJ/A== X-Received: by 10.68.200.70 with SMTP id jq6mr15747242pbc.120.1365784945069; Fri, 12 Apr 2013 09:42:25 -0700 (PDT) Received: from [192.168.1.104] ([122.70.123.170]) by mx.google.com with ESMTPS id gi10sm9155470pbc.40.2013.04.12.09.42.22 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 12 Apr 2013 09:42:24 -0700 (PDT) Message-ID: <5168396C.6020801@gmail.com> Date: Sat, 13 Apr 2013 00:42:20 +0800 From: Wang Sheng-Hui User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: Dave Chinner , Rich Johnston , xfstests Subject: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs References: <51678D0D.1070002@gmail.com> <20130412074034.GC30622@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs In-Reply-To: <20130412074034.GC30622@dastard> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-da0-f43.google.com[209.85.210.43] X-Barracuda-Start-Time: 1365784945 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127919 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 2013å¹´04月12æ—¥ 15:40, Dave Chinner wrote: > On Fri, Apr 12, 2013 at 12:26:53PM +0800, Wang Sheng-Hui wrote: >> +# >> + >> +TOPDIR = .. >> +include $(TOPDIR)/include/builddefs >> + >> +TESTS_SUBDIRS = $(shell find . -maxdepth 1 -type d | sed -n -e 's/\.\///gp') > > This is much neater: > > TESTS_SUBDIRS = $(sort $(dir $(wildcard $(PWD)/*/))) Hi Dave, I introduces Makefile under tests/, which would return to TESTS_SUBDIRS with the $(dir function. By running find in $(shell, TEST_SUBDIRS will only get the dir names, and no Makefile. Regards, Sheng-Hui > > -Dave. > From kdhall@binghamton.edu Fri Apr 12 12:25:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 390217CBF for ; Fri, 12 Apr 2013 12:25:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id ABE7DAC004 for ; Fri, 12 Apr 2013 10:25:27 -0700 (PDT) X-ASG-Debug-ID: 1365787525-04cbb057f710d240001-NocioJ Received: from mail-vc0-f177.google.com (mail-vc0-f177.google.com [209.85.220.177]) by cuda.sgi.com with ESMTP id YvMzzBdj5RNtK1tS (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 10:25:26 -0700 (PDT) X-Barracuda-Envelope-From: kdhall@binghamton.edu X-Barracuda-Apparent-Source-IP: 209.85.220.177 Received: by mail-vc0-f177.google.com with SMTP id hr11so2374538vcb.8 for ; Fri, 12 Apr 2013 10:25:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding:x-gm-message-state; bh=+ytO89zBml+6u0tXR7yRKXoOm5icV3tXHj7XZwtA1kg=; b=kB++xotUvTMG9MisvwdEuuwHyKtBMOiQfCHtkW0wgxli+8OoKCo+9SuMh17Pxa7wur VgIkKsbUKj9RznyiE6uNAMp2uSKXytFIaUR1Bdn7PZF5gf5vFIh5aq+o7IQpo7GMCaXa 4bAKxfSGmCFvvzaakXM1HvAAuLtnHvvPXdiLfU99M6ooGJV0DHglEvTQbpkm+FnRhSBH ceeQg6bcTPx2R8Sz8lYVYdb5HVNyusPc31u75nnmq5Yzz3JeRqnega7hxqpFZctusIYV oGA2NaPBSDlZuzuCst/40sb0ukMHRlFPU4sxZCGH0UjwBksMeXm6TNhngZ153jdCP4v/ DHtA== X-Received: by 10.52.66.229 with SMTP id i5mr7782865vdt.131.1365787525292; Fri, 12 Apr 2013 10:25:25 -0700 (PDT) Received: from [128.226.118.196] (omega.cs.binghamton.edu. [128.226.118.196]) by mx.google.com with ESMTPS id q5sm9096876vdj.5.2013.04.12.10.25.23 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 12 Apr 2013 10:25:24 -0700 (PDT) Message-ID: <51684382.50008@binghamton.edu> Date: Fri, 12 Apr 2013 13:25:22 -0400 From: Dave Hall User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20121215 Icedove/3.0.11 MIME-Version: 1.0 To: stan@hardwarefreak.com CC: Dave Chinner , "xfs@oss.sgi.com" Subject: Re: xfs_fsr, sunit, and swidth References: <5141C1FC.4060209@hardwarefreak.com> <5141C8C1.2080903@hardwarefreak.com> <5141E5CF.10101@binghamton.edu> <5142AE40.6040408@hardwarefreak.com> <20130315114538.GF6369@dastard> <5143F94C.1020708@hardwarefreak.com> <20130316072126.GG6369@dastard> <515082C3.2000006@binghamton.edu> <515361B5.8050603@hardwarefreak.com> <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> <515C3BF3.60601@binghamton.edu> X-ASG-Orig-Subj: Re: xfs_fsr, sunit, and swidth In-Reply-To: <515C3BF3.60601@binghamton.edu> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Gm-Message-State: ALoCoQmWQD69eJTaVv6OqHIyYjv6dvUUSmNBlX8G2S3NzWkHOstdrY6HjSnW4tDCuu1rqibL0NOa X-Barracuda-Connect: mail-vc0-f177.google.com[209.85.220.177] X-Barracuda-Start-Time: 1365787526 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Stan, IDid this post get lost in the shuffle? Looking at it I think it could have been a bit unclear. What I need to do anyways is have a second, off-site copy of my backup data. So I'm going to be building a second array. In copying, in order to preserve the hard link structure of the source array I'd have to run a sequence of cp -al / rsync calls that would mimic what rsnapshot did to get me to where I am right now. (Note that I could also potentially use rsync --link-dest.) So the question is how would the target xfs file system fare as far as my inode fragmentation situation is concerned? I'm hoping that since the target would be a fresh file system, and since during the 'copy' phase I'd only be adding inodes, that the inode allocation would be more compact and orderly than what I have on the source array since. What do you think? Thanks. -Dave Dave Hall Binghamton University kdhall@binghamton.edu 607-760-2328 (Cell) 607-777-4641 (Office) On 04/03/2013 10:25 AM, Dave Hall wrote: > So, assuming entropy has reached critical mass and that there is no > easy fix for this physical file system, what would happen if I > replicated this data to a new disk array? When I say 'replicate', I'm > not talking about xfs_dump. I'm talking about running a series of cp > -al/rsync operations (or maybe rsync with --link-dest) that will > precisely reproduce the linked data on my current array. All of the > inodes would be re-allocated. There wouldn't be any (or at least not > many) deletes. > > I am hoping that if I do this the inode fragmentation will be > significantly reduced on the target as compared to the source. Of > course over time it may re-fragment, but with two arrays I can always > wipe one and reload it. > > -Dave > > Dave Hall > Binghamton University > kdhall@binghamton.edu > 607-760-2328 (Cell) > 607-777-4641 (Office) > > > On 03/30/2013 09:22 PM, Dave Chinner wrote: >> On Fri, Mar 29, 2013 at 03:59:46PM -0400, Dave Hall wrote: >>> Dave, Stan, >>> >>> Here is the link for perf top -U: http://pastebin.com/JYLXYWki. >>> The ag report is at http://pastebin.com/VzziSa4L. Interestingly, >>> the backups ran fast a couple times this week. Once under 9 hours. >>> Today it looks like it's running long again. >> 12.38% [xfs] [k] xfs_btree_get_rec >> 11.65% [xfs] [k] _xfs_buf_find >> 11.29% [xfs] [k] xfs_btree_increment >> 7.88% [xfs] [k] xfs_inobt_get_rec >> 5.40% [kernel] [k] intel_idle >> 4.13% [xfs] [k] xfs_btree_get_block >> 4.09% [xfs] [k] xfs_dialloc >> 3.21% [xfs] [k] xfs_btree_readahead >> 2.00% [xfs] [k] xfs_btree_rec_offset >> 1.50% [xfs] [k] xfs_btree_rec_addr >> >> Inode allocation searches, looking for an inode near to the parent >> directory. >> >> Whatthis indicates is that you have lots of sparsely allocated inode >> chunks on disk. i.e. each 64 indoe chunk has some free inodes in it, >> and some used inodes. This is Likely due to random removal of inodes >> as you delete old backups and link counts drop to zero. Because we >> only index inodes on "allocated chunks", finding a chunk that has a >> free inode can be like finding a needle in a haystack. There are >> heuristics used to stop searches from consuming too much CPU, but it >> still can be quite slow when you repeatedly hit those paths.... >> >> I don't have an answer that will magically speed things up for >> you right now... >> >> Cheers, >> >> Dave. From rjohnston@sgi.com Fri Apr 12 13:42:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 272A17CBF for ; Fri, 12 Apr 2013 13:42:21 -0500 (CDT) Received: from xmail.sgi.com (pv-excas1-dc21-nlb.corp.sgi.com [137.38.102.126]) by relay1.corp.sgi.com (Postfix) with ESMTP id CFADA8F8037; Fri, 12 Apr 2013 11:42:17 -0700 (PDT) Received: from [134.15.0.168] (134.15.0.168) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 12 Apr 2013 13:42:17 -0500 Message-ID: <51685552.6030808@sgi.com> Date: Fri, 12 Apr 2013 13:41:22 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120714 Thunderbird/14.0 MIME-Version: 1.0 To: Wang Sheng-Hui CC: Dave Chinner , Dave Chinner , xfstests Subject: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs References: <51678D0D.1070002@gmail.com> <20130412074034.GC30622@dastard> <5168396C.6020801@gmail.com> In-Reply-To: <5168396C.6020801@gmail.com> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [134.15.0.168] On 04/12/2013 11:42 AM, Wang Sheng-Hui wrote: > > Hi Dave, > > I introduces Makefile under tests/, which would return to TESTS_SUBDIRS > with the > $(dir function. By running find in $(shell, TEST_SUBDIRS will only get > the dir names, > and no Makefile. > > Regards, > Sheng-Hui Thanks addressing comments and for v2 of this patch. I still had issues with Makefile which I corrected at commit time. Thanks again for the patch, it has been committed, --Rich Reviewed-by: Rich Johnston commit 2519a97d1083efca79006ba5bd4ddb9f4af65a5e Author: Wang Sheng-Hui Date: Fri Apr 12 04:26:53 2013 +0000 xfstests: make install support common/ and tests/ dirs From david@fromorbit.com Fri Apr 12 19:32:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3C6167CBF for ; Fri, 12 Apr 2013 19:32:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2CC22304043 for ; Fri, 12 Apr 2013 17:32:27 -0700 (PDT) X-ASG-Debug-ID: 1365813145-04cb6c2c1f136470001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id zZUXdQJaGw08E56p for ; Fri, 12 Apr 2013 17:32: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: AokVAKemaFF5LHr4/2dsb2JhbABQgwaDZLkVhRwEAYELF3SCHwEBBSMPASMjEAgDGAICBSECAg8FJQMhE4gTqhiSPBWBDoxXgR0Hgi6BEwOXAZESgx0q Received: from ppp121-44-122-248.lns20.syd6.internode.on.net (HELO dastard) ([121.44.122.248]) by ipmail06.adl2.internode.on.net with ESMTP; 13 Apr 2013 10:02:25 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQoOF-00023D-0D; Sat, 13 Apr 2013 10:32:23 +1000 Date: Sat, 13 Apr 2013 10:32:22 +1000 From: Dave Chinner To: Wang Sheng-Hui Cc: Dave Chinner , Rich Johnston , xfstests Subject: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs Message-ID: <20130413003222.GG30622@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs References: <51678D0D.1070002@gmail.com> <20130412074034.GC30622@dastard> <5168396C.6020801@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <5168396C.6020801@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1365813145 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Apr 13, 2013 at 12:42:20AM +0800, Wang Sheng-Hui wrote: > On 2013å¹´04月12æ—¥ 15:40, Dave Chinner wrote: > >On Fri, Apr 12, 2013 at 12:26:53PM +0800, Wang Sheng-Hui wrote: > >>+# > >>+ > >>+TOPDIR = .. > >>+include $(TOPDIR)/include/builddefs > >>+ > >>+TESTS_SUBDIRS = $(shell find . -maxdepth 1 -type d | sed -n -e 's/\.\///gp') > > > >This is much neater: > > > >TESTS_SUBDIRS = $(sort $(dir $(wildcard $(PWD)/*/))) > > Hi Dave, > > I introduces Makefile under tests/, which would return to TESTS_SUBDIRS with the > $(dir function. By running find in $(shell, TEST_SUBDIRS will only get the dir names, > and no Makefile. I think you misunderstand. The wildcard above only returns directories: $ pwd 0 ~/src/xfstests-dev/tests $ cat ~/tmp/Makefile foo=$(sort $(dir $(wildcard $(PWD)/*/))) default: @echo $(foo) $ make -f ~/tmp/Makefile /home/dave/src/xfstests-dev/tests/btrfs/ /home/dave/src/xfstests-dev/tests/ext4/ /home/dave/src/xfstests-dev/tests/generic/ /home/dave/src/xfstests-dev/tests/shared/ /home/dave/src/xfstests-dev/tests/udf/ /home/dave/src/xfstests-dev/tests/xfs/ $ Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 12 19:38:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0637C7CBF for ; Fri, 12 Apr 2013 19:38:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D4307304043 for ; Fri, 12 Apr 2013 17:38:31 -0700 (PDT) X-ASG-Debug-ID: 1365813510-04bdf02d1f1326d0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id zQHFExJM5PimOujv for ; Fri, 12 Apr 2013 17:38:30 -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: AoMVAOunaFF5LHr4/2dsb2JhbABQgwa8eYUcBAGBCxd0gh8BAQU6HCMQCAMOCgklDwUlAyETiBO8VhWNZYEdB4NBA5cBkRKDHSo Received: from ppp121-44-122-248.lns20.syd6.internode.on.net (HELO dastard) ([121.44.122.248]) by ipmail06.adl2.internode.on.net with ESMTP; 13 Apr 2013 10:08:30 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQoU9-00024H-2S; Sat, 13 Apr 2013 10:38:29 +1000 Date: Sat, 13 Apr 2013 10:38:29 +1000 From: Dave Chinner To: Rich Johnston Cc: Wang Sheng-Hui , Dave Chinner , xfstests Subject: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs Message-ID: <20130413003829.GH30622@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs References: <51678D0D.1070002@gmail.com> <20130412074034.GC30622@dastard> <5168396C.6020801@gmail.com> <51685552.6030808@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <51685552.6030808@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1365813510 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 12, 2013 at 01:41:22PM -0500, Rich Johnston wrote: > On 04/12/2013 11:42 AM, Wang Sheng-Hui wrote: > > > >Hi Dave, > > > >I introduces Makefile under tests/, which would return to TESTS_SUBDIRS > >with the > >$(dir function. By running find in $(shell, TEST_SUBDIRS will only get > >the dir names, > >and no Makefile. > > > >Regards, > >Sheng-Hui > > Thanks addressing comments and for v2 of this patch. > > I still had issues with Makefile which I corrected at commit time. > > Thanks again for the patch, it has been committed, Rich, it's great that you are picking this stuff up quickly, but as I asked recently, please don't commit patches while there is still an active review conversation going on.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 12 19:45:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CC60C29DFE for ; Fri, 12 Apr 2013 19:45:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD08C8F8040 for ; Fri, 12 Apr 2013 17:45:16 -0700 (PDT) X-ASG-Debug-ID: 1365813914-04cb6c6e2b128f0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id wufc2RtKjUsCt76F for ; Fri, 12 Apr 2013 17:45:15 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoMVABaqaFF5LHr4/2dsb2JhbABQDoJ4vHmFHAQBgQwXdIIfAQEFOhwjEAgDDgoJJQ8FJQMhE4gTvFIVjTcugR0Hg0EDkzaDS4l5hxmCTFEq Received: from ppp121-44-122-248.lns20.syd6.internode.on.net (HELO dastard) ([121.44.122.248]) by ipmail06.adl2.internode.on.net with ESMTP; 13 Apr 2013 10:15:13 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UQoaf-00025P-03; Sat, 13 Apr 2013 10:45:13 +1000 Date: Sat, 13 Apr 2013 10:45:12 +1000 From: Dave Chinner To: Dave Hall Cc: stan@hardwarefreak.com, "xfs@oss.sgi.com" Subject: Re: xfs_fsr, sunit, and swidth Message-ID: <20130413004512.GI30622@dastard> X-ASG-Orig-Subj: Re: xfs_fsr, sunit, and swidth References: <5142AE40.6040408@hardwarefreak.com> <20130315114538.GF6369@dastard> <5143F94C.1020708@hardwarefreak.com> <20130316072126.GG6369@dastard> <515082C3.2000006@binghamton.edu> <515361B5.8050603@hardwarefreak.com> <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> <515C3BF3.60601@binghamton.edu> <51684382.50008@binghamton.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <51684382.50008@binghamton.edu> 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: 1365813914 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 12, 2013 at 01:25:22PM -0400, Dave Hall wrote: > Stan, > > IDid this post get lost in the shuffle? Looking at it I think it > could have been a bit unclear. What I need to do anyways is have a > second, off-site copy of my backup data. So I'm going to be > building a second array. In copying, in order to preserve the hard > link structure of the source array I'd have to run a sequence of cp > -al / rsync calls that would mimic what rsnapshot did to get me to > where I am right now. (Note that I could also potentially use rsync > --link-dest.) > So the question is how would the target xfs file system fare as far > as my inode fragmentation situation is concerned? I'm hoping that > since the target would be a fresh file system, and since during the > 'copy' phase I'd only be adding inodes, that the inode allocation > would be more compact and orderly than what I have on the source > array since. What do you think? Sure, it would be to start with, but you'll eventually end up in the same place. Removing links from the forest is what leads to the sparse free inode space, so even starting with a dense inode allocation pattern, it'll turn sparse the moment you remove backups from the forest.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Fri Apr 12 19:51:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 77A627CBF for ; Fri, 12 Apr 2013 19:51:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 625488F8040 for ; Fri, 12 Apr 2013 17:51:16 -0700 (PDT) X-ASG-Debug-ID: 1365814275-04cb6c2c1f1378d0001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id OhMrsB7T6zudwmin for ; Fri, 12 Apr 2013 17:51:15 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 2DE606C052; Fri, 12 Apr 2013 19:51:15 -0500 (CDT) Message-ID: <5168AC0B.5010100@hardwarefreak.com> Date: Fri, 12 Apr 2013 19:51:23 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Dave Hall CC: "xfs@oss.sgi.com" Subject: Re: xfs_fsr, sunit, and swidth References: <5141C1FC.4060209@hardwarefreak.com> <5141C8C1.2080903@hardwarefreak.com> <5141E5CF.10101@binghamton.edu> <5142AE40.6040408@hardwarefreak.com> <20130315114538.GF6369@dastard> <5143F94C.1020708@hardwarefreak.com> <20130316072126.GG6369@dastard> <515082C3.2000006@binghamton.edu> <515361B5.8050603@hardwarefreak.com> <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> <515C3BF3.60601@binghamton.edu> <51684382.50008@binghamton.edu> X-ASG-Orig-Subj: Re: xfs_fsr, sunit, and swidth In-Reply-To: <51684382.50008@binghamton.edu> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1365814275 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 4/12/2013 12:25 PM, Dave Hall wrote: > Stan, > > IDid this post get lost in the shuffle? Looking at it I think it could > have been a bit unclear. What I need to do anyways is have a second, > off-site copy of my backup data. So I'm going to be building a second > array. In copying, in order to preserve the hard link structure of the > source array I'd have to run a sequence of cp -al / rsync calls that > would mimic what rsnapshot did to get me to where I am right now. (Note > that I could also potentially use rsync --link-dest.) > > So the question is how would the target xfs file system fare as far as > my inode fragmentation situation is concerned? I'm hoping that since > the target would be a fresh file system, and since during the 'copy' > phase I'd only be adding inodes, that the inode allocation would be more > compact and orderly than what I have on the source array since. What do > you think? The question isn't what it will look like initially, as your inodes shouldn't be sparsely allocated as with your current aged filesystem. The question is how quickly the problem will arise on the new filesystem as you free inodes. I don't have the answer to that question. There's no way to predict this that I know of. -- Stan > Thanks. > > -Dave > > Dave Hall > Binghamton University > kdhall@binghamton.edu > 607-760-2328 (Cell) > 607-777-4641 (Office) > > > On 04/03/2013 10:25 AM, Dave Hall wrote: >> So, assuming entropy has reached critical mass and that there is no >> easy fix for this physical file system, what would happen if I >> replicated this data to a new disk array? When I say 'replicate', I'm >> not talking about xfs_dump. I'm talking about running a series of cp >> -al/rsync operations (or maybe rsync with --link-dest) that will >> precisely reproduce the linked data on my current array. All of the >> inodes would be re-allocated. There wouldn't be any (or at least not >> many) deletes. >> >> I am hoping that if I do this the inode fragmentation will be >> significantly reduced on the target as compared to the source. Of >> course over time it may re-fragment, but with two arrays I can always >> wipe one and reload it. >> >> -Dave >> >> Dave Hall >> Binghamton University >> kdhall@binghamton.edu >> 607-760-2328 (Cell) >> 607-777-4641 (Office) >> >> >> On 03/30/2013 09:22 PM, Dave Chinner wrote: >>> On Fri, Mar 29, 2013 at 03:59:46PM -0400, Dave Hall wrote: >>>> Dave, Stan, >>>> >>>> Here is the link for perf top -U: http://pastebin.com/JYLXYWki. >>>> The ag report is at http://pastebin.com/VzziSa4L. Interestingly, >>>> the backups ran fast a couple times this week. Once under 9 hours. >>>> Today it looks like it's running long again. >>> 12.38% [xfs] [k] xfs_btree_get_rec >>> 11.65% [xfs] [k] _xfs_buf_find >>> 11.29% [xfs] [k] xfs_btree_increment >>> 7.88% [xfs] [k] xfs_inobt_get_rec >>> 5.40% [kernel] [k] intel_idle >>> 4.13% [xfs] [k] xfs_btree_get_block >>> 4.09% [xfs] [k] xfs_dialloc >>> 3.21% [xfs] [k] xfs_btree_readahead >>> 2.00% [xfs] [k] xfs_btree_rec_offset >>> 1.50% [xfs] [k] xfs_btree_rec_addr >>> >>> Inode allocation searches, looking for an inode near to the parent >>> directory. >>> >>> Whatthis indicates is that you have lots of sparsely allocated inode >>> chunks on disk. i.e. each 64 indoe chunk has some free inodes in it, >>> and some used inodes. This is Likely due to random removal of inodes >>> as you delete old backups and link counts drop to zero. Because we >>> only index inodes on "allocated chunks", finding a chunk that has a >>> free inode can be like finding a needle in a haystack. There are >>> heuristics used to stop searches from consuming too much CPU, but it >>> still can be quite slow when you repeatedly hit those paths.... >>> >>> I don't have an answer that will magically speed things up for >>> you right now... >>> >>> Cheers, >>> >>> Dave. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From cj059@mail85.com Fri Apr 12 23:57:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0ABB67CBF for ; Fri, 12 Apr 2013 23:57:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D526C304032 for ; Fri, 12 Apr 2013 21:57:00 -0700 (PDT) X-ASG-Debug-ID: 1365829015-04cbb057f8141630001-NocioJ Received: from mail.mail85.com ([114.66.192.19]) by cuda.sgi.com with ESMTP id JtL8nB6fWAhKbBs4 for ; Fri, 12 Apr 2013 21:56:57 -0700 (PDT) X-Barracuda-Envelope-From: cj059@mail85.com X-Barracuda-Apparent-Source-IP: 114.66.192.19 Received: from vip.sina.com by mail.mail85.com (MDaemon PRO v10.1.1) with ESMTP id md50001376249.msg for ; Sat, 13 Apr 2013 12:56:52 +0800 X-MDPtrLookup-Result: hardfail ip=218.11.57.41 (no PTR records found) (mail.mail85.com) X-MDHeloLookup-Result: hardfail smtp.helo=vip.sina.com (does not match 218.11.57.41) (mail.mail85.com) X-Authenticated-Sender: cj059@mail85.com X-MDRemoteIP: 218.11.57.41 X-Return-Path: cj059@mail85.com X-Envelope-From: cj059@mail85.com X-MDaemon-Deliver-To: xfs@oss.sgi.com Reply-To: Sender: cj059@mail85.com Date: Sat, 13 Apr 2013 12:56:36 +0800 From: "Elton" To: , Subject: For rare earth metal products business Message-ID: <20130413125643363525@mail85.com> X-ASG-Orig-Subj: For rare earth metal products business X-Priority: 1 (Highest) X-mailer: Foxmail 6, 13, 102, 15 [cn] Disposition-Notification-To: info@cnztwy.com Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="=====003_Dragon370210372217_=====" X-Barracuda-Connect: UNKNOWN[114.66.192.19] X-Barracuda-Start-Time: 1365829015 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. --=====003_Dragon370210372217_===== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 RGVhciBzaXIsDQpXZSBhcmUgcHJvZmVzc2lvbmFsIG1hbnVmYWN0dXJlIG9mIGtpbmRzIG1ldGFs IHByb2R1Y3RzLHdlIGFyZSBtYWlubHkgaW52b2x2ZWQgaW4gTm9uLWZlcnJvIG1ldGFscyBSYXJl IGVhcnRoIG1hdGVyaWFscyBhbmQgc29tZSBNZXRhbCBzY3JhcHMuDQpJZiB5b3UgYXJlIGludGVy ZXN0ZWQgaW4gYW55IGtpbmQgcHJvZHVjdHMgaW4gb3VyIGZpZWxkLCBwbGVhc2UgZmVlbCBmcmVl IHRvIGNvbnRhY3QgbWUuDQpKSU5BTiBaSElURU5HV0VJWUUgSU1QT1JUICYgRVhQT1JUIENPLixM VEQNCnd3dy5jbnp0d3kuY29tDQpXaXRoIFJlZ2FyZHM= --=====003_Dragon370210372217_===== Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIg aHR0cC1lcXVpdj1Db250ZW50LVR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC42MDAxLjIzMTgxIj48L0hFQUQ+DQo8Qk9EWT48Rk9OVCBmYWNlPSJUaW1lcyBO ZXcgUm9tYW4iPg0KPERJVj4NCjxESVY+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9 kzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tYmlkaS1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9u dC1rZXJuaW5nOiAwcHQiIA0KbGFuZz1FTi1VUz48Rk9OVCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4i Pg0KPERJVj48Rk9OVCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPjxGT05UIGZhY2U9IlRpbWVzIE5l dyBSb21hbiI+DQo8RElWPg0KPFAgc3R5bGU9Ik1BUkdJTi1UT1A6IDBwdDsgTUFSR0lOLUJPVFRP TTogMHB0IiBjbGFzcz1wMD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJ1RpbWVzIE5ldyBS b21hbic7IEZPTlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICd5ZXMnIj5EZWFyJm5ic3A7 c2lyLDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJ1RpbWVzIE5ldyBSb21hbic7 IEZPTlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICd5ZXMnIj48bzpwPjwvbzpwPjwvU1BB Tj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLVRPUDogMHB0OyBNQVJHSU4tQk9UVE9NOiAwcHQiIGNs YXNzPXAwPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAnVGltZXMgTmV3IFJvbWFuJzsgRk9O VC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1bjogJ3llcyciPldlJm5ic3A7YXJlJm5ic3A7cHJv ZmVzc2lvbmFsJm5ic3A7bWFudWZhY3R1cmUmbmJzcDtvZiZuYnNwO2tpbmRzJm5ic3A7bWV0YWwm bmJzcDtwcm9kdWN0cyx3ZSZuYnNwO2FyZSZuYnNwO21haW5seSZuYnNwO2ludm9sdmVkJm5ic3A7 aW4mbmJzcDtOb24tZmVycm8gDQptZXRhbHMgDQpSYXJlJm5ic3A7ZWFydGgmbmJzcDttYXRlcmlh bHMmbmJzcDthbmQmbmJzcDtzb21lJm5ic3A7TWV0YWwmbmJzcDtzY3JhcHMuPC9TUEFOPjxTUEFO IA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAnVGltZXMgTmV3IFJvbWFuJzsgRk9OVC1TSVpFOiAxMC41 cHQ7IG1zby1zcGFjZXJ1bjogJ3llcyciPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxl PSJNQVJHSU4tVE9QOiAwcHQ7IE1BUkdJTi1CT1RUT006IDBwdCIgY2xhc3M9cDA+PFNQQU4gDQpz dHlsZT0iRk9OVC1GQU1JTFk6ICdUaW1lcyBOZXcgUm9tYW4nOyBGT05ULVNJWkU6IDEwLjVwdDsg bXNvLXNwYWNlcnVuOiAneWVzJyI+SWYmbmJzcDt5b3UmbmJzcDthcmUmbmJzcDtpbnRlcmVzdGVk Jm5ic3A7aW4mbmJzcDthbnkmbmJzcDtraW5kJm5ic3A7cHJvZHVjdHMmbmJzcDtpbiZuYnNwO291 ciZuYnNwO2ZpZWxkLCZuYnNwO3BsZWFzZSZuYnNwO2ZlZWwmbmJzcDtmcmVlJm5ic3A7dG8mbmJz cDtjb250YWN0Jm5ic3A7bWUuPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU4tVE9QOiAwcHQ7 IE1BUkdJTi1CT1RUT006IDBwdCIgY2xhc3M9cDA+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 ICdUaW1lcyBOZXcgUm9tYW4nOyBGT05ULVNJWkU6IDEwLjVwdDsgbXNvLXNwYWNlcnVuOiAneWVz JyI+SklOQU4gDQpaSElURU5HV0VJWUUgSU1QT1JUICZhbXA7IEVYUE9SVCBDTy4sTFREPC9TUEFO PjwvUD4NCjxQIHN0eWxlPSJNQVJHSU4tVE9QOiAwcHQ7IE1BUkdJTi1CT1RUT006IDBwdCIgY2xh c3M9cDA+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICdUaW1lcyBOZXcgUm9tYW4nOyBGT05U LVNJWkU6IDEwLjVwdDsgbXNvLXNwYWNlcnVuOiAneWVzJyI+d3d3LmNuenR3eS5jb208L1NQQU4+ PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTi1UT1A6IDBwdDsgTUFSR0lOLUJPVFRPTTogMHB0IiBjbGFz cz1wMD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJ1RpbWVzIE5ldyBSb21hbic7IEZPTlQt U0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICd5ZXMnIj48L1NQQU4+PFNQQU4gDQpzdHlsZT0i Rk9OVC1GQU1JTFk6ICdUaW1lcyBOZXcgUm9tYW4nOyBGT05ULVNJWkU6IDEwLjVwdDsgbXNvLXNw YWNlcnVuOiAneWVzJyI+V2l0aCZuYnNwO1JlZ2FyZHM8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9O VC1GQU1JTFk6ICdUaW1lcyBOZXcgUm9tYW4nOyBGT05ULVNJWkU6IDEwLjVwdDsgbXNvLXNwYWNl cnVuOiAneWVzJyI+PG86cD48L286cD48L1NQQU4+PC9QPjwhLS1FbmRGcmFnbWVudC0tPjwvRElW PjwvRk9OVD48L0ZPTlQ+PC9ESVY+PC9GT05UPjwvU1BBTj48L0RJVj48L0RJVj48L0ZPTlQ+PC9C T0RZPjwvSFRNTD4NCg== --=====003_Dragon370210372217_=====-- From mlsemon35@gmail.com Sat Apr 13 00:04:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5D8267CBF for ; Sat, 13 Apr 2013 00:04:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5AE3AC004 for ; Fri, 12 Apr 2013 22:04:06 -0700 (PDT) X-ASG-Debug-ID: 1365829441-04cb6c2c1f146d40001-NocioJ Received: from mail-yh0-f49.google.com (mail-yh0-f49.google.com [209.85.213.49]) by cuda.sgi.com with ESMTP id s8OrttaKLH8doGZb (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 12 Apr 2013 22:04:01 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.49 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.49] Received: by mail-yh0-f49.google.com with SMTP id i72so339551yha.36 for ; Fri, 12 Apr 2013 22:04:01 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.49] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.49] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=xwluGndYx/XAV37/j5DvyUE9XxGtECweKMRVmGhTHb0=; b=gW/7ABBn7KsT4JgzvQ6eV5motDjFhUJ2cDK3s18vHFFrAxpfPeNAyb/czfGg2H6QO0 z/XX4qmKCn7YyeJ6sf4A8rebxMF1V2RglTf+/vzFIKOuZU435xGyygw6avwlgRbyS+6U G/doCC+M4Nl9ywlLCj8icqlNwFx5FPqWBKy8GzGSA3R6XQ3Ul31ehAPKIaMCZKyjBWWq QzhrMJiENN6RKiR84mTlQANq+oHJxNtSl/cywh0wHEnsZbge7PePTwftpWCwzfU3oxjB c7Uw/95WMdeWsWeLpHqm+niM2Xh0ZgzHaUY7qBpT621z0/l8nGUSr33mGIbEOc1YybaD htdg== X-Received: by 10.236.199.78 with SMTP id w54mr8376186yhn.101.1365829441293; Fri, 12 Apr 2013 22:04:01 -0700 (PDT) Received: from [192.168.0.139] (rrcs-97-78-60-146.se.biz.rr.com. [97.78.60.146]) by mx.google.com with ESMTPS id u33sm16079775yhn.7.2013.04.12.22.04.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 12 Apr 2013 22:04:00 -0700 (PDT) Message-ID: <5168E73A.50408@gmail.com> Date: Sat, 13 Apr 2013 01:03:54 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Jeff Liu CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: fix s_max_bytes to MAX_LFS_FILESIZE if needed References: <5167E160.3020800@oracle.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix s_max_bytes to MAX_LFS_FILESIZE if needed In-Reply-To: <5167E160.3020800@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-yh0-f49.google.com[209.85.213.49] X-Barracuda-Start-Time: 1365829441 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email I'll have to test this yet more, but preliminary results on a patched 3.9-rc6-git-sgi-dave-crc kernel look good: These were done on a 32-bit Pentium 4, BTW: generic/308, in order of testing... [F/F] CONFIG_LBDAF=n, without Liu MAX_LFS_FILESIZE patch: PASS [T/F] CONFIG_LBDAF=y, without Liu patch: HANG, possible FS corruption [T/T] CONFIG_LBDAF=y, with Liu patch: PASS [F/T] CONFIG_LBDAF=n, with Liu patch: PASS It was a surprise that the F/F case passed because it is somewhat in conflict with your write-up. This will have to be tested more, though, on the original testing hardware, with the original generic/308, so it's not a full conflict yet. The patch was first tested after the [T/F] case above, without creating a new XFS filesystem first, and I got a soft oops (captured) and had to do a SysRq reboot. Attempts to mount the partition again led to another oops (not captured). Tests on a new XFS filesystem came out fine. This means I'll have to look at the aftermath of generic/308 a little bit more, and report on it, too. Good job so far! Michael [ 163.479270] ------------[ cut here ]------------ [ 163.480027] kernel BUG at fs/xfs/xfs_message.c:100! [ 163.480027] invalid opcode: 0000 [#1] [ 163.480027] Pid: 1039, comm: rm Not tainted 3.9.0-rc6+ #3 Dell Computer Corporation Dimension 2350/07W080 [ 163.480027] EIP: 0060:[] EFLAGS: 00010292 CPU: 0 [ 163.480027] EIP is at assfail+0x2b/0x2d [ 163.480027] EAX: 00000057 EBX: ed2c2c80 ECX: 00000000 EDX: c16fe980 [ 163.480027] ESI: ecdcac00 EDI: 00000001 EBP: ea45deb4 ESP: ea45dea0 [ 163.480027] DS: 007b ES: 007b FS: 0000 GS: 00e0 SS: 0068 [ 163.480027] CR0: 8005003b CR2: b765c000 CR3: 2ae8c000 CR4: 000007d0 [ 163.480027] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 163.480027] DR6: ffff0ff0 DR7: 00000400 [ 163.480027] Process rm (pid: 1039, ti=ea45c000 task=eaca9810 task.ti=ea45c000) [ 163.480027] Stack: [ 163.480027] 00000000 c167ee3c c166f028 c166efaa 00000159 ea45def0 c11b157b 00000000 [ 163.480027] 00000000 00000002 ea45def0 c118f229 00000000 ecad3000 ed2c2c80 ed2c2db8 [ 163.480027] ea45def0 ee9cee10 ed2c2c80 ed2c2db8 ea45df04 c11aeb59 ed2c2db8 c154b760 [ 163.480027] Call Trace: [ 163.480027] [] xfs_inactive+0x3d6/0x4ea [ 163.480027] [] ? ftrace_raw_event_xfs_inode_class+0x88/0x90 [ 163.480027] [] xfs_fs_evict_inode+0x6c/0x8f [ 163.480027] [] evict+0x7a/0x148 [ 163.480027] [] iput+0xcd/0x129 [ 163.480027] [] do_unlinkat+0x121/0x177 [ 163.480027] [] sys_unlinkat+0x23/0x34 [ 163.480027] [] sysenter_do_call+0x12/0x22 [ 163.480027] Code: 55 89 e5 83 ec 14 3e 8d 74 26 00 89 4c 24 10 89 54 24 0c 89 44 24 08 c7 44 24 04 3c ee 67 c1 c7 04 24 00 00 00 00 e8 e9 fd ff ff <0f> 0b 55 89 e5 83 ec 14 3e 8d 74 26 00 c7 44 24 10 01 00 00 00 [ 163.480027] EIP: [] assfail+0x2b/0x2d SS:ESP 0068:ea45dea0 [ 163.514560] ---[ end trace 2a80fb79142bf578 ]--- Message from syslogd@plbearer at Fri Apr 12 23:23:10 2013 ... plbearer kernel: [ 163.478205] XFS: Assertion failed: ip->i_d.di_nextents == 0, file: fs/xfs/xfs_vnodeops.c, line: 345 Message from syslogd@plbearer at Fri Apr 12 23:23:10 2013 ... plbearer kernel: [ 163.480027] EIP: [] assfail+0x2b/0x2d SS:ESP 0068:ea45dea0 Message from syslogd@plbearer at Fri Apr 12 23:23:10 2013 ... plbearer kernel: [ 163.480027] Code: 55 89 e5 83 ec 14 3e 8d 74 26 00 89 4c 24 10 89 54 24 0c 89 44 24 08 c7 44 24 04 3c ee 67 c1 c7 04 24 00 00 00 00 e8 e9 fd ff ff <0f> 0b 55 89 e5 83 ec 14 3e 8d 74 26 00 c7 44 24 10 01 00 00 00 Message from syslogd@plbearer at Fri Apr 12 23:23:10 2013 ... plbearer kernel: [ 163.480027] Call Trace: Message from syslogd@plbearer at Fri Apr 12 23:23:10 2013 ... plbearer kernel: [ 163.480027] Stack: Message from syslogd@plbearer at Fri Apr 12 23:23:10 2013 ... plbearer kernel: [ 163.480027] Process rm (pid: 1039, ti=ea45c000 task=eaca9810 task.ti=ea45c000) - output mismatch (see /usr/src/xfs/xfstests/results/generic/308.out.bad) --- tests/generic/308.out 2013-04-05 16:00:27.879187036 -0400 +++ /usr/src/xfs/xfstests/results/generic/308.out.bad 2013-04-12 23:23:10.528872994 -0400 @@ -1,2 +1,3 @@ QA output created by 308 Silence is golden +./tests/generic/308: line 33: 1039 Segmentation fault exit ... (Run 'diff -u tests/generic/308.out /usr/src/xfs/xfstests/results/generic/308.out.bad' to see the entire diff) umount: /tests/testdir: target is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) _check_xfs_filesystem: filesystem on /dev/sda5 is inconsistent (c) (see /usr/src/xfs/xfstests/results/generic/308.full) _check_xfs_filesystem: filesystem on /dev/sda5 is inconsistent (r) (see /usr/src/xfs/xfstests/results/generic/308.full) Ran: generic/308 Failures: generic/308 Failed 1 of 1 tests On 04/12/2013 06:26 AM, Jeff Liu wrote: > From: Jie Liu > > On 32-bit machine, the s_maxbytes is larger than the MAX_LFS_FILESIZE limits if CONFIG_LBDAF is > not enabled. Hence it's possible to create a huge file via buffered-IO write with a given offset > beyond this limitation. e.g. > > # block_size=4096 > # offset=$(((2**32 - 1) * $block_size)) > # xfs_io -f -c "pwrite $offset $block_size" /storage/test_file > > In this case, xfs_io will hang at the page writeback stage soon since the given offset would > cause an overflow at xfs_vm_writepage(): > > end_index = offset >> PAGE_CACHE_SHIFT; > last_index = (offset - 1) >> PAGE_CACHE_SHIFT; > if (page->index >= end_index) { > unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); > > /* > * Just skip the page if it is fully outside i_size, e.g. due > * to a truncate operation that is in progress. > */ > if (page->index >= end_index + 1 || offset_into_page == 0) { > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > unlock_page(page); > return 0; > } > end_index is unsigned long so that the max value is '2^32-1 = 4294967295', and it > would be evaluated to the max value with the given offset(when writing the page offset > up to s_max_bytes) for above test case. As a result, (page->index >= end_index + 1) is > ok as (end_index + 1) is overflowed to ZERO. > > Actually, create a file as above on 32-bit machine should be failed with EFBIG error returned > because there has strict check up at generic_write_checks() against the given offset with a > *correct* s_max_bytes. > > This patch fix the s_max_bytes to MAX_LFS_FILESIZE if the pre-calculated value is greater > than it. > > Reported-by: Michael L. Semon > Signed-off-by: Jie Liu > > --- > fs/xfs/xfs_super.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index ea341ce..0644d61 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -585,6 +585,7 @@ xfs_max_file_offset( > { > unsigned int pagefactor = 1; > unsigned int bitshift = BITS_PER_LONG - 1; > + __uint64_t offset; > > /* Figure out maximum filesize, on Linux this can depend on > * the filesystem blocksize (on 32 bit platforms). > @@ -610,7 +611,10 @@ xfs_max_file_offset( > # endif > #endif > > - return (((__uint64_t)pagefactor) << bitshift) - 1; > + offset = (((__uint64_t)pagefactor) << bitshift) - 1; > + > + /* Check against VM & VFS exposed limits */ > + return (offset > MAX_LFS_FILESIZE) ? MAX_LFS_FILESIZE : offset; > } > > xfs_agnumber_t > From shhuiw@gmail.com Sat Apr 13 05:19:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F1E757F37 for ; Sat, 13 Apr 2013 05:18:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DC86C8F808E for ; Sat, 13 Apr 2013 03:18:56 -0700 (PDT) X-ASG-Debug-ID: 1365848332-04cb6c2c1f158e10001-NocioJ Received: from mail-ia0-f181.google.com (mail-ia0-f181.google.com [209.85.210.181]) by cuda.sgi.com with ESMTP id FjXtgeXEdENsuV64 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 13 Apr 2013 03:18:52 -0700 (PDT) X-Barracuda-Envelope-From: shhuiw@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.181] Received: by mail-ia0-f181.google.com with SMTP id y25so2103314iay.26 for ; Sat, 13 Apr 2013 03:18:52 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=Fkjsl+Hx9ngdYwcfXYUf5PIFn8akhfTg51enNFHdPis=; b=iGrau4RdOSiEh4zmDDKRfNCU7bWy7ZcMcCkHqt/E6yLXNyuu/2mmep6ngPoV2FWG+w uDn4RayhcuFV7AHaHnpg/cBXD2H1mwHB9if5dFg8iZwmu2NC+9o+FA6xrsAjhsvWsIzp PGAI2USYbettTlk7VUE/dKmVgDhN+hUDhSw96dFh0Damn67iw7brDZIgY5fXOpGdyzpw yOdA3pLzFnpgFvEFA0Rs7KdZsn4njzcchJRz0xe5GFVAe3O9EmiUwgrKjHSloP/+segd D2btaeqLY96+a70g4KUvmzOQjbePtQkB+jc1FDrC35TzA1JX2RFacUPxga4OLi5vQ8Wr kmsg== X-Received: by 10.50.13.228 with SMTP id k4mr1234705igc.30.1365848332563; Sat, 13 Apr 2013 03:18:52 -0700 (PDT) Received: from [192.168.1.104] ([122.70.5.192]) by mx.google.com with ESMTPS id a3sm2550262igq.5.2013.04.13.03.18.50 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 13 Apr 2013 03:18:52 -0700 (PDT) Message-ID: <51693104.2020707@gmail.com> Date: Sat, 13 Apr 2013 18:18:44 +0800 From: Wang Sheng-Hui User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: Dave Chinner , Rich Johnston , xfstests Subject: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs References: <51678D0D.1070002@gmail.com> <20130412074034.GC30622@dastard> <5168396C.6020801@gmail.com> <20130413003222.GG30622@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs In-Reply-To: <20130413003222.GG30622@dastard> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-ia0-f181.google.com[209.85.210.181] X-Barracuda-Start-Time: 1365848332 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127991 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 2013å¹´04月13æ—¥ 08:32, Dave Chinner wrote: > On Sat, Apr 13, 2013 at 12:42:20AM +0800, Wang Sheng-Hui wrote: >> On 2013å¹´04月12æ—¥ 15:40, Dave Chinner wrote: >>> On Fri, Apr 12, 2013 at 12:26:53PM +0800, Wang Sheng-Hui wrote: >>>> +# >>>> + >>>> +TOPDIR = .. >>>> +include $(TOPDIR)/include/builddefs >>>> + >>>> +TESTS_SUBDIRS = $(shell find . -maxdepth 1 -type d | sed -n -e 's/\.\///gp') >>> >>> This is much neater: >>> >>> TESTS_SUBDIRS = $(sort $(dir $(wildcard $(PWD)/*/))) >> >> Hi Dave, >> >> I introduces Makefile under tests/, which would return to TESTS_SUBDIRS with the >> $(dir function. By running find in $(shell, TEST_SUBDIRS will only get the dir names, >> and no Makefile. > > I think you misunderstand. The wildcard above only returns > directories: > > $ pwd > 0 ~/src/xfstests-dev/tests > $ cat ~/tmp/Makefile > foo=$(sort $(dir $(wildcard $(PWD)/*/))) > > default: > @echo $(foo) > $ make -f ~/tmp/Makefile > /home/dave/src/xfstests-dev/tests/btrfs/ /home/dave/src/xfstests-dev/tests/ext4/ /home/dave/src/xfstests-dev/tests/generic/ /home/dave/src/xfstests-dev/tests/shared/ /home/dave/src/xfstests-dev/tests/udf/ /home/dave/src/xfstests-dev/tests/xfs/ > $ > Dave, The output on my box is different with yours. # pwd /root/workspace/xfstests/tests # cat /tmp/Makefile foo=$(sort $(dir $(wildcard $(PWD)/*/))) foo: @echo $(foo) # make -f /tmp/Makefile foo /root/workspace/xfstests/tests/ /root/workspace/xfstests/tests/btrfs/ /root/workspace/xfstests/tests/ext4/ /root/workspace/xfstests/tests/generic/ /root/workspace/xfstests/tests/shared/ /root/workspace/xfstests/tests/udf/ /root/workspace/xfstests/tests/xfs/ It always output the tests/ dir itself. If I used this for xfstests 'make install', it will fall into endless loop, for it will rerun Makefile under /tests. > Cheers, > > Dave. > From shhuiw@gmail.com Sat Apr 13 05:37:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 97E987F37 for ; Sat, 13 Apr 2013 05: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 64A938F809B for ; Sat, 13 Apr 2013 03:37:59 -0700 (PDT) X-ASG-Debug-ID: 1365849475-04bdf02d20155390001-NocioJ Received: from mail-pb0-f54.google.com (mail-pb0-f54.google.com [209.85.160.54]) by cuda.sgi.com with ESMTP id dHovgK9NOX7sW40f (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 13 Apr 2013 03:37:55 -0700 (PDT) X-Barracuda-Envelope-From: shhuiw@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.54 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.54] Received: by mail-pb0-f54.google.com with SMTP id xa7so1805851pbc.13 for ; Sat, 13 Apr 2013 03:37:55 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.54] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.54] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=kDLR1tA+SN6qj/+A31ZY1KfTgxjb0u4diJQQ8GaevqI=; b=QX2+yMqV+MkLpKkxeBM8m/ajp7qbFAPWxBp53si2OXAOHvdDciKAX8RL2c+HxODdYB MsTUmk4xYFA0RAKXUHjzIhlX/1ZGIqPmWeNvKRzhVvl+d+jsMny0RWXKs5BMOSYFsjrY cKyAceLOisfzIfuMYMJaY/LtiZeedXe8UJvXwnTY2V2hRTcL4XwMiCW5D1R25/W6nQDt bu2xazb6s0kO+KPKfrS9eot1OMdt+34Eex5CWam1ft14LOCcaXkrQHnfBDsq9aXhofPq wghjpjmzunxLo0EXbcUDcbl2XwxxfNAHm/tdgyrgXSYMCZSYaYjefm2tGER45xbcvdAQ 6noA== X-Received: by 10.69.0.226 with SMTP id bb2mr1459768pbd.34.1365849475006; Sat, 13 Apr 2013 03:37:55 -0700 (PDT) Received: from [192.168.1.104] ([122.70.5.192]) by mx.google.com with ESMTPS id dg5sm12147678pbc.29.2013.04.13.03.37.52 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 13 Apr 2013 03:37:54 -0700 (PDT) Message-ID: <51693569.4030301@gmail.com> Date: Sat, 13 Apr 2013 18:37:29 +0800 From: Wang Sheng-Hui User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner CC: Dave Chinner , Rich Johnston , xfstests Subject: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs References: <51678D0D.1070002@gmail.com> <20130412074034.GC30622@dastard> <5168396C.6020801@gmail.com> <20130413003222.GG30622@dastard> <51693104.2020707@gmail.com> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs In-Reply-To: <51693104.2020707@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-pb0-f54.google.com[209.85.160.54] X-Barracuda-Start-Time: 1365849475 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.127991 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 2013å¹´04月13æ—¥ 18:18, Wang Sheng-Hui wrote: > On 2013å¹´04月13æ—¥ 08:32, Dave Chinner wrote: >> On Sat, Apr 13, 2013 at 12:42:20AM +0800, Wang Sheng-Hui wrote: >>> On 2013å¹´04月12æ—¥ 15:40, Dave Chinner wrote: >>>> On Fri, Apr 12, 2013 at 12:26:53PM +0800, Wang Sheng-Hui wrote: >>>>> +# >>>>> + >>>>> +TOPDIR = .. >>>>> +include $(TOPDIR)/include/builddefs >>>>> + >>>>> +TESTS_SUBDIRS = $(shell find . -maxdepth 1 -type d | sed -n -e 's/\.\///gp') >>>> >>>> This is much neater: >>>> >>>> TESTS_SUBDIRS = $(sort $(dir $(wildcard $(PWD)/*/))) >>> >>> Hi Dave, >>> >>> I introduces Makefile under tests/, which would return to TESTS_SUBDIRS with the >>> $(dir function. By running find in $(shell, TEST_SUBDIRS will only get the dir names, >>> and no Makefile. >> >> I think you misunderstand. The wildcard above only returns >> directories: >> >> $ pwd >> 0 ~/src/xfstests-dev/tests >> $ cat ~/tmp/Makefile >> foo=$(sort $(dir $(wildcard $(PWD)/*/))) >> >> default: >> @echo $(foo) >> $ make -f ~/tmp/Makefile >> /home/dave/src/xfstests-dev/tests/btrfs/ /home/dave/src/xfstests-dev/tests/ext4/ /home/dave/src/xfstests-dev/tests/generic/ /home/dave/src/xfstests-dev/tests/shared/ /home/dave/src/xfstests-dev/tests/udf/ /home/dave/src/xfstests-dev/tests/xfs/ >> $ >> > > Dave, > > The output on my box is different with yours. > > # pwd > /root/workspace/xfstests/tests > # cat /tmp/Makefile > foo=$(sort $(dir $(wildcard $(PWD)/*/))) > foo: > @echo $(foo) > # make -f /tmp/Makefile foo > /root/workspace/xfstests/tests/ /root/workspace/xfstests/tests/btrfs/ /root/workspace/xfstests/tests/ext4/ /root/workspace/xfstests/tests/generic/ /root/workspace/xfstests/tests/shared/ /root/workspace/xfstests/tests/udf/ /root/workspace/xfstests/tests/xfs/ > > It always output the tests/ dir itself. If I used this for xfstests > 'make install', it will fall into endless loop, for it will rerun > Makefile under /tests. > >> Cheers, >> >> Dave. >> > Seems it's the $(PWD) introduces the loop. When make install under xfstests, $(PWD) will refer to the path to xfstests instead of xfstests/tests, even if is defined in xfstests/tests/Makefile. Will send out the v3 patch later. Regards, Sheng-Hui From shhuiw@gmail.com Sat Apr 13 05:48:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1464E7F37 for ; Sat, 13 Apr 2013 05:48:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C25558F8037 for ; Sat, 13 Apr 2013 03:48:31 -0700 (PDT) X-ASG-Debug-ID: 1365850110-04bdf02d1f155cc0001-NocioJ Received: from mail-pa0-f41.google.com (mail-pa0-f41.google.com [209.85.220.41]) by cuda.sgi.com with ESMTP id ITOmWVRQpuYlLrEh (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 13 Apr 2013 03:48:30 -0700 (PDT) X-Barracuda-Envelope-From: shhuiw@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.41 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.41] Received: by mail-pa0-f41.google.com with SMTP id kx1so1860406pab.0 for ; Sat, 13 Apr 2013 03:48:30 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.41] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.41] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; bh=TnlYVfyTM9d2v8HWjGObM+phG62781GG2P+OkrX5SZs=; b=tNLpmFsYzQoc1kOLA5zFxgZm4/sSmlVA3coUXEKUcmj5xPUkjCMLN4dcoFiuuxObRQ iWThU2jadvIGW59HvYKWLABOs5ZwB6KHyYmGWPwktKN8z4xYcHCFxe9tUG7Svo+uKMQu inXH80zB4x+bEpMEqrXPeR5IgxFk0P3BrTdNiQsdIPHN+xdAYF568sbKMMMs85sGsBGK P+tnkhQSXjg0NpJtUPcm0+hC6Pe/cszYOw+ubwQwy+gJZTiQYijIP90pjgmyY28fWomV JVeMnCNSq29ojoKrFbzi71soSmRvAs3EpNpNJTx7XIhphizRycePt4HXsTlIIc/ZGFFD gy9w== X-Received: by 10.66.25.206 with SMTP id e14mr20241055pag.13.1365850110006; Sat, 13 Apr 2013 03:48:30 -0700 (PDT) Received: from [192.168.1.104] ([122.70.5.192]) by mx.google.com with ESMTPS id hp1sm13428976pac.3.2013.04.13.03.48.27 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 13 Apr 2013 03:48:29 -0700 (PDT) Message-ID: <516937F9.1020101@gmail.com> Date: Sat, 13 Apr 2013 18:48:25 +0800 From: Wang Sheng-Hui User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Dave Chinner , Rich Johnston , Dave Chinner , xfstests Subject: [PATCH v3] xfstests: make install support common/ and tests/ dirs Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: [PATCH v3] xfstests: make install support common/ and tests/ dirs Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pa0-f41.google.com[209.85.220.41] X-Barracuda-Start-Time: 1365850110 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.127991 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 xfstests have some change on the organization of the testcases and common* files: * The common* scripts have been reorganized into the common/ dir. * The testcases have been reorganized into sub test dirs under tests/. * The run.* scripts have been removed. This patch uses the simple way to make install support above changes: Make up one Makefile for each newly created subdirs, which can control 'make install' separately. v3 introduces the following change compared with v2: * use the neater way by Dave to get the TESTS_SUBDIRS in tests/Makefile. v2 introduces the following changes compared with v1: * Ingore the file 'group' under the topdir, for it's useless in the new structures. * Remove the redundant comments in the Makefiles. * Use XXX_DIR instead of XXX_SUBDIR in the Makefiles under common/ and tests/. * Export TESTS_DIR in teh top level Makefile instead of tests/Makefile. * Obtain the names of dirs for testcases by interating sub dirs under /tests, not by enumeration in tests/Makefile. Signed-off-by: Wang Sheng-Hui --- Makefile | 12 +++++------- common/Makefile | 16 ++++++++++++++++ tests/Makefile | 19 +++++++++++++++++++ tests/btrfs/Makefile | 20 ++++++++++++++++++++ tests/ext4/Makefile | 20 ++++++++++++++++++++ tests/generic/Makefile | 20 ++++++++++++++++++++ tests/shared/Makefile | 20 ++++++++++++++++++++ tests/udf/Makefile | 20 ++++++++++++++++++++ tests/xfs/Makefile | 20 ++++++++++++++++++++ 9 files changed, 160 insertions(+), 7 deletions(-) create mode 100644 common/Makefile create mode 100644 tests/Makefile create mode 100644 tests/btrfs/Makefile create mode 100644 tests/ext4/Makefile create mode 100644 tests/generic/Makefile create mode 100644 tests/shared/Makefile create mode 100644 tests/udf/Makefile create mode 100644 tests/xfs/Makefile diff --git a/Makefile b/Makefile index 6edd55c..611b36d 100644 --- a/Makefile +++ b/Makefile @@ -52,12 +52,15 @@ LDIRT += $(SRCTAR) endif LIB_SUBDIRS = include lib -TOOL_SUBDIRS = ltp src m4 +TOOL_SUBDIRS = ltp src m4 common ifeq ($(HAVE_DMAPI), true) TOOL_SUBDIRS += dmapi endif -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) +TESTS_DIR = tests +export TESTS_DIR + +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_DIR) default: include/builddefs $(DMAPI_MAKEFILE) $(TESTS) ifeq ($(HAVE_BUILDDEFS), no) @@ -91,12 +94,7 @@ depend: include/builddefs $(addsuffix -depend,$(SUBDIRS)) install: default $(addsuffix -install,$(SUBDIRS)) $(INSTALL) -m 755 -d $(PKG_LIB_DIR) $(INSTALL) -m 755 check $(PKG_LIB_DIR) - $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) - $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) - $(INSTALL) -m 644 group $(PKG_LIB_DIR) $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) - $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) - $(INSTALL) -m 644 common* $(PKG_LIB_DIR) # Nothing. install-dev install-lib: diff --git a/common/Makefile b/common/Makefile new file mode 100644 index 0000000..5f91e8c --- /dev/null +++ b/common/Makefile @@ -0,0 +1,16 @@ +# +# Copyright (c) 2003-2006 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = .. +include $(TOPDIR)/include/builddefs + +COMMON_DIR = common + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/$(COMMON_DIR) + $(INSTALL) -m 644 * $(PKG_LIB_DIR)/$(COMMON_DIR) + +install-dev install-lib: diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..522df8e --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,19 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = .. +include $(TOPDIR)/include/builddefs + +TESTS_SUBDIRS = $(sort $(dir $(wildcard $(PWD)/$(TESTS_DIR)/[a-z]*/))) + +include $(BUILDRULES) + +install: $(addsuffix -install,$(TESTS_SUBDIRS)) + $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/$(TESTS_DIR) + +# Nothing. +install-dev install-lib: + +%-install: + $(MAKE) $(MAKEOPTS) -C $* install diff --git a/tests/btrfs/Makefile b/tests/btrfs/Makefile new file mode 100644 index 0000000..e1a5be1 --- /dev/null +++ b/tests/btrfs/Makefile @@ -0,0 +1,20 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +BTRFS_DIR = btrfs +TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(BTRFS_DIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_DIR) + $(INSTALL) -m 644 group $(TARGET_DIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_DIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/ext4/Makefile b/tests/ext4/Makefile new file mode 100644 index 0000000..7a3c8e1 --- /dev/null +++ b/tests/ext4/Makefile @@ -0,0 +1,20 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +EXT4_DIR = ext4 +TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(EXT4_DIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_DIR) + $(INSTALL) -m 644 group $(TARGET_DIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_DIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/generic/Makefile b/tests/generic/Makefile new file mode 100644 index 0000000..9529fb8 --- /dev/null +++ b/tests/generic/Makefile @@ -0,0 +1,20 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +GENERIC_DIR = generic +TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(GENERIC_DIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_DIR) + $(INSTALL) -m 644 group $(TARGET_DIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_DIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/shared/Makefile b/tests/shared/Makefile new file mode 100644 index 0000000..cbd87f9 --- /dev/null +++ b/tests/shared/Makefile @@ -0,0 +1,20 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +SHARED_DIR = shared +TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(SHARED_DIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_DIR) + $(INSTALL) -m 644 group $(TARGET_DIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_DIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/udf/Makefile b/tests/udf/Makefile new file mode 100644 index 0000000..1d96658 --- /dev/null +++ b/tests/udf/Makefile @@ -0,0 +1,20 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +UDF_DIR = udf +TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(UDF_DIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_DIR) + $(INSTALL) -m 644 group $(TARGET_DIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_DIR) + +# Nothing. +install-dev install-lib: diff --git a/tests/xfs/Makefile b/tests/xfs/Makefile new file mode 100644 index 0000000..db94be0 --- /dev/null +++ b/tests/xfs/Makefile @@ -0,0 +1,20 @@ +# +# Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. +# + +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +XFS_DIR = xfs +TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(XFS_DIR) + +include $(BUILDRULES) + +install: + $(INSTALL) -m 755 -d $(TARGET_DIR) + $(INSTALL) -m 755 [0-9]?? $(TARGET_DIR) + $(INSTALL) -m 644 group $(TARGET_DIR) + $(INSTALL) -m 644 [0-9]??.* $(TARGET_DIR) + +# Nothing. +install-dev install-lib: -- 1.7.12.4 From bounce-md_13960679.51699473.v1-bf19c81d64854cea9ab165561900f9b0@mail338.us4.mandrillapp.com Sat Apr 13 12:23:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,MSGID_FROM_MTA_HEADER,RCVD_DOUBLE_IP_LOOSE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A1AEF7F37 for ; Sat, 13 Apr 2013 12:23:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2018FAC005 for ; Sat, 13 Apr 2013 10:23:06 -0700 (PDT) X-ASG-Debug-ID: 1365873780-04cbb057f7169e90001-w1Z2WR Received: from mail338.us4.mandrillapp.com (mail338.us4.mandrillapp.com [205.201.137.82]) by cuda.sgi.com with ESMTP id vawIaLo8H9HEpsMc for ; Sat, 13 Apr 2013 10:23:00 -0700 (PDT) X-Barracuda-Envelope-From: bounce-md_13960679.51699473.v1-bf19c81d64854cea9ab165561900f9b0@mail338.us4.mandrillapp.com X-Barracuda-Apparent-Source-IP: 205.201.137.82 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=mandrill; d=mail338.us4.mandrillapp.com; h=From:Sender:Subject:List-Unsubscribe:To:Message-Id:Reply-To:Date:MIME-Version:Content-Type; i=contato@mail338.us4.mandrillapp.com; bh=xHeETUWMPBraBOTFvJc4oNpUVg8=; b=fekhp132zSj+sVXI45Q66yIT3f5fbmuQ74okp7kDBnVQUmw0kN6STNu0lobK7eOjmFu2QN0mg+hO kpNbxmqbUzIvSwK/Y0GnfXN168vNLYpiSYjdx/6uAp8JWNUAFBy7lA7/I96uj8Ypg2Hx9c5xUM6H 6ovnTRhr/vb5dn4EdL0= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=mandrill; d=mail338.us4.mandrillapp.com; b=lXaHuaXMx5Qc3JuC02ZU/YgZAhc/q+lIioG7LnAokA4+T8cjK2mzXm0Ixb+s0Zc50qei4NcYHggZ 1WVGi6uKEnKm6yLE9MxCSSSS9HF3cJuPWTaKgir6V0EGCmsnS356XfSsQOTt1eLgcKumgkkPNF1G WMrKrkkYA/RSviuSApM=; Received: from localhost (127.0.0.1) by mail338.us4.mandrillapp.com id hd6a7e14i284 for ; Sat, 13 Apr 2013 17:22:59 +0000 (envelope-from ) From: =?UTF-8?B?U29ycmlhIFNlcnTDo296aW5obw==?= Sender: =?UTF-8?B?U29ycmlhIFNlcnTDo296aW5obw==?= Subject: =?utf-8?Q?N=C3=A3o=20deixe=20passar,=20pegue=20o=20seu=20Sorria=20Sert=C3=A3ozinho,=20j=C3=A1=20nas=20bancas?= X-ASG-Orig-Subj: =?utf-8?Q?N=C3=A3o=20deixe=20passar,=20pegue=20o=20seu=20Sorria=20Sert=C3=A3ozinho,=20j=C3=A1=20nas=20bancas?= List-Unsubscribe: X-Mailer-Lid: 14 X-Mailer-Recptid: 543141 X-Mailer-Sid: 31 X-Mailer-Sent-By: 1 To: Message-Id: <012a270e74524a6bfc242f0cc4f0a6f1@www.divulguenarede.com> Reply-To: contato@sorriasertaozinho.com.br Received: from [174.36.54.198] by ip-10-252-131-73 id bf19c81d64854cea9ab165561900f9b0; Sat, 13 Apr 2013 17:22:59 +0000 X-Report-Abuse: Please forward a copy of this message, including all headers, to abuse@mandrill.com X-Mandrill-User: md_13960679 Date: Sat, 13 Apr 2013 17:22:59 +0000 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="_av-E2PjeIG31GIYogFCinr4bg" X-Barracuda-Connect: mail338.us4.mandrillapp.com[205.201.137.82] X-Barracuda-Start-Time: 1365873780 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.05 X-Barracuda-Spam-Status: No, SCORE=2.05 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, MSGID_FROM_MTA_HEADER, MSGID_FROM_MTA_HEADER_2, RCVD_DOUBLE_IP_LOOSE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128019 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 0.00 MSGID_FROM_MTA_HEADER Message-Id was added by a relay 0.00 RCVD_DOUBLE_IP_LOOSE Received: by and from look like IP addresses 1.50 MSGID_FROM_MTA_HEADER_2 Message-Id was added by a relay --_av-E2PjeIG31GIYogFCinr4bg Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Seu cliente de e-mail n=C3=A3o pode ler este e-mail. Para visualiz=C3=A1-lo on-line, por favor, clique aqui: http://mandrillapp.com/track/click.php?u=3D13960679&id=3Dbf19c81d64854cea9a= b165561900f9b0&url=3Dhttp%3A%2F%2Fwww.divulguenarede.com%2Fiem%2Fdisplay.ph= p%3FM%3D543141%26C%3D49225c473fccd05093b9df3696ae303c%26S%3D31%26L%3D14%26N= %3D6&url_id=3D62d650e676ea51d3220856702384fc7c5d9c79f5&tags=3D_all,_sendcon= tato@sorriasertaozinho.com.br Para parar de receber nossos e-mails:http://www.divulguenarede.com/iem/unsubscribe.php?M=3D543141&C=3D49= 225c473fccd05093b9df3696ae303c&L=3D14&N=3D31 --_av-E2PjeIG31GIYogFCinr4bg Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit                       Se você não conseguir visualizar esta mensagem, acesse este link


            Se você não deseja mais receber nossos e-mails,cancele sua subscrição neste link
--_av-E2PjeIG31GIYogFCinr4bg-- From mlsemon35@gmail.com Sat Apr 13 15:50:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2A3ED7F3F for ; Sat, 13 Apr 2013 15:50:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0875A304032 for ; Sat, 13 Apr 2013 13:50:13 -0700 (PDT) X-ASG-Debug-ID: 1365886212-04cb6c2c1c17d620001-NocioJ Received: from mail-yh0-f42.google.com (mail-yh0-f42.google.com [209.85.213.42]) by cuda.sgi.com with ESMTP id 5uAfDHarpdkemmF7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 13 Apr 2013 13:50:13 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.42 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.42] Received: by mail-yh0-f42.google.com with SMTP id b41so598519yha.15 for ; Sat, 13 Apr 2013 13:50:12 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.42] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.42] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; bh=bBJzJC0wR8+9DWlzCtfx1drvvXCHb3Yg/4IkqneKjwA=; b=KI6TxV2zwA+ofSdUVVWGgduMat/jBOIMXor+qqzDpQh60uKQmdKXUevRKAdxvUc4AL SIA9fEvZOBHlTa7xu3FDI7zACNrekkbXHMaCMdrVlne2kfvxW9Hx35cbZAK4RLed4KSw fpIksHPLOOzEHiWMw1/bZ9B6UoV1EFPIGP/Ka4KPQ3LebOGkGXaZJtQcXXSR5AZN1IVo eyswLPi689m/ZPile/EjpFBMtWtvdXHbIbUFjCDwu39H2Fho0rXK1qqBcYdCW2ltWxyk Ty8JxsIAJDQPe1Ge8S2cHKsn9XpvPz0sg3JsIrGBrMbhzrYoARPLGvyygJPLg5O12T+B 69AQ== X-Received: by 10.236.153.200 with SMTP id f48mr9440813yhk.117.1365886212671; Sat, 13 Apr 2013 13:50:12 -0700 (PDT) Received: from [192.168.0.139] (rrcs-97-78-60-146.se.biz.rr.com. [97.78.60.146]) by mx.google.com with ESMTPS id 30sm19477568yhb.6.2013.04.13.13.50.11 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 13 Apr 2013 13:50:11 -0700 (PDT) Message-ID: <5169C4FE.4030209@gmail.com> Date: Sat, 13 Apr 2013 16:50:06 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfstests Subject: xfstests: kludge patch for per-dir test number sorting by ./check Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: xfstests: kludge patch for per-dir test number sorting by ./check Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-yh0-f42.google.com[209.85.213.42] X-Barracuda-Start-Time: 1365886213 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128033 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 I'm trying to get the new xfstests to run the XFS tests first, then run the generic group, then run the shared group. One attempt was to work with this variable in the ./check script: SRC_GROUPS="generic shared" There is a final file sort in ./check that means, no matter which order groups are specified in SRC_GROUPS, the groups will be executed in alphabetical order. This sysadmin kludge patch fixes that behavior and seems to work. By moving the sorting into the trim_test_list() function, test numbers are still sorted, but the groups seem to run in the order specified in the SRC_GROUPS variable. Let me know if this helps or if I'm simply not using the new xfstests correctly. Michael --- xfstests/check.orig 2013-03-30 00:54:37.000000000 -0400 +++ xfstests/check 2013-04-13 13:41:42.002814733 -0400 @@ -138,7 +138,7 @@ echo "^$t\$" >>$tmp.grep numsed=`expr $numsed + 1` done - grep -v -f $tmp.grep <$tmp.list >$tmp.tmp + grep -v -f $tmp.grep <$tmp.list | sort -n >$tmp.tmp mv $tmp.tmp $tmp.list } @@ -268,7 +268,7 @@ fi # sort the list of tests into numeric order -list=`sort -n $tmp.list` +list=`cat $tmp.list` rm -f $tmp.list $tmp.tmp $tmp.grep if $randomize From mlsemon35@gmail.com Sat Apr 13 16:20:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CC8167F52 for ; Sat, 13 Apr 2013 16:20:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B942A8F8050 for ; Sat, 13 Apr 2013 14:20:55 -0700 (PDT) X-ASG-Debug-ID: 1365888054-04cb6c2c1d17f750001-NocioJ Received: from mail-yh0-f54.google.com (mail-yh0-f54.google.com [209.85.213.54]) by cuda.sgi.com with ESMTP id HdSvHKhyV4FkQnmw (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 13 Apr 2013 14:20:54 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.54 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.54] Received: by mail-yh0-f54.google.com with SMTP id i21so598759yha.27 for ; Sat, 13 Apr 2013 14:20:53 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.54] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.54] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=6GvqELSmgquKr2rINhufcPgi7+GZUD/ipTmgjwZg56g=; b=LWw9ZbEDLqS9FKdT+09He/ShQGD8IJspcdG6Y8MQtrtL+8pMsHyyV/nQCie6eKbZcy nhqIPnM65Hcqq8J4BKEmRUlWo/ogfD3aOutK4sqLYgBUS+8C0d8UgWwPoVrcm2Yea0is pkBaquu6M0i80Kf9Hq/VDgOQ+1kKgtRixppPh3SmTV/YEtma3YkHMzxa+1u1Yfu4MGey cmxAgsGGKuh6GtIo8fXN2/aITUJzwT/bwEhv88aLlYKwG8UGckpkH79Kj7Kp1q9aWTwU cRvsbK5pdw3pEC58I91frvuRZsO7B1MrFD64mSn4PVygUE+DMAKPlNgHQBFTsrygAzUU /9lg== X-Received: by 10.236.190.200 with SMTP id e48mr9319882yhn.137.1365888053922; Sat, 13 Apr 2013 14:20:53 -0700 (PDT) Received: from [192.168.0.139] (rrcs-97-78-60-146.se.biz.rr.com. [97.78.60.146]) by mx.google.com with ESMTPS id e63sm19503475yhg.27.2013.04.13.14.20.52 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 13 Apr 2013 14:20:53 -0700 (PDT) Message-ID: <5169CC34.9080902@gmail.com> Date: Sat, 13 Apr 2013 17:20:52 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Jeff Liu CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: fix s_max_bytes to MAX_LFS_FILESIZE if needed References: <5167E160.3020800@oracle.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix s_max_bytes to MAX_LFS_FILESIZE if needed In-Reply-To: <5167E160.3020800@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-yh0-f54.google.com[209.85.213.54] X-Barracuda-Start-Time: 1365888054 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email Update: My tests on my original hardware go exactly as they did in my Pentium 4 test. xfstests shared/[0-9][0-9][0-9] and xfs/003 through xfs/136 were run against it. No problems. Good job. I'm keeping the patch. My final version of the bug summary goes like this: On a 32-bit x86 PC, with a Linux kernel that has CONFIG_LBDAF=y... xfstests generic/308, by writing to a file at an address just before 2**32, causes the following conditions on an XFS filesystem: 1) CPU usage becomes very high, 2) The xfs_io process cannot be killed, 3) The best way to shut down the PC is through use of the magic SysRq keys. 4) Afterwards, attempts to mount the filesystem result in a soft oops. 5) After an `xfs_repair -L` on the filesystem, all is OK, other than for what was lost by zeroing the log. J. Liu wrote a patch that solves this problem, but he found the answers with CONFIG_LBDAF=n, which is a condition for which xfstests generic/308 passes on the two test PCs used. Tests were conducted on a Pentium III (kernel 3.9-rc4 with numerous SGI patches) and on a Pentium 4 (kernel 3.9-rc6 with numerous SGI patches). Could you verify these things by memory (no need to retest)? a) With CONFIG_LBDAF=y, generic/308 caused filesystem corruption, and b) With CONFIG_LBDAF=n, generic/308 passed the test. c) Having CONFIG_LBDAF=n helped you to find the answers and write this fine patch. Otherwise, the conclusion is "I don't know how you got there, but you got there. Good job! and thanks for finding the root cause of the problem." Thanks again! Michael On 04/12/2013 06:26 AM, Jeff Liu wrote: > From: Jie Liu > > On 32-bit machine, the s_maxbytes is larger than the MAX_LFS_FILESIZE limits if CONFIG_LBDAF is > not enabled. Hence it's possible to create a huge file via buffered-IO write with a given offset > beyond this limitation. e.g. > > # block_size=4096 > # offset=$(((2**32 - 1) * $block_size)) > # xfs_io -f -c "pwrite $offset $block_size" /storage/test_file > > In this case, xfs_io will hang at the page writeback stage soon since the given offset would > cause an overflow at xfs_vm_writepage(): > > end_index = offset >> PAGE_CACHE_SHIFT; > last_index = (offset - 1) >> PAGE_CACHE_SHIFT; > if (page->index >= end_index) { > unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); > > /* > * Just skip the page if it is fully outside i_size, e.g. due > * to a truncate operation that is in progress. > */ > if (page->index >= end_index + 1 || offset_into_page == 0) { > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > unlock_page(page); > return 0; > } > end_index is unsigned long so that the max value is '2^32-1 = 4294967295', and it > would be evaluated to the max value with the given offset(when writing the page offset > up to s_max_bytes) for above test case. As a result, (page->index >= end_index + 1) is > ok as (end_index + 1) is overflowed to ZERO. > > Actually, create a file as above on 32-bit machine should be failed with EFBIG error returned > because there has strict check up at generic_write_checks() against the given offset with a > *correct* s_max_bytes. > > This patch fix the s_max_bytes to MAX_LFS_FILESIZE if the pre-calculated value is greater > than it. > > Reported-by: Michael L. Semon > Signed-off-by: Jie Liu > > --- > fs/xfs/xfs_super.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index ea341ce..0644d61 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -585,6 +585,7 @@ xfs_max_file_offset( > { > unsigned int pagefactor = 1; > unsigned int bitshift = BITS_PER_LONG - 1; > + __uint64_t offset; > > /* Figure out maximum filesize, on Linux this can depend on > * the filesystem blocksize (on 32 bit platforms). > @@ -610,7 +611,10 @@ xfs_max_file_offset( > # endif > #endif > > - return (((__uint64_t)pagefactor) << bitshift) - 1; > + offset = (((__uint64_t)pagefactor) << bitshift) - 1; > + > + /* Check against VM & VFS exposed limits */ > + return (offset > MAX_LFS_FILESIZE) ? MAX_LFS_FILESIZE : offset; > } > > xfs_agnumber_t > From denny8@centurylink.net Sat Apr 13 16:37:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C8AB87F56 for ; Sat, 13 Apr 2013 16:37:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A796C304032 for ; Sat, 13 Apr 2013 14:37:49 -0700 (PDT) X-ASG-Debug-ID: 1365889067-04bdf02d2017cba0001-NocioJ Received: from mailrelay.embarq.synacor.com (mailrelay.embarq.synacor.com [208.47.184.3]) by cuda.sgi.com with ESMTP id 0hwVXk5h5jrmfWDw for ; Sat, 13 Apr 2013 14:37:48 -0700 (PDT) X-Barracuda-Envelope-From: denny8@centurylink.net X-Barracuda-Apparent-Source-IP: 208.47.184.3 X_CMAE_Category: 0,0 Undefined,Undefined X-CNFS-Analysis: v=2.0 cv=G9ae4qY5 c=1 sm=0 a=Y9BvSbqe3X4A:10 a=FKkrIqjQGGEA:10 a=YTHtZiAxaJsA:10 a=I_5RNyk1AAAA:8 a=K-v-2zaBAAAA:8 a=jJJHFUIJo_CNU375FWYA:9 a=QEXdDO2ut3YA:10 a=vs7RvF9s_Fprd-iqexkA:9 a=_W_S_7VecoQA:10 a=Hhc/OnKmOS1xKI2oHPQhqg==:117 X-CM-Score: 0 X-Scanned-by: Cloudmark Authority Engine Received: from [10.50.3.117] ([10.50.3.117:50471] helo=md05.embarq.synacor.com) by mailrelay.embarq.synacor.com (envelope-from ) (ecelerity 2.2.3.49 r(42060/42061)) with ESMTP id E7/66-14055-A20D9615; Sat, 13 Apr 2013 17:37:47 -0400 Date: Sat, 13 Apr 2013 17:37:46 -0400 (EDT) From: Zhang Yong!- Message-ID: <924979797.170437.1365889066381.JavaMail.root@md05.embarq.synacor.com> Subject: , MIME-Version: 1.0 X-ASG-Orig-Subj: , Content-Type: multipart/alternative; boundary="----=_Part_170436_1804978817.1365889066380" X-Originating-IP: [115.185.30.76] X-Mailer: Zimbra 6.0.5_GA_2328.RHEL5_64 (zclient/6.0.5_GA_2328.RHEL5_64) X-Barracuda-Connect: mailrelay.embarq.synacor.com[208.47.184.3] X-Barracuda-Start-Time: 1365889068 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; ------=_Part_170436_1804978817.1365889066380 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit -- --,I've a biz offer for you. ------=_Part_170436_1804978817.1365889066380 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit -- --,I've a biz offer for you. ------=_Part_170436_1804978817.1365889066380-- From info@kvv.org Sat Apr 13 18:00:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, FREEMAIL_REPLYTO_END_DIGIT,HTML_MESSAGE,T_FRT_CONTACT autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CE5B729E05 for ; Sat, 13 Apr 2013 18:00:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BCAA7304048 for ; Sat, 13 Apr 2013 16:00:11 -0700 (PDT) X-ASG-Debug-ID: 1365894008-04cb6c2c1f185a50001-w1Z2WR Received: from sd.valgo.es (www.valgo.es [46.4.159.20]) by cuda.sgi.com with ESMTP id zEFrXdGjhISHYzKQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 13 Apr 2013 16:00:09 -0700 (PDT) X-Barracuda-Envelope-From: info@kvv.org X-Barracuda-Apparent-Source-IP: 46.4.159.20 Received: (qmail 22357 invoked from network); 13 Apr 2013 04:30:52 +0400 Received: from rrcs-50-84-104-226.sw.biz.rr.com (HELO termsrv.mcoc.local) (50.84.104.226) by www.valgo.es with ESMTPA; 13 Apr 2013 04:30:52 +0400 Content-Type: multipart/alternative; boundary="===============0994218710==" MIME-Version: 1.0 Subject: wichtig To: Recipients X-ASG-Orig-Subj: wichtig From: "Peter Wong" Date: Fri, 12 Apr 2013 19:15:47 -0500 Reply-To: peterwong455@yahoo.cn X-Barracuda-Connect: www.valgo.es[46.4.159.20] X-Barracuda-Start-Time: 1365894009 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.34 X-Barracuda-Spam-Status: No, SCORE=2.34 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA609_MID, BSF_SC0_SA620b, BSF_SC0_SA_TO_FROM_ADDR_MATCH, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128041 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_SA620b Custom Rule SA620b 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address 1.20 BSF_SC0_SA609_MID Custom Rule SA609_MID Message-Id: <20130413230011.2EE6B1296123@cuda.sgi.com> You will not see this in a MIME-aware mail reader. --===============0994218710== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Lieber Freund Ich habe einen gegenseitigen Gesch=E4ftsbeziehungen Vorschlag= von gemeinsamem Interesse mit Ihnen teilen; Es beinhaltet den Transfer ein= er gro=DFen Geldsumme. Ich habe Ihren Hinweis in meine Suche nach jemandem,= der mir vorgeschlagenen Gesch=E4ftsbeziehung passt. wenn Sie sind an einer= Zusammenarbeit mit mir interessiert sind, kontaktieren Sie mich durch mein= e Private E-Mail (peterwong455@yahoo.cn) f=FCr weitere Details, Ihre fr=FCh= este Reaktion auf dieses Schreiben wird gesch=E4tzt. Mit freundlichen Gr=FC= =DFen, Peter Wong --===============0994218710== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Lieber Freund Ich habe einen gegenseitigen Ges= ch=E4ftsbeziehungen Vorschlag von gemeinsamem Interesse mit Ihnen teilen; E= s beinhaltet den Transfer einer gro=DFen Geldsumme. Ich habe Ihren Hinweis = in meine Suche nach jemandem, der mir vorgeschlagenen Gesch=E4ftsbeziehung = passt. wenn Sie sind an einer Zusammenarbeit mit mir interessiert sind, kon= taktieren Sie mich durch meine Private E-Mail (peterwong455@yahoo.cn) f=FCr= weitere Details, Ihre fr=FCheste Reaktion auf dieses Schreiben wird gesch= =E4tzt. Mit freundlichen Gr=FC=DFen, Peter Wong --===============0994218710==-- From training@gv-me.com Sat Apr 13 21:44:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C4F529E06 for ; Sat, 13 Apr 2013 21:44:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C4BAB304032 for ; Sat, 13 Apr 2013 19:44:23 -0700 (PDT) X-ASG-Debug-ID: 1365907456-04bdf02d2018cca0001-w1Z2WR Received: from crm.gv-me.com (host-41.38.8.218.tedata.net [41.38.8.218]) by cuda.sgi.com with SMTP id TjNRgytpHa3iJ0B0 for ; Sat, 13 Apr 2013 19:44:17 -0700 (PDT) X-Barracuda-Envelope-From: training@gv-me.com X-Barracuda-Apparent-Source-IP: 41.38.8.218 Received: from [41.38.8.218] ([127.0.0.1]) by crm.gv-me.com ; Sat, 13 Apr 2013 20:36:31 +0200 Reply-To: From: "IT Management Training" To: "linux-xfs" Subject: ITIL Expert Lifecycle Track Message-ID: <44ab09e5a7a5d640a9863b1d601832df@41.38.8.218> X-ASG-Orig-Subj: ITIL Expert Lifecycle Track Date: Sat, 13 Apr 2013 20:36:26 +0200 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0001_EFE5F733.219CC24E" X-Priority: 3 X-Mailer: Microsoft Office Outlook 12.0 X-Barracuda-Connect: host-41.38.8.218.tedata.net[41.38.8.218] X-Barracuda-Start-Time: 1365907457 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.64 X-Barracuda-Spam-Status: No, SCORE=0.64 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_FONT_LOW_CONTRAST, HTML_MESSAGE, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128055 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.54 HTML_FONT_LOW_CONTRAST BODY: HTML font color similar to background 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS This is a multi-part message in MIME format. ------=_NextPart_000_0001_EFE5F733.219CC24E Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Greetings=E2=80=A6=0D=0AIt is our pleasure to announce for the = ITIL Expert - Lifecycle Track courses and exams in Riyadh, Saudi = Arabia. The courses will be conducted as evening sessions starting = from 27th April 2013 till 22nd August 2013, as per the below = schedule:=0D=0ACodeCourse NameStart DateEnd DateRegister in = Single Course=0D=0AITILFITIL Foundation27/4/20131/5/2013Register = in ITILF=0D=0ALSSITIL Service Strategy4/5/20138/5/2013Register = in LSS=0D=0ALSDITIL Service Design18/5/201322/5/2013Register = in LSD=0D=0ALSTITIL Service Transition1/6/20135/6/2013Register = in LST=0D=0ALSOITIL Service Operation15/6/201319/6/2013Register = in LSO=0D=0ALCSIITIL Continual Service Improvement29/6/20133/7/2013Reg= ister in LCSI=0D=0AMLCITIL Managing Across Lifecycle17/8/201322/8/2013= Register in MLC=0D=0A=0D=0AAll the courses will be conducted = in a 5-stars hotel in Riyadh, Saudi Arabia.=0D=0AThe whole program = will cost 7,500$ instead of 9,500$, and the program without = the Foundation course and exam will cost 7,000$ instead of 9,000$.=0D=0A= =0D=0ACandidates can register for the whole track with/without = the Foundation, or register for individual courses.=0D=0AAnother = Fast-Track program for three weeks (Full-Day sessions) will = be conducted in parallel with the above program starting from = 1st June 2013 till 3rd July 2013, for more details about that = program and for the group discounts please contact us or register = for fast track.=0D=0A=0D=0AFor more details about the courses = and exams, you can contact the responsible people at the following = numbers: 0560006615 / 0569019937.=0D=0ABest regards,=0D=0AGlobal-Visio= n - Middle East=0D=0ATel: +966 (1) 291-3900=0D=0AFax: +966 (1) = 474-8503=0D=0AEmail: Training@gv-me.com ------=_NextPart_000_0001_EFE5F733.219CC24E Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable =0D=0A=0D=0A= =0D=0A=0D=0A=0D=0A

Greetings=E2=80=A6

=0D=0A

It = is our pleasure to announce for the ITIL Expert - Lifecycle = Track courses and exams in Riyadh, Saudi Arabia. The courses = will be conducted as evening sessions starting from 27th = April 2013 till 22nd August 2013, as per the below = schedule:

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

Code

=0D=0A

Course Name

=0D=0A

Start Date<= B>

=0D=0A

End Date<= B>

=0D=0A

Register = in Single Course

=0D=0A

ITILF

=0D=0A

<= FONT face=3DCalibri>ITIL Foundation

=0D=0A

27/4/2013

=0D= =0A

1/5/2013

=0D=0A

Register in ITILF=

=0D=0A

= LSS

=0D=0A

<= FONT face=3DCalibri>ITIL Service Strategy

=0D=0A

4/5/2013

=0D= =0A

8/5/2013

=0D=0A

Register in LSS

=0D=0A

<= SPAN style=3D"mso-ascii-font-family: Calibri; mso-hansi-font-family: = Calibri">LSD

=0D=0A

<= FONT face=3DCalibri>ITIL Service Design

=0D=0A

18/5/2013

=0D= =0A

22/5/2013<= /FONT>

=0D=0A

Register in LSD

=0D=0A

<= SPAN style=3D"mso-ascii-font-family: Calibri; mso-hansi-font-family: = Calibri">LST

=0D=0A

<= FONT face=3DCalibri>ITIL Service Transition

=0D=0A

1/6/2013

=0D= =0A

5/6/2013

=0D=0A

Register in LST

=0D=0A

= LSO

=0D=0A

<= FONT face=3DCalibri>ITIL Service Operation

=0D=0A

15/6/2013

=0D= =0A

19/6/2013<= /FONT>

=0D=0A

Register in LSO

=0D=0A

= LCSI

=0D=0A

<= FONT face=3DCalibri>ITIL Continual Service Improvement

=0D=0A

29/6/2013

=0D=0A

3/7/2013

=0D= =0A

Register in LCSI

=0D=0A

MLC

=0D=0A

<= FONT face=3DCalibri>ITIL Managing Across Lifecycle<= SPAN style=3D"FONT-SIZE: 12pt; mso-ascii-font-family: Calibri; = mso-hansi-font-family: Calibri">

=0D=0A

17/8/2013

=0D=0A

22/8/2013

=0D= =0A

Register in = MLC

=0D=0A

All the courses will be conducted = in a 5-stars hotel in Riyadh, Saudi Arabia.=0D=0A=0D=0A=0D=0A=0D=0A
=0D=0A

The whole = program will cost = 7,500$ instead of 9,500$, and the program = without the Foundation course and exam will cost 7,000$ = instead of 9,00= 0$.

= =0D=0A

Candidates can = re= gister for the whole track = with/without the Foundation, or register for individual courses.<= /o:p>

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

Another = Fast-Track program for three weeks (Full-Day sessions) will = be conducted in parallel with the above program starting from = 1st June 2013 till 3rd July 2013, for = more details about that program and for the group discounts = please contact us= or register for fast track.

=0D=0A=

For more details about = the courses and exams, you can contact the responsible people = at the following numbers: 0560006615 / 0569019937.

= =0D=0A

Best regards,

=0D=0A

Global-Vision - Middle East=0D=0A

Tel: +966 (1) 291-3900

=0D=0A

Fax: +966 (1) 474-8503

=0D=0A

Email: Training@gv-me.com

=0D=0A

 

------=_NextPart_000_0001_EFE5F733.219CC24E-- From ral5q@virginia.edu Sun Apr 14 06:02:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DC8EB7F4C for ; Sun, 14 Apr 2013 06:02:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CABCB304039 for ; Sun, 14 Apr 2013 04:02:42 -0700 (PDT) X-ASG-Debug-ID: 1365937357-04cbb057f61a3b00001-w1Z2WR Received: from dill.mail.virginia.edu (dill.mail.Virginia.EDU [128.143.2.119]) by cuda.sgi.com with ESMTP id yZ0RnQUbiVdkAGkD for ; Sun, 14 Apr 2013 04:02:37 -0700 (PDT) X-Barracuda-Envelope-From: ral5q@virginia.edu X-Barracuda-Apparent-Source-IP: 128.143.2.119 Received: from localhost (localhost [127.0.0.1]) by dill.mail.virginia.edu (Postfix) with ESMTP id 87E8510A22A for ; Sun, 14 Apr 2013 07:02:36 -0400 (EDT) Received: from dill.mail.virginia.edu ([127.0.0.1]) by localhost (dill-f.mail.virginia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 6s86J1E4xJQV for ; Sun, 14 Apr 2013 07:02:36 -0400 (EDT) Received: from iron4.mail.virginia.edu (iron4-s.mail.virginia.edu [10.250.200.114]) by dill.mail.virginia.edu (Postfix) with ESMTP id 3B9CA10A221 for ; Sun, 14 Apr 2013 07:02:36 -0400 (EDT) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ai4MAFiLalHRVdzIfmdsb2JhbABMBIJCeq9XAQEmiQsBiDEDfQgWDgEBCQsMCBQnAYIXG4EMAQZdEgEFASgBhgKCHpoTgnKUKUABiFCNdkqEHwOBI4dijgCBIY4OFimEThw X-Sender-IP: 209.85.220.200 Received: from mail-vc0-f200.google.com ([209.85.220.200]) by iron4.mail.virginia.edu with ESMTP; 14 Apr 2013 07:02:35 -0400 Received: by mail-vc0-f200.google.com with SMTP id hz11so7073499vcb.11 for ; Sun, 14 Apr 2013 04:02:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:mime-version:x-received:date:message-id:subject:from:to :content-type:x-gm-message-state; bh=qy5J3ohMY0gsIsgBoj6Yomun67pBDL5EDDKeySzGhYA=; b=mKsKPNRyIL1IfSc4O4kZxII6+gm4/+TSEAFiqbcI4JPrBEaHlu5CDf65YBgZVkQLh7 jHRDMfB79OeKCuEOJ4/YAGFuGbutC394MfUI4pqtvIzWnqmbiuZ36Xk1K1eBuAbtGR6m v4B31d9hl241zaCF7aa+aKqS1edeGD592HTTzKoJuRjBbcMeGAYrduEhyrPmCMKI5GD1 5BrunCHaWZRFxBcJlZitHnSZbvKukajJ/b9CAAtDhEDwIF4v6/rwLsrFnKTsx+XYN6N0 CxBE5HNAYp+jITTDoUL2rzW+NcPo9c+eVWjSN67j284DkQnI9DYnyJzQmWazsprfX0cJ 6fFg== X-Received: by 10.52.95.33 with SMTP id dh1mr3792136vdb.52.1365937353667; Sun, 14 Apr 2013 04:02:33 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.52.95.33 with SMTP id dh1mr3791916vdb.52.1365937353044; Sun, 14 Apr 2013 04:02:33 -0700 (PDT) Received: by 10.58.34.105 with HTTP; Sun, 14 Apr 2013 04:02:32 -0700 (PDT) Date: Sun, 14 Apr 2013 04:02:32 -0700 Message-ID: Subject: =?ISO-8859-2?Q?V=E1=BEen=ED=3A_Webmail_Subscriber?= From: webmail update X-ASG-Orig-Subj: =?ISO-8859-2?Q?V=E1=BEen=ED=3A_Webmail_Subscriber?= To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=20cf307f3626b6dbe904da50125f X-Gm-Message-State: ALoCoQk75VEx40xiylwTwL9B8PhH9gy333c0Lm/ggmtptAr0VyvRG8rGP32wSMbKHS/V7oQVyOxD44knytA3WrTi20x20OB7selkKaRtOcWIWgw4IRlBgYqABmBY8z/7eOG+WbuAplWeM9v+tStJ8X0fioFWxIEbTQ== X-Barracuda-Connect: dill.mail.Virginia.EDU[128.143.2.119] X-Barracuda-Start-Time: 1365937357 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.128089 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --20cf307f3626b6dbe904da50125f Content-Type: text/plain; charset=ISO-8859-2 Content-Transfer-Encoding: quoted-printable *V=E1=BEen=ED: Webmail Subscriber Oznamujeme v=E1m, =BEe v=E1=B9 e-mailov=FD =FA=E8et presiahol skladovacie kapacity. Nebudete m=F4c=BB odosiela=BB a prij=EDma=BB e-maily = a va=B9e e-mailov=FD =FA=E8et, bud=FA vymazan=E9 z n=E1=B9ho servera. Ak sa chcete t= omuto probl=E9mu vyhn=FA=BB, kliknite tu pre aktualiz=E1ciu v=E1=B9h= o =FA=E8tu. =CFakujem. Management Team.* --20cf307f3626b6dbe904da50125f Content-Type: text/html; charset=ISO-8859-2 Content-Transfer-Encoding: quoted-printable
V=E1=BEen=ED: Webmail Subscriber

Oznam= ujeme v=E1m, =BEe v=E1=B9 e-mailov=FD =FA=E8et presiahol
skladovacie kapac= ity. Nebudete m=F4c=BB odosiela=BB a prij=EDma=BB e-maily a va=B9e e-mailov=FD =FA=E8et, bud=FA vymazan=E9= z n=E1=B9ho servera. Ak sa chcete tomuto probl=E9mu vyhn=FA=BB,
=A0= kliknite=A0 tu pre aktualiz=E1ciu v=E1=B9ho =FA=E8tu.


=CFakujem.

Management Team.
--20cf307f3626b6dbe904da50125f-- From fikret@compactproduction.com Sun Apr 14 18:13:54 2013 Return-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_IMAGE_ONLY_16, HTML_MESSAGE,HTML_SHORT_LINK_IMG_2,T_FILL_THIS_FORM_SHORT,UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 442227F4C for ; Sun, 14 Apr 2013 18:13:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9974AAC001 for ; Sun, 14 Apr 2013 16:13:50 -0700 (PDT) X-ASG-Debug-ID: 1365981223-04cb6c2c1c1d2c40001-w1Z2WR Received: from mail.localhost.com (94-73-142-138.cizgi.net.tr [94.73.142.138]) by cuda.sgi.com with ESMTP id O3XOt9ppIjyzDby1 for ; Sun, 14 Apr 2013 16:13:44 -0700 (PDT) X-Barracuda-Envelope-From: fikret@compactproduction.com X-Barracuda-Apparent-Source-IP: 94.73.142.138 Received: from ([127.0.0.1]) with MailEnable ESMTP; Sun, 14 Apr 2013 11:41:44 +0300 Reply-To: info@compactproduction.com Message-ID: <3fd8d4e1cb4722b3ccd49c9a37e65a7b@compactproduction.com> From: To: Subject: =?iso-8859-9?B?RmlsbSBZYXD9bWP9bP1rIE95dW5jdWx1ayB2ZSBQcm9k/GtzaQ==?= =?iso-8859-9?B?eW9uIA==?= Date: Sun, 14 Apr 2013 11:41:39 +0300 X-ASG-Orig-Subj: =?iso-8859-9?B?RmlsbSBZYXD9bWP9bP1rIE95dW5jdWx1ayB2ZSBQcm9k/GtzaQ==?= =?iso-8859-9?B?eW9uIA==?= MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=SPLITOR00A_001_116255704D"; type="multipart/alternative" X-Barracuda-Connect: 94-73-142-138.cizgi.net.tr[94.73.142.138] X-Barracuda-Start-Time: 1365981223 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.47 X-Barracuda-Spam-Status: No, SCORE=1.47 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DYN_RDNS_AND_INLINE_IMAGE, EXTRA_MPART_TYPE, HTML_IMAGE_ONLY_16, HTML_MESSAGE, HTML_SHORT_LINK_IMG_2, NO_REAL_NAME, RDNS_DYNAMIC, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry 0.00 NO_REAL_NAME From: does not include a real name 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.63 HTML_IMAGE_ONLY_16 BODY: HTML: images with 1200-1600 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.24 HTML_SHORT_LINK_IMG_2 HTML is very short with a linked image 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.00 DYN_RDNS_AND_INLINE_IMAGE Contains image, and was sent by dynamic rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. ------=SPLITOR00A_001_116255704D Content-Type: multipart/alternative; boundary="----=SPLITOR00B_001_116255704D" ------=SPLITOR00B_001_116255704D Content-Type: text/plain; charset="iso-8859-9" Content-Transfer-Encoding: quoted-printable Compact Production=20 Film yap=FDmc=FDl=FDk, Oyunculuk ve Prod=FCksiyon hizmetleri TV Reklam Filmi=20 Tan=FDt=FDm Filmi=20 =DCr=FCn ve Katalog =E7ekimleri G=F6r=FCnt=FC ve Film Montaj TV ve Radyo Reklam Planlamas=FD=20 Green Box St=FCdyo, Foto=F0raf =E7ekimi=20 3D Modelleme ve Animasyon Hizmetleri=20 T=FCrk=E7e ve Yabanc=FD dil Seslendirme, Dublaj Oyunculuk, Model ve Organizasyon Hizmetleri=20 Ayr=FDnt=FDl=FD bilgi i=E7in : www.compactproduction.com =20 Compact Production Film Yap=FDmc=FDl=FDk ve Ajans hizmetleri Mahmutbey Mah. Ta=FEoca=F0=FD yolu Cad=20 A=F0ao=F0lu My Office 212 Kat:3 Ofis:38=20 G=FCne=FEli/Ba=F0c=FDlar-=DDSTANBUL=20 Company Owner Fikret T=FCfek=E7i Tel : 0 212 4717800 Tel : 0 212 4717825 Gsm : 0 531 9401292 Fax : 0 850 3215838=20 E mail: fikret@compactproduction.com www.compactproduction.com ------=SPLITOR00B_001_116255704D Content-Type: text/html; charset="iso-8859-9" Content-Transfer-Encoding: quoted-printable

Compact Production
Film yap=FDmc=FDl=FDk, Oyunculuk ve = Prod=FCksiyon hizmetleri

TV Reklam Filmi
Tan=FDt=FDm Filmi 
=DCr=FCn ve Katalog = =E7ekimleri
G=F6r=FCnt=FC ve Film Montaj
TV ve Radyo Reklam = Planlamas=FD
Green Box St=FCdyo, Foto=F0raf =E7ekimi
3D Modelleme = ve Animasyon Hizmetleri
T=FCrk=E7e ve Yabanc=FD dil Seslendirme, = Dublaj
Oyunculuk, Model ve Organizasyon Hizmetleri

Ayr=FDnt=FDl=FD bilgi i=E7in : www.compactproduction.com&nb= sp;



Compact Production
Film = Yap=FDmc=FDl=FDk ve Ajans hizmetleri
Mahmutbey Mah. Ta=FEoca=F0=FD yolu = Cad
A=F0ao=F0lu My Office 212 Kat:3 Ofis:38 =
G=FCne=FEli/Ba=F0c=FDlar-=DDSTANBUL
Company Owner
Fikret = T=FCfek=E7i
Tel     : 0 212 = 4717800
Tel     : 0 212 4717825
Gsm  : 0 = 531 9401292
Fax    : 0 850 3215838
E mail: fikret@compactproduction.com
www.compactproduction.com&nb= sp; 

------=SPLITOR00B_001_116255704D-- ------=SPLITOR00A_001_116255704D Content-Type: image/jpeg; name="=?iso-8859-9?B?Y29tcGFjdCUyMC0tbG9nb18yLmpwZw==?=" Content-Transfer-Encoding: base64 Content-ID: <2268an$IN56801365928893980@COMPACTPRODUCTI> /9j/4AAQSkZJRgABAQAAAQABAAD//gA8Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg SlBFRyB2NjIpLCBxdWFsaXR5ID0gMTAwCv/bAEMAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/bAEMBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAL4A +gMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQD BQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygp KjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJma oqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/ xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQID EQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RF RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqy s7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/ AP79QBz8o6Z6H1PqOfy+meADjDcD9fVscYzx7dPbGKQEc9PTPQZ+b/ZH8v8A66/Lg8j9O2R0AHrn jn8OoAHGPuj24I6n1wOOc8e4o7n5R0GeD6n/AGfb0/HjhMgDgjtn/O3nHr6nJpQQM8j6cckZ/wBk H3GP5EUAAxk/KO/r0G3tjn24/nmkGME7e3v/AFHGfY9KUbcnkd/T1HbA9Pf2OTmkGMcEdD6f/Eg/ 570AL3HyjgHPXnoOOOf1/XkHU4UDkeo9Pb16dMdcdyAjPUdOenPQ8/KPXn/EGk4BPI6g9fcew9Ox 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 ------=SPLITOR00A_001_116255704D-- From david@fromorbit.com Sun Apr 14 19:38:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1C2A57F4C for ; Sun, 14 Apr 2013 19:38:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E93C7304032 for ; Sun, 14 Apr 2013 17:38:04 -0700 (PDT) X-ASG-Debug-ID: 1365986282-04cb6c2c1f1d6260001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 0SIDBDEPPkE8Btzu for ; Sun, 14 Apr 2013 17:38:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkYIAChLa1FFJtkK/2dsb2JhbABQgwaCfblYhSGBBxZ0gh8BAQU6PxAIAw0LCSUPBSghE4gUugiPFweCYGEDkziDTIYpimmDHSo Received: from unknown (HELO destitution) ([69.38.217.10]) by ipmail05.adl6.internode.on.net with ESMTP; 15 Apr 2013 10:08:01 +0930 Received: from dave by destitution with local (Exim 4.80) (envelope-from ) id 1URWJ6-00031a-ED; Mon, 15 Apr 2013 09:26:00 +1000 Date: Mon, 15 Apr 2013 09:26:00 +1000 From: Dave Chinner To: "Michael L. Semon" Cc: xfstests Subject: Re: xfstests: kludge patch for per-dir test number sorting by ./check Message-ID: <20130414232600.GA5117@destitution> X-ASG-Orig-Subj: Re: xfstests: kludge patch for per-dir test number sorting by ./check References: <5169C4FE.4030209@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5169C4FE.4030209@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: 1365986282 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128143 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Apr 13, 2013 at 04:50:06PM -0400, Michael L. Semon wrote: > I'm trying to get the new xfstests to run the XFS tests first, then The question is why do you want to do this? Is there any specific reason for running the tests in that order? FWIW, if all you want to do is run the xfs tests, run: $ sudo ./check xfs[0-9][0-9][0-9] Cheers, Dave. -- Dave Chinner david@fromorbit.com From yongtaofu@gmail.com Sun Apr 14 21:08:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1342A7F4C for ; Sun, 14 Apr 2013 21:08:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7945CAC001 for ; Sun, 14 Apr 2013 19:08:33 -0700 (PDT) X-ASG-Debug-ID: 1365991708-04cb6c2c1d1db920001-NocioJ Received: from mail-ia0-f180.google.com (mail-ia0-f180.google.com [209.85.210.180]) by cuda.sgi.com with ESMTP id etDS0CNn1O8EXSMF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 14 Apr 2013 19:08:28 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.180 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.180] Received: by mail-ia0-f180.google.com with SMTP id l29so3853447iag.39 for ; Sun, 14 Apr 2013 19:08:28 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.180] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.180] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=05mRq2SAoV7zscn8c6DeA5ifyCWkB4OV1VNChJ63/bI=; b=ahwsKtP0/723vAp/nmPeueDUfUaX3z+a3b7Uxs1M+oDdfEhnR4/hTRMOfYP/HoHZ7j zbSkI2N9cq/npCbDVXpq13RU2HIw16vY44BIuWC8O/ImDowjAeXIkxMrtmco1GXm0z0X MIBpNJMe0cT6S7MrN/QP+Mrpnn20jYsktWn+dqC+I6sLTqwWJnWc1tzC/i8uGPkXqiOR raCDZer681le2LGHp+7fbWV/toDQP3X6tClgyAF3YlP8LrSyj7iGc6G2fYLExfm/inDJ ZsaYJShWWddS1kZTFJlO8aNEhbnDB2+AFlNRkVFb43cx9Pmxrp/JJvENqJH8HL+6wWXD 1+8A== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr4110942igq.51.1365991707887; Sun, 14 Apr 2013 19:08:27 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Sun, 14 Apr 2013 19:08:27 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> <516800F7.80502@redhat.com> Date: Mon, 15 Apr 2013 10:08:27 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Eric Sandeen , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee7841fc504da5cba9a X-Barracuda-Connect: mail-ia0-f180.google.com[209.85.210.180] X-Barracuda-Start-Time: 1365991708 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128149 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 --14dae9340ee7841fc504da5cba9a Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Dear xfs experts, Now I'm deploying Brian's system script in out cluster. But from last night till now 5 servers in our 24 servers xfs shutdown with the same error. I run xfs_repair command and found all the lost inodes are glusterfs dht link files. This explains why the xfs shutdown tend to happen during glusterfs rebalance. During glusterfs rebalance procedure a lot of dhk link files may be unlinked. For example the following inodes are found in lost+found in one of the servers: [root@* lost+found]# pwd /mnt/xfsd/lost+found [root@* lost+found]# ls -l total 740 ---------T 1 root root 0 Apr 8 21:06 100119 ---------T 1 root root 0 Apr 8 21:11 101123 ---------T 1 root root 0 Apr 8 21:19 102659 ---------T 1 root root 0 Apr 12 14:46 1040919 ---------T 1 root root 0 Apr 12 14:58 1041943 ---------T 1 root root 0 Apr 8 21:32 105219 ---------T 1 root root 0 Apr 8 21:37 105731 ---------T 1 root root 0 Apr 12 17:48 1068055 ---------T 1 root root 0 Apr 12 18:38 1073943 ---------T 1 root root 0 Apr 8 21:54 108035 ---------T 1 root root 0 Apr 12 21:49 1091095 ---------T 1 root root 0 Apr 13 00:17 1111063 ---------T 1 root root 0 Apr 13 03:51 1121815 ---------T 1 root root 0 Apr 8 22:25 112387 ---------T 1 root root 0 Apr 13 06:39 1136151 ... [root@* lost+found]# getfattr -m . -d -e hex * # file: 96007 trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 trusted.gfid=3D0xa0370d8a9f104dafbebbd0e6dd7ce1f7 trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c= 69636174652d3600 trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 0000049dff000 # file: 97027 trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 trusted.gfid=3D0xc1c1fe2ec7034442a623385f43b04c25 trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c= 69636174652d3600 trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 000006ac78000 # file: 97559 trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 trusted.gfid=3D0xcf7c17013c914511bda4d1c743fae118 trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c= 69636174652d3500 trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 00000519fb000 # file: 98055 trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 trusted.gfid=3D0xe86abc6e2c4b44c28d415fbbe34f2102 trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c= 69636174652d3600 trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 000004c098000 # file: 98567 trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 trusted.gfid=3D0x12543a2efbdf4b9fa61c6d89ca396f80 trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c= 69636174652d3500 trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 000006bc98000 # file: 98583 trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 trusted.gfid=3D0x760d16d3b7974cfb9c0a665a0982c470 trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c= 69636174652d3500 trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 000006cde9000 # file: 99607 trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 trusted.gfid=3D0x0849a732ea204bc3b8bae830b46881da trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c= 69636174652d3500 trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 00000513f1000 ... What do you think about it? Thank you very much. 2013/4/12 =B7=FB=D3=C0=CC=CE > Hi Brian, > > Your scripts works for me now after I installed all the rpm built out fro= m > kernel srpm. I'll try it. Thank you. > > > 2013/4/12 Brian Foster > >> On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote: >> > Dear xfs experts, >> > Can I just call xfs_stack_trace(); in the second line of >> > xfs_do_force_shutdown() to print stack and rebuild kernel to check >> > what's the error? >> > >> >> I suppose that's a start. If you're willing/able to create and run a >> modified kernel for the purpose of collecting more debug info, perhaps >> we can get a bit more creative in collecting more data on the problem >> (but a stack trace there is a good start). >> >> BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp) >> check almost halfway into the function to avoid duplicate messages. >> >> Brian >> >> > >> > 2013/4/12 =B7=FB=D3=C0=CC=CE > >> > >> > Hi Brian, >> > What else I'm missing? Thank you. >> > stap -e 'probe module("xfs").function("xfs_iunlink"){}' >> > >> > WARNING: cannot find module xfs debuginfo: No DWARF information >> found >> > semantic error: no match while resolving probe point >> > module("xfs").function("xfs_iunlink") >> > Pass 2: analysis failed. Try again with another '--vp 01' option. >> > >> > >> > 2013/4/12 =B7=FB=D3=C0=CC=CE > >> > >> > ls -l >> > >> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.de= bug >> > -r--r--r-- 1 root root 21393024 Apr 12 12:08 >> > >> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.de= bug >> > >> > rpm -qa|grep kernel >> > kernel-headers-2.6.32-279.el6.x86_64 >> > kernel-devel-2.6.32-279.el6.x86_64 >> > kernel-2.6.32-358.el6.x86_64 >> > kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 >> > abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >> > kernel-firmware-2.6.32-358.el6.noarch >> > kernel-debug-2.6.32-358.el6.x86_64 >> > kernel-debuginfo-2.6.32-279.el6.x86_64 >> > dracut-kernel-004-283.el6.noarch >> > libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 >> > kernel-devel-2.6.32-358.el6.x86_64 >> > kernel-2.6.32-279.el6.x86_64 >> > >> > rpm -q kernel-debuginfo >> > kernel-debuginfo-2.6.32-279.el6.x86_64 >> > >> > rpm -q kernel >> > kernel-2.6.32-279.el6.x86_64 >> > kernel-2.6.32-358.el6.x86_64 >> > >> > do I need to re probe it? >> > >> > >> > 2013/4/12 Eric Sandeen > > > >> > >> > On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote: >> > > Hi Brian, >> > > Sorry but when I execute the script it says: >> > > WARNING: cannot find module xfs debuginfo: No DWARF >> > information found >> > > semantic error: no match while resolving probe point >> > module("xfs").function("xfs_iunlink") >> > > >> > > uname -a >> > > 2.6.32-279.el6.x86_64 >> > > kernel debuginfo has been installed. >> > > >> > > Where can I find the correct xfs debuginfo? >> > >> > it should be in the kernel-debuginfo rpm (of the same >> > version/release as the kernel rpm you're running) >> > >> > You should have: >> > >> > >> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.de= bug >> > >> > If not, can you show: >> > >> > # uname -a >> > # rpm -q kernel >> > # rpm -q kernel-debuginfo >> > >> > -Eric >> > >> > >> > >> > >> > >> > -- >> > =B7=FB=D3=C0=CC=CE >> > >> > >> > >> > >> > -- >> > =B7=FB=D3=C0=CC=CE >> > >> > >> > >> > >> > -- >> > =B7=FB=D3=C0=CC=CE >> > >> > >> > _______________________________________________ >> > xfs mailing list >> > xfs@oss.sgi.com >> > http://oss.sgi.com/mailman/listinfo/xfs >> > >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee7841fc504da5cba9a Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Dear xfs experts,
Now I'm deploying= Brian's system script in out cluster. But from last night till now 5 s= ervers in our 24 servers xfs shutdown with the same error. I run xfs_repair= command and found all the lost inodes are glusterfs dht link files. This e= xplains why the xfs shutdown tend to happen during glusterfs rebalance. Dur= ing glusterfs rebalance procedure a lot of dhk link files may be unlinked. = For example the following inodes are found in lost+found in one of the serv= ers:
[root@* lost+found]# pwd
/mnt/xfsd/lost+found
[root@* lost+found]# ls= -l
total 740
---------T 1 root root 0 Apr  8 21:06 100119
--= -------T 1 root root 0 Apr  8 21:11 101123
---------T 1 root root 0= Apr  8 21:19 102659
---------T 1 root root 0 Apr 12 14:46 1040919
---------T 1 root root 0 A= pr 12 14:58 1041943
---------T 1 root root 0 Apr  8 21:32 105219---------T 1 root root 0 Apr  8 21:37 105731
---------T 1 root roo= t 0 Apr 12 17:48 1068055
---------T 1 root root 0 Apr 12 18:38 1073943
---------T 1 root root 0 A= pr  8 21:54 108035
---------T 1 root root 0 Apr 12 21:49 1091095---------T 1 root root 0 Apr 13 00:17 1111063
---------T 1 root root 0 = Apr 13 03:51 1121815
---------T 1 root root 0 Apr  8 22:25 112387
---------T 1 root root= 0 Apr 13 06:39 1136151
...
[root@* lost+found]# getfattr -m . -d -e = hex *

# file: 96007
trusted.afr.mams-cq-mt-video-client-3=3D0x000= 000000000000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000
trust= ed.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000
trusted.gf= id=3D0xa0370d8a9f104dafbebbd0e6dd7ce1f7
trusted.glusterfs.dht.linkto=3D0= x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 0000049dff000

# file: 97027
trusted.afr.mams-cq-mt-video-client-3= =3D0x000000000000000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x= 000000000000000000000000
trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000
trust= ed.gfid=3D0xc1c1fe2ec7034442a623385f43b04c25
trusted.glusterfs.dht.linkt= o=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
trusted= .glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000000006a= c78000

# file: 97559
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0xcf7c17013c914511bda4d1c743fae118
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 000519fb000

# file: 98055
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0xe86abc6e2c4b44c28d415fbbe34f2102
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0004c098000

# file: 98567
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x12543a2efbdf4b9fa61c6d89ca396f80
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0006bc98000

# file: 98583
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x760d16d3b7974cfb9c0a665a0982c470
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0006cde9000

# file: 99607
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x0849a732ea204bc3b8bae830b46881da
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 000513f1000
...

What do you think about it? Thank you very much.
=


2013/4/12 =B7= =FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brian,

Your scripts works for me now after I installed all the rpm built out from= kernel srpm. I'll try it. Thank you.


2013/4/12 Brian Foster <bfoster@redhat.com>
On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote:
> Dear xfs experts,
> Can I just call xfs_stack_trace(); in the second line of
> xfs_do_force_shutdown() to print stack and rebuild kernel to check
> what's the error?
>

I suppose that's a start. If you're willing/able to create an= d run a
modified kernel for the purpose of collecting more debug info, perhaps
we can get a bit more creative in collecting more data on the problem
(but a stack trace there is a good start).

BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp)
check almost halfway into the function to avoid duplicate messages.

Brian

>
> 2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     Hi Brian,
>     What else I'm missing? Thank you.
>     stap -e 'probe module("xfs").function(&quo= t;xfs_iunlink"){}'
>
>     WARNING: cannot find module xfs debuginfo: No DWARF info= rmation found
>     semantic error: no match while resolving probe point
>     module("xfs").function("xfs_iunlink"= )
>     Pass 2: analysis failed.  Try again with another &#= 39;--vp 01' option.
>
>
>     2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:= yongtaofu@gmail.co= m>>
>
>         ls -l
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>         -r--r--r-- 1 root root 21393024 Apr 12 12:= 08
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>
>         rpm -qa|grep  kernel
>         kernel-headers-2.6.32-279.el6.x86_64
>         kernel-devel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>         kernel-debuginfo-common-x86_64-2.6.32-279.= el6.x86_64
>         abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >         kernel-firmware-2.6.32-358.el6.noarch
>         kernel-debug-2.6.32-358.el6.x86_64
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>         dracut-kernel-004-283.el6.noarch
>         libreport-plugin-kerneloops-2.0.9-5.el6.x8= 6_64
>         kernel-devel-2.6.32-358.el6.x86_64
>         kernel-2.6.32-279.el6.x86_64
>
>         rpm -q kernel-debuginfo
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>
>         rpm -q kernel
>         kernel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>
>         do I need to re probe it?
>
>
>         2013/4/12 Eric Sandeen <sandeen@sandeen.net
>         <mailto:sandeen@sandeen.net>>
>
>             On 4/11/13 11:32 PM, =B7=FB= =D3=C0=CC=CE wrote:
>             > Hi Brian,
>             > Sorry but when I execut= e the script it says:
>             > WARNING: cannot find mo= dule xfs debuginfo: No DWARF
>             information found
>             > semantic error: no matc= h while resolving probe point
>             module("xfs").func= tion("xfs_iunlink")
>             >
>             > uname -a
>             > 2.6.32-279.el6.x86_64 >             > kernel debuginfo has be= en installed.
>             >
>             > Where can I find the co= rrect xfs debuginfo?
>
>             it should be in the kernel-d= ebuginfo rpm (of the same
>             version/release as the kerne= l rpm you're running)
>
>             You should have:
>
>             /usr/lib/debug/lib/modules/2= .6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug
>
>             If not, can you show:
>
>             # uname -a
>             # rpm -q kernel
>             # rpm -q kernel-debuginfo >
>             -Eric
>
>
>
>
>
>         --
>         =B7=FB=D3=C0=CC=CE
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE
>
>
> _______________________________________________<= br> > xfs mailing list
> xfs@oss.sgi.com
>
= http://oss.sgi.com/mailman/listinfo/xfs
>




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--14dae9340ee7841fc504da5cba9a-- From mlsemon35@gmail.com Sun Apr 14 22:29:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6DF917F50 for ; Sun, 14 Apr 2013 22:29:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5BFEB8F8033 for ; Sun, 14 Apr 2013 20:29:22 -0700 (PDT) X-ASG-Debug-ID: 1365996561-04cbb057f71d8920001-NocioJ Received: from mail-ye0-f173.google.com (mail-ye0-f173.google.com [209.85.213.173]) by cuda.sgi.com with ESMTP id TeDITa4Gj5OcS5WN (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 14 Apr 2013 20:29:21 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.173 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.173] Received: by mail-ye0-f173.google.com with SMTP id q5so675174yen.18 for ; Sun, 14 Apr 2013 20:29:21 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.173] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.173] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=9owTgYX3jTcIicHFH1+X20HivtIqwJHuLw5N8dA6n3I=; b=ZqHJFkw3Biz84vqOspg3OzLWRxbl2DCwBut6Xtmv1znxQCDZ1JDLYJiZlv/4nZR1SR YJmxrLV/5CSluVCJ390d3lRptMoZHb2JWe3Zx3WLao3mkB3WGpWbqZKWrEv6OVZuvR+z +uSJ1HO+7xKtjF+tyVB/r3aWb5kovEw470A/1Df3fMT7YjoN5r9hSaeA5rtjeM8TntfZ sIUlg7vuUA76kqvAE2lKj0Mkj9+GhROY29a37sasw+h+clZAUI0OYSEd6PMY14k7iTan 47VE8URdu58eg2hgwW2CoNEXNM75+ympgScbYQK4oUcGuG/gyjZ4ZQQBwB6y2KCdYrJf VcBQ== X-Received: by 10.236.27.170 with SMTP id e30mr10488672yha.15.1365996560914; Sun, 14 Apr 2013 20:29:20 -0700 (PDT) Received: from [192.168.0.139] (rrcs-97-78-60-146.se.biz.rr.com. [97.78.60.146]) by mx.google.com with ESMTPS id y5sm26431008yhd.3.2013.04.14.20.29.19 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 14 Apr 2013 20:29:20 -0700 (PDT) Message-ID: <516B740A.1050607@gmail.com> Date: Sun, 14 Apr 2013 23:29:14 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Dave Chinner CC: xfstests Subject: Re: xfstests: kludge patch for per-dir test number sorting by ./check References: <5169C4FE.4030209@gmail.com> <20130414232600.GA5117@destitution> X-ASG-Orig-Subj: Re: xfstests: kludge patch for per-dir test number sorting by ./check In-Reply-To: <20130414232600.GA5117@destitution> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ye0-f173.google.com[209.85.213.173] X-Barracuda-Start-Time: 1365996561 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128155 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/14/2013 07:26 PM, Dave Chinner wrote: > On Sat, Apr 13, 2013 at 04:50:06PM -0400, Michael L. Semon wrote: >> I'm trying to get the new xfstests to run the XFS tests first, then > > The question is why do you want to do this? Is there any specific > reason for running the tests in that order? > > FWIW, if all you want to do is run the xfs tests, run: > > $ sudo ./check xfs[0-9][0-9][0-9] > > Cheers, > > Dave. > Personal preference. I'd like to run both series of tests, sometimes attended, sometimes unattended. It's fine if a generic/ test crashes the PC while running unattended, but I'd much rather the xfs/ tests have first crack at that. My version of the syntax was `./check xfs/[0-9][0-9][0-9]`, but that becomes rough when skipping tests. I'll still try your version, but irrationality and frustration have driven me to simply adding a "mls" group to all of the tests//group files, then hoping that a `./check -g mls` would run everything in the correct order. That led to trying to figure out why the generic/ tests were running first, and so on and so forth... Thanks! Michael From zhaohongjiang@huawei.com Sun Apr 14 22:38:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 482D17F4C for ; Sun, 14 Apr 2013 22:38:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 14672304048 for ; Sun, 14 Apr 2013 20:38:43 -0700 (PDT) X-ASG-Debug-ID: 1365997120-04bdf02d1f1d98c0001-NocioJ Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [119.145.14.64]) by cuda.sgi.com with ESMTP id h8GICbL9gmaJWitW (version=TLSv1 cipher=DES-CBC3-SHA bits=168 verify=NO) for ; Sun, 14 Apr 2013 20:38:41 -0700 (PDT) X-Barracuda-Envelope-From: zhaohongjiang@huawei.com X-Barracuda-Apparent-Source-IP: 119.145.14.64 Received: from 172.24.2.119 (EHLO szxeml213-edg.china.huawei.com) ([172.24.2.119]) by szxrg01-dlp.huawei.com (MOS 4.3.4-GA FastPath queued) with ESMTP id BAO62475; Mon, 15 Apr 2013 11:38:25 +0800 (CST) Received: from SZXEML460-HUB.china.huawei.com (10.82.67.203) by szxeml213-edg.china.huawei.com (172.24.2.30) with Microsoft SMTP Server (TLS) id 14.1.323.7; Mon, 15 Apr 2013 11:37:22 +0800 Received: from [127.0.0.1] (10.135.72.200) by szxeml460-hub.china.huawei.com (10.82.67.203) with Microsoft SMTP Server id 14.1.323.7; Mon, 15 Apr 2013 11:37:19 +0800 Message-ID: <516B75E9.40605@huawei.com> Date: Mon, 15 Apr 2013 11:37:13 +0800 From: Zhao Hongjiang User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: CC: , , Subject: [PATCH] capture the failure result of 310 Content-Type: text/plain; charset="ISO-8859-1" X-ASG-Orig-Subj: [PATCH] capture the failure result of 310 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.135.72.200] X-CFilter-Loop: Reflected X-Barracuda-Connect: szxga01-in.huawei.com[119.145.14.64] X-Barracuda-Start-Time: 1365997121 X-Barracuda-Encrypted: DES-CBC3-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Capture the failuer by the way of count error dmesg and give the description how i run the test to trigger problems. Signed-off-by: Zhao Hongjiang --- tests/generic/310 | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 56 insertions(+), 1 deletions(-) mode change 100644 => 100755 tests/generic/310 diff --git a/tests/generic/310 b/tests/generic/310 old mode 100644 new mode 100755 index ef51422..f44799a --- a/tests/generic/310 +++ b/tests/generic/310 @@ -4,6 +4,17 @@ #Check if there are two threads,one keeps calling read() or lseek(), and #the other calling readdir(), both on the same directory fd. # +#When I ran this on ext3 (can be replaced with ext2/ext4) which has dir_index +#feature disabled, I got this: +# +#EXT3-fs error (device sdb): ext3_readdir: bad entry in directory #1134241: +#rec_len % 4 != 0 - offset=2704, inode=16973836, rec_len=12850, name_len=52 +#EXT3-fs error (device sdb): ext3_readdir: bad entry in directory #1134241: +#directory entry across blocks - offset=1672, inode=16973836, rec_len=14132, +#name_len=57 +# +#If we configured errors=remount-ro, the filesystem will become read-only. +# # Based on a testcase from Li Zefan . # # http://marc.info/?l=linux-kernel&m=136123703211869&w=2 @@ -47,6 +58,37 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 _supported_fs generic _supported_os Linux +dmesg -c > /dev/null + +nr_bug=`dmesg | grep -c "kernel BUG"` +nr_error=`dmesg | grep -c "error"` +nr_null=`dmesg | grep -c "kernel NULL pointer dereference"` +nr_warning=`dmesg | grep -c "^WARNING"` +nr_lockdep=`dmesg | grep -c "possible recursive locking detected"` + +#check if some kind of kernel bug happened +check_kernel_bug() +{ + new_bug=`dmesg | grep -c "kernel BUG"` + new_error=`dmesg | grep -c "error"` + new_null=`dmesg | grep -c "kernel NULL pointer dereference"` + new_warning=`dmesg | grep -c "^WARNING"` + new_lockdep=`dmesg | grep -c "possible recursive locking detected"` + + + # no kernel bug is detected + if [ $new_bug -eq $nr_bug -a $new_error -eq $nr_error -a \ + $new_null -eq $nr_null -a $new_warning -eq $nr_warning -a \ + $new_lockdep -eq $nr_lockdep ]; then + return 1 + fi + + nr_bug=$new_bug + nr_error=$new_error + nr_null=$new_null + nr_warning=$new_warning + nr_lockdep=$new_lockdep +} mkdir $TEST_DIR/tmp for n in {1..4096}; do touch $TEST_DIR/tmp/$n @@ -57,6 +99,13 @@ _test_read() src/t_readdir_1 $TEST_DIR/tmp & sleep 100 killall src/t_readdir_1 + check_kernel_bug + if [ $? -eq 1 ]; then + status=0 + else + echo "error: kernel bug was found, you can see the + dmesg for more infomation." + fi } _test_lseek() @@ -64,6 +113,13 @@ _test_lseek() src/t_readdir_2 $TEST_DIR/tmp & sleep 100 killall src/t_readdir_2 + check_kernel_bug + if [ $? -eq 1 ]; then + status=0 + else + echo "error: kernel bug was found, you can see the + dmesg for more infomation." + fi } _test_read @@ -72,5 +128,4 @@ _test_lseek # success, all done echo "*** done" rm -f $seq.full -status=0 exit -- 1.7.1 From ynke.asavieva@watersinfo.com Sun Apr 14 23:06:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 33A817F54 for ; Sun, 14 Apr 2013 23:06:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7F0B304043 for ; Sun, 14 Apr 2013 21:06:03 -0700 (PDT) X-ASG-Debug-ID: 1365998760-04bdf02d1c1db0b0001-NocioJ Received: from mail.ssvyaz.ru (mail.ssvyaz.ru [176.121.211.202]) by cuda.sgi.com with ESMTP id STusklRxhS2yXdYZ for ; Sun, 14 Apr 2013 21:06:01 -0700 (PDT) X-Barracuda-Envelope-From: ynke.asavieva@watersinfo.com X-Barracuda-Apparent-Source-IP: 176.121.211.202 Received: from localhost (localhost [127.0.0.1]) by mail.ssvyaz.ru (Postfix) with ESMTP id 50138149342; Mon, 15 Apr 2013 10:06:00 +0600 (YEKT) X-Virus-Scanned: amavisd-new at ssvyaz.ru Received: from mail.ssvyaz.ru ([127.0.0.1]) by localhost (mail.ssvyaz.ru [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Wyk5K54YoHbN; Mon, 15 Apr 2013 10:05:59 +0600 (YEKT) Received: from Unknown (unknown [199.168.141.218]) by mail.ssvyaz.ru (Postfix) with ESMTP id 99B50149333; Mon, 15 Apr 2013 10:05:55 +0600 (YEKT) Message-ID: <0DEBB552E9414C7390068C0E1FF532FC@xdyn> Reply-To: =?windows-1251?B?wOPl7fLx8uLuIP3q7u3u7Oj35fHq7ukg4eXn?= =?windows-1251?B?7u/g8e3u8fLoIOgg8+/w4OLr5e3o/yDw6PHq?= =?windows-1251?B?4Ozo?= From: =?windows-1251?B?wOPl7fLx8uLuIP3q7u3u7Oj35fHq7ukg4eXn?= =?windows-1251?B?7u/g8e3u8fLoIOgg8+/w4OLr5e3o/yDw6PHq?= =?windows-1251?B?4Ozo?= To: , , , <5050@5050.ru>, Subject: =?windows-1251?B?6O3x7+Xq9uj/IO/uIPLu8OPu4uvl?= Date: Mon, 15 Apr 2013 06:05:53 +0200 X-ASG-Orig-Subj: =?windows-1251?B?6O3x7+Xq9uj/IO/uIPLu8OPu4uvl?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0EDD_01CE399F.49BC17D0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3505.912 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3505.912 X-Barracuda-Connect: mail.ssvyaz.ru[176.121.211.202] X-Barracuda-Start-Time: 1365998760 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128157 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_0EDD_01CE399F.49BC17D0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=D0=C8=C3=CB=C0=D8=C0=C5=CC =CF=CE=D1=C5=D2=C8=D2=DC =CA=CE=CD=D1=D3=CB= =DC=D2=C0=D6=C8=CE=CD=CD=CE=C5 =CC=C5=D0=CE=CF=D0=C8=DF=D2=C8=C5: "=DD=CA=CE=CD=CE=CC=C8=D7=C5=D1=CA=C0=DF =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2= =DC =CF=D0=C5=C4=CF=D0=C8=DF=D2=C8=DF". =C4=E0=F2=E0: 22.=CE4-2=C7.=CE4.2=CEI=E7 =E3., =D1=E0=ED=EA=F2-=CF=E5=F2=E5= =F0=E1=F3=F0=E3 =CF=D0=CE=C3=D0=C0=CC=CC=C0 =CC=C5=D0=CE=CF=D0=C8=DF=D2=C8=DF: 1. =CE=F1=ED=EE=E2=FB =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9 =E1=E5=E7= =EE=EF=E0=F1=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. =CE=E1=F9=E8=E5 =EF=EE=EB=EE=E6=E5=ED=E8=FF =F2=E5=EE=F0=E8=E8 =FD=EA=EE=ED= =EE=EC=E8=F7=E5=F1=EA=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =CE=F1=ED= =EE=E2=ED=FB=E5 =ED=E0=EF=F0=E0=E2=EB=E5=ED=E8=FF =EE=E1=E5=F1=EF=E5=F7=E5= =ED=E8=FF =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EF=F0=E8=FF=F2= =E8=FF. =C2=ED=E5=F8=ED=E8=E5 =E8 =E2=ED=F3=F2=F0=E5=ED=ED=E8=E5 =F3=E3=F0= =EE=E7=FB. =DD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=E8=E5 =EF=F0=E5=F1=F2=F3=EF=EB= =E5=ED=E8=FF =E8 =EC=EE=F8=E5=ED=ED=E8=F7=E5=F1=F2=E2=EE =E2 =E4=E5=FF=F2= =E5=EB=FC=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. =CF=F0=EE=EC=FB= =F8=EB=E5=ED=ED=FB=E9 =F8=EF=E8=EE=ED=E0=E6 =E8 =FD=EA=EE=ED=EE=EC=E8=F7=E5= =F1=EA=E0=FF (=E1=E8=E7=ED=E5=F1) =F0=E0=E7=E2=E5=E4=EA=E0. =D1=E8=F1=F2=E5= =EC=ED=FB=E9 =EF=EE=E4=F5=EE=E4 =EA =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=FE =FD= =EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8= =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. =D3=EF=F0=E0=E2=EB=E5=ED=E8=E5 =F1=E8= =F1=F2=E5=EC=EE=E9 =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=FF =FD=EA=EE=ED=EE=EC=E8= =F7=E5=F1=EA=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =C7=E0=F9=E8=F2=E0= =EA=EE=ED=F4=E8=E4=E5=ED=F6=E8=E0=EB=FC=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6= =E8=E8.=20 2. =CE=EF=F0=E5=E4=E5=EB=E5=ED=E8=E5 =FD=F4=F4=E5=EA=F2=E8=E2=ED=EE=F1= =F2=E8 =F0=E0=E1=EE=F2=FB =F1=EB=F3=E6=E1=FB =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1= =EA=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =D4=F3=ED=EA=F6=E8=E8, =E7= =E0=E4=E0=F7=E8 =E8 =ED=E0=EF=F0=E0=E2=EB=E5=ED=E8=FF =E4=E5=FF=F2=E5=EB=FC= =ED=EE=F1=F2=E8 =D1=C1. =CF=EB=E0=ED=E8=F0=EE=E2=E0=ED=E8=E5 =F0=E0=E1=EE= =F2=FB. =CF=F0=E0=E2=EE=E2=FB=E5 =EE=F1=ED=EE=E2=FB =E4=E5=FF=F2=E5=EB=FC= =ED=EE=F1=F2=E8 =F1=EB=F3=E6=E1=FB =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. = =D1=EE=F1=F2=E0=E2 =D1=C1, =EF=EE=EB=EE=E6=E5=ED=E8=E5 =EE =EF=EE=E4=F0=E0= =E7=E4=E5=EB=E5=ED=E8=FF=F5. =CE=F0=E3=E0=ED=E8=E7=E0=F6=E8=FF =EB=E8=F7=ED= =EE=E9 =E7=E0=F9=E8=F2=FB. =DD=F2=E0=EF=FB =F1=EE=E7=E4=E0=ED=E8=FF =D1=C1= =E8 =EF=EE=F0=FF=E4=EE=EA =E5=E5 =F4=F3=ED=EA=F6=E8=EE=ED=E8=F0=EE=E2=E0= =ED=E8=FF.=20 3. =D1=E8=F1=F2=E5=EC=E0 =E8 =EC=E5=F2=EE=E4=FB =E0=ED=E0=EB=E8=E7=E0= =E8 =F3=EF=F0=E0=E2=EB=E5=ED=E8=FF =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=E8=EC= =E8 =F0=E8=F1=EA=E0=EC=E8. =CA=EE=F0=EF=EE=F0=E0=F2=E8=E2=ED=FB=E5 =E7=E0= =F5=E2=E0=F2=FB: =E8=ED=F1=F2=F0=F3=EC=E5=ED=F2=FB =EE=E1=ED=E0=F0=F3=E6=E5= =ED=E8=FF =E8 =EF=F0=EE=F2=E8=E2=EE=E4=E5=E9=F1=F2=E2=E8=FF =EA=EE=F0=EF=EE= =F0=E0=F2=E8=E2=ED=FB=EC =E7=E0=F5=E2=E0=F2=E0=EC. =CF=F0=E0=E2=EE=E2=FB=E5= =E8 =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=E8=E5 =E0=F1=EF=E5=EA=F2=FB =EF=F0= =EE=F6=E5=F1=F1=E0 =ED=E5=E4=F0=F3=E6=E5=F1=F2=E2=E5=ED=ED=EE=E3=EE =EF=EE= =E3=EB=EE=F9=E5=ED=E8=FF. =D1=F6=E5=ED=E0=F0=E8=E8 =EF=F0=EE=E2=E5=E4=E5=ED= =E8=FF. 4. =CC=E5=F1=F2=EE =E4=E5=EB=EE=E2=EE=E9 =F0=E0=E7=E2=E5=E4=EA=E8 =E2= =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=E8 =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9= =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =E1=E8=E7=ED=E5=F1=E0. =CF=EE=ED=FF= =F2=E8=E5 =E4=E5=EB=EE=E2=EE=E9 =F0=E0=E7=E2=E5=E4=EA=E8. =D0=EE=EB=FC =E1= =E8=E7=ED=E5=F1-=F0=E0=E7=E2=E5=E4=EA=E8 =E2 =EF=F0=E8=ED=FF=F2=E8=E8 =F3= =EF=F0=E0=E2=EB=E5=ED=F7=E5=F1=EA=EE=E3=EE =F0=E5=F8=E5=ED=E8=FF. =C1=E8=E7= =ED=E5=F1-=F0=E0=E7=E2=E5=E4=EA=E0 =E8 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=FC= =E1=E8=E7=ED=E5=F1=E0. =C8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE-=EF=EE=E8= =F1=EA=EE=E2=E0=FF =F0=E0=E1=EE=F2=E0. =C8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED= =EE-=E0=ED=E0=EB=E8=F2=E8=F7=E5=F1=EA=E0=FF =F0=E0=E1=EE=F2=E0. =CF=F0=EE= =E3=ED=EE=E7=E8=F0=EE=E2=E0=ED=E8=E5 =E1=EB=E0=E3=EE=ED=E0=E4=E5=E6=ED=EE= =F1=F2=E8 =EF=E0=F0=F2=ED=E5=F0=EE=E2 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. = =C0=ED=E0=EB=E8=E7 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =E4=E5=EB=EE=E2=FB= =F5 =EF=F0=E5=E4=EB=EE=E6=E5=ED=E8=E9 =E8 =EA=EE=ED=F2=F0=E0=EA=F2=EE=E2.= =20 5. =C2=ED=E5=E7=E0=EF=ED=E0=FF =EF=F0=EE=E2=E5=F0=EA=E0. =D2=E0=EA=F2= =E8=EA=E0 =EF=EE=E2=E5=E4=E5=ED=E8=FF. =CF=E5=F0=E5=F7=E5=ED=FC =EA=EE=ED= =F2=F0=EE=EB=E8=F0=F3=FE=F9=E8=F5 =EE=F0=E3=E0=ED=EE=E2 =D0=EE=F1=F1=E8=E8= , =EA=EE=F2=EE=F0=FB=EC =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=E5=ED=EE =EF=F0=E0= =E2=EE =EF=F0=EE=E2=EE=E4=E8=F2=FC =EF=F0=EE=E2=E5=F0=EA=E8 =FE=F0=E8=E4=E8= =F7=E5=F1=EA=E8=F5 =EB=E8=F6. =CF=F0=E0=E2=EE=E2=FB=E5 =EE=F1=ED=EE=E2=FB= =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=E8 =EA=EE=ED=F2=F0=EE=EB=E8=F0=F3=FE=F9= =E8=F5 =EE=F0=E3=E0=ED=EE=E2. =CF=F0=EE=F6=E5=E4=F3=F0=E0 =EF=F0=EE=E2=E5= =E4=E5=ED=E8=FF =EF=F0=EE=E2=E5=F0=EE=EA, =E2=E8=E4=FB =EF=F0=EE=E2=E5=F0= =EE=EA =E8 =EE=F1=ED=EE=E2=E0=ED=E8=FF =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF, =EF= =F0=E0=E2=EE=E2=EE=E5 =EF=EE=EB=EE=E6=E5=ED=E8=E5 =F0=F3=EA=EE=E2=EE=E4=E8= =F2=E5=EB=FF =EE=F0=E3=E0=ED=E8=E7=E0=F6=E8=E8 =E8 =E4=EE=EB=E6=ED=EE=F1=F2= =ED=FB=F5 =EB=E8=F6. =CF=F0=E0=E2=E0 =E8 =EE=E1=FF=E7=E0=ED=ED=EE=F1=F2=E8= =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FF =EF=F0=E8 =EE=F1=F3=F9=E5=F1=F2=E2=EB= =E5=ED=E8=E8 =EF=F0=EE=E2=E5=F0=EE=EA.=20 6. =C8=ED=F2=E5=E3=F0=E8=F0=EE=E2=E0=ED=ED=E0=FF =F1=E8=F1=F2=E5=EC=E0= =EE=F5=F0=E0=ED=FB =EE=E1=FA=E5=EA=F2=EE=E2, =CE=E1=F9=E8=E5 =EF=EE=EB=EE= =E6=E5=ED=E8=FF. =CA=EE=ED=F6=E5=EF=F6=E8=FF =EA=EE=EC=EF=EB=E5=EA=F1=ED=EE= =E9 =E7=E0=F9=E8=F2=FB =EE=E1=FA=E5=EA=F2=E0. =CC=EE=E4=E5=EB=FC =EE=E1=FA= =E5=EA=F2=E0 =E7=E0=F9=E8=F2=FB. =CC=EE=E4=E5=EB=FC =F3=E3=F0=EE=E7 =EE=E1= =FA=E5=EA=F2=F3 =E7=E0=F9=E8=F2=FB.=20 7. =CE=F1=ED=EE=E2=FB =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE=E9 =E1=E5= =E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. =CE=E1=F9= =E8=E5 =EF=EE=EB=EE=E6=E5=ED=E8=FF =EF=EE =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED= =ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =D3=E3=F0=EE=E7=FB =EA=EE= =ED=F4=E8=E4=E5=ED=F6=E8=E0=EB=FC=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8= . =CD=E0=EF=F0=E0=E2=EB=E5=ED=E8=FF =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=FF =E8= =ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2= =E8. =C4=E5=E9=F1=F2=E2=E8=FF, =EF=F0=E8=E2=EE=E4=FF=F9=E8=E5 =EA =ED=E5=EF= =F0=E0=E2=EE=EC=E5=F0=ED=EE=EC=F3 =EE=E2=EB=E0=E4=E5=ED=E8=FE =EA=EE=ED=F4= =E8=E4=E5=ED=F6=E8=E0=EB=FC=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E5=E9. =CF= =F0=E0=E2=E8=EB=E0 =F1=EE=E1=EB=FE=E4=E5=ED=E8=FF =E8=ED=F4=EE=F0=EC=E0=F6= =E8=EE=ED=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =E2 =E4=EE=E3=EE=E2= =EE=F0=ED=EE=E9 =F0=E0=E1=EE=F2=E5.=20 8. =CF=F0=E0=E2=EE=E2=FB=E5 =EE=F1=ED=EE=E2=FB =E7=E0=F9=E8=F2=FB =EA= =EE=ED=F4=E8=E4=E5=ED=F6=E8=E0=EB=FC=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8= =E8. =CE=EF=F0=E5=E4=E5=EB=E5=ED=E8=E5 =EF=EE=ED=FF=F2=E8=E9 '=EA=EE=ED=F4= =E8=E4=E5=ED=F6=E8=E0=EB=FC=ED=E0=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF' =E8 = '=EA=EE=EC=EC=E5=F0=F7=E5=F1=EA=E0=FF =F2=E0=E9=ED=E0' =E2 =F1=EE=EE=F2=E2= =E5=F2=F1=F2=E2=E8=E8 =F1 =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=EE= =EC =D0=D4. =C8=ED=F4=EE=F0=EC=E0=F6=E8=FF, =EA=EE=F2=EE=F0=E0=FF =ED=E5 = =EC=EE=E6=E5=F2 =F1=EE=F1=F2=E0=E2=EB=FF=F2=FC =EA=EE=EC=EC=E5=F0=F7=E5=F1= =EA=F3=FE =F2=E0=E9=ED=F3. =C8=ED=F4=EE=F0=EC=E0=F6=E8=FF, =EA=EE=F2=EE=F0= =E0=FF =EE=E1=FF=E7=E0=ED=E0 =FF=E2=EB=FF=F2=FC=F1=FF =EA=EE=EC=EC=E5=F0=F7= =E5=F1=EA=EE=E9 =F2=E0=E9=ED=EE=E9. =CF=F0=E5=E4=F3=F1=EC=EE=F2=F0=E5=ED=ED= =FB=E5 =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=EE=EC =D0=D4 =F1=EB=F3= =F7=E0=E8 =EF=F0=E5=EA=F0=E0=F9=E5=ED=E8=FF =EF=F0=E0=E2=E0 =ED=E0 =E8=ED= =F4=EE=F0=EC=E0=F6=E8=FE, =F1=EE=F1=F2=E0=E2=EB=FF=FE=F9=F3=FE =EA=EE=EC=EC= =E5=F0=F7=E5=F1=EA=F3=FE =F2=E0=E9=ED=F3. 9. =CC=E5=F0=EE=EF=F0=E8=FF=F2=E8=FF =EF=EE =E7=E0=F9=E8=F2=E5 =EA=EE= =ED=F4=E8=E4=E5=ED=F6=E8=E0=EB=FC=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8= . =CE=E1=E5=F1=EF=E5=F7=E5=ED=E8=E5 =F1=EE=F5=F0=E0=ED=E5=ED=E8=FF =EA=EE=EC= =EC=E5=F0=F7=E5=F1=EA=EE=E9 =F2=E0=E9=ED=FB =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8= =FF. =CC=E5=F0=EE=EF=F0=E8=FF=F2=E8=FF =EF=EE =EF=F0=E5=E4=F3=EF=F0=E5=E6= =E4=E5=ED=E8=FE =F0=E0=E7=E3=EB=E0=F8=E5=ED=E8=FF =EA=EE=ED=F4=E8=E4=E5=ED= =F6=E8=E0=EB=FC=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8. =CE=F0=E3=E0=ED=E8= =E7=E0=F6=E8=EE=ED=ED=E0=FF =E7=E0=F9=E8=F2=E0 =E8=ED=F4=EE=F0=EC=E0=F6=E8= =E8. =D0=E5=E6=E8=EC=ED=EE-=EE=F5=F0=E0=ED=ED=FB=E5 =EC=E5=F0=EE=EF=F0=E8= =FF=F2=E8=FF. =D0=E0=E1=EE=F2=E0 =F1 =F1=EE=F2=F0=F3=E4=ED=E8=EA=E0=EC=E8= .=20 10. =CC=E5=F0=FB =EF=EE =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=FE =E8=ED=F4=EE=F0= =EC=E0=F6=E8=EE=ED=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =EF=F0=E5= =E4=EF=F0=E8=FF=F2=E8=FF, =F1=E2=FF=E7=E0=ED=ED=FB=E5 =F1 =EA=E0=E4=F0=EE= =E2=EE=E9 =F0=E0=E1=EE=F2=EE=E9.=20 11. =D2=E5=F5=ED=E8=F7=E5=F1=EA=E8=E5 =F1=F0=E5=E4=F1=F2=E2=E0 =EF=F0=EE=EC= =FB=F8=EB=E5=ED=ED=EE=E3=EE =F8=EF=E8=EE=ED=E0=E6=E0 =E8 =F1=F0=E5=E4=F1=F2= =E2=E0 =E8=F5 =EE=E1=ED=E0=F0=F3=E6=E5=ED=E8=FF. =CC=E5=F0=EE=EF=F0=E8=FF= =F2=E8=FF =EF=EE =E7=E0=F9=E8=F2=E5 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8 =EE=F2= =F3=F2=E5=F7=EA=E8 =EF=EE =F2=E5=F5=ED=E8=F7=E5=F1=EA=E8=EC =EA=E0=ED=E0= =EB=E0=EC. =CC=E5=F0=EE=EF=F0=E8=FF=F2=E8=FF =EF=EE =EF=F0=E5=F1=E5=F7=E5= =ED=E8=FE =ED=E5=F1=E0=ED=EA=F6=E8=EE=ED=E8=F0=EE=E2=E0=ED=ED=EE=E3=EE =E4= =EE=F1=F2=F3=EF=E0 =EA =EA=EE=ED=F4=E8=E4=E5=ED=F6=E8=E0=EB=FC=ED=EE=E9 =E8= =ED=F4=EE=F0=EC=E0=F6=E8=E8. =C7=E0=F9=E8=F2=E0 =EA=EE=EC=EF=FC=FE=F2=E5=F0= =ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8. =CE=E1=E5=F1=EF=E5=F7=E5=ED=E8=E5= =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =EA=E0=ED=E0=EB=EE=E2 =F1=E2=FF=E7=E8= . =D2=E5=F5=ED=E8=F7=E5=F1=EA=E8=E5 =F1=F0=E5=E4=F1=F2=E2=E0 =E8=ED=F4=EE= =F0=EC=E0=F6=E8=EE=ED=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =C2=EE= =E7=EC=EE=E6=ED=FB=E5 =F2=E5=F5=ED=E8=F7=E5=F1=EA=E8=E5 =EA=E0=ED=E0=EB=FB= =F3=F2=E5=F7=EA=E8 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8.=20 12. =C7=E0=F9=E8=F2=E0 =EA=EE=EC=EF=FC=FE=F2=E5=F0=ED=EE=E9 =E8=ED=F4=EE=F0= =EC=E0=F6=E8=E8. =C2=EE=E7=EC=EE=E6=ED=FB=E5 =F1=EF=EE=F1=EE=E1=FB =F3=F2= =E5=F0=E8, =E8=F1=EA=E0=E6=E5=ED=E8=FF, =E8=E7=EC=E5=ED=E5=ED=E8=FF =EA=EE= =EC=EF=FC=FE=F2=E5=F0=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8 =E8=EB=E8 =EF= =EE=EB=F3=F7=E5=ED=E8=FF =EA =ED=E5=E9 =ED=E5=F1=E0=ED=EA=F6=E8=EE=ED=E8=F0= =EE=E2=E0=ED=ED=EE=E3=EE =E4=EE=F1=F2=F3=EF=E0; =EF=F0=E0=E2=E8=EB=E0 =EF= =F0=E8 =E2=FB=E1=EE=F0=E5 =F1=F0=E5=E4=F1=F2=E2=E0 =E7=E0=F9=E8=F2=FB =EA= =EE=EC=EF=FC=FE=F2=E5=F0=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8; =EE=F1=ED= =EE=E2=FB =EA=F0=E8=EF=F2=EE=E3=F0=E0=F4=E8=F7=E5=F1=EA=EE=E9 =E7=E0=F9=E8= =F2=FB =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8; =E2=E8=F0=F3=F1=ED=E0=FF =F3=E3=F0= =EE=E7=E0 =EA=EE=EC=EF=FC=FE=F2=E5=F0=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8= =E8; =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=FC =E7=E0=F9=E8=F2=FB =E8=ED=F4=EE=F0= =EC=E0=F6=E8=E8 =EF=F0=E8 =F0=E0=E1=EE=F2=E5 =E2 =F1=E5=F2=E8 "=C8=ED=F2=E5= =F0=ED=E5=F2"; =E0=F0=F5=E8=E2=E8=F0=EE=E2=E0=ED=E8=E5 =EA=EE=EC=EF=FC=FE= =F2=E5=F0=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8. =DD=EB=E5=EA=F2=F0=EE=ED= =ED=EE-=F6=E8=F4=F0=EE=E2=E0=FF =EF=EE=E4=EF=E8=F1=FC =EA=E0=EA =F1=F0=E5= =E4=F1=F2=E2=EE =E7=E0=F9=E8=F2=FB =E4=EE=EA=F3=EC=E5=ED=F2=EE=E2, =EF=F0= =E5=E4=F1=F2=E0=E2=EB=E5=ED=ED=FB=F5 =E2 =FD=EB=E5=EA=F2=F0=EE=ED=ED=EE=EC= =E2=E8=E4=E5. =C7=E0=F9=E8=F2=E0 =EA=EE=EC=EF=FC=FE=F2=E5=F0=ED=FB=F5 =F1= =E5=F2=E5=E9.=20 13. =CF=EE=F0=FF=E4=EE=EA =EE=F4=EE=F0=EC=EB=E5=ED=E8=FF =E8 =E2=E5=E4=E5= =ED=E8=FF =F1=EB=F3=E6=E5=E1=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8= =EF=F0=E8 =E2=E2=EE=E4=E5 =E8 =E2 =EF=F0=EE=F6=E5=F1=F1=E5 =FD=EA=F1=EF=EB= =F3=E0=F2=E0=F6=E8=E8 =F1=E8=F1=F2=E5=EC=FB =EE=F5=F0=E0=ED=FB =EF=F0=E5=E4= =EF=F0=E8=FF=F2=E8=FF. =CA=EE=ED=F2=F0=EE=EB=FC =F4=F3=ED=EA=F6=E8=EE=ED=E8= =F0=EE=E2=E0=ED=E8=FF =F1=E8=F1=F2=E5=EC=FB =EE=F5=F0=E0=ED=FB =EF=F0=E5=E4= =EF=F0=E8=FF=F2=E8=FF.=20 14. =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E0=FF =E4=E5=EC=EE=ED=F1=F2=F0=E0=F6=E8= =FF =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=E5=E9 =F1=F0=E5=E4=F1=F2=E2 =EA=EE=ED=F2= =F0=EE=EB=FF =E8 =F3=EF=F0=E0=E2=EB=E5=ED=E8=FF =E4=EE=F1=F2=F3=EF=EE=EC,= =F1=F0=E5=E4=F1=F2=E2 =EF=F0=EE=F2=E8=E2=EE=E4=E5=E9=F1=F2=E2=E8=FF =EF=F0= =EE=EC=FB=F8=EB=E5=ED=ED=EE=EC=F3 =F8=EF=E8=EE=ED=E0=E6=F3. B=FB =ECo=E6e=F2e y=F2o=F7=ED=E8=F2=FC yc=EBo=E2=E8=FF y=F7ac=F2=E8=FF =E8= =E7a=EFpoc=E8=F2=FC =C1=C5=D1=CF=CB=C0=D2=CD=CE =EFo=EB=EDy=FE =EFpo=E3p= a=EC=ECy =ECepo=EFp=E8=FF=F2=E8=FF =EFo =F2e=EBe=F4o=EDy 8 { =EA=EE=E4 =CF=E8=F2=E5=F0=E0 } 98 6 ^8.2 2 ^9=20 ------=_NextPart_000_0EDD_01CE399F.49BC17D0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CF=D0=C8=C3=CB=C0=D8=C0=C5=CC =CF=CE=D1=C5=D2=C8=D2=DC =CA=CE=CD=D1= =D3=CB=DC=D2=C0=D6=C8=CE=CD=CD=CE=C5 =CC=C5=D0=CE=CF=D0=C8=DF=D2=C8=C5:"=DD=CA=CE=CD=CE=CC=C8=D7=C5=D1=CA=C0=DF=20 =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=DC =CF=D0=C5=C4=CF=D0=C8=DF=D2=C8=DF".<= /DIV>
 
=C4=E0=F2=E0:=20 22.=CE4-2=C7.=CE4.2=CEI=E7=20 =E3., =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
 
=CF=D0=CE=C3=D0=C0=CC=CC=C0 =CC=C5=D0=CE=CF=D0=C8=DF=D2=C8=DF:
 
1.     =CE=F1=ED=EE=E2=FB =FD=EA=EE=ED=EE=EC=E8=F7= =E5=F1=EA=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8=20 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF.
=CE=E1=F9=E8=E5 =EF=EE=EB=EE=E6=E5=ED= =E8=FF =F2=E5=EE=F0=E8=E8 =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9 =E1=E5=E7= =EE=EF=E0=F1=ED=EE=F1=F2=E8. =CE=F1=ED=EE=E2=ED=FB=E5=20 =ED=E0=EF=F0=E0=E2=EB=E5=ED=E8=FF =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=FF =E1=E5= =E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. =C2=ED=E5= =F8=ED=E8=E5 =E8 =E2=ED=F3=F2=F0=E5=ED=ED=E8=E5 =F3=E3=F0=EE=E7=FB.=20 =DD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=E8=E5 =EF=F0=E5=F1=F2=F3=EF=EB=E5=ED=E8= =FF =E8 =EC=EE=F8=E5=ED=ED=E8=F7=E5=F1=F2=E2=EE =E2 =E4=E5=FF=F2=E5=EB=FC= =ED=EE=F1=F2=E8 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF.=20 =CF=F0=EE=EC=FB=F8=EB=E5=ED=ED=FB=E9 =F8=EF=E8=EE=ED=E0=E6 =E8 =FD=EA=EE=ED= =EE=EC=E8=F7=E5=F1=EA=E0=FF (=E1=E8=E7=ED=E5=F1) =F0=E0=E7=E2=E5=E4=EA=E0= . =D1=E8=F1=F2=E5=EC=ED=FB=E9 =EF=EE=E4=F5=EE=E4 =EA=20 =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=FE =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9= =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. = =D3=EF=F0=E0=E2=EB=E5=ED=E8=E5 =F1=E8=F1=F2=E5=EC=EE=E9=20 =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=FF =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9= =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =C7=E0=F9=E8=F2=E0 =EA=EE=ED=F4=E8= =E4=E5=ED=F6=E8=E0=EB=FC=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8.=20
 
2.     =CE=EF=F0=E5=E4=E5=EB=E5=ED=E8=E5 =FD=F4=F4= =E5=EA=F2=E8=E2=ED=EE=F1=F2=E8 =F0=E0=E1=EE=F2=FB =F1=EB=F3=E6=E1=FB=20 =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2= =E8. =D4=F3=ED=EA=F6=E8=E8, =E7=E0=E4=E0=F7=E8 =E8 =ED=E0=EF=F0=E0=E2=EB=E5= =ED=E8=FF =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=E8 =D1=C1.=20 =CF=EB=E0=ED=E8=F0=EE=E2=E0=ED=E8=E5 =F0=E0=E1=EE=F2=FB. =CF=F0=E0=E2=EE=E2= =FB=E5 =EE=F1=ED=EE=E2=FB  =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=E8 =F1=EB= =F3=E6=E1=FB =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8.=20 =D1=EE=F1=F2=E0=E2 =D1=C1, =EF=EE=EB=EE=E6=E5=ED=E8=E5 =EE =EF=EE=E4=F0=E0= =E7=E4=E5=EB=E5=ED=E8=FF=F5. =CE=F0=E3=E0=ED=E8=E7=E0=F6=E8=FF =EB=E8=F7=ED= =EE=E9 =E7=E0=F9=E8=F2=FB. =DD=F2=E0=EF=FB =F1=EE=E7=E4=E0=ED=E8=FF=20 =D1=C1 =E8 =EF=EE=F0=FF=E4=EE=EA =E5=E5 =F4=F3=ED=EA=F6=E8=EE=ED=E8=F0=EE= =E2=E0=ED=E8=FF.
 
3.     =D1=E8=F1=F2=E5=EC=E0 =E8 =EC=E5=F2=EE=E4= =FB =E0=ED=E0=EB=E8=E7=E0 =E8 =F3=EF=F0=E0=E2=EB=E5=ED=E8=FF=20 =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=E8=EC=E8 =F0=E8=F1=EA=E0=EC=E8. =CA=EE=F0= =EF=EE=F0=E0=F2=E8=E2=ED=FB=E5 =E7=E0=F5=E2=E0=F2=FB: =E8=ED=F1=F2=F0=F3=EC= =E5=ED=F2=FB =EE=E1=ED=E0=F0=F3=E6=E5=ED=E8=FF =E8=20 =EF=F0=EE=F2=E8=E2=EE=E4=E5=E9=F1=F2=E2=E8=FF =EA=EE=F0=EF=EE=F0=E0=F2=E8= =E2=ED=FB=EC =E7=E0=F5=E2=E0=F2=E0=EC. =CF=F0=E0=E2=EE=E2=FB=E5 =E8 =FD=EA= =EE=ED=EE=EC=E8=F7=E5=F1=EA=E8=E5 =E0=F1=EF=E5=EA=F2=FB=20 =EF=F0=EE=F6=E5=F1=F1=E0 =ED=E5=E4=F0=F3=E6=E5=F1=F2=E2=E5=ED=ED=EE=E3=EE= =EF=EE=E3=EB=EE=F9=E5=ED=E8=FF. =D1=F6=E5=ED=E0=F0=E8=E8 =EF=F0=EE=E2=E5= =E4=E5=ED=E8=FF.
 
4.     =CC=E5=F1=F2=EE =E4=E5=EB=EE=E2=EE=E9 =F0= =E0=E7=E2=E5=E4=EA=E8 =E2 =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=E8=20 =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2= =E8 =E1=E8=E7=ED=E5=F1=E0. =CF=EE=ED=FF=F2=E8=E5 =E4=E5=EB=EE=E2=EE=E9 =F0= =E0=E7=E2=E5=E4=EA=E8. =D0=EE=EB=FC=20 =E1=E8=E7=ED=E5=F1-=F0=E0=E7=E2=E5=E4=EA=E8 =E2 =EF=F0=E8=ED=FF=F2=E8=E8 = =F3=EF=F0=E0=E2=EB=E5=ED=F7=E5=F1=EA=EE=E3=EE =F0=E5=F8=E5=ED=E8=FF. =C1=E8= =E7=ED=E5=F1-=F0=E0=E7=E2=E5=E4=EA=E0 =E8=20 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=FC =E1=E8=E7=ED=E5=F1=E0. =C8=ED=F4=EE=F0= =EC=E0=F6=E8=EE=ED=ED=EE-=EF=EE=E8=F1=EA=EE=E2=E0=FF =F0=E0=E1=EE=F2=E0.=20 =C8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE-=E0=ED=E0=EB=E8=F2=E8=F7=E5=F1=EA= =E0=FF =F0=E0=E1=EE=F2=E0. =CF=F0=EE=E3=ED=EE=E7=E8=F0=EE=E2=E0=ED=E8=E5 = =E1=EB=E0=E3=EE=ED=E0=E4=E5=E6=ED=EE=F1=F2=E8 =EF=E0=F0=F2=ED=E5=F0=EE=E2= =20 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. =C0=ED=E0=EB=E8=E7 =E1=E5=E7=EE=EF=E0=F1= =ED=EE=F1=F2=E8 =E4=E5=EB=EE=E2=FB=F5 =EF=F0=E5=E4=EB=EE=E6=E5=ED=E8=E9 =E8= =EA=EE=ED=F2=F0=E0=EA=F2=EE=E2.
 
5.     =C2=ED=E5=E7=E0=EF=ED=E0=FF =EF=F0=EE=E2=E5= =F0=EA=E0. =D2=E0=EA=F2=E8=EA=E0 =EF=EE=E2=E5=E4=E5=ED=E8=FF. =20 =CF=E5=F0=E5=F7=E5=ED=FC =EA=EE=ED=F2=F0=EE=EB=E8=F0=F3=FE=F9=E8=F5 =EE=F0= =E3=E0=ED=EE=E2 =D0=EE=F1=F1=E8=E8, =EA=EE=F2=EE=F0=FB=EC =EF=F0=E5=E4=EE= =F1=F2=E0=E2=EB=E5=ED=EE =EF=F0=E0=E2=EE =EF=F0=EE=E2=EE=E4=E8=F2=FC=20 =EF=F0=EE=E2=E5=F0=EA=E8 =FE=F0=E8=E4=E8=F7=E5=F1=EA=E8=F5 =EB=E8=F6. =CF= =F0=E0=E2=EE=E2=FB=E5 =EE=F1=ED=EE=E2=FB =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2= =E8 =EA=EE=ED=F2=F0=EE=EB=E8=F0=F3=FE=F9=E8=F5 =EE=F0=E3=E0=ED=EE=E2.=20 =CF=F0=EE=F6=E5=E4=F3=F0=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF =EF=F0=EE=E2=E5= =F0=EE=EA, =E2=E8=E4=FB =EF=F0=EE=E2=E5=F0=EE=EA =E8 =EE=F1=ED=EE=E2=E0=ED= =E8=FF =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF, =EF=F0=E0=E2=EE=E2=EE=E5=20 =EF=EE=EB=EE=E6=E5=ED=E8=E5 =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FF =EE=F0=E3= =E0=ED=E8=E7=E0=F6=E8=E8 =E8 =E4=EE=EB=E6=ED=EE=F1=F2=ED=FB=F5 =EB=E8=F6.= =CF=F0=E0=E2=E0 =E8 =EE=E1=FF=E7=E0=ED=ED=EE=F1=F2=E8=20 =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FF =EF=F0=E8 =EE=F1=F3=F9=E5=F1=F2=E2=EB= =E5=ED=E8=E8 =EF=F0=EE=E2=E5=F0=EE=EA.
 
6.     =C8=ED=F2=E5=E3=F0=E8=F0=EE=E2=E0=ED=ED=E0= =FF =F1=E8=F1=F2=E5=EC=E0 =EE=F5=F0=E0=ED=FB =EE=E1=FA=E5=EA=F2=EE=E2, =CE= =E1=F9=E8=E5=20 =EF=EE=EB=EE=E6=E5=ED=E8=FF. =CA=EE=ED=F6=E5=EF=F6=E8=FF =EA=EE=EC=EF=EB=E5= =EA=F1=ED=EE=E9 =E7=E0=F9=E8=F2=FB =EE=E1=FA=E5=EA=F2=E0. =CC=EE=E4=E5=EB= =FC =EE=E1=FA=E5=EA=F2=E0 =E7=E0=F9=E8=F2=FB. =CC=EE=E4=E5=EB=FC=20 =F3=E3=F0=EE=E7 =EE=E1=FA=E5=EA=F2=F3 =E7=E0=F9=E8=F2=FB.
 
7.     =CE=F1=ED=EE=E2=FB =E8=ED=F4=EE=F0=EC=E0=F6= =E8=EE=ED=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EF=F0= =E8=FF=F2=E8=FF.=20 =CE=E1=F9=E8=E5 =EF=EE=EB=EE=E6=E5=ED=E8=FF =EF=EE =E8=ED=F4=EE=F0=EC=E0=F6= =E8=EE=ED=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =D3=E3=F0=EE=E7=FB= =EA=EE=ED=F4=E8=E4=E5=ED=F6=E8=E0=EB=FC=ED=EE=E9=20 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8. =CD=E0=EF=F0=E0=E2=EB=E5=ED=E8=FF =EE=E1=E5= =F1=EF=E5=F7=E5=ED=E8=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE=E9 =E1=E5= =E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =C4=E5=E9=F1=F2=E2=E8=FF,=20 =EF=F0=E8=E2=EE=E4=FF=F9=E8=E5 =EA =ED=E5=EF=F0=E0=E2=EE=EC=E5=F0=ED=EE=EC= =F3 =EE=E2=EB=E0=E4=E5=ED=E8=FE =EA=EE=ED=F4=E8=E4=E5=ED=F6=E8=E0=EB=FC=ED= =EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E5=E9. =CF=F0=E0=E2=E8=EB=E0=20 =F1=EE=E1=EB=FE=E4=E5=ED=E8=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE=E9= =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =E2 =E4=EE=E3=EE=E2=EE=F0=ED=EE=E9 = =F0=E0=E1=EE=F2=E5.
 
8.     =CF=F0=E0=E2=EE=E2=FB=E5 =EE=F1=ED=EE=E2=FB= =E7=E0=F9=E8=F2=FB =EA=EE=ED=F4=E8=E4=E5=ED=F6=E8=E0=EB=FC=ED=EE=E9=20 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8. =CE=EF=F0=E5=E4=E5=EB=E5=ED=E8=E5 =EF=EE=ED= =FF=F2=E8=E9 '=EA=EE=ED=F4=E8=E4=E5=ED=F6=E8=E0=EB=FC=ED=E0=FF =E8=ED=F4=EE= =F0=EC=E0=F6=E8=FF' =E8 '=EA=EE=EC=EC=E5=F0=F7=E5=F1=EA=E0=FF=20 =F2=E0=E9=ED=E0' =E2 =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =F1 =E7=E0=EA=EE= =ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=EE=EC =D0=D4. =C8=ED=F4=EE=F0=EC=E0=F6=E8= =FF, =EA=EE=F2=EE=F0=E0=FF =ED=E5 =EC=EE=E6=E5=F2=20 =F1=EE=F1=F2=E0=E2=EB=FF=F2=FC =EA=EE=EC=EC=E5=F0=F7=E5=F1=EA=F3=FE =F2=E0= =E9=ED=F3. =C8=ED=F4=EE=F0=EC=E0=F6=E8=FF, =EA=EE=F2=EE=F0=E0=FF =EE=E1=FF= =E7=E0=ED=E0 =FF=E2=EB=FF=F2=FC=F1=FF =EA=EE=EC=EC=E5=F0=F7=E5=F1=EA=EE=E9= =20 =F2=E0=E9=ED=EE=E9. =CF=F0=E5=E4=F3=F1=EC=EE=F2=F0=E5=ED=ED=FB=E5 =E7=E0=EA= =EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=EE=EC =D0=D4 =F1=EB=F3=F7=E0=E8 =EF=F0= =E5=EA=F0=E0=F9=E5=ED=E8=FF =EF=F0=E0=E2=E0 =ED=E0=20 =E8=ED=F4=EE=F0=EC=E0=F6=E8=FE, =F1=EE=F1=F2=E0=E2=EB=FF=FE=F9=F3=FE =EA=EE= =EC=EC=E5=F0=F7=E5=F1=EA=F3=FE =F2=E0=E9=ED=F3.
 
9.     =CC=E5=F0=EE=EF=F0=E8=FF=F2=E8=FF =EF=EE = =E7=E0=F9=E8=F2=E5 =EA=EE=ED=F4=E8=E4=E5=ED=F6=E8=E0=EB=FC=ED=EE=E9=20 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8.
=CE=E1=E5=F1=EF=E5=F7=E5=ED=E8=E5 =F1=EE= =F5=F0=E0=ED=E5=ED=E8=FF =EA=EE=EC=EC=E5=F0=F7=E5=F1=EA=EE=E9 =F2=E0=E9=ED= =FB =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF.=20 =CC=E5=F0=EE=EF=F0=E8=FF=F2=E8=FF =EF=EE =EF=F0=E5=E4=F3=EF=F0=E5=E6=E4=E5= =ED=E8=FE =F0=E0=E7=E3=EB=E0=F8=E5=ED=E8=FF =EA=EE=ED=F4=E8=E4=E5=ED=F6=E8= =E0=EB=FC=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8.=20 =CE=F0=E3=E0=ED=E8=E7=E0=F6=E8=EE=ED=ED=E0=FF =E7=E0=F9=E8=F2=E0 =E8=ED=F4= =EE=F0=EC=E0=F6=E8=E8. =D0=E5=E6=E8=EC=ED=EE-=EE=F5=F0=E0=ED=ED=FB=E5 =EC= =E5=F0=EE=EF=F0=E8=FF=F2=E8=FF. =D0=E0=E1=EE=F2=E0 =F1=20 =F1=EE=F2=F0=F3=E4=ED=E8=EA=E0=EC=E8.
 
10. =CC=E5=F0=FB =EF=EE =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=FE =E8=ED=F4=EE= =F0=EC=E0=F6=E8=EE=ED=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =EF=F0= =E5=E4=EF=F0=E8=FF=F2=E8=FF, =F1=E2=FF=E7=E0=ED=ED=FB=E5=20 =F1 =EA=E0=E4=F0=EE=E2=EE=E9 =F0=E0=E1=EE=F2=EE=E9.
 
11. =D2=E5=F5=ED=E8=F7=E5=F1=EA=E8=E5 =F1=F0=E5=E4=F1=F2=E2=E0 =EF=F0= =EE=EC=FB=F8=EB=E5=ED=ED=EE=E3=EE =F8=EF=E8=EE=ED=E0=E6=E0 =E8 =F1=F0=E5=E4= =F1=F2=E2=E0 =E8=F5 =EE=E1=ED=E0=F0=F3=E6=E5=ED=E8=FF.=20 =CC=E5=F0=EE=EF=F0=E8=FF=F2=E8=FF =EF=EE =E7=E0=F9=E8=F2=E5 =E8=ED=F4=EE=F0= =EC=E0=F6=E8=E8 =EE=F2 =F3=F2=E5=F7=EA=E8 =EF=EE =F2=E5=F5=ED=E8=F7=E5=F1= =EA=E8=EC =EA=E0=ED=E0=EB=E0=EC. =CC=E5=F0=EE=EF=F0=E8=FF=F2=E8=FF=20 =EF=EE =EF=F0=E5=F1=E5=F7=E5=ED=E8=FE =ED=E5=F1=E0=ED=EA=F6=E8=EE=ED=E8=F0= =EE=E2=E0=ED=ED=EE=E3=EE =E4=EE=F1=F2=F3=EF=E0 =EA =EA=EE=ED=F4=E8=E4=E5=ED= =F6=E8=E0=EB=FC=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8. =C7=E0=F9=E8=F2=E0= =20 =EA=EE=EC=EF=FC=FE=F2=E5=F0=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8. =CE=E1= =E5=F1=EF=E5=F7=E5=ED=E8=E5 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =EA=E0=ED= =E0=EB=EE=E2 =F1=E2=FF=E7=E8. =D2=E5=F5=ED=E8=F7=E5=F1=EA=E8=E5=20 =F1=F0=E5=E4=F1=F2=E2=E0 =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE=E9 =E1=E5= =E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =C2=EE=E7=EC=EE=E6=ED=FB=E5 =F2=E5=F5=ED=E8= =F7=E5=F1=EA=E8=E5 =EA=E0=ED=E0=EB=FB =F3=F2=E5=F7=EA=E8=20 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8.
 
12. =C7=E0=F9=E8=F2=E0 =EA=EE=EC=EF=FC=FE=F2=E5=F0=ED=EE=E9 =E8=ED=F4= =EE=F0=EC=E0=F6=E8=E8. =C2=EE=E7=EC=EE=E6=ED=FB=E5 =F1=EF=EE=F1=EE=E1=FB = =F3=F2=E5=F0=E8, =E8=F1=EA=E0=E6=E5=ED=E8=FF,=20 =E8=E7=EC=E5=ED=E5=ED=E8=FF =EA=EE=EC=EF=FC=FE=F2=E5=F0=ED=EE=E9 =E8=ED=F4= =EE=F0=EC=E0=F6=E8=E8 =E8=EB=E8 =EF=EE=EB=F3=F7=E5=ED=E8=FF =EA =ED=E5=E9= =ED=E5=F1=E0=ED=EA=F6=E8=EE=ED=E8=F0=EE=E2=E0=ED=ED=EE=E3=EE=20 =E4=EE=F1=F2=F3=EF=E0; =EF=F0=E0=E2=E8=EB=E0 =EF=F0=E8 =E2=FB=E1=EE=F0=E5= =F1=F0=E5=E4=F1=F2=E2=E0 =E7=E0=F9=E8=F2=FB =EA=EE=EC=EF=FC=FE=F2=E5=F0=ED= =EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8; =EE=F1=ED=EE=E2=FB=20 =EA=F0=E8=EF=F2=EE=E3=F0=E0=F4=E8=F7=E5=F1=EA=EE=E9 =E7=E0=F9=E8=F2=FB =E8= =ED=F4=EE=F0=EC=E0=F6=E8=E8; =E2=E8=F0=F3=F1=ED=E0=FF =F3=E3=F0=EE=E7=E0 = =EA=EE=EC=EF=FC=FE=F2=E5=F0=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8;=20 =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=FC =E7=E0=F9=E8=F2=FB =E8=ED=F4=EE=F0=EC=E0= =F6=E8=E8 =EF=F0=E8 =F0=E0=E1=EE=F2=E5 =E2 =F1=E5=F2=E8 "=C8=ED=F2=E5=F0=ED= =E5=F2"; =E0=F0=F5=E8=E2=E8=F0=EE=E2=E0=ED=E8=E5=20 =EA=EE=EC=EF=FC=FE=F2=E5=F0=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8. =DD=EB= =E5=EA=F2=F0=EE=ED=ED=EE-=F6=E8=F4=F0=EE=E2=E0=FF =EF=EE=E4=EF=E8=F1=FC =EA= =E0=EA =F1=F0=E5=E4=F1=F2=E2=EE =E7=E0=F9=E8=F2=FB=20 =E4=EE=EA=F3=EC=E5=ED=F2=EE=E2, =EF=F0=E5=E4=F1=F2=E0=E2=EB=E5=ED=ED=FB=F5= =E2 =FD=EB=E5=EA=F2=F0=EE=ED=ED=EE=EC =E2=E8=E4=E5. =C7=E0=F9=E8=F2=E0 =EA= =EE=EC=EF=FC=FE=F2=E5=F0=ED=FB=F5 =F1=E5=F2=E5=E9.
 
13. =CF=EE=F0=FF=E4=EE=EA =EE=F4=EE=F0=EC=EB=E5=ED=E8=FF =E8 =E2=E5=E4= =E5=ED=E8=FF =F1=EB=F3=E6=E5=E1=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8= =E8 =EF=F0=E8 =E2=E2=EE=E4=E5 =E8 =E2=20 =EF=F0=EE=F6=E5=F1=F1=E5 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8 =F1=E8=F1=F2= =E5=EC=FB =EE=F5=F0=E0=ED=FB =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. =CA=EE=ED= =F2=F0=EE=EB=FC =F4=F3=ED=EA=F6=E8=EE=ED=E8=F0=EE=E2=E0=ED=E8=FF=20 =F1=E8=F1=F2=E5=EC=FB =EE=F5=F0=E0=ED=FB =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF= .
 
14. =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E0=FF =E4=E5=EC=EE=ED=F1=F2=F0=E0= =F6=E8=FF =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=E5=E9 =F1=F0=E5=E4=F1=F2=E2 =EA=EE= =ED=F2=F0=EE=EB=FF =E8 =F3=EF=F0=E0=E2=EB=E5=ED=E8=FF=20 =E4=EE=F1=F2=F3=EF=EE=EC, =F1=F0=E5=E4=F1=F2=E2 =EF=F0=EE=F2=E8=E2=EE=E4=E5= =E9=F1=F2=E2=E8=FF =EF=F0=EE=EC=FB=F8=EB=E5=ED=ED=EE=EC=F3 =F8=EF=E8=EE=ED= =E0=E6=F3.
 

B=FB =ECo=E6e=F2e y=F2o=F7=ED=E8=F2=FC yc=EBo=E2=E8=FF y=F7ac=F2= =E8=FF =E8 =E7a=EFpoc=E8=F2=FC =C1=C5=D1=CF=CB=C0=D2=CD=CE =EFo=EB=EDy=FE= =20 =EFpo=E3pa=EC=ECy =ECepo=EFp=E8=FF=F2=E8=FF =EFo=20 =F2e=EBe=F4o=EDy
8 { =EA=EE=E4 =CF=E8=F2=E5=F0=E0 } 98 6 ^8= .2 2 ^9
------=_NextPart_000_0EDD_01CE399F.49BC17D0-- From yongtaofu@gmail.com Mon Apr 15 00:04:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6618B7F53 for ; Mon, 15 Apr 2013 00:04:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 42E5A8F8033 for ; Sun, 14 Apr 2013 22:04:50 -0700 (PDT) X-ASG-Debug-ID: 1366002288-04cb6c6e2bc1a70001-NocioJ Received: from mail-ie0-f177.google.com (mail-ie0-f177.google.com [209.85.223.177]) by cuda.sgi.com with ESMTP id s5lw0WYZGhqmmuOO (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 14 Apr 2013 22:04:48 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] Received: by mail-ie0-f177.google.com with SMTP id 9so5066251iec.36 for ; Sun, 14 Apr 2013 22:04:48 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=pqQxT4ki+bkCo+6RZFB4/Oz00NYCFFSBsYkmA41zNSg=; b=NXQ/YGEpS5nIpfs1KF1ZZR3cAerJZ4FbC0cL5HC6BfCAJAKg1LaOMF7xsUVd4xQFk4 RNOcXqBcdhS5Mkq+NAQxlWQ3UQcu54Ko7NHIgfKabzlJ7pkWcVP6wH8v7jd2Mx1zD4R6 I0NY9JU/SZHLCHT2/8RZwSjwQHDwg1VRuZeEVtBDKL/X1zJZ2lzZlSCmQq6Dl+85lliF TNZNCG7RKjPPlFV8VqR5xk2UNEojBk1w/wviS1uzrV0rzZj+54LEvqAGdTVOijOdkkvl xsgu048wjfwm4SCjnqQjqLdySKX+aOWiLWPGr6MGl7cmoD34IqQtB6jpr09qqAYY1hCK 5pNA== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr4335298igq.51.1366002287920; Sun, 14 Apr 2013 22:04:47 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Sun, 14 Apr 2013 22:04:47 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> <516800F7.80502@redhat.com> Date: Mon, 15 Apr 2013 13:04:47 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Eric Sandeen , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee7229a5504da5f3103 X-Barracuda-Connect: mail-ie0-f177.google.com[209.85.223.177] X-Barracuda-Start-Time: 1366002288 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128161 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 --14dae9340ee7229a5504da5f3103 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Also glusterfs use a lot of hardlink for self-heal: --------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/998416323 ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999296624 ---------T 2 root root 0 Apr 15 12:24 /mnt/xfsd/testbug/999568484 ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999956875 ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/2f/052f4e3e-c379-4a3c-b995-a10fdaca33d0 ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/95/0595272e-ce2b-45d5-8693-d02c00b94d9d ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/ca/05ca00a0-92a7-44cf-b6e3-380496aafaa4 ---------T 2 root root 0 Apr 15 12:24 /mnt/xfsd/testbug/.glusterfs/0a/23/0a238ca7-3cef-4540-9c98-6bf631551b21 ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/0a/4b/0a4b640b-f675-4708-bb59-e2369ffbbb9d Does it related? 2013/4/15 =B7=FB=D3=C0=CC=CE > Dear xfs experts, > Now I'm deploying Brian's system script in out cluster. But from last > night till now 5 servers in our 24 servers xfs shutdown with the same > error. I run xfs_repair command and found all the lost inodes are gluster= fs > dht link files. This explains why the xfs shutdown tend to happen during > glusterfs rebalance. During glusterfs rebalance procedure a lot of dhk li= nk > files may be unlinked. For example the following inodes are found in > lost+found in one of the servers: > [root@* lost+found]# pwd > /mnt/xfsd/lost+found > [root@* lost+found]# ls -l > total 740 > ---------T 1 root root 0 Apr 8 21:06 100119 > ---------T 1 root root 0 Apr 8 21:11 101123 > ---------T 1 root root 0 Apr 8 21:19 102659 > ---------T 1 root root 0 Apr 12 14:46 1040919 > ---------T 1 root root 0 Apr 12 14:58 1041943 > ---------T 1 root root 0 Apr 8 21:32 105219 > ---------T 1 root root 0 Apr 8 21:37 105731 > ---------T 1 root root 0 Apr 12 17:48 1068055 > ---------T 1 root root 0 Apr 12 18:38 1073943 > ---------T 1 root root 0 Apr 8 21:54 108035 > ---------T 1 root root 0 Apr 12 21:49 1091095 > ---------T 1 root root 0 Apr 13 00:17 1111063 > ---------T 1 root root 0 Apr 13 03:51 1121815 > ---------T 1 root root 0 Apr 8 22:25 112387 > ---------T 1 root root 0 Apr 13 06:39 1136151 > ... > [root@* lost+found]# getfattr -m . -d -e hex * > > # file: 96007 > trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 > trusted.gfid=3D0xa0370d8a9f104dafbebbd0e6dd7ce1f7 > > trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726570= 6c69636174652d3600 > > trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x0= 000000049dff000 > > # file: 97027 > trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 > trusted.gfid=3D0xc1c1fe2ec7034442a623385f43b04c25 > > trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726570= 6c69636174652d3600 > > trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x0= 00000006ac78000 > > # file: 97559 > trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 > trusted.gfid=3D0xcf7c17013c914511bda4d1c743fae118 > > trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726570= 6c69636174652d3500 > > trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x0= 0000000519fb000 > > # file: 98055 > trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 > trusted.gfid=3D0xe86abc6e2c4b44c28d415fbbe34f2102 > > trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726570= 6c69636174652d3600 > > trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x0= 00000004c098000 > > # file: 98567 > trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 > trusted.gfid=3D0x12543a2efbdf4b9fa61c6d89ca396f80 > > trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726570= 6c69636174652d3500 > > trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x0= 00000006bc98000 > > # file: 98583 > trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 > trusted.gfid=3D0x760d16d3b7974cfb9c0a665a0982c470 > > trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726570= 6c69636174652d3500 > > trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x0= 00000006cde9000 > > # file: 99607 > trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 > trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 > trusted.gfid=3D0x0849a732ea204bc3b8bae830b46881da > > trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726570= 6c69636174652d3500 > > trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x0= 0000000513f1000 > ... > > What do you think about it? Thank you very much. > > > 2013/4/12 =B7=FB=D3=C0=CC=CE > >> Hi Brian, >> >> Your scripts works for me now after I installed all the rpm built out >> from kernel srpm. I'll try it. Thank you. >> >> >> 2013/4/12 Brian Foster >> >>> On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote: >>> > Dear xfs experts, >>> > Can I just call xfs_stack_trace(); in the second line of >>> > xfs_do_force_shutdown() to print stack and rebuild kernel to check >>> > what's the error? >>> > >>> >>> I suppose that's a start. If you're willing/able to create and run a >>> modified kernel for the purpose of collecting more debug info, perhaps >>> we can get a bit more creative in collecting more data on the problem >>> (but a stack trace there is a good start). >>> >>> BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp) >>> check almost halfway into the function to avoid duplicate messages. >>> >>> Brian >>> >>> > >>> > 2013/4/12 =B7=FB=D3=C0=CC=CE > >>> > >>> > Hi Brian, >>> > What else I'm missing? Thank you. >>> > stap -e 'probe module("xfs").function("xfs_iunlink"){}' >>> > >>> > WARNING: cannot find module xfs debuginfo: No DWARF information >>> found >>> > semantic error: no match while resolving probe point >>> > module("xfs").function("xfs_iunlink") >>> > Pass 2: analysis failed. Try again with another '--vp 01' option= . >>> > >>> > >>> > 2013/4/12 =B7=FB=D3=C0=CC=CE > >>> > >>> > ls -l >>> > >>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.d= ebug >>> > -r--r--r-- 1 root root 21393024 Apr 12 12:08 >>> > >>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.d= ebug >>> > >>> > rpm -qa|grep kernel >>> > kernel-headers-2.6.32-279.el6.x86_64 >>> > kernel-devel-2.6.32-279.el6.x86_64 >>> > kernel-2.6.32-358.el6.x86_64 >>> > kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 >>> > abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >>> > kernel-firmware-2.6.32-358.el6.noarch >>> > kernel-debug-2.6.32-358.el6.x86_64 >>> > kernel-debuginfo-2.6.32-279.el6.x86_64 >>> > dracut-kernel-004-283.el6.noarch >>> > libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 >>> > kernel-devel-2.6.32-358.el6.x86_64 >>> > kernel-2.6.32-279.el6.x86_64 >>> > >>> > rpm -q kernel-debuginfo >>> > kernel-debuginfo-2.6.32-279.el6.x86_64 >>> > >>> > rpm -q kernel >>> > kernel-2.6.32-279.el6.x86_64 >>> > kernel-2.6.32-358.el6.x86_64 >>> > >>> > do I need to re probe it? >>> > >>> > >>> > 2013/4/12 Eric Sandeen >> > > >>> > >>> > On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote: >>> > > Hi Brian, >>> > > Sorry but when I execute the script it says: >>> > > WARNING: cannot find module xfs debuginfo: No DWARF >>> > information found >>> > > semantic error: no match while resolving probe point >>> > module("xfs").function("xfs_iunlink") >>> > > >>> > > uname -a >>> > > 2.6.32-279.el6.x86_64 >>> > > kernel debuginfo has been installed. >>> > > >>> > > Where can I find the correct xfs debuginfo? >>> > >>> > it should be in the kernel-debuginfo rpm (of the same >>> > version/release as the kernel rpm you're running) >>> > >>> > You should have: >>> > >>> > >>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.d= ebug >>> > >>> > If not, can you show: >>> > >>> > # uname -a >>> > # rpm -q kernel >>> > # rpm -q kernel-debuginfo >>> > >>> > -Eric >>> > >>> > >>> > >>> > >>> > >>> > -- >>> > =B7=FB=D3=C0=CC=CE >>> > >>> > >>> > >>> > >>> > -- >>> > =B7=FB=D3=C0=CC=CE >>> > >>> > >>> > >>> > >>> > -- >>> > =B7=FB=D3=C0=CC=CE >>> > >>> > >>> > _______________________________________________ >>> > xfs mailing list >>> > xfs@oss.sgi.com >>> > http://oss.sgi.com/mailman/listinfo/xfs >>> > >>> >>> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee7229a5504da5f3103 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Also glusterfs use a lot of hardlink for self-heal:--------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/998416323
-----= ----T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999296624
---------T = 2 root root 0 Apr 15 12:24 /mnt/xfsd/testbug/999568484
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999956875
------= ---T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/2f/052f4e3e= -c379-4a3c-b995-a10fdaca33d0
---------T 2 root root 0 Apr 15 11:58 /mnt/= xfsd/testbug/.glusterfs/05/95/0595272e-ce2b-45d5-8693-d02c00b94d9d
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/ca/05= ca00a0-92a7-44cf-b6e3-380496aafaa4
---------T 2 root root 0 Apr 15 12:24= /mnt/xfsd/testbug/.glusterfs/0a/23/0a238ca7-3cef-4540-9c98-6bf631551b21 ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/0a/4b/0a= 4b640b-f675-4708-bb59-e2369ffbbb9d
Does it related?


2013/4/15 =B7=FB= =D3=C0=CC=CE <yongtaofu@gmail.com>
Dear xfs experts,=
Now I'm deploying Brian's system script in out cluster. B= ut from last night till now 5 servers in our 24 servers xfs shutdown with t= he same error. I run xfs_repair command and found all the lost inodes are g= lusterfs dht link files. This explains why the xfs shutdown tend to happen = during glusterfs rebalance. During glusterfs rebalance procedure a lot of d= hk link files may be unlinked. For example the following inodes are found i= n lost+found in one of the servers:
[root@* lost+found]# pwd
/mnt/xfsd/lost+found
[root@* lost+found]# ls= -l
total 740
---------T 1 root root 0 Apr  8 21:06 100119
--= -------T 1 root root 0 Apr  8 21:11 101123
---------T 1 root root 0= Apr  8 21:19 102659
---------T 1 root root 0 Apr 12 14:46 1040919
---------T 1 root root 0 A= pr 12 14:58 1041943
---------T 1 root root 0 Apr  8 21:32 105219---------T 1 root root 0 Apr  8 21:37 105731
---------T 1 root roo= t 0 Apr 12 17:48 1068055
---------T 1 root root 0 Apr 12 18:38 1073943
---------T 1 root root 0 A= pr  8 21:54 108035
---------T 1 root root 0 Apr 12 21:49 1091095---------T 1 root root 0 Apr 13 00:17 1111063
---------T 1 root root 0 = Apr 13 03:51 1121815
---------T 1 root root 0 Apr  8 22:25 112387
---------T 1 root root= 0 Apr 13 06:39 1136151
...
[root@* lost+found]# getfattr -m . -d -e = hex *

# file: 96007
trusted.afr.mams-cq-mt-video-client-3=3D0x000= 000000000000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000
trust= ed.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000
trusted.gf= id=3D0xa0370d8a9f104dafbebbd0e6dd7ce1f7
trusted.glusterfs.dht.linkto=3D0= x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 0000049dff000

# file: 97027
trusted.afr.mams-cq-mt-video-client-3= =3D0x000000000000000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x= 000000000000000000000000
trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000
trust= ed.gfid=3D0xc1c1fe2ec7034442a623385f43b04c25
trusted.glusterfs.dht.linkt= o=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
trusted= .glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000000006a= c78000

# file: 97559
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0xcf7c17013c914511bda4d1c743fae118
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 000519fb000

# file: 98055
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0xe86abc6e2c4b44c28d415fbbe34f2102
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0004c098000

# file: 98567
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x12543a2efbdf4b9fa61c6d89ca396f80
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0006bc98000

# file: 98583
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x760d16d3b7974cfb9c0a665a0982c470
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0006cde9000

# file: 99607
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x0849a732ea204bc3b8bae830b46881da
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 000513f1000
...

What do you think about it? Thank you very much.
=


2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brian,

Your scripts works for me now after I installed all the rpm built out from= kernel srpm. I'll try it. Thank you.


2013/4/12 Brian Foster <bfoster@redhat.com>
On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote:
> Dear xfs experts,
> Can I just call xfs_stack_trace(); in the second line of
> xfs_do_force_shutdown() to print stack and rebuild kernel to check
> what's the error?
>

I suppose that's a start. If you're willing/able to create an= d run a
modified kernel for the purpose of collecting more debug info, perhaps
we can get a bit more creative in collecting more data on the problem
(but a stack trace there is a good start).

BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp)
check almost halfway into the function to avoid duplicate messages.

Brian

>
> 2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     Hi Brian,
>     What else I'm missing? Thank you.
>     stap -e 'probe module("xfs").function(&quo= t;xfs_iunlink"){}'
>
>     WARNING: cannot find module xfs debuginfo: No DWARF info= rmation found
>     semantic error: no match while resolving probe point
>     module("xfs").function("xfs_iunlink"= )
>     Pass 2: analysis failed.  Try again with another &#= 39;--vp 01' option.
>
>
>     2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:= yongtaofu@gmail.co= m>>
>
>         ls -l
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>         -r--r--r-- 1 root root 21393024 Apr 12 12:= 08
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>
>         rpm -qa|grep  kernel
>         kernel-headers-2.6.32-279.el6.x86_64
>         kernel-devel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>         kernel-debuginfo-common-x86_64-2.6.32-279.= el6.x86_64
>         abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >         kernel-firmware-2.6.32-358.el6.noarch
>         kernel-debug-2.6.32-358.el6.x86_64
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>         dracut-kernel-004-283.el6.noarch
>         libreport-plugin-kerneloops-2.0.9-5.el6.x8= 6_64
>         kernel-devel-2.6.32-358.el6.x86_64
>         kernel-2.6.32-279.el6.x86_64
>
>         rpm -q kernel-debuginfo
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>
>         rpm -q kernel
>         kernel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>
>         do I need to re probe it?
>
>
>         2013/4/12 Eric Sandeen <sandeen@sandeen.net
>         <mailto:sandeen@sandeen.net>>
>
>             On 4/11/13 11:32 PM, =B7=FB= =D3=C0=CC=CE wrote:
>             > Hi Brian,
>             > Sorry but when I execut= e the script it says:
>             > WARNING: cannot find mo= dule xfs debuginfo: No DWARF
>             information found
>             > semantic error: no matc= h while resolving probe point
>             module("xfs").func= tion("xfs_iunlink")
>             >
>             > uname -a
>             > 2.6.32-279.el6.x86_64 >             > kernel debuginfo has be= en installed.
>             >
>             > Where can I find the co= rrect xfs debuginfo?
>
>             it should be in the kernel-d= ebuginfo rpm (of the same
>             version/release as the kerne= l rpm you're running)
>
>             You should have:
>
>             /usr/lib/debug/lib/modules/2= .6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug
>
>             If not, can you show:
>
>             # uname -a
>             # rpm -q kernel
>             # rpm -q kernel-debuginfo >
>             -Eric
>
>
>
>
>
>         --
>         =B7=FB=D3=C0=CC=CE
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE
>
>
> _______________________________________________<= br> > xfs mailing list
> xfs@oss.sgi.com
>
= http://oss.sgi.com/mailman/listinfo/xfs
>




= --
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--14dae9340ee7229a5504da5f3103-- From zimmer@hotufi.net Mon Apr 15 03:05:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.7 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,SUBJ_ALL_CAPS autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CD3277F56 for ; Mon, 15 Apr 2013 03:05:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 036F2AC004 for ; Mon, 15 Apr 2013 01:05:52 -0700 (PDT) X-ASG-Debug-ID: 1366013149-04cb6c2c1d1f22b0001-NocioJ Received: from hot-smtpauth1.sdv.fr (hot-smtpauth1.sdv.fr [212.95.71.159]) by cuda.sgi.com with ESMTP id l6PlrgZFdUQPYI9T for ; Mon, 15 Apr 2013 01:05:49 -0700 (PDT) X-Barracuda-Envelope-From: zimmer@hotufi.net X-Barracuda-Apparent-Source-IP: 212.95.71.159 Received: from userPC (unknown [213.57.226.119]) by hot-smtpauth1.sdv.fr (Postfix) with ESMTPSA id F0EB68035; Mon, 15 Apr 2013 10:03:51 +0200 (CEST) From: =?windows-1255?B?8vDh7A==?= To: =?windows-1255?B?8vDh7A==?= Subject: =?windows-1255?B?Rlc6IPbp7vgg4Onr5frpIOHu5+n4IPLu7ukgLSD05fjp5CDy6ezp+g==?= Date: Mon, 15 Apr 2013 11:03:49 +0300 X-ASG-Orig-Subj: =?windows-1255?B?Rlc6IPbp7vgg4Onr5frpIOHu5+n4IPLu7ukgLSD05fjp5CDy6ezp+g==?= Message-ID: <000c01ce39b0$03e35320$0ba9f960$@net> MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_000D_01CE39C9.29308B20" X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Ac4on42hl3fQBQAjT7a0Qcr841fDkwAAFtVwAAAH9LAAuAaD4AAKeaZgAARz2wAA+RJnwABC+T+gAPrImOAAASOIAAAAJsDQARvokrAAKNEkQA== Content-Language: he X-Barracuda-Connect: hot-smtpauth1.sdv.fr[212.95.71.159] X-Barracuda-Start-Time: 1366013149 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.97 X-Barracuda-Spam-Status: No, SCORE=0.97 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA090e, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, HTML_IMAGE_RATIO_02, HTML_MESSAGE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128173 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.40 BSF_SC0_SA090e Custom Rule SA090e 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain æåäé äåãòä îøåáú çì÷éí áúáðéú MIME. ------=_NextPart_000_000D_01CE39C9.29308B20 Content-Type: multipart/alternative; boundary="----=_NextPart_001_000E_01CE39C9.29308B20" ------=_NextPart_001_000E_01CE39C9.29308B20 Content-Type: text/plain; charset="windows-1255" Content-Transfer-Encoding: quoted-printable =20 =20 From: =F2=F0=E1=EC [mailto:zimmer@hotufi.net]=20 Sent: Sunday, April 14, 2013 3:34 PM Subject: FW: =F6=E9=EE=F8 =E0=E9=EB=E5=FA=E9 =E1=EE=E7=E9=F8 = =F2=EE=EE=E9 - =F4=E5=F8=E9=E4 =F2=E9=EC=E9=FA = http://www.kitim.co.il/images/baner/m.jpg ------=_NextPart_001_000E_01CE39C9.29308B20 Content-Type: text/html; charset="windows-1255" Content-Transfer-Encoding: quoted-printable

 

 

From: =F2=F0=E1=EC [mailto:zimmer@hotufi.net]
Sent: Sunday, April = 14, 2013 3:34 PM
Subject: FW: =F6=E9=EE=F8 = =E0=E9=EB=E5=FA=E9 =E1=EE=E7=E9=F8 =F2=EE=EE=E9 - =F4=E5=F8=E9=E4 = =F2=E9=EC=E9=FA

3D"http://www.kitim.co.il/images/baner/m.jpg"

------=_NextPart_001_000E_01CE39C9.29308B20-- ------=_NextPart_000_000D_01CE39C9.29308B20 Content-Type: image/jpeg; name="image002.jpg" Content-Transfer-Encoding: base64 Content-ID: /9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAQ/AwEDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD19tJ0 Ybt2k2O4DhTboD/Knf2LpbRA/wBk2W4DP/Hun+FWRCm5FmO6QLy5qTzcqdmdx4NICkuj6VJHuOk2 Ix/07p/hTTpGjvE4GmWQz3Fsn+FW4ypk4YhWHfsafJCNylcrj070AZkuh6WYwBpVmcr977OmV/DF Oh0PTHjCjTLI45A+zp/hWipAjG0nnIBPUfWk2zZaMALv53DtQBQGmaTuUf2TYAH+H7OmeOvanx6P o/mn/iU2QUf9O6f4VMYQjMwRjJt5J6H3qRCHBbdmNx19DQBUfRtJLs39lWRKcAC3Tn9KjTSNODCe XTLAL02/Zk4/SrkSrGzCRxIZGz14FPYs03y7QiDoDQBSk0nS922HS7BiOS32dP8ACpf7F0mOTP8A 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 JbVGXNZJ/KSuvvQ009hOvBpAoHQV1mraSdTuYpILm2QCMLtLck/hUWnWPl2Op2DzQiXcEDMcDp+d fPQ4tws8Iq6Xv6c0dbxTkot3tra9yPaq1zmaTaM5wK1L7RJrC3Wd54ZEZwg2E9TSS6O1vfpaT3UM e5N/mHO0e1exTzvAVIqcKl0+bo/s/Fpa+lyudGbRWleaNNa232mOaK4g7vEen1qhFH5syR71TcwG 5ug9zXThsfhsVSdajK8Ve/lbdNbp+Vhpp6ojCgdBS9a2f+EeeVW+y31tcOvJRW5qlZ6bNeJcsrqn 2ddzB8578fpXLTzvAVKcqkaitG17ppq7srpq+r20FzxZS2j0FLgZz3rTs9GN1Yi7e7hgjLFRvzUd /pM1giSmSOWBzhZIzkVUM5wM8Q8Mqnv3atZ7rdXtZvyTDnV7FAADoKt6XqEulapbX8KI8lu4dVfo SPXFXV8OXPmfNPCsO0N5xOF57fWqd7pk1jeJbzMmHxtkH3SPWppZxl2Km6FOopNpu2u3X523W/kC lF6XI9Qu31HUbi9lVVknkaRgvQEnPFVyAetbS+HvNJWDUrSWQfwA9ayZ4ZLeZ4ZVKyIcEGtMFmeD xTdLDzu4razTt6NJ28wUk9iPFGAO1FFeiUOklkmIMsjyFRgb2JwPbNNwM9K1bfRo54o2/tO1R3AI Qnke1QzaTPbX8dpO6RmQ/JIfumvLp5zgJTdGM/eSbtZrRb2utbeVyVKJn7V9B+VGBjGOK1F0K6Op NYs8auqbw5ztI9qLXSEuYVc6jbRsxICMeeuKUs8y+Mef2l1ZPRN6Su09E97P9Q54mYAB0FFXLvTZ 7G7S3nKLvxtfPyketXl8P+cSsGpWksg/gB606ud4ClTjVnU92Sumk2reqTS+YOaWpBNrlxP4cttE aKIW9vM0yuM7iTng9sc1l4GMYGKkmhkt5nhlUrIhwQau6ZpR1LcFuYo2BwEb7x4zwK2q4rC4PDvE TlaG99WteulxtpK5nAAdBUglkERiEjiNjkoGO0n3Faz+HZSr/Z7u3ndM7o1OGqrp+lPfxzSefHDH D99nzx/nFc0c8y6dGVZVFyxtfR3V9tLX16aC542uZ+BjGOKNo9BWjd6RLb232qKaK5t84MkR6fUU ybTJYLS1uGkQpcHCgZyv1renmuDqKLhUXvNpb3uldq26aWtnYOZFHavoPyowPQVuDwzMTgX1oT7M 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 lYs7eWFOAM53YxQA/wCzP6P+dFVvOn9vzooA/9k= ------=_NextPart_000_000D_01CE39C9.29308B20-- From marina.montuori@ing.unibs.it Mon Apr 15 04:06:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_CONTACT autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 86AE97F50 for ; Mon, 15 Apr 2013 04:06:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 74C71304051 for ; Mon, 15 Apr 2013 02:06:46 -0700 (PDT) X-ASG-Debug-ID: 1366016800-04cb6c2c1c1f5c90001-w1Z2WR Received: from zmx1.ing.unibs.it (zMX1.ing.unibs.it [192.167.20.248]) by cuda.sgi.com with SMTP id lrAdaYYa47kl0sZE for ; Mon, 15 Apr 2013 02:06:41 -0700 (PDT) X-Barracuda-Envelope-From: marina.montuori@ing.unibs.it X-Barracuda-Apparent-Source-IP: 192.167.20.248 Received: from localhost (localhost.localdomain [127.0.0.1]) by zmx1.ing.unibs.it (Postfix) with ESMTP id 1DEFA26F4CC; Mon, 15 Apr 2013 11:06:38 +0200 (CEST) X-Amavis-Modified: Mail body modified (using disclaimer) - zmx1.ing.unibs.it X-Virus-Scanned: amavisd-new at ing.unibs.it Received: from zmx1.ing.unibs.it ([127.0.0.1]) by localhost (zmx1.ing.unibs.it [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ixxMdVLCRq7S; Mon, 15 Apr 2013 11:06:37 +0200 (CEST) Received: from store.ing.unibs.it (store.ing.unibs.it [192.167.20.247]) by zmx1.ing.unibs.it (Postfix) with ESMTP id 575B326F422; Mon, 15 Apr 2013 11:06:30 +0200 (CEST) Date: Mon, 15 Apr 2013 11:06:30 +0200 (CEST) From: BARCLAYS LOANS PLC Message-ID: <1336636709.1251.1366016790309.JavaMail.root@store.ing.unibs.it> Subject: =?utf-8?Q?l=C3=A5n?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?Q?l=C3=A5n?= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [192.167.20.248] X-Mailer: Zimbra 6.0.8_GA_2685 (zclient/6.0.8_GA_2685) To: undisclosed-recipients:; X-Barracuda-Connect: zMX1.ing.unibs.it[192.167.20.248] X-Barracuda-Start-Time: 1366016801 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128177 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA620a Custom Rule SA620a BARCLAYS LOANS PLC. 1 Churchill Place FREEPOST LON13542 London E14 5HP Kj=C3=A6re herr / fru! dette er David Harkens fra BARCLAYS LOANS PLC Selskap, basert i Storbritann= ia. Vi er her for =C3=A5 l=C3=B8se dine =C3=B8konomiske problemer som: Har = uventede kostnader p=C3=A5dratt? Personlige l=C3=A5n? Bill=C3=A5n? Oppussin= g? Er det p=C3=A5 tide =C3=A5 dra p=C3=A5 ferie du alltid har dr=C3=B8mt om= ? Om du trenger =C3=A5 finansiere dine dr=C3=B8mmer, deretter dele din visj= on BARCLAYS LOANS PLC. Vi er stolte av v=C3=A5re profesjonelle, =C3=A6rlig = og p=C3=A5litelig service, med rask cash.Our m=C3=A5l er =C3=A5 overg=C3=A5= kundenes forventninger i hver vei, kan vi tilby l=C3=A5n til lav rente p= =C3=A5 2%. Kontakt oss dersom du er interessert i v=C3=A5re tjenester via e-post: barc= lays_loans@wss-id.org. Fullt navn: L=C3=A5nebel=C3=B8p: Varighet: land: Vi venter din raske til denne posten for =C3=A5 aktivere oss fortsette. Takk skal du ha David Harkens. Informativa sulla privacy: http://help.ing.unibs.it/privacy.php From Yann.Dupont@univ-nantes.fr Mon Apr 15 04:39:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 120757F58 for ; Mon, 15 Apr 2013 04:39:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F41C8304039 for ; Mon, 15 Apr 2013 02:39:29 -0700 (PDT) X-ASG-Debug-ID: 1366018767-04cb6c2c1d1f7cf0001-NocioJ Received: from smtp-tls.univ-nantes.fr (smtptls2-lmb.cpub.univ-nantes.fr [193.52.103.111]) by cuda.sgi.com with ESMTP id jGRF9OqAl35cj1PN for ; Mon, 15 Apr 2013 02:39:28 -0700 (PDT) X-Barracuda-Envelope-From: Yann.Dupont@univ-nantes.fr X-Barracuda-Apparent-Source-IP: 193.52.103.111 Received: from localhost (localhost [127.0.0.1]) by smtp-tls.univ-nantes.fr (Postfix) with ESMTP id 5686E40174D for ; Mon, 15 Apr 2013 11:39:27 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at smtptls1-lmb.cpub.univ-nantes.fr Received: from smtp-tls.univ-nantes.fr ([127.0.0.1]) by localhost (smtptls2-lmb.cpub.univ-nantes.fr [127.0.0.1]) (amavisd-new, port 10024) with LMTP id ItPMMruBiSRt for ; Mon, 15 Apr 2013 11:39:27 +0200 (CEST) Received: from [IPv6:2001:660:7220:0:2da5:fb76:c9be:5314] (unknown [IPv6:2001:660:7220:0:2da5:fb76:c9be:5314]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp-tls.univ-nantes.fr (Postfix) with ESMTPSA id 391A34016E1 for ; Mon, 15 Apr 2013 11:39:27 +0200 (CEST) Message-ID: <516BCACE.1040900@univ-nantes.fr> Date: Mon, 15 Apr 2013 11:39:26 +0200 From: Yann Dupont User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130308 Thunderbird/17.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: kernels 3.4 slower due to allocation workqueue Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: kernels 3.4 slower due to allocation workqueue Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtptls2-lmb.cpub.univ-nantes.fr[193.52.103.111] X-Barracuda-Start-Time: 1366018768 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128179 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello, last week we received new machines (DELL R720xd) for an extension of our ceph cluster. (64 Gb ram, 2x Xeon E5-2650, PERC H710P (really LSI MEGARAID), and 12x3 TB disks + 2SSD (not used as cachecade)) I was doing test on the raid card with kernel 3.4.38 to try to find what I can get of this beast with RAID5, when I noticed an unusual slow values on compilebench. The difference is very visible on the initial create tests (can detail more if needed). I finally observed that ONLY 3.4 kernels exhibit that behaviour ; 3.3.xxx and before are OK, 3.5.xxx and later are back to good values. I bisected the problem to this commit c999a223c2f0d31c64ef7379814cea1378b2b800 is the first bad commit commit c999a223c2f0d31c64ef7379814cea1378b2b800 Author: Dave Chinner Date: Thu Mar 22 05:15:07 2012 +0000 xfs: introduce an allocation workqueue I understand this regression is not a bug, and probably just a corner case of the new code, that was certainly corrected after during 3.5 development (didn't tried to bisect this one, maybe dave know what is the corrective patch ?) The problem is that 3.4 is the last long-term kernel for the moment, and it's unfortunate it shows this regression. Maybe a backport of the fix (if this backport is possible AND not very intrusive) could be a good idea ? Cheers, -- Yann Dupont - Service IRTS, DSI Université de Nantes Tel : 02.53.48.49.20 - Mail/Jabber : Yann.Dupont@univ-nantes.fr From collinet@wanadoo.fr Mon Apr 15 04:43:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FREEMAIL_FROM,HTML_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 822E47F5D for ; Mon, 15 Apr 2013 04:43:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5ED818F8037 for ; Mon, 15 Apr 2013 02:42:58 -0700 (PDT) X-ASG-Debug-ID: 1366018974-04cb6c2c1f1f8000001-NocioJ Received: from out.smtpout.orange.fr (out01.smtpout.orange.fr [193.252.22.210]) by cuda.sgi.com with ESMTP id ejmcLGcgpFBohNHy for ; Mon, 15 Apr 2013 02:42:55 -0700 (PDT) X-Barracuda-Envelope-From: collinet@wanadoo.fr X-Barracuda-Apparent-Source-IP: 193.252.22.210 Received: from kfgdgf.51vip.biz ([183.0.247.62]) by mwinf5d04 with ME id Q9hk1l00E1MWdVT039hnJ5; Mon, 15 Apr 2013 11:42:54 +0200 Date: Mon, 15 Apr 2013 17:42:27 +0800 From: =?gb2312?B?xuuyxbrT?= To: Subject: =?gb2312?B?v84gs8wgvMYgu64gse0gODgwNg==?= Message-ID: <20130415174232028717@wanadoo.fr> X-ASG-Orig-Subj: =?gb2312?B?v84gs8wgvMYgu64gse0gODgwNg==?= X-mailer: Foxmail 7.0.1.83[cn] Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====003_Dragon568423171628_=====" X-Barracuda-Connect: out01.smtpout.orange.fr[193.252.22.210] X-Barracuda-Start-Time: 1366018975 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE, HTML_OBFUSCATE_50_60, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128179 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_OBFUSCATE_50_60 BODY: Message is 50% to 60% HTML obfuscation 0.00 HTML_MESSAGE BODY: HTML included in message --=====003_Dragon568423171628_===== Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVu dD0idGV4dC9odG1sOyBjaGFyc2V0PWdiMjMxMiI+DQo8TUVUQSBjb250ZW50PSJNU0hUTUwgNi4w MC4yOTAwLjYxMDQiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4NCjxCT0RZPg0KPFA+xPo8Rk9OVCBj b2xvcj0jZmZmZmZmPnY8L0ZPTlQ+usOjujwvUD4NCjxQPri9PEZPTlQgY29sb3I9d2hpdGU+YTwv Rk9OVD68/jxGT05UIA0KY29sb3I9I2ZmZmZmZj5jPC9GT05UPs6qPEZPTlQgDQpjb2xvcj0jZmZm ZmZmPmw8L0ZPTlQ+v848Rk9OVCANCmNvbG9yPSNmZmZmZmY+azwvRk9OVD6zzDxGT05UIA0KY29s b3I9I2ZmZmZmZj5jPC9GT05UPtfKPEZPTlQgDQpjb2xvcj0jZmZmZmZmPmY8L0ZPTlQ+wc+jrMfr PEZPTlQgDQpjb2xvcj0jZmZmZmZmPmc8L0ZPTlQ+suk8Rk9OVCANCmNvbG9yPSNmZmZmZmY+dTwv Rk9OVD7K1aOhPC9QPg0KPFA+YWNwYzwvUD4NCjxQPjg3MjkzNDc4MTwvUD48L0JPRFk+PC9IVE1M Pg0K --=====003_Dragon568423171628_===== Content-Type: application/octet-stream; name="=?gb2312?B?v84gs8y8xiC7ri54bHM=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?gb2312?B?v84gs8y8xiC7ri54bHM=?=" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAAGAAAAAQAAAAAAAAAA EAAApwIAAAEAAAD+////AAAAAAAAAAACAAAAAwAAAAQAAAD4AQAAdwIAAP////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////9 ////qQIAAP3////9/////f///wYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8A AAAQAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAA AB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAA LAAAAC0AAAAuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6 AAAAOwAAADwAAAA9AAAAPgAAAD8AAABAAAAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgA AABJAAAASgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAAVgAA AFcAAABYAAAAWQAAAFoAAABbAAAAXAAAAF0AAABeAAAAXwAAAGAAAABhAAAAYgAAAGMAAABkAAAA ZQAAAGYAAABnAAAAaAAAAGkAAABqAAAAawAAAGwAAABtAAAAbgAAAG8AAABwAAAAcQAAAHIAAABz AAAAdAAAAHUAAAB2AAAAdwAAAHgAAAB5AAAAegAAAHsAAAB8AAAAfQAAAH4AAAB/AAAAgAAAAFIA bwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAWAAUA//////////8CAAAAIAgCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAAODXR6uMOc4B qAIAAAAEAAAAAAAAVwBvAHIAawBiAG8AbwBrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAABIAAgH///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAFAAAAniwFAAAAAABFAFQARQB4AHQARABhAHQAYQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAACAQEAAAADAAAA/////wAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4CAADUEAAAAAAAAAUAUwB1AG0AbQBhAHIAeQBJ AG4AZgBvAHIAbQBhAHQAaQBvAG4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAIB/////wQA AAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgBAAAAAAAAgQAA AIIAAACDAAAAhAAAAIUAAACGAAAAhwAAAIgAAACJAAAAigAAAIsAAACMAAAAjQAAAI4AAACPAAAA kAAAAJEAAACSAAAAkwAAAJQAAACVAAAAlgAAAJcAAACYAAAAmQAAAJoAAACbAAAAnAAAAJ0AAACe AAAAnwAAAKAAAAChAAAAogAAAKMAAACkAAAApQAAAKYAAACnAAAAqAAAAKkAAACqAAAAqwAAAKwA AACtAAAArgAAAK8AAACwAAAAsQAAALIAAACzAAAAtAAAALUAAAC2AAAAtwAAALgAAAC5AAAAugAA ALsAAAC8AAAAvQAAAL4AAAC/AAAAwAAAAMEAAADCAAAAwwAAAMQAAADFAAAAxgAAAMcAAADIAAAA yQAAAMoAAADLAAAAzAAAAM0AAADOAAAAzwAAANAAAADRAAAA0gAAANMAAADUAAAA1QAAANYAAADX AAAA2AAAANkAAADaAAAA2wAAANwAAADdAAAA3gAAAN8AAADgAAAA4QAAAOIAAADjAAAA5AAAAOUA AADmAAAA5wAAAOgAAADpAAAA6gAAAOsAAADsAAAA7QAAAO4AAADvAAAA8AAAAPEAAADyAAAA8wAA APQAAAD1AAAA9gAAAPcAAAD4AAAA+QAAAPoAAAD7AAAA/AAAAP0AAAD+AAAA/wAAAAABAAABAQAA AgEAAAMBAAAEAQAABQEAAAYBAAAHAQAACAEAAAkBAAAKAQAACwEAAAwBAAANAQAADgEAAA8BAAAQ AQAAEQEAABIBAAATAQAAFAEAABUBAAAWAQAAFwEAABgBAAAZAQAAGgEAABsBAAAcAQAAHQEAAB4B AAAfAQAAIAEAACEBAAAiAQAAIwEAACQBAAAlAQAAJgEAACcBAAAoAQAAKQEAACoBAAArAQAALAEA AC0BAAAuAQAALwEAADABAAAxAQAAMgEAADMBAAA0AQAANQEAADYBAAA3AQAAOAEAADkBAAA6AQAA OwEAADwBAAA9AQAAPgEAAD8BAABAAQAAQQEAAEIBAABDAQAARAEAAEUBAABGAQAARwEAAEgBAABJ AQAASgEAAEsBAABMAQAATQEAAE4BAABPAQAAUAEAAFEBAABSAQAAUwEAAFQBAABVAQAAVgEAAFcB AABYAQAAWQEAAFoBAABbAQAAXAEAAF0BAABeAQAAXwEAAGABAABhAQAAYgEAAGMBAABkAQAAZQEA AGYBAABnAQAAaAEAAGkBAABqAQAAawEAAGwBAABtAQAAbgEAAG8BAABwAQAAcQEAAHIBAABzAQAA dAEAAHUBAAB2AQAAdwEAAHgBAAB5AQAAegEAAHsBAAB8AQAAfQEAAH4BAAB/AQAAgAEAAIEBAACC AQAAgwEAAIQBAACFAQAAhgEAAIcBAACIAQAAiQEAAIoBAACLAQAAjAEAAI0BAACOAQAAjwEAAJAB AACRAQAAkgEAAJMBAACUAQAAlQEAAJYBAACXAQAAmAEAAJkBAACaAQAAmwEAAJwBAACdAQAAngEA AJ8BAACgAQAAoQEAAKIBAACjAQAApAEAAKUBAACmAQAApwEAAKgBAACpAQAAqgEAAKsBAACsAQAA rQEAAK4BAACvAQAAsAEAALEBAACyAQAAswEAALQBAAC1AQAAtgEAALcBAAC4AQAAuQEAALoBAAC7 AQAAvAEAAL0BAAC+AQAAvwEAAMABAADBAQAAwgEAAMMBAADEAQAAxQEAAMYBAADHAQAAyAEAAMkB AADKAQAAywEAAMwBAADNAQAAzgEAAM8BAADQAQAA0QEAANIBAADTAQAA1AEAANUBAADWAQAA1wEA ANgBAADZAQAA2gEAANsBAADcAQAA3QEAAN4BAADfAQAA4AEAAOEBAADiAQAA4wEAAOQBAADlAQAA 5gEAAOcBAADoAQAA6QEAAOoBAADrAQAA7AEAAO0BAADuAQAA7wEAAPABAADxAQAA8gEAAPMBAAD0 AQAA9QEAAPYBAAD3AQAA+QEAAP3////6AQAA+wEAAPwBAAD9AQAA/gEAAP8BAAAAAgAACQgQAAAG BQC7Dc0HwUAAAAYBAADhAAIAsATBAAIAAADiAAAAXABwABoAAUEAZABtAGkAbgBpAHMAdAByAGEA dABvAHIAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCAAIAsARhAQIAAADAAQAAPQEQAAEABQAH AAoACAALAAkADAAZAAIAAAASAAIAAAATAAIAAACvAQIAAAC8AQIAAAA9ABIAAAAAAAA8HCA4AAAA AAABAF0DQAACAAAAjQACAAAAIgACAAAADgACAAEAtwECAAAA2gACAAAAMQAUAPAAAAD/f5ABAAAA B4YAAgGLW1NPMQAUAPAAMAD/f5ABAAAAB4YAAgGLW1NPMQAUAPAAMAD/f5ABAAAAB4YAAgGLW1NP MQAUAPAAMAD/f5ABAAAAB4YAAgGLW1NPMQAUANwAAAAIAJABAAAAB4YAAgGLW1NPMQAUANwAAAAJ AJABAAAAB4YAAgGLW1NPMQAUAGgBAAA+ALwCAAAAB4YAAgGLW1NPMQAUACwBAAA+ALwCAAAAB4YA AgGLW1NPMQAUACwBAAA4ALwCAAAAB4YAAgGLW1NPMQAUAAQBAAA+ALwCAAAAB4YAAgGLW1NPMQAU AAQBAAA4ALwCAAAAB4YAAgGLW1NPMQAUANwAAAA+ALwCAAAAB4YAAgGLW1NPMQAUANwAAAA4ALwC AAAAB4YAAgGLW1NPMQAUAGgBAAA4ALwCAAAAB4YAAgGLW1NPMQAUANwAAAAUAJABAAAAB4YAAgGL W1NPMQAUAPAAAAAMAJABAAABB4YAAgGLW1NPMQAUANwAAAARAJABAAAAB4YAAgGLW1NPMQAUANwA AAAIALwCAAAAB4YAAgGLW1NPMQAUANwAAAA0ALwCAAAAB4YAAgGLW1NPMQAUANwAAAAJALwCAAAA B4YAAgGLW1NPMQAUANwAAgAXAJABAAAAB4YAAgGLW1NPMQAUANwAAAAKAJABAAAAB4YAAgGLW1NP MQAUANwAAAA0AJABAAAAB4YAAgGLW1NPMQAUANwAAAA8AJABAAAAB4YAAgGLW1NPMQAUANwAAAA/ ALwCAAAAB4YAAgGLW1NPMQAUANwAAAA+AJABAAAAB4YAAgGLW1NPMQAUAMgAAAD/f5ABAAAAB4YA AgGLW1NPMQAUAPAAAAAkAJABAAABB4YAAgGLW1NPMQAUAPAAAAAJALwCAAAAB4YAAgGLW1NPMQAU ANwAAAD/f5ABAAAAB4YAAgGLW1NPMQAUAJABAAAKAJABAAAAB4YAAgGLW1NPMQAUAJABAAAMAJAB AAAAB4YAAgGLW1NPMQAUAJABAAAOAJABAAAAB4YAAgGLW1NPMQAUAJABAAAJAJABAAAAB4YAAgGL W1NPMQAUAJABAAArAJABAAAAB4YAAgGLW1NPMQAUAMgAAAAIALwCAAAAB4YAAgGLW1NPMQAUAMgA AAAKALwCAAAAB4YAAgGLW1NPMQAUAPAAAAAKALwCAAAAB4YAAgGLW1NPHgQrAAUAEwABIgDl/yIA IwAsACMAIwAwADsAIgDl/yIAXAAtACMALAAjACMAMAAeBDUABgAYAAEiAOX/IgAjACwAIwAjADAA OwBbAFIAZQBkAF0AIgDl/yIAXAAtACMALAAjACMAMAAeBDcABwAZAAEiAOX/IgAjACwAIwAjADAA LgAwADAAOwAiAOX/IgBcAC0AIwAsACMAIwAwAC4AMAAwAB4EQQAIAB4AASIA5f8iACMALAAjACMA MAAuADAAMAA7AFsAUgBlAGQAXQAiAOX/IgBcAC0AIwAsACMAIwAwAC4AMAAwAB4EaQAqADIAAV8A IAAiAOX/IgAqACAAIwAsACMAIwAwAF8AIAA7AF8AIAAiAOX/IgAqACAAXAAtACMALAAjACMAMABf ACAAOwBfACAAIgDl/yIAKgAgACIALQAiAF8AIAA7AF8AIABAAF8AIAAeBFcAKQApAAFfACAAKgAg ACMALAAjACMAMABfACAAOwBfACAAKgAgAFwALQAjACwAIwAjADAAXwAgADsAXwAgACoAIAAiAC0A IgBfACAAOwBfACAAQABfACAAHgR5ACwAOgABXwAgACIA5f8iACoAIAAjACwAIwAjADAALgAwADAA XwAgADsAXwAgACIA5f8iACoAIABcAC0AIwAsACMAIwAwAC4AMAAwAF8AIAA7AF8AIAAiAOX/IgAq ACAAIgAtACIAPwA/AF8AIAA7AF8AIABAAF8AIAAeBGcAKwAxAAFfACAAKgAgACMALAAjACMAMAAu ADAAMABfACAAOwBfACAAKgAgAFwALQAjACwAIwAjADAALgAwADAAXwAgADsAXwAgACoAIAAiAC0A IgA/AD8AXwAgADsAXwAgAEAAXwAgAB4ELwAXABUAAVwAJAAjACwAIwAjADAAXwApADsAXAAoAFwA JAAjACwAIwAjADAAXAApAB4EOQAYABoAAVwAJAAjACwAIwAjADAAXwApADsAWwBSAGUAZABdAFwA KABcACQAIwAsACMAIwAwAFwAKQAeBDsAGQAbAAFcACQAIwAsACMAIwAwAC4AMAAwAF8AKQA7AFwA KABcACQAIwAsACMAIwAwAC4AMAAwAFwAKQAeBEUAGgAgAAFcACQAIwAsACMAIwAwAC4AMAAwAF8A KQA7AFsAUgBlAGQAXQBcACgAXAAkACMALAAjACMAMAAuADAAMABcACkAHgQNALAABAABPwAiAClZ IgDgABQAAAAAAPX/EAAAAAAAAAAAAAAAwCDgABQAAQAAAPX/EAAA9AAAAAAAAAAAwCDgABQAAQAA APX/EAAA9AAAAAAAAAAAwCDgABQAAgAAAPX/EAAA9AAAAAAAAAAAwCDgABQAAgAAAPX/EAAA9AAA AAAAAAAAwCDgABQAAAAAAPX/EAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/EAAA9AAAAAAAAAAAwCDg ABQAAAAAAPX/EAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/EAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/ EAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/EAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/EAAA9AAAAAAA AAAAwCDgABQAAAAAAPX/EAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/EAAA9AAAAAAAAAAAwCDgABQA AAAAAPX/EAAA9AAAAAAAAAAAwCDgABQAAAAAAAEAEAAAAAAAAAAAAAAAwCDgABQAFQAAAPX/EAAA 9AAAAAAAAAAAwCDgABQAAAArAPX/EAAA+AAAAAAAAAAAwCDgABQAAAAsAPX/EAAA+AAAAAAAAAAA wCDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAA APX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAApAPX/EAAA+AAA AAAAAAAAwCDgABQAAAAJAPX/EAAA+AAAAAAAAAAAwCDgABQABgAAAPX/EAAAtAAAAAAAAAAEJCDg ABQAGQAAAPX/EAAAlBERvx+/HwAEFiDgABQABQAAAPX/EAAAtAAAAAAAAAAELyDgABQABwAAAPX/ EAAA9AAAAAAAAAAAwCDgABQAAAAqAPX/EAAA+AAAAAAAAAAAwCDgABQAAAAAAPX/EAAAvAAAAAAA AAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQA AAAAAPX/EAAAvAAAAAAAAAAEKSDgABQABQAAAPX/EAAAtAAAAAAAAAAELCDgABQABQAAAPX/EAAA tAAAAAAAAAAECSDgABQABQAAAPX/EAAAtAAAAAAAAAAEGiDgABQABQAAAPX/EAAAtAAAAAAAAAAE HyDgABQABQAAAPX/EAAAtAAAAAAAAAAELSDgABQABQAAAPX/EAAAtAAAAAAAAAAEKiDgABQABQAA APX/EAAAtAAAAAAAAAAECSDgABQABQAAAPX/EAAAtAAAAAAAAAAELiDgABQACQAAAPX/EAAA1ABQ AAAAHwAAwCDgABQABQAAAPX/EAAAtAAAAAAAAAAEGyDgABQABQAAAPX/EAAAtAAAAAAAAAAEGyDg ABQAEQAAAPX/EAAAtAAAAAAAAAAEKiDgABQABQAAAPX/EAAAtAAAAAAAAAAELyDgABQABQAAAPX/ EAAAtAAAAAAAAAAELyDgABQABQAAAPX/EAAAtAAAAAAAAAAEFiDgABQAAAAAAPX/EAAAvAAAAAAA AAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAEgAAAPX/EAAA1ABhAACxGAAAwCDgABQA BQAAAPX/EAAAtAAAAAAAAAAELCDgABQABQAAAPX/EAAAtAAAAAAAAAAEHSDgABQABQAAAPX/EAAA tAAAAAAAAAAEHSDgABQABQAAAPX/EAAAtAAAAAAAAAAEKyDgABQAEwAAAPX/EAAAlBERlwuXCwAE FiDgABQADwAAAPX/EAAAtAAAAAAAAAAELSDgABQADwAAAPX/EAAAtAAAAAAAAAAELSDgABQABQAA APX/EAAAtAAAAAAAAAAECyDgABQABQAAAPX/EAAAtAAAAAAAAAAEFiDgABQABQAAAPX/EAAAtAAA AAAAAAAELiDgABQAFAAAAPX/EAAAlGZmvx+/HwAENyDgABQABQAAAPX/EAAAtAAAAAAAAAAELCDg ABQAGAAAAPX/EAAAtAAAAAAAAAAEKyDgABQABQAAAPX/EAAAtAAAAAAAAAAELyDgABQABgAAAPX/ EAAAtAAAAAAAAAAELyDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAA AAAEGiDgABQABQAAAPX/EAAAtAAAAAAAAAAEMyDgABQADAAAAPX/EAAA1AAgAACAGAAAwCDgABQA BgAAAPX/EAAAtAAAAAAAAAAEMSDgABQADQAAAPX/EAAA1AAgAAAADwAAwCDgABQABgAAAPX/EAAA tAAAAAAAAAAEHiDgABQADAAAAPX/EAAA9AAAAAAAAAAAwCDgABQABgAAAPX/EAAAtAAAAAAAAAAE HSDgABQADQAAAPX/EAAA9AAAAAAAAAAAwCDgABQABgAAAPX/EAAAtAAAAAAAAAAEHSDgABQADgAA APX/EAAA9AAAAAAAAAAAwCDgABQABgAAAPX/EAAAtAAAAAAAAAAEKyDgABQABgAAAPX/EAAAtAAA AAAAAAAECyDgABQABgAAAPX/EAAAtAAAAAAAAAAEFiDgABQABgAAAPX/EAAAtAAAAAAAAAAEMSDg ABQABgAAAPX/EAAAtAAAAAAAAAAEMSDgABQABgAAAPX/EAAAtAAAAAAAAAAENCDgABQACAAAAPX/ EAAA1ABQAACAGAAAwCDgABQACgAAAPX/EAAA1ABQAAAACwAAwCDgABQACwAAAPX/EAAA1ABQAAAA CwAAwCDgABQAAAAAAPX/EAAAAAAAAAAAAAAAwCDgABQAEAAAAPT/AAAA9AAAAAAAAAAAwCDgABQA AAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAA vAAAAAAAAAAEKSDgABQAEQAAAPX/EAAAtAAAAAAAAAAEKiDgABQAEgAAAPX/EAAA1ABhAAA+HwAA wCDgABQAEwAAAPX/EAAAlBERlwuXCwAECSDgABQAFAAAAPX/EAAAlGZmvx+/HwAENyDgABQAFQAA APX/EAAA9AAAAAAAAAAAwCDgABQAFgAAAPX/EAAA9AAAAAAAAAAAwCDgABQAFgAAAPX/EAAA9AAA AAAAAAAAwCDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDg ABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGyDgABQAFwAAAPX/ EAAA1ABgAAAAGgAAwCDgABQAFwAAAPX/EAAA1ABgAAAAGgAAwCDgABQABgAAAPX/EAAAtAAAAAAA AAAEMSDgABQABgAAAPX/EAAAtAAAAAAAAAAEPiDgABQABgAAAPX/EAAAtAAAAAAAAAAECiDgABQA AAAAAPX/EAAAvAAAAAAAAAAEKSDgABQABgAAAPX/EAAAtAAAAAAAAAAECiDgABQABgAAAPX/EAAA tAAAAAAAAAAEOSDgABQABgAAAPX/EAAAtAAAAAAAAAAEOSDgABQABgAAAPX/EAAAtAAAAAAAAAAE NiDgABQABgAAAPX/EAAAtAAAAAAAAAAEJCDgABQABgAAAPX/EAAAtAAAAAAAAAAEMSDgABQABgAA APX/EAAAtAAAAAAAAAAEMSDgABQABgAAAPX/EAAAtAAAAAAAAAAENSDgABQABgAAAPX/EAAAtAAA AAAAAAAENSDgABQAGAAAAPX/EAAAtAAAAAAAAAAEKyDgABQAGQAAAPX/EAAAlBERvx+/HwAECSDg ABQAGgAAAPX/EAAAlBERlwuXCwAELyDgABQAGgAAAPX/EAAAlBERlwuXCwAELyDgABQAGwAAAPT/ EQAAAHcQNBpAFAAECSDgABQAGwAAAPT/EQAAAHcQNBpAFAAECSDgABQAAAAAAPT/EQAAGHcSNBow FAAECSDgABQAAAAAAPT/EQAAGHcSNBowFAAECSDgABQAAAAAAPT/EAAAGHIRsBooFAAECSDgABQA AAAAAPT/EAAAGHIRsBooFAAECSDgABQAHAAAAPT/AAAA9AAAAAAAAAAAwCDgABQAAAAAAPX/EAAA nBERFgsWCwAEGiDgABQAAAAAAPX/EAAAnBERFgsWCwAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAE GiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAA APX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAA AAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDg ABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/ EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAA AAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQA AAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAA vAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAE KSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAA APX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAA AAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDg ABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/ EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAA AAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQA AAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAA vAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAE GiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAA APX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAA AAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGyDg ABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/ EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAA AAAEGyDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQA AAAAAPX/EAAAvAAAAAAAAAAEGyDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAA vAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAE GyDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAA APX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGyDgABQAAAAAAPX/EAAAvAAA AAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDg ABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGyDgABQAAAAAAPX/ EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAA AAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQA AAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAA vAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAE GiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGyDgABQAAAAA APX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAA AAAAAAAEGyDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDg ABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/ EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAA AAAEGyDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQA AAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAA vAAAAAAAAAAEGyDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGyDgABQAAAAAAPX/EAAAvAAAAAAAAAAE GiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAA APX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAA AAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDg ABQAAAAAAPX/EAAAvAAAAAAAAAAEGyDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGyDgABQAAAAAAPX/ EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAA AAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGyDgABQA AAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGyDgABQAAAAAAPX/EAAA vAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAE GyDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDgABQAAAAA APX/EAAAvAAAAAAAAAAEGyDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAA AAAAAAAEGiDgABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAPX/EAAAvAAAAAAAAAAEGiDg ABQAAAAAAPX/EAAAvAAAAAAAAAAEKSDgABQAAAAAAAEAEAAAQAAAAAAAAAAEQSDgABQAAAAAAAEA EAAAYAAAAAAAAAAEQSDgABQAAAAAAAEAEAAAYAUAMCBAIAAEQSDgABQAAAAAAAEAEAAAYFAAQBhA IAAEQSDgABQAAAAAAAEAEAAAYAVVMCAwGAAEMCDgABQAAAAAAAEAEAAAYABVQCAwGAAEMCDgABQA AAAAAAEAEAAAYFBVQBgwGAAEMCDgABQAGwAAAAAAEAAAyAAAAAAAAAAEQSDgABQAGwAAAAAAEQAA 2AAAAAAAAAAEQSDgABQAGwAAAAAAEgAA2AAAAAAAAAAEQSDgABQAGwAAAAEAEAAAyAAAAAAAAAAE QSDgABQAGwAAAAEAEQAA2AAAAAAAAAAEQSDgABQAGwAAAAEAEgAA2AAAAAAAAAAEQSDgABQAHQAA AAEAEgAA+AIiMCAwGAAEMCDgABQAHQAAAAEAEgAA+AAiQCAwGAAEMCDgABQAHQAAAAEAEgAA+CAi QBgwGAAEMCDgABQAGwAAAAAAEAAAyAAAAAAAAAAECSDgABQAGwCwAAAAEgAA/HcRtRooFAAECSDg ABQAGwAAAAAAEQAA+HcRtRooFAAAwCDgABQAGwAAAAAAEQAA+HcRtRooFAAEFiDgABQAGwAAAAAA EgAA+HcRtRooFAAEQSDgABQAGwCwAAAAEgAA/HcRtRooFAAEFiDgABQAGwAGAAAAEgAA/CcRNRgo FAAEQSDgABQAGwAAAAAAEQAA+HchtRooGAAEFiDgABQAGwAAAAAAEQAA+HchtRooGAAAwCDgABQA GwAAAAAAEgAA+HchtRooGAAEQSDgABQAGwCwAAAAEgAA/HchtRooGAAEFiDgABQAGwAGAAAAEgAA /CchNRgoGAAEQSDgABQAGwAAAAAAEQAA+HcQtRpAFAAAwCDgABQAGwAAAAAAEQAA+HcQtRpAFAAE FiDgABQAGwCwAAAAEgAA/HcQtRpAFAAEFiDgABQAGwAGAAAAEgAA/CcQNRhAFAAEQSDgABQAGwAG AAAAGgAA/CcRNRgoFAAEQSDgABQAGwAGAAAAGgAA/CcQNRhAFAAEQSDgABQAGwAAAAAAEgAA+HcQ tRpAFAAEQSDgABQAGwAGAAAAGgAA/CchNRgoGAAEQSDgABQAGwAAAAAAEQAA+HcBtRooAAAEFiDg ABQAGwAAAAAAEQAA+HcRtRooFAAECSDgABQAGwAAAAAAEgAA+HcRtRooFAAECSDgABQAGwAGAAAA EgAA/CARQBgoFAAECSDgABQAGwAAAAAAEQAA+HcBtRooAAAECSDgABQAGwAAAAAAEgAA+HcBtRoo AAAECSDgABQAGwCwAAAAEgAA/HcBtRooAAAECSDgABQAGwAGAAAAEgAA/CABABgoAAAECSDgABQA GwAAAAAAEQAA+HcBtRooAAAAwCDgABQAGwAAAAAAEgAA+HcRtRooFgAEQSDgABQAGwCwAAAAEgAA /HcRtRooFgAEFiDgABQAGwAGAAAAEgAA/CcRNRgoFgAEQSDgABQAGwAAAAAAEgAA+HcAtRoAAAAE QSDgABQAGwCwAAAAEgAA/HcAtRoAAAAEFiDgABQAGwAAAJAFEAAA+HIQsBpAFAAEQSDgABQAGwAA AJAFEAAA+HIRsBooFAAEQSDgABQAGwAAAJAFGAAA+HIRsBooFAAEQSDgABQAGwAAAJAFEAAA+HIR sBooFAAECSDgABQAGwAAAJAFEAAA+HIhsBooGAAEQSDgABQAHgAAAJAFEAAA+HIQsBpAFAAEQSDg ABQAGwAGAAAAGgAA/CcANRgAAAAEQSDgABQAGwAAAAAAEgAA+HcBtRooAAAEQSDgABQAGwAAAJAF EAAA+HIBsBooAAAEQSDgABQAGwCwAAAAEgAA/HcBtRooAAAEFiDgABQAGwAGAAAAGgAA/CcBNRgo AAAEQSDgABQAGwAAAJAFEAAA+HISsBowFgAECSDgABQAGwAAAAAAEAAA6HcStRowFgAEKSDgABQA GwAAAAAAEgAA+HcStRowFgAECSDgABQAGwCwAAAAEgAA/HcStRowFgAECSDgABQAGwAGAAAAEgAA /CASQBgwFgAECSDgABQAGwAAAJAFEAAA+HIRsBosFgAECSDgABQAGwAAAAAAEAAA6HcRtRosFgAE KSDgABQAGwAAAAAAEgAA+HcRtRosFgAECSDgABQAGwCwAAAAEgAA/HcRtRosFgAECSDgABQAGwAG AAAAEgAA/CARQBgsFgAECSDgABQAGwAAAAAAEQAA+HcRtRosFgAECSDgABQAGwAGAAAAGgAA/CAR QBgsFgAECSDgABQAGwAAAJAFEAAA+HARwBosFgAECSDgABQAGwAAAAAAEgAA+HcRtRosFgAEQSDg ABQAGwCwAAAAEgAA/HcRtRosFgAEFiDgABQAGwAGAAAAGgAA/CcRNRgsFgAEQSDgABQAGwAAAJAF EAAA+HIhsBosGAAECSDgABQAGwAAAAAAEQAA+HchtRosGAAECSDgABQAGwAAAAAAEgAA+HchtRos GAAECSDgABQAGwCwAAAAEgAA/HchtRosGAAECSDgABQAGwAGAAAAEgAA/CAhQBgsGAAECSDgABQA GwAAAJAFEAAA+HIRsBooFgAEQSDgABQAGwAAAAAAEQAA+HcRtRooFgAEFiDgABQAGwAAAJAFEAAA +HIRsBosFgAEQSDgABQAGwAAAAAAEQAA+HcRtRosFgAEFiDgABQAGwAGAAAAEgAA/CcRNRgsFgAE QSDgABQAGwAAAJAFEAAA+HIAsBoAAAAEQSDgABQAGwAGAAAAGgAA/CcRNRgoFgAEQSDgABQAGwAG AAAAGgAA/CABABgoAAAECSCTAgQAAIAA/5MCEwAQAAcAAeOJypEnYIdlLGcgADIAkwIEABGAA/+T AgQAEoAE/5MCMQATABYAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8AMQAz ADEAkwIxABQAFgABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADIANgCT Ai8AFQAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADUAMACTAi8AFgAV AAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADQANQCTAgQAF4AG/5MCBAAY gAX/kwIlABkAEAABNgAwACUAIAAtACAAOl8DjIdlV1ucmHKCIAA0ACAAMgCTAg0AGgAEAAGTj/pR IAAyAJMCIQAbAA4AATIAMAAlACAALQAgADpfA4yHZVdbnJhygiAAMgCTAgkAHAACAAEHaJiYkwIE AB2AB/+TAjEAHgAWAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADEAMQA0 AJMCMQAfABYAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8AMQAwADkAkwIv ACAAFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAzADMAkwIvACEAFQAB QABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAyADgAkwIlACIAEAABNAAwACUA IAAtACAAOl8DjIdlV1ucmHKCIAA1ACAAMgCTAiEAIwAOAAEyADAAJQAgAC0AIAA6XwOMh2VXW5yY coIgADEAkwIhACQADgABMgAwACUAIAAtACAAOl8DjIdlV1ucmHKCIAAzAJMCJQAlABAAATIAMAAl ACAALQAgADpfA4yHZVdbnJhygiAAMQAgADIAkwIlACYAEAABMgAwACUAIAAtACAAOl8DjIdlV1uc mHKCIAAyACAAMgCTAiUAJwAQAAEyADAAJQAgAC0AIAA6XwOMh2VXW5yYcoIgADMAIAAyAJMCIQAo AA4AATIAMAAlACAALQAgADpfA4yHZVdbnJhygiAANACTAiUAKQAQAAEyADAAJQAgAC0AIAA6XwOM h2VXW5yYcoIgADQAIAAyAJMCEQAqAAYAAQdomJggADEAIAAyAJMCIQArAA4AATIAMAAlACAALQAg ADpfA4yHZVdbnJhygiAANQCTAiUALAAQAAEyADAAJQAgAC0AIAA6XwOMh2VXW5yYcoIgADUAIAAy AJMCCwAtAAMAAX1ZIAAyAJMCIQAuAA4AATIAMAAlACAALQAgADpfA4yHZVdbnJhygiAANgCTAiUA LwAQAAEyADAAJQAgAC0AIAA6XwOMh2VXW5yYcoIgADYAIAAyAJMCIQAwAA4AATQAMAAlACAALQAg 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 AF8AUwB0AHkAbABlAF8AOACTAi0AiwAUAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5 AGwAZQBfADkAkwIvAIwAFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAx ADAAkwIvAI0AFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADEAkwIv AI4AFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADIAkwIvAI8AFQAB QABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADMAkwIxAJAAFgABQABFAFQA XwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADAAMACTAi8AkQAVAAFAAEUAVABfAFMA dAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADEANACTAjEAkgAWAAFAAEUAVABfAFMAdAB5AGwA ZQA/AEMARgBfAFMAdAB5AGwAZQBfADEAMAAxAJMCLwCTABUAAUAARQBUAF8AUwB0AHkAbABlAD8A QwBGAF8AUwB0AHkAbABlAF8AMgAwAJMCLwCUABUAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8A UwB0AHkAbABlAF8AMQA1AJMCMQCVABYAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkA bABlAF8AMQAwADIAkwIvAJYAFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUA XwAyADEAkwIvAJcAFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADYA kwIxAJgAFgABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADAAMwCTAi8A mQAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADIAMgCTAi8AmgAVAAFA AEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADEANwCTAjEAmwAWAAFAAEUAVABf AFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADEAMQAwAJMCMQCcABYAAUAARQBUAF8AUwB0 AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8AMQAwADUAkwIvAJ0AFQABQABFAFQAXwBTAHQAeQBs AGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAyADQAkwIvAJ4AFQABQABFAFQAXwBTAHQAeQBsAGUAPwBD AEYAXwBTAHQAeQBsAGUAXwAxADkAkwIxAJ8AFgABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBT AHQAeQBsAGUAXwAxADEAMQCTAjEAoAAWAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5 AGwAZQBfADEAMAA2AJMCLwChABUAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABl AF8AMwAwAJMCLwCiABUAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8AMgA1 AJMCMQCjABYAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8AMQAxADIAkwIx AKQAFgABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADAANwCTAi8ApQAV AAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADMAMQCTAi8ApgAVAAFAAEUA VABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADIANgCTAjEApwAWAAFAAEUAVABfAFMA dAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADEAMQAzAJMCMQCoABYAAUAARQBUAF8AUwB0AHkA bABlAD8AQwBGAF8AUwB0AHkAbABlAF8AMQAwADgAkwIvAKkAFQABQABFAFQAXwBTAHQAeQBsAGUA PwBDAEYAXwBTAHQAeQBsAGUAXwAzADIAkwIvAKoAFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYA XwBTAHQAeQBsAGUAXwAyADcAkwIxAKsAFgABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQA eQBsAGUAXwAxADIAMACTAjEArAAWAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwA ZQBfADEAMQA1AJMCLwCtABUAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8A MwA0AJMCLwCuABUAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8AMgA5AJMC MQCvABYAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8AMQAyADEAkwIxALAA FgABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADEANgCTAi8AsQAVAAFA AEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADQAMACTAi8AsgAVAAFAAEUAVABf AFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADMANQCTAjEAswAWAAFAAEUAVABfAFMAdAB5 AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADEAMgAyAJMCMQC0ABYAAUAARQBUAF8AUwB0AHkAbABl AD8AQwBGAF8AUwB0AHkAbABlAF8AMQAxADcAkwIvALUAFQABQABFAFQAXwBTAHQAeQBsAGUAPwBD AEYAXwBTAHQAeQBsAGUAXwA0ADEAkwIvALYAFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBT AHQAeQBsAGUAXwAzADYAkwIxALcAFgABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBs AGUAXwAxADIAMwCTAjEAuAAWAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBf ADEAMQA4AJMCLwC5ABUAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8ANAAy AJMCLwC6ABUAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8AMwA3AJMCMQC7 ABYAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8AMQAzADAAkwIxALwAFgAB QABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADIANQCTAi8AvQAVAAFAAEUA VABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADQANACTAi8AvgAVAAFAAEUAVABfAFMA dAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADMAOQCTAjEAvwAWAAFAAEUAVABfAFMAdAB5AGwA ZQA/AEMARgBfAFMAdAB5AGwAZQBfADEAMwAyAJMCMQDAABYAAUAARQBUAF8AUwB0AHkAbABlAD8A QwBGAF8AUwB0AHkAbABlAF8AMQAyADcAkwIvAMEAFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYA XwBTAHQAeQBsAGUAXwA1ADEAkwIvAMIAFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQA eQBsAGUAXwA0ADYAkwIxAMMAFgABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUA XwAxADMAMwCTAjEAxAAWAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADEA MgA4AJMCLwDFABUAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8ANQAyAJMC LwDGABUAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8ANAA3AJMCMQDHABYA AUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8AMQAzADQAkwIxAMgAFgABQABF AFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADIAOQCTAi8AyQAVAAFAAEUAVABf AFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADUAMwCTAi8AygAVAAFAAEUAVABfAFMAdAB5 AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADQAOACTAjEAywAWAAFAAEUAVABfAFMAdAB5AGwAZQA/ AEMARgBfAFMAdAB5AGwAZQBfADEANAAwAJMCMQDMABYAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBG AF8AUwB0AHkAbABlAF8AMQAzADUAkwIvAM0AFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBT AHQAeQBsAGUAXwA1ADQAkwIvAM4AFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBs AGUAXwA0ADkAkwIxAM8AFgABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAx ADQAMQCTAjEA0AAWAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADEAMwA2 AJMCLwDRABUAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8ANgAwAJMCLwDS ABUAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8ANQA1AJMCMQDTABYAAUAA RQBUAF8AUwB0AHkAbABlAD8AQwBGAF8AUwB0AHkAbABlAF8AMQA0ADIAkwIxANQAFgABQABFAFQA XwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADMANwCTAi8A1QAVAAFAAEUAVABfAFMA dAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADYAMQCTAi8A1gAVAAFAAEUAVABfAFMAdAB5AGwA ZQA/AEMARgBfAFMAdAB5AGwAZQBfADUANgCTAjEA1wAWAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMA RgBfAFMAdAB5AGwAZQBfADEANAAzAJMCMQDYABYAAUAARQBUAF8AUwB0AHkAbABlAD8AQwBGAF8A UwB0AHkAbABlAF8AMQAzADgAkwIvANkAFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQA eQBsAGUAXwA2ADIAkwIvANoAFQABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUA XwA1ADcAkwIxANsAFgABQABFAFQAXwBTAHQAeQBsAGUAPwBDAEYAXwBTAHQAeQBsAGUAXwAxADMA OQCTAi8A3AAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADYAMwCTAi8A 3QAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADUAOACTAi8A3gAVAAFA AEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADYANACTAi8A3wAVAAFAAEUAVABf AFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADUAOQCTAi8A4AAVAAFAAEUAVABfAFMAdAB5 AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADcAMACTAi8A4QAVAAFAAEUAVABfAFMAdAB5AGwAZQA/ AEMARgBfAFMAdAB5AGwAZQBfADYANQCTAi8A4gAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBf AFMAdAB5AGwAZQBfADcAMQCTAi8A4wAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5 AGwAZQBfADYANgCTAi8A5AAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBf ADcAMgCTAi8A5QAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADYANwCT Ai8A5gAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADcAMwCTAi8A5wAV AAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADYAOACTAi8A6AAVAAFAAEUA VABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADcANACTAi8A6QAVAAFAAEUAVABfAFMA dAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADYAOQCTAi8A6gAVAAFAAEUAVABfAFMAdAB5AGwA ZQA/AEMARgBfAFMAdAB5AGwAZQBfADgAMACTAi8A6wAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMA RgBfAFMAdAB5AGwAZQBfADcANQCTAi8A7AAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMA dAB5AGwAZQBfADgAMQCTAi8A7QAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwA ZQBfADcANgCTAi8A7gAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADgA MgCTAi8A7wAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADcANwCTAi8A 8AAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADgANACTAi8A8QAVAAFA AEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADcAOQCTAi8A8gAVAAFAAEUAVABf AFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADkAMACTAi8A8wAVAAFAAEUAVABfAFMAdAB5 AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADgANQCTAi8A9AAVAAFAAEUAVABfAFMAdAB5AGwAZQA/ AEMARgBfAFMAdAB5AGwAZQBfADkAMgCTAi8A9QAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBf AFMAdAB5AGwAZQBfADgANwCTAi8A9gAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5 AGwAZQBfADkAMwCTAi8A9wAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBf ADgAOACTAi8A+AAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADkANACT Ai8A+QAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADgAOQCTAi8A+gAV AAFAAEUAVABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADkANQCTAi8A+wAVAAFAAEUA VABfAFMAdAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADkANgCTAi8A/AAVAAFAAEUAVABfAFMA dAB5AGwAZQA/AEMARgBfAFMAdAB5AGwAZQBfADkANwCTAi8A/QAVAAFAAEUAVABfAFMAdAB5AGwA ZQA/AEMARgBfAFMAdAB5AGwAZQBfADkAOACTAi8A/gAVAAFAAEUAVABfAFMAdAB5AGwAZQA/AEMA RgBfAFMAdAB5AGwAZQBfADkAOQBgAQIAAACFAAwAM9oDAAAAAgGWmXWYhQAQADD6AwAAAAQBuk6b UkSNkG6FABAA0iUEAAAABAEijaFSoXsGdIUAEAC+QAQAAAAEAR91p06hewZ0hQAQAKR6BAAAAAQB x5EtjaF7BnSFABAAlqQEAAAABAECXjpXJYQAlYUAEAC6ywQAAAAEARR40VOhewZ0hQAQAKDeBAAA AAQBAU8aTqF7BnSaCBgAmggAAAAAAAAAAAAAAQAAAAAAAAACAAAAjAAEAFYAVgDBAQgAwQEAAI00 AgAiAAIAAADrACAgDwAA8IcbAwAAAAbwaAEAAAG3/wUsAAAANgAAAAgAAAABAAAAAAQAAAEAAAAA BAAAAQAAAAAEAAABAAAAAAQAAAEAAAAABAAAAQAAAAAEAAABAAAAAAQAAAEAAAB4AAAAAgAAAAAE AAACAAAAAAQAAAIAAAAABAAAAgAAAHABAAACAAAAAAQAAAMAAAAABAAAAwAAAAAEAAADAAAAAAQA AAMAAABwAQAAAwAAAAAEAAAEAAAAAAQAAAQAAAAABAAABAAAAAAEAAAEAAAAcAEAAAQAAAAABAAA BQAAAAAEAAAFAAAAAAQAAAUAAAAABAAABQAAAHABAAAFAAAAAAQAAAYAAAAABAAABgAAAAAEAAAG AAAAAAQAAAYAAABwAQAABgAAAAAEAAAHAAAAAAQAAAcAAAAABAAABwAAAAAEAAAHAAAAcAEAAAcA AAAABAAACAAAAAAEAAAIAAAAAAQAAAgAAAAABAAACAAAAHABAAAIAAAAAQf/Ba8AAfD7GQMAYgAH 8N5DAAAGBob2PSus/N9qsySl9eTbeMr/ALpDAAABAAAAAAAAAAAAAAAAbh7wskMAAIb2PSus/N9q sySl9eTbeMr/iVBORw0KGgoAAAANSUhEUgAAAVQAAABxCAMAAAC9Wqu2AAAAA3NCSVQFBgUzC42A AAAAAXNSR0IArs4c6QAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAv1QTFRFGBwYEBAQAAQAMRwhMTgx MTAxISAhKSgpISQhOTw5KTgxITAxIShKKThjOUFaOUVrMUl7MUmUMVGUOUGEOVm9KU2lMVnWKVHG MV3eMVnGMWX/MWH/OXH/QhgYShwYWhQYQjAxQjQxWjAxSigpWiAhWjg5WighWjx7UlVSQkVCSk1K WllaQkFCQlFjQkV7SlmEWlG9UlGtSkmtQl3eUlnWUlXOUlHGWl3OWmF7Wn3eSmHOSnn/QnH/SmXn Wob/WoL/exgQYwgIewwIYxwYeyAYczAxaygpeygpYyxaazBSczhze0E5e0lKY0lKc0Fze0WUa0Wc c0GUY0GUa021c0mlY02ta121e3l7c3FzY2Fja2lrY2Vja22Uc3XGc5b/e57/Y47/a5L3Y4L/e47n e6L/nBwYlAwQlBgYjAwQjBgYjBwYlDApjDg5nDw5lCQhhCghhDAxnCxKlChCnDhrhDh7jDRjnFFS jFFSjFlajEWMjEGEnH17nHV7nGFrlGljhHmtlJaUjIqMhIKElJKUnJ6cjI6MnIqElJ61hJ7WnJLO nKallKbenKbGnKrenLL/jKr/lK7/tRQQrRwYpRQQpTAxvSQhvSAhvSwpvTwxrSgxrTgxrSAxtTha vTBKpTBSrShCrThjrUVCtVlapUFCrU1KvVVjpUlzrWVrrXFzrWFjpXl7tX2EtYqMtZqUvbq9tbK1 paKltba1raqtpbLWrb7npb7/pbb3vcvGvc//tcP3tcf/vcPnzhwY3hwYzigp3jAx3igpxiQhzjAx zjw5xjBK1lVS3klKxklKzlFSzlla3lFS3l1jxl1jznFz3m1rxmVjxnlz3nl7xoJ73p6c1oqExo6M 1paU3oqExpqczpKUxqqlxrK11qql1rKt3ra11tPWzsvOxsPG3tve3t/eztPO1sPG3svGzs/Wztv/ xtP31tv33uvn3uf/3uP/5xwY7ywp9ygp5ygp9ywp5zw554KE56ql777G59ve9/f39/P37+vv5+fn 5+Pn5/P3////vEjkbQAAQC5JREFUeNrtvXt8G/l1HwrGAAFoWzt2va8ZNNdO0pSv3rpxtK1DhViv 3aZNmtpN4gIiWxJcU8uV46aNN49707QFQMB3K9egBFVYb5114riP3JsEA2CXEkVTEunGTmO7bm4S J3Hc9bygJbgSpaVTh/PifHrO+f1+MwMQ1K6d/NkBHwAIAjPf+Z73+Z2JSbDJsizJ+Fv8FHfYM3if bfxB8OfIH+S+++KGby2LPwYvkfvesX+To3eO/HXI68L9DXdw+AuPf1IODpa/mRz96j+i17DFJN/y YYMftqoVdaOpOPSMxW+2rijFUrmcy+VzuXJppVgpFosr1ZLmW32bb7dOj41PTI6NTcTjiXibPWvT D9f1aHPNdj4+mkxOaKZhqIbnGko5P5v/sKKrqmqYhtaqtNpduKuqmuE6juvYDm62Y9v4jXfUyeRo bCRWNFUX3to18U98c1zPbSVTVUN1VU3Xm81OEXcXdrZUXcnPlsZio7HR0Vjwk+7F8MGYwSAIsOA/ vrUNQRWbrTaLhqMoto94CVQtVVEqlWIFtnOtc9VSlTAtlzWLv0j89tX85MTEGGxT8USiZCOiDFMn 2FzX1WZjyXQbYFM1U9Wa1Xy+XOx02k1d19QufFKniZh2dc2lLfhXQs221LlEIpGKjTb98lxLdRUd n7T4x3imqY+lOnhOtCu63q6srBSREOVqtZTLj40SiCkAMRWLEaQM39F0ySYUrT8HRAWo/L0sQ6l4 luPwtxSwmk04YNg0DYDQW6XSCuxiuaxGAWWbPjsGoE4SVccMQdQIk4BKntkej6Xb8FZdDeiEZMKz 1VEIVh2oquhaV2s2NRN4x3ANoLXt7iyKAaA63hobiaUnZ7vwJMfU9UxD1T6cquB7azf1ZqtarRar 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 gtGyhy0+RQTtMjpSE03fH5ygZg2ZM++Lh85K1fe1iuW/dp3qhKjSTpqObUUv8hH6rWC26Pod3PRr WlvfYQuHOVdNXFzlipls4WXQw6sACD3rsAnUbMUhXad15188dvZsiCrgimr1TMhVcdvfZ7Be+6Jt R2akDFirgasXi6v3dabSOduPjPUTinRgxW/o+ivxFcNIjHWc1yD+Qy8DyWg0gCr/DEBb1XGYR5OD qnfBeWWyH4w/DC7+ImbduZELVUQvO+EGU8JowRbqET2K6tknn3zssWDYLw33DDY2Dgh8gD+wXCe8 aN+QWYkR+efWyjc0f8hE/76h/QNG6nQsbbbGY/qrgPq/tz/37X8Bz4agehxqBGkAAAAASUVORK5C YIJSAAfwNioAAAUFPsaywuGjEmtcG/14i+r87P8AEioAAAEAAAAAAAAAAAAAAKBGHfAKKgAAPsay wuGjEmtcG/14i+r87P//2P/gABBKRklGAAEBAQBgAGAAAP/bAEMACgcHCAcGCggICAsKCgsOGBAO DQ0OHRUWERgjHyUkIh8iISYrNy8mKTQpISIwQTE0OTs+Pj4lLkRJQzxINz0+O//bAEMBCgsLDg0O HBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 O//AABEIAHEBVAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1 EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoW FxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImK kpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy 8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUE BAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkq NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqi o6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAM AwEAAhEDEQA/AM3gDJprSxqMlhXPX2ryi5liTgIxXP0NZ0l1cynBdq9+pVak9WcMYaHYi4i67l/K pVlhOOVz74rmbHT7u4ALOwU+tbsGnMiDkk1PtJdw5UXQIzjGOacIUI6H+dQC1lUYANPDyR8MM1Ht Jdx2XYsxbUODEjj3UVpWzWbjBtoT/wBsxWUk6t14NSHOcg1nKUn1Y7Lsbf2GzkXKwRD/AIAKhk0+ BDkQR/8AfIqrbXrxkbunrWpFcJMoBIzWLqVF9plcsX0M10tkzm3j4/2BQgs3P+pj/wC+RWjPZpLG QBWAbae2mOclM9faqjVk/tP7xcqL/lWv/PGP/vgUotYGPEEeP90UlvFkbielMvtQjs4jyM+lDqTv ZNjUV2G381jZRFnhhz/uCubbxHaGcKI0OT2UYFVNXe5v/wB42fKHamRaTBNaiQYDAZDCq55rq/vN VTja7OrtJ7SaIExRZPfaKrahdwQ/cjjH0UVyy3NzavsDkj0zUpuJrx1T7xPX2qXUl/My40VfYufa pLqcJFkKDkkcVv2tugiG9FYn1HNU9MsFjQMRWovHFZyrT/mZThHZIFt4j/yyQ/8AARSSWcUh2qiq fVQKlXg1PaIZZwccDpXLOvU/mf3m0KUexmXGmvbR+YF3DvVZLfeNx/IV2r2qSwbcc4rnL+xltpSU Hyd64p4mr/M/vOynTh1SILdYoWUtGjjP8Sg11OmW+m3UY3WNsT7xL/hXKRRMxOeOK09MuXtZR/dz 61xSxVX+d/ebOhBrZHRzeH7FxlLSEH/ZQVUOj2inabSH/v2K3rGdLmEc84qaa1DDKj8an61X/mf3 sx5YRdnFfccvJpFqBkWsX/fsVWfTbcHi2i/74FdULFnPIHXmpF0yPPIpLFV+kn97KfseqRx6aPHI Ri3T/vgVch0S2HLWsJ+qCuqTTgR8qVKulqDl/wBK2jiMQ1o397MpOj2Rz8WhWb/8uNv/AN+h/hU4 8NWr/dsLfH/XJf8ACukihhgXsMdzUU+oQRDg7j6CnKtUhG86tvK5lzKTtGP4HM3vha3SEyJaw/Ly cRisaextsbUtIgR/0zFehWky3VvuwPcVz2q2S2lyWVflbp7VCrV4xUvaNp+ZtT5JNxlFXRhQWFqB iS0gP1jWmXulWzRkx28S+6oBVoly5IXA9amVty4OOa6oYio1bmf3ilSitbI4W7haGcpjHP51CEKj LE5B710usacDl0Xkc1zsqlyw6etUq1VP4n95rGNOS2Rq6TLazDZJDCxHdkFX77TLeWEmKJEz02qB /Kuatt9u4cN3rqtPuluIcE9a66deo1rJ/ecVajGMrpHJiF4HeNySQ3BJ7UVp67EIr8AfxID+por7 fAtvDQb7Hz+I/iyOBn2nUp9wx++bP/fRq7b20Zb5Rkn9KrTQNNqE4X/nq3P410mk6eqxAkcivCm7 SZ2rZE1jbsEAArTjiAIpyIAMKMVYWM1zykA1YvRaV7VW6gGrkCKR0zUsirjGKycmUonPzacwfdH0 9KiSQxNsfNbbgDnGap3FokpLd6pSvuBGo3DK96fukjGVJ46ioIXaGQxt9Oat446UmA+01lC/lTEB q0ikVwueD71yeq2DPiWFirr0IqHT/EMtqwS4PHTOalwvqi0rnT3dtLHGxg61zhsbqecm7HQ/hXTW OqwXaAqw/GrUltFMpGBzUKbjuOxw2pSJbwlQM9sVhRXUkZ2qxC9hXY69pEghZ4l3EDpXLafpNxdz /OpRAeQRVOfY6KaVtSGOCa9lwgOD1auj07R0tlBcfMPXmtKz02K0jACjIqxsyKychtt6IiVQO1SB aMccdakReKxnM1jEbg4wOvvWnZRCNOOWqC0tzK4OOKnlka1fplQe1cc5nRFF2J2VsOfzqzNZpdR8 jJNY5mMhDL+BrfsN7QgkE+uBXFUqI2tZXObuLI2spUrxnikjgBPFdZd6etxGMp17mprPQLeNQ8vz foK4Z3cvdNPbQjG7MvRxNE4VQxHpXURxOyjcMcd6iM1jYLtyin0HWqc3iOMZEMZPoTVqdKl/El8k c0/aVneETU8j1P5CnAwx9WAP1rkb7xBeNwJRGp7LxWdHrMgfO8sfUmsnmEI604/eaRwFSS95neTX kcS7sZrHvddkAwmFrIbVZ7tBHuH4CrI0kzQFjIS2K5KmPr1nbZeRpDC06WtQjOss/wB5sn3pYHmu slVJGOtZ/wBglSfD9AetbemcMEAGPpXLFObOqooU43iixo87wXJik4DVp6naC5ticfMvSmT2iBRI BhhzVuJxLEM+nNfRYSElGWHqeqPHq1E5KpE4qeTy8pt+YcVXjLhtxGBmtXXLT7PdGQD5WPasaafK jjjvRTnZ2lujt0lFNdSxLseMhiMGuT1S2aGcunQ9a2ZHdiuOlJeW8UsGBgnFdalzIxS5GcfLM+4g Yx396uaRqTQTbGPyk96V7HMjJyPem2lp5MreaQDnitYNl1OVxsX9ckEt3E46GIfzNFUrltzgf3Rj 9aK/QsB/usPQ+SxKtVkjO0/TGa7mmccNIxH510MUKxKFFOt4gtvGQMZUGn7QpyTwK+eqyvNnWtie GMYFTiMkVWW9t4sbnHFWEv7eQ4WQfhXO7misSL+75pskwA7UNICO1U7hzniklcZN5goAB6c1WiJk 65GKtxgKvND0EVLqEY39xSxtmIHPI4p942ImIHaqdnKHQrnNCHYsSJ5ikVyGsW6w3LZyN3PHSuw3 Y5zisfXYA0PmKmSD6Ur2Nae5i6ZNcRuDCxA7gmursNe8thFO2Peuc0qMFWZgVI7UlxHJLcFo8ttP as5STOjkTZ6HFLFdR9Qcio30+IfMijPqK5OxvbizAYvx3zXS6frMVyANwzXO5A6ckMeFkb5hTWUf hitcxpMvaqNxCkJzuH0qJTS1ZUI30Ke3HJH4VLbW7zSDg4qILLI+VjO31bjNXUkSFf3kqoPrXBVx dOPU7YUJPoaMMaQqBkZP51dTS3vk4jAB/iasBtctbc5RWlYVaXxjeeViKBIxjgtzXnVcansdCw1S 3unRWfhi1hG6dy/fHQVek1HStMUp5sakfwrya87vPE11NkTXjkH+FTgVkS6wCfl6+tZxxUkv3cfm 9Q+pyl/El9x1+q+M/MuDHaxbVB+83U11elXaanpSsG5K4Yg14/5/mtv9e1dt4I1Ty5TayN8rdMml Rnafv9dGLEYdKn7i2Jb4NY3Lxy56nBNZNxf4J2mut8V6eJ7UXCL8ydfpXBzDB5rhr4f2VVwZ1Yaq qlNSGT3TOeajWU/U9KYcZ4/GnJEzfwmpsrHVsadjcgDg812OhnzVBJzn3rgY0eOTHODXW+HNRS2i Mcx2spyM9xWlBR57M48VFypuxvXlohlGQBkelV4Ylgnz0BqLUtVRgjRkHFZ8upPKCFJyemKmpOMa 7cNjkpUajhqdRJOjW5Ge1U9Ou8TNExrCttUcApITmnW+oCOcse5610yxc3VU+xKwjUWjotXsxd2h 6bhXFywCOcrJ613lpcJdW4Yc5HIrndX06MSMTwe1eliLXVaGzMsNJq9ORgyruGyNOnes+CF/tJSR jjqOa2JFeNMAYqhd258nzVOD3NXTnfU3lG2hS1C3CN5kZye+KpvCJ1LnAxwQO9aiTQfZ/nO5iORW awNtdBf4H9a7ISMLPYo3MYilCg5GMiipdSINyAvQKBRX6Fl3+6w9D5fFfxpGkiN9ii2jkxjH5Vn3 1xNDAS64A7itWAg2kAH/ADzX+VMvbcXEBRxwa+cnK03fuda2Ry3kpqMRP2kgkdM1iXCajptx8kzk DoQeDWrd+H1gmaa1neNuu3PX8ahggv76RY2iJCnlzV7o0Rp6Lr0tymyUEOvBrZUtIA2ODTNP0GCI ByuGxzVmWSC2J3sAB6msnJX0EPjiPWn/ADDgnioLTUoLs/uiCo706+mCQllYBvSsm3cpLoUNTvBH GVPpUGjHzIC4Oc1k3txJc5HqcCt3SLcwWSA9SKlzsjo9nZFwLu45FK8QeEhhxTtoHJIA+tOTdOhS BHlbHRVrmqV4xV2y6dGTeiEi0WCe2IC4Jz6VkTafJpbMXQshP3q6uytL1IjvWOEd9xyaSX+ywwF5 cLO4/gB/oK8utmVKK0dzupYapfXY4sRXV24WCJ2B7AZrRtPC+qrIJseSP9o/0rrn1GKzsTLZWkKK BkbuK4XV/Geo3LlVlCL6Rj+tefHH1a7tTPQhhn1Wh05xYxfv7sHHoax73xNZQZ8sGVveuRk1a6lB BY/N1J60tnY3N9J8qFs96HCb1qy0OiNGnHY2z4qaVvmIjXPIUVJqer2NxHGLYMz/AMRPasK90i6s W/fQso9a0dHsUDKZl5PQGl9WjOPtIJtLtt8ynUhTsnpcnmvbhoVCR7Ux1xVdrq4IG9jivQ7HSBe6 eY1iBwO4rj9c0aWwlY+WQgNckZRUuVqwKqp6JmTuJOSaUqMZzSIPWnBXdtiqc10egiSEjditrTrl raZJF6qc1QstJu52AjidiegArqLDwbqFxEWl2wj/AGjzWU10RnOcYq7Z3enXUWr6UDkNuXBrib3Q 7gX0kUUbNg8Yq94cu30nUpdOmkDDOAR0rrJ7kWymVYt5b0rSfLXhGUna2h5ylLD1Goq6exx1p4Ov JWBmAjHua27Xwtp9qN077/qcCppb6+uYyYgsfpjk1iXrTyoxkmfcOoJrFKmn7sW/U1vWqbyt6E3i B9JhhCWsSNOGG3aP61k3mya3Eq/I6Dp68VDHPE9yqZzz161bvrQyAFO47Vx1ZWnzNWOylBRjy3Kt tLNeAKuT2z2qZ99tKAxy1FvJ9hjKbeSeKqyTu10ryZ696wu3K62N0rehrWpg3q0vDHrVe7kRZ2ER 47VDKwf5g4AFMtbS4vJgEGQD1NEb3u2Q4panQeHdSMUvlOflat7UbdJFWUjp1rlo9MuINsidR7V1 VjIbiy8qUYYDBFe1g6nPB0ZeqPJxUVGaqx+ZyOrlixEPQc1VfDWJDMOlat9p8iyyRsflB/SsF4/9 KMJkO0+laUZNM3dnHQz4UW1mDuuUzwas3YivI8RryBlasSWkMcJjZhz0FVbW2uHYoMKgPbvXpQdj nnrqYMvmeYyyDDKcfhRV/XYBBfKo7xgn8zRX6Nlv+6U/Q+VxTvXky7aqTbRc/wAA/lU5U4wTVeCY R2kPBJ2D+VV7m+niQyeUQoPU185Ui3N+p1x2RYfTLdzub+dP2wwrthQZ+lU4r+S4jHy8H0NXLSMn BIqHdblIn8zyLdncgDFcLrKarqtzL5MTC3X3Az9a9J0Sz06e11XVdSt/tIsifLRmO3hc4x0yas+G 9X1ga9aW95DHb2V9EzwQxRqqABdwIxz27+tdUaEVGTetlrrbpey3vp6E87TVup5BZnU9LJAUhT68 ivQfAlnBq+m6pcanaC5aGIMoJIII3dCDkZxU3jTSb7VPEdzBpumMyRBEZ4oeMlQ2SQMZ+bvXQ+Bf DV9o2n3seoRrGblVULkNwN3XB/2ql2oxc4u10ra66tP12uaN+0smtb/5nmUOnz3N6HjgLIDnHaui NtKkQMk0cA9Aaf4h02+8Nyx2guhJGYt6yrHtJGeR1PSuctPE1nZXokaOS5ZeNznP5Zr5jNK2IhXk oap6q3VM93BUqdWlF9tPmb0Op6Pp53XKvdOCeNuf06VqaZfXfii9W10yH7FBtzLMMZRPw7noK5RJ rjxZrKQWlsqeaQoUDr65P8/TFej2Uvh3R9Nl0K21eO2umUrJcKCDv9d3Tj0zx9eavLcBKoliK0W3 0W/zfkvxfoZZhXhT/dQevX/Jeb/IztW8HPPfmy0jVo/9Xuktp7gl17buAeDkda861u21Pw3qD2sp 2SDrjB9/5EV6XZ6efAumXup3ki3V5O3lwFckHPIye2TyfoOawrjwzHqumtdXGZrmQl3lzk7jya68 2+q0qTnJXbsk7WbatdvyS073+ZjltSr7RRvaK3X5HAwXOp6i4gNxKVbrluBXS2ngtJomUXJc4zkL 3qhHp8mk3DKw4Jxur0PwlbiSMSdQeDmvl6k3L+E7I96rVdNXZ5hcaBNZ3gSVcpnqO9duNCi06ytL aFJ5dckKyfZ4hlY0PZ/TjmtW7WLTvENzd6hpdzcvEw+xxRp+5I7OzZ6/y/lHN41km0q/tpoza6lI cRSWq5yOOCc5yBxn8q+yy3CezioztKclrqtu1t7a+993Q+bxuMlW95XjFfn/AJ9iBtOvdZ1E6NJb wJLGVM80T71iXuD/ALXbFO1rTrq8tEksrKOx0zTEPlSXPyST9zjPPPbpnP5XG0PWdH+yyaDLcT2k pWd4nZI23DBw7cZBGRWV4ptda1jUHuxZv5aqMQrcpL5eBzgKTjn2rup0KFCL9hFcrWyerez0bW/T WyV7XbOJ1KlWS9pJ37vZdeiOs8NzQPYQyk7fMQHHvWJ4mCT3D2y8h+K5nSNemtgtuzYCnoe1X7/U TJOkyvk1+c4y6nyctrN+q8n6H1OHo2nz3vdElj4VgjUSTMqADOXNXof+EUsJczXCTSDoFUsB+I4p vheHQ9UmmGtbXvDMPJEspAdTgAAZwec/nWr4qvbLSLZNItbGJI5lWS42AJiLeAenUnpmvqsNk9Kb jGcm3JJ6WS1Xd3v9yPHxGYVE5WVraf12KFx4utLeXZpdlufoF24J/KqNzrHimdGf7HeQwnqUt2A/ PFdS8U+m67Z6ZoVlaQ25RZrl9o3FN2Dz1PA96j3zJ8RVSPUTLHJATJbAnEQCjAPbJPP41vDKcJy6 3eje/byS0+bZg8bUT0S3ttf89zgrKdhd+bvJkzkk9c16Ppt4upaaDn5gOfY1w/iK8Fx4qvpcjCSC MD/dGD+orW8PX4t7zZu+SX9DXzuMo08PiZUYbWW/eydv0PWi5YjDqpJa/wDBNSe5vFubTTbDyhdX JfdJMCVRVGTx3NY97dXN5LHp32Rl1feUeEEKpwM7gT2xzWlr95Dpmq2WoQ3Nt9phDDyJWI3qwx1H T8eKpLqsk3i6x1q/tY7W3C+QCkokAJDAMWHGMtivocFgsNUwtP2sVez62bkm9O7TVtvvvc8epiKs asnB/wDAWg2z8G3lxdlLjVLS2mA3GGH946j3HGOv61d/sCw+3tpg8SXY1ELlYwQADjPK4545xmtT RLH7H4h1TfpzK0sjSre9nViDs/A56elPTTrpvFU+s33kx21tAY4MNzjqWPp1au1U6EG0lFK11pHV 9tm382ZOpUkk23v3f/AOTvReabfi01GFTNjdHLH9yQevsamt7CK8zLK/zA/dFNllk8RarcamSViX 93bqeyDv+PWoLS+t7K8ZbuYRYOBuBNfG5hhITxzo4aOttUu/VL+t79D6DDV5LDKdWXzfboWNW0y2 0+FZ3m8tD0DHqfbuakhk1iLTHubfSWit4UMjSzNsZlHoOvSq+k6xFJevdHSrnV9RDHZjBjhXPG3G cduSP/r3Nd0XXmia/vLtr22ERkmt/MMIiwMkAAkHAz9cV9Jhsgw+Ht9YXNLs3b5JXX3yaXZHkVcy q1VaDsv633+5I0rXxPYS2ix21rd30pHKW8BbaSOhPApsWuXtkxmvdGvorcdZAgbaPUgdKh8NXM9/ 4Nm03TbhINQgyFZuDhm3BuPUEjPrVu3bUPCnhi7utRuDeTh8xoZCwGSABk8nnk10yyzCRlyqPvJ2 Wru/Povvucyr1Grt6Py0LGptBf2Ud/ZzLJCw++vINcjqAjGfJJ80dMV1fh6xMWlXFvcFTLNK0sgQ YVWbso9OKxL2KKznZGjzID0r5jFezjXbpO8Xsz2cJKThyzWqMCSRnVVXc0vpnp71p2yPbxoZG5aq jSG3vPOMBCN1PpSyS3FxcrIiloh0Fb0pmlSJQ8S86jGfWEfzNFR6/v8Atse8YPlD+Zor9Ny3/dKf ofIYpWrS9QtdQCxojL90AVelEV3btHgFWGOKgS1intImXAkCDB/Cqi372zmCWPacfK3rXz1RJzdu 52x2Rh6gt34fu1dZS9s3Y9qv2vjK2EJQ53Y9KTVbmNrVjd4bI4FcQil5tqD7xwBUy8zaMb7nsuh3 K3Hw11eZT80k24/Q7P8A69aUQaLWvCURJG2zyR6EpzXPeC4LqfT5tGAUWMgSS7mbOY0XkgH1OMfn XUaVqOieJPEsdzDJLBdWOUgjLDZLGAe2ODznHp+nbN8qk7aWb9Lxsv1+WpypXa/rZmRrWuazZeNN QstHDF7to1xtDYIRRkZ/Gu00gzWunSR3l+Ly9iG+4+YfuyRkLgdBx/WuI8Qa7Po2sXkEVitvqd6w BuVl8zEeBjZwNvE8ACAg17/piz4MaSHTPEEbtmQQh9x5Jyr/AP1qyrwjOko6JpR7Xey37a6FwbTv 0u/1Zn6FYWl1pbERqZmDK7H6/wD6q8/1LRZbTW3t2GF3ZB9q6vwfqZg1eS2dsJI/Gexrb8Z6Qgji 1JY8qD8+PQ18ljpzlj5OUtJO13stdPkj6LCSjSoKKXS+nV2/MwdIW2tY1Imkt1UFWaI4Zgeorokt NJsVj1LWLcW8CjNnp2MySj+8/wBcd+P6s0bWvD1gw/s7RriXUAP3bTMrYbt6Y+oAq9oqTTa+9rqV ha6hcykTz3E2GMC4Hy4xjr0r6LCUadGPI5uXKrrVfOyu7b7t31srXZ4uJqzqTcuW1/X8f8vvIJNf 8RKovrzTludMv1ytuUyqqO2RyDgZ569fpZ0SSVraS48OuLi3U/vtNuTiSLP9xu464z/OnN4mvNR8 XWVnpMmyxjlCbVHEqj75+mM4/Oodd1d9O8btNpywLJFCI5Q4wshPJzjqeV/Kumu6LpNVYxStfy3t Z+fS6d7mEIzckott/j30/wAjI1l7W4kdZIpLWccmKdCrCrfhTXIrGN4JTgdVPvV7U/Fk89v5N/oF tMjDIDS7h9RxxXF26LJcSorhDt3KoP6V8bjMLhKMPaYeot/h5lL5pr9fvPosNUrVk6daDt3s1/Xy Ov1281HWdFutUSQQ6fC6xxoF5m+YAsT2GTSeH7jVrszrpFtpWmx22PNlMbZwc/xHJOMGsK2SeSye 2E1yIcgvAHIjPOclfrXUeEI0Gka3HLBJcIz7HjiHzuCuMD86+hwWPw1ROlh1old3XVuKV9dXvdvy seTiMHVpLmqvrZa+Tfy6DItMj8VTTW8nia4vJYAC22DbCPoOh5/Osq00ix0nxHH9u1y1hNpIH2wq 5Jwc4JxgH8TXRWMmq6fZvDovhM26tzvmulDE44JB5P51w19peoLctaXsUkErhnZpf4z3IPeu3FYq WHpymleK6JxulbVuyenlb8jDDUI1pqDlZvq769lqP8ZTaTJrTT6VOGjmXe21SAr85xkfQ/jWPHdl 0ALZI61RtrCS4mdE+Z1JxzXUaP4YKKbq9ISNBu5PA9zXxeYYqnXq86Wuitu308j6vDUfqtLllK+5 0PhPw9aXVvY6pcakRsnBSDaFxIrcDJPPY4960PGS2epXa6bDaeZqGF3XHQQpnOCfU88e9Zek6XDq Oq2lzp9my21rOsst25KodvOAD17flT/Ep03V765l06NZptv7y8lm2QoVHAQ8At9eP519rQ1cZpez strJKLb2aTX42b6o+RqvVpvm13vv/X3F2wu9O1W50OS41B7fUrXMLwBSS7LjhvQHH61MdZ8M6V4k 1C4YTx3wDK7OCVYjGQvucDrVXwne6LLqcFvaaPKbnZl7uRvM2kLyc5OMnjt1qbxJe6/Pc3en22jE 2rgp56wGRmBHJBzjvW8oJ1vZyulbulo3fzuvLcyT9zmW9+xwrrctM1xMDmVi5PTk9f51etjH51ut zI8du0yiZkbBVTxnPardxbSwxQ293Yz2u4bYmmXG4gdKghjK4VgM5xgivj8ZKeFxqxFWN7u//Db/ AC7M+jo8tbDeyg+ljt9HHheOyvZdPjSaOBT9olkUsWGCTy3UcduK5zSku9Ut75dP0ZXtbmU4UyBI oRgcDuT06VNpdvcXfgzWLexhMlzNebNqkA7fk/TGafDpOoNfQ6FYX0sSwjztSnhcqPMfHyjHsAAP /r19bCFOcJOT3s9W9LJO+lur0+7ufPScoySS77fcdF4fsdfskjh1K7tpLeJNqqgLOfTLEDpVHWLT Rp57lNQ8UXMau2Wtlu1AT224P5VUsLszeOrZLZm+wwRyWsWWzu2KCx9+SOe+KpaTFp15q17puqWy Ot3dytBcdHWQNyu7r0wR/wDXoVNxm6knbRPRK+7/ABVrsXMmuVL7xLqHSNL+yXGi6obhXnEUsDTB ztIPO3GRikXU4NH19tTe1aeB7YxYQA4bIIPP0xVy4tJfDl9DaNBa3i3KuttcPEBMmBkhiBzwetY0 lhc3E8Fl5iia6cgFzhUA5JrwcVOSzKkqMU3KL1fVO922rbWfnoenQjGWFm6jsk/uen5nV+HvFNxr l60EWlrbW8KkyyGXdt9AOByT/WneNrV7rRpZI7/yhbL5klvn5ZVzxnHPUcds1z3iO8tND0WPQNHn V2fJu5EOWPTgkevp2AxUXjHy31xTI2VisoxjPuTj9c169RQoJYi1kuiWrtbu9L3010VmcVNSqy9k t33/AOB2LGgaHp19HBc/8JE8NzcR7TBC6xSD1XGckZHpUniHT/DGiQSQSvdT3zIWjUysSGIOGPQD n8aj8GX2gq1pBJZF9UeRlEoUt7hsk8cenpWp4w1S9jE2m2mjPP50WGuPLLDBGOMDrXUnNV4wjdR7 aRVvK26/FmLScW3v9/8ATMzw14idblILl9xKqCzHvjB5re162QbL0LnjDV5vHBc2N1H9pgmgLcr5 iFcj1Ga9L0a5j1XSTbSNvYDHNfA1KU6dSVGas3qtLfcfSS5FGNam7rZnJXkkkiENtVD0zUNremBf IwCx+6SOKs6lZublrfZyh5J7VFfWirBGI/8AXKcgD2pUZvc2mrmJrDStegzHLbBj6ZNFGsTGe6jL JtZYwrD3yaK/Vsr/ANyp+h8ZjP8AeJ+oSXUtpbxMFJUoOfwqrLdtNiSVBtXpXS21hFPp8AfkNEvH 4VUl8K20gIE8ignoD0r56dWCm79zthHRHB6mZJJiyZeEngHtVixsYYZVkkABxn6V1g8FW2QftEnH SpD4QjKECds+pFJV4RkpGzV1YjvfHUFro50jRLX7NEykSyM255Mjkk9Of/1YrirbV7izv1uYGKuj 7sg45znNdZL4BZydl4VHutV2+HtwoOy7U/VP/r1E8W27x06/8PfcunSppWeotl4m/tbX2utXtBdr MAHUEqcDj5SMYIwP8mvUNA0/Q4tOurnSZmmS5jxJvkyVAB4I6jrXnOmeDp7G5WSSRXA6YGK15tLl VjNbl4ZcEF422kgjBH41X1v2sOSpJr029Lf5GU6MYyvBf16nIxW88F6LiIH5iGBHrXq+mtD4g8Ot DJgl0wfUGuStLFIQu9eR0rW8O3f9n6w9tkCOf51+vevm8e41asp20bf4nqU0/ZRit0kchc2lzpt+ dgKSQMVJ9h0NdOutaRp+mf2dBNLcvfDOoXkYIYZH8ORzjPT0z61oeMLdrC5i1WFFYMQHBHBriYEE mpI7FUSRixC9hms8FmUcFCUJQu773tp93zXnvexvWwksby1FKyt26ne6XpuneFNMuNce9S+Jj2wu ihQR2Ucnknr/APrrh43fVrozIxa7kkd5s8DJOeKl1KCKLdbwSOyA7wu47QfXHrWVYfaIbppYsgjq BV5hmkMVR5aN9dXdJeisvx7srBZfKlPnqb9P8zpVjYQpJdEBQuAM55rlrx3t9TDJwc8VqB7q5Xy2 5TdkmqtzbGa63oM7OlfPUfcb5j2tkXYdckGV243Jg103hAX83h3Vxp7bbx3XyzkDBx6n2zXLJPBH EM2uZV4z61paUt8Ibhk1J7HzsMY4zgvjpgjp3r18oxVDC1Jupoml0vqmnsjzMzoTrU1yLZ+nRo6X wv4Y1iz1X+0tWvCzhSNnmlyxI/iPp+dc74o1S71LxLPAA37h2t4Uz90dC31NSXehXMtqs0d/cO2C WDuTz+NUbZV0+zmaSPdcswUOW5U+tehj86o1qUo0m3KWm1rLr1b129PuODB4CdOopztZa/P7l6me nh3UIJJDEpWSPllJFbg1FLjSl0tyUlkAEjHnaPb1rV0i1M0qGUk+Z1ZjWbremG2u5Ht3AaEbuDyR 3r5p1KlOpGd9Vs/M9ZyhWvCYrahqmuwx2tzOotIcKUhUoJMd2/w6e1Ot7NtNs4/M8Nx3FwCQ1zcy lo254wn0qTw9LBB9oimcZK70OetS3+s+fprW7Od6n5TX0H9u4qnFtWadvJL7rb31+XY8l5dSnNR2 t/XU14T4leFUin0yyi25X7LATj8GpjQ+JYV3pr29scq9smKqaBdvcW6yvdLGBzljj61rzatYIfvP cHuFGBWSzqvJX91f9uxf5psiWBjCXLZv5swr+417WYRp13BayKJFYSxowdSD1HbNX4fDE7sZZmSF f9qnXviK4tYwYrZbdD0JGSaxLzWrq5iMk07kHoueD+FZYnGyxUVGUb27Ky/r7jajh5Um3HS/zZZu ribw1eTf2TeQSi8ULIHBPlOP4hjjpUum2eq2thPe6JciaW4jP2mOfli/PzqfXk8H9aw0fznBGCc5 rq9HuFtbhCuBFOOf9lq2w2c4iMo02ly7Wtvba/oTXy+nyuSbvv8A52KXhS0sv7RtpU1jcbVXVbKe IRyIW6jrz9aLXTI7+01iMHy5otTlME3dGUgg/wCfWug1LRrDUHxdWsUu8fK5GGH4jmo49Os9LszH AoihXnaD3/rXqYnNlOF4Jqd12srNvfS979uurPNpYazs9vn/AF+Jmxx395qC6hq5hV4YfKhjiORk /ef8az761hvcxvErgHILdR9KlmvSXPPyE4FVZWYfMrGvn8XiatearJ8sltbS3oe1h8PClFweqfcx b7T47WDaWVVZgCQM7Rnk1sa5qejjxVJdvbx6pbm1UIsb/KHzxyPYfrVG61J4TtaDeTxkjg1WTTTJ Mr3C+Ujc7VAGK6sBnU8LRlCUXKbbd773te/Xp3FicujXqKV7RS2t2vt069jVXxvcwDZp2lWFkh6D aSf0xSJ4s8SSyARXMJz28kYq4vh62ubItCrFl6VRSwlspAykPzxmsKmfYm90or5J/ndjp5fhXpdv 52/Kxdv01fxKLWO+treEQbm82Jsl8gDAHUe9WNFt7nSrsMTuTO1gDVvw87SOZWzwfmFWPEUv2OVJ ohtYjn3rLFYitiFGvOy5bKy+bM6UI0pOhHVPuV/E0DQPHqEK5DYDAVkW8RZvPkHzN09q6S0nh1rS XiHPHA9KwlLAFGHzxnawoi05cy2eppSvyuEt0cv4jjVNSUqPvRhv1NFO8TEHUYyP+eI/maK/WMp/ 3Gl6HyON/wB4n6mPRRRXpHIFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf/9liAAfw1qsAAAYG hCt0uq53qwlDKtQAqMICwf8AsqsAAAEAAAAAAAAAAAAAAABuHvCqqwAAhCt0uq53qwlDKtQAqMIC wf+JUE5HDQoaCgAAAA1JSERSAAABVAAAAHEIAgAAAAXmzNMAAAADc0JJVAUGBTMLjYAAAAABc1JH QgCuzhzpAAAACXBIWXMAAA7EAAAOxAGVKw4bAACrL0lEQVR4Xu39D5Acx3knChbAGrAa7KG6yRlr SsKIbIqg2DCH4owIyBgdqYdRUHocBKkjcLSfhNNT2PDK9xbafyJW4bMQCp8O8tvzI/XWWmE3ZBt2 rBSgwmYAukc+gvHE8OAtsR5YgjzN1XDZtAZWjz1jdh/Qi64D2pjSsDh7vy9/WV9nV/cMINnejbjn jEEhOysrKyszv/9ffrlp/B/8Z+/v09+PwN+PwP/xRmATgH9y5Jh+eCsuFoMWfsaJF/g/2Xjw2dgL Ai+Wx5OSF9S0KZQgoU22rNfeQnmEjfRcbWu25SBOYmnKC7wklnbSN7KaJL/TTvoxgTSPR+QqD7E8 GIjjt2wet4IBDz+1MEyiVs7edaq5T9k2+aC2kL7FvlxH1X5+2nP0k5/APssVP1nIn24J65hbHGrW 4Yiln5n+TKs5n6xfrSMgGTPa5v90cDj+/Cn5OOSEerHMbDrFdT5i6tkpY2udbutHOR9SkAHn+/gW Z9Jzpt5K7OWCeMUL8NPkvRVT3ntXKpvynkfcx7ubYoPm6qQgiWMOppmOzhrI9EG7YZ7Vp2w33Ba7 87ZZnVPb7fS77GemH9v7RfJe023NpD9lGFnfpOzcdUEToCOeax7aLPUSqUpo6UB+UmKJ3E0z/Mmm cQW0mx8lvi/nC9boLGKzPrhEdNHjEYArH3QhodMyX0dIcK4rscy5fcS0nCZZOmhTUFVQ62pZYYMT aZdjCmPyvKIAC7FmHQvkcwA598jU/QB5gj0QgTw5ECPDElOHSeqYn8jYEu2o3DaoqoP+zKKXnhss JslAdQtA5MK8NkFcwFvmKh/lQj7aQRm/FyPPkSGCsMjOfprzk+BNyNe75pdpp2VGXvKEfDzpS4YD jmVkBrbzRl1LtieKy9LW+aURxhNDMWCxMxcrRl5WMFIKBgr5AF0D9rFkUlzgVM4+gpZRDSgGV8HI ice8vBF9NlcL+QQYcyXkA4Y53Qb7S4GtzD6wh6aaVrYl6S1nfXZVRvv6CnmdXWnSpnnEIDiiuQ66 iTvoL22MaFFaMPUtqBP3OQRA1q4sAxcXyEPBoHymAD8JSGA+28KzdMPOtGQz5DpF1ULn0eOUvEur 3VRdSHHaFIcDCAIZXNHmSmJwh0msyWWBciKIznuxJASz2PUpnypdMmQfE2lGzUVe8kVR3bIDBi8o QulGAQRaGSIuXwP2Fs5lIZq5NxnJkxGo+wV5RjKEc+TlKfO4/rQlKYzZKWEnbX+ISbEaHNzK0Sga dCC5FAUIIKVQRKAitZS3mnxKt6VNGcCUlhKzs9k0k3ZGyDUxiEUM6XDIajGDLH0rBivsp9RM+68N GuTSQTTshsU4Zpp0FkxvpedK6mXVvWVwh4EBZIARBD5B7QGuXNYWGDoAAEiw3cZTpjJhWKCdnwnQ NXlcBcXgip68FTMvb8Sc4qdAmpkvOwj2cVMIKDIAKfAvGWmBM0KQM9jEgm6KDsKrEf/GW9Huq9Fk q4FMqSY/UWiA2cy+NyH/oXF8JlamRWrSJZYL6jGfJp+PAU85FAGudFgEoxlEI6OBdsx8yYcQH5lZ sOMsE8eJlf/4kUQcwvZPDB1TMDNQRKAybaRgb1l6knFF/AZZEAUY3EE4tCnL26cPaoWVKMoVCp0H DNgDyAvtepQPO+2YB9PW5C0qXxiCyQ7bj1KxBfyIPGUEAa5dCw+OOKOrULusw8QRdPtmBzUlBU6F dGS7BCWOeApFlIMM2U/pcH/ZJ8vzW4Rov04f72rKEW0yyEXnsUusYNfTmc18e9crHFSuC0PHhJNu PjLlz1OMk358Krg5326WoHA3Vl7rHmIZHMDtW0KlAau9V05iJynrnnIKhOSOBAQoAmrmtTcBp1uQ M8jCAqfhC1BOicCAomAxZmw74PtsT0YSr5S0ikkt8Eph3MATBQ+EqhZHGBzbv1pbmLnXhyaiQrkO eAmFFx4pFKNLLUUKFh3geZfb5/cq/K+YkSHxS2G+zzJ1vtROkCOXcWXPNg5a4O+zyg0RBiyRSitJ tzDQgx1AaQGxnNFCVIuDSeIIeVMK9oBqlhPIuQQJrnwR6+tdzdjupYIxGYQsl5FqKFjemyz5SlGb y1Y4eKGDJvstFo6bvJyAze9zMKsVm3v6lorEBJjuPmQhU+X/boWFBUsDOR1c5mATFrpTxhG2GDmj VnBVDG5/VGWTKlMslKpgkpIURZ1dGRU7zXrVPpOlB8l1S4gF5PPJ/RJKU4HWMgVELt0vtQScZLxb MUR8YaG9F/JdLJC+tKN9MHjHLtqUUKfAaakmhT4AfDGJy8mKA+18rsMve0nV88teVOGNyPC2M5dG agPF2rZx785SqrxIuQC+kZQ8zfNZu5xMeVZzQajW3uqq1RbIqnTVkUGbaxy8KfzAr4dbz2OCkzVZ KLxeXS1u8uKrl6PirVLCQqUqLBFI3jLob/byV+rtYDj2hQtBubeWoDzZLGPEdPXKYuKHA5tjloPg s1mkS6veoB/zip+4hQlFTT7ITAtigpFO0DJ7yD953eYg2JxkoB1d4ngho1d+Ap6WZ52n5FnTQlqY 6FOiy/A7X5F+jSgkTF4EHmFqE/uIvEKaSrrax9I0hXJN8+w5PodfgYxcAQObfflDYgbPoauGo8PX EAYksxnvkLfgws4jAcMmXhOdx8QRpWL0OpDvvGVldXDAa3de1w35eCkaQeMyVmg/5VZYYrprykxP WOLn/DjxbQ+TBJDp44uQScX4eE1qttfsV7jgKuOAigMQAmPvZnMF1jA/k5uDYC2WUUg/v/PgmnQg f5O0qVpG3pX5xTyvpq1hGDnITJoX3Ce38Ag7ho+VEmAE1Bnwkh97Ca43ySoKNsXDq/H21XhHHG1P rn48WtwRN8dXa8NJM/CqgQeVJ4hxFZ/sBXXPx9i2vWTQ24pW214+742MeVuSYMtw/Vord8sm76pX X2y0/9q/uvnt3DvyRHy+YD3JxJu84OaO/jLe5Ps/jn0zMhhnqWmGCwMujyQ+kAWG3s4MQJBTpLgg 5cTlSZEgDETIxHlL7QlL+V0aux437gyhZPmIUnXezdBq/Iy9lkiwJgGMmWcmU5mFest9MPPqzE+X MRGabxh+1Okqd6QVlyzLcGf0FN0KDmVMUulGGlYBJ/PqDkNLIVkFKFct3yPMZ0i6K+136c9T4aXD 21v+WViJzOs6r+7hpLowgrIGruxgoEgFOjOSLkPUzRx1M97kRc3660jU/AoSWLLlHVsGq5H4G8hv XY1lkaT94VxnIDxD7d272aXiGk16DSha27kFBr0IfRj0Aka5S64+TDwQecPPI6XkHaAOC4jtIqrX vLxRcrVNZjCsXg3itldrN2aXQQML9XYligqy5PJxzSu12q1w996p8RF5RIULk8/Qf+UFKIB0WAPt f4ZPyagkXS4grZll+4UmDxVcuT0zlBlw7bADPfK8+6CiAGZwi0Auk9qOZJjMYAGVoDDwLP/v4gLU 1PpQE/SiGBoprJzvCixd+oKOFONWdiUO2+1u+aLzLWri6ie9d8DP5ZxTcbdrJF0DnnujG4ZVnZFK Fz1WPYdoy9c72MHl1Nab0EwdjKrV4LJLPejA6WkK/y7kp7etwGx+KvEXVtwkV2i3ghjBnmOOBsF4 p5muyv2sv9qgxSn43T22LXwUxMkkljUTrIglRVSYELsFwgXRAM5TfQHroKPjcQSuvuCtEObRahbs 7ccYtCOdsF9XzZfqWCTDcaUeobjujcy8fLrejKK4EAPe0xQEpaAAlJ3z8oXyQ1MTpQDyfyOygnCq 6k8JuKr98bgaO9VG2C0gdC2z9X6YRgD8wvYXtlwAiyhfvlXYaWT4U6/aCPlweyuKNm0JmCczL1Yb vZsUkysNlqAC+HYMut9uJFsC0nzk/S1hvEUY/rYf4CeuuMWn0Nrg1kDhH4/zTxvk6ygRoH3KKf6W CP0n24+fshJMx9BPya9ZOYJSAyrjKXCs5JPJgfNzlA8XxjeVMoy8IO1bap+KGyImYElDJAE3TnkE /HwqWWBNCz+5WZh2MsbCTpPXNYx954rXg1s2og0b9DfjzyoLyP3KK0wjlFY64o+VZcC7WqadHLtW 6CwDPE0pIxU92ENUxjhwEIB0EvM5KhNRZjFMPkZSmCvTQOqbAC7dMPkiV4EThdxnKlv6PACNfWcE LBtvxBbpCQYBLDpgHlf0jex6yoGzqWTAT9bIt5pvN7yDqWR/CierychNMAzjIYHwzW3KUCLpiAiQ iAi5GWxz4q0OYu1BWR1vDmMo0daKO/x6eTXe366PJvH915bLq0vC2AdQGy8JYy+8PUxIg4a3Hzbv XzI/SfOLpy7n/l9n27/3xvzS5tIffLdWbfr+zblzr1aiK63EaAo0yU88eFvotaNmo97cPDj8jl2B X/d/bLQeGGZcjUHBNzKIZfIJ8FRVsI65QipJsMBESOzvmVPy48gMoE1m/sH2C/C/J/8KfmQkbUqM BCFFBMPXapDbWZNwaGHVIA4mlqAOgDles+J6CzzF1gAlUuNKBJgHFhA5/4rAMKoB1HHFH8r1irqE eQK5Cv9QN7S33tNeM/yhSeySVQSsic6CJZBKNm3lSu08bhGWwQX6iNtOFwrojFn6gVQ3pEoHCt6q GeGaVk0E1iiwg5WNU+ABdAOqzVUEa4rXgiBukVVul7WFNzwry52FVsjH6t9sqhkUY6+ievCBLwhy BmvIomffBEwI86l+gYoDGSJ2nt22+ELK+ZTVkhh1BqfXqDmAYQ3xB9AC7CF/mu5JV42qxYrQ7OSq efBmXzJUc7g9MQCJN7VWkxxkWjRjUAnlf6o8MCaKOq1gL3KuoBEOoEUiiknXoAuAc4KBc8w7WvYS WTy8ohA4BdjfyxlEX7x/89L4WjKVLFGYH/WXhmMI81g2oNWAUvKogVcYjbZsD9ba4FylRATnorki FatbSv+P5eFXvl9rby0lq8XFHzzfXh0cKxWLxXwQB7vufM/2nwnxN3RraWBLO07CQhBBYAhvbbev xVGz3d7cDvKjg7fIWpUxNFAtZMygANECIBk7n9UOkLE3iICQD/eBQr4Yr8bEArwS7An5kv9ro9Qw WKMj83NdW8YvFfmofu/lsVFOvQBvZXQEGXYdd+N8Qai9ycg4mTweJyevCSIAa8qEOfJ/Js/6CvbS w0hkB9vbHvOhttb1svRH1qDQt1JPYRfD7Kjfrfog9YNITQPdn9nlSmhuWTEMEy8QZdY3U8ckjlvq zuhqv12vSnmgwxubX2lJ51aq4Oj0SXUTqTSuSj7Hjmvtc12ahbQJ0bOo6kTZAfmubl80twR55fOV 52eDapVIH9f+dIn61KowqcRuftllaRYnBUnVH7mCJ0hIMV/cHafyvJUc2WLNHchobDLYVpLRXK4V 5mcNUig5EyVC6zNv5I6cA5Jemdi5Y6Vaj9qtgztz5Xt3l9u1qK3KAg9AYPsM5wyxB9a9t0r1Znwa KGVbqTA+URwa6TgRycdYi6OV83XaXLZfJ8Kok4JCiLcjI7gA3i7+ZOjP1hJ5neuJaNl+1faTfwaD RA6ZdGBwiyWPfIVL9i29NZp8QCBU+iD7oOHIg6VHITwAICCGnnw+MqTtzJO8Iw80zIwSf/AC5P+R LOOQcgfK/CsXwJeC6WAHhONIAUdlk8G8ddgTrA/+P2V6VWTAi5i3BD9dQMoKqVAgw0faCLpnSBZJ U4fWGVJJOq+QD88fcq3MJMLWmvy10SDXlFspG244ajwulg8SfEfoTfxVKDKtbw/ActBvo4JcRQTA I0p+pQPmp7Ymt8hvo9tCKskImCt5B8N8pCyMkUpoOOhYLshBmNGj7KNX2h1Y3rFcGHpu3wJmHskA s6W95PPFliz0WYjzlkCuzIPipYpA/BwwlaVxsA83iZgAQ4Bh/GOpjI8z7K59EOo2kP3N9kqpkEwl qT0EzOEt5YfXFqf9gelrl4avNUeTJRln4WkA8yDm4O0xOKMyD5AHRrcHOz5cv1asvjYfXquLlqpD +Q1rkC9V2qWj311aXq5O3Xv/R8u5z77XP7Cz+PjQpe3tWtGLwi1JcctScW2wuNkLt/rhloUwH4Zr ldzmXMEb2PSf4SYVFPPDcTTfjLziux/2csAEAqjCxoMPMskSfCX+LvPP1WaIPx4h8YfElMRtlIz6 NUA+WQCVCyAp1K7ssqY+5ZMJ6rrEYRYSzh+6HzP3Ch4unFg+37D6ViYPAk6AMu2qxicZJ8AT6pgh PCNPyBem4EoEHCGz6MuViAAQTmlCEYrqCMA1KAALZ2HEEPQHdkSyf+T3OJT2p8mQOIicYvrMEpoe mVQdgMGxmnZI44afNwwarVyoJsCTSsUW2v2bEnUBprto8mOfjoD+zZFpXH6iWrJmyb6xNigkCwBb m6IXkfdOHZkAcmqWEwuj4iCipJQ/F6gWKUBgWzhzy0tT70DGngIFtZhGHHDz5P+tjGBg3o5JWuiO qh0yMvO8Uob3g9Y1uySo0icilutmWImlsoCxKREwJm5KTLVVgzJuMU+hnHjBVJAHzYsg3mMSMYO6 NnSBoQS34I+HK6T6jwZXP3ptaTJph+2qn0QQOju42i96UMvZsTdsf2HYe/cOEPyBxhwE9MLVmreK T6x5kCog8Av9z3lrS5XlYn1w8F/87Oiny/lprx3ml4aBI65geFEHMgLqh2L23wxNQdUD0o4bURLU LjWDm4t+Uhu4SZRd27fm47VB/y3MaZQkO5JbrAxlhzR1BKREINaBTVhCukiF+ccPgj1LAfn42TQM XYfzp/Zks78UGZkflF9hnvZhFVypDEPPhNRsEd0YwZ66QJSIzsyAmYsOFLRIbLHscKXE5ZJ0/Ulq oPCfwQIu4nDZBxUl8CDoP8CVMK9iiNssGydbQSRCPMV3AYMI24KZVDTRGVWbI+TLaBgNXyqBy1wQ 0gBgwQBgmPowGWJCPmHbuACniisI9uaWwDyo2Y9tOR4nIDk6AvlpXAkEqRMpbDIzIoCrOjnrQWAF eGoECMlmpqlfEMGBCMKCo1EfkuDzo6w6jbK60ckR6dsrfT1SStBN5LvHywF7oe23CADL2BpeAyWi YyflN6TbiuUp5aepD/CsjIA8i1VE1IwGDcqQCsQU+FiwqL6FfFEng3quxY0rXrDF2o+m1uID8dL0 alRaTUJvAYTQ9BigDlKP18Fo1xRSTxk+leTjO0rx0HByse7lc8Gtw/4ygNlAsiwetBCJ5s8rbt8S 7b8r2T4UF1dROO9dQY+MzV8SgN9U2wKYX5aCLT7+AJZhCKDYntuC+YxzN/u5/wx39zh5K2r/RSQo YPUu73ZZclQniebPbHsRfxqDCEQ7aBABFQFosC3KEcyxWSoGF1D4BzoY3ZII/G8dVqVAB/jJx2K6 LZNv0CqRPRXpA1DRpTphFKpyOKMm7CiWZAQtYlaSy8mz5STFSvwx2asyaUiKBWTdG4JPcCUjwBJe AcBshPQfjA9gm2YCpQAuWtH61jBhbAp4XJ4yS8f20HRT9YvmV4fiWVbfUH6SUxLndAuguLIZSi4g zcKUsIvdOLlZqH2nwiaSfdnwkPzYEnmS+vRK+4XhNYyyLQvzjpOf5drIBdD7KAVp0vxUKhF0IE2t jsLqIeNsFQ2W+VcGhxl1SbLiARX1xALUh5lp7bAAqrEnbac+P0nI3gu5puiBFW/oNll3S/mJI0Dz DfNPFsBKBIaWkE0QTT4G3mjvXf5R1m20DI0y6PzolvAev/HwavPxuPVwEhW9JIhroPbC3gMmRXUP 3h4gKmx2CvD2a6jAbw/vqFeX2nBCGxzIQ35uAkEMCz0XfeKg+TM6fzAITTAjNAqgKVOHfIFkML7I tD0MhfA7JW+tKSjAL/vxeW9zeXjLPEQAzEh4czv0k0FMMqjUWw3/YuLld/ibRQwHzMt8WbOf8YYS IUaUAuL8syKuSoWbxLsx2eTl1zqafyICUv5wLYpXBTsAVFK2/9Z50aZSbKPW17iL4SesPps4NGsJ ECpwlEp9KjdSaGS51S1zKag3Sype2kf0p6kmc2nQvPJpCtuq6iPzr6hBDYE0FlCVqHV4lzIeJDRa BMk+ELwJ1ap6YDUVN7pQkqMO6AhEhnJSrU2wpKLO8O0Q5oWkq5DvEHzhDtqb8wLnhgUwKgDh9k0+ Af2nLp2oxrnqcrT+SDJsxnnReg2mu3pd45/rpedS+7Tnhr8Q1BB1EARRBuV/xwkyVblb5t/aJsz8 duwIqr2jnM8rUQC5AAPtlktHZZo5VbFPCx+tfbzFDJUI3dIBK7hoWrE2luv20Qlv06X4crRja/zR 1YVd3qZdqy0L9vDXFCKP0YXRDgTZuOJ5ULq3hZgjDzWLpfkGXN856m2Ow8XqwDuHgy2J/2cL1qoH qBaNylIK5OAoc4bOE9rBCxiNIK7ADvIT6AYZvAuFJg/nP6AAiAC3DfneYry6M3/rQtFrbtqMngoK KG5KiistoID46jKsJFeDd2HohKXEQAqzRvZNBDvufQL8oxCelOJJhS98KxHXQNLaVH1AEQBcQP7W YXAJKfAH5yjIKcTCoO1afWj4ldWfWo+JDgy0G5Mp4dnwDvIg5UltUH1mFE3QfdXMawfNG9LhMt69 eX4M6TYpP39qTWoWVbPAPCu7LIClFUatALxAcyP+kJTX4LvYcpdR0NirqOJOk6X8roSfkndqpIUd AJwbgOeVrD5lBPr5dvQRbtNuXqeTAog8Q4i1nsVWKhFCoex9Su2JLOQRU0LzocsadFCJ0dgrtcek cHkQy1t9IeGTEOta6SmTE4zxlOutLBYmqkfMqtUKrMZHeAtJTdak/ODwOT4Gpyjnz0XIOapF3vBW f/L9xZLv3dNsPhxfvX8N22+q4PB9gL1gJMDnoLjeWIJPsAcxByT3EH8IxYPb8/+p5gE1D+Z82Cnj qiXgpOeCL8yVln/5aTAC+XySeoF5Q/mJAniLiMAKAiEQgQ+yDl5g61iwWgX8F4MR/IQgEG5qAwV4 UANebV7aMrAJzIJjyRcbq0yHGbNN1is5fsv34JIMCAc7icpgEAZ8Uf5BlDNXagS7ZH6rvDWyH1e2 uoWZfIcp6KAJMytykwpC6orRG3pcGNi2TIH5qWvLmrgNeemgeSKCrpVuNepm7ByWcj3IMOUuFlBl Aem8Ky8wn1Eu0vqgrEHmParfTgm+3TiQVlOXGxJ2S95T+d+CN4Gcuj2Hzm/4Sf1ukvJzLjhlvPKP hamMIIKs1eEZbqWjGnQdB1J1gOr8Ox4EnF+CPeeIKBtJPXMI8LINLgVjWt3lc9NMigsoq9vP0ru6 rEkYusutSh/cvugFhN6IpiC2anzY6pO1XH5L7i6vOfGflu6/Vi1HgEUj2CuCFfjESLgEH7gAENvR 7EqX8vgo07Vwh5f3/U1grAfj2wP/L8QXxsKwkfMtYy/035B0ygIk+6IUMIyAy/wTWdiaTl6aNRKB IAUoINv+1mJxrVrcUipuaRZuslxArtVM2vlgSxQH2K8t3hUdXEkWSebFXG8yWmRsfPixnx8wPleG z5f3GPinHcHK/KVbz1sDdbqeLKY3qt00L7rlzjpMF4HV/SqXaNTgXCWwo15qvz1AdGVYRAqrAIyU 4IhBy78lgCJLVOVmhVl8QdWlEVPJILh3XUFjPbhxuQbSeZYoYXe1jxQTXIY/I/DLGk613FYBY3j+ 1O8t0wtl2vtz7zdC5Nf7LvmEVOJQgNfu8Sni7vRuUriyxC1YxBEqMljKjz7SrbDHaxDlnVdkULOR 1Tu8PWbcUcJLJ6iQS+1wKLDUO9Xtu3eZtyVYZkbGbCdtW5gK+dZvhxYBIydSswOF1D1e81euLU1d WQzjJH+l5lP2JrWPDWUGVK+NmuEhq09tHBgBQ/M1EfLFwndX0k7iq3486OeB15oYUAA2EoNQpIy9 cPJGn48M5X+bSbEApQOrGkSvqP+joGEqC5tghA78UR1gNAL+lkaQNItbosEtOUEB8ApstdtvRrB8 XLpt0GJPMfh1Y1hjAsSGqPZNwnkBBUALAHUgUYCrBbRs/2j+PB1dLQ1Pdz51owDr/tU1UvrDWLzJ 9mMv4HAxmB4PJ6enSrd6tYttMoodp7dUCyWTw42fAxQMOju0ZF0afy/J3CJSMRXUnSvZnVTz7Jqd 3TzrWLWCUSYrF0C+gCUy3ak6QDULG7AbBBUZH8MSKzroPzg3UEpYvW5SsFclcN9HaN20PBo+bQuW eBfy4k8Hs1tGTx/RZjNLovO6VMhXo53V6lOrR9OdscPZn6lAJ0jBVJBhT++KwJWIs61yf3QJVzHQ iv0pAqJuGAhi2At3rjV2efXJZFMpaftYD2KrS7spmUGvUI+2wEWnGKwC2AjqCvCpzE/JX9aBEfsL 8PrOF+q14Ha43/v+f1ryrlHKNppCC/lEBCwxGXIENuPQf24EoiBghQKyBkiRWaJpf5ABooEvnLBU ZdlUKnYBiwJKA833bIrjq3H7qr9ybXlw60QC52WZy3RnhNW2YD+i3SUp8v9Nov+DkkO0gNAoA9aM R4Cl/MOBmPqU+OsEi9ov9WbXhWLvpnx4x/J/uTm8eqn0zsEDj48//KFdu3ZPhkPD28tlL3m7/toc NJLEDtYEZV1Wza9cgE2L8gkGtlUcFc4m3RyaAXvqpcRAlRq0tPNWEibDQtRA5dMaHC2sOlMB3lUa uZwCv3HlclNdhjIw1gskBCcS1RsHYzarArw+u15GX5HpT+an+10b1+Rd4Ov1vpTf1ZU49albrurw xJRrjHBEteKBo8p5qutT+5zsq0m9eqxPB2AUbvbCg4ghWTWy5OdpvafMjzV5aS0Su/2VxtSWeMJf +Pg1Y72DbA/lpRBV7axI+FW/PhhPvrJlOGnDnRaQDOhihdBK+xl0QIXf7WH93l94o1Raxr6epboY 7VPjn3lWiT9scwBpIgWj4ctw/lQECIRTLiC1V2ingjCFfNJ/EH9KAbALAv5pF8Bfsh1GAYxGadN8 cSXJXY6jm0URiC0MVneGZil8UYFCRsxgAcZHkY3VZlOweJq4Tj7K08r4Gm5fKhm1n+US00LrOYc9 4fTw3xyDvQ/eMfjh8dLU41NTH54s3V0uFjrxuUbfOVC9mCwtAlHJu6GEBE8iAC9ChFB+YDIrslKL Trc2lMfwSJT5thyBKrdT93UxthtlMtlXGdIU9sis8pbLd5C/Vb1GXxjWtbMBPKibQAa0KKRoNwjD fdEByhH+pO0LN+52O0PbXQbeZfL53s5mKt1VlWbcu5lO9v7c4EszlQUsqXgzwN+xwJlC4arUS4+e Ha7p3tTnjjqpbIzz5NtVFiOc011HPL7WwHSTBZASXCOvHgbeXV70Kz60dsnEtXbgpUy+dMuq9Kp+ u7nZa24dPu3fNbh6qXn5jeIWBIfCZh6H5hOeVcPvqPpr7eHaj6OkGQ3++cLYKmx+VASQyGuKUsmf KCCV5zNaPWk2Jfiq8Cecd/h/qhudK34C/skIGBQAKQAoABaB4a1JsGkA5oCFP28O/jiKf2YYiyR1 0kvVJVSmAkfTngJqD7IPzR+orBgNxBQNtj8bxkv1fO6su/o/LZdgHoWwNOiN3xdOjo8HIzaMZ+/a ajSip3/nRL0e5YZGUj1PGilJfcK7Iz3JpHRvjEWJdsMKqB0cbybRCeCzXp7NUp+sjWiJ2/PeoAbX BaENKmzQ4V6GS9vpO+yZt/QJvtC9u0G3UVCc2fgbVQ+Cam4++6SaZlM7jhpT7W5Z866+rWlNtqmU v3f0Mre4+xsueuNeawpOciYB8vsNe33Gn4JDH5z3cJ30aq22WOGsnG+1cetPV96rNeJSHkuVqgG+ oiQoAHvPSeHlqkl/unfTp7q0A26habNzl62xpCfRQVBTO4aDYDUqz9W9WqFUf2h/brDseXN2ZzSq uepAqmbTQuOQJiUd336X8ve+updCFnLe1PsHH398eurD92//2Z1+3sWI2Qby+WD7HcPVHy21LjZz W436FZocw+rTC63DtBuqrupowVqpHlvhx5akgWU69dPNvGiWqji2YxXjN4uFU3VaClcdq2R3r2+c GHaeg9cqfNcgXGT45B5lIWWoTh966tvJWqfc7Wmmn4oLlClQsyhLXGZBAyjSaRpOE+ofpZJRr+KT xN8qR+mH7/plmQ1zVKyoVsXNq82FBJ/mVapjlQuwH3hFdogk7Ya3GXrv9j2B9/jq0i/EwuSjQjfB 1yGBYm8wQsycpLg9rk1sbYy2B/Nb5ourcJExfruyOFTO7wNlUrTqFW8Dp40M4vCAAhe9VbO8hfib DFY72IEugR+ligKoCEByYVuhWgsjK/+TU6DmjyqA3qQOQtwlYRwER7c2BtYa7ctB8qNq67ZkMMgn N+/y1owqASZYLh61mxh0QA9OceMGo8ItvXDvXWcY+heXS+GnH71/157Hwd77W/KNOIZOhNf12kHN 5KaBC0uXBHRv6URrMhJ5urEktUjrPhOX0bV5mhVMWBi4NJGr79BwstkG7K3L6kAAHwkjyHTMXS4H QdcmlXQ6eTUuMpOxNZqfXeYJ48fiqtmuO6S66UBrridNZJpye5u5pbigF3mpTwQfcSvQUULRRK8q RN+ixFx1pSqfq4+WWlg77EAaoAntuNYW/FQUoE4W+i64YEjQh3zp/i1L0/EluOvcb5j2LNjn69iZ b54yprvVerCaK6014S6DvO8teVfAY2Nzm7s4lfnvN0tC4VODHwAef8L2Ozy/YoGOFGBC91htAtqM uhkE/FQI7+YO5Cm3BDWdJHe7S+gjCBRgFAHhzcl7bmnULxeS5UaSyye3x1DvCYevu/dVF0inLOOA I7Rns19vT9yAirl7fGT/LL7s3vG43QDA4zpiPG143SBN/5/G9+0MxRtPPJNt1HHLhJAP1+C/qU3R cu/AWGbieGWS6MsMKWG4GrcCyg1yM/1BhGMasVjYFY7WNtXhrhkBGtggJzjStmneYn+SgzLjqM1K SRrcEoXylDJaaW85aJmkfLjezcQy1vruh7uN2NeZIreOzafj1vtqW9LTTzpEbZBcCEe1jGhgf6bN KhZATfuxcNN01oky9rzrXvkTcaX2erV9STyZIDZbC2Df4fMB80i4tg1zzp+Ef7nyj0PDDONtQc/n GvbTIFy93wyA1wRcwPhc4vNrrvJq/WnuCj7hXaa+soDTJmt2YaE0ChjfxQhXzGQSzAFmd7yXD0by 3uRQpdieqc2fC65KBF0TBNEE+YCPgq5YVHbyhJ0bBX5doHCkrS3Vq29Ug/xIIY1PAhTA7gEdZDvq /J56ZHJirNBqNrAzQcCIUdNTyHEhU8Fennb8C9hpAUVuaXRQBrUVHZ2F65Vgampc94wEznIBpLdS gGc453S8FJXI213Ip8JId8inEfg7Elf67YDqXgC+LsyzV/pRCuqudUDkJkU3BtrZW8mkQW+E3yPe ROeZJ8bk56Sfif+hS+tN2Z77gVQz7Qi4mhYI0iLwYxYSG4TPlpuX2j+2jtWZNiIQbhoh5EPVZ/qD PS/e7iQ+FEf74lYX2Ct0Ccwr8GDHnYTGMK0T/plSgLfl5m6gsKTW/rS6AiSJP1LndcwbILeB+vjT ADyhlD+Z6STmjcrAVRbYdgjwKZAz+B+vTL0/WSjXAquUhgPRUDRbtQsz+NlReIm23zYjiIDJ8AIk jQL8xPe6FpnJ/CRRQk0JuZF4taqjfkibxf8b03/giwNPHAiHDPw7Qf7RoKv36spzcfckPekJdzJE j/CvvIBsM6bDYsoFKBaQeiDyBub1mAcLb8QIDDhN1SPPhDA4hdAl3SZ/YZIyC0QQmS6zpttVDmlm tG1T/GTDifAp+zrzLRnCrniQlTub89glczaLpPTkAm2TDJHLOmU7aSBc8QuxhuIUqcw2naviha7+ 68ojxjFcG/Ws7ufIojSoZMKrAewPxPUstce9dkrw5QUK50rqe+HfnYcMnU9ZA60iAGl+ZMQCFykQ LyhSsDSfsO0wCIR/l02gstDyCwbg9S1oRKl9pxEFckUfRC6KYvjGAE4JpTw4o4pXqwTwTSCHi12k JiAiwV5KTIbroUP5rVsLIvMYsOei1Eg7DL+DZP3kTASeahMxSSIAc2SOr0HGHeMN8iMjhQOPT6JC XTQP9rAapW8diCXM8yyalBd1VznzcgCTSYovbCY9wEdWmOEvFOokQyyA2HIyRgaYAVQ8OobMSPpT 6vA8OXP2k/0uB4pUxCCQEItZKSDDVKdYIzM4OtpabifP9JM9t11NSzIYx54nBTYvjf9BqO4IPph1 I8jYK9+EEhWI+GAqW8kndIsMiv6IBOWrzV/mW2QEDI6zSARYlXUw4FK/i4mznybn3oBfKPI4NoD9 Pq/+VFvAXiqo6rvDTrsEX9ZR2ocM2Bu8YGNmujjCfcTpvgXdboKv9J/Qzp8uXlBEoJkOXiBHQAB2 7QWpjCAA34+lz4wpfw6GUhnXcNILkSeywNXy/wXMJsa32UKwUBk3gXzZ+QuAt2APO3/KGhtqkFJ+ fV2GFrkyGPCCyntidInqZPDB+YPnByIg578x288X7X5w/MAjZYQuRBMdxJ/5ZnMIVwcMzN3OKjfH P/AQCKZMzYxM7nIW/RmB9HgJCwAGI8h6Tc+EUImA8CMNKkOBqqnOgjBjGQ3nlIsOwVcbjKOq0E9g JiP+SJFqLsjCkK0gNiGbgy6Z2VVc6eYFiSjmQmWDJixmGbTg6g5/evyRKTPch9krZg6xQUpP17Tv Tf0y+NO9uhyWQQedcwRI9qU1jMNKHPp12PCm4gbAnma8LvEeEG5BzpHk5WEK8Crnp/Bvw2mTw1ek YOp3UioRdNCKQ9JVpuggBUgWKcFXpMDWiBFc+Eeh5QhYo1do72Eu3AkAkCPhav7keJ+hUvzQgfgR 8/fAFErkWyw/AgsoSJRFxLmIwYgZ/8tcuTCQN2eiAC/IWWPmdX1kftJ8FxHwJ/kCooDaVa+2XAPA wxMHfwXItIb4X1ftx2+cfmLf/ofKCJDSwUapcJsBYwtIztDIKuf6cw5gygCMNtIRAcyxZy7XTYqK dixgp7Dkki/LGJu3K6dAsO+QZUcw6dDbbnzEV1tMR6TgnFeljI90pmcclPGRPqTtuEuF5STXbEEa SfkOfVygl9+YBs8nO0N8kXIN5kvTgwDlBysoo05EY4i/1NT4H4pc9Cg+G4Ev9aogxnQYOvJKpsM4 xSmCVg/ivfx0tXqWsKc6PIHqbjFe6B3v6pVUjYnIQmHe5C20q4LQGUsBYFOZLAN/Wqg2uwP6kn1b M21H2qdqwEEWrKNXN+POJcEeKc3EEOaD0CuE3vYJD+f8FEA1CblAiMaDGD9NiaDBqFpvIcSgSekx h4aGGS7ALHXckathnC3wZyR8VUQTEfAn+H/k8SeZZlSrm6nyY0A+Nf/4eSOUn32bfnRqcrwEbwr9 dvEU7FbIu+veHaJMXqtlYJ7VLPpQ4gliDjghLiDPn0rjFrQMQ2vBXkHI0D2LOxxuXF7givcSsqLz RdJ4inEInxkE1OFQUr1G3092EaLbjqI8fiZa07vMK2PFz2HwfIJu5/PTHgppVnUGAcgRVbpUCem4 dQsa6dfJU+K4abrdofbSmVQYQWs8EnZ3HB2KG1mtnk6wQLvq6tUfHrexXQfwSVxgtusxaWz8LsWz gVsL9spEKOVMibZtwrwOI+TiCBfsMzCsXVVQR4nU6et9ZLqhSSk8SvqBvUC+fFTda8x5Z056LxwL njsSVE5CsLeaReP5Yxx+RNUKUdpbjgGb8pCBdnuSr4C6zK0hbGbBG8JpgV+NTK7jB26T21eaT92s 2GZxTyIZirQPyMcVNF/Nfp3PWz8HlLHvyenxUlBvyHGaWIt6OKeyA3zaJYwZ2FBFPblTF7QyeMRC u0PttcRVK5hBEk7YPk56RcWYSfZWqi/AT/g7dZJBMZJSRsPKEamWjs0q0OpdfpfLmLiDkBkQ2xMV 4VJmoXew+S5NFvYUeTmHhVu2vFuSJ3FWZl7zdhxSJt+OieJZwZgGqxq0oqct284YhAIJH3z+vqS2 358TrV5ckw05vUmsdAr/KsabDFh6ecRspFfzodXkg+EXgI/AHsuJr4ZjF1Lpsvrpz165nWhCmXlZ 6j1cPZvSZ3t73mufs3UMciGoX+3WOLqFVxEpNBbtHa7MzJ/An1efFbBvVAT6Gg3QfBMLMK6142q7 w/DIWjKr1WJn6rNS/THVK0jravtdRVRGF0DrwOvQ+TnvA80nImC7G7AAeqt0Z2n/o5OBX8QxRi6E gwVQDtal6vJJKYXk2uosa/Iz/XhmC8apYq8j/aacqtsO4dyCekr2bbNkELjiUxGLLHGnG6llRR0t FfwyAO8Sbe3AemS/d2m5JX2f0grihZ2iCcmkpJh5DqOlyWk1eVaNGqnClSMjn5OOQ2dqWMcw/HzW /SIeyq4Je0PwOlrvId4HbdgHEDNXefUUHiwucKV0g1LI5/MuQZ2BNFS3B5jPl6KxA/H4fu+ByXjY 4R06rgGmO9Y1IO2ahXBAvuEOyCwgdXR47qibflIoyKbuPrvknTVRArCnSI/EPK78Y4l7BcBrAswb oqsJrjYg+/VUHsFBYIRWUnhX/yqzYNannogrHn535cXDT30/Xd+vjDcowB4eoOKJGcdvPAAgICdJ 6d2Do+8K4eSHx/0Yew/yzTWffn4bePu5t/B4bstA5bU5hB3Ce7Es4H6ELagakYqg626P4U95I1x3 0z2ebh3XebZD/40fsQQzoF8txF3jGoiknrZ8u3UHTqMPsIJ47JodO0xczVKT+w7TJJ1Xn0KNsUMt namvfVO35cyeWfYBSTMb7z5y1wHzGTdB7ud1U1/vY9fduNNP1/OaXMAtvtmRZVCACSgqLpbqhpzZ 89/9XvoC3rM5+vRqezLGmdZAsjUbb0NrYu+9TAqw/6isX8bekWA7kBGw4x3fgp8mqD5JMxCOhMo0 +3DDMB7/WHv7RPBzH022DvvvLi3l3pNbWwouM+Su2c8ntBogZ/x2mYEbL/4EjNsGznklzBuQwlNS IRXakUeyV9UBmKYkKa5JP4lbiXgFkCOjJbrLqLPdCM3UxKEYV/j28U8eNzBP3175lNhbRTTIILqW 1Fpe5XLynYuW7BfvKg3u2IVTRrNpwJPN1xpYCUNMD7+Mt4lreVaaz4wJWs5DMkT/h4O1+Q5y/mT7 NyD+fdmB6Ud2T+6cjBPRIBBICLFC/03q5Y1dbpZ5PpJpgVyrbUQZ+NTmz8oZsq8tuBkdR32FytJ6 jLTWsV4D/XYZsZ9sWbFSZpI25gLcydIHXffBvvuR+voX9qyOrD5Ch1Rq0i0EJP2qkRtTrqHL/8ph ynTWyCTiCoIfeqWpJNrXFqcdqUCpWHlVS8yN3E51PT3zhNqDwjs8f1ACbcedKN4RlcpxeTIem4we PRA/esgbnw62T4HVD4Ai6tUS9NDje1Nx2lHd2Y+nDo+EWjUL5peS9P5kv3fwlIHvx8kr8SeR7010 DbIOQk5Ga7rUPt3UBAJch969bcl+ZCqHxUk9ZbzrPSux61vJW+a4rtvm+YNEI+MEzvWkt0j84Ynt r8bvGQ7Gxsp4MFltg+YXthYA3ryCvPcS//XYgR3vDRca2PY7n9sqPCFhA9tdM2SfhNdFEKRX7qZj EswOMU/PorKR5wz1tht+nbFxieHGDvasqdyBtNYv9p7bVRkfPQrBybDcvdtnWTjzwrvKl2k/WeJO EJ3z+1ZgI7pdx923g/p6qKH2zWYQl8mEA5KHlbx303l3qwKUOHXYgNPTGXZsjsfW2vvjBYmW7y3I SZk25IYJswOsIRBufPskAzJuIu3Z+DbMoxBEHsF2B6OHpryxXXKa1buD5F33+++/v7794WLO8N+3 DXvffd5rL8UXQWDryRvnkwgktN3+2QnvHYN+ZLb0uvRf8oYmu5RceIGUpLNcK0hOibxOF3QK7eqa Nwz85tJw3HfJvpvPkHepGUlzGU9+vkEh3xB8FCjNX7gSzDbiWZj3OHJDhXDnPV4xlCMS0r0M2YhJ aVikKN7Vpe1Xe16G+Cs9Uf0f9f9zF+rYrouMuvrS4VfdfnV4kOk1BygjAOXfwceg+5M9Z/JI6vxj xVGETO6W8N2fSr1dyq8VLCHtNoy71N7tIfMZB/u+7u6KgPhIb4OZCkpF3Yy+uovGdnfIdbvKdNVV xGi31R3DLen9Rpa4u3S0vlBpMwuu3yfyUMfS1qO3dGTcDPIIpImdpmASJ/wYLrrTMOO1W+KuJ8oU IXEC+Zbgpwp8+QkITwV4q8Yz+mkZX1xL4OqjUhCNloLxKSncs98bn/SGsGmnAK1rvFD1zpyKq5V4 sR6/OhssV70LcrRW4exMHITx6ER8t7iWSSK1h2CPjFJ+a9hPybJlB/qOXI9foMFNQRRnFXhKyd1m NiDvvW/rkfBRBZCvNH9OgnrZzYAtjOmdO7whIcb0kmbcBAFVBFbRPN2xDfzaXX2Z3WDr7QBjOQ7A AskSET2ql0aDcJvwYJT2uclPiT/Kdbdfry7AZQSw7W9wuDhfu4SoMgj7gfZFU7Vl0KoAUnruxpzZ mETj1ZkKrv7iRnbssr4G9mPGlclV0ZBRQ5K5kEVrWBhXzu9lAVBtA6m+d8euS+fxbIYRyNx1K3Td MiHP8UV2TNII6FLnijB60ntTyDNOmHdDnul5SmiBh68xYdnt2hqFm5OHvQTxc3nc7bChQgL5Isab P2QQPF9OyCHlR5TrUcvn2+C2oL24hXoQ9UejUsm7a0f+ci2+a0JiSV6Y9cemvGsIEBXEraj4/VNJ tZq/WI3fhtdpkL/WbD/4cW+o6IX3tO8Ig/Ku4LYwubgQvG40Z6T2aN6K+gaYSeo7BF+Feftdff6j AM+01S/mu8Ueac2I7rgiUYaX3cGpGJ9pEXCuQU2lviPhy88OzSfkQ8kHDX/tigclP8YIkA/cGn7g 8cHRELI9A6LJxDFoGgKrkBFIAyuiEJTfAj/XKCaSgF1IajFCiHM6EScEAGnKkeSEXMOQ42fr2tvF WwfJ+VPhB1Cn2A/45+MK4Rvv+UVN0R2uvT3/Ri2+FuN1eAvhn+yoK5Kw5V4GmOUZdldLMgguM/j8 6bLBqM+fSiFRQQHV5dhR7qohtWVXHlE1Hsyw7MlPqsnDmJMt1293sZuLJjIooLfaBrg+c4soj4Xi 4pHG3kGJRkDGSg22hKNxbdIfmEia25Oru+J411obm2rDeAE2ApyTIcGzhbAT7A2FFx7eoAAcVAPq BbYfij2igDiMm+1kfDj54N7k7YH27l3ee3b41yL/L5a8yUn/naEPj9LLtSTBGQkGEWCZRU3vSjO+ o+w/digZ/6g/HPo4YCMc9ofL3q2ykv3Ldf/CvJB61diR/muy6CCt0Hd9uIUZDr+3vu7SAcBzc25f rp4PcmYJ86rY461UyAfNr8O3diUh5L+OfBIsU9UFPDqUH97zcQT8xrEc7sGHIurroYYmgBLDK9av 7cIJdcKJkU1VTjJOdz7RUIRy0cAlsmdArfEkd7AxUMNHJ38y/Mj3evuq819G7ef+nNpdmhqHzd8a h/gu1+iouqtewQQ1XSY5U4HDiMJeNt6tmdlmm9lkqvOrOkgOnatx1DoZWYBv4WBqnQ0yLjfBar3C hTbVWxmT1eu74b5ORzLzrP6kUtO9Ky4eOFLSzDvKuSEXarzpfLA/qU37HnT400lrot0QDh+me1el p5AvDxt5noxAEFQBgQa5iPZuZykuTURjRW+3MOr18nR8b7k+PBEUC/Aoj7ApBUtrSZxeCt+e8Zpz gHwcbuvtnOanyQG15g8AIypkv1AHTuHGE4IQAJ5/SDTpSaG50mjnmu6uS/57Gft2rfZGTU7vYdI9 uX1FAHc+pHKUKVDvPZQ3xLIBu3Jci6Hki2nbq6bvAeIsjk12bZfmWTVp0DTNQKYWEcAw/zeN7v6X CN3tstlA6uQCBLunhiL8fHtraIl/Umtj6nGK65ZgMGqGpdHhoWFQeOr8SfwpBfTV8LmFrKzfDN7h rveONptLSz+oDhSGBVBxroZxJ2V/9KQ9HtGjt7jQGY6GZIo1Sb21UNl4d5RdGUdJPc8a7uWiXf2i cvWANAyIxQhOZD68hcQf6UYEDbdXN84X9FUZuIxbxprItygr597lJ6ipz3beRC6xfeNJLcKolxA2 96PJpanVJfL2pc0+6DyPvrQn4QmFNyw9IFAMBOkZuAykJQEWcdxVc3gzrHrNePsO/4GPwE3dG3vY v2PM2z3tv91++0ojP7oLu/rjpcXkT79XuBz7C+eDH8z7l5ei0eHCXzTit+Pg0V/xvB9jp0gADR/s fH/d8L77ivCm4f3Q/w1iB0nllP/GfLAMrbYxs4Hnz+jzVKtH4i+rx2S0PAOUhuGPENj/9lFfxPLU OGe4+uIW83U4w0cjc25A8AnzIPt9IT99LyAfSXT7McJveeD2K1eC5ioMoSZQIhyAh/I79n5a4vbc BO5sOIcgqAhtbiDfhkuVg0HSY84MLwDKL2w/oveiacJ5L8/MDrhrlwsLKyN/pR5tLQ4XitvfO0rI l3LD/2tsH5TTESCT1rMIQJNQHByc/6v2pYuyViBPEg4J7TxpUw7YcyRSRQ2UVzNyLCorjlDs0Bew yd7zigpKOdE+xRy1PlCkR4m1HfiCCpkSnPqXCvwEHrFZbhXlxU+XXKad3aA0xNZcDaKCsfaW6gZ2 lZVdpYOW6F1ZBiYkuaoq5DHGLDLRkEtr7bCZTHjt6dWawDzONY6bEOnzfl0AHqAOIJcjrlPnAmHs zaHXUOCDK5RDr1Mln2RkuYhsP1pM9nw8blyCCQmRc6M4glLLu7Xk/admcnEe7HryxzMF8AlbPCH+ w8PJ2GRyz2RwaV7s++NT8a2j3uuvBMtLyeTHvFotf/aVJD/gNRa8H8zEf/xKoVHxwRxjFvrCswvw uk7XAXvsqEnG97ZHSvEd9wfvm8D6bLfaAeV5JLL3OLGP1w2SK+GT4XdZ/VTCRzEV+wD75jUPuv2F CIE3Rc7H+zBwhHyQ/dJHDkLaB+RD4C/ekkDbr5CPRgj2DPJLRQBO327GY50wXq5Q3QsbvSVUxUEd QIMfBX7E6FdtH7GAxvnKDEWGKXA1AuAjioMD9f+4ELWbQXAXwrZiTSgKUMgElOpRfKhAvoDwT3sk AZh5vJ1kn7wAS1iIqxX1DWYhW5sh1Fz6GiaYz7pATrBxS9QTCcqLnxryMz1hO67fDqk0UYB7RbX1 AN4l9VpHjZf8NLfDsNsF7er45oH74wjy/MRmkecB84M4QSapU6RPD7rF8Rjon7mSzpPs00tHIV/Y TueETG8wGp+Sk+hHS9EtuTpMVf/fZvz6K/5r55LFuUJlwf/L73l3FJPxh5ObvPYHPxZD4f/Oko+z j//Dd+T87Hff78Og+8PzwcUl6TbOar1W9S9U/ctVHKobiKRtNHz01dGkME8HnvXpfFSajEvbve2T 7duHkzyokcFr7bq/WPMuVvN/MWPleVeqp2KvNwiXvj0j4WcgP60Ggg8TNSAfCZAPbn+2GdSuyQIl vy8aftge795+D8yfEqJegmOuXMvJnn2ebs7EUOv6h5j4W8TJpwP8JI+oqWSWwOPy27oWFRfgqcF3 JHeN3S+q/rgJyKe2bz2D/3pqvwwugPIPp3ZUv1eJNyfFrQLV9CxQkBbdpCHpBFdVSrPDLrNAnbZL 8xXy+bFUcbsMRS+xRc3C6kIifmYG/Jzg/ErzMxmS0PXAPmNg7xUK3Aq6ZtyOuVDKt2Q8CAVXmTO2 erkDYgr1dwAHBwyFFiyFN02zwuhavGt1+aM44zkRmB8F6YiboPMYenuyPam9EHzQdpORUytok08d 9aCQVmUetAQyjOpUA8hre//Nx+rD2wfri94Pvzf42kz+zfngP1b89iX4rCTvHk0+8LD3vl3eLYOw 5w9DDfS/PZ+sLflj08lFcW6Ptw76b5zzowX/cuRfXMKfB8bbau8dqM7w9i4iWI+9N/x8XBwNhkZF O/GX80kjKiy8Erz+fPxW0d+K72374j4YyXi5vP1qVFv2NjV/HGzBcb09mgMl+xnFHhpJdXvIKquP ySLkQ8MHyMfL0BmAvYRRNX/jH/n44OioHNdngvYPYDz7HXmmq4jhPS3wB1vOK0mkIO0CD8EGgMeM OG7jcKVUa4V8vBaMFTcNvwuHPQvxjzcHRATw/KHO3wV4AjlLcPWbSzhNoW/wXwT8X277S28seN4m RHGF9YKgniHyYmQyYWdl6Iyczyu/ggI/euvSfIKQcjpkBFy1tguKHejFOkgdjftq4ygFsA5V+i4s 6dATql0Lovs63iX+UvjXjMVxnWm0OeXS3YxAeOrjlHGXxmOKmPAIzTfw0mmbt4vRqJns8NuPt1vl VUvnR5MlKu1lX7Aw88ZiR3OdKu0twUcD5oQsQZNNs5HMHIkn+MWAuvwZd1qrMIcuqd2+Njjw+vcK C7NBM+dFtXis3P7gXv+2Ue+9oO33gJ7Hl+riyXPbsH87gtEXPSCIH1X8pYVguea/tuRfAbOtoJ5a 8jIDlaHwrqzOmq5ljtR7SzGIlvxWM1iYbW8qFq7KdroonPLuLiVDo+ie31jqq8OPNoc5qDy34MiN lPyqbI8IHBlLHsHeOPAgkdVvwXVgReJNw4ePkE9uH4msPq4Y0/DBXffsfBjHYYhjH4P20odXwviJ CsCG8cVPNcciwicQMyk/fPux2uQMH8M8K4wRBeAqqtM8IvUKREH2VspJ1iC5WM29a/vY+8TaT7Cn kz/pP9mBzCwQBSQvfz3/+1/3K9+J73iPTHN3EuXfz5aiv6zVFus+jBKpqI8O8FBtCTFksJLw9uiJ IeBdZNw5yddVBCh2cI3YvUQ10x8Vngn5StgJRTSOUgWAW4RnlPeKS7QdZiyIio8I83rQsMx0qolQ HNfLFCj3rs5FzFihIHXRz3AirmAPyC/F9buCgcm4Td4+9AfC9rLy9vLJUd33mxKIlquU8jypPVaj aAHB5JvNdgLwSCTygDkFe7rHGQf41U4e5HqTyAp1fzWKP/bx5OG9XmlSNHa3ozWgD9BYX37+1QXv h+cRQ8pbfCX47itee9BY7OdxulaXog5voPROaFeQRpxcWt2ZmFdrvGuZQzn5dsrzcBn84C/77ymB 8wfNBwoI/jqOG/U81AqXrXdsZrUg1nhwq4m023mdyffq9nrAnqw+Tq+Eeq95TXz45kH5Dc2X9WAg X6YDgztSHP/w/tztBXHml0AdAtUC9gAQE8NXriwx8byEOzDHeOJxC/yF1ZcBPwR7XgnwYlswADZo KKfVgRkO2dW3rawODObaE+X3AFwzaj9APrWAJPUI+IMAHs2tg2IaePnZ5OS5GGbdm5PkYj153/2u XlDVgeG7h+f/ohldqRfzRSx6gDpUgIB8YT0MSbcB5x1tP29Rtlc/FlX+E52hS1QBZPQC10UBeLAv Mw/Id9WB6oykkpSaUfleBelejiNzV2Nd84vCa/VNgfg+9EoKvco81wbZ69SMTnJYsCt5xx3hrjvC sFTECQuDcIwphcnocLJ9ew7R4d5b8t4bJrf73ntHk3eEYBS8rYaMiDc+FqT5g9gPREAXXdHhEbBT Iu/G5ABYCsHnBhhjaScWAG9/DUdzDvof3OsNbZfY+H923tskCz6+1PbhsffGK0Fl1r+w5P/wFf8K I+objroLngnVKdgT2uldo1Ex3T0ztL1rnFxXUNdCfF44JTh9cxw0anJoN1poL4mer72OVs/V52k+ Y8MHzCP8Nq4wcKROuwA4AW/sdVxNllbFbxCQj0kn5CurT5qPmpOPHtg+PhFdk4jdAG85og8ZJEK4 nAov1YACcFwvDu0VXHCTxQgAfntiD2qohE+xGWDvKr21JFOTP8OwcOhT09iiSzjHVQ3+sORZz59G zUMogoVa/N8f9u6djP/N096dpeDR/V6jFr90PNg9HTy4j49nwgGdfvnc8edOAs0BZFXcyPTQ7Z76 5ChgU4fnPqJfx4x+lBm5rqFgSaaCFmYyvVY3izGdeplxdrdOubcyL9V2ehtcrzPrlaMF3MJ7Ecux NFQsD3nFUZm4kaECrrFfKloag1mEXG+ITOwV8jF2cNvdVu26KOQRLgIiwOJc3KzjTMtORI1MdB1A aWfzTArzgHwlzngBNuQ9uN97bTbeVg4emvaWKxK7plaDbR9/QbPm1dON/dJajzVetfRKvXlghoa+ 7TWz995yS9bLbzDWcqCQDGCflDHjEeCRHO8dM8gy1LTnAexpzK/FgRrz2TKVfEiTD5bL0weMicWG 6AL8I+CalJiIXWncLntWH2/JbnQTbGJu6aAFfndJZdYZleruGs18Huvvm55EZH75BsfaL64+jVq0 bRzwHD13xHu54ZVWYMuDYwZ4yAC+2XANqlfj5Vpw50TwyCczLSsiePZbp06+IO4cio+0k0pC2UmF nwxUb/BRGwNPBoOw8nWhVCuIjdowyRsA7U8Nz+6Dfa398mIn1jh+oVphOCwNFXKFsFwS6M5hOgyQ Q4N3g1HY3BETzS5AFJi9XpXVjKm8NCfwKdv/HKZXnyEu0Hj7ZAEA/E8e9torxhxY8BYq2J+HoFTB ywhfkaoGM9vvBXg0CE967sVPBO2dLnXHw3U/z6H/G68Te5coQK+9zxDyHcUeffUJ9lgq9dxI3ctF rZVanKsvAzY6Ej4bo7Rfurs0+eRBgjGBHKZQBXvJI2pTBv4x+4jqAY7RRKOYbRzqUP7MAnVpKW9l eAG3Pu7ufXT3vj076OSDWyT4BQQeevlE/MRBb/tU/NIz3n3Twc5J76UTwYVZxCSUtXh+Jto+FdyJ 1RB4D+3XKMAZ+o+fJ755evbMrFcoFp0g4grtLkC6/dRuQymAB/mT+oK+Jv0MYGfAMoNxdGY3ht71 GgEVVXdJd5FkwHi9ahuvRVVMMCNBO0FLC+GOIQyCgFPULkKJtuLXGxEmYk4C5741Z5eLaRoiYoGn sOFERn8FujaMfenO8eJQljXTntjd3O0VbLDxwA4gjDxAl1jA0vkU7G3ADDjbGdgG8GNDLhyEAO2A gRLOnzsQzs8EZ0/K3Q5hd4LndPBL9xk48sCNkX1pORMGO42ZfyMOeb0T0MYWwnKpXfFGRvo47bC+ A/YyCwbywefDdU+ocU6AouaX6vVaFBWqjWphqBA1o5VCGEctivoi848Udz92sDg6ok6fhGoK9kQH Nm4vY/gYdYCNp2piz8BA2wH+DSi/woNmXF6AX4THJ8bLBz41Tcd+wnB8oVr7vaOQDMvDoYQfRb8f ORRCkVuvQkOLJQURTqr90mHh7mq16LFDG1AebB88/tXjc4v1YBt8TKzvqkuBMyxAX+bfJeOuS0/v F/G7WO5iE63Jx3v5gvUQwd+Q8itGUFywLqln1zXAvgne0lqRlRPFdURgiJbjGrTWMvSymIK27K63 iQwq2dduPjbOF0cSkOjyjnyEMJKlEYlfVsxPjN/nTYyVEZG900iai8EOgPWrzMaVuYJEm0x5gQ7x R9XUwX4wjK5CrLCRM6PBklGtK213m1do732nHqfZe+vvskTHqtdRT0YyS+1RRksekiX4otWHp16p tuJVEJAvakVwyTNhYgH2ma5PPXkwHCtbyFcOH5VI6jWllF8PStCwq6gy1zjY2dWH1UkDmNr2XXsY 71IjSLMZStTZVl63KSm/uwj/HPXqSf705dyPlwc+/wdJHOX/+HT8ztHc3Hn/8oK/GdipDS/O5Gd3 Jdea8c79YiwFTX7fro3i/+SD4XcXq38VRc3q4G3im62ARyMFzZBU/kt/0p1q6hpIU4W6CbqUHypA 1czpR+mXqhcAAZ4VaGKk6YFYQEev7yrTwey926u6Qx114wOQQzOnW3rUw4cafp6Y3mmTrri5AJ4e UVxsXMFwtSuvxef+rFJdrtUazcbycnxxIdk8EETiTicedW7iUXCyXlP2ldppHJt3uRFvzsfLi0vL 0dKFhfkL9fN/XHnlj2eef+HF0/9+5pVzFxbfHFy8GCVvNzclAziaFW3AgivGsJ+d9H52og03s5tz PrC8y/arp61AAmLC5USHZ6zuweWK0dWlZ+bJNoHIOcoSeSaQSuZNBqyKJdpa3nc2/maFvfo8d9B6 rfdQ7CGlljxkQfCh0gfBb1yVOEh1cxDGpdhrvBktXUEczgTUHjECWvCZ46ZmJ009MR2+fxcKxMYE hHqTaZxmvIwXKZR/OLoPRrpNHvR81AKK8t+wdUuR4+Tjrl0FgIyo77rK0HhOCBTrYDsevK0wfEdI l35h/n9wMsBh4FBFLs7H74AlOci3a9iblbxnuwf4v2PCg7PUYiX52Yf9P6/CnFN4n6gMmPr6AtHz b/ZP5+NrEcJ+EGZo0qchECXsIX/SOqDGMxTSI1DqIAFZYKuj8QtQ6wAN/opWtCmCOuvrzjb6F1E5 rxYEd55cP1yU9wXyzNQSiaDQBfINHuxAPr4CbptxDg6R1TeT5YuN+b9cqF+Oqn8FW0lDYl3B28cA PBq3MN+7jVRNU3IUpEEErhCLJ1m4JYCqJoYHyxbM8CAWavUH1Zkz33n+fzl98sWZ7/zvtcqfVeuN 9qaBOBwaltfliwEQ/dgEomslf53AISfdVwtvHLECRltKAUC3bSAfiEB88gDGeBQwD9HDxPbpeMsQ sFNoF+8aw+fjCvW+9atD4d9ZyhjwqMbn+Zl9/XYA9inkg+C3Vz2YL2IMw0oMsIcxD0670O0ttINq 21+EM+81MeNRn59Jk49Mjn3kQLAlFwNxY+nqgZyE85s9uPh0/tKt5bRAi7lnk60jyoUrBvhh6qMZ SXezEABo5yO0qOcJcQRJqLKy1kCYa+8q74DkJl69sPZfWIiXFwpnT3m3B8nIKJwioOqX+Cq33yOf FG6XQExRHLx7VIy3o9ubBUEc/Nr1WAB4/sHyXHl1KfY2wbCvPjwWOA3ld+V5l0pzmwD5duYJ2xli rgwOCbsyCKxJ4q/nTGsLrllRJ6w3fh5uASPUNw+qDTLjyaMMSCZz3YWMHdqNKFm6Ei/+MK5fWVq+ FGFrZwyTGI8hbreyRJ6QzEQskP4MsCa3DssVbjkshHmVP9MUe4MFiKuJb6+3whKWL9zqRc240Viu zFVP/29nZ/7dXK3eSFbf9m9KeKCz/96xpWK4KZDTULzLAO55MXeJCGpg1dJ5A/Bydi0B2Fy7/OTS ciuxp5Cv8H/dwfrpKqxnwGNrGRddmvG6qT1cd1CRNnwY8wD5YPUXriTRNdHqI/A2P6wv2KN8Ys/U 2Ic+CroWpZLa0K1FmOTpi0kHUzDn+VuHgRqQQXRJ5Ikp8BMn87pOqJbyD28+20UVDcDT2k9Qd51q 6WOnLoBc/bjKm28Kdr3//sJtQ8jCvQ87K/w2XK/m2x8+HGwp+nDRbwH4B5Ocjy1WyR3l+F33B+8Y 8C5f8n5U8d53f+FnrKXQ9QLsnabR0SLQ5/xrS97mt+n5S+8XUntSdXoB8aN4VTB280ABhGdWIxYg zNOJgERe77pqBa2vLWCs1uPtVShABUC+bh/g2KLDqqHg9yqp10yGiRAdvtmq0YrDRhtOZx5gvnZ5 afGvGhH8ZAzMK2PfB+y5yMCWmyUb3xZ26gAzbhVyLaCuTmmGwsszTglMf4IUENAzwXHxYFoHBRfc 6gVbff41rngQDb5zdrY8ACAg+lpt+XI7dws8zwc2YeP5B6fj8D3JNTjht2X3K/bAiB0erZPOYy0R CtAzl+DjN1YItugWpT5N91KH++ciU3nJOs9lAmO4P3uX1AYlvTtwFFH2eumxnb76/DUfQifAHmQf VBc2/PkrHsZnKTLc/moH8tWSp53CWGCJAPKnH5lK8iEhH7pYgDT+AP+EbcK8XKM64ByZBOw45IbV GJWRR4l3LdLrwsWyUP7BW+d13ZNyKjNMUHevihEITuLtC4HQrKG3sevLxPOVpQOQhv/T+3a1bw1l /9Om2LvYbF++FMNVGx/z59UEIsAHPhKMlNsvHENJ+6EDmVA/6xF/8fx7d1irzC6+uRz4OQK8C+10 BEI5Ct0r+Xb6CBF01TVYqTp6TtRmdzqYR9iIqyzQ+tqUKkEoGiABsBM/JFtOGFY5hbhAhQUX8pXt d934kIdjj10NAPubfWzbAp0XmG8u196sC8xfaSAICtl71ASpV9juWtvqagK+kXlEuTBXARuE5diK OX2bHGzgr/hwX0fUY1yxjQcwtpYMB03wZ0V/IEmuolD0LLgL+o1lYn7K7ubkkocgO34S/swQFt/C Dxe+993Zyp+cX4oHt78jFk9w6AI+8NEIr2hWZffrFbAAWDY9YG8JvvL5BkEQU1wBgcQe99DDwRVr cARc9taa0m0g7gyoZxgcgc/usDnrAb+rxnMFor7sfT/IF2W+AXvw+fTVBdiTzwfYL12zO3Ox5xCb c9dj9bGAph4s7/y//N9i4l8DwB0UENXxE0AOCo9boID4I14gOuAjsPWIcT294nFQfmvq61VrYxXi qYwtjXYyd6y0gnDg7QiHcO17bFIO8MTj504EOGNoYU5OGsIV5r27J4Px6bhy2js7GwwDhUP7WMd5 JPHj+0d+Tjx8bjxV3qge/cpxnBVaujvM6PzZSMae536gS8B5DOkGKn26D/SaBlyJoNfQ4HpG0J5E 7UnGBqFykxWy0u93vZLQFJwFYKurXy0i4joAHloeeIBAIYzq0VXxCNFx66O6l7XuqIuN9Q5QzWh1 oAm50aDkl1YKkM+lh2bscMY2AuAaCmN0zppyBXCCMSJrtCKsDclLH7xC4VLcAA/VloMicZZTNYIR UdTUgvSCIuJ1xu0Ad/FzRykcf2gKhzWO/5yE4osvnPNe+lpQOSVAa3f7ko1ncln6np+6FPt612S0 Fe5nuHnXqNE3v4HRXtvpNuCxOGvAR9AX8PZJXGvKMpCwPGbeIsdvp28fIeeX4QKHICXtljW+gv+B 4QaxCR141rxMYFqZj2TAXjZlFcLT8/sE+Mv+l2UaHJc+d1ESvFnBetQ7fWQJMQK+ZXKscOAXD9oA 3jDSbp+QuCtIsPpWTsQ/f9TDXugXjnnAAsVC/auHcSf3mSMu5KuFv9fVLzM0lT+ZOfwVbKgswuyk sI065MNlCNK+ddn2HYO/yvDu4+5T12kqNQS6/kX6ahctZnwlXR/KXqykuIwwH45M1ppzVWg5mnCj y4kRCAAvw90N84SEFM4lSOZIGRAebMtNFMdX7izugCdPEacqCvCHhhMpwlxXBAoulCC445645Zpx u+Ezl90ZUSN/bblRv1RvwLhQ82ZfnanOV51TQr2GwVnlByamHt136JNT5XvLcuLjS18rnD3ePb8p 2It1oPswH5f8bOBUl7m1HpDzrS6Rdx/sa7rLLMQe072ZnI71HrI9PfZQTqc9BXuUZPh8zGLBtM8M IH/80YPyMwVjnmLem4RZ1WNmuvMypynNJ9ZAa7O11MOvt61eu3QGI/CRLpIV1UqjJfr5ylJ4Y9a7 VBdXLWPsFav+oMRqk6784tEAWODVGURZKt3bUfL3/aoNCo//zrPPvjRTGCnBgSdDz/vK+eytSukZ hx+8qBcduCXrPejixAynoHgB9B/OWu5dmXi7j0s+McOqSJEfjAwXG5datWXZIqrGeSHvGVAvBNj7 gGCqhaFSEUe1D5VAtwtDOyaHAm80DIZGwqHcTwfSP+mMZOpX36jWzldn5iH2V+fOVwH5WNBAOUQB U3umnvofDuDUVuTj758KvnEofVwJPgocyP+JSL1L+TeAbXXI067fIMB3O+oJfCZG35T651OZLx9g TPoAe/zxUK3IvItgT489d9x4d6RQnHpkd2n3fqnv8m5aVc7h7TwoYWPwcuq8nDyrZ1ADSmaWuj38 3I3f6jyUmU7bVnpIBn+6eOHAE9BM7JYevDrjnT/tPXYIrtrxyye9n4Pz9ulWZa745MEC3LnSXQB9 HXuuS/b5XggXR//ViUqlQvjXniiQa4a3CO2uF3DvRoZeJqKXF+gAquEjFIYVtjO8gOsOpLfczlD6 QCJ+gSoN81iHdzfpPAgHp98sYtDp0uj4jm0RNCalQS8sxALzoyU458NXF0T9p3PU7TvRfyuFoAT1 5kqtWqmcnZk5M3f6+3K8JD4YWonC0MiBR3Yc+vwXhGAA/k89bei8qH5NSiG/L9hnQLoX2jeA/15G 4EZgXqagj8cOwR4JATZlWRqwJ0hHENAgR+EsPRyqlerzdU/uesMLH76pR6dHxqYI9tyghSQwDDce B+Y3mCCc0in+/G8F9OonalAs0KH8vRvUtVHBIlAt+cYbNzU9dvwKUyygiKM86pHzF7H/m+KwXb9U C8PJ+B8dhegXLM5F9072AvwNQnvvp9YWa1/+7dO1C3UI/xsMhPLSMpSp/KIUOyPOZCg8ZX4XBdgX QRpPIV/BnrdcmV/xC/bM1oKQjeOEOoyhYg2FecjMeBy8fWw2jAV+NeeXR8IAEA6COTG6Ur53ojQa FrEBphvIMYDHvxXMLsC/1Jve6U09sMFg/Ne8hfk69dvPnPj2rGgHUsZn36O7P/u5w7sfHDf0/2nj C5jG1c2I7r0Aj69x3ek3zmcqcyT4yAZJt+KgzvWYfFRRPp/zW0sKUMS1GnD+7RDqXoLP96Mf8Nuf BoEcFuZcwb6rd0rznYyeHI8MffsJ+bKKrHOluOjxFpx8LPBPjhy78eWgu0RlB3sgp+u6buQIYjEx Vtj3qN3hB3VO8NV9Vb9U+ofPBHfv7nL7hyP3hrKlooPqsnfqZQ/Lut70JrZ7Rz8VZZxJz32/8vRX TuATwrulP+CWV5oN2bWWBrdCr3Q7YO+XulI37iqa6NVxqAigjbhsAgp7KTwrqK+UpfDQjD66G171 cxXZsgWFGeT5VltUa8X8Cq4jQzkI/ADy8W1eqTwue29QOCLxEdbzgP7s/xTPIkx2mo5/3hu/+8Zn 9e+kpgjzUHf32y8kKOBbx09843TUBpmUt2Punv7iISgCLP9PaLwRqM5U6/sUv2/jLTcbj0GPSk+Z fHrm42nsxpOrOUAQ805v5nqhFC3K/hwkRtcvjggtqWmE3/S9+GCw+hM7y6WH9kFLB8moP0kmwHeD vVB149grx0YbmFfffnfzjz1dzrj9Wvfe0fx5KJZuMM5cJzSdCeCrsWskMxAM4BzHy7X7x+6HN55s 7PmZEg5LjT+wf/iuMS5cBvlFeA83tp/687mOfah5+k+83/pW/Fvf9gH/7WvybfXL3snzwd4PS3QA nSzx/NncPvODS4n3NsKJwvCc2xpoPxlaQ4PqMONe6a2sXjdqltNyZPiHxGstKtXjvW2osDfnBvMm KGIaTUhthCT4tIwKBUhdhsTiiCYGBsNCofqXy3FczvvLwdaBiXLh4EOlA//XqYOf+Njej+za9+jD E+8rDt6+/Xy1+L0fYW92vjRifZ84Su71+EveqT/2w0L0/JdiuNaef8N7/o+9XWUvvO3vBKpvsNE2 jpFs1AcLOM9CJsvtMHx+Jh+aevjn7oezZvNi6+21uHUxOnf2e4N3bB/fMw2MEMAKgOS6zanHoZaz RA1v6mbDjHsF2PdWuy60q6NOt68OrHdw10GiAQ/uOlhRsOEB7KNVgfA2cF4+gKdDc8to+3KrvTVP 5h8v3PHg2Ec/8qHmtWTpzab7fkB+aaS467F9Yx/6OOxz2KKv4SE61QDwAz6C9kjMKMTnX8ExqfKl cOZp34SI277dz/8WIuDB4VycfIAL5BxTbOPHVn+z4V+8AH8cwy1oiZF8APw3AvloKB8tITqtBAdJ PYrk3WngWrxMXA69ImAPgX1sAM889uEJ4UrabcAgVgC6ooG9uSAyjn0zr3rPvuT96je973zXW7oM r2Dv0x+JD3/SP3LAW2h4C4te9YL/+Ie6pm57uYyPPP+9s/7aAN7u3tOuakaicdwsp/Ran8f0wD+i DKIGN2OrbbYRrF+PDrSTsWQNJtzt0Wq5tXoPoDeH+BYmuSZ95qmJ1OBoIOni2PNWe2Bzc+x94/v/ 23D6obH9H5ua+tD9Yx8cH0BgSnGckfMPam8WfuFo8MrrfuWC/x34QA57g0MyXDDq6qAhU7ngHTGa 8l//paB8ZwDmqAnF0qJ3/7vi8nv7uIjeIOj+zathuuHem5lcRVtoHwb/j+59fPu7/UvtpPHmcvUv 65U/PT98x/axR/YmjSW/UbV2e1rvwQtcjjy4kLlg3OtOm+m3AfvK6sQ5b/S0/yunNh/8w7WDv5Uc /q0t//KVtY9s8vxy+xy9DDuJYTYcn1zeotEeGWryFewRZita9WG6xwoUV6e1ZOI9u8N3xKhfXWwu bcnncGoIdmfgCBMENrx1E0hx80rcfnNZPfmg+3j4Q5OTjx0YLe0gqy/wksZlFCIP0JW1Badgo9WD w/QawucJtFt3ffj2mkAdqJW/KYHbr0A+1h8863KCLxjkBz+x7M3R0vFSe5e1828g86+3CDpRYswG MhmUdOM6Dt7Y+6l93NWLcnKqpPy6509LtH2y9y/Oy64fJqzjfQ950z/X1YW9vyb8/9Ffypaj5WP/ 5uTJM/UdD4TYcEYuCByNZYecY3N7v8gwaB3LWZ8K6eP1dlhr70PHDj3hnT7vzc5LZwI/2lEQuUMF DdWJ0EqaGu1EKxGOFMrlqYJfU+UcAp+QPZYWUgMe/t/3m4iG6u3fLTtEj31bOvX0P8wK8xjVg18K 0IeDj8aHnpAWMIwHvyJjeOKLXnnberP3X7mci6Fj1m1EJ37/6eP/egabWMH6Hn/2hOiM/8f9ntj/ sR3Y7pCvLBsPg8KOGX96Kjk97jkH1/d80ClvsuZPzyWTVV/Uz+ulKe/UoeRoyRMdZEae5yOqzFM1 vhSmmnzXhodyaLNKOCNopYJ83d99bLE214gn7g7FKcNoc+RZKDuHCmD7JWMk/PKe/aWyHHsFy47s zEMye/VkOSFiinparMRYz+5GfZf5B07RM6NdIZ+7962kAO4DrRmRob+pz0UEXMTiWwo7oRMcGlK0 hKkwxzarOhA18Sxu4UuOPDkOY54CPM7wIeQz04sIjn07Pv6SpdgArekH4qmdMQ7w7J0zyAJHfk9A 4gu/mL2Jbb9PfelYo1Er3zeuYC+9UhQAXGjGwr0rP3EOSnpIERvNVjAtoHC2dQhw5QLhL/9P3hzU bIVni4H1pcFAUXEAHATFHjYvM1oOWMEQm+rRuJmcTqZgwZ7wT1xJGX5qp/f0P5Cap16Ojz4X7N8j eWCcSaDFRwS2+XaM2O/+c7kFyD/wJcmE4mMNtwvvC5/oHcL/yiWu5sLNn/7WsSNfOl65UIMXwIvP /W6YNKAwsqo4A//YLX/EO6bAfDz5SAb+K94k8EIvwGN8SkOCQ0Oc3zeEfITJAYN55BuCJYG7jzQO TPun3XFRmEchST0yCvMSUSuGYk+C7ai/RZj3MNHjw6Vz/tTcyPRkvnryjdlz89VCHlugZd6rlTnA PFR95QfHEQsJKs8dD02Vd+6GhK+6vQ6UMfAGmRKjFxHIN6F4uHVfEjAFbsG85+7YR02zyC1Jo4IA Dw6IXoCFuELm7wrmwY93yVcGEXAzuWr4Mr4AvItC4IUDj0+K8rY7qo/d559u+Ff0//Q3gxk5N0RA +tATMjG9yxOrv7os2mzsSMeE9VJ+PgLD8vHfOw7bBABPvj/d3swAJgRpDWbiviUD7fKsQXZuOck+ ROsXf9P2EOiG9Hli6BjHTRBlWCrB/FYow7oO7zbAvA2Yw+FN0bK8wsA5Q55psEMAP0Ed8s7sV2wf sVIP/2tZuCDymoAaMG4ofPE3zLenNN/9rr5Ysnd4/8uXuMRfUQAct4586ZnTL8/CBeDkHx4P4CT6 nHiCMR32T8x4+/C94AfJCp1MJki0T3kHT3oHXCKPwZm8E2FBgo0Vn4d/R8YQCSzA09F+F+ZRSNMd EtWSNOBRgMcWJt6iSh+SXTAy5W3fXS/sdbtRXNxfW4p3j8NY1jr93Glw+FO7y/s+9VSlEkNzJFEt kpnYnwoDCVsiWjoofBlvE3DKQD0mUUuvQ2GhneYDwyyoMs8N10NOwTZ1VfQIqizsUP5elx6Fc5fg d1h904v14kmgNQT2+eRjU6LzM1p9ZpTsax7r9ZlvCe3CQj/2DzsKatSvA9TnYzjwUs+vCXN/6PEs z9+5beD/2LMz9UYtLIEB69B5gvF6JJ23mNarNtcWsu/iHcogoVcNh2bw4EgYItKg0nkX5hEqC5sY GdgK/4G95xV+dS43hLvKyeuLvvwt7+QZ27fJ7fGhTwSnztoSjNupz4v5Q9EQSg4+AjSKY8MK4AKU KXCH6O80DzxVrcGJFbZemVkm9GpHiPmNy6UgY4akbCijx73MF6oHv3j02edOP/XPDj79m0/H/+pA cPbZWl48wfb7iDjkzf22VP7y73snz8nIfy05AIJ/1P8aCvGxeMXk2HUAPvP54CWP/qFQlIlk5ulo L+62vAJWHqu5HD5IPTrLc/LooosMrPfhSLk+dsTbZl3U8bGHHxVahR5Gi6dqZw6Cl4mTcS9fDsKJ oNDfqw1Phd6pYr5lo/GkvRSwT8PydZF9VDAEXwYNvACTYeldrT6U/3Y9g0EwdylKWOAvFY7R7CyT 5NjtpdFuS94Gnj8u8w/gR2CfQ58QJ3+Xw89w+8rqA55PfN4SfKivTpyxyNidJCLy068G5HIhF+x7 xEGE3fMJz7/j3369dGcOAggcmxWYu+DfskPCCGEbfBSNt3zrKVBEyCrvNCJiyMBxyCSmarEafdIl +9Cxg/6AadxfOuHy9oB51Kd9jmkDmMddl/XFT9IiBVriFyS8+qlPFgg5rKOQjxLy/xk6z8K/LeEf jhuzbxRm5r3qAg7NLFDxQboKJA5h5NxrHWjvnpCuX+j2ZNk7/KmO2dLVDaGq+G792uETz80c/tJT hx6ZEOa/0TiVnzrq/xFw39f+uZ13SkblROwCILa9CpHePmDK0EmkzPpB/8FYiS6pubcUCR5XUi9T 71B70nnXUc/bc6Jwp4A9vmvvTnGy4JjgK6Y+D66wFi/NBKNTAbZ4pEnFEBY0GtaSzUbC4FTRFxGy wwiQsAPCXa++3iidWo0qA8bwQjKshDUBgvQYdsCy/bDz9/oS9OICt6TXF5C8A8sF+EuFA586AIrU y/mTqkNu55rW9apcAIeAhKKEKNLbRLilqI+EgSM9UXm4d47V8w++w6r8U84f9Y04ENTbxXo8FSeF 3hZYAsJSGoFWScZrtn4ANY88aZGOUtoDOytQ1oRDZg9LN9hrAEsSeXmvMXqvJ/SigkUoee/0FwUb kr5hNA48ZPV5qMNCJHe5Y3xczShwKBCTqw5Y7xuvW74xYGNAiJGZOHG77/Mg5AKHuiw3uoRqiiBU WtEOuCwAls2Rzx8B/D/ze7+7L4zg+Vtp7zjYDfx4kNiNiRwBEjXH2D9Tb1mBSF8x+TmrTnZFKt4l KZqMjxxY+DLdctVFj6QeV+7GibS5+w4F5UOA6swE6f2Jz3RGl9RrcizuG/IM9cRqkwLFxMhxFeNd Mi69wtmb4N5NXFZpnXTe4AWBPsMCKOfPNW+v9KxPo6nNUuZX4HfB240VFwDRG1E/Q/kzKCCj63bj +eKtYG7J6558CUtc+uGSDnz5wd+Ub6FEt3dcuNZW29txr9AH1WORE1Y+bQNXFlX+le7brZyPdENU Jt5cc7/CPAkR8Av6w1SrxbOLVg0Bwj4xdKJX2iftFSb8sdoGME8BR8UcVXniLRmCjxJl7xWqgQug o3KhWhmB9bQeGJxjz6fMwpAgiIzOX2HM7Rvz6AN5b0BC5YJkFLQ4MljBU2PexAMyKa6OFreAxHeP 9xgjGtGLFeERXCwA1HzkdyDNBX2nT7kAZE586fDp79ef/tKhcqta/Z1jB4dez0gxumykqynw6xC5 hew/Xj39JaOjSVWkdspTDeuBC3tLV0Xzpw759NjJgL246zxynHw+xsTlYlBCNIdFixUCyg/scPpL Wc80rE+s8F59hGL2idHjnYB8RrEHMob9OdiZg91ZuXywApfhRqtWh4ptRL6CEfuAEVwXIPN5Li5g m10BPIFICgitaXTRTC7Dr4XZDKNEGqc6tqgVoPPfm27vxSwS7CH0Hv2mzDqqgWM8+GinPVI8aLOx g+V1bPJNrX3C2f5G1pqFxwgnSof79hDbfo995VgtKpTuLYm9JN1cNtcUGs5p28ATFgvl8O8UMIul /CkyCApvXHOip/hMlQp8SWkA7ExnXGWHa/XMVFPN03pQjZce+td2ZIB0Dj6BTbJibqzWOvRNG6H0 u9+McKYD1vEuxni0IE4CG8LzHFpJXGUSk9axs1MuzLOpXlmdU4CeQBJZTwTT/mR4ci7x9b7UZQGe +R+PnD7fePrzn4znK4fOP+Wy/RxAUlcXmFmy3uSSWcgsP05oMa5+sjqh3vjrgb3shdxzEqI7FsDR /76D7wDPT79QmK12Vq/tYQ+iUYYFLZDFcxeD/aLR452Qu4aqw+F3crxUXBHHZ5y5EF+NESKg8lp9 9pJXHAzkfN5BK+2TvLPNjtmvo2uWic6G7u4LQutp9TqVUzu/+zgwQrno7XtyGhpv9fHkN2d0e3wq Q0ZA/0HxMCakrsAX7uwq5b+uNHv631eOfeUE0E4RB4Tg7FKYZ1NDPW1jTEDSwD5IwEcunbQ6dgSm jwoum0raAlR1cE8k42vc7C2CMw2qR4Pr19B3eFmoMvzxz3U6gBXpUgZlWXvbOf1VKz+zY7D5T4/X cfxG1BCDMwEbVhJJBgNiuz0sZ+BjUQhKwh2mRQyOQeJYFpwjpA1U5eiPu/Q5jNWqWL/ocYCkfG+G 0vJbNp4+ogBgLrhvYHvI1CP7jzy3u1dY6AV+DAKYR5e06Igpp5BBRge+2Kg2RiaWDxfmn0HlXrDX jXeA/PCJH8mndYO0rkkZcD+CyFMKTowPRscWvpARMdQRG9VAUTJoyBp64DkydNLa/FPSDc3fxANA wgLz/CLExCL8z9VS07sTwNdFAdk1k8RzzUOdU3rp1qaeberzl3GGta0A4BHghYEB7dFtnfZFr4aI Mpu8e97pj941BrigI9rXXxCufuY3O26nKDz9Xe+l74MO+AlCuEHo/bz3Tz8eHdwbwIfv/ndHJ84E dPL7X4z5GonCPyqDz9z34exHZX5vf08YX2nOv4FD5jbljCPXwuqn8exT/x28KTsNfvZfwp1O/hBN 7aMf6LTx2a+KWzGQLEjjr/533nbjMwM89coPfMx98Vav1vCe/d/z35kLZr7n49q6nNSWg+THPhrn 6WP0Zdy4l2jw1L+Tb1TIx7r/rW/6/+IPPDjqqi/juR+IdzOY24fHvU2rAmlI0AKib9C1UGZZvCi+ fVHj+fP/oVI98/y5P49gaJ79Lo47XpifX5g/+8r8Ikaj1l5cEBf0i/PJxUvNzYPDCPwC77F4adjL wUGtem0SQ/Trn97IOxike/5H3qcf9YZvtR+Hrzhy3Kc/4q88Zgsx40yl2+PpD9lxwKSfOiPA0xc+ 8e0a0wlOohBGHv7AXdGb8JZBCLpi7WIeXp7JW3YugLIxRDIOt3cGqvIj7/nvegc+1HAPgEMdsHIH ng7waUKxP92ZE8Dbqe9hu+e57ed/GWDPuFrwn3M34Wlt/94jg+EurL2ndf+xufdp41jFBO/PwbgW JrMf/8D956IymKuP74wY0RjpyL+VcSDkI/NPf74zhmCmvv6i3B297XRxcyQeezBCwZnPGPYRlHGk ODy8NRnAUbzmz7wL4ZIGN92c1BajgS2iCRBPXnNcr7j0mYNjRezFuX0IdybBhATBIzoTPPw6wI/4 0BFOdDYRpnBsI4Pz0ZVdz6jsDNia+DPLnzkEGlcXBfC82vab1dGREI63fOrcn8ZYGR/7oDd/IT7/ RvLb/6v/6/9WXNAxeVivhHwkrDmK0Fjcn/1aQJf+r/9TuxBBin/ViHbgGA+mK6zTq365iQ+Mhbe2 MTrYJwvlxcI1CSDzL4znDJLY1X5DBpFQVL/iHfyYvYUO/FuI3DCtXxa+46lfkHIsoF/9Zh69BRyi 21joyOgffuJz4IqLRf/8OQHFMLfQaDb5t7i4vPxmA3/zP2os/Nniwo+Wz/+wPX+heepsDq/GN47d Ka8Adjv0VR+ghYSWEUmTXrrJNRlAQD54E1xRjp8DENb8YbwUf5euSIeR4rUwaQ+3g4EwXhjc2h68 PXwPMHsxf8/oMEyR4Wiwa+ye7eFgadgPNr0t5yDePvzwvcH95ftLpeGR4WS+eRf6s320gx8z4wra 9Z3/IF0qbo13lS1If+N/TYCmWVOBH4seWmD0bfj2jkc2V8Lk+72HxzqzQIAXRgkeqea4ZwlNhXW/ WXxUw9KuhR/OhpuqC6u74N89U5ERxh8hX9JadCC1/rQvxzOv+rXLef+mrk8AIQECle7t7eh38PPg MSE8w3/2T5M3qwr2GlqrQZnWeOaB4A6PHw7yowcfl23XlR96X3/J+8MZDyv54x/yTvyaADnkW9mK 4g3XkqlzzbD8jiqO9YWLkbpaA3mBzABBoE0wj/tSR3UgMk4fxMwwaAEdm+8CabWn64Hc5gaa+dvu inNwFGoC7PEH4g8sMHpbMZ/LtZdrcuAywi/eEiCGL9yN4dub32R3+CGwn7i0w+3f6AVsGC/d1der z3NnnWp8lIjvWurtA3CCpoBX3HJd5YTzH/Www49Gr7nFAjwAICDV9ZkE2QyJxi0IBZQDVZeOWyrY qxML2Vo0K1Jrv5Qa0eETXg5wjDRQyUIjWpydXSpAyemyYeSy3DZUb+Qqk1Q1Rd0EySx02kiqJpRv XECkGq++3NlgB5wyNSyev52j6fLGNUDfmdTnVj4LnpOSjuo78GDJm52NprlEkF4U7VGXmsNVJvcd B3zp/nJlfFsNS0QrCNNoxq1UnpCRf+F01KojtNbE7qkWnCP8+MjLwUxlfD3vII4Y3Y1cgwtlOpQ/ 9fNdaj8Oo3of443ke8F4U5urBmBqHG1CgDDjGaH+EUHcOnWmYhTvpeq51usBLOcF2PkOREdPFI7A 1Kf8M21sbEdnU9aAEe6gsHQVqFbeXD4Vnj2wcYAdNjjywKFw/GjvaLtDQRGSdg1SeNdCjFt9tX2c zdLQqXCwRVcf6vmFe+dpPMbqRM4fNTGP2DYDyZ+dwU+svbnKLDzcRCMAI33qAmC98ugpLLtG4dIS 22AeU6PHQrinjABH5+zxSbiPOKEJ4tdWAdY4qglJ76IEwXlyPJMIsSXALaADxgFT5ovKbS0ZwpJu oWexHyKiw7nljjJJlxfVP7CZnTgvShRo+LA1ndYsrdPxpdvuffK+U2gtwAEyQMapcR4/O4XydqmA ErzdK4Zeq47r67XCsZdLrrSGV8OJCF5DlZp1m9Hlonjhp3OSU+/Rw3tO2WWMOI2+YEoZ/fQItrhd DPKt45W9gH/OouCL7bXpIUTBwlkOJYyJu9RcjRdWM1ZHecQekaTVAG+ATDgCUW+3v3xufETcY+S9 hquqXWg8+/Lc9J7y+L2lyhu1ubOV8L4y/BIB+Yg4hCPiTiwIUwtEPHFn1AKMOXsECOTTD507fXa3 i0YB0uW7O9I+X4dZO/jVgrv1AIVsAfg03GaleoK9aoX1Q4DcsSsM34gMcP3xlwqv1xpwlZoMq4cu fc174xSx/Kw3dWToRTylSgRMK0x9n3zkOnENVPkfnN0bX5jBxKhsj7z0ia74d+NsrMmgYAz1WN7o kmMexnxNlgv0ts6kvZ8XbREV/i76y9Yzvwn8YnozXr2EXrXSqQA/VS6WhoJWLqTmD5BFzE4VYKsd z7xWjwDnKCSoc2tAZwuwLbFOPocfmymF2DIhe6fA+/K01upyVK8Xao1KhM0GQEijxXBbuTSMCS7h 68VkZQISWTd1ru5+CdPWaEYF7HAMgmfPlGi1hmntwB6rTALin/7H0hRIwbMvd9mWdKHjdZ/9NyMk LHBrp6MFxhoWQb6Ti4MZLIhiqoFXL3qpVAhefyOAL4cL/FiIGFb6jVBbpsBPmtBrEOYb0e25VwOg DJgnkPquM6qRgNQKXjUCeV2q15McYunJeMohmbAPS0wXuCFhx1c9FkeuMim0X4cPQrVZrrZKWD18 I8etr3kCWAA9h1+dzsDUzsB1jgD8l0bqOGnDTFkAgD/6xWMYO3ie4Rw+r4jVHARX6/EgDLrSSJwf bxU69M2ln1yjYXKqFgNTl1TXiJFEctWogPzpL9rOd/wjzHRTy93RkhrfR3r6meCglqdT5u50JTx9 DnGNbGvSAcMZHb2wX3zugKeGvjAbHO1VB+qA9M0QDcEJzztzABX6h9Nah9RzKR58NGvD0xfx8/Gl pfjL1eQL0sme3Whamapl2SE2dJL0Oe7x0pG5wzmGJsqDsnKixhYNAtTqK7giH7Vas4txfX5O9uN0 dP5mCQ3YFRK/hcO/jZ3/5K/VIKnYFWYCD81WaogzgSP0YCeLEGwfYz0ojqgBdiiUS/t/rrT7EWFH byRZNFEQ5xZF+a4OWV3TpqGhNaZ+JoDo1/4HS9PUYpR5Y+9oSvggLKB+uwNQThY0YxbSn+yJLnRy +Bm1sDiQnLWb+TKdydQkUhOILR5DLMMqdu6DAuAAZhPRAUp2dHLHnRPAAsC2XMFMAPtTC9O60LHI pndim5MAcyZhxcDUR9f03kSGRZ2jDu18NgSuwQpA5NYzs8/8zzZgJnbRIZCGuCW3wCKBTzJXgYRx r7A3zsuWuF7g19fpFHC4XAMbWSdKcyo36RQgKAvhnE0hD65boR2Z2nJtbqlca1SrS+P0B1MDpxIJ ce9tTjXqDdz9WnkWzP8Grl+ZIeKiwqR4YPh5r1GNnEoYGa8wUtx5AjgOkwsFvqbrBkpRcgW+bGLw ZD2ZnKkJBweDP7A+yEatbj0pSNIp7gGjlQdPMBQHkmX+zd4+1fyDSE8/GILhl6WSFEO/Vb+Ko9nE fCMlbURkxpbBCLFAcEBjMQdHADDqUTg6YkKAGUwhDr8p8J/4XNW6qYyE8L2bOXOqtgAbcqVxYa62 VFtp4lwdTBIoT1FEA6yVcHzqkdLBTxwgjGGV04Ffuuvs5KEsB/yHecUOP9xVWnrk563cxRKs7+Nf jOn8A+7owB54hnf8H+SIzjMFngSJlQQPHM7B0y8hYJ08iLya1lBZfjqehbptBv158QxcU7rkT9Ax XS6kabrQsTjgSsW9g3gWkoi73VigenulhCh6w9XapTJ6nll2Vjb2quXgBCC/tlTBwZWYG0bUL+VH StvgBIdgm4XxsR1wDge1B/2vtusztQO0LIKwACH2rjNa1I6/3KGEWDTwoApzaegrSPJmqc38pnET NAZ58Q7efVIYjdg79jvHsXlGlzKGFhtLQ7PzrJOCMlybSf9d4AfGqeFI7ob1MlSZSKUk5dfUfOty T8QRkBo++0gZbBp0Hwr/fDV5N+x+O/KNjryDec9s7sZEH/mmeGFMlSpTlQPFpSr21T+9WyTa9Qgs eohBC4dlJWWcl/jqqHGuVXkqalRLd096Y5OAIgyXl8jJ8e4IdI1Svx/qZ8Uxr1yIETB3piquIhgK JLUL9D6NChPDBi+D+MtoCBqApzkyuUEjr4NfGymiQTneFisTm4XfErc/L5V/WaeYK+GYb4kbY85B hqes7FJL4R9dgEFXtP2//OjAwFBxdGh4qeF/5+VTca2WXFs4+92z5/9kNroMPsBSpQQBRhBNASdD bImXf1Rv1po4OfPt/CAAD+pZgD1O6YHwBrUtLDQwcREgxeQAbiSJcPeu92HnuQ9t7ex8dO71IH+L 942XfejzP/Z+LAgf9jP08rP7/NK7AjcEDWwkUAtj+vGHcmhN+QfN7cIy0Kj/sFE4067je1GwJZGT ocxP6YzJExOdew3oFlaxhDpqUCGYG6beLyprIen/TkZNNdXPz8SIRRO+04d2+p98PRi4yfsn+8Sq CVUt0q9+PH78g8n9pYHwtmJxcOn5c8OupQAVZn6Q4F3D+bObflh75dypxcUahhJjiBnFtdluXnqz 5mNwbh6oR1cHcvF89LHTfzExu/gwNO1YATCIQqWP78Uq/845aQ0mkj/89/6vn/D+8GUP2nJU06WD PMI63FNsTN69VMxDzixCw4y7H90dwBSH0Xv+rAifS+13vWvTK603GzNnvtfAVKYJXcLPqzg/azWB HSsu/Oql2/5Je+tH40AsI1jBqkiXZTQiEzE4KEOHhKg79u7NPgdw9PaEVj2MKlT4CCj02f9zx5r1 r//fYsL49H/TLL0LDAYkHeHwh32B+ARLCE5HiTdf847+gVgCgFmAUmEMg1GQdlZNWBVYPzCsgF0Y LLWW3nV/+z/nhi+frd36OJQ4UJJv2oQJjQcHfTVGHp+BDSWgaUYTUBUsEbBE4tpaHS1uPxhF50ff uyu8pxyvmZ1ea9ITXRVdnej3g6wWVjV4iv0fOPfsfzwwu7wLx+NQvQ+zAg1beO+u9/n4ul+Y8n5h jxgL8Hf+z2BO8pZee0miA+EMws3DaUCw4WTtUmN12FsDe5/DgR/NZvsCzli5BrKUixJsLx4MNsMN 0R4kiXwDJ+FdQaSjRE5DxN9qNCDBfLB+jU/eQFK7YoJ5UGwDw3zyudMimsbezOlTle9bFVHvByLe UHmsDPlU/HXzAcJ1QwMJryfQYSZ6leCKvPUbS0vwc2ZhnIrrTMIim94dqH/IdUeZYhLYqgMfrVt9 BrQaMENAJQO2yTg5CjsE9ClnxEbIvFidhBCuamGyoPypun3F8a4uvddAIE6dj0mbVDdQuHXpg9V+ J6dmvn047ht62TBTU9h9UIxrhSNksHXnAjKup2NmNLB0wm0w74vUDF6HMUUyydVT8uviqNI6s59h s3tTgIiMOE/9yTluQREWdHsB7uh9vffUJa4VlFXNBl4JaePwoRxVsCSpIlt+rkQ4i8RwpG3xODwJ WaYynvF+yXQY2PzIv5I9BYikMFF8Xc4eh42tPYHzyziSTL2efChcj2kni1Q7exgDVRgbD++eELOI L7rPXsqPDoBNBh/aOz6dSAF5s1nQ2IbA3o/fh/itokNdz72fa6Z6RsJ1SyDWxw6AMaxGOAEJBt2S 2K2gzDIEXzy4moBQsdeAwuNqiDxCSkTIQ1wBkYL8FjdrYR57WHAcygoi3Bo/N6PwW4Erl5H5+WEI g/l6BTJPMPPtLp6w3zrB8JWm9kxAQVg9Wzv9fdkFhSQyUprslrnCSC5urAQj4KhwhkSxfLR3PyPg au/YRoqTvh2Q7283Jj8nskb1ubvMzxZgSa99nxp54Gg4fkj1ruRU+VP1jhngJzS6qlrddYdXwH4L h3aYrKiz7AX++pnJxqKJErNOkpiNjz1d9/epU51AqdEPZ57gQPX6z7Oa69IPxKT6VG2E6szqtyYA 4et1pgAp5tHZXr/3TH3ZgvLbwkrAMQaQBkvkDYYMUYH/a5+CKIo5k5Vq5g503/K0rRYwQeHYmamN u2G9ReFLF8+0guzuLGGeQwG2Aw9lTSEbzAWJNpj/2kvTWEuinMGJJuNHsGj5jcAOGbq1QSd1i4Hq RDd4NW6pPYtzBFyMw68Of/FQaSQEolT9SN0Af70Zz9biarUeNWqvL9cb6cFNiCOBiM/FfLk16JXg pxPATUFgRELCjo4YOx/GXdZqB/hlt+YZnH4TVl+dO/Ibz6xHqbT3QrJ2l6ceGo+vFo9/81it0Z+Y uF+rJAWFOjfGb3zjMZG7xLLIANFyixUonriI/abdL339JkwNGmmVGlAo1Z8ZmV8pv2uk7fULQLOg sTRM9irGKr/fQYh9O4k5Lj12kiolOMkTPLD+6ueP4PidcM+xwohsVt0x0kUusEwBPXDd52aBG0n0 qN0Y+NEOp2kDEVd3H8ET3ms/0xr6XZctgvSkikkQwGeejWAbU604bboYrk/uFr9jofZcykkRhit1 QICgefSs7L8g2HD2GX6HX6paTPfDsR7geXGDK2q9EbO010GRmKDyJ4QLxmf2sqsbbC1TXnLjHSiy vI1Wi2glqh6v/clh7d70Ywef/o2DsMRjF1BtsQIt3syrRSH1MaLI1itVbCQQnVfQqGG1uGhd1tV9 5fL4jnK5jDBBkPatHtHiWAF+65JVb9QB+WDcJZj0OjyqO16oU4fa54HSeHli90O7a891hUDqHdlg aAJLqhtN3tCqTTc5aeXsUyutdcWT9SbYKDEMk2kgB5zYxunpf2zXHFYz1dcw7FH3C2U7GEVC/k+X wgdkT6jslnugq4FYmDoom4WDNbc6fQBEGVuAdN/1kAUr9MwLI+gPlin21WIrtCwRIw5QggBO2YDs 8/Vxs4L+AMf15fYBdQwrUoyOBEsz5dFi1Wx8wDSVt1kdpCJTDA5tFiebCM1YgJ2ShonxbeckWjnZ V+OjErTnVqBag1U4Lq4sV6uXWgg2EXvT0AHjG4+/DCkSUF1QOyIMLtKHuAqhA0zZTxq9g/4R2BaF JUyNlraAXcCS/EgnAyMGjEksTKSMqSk9eho/wQ5sQLpUEINmGl4A6yWDbuzkZiAfj5x+4TgMDgc+ OQ06f24e8d0RBawKUAWg15eFgxvxR6Llc1wtbpJuf7/GAOFQ9ctxHYD11MOHNW3kXVQpiZUnPodD tW4wwQ/A2PYnxkouw9/3aXYOS3CDRCtdJnHtImHc5a96vF45Uq8cw5/MROVI49Wf4NAB2aGfwjwy 1j1+SNoHnpZvSXf1ajegOlZShtWMlY0lCIs6+ENMPFhBSLxU4bqJraGH1x/L4g7UURjmYiLMA2Nm ugSqKzEnUnN3Bm0d+ZZAPhJABaIKsZIYLxcM5COkzEvXN9DWa+KPiB3NHBNANf40IZKHpOUvB+3K 1ONT+//BoSM/L0tQtug9F7h2eBTyuFEmdICQf+iRWji4Ei/VwN7jb6VdxwJFqizWT5+rzr50snp+ FlarqYLISuDLYBogvYWExSQeFvJFNUA+5gsi240wj3gQ8hrYHzB0CHAE9gojicbxCrExwQD8Gevo ISiym/4BkDB0YOJwFcjfA4DcjVersIOFpKsXb+G6IoYyrUnLfDX+gFh1WJB3gaJQPhjcKUpWN51+ 4cVnfm8GkA99VlHCmYYFKPaaNbD6ULzFjZleyO8M++LM6Zfn6ksNltDODzsfbX4p8EM/NzRSXxTD Xubd6/2sxrm4vVLM1ycfnNwxfv3z9rD4MArgtN0GQUuxtuAIhUEBY9P7LkAauETpd36kfuYQOCJA e+NVwPwRzMSNQz7kFDFoD3d9HbENl45aELUPsv2j2ysDsTQBpWL2ewm+13a+gRpguUTqRRw3NJI4 pdgsFHvQpXlGjM9pcl0WNJgXbmJYMtE7aLWuvTSJZVp94SNQXEF1hAz+ZOGekfMer5viRRg5amgK 6xUgAah2+RpoUNFCcWhffduLJ2pHT7w6NTM/jg930Z+OA6yk4Ir1D4MpX3q+CKax1azBtQmHecIB DKT+9Euzx756/NS3TsFAHY6PIwxUK6oGy0fE/Wb5y3IVny67cmYNUIFDwdUS6vSrsJxgSiTmRR7w xjyTGZ+uaULLpCVE06DVQlHOdG/Z6R4yePshbg++96k0Miq9zmGc1rfgJ8UHjCRak2uzIzK00rO9 5KPKAXZGcoggHaAkLHd4fjaIMa9XBfILMO/JNkdh+IE5x4thq12FYXLjOcWEzp6dbYGX0pRmBfjl FA0cj2wY6vVUwb0vKJhAvYCBkdGwdGe3ibhfd+rzQqJPnBURDtwj1hYAHtgXawsUwyWwmaexhszy KpUePQ5JZuNPzdwlzMM8AQ+FHHxp4MFinK416Uo9fka+34U07GnNRA3nU3AWwBWhNVUE7a1GM/JK fV2RRD+kVX0aNWVj/OdGsFiBB2VGzMoubBO01+vbg5UHBiQTvJgBLVsLx7kaQA2iC8cFkptzG1CG voNZe+kjAgMGEjIV6DEGkos+iKi/IF7Y5CwguWASoSxw6TDy+sdRgrMwAL4O/1H8NYEHamDyZxca tQviBFHGQiqEJ16qn3j59er8jFc9XD9/nH61CMXJziBwkIwt/LUlrI0IzKAoupyOvyzBeXELwhE5 ICbFAiAn6CSEBfQfYExHfRJ2sPdC29dXiIIXKz0k8wV0z3nBYkYQyowugO8VRHzml2XRGoHXMCkC 5K6khkYg03GIKGeR6XMT+gMgR0mELf2AFZxqL+fEibCKs4D6zmCmENUai6+jUGLSISIIjug2LIAB fqCiPM6CK0bJ9fV22i4PWoN5DyfPlLeXAWCAtIIxX/GqNQmBHqKVGuK/79dsDC+lb5CdFH4wmr3f gwmD0wuUrlC9APW6LTOPN2aSvPTOMqIpA+ZlA4LpUmDCs4HRArbGi5ARwZgKRSNfuJzqaUNhNBFn gU8hOwfujg5FSFxYypc6D607N1xhxjzRAH2G2hw/MTjAg6Jtdqi06/xHEgG8k9kMi46Jm2rj3I2z Qj0D1ikA0wsYgA2lflacXhkFnAkaNdnN+g+lDzA9IGFNo0sAJ7BFfXGlDhFkFkmg+M1WlKwA5ut1 Wcuw8hlD1CQQ9EylduKrx2densHHgKO1yl0T8VJxCvnk4nYRYYCgwTCCEVMBGyVAyrK7wQhHLqJn TzBWSBAW8AncMQUDEGR4APbGChHR/D32R+bZzpfS3KiJKwEa4mLzl4PaLwf+ChYtBhALGH+YtQ0k FAoL/UVFWBxxyL0Y6UNzaqsHA17cev26Ghx2DNVer1aU+AMF8DBfAX4JIItgDzg+2RcA7nzKDeSM eRVnvEtV8AJy7qqPg9/l9FXAHmAef+V7S5N7dh/61CcPPSlmeSxx2FHBlLJ5MUenHBQg6ui/yg4l fyM6Nfl/oN7Szwn2LRjzHq4yZOlDHVIPsJdtKvCpki9Cx+hah1ejA5D6YJwTTPSQPElOEgl0DAyb uM1Cs3XOiruGz7c4S/gUnNIBJ5zzHmz76DDIDqkuNjppshO5vJHMT+KP4QriejE6emj7l09+rnLs MxXPbKrRRK0kE0mEm7Da8Ie4XUitBQn//LeVMFxTeyRMVanYQcdYvuA4QKywjYfiANDBegua40aa LBKE0UdM+k/DJl+r1mo4we5CBdBeOztThW+/OXe8+kYNcfsLcDqBWGv8EfQwT/0ukllqSfFqF/bA erAziAHL1HsWCwL1aqLKBvgL9BaADUvweqMH1ECdPxahYl7iXFdG08cxp0EUgAsjD6V0om/7uAui AmEBaT1uEUc5gubjD0Z7812l1g0eKyxKrhIGM15ON3eB8ptwIFbmB9tPoyvW4sYJDemqRU1QfqAg fB6sfRAZAI24Sn6xKn+R/MSMnn753KlvP3viK0erLx/w5j9SP3eouH0/2SGyr9CXYJWIVJZuRUAh Vgw4YaWxqEm5CHqR8hMzxfsOFkxfcWUGCR3AcikkK/hbSRDnBPRDaKyUC5rzDo6fhEMoqZn4sRjK D69Pc2SA8K6YTggj3H2M9S2i75es2gm9xfLCcsG+Q9QnCgDZ4fpz1W/9dJdd4ypj6EeCLoORYr6L 2dFvsV/ksEIEJwwItSQEKvyJSBlVikNl6gj/hglM3CcfmTzwf3+6dacgWfgSuQ0Cr+HtYPgp54O0 Yu1CcWWQYOxqs+DBDrRImizBbfzTZf/LlYY381pxtrmjUp9CALL6hRpWCTRN2F4iB2AYZw3Knpgv LylkdG/KvePtPM5EaburBNH9Du5ykjaN+o3OSExYAKDJmHqZwfFDfeFfzGZ7fhcVMvs7j52SPrrK GrYJOwKU5w2zjcprCb8NS547hpqnShVUBCuNSlkos3prRu1cMZkTEwUOdDWDE7fniBxvJIHywy+w Htl5FM2/2flmKH9+BBbXxlK9tA1u9v17qe+QhowHQjEYAVONvYPw0IyWNtI6YP6Ek2y0gNThOFh9 rVUcfwa4luwQEtYTNmDbVdJ9bBa1xBgdrirIRUTV4KYKO5+e/Ge1I79x9OA/Ozj9yOTU3eE+hEwY Ke/b5h3dPXHk0f2YaiAgvBfyJP+w1HAm1OnnT/BdRz8jHytb4gyLCIyO9QQOVraypmp/1MQffoLX RW/B2WK5wPgMTAQUgEJIj6zsssdEB0GPASYzVYB8KkuoPgjhS9+Sg1zcakr5MQLgVgBOGJCMXl3e hQEBTnzsj4SD7dEYX3eJ4PXCo42Upx8sT3/ia9F9J2AHpiRPGGMC6gGBwtvBwR0ZPwXsKdt7v1iA qp9qczc4gquNg9G+lUxjc5tsFtj2Bfyht4WHXsQIoFnga4kEAcgHaeGJ9HTZWl/8RtQjJACP3bbs nOBEpTLVhH1PYcMAgrlzE6Zettyk0kRmuGDnA6HKQL6Iima7bu/YFhMINDmcwoxbdWONggsm3gim En8ufgSHQgaKxiwvCDF9+IO3BWwKisoRF7/lT8CSL1Vx5C/27PQ4yG48xRBAxOEHA5KSfeRTyp8P oIDF7/L45HVaMZRf4B/0aijM5UPsvgILt/FTehffQ5Np5pwZnS1F1eScQdCwcwsZrCoibKJqsADA /Rh97DyPhp+e+kcvfu2xA0d/cXrmucMn5n809WsH64unw6iOBU0dBP6QhCsBhzlmdDZPxjbmvDk/ GXOgBAEQjlfIhnPDIMA6hZ9w48t8I1AAGGBIj1x/yv2y57Lz574+dFhVfWSyWoKOgQFkm1YtiuBk ldG5qsxfGA4kWuZOIVNAOvCQBZ7SP+BEoCF0WDjYPSfhq3fdGZFhgUvfSBG7evA3cffI9BNThUdO IYKI7CwqRHiLQj7om5FxhEAB8j87Dsek1qHxExJNwI9Qma/TDPI4OAQdBmbEVTP8aZhnGU84FJK8 i8CI377wTFZSM2tdFpsBMCqDMMj4fHUopsCl/CP7AKUyrit12R6TofwoobyJg7oy2iW43FKvnOGe 0AEuV1fDKg48X5K3UDWriURFuJgLgsukglF1oRzsJM2u1WaHk0JkESa8wv1DN6CMBCpnZxCfwwPl F55CNPU12EqS6yj53V4xvxKPSIwAQ/Nr8A6SjTAmlQrBbLuYa9cmxgozL1u+q/d5fgyuMj2wnBmG EPt/Z893DUHfB1FI71pk1NtHN37JAM0fEyNK6n6o3O6Rz8QrvswWEPaX0212YAHgOAFCBO0ux/S4 f2hHqXAIR7KBIICEDE1NPdgKAQIRHBLG6+1KFBWwnTbAajP8mzqxKBFA+6ccV3ZZZ48L/1/FzvE0 pjUy3COk39jrIMAd/qV8ozi223utj/cFeX5tAeERcEhD7JXAf83Cyt2dlPID0Uw94HLgBbcicGJ5 m3grckjBW0XrWPUFG/pGD8pDoIyJowxvrfFJieHRELSFM38OPtpp30SnHAHYi4vx6LmRfO3kG5Nu rAEcayXIDkdxOLHVwM58zUZJ1W4zY68AdDl1Z88x0bED/oUuyb43sgBkMIXTNH5HiMUw8oA8rCI3 Jk5CPBSi3/3nna7i83Fyumh2EkF/upx0rGAEiUYnsdKwTTNjMbEm94yTm5kpdA6DABTAiMkUK0Se P3cU+nxt3DgtB63abARGbKgkIUCGJOqBO1PY+6AJZMZlGFke5iOsr2MvFWQv5s6j4msMxaG/W6h9 MgfiZXbvQkMPMP4JUECIJwy4g09vwPlnKKX82HJbGlqBGhYbAyd29iEapFcU+ImYsQMc4A+XzJmX Zq/rFAgVPZgZQj5UrOT2of5lAH8YWqHfpkWKgb01le4sjd8bYt2TzRMlHJXGJmEdQGcLAgVgPAAg IAZjKU74v+nt/Uz10P8cP3Pu9VPfP33iXO10FXwSBsvztpUU8nsP+YznhSCAv6A2mIn+Z3DmA8Dj vZD/caWjMRJJB5YCEq0GTIiEYB6eCbcJUe3cMANof6YZaNOKg4h2ECLeCfZWVM9l2UhX289nZUfT 71geMsO+4i53RnGHtSbqQcXqia27xurJWxH/w0RuC7HnHFkQZNeaAC4GnCowIAl+0Y9OVncfO/9J bBmm6IG1i0dogwCbsN6WFbczmscsyGZkEL3UgiOgbpS4lsYYSkMnznM99AX0QDpgtuhqItmPF07E JnxbL+VHIY0pWEuuFwDyrhOkar5FW2SsVBgEugbRnwIOAuI0lSJxkgPrMzp+CMwXNNPGI6CEIcL6 hCxJs0hGP+paQ5nHGCJBGUk+DsS/SKV1Ug38skRkQZculRia5UZTfpJaeRhb4FVVX5LBsXZ+5Erj xrWoVS3fV84sWXkmlb4kg7hOOGdaTLKlc2cRBEqEq/WSmEYhxmAgDO+E76duH6uW6l+4oPRVcnCM YBbmmV+gbHhW5ixV5OobgRqwjDCsoHtYTHWvjNMU4vLhelCGlmHmQv30a3On4vH6mCjDM5Ibphzo BnOJsDDwKkEFaIPJtyPR0Q2HLMKig/eCecNV8MuvCfjB+VS8j01/aDVgwrZ/pDB+PfBq0zun6f6o YC+rCqo+7NOS+CZihhjxY2BSxPCYOTOLM6ozI6mUH4MAsiYaULP+yO8grEUmoW9I1EIR4PFHUm9h nlpiR1eMrZwzZyun5wsoRtQQbRDSKcwieAsZe2yIJMDLropHRd+BMYcVpq+PHTS4tETgbwNd96F9 0iAoJF+KHxgo9I/DZTrqRW+I8zhHVRM+k2p/10MOHRZbEiATMcvNB/aV+VEO0MWVUgMTxG88SGW7 kTU66jQgC5hj4V0KLCCOkvCeem5Crarcq0bNMTG1ifUgog0AHtIZhgjrE0T+Bj0RtUtcVIVt+xBE h3y++NVIRAb5wBxsc+u7vWRuhYU6QriKh/8KmBf7acIHyFk6UYQA++MPTJx+4TRORN89Phm0A12I 2hA5MayDiYemcQwmDgyZ+faJDfyCxEBiTKN4BNPs2oGfMRYXzgEUVDCNGDYmmzCXymYj5BtOxaLh pC+FASMAZpUR1Hl8GnG88B3GNyOz/0xPR4FvTPVVDG61tGcCD0KnBWUeooDMnBf6CZwl7KU5/Wbm fHz6vPTBSHcWTjDN7m4WupGFiNi3FJe2ReCk5s5DpS1Dx88DOqP+AGQ/xNmNd5cLQzuq86/PvNxn i4TuRNC4huA2zRqt90aShBxE5xy7L42HsgYjsHrC8IEdlhJqMT3uXse6ILIRLMnCXePbwWSVCg04 C8+cNx+4fCq6dCwe/yNMIlSk6QruYtDEWwGoAUafelyFEq4OfIpW3TcYxmGwgDh/cKTXXTqW6Q1C 7siM8ATlSrAARroUccCIzZgX4D7uv4S8rT5IICpABIjpAlRK/x98BVYdDeadOFZd/fUAusXS/rmF cawWCRgbx/hYPBi9YTQFPYpGuEvVFu3uVXeNZqxjxNQwgemBgr0+KIzeKTZCvMYcZ8oE6as01BWy KfUjQXy+WnwVskwUFOo5yO1YSO1WS5T2MGa53enk9RO46mJs6sUsr3i1N4SDCoyCRbb0zn6pw2qe fuHZk2fEOIEERTk085mBgIpoajeUQxPBYAsGW0SqBXnO5YsrmCScapRG8kNAOCg8veIU9Lrunmp8 OcL4MrYkpqfXn8kNw5bZZocucTstltHBfbCQya6PXgc4dt7dxAa/AOiW3fN23LNA3Q0CEtNu/Gvg HYC8MYVYYaLWfrz2zJnd6LB7rCAEe2qzEUfQxUTsIXSEE6O1medPzS224DgEV0iE46w1xfZpDaUB ZDcE88lNjJXLpQIGC6ZQd3MkJicwKhIdPXqMwnsXR0HnioKk8HY3dpgeaoY6sDCD4APyW95IEXI8 E8C+T8KykBOghKyMwZ2uy1Mb0lAcVVcS7C+c1d2NAPWZ10bkxE7Y6oyKqzeJls4cPY4lDmTXd4cy dh8hyUqoHl9548sMGNU3kYqIxmGnZbUg1Ve/Lbwq99jofAG/QyxXU5+7F5vLSfdZguSAOceDcNez C3Lxmfr5Y/QHgaMKcCWtj+t0Soq5CVoXLWNMyEelZ4eJUWBZVMLuaZwbNIhbGOd9ewqT2OduzgIw Aim29MjY5Pyyh+1MwJKNKnW6cP5V5YirKMEt/pQMRm8MaBfxjlvVSgWQD6+eYPyPTAy/z1WgBNTN 1ae+fRI6PGy9YFxHGBZFAQMlChjU0viObdjGXUBcKq9eg/mzBDWvDzgsIqKFdxUemsWcCaor4xIU YNRlHCjuM3OjU2DyeOARyvVEIWAy98wcF/iV/rtnM/JFILMQuYEEdUyBUDH9PB1ZemIoPw1ygFhd r9Qyut6vT/2D/dgCJYG0IDsAhRdOjQ/WJ0bi8kPTh367jJnYOJIvg0bLzvzPVDGgtVrt1LdOwl+9 kHKwQJdCYw05KI2VS9hlXSjPvlGH6JRhoED0wvvEHqbLV0964Wdy1brMFCvI3qfXvmwpUhpPoYvy r7v0DBYoHYllXnDazzlv4SggoRU3YNb1dh/jtnYQ095djAT1OKrB6zZunOAWALvy0iUoizWPg5tL ORxT7aADPAsuemN4wF1icFZzd7+JqeKxI61IUCGSonhu3XM57QzwZ9rEgvRqovfBbqNiAcFxC1j5 MA9vAPwyR3fug8lZDaK6jRdIGbu/yCT2JhlbY/8PEuzIF5OWeKMhXIcZHJciomZw6WuwxMEN0gr5 EvFVgF9W0UhZDsEDbKSsisI/x98ym/ni5EO7y+OlOrT8lUo4CgehlnfnSQv8Gk0BgUJqV4PXX62c Pv96Ld0MBJJe8gvxoPgCYvnGyytYEGKbxRTGDcqukEDMR9ZX/BCcCWgFRhDaxVo0Ho4dUHrCE4tb zWqQzIKYYAW7B1RlhomzNfsVG48B39h6DVrclbnWlNlH5a1cFW6z77oRz+oXENrVMjVwCtI+GLb5 RUiSWaYGUWienJ4YgoW2jhjb8tVDZg9EvnBg37Q3NMX4ouLq84+6FP7aAT2+7uBDswyoiuGGOA0/ NtDVMCjW4Q0NwC+CGBaKODgsgWt7BQQfK3jfnolac6Vy7pzS/0z0Admy8prEv+Hhxb2+tBwuuOW6 kM/+Wwm/h+F3h07wu9cIvBEgb0xreoK5ATaEiECwYWMoYZJwd3AobM8KCTKojVcmLsHe8q7XQXMM hI0QVNfzhtCnxEF7ZF/cgPrNUmOU7PvEweIQnETkqElG3VkvuEgv8EtX75wKS5MFOIMmc6CHtv+G NrbioPHGuptc7U7WO59yw8Mo8LtfKnROrJVVvCI0HDGWVv3VORm0kTIwbq17EECrgAXgvwwzBwyW kdmWK9IQRgxqf0MqSfBRjBYwhtYFIAV4BXvJDE0UhoId5fHdD03ES7OVVxHhxyQC/7EnraiJ/ZXU WMDbF5r/ufnaubN2LarplWKYfhsmOEafxEG7a9bp5wsNE1wdhI8SYym8HdMeg6giBHjpCDRzsnnO Oe3QHTWX8uPUzePfnt3nVSdgCPnFo9QCAutUv3/umS+ePImRkahhQruk/1HVa4gzUtdqQ0wBXyJ7 beA6Mv7gxBT0e816dcnQZ4SZgyEu8XBA4qFfPAgv1CPfKBOXgyD3xtKgrCGh0HGgWjqY2MECZ1bA Pzwd6btCxpJXHUzY29EsApEpC0Bad9147/qNDB0Dnl/WtJEFrftgO6LYz3MWcO38RKUUNaTnmNr2 xCHUzKzOL0m3NLs8o7DtjrCMmIMCMrd+up+Z9ZZpZGrP1O7HDogGewlYtNLydlMPgkWFQ80zE9QX +FEZsl7mQEoyxuKZdiFrfMl0AFsS4Kqka5jhSaElieEvADrXmpXtJE6EKz4OAlCNoLSTV8igpShA YRhoEdx0HZtujH+qTcayALCC2R8KY10nyv9n+qaQLycdjBXLO3dD4VfBKOGlVyNv7I8kgOfUHa8s XxmILi4sXPGajfo8ZNMfNedfQ8jkaAkEHud+mZiTmnHfgXsJ+L20CHlOPyr72Ix1pRmveW08i8Oy oiauqAiUifhCAziJ6eJ3gtxoEpQRhhGHW+XWYu/mTrhF1ORJbx9/RA5vw1lXz//BTHhHcce9Jf+O HQwQKgrwp48f+4Ovx5cr7cZ5iKLmej6JanyXm5Jr2A5l+7DuQrwWD9wSNP8/LXhRLzebyxeb7bWB 3JVL1TdhLUzGS+H0+xvLzSLOpUJwzhMv+c2mHEnIY/+gOvrOd0Vge/j2mcbFRvtaXHvzEgbzwptR /fLV6C+XlhExxYyMDFp61Z4A4eIP8ay0JBjaPhgimpUNN7pun9MbZ+YkNGXcPOVHiygD6QZFkGPb 8oWBa01vS4D8yubCQNLGn+RB7XCk4jXMjmSQhJszcSC9KwL5Ynhz5hejh3HGH8e201GnZ6KlC0p5 Z0lct9sbVMBa8s1A9U1AlxOPHsgPDibY5ra5ODwQtC+fTxrfSHL3e5tDThDOxuKhXVgq+Al+sPn6 193WwHPl3xl6N0tgWy1n/uo14Ml1VBpp1ejyUi78sL9llGe08fiw+C+OB3/5W1H0Sh7ur4zCzQSJ z/yEII/o3AioGa9ukpXQbra9t0U5Cd4/8PEndS9GoPy+L7p9XOVxhABdA68k84grCu1EtLHb5D2F 29AAYnXmZMZN8gt3geYjE+bb2983UbzFB4qsX5RFGF/DcTafFsp/ABT4agQ0g6NaYP1vLSHOrBzh el3r/QbTBoSN6NQiHcQISt/BXhhr0S1xIGBeBqkbnVrxbXx4Ngi+evqBGFs4wWZDlXLy14TtB+XH wTJTD5VhkVYj9uH/57FnvtTHF3qDjm18iw4wMjqO4zT8GQBIAKFDT0xO70N4qZW5mjdT3VFri9+L 9pkajcmR46WkIjswIhxuFtUuxa1F7F0XBC9+EUPwnMNZbg0AnuxdWV+ZVEAfjEbKDX9E7dHsvMyu hO7EqW/O4hQFsgnRKbsb1tmj4TLz7LlQeGNGBicSpaRbvDlSbu4nHUzpudPgT/q41nct7X0bGd8z Vbp7AsYnnFHvJa3IuEWDrAn3jsB1o4d7A0bSDqKtyb7PUqjcfuYtEP41/iIXxnqGrfKDB71RkW1F el96GipS8nfSIZMwJhDa4RRLLwYdZ9zCvoaNV8KND6CMmIk7KDt/jS8ggL+IKK/FwsSDUziUqzo/ i1HiEFmFX7ktOzfPwTfFwLwm6199A1G9evsnupCRAj7MHS+g6sK2koK9HZcitCYhZqse7Ii8zmEV vAv57anHrLJajwaAbRJkf+alU4c/d5SMmY7yjY9Ub81MPCIAqgQpRfyJM3PK/h38xQNTO7GzXBaM 7EtdKdUbk9QOImHvykh0QhDo1SharrUaLQvwpRBuEWWch7UNrqzQ/NfnXkXADFH+b9xhqiqgPYou xYgGldk3nnlW9CmVz9YhhK+/O4t4QbEDIV/FkL+VYfybTIEDKpIlyPW1Agh1gcPSaKl0r5gn5r4/ IwvabHMfGQom7sR5RzgeEsbtiTgPVxxoYUWF6UI+WijvHLeQD2SRZI1mqu2TbkD5D4VXyqj3fqOV 2ihebZyM2CVVABzpdODX34TW9gVAIAICP7i4SRiVdovIBpVf9YJoNyzwY5sdVNBiB6Y1GFccAIAt xAi5W7DqtKjZNTSKFzYQyQBLOm2cRaGfwEaI01oIxTW4WCzDlxOxGgq50lgpvHN8vFSs+yO1qHSu KsdgQYcPyJeTpNIBxRlhreVqadsIzGQIN1yrzKxAx1ydiyuzreEd1asraF+CiyGuHDCcscPf4IJW mo9OonHhvKLW1GNTQIinXphxjXBYc9M7EbxUwm8BjGXlLSL4XI5eU3gQft1i0gP6k6gbU/JpqUcd N+2Av3vxzNxpBErvt0oKRo1CnU3h3mnXmC/gjWNRLp2MYfLJRbCnUsfBhIGgYo/SOwYfqIcZJcXY bc3oBsrc8cO5Cq+LjDZe1X/rdzmGrh5EXzFyr/ELwrEfOG0IxqZ2C9fxu+GfH5bHxst34pgzINka ooNVK1XsPXm9UnG/DouzeGeX82Wm81jhJF323J5CDiAES5YSatXdEBa4vDnytLCKFtxoXhi9ukuB aoSsvwlx7TvUthtDBUAxgVfAljvHh4KphyYBdeD8a2BFFfjhY1fIr2AQ4eEvB3el3Aq+NgyBN2Q9 IZ8uMSFW0OSz62CNgCwsCgBKM9wsJgwUHjAAnh/+QxwO6QHtzOB+4RoMUeTOMASM4bSaO0Ph3u6D HcjiGixxwLxIXgUc/SEjKhEXl8W8UVuYg39R+b4dncqNWvD7h+O7J+NHDuKcWcjNEXDBy8djbDra vts7j6CL2DEuPZAtPCMhOpkhJi7ky8G+hj1jRLO+LBkilx/6JXDXK5BEztVkQXBh4aMAXdr+U09M 7v+EZTJ1rx6GE2HqTpzJkn2QDpUF0I682yTo/GHVh4+r167WXhMXFC7HjgLPXQjpFBCemVTLCLQF H35hPIAx05qoAMoPNAHt4HVjQrmv+rvLu5/fl98Gu05ChT5g3U4IV1UI75zAVWa5Fs1dEJwIG+3I tlI4HNaXXv/sbzyLTVPsMzR8cjal2H3tMGM7gJ10c+4NqCWuWNtiXAGaECAQ+x+ggHmueXcEqDLE LYE6kzJMFumBa6dAHeHRQF+DYohDZQ00AVx/ChZAfDoMgWGvBFrRTcP5w0wAtkWOHsJYmXBdhGhL +RFbHq8s3bu7PBZarGC0nWyFbAMPdZZkWsFPjEXXx+sj0crePRPlnVOzL5/M+PyIhM+jIFstDOnE A/ATCMvjU6V7YeHsgL1sMYYzky9aDV7rF6oa11264OfwiGAH41AlB3K9dCK4MBs/eTi4WyJ+xM89 E7x8In7iYPDoofjCOe/MyeDcMUSDrxR2eLunYGaDag0sA5TwCENYW6jNXRDEDGwdjoh5EqcJm9mD R9K6bDlgdT21iEwCvIweLB/8pb2g+QB7vBHcvownIB/G/25WArtoMRpVuAAYSQH1lKqQIecqYWfo umOTQab4h0dwRU27blLAptjJBYEWhAEpFGvfn0NNigZsU4m/K6a6k/tfJk/Y6PqQfi+WWIyw7SMK vRChIqQwb2R8BNrvuFhfnAPkg+OLFo2aCaIBKN6eKTA7T//Gl7GdHM8irgxjYLXacLTCqTctyGiy 3c1AL7AAzdWEfze53K5bbg/ANi2QgyY/r6kL4HG8L7cDgK3LY0O8xCwWozj6BODH4Zg4NWd94cJ9 r10JabgavSUISDi7nNpxlPnHR0FQsiwqnXxA+WVxDAmd7/RYCb4Be7Rl+2pqwPaoP4t4/aAhzsY6 go+HYWxy52Ttqhc3qvT805QOMXyYJnc8MD6Ok3/ygkQEzgXJFDUwHok/C0nPAf9QFubuLJMXYJIw RDiiZ7kWPHfEq89GDx2Bp0Jh/oT4AD/5heDRz4ovLRzdL7wuDmc4INtgB2diGsf+zcnjf3hKpnCw AMUn8TcRsCgpBFMgJokZBPfJDfN48Av/+OCOuwuyVU1or30URPfYN0+7QgQgH2Fw4QsAF2BdMRR0 CfYyNYaMoz86331fjsHB0ilwglJNknm74V0N/+9+AgpJjohi/mux/YqblPVgx/p+I27tfWIa/Iuc Js5k9sx1wB78GrRU8jkrOMeqMAShUmrNvDADlfaBJyYhF0jsQLFjBTDvgyR4CUQE0xoGHLhATrwR psBdErjZIYTgZJN6hvK7vSW0d+RonlujybAGYq7rBn7qLBSIeNpNvJg9OxTSCuYL3wJ/fLhLs1UJ 8REJ8y7uCQr8dAQwZF+BVCyIlE8V+NkPAH+9HlM9aCk/wMC4Flngl4cEVwE2pFGTKHTV6ytUmfDd O8Z2lO8bh1srxG/xr8ZgwWiRtIgmDzw2ObVnWsC+vYLbxDk2k88RXGXHAUzy6VklcoqrHOUE8JXA YUAKMoLmjFc5zARK9Ddmgz884oHOw+APzj8Jqp96urznALGDVEsi9xx4Hi4K/flTn3umYaypcGas JWbsDM0Hk/z05/aDMfGW6jgrhL4PNIt4i7CDtrw4h7gKepCpTi4gH6L+5B5RRCm3j0FAsEpw+5lz 0BCGBHwQWA9X98OmSAbBdirkW27f3DWfJNCe7mDBfgFxR1Vtn0oiAOxeks61q5wFOX+U/JcX+0W1 AR8QUBdsdkqPhF2P9f3kk9MHntwfNWsyC7IC6sZpEqvBnv+hsyDwbFAA6TyIEJzQgTVgZ6tfwqEX EoJKKuOAsASnXAVBu44KpiZIkVldxnnGeLgG2FQuAr84sHWuGe6ArAEnzg6v4SY0CVEhKy6VDDfO ZEDPNTpQylBeA3MtYhqCPhnHOTfJltCrdXigANeYRxC9SjovAgtGyPDphGjZGkjlvYH/FPhx3NXQ OEBNOXzyIUAEHclBJHaIOkWMghAljItQXfE3Yu9lv0EajopdH98prtdi5TIOv6R+IOwC+bg1Ys6E 52nwaTBjS8ZhJTY0H7CtpxQxwyuPxxN0kCIOwQJwQgP8v3QsOg/XvXguXy59/njxvnFiEPaTGXIT 0n4hnHvp9DPfmkOgaGW6KMCDIB/50hGcRM5zh/Vqxx04K4oasIy06gUgBTklFUa46NSZ2bmFFhhR fCNMcfJm89UC+c3WiW+cxi7DrqlzeHJxyDEOdjGGERYBw2u4iwmaFDNzWAkYRssUULnImhsw7Uqm FKiondbIWeKsaRRUN3L4UuYTen9aYj40ggHfWI9AVl+8ULE0HZNwL/ADF2O/WbVWJXdTemiq5MvB Xrq6KFtBTwWAZ4a7xfATG9UZKw0qqI6zo4ROiuu5sqwn+qRjsozaX9AB0BDstSnkY7koCjB9ttKB cWYXG94GY0JPYbKTADR5i3HXk/7kBR2A6XbBhzBfGgYxipW2yxzDM8ckFkJaAa+KT1DwgTJPdgYg PISpAGgqFErQewo0wekIx0CnSdAlPfyuO5d/X+HvR+DvR+D//0bg/wc2Yd5/WDYb3AAAAABJRU5E rkJgglIAB/AZMQAABQXuDDYPNLVsc7RYGs5FIvkg/wD1MAAAAQAAAAAAAAAAAAAAoEYd8O0wAADu DDYPNLVsc7RYGs5FIvkg///Y/+AAEEpGSUYAAQEBAGAAYAAA/9sAQwAKBwcIBwYKCAgICwoKCw4Y EA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsO DQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7/8AAEQgAcQFUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//E ALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJ ChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeI iYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq 8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQH BQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJico KSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZ mqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/a AAwDAQACEQMRAD8AxroQCxeV7zyJEztTei5/PmsubVbJZV/0zdgDIVmbJ+grbi0/T2fzXtogx5LM qnJ79asxQWtvgxKi4/u17MsNVcm+c8z61BKyiZ2j3f8AbF2NPtNNllkERfeyOuVB6/e962o/COqX KNLHbNDsODH5zBmyO26otMuxbeM0ka5uodunt89tHvbmQdR6cV0d54pmtYQ1rq95M+cMk9nt4+uK 4Ks5wm48zOym1OClY57/AIRnW4Rj7Nc4Hfylk/kKYdO1SE/PaOQP71kR/I1t/wDCdXIOJpImPo9v /gKQeOgx4i0/35eM/oaz9rP+ZmnLHsc+zzRNiWxh/BXT+YpFvYw3zaen/AZFP8wK6yHxD9vIgiaF JX4TZfOFB/4FxT2sdfmt1VRbTyhj+9UwuSPTB4pOrP8AmYckexwF08824QQyxsTn5dpwPwNV7KWU TMJ3kOE5DKcA5roLzWTmW3mtLRpI3KO8cKhlYfTinabq2mlPs11piS+WMlgNrtyepBGaFUn/ADMf LHsV4riyKDMkGcchsD+dTJ9mk+75DfRlNbPkaFMA6xXEGefvEj+ZqpdadphI2b5QevyqMfmtHtKn 8zHyx7FK6jSOzmkES/LGTnb04rMWzTC75LhicceYR29quatYWFrpV3NEZUdImI4UAn8DUMbholbD KQi9/b/61d2DlKTd3c4cX7qVh62trCwJlYjoMuxz+tTJDEckZbHqMf0qFSrMw2HPUkt3FPjljYhS Jc9CdxxXpqTWzPOdyQWsIH3N3fljT2jjAJ2DgE9B2qHzk5zGwxxy3XmmrOjWkzBFi2ofl9eDVObt uJRNz4drod54Ot5NWUSXTyyEyONxxuOOa6caB4cm/wBTNbr6BlT+orzLwrIkHhm1LI+MMSRjHLH3 rZFwR8w3r7bc1877ap/Mz3uSPY6q78M2yjFmLKV/7o25/LpTo9HuLWNC+lWk4Kgtm0Rvw6A1zH2u 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 aprqzT1TVb/W4rVru3gjFu7HzIyfmOMYAPIqeG8EekmEcE5Od2AapPIhtEiHUf1qAv8ALtPQmpqV HK2lrFRikMblzUZHzCnH73FGTurFJl3RQ1A4mT/cHf3NFN1EE3C4J4QD+dFfRUb+zj6HnytzMgoo or1DmWwUUUUAFFFFABRRRQAUhoopPYYtFFFABRRRTEFFFFABRRRQAUUUUAtgooooAKKKKACiiigG JS0UVRCEpaKKXQa3AUUUVHYvoFFFFUIKKKKACiiigAooooAKKKKAEooorRbGEtz/2WIAB/CbWwAA BgbMBSoCPhKyDZjIXdW8abSI/wB3WwAAAQAAAAAAAAAAAAAAAG4e8G9bAADMBSoCPhKyDZjIXdW8 abSI/4lQTkcNChoKAAAADUlIRFIAAAFUAAAAcQgDAAAAvVqrtgAAAANzQklUBQYFMwuNgAAAAAFz UkdCAK7OHOkAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAL9UExURRgYGBAUEAgMEAgYEAAEABAcKRgk EAgoAAg0ABg0CBggIRhFCCEcISk0GDk8OTEsKSkkITEwKSksOTE0MTEsMSE0WjE8Yyk4ayk8hClJ GDFZGClVECFJGDlBOTFZKTlBQiFVUjFJSilZezlJayFFezlVlDlNlClFjDlVrSlNrTFdzilVxjFd 5zlpEDllKTFlUjFhczFpnDl5hDlltTll1jl1zjFl/zlt9zlx/0I8KUI0KUI8QlJVOUpZIUJVIVJV UlJZWkJFQkJFSkpJQlpNUlpZWkpJSkpVc1pdY0JNc1JdjEJZjEJJlFJZtUJdrUppMUJ1IUp5IUJl WkJ9Ukp5Y1pljFptlEpllFJptUJxtVp1rUpltVp5zlJ11kJp1kpt1kp590KGGEqKIVKaIVKOQlKG c1qWc0qSnFqmIVqmc3s4KWNVOWNJMXNFIXNROWtdUnNZQnNdc2NpOWN1OXNpUnN5SnNtQnt5c3Nx a2NlY2tpY2Nxa2Nla3t9hGtxlHN5lGNxlGN5lGt9tWNt1mOOOWOaOXuGUnOGnHOWnHuGrXOWvWOO vXOGvWuK1mOC3nOW/2uO/2OK/2OqMWu2MXO6MXuma3O6c2u6c3vTOWPDIXvbQoRdQpxZa4RhSoR5 UoxpUoR9c4R1a5xtY5yOUoyCWoyWe4yGe5yWY5yenJSWlIySlJSKhJSOlISGlIyOjISGhJyWhIya lISWtZSatYSOtYyetYSe3oSW1oSe/5S+c5yinJymvZS2vYyqvYyivYSi3pS2zpSq3oSm/4yu55yy /5Sq95THvZzD94zvQqVZKaV5a711hKWCa6WenKWahK2ie72ulL2ylK2urb22vb2+vbW2tbW6vbWu taWmpbWyra2utaWu1qW6/7XHva3f1r3P/73T/7XH/6Xr3sa6pc7HnN7PlMbDvd7XpcbHxsbT1s7P zs7LxtbT1t7Txtbf3s7b/87P/97n9+/breff3vfrjP/3jO/rvefn3v//zu/3//fr7+fv9+/n5/fr 5////0qV7GQAAFfrSURBVHja7b1/fBvneSdIWo1S0yQAArISJ1HZ1JUtS0q6uahDSWQCAhAgKG6b NFs7ri3LbLLdy67S0HFozwAEJMe3V0euHYm7t3e3l40DxiYygx8zkCjZPNCxa5m53OUMksLPASRH UulDQYAiw2pvdRQdfe77vO8MCNpu95/9cwcgCJLgYOY73+d5vs/zPu+LNuG/bf/VtzYhW1uo1+u1 em2hVm/UWrfcmfzFQhFboTRVulicKK7/KY8bbVXjmflzvlatmq+p1/K05fJF+lZbXKwv1uvVhWv4 nsvqcrZazOL3VfYiPOJ3SkzBa8v5PJ4qMv0v/XOumGP7od3Xb5nbarmi63FR1LNZ3LM6toqcqfBn uj6h67Kc1ad0GbdMGm9XyMpKPFvOYf9Feg96R0Vn/873gf/FVilny6VKuVAoF3KFYiFXxmtzBfqH cr6Ak8HD+kFX8/wc2W9qeQMNgFqpAtJaAxisb3VCplE4WwSmhYvFi4kvJfMAtV6tcvDyJrQt3/Mm svy3jXqtkW/ZaoTpYqNYW7y20CgCVJyLXsbBF9ix5oplnLSi4OjKxXxWjjFQOaS5Ip0M2/M6qDcJ 1KQYJkD0ip6V9UoWoBKg2QyDNaOb36bwVckVFEUtl+kK4e0YtIA6my1ly8ARX2wrZCuFUjlbKOEP 5UKpYGx0fYsEaKGaLxT5GRUK+BX7k4EqQGZoM6aCqIuEKbvXDXQXarXCGUbTYvHixLGzeGhhaiuA rTAzrhrPAGttHdTGIjYwtYF3a+SB6LgmqlpcTQFJfAFQNa5pakqWE4S3kkgbNKcjJ7KyfS42QV0p VfR0VBSJXDrdgC64mSVYpxicMidwBj/JjKl4i0KZMC3SxQJC+C2jaZYhyp9yutKtUCngn0xUCT0G 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 iwAAAABJRU5ErkJggmIAB/AgOAAABgbGOn+vV0oQMYY5RWQGq6Jy/wD8NwAAAQAAAAAAAAAAAAAA AG4e8PQ3AADGOn+vV0oQMYY5RWQGq6Jy/4lQTkcNChoKAAAADUlIRFIAAAFUAAAAcQgDAAAAvVqr tgAAAANzQklUBQYFMwuNgAAAAAFzUkdCAK7OHOkAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAL3UExU RRgcGAAEPAAgIAAIDAgQFBAYKFIYMHM5PDkxNDExODkpLCkpKCkhJCEpOFo5PFIhLEIpMFIhOHM5 QUI5QWMxQXsxSZQ5TYQxTa05WaUxVcYxXdYpTcY5XcY5XecxXfc5Yc4xZf8xaf85Ze85bf85cf8x YedKDAhCEBBKAABKJCFaJClKTUpaXVpCRUJSUVJSRUJSTUpKSVpSXXtCTXNKVXtKQYxCWZRCXa1a Sb1KVd5STcZKUc5abWtaYWtScWtSZYxSbbVKZbVSaa1KadZadcZSbd5CbedKefdSeedSee9KcedC bf9agv97BABrBABrIBhjODFrOJRzOIRrUVJjXVpzUVJ7UYRjQaVzdXNrcWtrbWt7fXtreXtjZWNz bWt7ZWNjeZRzfZxjbZRzbYxjebVjfd5jfc5zgntzgrV7ir17jsZzkt5rhtZ7jt5zjt5jgt5riudz lv97nv9rju9jjv9jgu+UAACMAACcGEKcJCmUMCmUODmcJFKEKGuMKGOcQTmcTUqEWVqEfXuEZWOU bWOMcWucdXOEbWuUjoycnpyMjoyclpyMkpyEhoSMjpSEipyMhoSUnqWEkqWUmq2Mlr2Mmr2EksaM ntaUnsaEms6EltacsrWcqr2cpr2Uos6cps6csv+Mqv+Mou+tDBC1AAC9AAC1GBi1EBi9GBi9CAil BAi9FBClDBClECmlFDGtDCGtGDG9LDG9JCm1NDG1XVqlWVq1UVKlYVq9eXu9ZWO1ZWO1fXu1gnut gnulnpy1jpS1mpy9goS9vr29tr21trWtrq21ur2lpqWtsrW1rq2lrsa1rsaluv+9w721x/+90/+9 z//GAADWAADGFBjGHCHGPDnGNDnGJCnOSVLOVVrGRULOaWvWeXPeZWPWcXPehozWnpzWjozejozG jozWopzerq3WurXGpqXe397Oy87Gx8bW19bO19bey87Gz//O2//e3//e4//nmpzntrXnx8bv087n 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 EGWlGG2lEGmlGHWlCGWlCGmlGHmtEHWlCHGtGH2tIUlaMV17KU17MVV7KVFjIVlrOV2UKVmEKVnW MWV7OW2cIW2cKW2cMXWUMW2UMWGMKXWlIX2lKWm9KWWlMXneMW3eOWXGMX3WMWXeOW3OMWX/MW33 OW3/MXXvOXX3OXnvOYKcKYKtMYatMY61KYq1OZq1OZK1MY69MZa1MYLGOZLGOYLWOYbOOYLnSkmM QlmUWkmMSlWUQnWUQnWcSnmcUnmMWnmMSnWcSnWUQm2USmWMQmWMSm2UQmWlSnXGQnXWQnXGSnn/ Uo6cWo6UWoacUoKMQoKUWoKMUo6tSoalSoKlQoKlWo6lQpKtWpqlWoK9Sp69Wpq1Qp69QprGUobW UoLeSprOQo7eSoLGSpLWSp7OWoL/WobvSorvSqa9QqK9Wqa9UqrGSqbGWq7GWqbGWrLGY22Mc5ac a46ca46UY4aUe5qUe5KMc4qUc4qEa4KEY5qtc5qtc5KlY561Y4r/e57/c5b/e5bnY4bvY47/c5L3 e6a1a6a1e6q9c7LGY6rGY7LGa7rGe6L/lJ6MjJqMhJKchIqMhJKEnJaMhJqllJ6lhJ7ehJ7/jKKc lKaUnKKMjKatlK6tjKq1lKatnKKtlLK9hLK9lKbWnLbOjKrWnK7WlK7enLL/jKr/lLL/rbacpaqU tbaUvbqUta6MraqMraKMrbqcpaqlrbq1pbKltb61ra61tba1pa61rba1ra6lpbK1tb7GpbrGrbrG rbbOpbr/vcOcvce1tcPGvcfGtcf/vdP/xr6U3r6MxraMxr6lxr7GzseU3tOc1seU3suM1tO9zs+9 1su9xse9zsel3tO11sul1tel3sul1s+l3tve1tfGxsPGxs/W1tfeztPWxsfOztv/xtv/3uPW3uP/ 1uP/59+959u959ul79u179el9+e97+O99+/O9/fO7+fO9/f/5+//9/P/////NMmoOgAASehJREFU eNrtvWl8VNeZ7tvnxuWad9Wukno4nT5NWaTKkUPO1kCNmow650gGQ5x7HMBitNxCSkMbXWu0LpOC jC1IaLsjEZQmSszQxnZy0wxCJg3IoCBsbKaOg8HEgnRsMJIDyEnsjoDffZ/3XXtXCTvnng/341lV 2vOw9n8977DWLuM/Mf53USXvf7r6v7DDKn9iTLI7Pmd32Kl4MPWGaObBx+Pw2L0eu+bw3EUrHo/m 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 ZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJ ytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3 eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna 4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9TfskH/PGP/vgUfZIP+eMf/fAqaigCH7J B/zxj/74FH2SD/njH/3wKmooAh+yQf8APGP/AL4FH2SD/njH/wB8CpScDJ6V5F8RP2pvAXw9lktW 1E63qaHDWelASlD6M+Qi/TOfaurD4Wvi5+zoQcn5HFi8bhsDT9riqihHu3b/AIc9Y+yQf88Y/wDv gUfZIP8AnjH/AN8CvFfgP8f9R+N3ijWY10eLSNG062Rsb2mleR2IXL4UAYR+Mc+vFe4VWLwlXA1X Qrq0la63tfXoRgMfQzKgsThneDvZ2tezt113IfskH/PGP/vgUfZIP+eMf/fAqaiuM9Ah+yQf88Y/ ++BR9kg/54x/98CpqKAIfskH/PGP/vgUfZIP+eMf/fAqaigCH7JB/wA8Y/8AvgUfZIP+eMf/AHwK mooAh+yQf88Y/wDvgUfZIP8AnjH/AN8CpqKAIfskH/PGP/vgUfZIP+eMf/fAqaigCH7JB/zxj/74 FH2SD/njH/3wKmooAh+yQf8APGP/AL4FH2SD/njH/wB8CpqKAIfskH/PGP8A74FH2SD/AJ4x/wDf AqaigCH7JB/zxj/74FH2SD/njH/3wKmooAh+yQf88Y/++BR9kg/54x/98CpqKAIfskH/ADxj/wC+ BR9kg/54x/8AfAqaigCH7JB/zxj/AO+BR9kg/wCeMf8A3wKmooAh+yQf88Y/++BR9kg/54x/98Cp qKACiiigArlfiT8TvDvwm8NS654lv1srNTsjUDdJPJgkJGv8THB9h1JA5pnxU+J2i/CDwPqPijXp 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 CwABMAA0AAhnMQA5AC0AMgAwAOVlCk53bQsAATAANAAIZzIANgAtADIANwDlZfFtM1cSAAEBTxpO 6X5IZQOAOGgOTqqFbJFTT/t8vouhi55bGGJ5cq2L7XMLAAEwADQACGcxADIALQAxADQA5WV/Xt5d CwABMAA0AAhnMQA5AC0AMgAxAOVlF1OsTgsAATAANQAIZzEANgAtADEAOADlZQpOd20LAAEwADUA CGcyADQALQAyADYA5WXxbTNXAgABIYXNXREAAel+SGUDgDhoqGZLAFAASQArAEIAUwBDAJ5bGGKt i8N+JYQLAAEwADQACGcxADIALQAxADMA5WV/Xt5dCwABMAA1AAhnMQA2AC0AMQA3AOVlCk53bQsA ATAANQAIZzIANAAtADIANQDlZfFtM1cNAAGXXE1PBlKQZw5OqoVskb6LoYuhewZ0+VetiwgAATAA NAAIZzEANADlZX9e3l0IAAEwADQACGcyADEA5WUXU6xOCAABMAA1AAhnMQA4AOVlCk53bQgAATAA NQAIZzIANgDlZfFtM1cPAAFGVaFSbFGHZZlRXE/EiQODDk6AYuddnlsYYq2Lw34LAAEwADUACGcx ADcALQAxADgA5WUKTndtCwABMAA1AAhnMgA1AC0AMgA2AOVl8W0zVwIAAVpTh2UxAAGzUqhSCFQM VKKLy3oBMD55Gk/dT2mWDk7lXSRPATDEieB6NlKmXg5OWFTlXUtijFEBMAOMl1wDjKqFDk7BiFhU 3Y+qflhU5V2hewZ0Dk6zUqhSiU6uiwRZBnTYmqd+sounXgsAATAANAAIZzEAOAAtADEAOQDlZQpO d20LAAEwADQACGcyADAALQAyADEA5WUXU6xOCwABMAA1AAhnMQA4AC0AMQA5AOVlLU5xXAsAATAA NQAIZzIAMwAtADIANADlZVtPcVwLAAEwADUACGcyADUALQAyADYA5WV/Xt5dBwABgWhVeFdTATCB aB9PQ2cJAAE0ADAAMAAwAAoAZWcxAAGQMQAKAAE0T2BP2JremFQAVABUAPxb7k8CWAsAATAANAAI ZzIANgAtADIANwDlZX9e3l0DAAFOZ35nkJgNAAFMiD9l5V1cT99+eXuhewZ02JqnfhR47k/tcwsA ATAANQAIZzEAOAAtADEAOQDlZQpOd20LAAEwADYACGcwADEALQAwADIA5WUXU6xOAgABWmkpWQ0A AUyAGk5iX2GMUVggkA5O2JqnfkZVoVI8eepOCwABMAA0AAhnMQAyAC0AMQAzAOVl8W0zVwsAATAA NgAIZzIAMQAtADIAMgDlZfFtM1cLAAEwADYACGcyADgALQAyADkA5WUKTndtCwABMAA4AAhnMQA2 AC0AMQA3AOVl8W0zVwMAATqNh2VZlxMAAdiap37YeWZOATCpUgZ0jFRMiD9luk5YVIBi/YDQY9ia rYvDfiWECwABMAA1AAhnMQAxAC0AMQAyAOVl8W0zVwsAATAANQAIZzEAOAAtADEAOQDlZRdTrE4L AAEwADUACGcyADUALQAyADYA5WUKTndtCwABMAA3AAhnMQAzAC0AMQA0AOVl8W0zVwsAATAANwAI ZzIAMAAtADIAMQDlZRdTrE4CAAGXZ2lgCQABNAAzADAAMAAKAGVnMQABkDEADQABDWehUg9hxovK U4Bi513QY0dTbVF5mK2Lw34LAAEwADkACGcwADYALQAwADcA5WVSl5tcAwABi1sBgAheDwAB2JpI Zel+SGVilwiMjFTbYliAYpfVi55bGGKti8N+CwABMQAxAAhnMgAzAC0AMgA0AOVlUpebXAMAAZOQ AYAIXgwAAVQAVABUAC0AAU8aTrKLCF6IY/6LgGLnXQIAARBVc14RAAH6Xst65U4Al0JsOk78WxFU hHbPkRZT+Veti6F7BnRTT/t8AwABuIsBgAheDAAB+VetiwheBnQnYB1gA4AOTh9hJ2BoiL6PCwAB MAA1AAhnMQA3AC0AMQA4AOVlF1OsTgMAAbiL23ZOUwgAARhiZXW6TptSRI2QbqF7BnQLAAEwADUA CGcyADIALQAyADMA5WUXU6xOAwABGFIRVA5mEQAB+lcaTjheUpcUIBQg+leOTu52B2ihewZ0hHbp fkhlA4A4aAsAATAANQAIZzIANAAtADIANQDlZRdTrE4DAAH5Zgpux1ITAAGwZdVsC06EdrpOm1JE jZBuoXsGdDZSpl6+i6GLDk7OmGmWxIl/kAsAATAANwAIZzEAMgAtADEAMwDlZfFtM1cLAAEwADcA CGcxADkALQAyADAA5WUKTndtAwABgWhzgn5nEQABTVLwUxNOGk5iX2GMUVggkMpTpWOFX/x+CFSA YuddrYvDfgsAATAANgAIZzIAMgAtADIAMwDlZQpOd20CAAF1jcqDEAABc15hiBhiZXUa/zhow1+6 Tk1idGUIVAEwz34lhFZ7ZXULAAEwADUACGcxADcALQAxADgA5WV/Xt5dAwABIoyHZeyXDQAB+leO TgFPGk4nWWZbhHb5V62LU0/7fPpevosDAAFIlk+eC3oeAAG6TptSRI2QbvZ0iJjulZiYhHYGUpBn Dk7jibNRFCDpfkhloXsGdA5OqoVskVNP+3x0ZVNP44mzUbllSGgLAAEwADQACGcyADAALQAyADEA 5WVSl5tcAwABbV9jgyFqDgAB+VetiwhehHY2ADAAimLemABSCP9UAFQAVAAJ/wsAATAANQAIZzMA MAAtADMAMQDlZQpOd20CAAFZW2ZfGgABCWdIZdCPKHXpfkhlA4A4aARZBnRYVOVdc1H7fAEwA4yX XAOMqoXKU92Pqn5YVOVdBFkGdAsAATAANgAIZzEANAAtADEANQDlZfFtM1cLAAEwADYACGcyADEA LQAyADIA5WUKTndtCwABMAA2AAhnMgA4AC0AMgA5AOVlF1OsTgsAATAAOQAIZzEAMwAtADEANADl ZfFtM1cLAAEwADkACGcyADUALQAyADYA5WUKTndtEwAB+leOTksAUABJAFNTio3pfkhloXsGdFNP +3z6Xr6LnlsYYv6LC3oLAAEwADUACGcyADUALQAyADYA5WVSl5tcNQABCjCzUqhSCFQMVNVsCzAB MAowPnkaT91PaZbVbAswATAKMOVdJE/dT2mWYWeLTwswnlvNZJRe+VtWe2V1Dk4JZ0hlA4yXXAOM qoUBMOOJx5aejwCQylPdj6p+7pWYmFhU5V0EWQZ0gGLnXQsAATAANAAIZzEAMAAtADEAMQDlZQpO d20LAAEwADQACGcxADMALQAxADQA5WVbT3FcCwABMAA1AAhnMAA0AC0AMAA1AOVlHE6egwMAAZ+U OGzjaAwAAVQAVABUAPlXrYsIXvlXrYsI/y1Op34J/wsAATAANAAIZzIANgAtADIANwDlZQpOd20L AAEwADYACGcyADAALQAyADEA5WUKTndtCwABMQAyAAhnMAA2AC0AMAA3AOVlCk53bQIAAUiWw34N AAG6TptSRI2QbjpfFlMtAGhRYpfpfkhloXsGdAMAASBf3I9kVw0AAbpOm1JEjZBuoXsGdGhRIWpX V55bGGKti8N+CwABMAA3AAhnMgA2AC0AMgA3AOVl8W0zVwIAAYFob4IJAAEAZ55bGGL9VkWWRlWh Ujx56k4IAAEwADUACGcxADAA5WUKTndtAwABB07MkaJ+FQAB+VetiwhehHY2ADAAimLemABSFCAU IPlXrYsIXr58wVRUAFQAVAD+iwt6CAABMAA0AAhnMgA0AOVlCk53bQ8AAQFPGk75V62LU0/7fIRn +l4OTvlXrYuhewZ0nluhUgsAATAANQAIZzEANQAtADEANgDlZQpOd20LAAEwADcACGcyADQALQAy ADUA5WUKTndtCwABMAA5AAhnMQAzAC0AMQA0AOVlCk53bQsAATEAMQAIZzEAMwAtADEANADlZQpO d20LAAExADIACGcyADcALQAyADgA5WUKTndtAwABMHXcgOJsEgABRQB4AGMAZQBsAChXuk6bUkSN kG6hewZ0LU6Edtiap36UXih1AgABuItVWRAAAStSSlTJixFiYE/CYWKX1YsUIBQgvnzGUWKX1YuA YuddCAABMAA3AAhnMgA3AOVlCk53bQMAASBfZk5qjAcAAflXrYtWexJSDk6hewZ0CwABMQAxAAhn MgA5AC0AMwAwAOVlCk53bQIAAaKQZVAQAAEodUUAeABjAGUAbADQY0dTuk6bUkSNkG6hewZ0SGWH cwsAATAANgAIZzEAOQAtADIAMADlZV9sz4IDAAHplw9cb4IYAAFTAFQAVAABTxpO+Vetiwhe+Vet i2hRYpfQY0dTCP9UAFQAVACeWxhioFI6X0hyCf8LAAEwADQACGcyADYALQAyADgA5WUKTndtCwAB MAA1AAhnMQA3AC0AMQA5AOVl8W0zVwsAATAANQAIZzIANAAtADIANgDlZRdTrE4LAAEwADYACGcx ADQALQAxADYA5WV/Xt5dAwAB1l5NiA5mEQABsGXVbAtO22JYgAEwZVFMgKF7BnTvizpTDk7OmGmW p2M2UggAATAANAAIZzEAMQDlZQpOd20CAAFOZx9PAgABSlMpWTMAAQows1KoUghUDFTVbO5PY2tI aAswATAKMABn2JpilvhT1WzjicqR21YLMOVOylMKTndtAl4AZ7Bl1WzEiT9lVnvYdrlw44n7i6hm sGXVbAtOhHZYVOVdc1H7fKF7BnSeW81kB2P8WwgAATAANAAIZzEAMgDlZQpOd20KAAFUAFQAVAAB TxpO+Vetiwhe+VetiwsAATAANAAIZzEAMwAtADEANADlZW1n3l0LAAEwADUACGcxADgALQAxADkA 5WXPgt5dAwABaFRQW/NtCQABVABUAFQALQD5V62LCF75V62LAwAB2llzWetYBwABqoVskb6LoYsO TqF7BnQLAAEwADQACGcxADIALQAxADMA5WUXU6xOAwAB0ZCbUlBbCwABMAA0AAhnMgAwAC0AMgAx AOVl8W0zVwsAATAANQAIZzIANQAtADIANgDlZRdTrE4LAAEwADYACGcwADEALQAwADIA5WXxbTNX AgABZmVzXhAAAdNiVVz5V62LCF75V62LpIvBi+1zCP9FAFQAQwBUAAn/CwABMAA0AAhnMQA3AC0A MgAwAOVlf17eXQsAATAAOAAIZzAANwAtADEAMADlZX9e3l0LAAExADEACGcyADAALQAyADMA5WV/ Xt5dDgABHE65ZaJ+ATBKAGUAbgBuAHkAIABEAGUAbgBnAAQAATQAKVkzABxZDQABVABUAFQALQD5 V62LCF75V62LnlsYYq2Lw34LAAEwADYACGcwADgALQAwADkA5WV/Xt5dDgABMAA4AAhnMwAxAC0A MAA5AAhnMAAxAOVlf17eXQ4AATEAMQAIZzMAMAAtADEAMgAIZzAAMQDlZX9e3l0DAAEQVeBgsnMK AAH7i8NfL2coV9tiWIAtToR20I8odQgAATAANgAIZzAANwDlZX9e3l0IAAEwADgACGczADAA5WV/ Xt5dCAABMQAxAAhnMgA5AOVlf17eXQwAAUyATU8GUpBnATD0iw5mDk6XXE1PvotufwgAATAANQAI ZzEAMADlZRdTrE4DAAF1jUhRH3UNAAGCWVVP+l7LehpZYo2Edul+SGWqhWyRU0/7fAsAATAANAAI ZzEAMwAtADEANADlZRdTrE4LAAEwADUACGcxADgALQAxADkA5WXxbTNXAwABxJ6HZeJsEwABAU8a TnNRLpW6Tk1ihHbbYt9SATBZdSh1ylOhewZ0nlsYYuOJkGcLAAEwADQACGcxADEALQAxADIA5WXx bTNXCwABMAA1AAhnMQA2AC0AMQA3AOVlF1OsTgsAATAANgAIZzIANwAtADIAOADlZfFtM1cLAAEw ADcACGcxADEALQAxADIA5WUKTndtBAABJ2szlhFc4mwNAAGwc+NORlWhUjx56k4OTkyAGk5iX2GM UVggkAMAASBf0W3LeQgAAUyIP2WhewZ0nlvNZK2Lw34LAAEwADQACGcyADAALQAyADEA5WUKTndt CwABMAA2AAhnMAAxAC0AMAAyAOVlCk53bRQAARhPKI2iWzdiDWehUg5Ools3YpViyYsBMLFiKGAE WQZ0gGLnXdBjR1MLAAEwADQACGcxADEALQAxADIA5WUXU6xOCwABMAA0AAhnMQA4AC0AMQA5AOVl 8W0zVwsAATAANQAIZzIAMwAtADIANADlZRdTrE4LAAEwADUACGczADAALQAzADEA5WXxbTNXCwAB GE8ojQ1noVKAYv2ADk4NZ6FSPHnqTgMAAdtrAYAIXg4AAbpOm1JEjZBuzWRcT0FTJ1kTTnmY7pWY mLKLp14LAAEwADQACGcxADIALQAxADMA5WUKTndtAwABMHUBgAheFgABAU8aTpReNmUmjT5roXsG dMpT4U8odc6YaZanYzZSDk6sUDZlnlsYYoBi510LAAEwADQACGcyADcALQAyADgA5WXxbTNXCwAB MAA2AAhnMgA5AC0AMwAwAOVl8W0zVwIAAYtzOl8JAAEzADgAMAAwAAoAZWcxAAGQMQAQAAFFAHgA YwBlAGwAKFcijaFSoXsGdC1OhHbYmqd+lF4odQMAAYGI118aUggAAQFPGk6FUeiQoVuhi/lXrYsL AAEwADgACGcyADQALQAyADUA5WUKTndtCwABMQAwAAhnMgA2AC0AMgA3AOVlCk53bQsAATEAMgAI ZzIAMQAtADIAMgDlZQpOd20IAAFKAGEAcwBvAG4AIABXAHUADAABJYQ5ZZ5YzIBvZgtOAU8aToJZ VU9/kA56CAABMAA0AAhnMgAwAOVlf17eXQgAATAANAAIZzIANwDlZWZrSWwDAAFOZ+qWHIMQAAGU XjZlJo0+a6djNlIOTqxQNmXKU+FPKHWhewZ0nluhUgsAATAANwAIZzIAMAAtADIAMQDlZQpOd20L AAEwADkACGcyADEALQAyADIA5WUKTndtCwABMQAxAAhnMgAzAC0AMgA0AOVlCk53bQwAASx721Yf ZyKNoVL7fN9+8W2mXhR47k/tcwsAATAANAAIZzIANwAtADIAOADlZVtPcVwLAAEwADUACGcxADEA LQAxADIA5WVbT3FcCwABMAA2AAhnMgA5AC0AMwAwAOVlW09xXAMAAYtzpm2FaAIAATYAKVkYAAEc IESNLGekThNmDnqhUj165WfNkblwylOUXvlbVntldR0g2Jqnfkhoi0++fLKL7XMIAAEwADUACGcx ADQA5WUXU6xOAwABTmcpUgFaEQABxpbiVotXAU8aTrBz0ZFBbaF7BnQOTkSN0ZGhewZ00I8lhAIA AfWVs1wNAAHHkS2NEGIsZ6djNlIOTiKNoVIGUpBngGLnXQsAATAANgAIZzIAMgAtADIAMwDlZfFt M1cDAAGLc5tR0XkJAAEzADIAMAAwAAoAZWcxAAGQMQALAAFsUfhTIo2hUgZSkGcOTs6YaZYylgOD CwABMAA0AAhnMgA2AC0AMgA3AOVlz4LeXQsAATEAMQAIZzEANQAtADEANgDlZW1n3l0LAAExADEA CGcyADYALQAyADcA5WUXU6xOCwABMQAyAAhnMQA3AC0AMQA4AOVlCk53bQIAAeB6h4UHAAEQYixn BlKQZw5Op2M2UgsAATAANQAIZzIAMAAtADIAMQDlZQpOd20LAAEwADkACGcwADkALQAxADAA5WUX U6xOCwABMAA5AAhnMQA3AC0AMQA4AOVlbWfeXQsAATEAMAAIZzIAMgAtADIAMwDlZQpOd20KAAFe lyKNoVLPfgZ0hHYijaFSoXsGdAsAATAANgAIZzEAOAAtADEAOQDlZQpOd20LAAEwADgACGcxADMA LQAxADQA5WUXU6xOCwABMAA4AAhnMQA2AC0AMQA3AOVlbWfeXQkAAYVR6JCnYzZSDk7OmGmWoXsG dAsAATAAOQAIZzIANAAtADIANQDlZQpOd20OAAEpUqZtS05RUhQgIo2hUqF7BnQOThBiLGenYzZS CwABMAA1AAhnMQAwAC0AMQAxAOVlF1OsTgMAARVUOGz9bA0AAQFPGk4ijaFShVGnY6iacl7iVh+W eXKtiyWECwABMAA2AAhnMAA4AC0AMAA5AOVl8W0zVw0AAV9sm20BME5n8lTwXAEw4YCHZR6XATAp boFbCwABAU8aTmhRYpeEmJd7oXsGdA5Op2M2UgsAATAANAAIZzIAMwAtADIANADlZQpOd20LAAEw ADcACGcxADIALQAxADMA5WVtZ95dCwABMAA3AAhnMQA1AC0AMQA2AOVlF1OsTgsAATAAOAAIZzIA MAAtADIAMQDlZQpOd20SAAEAZ7BlDno2ZT9lVnvjiZBnDk4OejZleXsSUtiap34UeO5P7XMLAAEw ADQACGcxADIALQAxADMA5WUQYv2QAwAB9lP6XnNeDwAB9048UP6UDk4YYmV1EGIsZ6F7BnTYmqd+ FHjuT+1zCwABMAA0AAhnMgA1AC0AMgA2AOVlf17eXQMAAdhOAYAIXhMAAQFPGk4QYixnp2M2Ug5O yHYpUv2Am1KEdtBjR1PYmqd++Veti+1zCwABMAA0AAhnMQA5AC0AMgAwAOVlbWfeXQIAAVlbgXIQ AAEBTxpOzphplqF7BnQOToVR6JCnYzZS2JqnfhR47k/tcwsAATAANAAIZzEAOAAtADEAOQDlZc+C 3l0CAAFoZ1VZEgABIo2hUjtg0XYI/0MARgBPAAn/KmdlZxhiZXUOTtKJcoKaW01PCwABMAA1AAhn MgAyAC0AMgAzAOVlf17eXQsAATEAMgAIZzIAMAAtADIAMQDlZfFtM1cCAAG5ZZpcCwABMAA4AAhn MgA1AC0AMgA2AOVl8W0zVwsAATAAOQAIZzEAMQAtADEAMgDlZX9e3l0LAAExADEACGcyADAALQAy ADEA5WV/Xt5dCwABMAA4AAhnMgAzAC0AMgA0AOVlf17eXQsAATEAMQAIZzIAMgAtADIAMwDlZfFt M1cLAAExADEACGcyADkALQAzADAA5WWmU+iVGQABMgAwADEAMwB0XgFPGk6zfg56xIswTwEwDnqh Uj165WfOmGmWMpYDg4xUlF75W1Z7ZXULAAEwADQACGcxADYALQAxADcA5WUXU6xOCwABMAA0AAhn MQA4AC0AMQA5AOVlEGL9kAMAAbmP119/XgkAASKNoVLOmGmWxosrUg5Op2M2UgYAASKNp04QYixn p2M2Uh4AAc5O3IMfnjBS2JpLYi0ALQAijaFSuk5YVMVfe5iMY+FjhHZFAHgAYwBlAGwA2JpIZSKN oVKUXih1gGL9gAsAATAANAAIZzEAOQAtADIAMADlZfFtM1cLAAEwADUACGcxADUALQAxADYA5WUX U6xOCwABMAA1AAhnMgAyAC0AMgAzAOVlX2zPgg4AAUUAeABjAGUAbAAijaFSDk6hewZ02JpIZZRe KHUPAAFelyKNoVLPfgZ0hHY2AAJYIo2hUqF7BnTFX+5P/osLAAEwADYACGcyADgALQAyADkA5WXx bTNXCwABMAA4AAhnMAA5AC0AMQAwAOVl8W0zVwsAATAAOQAIZzIANwAtADIAOADlZfFtM1cDAAEN T2VQt14JAAE1ADgAMAAwAAoAZWcyAAGQMQAOAAEAZ7BlAU8aTkBil18OerN+DnoIVMSJDk55exJS CAABMAA1AAhnMQA4AOVlF1OsTgMAAYlbSFEfdRIAAUUASABTAC0AiVtoUR91p06hewZ0CP9cZ6aQ z36MmgZSq04J/wsAATAAOAAIZzIAMgAtADIAMwDlZQpOd20LAAExADEACGcyADEALQAyADIA5WUK TndtAwABIowBgAheEgAB341VU1hUOGjDX+VdXE+AYv2ADk5We2V10GNHU55bGGKti8N+AwABTmd/ XvBsCQABMwA2ADAAMAAKAHBOAE5gjQBOEwABKI3PkeVdC3oIXgj/UQBFAAn/OGjDX4Bi/YDQY0dT nlsYYq2Lw34LAAEwADYACGcwADgALQAwADkA5WUKTndtCwABMAA2AAhnMQA1ADwAICABLQAxADYA 5WV/Xt5dCQABMwA4ADAAMAAKAHBOAE5gjQBOCwABME4wdb58ynYfdadOA4DfW/lXrYvtcwsAATAA NAAIZzEAMQAtADEAMwDlZX9e3l0LAAEwADUACGcyADIALQAyADQA5WV/Xt5dCwABMAA2AAhnMQA5 AC0AMgAxAOVlf17eXQsAATAANwAIZzIANAAtADIANgDlZX9e3l0LAAEwADgACGcyADEALQAyADMA 5WV/Xt5dEQABf159bDBOMHXCU8KJA4DfWw5OvnzKdh91p06eWxhi+VetiwMAAUiWb2ZOUwsAARwg 9paLTkVlHSCJW2hRH3WnTvlXrYsLAAEwADcACGcxADkALQAyADAA5WXxbTNXCwABMQAyAAhnMAA2 AC0AMAA3AOVl8W0zVwMAARBiOGyuTg4AAU5PEGIsZ+OJs1GkTieNH2eEdvt8334WU7llSGgLAAEw ADcACGcyADcALQAyADgA5WUKTndtCwABMAA4AAhnMAAzAC0AMAA0AOVl8W0zVw0AATEAMQAIZzMA MAAtADEAMgAIZzAAMQDxbTNXAwABSJbXX05TDgABNXXvjft8337vU2CXJ2C+i6GLDk5LbdWLgGIv ZwsAATAANAAIZzIANgAtADIAOADlZfFtM1cDAAFmawGACF4MAAE1dVBbNXUUbL6LB1nTfoRnvouh i7KLp14DAAEYUgGACF4MAAFNAFIATwAHWcFUB1n2TseRLY0OTqF7BnQLAAEwADkACGcxADMALQAx ADQA5WVSl5tcDQABTQByAC4ASgBhAHMAbwBuACAAWgBoAGEAbwAKAAFoUWKXKI3Pkc9+JYSeWxhi rYvDfgMAAYtzD1wfTxAAAWKNKFf6V0JcLQAtAO1zxH5/laF7BnSEdpROJ1lRUtVsCwABMAA2AAhn MQA1AC0AMQA2AOVlF1OsTgsAATAANgAIZzIAOQAtADMAMADlZQpOd20DAAG3Xvpec14UAAGEZ/pe U1OKjR91p07QjyWEoXsGdFNP+3wtAL58ynZUAFAATQD5V62LCwABMAA3AAhnMAA1AC0AMAA2AOVl F1OsTgMAAaKQUFsLaAsAAR91p06hewZ0S045ZYRVrGSoUilSpm0LAAExADAACGcyADYALQAyADcA 5WVSl5tcAwABIF8BgAheDwAB+laaW0SNp04I/76LB1kJ/6F7BnTYmqd+FHjuT+1zCwABMAA3AAhn MQAyAC0AMQAzAOVlCk53bQsAATAANwAIZzIAMAAtADIAMQDlZfFtM1cDAAGLcwGACF4LAAFoUf2A i1dmj/SVO077Tp5bGGKAYv2ACwABMAA0AAhnMgA3AC0AMgA4AOVlCk53bRMAARVfBnIfdadOm1IU IB91p06hewZ0BYDFXwdZhHZrUSdZb4+eW5tSCwABMAA0AAhnMgA3AC0AMgA4AOVlUpebXBEAAR91 p07PfgZ0ATA7TqF7nlsYYqF7BnSAYv2A0GNHU62Lw34LAAEwADQACGcyADUALQAyADYA5WXxbTNX AwAB+WY8eQ5mCQABNAA2ADAAMAAKAHBOAE5gjQBODgABRQBIAFMAz34GdAEwE05YVDhow1+AYv2A +VetiwsAATAANgAIZzIANwAtADIAOADlZVKXm1wDAAFIlgGACF4KAAH9VkWWKI3Pkc9+BnSeW81k rYvDfgsAATAANAAIZzEAMgAtADEANADlZVKXm1wLAAEwADUACGcxADYALQAxADgA5WXPgt5dCwAB MAA2AAhnMgAxAC0AMgAzAOVlzZGGXgsAATAANwAIZzEAOAAtADIAMADlZQpOd20DAAE0VPpec14N AAEfdadOsHM6VzllhFUOTolbaFEfdadOoXsGdAMAASBfD1w6XxUAATZSIJAaTh91p06hixJSDk5p cpllp2M2Ugj/UABNAEMACf/NZFxPnluhUgMAAd9/SVEOZgkAAZ5bjJq+i6GLRABPAEUA+VetiwsA ATAANAAIZzEAMwAtADEANADlZQpOd20DAAH5ZgGACF4JAAHobFFY9pY6f3eWn1PgVgZSkGcDAAGT kMp2hFUQAAEfdadOO06he4R2Z2JMiKdjNlIOTqF7BnSAYv2A0GNHUwMAAYGcAYAIXg0AASiNz5GG mJaIvnzxgq2Lw34lhC0AvnxOU+1zCwABMAA1AAhnMQA4AC0AMQA5AOVlHE6egwwAAeVdglNmj/SV oXsGdJ5bGGKAYv2ArYvDfgsAATAANAAIZzIANQAtADIANgDlZVtPcVwDAAFOZ4Ze3I8LAAFoUWKX KI3PkaF7BnQoAFQAUQBNACkACwABMAA2AAhnMgAyAC0AMgAzAOVlf17eXQsAATAAOQAIZzEANAAt ADEANQDlZX9e3l0LAAExADIACGcyADEALQAyADIA5WV/Xt5dAwABAU5VXE+eCwAB2JpIZR91p04Q Yixnp2M2Ug5OoXsGdAsAATAANQAIZzEAOAAtADEAOQDlZX9e3l0LAAEwADgACGcxADcALQAxADgA 5WV/Xt5dCwABMQAxAAhnMQA2AC0AMQA3AOVlf17eXQMAAUiWU2auTgkAAR91p06hixJSDk6hewZ0 0I95ewgAATAANAAIZzIAMQDlZX9e3l0IAAEwADcACGcyADEA5WV/Xt5dCAABMQAwAAhnMgAwAOVl f17eXQIAAUiWT54JAAE1AFMAoXsGdA5OsHM6VzllhFUIAAEwADUACGcyADUA5WUXU6xOAwABi3NI UR91CgABNQBTALBzOlehewZ0nlsYYoBi1WwIAAEwADcACGcyADAA5WV/Xt5dCAABMQAwAAhnMQA5 AOVlf17eXQ4AAVQAUABNAGhRYpcfdadOJ2DdT2hRnlsYYq2Lw34NAAEse0FTjE4fZx91p077fN9+ 8W2mXhR47k/tcwsAATAANgAIZzAAOAAtADAAOQDlZVtPcVwLAAEwADcACGcwADYALQAwADcA5WVb T3FcCwABMAA4AAhnMQAwAC0AMQAxAOVlW09xXAcAASBfD1w6XwEw8lOJc3BnAwABMQAyAClZCgAB H3WnThBiLGeEdqdjNlIOTotTKX8LAAEwADQACGcyADAALQAyADEA5WVbT3FcAwAB8lOJc3BnEwAB H3WnTqGLElIOTmlymWWnYzZS0GNHU62Lw34lhAj/UABNAEMACf8SAAFTU4qNKI3PkeVdC3oIXoBi /YAOTvx+CFQgfSiNnlvNZK2Lw34WAAFFAG4AcgBpAGMAbwAgAFcAbwBvAAEwTQBpAG4AaQBzAHQA ZQByACAATABpAAkAATQAMAAwADAACgBwTgBOYI0ATgsAAU0AaQBuAGkAcwB0AGUAcgAgAEwAaQAL AAH9VkWWKI3Pkc9+BnTYmqd+FHjuT+1zDgABNwArADUAsHM6VyiNz5EGUpBnDk45ZduPgGIvZwwA AehsjFEojc+R5V0LegheCP9DAFEARQAJ/w0AAUQATwBFAJ5bjJq+i6GLdGUIVJ5bGGKUXih1AgAB AU7cjwcAAeVdglO+fMZ+FlOhewZ0CwABMAA3AAhnMgA1AC0AMgA2AOVl8W0zVxAAAVQAUQBNAGhR Ypcojc+RoXsGdA5OKI3PkQFj7X45ZYRVCwABMAA0AAhnMQAzAC0AMQA0AOVl6G7eXQMAAdxZj1sL lQcAAdiaSGX9gB91p047TqF7DQAByI8RVPaWXFA6ZxQgFCBoUVhUvosHWfR+pGILAAEwADQACGcx ADMALQAxADQA5WVObVdTAgABD1mwURgAAdRnJ2AfdadOoYsSUgj/UABNAEMACf8OTptPlF7+lPt8 334I/1MAQwBNAAn/LWT6XgsAATAANAAIZzEAMwAtADEANADlZVKXm1wOAAG+fMp2H3WnThQgQVMn Wb58ynblXXdRhHbQjyh1CwABMAA0AAhnMgAwAC0AMgAxAOVlTm1XUwMAAb1lnlhOhgsAAWKNKFew czpXFCAUIL58xn4WU6F7BnQNAAEwADQACGcyADcALQAyADgA5WVxXBxOJ1lmWwMAAdxZCk7JbAgA ASiNz5GhewZ0lE4nWeVdd1ECAAE6jTx5DgAB/VZFlptPlF5GVSiNz5GhewZ0CF6eW81krYvDfgsA ATAANAAIZzIANQAtADIANgDlZRdTrE4PAAE3AEMALQD9VkWWKI3PkTtg0XbFX+5PhHYDTgJY/osL AAEwADQACGcxADcALQAyADAA5WUKTndtCwABMAA3AAhnMgA0AC0AMgA3AOVlF1OsTgsAATEAMAAI ZzEANwAtADIAMADlZfFtM1cCAAE0AClZDQABOQAwAA5UH3WnTr9+AE6/flhU5V2EdqF7BnQLAAEw ADgACGcxADcALQAxADgA5WXxbTNXAgAB82djgxEAAU4AUABJALBlp07BVPxbZVEI/zZSIJAaTnmY 7nahewZ0Cf8MAAEwADQACGcyADYALQAyADcAIADlZfFtM1csAAFGAE0ARQBBAAEwQQBQAFEAUAAB MFAAUABBAFAACP9cbyhXMVlIZSFqD1+MVA5UnGcGUpBnATCnTsFUKI3PkUhRH2dWexJSATAfdadO 9k55YsZRC3qPXgn/CwABMAA1AAhnMQA3AC0AMQA4AOVlz4LeXRYAAVMAUABDAAEwTQBTAEEACP/f fqGLx48LeqdjNlIBMEttz5H7fN9+BlKQZwn/CwABMAA1AAhnMQA0AC0AMQA2AOVlz4LeXQkAAb1i N2jAaIyaDk7BVCiN3U/BiwsAATAANQAIZzIANAAtADIANQDlZQpOd20DAAGQXwGACF4RAAEBTxpO RQBIAFMACP+vc4NYATBlULdejFSJW2hRCf+hewZ0AwABamwBgAheCwABMAA2AAhnMgAwAC0AMgAx AOVl4GUhlQgAASKMgVtEAE8ARQB5cq2LJYQIAAGwZedlUQBDAANOJ1nlXXdREAABlF4odSiNz5Gh ewZ05V13UeOJs1GwczpXoXsGdO6VmJgIAAFKAGEAawBlACAAQwBhAG8ACwABH3WnTrBzOlehewZ0 Dk7tc8R++l6+iwYAAb58ynYfdadOoXsGdAoAAVQAbwBuAHkAIABaAGgAYQBuAGcAFAABUABNAEMA LQA2UiCQGk4fdadOoYsSUg5OaXKZZadjNlLNZFxPnluhUg4AATAANQAIZzMAMQAtADAANgAIZzAA MQDlZQpOd20DAAHffwGACF4mAAFJAFMATwAxADQAMAAwADEAJgBPAEgAUwBBAFMAMQA4ADAAMAAx AK9zg1jKU0yAGk5lULdejFSJW2hRa1MfdaF7BnRTT/t8hVGhW1hUCwABMAA2AAhnMAA2AC0AMAA4 AOVlCk53bRUAAUoASQBUACYARABGAFQALQDGUfZlFlMfdadOjFTJYqhS+3zffoR2nlu9ZQoAAUUA cgBpAGMAIABaAGgAYQBuAGcADgABsHM6VyiNz5GhewZ0Dk6BejR4J2DrXx+QOWWEVQsAATAANAAI ZzEAMQAtADEAMwDlZQpOd20NAAH3TjxQQW0GUpBnjFS+fMp29048UEFtvouhiw4AAVQAVwBJAC0A LQAATr9+7XPEfn+VgGL9gNBjR1MLAAEwADcACGcxADIALQAxADMA5WXPgt5dCwABMQAwAAhnMQA4 AC0AMQA5AOVlCk53bRwAAUkAUwBPAC0AVABTADEANgA5ADQAOQAa/zIAMAAwADkAfWxmjxpOKI3P kaF7BnRTT/t8hVGhW1hUCwABMAA0AAhnMQA3AC0AMQA5AOVlCk53bQsAATAANgAIZzEAOQAtADIA MQDlZc+C3l0XAAGvc4NYcV/NVOBWIH0BMHFTaZaQbspT+HZzUdVsi1/VbMSJhHbGiytSjFShewZ0 CwABMAA2AAhnMAA3AC0AMAA4AOVlCk53bQgAAb58ynanTsFUAF/RU6F7BnQDAAEkXAGACF4GAAEo jc+REGIsZ6F7BnQLAAEwADYACGcxADkALQAyADAA5WUKTndtFQABSQBTAE8AOQAwADAAMQAa/zIA MAAwADgAKI3PkaF7BnRTT/t8hVGhW1hUCwABMAA1AAhnMQA1AC0AMQA2AOVlz4LeXQMAAWOEAYAI XiEAAUkAUwBPADkAMAAwADEAGv8yADAAMAA4AAEwSQBTAE8AMQA0ADAAMAAxABr/MgAwADAANACF UaFbWFREjTxo+VetiwsAATAANAAIZzEAOQAtADIAMADlZRxOnoMDAAFVTwGACF4LAAFoUWKXKI3P kaF7BnQI/1QAUQBNAAn/DAABVABQAE0AFCBoUWKXH3WnTqF7BnQ7bahSEQABH3WnTqGLElIOTmly mWWnYzZSUABNAEMA2JqnfhR47k/tcwsAATAANgAIZzAANAAtADAANQDlZRdTrE4LAAEwADYACGcy ADcALQAyADgA5WUKTndtAwAB95ZrU+1lCQABHCD2lotORWUdIIlbaFGhewZ0DQABVABXAEkA7XPE fn+VgGL9gNBjR1Oti8N+JYQLAAFRAEMAA05LYtVs7pWYmAZSkGeAYuddCAABMAA1AAhnMQA4AOVl f17eXRMAATYAUwBpAG4AZwBtAGEA/FtlUQ5OTQBpAG4AaQB0AGEAYgCUXih1DQABOABEAMpTUQBD AEMAwVShewhXzWRcT55boVIJAAFDAE0ASwC+iwdZ/YCbUgdjcGUFAAEylu5dGZWAYi9nCwABRQB1 AGcAZQBuAGUAIABZAGEAbgBnAAkAAQdoxlHlXfZlS23PkQ5OOWWEVQsAATAANQAIZzEAMQAtADEA MgDlZQpOd20HAAH2ljp/d5Yojc+RoXsGdBIAAUkAUwBPADEAMwA0ADgANQAHaMZRsovjicpThVGh W1hU+VetiwwAATUAUwCwczpXoXsGdA5O7nbGiRZTnlsYYgoAAVAAUwBNAC0A5V16golbaFGhewZ0 CQABUQBGAEQAKI3PkZ9S/YBVXABfDAABSgBTAEEALQCXXE1P5V1cT4lbaFEGUpBnCwABMAA0AAhn MQA5AC0AMgAwAOVlz4LeXQMAAWhUAYAIXhYAAUkAUwBPADEANAAwADAAMQAa/zIAMAAwADQAr3OD WKF7BnRTT/t8hVGhW1hUCwABMAA0AAhnMQA3AC0AMQA4AOVlCk53bRIAAUcARAAmAFQALQCOf/1W J2sybeBRVU86XPhbylNsUe5d+VetiwsAAXBn+lHtc8R+f5WhewZ0gGL9gNBjR1MNAAHYmkhl006o UKF7BnQOTuVdglNpcpllTZEBkAsAATAANAAIZzIAMwAtADIANADlZRdTrE4LAAEwADUACGcyADQA LQAyADUA5WV/Xt5dCwABMAA4AAhnMgAzAC0AMgA0AOVlCk53bQMAASBf8k5qjBIAATZSIJAaTrBz 407TTqhQoXsGdA5O2JpIZWlymWVNkQGQnlsYYgsAATAANwAIZzIANwAtADIAOADlZVKXm1wTAAEc IHdtc1EJTidZKI2RdR0g44mQZw5O+HZzUZF1vpaUXvlbVntldQIAAUiWVXgRAAEBTxpOaXJBbRZZ BVOEdtCPXE8BMKF7BnQOTs6YaZanYzZSAwAB1XFPnt6YDgABTZZOT8eRLY0QYixnylObT5ReRlUI jCRSgGLnXQsAATAANAAIZzAAOQAtADEAMADlZRxOnoMLAAEwADQACGcyADAALQAyADEA5WV/Xt5d CwABMAA3AAhnMAA2AC0AMAA3AOVl8W0zVwsAATAANwAIZzEAMgAtADEAMwDlZRdTrE4PAAHHkS2N QW0LehhPFlPKU5tPlF5GVcSLME8OTqF7BnQLAAEwADYACGcyADkALQAzADAA5WV/Xt5dCwABMAA4 AAhnMQAyAC0AMQAzAOVlCk53bQsAATAAOAAIZzEANgAtADEANwDlZRdTrE4KAAFelx91p05pckSN x5EtjQ5OoXsGdAoAAUUAbQBpAGwAeQAgAEQAaQBuAGcAGAAB24/6UeNTzWRcT4Bi513KU/1WRZbQ j5OPATDTfpd7zphpluOJkGcOTpRe+VtWe2V1CwABMAA1AAhnMQAxAC0AMQAyAOVlF1OsTgMAARhS DF4qbRIAAduP+lHjU86YaZYBMDmNKHWnYzZSylPhTyh1wYuhW1VTnluhUgkAATQAOAAwADAACgBl ZwBOAZAATg4AAYJZVU/PURFck15YW8pT0GPYmpNeWFtoVGyPh3MLAAEwADcACGcyADYALQAyADcA 5WUKTndtCwABMQAwAAhnMgA2AC0AMgA3AOVl8W0zVwsAATEAMQAIZzIAMgAtADIAMwDlZQpOd20O AAEHWcFUB1n2ToR2k15YW6djNlKMVNNOqFChewZ0CwABMAA1AAhnMgAzAC0AMgA0AOVlCk53bQsA ATAAOQAIZzIANwAtADIAOADlZQpOd20TAAHHkS2NEGIsZ02WTk8BMBhPv1IIjCRSgGLnXQ5Om0+U XkZVoXsGdAMAAX6YAYAIXhEAATZSIJABTxpOaXJBbcSJElIOTtiaSGVpcpll006oUE2RAZALAAEw ADkACGcyADYALQAyADcA5WUKTndtDwABUwBRAEUAm0+UXkZVKI3PkaF7BnQOTuVdd1HQjyh1CwAB MAA0AAhnMgA1AC0AMgA2AOVlCk53bQMAAU5nRlFxXAoAAceRLY38fghU/YCbUtBjR1Oti8N+DAAB x5EtjbpOWFQ4aMNfgGL9gNBjR1Oti8N+DAABx5EtjRBiLGenYzZSylObT5Re/pShewZ0CwABMAA2 AAhnMgAxAC0AMgAyAOVlF1OsTgMAAVlbDmZOUxEAAduP+lHjUxqQc1GeW6FSzWRcT8pTdlEQYixn p2M2UlZ7ZXUMAAFNAHIALgBMAGUAbwBuACAAVwBhAG4AZwALAAEYT8B5006he1hUaFH9gJ5bGGKt i8N+DQABx5EtjfdOPGgGUpBnDk4QYixnTZZOT55bGGILAAHHkS2N9048aAZSkGcOThBiLGdNlk5P DwABaXJBbRBiLGenYzZSDk5pckFtoXsGdNBjR1OAYtVsDAAB/VZFlseRLY0OTtuP+lHjUziNE2ae WxhiCQABSQB6AGkAbQBpACAATABpAHUADgABGGJldceRLY0BME2WTk8QYixnDk4IjCRSgGLnXQsA ATEAMgAIZzEAOQAtADIAMADlZVKXm1wLAAGeWyh1x5Etje6VmJgGUpBnDk7jibNRCQABRABhAHYA aQBkACAAWQBhAG8ACgABm0+UXv6UoXsGdDhow18OTvpXQHgDAAElTgGACF4NAAHYmkhlm0+UXv6U oXsGdGhRYpfjibNRuWVIaAMAAWyaU2bwXBAAASdZl1ufU1BnmWX3Tjxoi42/UgZSkGcOTseRLY1W e2V1CQABUgBvAGcAZQByACAAUABhAG4AHAAB3nqJTidgx5EtjSFqD18tAC0Am0+UXkZVCZDpYgEw xIswTw5OoXsGdAEwUwBRAEUAJgBWAE0ASQALAAEwADQACGcxADkALQAyADAA5WV/Xt5dAwABzp4A TvSQDgABGU80TyFqD18tAC0AB2hGZ8eRLY0QYixnp2M2UgwAAZtPlF5GVaROH2ehewZ0Dk6TXlhb p2M2UgsAATEAMQAIZzEANgAtADEANwDlZQpOd20LAAEYYmV1x5EtjQ5OzFNijQiMJFKAYuddCwAB MAA1AAhnMgAyAC0AMgAzAOVlCk53bQMAAYtz3U9OUwsAATAAOQAIZzEAOQAtADIAMADlZQpOd20M AAHHkS2NxV8HWYR2Io2hUuV3xosOToBi/YALAAEwADgACGczADAALQAzADEA5WUKTndtCwABMQAy AAhnMgAwAC0AMgAxAOVlCk53bRUAAUUAWABDAEUATAAoV8eRLY0QYixnp2M2UoxUx5EtjQiMJFIt ToR2lF4odQMAAWhnAYAIXggAAWlyQW0OTptPlF7+lKF7BnQQAAEYYmV1x5EtjRBiLGenYzZSATBK Us9RDk4IjCRSgGLnXQMAATFnAYAIXgwAATZSIJAaTpNeWFunYzZSgGIvZw5OVntldQMAAQt6AYAI XhkAAft8334WU8eRLY2hewZ0Dk4AZ3NPnlstAC0Am0+UXkZVCZDpYsSLME8OTqROH2ehewZ0AwAB XGcBgAheDQABsHPjTtNOk17Qj1xPoXsGdA5Ok15YW6djNlIIAAFKAGEAYwBrACAAWgBoAHUACgAB NlIgkItXAU8aTptPlF7+lKF7BnQLAAEwADQACGcyADQALQAyADUA5WUKTndtCwABeZjudqF7BnQo V8eRLY0tToR2lF4odQsAAU0AcgAuAEoAYQBjAGsAIABMAHUAbwAMAAEAlS5VvnzxgjIAKVkAThxZ r3XCcq2Lw34LAAEwADUACGcyADUALQAyADYA5WVbT3FcCwABMAA2AAhnMQA1AC0AMQA2AOVlCk53 bQsAATAANwAIZzEAMwAtADEANADlZRxOnoMCAAGLc4qNBAABMgApWTEAHFkJAAE0ADYAMAAwAAoA ZWcATgGQAE4LAAEAlS5VO06hezIAKVk6XxZTrYvDfiWEAwABVU+ccBxOCwABAJUuVTtOoXszAClZ Ol8WU62Lw34lhAsAATAANQAIZzEAMAAtADEAMgDlZQpOd20hAAFNAGEAcgBrAGUAdABpAG4AZwAt AAowJ1miWzdiJYQAlaF7BnQUIBQgQgAgAHQAbwAgAEIAJYQAlc1kXE+eW6FSCzALAAEwADQACGcx ADUALQAxADYA5WXxbTNXCwABMAA0AAhnMgAyAC0AMgAzAOVlF1OsTgsAATAANQAIZzEAMwAtADEA NADlZfFtM1cCAAFVT1KXCQABNAAzADAAMAAKAGVnAE4BkABODAABEGKfUgCVLlU7TqF7xV8HWSB9 KI3QY0dTEAABAJUuVTtOoXuCWVVPU2IgkNia6X5IZYR2AJUuVeJWH5YMAAElhACVcGVuYwZSkGct ACh1cGVXW/SLPAAfIAHdiwsAATAANAAIZzEAOAAtADEAOQDlZRdTrE4LAAEwADYACGcyADcALQAy ADgA5WUXU6xOAgABSJZRUg4AARhPwHnejwGVz34lhOiVl15/ldiap34UeO5P7XMLAAEwADUACGcx ADkALQAyADAA5WXxbTNXCwABMAA1AAhnMgA2AC0AMgA3AOVlCk53bQsAATAAOAAIZzAAMgAtADAA MwDlZfFtM1cLAAE1dd2LJYQAlTtOoXvFXfBcrYvDfiWECwABMAA3AAhnMgA3AC0AMgA4AOVlf17e XQsAATAAOAAIZzIANAAtADIANQDlZX9e3l0DAAFOZz+e2osLAAE1dd2LAJUuVb588YKeWxhirYvD fiWECwABMAA3AAhnMQAzAC0AMQA0AOVlf17eXQsAATAAOAAIZzEAMAAtADEAMQDlZX9e3l0LAAEx ADAACGcxADkALQAyADAA5WV/Xt5dCwABMQAxAAhnMgAzAC0AMgA0AOVlf17eXQMAAZdn8H+zggQA AQiMJFJaUwhfAwABTmebUhpSCQABfpjulQ9fAJUuVYBi512ti8N+AwABJU62Ww5mEQABYo0oVwJe OlcUIBQgwVRMciWEAJUOTkZVGk4hag9fG1KwZQMAAUaWpk4mdAkAATcAOAAwADAACgBlZwBOAZAA TiYAAQCVLlUgblOQ0I8lhA5OJ1miWzdiAF/RU9iap34UeO5P7XMUIBQgAJUuVc9+BnQBMAJeOlfP fgZ0OGjDX4Bi/YCeWxhirYvDfkEA7XMOAAEwADgACGczADEALQAwADkACGcwADEA5WUXU6xOAwAB jZwBgAheJQABG1KwZSWEAJUOTgCVLlXiVh+WoXsGdNiap34UeO5P7XMUIBQgAJUuVc9+BnQBMAJe OlfPfgZ0OGjDX4Bi/YCeWxhirYvDfkIA7XMLAAEwADgACGcxADAALQAxADEA5WUXU6xOCwABMQAw AAhnMQA5AC0AMgAwAOVl8W0zVxEAAQJeOlflXQt6ZlsUIBQgAl46VwZSkGfKU3ZR5V13UdCPKHUL AAEwADYACGcwADcALQAwADgA5WXxbTNXCwABMAA4AAhnMwAwAC0AMwAxAOVl8W0zVwMAAbWQGk9O Uw4AAdia73qiWzdiJYQAlcNfBnRmWw5On2wakIBi510LAAEwADkACGcwADYALQAwADcA5WXxbTNX AgABTmcLlREAAf1WRZZGVaFSCIwkUlZ7ZXUOToltFlkAlS5Vn2wakIBi510TAAEcIClZmZ9rUeiQ HSAUIBQgAJUuVb588YLrXx+QEGJ/la2Lw34lhAIAASFTVGYWAAH6V45ORQB4AGMAZQBsAIR2vnzG fgCVLlWhewZ0ATBwZW5jBlKQZw5OhJhLbQIAAWhnkU4LAAGvdcJyAJUuVYBi512eWxhirYvDfiWE EAABGk7pfn6B3pgUIBQgU1OKjQCVLlW6TlhUIH17UdBjR1MLAAEwADQACGcyADYALQAyADcA5WVS l5tcCwAB/HInYACVLlW+fPGCVJs8m62Lw34lhAsAATAANgAIZzAANQAtADAANgDlZRdTrE4DAAH4 U3dtwYkJAAE0ADAAMAAwAAoAZWcATgGQAE4LAAH8cidgJYQAleJWH5b6Xr6LDk6hewZ0AwABi3P6 Xh9PCgABZWtlazpOYo0AlS5VCIwkUlZ7ZXUDAAFsmlpXTIgRAAEKMHpmOlmii1VTCzDYmu96J1mi WzdiAJUuVZ5bGGI9hDBXAgABGFKwUQkAAVNiIJDRkUxyl15/lXlyrYslhAsAATAANAAIZzEAMQAt ADEAMgDlZW1n3l0LAAEwADQACGcyADQALQAyADUA5WXxbTNXCwABMAA1AAhnMgA5AC0AMwAwAOVl Ck53bQsAATAANgAIZzIAMAAtADIAMQDlZRdTrE4LAAEwADcACGcyADQALQAyADUA5WV/Xt5dAwAB GFJTZq5ODAABxV3wXDZS3IAAlS5VgGLnXZ5bGGIUeO5PCwABMAA0AAhnMAA0AC0AMAA1AOVl8W0z VwsAATAANQAIZzIAMwAtADIANADlZX9e3l0CAAHPgmhmCgAB/HInYCWEAJUN/3pmOlknWaJbN2IK AAFTYiCQ/HInYMVd8FwAlS5V4lYflgsAATAANAAIZzAANgAtADAANwDlZfFtM1cJAAEAlS5V4lYf lvlXe1EOTsBvsVIIAAEwADUACGcxADcA5WUXU6xOAwABaGdIUR91DQAB0ZFMcpdef5UOToWNp35W U0tixJ7RkcR+CFQCAAE/gFSVCwABU1OKjQCVLlXPfgZ0nlsYYhR47k/tcwsAATAANQAIZzMAMAAt ADMAMQDlZVtPcVwLAAEwADYACGcyADIALQAyADMA5WVbT3FcCwABMAA3AAhnMgAwAC0AMgAxAOVl W09xXAYAAUiWB5cBMOmX0ZGilAYAAQJeOlclhACVoXsGdAsAATAANQAIZzAANAAtADAANQDlZVtP cVwCAAEgXylSDAABNXXdiwCVLlUATr9+B07RkTZS3ICAYuddCAABMAA0AAhnMgA4AOVlCk53bQgA ATAANQAIZzIANgDlZQpOd20IAAEwADYACGczADAA5WUKTndtAgABGFI/ZQoAAQCVLlWgUZtR618f kBBif5VLTu+NCAABMAA0AAhnMgA3AOVlCk53bQgAATAANQAIZzIANQDlZQpOd20IAAEwADYACGcy ADkA5WUKTndtDAABoXunYwCVLlUaTqFShHYxADgAKk7lXXdRCwABMAA2AAhnMgAwAC0AMgAyAOVl Ck53bQMAAemXAYAIXhIAAQ1noVIlhACVFCAUIKmLAJUuVZ2YDk7hbg9hpl52XqmA0GPYmgMAATRU j1tWZgsAAVAAUwBTABQgFCATThpOAJUuVYBi510CAAEgX9GLBwAB44mzUbllSGgPXwCVLlULAAEw ADYACGcwADYALQAwADcA5WUKTndtAgABi3N0khMAATpT31cCXjpXAF/RUw5Oz34AlUZVoXsGdAj/ MgAwADEAMwBIcgn/CwABMAA3AAhnMAA1AC0AMAA2AOVlCk53bQsAAUFT22LAbzttAJUuVeJWH5ae Wxhi7XMKAAEnWaJbN2IAlS5VnlsYYg5OFG/DfggAATAANAAIZzIAMADlZRdTrE4XAAH6UeNTJYQA lcpTCWdIZbeD1lMBMFl1T0+ii1VTgGLnXa2Lw37Ymqd+FHjuT+1zCwABMAA5AAhnMAA3AC0AMAA4 AOVlCk53bQsAATAAOQAIZzEANAAtADEANQDlZfFtM1cbAAHYmul+SGUAlS5V4lYflkVOYo0fd89+ LQAAlS5V4lYflvpevosOTgCVLlW6TlhUA4A4aMBvsVILAAEwADQACGcyADcALQAyADgA5WUXU6xO AgABIF/jWgoAAQJeOlcAX9FTDk7PfgCVRlWhewZ0CgABU2IgkNGRTHKXXn+VeXKti/lXrYsNAAFO huNTOllVUy0A/HInYACVLlWeWxhirYvDfgsAATAANAAIZzIAMAAtADIAMQDlZU1vSlcCAAFsmktR DwABYo3WUydZootVUxQgFCAAlS5VoFGbUTpfFlOti8N+CwABMAA0AAhnMQAzAC0AMQA0AOVlTm2B WwIAAYtzDFQKAAH8cidgAJUuVb588YJUmzybeXKtiw0AAVF/3H4lhACVnlsYYtCPXE/Ymqd+FHju T+1zAgABZmsBWhEAAQowJ1miWzdiAF/RUw5O9H6kYl1OZWvyZgswnlsYYq2Lw34LAAEwADQACGcy ADAALQAxADEA5WUXU6xOAgABKW49chAAAbBlp07BVBR40VNBbQt6GE8WUw5OFHjRU3mY7nahewZ0 CwABMAA1AAhnMgAyAC0AMgAzAOVl8W0zVwMAASBfOGxwZwkAATMAOAAwADAACgBlZwBOAZAATgoA ARR40VO6TlhUhHYDgDhoDk7Ab7FSCwABMAA2AAhnMgA0AC0AMgA1AOVlCk53bQMAAf5mZlsOZiAA AQowzk6AYi9ncI0RVKF7BnQLMBQgFCAUeNFTylOAYi9nz34GdAEwO06hezhow1+hewZ0gGL9gNBj R1N5cq2LJYQLAAEwADYACGcwADQALQAwADUA5WUKTndtCwABMAA2AAhnMQAzAC0AMQA0AOVl8W0z VwsAATAANgAIZzEANwAtADEAOADlZRdTrE4DAAFIloxUcFETAAEUeNFTuk6bUkSNkG6hewZ0S04U eNFTuk5YVIR2A4A4aA5OwG+xUgsAATAANQAIZzIANgAtADIANwDlZfFtM1cLAAEwADUACGcyADgA LQAyADkA5WUXU6xOFgABEGKfUoR2p07BVM9+BnQUIBQgp07BVM9+BnQ4aMNfoXsGdJ5bGGJ5cq2L JYQLAAEwADcACGcwADkALQAxADAA5WUKTndtCwABMAA3AAhnMgAyAC0AMgAzAOVl8W0zVwsAATAA NwAIZzIANAAtADIANQDlZRdTrE4VAAGnTsFUAJdCbAZSkGcOTgCXQmyhewZ0FCAUIIJZVU8eZJpb Al46VwCXQmwLAAEwADUACGcyADcALQAyADgA5WXxbTNXAgABY4ROWQgAAQlnSGUAX1VceZjudqF7 BnQLAAEwADQACGcwADYALQAwADcA5WUKTndtCwABMQAxAAhnMAA5AC0AMQAwAOVlCk53bQcAARR4 0VMaWXmY7nahewZ0CwABMAA2AAhnMgA0AC0AMgA1AOVl8W0zVxMAAQJeOldxmqhShHawZadOwVQA X9FTQW0LeoxUFHjRU3mY7nahewZ0DQABeZjudqF7BnSeWxhizWRcTy0AK1TlXXdRBVMOAAGnTsFU LU7Vi6F7BnQN/w3/zk43aMFUMFLPkadOAwAB+WbuTyptGQABgllVT1NiIJDYmkhlhHYUeNFT4lYf lg3/FHjRU7pOWFQJkAEwsoABMCh1ATBZdUtOU5AHAAHOToBiL2dwjRFUoXsGdAsAATAANQAIZzIA NwAtADIAOADlZRdTrE4DAAExZ0lRiY8RAAEBTxpOFHjRUy1OhHbld8aLp05DZ6F7BnQOThNOKVIW Y5hjAwABaGeJW9uPDAABFHjRU3mY7nbPfgZ0hHZvj4Bi/YDQY0dTEgABEGKfUoR2p07BVM9+BnQU IBQgp07BVM9+BnSEds6R7oYQYn+VDgABsGX7Ts9+BnRoUWKXoXsGdIBi/YDQY0dTrYvDfh0AAQFP Gk59doaYOGjDX55SbFGAYv2ACP9QAFAAVAArAEUAeABjAGUAbAAJ/9iap36UXih1MgAwADEAMwAg AAH6V45OTQBpAGMAcgBvAHMAbwBmAHQAIABQAHIAbwBqAGUAYwB0ACAAMgAwADEAMAABTxpOeZju dqF7BnT5V62LCwABMAA0AAhnMgAwAC0AMgAxAOVlz4LeXQMAAVhvt18JZxEAAduP+lHjU0ZVwVRS X3t8d21zUaF7BnTKU3ZRnluhUs1kXE8mAAEQYp9ShHZ5mO52oXsGdCgAUwB1AGMAYwBlAHMAcwBm AHUAbAAgAFAAcgBvAGoAZQBjAHQAIABNAGEAbgBhAGcAZQBtAGUAbgB0ACkAAgABaGfzZxIAAahU 4osPXxQgFCABTxpOoYBDZ8BvsVLNZFxPnluhUjtgwYjtcwsAATAANwAIZzEAMwAtADEANADlZRdT rE4DAAFVT9dfaoAOAAEBTxpOCk4CXnl7ElIOToWP/FvYmqd+FHjuT+1zCwABMQAxAAhnMAAxAC0A MAAyAOVl8W0zVwkAATYAOAAwADAACgBwTgBOAZAAThQAAYJZVU+EZ/peAU8aTglnSGWEdrpOTWLA b7FSOmc2Ug5Opn5fZzpnNlILAAExADAACGcyADUALQAyADYA5WXxbTNXDQABEGKfUkyAOle6TutY hHZMgBpOH3WvbcSJElILAAExADIACGcxADMALQAxADQA5WXxbTNXAgABt17tZREAAYaY/FsFgEtO UVIUIO6VmJgGUpBnDk7jibNR/YCbUtBjR1MDAAEijACK3V0KAAHojeiQ6JWfbBqQDk4JZ0hlT1Nc TyoAAf1WRZY4jRNmu3m4XBpOoVLNZFxPgGLnXahmiW0WWQ56NmV5exJSATC6ThFsAV5HbIdz4myo Us6YaZbEiX+QDk66ThFsAV67ebhcL24aTqFSzWRcTw4AATAAOAAIZzMAMQAtADAAOQAIZzAAMQDl ZfFtM1cUAAEWWQCV4lYflvpevosOTqF7BnSoZhZZAJW6TlhUhHYDgMSLDk7Ab7FSFwABLU7YmkJc oXsGdLpOWFSEdih1uk7YeQh7FCAUILpOTWKEdgmQsoAodVl1gGIvZwkAATQAMwAwADAACgBwTgBO AZAATgcAAS1OWlebUs+RNgACWP6LAwABm4V/cI9bCQABNAA4ADAAMAAKAHBOAE4BkABODgABcVM6 Z2xRc1EOTnFTOmeEmGaL+3zffoR2+l7LegsAATAANgAIZzAAOAAtADAAOQDlZRdTrE4LAAEwADkA CGcwADcALQAwADgA5WUXU6xOCwABMAA5AAhnMQA0AC0AMQA1AOVlCk53bQIAAfZTHE4aAAGhewZ0 hHbDXwZ0WlMIXw5Ow18GdHFR+l4UIBQgw18GdGZbKFehewZ0LU6Edp5bRZbQjyh1AgABdY1ZlxQA AbBl+06hewZ0BYC6Tk1ioXsGdA5O4lYflvpevoueWxhigGL9gNBjR1MDAAGxlIZem20KAAE4ADAA ATA5ADAADlRYVOVdoXsGdAgAATAANwAIZzIAMADlZW1n3l0IAAExADIACGcwADcA5WUKTndtAwAB i4QPXE5TDAABOAAwAAEwOQAwAA5UWFTlXaF7BnSeW6FSDgABMAA1AAhnMwAxAC0AMAA2AAhnMAAx AOVl8W0zVxMAAUyIqFJmW2BOSldBAGMAdABpAG8AbgAgAEwAZQBhAG4AaQBuAGcACwABMAA1AAhn MgA5AC0AMwAwAOVl8W0zVwMAAYB7zFs0ThsAARwgU1OKjUFtC3pTT/t8hGf6Xg5OGE8WUwEwQW0L eul+SGX7fN9+/FtlURwgnlsYYtia73rtcwsAATAANAAIZzEAMgAtADEANADlZfFtM1cLAAEwADQA CGcxADkALQAyADEA5WUKTndtCwABMAA0AAhnMgA2AC0AMgA4AOVlF1OsTgYAAUiW1186XwEwi3PU fwwAAeJWH5bEfsd+LU6Edl1Oi1e6TjxolF4odQIAAVlbKm0NAAEBTxpORI0sZ9CPXE8OTpVijYdE jX6Y7pXtcwsAATAANQAIZzIANQAtADIANgDlZYhsM5YCAAGPW5N2DgAB2FNpl4aY/FubUhQgFCAQ YjFc2FNpl4tXhpj8WwMAARhShFVmawkAAV1Oi1e6TjxoDk7Ymkhln2wakBAAATIAMAAxADQAdF4w ADEACGcxADAALQAxADEA5WXxbTNXAgAB2JpTZgcAAUyAGk4WUyB9e1HQY0dTCwABMAA3AAhnMAA1 AC0AMAA2AOVl8W0zVwMAAXJepmjLeQkAATOWSVHDXwFgY2v9gM+RrYvDfgsAATAANAAIZzEANwAt ADIAMADlZfFtM1cLAAEwADYACGcwADYALQAwADgA5WXxbTNXCwABMAA4AAhnMgAzAC0AMgA0AOVl 8W0zVwsAATEAMAAIZzEANwAtADEAOQDlZfFtM1cLAAExADIACGcxADIALQAxADQA5WXxbTNXBgAB 2JpTZgEwcl6maMt5BwABxWBGVQ5Oi1ObUqF7BnQLAAExADEACGcyADkALQAzADAA5WXxbTNXCQAB LU7YmkJcoXsGdCB9KI3QY0dTCwABMAA1AAhnMQAwAC0AMQAxAOVl8W0zVwMAAYtzJ1lrUwYAAS1O QlyhewZ0gGL9gAsAATAANwAIZzEAMAAtADEAMQDlZfFtM1cCAAFVT7mPCQAB7nYHaKF7BnQOTmdi TIgwUk1PCwABMQAxAAhnMQA1AC0AMQA2AOVl8W0zVwMAAdiadXJbcggAAeiN6JDolZ9sGpAOTk9T XE8QAAEyADAAMQA0AHReMAAzAAhnMgA4AC0AMgA5AOVl8W0zVwkAAV1Oi1e6TjxoDk4BTxpOoXsG dAsAATEAMQAIZzAAOAAtADAAOQDlZfFtM1cKAAGhewZ0BYDFXwdZhHaUTnmYgGL9gBAAATIAMAAx ADQAdF4wADEACGcwADMALQAwADQA5WXxbTNXCQABoXsGdFllw34OTgtOXlyFj/xbCwABMQAyAAhn MgA3AC0AMgA4AOVl8W0zVwoAAV1Oi1e6TjxoDk6GmPxbm1LuT7xwCwABMAA5AAhnMAA1AC0AMAA3 AOVl8W0zVxAAATIAMAAxADQAdF4wADMACGcxADMALQAxADUA5WXxbTNXCQABWWXDfg9fsGWGmPxb m1LuT7xwCwABMAAzAAhnMAA3AC0AMAA4AOVl8W0zVwoAAWxRF08Ub/SLDk5xX81Um1LuT7xwAwAB +04pWUyIDQABAU8aTmxRh2WZUVxPDk4aT6FSoXsGdJ5boVIDAAEUXSptm20KAAHDXwZ0ZlsoV6F7 BnQtToR2lF4odQgAATAANQAIZzEAMQDlZRdTrE4KAAFTU4qNhpj8W5tSjFSGmPxbeoIvZwgAATAA NQAIZzIANADlZRdTrE4PAAFQAFAAVACMW4RVoXsGdKViSlSEdh1g740OTtN+hGcSAAGAe3djoXsG dBQgFCChewZ0BYDrXx+QEGJ/lYR2bVF5mL58248LAAEwADUACGcxADEALQAxADIA5WV/Xt5dEAAB RQB4AGMAZQBsAChXAU8aTqF7BnQtToR22JqnfpReKHUJAAHYmkhlhHahewZ0n2wakIBi510IAAEw ADQACGcyADUA5WUKTndtCAABMAA3AAhnMQA4AOVlCk53bQgAATEAMAAIZzEAMgDlZQpOd20NAAGE Z/peU1OKjYR2ols3Yg1noVKhewZ0U0/7fAsAATAANQAIZzIAMQAtADIAMgDlZQpOd20LAAEwADcA CGczADAALQAzADEA5WUKTndtCwABMAA5AAhnMQAwAC0AMQAxAOVlCk53bQsAATEAMQAIZzIAMgAt ADIAMwDlZRdTrE4PAAEJZ0hlBFkGdKJbN2KEdg1O4W4BMLFiKGABMJViyYsLAAEwADgACGcxADQA LQAxADUA5WUKTndtCwABMAA4AAhnMgAzAC0AMgA0AOVlUpebXAsAATEAMAAIZzMAMAAtADMAMQDl ZQpOd20LAAFTU4qNhHaiWzdiDWehUoBi512ti8N+CwABMAA2AAhnMgA2AC0AMgA3AOVlCk53bQsA ATAAOAAIZzAAOQAtADEAMADlZQpOd20PAAEtTtiaQlzPfgZ0oXsGdIBi/YAOToaY/FubUhR47k8L AAEwADUACGcxADgALQAyADAA5WUKTndtCwABMAA2AAhnMQAzAC0AMQA1AOVlCk53bQsAATAANwAI ZzAANQAtADAANwDlZQpOd20LAAEwADgACGcwADIALQAwADQA5WUKTndtCwABMAA5AAhnMAA1AC0A MAA3AOVlCk53bQwAAS1OQlzPfgZ0GpAodaF7BnSAYv2ArYvDfgsAATAAOAAIZzAAMgAtADAAMwDl ZQpOd20LAAEwADkACGcwADUALQAwADYA5WUKTndtDAABLU7YmkJcz34GdFNTio2GmPxbm1LuT7xw CAABMAA1AAhnMgAwAOVlCk53bQgAATAANgAIZzEANQDlZQpOd20IAAEwADcACGcwADcA5WUKTndt CAABMAA4AAhnMAA0AOVlCk53bQgAATAAOQAIZzAANwDlZQpOd20PAAGhewZ0CWe5ZRQgFCCwZUtm O06he4R2bVF5mO5PvHALAAExADEACGcwADgALQAwADkA5WUKTndtDQABols3YiiNz5GhewZ0Dk6V YsmLBFkGdIBi510PAAFNAFQAUAAUIBQgLU5CXM9+BnShewZ0gGL9gK2Lw34LAAEwADUACGcwADkA LQAxADAA5WUKTndtCwABMAA3AAhnMQAwAC0AMQAxAOVlCk53bQsAATEAMAAIZzIANQAtADIANgDl ZQpOd20PAAFel7pOm1JEjZBuoXsGdAWAhHa6TptSRI2QbqF7BnQLAAEwADkACGcwADQALQAwADUA 5WUKTndtCwABMQAxAAhnMQA0AC0AMQA1AOVlCk53bQsAAQ1noVIYYmV1Dk4NZ6FSoXsGdFNP+3wO AAEwADUACGczADEALQAwADYACGcwADEA5WUXU6xOAgABg4nmZgMAARhSfnafUgkAAXpmZ2G6Th91 LQDFYEZVoXsGdAgAATAANQAIZzEANgDlZRdTrE4CAAGJW8WWEwABTIAaTs9+BnSEdmhRYpcdYPR+ rYvDfi0ALQAbUrBlHWD0fq2Lw34DAAFcZ+d+V1MQAAEtTlpXm1LPkRQg2JpIZf2AoXsGdAWAhHZr UXmY7k+8cAMAAYtz33qsUQwAAVNPjJoPX2ZbYE4a/3mY7nahewZ0nlsYYgIAAeGAaW0MAAHlTh9h qFINZ6FS0GNHUwFPGk7eeolOm1IcAAHnXSh1RQB4AGMAZQBsAP1RcGUBMHBlbmMPkMaJaIiMVKhS AWD+VmiI249MiNiaSGVwZW5jBlKQZwoAAbBl9mUfZ4R2WFTlXXNR+3yhewZ0CAABMAA0AAhnMgA2 AOVlZmtJbAIAAYdlyk8MAAHBVExyaFFIaLcAJYQAlcd7KwAhag9fx3sGAAH2UwKDLU4BMFVPSlca AAFwZW5jBlKQZ4hfgHtVUxQgFCDrXx+QjGPhY0UAeABjAGUAbAD9UXBljFRwZW5jD5DGiWiICwAB MAA2AAhnMgA2AC0AMgA3AOVlf17eXQ0AAbBz404BTxpOaFFil2NoSGihewZ05V1cT0pXCgAB7nYH aDEAMAAwAAX/vo8QYvt8334LAAEwADQACGcyADwAZA0BNwAtADIAOQDlZVtPcVwDAAHEnv1WiY8E AAEzAClZMgAcWRAAAYF6NHgnYIaY/FubUhQgFCAsewBONpa1axwgyYmSkR0gCwABMAA0AAhnMQAy AC0AMQA0AOVlW09xXAsAATAANQAIZzAAMwAtADAANQDlZVtPcVwGAAFUAGUAbgBnAC4AQwAEAAEy AClZMwAcWRIAAYF6NHgnYIaY/FubUhQgFCAse4xONpa1axwgTIg6ToF6NHgdIAsAATAANAAIZzEA OAAtADIAMQDlZVtPcVwHAAFNAGkAcgBhAG4AZABhAAQAATUAKVk0ABxZBgABAU8aTqF7BnSZbNh2 DAABOAAwAAEwOQAwAA5UAE6/flhU5V2hewZ0CwABaFFil3mY7nahewZ02JqnfhR47k/tcwIAAdia eVwLAAHYmkhlz34GdLpOhHZnYkyIm1Kti8N+AwABdY13bZFOCgABNAA4ADAAMABDUQoAcE4ATgGQ AE4HAAFTYiCQU1OKjWdiTIibUgMAAYlRAYAIXg4AAV6Xuk6bUkSNkG7PfgZ0hHa6TptSRI2QbvlX rYsDAAE+jQGACF4LAAFNAFQAUAAtTkJcoXsGdE1i/YCti8N+AgAB0ZAbVBUAAQFPGk7PfiWEO22o Ui1OhHZ3bXNRi06hUs6YaZbKU3ZR44mzUe+NhF8gABYAAS1O2JpCXHJe6JA4aMNfoXsGdIBi/YAU IBQgxou6Tih1uk6ygLpODk5ZdbpOCwABMAA0AAhnMAA1AC0AMAA2AOVl8W0zVwsAATEAMAAIZzEA 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 AB0BAAAAAIAB/wAIAhAAFgABAAwAHQEAAAAAgAH/AAgCEAAXAAEADAAdAQAAAACAAf8ACAIQABgA AQAMAB0BAAAAAIAB/wAIAhAAGQABAAwAHQEAAAAAgAH/AAgCEAAaAAEADAAdAQAAAACAAf8ACAIQ ABsAAQAMAB0BAAAAAIAB/wAIAhAAHAABAAwAHQEAAAAAgAH/AAgCEAAdAAEADAAdAQAAAACAAf8A CAIQAB4AAQAMAB0BAAAAAIAB/wAIAhAAHwABAAwAHQEAAAAAgAH/AAECBgAAAAEAAwG+ABgAAAAC AAQBBAEEAQQBBAEEAQQBBAEEAQoAAQIGAAAACwAFAQECBgABAAEAAQG+ABgAAQACAAABAAEAAQAB AAEAAQABAAEAAQoAAQIGAAEACwACAQECBgACAAEAAQG+ABgAAgACAAABAAEAAQABAAEAAQABAAEA AQoAAQIGAAIACwACAQECBgADAAEAAQG+ABgAAwACAAABAAEAAQABAAEAAQABAAEAAQoAAQIGAAMA CwACAQECBgAEAAEAAQG+ABgABAACAAABAAEAAQABAAEAAQABAAEAAQoAAQIGAAQACwACAQECBgAF AAEAAQG+ABgABQACAAABAAEAAQABAAEAAQABAAEAAQoAAQIGAAUACwACAQECBgAGAAEAAQG+ABgA BgACAAABAAEAAQABAAEAAQABAAEAAQoAAQIGAAYACwACAQECBgAHAAEAAQG+ABgABwACAAABAAEA AQABAAEAAQABAAEAAQoAAQIGAAcACwACAQECBgAIAAEAAQG+ABgACAACAAABAAEAAQABAAEAAQAB AAEAAQoAAQIGAAgACwACAQECBgAJAAEAAQG+ABgACQACAAABAAEAAQABAAEAAQABAAEAAQoAAQIG AAkACwACAQECBgAKAAEAAQG+ABgACgACAAABAAEAAQABAAEAAQABAAEAAQoAAQIGAAoACwACAQEC BgALAAEAAQG+ABgACwACAAABAAEAAQABAAEAAQABAAEAAQoAAQIGAAsACwACAQECBgAMAAEAAQG+ ABgADAACAAABAAEAAQABAAEAAQABAAEAAQoAAQIGAAwACwACAQECBgANAAEAAQG+ABgADQACAAAB AAEAAQABAAEAAQABAAEAAQoAAQIGAA0ACwACAQECBgAOAAEAAQG+ABgADgACAAABAAEAAQABAAEA AQABAAEAAQoAAQIGAA4ACwACAQECBgAPAAEAAQG+AA4ADwACAAABAAEAAQABBQC+AA4ADwAHAAAB AAEAAQABCgABAgYADwALAAIBAQIGABAAAQABAb4AGAAQAAIAAAEAAQABAAEAAQABAAEAAQABCgAB AgYAEAALAAIBAQIGABEAAQABAb4AGAARAAIAAAEAAQABAAEAAQABAAEAAQABCgABAgYAEQALAAIB AQIGABIAAQABAb4AGAASAAIAAAEAAQABAAEAAQABAAEAAQABCgABAgYAEgALAAIBAQIGABMAAQAB Ab4AGAATAAIAAAEAAQABAAEAAQABAAEAAQABCgABAgYAEwALAAIBAQIGABQAAQABAb4AGAAUAAIA AAEAAQABAAEAAQABAAEAAQABCgABAgYAFAALAAIBAQIGABUAAQABAb4AGAAVAAIAAAEAAQABAAEA AQABAAEAAQABCgABAgYAFQALAAIBAQIGABYAAQABAb4AGAAWAAIAAAEAAQABAAEAAQABAAEAAQAB CgABAgYAFgALAAIBAQIGABcAAQABAb4AGAAXAAIAAAEAAQABAAEAAQABAAEAAQABCgABAgYAFwAL AAIBAQIGABgAAQABAb4AGAAYAAIAAAEAAQABAAEAAQABAAEAAQABCgABAgYAGAALAAIBAQIGABkA AQABAb4AGAAZAAIAAAEAAQABAAEAAQABAAEAAQABCgABAgYAGQALAAIBAQIGABoAAQABAb4AGAAa AAIAAAEAAQABAAEAAQABAAEAAQABCgABAgYAGgALAAIBAQIGABsAAQABAb4AGAAbAAIAAAEAAQAB AAEAAQABAAEAAQABCgABAgYAGwALAAIBAQIGABwAAQABAb4AGAAcAAIAAAEAAQABAAEAAQABAAEA AQABCgABAgYAHAALAAIBAQIGAB0AAQABAb4AGAAdAAIAAAEAAQABAAEAAQABAAEAAQABCgABAgYA HQALAAIBAQIGAB4AAQABAb4AGAAeAAIAAAEAAQABAAEAAQABAAEAAQABCgABAgYAHgALAAIBAQIG AB8AAQABAb4AGAAfAAIAAAEAAQABAAEAAQABAAEAAQABCgABAgYAHwALAAIB1wBEAIgIAABsAjAA MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADgAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAw ADAACAIQACAAAQAMAB0BAAAAAIAB/wAIAhAAIQABAAwAHQEAAAAAgAH/AAECBgAgAAEAAQG+ABgA IAACAAABAAEAAQABAAEAAQABAAEAAQoAAQIGACAACwACAQECBgAhAAEAAwG+ABgAIQACAAQBBAEE AQQBBAEEAQQBBAEEAQoAAQIGACEACwAFAdcACACIAAAAFAAwAOwAKAEPAALw3g0AABAACPAIAAAA EwAAAHcgAAAPAAPwxg0AAA8ABPAoAAAAAQAJ8BAAAAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgAAAAA BAAABQAAAA8ABPDQAAAAsgQK8AgAAABmIAAAAAoAAOMAC/CWAAAAfwCAAI0BBEEBAAAAfwEgADAA gAEAAAAAgQFAAAAIggEAAAEAvwEBABEAzQEAAAAA/wEAAAgAPwIAAAIAPwMQABAAgIMWAAAAgoMs AAAAvwMIAAgAUABpAGMAdAB1AHIAZQAgADIAMQAAANDJ6nn5us4RjIIAqgBLqQsCAAAACAAAAAgA AAC6TptSRI2QbiEAQQAxAAAAAAAQ8BIAAAACAAEAKwIHABsABgANAQ0ADQAAABHwAAAAAF0AJgAV ABIACABmHBEBAgAAAgIAAAMCAAAEAgAABQIAAAYCAAAHAgAACAIAAAkCAAAKAgAACwIAAAwCAAAN AgAADgIAAA8CAAAQAgAAEQIAABICAAATAgAAFAIAABUCAAAWAgAAFwIAABgCAAAZAgAAGgIAABsC AAAcAgAAHQIAAB4CAAAfAgAAIAIAACECAAAiAgAAIwIAACQCAAAlAgAAJgIAACcCAAAoAgAAKQIA ACoCAAArAgAALAIAAC0CAAAuAgAALwIAADACAAAxAgAAMgIAADMCAAA0AgAANQIAADYCAAA3AgAA OAIAADkCAAA6AgAAOwIAADwCAAA9AgAAPgIAAD8CAABAAgAAQQIAAEICAABDAgAARAIAAEUCAABG AgAARwIAAEgCAABJAgAASgIAAEsCAABMAgAATQIAAE4CAABPAgAAUAIAAFECAABSAgAAUwIAAFQC AABVAgAAVgIAAFcCAABYAgAAWQIAAFoCAABbAgAAXAIAAF0CAABeAgAAXwIAAGACAABhAgAAYgIA AGMCAABkAgAAZQIAAGYCAABnAgAAaAIAAGkCAABqAgAAawIAAGwCAABtAgAAbgIAAG8CAABwAgAA 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 AFcAbwByAGQAQQByAHQAIAAzADcAAAAAABDwEgAAAAAABQDUAxoAQgAGAJsAGwCuAAAAEfAAAAAA XQAaABUAEgACAHQcEWAAAAAAAAAAAAAAAAAAAAAA7AAIAAAADfAAAAAAtgESABQCAAAAAAAAAAAB ABAAAAAAADwAAwABNwA8ABAAAAAfAAAAAAABAAAAAAAAAOwApgAPAATwpgAAABIACvAIAAAAdSAA AAAKAADTAAvwZAAAAH8AAACNAYEAKGsAAIIAcEcAAIMAAAAAAIQAAAAAAH8BIAAgAIABAAAAAIEB ////AIIBAAABAL8BAAAQAM0BAAAAAP8BAAAIAICDFgAAAFcAbwByAGQAQQByAHQAIAAxADAAAAAA ABDwEgAAAAAABQDGAAEAGwAKAHIDBQBCAAAAEfAAAAAAXQAaABUAEgACAHUcEWAAAAAAAAAAAAAA AAAAAAAA7AAIAAAADfAAAAAAtgESABICAAAAAAAAAACPAPAAAAAAADwAHwEBaFH9Vk1ROY3tcL9+ Gv80ADAAMAAtADYANgA4ADgALQAzADMANgAKAH9e3l01dd2LGv8I/zAAMgAwAAn/OAAyADcAOAA3 ADUAOAA2AAEwOAAyADYAMAA4ADgANQAyAAAw95YPXNBZATCxkEhRH3UKAPFtM1c1dd2LGv8I/zAA NwA1ADUACf82ADEAMgA4ADYANQA2ADYAADAgXw9c0FkKAApOd201dd2LGv8I/zAAMgAxAAn/NQAx ADYAOQA3ADkAMAA5AAEwNQAxADYAOQA3ADkAMQAyAAAwIYVIUR91ATCLcw9c0FkKAChXv36oVOKL UQBRABr/MwA0ADMAMAA5ADUAMgAzADEAKACMmsGL4U9vYBr//osLeqhU4osJ/zwA8AAAACQAAAAA AAcAJAAAAAAAFAAkAAAAAAAaACQAAAAAAB0AJAAAAAAAHgAkAAAAAAAmACQAAAAAACcAJAAAAAAA LwAkAAAAAAA3ACQAAAAAADgAJAAAAAAAPgAkAAAAAABCACQAAAAAAEMAJAAAAAAASwAkAAAAAABP ACQAAAAAAFAAJAAAAAAAVgAkAAAAAABZACQAAAAAAFoAJAAAAAAAYgAkAAAAAABjACQAAAAAAGsA JAAAAAAAcwAkAAAAAAB0ACQAAAAAAHgAJAAAAAAAegAkAAAAAAB7ACQAAAAAAIUAJAAAAAAAjwAA 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 vgAMAAMABgALAQsBCwEIAP0ACgAEAAAADAEAAAAA/QAKAAQAAQANAQEAAAC+AA4ABAACAA0BDQEN AQ0BBQD9AAoABAAGAA0BAgAAAP0ACgAEAAcADQEDAAAA/QAKAAQACAAOAQQAAAD9AAoABQAAADwB BQAAAP0ACgAFAAEAPQEGAAAA/QAKAAUAAgA9AQcAAAD9AAoABQADAD0BCAAAAP0ACgAFAAQAPQEJ AAAA/QAKAAUABQA9AQoAAAD9AAoABQAGAD4BCwAAAP0ACgAFAAcAPwEMAAAAfgIKAAUACABAAQAA qUD9AAoABgAAAEEBDQAAAP0ACgAGAAEAQgEOAAAA/QAKAAYAAgBCAQ8AAAC+AAwABgADAEIBQgFC AQUA/QAKAAYABgBDARAAAAD9AAoABgAHAEQBEQAAAH4CCgAGAAgARQEAwLJA/QAKAAcAAABBARIA AAD9AAoABwABAEIBEwAAAP0ACgAHAAIAQgEUAAAA/QAKAAcAAwBCARUAAAD9AAoABwAEAEIBFgAA AP0ACgAHAAUAQgEXAAAA/QAKAAcABgBDARgAAAD9AAoABwAHAEQBDAAAAH4CCgAHAAgARQEAeK5A /QAKAAgAAABBARkAAAD9AAoACAABAEIBGgAAAP0ACgAIAAIAQgEbAAAAvgAMAAgAAwBCAUIBQgEF AP0ACgAIAAYAQwEQAAAA/QAKAAgABwBEARwAAAB+AgoACAAIAEUBAACZQP0ACgAJAAAAQQEdAAAA /QAKAAkAAQBCAR4AAAD9AAoACQACAEIBHwAAAL4ADAAJAAMAQgFCAUIBBQD9AAoACQAGAEMBEAAA AP0ACgAJAAcARAEMAAAAfgIKAAkACABFAQAAqUD9AAoACgAAAEEBIAAAAP0ACgAKAAEAQgEhAAAA /QAKAAoAAgBCASIAAAD9AAoACgADAEIBIwAAAP0ACgAKAAQAQgEkAAAAAQIGAAoABQBCAf0ACgAK AAYAQwElAAAA/QAKAAoABwBEAREAAAB+AgoACgAIAEUBAMCyQP0ACgALAAAAQQEmAAAA/QAKAAsA AQBCAScAAAD9AAoACwACAEIBBgAAAP0ACgALAAMAQgEoAAAA/QAKAAsABABCASkAAAABAgYACwAF AEIB/QAKAAsABgBDASUAAAD9AAoACwAHAEQBDAAAAH4CCgALAAgARQEAAKlA/QAKAAwAAABBASoA AAD9AAoADAABAEIBKwAAAP0ACgAMAAIAQgEsAAAA/QAKAAwAAwBCAS0AAAD9AAoADAAEAEIBLgAA AAECBgAMAAUAQgH9AAoADAAGAEMBJQAAAP0ACgAMAAcARAEcAAAAfgIKAAwACABFAQAAmUD9AAoA DQAAAEEBLwAAAP0ACgANAAEAQgEwAAAA/QAKAA0AAgBCATEAAAC+AAwADQADAEIBQgFCAQUA/QAK AA0ABgBDATIAAAD9AAoADQAHAEQBDAAAAH4CCgANAAgARQEAcKdA/QAKAA4AAABBATMAAAD9AAoA DgABAEIBNAAAAP0ACgAOAAIAQgE1AAAA/QAKAA4AAwBCATYAAAD9AAoADgAEAEIBNwAAAP0ACgAO AAUAQgE4AAAA/QAKAA4ABgBDATkAAAD9AAoADgAHAEQBDAAAAP0ACgAOAAgARwE6AAAA/QAKAA8A AABBATsAAAD9AAoADwABAEIBPAAAAL4ADgAPAAIAQgFCAUIBQgEFAP0ACgAPAAYAQwE9AAAA/QAK AA8ABwBEAQwAAAB+AgoADwAIAEUBACCsQP0ACgAQAAAAQQE+AAAA/QAKABAAAQBCAT8AAAD9AAoA EAACAEIBMQAAAP0ACgAQAAMAQgFAAAAAvgAKABAABABCAUIBBQD9AAoAEAAGAEMBQQAAAP0ACgAQ AAcARAEMAAAAfgIKABAACABFAQAAqUD9AAoAEQAAAEEBQgAAAP0ACgARAAEAQgFDAAAA/QAKABEA AgBCAR4AAAD9AAoAEQADAEIBRAAAAP0ACgARAAQAQgFFAAAA/QAKABEABQBCAUYAAAD9AAoAEQAG AEMBRwAAAP0ACgARAAcARAEMAAAAfgIKABEACABFAQBQpED9AAoAEgAAAEEBSAAAAP0ACgASAAEA RgFJAAAA/QAKABIAAgBGAUoAAAD9AAoAEgADAEYBSwAAAP0ACgASAAQARgFMAAAA/QAKABIABQBG AU0AAAD9AAoAEgAGAEMBTgAAAP0ACgASAAcARAEMAAAA/QAKABIACABHAU8AAAD9AAoAEwAAAEEB UAAAAP0ACgATAAEARgFRAAAAvgAOABMAAgBGAUYBRgFGAQUA/QAKABMABgBDAVIAAAD9AAoAEwAH AEQBDAAAAH4CCgATAAgARwEAIJxA/QAKABQAAABBAVMAAAD9AAoAFAABAEYBVAAAAL4ADgAUAAIA RgFGAUYBRgEFAP0ACgAUAAYAQwFVAAAA/QAKABQABwBEAQwAAAB+AgoAFAAIAEcBAACpQP0ACgAV AAAAQQFWAAAA/QAKABUAAQBGAUMAAAC+AA4AFQACAEYBRgFGAUYBBQD9AAoAFQAGAEMBVwAAAP0A CgAVAAcARAEMAAAAfgIKABUACABHAQCwrUD9AAoAFgAAAEgBWAAAAP0ACgAWAAEARgFFAAAAvgAO ABYAAgBGAUYBRgFGAQUA/QAKABYABgBDAVkAAAD9AAoAFgAHAEQBDAAAAH4CCgAWAAgARwEAWKtA /QAKABcAAABIAVoAAAD9AAoAFwABAEYBWwAAAL4ADgAXAAIARgFGAUYBRgEFAP0ACgAXAAYAQwFc AAAA/QAKABcABwBEAQwAAAB+AgoAFwAIAEcBAFCuQP0ACgAYAAAASAFdAAAA/QAKABgAAQBGAV4A AAC+AA4AGAACAEYBRgFGAUYBBQD9AAoAGAAGAEMBXwAAAP0ACgAYAAcARAEMAAAAfgIKABgACABH AQAQs0D9AAoAGQAAAEgBYAAAAP0ACgAZAAEARgFhAAAAvgAOABkAAgBGAUYBRgFGAQUA/QAKABkA BgBDAWIAAAD9AAoAGQAHAEQBDAAAAH4CCgAZAAgARQEAUK5A/QAKABoAAABIAWMAAAD9AAoAGgAB AEYBQwAAAP0ACgAaAAIARgEeAAAA/QAKABoAAwBGARUAAAD9AAoAGgAEAEIBZAAAAP0ACgAaAAUA QgFlAAAA/QAKABoABgBDAWYAAAD9AAoAGgAHAEQBDAAAAH4CCgAaAAgARwEAiKNA/QAKABsAAABI AWcAAAD9AAoAGwABAEYBaAAAAL4ACgAbAAIARgFGAQMAvgAKABsABABCAUIBBQD9AAoAGwAGAEMB aQAAAP0ACgAbAAcARAEMAAAAfgIKABsACABHAQAwoUD9AAoAHAAAAEgBagAAAP0ACgAcAAEARgFr AAAAvgAMABwAAgBGAUYBRgEEAAECBgAcAAUAQgH9AAoAHAAGAEMBbAAAAP0ACgAcAAcARAEMAAAA fgIKABwACABHAQAAqUD9AAoAHQAAAEgBbQAAAP0ACgAdAAEARgEfAAAAvgAMAB0AAgBGAUYBRgEE AAECBgAdAAUAQgH9AAoAHQAGAEMBbgAAAP0ACgAdAAcARAEMAAAAfgIKAB0ACABHAQAAqUD9AAoA HgAAAEgBbwAAAP0ACgAeAAEARgFwAAAAvgAMAB4AAgBGAUYBRgEEAAECBgAeAAUAQgH9AAoAHgAG AEMBcQAAAP0ACgAeAAcARAEMAAAAfgIKAB4ACABHAQBQpED9AAoAHwAAAEgBcgAAAP0ACgAfAAEA RgFzAAAAvgAMAB8AAgBGAUYBRgEEAAECBgAfAAUAQgH9AAoAHwAGAEMBdAAAAP0ACgAfAAcARAEM AAAAfgIKAB8ACABHAQAgrEDXAEQAbA4AAGwCJAAkACQAJABYAH4AZAB+AGQAZAB6AHoAegBkAH4A WABwAH4AfgBYAFgAWABYAFgAWABYAH4AYgBgAGAAYAAIAhAAIAAAAAkA4AEAAAAAwAEPAQgCEAAh AAAACQDgAQAAAADAAQ8BCAIQACIAAAAJAOABAAAAAMABDwEIAhAAIwAAAAkA4AEAAAAAwAEPAQgC EAAkAAAACQDgAQAAAADAAQ8BCAIQACUAAAAJAOABAAAAAMABDwEIAhAAJgAAAAkA4AEAAAAAwAEP AQgCEAAnAAAACQDgAQAAAADAAQ8BCAIQACgAAAAJAOABAAAAAMABDwEIAhAAKQAAAAkA4AEAAAAA wAEPAQgCEAAqAAAACQDgAQAAAADAAQ8BCAIQACsAAAAJAOABAAAAAMABDwEIAhAALAAAAAkA4AEA AAAAwAEPAQgCEAAtAAAACQDgAQAAAADAAQ8BCAIQAC4AAAAJAOABAAAAAMABDwEIAhAALwAAAAkA 4AEAAAAAwAEPAQgCEAAwAAAACQDgAQAAAADAAQ8BCAIQADEAAAAJAOABAAAAAMABDwEIAhAAMgAA AAkA4AEAAAAAwAEPAQgCEAAzAAAACQDgAQAAAADAAQ8BCAIQADQAAAAJAOABAAAAAMABDwEIAhAA NQAAAAkA4AEAAAAAwAEPAQgCEAA2AAAACQDgAQAAAADAAQ8BCAIQADcAAAAJAOABAAAAAMABDwEI AhAAOAAAAAkA4AEAAAAAwAEPAQgCEAA5AAAACQDgAQAAAADAAQ8BCAIQADoAAAAJAOABAAAAAMAB DwEIAhAAOwAAAAkA4AEAAAAAwAEPAQgCEAA8AAAACQDgAQAAAADAAQ8BCAIQAD0AAAAJAOABAAAA AMABDwEIAhAAPgAAAAkA4AEAAAAAwAEPAf0ACgAgAAAASAF1AAAA/QAKACAAAQBGAXYAAAD9AAoA IAACAEYBdwAAAP0ACgAgAAMAQgF4AAAA/QAKACAABABCAXkAAAD9AAoAIAAFAEIBegAAAP0ACgAg AAYAQwFmAAAA/QAKACAABwBEAQwAAAB+AgoAIAAIAEUBAIijQP0ACgAhAAAASAF7AAAA/QAKACEA AQBGAXwAAAC+AAwAIQACAEYBRgFGAQQAAQIGACEABQBCAf0ACgAhAAYAQwFVAAAA/QAKACEABwBE AQwAAAB+AgoAIQAIAEcBAACpQP0ACgAiAAAASAF9AAAA/QAKACIAAQBGAX4AAAD9AAoAIgACAEYB fwAAAP0ACgAiAAMARgEfAAAA/QAKACIABABGAYAAAAD9AAoAIgAFAEYBBwAAAP0ACgAiAAYAQwGB AAAA/QAKACIABwBEAQwAAAB+AgoAIgAIAEUBAIijQP0ACgAjAAAASAGCAAAA/QAKACMAAQBGAYMA AAD9AAoAIwACAEYBhAAAAP0ACgAjAAMARgGFAAAAvgAKACMABABGAUYBBQD9AAoAIwAGAEkBhgAA AP0ACgAjAAcASgEMAAAAfgIKACMACABLAQAAqUD9AAoAJAAAAEgBhwAAAP0ACgAkAAEARgFFAAAA vgAOACQAAgBGAUYBRgFGAQUA/QAKACQABgBDAYgAAAD9AAoAJAAHAEQBDAAAAH4CCgAkAAgARQEA wKxA/QAKACUAAABIAYkAAAD9AAoAJQABAEYBdgAAAP0ACgAlAAIARgGKAAAAvgAMACUAAwBGAUYB RgEFAP0ACgAlAAYAQwGLAAAA/QAKACUABwBEAQwAAAB+AgoAJQAIAEUBACCsQP0ACgAmAAAASAGM AAAA/QAKACYAAQBGAY0AAAC+AA4AJgACAEYBRgFGAUYBBQD9AAoAJgAGAEMBjgAAAP0ACgAmAAcA RAEcAAAAfgIKACYACABFAQAopED9AAoAJwAAAEgBjwAAAP0ACgAnAAEARgGQAAAAvgAOACcAAgBG AUYBRgFGAQUA/QAKACcABgBDAXQAAAD9AAoAJwAHAEQBHAAAAH4CCgAnAAgARQEAwJJA/QAKACgA AABIAZEAAAD9AAoAKAABAEYBkgAAAP0ACgAoAAIARgGTAAAA/QAKACgAAwBGAZQAAAD9AAoAKAAE AEYBlQAAAP0ACgAoAAUARgGWAAAA/QAKACgABgBDAZcAAAD9AAoAKAAHAEQBDAAAAH4CCgAoAAgA RQEAAKlA/QAKACkAAABIAZgAAAD9AAoAKQABAEYBEwAAAL4ADgApAAIARgFGAUYBRgEFAP0ACgAp AAYAQwGZAAAA/QAKACkABwBEAQwAAAB+AgoAKQAIAEUBAPCeQP0ACgAqAAAAQQGaAAAA/QAKACoA AQBGAZsAAAC+AA4AKgACAEYBRgFGAUYBBQD9AAoAKgAGAEMBnAAAAP0ACgAqAAcARAEcAAAAfgIK ACoACABFAQBAmkD9AAoAKwAAAEEBnQAAAP0ACgArAAEARgGeAAAAvgAOACsAAgBGAUYBRgFGAQUA /QAKACsABgBDAZ8AAAD9AAoAKwAHAEQBDAAAAH4CCgArAAgARQEAIKxA/QAKACwAAABBAaAAAAD9 AAoALAABAEYBoQAAAL4ADgAsAAIARgFGAUYBRgEFAP0ACgAsAAYAQwGiAAAA/QAKACwABwBEAQwA AAB+AgoALAAIAEUBAOClQP0ACgAtAAAASAGjAAAA/QAKAC0AAQBGAaQAAAD9AAoALQACAEYBpQAA AP0ACgAtAAMARgGmAAAA/QAKAC0ABABGAacAAAABAgYALQAFAEYB/QAKAC0ABgBDAagAAAD9AAoA LQAHAEQBEQAAAH4CCgAtAAgARQEAaLBA/QAKAC4AAABIAakAAAD9AAoALgABAEYBqgAAAL4ADgAu AAIARgFGAUYBRgEFAP0ACgAuAAYAQwGrAAAA/QAKAC4ABwBEAawAAAB+AgoALgAIAEUBAACJQP0A CgAvAAAASAGtAAAA/QAKAC8AAQBGAa4AAAC+AA4ALwACAEYBRgFGAUYBBQD9AAoALwAGAEMBqwAA AP0ACgAvAAcARAEcAAAAfgIKAC8ACABFAQBwl0D9AAoAMAAAAEgBrwAAAP0ACgAwAAEARgGwAAAA /QAKADAAAgBGAbEAAAC+AAwAMAADAEYBRgFGAQUA/QAKADAABgBDAbIAAAD9AAoAMAAHAEQBDAAA AH4CCgAwAAgARQEA8J5A/QAKADEAAABIAbMAAAD9AAoAMQABAEYBBwAAAL4ADgAxAAIARgFGAUYB RgEFAP0ACgAxAAYAQwG0AAAA/QAKADEABwBEAQwAAAB+AgoAMQAIAEUBAFirQP0ACgAyAAAASAG1 AAAA/QAKADIAAQBGAbYAAAD9AAoAMgACAEYBCAAAAL4ADAAyAAMARgFGAUYBBQD9AAoAMgAGAEMB twAAAP0ACgAyAAcARAEMAAAAfgIKADIACABFAQBQrkD9AAoAMwAAAEgBSAAAAP0ACgAzAAEARgEU AAAA/QAKADMAAgBGAbgAAAD9AAoAMwADAEYBPwAAAP0ACgAzAAQARgG5AAAA/QAKADMABQBGAboA AAD9AAoAMwAGAEMBuwAAAP0ACgAzAAcARAEMAAAAfgIKADMACABFAQDgpUD9AAoANAAAAEgBvAAA AP0ACgA0AAEARgG9AAAA/QAKADQAAgBGAb4AAAD9AAoANAADAEYBvwAAAL4ACgA0AAQARgFGAQUA /QAKADQABgBDAcAAAAD9AAoANAAHAEQBwQAAAH4CCgA0AAgARQEAwLJA/QAKADUAAABIAcIAAAD9 AAoANQABAEYBwwAAAP0ACgA1AAIARgHEAAAA/QAKADUAAwBGAcUAAAC+AAoANQAEAEYBRgEFAP0A CgA1AAYAQwHGAAAA/QAKADUABwBEAQwAAAB+AgoANQAIAEUBAACpQP0ACgA2AAAASAHHAAAA/QAK ADYAAQBGAcgAAAD9AAoANgACAEYByQAAAP0ACgA2AAMARgHKAAAAvgAKADYABABGAUYBBQD9AAoA NgAGAEMBxgAAAP0ACgA2AAcARAEcAAAAfgIKADYACABFAQAgnED9AAoANwAAAEgBywAAAP0ACgA3 AAEARgHMAAAAvgAOADcAAgBGAUYBRgFGAQUA/QAKADcABgBDAc0AAAD9AAoANwAHAEQBHAAAAH4C CgA3AAgARQEAIJxA/QAKADgAAABIAc4AAAD9AAoAOAABAEYBzwAAAP0ACgA4AAIARgHQAAAA/QAK ADgAAwBGAUsAAAD9AAoAOAAEAEYBQAAAAP0ACgA4AAUARgFMAAAA/QAKADgABgBDAdEAAAD9AAoA OAAHAEQBDAAAAH4CCgA4AAgARQEAAKlA/QAKADkAAABIAdIAAAD9AAoAOQABAEYB0wAAAP0ACgA5 AAIARgE0AAAA/QAKADkAAwBGAdQAAAD9AAoAOQAEAEYB1QAAAP0ACgA5AAUARgHWAAAA/QAKADkA BgBDAdcAAAD9AAoAOQAHAEQBDAAAAH4CCgA5AAgARQEAsK1A/QAKADoAAABIAdgAAAD9AAoAOgAB AEYBHgAAAL4ADgA6AAIARgFGAUYBRgEFAP0ACgA6AAYAQwHZAAAA/QAKADoABwBEAQwAAAB+AgoA OgAIAEUBAIijQP0ACgA7AAAASAHaAAAA/QAKADsAAQBGARQAAAD9AAoAOwACAEYB2wAAAP0ACgA7 AAMARgFKAAAA/QAKADsABABGATEAAAD9AAoAOwAFAEYB3AAAAP0ACgA7AAYAQwHXAAAA/QAKADsA BwBEAQwAAAB+AgoAOwAIAEUBAACpQP0ACgA8AAAASAHdAAAA/QAKADwAAQBGAd4AAAD9AAoAPAAC AEYB3wAAAP0ACgA8AAMARgEoAAAA/QAKADwABABGAeAAAAD9AAoAPAAFAEYB4QAAAP0ACgA8AAYA QwG7AAAA/QAKADwABwBEAQwAAAB+AgoAPAAIAEUBAOClQP0ACgA9AAAASAHiAAAA/QAKAD0AAQBG ATAAAAC+AA4APQACAEYBRgFGAUYBBQD9AAoAPQAGAEMB4wAAAP0ACgA9AAcARAEMAAAAfgIKAD0A CABFAQBEpkD9AAoAPgAAAEwB5AAAAP0ACgA+AAEATQHlAAAAvgAOAD4AAgBNAU0BTQFNAQUA/QAK AD4ABgBOAeYAAAD9AAoAPgAHAE8BDAAAAH4CCgA+AAgAUAEAAKlA1wBCAPIOAABYAn4AYAB+AHAA WABkAFgAWAB+AFgAWABYAFgAegBYAFgAZABYAGQAfgBwAHAAcABYAH4AfgBYAH4AfgBYAOwAJAEP AALwBgMAACAACPAIAAAABQAAAG8xAAAPAAPw7gIAAA8ABPAoAAAAAQAJ8BAAAAAAAAAAAAAAAAAA AAAAAAAAAgAK8AgAAAAAJAAABQAAAA8ABPDMAAAAsgQK8AgAAABsMQAAAAoAAOMAC/CSAAAAfwCA AI0BBEEKAAAAfwEgADAAgAEAAAAAgQFAAAAIggEAAAEAvwEBABEAzQEAAAAA/wEAAAgAPwIAAAIA PwMQABAAgIMWAAAAgoMoAAAAvwMIAAgAUABpAGMAdAB1AHIAZQAgADEANQAAANDJ6nn5us4RjIIA qgBLqQsCAAAACAAAAAYAAACWmXWYIQBBADEAAAAAABDwEgAAAAIABQCWAAAAqAAIABMDAgDoAAAA EfAAAAAAXQAmABUAEgAIAGwNEWAAAAAAAAAAAAAAAAAHAAIA//8IAAIAAAAAAAAA7ACmAA8ABPCm AAAAEgAK8AgAAABtMQAAAAoAANMAC/BkAAAAfwAAAI0BgQAoawAAggBwRwAAgwAoawAAhAAAAAAA fwEgACAAgAEAAAAAgQH///8AggEAAAEAvwEAABAAzQEAAAAA/wEAAAgAgIMWAAAAVwBvAHIAZABB AHIAdAAgADEAMQAAAAAAEPASAAAAAAAAAL4CAwAgAAUA3QIEAGgAAAAR8AAAAABdABoAFQASAAIA bQ0RYAAAAAAAAAAAAAAAAAAAAADsAAgAAAAN8AAAAAC2ARIAFAIAAAAAAAAAABsAGAAAAAAAPAA3 AAHmi8Z+hHb+iwt6J1myfg5OsosIXstOzX73i3t2RpZXAFcAVwAuAE8AVAA1ADEALgBDAE8ATQA8 ABgAAAAmAAAAAAAPACYAAAAAABsAAAAAAAAA7ACOAA8ABPCGAAAAsgQK8AgAAABuMQAAAAoAALMA C/BMAAAAfwCAAI0BBEEJAAAAfwEgADAAgAEAAAAAgQH///8AggEAAAEAvwEAABAAzQEAAAAA/wEA AAgAPwMQABAAgIMKAAAA/lZHciAAMQAAAAAAEPASAAAAAgAAAAAAAAAAAAEAiwECAHgAAAAR8AAA AABdACYAFQASAAgAbg0RYAAAAAAAAAAAAAAAAAcAAgD//wgAAgABAAAAAADsAKYADwAE8KYAAAAS AArwCAAAAG8xAAAACgAA0wAL8GQAAAB/AAAAjQGBAChrAACCAHBHAACDAAAAAACEAAAAAAB/ASAA IACAAQAAAACBAf///wCCAQAAAQC/AQAAEADNAQAAAAD/AQAACACAgxYAAABXAG8AcgBkAEEAcgB0 ACAAMQAwAAAAAAAQ8BIAAAAAAAEAlgAAABgABACPAwMAKAAAABHwAAAAAF0AGgAVABIAAgBvDRFg AAAAAAAAAAAAAAAAAAAAAOwACAAAAA3wAAAAALYBEgASAgAAAAAAAAAAjwDwAAAAAAA8AB8BAWhR /VZNUTmN7XC/fhr/NAAwADAALQA2ADYAOAA4AC0AMwAzADYACgB/Xt5dNXXdixr/CP8wADIAMAAJ /zgAMgA3ADgANwA1ADgANgABMDgAMgA2ADAAOAA4ADUAMgAAMPeWD1zQWQEwsZBIUR91CgDxbTNX NXXdixr/CP8wADcANQA1AAn/NgAxADIAOAA2ADUANgA2AAAwIF8PXNBZCgAKTndtNXXdixr/CP8w ADIAMQAJ/zUAMQA2ADkANwA5ADAAOQABMDUAMQA2ADkANwA5ADEAMgAAMCGFSFEfdQEwi3MPXNBZ CgAoV79+qFTii1EAUQAa/zMANAAzADAAOQA1ADIAMwAxACgAjJrBi+FPb2Aa//6LC3qoVOKLCf88 APAAAAAkAAAAAAAHACQAAAAAABQAJAAAAAAAGgAkAAAAAAAdACQAAAAAAB4AJAAAAAAAJgAkAAAA AAAnACQAAAAAAC8AJAAAAAAANwAkAAAAAAA4ACQAAAAAAD4AJAAAAAAAQgAkAAAAAABDACQAAAAA AEsAJAAAAAAATwAkAAAAAABQACQAAAAAAFYAJAAAAAAAWQAkAAAAAABaACQAAAAAAGIAJAAAAAAA YwAkAAAAAABrACQAAAAAAHMAJAAAAAAAdAAkAAAAAAB4ACQAAAAAAHoAJAAAAAAAewAkAAAAAACF ACQAAAAAAI8AAAAAAAAAPgISAL4BAAAAAEAAAAA8AAAAAAAAAEEACgAAAAUABQAAAAIAHQAPAAIF AAAAAAABAAUABQAAAJkAAgAACeUACgABAAQABAABAAUAsAFOAAIAAQAFAD4AAAAIAAgAIwAjAAAA BQASABIAAAAFABIAGQAGAAgAFAAUAAEABQATABkAAAAAAAUAEQAAAAgAGgAiAAAACAAkAD4AAAAI ALEBHgACAA4AAAD//zogAoAABIAUQgAIAB4CAEEnAB4AAAuxAR4AAgAOAAAA//86IAKAAAQADUIA CAAeAgBBJwAeAQALsAEWAAIAAQAXABkAAQADAAEAFwAZAAEAAwCxAR4AAgAOAAAA//86IAKAAASA FEIACAAeAgBBJwAeAAALsQEeAAIADgAAAP//OiACgAAEAA1CAAgAHgIAQScAHgEAC7ABFgADAAEA FwAZAAIAAgABABcAGQACAAIAsQEeAAIADgAAAP//OiACgAAEgBRCAAgAHgIAQScAHgAAC7EBHgAC AA4AAAD//zogAoAABAANQgAIAB4CAEEnAB4BAAuxAR4AAgAOAAAA//86IAKAAASAFEIACAAeAgBB JwAeAAALsAEWAAIAAQAjACMABgAIAAEAIwAjAAYACACxAR4AAgAOAAAA//86IAKAAASAFEIACAAe AgBBJwAeAAALsQEeAAIADgAAAP//OiACgAAEAA1CAAgAHgIAQScAHgEAC7ABFgADAAEAFwAZAAMA AwABABcAGQADAAMAsQEeAAIADgAAAP//OiACgAAEgBRCAAgAHgIAQScAHgAAC7EBHgACAA4AAAD/ /zogAoAABAANQgAIAB4CAEEnAB4BAAuxAR4AAgAOAAAA//86IAKAAASAFEIACAAeAgBBJwAeAAAL sAEWAAMAAQAXABkAAQABAAEAFwAZAAEAAQCxAR4AAgAOAAAA//86IAKAAASAFEIACAAeAgBBJwAe AAALsQEeAAIADgAAAP//OiACgAAEAA1CAAgAHgIAQScAHgEAC7EBHgACAA4AAAD//zogAoAABIAU QgAIAB4CAEEnAB4AAAuwARYAAgABABcAGQAEAAUAAQAXABkABAAFALEBHgACAA4AAAD//zogAoAA BIAUQgAIAB4CAEEnAB4AAAuxAR4AAgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALsAEWAAIA AQAXABkAAgADAAEAFwAZAAIAAwCxAR4AAgAOAAAA//86IAKAAASAFEIACAAeAgBBJwAeAAALsQEe AAIADgAAAP//OiACgAAEAA1CAAgAHgIAQScAHgEAC7ABFgACAAEAEwATAAEAAQABABMAEwABAAEA sQEeAAIADgAAAP//OiACgAAEgBRCAAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAI AB4CAEEnAB4BAAuwARYAAgABABMAEwACAAIAAQATABMAAgACALEBHgACAA4AAAD//zogAoAABIAU QgAIAB4CAEEnAB4AAAuxAR4AAgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALsAEWAAIAAQAV ABYAAQACAAEAFQAWAAEAAgCxAR4AAgAOAAAA//86IAKAAASAFEIACAAeAgBBJwAeAAALsQEeAAIA DgAAAP//OiACgAAEAA1CAAgAHgIAQScAHgEAC7ABFgACAAEAEwATAAMABQABABMAEwADAAUAsQEe AAIADgAAAP//OiACgAAEgBRCAAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAIAB4C AEEnAB4BAAuwARYAAgABABUAFgADAAUAAQAVABYAAwAFALEBHgACAA4AAAD//zogAoAABIAUQgAI AB4CAEEnAB4AAAuxAR4AAgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALYggUAGIIAAAAAAAA AAAAABQAAABBAAAAZwgXAGcIAAAAAAAAAAAAAAIAAf/////8ewAACgAAAAkIEAAABhAAuw3NB8FA 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 zQEAAAAA/wEAAAgAgIMWAAAAVwBvAHIAZABBAHIAdAAgADEAMQAAAAAAEPASAAAAAAAAAL4CAwAg AAUA3QIEAGgAAAAR8AAAAABdABoAFQASAAIAbQ0RYAAAAAAAAAAAAAAAAAAAAADsAAgAAAAN8AAA AAC2ARIAFAIAAAAAAAAAABsAGAAAAAAAPAA3AAHmi8Z+hHb+iwt6J1myfg5OsosIXstOzX73i3t2 RpZXAFcAVwAuAE8AVAA1ADEALgBDAE8ATQA8ABgAAAAmAAAAAAAPACYAAAAAABsAAAAAAAAA7ACO AA8ABPCGAAAAsgQK8AgAAABuRQAAAAoAALMAC/BMAAAAfwCAAI0BBEEJAAAAfwEgADAAgAEAAAAA gQH///8AggEAAAEAvwEAABAAzQEAAAAA/wEAAAgAPwMQABAAgIMKAAAA/lZHciAAMQAAAAAAEPAS AAAAAgAAAAAAAAAAAAEAiwECAHgAAAAR8AAAAABdACYAFQASAAgAbg0RYAAAAAAAAAAAAAAAAAcA AgD//wgAAgABAAAAAADsAKYADwAE8KYAAAASAArwCAAAAG9FAAAACgAA0wAL8GQAAAB/AAAAjQGB AChrAACCAHBHAACDAAAAAACEAAAAAAB/ASAAIACAAQAAAACBAf///wCCAQAAAQC/AQAAEADNAQAA AAD/AQAACACAgxYAAABXAG8AcgBkAEEAcgB0ACAAMQAwAAAAAAAQ8BIAAAAAAAEAlgAAABgABACP AwMAKAAAABHwAAAAAF0AGgAVABIAAgBvDRFgAAAAAAAAAAAAAAAAAAAAAOwACAAAAA3wAAAAALYB EgASAgAAAAAAAAAAjwDwAAAAAAA8AB8BAWhR/VZNUTmN7XC/fhr/NAAwADAALQA2ADYAOAA4AC0A MwAzADYACgB/Xt5dNXXdixr/CP8wADIAMAAJ/zgAMgA3ADgANwA1ADgANgABMDgAMgA2ADAAOAA4 ADUAMgAAMPeWD1zQWQEwsZBIUR91CgDxbTNXNXXdixr/CP8wADcANQA1AAn/NgAxADIAOAA2ADUA NgA2AAAwIF8PXNBZCgAKTndtNXXdixr/CP8wADIAMQAJ/zUAMQA2ADkANwA5ADAAOQABMDUAMQA2 ADkANwA5ADEAMgAAMCGFSFEfdQEwi3MPXNBZCgAoV79+qFTii1EAUQAa/zMANAAzADAAOQA1ADIA MwAxACgAjJrBi+FPb2Aa//6LC3qoVOKLCf88APAAAAAkAAAAAAAHACQAAAAAABQAJAAAAAAAGgAk AAAAAAAdACQAAAAAAB4AJAAAAAAAJgAkAAAAAAAnACQAAAAAAC8AJAAAAAAANwAkAAAAAAA4ACQA AAAAAD4AJAAAAAAAQgAkAAAAAABDACQAAAAAAEsAJAAAAAAATwAkAAAAAABQACQAAAAAAFYAJAAA AAAAWQAkAAAAAABaACQAAAAAAGIAJAAAAAAAYwAkAAAAAABrACQAAAAAAHMAJAAAAAAAdAAkAAAA AAB4ACQAAAAAAHoAJAAAAAAAewAkAAAAAACFACQAAAAAAI8AAAAAAAAAPgISAL4BAAAAAEAAAAA8 AAAAAAAAAEEACgAAAAUABQAAAAIAHQAPAAIFAAAAAAABAAUABQAAAJkAAgCAEuUACgABAAQABAAB AAUAsAEWAAIAAQAFACUAAAAIAAEABQAlAAAACACxAR4AAgAOAAAA//86IAKAAASAFEIACAAeAgBB JwAeAAALsQEeAAIADgAAAP//OiACgAAEAA1CAAgAHgIAQScAHgEAC2IIFABiCAAAAAAAAAAAAAAU AAAAQQAAAGcIFwBnCAAAAAAAAAAAAAACAAH//////HsAAAoAAAAJCBAAAAYQALsNzQfBQAAAAAYA AAsCIAAAAAAAAAAAAGcAAAAlBwAAlFEEAABhBAAabwQAfHIEAA0AAgABAAwAAgBkAA8AAgABABEA AgAAABAACAD8qfHSTWJQP18AAgABACoAAgAAACsAAgAAAIIAAgABAIAACAAAAAAAAAAAACUCBAAB AOABgQACAMEEFAAAABUAAACDAAIAAACEAAIAAAAmAAgAAAAAAAAA6D8nAAgAAAAAAAAA6D8oAAgA AAAAAAAA8D8pAAgAAAAAAAAA8D+hACIACQBkAPfvAQABAAAAtAC0AAAAAAAAAOA/AAAAAAAA4D8B ABIAAgABAN0AAgABAGMAAgABABMAAgDJ6VUAAgAIAH0ADAAAAAAAoB4GAQIABAB9AAwAAQAFAKAN BwECAAQAfQAMAAYABgCgBwgBAgAEAH0ADAAHAAcAoAUIAQIABAB9AAwACAAIAKAICAECAAQAfQAM AAkAAAEACQYBBgAEAAACDgAAAAAAZwAAAAAACQAAAAgCEAAAAAEACQDgAQAAAADAAQkBCAIQAAEA AQAJAOABAAAAAMABCQEIAhAAAgABAAkA4AEAAAAAwAEJAQgCEAADAAEACQDgAQAAAADAAQkBCAIQ AAQAAAAJAOABAAAAAMABCQEIAhAABQAAAAkA4AEAAAAAQAEPAAgCEAAGAAAACQDgAQAAAABAAQ8A CAIQAAcAAAAJAOABAAAAAEABDwAIAhAACAAAAAkA4AEAAAAAQAEPAAgCEAAJAAAACQDgAQAAAABA AQ8ACAIQAAoAAAAJAOABAAAAAEABDwAIAhAACwAAAAkA4AEAAAAAQAEPAAgCEAAMAAAACQDgAQAA AABAAQ8ACAIQAA0AAAAJAOABAAAAAEABDwAIAhAADgAAAAkA4AEAAAAAQAEPAAgCEAAPAAAACQDg AQAAAABAAQ8ACAIQABAAAAAJAOABAAAAAEABDwAIAhAAEQAAAAkA4AEAAAAAQAEPAAgCEAASAAAA CQDgAQAAAABAAQ8ACAIQABMAAAAJAOABAAAAAEABDwAIAhAAFAAAAAkA4AEAAAAAQAEPAAgCEAAV AAAACQDgAQAAAABAAQ8ACAIQABYAAAAJAOABAAAAAEABDwAIAhAAFwAAAAkA4AEAAAAAQAEPAAgC EAAYAAAACQDgAQAAAABAAQ8ACAIQABkAAAAJAOABAAAAAEABDwAIAhAAGgAAAAkA4AEAAAAAQAEP AAgCEAAbAAAACQDgAQAAAABAAQ8ACAIQABwAAAAJAOABAAAAAEABDwAIAhAAHQAAAAkA4AEAAAAA QAEPAAgCEAAeAAAACQDgAQAAAABAAQ8ACAIQAB8AAAAJAOABAAAAAEABDwC+ABAAAAABAAoBCgEK AQoBCgEFAL4ADAAAAAYACwELAQsBCAC+ABAAAQABAAoBCgEKAQoBCgEFAL4ADAABAAYACwELAQsB CAC+ABAAAgABAAoBCgEKAQoBCgEFAL4ADAACAAYACwELAQsBCAC+ABAAAwABAAoBCgEKAQoBCgEF AL4ADAADAAYACwELAQsBCAD9AAoABAAAAAwBAAAAAP0ACgAEAAEADQEBAAAAvgAOAAQAAgANAQ0B DQENAQUA/QAKAAQABgANAQIAAAD9AAoABAAHAA0BAwAAAP0ACgAEAAgADgEEAAAA/QAKAAUAAAAx AVABAAD9AAoABQABABsBcwAAAP0ACgAFAAIAGwFRAQAA/QAKAAUAAwAcAVIBAAABAgYABQAEABsB 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 AAAQAM0BAAAAAP8BAAAIAICDFgAAAFcAbwByAGQAQQByAHQAIAAxADEAAAAAABDwEgAAAAAAAAC6 AgMAIAAFANMCBABoAAAAEfAAAAAAXQAaABUAEgACAG0NEWAAAAAAAAAAAAAAAAAAAAAA7AAIAAAA DfAAAAAAtgESABQCAAAAAAAAAAAaABgAAAAAADwANQAB5ovGfoR2/osLeidZsn4OTrKLCF7LTs1+ e3ZGllcAVwBXAC4ATwBUADUAMQAuAEMATwBNADwAGAAAACYAAAAAAA4AJgAAAAAAGgAAAAAAAADs AI4ADwAE8IYAAACyBArwCAAAAG5ZAAAACgAAswAL8EwAAAB/AIAAjQEEQQkAAAB/ASAAMACAAQAA AACBAf///wCCAQAAAQC/AQAAEADNAQAAAAD/AQAACAA/AxAAEACAgwoAAAD+VkdyIAAxAAAAAAAQ 8BIAAAACAAAAAAAAAAAAAQCLAQIAeAAAABHwAAAAAF0AJgAVABIACABuDRFgAAAAAAAAAAAAAAAA BwACAP//CAACAAEAAAAAAOwApgAPAATwpgAAABIACvAIAAAAb1kAAAAKAADTAAvwZAAAAH8AAACN AYEAKGsAAIIAcEcAAIMAAAAAAIQAAAAAAH8BIAAgAIABAAAAAIEB////AIIBAAABAL8BAAAQAM0B AAAAAP8BAAAIAICDFgAAAFcAbwByAGQAQQByAHQAIAAxADAAAAAAABDwEgAAAAAAAQCNAAAAGAAE AIYDAwAoAAAAEfAAAAAAXQAaABUAEgACAG8NEWAAAAAAAAAAAAAAAAAAAAAA7AAIAAAADfAAAAAA tgESABICAAAAAAAAAACPAPAAAAAAADwAHwEBaFH9Vk1ROY3tcL9+Gv80ADAAMAAtADYANgA4ADgA LQAzADMANgAKAH9e3l01dd2LGv8I/zAAMgAwAAn/OAAyADcAOAA3ADUAOAA2AAEwOAAyADYAMAA4 ADgANQAyAAAw95YPXNBZATCxkEhRH3UKAPFtM1c1dd2LGv8I/zAANwA1ADUACf82ADEAMgA4ADYA NQA2ADYAADAgXw9c0FkKAApOd201dd2LGv8I/zAAMgAxAAn/NQAxADYAOQA3ADkAMAA5AAEwNQAx ADYAOQA3ADkAMQAyAAAwIYVIUR91ATCLcw9c0FkKAChXv36oVOKLUQBRABr/MwA0ADMAMAA5ADUA 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 AACEAAAAAAB/ASAAIACAAQAAAACBAf///wCCAQAAAQC/AQAAEADNAQAAAAD/AQAACACAgxYAAABX AG8AcgBkAEEAcgB0ACAAMQAxAAAAAAAQ8BIAAAAAAAAAvgIDABgABQDdAgQAYAAAABHwAAAAAF0A GgAVABIAAgBtDRFgAAAAAAAAAAAAAAAAAAAAAOwACAAAAA3wAAAAALYBEgAUAgAAAAAAAAAAGwAY AAAAAAA8ADcAAeaLxn6Edv6LC3onWbJ+Dk6yiwhey07NfveLe3ZGllcAVwBXAC4ATwBUADUAMQAu AEMATwBNADwAGAAAACYAAAAAAA8AJgAAAAAAGwAAAAAAAADsAI4ADwAE8IYAAACyBArwCAAAAG5t AAAACgAAswAL8EwAAAB/AIAAjQEEQQkAAAB/ASAAMACAAQAAAACBAf///wCCAQAAAQC/AQAAEADN AQAAAAD/AQAACAA/AxAAEACAgwoAAAD+VkdyIAAxAAAAAAAQ8BIAAAACAAAAAAAAAAAAAQCLAQIA eAAAABHwAAAAAF0AJgAVABIACABuDRFgAAAAAAAAAAAAAAAABwACAP//CAACAAEAAAAAAOwApgAP AATwpgAAABIACvAIAAAAb20AAAAKAADTAAvwZAAAAH8AAACNAYEAKGsAAIIAcEcAAIMAAAAAAIQA AAAAAH8BIAAgAIABAAAAAIEB////AIIBAAABAL8BAAAQAM0BAAAAAP8BAAAIAICDFgAAAFcAbwBy AGQAQQByAHQAIAAxADAAAAAAABDwEgAAAAAAAQCWAAAAEAAEAI8DAwAgAAAAEfAAAAAAXQAaABUA EgACAG8NEWAAAAAAAAAAAAAAAAAAAAAA7AAIAAAADfAAAAAAtgESABICAAAAAAAAAACPAPAAAAAA ADwAHwEBaFH9Vk1ROY3tcL9+Gv80ADAAMAAtADYANgA4ADgALQAzADMANgAKAH9e3l01dd2LGv8I /zAAMgAwAAn/OAAyADcAOAA3ADUAOAA2AAEwOAAyADYAMAA4ADgANQAyAAAw95YPXNBZATCxkEhR H3UKAPFtM1c1dd2LGv8I/zAANwA1ADUACf82ADEAMgA4ADYANQA2ADYAADAgXw9c0FkKAApOd201 dd2LGv8I/zAAMgAxAAn/NQAxADYAOQA3ADkAMAA5AAEwNQAxADYAOQA3ADkAMQAyAAAwIYVIUR91 ATCLcw9c0FkKAChXv36oVOKLUQBRABr/MwA0ADMAMAA5ADUAMgAzADEAKACMmsGL4U9vYBr//osL eqhU4osJ/zwA8AAAACQAAAAAAAcAJAAAAAAAFAAkAAAAAAAaACQAAAAAAB0AJAAAAAAAHgAkAAAA AAAmACQAAAAAACcAJAAAAAAALwAkAAAAAAA3ACQAAAAAADgAJAAAAAAAPgAkAAAAAABCACQAAAAA AEMAJAAAAAAASwAkAAAAAABPACQAAAAAAFAAJAAAAAAAVgAkAAAAAABZACQAAAAAAFoAJAAAAAAA YgAkAAAAAABjACQAAAAAAGsAJAAAAAAAcwAkAAAAAAB0ACQAAAAAAHgAJAAAAAAAegAkAAAAAAB7 ACQAAAAAAIUAJAAAAAAAjwAAAAAAAAA+AhIAvgEAAAAAQAAAADwAAAAAAAAAQQAKAAAABQAFAAAA AgAdAA8AAgUAAAAAAAEABQAFAAAAmQACAAAJ5QAKAAEABAAEAAEABQCwATYAAgABAAUALgAAAAgA BQAuAC4ABgAHAC4ALgAAAAAAJwAtAAAABgAVACYAAAAFAAUAFAAAAAgAsQEeAAIADgAAAP//OiAC gAAEgA1CAAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAIAB4CAEEnAB4BAAuwARYA AgABAC4ALgABAAUAAQAuAC4AAQAFALEBHgACAA4AAAD//zogAoAABIANQgAIAB4CAEEnAB4AAAux AR4AAgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALsAEWAAMAAQAFAAcAAQAEAAEABQAHAAEA BACxAR4AAgAOAAAA//86IAKAAASADUIACAAeAgBBJwAeAAALsQEeAAIADgAAAP//OiACgAAEAA1C AAgAHgIAQScAHgEAC7EBHgACAA4AAAD//zogAoAABIANQgAIAB4CAEEnAB4AAAuwASYAAgABABUA GgAGAAcAAwAVABUABgAHABcAFwAHAAcAFwAaAAYABgCxAR4AAgAOAAAA//86IAKAAASAFEIACAAe AgBBJwAeAAALsQEeAAIADgAAAP//OiACgAAEAA1CAAgAHgIAQScAHgEAC7ABHgACAAEAFQAXAAgA CAACABUAFQAIAAgAFwAXAAgACACxAR4AAgAOAAAA//86IAKAAASADUIACAAeAgBBJwAeAAALsQEe AAIADgAAAP//OiACgAAEAA1CAAgAHgIAQScAHgEAC7ABFgACAAEAGQAZAAcABwABABkAGQAHAAcA sQEeAAIADgAAAP//OiACgAAEgBRCAAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAI AB4CAEEnAB4BAAuwARYAAgABABkAGQAIAAgAAQAZABkACAAIALEBHgACAA4AAAD//zogAoAABIAN QgAIAB4CAEEnAB4AAAuxAR4AAgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALsAEWAAIAAQAn AC0ABwAHAAEAJwAtAAcABwCxAR4AAgAOAAAA//86IAKAAASAFEIACAAeAgBBJwAeAAALsQEeAAIA DgAAAP//OiACgAAEAA1CAAgAHgIAQScAHgEAC7ABFgACAAEAJwAtAAgACAABACcALQAIAAgAsQEe AAIADgAAAP//OiACgAAEgA1CAAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAIAB4C AEEnAB4BAAuwARYAAgABACEAJgAGAAYAAQAhACYABgAGALEBHgACAA4AAAD//zogAoAABIAUQgAI AB4CAEEnAB4AAAuxAR4AAgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALsAEWAAIAAQAhACIA BwAHAAEAIQAiAAcABwCxAR4AAgAOAAAA//86IAKAAASAFEIACAAeAgBBJwAeAAALsQEeAAIADgAA AP//OiACgAAEAA1CAAgAHgIAQScAHgEAC7ABFgACAAEAIQAiAAgACAABACEAIgAIAAgAsQEeAAIA DgAAAP//OiACgAAEgA1CAAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAIAB4CAEEn AB4BAAuwARYAAgABABoAGgAIAAgAAQAaABoACAAIALEBHgACAA4AAAD//zogAoAABIANQgAIAB4C AEEnAB4AAAuxAR4AAgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALsAEWAAIAAQAaABoABwAH AAEAGgAaAAcABwCxAR4AAgAOAAAA//86IAKAAASADUIACAAeAgBBJwAeAAALsQEeAAIADgAAAP// OiACgAAEAA1CAAgAHgIAQScAHgEAC7ABFgACAAEAGwAgAAYABgABABsAIAAGAAYAsQEeAAIADgAA AP//OiACgAAEgBRCAAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAIAB4CAEEnAB4B AAuwARYAAgABABsAHgAHAAcAAQAbAB4ABwAHALEBHgACAA4AAAD//zogAoAABIAUQgAIAB4CAEEn AB4AAAuxAR4AAgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALsAEWAAIAAQAbAB4ACAAIAAEA GwAeAAgACACxAR4AAgAOAAAA//86IAKAAASADUIACAAeAgBBJwAeAAALsQEeAAIADgAAAP//OiAC gAAEAA1CAAgAHgIAQScAHgEAC7ABFgACAAEAIAAgAAcABwABACAAIAAHAAcAsQEeAAIADgAAAP// OiACgAAEgBRCAAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAIAB4CAEEnAB4BAAuw ARYAAgABACAAIAAIAAgAAQAgACAACAAIALEBHgACAA4AAAD//zogAoAABIANQgAIAB4CAEEnAB4A AAuxAR4AAgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALsAEWAAIAAQAWABYABwAHAAEAFgAW AAcABwCxAR4AAgAOAAAA//86IAKAAASAFEIACAAeAgBBJwAeAAALsQEeAAIADgAAAP//OiACgAAE AA1CAAgAHgIAQScAHgEAC7ABFgACAAEAFgAWAAgACAABABYAFgAIAAgAsQEeAAIADgAAAP//OiAC gAAEgA1CAAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAIAB4CAEEnAB4BAAuwARYA AgABABYAFgAGAAYAAQAWABYABgAGALEBHgACAA4AAAD//zogAoAABIANQgAIAB4CAEEnAB4AAAux AR4AAgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALsAEWAAIAAQAfAB8ABwAHAAEAHwAfAAcA BwCxAR4AAgAOAAAA//86IAKAAASAFEIACAAeAgBBJwAeAAALsQEeAAIADgAAAP//OiACgAAEAA1C AAgAHgIAQScAHgEAC7ABFgACAAEAHwAfAAgACAABAB8AHwAIAAgAsQEeAAIADgAAAP//OiACgAAE gA1CAAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAIAB4CAEEnAB4BAAuwARYAAgAB ABgAGAAHAAcAAQAYABgABwAHALEBHgACAA4AAAD//zogAoAABIAUQgAIAB4CAEEnAB4AAAuxAR4A AgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALsAEWAAIAAQAYABgACAAIAAEAGAAYAAgACACx AR4AAgAOAAAA//86IAKAAASADUIACAAeAgBBJwAeAAALsQEeAAIADgAAAP//OiACgAAEAA1CAAgA HgIAQScAHgEAC7ABFgACAAEAIwAmAAcABwABACMAJgAHAAcAsQEeAAIADgAAAP//OiACgAAEgBRC AAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAIAB4CAEEnAB4BAAuwARYAAgABACMA JgAIAAgAAQAjACYACAAIALEBHgACAA4AAAD//zogAoAABIANQgAIAB4CAEEnAB4AAAuxAR4AAgAO AAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALsAEWAAIAAQAuAC4ACAAIAAEALgAuAAgACACxAR4A AgAOAAAA//86IAKAAASAFEIACAAeAgBBJwAeAAALsQEeAAIADgAAAP//OiACgAAEAA1CAAgAHgIA QScAHgEAC2IIFABiCAAAAAAAAAAAAAAUAAAAQQAAAGcIFwBnCAAAAAAAAAAAAAACAAH//////HsA AAoAAAAJCBAAAAYQALsNzQfBQAAAAAYAAAsCGAAAAAAAAAAAADkAAAAlBwAACrUEAELBBAANAAIA AQAMAAIAZAAPAAIAAQARAAIAAAAQAAgA/Knx0k1iUD9fAAIAAQAqAAIAAAArAAIAAACCAAIAAQCA AAgAAAAAAAAAAAAlAgQAAQDgAYEAAgDBBBQAAAAVAAAAgwACAAAAhAACAAAAJgAIAAAAAAAAAOg/ JwAIAAAAAAAAAOg/KAAIAAAAAAAAAPA/KQAIAAAAAAAAAPA/oQAiAAkAZAD37wEAAQAAALQAtAAA AAAAAADgPwAAAAAAAOA/AQASAAIAAQDdAAIAAQBjAAIAAQATAAIAyelVAAIACAB9AAwAAAAAAKAe BgECAAQAfQAMAAEABQCgDQcBAgAEAH0ADAAGAAYAoAcIAQIABAB9AAwABwAHAKAFCAECAAQAfQAM AAgACACgCAgBAgAEAH0ADAAJAAABAAkGAQYABAAAAg4AAAAAADkAAAAAAAkAAAAIAhAAAAABAAkA 4AEAAAAAwAEJAQgCEAABAAEACQDgAQAAAADAAQkBCAIQAAIAAQAJAOABAAAAAMABCQEIAhAAAwAB AAkA4AEAAAAAwAEJAQgCEAAEAAAACQDgAQAAAADAAQkBCAIQAAUAAAAJAOABAAAAAEABDwAIAhAA BgAAAAkA4AEAAAAAQAEPAAgCEAAHAAAACQDgAQAAAABAAQ8ACAIQAAgAAAAJAOABAAAAAEABDwAI AhAACQAAAAkA4AEAAAAAQAEPAAgCEAAKAAAACQDgAQAAAABAAQ8ACAIQAAsAAAAJAOABAAAAAEAB DwAIAhAADAAAAAkA4AEAAAAAQAEPAAgCEAANAAAACQDgAQAAAABAAQ8ACAIQAA4AAAAJAOABAAAA AEABDwAIAhAADwAAAAkA4AEAAAAAQAEPAAgCEAAQAAAACQDgAQAAAABAAQ8ACAIQABEAAAAJAOAB AAAAAEABDwAIAhAAEgAAAAkA4AEAAAAAQAEPAAgCEAATAAAACQDgAQAAAABAAQ8ACAIQABQAAAAJ AOABAAAAAEABDwAIAhAAFQAAAAkA4AEAAAAAQAEPAAgCEAAWAAAACQDgAQAAAABAAQ8ACAIQABcA AAAJAOABAAAAAEABDwAIAhAAGAAAAAkA4AEAAAAAQAEPAAgCEAAZAAAACQDgAQAAAABAAQ8ACAIQ ABoAAAAJAOABAAAAAEABDwAIAhAAGwAAAAkA4AEAAAAAQAEPAAgCEAAcAAAACQDgAQAAAABAAQ8A CAIQAB0AAAAJAOABAAAAAEABDwAIAhAAHgAAAAkA4AEAAAAAQAEPAAgCEAAfAAAACQDgAQAAAABA AQ8AvgAQAAAAAQAKAQoBCgEKAQoBBQC+AAwAAAAGAAsBCwELAQgAvgAQAAEAAQAKAQoBCgEKAQoB BQC+AAwAAQAGAAsBCwELAQgAvgAQAAIAAQAKAQoBCgEKAQoBBQC+AAwAAgAGAAsBCwELAQgAvgAQ AAMAAQAKAQoBCgEKAQoBBQC+AAwAAwAGAAsBCwELAQgA/QAKAAQAAAAMAQAAAAD9AAoABAABAA0B AQAAAL4ADgAEAAIADQENAQ0BDQEFAP0ACgAEAAYADQECAAAA/QAKAAQABwANAQMAAAD9AAoABAAI AA4BBAAAAP0ACgAFAAAAMQGTAgAA/QAKAAUAAQAcAUQCAAD9AAoABQACABwBSgAAAP0ACgAFAAMA HAGUAgAA/QAKAAUABAAcAZUCAAD9AAoABQAFABwBlgIAAP0ACgAFAAYAIQGXAgAA/QAKAAUABwAd AZgCAAD9AAoABQAIACABmQIAAP0ACgAGAAAAMQGaAgAA/QAKAAYAAQAcATUAAAC+AA4ABgACABwB HAEcARwBBQD9AAoABgAGACEBmwIAAP0ACgAGAAcAHQEMAAAAfgIKAAYACAAeAQAAqUD9AAoABwAA ADEBnAIAAP0ACgAHAAEAHAGdAgAA/QAKAAcAAgAcAaUAAAD9AAoABwADABwBpgAAAL4ACgAHAAQA HAEcAQUA/QAKAAcABgAhAZsCAAD9AAoABwAHAB0BEQAAAH4CCgAHAAgAIAEAwLJA/QAKAAgAAAAx AZ4CAAD9AAoACAABABwBnwIAAP0ACgAIAAIAHAE0AAAA/QAKAAgAAwAcAaACAAD9AAoACAAEABwB oQIAAP0ACgAIAAUAHAEoAAAA/QAKAAgABgAhAaICAAD9AAoACAAHAB0BDAAAAP0ACgAIAAgAIAGj AgAA/QAKAAkAAAAxAaQCAAD9AAoACQABABwBBwAAAP0ACgAJAAIAHAEIAAAA/QAKAAkAAwAcAWEA AAC+AAoACQAEABwBHAEFAP0ACgAJAAYAIQGbAgAA/QAKAAkABwAdAQwAAAB+AgoACQAIACABACCs QP0ACgAKAAAAMQGlAgAA/QAKAAoAAQAcASoCAAD9AAoACgACABwB0AAAAP0ACgAKAAMAHAG5AAAA vgAKAAoABAAcARwBBQD9AAoACgAGACEBmwIAAP0ACgAKAAcAHQEMAAAAfgIKAAoACAAeAQAgrED9 AAoACwAAADEBpgIAAP0ACgALAAEAHAFDAAAA/QAKAAsAAgAcAacCAAD9AAoACwADABwB2wAAAP0A CgALAAQAHAFEAAAA/QAKAAsABQAcAagCAAD9AAoACwAGACEBqQIAAP0ACgALAAcAHQEMAAAAfgIK AAsACAAeAQBwp0D9AAoADAAAADEBqgIAAP0ACgAMAAEAHAGrAgAA/QAKAAwAAgAcAawCAAD9AAoA DAADABwBrQIAAP0ACgAMAAQAHAGCAgAA/QAKAAwABQAcAToBAAD9AAoADAAGACEBRwAAAP0ACgAM AAcAHQEMAAAAfgIKAAwACAAeAQDgpUD9AAoADQAAADEBrgIAAP0ACgANAAEAHAFEAgAA/QAKAA0A AgAcAasBAAD9AAoADQADABwBpgEAAP0ACgANAAQAHAGvAgAA/QAKAA0ABQAcAbACAAD9AAoADQAG ACEBsQIAAP0ACgANAAcAHQGYAgAAfgIKAA0ACAAeAQDgpUD9AAoADgAAADEBsgIAAP0ACgAOAAEA HAHDAAAA/QAKAA4AAgAcAbMCAAD9AAoADgADABwBtAIAAP0ACgAOAAQAHAG1AgAA/QAKAA4ABQAc AbYCAAD9AAoADgAGACEBtwIAAP0ACgAOAAcAHQGYAgAAfgIKAA4ACAAgAQAwoUD9AAoADwAAADEB uAIAAP0ACgAPAAEAHAErAAAAvgAOAA8AAgAcARwBHAEcAQUA/QAKAA8ABgAhAbkCAAD9AAoADwAH AB0BHAAAAH4CCgAPAAgAHgEAQJ9A/QAKABAAAAAxAboCAAD9AAoAEAABABwBPwAAAL4ADgAQAAIA HAEcARwBHAEFAP0ACgAQAAYAIQG7AgAA/QAKABAABwAdAQwAAAB+AgoAEAAIAB4BAHCnQP0ACgAR AAAAUQG8AgAA/QAKABEAAQBSAbgAAAD9AAoAEQACAFIBSwAAAL4ADAARAAMAUgFSAVIBBQD9AAoA EQAGACwBvQIAAP0ACgARAAcALQEMAAAA/QAKABEACABXAb4CAAD9AAoAEgAAAFMBvwIAAP0ACgAS AAEAVAE/AAAA/QAKABIAAgBUAbkAAAD9AAoAEgADAFQBugAAAP0ACgASAAQAVAHvAAAA/QAKABIA BQBUAcACAAD9AAoAEgAGAEkBwQIAAP0ACgASAAcASgEMAAAAfgIKABIACABLAQCwrUD9AAoAEwAA AFMBwgIAAP0ACgATAAEAVAHPAAAA/QAKABMAAgBUAUwAAAD9AAoAEwADAFQBaAEAAP0ACgATAAQA VAHDAgAA/QAKABMABQBUAcQCAAD9AAoAEwAGAEkBwQIAAP0ACgATAAcASgEMAAAAfgIKABMACABL AQCwrUD9AAoAFAAAAFMBxQIAAP0ACgAUAAEAVAHGAgAA/QAKABQAAgBUAccCAAC+AAwAFAADAFQB VAFUAQUA/QAKABQABgBJAcgCAAD9AAoAFAAHAEoBDAAAAH4CCgAUAAgASwEAMMFA/QAKABUAAABT AckCAAD9AAoAFQABAFQBSAEAAP0ACgAVAAIAVAHKAgAAvgAMABUAAwBUAVQBVAEFAP0ACgAVAAYA SQHLAgAA/QAKABUABwBKAQwAAAB+AgoAFQAIAEsBACCsQP0ACgAWAAAAUwHMAgAA/QAKABYAAQBU AfgAAAD9AAoAFgACAFQBaQEAAL4ADAAWAAMAVAFUAVQBBQD9AAoAFgAGAEkBPwIAAP0ACgAWAAcA SgEMAAAAfgIKABYACABVAQDgpUD9AAoAFwAAAFMBzQIAAP0ACgAXAAEAVAE1AAAA/QAKABcAAgBU AegAAAD9AAoAFwADAFQBPwAAAP0ACgAXAAQAVAE4AAAAAQIGABcABQBUAf0ACgAXAAYASQHOAgAA /QAKABcABwBKAQwAAAD9AAoAFwAIAEsBmQIAAP0ACgAYAAAAUwHPAgAA/QAKABgAAQBUATQAAAC+ AA4AGAACAFQBVAFUAVQBBQD9AAoAGAAGAEkB0AIAAP0ACgAYAAcASgEMAAAAfgIKABgACABLAQAg rED9AAoAGQAAAFMB0QIAAP0ACgAZAAEAVAF/AAAA/QAKABkAAgBUATUAAAC+AAwAGQADAFQBVAFU AQUA/QAKABkABgBJAc4CAAD9AAoAGQAHAEoBDAAAAP0ACgAZAAgASwGZAgAA/QAKABoAAABTAdIC AAD9AAoAGgABAFQB0wIAAL4ADgAaAAIAVAFUAVQBVAEFAP0ACgAaAAYASQFSAAAA/QAKABoABwBK AQwAAAB+AgoAGgAIAEsBACCcQP0ACgAbAAAAUwHUAgAA/QAKABsAAQBUAT8AAAD9AAoAGwACAFQB MQAAAP0ACgAbAAMAVAHVAgAAvgAKABsABABUAVQBBQD9AAoAGwAGAEkB1gIAAP0ACgAbAAcASgEM AAAA/QAKABsACABLAdcCAAD9AAoAHAAAAFMB2AIAAP0ACgAcAAEAVAG4AAAAvgAOABwAAgBUAVQB VAFUAQUA/QAKABwABgBJAdkCAAD9AAoAHAAHAEoBDAAAAH4CCgAcAAgASwEAsK1A/QAKAB0AAABT AdoCAAD9AAoAHQABAFQBJwAAAP0ACgAdAAIAVAE/AAAA/QAKAB0AAwBUAekAAAC+AAoAHQAEAFQB VAEFAP0ACgAdAAYASQHbAgAA/QAKAB0ABwBKAQwAAAB+AgoAHQAIAFUBAGCjQP0ACgAeAAAAUwHc AgAA/QAKAB4AAQBUAZoBAAD9AAoAHgACAFQBuAAAAP0ACgAeAAMAVAEVAAAAvgAKAB4ABABUAVQB BQD9AAoAHgAGAEkB3QIAAP0ACgAeAAcASgEMAAAAfgIKAB4ACABLAQAAqUD9AAoAHwAAAFMB3gIA AP0ACgAfAAEAVAHfAgAA/QAKAB8AAgBUAeACAAD9AAoAHwADAFQB4QIAAP0ACgAfAAQAVAHiAgAA /QAKAB8ABQBUAeMCAAD9AAoAHwAGAEkB5AIAAP0ACgAfAAcASgEMAAAAfgIKAB8ACABLAQDgpUDX AEQA9A4AAGwCJAAkACQAJABYAH4AWABwAH4AcABwAH4AfgB+AH4AWABYAGQAfgB+AGQAZABkAHoA WABkAFgAcABYAHAAcAAIAhAAIAAAAAkA4AEAAAAAQAEPAAgCEAAhAAAACQDgAQAAAABAAQ8ACAIQ ACIAAAAJAOABAAAAAEABDwAIAhAAIwAAAAkA4AEAAAAAQAEPAAgCEAAkAAAACQDgAQAAAABAAQ8A CAIQACUAAAAJAOABAAAAAEABDwAIAhAAJgAAAAkA4AEAAAAAQAEPAAgCEAAnAAAACQDgAQAAAABA AQ8ACAIQACgAAAAJAOABAAAAAEABDwAIAhAAKQAAAAkA4AEAAAAAQAEPAAgCEAAqAAAACQDgAQAA AABAAQ8ACAIQACsAAAAJAOABAAAAAEABDwAIAhAALAAAAAkA4AEAAAAAQAEPAAgCEAAtAAAACQDg AQAAAABAAQ8ACAIQAC4AAAAJAOABAAAAAEABDwAIAhAALwAAAAkA4AEAAAAAQAEPAAgCEAAwAAAA CQDgAQAAAABAAQ8ACAIQADEAAAAJAOABAAAAAEABDwAIAhAAMgAAAAkA4AEAAAAAQAEPAAgCEAAz AAAACQDgAQAAAABAAQ8ACAIQADQAAAAJAOABAAAAAEABDwAIAhAANQAAAAkA4AEAAAAAQAEPAAgC EAA2AAAACQDgAQAAAABAAQ8ACAIQADcAAAAJAOABAAAAAEABDwAIAhAAOAAAAAkA4AEAAAAAQAEP AP0ACgAgAAAAUwHlAgAA/QAKACAAAQBUAeYCAAD9AAoAIAACAFQBpwIAAP0ACgAgAAMAVAFeAgAA /QAKACAABABUAecCAAD9AAoAIAAFAFQBcwAAAP0ACgAgAAYASQHoAgAA/QAKACAABwBKAQwAAAB+ AgoAIAAIAEsBABilQP0ACgAhAAAAUwHpAgAA/QAKACEAAQBUATEAAAC+AA4AIQACAFQBVAFUAVQB BQD9AAoAIQAGAEkB2QIAAP0ACgAhAAcASgEMAAAAfgIKACEACABVAQCwrUD9AAoAIgAAAFMB6gIA AP0ACgAiAAEAVAHrAgAA/QAKACIAAgBUATUAAAD9AAoAIgADAFQBhQEAAP0ACgAiAAQAVAE4AAAA /QAKACIABQBUAdwAAAD9AAoAIgAGAEkB6AIAAP0ACgAiAAcASgEMAAAAfgIKACIACABVAQAYpUD9 AAoAIwAAAFMB7AIAAP0ACgAjAAEAVAHtAgAAvgAOACMAAgBUAVQBVAFUAQUA/QAKACMABgBJAe4C AAD9AAoAIwAHAEoBHAAAAH4CCgAjAAgAVQEAQJ9A/QAKACQAAABTAe8CAAD9AAoAJAABAFQBwgEA AL4ADgAkAAIAVAFUAVQBVAEFAP0ACgAkAAYASQHwAgAA/QAKACQABwBKAQwAAAB+AgoAJAAIAFUB AACpQP0ACgAlAAAAUwHxAgAA/QAKACUAAQBUAfICAAD9AAoAJQACAFQB8wIAAP0ACgAlAAMAVAH0 AgAAvgAKACUABABUAVQBBQD9AAoAJQAGAEkB9QIAAP0ACgAlAAcASgEAAQAAfgIKACUACABVAQAy 2UD9AAoAJgAAAFMB9gIAAP0ACgAmAAEAVAH3AgAAvgAOACYAAgBUAVQBVAFUAQUA/QAKACYABgBJ AfgCAAD9AAoAJgAHAEoBDAAAAH4CCgAmAAgAVQEAcLdA/QAKACcAAABTAfkCAAD9AAoAJwABAFQB +gIAAP0ACgAnAAIAVAH7AgAA/QAKACcAAwBUAfwCAAC+AAoAJwAEAFQBVAEFAP0ACgAnAAYASQH9 AgAA/QAKACcABwBKARwAAAB+AgoAJwAIAFUBAJCaQP0ACgAoAAAAUwH+AgAA/QAKACgAAQBUAf8C AAD9AAoAKAACAFQBAAMAAP0ACgAoAAMAVAEBAwAAvgAKACgABABUAVQBBQD9AAoAKAAGAEkB/QIA AP0ACgAoAAcASgEcAAAAfgIKACgACABVAQCQmkD9AAoAKQAAAFMBAgMAAP0ACgApAAEAVAEDAwAA vgAOACkAAgBUAVQBVAFUAQUA/QAKACkABgBJAQQDAAD9AAoAKQAHAEoBEQAAAH4CCgApAAgAVQEA 4LNA/QAKACoAAABTAQUDAAD9AAoAKgABAFQBHgAAAL4ADgAqAAIAVAFUAVQBVAEFAP0ACgAqAAYA SQEGAwAA/QAKACoABwBKAQwAAAB+AgoAKgAIAFUBACCsQP0ACgArAAAAUwEHAwAA/QAKACsAAQBU AfIBAAD9AAoAKwACAFQBZQAAAP0ACgArAAMAVAEKAgAAvgAKACsABABUAVQBBQD9AAoAKwAGAEkB CAMAAP0ACgArAAcASgEMAAAAfgIKACsACABVAQAAqUD9AAoALAAAAFMBCQMAAP0ACgAsAAEAVAEK AwAA/QAKACwAAgBUAVgCAAC+AAwALAADAFQBVAFUAQUA/QAKACwABgBJAQsDAAD9AAoALAAHAEoB DAAAAH4CCgAsAAgAVQEAsK1A/QAKAC0AAABTAQwDAAD9AAoALQABAFQBNQAAAP0ACgAtAAIAVAFJ AAAA/QAKAC0AAwBUAfIBAAD9AAoALQAEAFQBpgEAAP0ACgAtAAUAVAENAwAA/QAKAC0ABgBJAdsC AAD9AAoALQAHAEoBDAAAAH4CCgAtAAgAVQEAiKNA/QAKAC4AAABTAQ4DAAD9AAoALgABAFQBFAAA AP0ACgAuAAIAVAGrAQAAvgAMAC4AAwBUAVQBVAEFAP0ACgAuAAYASQHkAgAA/QAKAC4ABwBKAQwA AAB+AgoALgAIAFUBAFirQP0ACgAvAAAAUwEPAwAA/QAKAC8AAQBUARADAAC+AA4ALwACAFQBVAFU AVQBBQD9AAoALwAGAEkBtgEAAP0ACgAvAAcASgEcAAAAfgIKAC8ACABVAQAgnED9AAoAMAAAAFMB EQMAAP0ACgAwAAEAVAFoAAAA/QAKADAAAgBUAekAAAD9AAoAMAADAFQBEgMAAP0ACgAwAAQAVAET AwAA/QAKADAABQBUAfEAAAD9AAoAMAAGAEkBPwIAAP0ACgAwAAcASgEMAAAAfgIKADAACABVAQDg pUD9AAoAMQAAAFMBFAMAAP0ACgAxAAEAVAEUAAAA/QAKADEAAgBUAdsAAAD9AAoAMQADAFQBFQMA AP0ACgAxAAQAVAEXAAAA/QAKADEABQBUAWgAAAD9AAoAMQAGAEkBFgMAAP0ACgAxAAcASgEMAAAA fgIKADEACABVAQDgpUD9AAoAMgAAAFMBFwMAAP0ACgAyAAEAVAE1AAAA/QAKADIAAgBUAUkAAAD9 AAoAMgADAFQB8gEAAP0ACgAyAAQAVAGmAQAAAQIGADIABQBUAf0ACgAyAAYASQHbAgAA/QAKADIA BwBKAQwAAAB+AgoAMgAIAFUBAIijQP0ACgAzAAAAUwEYAwAA/QAKADMAAQBUAd8CAAD9AAoAMwAC AFQB4AIAAL4ADAAzAAMAVAFUAVQBBQD9AAoAMwAGAEkB5AIAAP0ACgAzAAcASgEMAAAAfgIKADMA CABVAQDgpUD9AAoANAAAAFMBGQMAAP0ACgA0AAEAVAEaAwAAvgAOADQAAgBUAVQBVAFUAQUA/QAK ADQABgBJARsDAAD9AAoANAAHAEoBDAAAAH4CCgA0AAgAVQEAUKRA/QAKADUAAABTARwDAAD9AAoA NQABAFQBHQMAAL4ADgA1AAIAVAFUAVQBVAEFAP0ACgA1AAYASQEeAwAA/QAKADUABwBKAQwAAAB+ AgoANQAIAFUBAFCkQP0ACgA2AAAAUwEfAwAA/QAKADYAAQBUAdgBAAC+AA4ANgACAFQBVAFUAVQB BQD9AAoANgAGAEkB2QIAAP0ACgA2AAcASgEMAAAAfgIKADYACABVAQBQpED9AAoANwAAAFMBIAMA AP0ACgA3AAEAVAFGAgAAvgAOADcAAgBUAVQBVAFUAQUA/QAKADcABgBJASEDAAD9AAoANwAHAEoB DAAAAH4CCgA3AAgAVQEAwKxA/QAKADgAAAA1ASIDAAD9AAoAOAABABYBIwMAAL4ADgA4AAIAFgEW ARYBFgEFAP0ACgA4AAYAGAEkAwAA/QAKADgABwAZAQwAAAB+AgoAOAAIABoBALCtQNcANgDwCwAA 4AF+AFgAfgBYAFgAcABYAHAAcABYAFgAcABkAH4AZABYAH4AfgB6AGQAWABYAFgAWADsACQBDwAC 8AYDAABgAAjwCAAAAAUAAABvgQAADwAD8O4CAAAPAATwKAAAAAEACfAQAAAAAAAAAAAAAAAAAAAA AAAAAAIACvAIAAAAAHQAAAUAAAAPAATwzAAAALIECvAIAAAAbIEAAAAKAADjAAvwkgAAAH8AgACN AQRBCgAAAH8BIAAwAIABAAAAAIEBQAAACIIBAAABAL8BAQARAM0BAAAAAP8BAAAIAD8CAAACAD8D EAAQAICDFgAAAIKDKAAAAL8DCAAIAFAAaQBjAHQAdQByAGUAIAAxADEAAADQyep5+brOEYyCAKoA S6kLAgAAAAgAAAAGAAAAlpl1mCEAQQAxAAAAAAAQ8BIAAAACAAUAzwAAAKAACABsAwIA4AAAABHw AAAAAF0AJgAVABIACABsDRFgAAAAAAAAAAAAAAAABwACAP//CAACAAAAAAAAAOwApgAPAATwpgAA ABIACvAIAAAAbYEAAAAKAADTAAvwZAAAAH8AAACNAYEAKGsAAIIAcEcAAIMAKGsAAIQAAAAAAH8B IAAgAIABAAAAAIEB////AIIBAAABAL8BAAAQAM0BAAAAAP8BAAAIAICDFgAAAFcAbwByAGQAQQBy AHQAIAAxADEAAAAAABDwEgAAAAAAAAC2AgMAIAAFAMoCBABoAAAAEfAAAAAAXQAaABUAEgACAG0N EWAAAAAAAAAAAAAAAAAAAAAA7AAIAAAADfAAAAAAtgESABQCAAAAAAAAAAAbABgAAAAAADwANwAB 5ovGfoR2/osLeidZsn4OTrKLCF7LTs1+94t7dkaWVwBXAFcALgBPAFQANQAxAC4AQwBPAE0APAAY AAAAJgAAAAAADwAmAAAAAAAbAAAAAAAAAOwAjgAPAATwhgAAALIECvAIAAAAboEAAAAKAACzAAvw TAAAAH8AgACNAQRBCQAAAH8BIAAwAIABAAAAAIEB////AIIBAAABAL8BAAAQAM0BAAAAAP8BAAAI AD8DEAAQAICDCgAAAP5WR3IgADEAAAAAABDwEgAAAAIAAAAAAAAAAAABAIsBAgB4AAAAEfAAAAAA XQAmABUAEgAIAG4NEWAAAAAAAAAAAAAAAAAHAAIA//8IAAIAAQAAAAAA7ACmAA8ABPCmAAAAEgAK 8AgAAABvgQAAAAoAANMAC/BkAAAAfwAAAI0BgQAoawAAggBwRwAAgwAAAAAAhAAAAAAAfwEgACAA gAEAAAAAgQH///8AggEAAAEAvwEAABAAzQEAAAAA/wEAAAgAgIMWAAAAVwBvAHIAZABBAHIAdAAg ADEAMAAAAAAAEPASAAAAAAABAIQAAAAYAAQAfAMDACgAAAAR8AAAAABdABoAFQASAAIAbw0RYAAA AAAAAAAAAAAAAAAAAADsAAgAAAAN8AAAAAC2ARIAEgIAAAAAAAAAAI8A8AAAAAAAPAAfAQFoUf1W TVE5je1wv34a/zQAMAAwAC0ANgA2ADgAOAAtADMAMwA2AAoAf17eXTV13Ysa/wj/MAAyADAACf84 ADIANwA4ADcANQA4ADYAATA4ADIANgAwADgAOAA1ADIAADD3lg9c0FkBMLGQSFEfdQoA8W0zVzV1 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 AQAJAOABAAAAAMABCQEIAhAAAgABAAkA4AEAAAAAwAEJAQgCEAADAAEACQDgAQAAAADAAQkBCAIQ AAQAAAAJAOABAAAAAMABCQEIAhAABQAAAAkA4AEAAAAAQAEPAAgCEAAGAAAACQDgAQAAAABAAQ8A CAIQAAcAAAAJAOABAAAAAEABDwAIAhAACAAAAAkA4AEAAAAAQAEPAAgCEAAJAAAACQDgAQAAAABA AQ8ACAIQAAoAAAAJAOABAAAAAEABDwAIAhAACwAAAAkA4AEAAAAAQAEPAAgCEAAMAAAACQDgAQAA AABAAQ8ACAIQAA0AAAAJAOABAAAAAEABDwAIAhAADgAAAAkA4AEAAAAAQAEPAAgCEAAPAAAACQDg AQAAAABAAQ8ACAIQABAAAAAJAOABAAAAAEABDwAIAhAAEQAAAAkA4AEAAAAAQAEPAAgCEAASAAAA CQDgAQAAAABAAQ8ACAIQABMAAAAJAOABAAAAAEABDwAIAhAAFAAAAAkA4AEAAAAAQAEPAL4AEAAA AAEACgEKAQoBCgEKAQUAvgAMAAAABgALAQsBCwEIAL4AEAABAAEACgEKAQoBCgEKAQUAvgAMAAEA BgALAQsBCwEIAL4AEAACAAEACgEKAQoBCgEKAQUAvgAMAAIABgALAQsBCwEIAL4AEAADAAEACgEK AQoBCgEKAQUAvgAMAAMABgALAQsBCwEIAP0ACgAEAAAADAEAAAAA/QAKAAQAAQANAQEAAAC+AA4A BAACAA0BDQENAQ0BBQD9AAoABAAGAA0BAgAAAP0ACgAEAAcADQEDAAAA/QAKAAQACAAOAQQAAAD9 AAoABQAAADEBJQMAAP0ACgAFAAEAHAHUAAAA/QAKAAUAAgAcAT8AAAD9AAoABQADABwBJgMAAL4A CgAFAAQAHAEcAQUA/QAKAAUABgAhAScDAAD9AAoABQAHAB0BDAAAAP0ACgAFAAgAIAEoAwAA/QAK AAYAAAAxASkDAAD9AAoABgABABwBYwIAAP0ACgAGAAIAHAEqAwAA/QAKAAYAAwAcAdUAAAC+AAoA BgAEABwBHAEFAP0ACgAGAAYAIQErAwAA/QAKAAYABwAdAQwAAAD9AAoABgAIAB8BowIAAP0ACgAH AAAAMQEsAwAA/QAKAAcAAQAcAS0DAAD9AAoABwACABwBLgMAAP0ACgAHAAMAHAEvAwAAvgAKAAcA BAAcARwBBQD9AAoABwAGACEBMAMAAP0ACgAHAAcAHQEMAAAA/QAKAAcACAAfASgDAAD9AAoACAAA ADEBMQMAAP0ACgAIAAEAHAF+AgAA/QAKAAgAAgAcATIDAAD9AAoACAADABwBMwMAAL4ACgAIAAQA HAEcAQUA/QAKAAgABgAhATADAAD9AAoACAAHAB0BDAAAAP0ACgAIAAgAHwEoAwAA/QAKAAkAAAAx ATQDAAD9AAoACQABABwBNQMAAP0ACgAJAAIAHAE2AwAA/QAKAAkAAwAcATcDAAC+AAoACQAEABwB HAEFAP0ACgAJAAYAIQEwAwAA/QAKAAkABwAdAQwAAAD9AAoACQAIAB8BKAMAAP0ACgAKAAAAMQE4 AwAA/QAKAAoAAQAcAWEAAAD9AAoACgACABwBOQMAAP0ACgAKAAMAHAFzAAAAvgAKAAoABAAcARwB BQD9AAoACgAGACEBOgMAAP0ACgAKAAcAHQEMAAAA/QAKAAoACAAfAaMCAAD9AAoACwAAADEBOwMA AP0ACgALAAEAHAE8AwAA/QAKAAsAAgAcAWgAAAD9AAoACwADABwB7wAAAP0ACgALAAQAHAE9AwAA AQIGAAsABQAcAf0ACgALAAYAIQGFAgAA/QAKAAsABwAdAQwAAAB+AgoACwAIAB8BAACpQP0ACgAM AAAAMQE+AwAA/QAKAAwAAQAcAXcAAAD9AAoADAACABwBPwMAAP0ACgAMAAMAHAGoAgAAvgAKAAwA BAAcARwBBQD9AAoADAAGACEBOgMAAP0ACgAMAAcAHQEMAAAA/QAKAAwACAAgAaMCAAD9AAoADQAA ADEBQAMAAP0ACgANAAEAHAEGAAAA/QAKAA0AAgAcASIBAAD9AAoADQADABwBHwAAAL4ACgANAAQA HAEcAQUA/QAKAA0ABgAhAToDAAD9AAoADQAHAB0BDAAAAP0ACgANAAgAIAGjAgAA/QAKAA4AAAAx AUEDAAD9AAoADgABABwBaAAAAL4ADgAOAAIAHAEcARwBHAEFAP0ACgAOAAYAIQFwAQAA/QAKAA4A BwAdAQwAAAB+AgoADgAIACABAJCqQP0ACgAPAAAAMQFCAwAA/QAKAA8AAQAcAUMBAAD9AAoADwAC ABwBOAIAAP0ACgAPAAMAHAGDAAAAvgAKAA8ABAAcARwBBQD9AAoADwAGACEBQwMAAP0ACgAPAAcA HQEMAAAA/QAKAA8ACAAgAaMCAAD9AAoAEAAAADEBRAMAAP0ACgAQAAEAHAFhAAAA/QAKABAAAgAc ATkDAAD9AAoAEAADABwBcwAAAL4ACgAQAAQAHAEcAQUA/QAKABAABgAhASsDAAD9AAoAEAAHAB0B DAAAAP0ACgAQAAgAIAGjAgAA/QAKABEAAAAxAUUDAAD9AAoAEQABABwBBgAAAP0ACgARAAIAHAEi AQAA/QAKABEAAwAcAR8AAAD9AAoAEQAEABwB8gEAAP0ACgARAAUAHAFGAwAA/QAKABEABgAhAUcD AAD9AAoAEQAHAB0BDAAAAP0ACgARAAgAIAGjAgAA/QAKABIAAAAxAUgDAAD9AAoAEgABABwBHgAA AP0ACgASAAIAHAFhAAAA/QAKABIAAwAcAUgBAAC+AAoAEgAEABwBHAEFAP0ACgASAAYAIQFJAwAA /QAKABIABwAdAQwAAAD9AAoAEgAIACABowIAAP0ACgATAAAAMQFKAwAA/QAKABMAAQAcAUMBAAD9 AAoAEwACABwBOAIAAP0ACgATAAMAHAGDAAAAvgAKABMABAAcARwBBQD9AAoAEwAGACEBKwMAAP0A CgATAAcAHQEMAAAA/QAKABMACAAgAaMCAAD9AAoAFAAAADUBSwMAAP0ACgAUAAEAFgHyAQAA/QAK ABQAAgAWAUYDAAD9AAoAFAADABYB4QAAAP0ACgAUAAQAFgF3AAAA/QAKABQABQAWAT8DAAD9AAoA FAAGABgBQwMAAP0ACgAUAAcAGQEMAAAA/QAKABQACAAiAaMCAADXAC4AmgkAAJABJAAkACQAJABY AHAAcABwAHAAcABwAHoAcABwAFgAcABwAH4AcABwAOwAJAEPAALwBgMAAHAACPAIAAAABQAAAG+V AAAPAAPw7gIAAA8ABPAoAAAAAQAJ8BAAAAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgAAAAAiAAABQAA AA8ABPDMAAAAsgQK8AgAAABslQAAAAoAAOMAC/CSAAAAfwCAAI0BBEEKAAAAfwEgADAAgAEAAAAA gQFAAAAIggEAAAEAvwEBABEAzQEAAAAA/wEAAAgAPwIAAAIAPwMQABAAgIMWAAAAgoMoAAAAvwMI AAgAUABpAGMAdAB1AHIAZQAgADEAMwAAANDJ6nn5us4RjIIAqgBLqQsCAAAACAAAAAYAAACWmXWY IQBBADEAAAAAABDwEgAAAAIABQD+AAAAqAAIALYDAgDoAAAAEfAAAAAAXQAmABUAEgAIAGwNEWAA AAAAAAAAAAAAAAAHAAIA//8IAAIAAAAAAAAA7ACmAA8ABPCmAAAAEgAK8AgAAABtlQAAAAoAANMA C/BkAAAAfwAAAI0BgQAoawAAggBwRwAAgwAoawAAhAAAAAAAfwEgACAAgAEAAAAAgQH///8AggEA AAEAvwEAABAAzQEAAAAA/wEAAAgAgIMWAAAAVwBvAHIAZABBAHIAdAAgADEAMQAAAAAAEPASAAAA AAAAALYCAwAoAAUAygIEAHAAAAAR8AAAAABdABoAFQASAAIAbQ0RYAAAAAAAAAAAAAAAAAAAAADs AAgAAAAN8AAAAAC2ARIAFAIAAAAAAAAAABsAGAAAAAAAPAA3AAHmi8Z+hHb+iwt6J1myfg5OsosI XstOzX73i3t2RpZXAFcAVwAuAE8AVAA1ADEALgBDAE8ATQA8ABgAAAAmAAAAAAAPACYAAAAAABsA AAAAAAAA7ACOAA8ABPCGAAAAsgQK8AgAAABulQAAAAoAALMAC/BMAAAAfwCAAI0BBEEJAAAAfwEg ADAAgAEAAAAAgQH///8AggEAAAEAvwEAABAAzQEAAAAA/wEAAAgAPwMQABAAgIMKAAAA/lZHciAA MQAAAAAAEPASAAAAAgAAAAAAAAAAAAEAiwECAHgAAAAR8AAAAABdACYAFQASAAgAbg0RYAAAAAAA AAAAAAAAAAcAAgD//wgAAgABAAAAAADsAKYADwAE8KYAAAASAArwCAAAAG+VAAAACgAA0wAL8GQA AAB/AAAAjQGBAChrAACCAHBHAACDAAAAAACEAAAAAAB/ASAAIACAAQAAAACBAf///wCCAQAAAQC/ AQAAEADNAQAAAAD/AQAACACAgxYAAABXAG8AcgBkAEEAcgB0ACAAMQAwAAAAAAAQ8BIAAAAAAAEA hAAAACAABAB8AwMAMAAAABHwAAAAAF0AGgAVABIAAgBvDRFgAAAAAAAAAAAAAAAAAAAAAOwACAAA AA3wAAAAALYBEgASAgAAAAAAAAAAjwDwAAAAAAA8AB8BAWhR/VZNUTmN7XC/fhr/NAAwADAALQA2 ADYAOAA4AC0AMwAzADYACgB/Xt5dNXXdixr/CP8wADIAMAAJ/zgAMgA3ADgANwA1ADgANgABMDgA MgA2ADAAOAA4ADUAMgAAMPeWD1zQWQEwsZBIUR91CgDxbTNXNXXdixr/CP8wADcANQA1AAn/NgAx ADIAOAA2ADUANgA2AAAwIF8PXNBZCgAKTndtNXXdixr/CP8wADIAMQAJ/zUAMQA2ADkANwA5ADAA OQABMDUAMQA2ADkANwA5ADEAMgAAMCGFSFEfdQEwi3MPXNBZCgAoV79+qFTii1EAUQAa/zMANAAz ADAAOQA1ADIAMwAxACgAjJrBi+FPb2Aa//6LC3qoVOKLCf88APAAAAAkAAAAAAAHACQAAAAAABQA JAAAAAAAGgAkAAAAAAAdACQAAAAAAB4AJAAAAAAAJgAkAAAAAAAnACQAAAAAAC8AJAAAAAAANwAk AAAAAAA4ACQAAAAAAD4AJAAAAAAAQgAkAAAAAABDACQAAAAAAEsAJAAAAAAATwAkAAAAAABQACQA AAAAAFYAJAAAAAAAWQAkAAAAAABaACQAAAAAAGIAJAAAAAAAYwAkAAAAAABrACQAAAAAAHMAJAAA AAAAdAAkAAAAAAB4ACQAAAAAAHoAJAAAAAAAewAkAAAAAACFACQAAAAAAI8AAAAAAAAAPgISAL4B AAAAAEAAAAA8AAAAAAAAAEEACgAAAAUABQAAAAIAHQAPAAIFAAAAAAABAAUABQAAAJkAAgAACeUA CgABAAQABAABAAUAsAEmAAIAAQAFABQAAAAIAAMAFAAUAAMACAAFABMAAQAIAAUAFAAAAAAAsQEe AAIADgAAAP//OiACgAAEgBRCAAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAIAB4C AEEnAB4BAAuwARYAAgABABQAFAABAAIAAQAUABQAAQACALEBHgACAA4AAAD//zogAoAABIAUQgAI AB4CAEEnAB4AAAuxAR4AAgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALYggUAGIIAAAAAAAA AAAAABQAAABBAAAAZwgXAGcIAAAAAAAAAAAAAAIAAf/////8ewAACgAAAAkIEAAABhAAuw3NB8FA AAAABgAACwIkAAAAAAAAAAAAiAAAACUHAAAS7wQA9v4EAIoNBQBiHAUA7iAFAA0AAgABAAwAAgBk AA8AAgABABEAAgAAABAACAD8qfHSTWJQP18AAgABACoAAgAAACsAAgAAAIIAAgABAIAACAAAAAAA AAAAACUCBAABAOABgQACAMEEFAAAABUAAACDAAIAAACEAAIAAAAmAAgAAAAAAAAA6D8nAAgAAAAA AAAA6D8oAAgAAAAAAAAA8D8pAAgAAAAAAAAA8D+hACIACQBkAPfvAQABAAAAtAC0AAAAAAAAAOA/ AAAAAAAA4D8BABIAAgABAN0AAgABAGMAAgABABMAAgDJ6VUAAgAIAH0ADAAAAAAAoB4GAQIABAB9 AAwAAQAFAKANBwECAAQAfQAMAAYABgCgBwgBAgAEAH0ADAAHAAcAoAUIAQIABAB9AAwACAAIAKAI CAECAAQAfQAMAAkAAAEACQYBBgAEAAACDgAAAAAAiAAAAAAACQAAAAgCEAAAAAEACQDgAQAAAADA AQkBCAIQAAEAAQAJAOABAAAAAMABCQEIAhAAAgABAAkA4AEAAAAAwAEJAQgCEAADAAEACQDgAQAA AADAAQkBCAIQAAQAAAAJAOABAAAAAMABCQEIAhAABQAAAAkA4AEAAAAAQAEPAAgCEAAGAAAACQDg AQAAAABAAQ8ACAIQAAcAAAAJAOABAAAAAEABDwAIAhAACAAAAAkA4AEAAAAAQAEPAAgCEAAJAAAA CQDgAQAAAABAAQ8ACAIQAAoAAAAJAOABAAAAAEABDwAIAhAACwAAAAkA4AEAAAAAQAEPAAgCEAAM AAAACQDgAQAAAABAAQ8ACAIQAA0AAAAJAOABAAAAAEABDwAIAhAADgAAAAkA4AEAAAAAQAEPAAgC EAAPAAAACQDgAQAAAABAAQ8ACAIQABAAAAAJAOABAAAAAEABDwAIAhAAEQAAAAkA4AEAAAAAQAEP AAgCEAASAAAACQDgAQAAAABAAQ8ACAIQABMAAAAJAOABAAAAAEABDwAIAhAAFAAAAAkA4AEAAAAA QAEPAAgCEAAVAAAACQDgAQAAAABAAQ8ACAIQABYAAAAJAOABAAAAAEABDwAIAhAAFwAAAIECAACC AgAAgwIAAIQCAACFAgAAhgIAAIcCAACIAgAAiQIAAIoCAACLAgAAjAIAAI0CAACOAgAAjwIAAJAC AACRAgAAkgIAAJMCAACUAgAAlQIAAJYCAACXAgAAmAIAAJkCAACaAgAAmwIAAJwCAACdAgAA/v// /58CAACgAgAAoQIAAKICAACjAgAApAIAAKUCAACmAgAA/v////7///+qAgAA/v////7///////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////CQDgAQAA AABAAQ8ACAIQABgAAAAJAOABAAAAAEABDwAIAhAAGQAAAAkA4AEAAAAAQAEPAAgCEAAaAAAACQDg AQAAAABAAQ8ACAIQABsAAAAJAOABAAAAAEABDwAIAhAAHAAAAAkA4AEAAAAAQAEPAAgCEAAdAAAA CQDgAQAAAABAAQ8ACAIQAB4AAAAJAOABAAAAAEABDwAIAhAAHwAAAAkA4AEAAAAAQAEPAL4AEAAA AAEACgEKAQoBCgEKAQUAvgAMAAAABgALAQsBCwEIAL4AEAABAAEACgEKAQoBCgEKAQUAvgAMAAEA BgALAQsBCwEIAL4AEAACAAEACgEKAQoBCgEKAQUAvgAMAAIABgALAQsBCwEIAL4AEAADAAEACgEK AQoBCgEKAQUAvgAMAAMABgALAQsBCwEIAP0ACgAEAAAADAEAAAAA/QAKAAQAAQANAQEAAAC+AA4A BAACAA0BDQENAQ0BBQD9AAoABAAGAA0BAgAAAP0ACgAEAAcADQEDAAAA/QAKAAQACAAOAQQAAAD9 AAoABQAAADEBTAMAAP0ACgAFAAEAHAGaAQAA/QAKAAUAAgAcAegAAAD9AAoABQADABwBSgAAAP0A CgAFAAQAHAFLAAAA/QAKAAUABQAcARcAAAD9AAoABQAGACEBigEAAP0ACgAFAAcAHQEMAAAAfgIK AAUACAAgAQDgpUD9AAoABgAAADEBTQMAAP0ACgAGAAEAHAEIAAAA/QAKAAYAAgAcAeAAAAD9AAoA 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 ABIACvAIAAAAb6kAAAAKAADTAAvwZAAAAH8AAACNAYEAKGsAAIIAcEcAAIMAAAAAAIQAAAAAAH8B IAAgAIABAAAAAIEB////AIIBAAABAL8BAAAQAM0BAAAAAP8BAAAIAICDFgAAAFcAbwByAGQAQQBy AHQAIAAxADAAAAAAABDwEgAAAAAAAQCoAAAAGAAEAKEDAwAoAAAAEfAAAAAAXQAaABUAEgACAG8N EWAAAAAAAAAAAAAAAAAAAAAA7AAIAAAADfAAAAAAtgESABICAAAAAAAAAACPAPAAAAAAADwAHwEB aFH9Vk1ROY3tcL9+Gv80ADAAMAAtADYANgA4ADgALQAzADMANgAKAH9e3l01dd2LGv8I/zAAMgAw AAn/OAAyADcAOAA3ADUAOAA2AAEwOAAyADYAMAA4ADgANQAyAAAw95YPXNBZATCxkEhRH3UKAPFt M1c1dd2LGv8I/zAANwA1ADUACf82ADEAMgA4ADYANQA2ADYAADAgXw9c0FkKAApOd201dd2LGv8I /zAAMgAxAAn/NQAxADYAOQA3ADkAMAA5AAEwNQAxADYAOQA3ADkAMQAyAAAwIYVIUR91ATCLcw9c 0FkKAChXv36oVOKLUQBRABr/MwA0ADMAMAA5ADUAMgAzADEAKACMmsGL4U9vYBr//osLeqhU4osJ /zwA8AAAACQAAAAAAAcAJAAAAAAAFAAkAAAAAAAaACQAAAAAAB0AJAAAAAAAHgAkAAAAAAAmACQA AAAAACcAJAAAAAAALwAkAAAAAAA3ACQAAAAAADgAJAAAAAAAPgAkAAAAAABCACQAAAAAAEMAJAAA AAAASwAkAAAAAABPACQAAAAAAFAAJAAAAAAAVgAkAAAAAABZACQAAAAAAFoAJAAAAAAAYgAkAAAA AABjACQAAAAAAGsAJAAAAAAAcwAkAAAAAAB0ACQAAAAAAHgAJAAAAAAAegAkAAAAAAB7ACQAAAAA AIUAJAAAAAAAjwAAAAAAAAA+AhIAvgEAAAAAQAAAADwAAAAAAAAAQQAKAAAABQAFAAAAAgAdAA8A AgUAAAAAAAEABQAFAAAAmQACAAAJ5QAKAAEABAAEAAEABQCwAYYAAgABAAUAhwAAAAgADwBGAEYA AAAAAEYARgAGAAgAhwCHAAAAAACHAIcAAwAIAFMAVAAAAAAAUwBUAAYACAAbABsAAAAAABsAGwAG AAgARwBSAAAACAAWABoAAAAIABMAFQAAAAUAEwAUAAcACAAcAEUAAAAIAAUAEgAAAAgAVQCGAAAA CACxAR4AAgAOAAAA//86IAKAAASAFEIACAAeAgBBJwAeAAALsQEeAAIADgAAAP//OiACgAAEAA1C AAgAHgIAQScAHgEAC7ABFgACAAEAhwCHAAEAAgABAIcAhwABAAIAsQEeAAIADgAAAP//OiACgAAE gBRCAAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAIAB4CAEEnAB4BAAuwARYAAgAB AEYARgABAAUAAQBGAEYAAQAFALEBHgACAA4AAAD//zogAoAABIAUQgAIAB4CAEEnAB4AAAuxAR4A AgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAeAQALsAEWAAIAAQBTAFQAAQAFAAEAUwBUAAEABQCx AR4AAgAOAAAA//86IAKAAASAFEIACAAeAgBBJwAeAAALsQEeAAIADgAAAP//OiACgAAEAA1CAAgA HgIAQScAHgEAC7ABFgACAAEAFQAVAAYABwABABUAFQAGAAcAsQEeAAIADgAAAP//OiACgAAEgBRC AAgAHgIAQScAHgAAC7EBHgACAA4AAAD//zogAoAABAANQgAIAB4CAEEnAB4BAAuwAR4AAwABABUA FQABAAMAAgAVABUAAwADABUAFQABAAEAsQEeAAIADgAAAP//OiACgAAEgBRCAAgAHgIAQScAHgAA C7EBHgACAA4AAAD//zogAoAABAANQgAIAB4CAEEnAB4BAAuxAR4AAgAOAAAA//86IAKAAASAFEIA CAAeAgBBJwAeAAALsAEWAAIAAQAVABUACAAIAAEAFQAVAAgACACxAR4AAgAOAAAA//86IAKAAASA FEIACAAeAgBBJwAeAAALsQEeAAIADgAAAP//OiACgAAEAA1CAAgAHgIAQScAHgEAC7ABFgACAAEA GwAbAAMABQABABsAGwADAAUAsQEeAAIADgAAAP//OiACgAAEgBRCAAgAHgIAQScAHgAAC7EBHgAC AA4AAAD//zogAoAABAANQgAIAB4CAEEnAB4BAAuwARYAAwABABsAGwADAAMAAQAbABsAAwADALEB HgACAA4AAAD//zogAoAABIAUQgAIAB4CAEEnAB4AAAuxAR4AAgAOAAAA//86IAKAAAQADUIACAAe AgBBJwAeAQALsQEeAAIADgAAAP//OiACgAAEgBRCAAgAHgIAQScAHgAAC7ABFgACAAEAEwAUAAYA BgABABMAFAAGAAYAsQEeAAIADgAAAP//OiACgAAEgBRCAAgAHgIAQScAHgAAC7EBHgACAA4AAAD/ /zogAoAABAANQgAIAB4CAEEnAB4BAAuwARYAAgABABsAGwABAAIAAQAbABsAAQACALEBHgACAA4A AAD//zogAoAABIAUQgAIAB4CAEEnAB4AAAuxAR4AAgAOAAAA//86IAKAAAQADUIACAAeAgBBJwAe AQALYggUAGIIAAAAAAAAAAAAABQAAABBAAAAZwgXAGcIAAAAAAAAAAAAAAIAAf/////8ewAACgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAkIEAABBgAPmgLVBwAAAAAIAAAA+w/OCtE1jj1ZAf///wEAAMD/AAAAAAAA wP8AAAAAAADA/wAAAAAAAMD/AAAAAAAAwP8AAAAAAADA/wAAAAAAAMD/AAAAAAAAwP8AAAAAAADA /wAAAAAAAMD/AAAAAAAAwP8AAAAAAADA/wAAAAAAAMD/AAAAAAAAwP8AAAAAAADA/wAAAAAAAAAA AAAAAAAAwP8AAAABAAAAAAAAAAEAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAA AAABAAAAAAAAAAEAAAAAAABgAAAAwP8A/n8AAADA/wAAYAAAAMD/AAAAAAAAwP8AAAABAAAAAAAA YAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAwP8AAGAAAADA/wAAYAAAAMD/AABg AAAAwP8AAGAAAADA/wAAYAAAAMD/AABgAAAAwP8AAGAAAADA/wD+HwAAAMD/AABgAAAAwP8AAGAA AADA/wAAYAAAAMD/AABgAAAAwP8AAGAAAADA/wAAYAAAAMD/AABgAAAAAAAAAGAAAAAAAAD+HwAA AMD/AABgAAAAwP8AAGAAAADA/wAAYAAAAMD/AABgAAAAwP8A/n8AAADA/wAAYAAAAMD/AABgAAAA wP8AAGAAAADA/wAAYAAAAMD/AABgAAAAwP8A/n8AAADA/wAAYAAAAMD/AABgAAAAwP8AAGAAAADA /wAAYAAAAMD/AABgAAAAAAAAAGAAAAAAAAAAYAAAAMD/AP4fAAAAwP8AAGAAAADA/wD+HwAAAMD/ AABgAAAAwP8AAAAAAADA/wAAYAAAAMD/AAAAAAAAwP8AAGAAAADA/wAAAAAAAMD/AABgAAAAwP8A AGAAAADA/wAAYAAAAMD/AABgAAAAwP8AAGAAAADA/wAAYAAAAMD/AP4fAAAAwP8A/h8AAADA/wD+ HwAAAMD/////AQAAwP8AAAAAAADA/wAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAMD/AP4f AAAAwP8A/n8AAADA/wD+fwAAAMD/AAAAAAAAwP8AAAAAAADA/wAAAAAAAMD/AABgAAAAAAAAAGAA AAAAAAAAYAAAAAAAAABgAAAAAAAA/h8AAADA/wD+HwAAAMD/AABgAAAAwP8AAGAAAADA/wAAYAAA AMD/AABgAAAAAAAAAGAAAADA/wAAYAAAAMD/AABgAAAAwP8AAGAAAADA/wAAYAAAAMD/AABgAAAA wP8AAGAAAADA/wAAYAAAAMD/AABgAAAAwP8AAGAAAADA/wD+fwAAAMD/AP5/AAAAwP8A/n8AAADA ////fwEAAMD///9/AQAAwP8D/n8BAAAAAAP+fwEAAAAAA/5/AQAAAAAD/n8BAAAAAAAAAAAAAMD/ AP5/AAAAAAAA/n8AAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAA AGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAA YAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABg AAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAA AAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAA AAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAA AAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAA AAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAA AABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAA AGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAA YAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABg AAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAA AAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAA AAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAA AAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAA AAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAA AABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAA AGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAP5/AAAAAAAA/n8AAAAAAAD+ fwAAAAAAAP5/AAAAAAAA/n8AAAAAAAD+fwAAAAAAAwBgAAAAwP//AWAAAADA//8BYAAAAMD/AwBg AAAAwP//AWAAAADA//8BYAAAAMD///9/AAAAwP///38AAADA////fwAAAMD/AwBgAAAAwP///38B AADA/////wAAAMD///9/AAAAwP///38AAADA////fwEAAMD///9/AQAAwP///38AAADA/////wAA AMD///9/AAAAwP///38BAADA////fwEAAMD/////AAAAwP///38AAADA////fwEAAMD///9/AQAA wP///38BAADA////fwEAAMD///9/AAAAwP///38BAADA////fwAAAMD///9/AAAAwP///38AAADA ////fwEAAMD///9/AAAAwP///38AAADA////fwEAAMD///9/AQAAwP////8AAADA////fwAAAMD/ //9/AQAAwP///38BAADA////fwAAAMD///9/AQAAwP///38AAADA////fwAAAMD///9/AAAAwP// /38AAADA////fwAAAMD///9/AAAAwP///38BAADA////fwAAAMD///9/AAAAwP///38BAADA//// fwEAAMD///9/AAAAwP8D/n8AAADA////fwAAAMD///9/AQAAwP///38BAADA////fwAAAMD/A/5/ AAAAwP///38AAADA////fwEAAMD///9/AQAAwP///38AAADA////fwEAAMD///9/AAAAwP///38A AADA////fwEAAMD///9/AQAAwP///38AAADA////fwAAAMD///9/AAAAwP///38BAADA////fwEA AMD///9/AAAAwP///38AAADA////fwAAAMD///9/AAAAwP///38BAADA////fwAAAMD///9/AQAA wP///38BAADA//oPEAABAAIATJy59l4Ax6xRqXUA+g8QAAEAAgBMnLn2XgDHrFGpdQD6DxYAAQAD AEycufZeAMesUal1AEycufZeAPoPEAABAAIATJy59l4Ax6xRqXUA+g8WAAEAAwBMnLn2XgDHrFGp dQBMnLn2XgD6DxYAAQADAEycufZeAMesUal1AEycufZeAPoPEAABAAIATJy59l4Ax6xRqXUA+g8Q AAEAAgBMnLn2XgDHrFGpdQD6DxAAAQACAEycufZeAMesUal1APoPEAABAAIATJy59l4Ax6xRqXUA +g8QAAEAAgBMnLn2XgDHrFGpdQD6DxAAAQACAEycufZeAMesUal1APoPEAABAAIATJy59l4Ax6xR qXUA+g8QAAIAAgBMnLn2XgDHrFGpdQD6DxAAAwACAEycufZeAMesUal1APoPEAADAAIATJy59l4A x6xRqXUA+g8QAAMAAgCMNNKSpwDHrFGpdQD6DxAABAACAIw00pKnAMesUal1APoPEAAEAAIAjDTS kqcAx6xRqXUA+g8WAAQAAwCMNNKSpwDHrFGpdQCMNNKSpwD6DxAABAACAEycufZeAMesUal1APoP EAAEAAIAjDTSkqcAx6xRqXUA+g8QAAQAAgBMnLn2XgDHrFGpdQD6DxAABAACAIw00pKnAMesUal1 APoPEAAEAAIATJy59l4Ax6xRqXUA+g8QAAQAAgCMNNKSpwDHrFGpdQD6DxAABAACAEycufZeAMes Ual1APoPEAAEAAIATJy59l4Ax6xRqXUA+g8QAAQAAgCMNNKSpwDHrFGpdQD6DxAABAACAIw00pKn AMesUal1APoPEAAEAAIAjDTSkqcAx6xRqXUA+g8QAAQAAgBMnLn2XgDHrFGpdQD6DxAABAACAEyc ufZeAMesUal1APoPEAAEAAIAjDTSkqcAx6xRqXUA+g8QAAQAAgBMnLn2XgDHrFGpdQD6DxAABAAC AIw00pKnAMesUal1APoPEAAEAAIATJy59l4Ax6xRqXUA+g8QAAQAAgCMNNKSpwDHrFGpdQD6DxAA BAACAIw00pKnAMesUal1APoPEAAEAAIATJy59l4Ax6xRqXUA+g8QAAQAAgCMNNKSpwDHrFGpdQD6 DxAABAACAEycufZeAMesUal1APoPEAAEAAIAjDTSkqcAx6xRqXUA+g8QAAQAAgBMnLn2XgDHrFGp dQD6DxAABAACAIw00pKnAMesUal1APoPEAAEAAIATJy59l4Ax6xRqXUA+g8QAAUAAgBMnLn2XgDH rFGpdQD6DxYABQADAEycufZeAMesUal1AEycufZeAPoPEAAFAAIATJy59l4Ax6xRqXUA+g8WAAUA AwBMnLn2XgDHrFGpdQBMnLn2XgD6DxYABQADAEycufZeAMesUal1AEycufZeAPoPFgAFAAMATJy5 9l4Ax6xRqXUATJy59l4A+g8WAAUAAwBMnLn2XgDHrFGpdQBMnLn2XgD6DxAABgACAEycufZeAMes Ual1APoPEAAGAAIATJy59l4Ax6xRqXUA+g8QAAcAAgBMnLn2XgDHrFGpdQD6DxAABwACAEycufZe AMesUal1APoPEAAHAAIATJy59l4Ax6xRqXUA+g8QAAcAAgBMnLn2XgDHrFGpdQD6DxAABwACAEyc ufZeAMesUal1APoPFgAHAAMATJy59l4Ax6xRqXUATJy59l4A+g8QAAcAAgBMnLn2XgDHrFGpdQD6 DxAABwACAEycufZeAMesUal1APoPFgAHAAMATJy59l4Ax6xRqXUATJy59l4A+g8QAAcAAgBMnLn2 XgDHrFGpdQD6DxAABwACAEycufZeAMesUal1APcPDAAAAAkAii4AANNBAAD3DwwAAQAJAIouAADT QQAA9w8MAAIACQCKLgAA00EAAPcPDAADAAkAii4AANNBAAD3DwwABAAJAIouAADTQQAA9w8MAAUA CQCKLgAA00EAAPcPDAAGAAkAii4AANNBAAD3DwwABwAJAIouAADTQQAACgAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAD+////CQAAAAoAAAALAAAADAAAAA0AAAAO AAAADwAAAP7///////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////v8AAAUBAgAAAAAAAAAAAAAAAAAAAAAAAQAAAOCFn/L5T2gQq5EIACsns9kwAAAAqAEAABMA AAABAAAAoAAAAAAAAICoAAAAAgAAALAAAAADAAAAvAAAAAQAAADIAAAABQAAAOwAAAAGAAAA+AAA AAcAAAAEAQAACAAAABABAAAJAAAAJAEAAAoAAAAwAQAADAAAADwBAAANAAAASAEAAAsAAABUAQAA DgAAAGABAAAPAAAAaAEAABAAAABwAQAAEgAAAHgBAAATAAAAoAEAAAIAAACwBAAAEwAAAAQIAAAf AAAAAQAAAAAAAAAfAAAAAQAAAAAAAAAfAAAADgAAAEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIA AAAfAAAAAQAAAAAAAAAfAAAAAQAAAAAAAAAfAAAAAQAAAAAAAAAfAAAABQAAAFUAcwBlAHIAAAAA AB8AAAABAAAAAAAAAEAAAAAAwAypqTVPAUAAAAAApfUT9grMAUAAAACAMCerjDnOAUAAAAAAkIbC +OrNAQMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAB8AAAAPAAAAVwBQAFMAIABPAGYAZgBpAGMAZQAg ACpOuk5IcgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAFAEQAbwBjAHUAbQBlAG4AdABTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAA AAAAAAAAAAAAOAACAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAgAAADwAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AP7/AAAFAQIAAAAAAAAAAAAAAAAAAAAAAAIAAAAC1c3VnC4bEJOXCAArLPmuRAAAAAXVzdWcLhsQ k5cIACss+a5cAQAAGAEAABAAAAABAAAAiAAAAAAAAICQAAAADwAAAJgAAAACAAAApAAAAA4AAACw AAAABgAAALwAAAAFAAAAxAAAABEAAADMAAAAAwAAANQAAAAEAAAA4AAAAAcAAADoAAAACAAAAPAA AAAJAAAA+AAAAAoAAAAAAQAACwAAAAgBAAAQAAAAEAEAAAIAAACwBAAAEwAAAAQIAAAfAAAAAQAA AAAAAAAfAAAAAQAAAAAAAAAfAAAAAQAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAfAAAA AQAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAACwAAAAAAAAAL AAAAAAAAAJQAAAAEAAAAAAAAACgAAAABAAAAXAAAAAAAAIBkAAAAAgAAAGwAAAABAAAAAgAAABMA AABLAFMATwBQAHIAbwBkAHUAYwB0AEIAdQBpAGwAZABWAGUAcgAAAAAAAgAAALAEAAATAAAABAgA AB8AAAAQAAAAMgAwADUAMgAtADgALgAxAC4AMAAuADMANQAyADYAAAAAAAAAAAAAAAAAAAAAAAAA --=====003_Dragon568423171628_=====-- From eguan@redhat.com Mon Apr 15 06:02:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CB6FC7F4C for ; Mon, 15 Apr 2013 06:02:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B5AA08F8039 for ; Mon, 15 Apr 2013 04:02:17 -0700 (PDT) X-ASG-Debug-ID: 1366023736-04cb6c2c1c1fcfc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BeDZhi3UTJHyBPVa for ; Mon, 15 Apr 2013 04:02: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3FB2GL5028254 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 15 Apr 2013 07:02:16 -0400 Received: from localhost (dhcp-13-36.nay.redhat.com [10.66.13.36]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3FB2Crq004424; Mon, 15 Apr 2013 07:02:14 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH] xfstests generic 311: test fallocate(2) ENOSPC when file size is greater than 4G Date: Mon, 15 Apr 2013 19:02:06 +0800 X-ASG-Orig-Subj: [PATCH] xfstests generic 311: test fallocate(2) ENOSPC when file size is greater than 4G Message-Id: <1366023726-6724-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366023736 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 ENOSPC in fallocate(2) could corrupt ext4 when file size > 4G Regression test for commit 29ae07b ext4: Fix overflow caused by missing cast in ext4_fallocate() Signed-off-by: Eryu Guan --- tests/generic/311 | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/311.out | 2 ++ tests/generic/group | 1 + 3 files changed, 67 insertions(+) create mode 100644 tests/generic/311 create mode 100644 tests/generic/311.out diff --git a/tests/generic/311 b/tests/generic/311 new file mode 100644 index 0000000..721d8cc --- /dev/null +++ b/tests/generic/311 @@ -0,0 +1,64 @@ +#! /bin/bash +# FS QA Test No. 311 +# +# ENOSPC in fallocate(2) could corrupt ext4 when file size > 4G +# +# Regression test for commit +# 29ae07b ext4: Fix overflow caused by missing cast in ext4_fallocate() +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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 +_supported_fs generic +_supported_os Linux +_require_xfs_io_falloc +_require_scratch + +rm -f $seqres.full +_scratch_mkfs_sized $((5 * 1024 * 1024 * 1024)) >>$seqres.full 2>&1 +_scratch_mount >>$seqres.full 2>&1 + +echo "Silence is golden" + +# fallocate(2) a 6G(> 4G) file on a 5G fs +$XFS_IO_PROG -f -c "falloc 0 6g" $SCRATCH_MNT/testfile.$seq >>$seqres.full 2>&1 + +_scratch_unmount +_check_scratch_fs +status=0 +exit diff --git a/tests/generic/311.out b/tests/generic/311.out new file mode 100644 index 0000000..62f2530 --- /dev/null +++ b/tests/generic/311.out @@ -0,0 +1,2 @@ +QA output created by 311 +Silence is golden diff --git a/tests/generic/group b/tests/generic/group index eb52833..cb15afe 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -113,3 +113,4 @@ 308 auto quick 309 auto quick 310 auto +311 auto quick prealloc enospc -- 1.8.1.4 From dmonakhov@openvz.org Mon Apr 15 06:10:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 885957F4C for ; Mon, 15 Apr 2013 06:10:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 166C8AC002 for ; Mon, 15 Apr 2013 04:10:03 -0700 (PDT) X-ASG-Debug-ID: 1366024200-04cbb057f81f5dc0001-NocioJ Received: from relay.sw.ru (mailhub.sw.ru [195.214.232.25]) by cuda.sgi.com with ESMTP id UkyvQ9nBcJ8L4cBN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 15 Apr 2013 04:10:01 -0700 (PDT) X-Barracuda-Envelope-From: dmonakhov@openvz.org X-Barracuda-Apparent-Source-IP: 195.214.232.25 Received: from mct-mail.qa.sw.ru ([10.29.1.112]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id r3FB9oVG003889; Mon, 15 Apr 2013 15:09:52 +0400 (MSK) From: Dmitry Monakhov To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, dchinner@redhat.com, Dmitry Monakhov Subject: [PATCH 1/2] xfstests: dump _require_fio output to log Date: Mon, 15 Apr 2013 15:09:47 +0400 X-ASG-Orig-Subj: [PATCH 1/2] xfstests: dump _require_fio output to log Message-Id: <1366024188-21756-1-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 X-Barracuda-Connect: mailhub.sw.ru[195.214.232.25] X-Barracuda-Start-Time: 1366024201 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This should helps to find incompatibility issues. Signed-off-by: Dmitry Monakhov --- common/rc | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 tests/ext4/301 diff --git a/common/rc b/common/rc index 09fb83f..ad3e378 100644 --- a/common/rc +++ b/common/rc @@ -1967,8 +1967,8 @@ _require_fio() return 1; fi - $FIO_PROG --warnings-fatal --showcmd $job >/dev/null 2>&1 - [ $? -eq 0 ] || _notrun "$FIO_PROG too old" + $FIO_PROG --warnings-fatal --showcmd $job >> $seqres.full 2>&1 + [ $? -eq 0 ] || _notrun "$FIO_PROG too old, see $seqres.full" } # Does freeze work on this fs? diff --git a/tests/ext4/301 b/tests/ext4/301 old mode 100644 new mode 100755 -- 1.7.1 From dmonakhov@openvz.org Mon Apr 15 06:10:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A0C567F52 for ; Mon, 15 Apr 2013 06:10:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1C023AC002 for ; Mon, 15 Apr 2013 04:10:05 -0700 (PDT) X-ASG-Debug-ID: 1366024199-04cb6c2c1d1fd7a0001-NocioJ Received: from relay.sw.ru (mailhub.sw.ru [195.214.232.25]) by cuda.sgi.com with ESMTP id 9zDuqWd9eojNOaID (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 15 Apr 2013 04:10:00 -0700 (PDT) X-Barracuda-Envelope-From: dmonakhov@openvz.org X-Barracuda-Apparent-Source-IP: 195.214.232.25 Received: from mct-mail.qa.sw.ru ([10.29.1.112]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id r3FB9oVH003889; Mon, 15 Apr 2013 15:09:54 +0400 (MSK) From: Dmitry Monakhov To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, dchinner@redhat.com, Dmitry Monakhov Subject: [PATCH 2/2] xfstests: fix fio's arguments Date: Mon, 15 Apr 2013 15:09:48 +0400 X-ASG-Orig-Subj: [PATCH 2/2] xfstests: fix fio's arguments Message-Id: <1366024188-21756-2-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1366024188-21756-1-git-send-email-dmonakhov@openvz.org> References: <1366024188-21756-1-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mailhub.sw.ru[195.214.232.25] X-Barracuda-Start-Time: 1366024200 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Option 'group_reporting' semantics was changes for recent fio versions In fact we do not need it here, let's just drop it. Signed-off-by: Dmitry Monakhov --- tests/ext4/301 | 1 - tests/ext4/302 | 1 - tests/ext4/303 | 1 - tests/ext4/304 | 1 - 4 files changed, 0 insertions(+), 4 deletions(-) diff --git a/tests/ext4/301 b/tests/ext4/301 index b6c2f11..e1583d4 100755 --- a/tests/ext4/301 +++ b/tests/ext4/301 @@ -59,7 +59,6 @@ filesize=${FILE_SIZE} size=999G buffered=0 fadvise_hint=0 -group_reporting ################################# # Test1 diff --git a/tests/ext4/302 b/tests/ext4/302 index 9307ab4..abca805 100644 --- a/tests/ext4/302 +++ b/tests/ext4/302 @@ -59,7 +59,6 @@ filesize=${FILE_SIZE} size=999G buffered=0 fadvise_hint=0 -group_reporting ########################################## # Test2 diff --git a/tests/ext4/303 b/tests/ext4/303 index 84d8f7b..7051576 100644 --- a/tests/ext4/303 +++ b/tests/ext4/303 @@ -59,7 +59,6 @@ filesize=${FILE_SIZE} size=999G buffered=0 fadvise_hint=0 -group_reporting ################################# # Test3 diff --git a/tests/ext4/304 b/tests/ext4/304 index 7b90f1d..5d15ecb 100644 --- a/tests/ext4/304 +++ b/tests/ext4/304 @@ -60,7 +60,6 @@ filesize=${FILE_SIZE} size=999G buffered=0 fadvise_hint=0 -group_reporting ################################# # Test4 -- 1.7.1 From rjohnston@sgi.com Mon Apr 15 07:44:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1421D7F4C for ; Mon, 15 Apr 2013 07:44:15 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id 391C2AC008; Mon, 15 Apr 2013 05:44:11 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 15 Apr 2013 07:44:03 -0500 Message-ID: <516BF5A7.4050100@sgi.com> Date: Mon, 15 Apr 2013 07:42:15 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Dave Chinner CC: Wang Sheng-Hui , Dave Chinner , xfstests Subject: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs References: <51678D0D.1070002@gmail.com> <20130412074034.GC30622@dastard> <5168396C.6020801@gmail.com> <51685552.6030808@sgi.com> <20130413003829.GH30622@dastard> In-Reply-To: <20130413003829.GH30622@dastard> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/12/2013 07:38 PM, Dave Chinner wrote: > On Fri, Apr 12, 2013 at 01:41:22PM -0500, Rich Johnston wrote: >> On 04/12/2013 11:42 AM, Wang Sheng-Hui wrote: >>> >>> Hi Dave, >>> >>> I introduces Makefile under tests/, which would return to TESTS_SUBDIRS >>> with the >>> $(dir function. By running find in $(shell, TEST_SUBDIRS will only get >>> the dir names, >>> and no Makefile. >>> >>> Regards, >>> Sheng-Hui >> >> Thanks addressing comments and for v2 of this patch. >> >> I still had issues with Makefile which I corrected at commit time. >> >> Thanks again for the patch, it has been committed, > > Rich, it's great that you are picking this stuff up quickly, but as > I asked recently, please don't commit patches while there is still > an active review conversation going on.... > > Cheers, > > Dave. > Dave, I was a little quick on the draw, I will wait till all parties have concluded discussions. --Rich From rjohnston@sgi.com Mon Apr 15 07:44:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1C3637F52 for ; Mon, 15 Apr 2013 07:44:21 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id DACEF30404E; Mon, 15 Apr 2013 05:44:20 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 15 Apr 2013 07:44:20 -0500 Message-ID: <516BF64C.2050108@sgi.com> Date: Mon, 15 Apr 2013 07:45:00 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Dave Chinner CC: Wang Sheng-Hui , Dave Chinner , xfstests Subject: Re: [PATCH v2] xfstests: make install support common/ and tests/ dirs References: <51678D0D.1070002@gmail.com> <20130412074034.GC30622@dastard> <5168396C.6020801@gmail.com> <51685552.6030808@sgi.com> <20130413003829.GH30622@dastard> In-Reply-To: <20130413003829.GH30622@dastard> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/12/2013 07:38 PM, Dave Chinner wrote: > On Fri, Apr 12, 2013 at 01:41:22PM -0500, Rich Johnston wrote: >> On 04/12/2013 11:42 AM, Wang Sheng-Hui wrote: >>> >>> Hi Dave, >>> >>> I introduces Makefile under tests/, which would return to TESTS_SUBDIRS >>> with the >>> $(dir function. By running find in $(shell, TEST_SUBDIRS will only get >>> the dir names, >>> and no Makefile. >>> >>> Regards, >>> Sheng-Hui >> >> Thanks addressing comments and for v2 of this patch. >> >> I still had issues with Makefile which I corrected at commit time. >> >> Thanks again for the patch, it has been committed, > > Rich, it's great that you are picking this stuff up quickly, but as > I asked recently, please don't commit patches while there is still > an active review conversation going on.... > > Cheers, > > Dave. > Dave, I was a little quick on the draw, I will wait till all parties have concluded discussions. --Rich From yongtaofu@gmail.com Mon Apr 15 07:54:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E5A5E7F50 for ; Mon, 15 Apr 2013 07:54:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 606E8AC006 for ; Mon, 15 Apr 2013 05:54:25 -0700 (PDT) X-ASG-Debug-ID: 1366030462-04cb6c2c1c204b80001-NocioJ Received: from mail-ia0-f179.google.com (mail-ia0-f179.google.com [209.85.210.179]) by cuda.sgi.com with ESMTP id LNINZY2bO74K6EC7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 15 Apr 2013 05:54:22 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.179 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.179] Received: by mail-ia0-f179.google.com with SMTP id l25so4268061iad.24 for ; Mon, 15 Apr 2013 05:54:22 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.179] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.179] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=nkKvaD5Gemr+iDQFItUpps8NwiSmQaaRDPKV1rOcW3w=; b=G4qC263C2BQVH+eyjaVfnxSy082gadD1T70+a4f/G1vS2mplaOniCEFHFI4PeTgigY FLrofiSzjvggGPNhiOE7CGSo/cnbdt4A2HJxj7SzdBoMfCSFH2rJtK92FE6MO/pTcpd7 N9FLbMY74E9xW46LgRwt3DIDXkWxYsO3Ey6aapG/lHDqGqL00UvysrkN+5N0LK8jMnyn X/hdsWCMIM3S9lFwqsD4gc29UIbHMRT4r4l07OnAi+C6G5dBWaFxpo+JFrkCY6KYkv3Y ho59/hkRQhInQLCPbTeU0wjD3tyHmRz4F/sxTemn1EnjvjIB/hDnLsl9Rz+gtgbVWHBh TmJg== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr5283215igx.11.1366030462212; Mon, 15 Apr 2013 05:54:22 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Mon, 15 Apr 2013 05:54:21 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> <516800F7.80502@redhat.com> Date: Mon, 15 Apr 2013 20:54:21 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Eric Sandeen , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e0111e074747d8704da65c004 X-Barracuda-Connect: mail-ia0-f179.google.com[209.85.210.179] X-Barracuda-Start-Time: 1366030462 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128193 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 --089e0111e074747d8704da65c004 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Dear Brian and xfs experts, Brain your scripts works and I am able to reproduce it with glusterfs rebalance on our test cluster. 2 of our server xfs shutdown during glusterfs rebalance, the shutdown userspace stacktrace both related to pthread. See logs bellow, What's your opinion? Thank you very much! logs: [root@10.23.72.93 ~]# cat xfs.log --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- return=3D0x16 vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff imap=3D0xffff88100e2f7c08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_per= _cluster=3D? chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? __f= unc__=3D[...] mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D 0= x4, sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 imap: im_blkno =3D 0x0, im_len =3D 0xa078, im_boffset =3D 0x86ea kernel backtrace: Returning from: 0xffffffffa02b3ab0 : xfs_imap+0x0/0x280 [xfs] Returning to : 0xffffffffa02b9599 : xfs_inotobp+0x49/0xc0 [xfs] 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x320 [xfs] 0xffffffff81501a69 0x0 (inexact) user backtrace: 0x3bd1a0e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000] --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return -- return=3D0x16 vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino=3D= ? last_ibp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] ip: i_ino =3D 0x113, i_flags =3D 0x0 ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x0 [root@10.23.72.93 ~]# [root@10.23.72.94 ~]# cat xfs.log --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- return=3D0x16 vars: mp=3D0xffff881017c6c800 tp=3D0xffff8801037acea0 ino=3D0xffffffff imap=3D0xffff882017101c08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_per= _cluster=3D? chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? __f= unc__=3D[...] mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D 0= x4, sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 imap: im_blkno =3D 0x0, im_len =3D 0xd98, im_boffset =3D 0x547 kernel backtrace: Returning from: 0xffffffffa02b3ab0 : xfs_imap+0x0/0x280 [xfs] Returning to : 0xffffffffa02b9599 : xfs_inotobp+0x49/0xc0 [xfs] 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x320 [xfs] 0xffffffff81501a69 0x0 (inexact) user backtrace: 0x30cd40e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000] --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return -- return=3D0x16 vars: tp=3D0xffff8801037acea0 ip=3D0xffff880e697c8800 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880d846c2d60 ibp=3D? agno=3D? agino=3D? next_agino=3D= ? last_ibp=3D? last_dip=3D0xffff881017c6c800 bucket_index=3D? offset=3D? last_offset=3D0xffffffffffff880e error=3D? __func__=3D[...] ip: i_ino =3D 0x142, i_flags =3D 0x0 ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x3565732e 2013/4/15 =B7=FB=D3=C0=CC=CE > Also glusterfs use a lot of hardlink for self-heal: > --------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/998416323 > ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999296624 > ---------T 2 root root 0 Apr 15 12:24 /mnt/xfsd/testbug/999568484 > ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999956875 > ---------T 2 root root 0 Apr 15 11:58 > /mnt/xfsd/testbug/.glusterfs/05/2f/052f4e3e-c379-4a3c-b995-a10fdaca33d0 > ---------T 2 root root 0 Apr 15 11:58 > /mnt/xfsd/testbug/.glusterfs/05/95/0595272e-ce2b-45d5-8693-d02c00b94d9d > ---------T 2 root root 0 Apr 15 11:58 > /mnt/xfsd/testbug/.glusterfs/05/ca/05ca00a0-92a7-44cf-b6e3-380496aafaa4 > ---------T 2 root root 0 Apr 15 12:24 > /mnt/xfsd/testbug/.glusterfs/0a/23/0a238ca7-3cef-4540-9c98-6bf631551b21 > ---------T 2 root root 0 Apr 15 11:58 > /mnt/xfsd/testbug/.glusterfs/0a/4b/0a4b640b-f675-4708-bb59-e2369ffbbb9d > Does it related? > > > 2013/4/15 =B7=FB=D3=C0=CC=CE > >> Dear xfs experts, >> Now I'm deploying Brian's system script in out cluster. But from last >> night till now 5 servers in our 24 servers xfs shutdown with the same >> error. I run xfs_repair command and found all the lost inodes are gluste= rfs >> dht link files. This explains why the xfs shutdown tend to happen during >> glusterfs rebalance. During glusterfs rebalance procedure a lot of dhk l= ink >> files may be unlinked. For example the following inodes are found in >> lost+found in one of the servers: >> [root@* lost+found]# pwd >> /mnt/xfsd/lost+found >> [root@* lost+found]# ls -l >> total 740 >> ---------T 1 root root 0 Apr 8 21:06 100119 >> ---------T 1 root root 0 Apr 8 21:11 101123 >> ---------T 1 root root 0 Apr 8 21:19 102659 >> ---------T 1 root root 0 Apr 12 14:46 1040919 >> ---------T 1 root root 0 Apr 12 14:58 1041943 >> ---------T 1 root root 0 Apr 8 21:32 105219 >> ---------T 1 root root 0 Apr 8 21:37 105731 >> ---------T 1 root root 0 Apr 12 17:48 1068055 >> ---------T 1 root root 0 Apr 12 18:38 1073943 >> ---------T 1 root root 0 Apr 8 21:54 108035 >> ---------T 1 root root 0 Apr 12 21:49 1091095 >> ---------T 1 root root 0 Apr 13 00:17 1111063 >> ---------T 1 root root 0 Apr 13 03:51 1121815 >> ---------T 1 root root 0 Apr 8 22:25 112387 >> ---------T 1 root root 0 Apr 13 06:39 1136151 >> ... >> [root@* lost+found]# getfattr -m . -d -e hex * >> >> # file: 96007 >> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >> trusted.gfid=3D0xa0370d8a9f104dafbebbd0e6dd7ce1f7 >> >> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72657= 06c69636174652d3600 >> >> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x= 0000000049dff000 >> >> # file: 97027 >> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >> trusted.gfid=3D0xc1c1fe2ec7034442a623385f43b04c25 >> >> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72657= 06c69636174652d3600 >> >> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x= 000000006ac78000 >> >> # file: 97559 >> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >> trusted.gfid=3D0xcf7c17013c914511bda4d1c743fae118 >> >> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72657= 06c69636174652d3500 >> >> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x= 00000000519fb000 >> >> # file: 98055 >> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >> trusted.gfid=3D0xe86abc6e2c4b44c28d415fbbe34f2102 >> >> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72657= 06c69636174652d3600 >> >> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x= 000000004c098000 >> >> # file: 98567 >> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >> trusted.gfid=3D0x12543a2efbdf4b9fa61c6d89ca396f80 >> >> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72657= 06c69636174652d3500 >> >> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x= 000000006bc98000 >> >> # file: 98583 >> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >> trusted.gfid=3D0x760d16d3b7974cfb9c0a665a0982c470 >> >> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72657= 06c69636174652d3500 >> >> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x= 000000006cde9000 >> >> # file: 99607 >> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >> trusted.gfid=3D0x0849a732ea204bc3b8bae830b46881da >> >> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72657= 06c69636174652d3500 >> >> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x= 00000000513f1000 >> ... >> >> What do you think about it? Thank you very much. >> >> >> 2013/4/12 =B7=FB=D3=C0=CC=CE >> >>> Hi Brian, >>> >>> Your scripts works for me now after I installed all the rpm built out >>> from kernel srpm. I'll try it. Thank you. >>> >>> >>> 2013/4/12 Brian Foster >>> >>>> On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote: >>>> > Dear xfs experts, >>>> > Can I just call xfs_stack_trace(); in the second line of >>>> > xfs_do_force_shutdown() to print stack and rebuild kernel to check >>>> > what's the error? >>>> > >>>> >>>> I suppose that's a start. If you're willing/able to create and run a >>>> modified kernel for the purpose of collecting more debug info, perhaps >>>> we can get a bit more creative in collecting more data on the problem >>>> (but a stack trace there is a good start). >>>> >>>> BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp= ) >>>> check almost halfway into the function to avoid duplicate messages. >>>> >>>> Brian >>>> >>>> > >>>> > 2013/4/12 =B7=FB=D3=C0=CC=CE > >>>> > >>>> > Hi Brian, >>>> > What else I'm missing? Thank you. >>>> > stap -e 'probe module("xfs").function("xfs_iunlink"){}' >>>> > >>>> > WARNING: cannot find module xfs debuginfo: No DWARF information >>>> found >>>> > semantic error: no match while resolving probe point >>>> > module("xfs").function("xfs_iunlink") >>>> > Pass 2: analysis failed. Try again with another '--vp 01' optio= n. >>>> > >>>> > >>>> > 2013/4/12 =B7=FB=D3=C0=CC=CE > >>>> > >>>> > ls -l >>>> > >>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.= debug >>>> > -r--r--r-- 1 root root 21393024 Apr 12 12:08 >>>> > >>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.= debug >>>> > >>>> > rpm -qa|grep kernel >>>> > kernel-headers-2.6.32-279.el6.x86_64 >>>> > kernel-devel-2.6.32-279.el6.x86_64 >>>> > kernel-2.6.32-358.el6.x86_64 >>>> > kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 >>>> > abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >>>> > kernel-firmware-2.6.32-358.el6.noarch >>>> > kernel-debug-2.6.32-358.el6.x86_64 >>>> > kernel-debuginfo-2.6.32-279.el6.x86_64 >>>> > dracut-kernel-004-283.el6.noarch >>>> > libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 >>>> > kernel-devel-2.6.32-358.el6.x86_64 >>>> > kernel-2.6.32-279.el6.x86_64 >>>> > >>>> > rpm -q kernel-debuginfo >>>> > kernel-debuginfo-2.6.32-279.el6.x86_64 >>>> > >>>> > rpm -q kernel >>>> > kernel-2.6.32-279.el6.x86_64 >>>> > kernel-2.6.32-358.el6.x86_64 >>>> > >>>> > do I need to re probe it? >>>> > >>>> > >>>> > 2013/4/12 Eric Sandeen >>> > > >>>> > >>>> > On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote: >>>> > > Hi Brian, >>>> > > Sorry but when I execute the script it says: >>>> > > WARNING: cannot find module xfs debuginfo: No DWARF >>>> > information found >>>> > > semantic error: no match while resolving probe point >>>> > module("xfs").function("xfs_iunlink") >>>> > > >>>> > > uname -a >>>> > > 2.6.32-279.el6.x86_64 >>>> > > kernel debuginfo has been installed. >>>> > > >>>> > > Where can I find the correct xfs debuginfo? >>>> > >>>> > it should be in the kernel-debuginfo rpm (of the same >>>> > version/release as the kernel rpm you're running) >>>> > >>>> > You should have: >>>> > >>>> > >>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.= debug >>>> > >>>> > If not, can you show: >>>> > >>>> > # uname -a >>>> > # rpm -q kernel >>>> > # rpm -q kernel-debuginfo >>>> > >>>> > -Eric >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > -- >>>> > =B7=FB=D3=C0=CC=CE >>>> > >>>> > >>>> > >>>> > >>>> > -- >>>> > =B7=FB=D3=C0=CC=CE >>>> > >>>> > >>>> > >>>> > >>>> > -- >>>> > =B7=FB=D3=C0=CC=CE >>>> > >>>> > >>>> > _______________________________________________ >>>> > xfs mailing list >>>> > xfs@oss.sgi.com >>>> > http://oss.sgi.com/mailman/listinfo/xfs >>>> > >>>> >>>> >>> >>> >>> -- >>> =B7=FB=D3=C0=CC=CE >>> >> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --089e0111e074747d8704da65c004 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Dear Brian and xfs experts,
Brain your = scripts works and I am able to reproduce it with glusterfs rebalance on our= test cluster. 2 of our server xfs shutdown during glusterfs rebalance, the= shutdown userspace stacktrace both related to pthread. See logs bellow, Wh= at's your opinion? Thank you very much!
logs:
[root@10.23.72.93 ~]= # cat xfs.log

--- xfs_imap -- module("xfs").function(&quo= t;xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- return=3D0x16
vars:= mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff imap=3D0x= ffff88100e2f7c08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_per_cluster= =3D? chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbno=3D= ? __func__=3D[...]
mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20
mp->m_sb: sb_agcount =3D= 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c= , sb_dblocks =3D 0x1b4900000
imap: im_blkno =3D 0x0, im_len =3D 0xa078, = im_boffset =3D 0x86ea
kernel backtrace:
Returning from:  0xffffffffa02b3ab0 : xfs_imap+0x= 0/0x280 [xfs]
Returning to  :  0xffffffffa02b9599 : xfs_inotob= p+0x49/0xc0 [xfs]
 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x3= 20 [xfs]
 0xffffffff81501a69
 0x0 (inexact)
user backtrace:
 0x3bd1a0e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000]
=
--- xfs_iunlink_remove -- module("xfs").function("xfs_iu= nlink_remove@fs/xfs/xfs_inode.c:1680").return -- return=3D0x16
vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_a= gino=3D? last_ibp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset= =3D? last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0x113, i_flags =3D 0x0
ip->i_d: di_nlink =3D 0x0, di_ge= n =3D 0x0
[root@10.23.72.93 ~]# =
[root@10.23.72.94 ~]# cat xfs.l= og

--- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_= ialloc.c:1257").return -- return=3D0x16
vars: mp=3D0xffff881017c6c8= 00 tp=3D0xffff8801037acea0 ino=3D0xffffffff imap=3D0xffff882017101c08 flags= =3D0x0 agbno=3D? agino=3D? agno=3D? blks_per_cluster=3D? chunk_agbno=3D? cl= uster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? __func__=3D[...]
mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20
mp->m_sb: sb_agcount =3D= 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c= , sb_dblocks =3D 0x1b4900000
imap: im_blkno =3D 0x0, im_len =3D 0xd98, i= m_boffset =3D 0x547
kernel backtrace:
Returning from:  0xffffffffa02b3ab0 : xfs_imap+0x= 0/0x280 [xfs]
Returning to  :  0xffffffffa02b9599 : xfs_inotob= p+0x49/0xc0 [xfs]
 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x3= 20 [xfs]
 0xffffffff81501a69
 0x0 (inexact)
user backtrace:
 0x30cd40e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000]
=
--- xfs_iunlink_remove -- module("xfs").function("xfs_iu= nlink_remove@fs/xfs/xfs_inode.c:1680").return -- return=3D0x16
vars: tp=3D0xffff8801037acea0 ip=3D0xffff880e697c8800 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880d846c2d60 ibp=3D? agno=3D? agino=3D? next_a= gino=3D? last_ibp=3D? last_dip=3D0xffff881017c6c800 bucket_index=3D? offset= =3D? last_offset=3D0xffffffffffff880e error=3D? __func__=3D[...]
ip: i_ino =3D 0x142, i_flags =3D 0x0
ip->i_d: di_nlink =3D 0x0, di_ge= n =3D 0x3565732e



2013/4/15 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com&g= t;
Also glusterfs use a l= ot of hardlink for self-heal:
--------T 2 root root 0 Apr 15 11:58 /mnt/= xfsd/testbug/998416323
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999296624
------= ---T 2 root root 0 Apr 15 12:24 /mnt/xfsd/testbug/999568484
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999956875
------= ---T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/2f/052f4e3e= -c379-4a3c-b995-a10fdaca33d0
---------T 2 root root 0 Apr 15 11:58 /mnt/= xfsd/testbug/.glusterfs/05/95/0595272e-ce2b-45d5-8693-d02c00b94d9d
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/ca/05= ca00a0-92a7-44cf-b6e3-380496aafaa4
---------T 2 root root 0 Apr 15 12:24= /mnt/xfsd/testbug/.glusterfs/0a/23/0a238ca7-3cef-4540-9c98-6bf631551b21 ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/0a/4b/0a= 4b640b-f675-4708-bb59-e2369ffbbb9d
Does it related?


2013/4/15 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Dear xfs experts,=
Now I'm deploying Brian's system script in out cluster. B= ut from last night till now 5 servers in our 24 servers xfs shutdown with t= he same error. I run xfs_repair command and found all the lost inodes are g= lusterfs dht link files. This explains why the xfs shutdown tend to happen = during glusterfs rebalance. During glusterfs rebalance procedure a lot of d= hk link files may be unlinked. For example the following inodes are found i= n lost+found in one of the servers:
[root@* lost+found]# pwd
/mnt/xfsd/lost+found
[root@* lost+found]# ls= -l
total 740
---------T 1 root root 0 Apr  8 21:06 100119
--= -------T 1 root root 0 Apr  8 21:11 101123
---------T 1 root root 0= Apr  8 21:19 102659
---------T 1 root root 0 Apr 12 14:46 1040919
---------T 1 root root 0 A= pr 12 14:58 1041943
---------T 1 root root 0 Apr  8 21:32 105219---------T 1 root root 0 Apr  8 21:37 105731
---------T 1 root roo= t 0 Apr 12 17:48 1068055
---------T 1 root root 0 Apr 12 18:38 1073943
---------T 1 root root 0 A= pr  8 21:54 108035
---------T 1 root root 0 Apr 12 21:49 1091095---------T 1 root root 0 Apr 13 00:17 1111063
---------T 1 root root 0 = Apr 13 03:51 1121815
---------T 1 root root 0 Apr  8 22:25 112387
---------T 1 root root= 0 Apr 13 06:39 1136151
...
[root@* lost+found]# getfattr -m . -d -e = hex *

# file: 96007
trusted.afr.mams-cq-mt-video-client-3=3D0x000= 000000000000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000
trust= ed.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000
trusted.gf= id=3D0xa0370d8a9f104dafbebbd0e6dd7ce1f7
trusted.glusterfs.dht.linkto=3D0= x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 0000049dff000

# file: 97027
trusted.afr.mams-cq-mt-video-client-3= =3D0x000000000000000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x= 000000000000000000000000
trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000
trust= ed.gfid=3D0xc1c1fe2ec7034442a623385f43b04c25
trusted.glusterfs.dht.linkt= o=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
trusted= .glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000000006a= c78000

# file: 97559
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0xcf7c17013c914511bda4d1c743fae118
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 000519fb000

# file: 98055
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0xe86abc6e2c4b44c28d415fbbe34f2102
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0004c098000

# file: 98567
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x12543a2efbdf4b9fa61c6d89ca396f80
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0006bc98000

# file: 98583
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x760d16d3b7974cfb9c0a665a0982c470
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0006cde9000

# file: 99607
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x0849a732ea204bc3b8bae830b46881da
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 000513f1000
...

What do you think about it? Thank you very much.
=


201= 3/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brian,

Your scripts works for me now after I installed all the rpm built out from= kernel srpm. I'll try it. Thank you.


2013/4/12 Brian Foster <bfoster@redhat.com>
On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote:
> Dear xfs experts,
> Can I just call xfs_stack_trace(); in the second line of
> xfs_do_force_shutdown() to print stack and rebuild kernel to check
> what's the error?
>

I suppose that's a start. If you're willing/able to create an= d run a
modified kernel for the purpose of collecting more debug info, perhaps
we can get a bit more creative in collecting more data on the problem
(but a stack trace there is a good start).

BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp)
check almost halfway into the function to avoid duplicate messages.

Brian

>
> 2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     Hi Brian,
>     What else I'm missing? Thank you.
>     stap -e 'probe module("xfs").function(&quo= t;xfs_iunlink"){}'
>
>     WARNING: cannot find module xfs debuginfo: No DWARF info= rmation found
>     semantic error: no match while resolving probe point
>     module("xfs").function("xfs_iunlink"= )
>     Pass 2: analysis failed.  Try again with another &#= 39;--vp 01' option.
>
>
>     2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:= yongtaofu@gmail.co= m>>
>
>         ls -l
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>         -r--r--r-- 1 root root 21393024 Apr 12 12:= 08
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>
>         rpm -qa|grep  kernel
>         kernel-headers-2.6.32-279.el6.x86_64
>         kernel-devel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>         kernel-debuginfo-common-x86_64-2.6.32-279.= el6.x86_64
>         abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >         kernel-firmware-2.6.32-358.el6.noarch
>         kernel-debug-2.6.32-358.el6.x86_64
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>         dracut-kernel-004-283.el6.noarch
>         libreport-plugin-kerneloops-2.0.9-5.el6.x8= 6_64
>         kernel-devel-2.6.32-358.el6.x86_64
>         kernel-2.6.32-279.el6.x86_64
>
>         rpm -q kernel-debuginfo
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>
>         rpm -q kernel
>         kernel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>
>         do I need to re probe it?
>
>
>         2013/4/12 Eric Sandeen <sandeen@sandeen.net
>         <mailto:sandeen@sandeen.net>>
>
>             On 4/11/13 11:32 PM, =B7=FB= =D3=C0=CC=CE wrote:
>             > Hi Brian,
>             > Sorry but when I execut= e the script it says:
>             > WARNING: cannot find mo= dule xfs debuginfo: No DWARF
>             information found
>             > semantic error: no matc= h while resolving probe point
>             module("xfs").func= tion("xfs_iunlink")
>             >
>             > uname -a
>             > 2.6.32-279.el6.x86_64 >             > kernel debuginfo has be= en installed.
>             >
>             > Where can I find the co= rrect xfs debuginfo?
>
>             it should be in the kernel-d= ebuginfo rpm (of the same
>             version/release as the kerne= l rpm you're running)
>
>             You should have:
>
>             /usr/lib/debug/lib/modules/2= .6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug
>
>             If not, can you show:
>
>             # uname -a
>             # rpm -q kernel
>             # rpm -q kernel-debuginfo >
>             -Eric
>
>
>
>
>
>         --
>         =B7=FB=D3=C0=CC=CE
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE
>
>
> _______________________________________________<= br> > xfs mailing list
> xfs@oss.sgi.com
>
= http://oss.sgi.com/mailman/listinfo/xfs
>




= --
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--089e0111e074747d8704da65c004-- From rjohnston@sgi.com Mon Apr 15 08:00:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CDEC929E03 for ; Mon, 15 Apr 2013 08:00:24 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 92F9130404E; Mon, 15 Apr 2013 06:00:24 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 15 Apr 2013 08:00:24 -0500 Message-ID: <516BFA10.6020102@sgi.com> Date: Mon, 15 Apr 2013 08:01:04 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Wang Sheng-Hui CC: Dave Chinner , Dave Chinner , xfstests Subject: Re: [PATCH v3] xfstests: make install support common/ and tests/ dirs References: <516937F9.1020101@gmail.com> In-Reply-To: <516937F9.1020101@gmail.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/13/2013 05:48 AM, Wang Sheng-Hui wrote: > diff --git a/Makefile b/Makefile > index 6edd55c..611b36d 100644 > --- a/Makefile > +++ b/Makefile > @@ -52,12 +52,15 @@ LDIRT += $(SRCTAR) > endif > > LIB_SUBDIRS = include lib > -TOOL_SUBDIRS = ltp src m4 > +TOOL_SUBDIRS = ltp src m4 common > ifeq ($(HAVE_DMAPI), true) > TOOL_SUBDIRS += dmapi > endif > > -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) > +TESTS_DIR = tests > +export TESTS_DIR > + > +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_DIR) > > default: include/builddefs $(DMAPI_MAKEFILE) $(TESTS) > ifeq ($(HAVE_BUILDDEFS), no) > @@ -91,12 +94,7 @@ depend: include/builddefs $(addsuffix > -depend,$(SUBDIRS)) > install: default $(addsuffix -install,$(SUBDIRS)) > $(INSTALL) -m 755 -d $(PKG_LIB_DIR) > $(INSTALL) -m 755 check $(PKG_LIB_DIR) > - $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) > - $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) > - $(INSTALL) -m 644 group $(PKG_LIB_DIR) > $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) > - $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) > - $(INSTALL) -m 644 common* $(PKG_LIB_DIR) > > # Nothing. > install-dev install-lib: Not sure why Makefile above would not apply. I did the following: git reset --hard 2bfce6d3 # Revert to commit before v2 of this patch. Attemted to apply patch Applying patch v3-xfstests-make-install-support-common-and-tests-dirs.patch patching file Makefile Hunk #1 FAILED at 52. Hunk #2 FAILED at 94. 2 out of 2 hunks FAILED -- rejects in file Makefile So I replaced your Makefile patch with > diff --git a/Makefile b/Makefile > index 6edd55c..b01491e 100644 > --- a/Makefile > +++ b/Makefile > @@ -52,12 +52,14 @@ LDIRT += $(SRCTAR) > endif > > LIB_SUBDIRS = include lib > -TOOL_SUBDIRS = ltp src m4 > +TOOL_SUBDIRS = ltp src m4 common > ifeq ($(HAVE_DMAPI), true) > TOOL_SUBDIRS += dmapi > endif > > -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) > +TESTS_DIR = tests > +export TESTS_DIR > +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_DIR) > > default: include/builddefs $(DMAPI_MAKEFILE) $(TESTS) > ifeq ($(HAVE_BUILDDEFS), no) > @@ -91,12 +93,7 @@ depend: include/builddefs $(addsuffix -depend,$(SUBDIRS)) > install: default $(addsuffix -install,$(SUBDIRS)) > $(INSTALL) -m 755 -d $(PKG_LIB_DIR) > $(INSTALL) -m 755 check $(PKG_LIB_DIR) > - $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) > - $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) > - $(INSTALL) -m 644 group $(PKG_LIB_DIR) > $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) > - $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) > - $(INSTALL) -m 644 common* $(PKG_LIB_DIR) > > # Nothing. > install-dev install-lib: Will revert v2 (git revert 2519a97d) and commit with this minor change is Dave agrees to your latest version. Thanks --Rich From yongtaofu@gmail.com Mon Apr 15 08:33:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C70B97F50 for ; Mon, 15 Apr 2013 08:33:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9D2B88F8037 for ; Mon, 15 Apr 2013 06:33:42 -0700 (PDT) X-ASG-Debug-ID: 1366032819-04cbb057f51ff4b0001-NocioJ Received: from mail-ie0-f175.google.com (mail-ie0-f175.google.com [209.85.223.175]) by cuda.sgi.com with ESMTP id HWyoF2LCy9AoKHnZ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 15 Apr 2013 06:33:40 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] Received: by mail-ie0-f175.google.com with SMTP id c12so5670462ieb.20 for ; Mon, 15 Apr 2013 06:33:39 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=93lsQ4CF9zTqTRGT0Yv/7TQoI2Kv79tZBRc3X5VfqTM=; b=pCIplPDG8iyGUInfTQgALYam+PrPNeqvXOtJKRxLv9fRPrSlOyX2zut3KtVy2kbaOe EzsobdftXpsBkB4atyTD3aGjSKQktzY8etxLSAA4jV3RkVcMmYmVnysWoDqDJXs5Fzq8 7L9EW/RdrAHCEsGDGkSW9Y7r+/nE6qzSnFm2JCxB1u/wnJUpIxywruROAFmEp7VBU0TN R/rnlFbLwv0tCnT6fGlSbUJ1Jt1BkD1JqgOBaU562rlnJbQrUhZqQu1//h+LFz5yS/7B luygsfYSs8Y4TdmC0HsjCXhZxxBl6JKmSLOkXItmVSF/+s0OnTTKaXGM1wT0B4VrSPuH DJHQ== MIME-Version: 1.0 X-Received: by 10.42.110.140 with SMTP id q12mr490420icp.18.1366032819359; Mon, 15 Apr 2013 06:33:39 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Mon, 15 Apr 2013 06:33:39 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> <516800F7.80502@redhat.com> Date: Mon, 15 Apr 2013 21:33:39 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Eric Sandeen , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=20cf303dd2b0f323ea04da664c60 X-Barracuda-Connect: mail-ie0-f175.google.com[209.85.223.175] X-Barracuda-Start-Time: 1366032819 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128195 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 --20cf303dd2b0f323ea04da664c60 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable and xfs kernel trace is: Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22. Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22 Apr 15 20:43:03 10 kernel: Pid: 3093, comm: glusterfsd Not tainted 2.6.32-279.el6.x86_64 #1 Apr 15 20:43:03 10 kernel: Call Trace: Apr 15 20:43:03 10 kernel: [] ? xfs_inactive+0x442/0x460 [xfs] Apr 15 20:43:03 10 kernel: [] ? xfs_fs_clear_inode+0xa0/0xd0 [xfs] Apr 15 20:43:03 10 kernel: [] ? clear_inode+0xac/0x140 Apr 15 20:43:03 10 kernel: [] ? generic_delete_inode+0x196/0x1d0 Apr 15 20:43:03 10 kernel: [] ? generic_drop_inode+0x65/0x80 Apr 15 20:43:03 10 kernel: [] ? iput+0x62/0x70 Apr 15 20:43:03 10 kernel: [] ? dentry_iput+0x90/0x100 Apr 15 20:43:03 10 kernel: [] ? d_kill+0x31/0x60 Apr 15 20:43:03 10 kernel: [] ? dput+0x7c/0x150 Apr 15 20:43:03 10 kernel: [] ? __fput+0x189/0x210 Apr 15 20:43:03 10 kernel: [] ? fput+0x25/0x30 Apr 15 20:43:03 10 kernel: [] ? filp_close+0x5d/0x90 Apr 15 20:43:03 10 kernel: [] ? sys_close+0xa5/0x100 Apr 15 20:43:03 10 kernel: [] ? tracesys+0xd9/0xde Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called from line 1186 of file fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02d422b Apr 15 20:43:03 10 kernel: XFS (sdb): I/O Error Detected. Shutting down filesystem Apr 15 20:43:03 10 kernel: XFS (sdb): Please umount the filesystem and rectify the problem(s) Apr 15 20:43:13 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. 2013/4/15 =B7=FB=D3=C0=CC=CE > Dear Brian and xfs experts, > Brain your scripts works and I am able to reproduce it with glusterfs > rebalance on our test cluster. 2 of our server xfs shutdown during > glusterfs rebalance, the shutdown userspace stacktrace both related to > pthread. See logs bellow, What's your opinion? Thank you very much! > logs: > [root@10.23.72.93 ~]# cat xfs.log > > --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257= ").return > -- return=3D0x16 > vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff > imap=3D0xffff88100e2f7c08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_p= er_cluster=3D? > chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? _= _func__=3D[...] > mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 > mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D= 0x4, > sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 > imap: im_blkno =3D 0x0, im_len =3D 0xa078, im_boffset =3D 0x86ea > kernel backtrace: > Returning from: 0xffffffffa02b3ab0 : xfs_imap+0x0/0x280 [xfs] > Returning to : 0xffffffffa02b9599 : xfs_inotobp+0x49/0xc0 [xfs] > 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x320 [xfs] > 0xffffffff81501a69 > 0x0 (inexact) > user backtrace: > 0x3bd1a0e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000] > > --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/x= fs/xfs_inode.c:1680").return > -- return=3D0x16 > vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D?= agi=3D? > dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino= =3D? last_ibp=3D? > last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? > last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] > ip: i_ino =3D 0x113, i_flags =3D 0x0 > ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x0 > [root@10.23.72.93 ~]# > [root@10.23.72.94 ~]# cat xfs.log > > --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257= ").return > -- return=3D0x16 > vars: mp=3D0xffff881017c6c800 tp=3D0xffff8801037acea0 ino=3D0xffffffff > imap=3D0xffff882017101c08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_p= er_cluster=3D? > chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? _= _func__=3D[...] > mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 > mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D= 0x4, > sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 > imap: im_blkno =3D 0x0, im_len =3D 0xd98, im_boffset =3D 0x547 > kernel backtrace: > Returning from: 0xffffffffa02b3ab0 : xfs_imap+0x0/0x280 [xfs] > Returning to : 0xffffffffa02b9599 : xfs_inotobp+0x49/0xc0 [xfs] > 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x320 [xfs] > 0xffffffff81501a69 > 0x0 (inexact) > user backtrace: > 0x30cd40e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000] > > --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/x= fs/xfs_inode.c:1680").return > -- return=3D0x16 > vars: tp=3D0xffff8801037acea0 ip=3D0xffff880e697c8800 next_ino=3D? mp=3D?= agi=3D? > dip=3D? agibp=3D0xffff880d846c2d60 ibp=3D? agno=3D? agino=3D? next_agino= =3D? last_ibp=3D? > last_dip=3D0xffff881017c6c800 bucket_index=3D? offset=3D? > last_offset=3D0xffffffffffff880e error=3D? __func__=3D[...] > ip: i_ino =3D 0x142, i_flags =3D 0x0 > ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x3565732e > > > > 2013/4/15 =B7=FB=D3=C0=CC=CE > >> Also glusterfs use a lot of hardlink for self-heal: >> --------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/998416323 >> ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999296624 >> ---------T 2 root root 0 Apr 15 12:24 /mnt/xfsd/testbug/999568484 >> ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999956875 >> ---------T 2 root root 0 Apr 15 11:58 >> /mnt/xfsd/testbug/.glusterfs/05/2f/052f4e3e-c379-4a3c-b995-a10fdaca33d0 >> ---------T 2 root root 0 Apr 15 11:58 >> /mnt/xfsd/testbug/.glusterfs/05/95/0595272e-ce2b-45d5-8693-d02c00b94d9d >> ---------T 2 root root 0 Apr 15 11:58 >> /mnt/xfsd/testbug/.glusterfs/05/ca/05ca00a0-92a7-44cf-b6e3-380496aafaa4 >> ---------T 2 root root 0 Apr 15 12:24 >> /mnt/xfsd/testbug/.glusterfs/0a/23/0a238ca7-3cef-4540-9c98-6bf631551b21 >> ---------T 2 root root 0 Apr 15 11:58 >> /mnt/xfsd/testbug/.glusterfs/0a/4b/0a4b640b-f675-4708-bb59-e2369ffbbb9d >> Does it related? >> >> >> 2013/4/15 =B7=FB=D3=C0=CC=CE >> >>> Dear xfs experts, >>> Now I'm deploying Brian's system script in out cluster. But from last >>> night till now 5 servers in our 24 servers xfs shutdown with the same >>> error. I run xfs_repair command and found all the lost inodes are glust= erfs >>> dht link files. This explains why the xfs shutdown tend to happen durin= g >>> glusterfs rebalance. During glusterfs rebalance procedure a lot of dhk = link >>> files may be unlinked. For example the following inodes are found in >>> lost+found in one of the servers: >>> [root@* lost+found]# pwd >>> /mnt/xfsd/lost+found >>> [root@* lost+found]# ls -l >>> total 740 >>> ---------T 1 root root 0 Apr 8 21:06 100119 >>> ---------T 1 root root 0 Apr 8 21:11 101123 >>> ---------T 1 root root 0 Apr 8 21:19 102659 >>> ---------T 1 root root 0 Apr 12 14:46 1040919 >>> ---------T 1 root root 0 Apr 12 14:58 1041943 >>> ---------T 1 root root 0 Apr 8 21:32 105219 >>> ---------T 1 root root 0 Apr 8 21:37 105731 >>> ---------T 1 root root 0 Apr 12 17:48 1068055 >>> ---------T 1 root root 0 Apr 12 18:38 1073943 >>> ---------T 1 root root 0 Apr 8 21:54 108035 >>> ---------T 1 root root 0 Apr 12 21:49 1091095 >>> ---------T 1 root root 0 Apr 13 00:17 1111063 >>> ---------T 1 root root 0 Apr 13 03:51 1121815 >>> ---------T 1 root root 0 Apr 8 22:25 112387 >>> ---------T 1 root root 0 Apr 13 06:39 1136151 >>> ... >>> [root@* lost+found]# getfattr -m . -d -e hex * >>> >>> # file: 96007 >>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>> trusted.gfid=3D0xa0370d8a9f104dafbebbd0e6dd7ce1f7 >>> >>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265= 706c69636174652d3600 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0= x0000000049dff000 >>> >>> # file: 97027 >>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>> trusted.gfid=3D0xc1c1fe2ec7034442a623385f43b04c25 >>> >>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265= 706c69636174652d3600 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0= x000000006ac78000 >>> >>> # file: 97559 >>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>> trusted.gfid=3D0xcf7c17013c914511bda4d1c743fae118 >>> >>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265= 706c69636174652d3500 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0= x00000000519fb000 >>> >>> # file: 98055 >>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>> trusted.gfid=3D0xe86abc6e2c4b44c28d415fbbe34f2102 >>> >>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265= 706c69636174652d3600 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0= x000000004c098000 >>> >>> # file: 98567 >>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>> trusted.gfid=3D0x12543a2efbdf4b9fa61c6d89ca396f80 >>> >>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265= 706c69636174652d3500 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0= x000000006bc98000 >>> >>> # file: 98583 >>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>> trusted.gfid=3D0x760d16d3b7974cfb9c0a665a0982c470 >>> >>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265= 706c69636174652d3500 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0= x000000006cde9000 >>> >>> # file: 99607 >>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>> trusted.gfid=3D0x0849a732ea204bc3b8bae830b46881da >>> >>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d7265= 706c69636174652d3500 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0= x00000000513f1000 >>> ... >>> >>> What do you think about it? Thank you very much. >>> >>> >>> 2013/4/12 =B7=FB=D3=C0=CC=CE >>> >>>> Hi Brian, >>>> >>>> Your scripts works for me now after I installed all the rpm built out >>>> from kernel srpm. I'll try it. Thank you. >>>> >>>> >>>> 2013/4/12 Brian Foster >>>> >>>>> On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote: >>>>> > Dear xfs experts, >>>>> > Can I just call xfs_stack_trace(); in the second line of >>>>> > xfs_do_force_shutdown() to print stack and rebuild kernel to check >>>>> > what's the error? >>>>> > >>>>> >>>>> I suppose that's a start. If you're willing/able to create and run a >>>>> modified kernel for the purpose of collecting more debug info, perhap= s >>>>> we can get a bit more creative in collecting more data on the problem >>>>> (but a stack trace there is a good start). >>>>> >>>>> BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(m= p) >>>>> check almost halfway into the function to avoid duplicate messages. >>>>> >>>>> Brian >>>>> >>>>> > >>>>> > 2013/4/12 =B7=FB=D3=C0=CC=CE > >>>>> > >>>>> > Hi Brian, >>>>> > What else I'm missing? Thank you. >>>>> > stap -e 'probe module("xfs").function("xfs_iunlink"){}' >>>>> > >>>>> > WARNING: cannot find module xfs debuginfo: No DWARF information >>>>> found >>>>> > semantic error: no match while resolving probe point >>>>> > module("xfs").function("xfs_iunlink") >>>>> > Pass 2: analysis failed. Try again with another '--vp 01' >>>>> option. >>>>> > >>>>> > >>>>> > 2013/4/12 =B7=FB=D3=C0=CC=CE > >>>>> > >>>>> > ls -l >>>>> > >>>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko= .debug >>>>> > -r--r--r-- 1 root root 21393024 Apr 12 12:08 >>>>> > >>>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko= .debug >>>>> > >>>>> > rpm -qa|grep kernel >>>>> > kernel-headers-2.6.32-279.el6.x86_64 >>>>> > kernel-devel-2.6.32-279.el6.x86_64 >>>>> > kernel-2.6.32-358.el6.x86_64 >>>>> > kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 >>>>> > abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >>>>> > kernel-firmware-2.6.32-358.el6.noarch >>>>> > kernel-debug-2.6.32-358.el6.x86_64 >>>>> > kernel-debuginfo-2.6.32-279.el6.x86_64 >>>>> > dracut-kernel-004-283.el6.noarch >>>>> > libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 >>>>> > kernel-devel-2.6.32-358.el6.x86_64 >>>>> > kernel-2.6.32-279.el6.x86_64 >>>>> > >>>>> > rpm -q kernel-debuginfo >>>>> > kernel-debuginfo-2.6.32-279.el6.x86_64 >>>>> > >>>>> > rpm -q kernel >>>>> > kernel-2.6.32-279.el6.x86_64 >>>>> > kernel-2.6.32-358.el6.x86_64 >>>>> > >>>>> > do I need to re probe it? >>>>> > >>>>> > >>>>> > 2013/4/12 Eric Sandeen >>>> > > >>>>> > >>>>> > On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote: >>>>> > > Hi Brian, >>>>> > > Sorry but when I execute the script it says: >>>>> > > WARNING: cannot find module xfs debuginfo: No DWARF >>>>> > information found >>>>> > > semantic error: no match while resolving probe point >>>>> > module("xfs").function("xfs_iunlink") >>>>> > > >>>>> > > uname -a >>>>> > > 2.6.32-279.el6.x86_64 >>>>> > > kernel debuginfo has been installed. >>>>> > > >>>>> > > Where can I find the correct xfs debuginfo? >>>>> > >>>>> > it should be in the kernel-debuginfo rpm (of the same >>>>> > version/release as the kernel rpm you're running) >>>>> > >>>>> > You should have: >>>>> > >>>>> > >>>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko= .debug >>>>> > >>>>> > If not, can you show: >>>>> > >>>>> > # uname -a >>>>> > # rpm -q kernel >>>>> > # rpm -q kernel-debuginfo >>>>> > >>>>> > -Eric >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > -- >>>>> > =B7=FB=D3=C0=CC=CE >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > -- >>>>> > =B7=FB=D3=C0=CC=CE >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > -- >>>>> > =B7=FB=D3=C0=CC=CE >>>>> > >>>>> > >>>>> > _______________________________________________ >>>>> > xfs mailing list >>>>> > xfs@oss.sgi.com >>>>> > http://oss.sgi.com/mailman/listinfo/xfs >>>>> > >>>>> >>>>> >>>> >>>> >>>> -- >>>> =B7=FB=D3=C0=CC=CE >>>> >>> >>> >>> >>> -- >>> =B7=FB=D3=C0=CC=CE >>> >> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --20cf303dd2b0f323ea04da664c60 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
and xfs kernel trace is:
Apr 15 20:43:03 10 kernel: XFS= (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22.
Apr 15 20:4= 3:03 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22
Apr= 15 20:43:03 10 kernel: Pid: 3093, comm: glusterfsd Not tainted 2.6.32-279.= el6.x86_64 #1
Apr 15 20:43:03 10 kernel: Call Trace:
Apr 15 20:43:03 10 kernel: [<f= fffffffa02d4212>] ? xfs_inactive+0x442/0x460 [xfs]
Apr 15 20:43:03 10= kernel: [<ffffffffa02e1790>] ? xfs_fs_clear_inode+0xa0/0xd0 [xfs] Apr 15 20:43:03 10 kernel: [<ffffffff81195adc>] ? clear_inode+0xac/0x= 140
Apr 15 20:43:03 10 kernel: [<ffffffff81196296>] ? generic_dele= te_inode+0x196/0x1d0
Apr 15 20:43:03 10 kernel: [<ffffffff81196335>= ;] ? generic_drop_inode+0x65/0x80
Apr 15 20:43:03 10 kernel: [<ffffffff81195182>] ? iput+0x62/0x70
A= pr 15 20:43:03 10 kernel: [<ffffffff81191ce0>] ? dentry_iput+0x90/0x1= 00
Apr 15 20:43:03 10 kernel: [<ffffffff81191e41>] ? d_kill+0x31/0= x60
Apr 15 20:43:03 10 kernel: [<ffffffff8119386c>] ? dput+0x7c/0x150
= Apr 15 20:43:03 10 kernel: [<ffffffff8117c9c9>] ? __fput+0x189/0x210<= br>Apr 15 20:43:03 10 kernel: [<ffffffff8117ca75>] ? fput+0x25/0x30 Apr 15 20:43:03 10 kernel: [<ffffffff8117849d>] ? filp_close+0x5d/0x9= 0
Apr 15 20:43:03 10 kernel: [<ffffffff81178575>] ? sys_close+0xa5= /0x100
Apr 15 20:43:03 10 kernel: [<ffffffff8100b308>] ? tracesys+= 0xd9/0xde
Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called fro= m line 1186 of file fs/xfs/xfs_vnodeops.c.  Return address =3D 0xfffff= fffa02d422b
Apr 15 20:43:03 10 kernel: XFS (sdb): I/O Error Detected. Sh= utting down filesystem
Apr 15 20:43:03 10 kernel: XFS (sdb): Please umount the filesystem and rect= ify the problem(s)
Apr 15 20:43:13 10 kernel: XFS (sdb): xfs_log_force: = error 5 returned.


2013/4/15 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Dear Brian and xfs experts,
Brain your = scripts works and I am able to reproduce it with glusterfs rebalance on our= test cluster. 2 of our server xfs shutdown during glusterfs rebalance, the= shutdown userspace stacktrace both related to pthread. See logs bellow, Wh= at's your opinion? Thank you very much!
logs:
[root@= 10.23.72.93 ~]# cat xfs.log

--- xfs_imap -- module("xfs&qu= ot;).function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- retu= rn=3D0x16
vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff imap= =3D0xffff88100e2f7c08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_per_clu= ster=3D? chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbn= o=3D? __func__=3D[...]
mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20
mp->m_sb: sb_agcount =3D= 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c= , sb_dblocks =3D 0x1b4900000
imap: im_blkno =3D 0x0, im_len =3D 0xa078, = im_boffset =3D 0x86ea
kernel backtrace:
Returning from:  0xffffffffa02b3ab0 : xfs_imap+0x= 0/0x280 [xfs]
Returning to  :  0xffffffffa02b9599 : xfs_inotob= p+0x49/0xc0 [xfs]
 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x3= 20 [xfs]
 0xffffffff81501a69
 0x0 (inexact)
user backtrace:
 0x3bd1a0e5ad [/lib64/libpthread-2.12.so+0x= e5ad/0x219000]

--- xfs_iunlink_remove -- module("xfs").fun= ction("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return -- ret= urn=3D0x16
vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_a= gino=3D? last_ibp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset= =3D? last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0x113, i_flags =3D 0x0
ip->i_d: di_nlink =3D 0x0, di_ge= n =3D 0x0
[root@10= .23.72.93 ~]#
[root@10.23.72.94 ~]# cat xfs.log

--- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_= ialloc.c:1257").return -- return=3D0x16
vars: mp=3D0xffff881017c6c8= 00 tp=3D0xffff8801037acea0 ino=3D0xffffffff imap=3D0xffff882017101c08 flags= =3D0x0 agbno=3D? agino=3D? agno=3D? blks_per_cluster=3D? chunk_agbno=3D? cl= uster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? __func__=3D[...]
mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20
mp->m_sb: sb_agcount =3D= 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c= , sb_dblocks =3D 0x1b4900000
imap: im_blkno =3D 0x0, im_len =3D 0xd98, i= m_boffset =3D 0x547
kernel backtrace:
Returning from:  0xffffffffa02b3ab0 : xfs_imap+0x= 0/0x280 [xfs]
Returning to  :  0xffffffffa02b9599 : xfs_inotob= p+0x49/0xc0 [xfs]
 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x3= 20 [xfs]
 0xffffffff81501a69
 0x0 (inexact)
user backtrace:
 0x30cd40e5ad [/lib64/libpthread-2.12.so+0x= e5ad/0x219000]

--- xfs_iunlink_remove -- module("xfs").fun= ction("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return -- ret= urn=3D0x16
vars: tp=3D0xffff8801037acea0 ip=3D0xffff880e697c8800 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880d846c2d60 ibp=3D? agno=3D? agino=3D? next_a= gino=3D? last_ibp=3D? last_dip=3D0xffff881017c6c800 bucket_index=3D? offset= =3D? last_offset=3D0xffffffffffff880e error=3D? __func__=3D[...]
ip: i_ino =3D 0x142, i_flags =3D 0x0
ip->i_d: di_nlink =3D 0x0, di_ge= n =3D 0x3565732e



2013/4/15 =B7=FB=D3=C0=CC=CE <yo= ngtaofu@gmail.com>
Also glusterfs use a l= ot of hardlink for self-heal:
--------T 2 root root 0 Apr 15 11:58 /mnt/= xfsd/testbug/998416323
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999296624
------= ---T 2 root root 0 Apr 15 12:24 /mnt/xfsd/testbug/999568484
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999956875
------= ---T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/2f/052f4e3e= -c379-4a3c-b995-a10fdaca33d0
---------T 2 root root 0 Apr 15 11:58 /mnt/= xfsd/testbug/.glusterfs/05/95/0595272e-ce2b-45d5-8693-d02c00b94d9d
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/ca/05= ca00a0-92a7-44cf-b6e3-380496aafaa4
---------T 2 root root 0 Apr 15 12:24= /mnt/xfsd/testbug/.glusterfs/0a/23/0a238ca7-3cef-4540-9c98-6bf631551b21 ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/0a/4b/0a= 4b640b-f675-4708-bb59-e2369ffbbb9d
Does it related?


2013/4/15 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Dear xfs experts,=
Now I'm deploying Brian's system script in out cluster. B= ut from last night till now 5 servers in our 24 servers xfs shutdown with t= he same error. I run xfs_repair command and found all the lost inodes are g= lusterfs dht link files. This explains why the xfs shutdown tend to happen = during glusterfs rebalance. During glusterfs rebalance procedure a lot of d= hk link files may be unlinked. For example the following inodes are found i= n lost+found in one of the servers:
[root@* lost+found]# pwd
/mnt/xfsd/lost+found
[root@* lost+found]# ls= -l
total 740
---------T 1 root root 0 Apr  8 21:06 100119
--= -------T 1 root root 0 Apr  8 21:11 101123
---------T 1 root root 0= Apr  8 21:19 102659
---------T 1 root root 0 Apr 12 14:46 1040919
---------T 1 root root 0 A= pr 12 14:58 1041943
---------T 1 root root 0 Apr  8 21:32 105219---------T 1 root root 0 Apr  8 21:37 105731
---------T 1 root roo= t 0 Apr 12 17:48 1068055
---------T 1 root root 0 Apr 12 18:38 1073943
---------T 1 root root 0 A= pr  8 21:54 108035
---------T 1 root root 0 Apr 12 21:49 1091095---------T 1 root root 0 Apr 13 00:17 1111063
---------T 1 root root 0 = Apr 13 03:51 1121815
---------T 1 root root 0 Apr  8 22:25 112387
---------T 1 root root= 0 Apr 13 06:39 1136151
...
[root@* lost+found]# getfattr -m . -d -e = hex *

# file: 96007
trusted.afr.mams-cq-mt-video-client-3=3D0x000= 000000000000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000
trust= ed.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000
trusted.gf= id=3D0xa0370d8a9f104dafbebbd0e6dd7ce1f7
trusted.glusterfs.dht.linkto=3D0= x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 0000049dff000

# file: 97027
trusted.afr.mams-cq-mt-video-client-3= =3D0x000000000000000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x= 000000000000000000000000
trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000
trust= ed.gfid=3D0xc1c1fe2ec7034442a623385f43b04c25
trusted.glusterfs.dht.linkt= o=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
trusted= .glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000000006a= c78000

# file: 97559
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0xcf7c17013c914511bda4d1c743fae118
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 000519fb000

# file: 98055
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0xe86abc6e2c4b44c28d415fbbe34f2102
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0004c098000

# file: 98567
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x12543a2efbdf4b9fa61c6d89ca396f80
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0006bc98000

# file: 98583
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x760d16d3b7974cfb9c0a665a0982c470
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0006cde9000

# file: 99607
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x0849a732ea204bc3b8bae830b46881da
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 000513f1000
...

What do you think about it? Thank you very much.
=


201= 3/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brian,

Your scripts works for me now after I installed all the rpm built out from= kernel srpm. I'll try it. Thank you.


2013/4/12 Brian Foster <bfoster@redhat.com>
On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote:
> Dear xfs experts,
> Can I just call xfs_stack_trace(); in the second line of
> xfs_do_force_shutdown() to print stack and rebuild kernel to check
> what's the error?
>

I suppose that's a start. If you're willing/able to create an= d run a
modified kernel for the purpose of collecting more debug info, perhaps
we can get a bit more creative in collecting more data on the problem
(but a stack trace there is a good start).

BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp)
check almost halfway into the function to avoid duplicate messages.

Brian

>
> 2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     Hi Brian,
>     What else I'm missing? Thank you.
>     stap -e 'probe module("xfs").function(&quo= t;xfs_iunlink"){}'
>
>     WARNING: cannot find module xfs debuginfo: No DWARF info= rmation found
>     semantic error: no match while resolving probe point
>     module("xfs").function("xfs_iunlink"= )
>     Pass 2: analysis failed.  Try again with another &#= 39;--vp 01' option.
>
>
>     2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:= yongtaofu@gmail.co= m>>
>
>         ls -l
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>         -r--r--r-- 1 root root 21393024 Apr 12 12:= 08
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>
>         rpm -qa|grep  kernel
>         kernel-headers-2.6.32-279.el6.x86_64
>         kernel-devel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>         kernel-debuginfo-common-x86_64-2.6.32-279.= el6.x86_64
>         abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >         kernel-firmware-2.6.32-358.el6.noarch
>         kernel-debug-2.6.32-358.el6.x86_64
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>         dracut-kernel-004-283.el6.noarch
>         libreport-plugin-kerneloops-2.0.9-5.el6.x8= 6_64
>         kernel-devel-2.6.32-358.el6.x86_64
>         kernel-2.6.32-279.el6.x86_64
>
>         rpm -q kernel-debuginfo
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>
>         rpm -q kernel
>         kernel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>
>         do I need to re probe it?
>
>
>         2013/4/12 Eric Sandeen <sandeen@sandeen.net
>         <mailto:sandeen@sandeen.net>>
>
>             On 4/11/13 11:32 PM, =B7=FB= =D3=C0=CC=CE wrote:
>             > Hi Brian,
>             > Sorry but when I execut= e the script it says:
>             > WARNING: cannot find mo= dule xfs debuginfo: No DWARF
>             information found
>             > semantic error: no matc= h while resolving probe point
>             module("xfs").func= tion("xfs_iunlink")
>             >
>             > uname -a
>             > 2.6.32-279.el6.x86_64 >             > kernel debuginfo has be= en installed.
>             >
>             > Where can I find the co= rrect xfs debuginfo?
>
>             it should be in the kernel-d= ebuginfo rpm (of the same
>             version/release as the kerne= l rpm you're running)
>
>             You should have:
>
>             /usr/lib/debug/lib/modules/2= .6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug
>
>             If not, can you show:
>
>             # uname -a
>             # rpm -q kernel
>             # rpm -q kernel-debuginfo >
>             -Eric
>
>
>
>
>
>         --
>         =B7=FB=D3=C0=CC=CE
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE
>
>
> _______________________________________________<= br> > xfs mailing list
> xfs@oss.sgi.com
>
= http://oss.sgi.com/mailman/listinfo/xfs
>




= --
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--20cf303dd2b0f323ea04da664c60-- From yongtaofu@gmail.com Mon Apr 15 08:36:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 75FBD7F51 for ; Mon, 15 Apr 2013 08:36:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B629CAC006 for ; Mon, 15 Apr 2013 06:36:07 -0700 (PDT) X-ASG-Debug-ID: 1366032964-04cb6c2c1c207d10001-NocioJ Received: from mail-ie0-f178.google.com (mail-ie0-f178.google.com [209.85.223.178]) by cuda.sgi.com with ESMTP id PihS87vzYGkOeCOi (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 15 Apr 2013 06:36:04 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] Received: by mail-ie0-f178.google.com with SMTP id bn7so5665554ieb.37 for ; Mon, 15 Apr 2013 06:36:04 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=GCFwSTgnBKKxH/tr7dDjkzutZJ/i7Fa5h60GUHsYti8=; b=stUU+GgVDQyKWEyk45XG6ugJ+B9QjdY3b5aVrrfc/tx62kj6BvzptDmfdk4ffrXF+m pIa6TaYaTlWy9KNYLNLCxD/AIQ5AdZtUWIt7hn60dkAnYyCcHgZZb9LXyz6mwf3Vyc8w EvFgBF3xfH3Ur1+u+IWsJv42PQfMmUkW+E18qkyAd1X6NHZagnV4QpK96f789+fTsZS5 W6HwdB16VGjP0unzCPsVWZDa5r42AMEO27zNQcvbwyeZlhWzB/NMeT8eNrzF6Iht5P+n MQSIkYrKaJ2Akzvaf5sHUSjOzCU1AKZDMyJcToxoBd0LwWnjROYZKiSY3e/VTow5ldYW n1Pg== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr5392021igx.11.1366032964415; Mon, 15 Apr 2013 06:36:04 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Mon, 15 Apr 2013 06:36:04 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> <516800F7.80502@redhat.com> Date: Mon, 15 Apr 2013 21:36:04 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Eric Sandeen , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e0111e07498c28304da6655f4 X-Barracuda-Connect: mail-ie0-f178.google.com[209.85.223.178] X-Barracuda-Start-Time: 1366032964 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128195 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 --089e0111e07498c28304da6655f4 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable More info about it is: It happened exactly when glusterfs rebalance complete. 2013/4/15 =B7=FB=D3=C0=CC=CE > and xfs kernel trace is: > Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() > returned error 22. > Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned > error 22 > Apr 15 20:43:03 10 kernel: Pid: 3093, comm: glusterfsd Not tainted > 2.6.32-279.el6.x86_64 #1 > Apr 15 20:43:03 10 kernel: Call Trace: > Apr 15 20:43:03 10 kernel: [] ? xfs_inactive+0x442/0x46= 0 > [xfs] > Apr 15 20:43:03 10 kernel: [] ? > xfs_fs_clear_inode+0xa0/0xd0 [xfs] > Apr 15 20:43:03 10 kernel: [] ? clear_inode+0xac/0x140 > Apr 15 20:43:03 10 kernel: [] ? > generic_delete_inode+0x196/0x1d0 > Apr 15 20:43:03 10 kernel: [] ? > generic_drop_inode+0x65/0x80 > Apr 15 20:43:03 10 kernel: [] ? iput+0x62/0x70 > Apr 15 20:43:03 10 kernel: [] ? dentry_iput+0x90/0x100 > Apr 15 20:43:03 10 kernel: [] ? d_kill+0x31/0x60 > Apr 15 20:43:03 10 kernel: [] ? dput+0x7c/0x150 > Apr 15 20:43:03 10 kernel: [] ? __fput+0x189/0x210 > Apr 15 20:43:03 10 kernel: [] ? fput+0x25/0x30 > Apr 15 20:43:03 10 kernel: [] ? filp_close+0x5d/0x90 > Apr 15 20:43:03 10 kernel: [] ? sys_close+0xa5/0x100 > Apr 15 20:43:03 10 kernel: [] ? tracesys+0xd9/0xde > Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called > from line 1186 of file fs/xfs/xfs_vnodeops.c. Return address =3D > 0xffffffffa02d422b > Apr 15 20:43:03 10 kernel: XFS (sdb): I/O Error Detected. Shutting down > filesystem > Apr 15 20:43:03 10 kernel: XFS (sdb): Please umount the filesystem and > rectify the problem(s) > Apr 15 20:43:13 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > > 2013/4/15 =B7=FB=D3=C0=CC=CE > >> Dear Brian and xfs experts, >> Brain your scripts works and I am able to reproduce it with glusterfs >> rebalance on our test cluster. 2 of our server xfs shutdown during >> glusterfs rebalance, the shutdown userspace stacktrace both related to >> pthread. See logs bellow, What's your opinion? Thank you very much! >> logs: >> [root@10.23.72.93 ~]# cat xfs.log >> >> --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:125= 7").return >> -- return=3D0x16 >> vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff >> imap=3D0xffff88100e2f7c08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_= per_cluster=3D? >> chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? = __func__=3D[...] >> mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 >> mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog = =3D 0x4, >> sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 >> imap: im_blkno =3D 0x0, im_len =3D 0xa078, im_boffset =3D 0x86ea >> kernel backtrace: >> Returning from: 0xffffffffa02b3ab0 : xfs_imap+0x0/0x280 [xfs] >> Returning to : 0xffffffffa02b9599 : xfs_inotobp+0x49/0xc0 [xfs] >> 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x320 [xfs] >> 0xffffffff81501a69 >> 0x0 (inexact) >> user backtrace: >> 0x3bd1a0e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000] >> >> --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/= xfs/xfs_inode.c:1680").return >> -- return=3D0x16 >> vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D= ? agi=3D? >> dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino= =3D? last_ibp=3D? >> last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? >> last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] >> ip: i_ino =3D 0x113, i_flags =3D 0x0 >> ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x0 >> [root@10.23.72.93 ~]# >> [root@10.23.72.94 ~]# cat xfs.log >> >> --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:125= 7").return >> -- return=3D0x16 >> vars: mp=3D0xffff881017c6c800 tp=3D0xffff8801037acea0 ino=3D0xffffffff >> imap=3D0xffff882017101c08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_= per_cluster=3D? >> chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? = __func__=3D[...] >> mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 >> mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog = =3D 0x4, >> sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 >> imap: im_blkno =3D 0x0, im_len =3D 0xd98, im_boffset =3D 0x547 >> kernel backtrace: >> Returning from: 0xffffffffa02b3ab0 : xfs_imap+0x0/0x280 [xfs] >> Returning to : 0xffffffffa02b9599 : xfs_inotobp+0x49/0xc0 [xfs] >> 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x320 [xfs] >> 0xffffffff81501a69 >> 0x0 (inexact) >> user backtrace: >> 0x30cd40e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000] >> >> --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/= xfs/xfs_inode.c:1680").return >> -- return=3D0x16 >> vars: tp=3D0xffff8801037acea0 ip=3D0xffff880e697c8800 next_ino=3D? mp=3D= ? agi=3D? >> dip=3D? agibp=3D0xffff880d846c2d60 ibp=3D? agno=3D? agino=3D? next_agino= =3D? last_ibp=3D? >> last_dip=3D0xffff881017c6c800 bucket_index=3D? offset=3D? >> last_offset=3D0xffffffffffff880e error=3D? __func__=3D[...] >> ip: i_ino =3D 0x142, i_flags =3D 0x0 >> ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x3565732e >> >> >> >> 2013/4/15 =B7=FB=D3=C0=CC=CE >> >>> Also glusterfs use a lot of hardlink for self-heal: >>> --------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/998416323 >>> ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999296624 >>> ---------T 2 root root 0 Apr 15 12:24 /mnt/xfsd/testbug/999568484 >>> ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999956875 >>> ---------T 2 root root 0 Apr 15 11:58 >>> /mnt/xfsd/testbug/.glusterfs/05/2f/052f4e3e-c379-4a3c-b995-a10fdaca33d0 >>> ---------T 2 root root 0 Apr 15 11:58 >>> /mnt/xfsd/testbug/.glusterfs/05/95/0595272e-ce2b-45d5-8693-d02c00b94d9d >>> ---------T 2 root root 0 Apr 15 11:58 >>> /mnt/xfsd/testbug/.glusterfs/05/ca/05ca00a0-92a7-44cf-b6e3-380496aafaa4 >>> ---------T 2 root root 0 Apr 15 12:24 >>> /mnt/xfsd/testbug/.glusterfs/0a/23/0a238ca7-3cef-4540-9c98-6bf631551b21 >>> ---------T 2 root root 0 Apr 15 11:58 >>> /mnt/xfsd/testbug/.glusterfs/0a/4b/0a4b640b-f675-4708-bb59-e2369ffbbb9d >>> Does it related? >>> >>> >>> 2013/4/15 =B7=FB=D3=C0=CC=CE >>> >>>> Dear xfs experts, >>>> Now I'm deploying Brian's system script in out cluster. But from last >>>> night till now 5 servers in our 24 servers xfs shutdown with the same >>>> error. I run xfs_repair command and found all the lost inodes are glus= terfs >>>> dht link files. This explains why the xfs shutdown tend to happen duri= ng >>>> glusterfs rebalance. During glusterfs rebalance procedure a lot of dhk= link >>>> files may be unlinked. For example the following inodes are found in >>>> lost+found in one of the servers: >>>> [root@* lost+found]# pwd >>>> /mnt/xfsd/lost+found >>>> [root@* lost+found]# ls -l >>>> total 740 >>>> ---------T 1 root root 0 Apr 8 21:06 100119 >>>> ---------T 1 root root 0 Apr 8 21:11 101123 >>>> ---------T 1 root root 0 Apr 8 21:19 102659 >>>> ---------T 1 root root 0 Apr 12 14:46 1040919 >>>> ---------T 1 root root 0 Apr 12 14:58 1041943 >>>> ---------T 1 root root 0 Apr 8 21:32 105219 >>>> ---------T 1 root root 0 Apr 8 21:37 105731 >>>> ---------T 1 root root 0 Apr 12 17:48 1068055 >>>> ---------T 1 root root 0 Apr 12 18:38 1073943 >>>> ---------T 1 root root 0 Apr 8 21:54 108035 >>>> ---------T 1 root root 0 Apr 12 21:49 1091095 >>>> ---------T 1 root root 0 Apr 13 00:17 1111063 >>>> ---------T 1 root root 0 Apr 13 03:51 1121815 >>>> ---------T 1 root root 0 Apr 8 22:25 112387 >>>> ---------T 1 root root 0 Apr 13 06:39 1136151 >>>> ... >>>> [root@* lost+found]# getfattr -m . -d -e hex * >>>> >>>> # file: 96007 >>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>> trusted.gfid=3D0xa0370d8a9f104dafbebbd0e6dd7ce1f7 >>>> >>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726= 5706c69636174652d3600 >>>> >>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D= 0x0000000049dff000 >>>> >>>> # file: 97027 >>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>> trusted.gfid=3D0xc1c1fe2ec7034442a623385f43b04c25 >>>> >>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726= 5706c69636174652d3600 >>>> >>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D= 0x000000006ac78000 >>>> >>>> # file: 97559 >>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>> trusted.gfid=3D0xcf7c17013c914511bda4d1c743fae118 >>>> >>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726= 5706c69636174652d3500 >>>> >>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D= 0x00000000519fb000 >>>> >>>> # file: 98055 >>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>> trusted.gfid=3D0xe86abc6e2c4b44c28d415fbbe34f2102 >>>> >>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726= 5706c69636174652d3600 >>>> >>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D= 0x000000004c098000 >>>> >>>> # file: 98567 >>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>> trusted.gfid=3D0x12543a2efbdf4b9fa61c6d89ca396f80 >>>> >>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726= 5706c69636174652d3500 >>>> >>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D= 0x000000006bc98000 >>>> >>>> # file: 98583 >>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>> trusted.gfid=3D0x760d16d3b7974cfb9c0a665a0982c470 >>>> >>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726= 5706c69636174652d3500 >>>> >>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D= 0x000000006cde9000 >>>> >>>> # file: 99607 >>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>> trusted.gfid=3D0x0849a732ea204bc3b8bae830b46881da >>>> >>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d726= 5706c69636174652d3500 >>>> >>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D= 0x00000000513f1000 >>>> ... >>>> >>>> What do you think about it? Thank you very much. >>>> >>>> >>>> 2013/4/12 =B7=FB=D3=C0=CC=CE >>>> >>>>> Hi Brian, >>>>> >>>>> Your scripts works for me now after I installed all the rpm built out >>>>> from kernel srpm. I'll try it. Thank you. >>>>> >>>>> >>>>> 2013/4/12 Brian Foster >>>>> >>>>>> On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote: >>>>>> > Dear xfs experts, >>>>>> > Can I just call xfs_stack_trace(); in the second line of >>>>>> > xfs_do_force_shutdown() to print stack and rebuild kernel to check >>>>>> > what's the error? >>>>>> > >>>>>> >>>>>> I suppose that's a start. If you're willing/able to create and run a >>>>>> modified kernel for the purpose of collecting more debug info, perha= ps >>>>>> we can get a bit more creative in collecting more data on the proble= m >>>>>> (but a stack trace there is a good start). >>>>>> >>>>>> BTW- you might want to place the call after the >>>>>> XFS_FORCED_SHUTDOWN(mp) >>>>>> check almost halfway into the function to avoid duplicate messages. >>>>>> >>>>>> Brian >>>>>> >>>>>> > >>>>>> > 2013/4/12 =B7=FB=D3=C0=CC=CE > >>>>>> > >>>>>> > Hi Brian, >>>>>> > What else I'm missing? Thank you. >>>>>> > stap -e 'probe module("xfs").function("xfs_iunlink"){}' >>>>>> > >>>>>> > WARNING: cannot find module xfs debuginfo: No DWARF informatio= n >>>>>> found >>>>>> > semantic error: no match while resolving probe point >>>>>> > module("xfs").function("xfs_iunlink") >>>>>> > Pass 2: analysis failed. Try again with another '--vp 01' >>>>>> option. >>>>>> > >>>>>> > >>>>>> > 2013/4/12 =B7=FB=D3=C0=CC=CE >>>>> >> >>>>>> > >>>>>> > ls -l >>>>>> > >>>>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.k= o.debug >>>>>> > -r--r--r-- 1 root root 21393024 Apr 12 12:08 >>>>>> > >>>>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.k= o.debug >>>>>> > >>>>>> > rpm -qa|grep kernel >>>>>> > kernel-headers-2.6.32-279.el6.x86_64 >>>>>> > kernel-devel-2.6.32-279.el6.x86_64 >>>>>> > kernel-2.6.32-358.el6.x86_64 >>>>>> > kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 >>>>>> > abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >>>>>> > kernel-firmware-2.6.32-358.el6.noarch >>>>>> > kernel-debug-2.6.32-358.el6.x86_64 >>>>>> > kernel-debuginfo-2.6.32-279.el6.x86_64 >>>>>> > dracut-kernel-004-283.el6.noarch >>>>>> > libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 >>>>>> > kernel-devel-2.6.32-358.el6.x86_64 >>>>>> > kernel-2.6.32-279.el6.x86_64 >>>>>> > >>>>>> > rpm -q kernel-debuginfo >>>>>> > kernel-debuginfo-2.6.32-279.el6.x86_64 >>>>>> > >>>>>> > rpm -q kernel >>>>>> > kernel-2.6.32-279.el6.x86_64 >>>>>> > kernel-2.6.32-358.el6.x86_64 >>>>>> > >>>>>> > do I need to re probe it? >>>>>> > >>>>>> > >>>>>> > 2013/4/12 Eric Sandeen >>>>> > > >>>>>> > >>>>>> > On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote: >>>>>> > > Hi Brian, >>>>>> > > Sorry but when I execute the script it says: >>>>>> > > WARNING: cannot find module xfs debuginfo: No DWARF >>>>>> > information found >>>>>> > > semantic error: no match while resolving probe point >>>>>> > module("xfs").function("xfs_iunlink") >>>>>> > > >>>>>> > > uname -a >>>>>> > > 2.6.32-279.el6.x86_64 >>>>>> > > kernel debuginfo has been installed. >>>>>> > > >>>>>> > > Where can I find the correct xfs debuginfo? >>>>>> > >>>>>> > it should be in the kernel-debuginfo rpm (of the same >>>>>> > version/release as the kernel rpm you're running) >>>>>> > >>>>>> > You should have: >>>>>> > >>>>>> > >>>>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.k= o.debug >>>>>> > >>>>>> > If not, can you show: >>>>>> > >>>>>> > # uname -a >>>>>> > # rpm -q kernel >>>>>> > # rpm -q kernel-debuginfo >>>>>> > >>>>>> > -Eric >>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>>> > -- >>>>>> > =B7=FB=D3=C0=CC=CE >>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>>> > -- >>>>>> > =B7=FB=D3=C0=CC=CE >>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>>> > -- >>>>>> > =B7=FB=D3=C0=CC=CE >>>>>> > >>>>>> > >>>>>> > _______________________________________________ >>>>>> > xfs mailing list >>>>>> > xfs@oss.sgi.com >>>>>> > http://oss.sgi.com/mailman/listinfo/xfs >>>>>> > >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> =B7=FB=D3=C0=CC=CE >>>>> >>>> >>>> >>>> >>>> -- >>>> =B7=FB=D3=C0=CC=CE >>>> >>> >>> >>> >>> -- >>> =B7=FB=D3=C0=CC=CE >>> >> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --089e0111e07498c28304da6655f4 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
More info about it is: It happened exactly when glusterfs = rebalance complete.


2013/4/15 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com&g= t;
and xfs kernel trace is:Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() re= turned error 22.
Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned erro= r 22
Apr 15 20:43:03 10 kernel: Pid: 3093, comm: glusterfsd Not tainted = 2.6.32-279.el6.x86_64 #1
Apr 15 20:43:03 10 kernel: Call Trace:
Apr 15 20:43:03 10 kernel: [<f= fffffffa02d4212>] ? xfs_inactive+0x442/0x460 [xfs]
Apr 15 20:43:03 10= kernel: [<ffffffffa02e1790>] ? xfs_fs_clear_inode+0xa0/0xd0 [xfs] Apr 15 20:43:03 10 kernel: [<ffffffff81195adc>] ? clear_inode+0xac/0x= 140
Apr 15 20:43:03 10 kernel: [<ffffffff81196296>] ? generic_dele= te_inode+0x196/0x1d0
Apr 15 20:43:03 10 kernel: [<ffffffff81196335>= ;] ? generic_drop_inode+0x65/0x80
Apr 15 20:43:03 10 kernel: [<ffffffff81195182>] ? iput+0x62/0x70
A= pr 15 20:43:03 10 kernel: [<ffffffff81191ce0>] ? dentry_iput+0x90/0x1= 00
Apr 15 20:43:03 10 kernel: [<ffffffff81191e41>] ? d_kill+0x31/0= x60
Apr 15 20:43:03 10 kernel: [<ffffffff8119386c>] ? dput+0x7c/0x150
= Apr 15 20:43:03 10 kernel: [<ffffffff8117c9c9>] ? __fput+0x189/0x210<= br>Apr 15 20:43:03 10 kernel: [<ffffffff8117ca75>] ? fput+0x25/0x30 Apr 15 20:43:03 10 kernel: [<ffffffff8117849d>] ? filp_close+0x5d/0x9= 0
Apr 15 20:43:03 10 kernel: [<ffffffff81178575>] ? sys_close+0xa5= /0x100
Apr 15 20:43:03 10 kernel: [<ffffffff8100b308>] ? tracesys+= 0xd9/0xde
Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called fro= m line 1186 of file fs/xfs/xfs_vnodeops.c.  Return address =3D 0xfffff= fffa02d422b
Apr 15 20:43:03 10 kernel: XFS (sdb): I/O Error Detected. Sh= utting down filesystem
Apr 15 20:43:03 10 kernel: XFS (sdb): Please umount the filesystem and rect= ify the problem(s)
Apr 15 20:43:13 10 kernel: XFS (sdb): xfs_log_force: = error 5 returned.


2013/4/15 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Dear Brian and xfs experts,
Brain your = scripts works and I am able to reproduce it with glusterfs rebalance on our= test cluster. 2 of our server xfs shutdown during glusterfs rebalance, the= shutdown userspace stacktrace both related to pthread. See logs bellow, Wh= at's your opinion? Thank you very much!
logs:
[root@= 10.23.72.93 ~]# cat xfs.log

--- xfs_imap -- module("xfs&qu= ot;).function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- retu= rn=3D0x16
vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff imap= =3D0xffff88100e2f7c08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_per_clu= ster=3D? chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbn= o=3D? __func__=3D[...]
mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20
mp->m_sb: sb_agcount =3D= 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c= , sb_dblocks =3D 0x1b4900000
imap: im_blkno =3D 0x0, im_len =3D 0xa078, = im_boffset =3D 0x86ea
kernel backtrace:
Returning from:  0xffffffffa02b3ab0 : xfs_imap+0x= 0/0x280 [xfs]
Returning to  :  0xffffffffa02b9599 : xfs_inotob= p+0x49/0xc0 [xfs]
 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x3= 20 [xfs]
 0xffffffff81501a69
 0x0 (inexact)
user backtrace:
 0x3bd1a0e5ad [/lib64/libpthread-2.12.so+0x= e5ad/0x219000]

--- xfs_iunlink_remove -- module("xfs").fun= ction("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return -- ret= urn=3D0x16
vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_a= gino=3D? last_ibp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset= =3D? last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0x113, i_flags =3D 0x0
ip->i_d: di_nlink =3D 0x0, di_ge= n =3D 0x0
[root@10= .23.72.93 ~]#
[root@10.23.72.94 ~]# cat xfs.log

--- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_= ialloc.c:1257").return -- return=3D0x16
vars: mp=3D0xffff881017c6c8= 00 tp=3D0xffff8801037acea0 ino=3D0xffffffff imap=3D0xffff882017101c08 flags= =3D0x0 agbno=3D? agino=3D? agno=3D? blks_per_cluster=3D? chunk_agbno=3D? cl= uster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? __func__=3D[...]
mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20
mp->m_sb: sb_agcount =3D= 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c= , sb_dblocks =3D 0x1b4900000
imap: im_blkno =3D 0x0, im_len =3D 0xd98, i= m_boffset =3D 0x547
kernel backtrace:
Returning from:  0xffffffffa02b3ab0 : xfs_imap+0x= 0/0x280 [xfs]
Returning to  :  0xffffffffa02b9599 : xfs_inotob= p+0x49/0xc0 [xfs]
 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x3= 20 [xfs]
 0xffffffff81501a69
 0x0 (inexact)
user backtrace:
 0x30cd40e5ad [/lib64/libpthread-2.12.so+0x= e5ad/0x219000]

--- xfs_iunlink_remove -- module("xfs").fun= ction("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return -- ret= urn=3D0x16
vars: tp=3D0xffff8801037acea0 ip=3D0xffff880e697c8800 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880d846c2d60 ibp=3D? agno=3D? agino=3D? next_a= gino=3D? last_ibp=3D? last_dip=3D0xffff881017c6c800 bucket_index=3D? offset= =3D? last_offset=3D0xffffffffffff880e error=3D? __func__=3D[...]
ip: i_ino =3D 0x142, i_flags =3D 0x0
ip->i_d: di_nlink =3D 0x0, di_ge= n =3D 0x3565732e



=
2013/4/15 =B7=FB=D3=C0=CC=CE &= lt;yongtaofu@gmail= .com>
Also glusterfs use a l= ot of hardlink for self-heal:
--------T 2 root root 0 Apr 15 11:58 /mnt/= xfsd/testbug/998416323
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999296624
------= ---T 2 root root 0 Apr 15 12:24 /mnt/xfsd/testbug/999568484
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999956875
------= ---T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/2f/052f4e3e= -c379-4a3c-b995-a10fdaca33d0
---------T 2 root root 0 Apr 15 11:58 /mnt/= xfsd/testbug/.glusterfs/05/95/0595272e-ce2b-45d5-8693-d02c00b94d9d
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/ca/05= ca00a0-92a7-44cf-b6e3-380496aafaa4
---------T 2 root root 0 Apr 15 12:24= /mnt/xfsd/testbug/.glusterfs/0a/23/0a238ca7-3cef-4540-9c98-6bf631551b21 ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/0a/4b/0a= 4b640b-f675-4708-bb59-e2369ffbbb9d
Does it related?


2013/4/15 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Dear xfs experts,=
Now I'm deploying Brian's system script in out cluster. B= ut from last night till now 5 servers in our 24 servers xfs shutdown with t= he same error. I run xfs_repair command and found all the lost inodes are g= lusterfs dht link files. This explains why the xfs shutdown tend to happen = during glusterfs rebalance. During glusterfs rebalance procedure a lot of d= hk link files may be unlinked. For example the following inodes are found i= n lost+found in one of the servers:
[root@* lost+found]# pwd
/mnt/xfsd/lost+found
[root@* lost+found]# ls= -l
total 740
---------T 1 root root 0 Apr  8 21:06 100119
--= -------T 1 root root 0 Apr  8 21:11 101123
---------T 1 root root 0= Apr  8 21:19 102659
---------T 1 root root 0 Apr 12 14:46 1040919
---------T 1 root root 0 A= pr 12 14:58 1041943
---------T 1 root root 0 Apr  8 21:32 105219---------T 1 root root 0 Apr  8 21:37 105731
---------T 1 root roo= t 0 Apr 12 17:48 1068055
---------T 1 root root 0 Apr 12 18:38 1073943
---------T 1 root root 0 A= pr  8 21:54 108035
---------T 1 root root 0 Apr 12 21:49 1091095---------T 1 root root 0 Apr 13 00:17 1111063
---------T 1 root root 0 = Apr 13 03:51 1121815
---------T 1 root root 0 Apr  8 22:25 112387
---------T 1 root root= 0 Apr 13 06:39 1136151
...
[root@* lost+found]# getfattr -m . -d -e = hex *

# file: 96007
trusted.afr.mams-cq-mt-video-client-3=3D0x000= 000000000000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000
trust= ed.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000
trusted.gf= id=3D0xa0370d8a9f104dafbebbd0e6dd7ce1f7
trusted.glusterfs.dht.linkto=3D0= x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 0000049dff000

# file: 97027
trusted.afr.mams-cq-mt-video-client-3= =3D0x000000000000000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x= 000000000000000000000000
trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000
trust= ed.gfid=3D0xc1c1fe2ec7034442a623385f43b04c25
trusted.glusterfs.dht.linkt= o=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
trusted= .glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000000006a= c78000

# file: 97559
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0xcf7c17013c914511bda4d1c743fae118
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 000519fb000

# file: 98055
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0xe86abc6e2c4b44c28d415fbbe34f2102
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0004c098000

# file: 98567
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x12543a2efbdf4b9fa61c6d89ca396f80
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0006bc98000

# file: 98583
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x760d16d3b7974cfb9c0a665a0982c470
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0006cde9000

# file: 99607
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x0849a732ea204bc3b8bae830b46881da
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 000513f1000
...

What do you think about it? Thank you very much.
=


201= 3/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brian,

Your scripts works for me now after I installed all the rpm built out from= kernel srpm. I'll try it. Thank you.


2013/4/12 Brian Foster <bfoster@redhat.com>
On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote:
> Dear xfs experts,
> Can I just call xfs_stack_trace(); in the second line of
> xfs_do_force_shutdown() to print stack and rebuild kernel to check
> what's the error?
>

I suppose that's a start. If you're willing/able to create an= d run a
modified kernel for the purpose of collecting more debug info, perhaps
we can get a bit more creative in collecting more data on the problem
(but a stack trace there is a good start).

BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp)
check almost halfway into the function to avoid duplicate messages.

Brian

>
> 2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     Hi Brian,
>     What else I'm missing? Thank you.
>     stap -e 'probe module("xfs").function(&quo= t;xfs_iunlink"){}'
>
>     WARNING: cannot find module xfs debuginfo: No DWARF info= rmation found
>     semantic error: no match while resolving probe point
>     module("xfs").function("xfs_iunlink"= )
>     Pass 2: analysis failed.  Try again with another &#= 39;--vp 01' option.
>
>
>     2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:= yongtaofu@gmail.co= m>>
>
>         ls -l
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>         -r--r--r-- 1 root root 21393024 Apr 12 12:= 08
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>
>         rpm -qa|grep  kernel
>         kernel-headers-2.6.32-279.el6.x86_64
>         kernel-devel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>         kernel-debuginfo-common-x86_64-2.6.32-279.= el6.x86_64
>         abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >         kernel-firmware-2.6.32-358.el6.noarch
>         kernel-debug-2.6.32-358.el6.x86_64
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>         dracut-kernel-004-283.el6.noarch
>         libreport-plugin-kerneloops-2.0.9-5.el6.x8= 6_64
>         kernel-devel-2.6.32-358.el6.x86_64
>         kernel-2.6.32-279.el6.x86_64
>
>         rpm -q kernel-debuginfo
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>
>         rpm -q kernel
>         kernel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>
>         do I need to re probe it?
>
>
>         2013/4/12 Eric Sandeen <sandeen@sandeen.net
>         <mailto:sandeen@sandeen.net>>
>
>             On 4/11/13 11:32 PM, =B7=FB= =D3=C0=CC=CE wrote:
>             > Hi Brian,
>             > Sorry but when I execut= e the script it says:
>             > WARNING: cannot find mo= dule xfs debuginfo: No DWARF
>             information found
>             > semantic error: no matc= h while resolving probe point
>             module("xfs").func= tion("xfs_iunlink")
>             >
>             > uname -a
>             > 2.6.32-279.el6.x86_64 >             > kernel debuginfo has be= en installed.
>             >
>             > Where can I find the co= rrect xfs debuginfo?
>
>             it should be in the kernel-d= ebuginfo rpm (of the same
>             version/release as the kerne= l rpm you're running)
>
>             You should have:
>
>             /usr/lib/debug/lib/modules/2= .6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug
>
>             If not, can you show:
>
>             # uname -a
>             # rpm -q kernel
>             # rpm -q kernel-debuginfo >
>             -Eric
>
>
>
>
>
>         --
>         =B7=FB=D3=C0=CC=CE
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE
>
>
> _______________________________________________<= br> > xfs mailing list
> xfs@oss.sgi.com
>
= http://oss.sgi.com/mailman/listinfo/xfs
>




= --
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE --089e0111e07498c28304da6655f4-- From tinguely@sgi.com Mon Apr 15 08:45:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BF2507F50 for ; Mon, 15 Apr 2013 08:45:12 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8566430404E; Mon, 15 Apr 2013 06:45:12 -0700 (PDT) Message-ID: <516C046C.8080908@sgi.com> Date: Mon, 15 Apr 2013 08:45:16 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Yann Dupont CC: xfs@oss.sgi.com Subject: Re: kernels 3.4 slower due to allocation workqueue References: <516BCACE.1040900@univ-nantes.fr> In-Reply-To: <516BCACE.1040900@univ-nantes.fr> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/15/13 04:39, Yann Dupont wrote: > Hello, > last week we received new machines (DELL R720xd) for an extension of our > ceph cluster. > (64 Gb ram, 2x Xeon E5-2650, PERC H710P (really LSI MEGARAID), and 12x3 > TB disks + 2SSD (not used as cachecade)) > > I was doing test on the raid card with kernel 3.4.38 to try to find what > I can get of this beast with RAID5, when I noticed an unusual slow > values on compilebench. The difference is very visible on the initial > create tests (can detail more if needed). > > I finally observed that ONLY 3.4 kernels exhibit that behaviour ; > 3.3.xxx and before are OK, 3.5.xxx and later are back to good values. > > I bisected the problem to this commit > > c999a223c2f0d31c64ef7379814cea1378b2b800 is the first bad commit > commit c999a223c2f0d31c64ef7379814cea1378b2b800 > Author: Dave Chinner > Date: Thu Mar 22 05:15:07 2012 +0000 > > xfs: introduce an allocation workqueue > > I understand this regression is not a bug, and probably just a corner > case of the new code, that was certainly corrected after during 3.5 > development (didn't tried to bisect this one, maybe dave know what is > the corrective patch ?) > > The problem is that 3.4 is the last long-term kernel for the moment, and > it's unfortunate it shows this regression. > > Maybe a backport of the fix (if this backport is possible AND not very > intrusive) could be a good idea ? > > Cheers, > Here are the allocation worker changes. The biggest performance commit should be aa292847, which limits the callers to the worker. commit 3b876c8f2a361ceeed3fed894980c69066f903a0 Author: Jeff Liu Date: Thu Jun 7 15:44:32 2012 +0800 xfs: fix debug_object WARN at xfs_alloc_vextent() commit aa292847b9fc6e187547110de833a7d3131bbddf Author: Dave Chinner Date: Thu Jul 12 07:40:43 2012 +1000 xfs: don't defer metadata allocation to the workqueue commit 2455881c0b52f87be539c4c7deab1afff4d8a560 Author: Dave Chinner Date: Fri Oct 5 11:06:58 2012 +1000 xfs: introduce XFS_BMAPI_STACK_SWITCH commit e04426b9202bccd4cfcbc70b2fa2aeca1c86d8f5 Author: Dave Chinner Date: Fri Oct 5 11:06:59 2012 +1000 xfs: move allocation stack switch up to xfs_bmapi_allocate commit 9e96fe6df44425b69ed89f6ac20352cec1f127d7 Author: Brian Foster Date: Thu Jan 17 13:11:29 2013 -0500 xfs: pull up stack_switch check into xfs_bmapi_write The last 3 patches address an AGF buffer hang with the allocation worker. --Mark. From yongtaofu@gmail.com Mon Apr 15 08:45:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 020097F50 for ; Mon, 15 Apr 2013 08:45:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DD1C6304043 for ; Mon, 15 Apr 2013 06:45:49 -0700 (PDT) X-ASG-Debug-ID: 1366033546-04cb6c2c1d208a00001-NocioJ Received: from mail-ie0-f174.google.com (mail-ie0-f174.google.com [209.85.223.174]) by cuda.sgi.com with ESMTP id LT53w8bOR3CUTl3T (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 15 Apr 2013 06:45:47 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] Received: by mail-ie0-f174.google.com with SMTP id 10so992053ied.5 for ; Mon, 15 Apr 2013 06:45:46 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=gZ7eVT62OB9J44o4A1zGsbLQEg0ESQwKclMxVIppT+Q=; b=g3p4wQHa9bsHUvrhJQKmsMZFaJoDiIANjI89MM/uLBzSiLELAlagZuYgqnUupWtreY O3AiVkCxSeVPvtdVLG3lSZAbOTHSAQYZJgJ3XmA0qYHZ5YPSerCejfzmnkDDeM28YNAY daQj5FKUQUfAU5FAJCeI6x3Q5tnSA88VaXfQN5+DgKGfhrzAmvpQ9X8ZrtxYV6qfV3BE YPN+oxur7CpWLVOwJFu3SQ8J/Cn0h+6EgJfjMKxud7C5bRWNxd1S4+kxLQZSv00wzPve jclXA+kstE0XBABacxEdtjL+Ts8p1J1foq6sbg7Ef4sAdGnZd3UvmNSxJc4ywTB1X0sZ nTag== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr5261290igq.51.1366033546782; Mon, 15 Apr 2013 06:45:46 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Mon, 15 Apr 2013 06:45:46 -0700 (PDT) In-Reply-To: References: <20130409145238.GE22182@sgi.com> <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> <516800F7.80502@redhat.com> Date: Mon, 15 Apr 2013 21:45:46 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Brian Foster Cc: Eric Sandeen , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee74eaced04da6678b7 X-Barracuda-Connect: mail-ie0-f174.google.com[209.85.223.174] X-Barracuda-Start-Time: 1366033547 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128195 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 --14dae9340ee74eaced04da6678b7 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable And at the same time we got the following error log of glusterfs: [2013-04-15 20:43:03.851163] I [dht-rebalance.c:1611:gf_defrag_status_get] 0-glusterfs: Rebalance is completed [2013-04-15 20:43:03.851248] I [dht-rebalance.c:1614:gf_defrag_status_get] 0-glusterfs: Files migrated: 1629, size: 1582329065954, lookups: 11036, failures: 561 [2013-04-15 20:43:03.887634] W [glusterfsd.c:831:cleanup_and_exit] (-->/lib64/libc.so.6(clone+0x6d) [0x3bd16e767d] (-->/lib64/libpthread.so.0() [0x3bd1a07851] (-->/usr/sbin/glusterfs(glusterfs_sigwaiter+0xdd) [0x405c9d]))) 0-: received signum (15), shutting down [2013-04-15 20:43:03.887878] E [rpcsvc.c:1155:rpcsvc_program_unregister_portmap] 0-rpc-service: Could not unregister with portmap 2013/4/15 =B7=FB=D3=C0=CC=CE > More info about it is: It happened exactly when glusterfs rebalance > complete. > > > 2013/4/15 =B7=FB=D3=C0=CC=CE > >> and xfs kernel trace is: >> Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() >> returned error 22. >> Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned >> error 22 >> Apr 15 20:43:03 10 kernel: Pid: 3093, comm: glusterfsd Not tainted >> 2.6.32-279.el6.x86_64 #1 >> Apr 15 20:43:03 10 kernel: Call Trace: >> Apr 15 20:43:03 10 kernel: [] ? >> xfs_inactive+0x442/0x460 [xfs] >> Apr 15 20:43:03 10 kernel: [] ? >> xfs_fs_clear_inode+0xa0/0xd0 [xfs] >> Apr 15 20:43:03 10 kernel: [] ? clear_inode+0xac/0x140 >> Apr 15 20:43:03 10 kernel: [] ? >> generic_delete_inode+0x196/0x1d0 >> Apr 15 20:43:03 10 kernel: [] ? >> generic_drop_inode+0x65/0x80 >> Apr 15 20:43:03 10 kernel: [] ? iput+0x62/0x70 >> Apr 15 20:43:03 10 kernel: [] ? dentry_iput+0x90/0x100 >> Apr 15 20:43:03 10 kernel: [] ? d_kill+0x31/0x60 >> Apr 15 20:43:03 10 kernel: [] ? dput+0x7c/0x150 >> Apr 15 20:43:03 10 kernel: [] ? __fput+0x189/0x210 >> Apr 15 20:43:03 10 kernel: [] ? fput+0x25/0x30 >> Apr 15 20:43:03 10 kernel: [] ? filp_close+0x5d/0x90 >> Apr 15 20:43:03 10 kernel: [] ? sys_close+0xa5/0x100 >> Apr 15 20:43:03 10 kernel: [] ? tracesys+0xd9/0xde >> Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called >> from line 1186 of file fs/xfs/xfs_vnodeops.c. Return address =3D >> 0xffffffffa02d422b >> Apr 15 20:43:03 10 kernel: XFS (sdb): I/O Error Detected. Shutting down >> filesystem >> Apr 15 20:43:03 10 kernel: XFS (sdb): Please umount the filesystem and >> rectify the problem(s) >> Apr 15 20:43:13 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. >> >> >> 2013/4/15 =B7=FB=D3=C0=CC=CE >> >>> Dear Brian and xfs experts, >>> Brain your scripts works and I am able to reproduce it with glusterfs >>> rebalance on our test cluster. 2 of our server xfs shutdown during >>> glusterfs rebalance, the shutdown userspace stacktrace both related to >>> pthread. See logs bellow, What's your opinion? Thank you very much! >>> logs: >>> [root@10.23.72.93 ~]# cat xfs.log >>> >>> --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:12= 57").return >>> -- return=3D0x16 >>> vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff >>> imap=3D0xffff88100e2f7c08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks= _per_cluster=3D? >>> chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbno=3D?= __func__=3D[...] >>> mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 >>> mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog = =3D 0x4, >>> sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 >>> imap: im_blkno =3D 0x0, im_len =3D 0xa078, im_boffset =3D 0x86ea >>> kernel backtrace: >>> Returning from: 0xffffffffa02b3ab0 : xfs_imap+0x0/0x280 [xfs] >>> Returning to : 0xffffffffa02b9599 : xfs_inotobp+0x49/0xc0 [xfs] >>> 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x320 [xfs] >>> 0xffffffff81501a69 >>> 0x0 (inexact) >>> user backtrace: >>> 0x3bd1a0e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000] >>> >>> --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs= /xfs/xfs_inode.c:1680").return >>> -- return=3D0x16 >>> vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp= =3D? agi=3D? >>> dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agin= o=3D? last_ibp=3D? >>> last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? >>> last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] >>> ip: i_ino =3D 0x113, i_flags =3D 0x0 >>> ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x0 >>> [root@10.23.72.93 ~]# >>> [root@10.23.72.94 ~]# cat xfs.log >>> >>> --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:12= 57").return >>> -- return=3D0x16 >>> vars: mp=3D0xffff881017c6c800 tp=3D0xffff8801037acea0 ino=3D0xffffffff >>> imap=3D0xffff882017101c08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks= _per_cluster=3D? >>> chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbno=3D?= __func__=3D[...] >>> mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 >>> mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog = =3D 0x4, >>> sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 >>> imap: im_blkno =3D 0x0, im_len =3D 0xd98, im_boffset =3D 0x547 >>> kernel backtrace: >>> Returning from: 0xffffffffa02b3ab0 : xfs_imap+0x0/0x280 [xfs] >>> Returning to : 0xffffffffa02b9599 : xfs_inotobp+0x49/0xc0 [xfs] >>> 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x320 [xfs] >>> 0xffffffff81501a69 >>> 0x0 (inexact) >>> user backtrace: >>> 0x30cd40e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000] >>> >>> --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs= /xfs/xfs_inode.c:1680").return >>> -- return=3D0x16 >>> vars: tp=3D0xffff8801037acea0 ip=3D0xffff880e697c8800 next_ino=3D? mp= =3D? agi=3D? >>> dip=3D? agibp=3D0xffff880d846c2d60 ibp=3D? agno=3D? agino=3D? next_agin= o=3D? last_ibp=3D? >>> last_dip=3D0xffff881017c6c800 bucket_index=3D? offset=3D? >>> last_offset=3D0xffffffffffff880e error=3D? __func__=3D[...] >>> ip: i_ino =3D 0x142, i_flags =3D 0x0 >>> ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x3565732e >>> >>> >>> >>> 2013/4/15 =B7=FB=D3=C0=CC=CE >>> >>>> Also glusterfs use a lot of hardlink for self-heal: >>>> --------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/998416323 >>>> ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999296624 >>>> ---------T 2 root root 0 Apr 15 12:24 /mnt/xfsd/testbug/999568484 >>>> ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999956875 >>>> ---------T 2 root root 0 Apr 15 11:58 >>>> /mnt/xfsd/testbug/.glusterfs/05/2f/052f4e3e-c379-4a3c-b995-a10fdaca33d= 0 >>>> ---------T 2 root root 0 Apr 15 11:58 >>>> /mnt/xfsd/testbug/.glusterfs/05/95/0595272e-ce2b-45d5-8693-d02c00b94d9= d >>>> ---------T 2 root root 0 Apr 15 11:58 >>>> /mnt/xfsd/testbug/.glusterfs/05/ca/05ca00a0-92a7-44cf-b6e3-380496aafaa= 4 >>>> ---------T 2 root root 0 Apr 15 12:24 >>>> /mnt/xfsd/testbug/.glusterfs/0a/23/0a238ca7-3cef-4540-9c98-6bf631551b2= 1 >>>> ---------T 2 root root 0 Apr 15 11:58 >>>> /mnt/xfsd/testbug/.glusterfs/0a/4b/0a4b640b-f675-4708-bb59-e2369ffbbb9= d >>>> Does it related? >>>> >>>> >>>> 2013/4/15 =B7=FB=D3=C0=CC=CE >>>> >>>>> Dear xfs experts, >>>>> Now I'm deploying Brian's system script in out cluster. But from last >>>>> night till now 5 servers in our 24 servers xfs shutdown with the same >>>>> error. I run xfs_repair command and found all the lost inodes are glu= sterfs >>>>> dht link files. This explains why the xfs shutdown tend to happen dur= ing >>>>> glusterfs rebalance. During glusterfs rebalance procedure a lot of dh= k link >>>>> files may be unlinked. For example the following inodes are found in >>>>> lost+found in one of the servers: >>>>> [root@* lost+found]# pwd >>>>> /mnt/xfsd/lost+found >>>>> [root@* lost+found]# ls -l >>>>> total 740 >>>>> ---------T 1 root root 0 Apr 8 21:06 100119 >>>>> ---------T 1 root root 0 Apr 8 21:11 101123 >>>>> ---------T 1 root root 0 Apr 8 21:19 102659 >>>>> ---------T 1 root root 0 Apr 12 14:46 1040919 >>>>> ---------T 1 root root 0 Apr 12 14:58 1041943 >>>>> ---------T 1 root root 0 Apr 8 21:32 105219 >>>>> ---------T 1 root root 0 Apr 8 21:37 105731 >>>>> ---------T 1 root root 0 Apr 12 17:48 1068055 >>>>> ---------T 1 root root 0 Apr 12 18:38 1073943 >>>>> ---------T 1 root root 0 Apr 8 21:54 108035 >>>>> ---------T 1 root root 0 Apr 12 21:49 1091095 >>>>> ---------T 1 root root 0 Apr 13 00:17 1111063 >>>>> ---------T 1 root root 0 Apr 13 03:51 1121815 >>>>> ---------T 1 root root 0 Apr 8 22:25 112387 >>>>> ---------T 1 root root 0 Apr 13 06:39 1136151 >>>>> ... >>>>> [root@* lost+found]# getfattr -m . -d -e hex * >>>>> >>>>> # file: 96007 >>>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>>> trusted.gfid=3D0xa0370d8a9f104dafbebbd0e6dd7ce1f7 >>>>> >>>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72= 65706c69636174652d3600 >>>>> >>>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri= =3D0x0000000049dff000 >>>>> >>>>> # file: 97027 >>>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>>> trusted.gfid=3D0xc1c1fe2ec7034442a623385f43b04c25 >>>>> >>>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72= 65706c69636174652d3600 >>>>> >>>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri= =3D0x000000006ac78000 >>>>> >>>>> # file: 97559 >>>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>>> trusted.gfid=3D0xcf7c17013c914511bda4d1c743fae118 >>>>> >>>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72= 65706c69636174652d3500 >>>>> >>>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri= =3D0x00000000519fb000 >>>>> >>>>> # file: 98055 >>>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>>> trusted.gfid=3D0xe86abc6e2c4b44c28d415fbbe34f2102 >>>>> >>>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72= 65706c69636174652d3600 >>>>> >>>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri= =3D0x000000004c098000 >>>>> >>>>> # file: 98567 >>>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>>> trusted.gfid=3D0x12543a2efbdf4b9fa61c6d89ca396f80 >>>>> >>>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72= 65706c69636174652d3500 >>>>> >>>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri= =3D0x000000006bc98000 >>>>> >>>>> # file: 98583 >>>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>>> trusted.gfid=3D0x760d16d3b7974cfb9c0a665a0982c470 >>>>> >>>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72= 65706c69636174652d3500 >>>>> >>>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri= =3D0x000000006cde9000 >>>>> >>>>> # file: 99607 >>>>> trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000 >>>>> trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000 >>>>> trusted.gfid=3D0x0849a732ea204bc3b8bae830b46881da >>>>> >>>>> trusted.glusterfs.dht.linkto=3D0x6d616d732d63712d6d742d766964656f2d72= 65706c69636174652d3500 >>>>> >>>>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri= =3D0x00000000513f1000 >>>>> ... >>>>> >>>>> What do you think about it? Thank you very much. >>>>> >>>>> >>>>> 2013/4/12 =B7=FB=D3=C0=CC=CE >>>>> >>>>>> Hi Brian, >>>>>> >>>>>> Your scripts works for me now after I installed all the rpm built ou= t >>>>>> from kernel srpm. I'll try it. Thank you. >>>>>> >>>>>> >>>>>> 2013/4/12 Brian Foster >>>>>> >>>>>>> On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote: >>>>>>> > Dear xfs experts, >>>>>>> > Can I just call xfs_stack_trace(); in the second line of >>>>>>> > xfs_do_force_shutdown() to print stack and rebuild kernel to chec= k >>>>>>> > what's the error? >>>>>>> > >>>>>>> >>>>>>> I suppose that's a start. If you're willing/able to create and run = a >>>>>>> modified kernel for the purpose of collecting more debug info, >>>>>>> perhaps >>>>>>> we can get a bit more creative in collecting more data on the probl= em >>>>>>> (but a stack trace there is a good start). >>>>>>> >>>>>>> BTW- you might want to place the call after the >>>>>>> XFS_FORCED_SHUTDOWN(mp) >>>>>>> check almost halfway into the function to avoid duplicate messages. >>>>>>> >>>>>>> Brian >>>>>>> >>>>>>> > >>>>>>> > 2013/4/12 =B7=FB=D3=C0=CC=CE > >>>>>>> > >>>>>>> > Hi Brian, >>>>>>> > What else I'm missing? Thank you. >>>>>>> > stap -e 'probe module("xfs").function("xfs_iunlink"){}' >>>>>>> > >>>>>>> > WARNING: cannot find module xfs debuginfo: No DWARF >>>>>>> information found >>>>>>> > semantic error: no match while resolving probe point >>>>>>> > module("xfs").function("xfs_iunlink") >>>>>>> > Pass 2: analysis failed. Try again with another '--vp 01' >>>>>>> option. >>>>>>> > >>>>>>> > >>>>>>> > 2013/4/12 =B7=FB=D3=C0=CC=CE >>>>>> >> >>>>>>> > >>>>>>> > ls -l >>>>>>> > >>>>>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.= ko.debug >>>>>>> > -r--r--r-- 1 root root 21393024 Apr 12 12:08 >>>>>>> > >>>>>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.= ko.debug >>>>>>> > >>>>>>> > rpm -qa|grep kernel >>>>>>> > kernel-headers-2.6.32-279.el6.x86_64 >>>>>>> > kernel-devel-2.6.32-279.el6.x86_64 >>>>>>> > kernel-2.6.32-358.el6.x86_64 >>>>>>> > kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 >>>>>>> > abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >>>>>>> > kernel-firmware-2.6.32-358.el6.noarch >>>>>>> > kernel-debug-2.6.32-358.el6.x86_64 >>>>>>> > kernel-debuginfo-2.6.32-279.el6.x86_64 >>>>>>> > dracut-kernel-004-283.el6.noarch >>>>>>> > libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 >>>>>>> > kernel-devel-2.6.32-358.el6.x86_64 >>>>>>> > kernel-2.6.32-279.el6.x86_64 >>>>>>> > >>>>>>> > rpm -q kernel-debuginfo >>>>>>> > kernel-debuginfo-2.6.32-279.el6.x86_64 >>>>>>> > >>>>>>> > rpm -q kernel >>>>>>> > kernel-2.6.32-279.el6.x86_64 >>>>>>> > kernel-2.6.32-358.el6.x86_64 >>>>>>> > >>>>>>> > do I need to re probe it? >>>>>>> > >>>>>>> > >>>>>>> > 2013/4/12 Eric Sandeen >>>>>> > > >>>>>>> > >>>>>>> > On 4/11/13 11:32 PM, =B7=FB=D3=C0=CC=CE wrote: >>>>>>> > > Hi Brian, >>>>>>> > > Sorry but when I execute the script it says: >>>>>>> > > WARNING: cannot find module xfs debuginfo: No DWARF >>>>>>> > information found >>>>>>> > > semantic error: no match while resolving probe poin= t >>>>>>> > module("xfs").function("xfs_iunlink") >>>>>>> > > >>>>>>> > > uname -a >>>>>>> > > 2.6.32-279.el6.x86_64 >>>>>>> > > kernel debuginfo has been installed. >>>>>>> > > >>>>>>> > > Where can I find the correct xfs debuginfo? >>>>>>> > >>>>>>> > it should be in the kernel-debuginfo rpm (of the same >>>>>>> > version/release as the kernel rpm you're running) >>>>>>> > >>>>>>> > You should have: >>>>>>> > >>>>>>> > >>>>>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.= ko.debug >>>>>>> > >>>>>>> > If not, can you show: >>>>>>> > >>>>>>> > # uname -a >>>>>>> > # rpm -q kernel >>>>>>> > # rpm -q kernel-debuginfo >>>>>>> > >>>>>>> > -Eric >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > -- >>>>>>> > =B7=FB=D3=C0=CC=CE >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > -- >>>>>>> > =B7=FB=D3=C0=CC=CE >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > -- >>>>>>> > =B7=FB=D3=C0=CC=CE >>>>>>> > >>>>>>> > >>>>>>> > _______________________________________________ >>>>>>> > xfs mailing list >>>>>>> > xfs@oss.sgi.com >>>>>>> > http://oss.sgi.com/mailman/listinfo/xfs >>>>>>> > >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> =B7=FB=D3=C0=CC=CE >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> =B7=FB=D3=C0=CC=CE >>>>> >>>> >>>> >>>> >>>> -- >>>> =B7=FB=D3=C0=CC=CE >>>> >>> >>> >>> >>> -- >>> =B7=FB=D3=C0=CC=CE >>> >> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee74eaced04da6678b7 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
And at the same time we got the following error log of glu= sterfs:
[2013-04-15 20:43:03.851163] I [dht-rebalance.c:1611:gf_defrag_s= tatus_get] 0-glusterfs: Rebalance is completed
[2013-04-15 20:43:03.8512= 48] I [dht-rebalance.c:1614:gf_defrag_status_get] 0-glusterfs: Files migrat= ed: 1629, size: 1582329065954, lookups: 11036, failures: 561
[2013-04-15 20:43:03.887634] W [glusterfsd.c:831:cleanup_and_exit] (-->/= lib64/libc.so.6(clone+0x6d) [0x3bd16e767d] (-->/lib64/libpthread.so.0() = [0x3bd1a07851] (-->/usr/sbin/glusterfs(glusterfs_sigwaiter+0xdd) [0x405c= 9d]))) 0-: received signum (15), shutting down
[2013-04-15 20:43:03.887878] E [rpcsvc.c:1155:rpcsvc_program_unregister_por= tmap] 0-rpc-service: Could not unregister with portmap


2013/4/15 =B7=FB=D3=C0= =CC=CE <yongtaofu@gmail.com>
More info about it is: It h= appened exactly when glusterfs rebalance complete.


2013/4/15 =B7=FB= =D3=C0=CC=CE <yongtaofu@gmail.com>
and xfs kernel trace is:Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() re= turned error 22.
Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned erro= r 22
Apr 15 20:43:03 10 kernel: Pid: 3093, comm: glusterfsd Not tainted = 2.6.32-279.el6.x86_64 #1
Apr 15 20:43:03 10 kernel: Call Trace:
Apr 15 20:43:03 10 kernel: [<f= fffffffa02d4212>] ? xfs_inactive+0x442/0x460 [xfs]
Apr 15 20:43:03 10= kernel: [<ffffffffa02e1790>] ? xfs_fs_clear_inode+0xa0/0xd0 [xfs] Apr 15 20:43:03 10 kernel: [<ffffffff81195adc>] ? clear_inode+0xac/0x= 140
Apr 15 20:43:03 10 kernel: [<ffffffff81196296>] ? generic_dele= te_inode+0x196/0x1d0
Apr 15 20:43:03 10 kernel: [<ffffffff81196335>= ;] ? generic_drop_inode+0x65/0x80
Apr 15 20:43:03 10 kernel: [<ffffffff81195182>] ? iput+0x62/0x70
A= pr 15 20:43:03 10 kernel: [<ffffffff81191ce0>] ? dentry_iput+0x90/0x1= 00
Apr 15 20:43:03 10 kernel: [<ffffffff81191e41>] ? d_kill+0x31/0= x60
Apr 15 20:43:03 10 kernel: [<ffffffff8119386c>] ? dput+0x7c/0x150
= Apr 15 20:43:03 10 kernel: [<ffffffff8117c9c9>] ? __fput+0x189/0x210<= br>Apr 15 20:43:03 10 kernel: [<ffffffff8117ca75>] ? fput+0x25/0x30 Apr 15 20:43:03 10 kernel: [<ffffffff8117849d>] ? filp_close+0x5d/0x9= 0
Apr 15 20:43:03 10 kernel: [<ffffffff81178575>] ? sys_close+0xa5= /0x100
Apr 15 20:43:03 10 kernel: [<ffffffff8100b308>] ? tracesys+= 0xd9/0xde
Apr 15 20:43:03 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called fro= m line 1186 of file fs/xfs/xfs_vnodeops.c.  Return address =3D 0xfffff= fffa02d422b
Apr 15 20:43:03 10 kernel: XFS (sdb): I/O Error Detected. Sh= utting down filesystem
Apr 15 20:43:03 10 kernel: XFS (sdb): Please umount the filesystem and rect= ify the problem(s)
Apr 15 20:43:13 10 kernel: XFS (sdb): xfs_log_force: = error 5 returned.


2013/4/15 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Dear Brian and xfs experts,
Brain your = scripts works and I am able to reproduce it with glusterfs rebalance on our= test cluster. 2 of our server xfs shutdown during glusterfs rebalance, the= shutdown userspace stacktrace both related to pthread. See logs bellow, Wh= at's your opinion? Thank you very much!
logs:
[root@= 10.23.72.93 ~]# cat xfs.log

--- xfs_imap -- module("xfs&qu= ot;).function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- retu= rn=3D0x16
vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff imap= =3D0xffff88100e2f7c08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_per_clu= ster=3D? chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbn= o=3D? __func__=3D[...]
mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20
mp->m_sb: sb_agcount =3D= 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c= , sb_dblocks =3D 0x1b4900000
imap: im_blkno =3D 0x0, im_len =3D 0xa078, = im_boffset =3D 0x86ea
kernel backtrace:
Returning from:  0xffffffffa02b3ab0 : xfs_imap+0x= 0/0x280 [xfs]
Returning to  :  0xffffffffa02b9599 : xfs_inotob= p+0x49/0xc0 [xfs]
 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x3= 20 [xfs]
 0xffffffff81501a69
 0x0 (inexact)
user backtrace:
 0x3bd1a0e5ad [/lib64/libpthread-2.12.so+0x= e5ad/0x219000]

--- xfs_iunlink_remove -- module("xfs").fun= ction("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return -- ret= urn=3D0x16
vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_a= gino=3D? last_ibp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset= =3D? last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0x113, i_flags =3D 0x0
ip->i_d: di_nlink =3D 0x0, di_ge= n =3D 0x0
[root@10= .23.72.93 ~]#
[root@10.23.72.94 ~]# cat xfs.log

--- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_= ialloc.c:1257").return -- return=3D0x16
vars: mp=3D0xffff881017c6c8= 00 tp=3D0xffff8801037acea0 ino=3D0xffffffff imap=3D0xffff882017101c08 flags= =3D0x0 agbno=3D? agino=3D? agno=3D? blks_per_cluster=3D? chunk_agbno=3D? cl= uster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? __func__=3D[...]
mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20
mp->m_sb: sb_agcount =3D= 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c= , sb_dblocks =3D 0x1b4900000
imap: im_blkno =3D 0x0, im_len =3D 0xd98, i= m_boffset =3D 0x547
kernel backtrace:
Returning from:  0xffffffffa02b3ab0 : xfs_imap+0x= 0/0x280 [xfs]
Returning to  :  0xffffffffa02b9599 : xfs_inotob= p+0x49/0xc0 [xfs]
 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x3= 20 [xfs]
 0xffffffff81501a69
 0x0 (inexact)
user backtrace:
 0x30cd40e5ad [/lib64/libpthread-2.12.so+0x= e5ad/0x219000]

--- xfs_iunlink_remove -- module("xfs").fun= ction("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return -- ret= urn=3D0x16
vars: tp=3D0xffff8801037acea0 ip=3D0xffff880e697c8800 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880d846c2d60 ibp=3D? agno=3D? agino=3D? next_a= gino=3D? last_ibp=3D? last_dip=3D0xffff881017c6c800 bucket_index=3D? offset= =3D? last_offset=3D0xffffffffffff880e error=3D? __func__=3D[...]
ip: i_ino =3D 0x142, i_flags =3D 0x0
ip->i_d: di_nlink =3D 0x0, di_ge= n =3D 0x3565732e



=
2013/4/15 =B7=FB=D3=C0=CC=CE &= lt;yongtaofu@gmail= .com>
Also glusterfs use a l= ot of hardlink for self-heal:
--------T 2 root root 0 Apr 15 11:58 /mnt/= xfsd/testbug/998416323
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999296624
------= ---T 2 root root 0 Apr 15 12:24 /mnt/xfsd/testbug/999568484
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999956875
------= ---T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/2f/052f4e3e= -c379-4a3c-b995-a10fdaca33d0
---------T 2 root root 0 Apr 15 11:58 /mnt/= xfsd/testbug/.glusterfs/05/95/0595272e-ce2b-45d5-8693-d02c00b94d9d
---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/05/ca/05= ca00a0-92a7-44cf-b6e3-380496aafaa4
---------T 2 root root 0 Apr 15 12:24= /mnt/xfsd/testbug/.glusterfs/0a/23/0a238ca7-3cef-4540-9c98-6bf631551b21 ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/.glusterfs/0a/4b/0a= 4b640b-f675-4708-bb59-e2369ffbbb9d
Does it related?


2013/4/15 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Dear xfs experts,=
Now I'm deploying Brian's system script in out cluster. B= ut from last night till now 5 servers in our 24 servers xfs shutdown with t= he same error. I run xfs_repair command and found all the lost inodes are g= lusterfs dht link files. This explains why the xfs shutdown tend to happen = during glusterfs rebalance. During glusterfs rebalance procedure a lot of d= hk link files may be unlinked. For example the following inodes are found i= n lost+found in one of the servers:
[root@* lost+found]# pwd
/mnt/xfsd/lost+found
[root@* lost+found]# ls= -l
total 740
---------T 1 root root 0 Apr  8 21:06 100119
--= -------T 1 root root 0 Apr  8 21:11 101123
---------T 1 root root 0= Apr  8 21:19 102659
---------T 1 root root 0 Apr 12 14:46 1040919
---------T 1 root root 0 A= pr 12 14:58 1041943
---------T 1 root root 0 Apr  8 21:32 105219---------T 1 root root 0 Apr  8 21:37 105731
---------T 1 root roo= t 0 Apr 12 17:48 1068055
---------T 1 root root 0 Apr 12 18:38 1073943
---------T 1 root root 0 A= pr  8 21:54 108035
---------T 1 root root 0 Apr 12 21:49 1091095---------T 1 root root 0 Apr 13 00:17 1111063
---------T 1 root root 0 = Apr 13 03:51 1121815
---------T 1 root root 0 Apr  8 22:25 112387
---------T 1 root root= 0 Apr 13 06:39 1136151
...
[root@* lost+found]# getfattr -m . -d -e = hex *

# file: 96007
trusted.afr.mams-cq-mt-video-client-3=3D0x000= 000000000000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x000000000000000000000000
trust= ed.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000
trusted.gf= id=3D0xa0370d8a9f104dafbebbd0e6dd7ce1f7
trusted.glusterfs.dht.linkto=3D0= x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000= 0000049dff000

# file: 97027
trusted.afr.mams-cq-mt-video-client-3= =3D0x000000000000000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x= 000000000000000000000000
trusted.afr.mams-cq-mt-video-client-5=3D0x000000000000000000000000
trust= ed.gfid=3D0xc1c1fe2ec7034442a623385f43b04c25
trusted.glusterfs.dht.linkt= o=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
trusted= .glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x000000006a= c78000

# file: 97559
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0xcf7c17013c914511bda4d1c743fae118
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 000519fb000

# file: 98055
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0xe86abc6e2c4b44c28d415fbbe34f2102
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0004c098000

# file: 98567
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x12543a2efbdf4b9fa61c6d89ca396f80
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0006bc98000

# file: 98583
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x760d16d3b7974cfb9c0a665a0982c470
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 0006cde9000

# file: 99607
trusted.afr.mams-cq-mt-video-client-3=3D0x000000000000= 000000000000
trusted.afr.mams-cq-mt-video-client-4=3D0x00000000000000000= 0000000
trusted.afr.mams-cq-mt-video-client-5=3D0x0000000000000000000000= 00
trusted.gfid=3D0x0849a732ea204bc3b8bae830b46881da
trusted.glusterfs.dht.= linkto=3D0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500
tr= usted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=3D0x00000= 000513f1000
...

What do you think about it? Thank you very much.
=


201= 3/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brian,

Your scripts works for me now after I installed all the rpm built out from= kernel srpm. I'll try it. Thank you.


2013/4/12 Brian Foster <bfoster@redhat.com>
On 04/12/2013 04:32 AM, =B7=FB=D3=C0=CC=CE wrote:
> Dear xfs experts,
> Can I just call xfs_stack_trace(); in the second line of
> xfs_do_force_shutdown() to print stack and rebuild kernel to check
> what's the error?
>

I suppose that's a start. If you're willing/able to create an= d run a
modified kernel for the purpose of collecting more debug info, perhaps
we can get a bit more creative in collecting more data on the problem
(but a stack trace there is a good start).

BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp)
check almost halfway into the function to avoid duplicate messages.

Brian

>
> 2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     Hi Brian,
>     What else I'm missing? Thank you.
>     stap -e 'probe module("xfs").function(&quo= t;xfs_iunlink"){}'
>
>     WARNING: cannot find module xfs debuginfo: No DWARF info= rmation found
>     semantic error: no match while resolving probe point
>     module("xfs").function("xfs_iunlink"= )
>     Pass 2: analysis failed.  Try again with another &#= 39;--vp 01' option.
>
>
>     2013/4/12 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:= yongtaofu@gmail.co= m>>
>
>         ls -l
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>         -r--r--r-- 1 root root 21393024 Apr 12 12:= 08
>         /usr/lib/debug/lib/modules/2.6.32-279.el6.= x86_64/kernel/fs/xfs/xfs.ko.debug
>
>         rpm -qa|grep  kernel
>         kernel-headers-2.6.32-279.el6.x86_64
>         kernel-devel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>         kernel-debuginfo-common-x86_64-2.6.32-279.= el6.x86_64
>         abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >         kernel-firmware-2.6.32-358.el6.noarch
>         kernel-debug-2.6.32-358.el6.x86_64
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>         dracut-kernel-004-283.el6.noarch
>         libreport-plugin-kerneloops-2.0.9-5.el6.x8= 6_64
>         kernel-devel-2.6.32-358.el6.x86_64
>         kernel-2.6.32-279.el6.x86_64
>
>         rpm -q kernel-debuginfo
>         kernel-debuginfo-2.6.32-279.el6.x86_64
>
>         rpm -q kernel
>         kernel-2.6.32-279.el6.x86_64
>         kernel-2.6.32-358.el6.x86_64
>
>         do I need to re probe it?
>
>
>         2013/4/12 Eric Sandeen <sandeen@sandeen.net
>         <mailto:sandeen@sandeen.net>>
>
>             On 4/11/13 11:32 PM, =B7=FB= =D3=C0=CC=CE wrote:
>             > Hi Brian,
>             > Sorry but when I execut= e the script it says:
>             > WARNING: cannot find mo= dule xfs debuginfo: No DWARF
>             information found
>             > semantic error: no matc= h while resolving probe point
>             module("xfs").func= tion("xfs_iunlink")
>             >
>             > uname -a
>             > 2.6.32-279.el6.x86_64 >             > kernel debuginfo has be= en installed.
>             >
>             > Where can I find the co= rrect xfs debuginfo?
>
>             it should be in the kernel-d= ebuginfo rpm (of the same
>             version/release as the kerne= l rpm you're running)
>
>             You should have:
>
>             /usr/lib/debug/lib/modules/2= .6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug
>
>             If not, can you show:
>
>             # uname -a
>             # rpm -q kernel
>             # rpm -q kernel-debuginfo >
>             -Eric
>
>
>
>
>
>         --
>         =B7=FB=D3=C0=CC=CE
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE
>
>
> _______________________________________________<= br> > xfs mailing list
> xfs@oss.sgi.com
>
= http://oss.sgi.com/mailman/listinfo/xfs
>




= --
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE --14dae9340ee74eaced04da6678b7-- From sandeen@sandeen.net Mon Apr 15 08:57:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 393537F50 for ; Mon, 15 Apr 2013 08:57:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 107BE8F8037 for ; Mon, 15 Apr 2013 06:57:38 -0700 (PDT) X-ASG-Debug-ID: 1366034257-04bdf02d20201eb0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BEqITWLdfKKg442n for ; Mon, 15 Apr 2013 06:57:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E701963BE0B3; Mon, 15 Apr 2013 08:57:36 -0500 (CDT) Message-ID: <516C0752.8070007@sandeen.net> Date: Mon, 15 Apr 2013 08:57:38 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?GB2312?B?t/vTwMzO?= CC: Brian Foster , Ben Myers , "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> <516800F7.80502@redhat.com> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366034257 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128197 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/15/13 8:45 AM, ·ûÓÀÌÎ wrote: > And at the same time we got the following error log of glusterfs: > [2013-04-15 20:43:03.851163] I [dht-rebalance.c:1611:gf_defrag_status_get] 0-glusterfs: Rebalance is completed > [2013-04-15 20:43:03.851248] I [dht-rebalance.c:1614:gf_defrag_status_get] 0-glusterfs: Files migrated: 1629, size: 1582329065954, lookups: 11036, failures: 561 > [2013-04-15 20:43:03.887634] W [glusterfsd.c:831:cleanup_and_exit] (-->/lib64/libc.so.6(clone+0x6d) [0x3bd16e767d] (-->/lib64/libpthread.so.0() [0x3bd1a07851] (-->/usr/sbin/glusterfs(glusterfs_sigwaiter+0xdd) [0x405c9d]))) 0-: received signum (15), shutting down > [2013-04-15 20:43:03.887878] E [rpcsvc.c:1155:rpcsvc_program_unregister_portmap] 0-rpc-service: Could not unregister with portmap > We'll take a look, thanks. Going forward, could I ask that you take a few minutes to batch up the information, rather than sending several emails in a row? It makes it much harder to collect the information when it's spread across so many emails. Thanks, -Eric From bfoster@redhat.com Mon Apr 15 09:12:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 57ECF7F4C for ; Mon, 15 Apr 2013 09:12:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3454B8F8039 for ; Mon, 15 Apr 2013 07:12:55 -0700 (PDT) X-ASG-Debug-ID: 1366035174-04cbb057f8201f40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vuLkUDXeVXrcuyIZ for ; Mon, 15 Apr 2013 07:12:54 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3FECqXg026185 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 15 Apr 2013 10:12:53 -0400 Received: from bfoster.bfoster (dhcp-189-135.bos.redhat.com [10.16.189.135]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r3FECpeP025705; Mon, 15 Apr 2013 10:12:52 -0400 Message-ID: <516C0B26.6020207@redhat.com> Date: Mon, 15 Apr 2013 10:13:58 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Eric Sandeen , Ben Myers , "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <20130410121025.78a42b22@harpe.intellique.com> <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> <516800F7.80502@redhat.com> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366035174 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/15/2013 08:54 AM, 符永涛 wrote: > Dear Brian and xfs experts, > Brain your scripts works and I am able to reproduce it with glusterfs > rebalance on our test cluster. 2 of our server xfs shutdown during > glusterfs rebalance, the shutdown userspace stacktrace both related to > pthread. See logs bellow, What's your opinion? Thank you very much! > logs: Thanks for the data. Can you also create a metadump for the filesystem(s) associated with this output? Brian > [root@10.23.72.93 ~]# cat xfs.log > > --- xfs_imap -- > module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return > -- return=0x16 > vars: mp=0xffff882017a50800 tp=0xffff881c81797c70 ino=0xffffffff > imap=0xffff88100e2f7c08 flags=0x0 agbno=? agino=? agno=? blks_per_cluster=? > chunk_agbno=? cluster_agbno=? error=? offset=? offset_agbno=? __func__=[...] > mp: m_agno_log = 0x5, m_agino_log = 0x20 > mp->m_sb: sb_agcount = 0x1c, sb_agblocks = 0xffffff0, sb_inopblog = 0x4, > sb_agblklog = 0x1c, sb_dblocks = 0x1b4900000 > imap: im_blkno = 0x0, im_len = 0xa078, im_boffset = 0x86ea > kernel backtrace: > Returning from: 0xffffffffa02b3ab0 : xfs_imap+0x0/0x280 [xfs] > Returning to : 0xffffffffa02b9599 : xfs_inotobp+0x49/0xc0 [xfs] > 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x320 [xfs] > 0xffffffff81501a69 > 0x0 (inexact) > user backtrace: > 0x3bd1a0e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000] > > --- xfs_iunlink_remove -- > module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return > -- return=0x16 > vars: tp=0xffff881c81797c70 ip=0xffff881003c13c00 next_ino=? mp=? agi=? > dip=? agibp=0xffff880109b47e20 ibp=? agno=? agino=? next_agino=? last_ibp=? > last_dip=0xffff882000000000 bucket_index=? offset=? > last_offset=0xffffffffffff8810 error=? __func__=[...] > ip: i_ino = 0x113, i_flags = 0x0 > ip->i_d: di_nlink = 0x0, di_gen = 0x0 > [root@10.23.72.93 ~]# > [root@10.23.72.94 ~]# cat xfs.log > > --- xfs_imap -- > module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return > -- return=0x16 > vars: mp=0xffff881017c6c800 tp=0xffff8801037acea0 ino=0xffffffff > imap=0xffff882017101c08 flags=0x0 agbno=? agino=? agno=? blks_per_cluster=? > chunk_agbno=? cluster_agbno=? error=? offset=? offset_agbno=? __func__=[...] > mp: m_agno_log = 0x5, m_agino_log = 0x20 > mp->m_sb: sb_agcount = 0x1c, sb_agblocks = 0xffffff0, sb_inopblog = 0x4, > sb_agblklog = 0x1c, sb_dblocks = 0x1b4900000 > imap: im_blkno = 0x0, im_len = 0xd98, im_boffset = 0x547 > kernel backtrace: > Returning from: 0xffffffffa02b3ab0 : xfs_imap+0x0/0x280 [xfs] > Returning to : 0xffffffffa02b9599 : xfs_inotobp+0x49/0xc0 [xfs] > 0xffffffffa02b96f1 : xfs_iunlink_remove+0xe1/0x320 [xfs] > 0xffffffff81501a69 > 0x0 (inexact) > user backtrace: > 0x30cd40e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000] > > --- xfs_iunlink_remove -- > module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return > -- return=0x16 > vars: tp=0xffff8801037acea0 ip=0xffff880e697c8800 next_ino=? mp=? agi=? > dip=? agibp=0xffff880d846c2d60 ibp=? agno=? agino=? next_agino=? last_ibp=? > last_dip=0xffff881017c6c800 bucket_index=? offset=? > last_offset=0xffffffffffff880e error=? __func__=[...] > ip: i_ino = 0x142, i_flags = 0x0 > ip->i_d: di_nlink = 0x0, di_gen = 0x3565732e > > > > 2013/4/15 符永涛 > >> Also glusterfs use a lot of hardlink for self-heal: >> --------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/998416323 >> ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999296624 >> ---------T 2 root root 0 Apr 15 12:24 /mnt/xfsd/testbug/999568484 >> ---------T 2 root root 0 Apr 15 11:58 /mnt/xfsd/testbug/999956875 >> ---------T 2 root root 0 Apr 15 11:58 >> /mnt/xfsd/testbug/.glusterfs/05/2f/052f4e3e-c379-4a3c-b995-a10fdaca33d0 >> ---------T 2 root root 0 Apr 15 11:58 >> /mnt/xfsd/testbug/.glusterfs/05/95/0595272e-ce2b-45d5-8693-d02c00b94d9d >> ---------T 2 root root 0 Apr 15 11:58 >> /mnt/xfsd/testbug/.glusterfs/05/ca/05ca00a0-92a7-44cf-b6e3-380496aafaa4 >> ---------T 2 root root 0 Apr 15 12:24 >> /mnt/xfsd/testbug/.glusterfs/0a/23/0a238ca7-3cef-4540-9c98-6bf631551b21 >> ---------T 2 root root 0 Apr 15 11:58 >> /mnt/xfsd/testbug/.glusterfs/0a/4b/0a4b640b-f675-4708-bb59-e2369ffbbb9d >> Does it related? >> >> >> 2013/4/15 符永涛 >> >>> Dear xfs experts, >>> Now I'm deploying Brian's system script in out cluster. But from last >>> night till now 5 servers in our 24 servers xfs shutdown with the same >>> error. I run xfs_repair command and found all the lost inodes are glusterfs >>> dht link files. This explains why the xfs shutdown tend to happen during >>> glusterfs rebalance. During glusterfs rebalance procedure a lot of dhk link >>> files may be unlinked. For example the following inodes are found in >>> lost+found in one of the servers: >>> [root@* lost+found]# pwd >>> /mnt/xfsd/lost+found >>> [root@* lost+found]# ls -l >>> total 740 >>> ---------T 1 root root 0 Apr 8 21:06 100119 >>> ---------T 1 root root 0 Apr 8 21:11 101123 >>> ---------T 1 root root 0 Apr 8 21:19 102659 >>> ---------T 1 root root 0 Apr 12 14:46 1040919 >>> ---------T 1 root root 0 Apr 12 14:58 1041943 >>> ---------T 1 root root 0 Apr 8 21:32 105219 >>> ---------T 1 root root 0 Apr 8 21:37 105731 >>> ---------T 1 root root 0 Apr 12 17:48 1068055 >>> ---------T 1 root root 0 Apr 12 18:38 1073943 >>> ---------T 1 root root 0 Apr 8 21:54 108035 >>> ---------T 1 root root 0 Apr 12 21:49 1091095 >>> ---------T 1 root root 0 Apr 13 00:17 1111063 >>> ---------T 1 root root 0 Apr 13 03:51 1121815 >>> ---------T 1 root root 0 Apr 8 22:25 112387 >>> ---------T 1 root root 0 Apr 13 06:39 1136151 >>> ... >>> [root@* lost+found]# getfattr -m . -d -e hex * >>> >>> # file: 96007 >>> trusted.afr.mams-cq-mt-video-client-3=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=0x000000000000000000000000 >>> trusted.gfid=0xa0370d8a9f104dafbebbd0e6dd7ce1f7 >>> >>> trusted.glusterfs.dht.linkto=0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=0x0000000049dff000 >>> >>> # file: 97027 >>> trusted.afr.mams-cq-mt-video-client-3=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=0x000000000000000000000000 >>> trusted.gfid=0xc1c1fe2ec7034442a623385f43b04c25 >>> >>> trusted.glusterfs.dht.linkto=0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=0x000000006ac78000 >>> >>> # file: 97559 >>> trusted.afr.mams-cq-mt-video-client-3=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=0x000000000000000000000000 >>> trusted.gfid=0xcf7c17013c914511bda4d1c743fae118 >>> >>> trusted.glusterfs.dht.linkto=0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=0x00000000519fb000 >>> >>> # file: 98055 >>> trusted.afr.mams-cq-mt-video-client-3=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=0x000000000000000000000000 >>> trusted.gfid=0xe86abc6e2c4b44c28d415fbbe34f2102 >>> >>> trusted.glusterfs.dht.linkto=0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3600 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=0x000000004c098000 >>> >>> # file: 98567 >>> trusted.afr.mams-cq-mt-video-client-3=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=0x000000000000000000000000 >>> trusted.gfid=0x12543a2efbdf4b9fa61c6d89ca396f80 >>> >>> trusted.glusterfs.dht.linkto=0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=0x000000006bc98000 >>> >>> # file: 98583 >>> trusted.afr.mams-cq-mt-video-client-3=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=0x000000000000000000000000 >>> trusted.gfid=0x760d16d3b7974cfb9c0a665a0982c470 >>> >>> trusted.glusterfs.dht.linkto=0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=0x000000006cde9000 >>> >>> # file: 99607 >>> trusted.afr.mams-cq-mt-video-client-3=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-4=0x000000000000000000000000 >>> trusted.afr.mams-cq-mt-video-client-5=0x000000000000000000000000 >>> trusted.gfid=0x0849a732ea204bc3b8bae830b46881da >>> >>> trusted.glusterfs.dht.linkto=0x6d616d732d63712d6d742d766964656f2d7265706c69636174652d3500 >>> >>> trusted.glusterfs.quota.ca34e1ce-f046-4ed4-bbd1-261b21bfe0b8.contri=0x00000000513f1000 >>> ... >>> >>> What do you think about it? Thank you very much. >>> >>> >>> 2013/4/12 符永涛 >>> >>>> Hi Brian, >>>> >>>> Your scripts works for me now after I installed all the rpm built out >>>> from kernel srpm. I'll try it. Thank you. >>>> >>>> >>>> 2013/4/12 Brian Foster >>>> >>>>> On 04/12/2013 04:32 AM, 符永涛 wrote: >>>>>> Dear xfs experts, >>>>>> Can I just call xfs_stack_trace(); in the second line of >>>>>> xfs_do_force_shutdown() to print stack and rebuild kernel to check >>>>>> what's the error? >>>>>> >>>>> >>>>> I suppose that's a start. If you're willing/able to create and run a >>>>> modified kernel for the purpose of collecting more debug info, perhaps >>>>> we can get a bit more creative in collecting more data on the problem >>>>> (but a stack trace there is a good start). >>>>> >>>>> BTW- you might want to place the call after the XFS_FORCED_SHUTDOWN(mp) >>>>> check almost halfway into the function to avoid duplicate messages. >>>>> >>>>> Brian >>>>> >>>>>> >>>>>> 2013/4/12 符永涛 > >>>>>> >>>>>> Hi Brian, >>>>>> What else I'm missing? Thank you. >>>>>> stap -e 'probe module("xfs").function("xfs_iunlink"){}' >>>>>> >>>>>> WARNING: cannot find module xfs debuginfo: No DWARF information >>>>> found >>>>>> semantic error: no match while resolving probe point >>>>>> module("xfs").function("xfs_iunlink") >>>>>> Pass 2: analysis failed. Try again with another '--vp 01' option. >>>>>> >>>>>> >>>>>> 2013/4/12 符永涛 > >>>>>> >>>>>> ls -l >>>>>> >>>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug >>>>>> -r--r--r-- 1 root root 21393024 Apr 12 12:08 >>>>>> >>>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug >>>>>> >>>>>> rpm -qa|grep kernel >>>>>> kernel-headers-2.6.32-279.el6.x86_64 >>>>>> kernel-devel-2.6.32-279.el6.x86_64 >>>>>> kernel-2.6.32-358.el6.x86_64 >>>>>> kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64 >>>>>> abrt-addon-kerneloops-2.0.8-6.el6.x86_64 >>>>>> kernel-firmware-2.6.32-358.el6.noarch >>>>>> kernel-debug-2.6.32-358.el6.x86_64 >>>>>> kernel-debuginfo-2.6.32-279.el6.x86_64 >>>>>> dracut-kernel-004-283.el6.noarch >>>>>> libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 >>>>>> kernel-devel-2.6.32-358.el6.x86_64 >>>>>> kernel-2.6.32-279.el6.x86_64 >>>>>> >>>>>> rpm -q kernel-debuginfo >>>>>> kernel-debuginfo-2.6.32-279.el6.x86_64 >>>>>> >>>>>> rpm -q kernel >>>>>> kernel-2.6.32-279.el6.x86_64 >>>>>> kernel-2.6.32-358.el6.x86_64 >>>>>> >>>>>> do I need to re probe it? >>>>>> >>>>>> >>>>>> 2013/4/12 Eric Sandeen >>>>> > >>>>>> >>>>>> On 4/11/13 11:32 PM, 符永涛 wrote: >>>>>> > Hi Brian, >>>>>> > Sorry but when I execute the script it says: >>>>>> > WARNING: cannot find module xfs debuginfo: No DWARF >>>>>> information found >>>>>> > semantic error: no match while resolving probe point >>>>>> module("xfs").function("xfs_iunlink") >>>>>> > >>>>>> > uname -a >>>>>> > 2.6.32-279.el6.x86_64 >>>>>> > kernel debuginfo has been installed. >>>>>> > >>>>>> > Where can I find the correct xfs debuginfo? >>>>>> >>>>>> it should be in the kernel-debuginfo rpm (of the same >>>>>> version/release as the kernel rpm you're running) >>>>>> >>>>>> You should have: >>>>>> >>>>>> >>>>> /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/kernel/fs/xfs/xfs.ko.debug >>>>>> >>>>>> If not, can you show: >>>>>> >>>>>> # uname -a >>>>>> # rpm -q kernel >>>>>> # rpm -q kernel-debuginfo >>>>>> >>>>>> -Eric >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> 符永涛 >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> 符永涛 >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> 符永涛 >>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> xfs mailing list >>>>>> xfs@oss.sgi.com >>>>>> http://oss.sgi.com/mailman/listinfo/xfs >>>>>> >>>>> >>>>> >>>> >>>> >>>> -- >>>> 符永涛 >>>> >>> >>> >>> >>> -- >>> 符永涛 >>> >> >> >> >> -- >> 符永涛 >> > > > From yongtaofu@gmail.com Mon Apr 15 09:21:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C04B07F4C for ; Mon, 15 Apr 2013 09:21:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AD45130404E for ; Mon, 15 Apr 2013 07:21:38 -0700 (PDT) X-ASG-Debug-ID: 1366035697-04cb6c2c1c20bc60001-NocioJ Received: from mail-ie0-f180.google.com (mail-ie0-f180.google.com [209.85.223.180]) by cuda.sgi.com with ESMTP id MVGw8MkAZyX6we0N (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 15 Apr 2013 07:21:37 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.180 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.180] Received: by mail-ie0-f180.google.com with SMTP id qd14so40776ieb.25 for ; Mon, 15 Apr 2013 07:21:37 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.180] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.180] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=3yBBA7U4TjgH9pB9ZbG378u6EVm73z195jypFeCZmmQ=; b=DGYc+JWWlTmRnHlQtMOmnEr0vHDrlvmk3xxEbBHtipHzTo9LKs2II8QoEBMEV+s2QU uGk34VVU2N9ZuNg20Q6sgjUOvrv8OPlIo8PsAnw1h5k38U5rRnZDXA2onEche96Bp1S0 H82m+ASeT4bOm9eIcIch8BuooS7dNujgAXuUP5pydfHocnFs5D6RNGn3pG8x4kwk80wW 1E4RQhKkbbY0KcHpopWWRivcGziNgH5yzBdy6bha4Y+30v2dl+V5CqqVJPX0Rai82iTq gOxCLeDo5TUGROxSkuQjC6+zJoCBYXZb62oC0kWpARrg2W0AC5r9JPTAYpdPLgf55PUm eL9w== MIME-Version: 1.0 X-Received: by 10.50.107.4 with SMTP id gy4mr5303213igb.89.1366035697182; Mon, 15 Apr 2013 07:21:37 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Mon, 15 Apr 2013 07:21:36 -0700 (PDT) In-Reply-To: <516C0752.8070007@sandeen.net> References: <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> <516800F7.80502@redhat.com> <516C0752.8070007@sandeen.net> Date: Mon, 15 Apr 2013 22:21:36 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: Brian Foster , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=047d7b10d1b77b7a5704da66f804 X-Barracuda-Connect: mail-ie0-f180.google.com[209.85.223.180] X-Barracuda-Start-Time: 1366035697 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128198 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 --047d7b10d1b77b7a5704da66f804 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Eric, I'm sorry for spaming. And I got some more info and hope you're interested. In glusterfs3.3 glusterfsd/src/glusterfsd.c line 1332 there's an unlink operation. if (ctx->cmd_args.pid_file) { unlink (ctx->cmd_args.pid_file); ctx->cmd_args.pid_file =3D NULL; } Glusterfs try to unlink the rebalance pid file after complete and may be this is where the issue happens. See logs bellow: 1. /var/log/secure indicates I start rebalance on Apr 15 11:58:11 Apr 15 11:58:11 10 sudo: root : TTY=3Dpts/2 ; PWD=3D/root ; USER=3Droot= ; COMMAND=3D/usr/sbin/gluster volume rebalance testbug start 2. After xfs shutdown I got the following log: --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return -- return=3D0x16 vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino=3D= ? last_ibp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] ip: i_ino =3D 0x113, i_flags =3D 0x0 the inode is lead to xfs shutdown is 0x113 3. I repair xfs and in lost+foud I find the inode: [root@10.23.72.93 lost+found]# pwd /mnt/xfsd/lost+found [root@10.23.72.93 lost+found]# ls -l 275 ---------T 1 root root 0 Apr 15 11:58 275 [root@10.23.72.93 lost+found]# stat 275 File: `275' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 810h/2064d Inode: 275 Links: 1 Access: (1000/---------T) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2013-04-15 11:58:25.833443445 +0800 Modify: 2013-04-15 11:58:25.912461256 +0800 Change: 2013-04-15 11:58:25.915442091 +0800 This file is created aroud 2013-04-15 11:58. And the other files in lost+foud has extended attribute but this file doesn't. Which means it is not part of glusterfs backend files. It should be the rebalance pid file. So may be unlink the rebalance pid file leads to xfs shutdown. Thank you. 2013/4/15 Eric Sandeen > On 4/15/13 8:45 AM, =B7=FB=D3=C0=CC=CE wrote: > > And at the same time we got the following error log of glusterfs: > > [2013-04-15 20:43:03.851163] I > [dht-rebalance.c:1611:gf_defrag_status_get] 0-glusterfs: Rebalance is > completed > > [2013-04-15 20:43:03.851248] I > [dht-rebalance.c:1614:gf_defrag_status_get] 0-glusterfs: Files migrated: > 1629, size: 1582329065954, lookups: 11036, failures: 561 > > [2013-04-15 20:43:03.887634] W [glusterfsd.c:831:cleanup_and_exit] > (-->/lib64/libc.so.6(clone+0x6d) [0x3bd16e767d] > (-->/lib64/libpthread.so.0() [0x3bd1a07851] > (-->/usr/sbin/glusterfs(glusterfs_sigwaiter+0xdd) [0x405c9d]))) 0-: > received signum (15), shutting down > > [2013-04-15 20:43:03.887878] E > [rpcsvc.c:1155:rpcsvc_program_unregister_portmap] 0-rpc-service: Could no= t > unregister with portmap > > > > We'll take a look, thanks. > > Going forward, could I ask that you take a few minutes to batch up the > information, rather than sending several emails in a row? It makes it mu= ch > harder to collect the information when it's spread across so many emails. > > Thanks, > -Eric > > --=20 =B7=FB=D3=C0=CC=CE --047d7b10d1b77b7a5704da66f804 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Eric,
I'm sorry for spaming.
And I got some more info and hop= e you're interested.
In glusterfs3.3
glusterfsd/src/glusterfsd.c= line 1332 there's an unlink operation.
    &nbs= p;   if (ctx->cmd_args.pid_file) {
            &nb= sp;   unlink (ctx->cmd_args.pid_file);
   &n= bsp;            ctx-= >cmd_args.pid_file =3D NULL;
      &nbs= p; }
Glusterfs try t= o unlink the rebalance pid file after complete and may be this is where the= issue happens.
See logs bellow:
1.<= br>
/var/log/secure indi= cates I start rebalance on Apr 15 11:58:11
Apr 15 11:58:11 10 sudo: = ;    root : TTY=3Dpts/2 ; PWD=3D/root ; USER=3Droot ; COMMAN= D=3D/usr/sbin/gluster volume rebalance testbug start
2.
After xfs shutdow= n I got the following log:
--- xfs_iunlink_remove -- module("xfs&qu= ot;).function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").retur= n -- return=3D0x16
vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_a= gino=3D? last_ibp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset= =3D? last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0x113, i_flags =3D 0x0
the inode is lead to xfs shutdown is
0x113
3.
I repair xfs and in lost+foud I find the inode:
[root@10.23.72.93 lost+found]# pwd<= br>/mnt/xfsd/lost+found
[root@10.23.= 72.93 lost+found]# ls -l 275
---------T 1 root root 0 Apr 15 11:58 2= 75
[root@10.23.72.93 lost+found]# stat= 275
  File: `275'
  Size: 0    &nb= sp;          Blocks: 0 &n= bsp;        IO Block: 4096   r= egular empty file
Device: 810h/2064d      Inode= : 275         Links: 1
Access: (1000/---------T)  Uid: (    0/  &nbs= p; root)   Gid: (    0/    root)Access: 2013-04-15 11:58:25.833443445 +0800
Modify: 2013-04-15 11:58:25= .912461256 +0800
Change: 2013-04-15 11:58:25.915442091 +0800
<= /div>
This file is created aroud 2013-04-15 11:58.
And the other files in lost+foud has ex= tended attribute but this file doesn't. Which means it is not part of g= lusterfs backend files. It should be the rebalance pid file.

So may be unlink th= e rebalance pid file leads to xfs shutdown.

Thank you.
=

<= /div>


2013/4/15 Eric Sandeen <sandeen@sandeen.net>
On 4/15/13 8:45 AM, =B7=FB= =D3=C0=CC=CE wrote:
> And at the same time we got the following error log of glusterfs:
> [2013-04-15 20:43:03.851163] I [dht-rebalance.c:1611:gf_defrag_status_= get] 0-glusterfs: Rebalance is completed
> [2013-04-15 20:43:03.851248] I [dht-rebalance.c:1614:gf_defrag_status_= get] 0-glusterfs: Files migrated: 1629, size: 1582329065954, lookups: 11036= , failures: 561
> [2013-04-15 20:43:03.887634] W [glusterfsd.c:831:cleanup_and_exit] (--= >/lib64/libc.so.6(clone+0x6d) [0x3bd16e767d] (-->/lib64/libpthread.so= .0() [0x3bd1a07851] (-->/usr/sbin/glusterfs(glusterfs_sigwaiter+0xdd) [0= x405c9d]))) 0-: received signum (15), shutting down
> [2013-04-15 20:43:03.887878] E [rpcsvc.c:1155:rpcsvc_program_unregiste= r_portmap] 0-rpc-service: Could not unregister with portmap
>

We'll take a look, thanks.

Going forward, could I ask that you take a few minutes to batch up the info= rmation, rather than sending several emails in a row?  It makes it muc= h harder to collect the information when it's spread across so many ema= ils.

Thanks,
-Eric




--
=B7=FB=D3=C0=CC=CE
--047d7b10d1b77b7a5704da66f804-- From yongtaofu@gmail.com Mon Apr 15 10:24:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BF0487F4C for ; Mon, 15 Apr 2013 10:24:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3B789AC007 for ; Mon, 15 Apr 2013 08:24:12 -0700 (PDT) X-ASG-Debug-ID: 1366039450-04cbb057f62067c0001-NocioJ Received: from mail-ie0-f177.google.com (mail-ie0-f177.google.com [209.85.223.177]) by cuda.sgi.com with ESMTP id EhxPzd865PGiwGFN (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 15 Apr 2013 08:24:10 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] Received: by mail-ie0-f177.google.com with SMTP id 9so5671736iec.36 for ; Mon, 15 Apr 2013 08:24:10 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=iM5WPaVJ8QFewCH3qyZeYt1eqlWRrHkHKa2X46bOrGQ=; b=dZoV/kfJMjDa/P6P2xhMs5YO/grSawkYbzi10uB8/laPJA4nY7VMmgygyy6D5mPYnH X6zg4fsfpOP0x9AuqCS7CDa7MCh+ANQwomc9tNL1RWzc21vzHkpEQ4UzwInmmPPccc1l 2Q0P86MgtERfa4q0HMIW5a9r8ZQUoAVN17V9UvzcrdLHGJv6H9JZ7oXJ3U13NNRWjFfL vaNmeuSlNE9V/KaXzG+57QYJYaiYIRQtlWypeM+MRbCoV2oOg8ExrQt+0BlCtw/3qDi4 +8N4CPFV4gdtOP8wQDyZttKOpDnHMAUX8XRaTy8M6t8Fvqfkril7RWARzqiLo+Ca/83Z ifXQ== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr5504044igq.51.1366039450216; Mon, 15 Apr 2013 08:24:10 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Mon, 15 Apr 2013 08:24:09 -0700 (PDT) In-Reply-To: References: <516746AC.3090808@redhat.com> <516798AE.9050908@sandeen.net> <516800F7.80502@redhat.com> <516C0752.8070007@sandeen.net> Date: Mon, 15 Apr 2013 23:24:09 +0800 Message-ID: Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 To: Eric Sandeen Cc: Brian Foster , Ben Myers , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee72fa16c04da67d8a1 X-Barracuda-Connect: mail-ie0-f177.google.com[209.85.223.177] X-Barracuda-Start-Time: 1366039450 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128202 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 --14dae9340ee72fa16c04da67d8a1 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brain, Here's the meta_dump file: https://docs.google.com/file/d/0B7n2C4T5tfNCRGpoUWIzaTlvM0E/edit?usp=3Dshar= ing Thank you. 2013/4/15 =B7=FB=D3=C0=CC=CE > Hi Eric, > I'm sorry for spaming. > And I got some more info and hope you're interested. > In glusterfs3.3 > glusterfsd/src/glusterfsd.c line 1332 there's an unlink operation. > if (ctx->cmd_args.pid_file) { > unlink (ctx->cmd_args.pid_file); > ctx->cmd_args.pid_file =3D NULL; > } > Glusterfs try to unlink the rebalance pid file after complete and may be > this is where the issue happens. > See logs bellow: > 1. > /var/log/secure indicates I start rebalance on Apr 15 11:58:11 > Apr 15 11:58:11 10 sudo: root : TTY=3Dpts/2 ; PWD=3D/root ; USER=3Dro= ot ; > COMMAND=3D/usr/sbin/gluster volume rebalance testbug start > 2. > After xfs shutdown I got the following log: > > --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/x= fs/xfs_inode.c:1680").return > -- return=3D0x16 > vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D?= agi=3D? > dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino= =3D? last_ibp=3D? > last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? > last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] > ip: i_ino =3D 0x113, i_flags =3D 0x0 > the inode is lead to xfs shutdown is > 0x113 > 3. > I repair xfs and in lost+foud I find the inode: > [root@10.23.72.93 lost+found]# pwd > /mnt/xfsd/lost+found > [root@10.23.72.93 lost+found]# ls -l 275 > ---------T 1 root root 0 Apr 15 11:58 275 > [root@10.23.72.93 lost+found]# stat 275 > File: `275' > Size: 0 Blocks: 0 IO Block: 4096 regular empty > file > Device: 810h/2064d Inode: 275 Links: 1 > Access: (1000/---------T) Uid: ( 0/ root) Gid: ( 0/ root) > Access: 2013-04-15 11:58:25.833443445 +0800 > Modify: 2013-04-15 11:58:25.912461256 +0800 > Change: 2013-04-15 11:58:25.915442091 +0800 > This file is created aroud 2013-04-15 11:58. > And the other files in lost+foud has extended attribute but this file > doesn't. Which means it is not part of glusterfs backend files. It should > be the rebalance pid file. > > So may be unlink the rebalance pid file leads to xfs shutdown. > > Thank you. > > > > 2013/4/15 Eric Sandeen > >> On 4/15/13 8:45 AM, =B7=FB=D3=C0=CC=CE wrote: >> > And at the same time we got the following error log of glusterfs: >> > [2013-04-15 20:43:03.851163] I >> [dht-rebalance.c:1611:gf_defrag_status_get] 0-glusterfs: Rebalance is >> completed >> > [2013-04-15 20:43:03.851248] I >> [dht-rebalance.c:1614:gf_defrag_status_get] 0-glusterfs: Files migrated: >> 1629, size: 1582329065954, lookups: 11036, failures: 561 >> > [2013-04-15 20:43:03.887634] W [glusterfsd.c:831:cleanup_and_exit] >> (-->/lib64/libc.so.6(clone+0x6d) [0x3bd16e767d] >> (-->/lib64/libpthread.so.0() [0x3bd1a07851] >> (-->/usr/sbin/glusterfs(glusterfs_sigwaiter+0xdd) [0x405c9d]))) 0-: >> received signum (15), shutting down >> > [2013-04-15 20:43:03.887878] E >> [rpcsvc.c:1155:rpcsvc_program_unregister_portmap] 0-rpc-service: Could n= ot >> unregister with portmap >> > >> >> We'll take a look, thanks. >> >> Going forward, could I ask that you take a few minutes to batch up the >> information, rather than sending several emails in a row? It makes it m= uch >> harder to collect the information when it's spread across so many emails= . >> >> Thanks, >> -Eric >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee72fa16c04da67d8a1 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable


2013/4/15 =B7=FB=D3=C0=CC=CE <= yongtaofu@gmail.co= m>
Hi Eric,
I'm sorry for spaming.
And I got some more info and hope you're interested.
In glusterfs3.3
glusterfsd/src/glusterfsd.c line 1332 there's= an unlink operation.
        if (ctx= ->cmd_args.pid_file) {
            &nb= sp;   unlink (ctx->cmd_args.pid_file);
   &n= bsp;            ctx-= >cmd_args.pid_file =3D NULL;
      &nbs= p; }
Glusterfs try to unlink th= e rebalance pid file after complete and may be this is where the issue happ= ens.
See logs bellow:
1.
<= /div>/var/log/secure indicates I start rebalanc= e on Apr 15 11:58:11
Apr 15 11:58:11 10 sudo:     ro= ot : TTY=3Dpts/2 ; PWD=3D/root ; USER=3Droot ; COMMAND=3D/usr/sbin/gluster = volume rebalance testbug start
2.
After xfs shutdown I got the= following log:

--- xfs_iunlink_remove -- module("= ;xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680"= ).return -- return=3D0x16
vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_a= gino=3D? last_ibp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset= =3D? last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0x113, i_flags =3D 0x0
the inode is lead to xfs shutdown is
0x113
3.
I repa= ir xfs and in lost+foud I find the inode:
[root@10.23.72.93= lost+found]# pwd
/mnt/xfsd/lost+found
[root@10.23.72.93 lost+found]# ls -l 275
---= ------T 1 root root 0 Apr 15 11:58 275
[root@10.23.72.93= lost+found]# stat 275
  File: `275'
  Size: 0 &nb= sp;            = Blocks: 0          IO Block: = 4096   regular empty file
Device: 810h/2064d   =    Inode: 275         Lin= ks: 1
Access: (1000/---------T)  Uid: (    0/  &nbs= p; root)   Gid: (    0/    root)Access: 2013-04-15 11:58:25.833443445 +0800
Modify: 2013-04-15 11:58:25= .912461256 +0800
Change: 2013-04-15 11:58:25.915442091 +0800
<= /div>
This file is created aroud 2013-04-15 11:58.
And the other files in lost+foud has extended attribute but this file do= esn't. Which means it is not part of glusterfs backend files. It should= be the rebalance pid file.

So may be unlink the rebalance= pid file leads to xfs shutdown.

Thank you.

=


2013/4/15 Eric Sandeen <sandeen@sandeen.net>
On 4/15/13 8:45 AM, =B7=FB=D3=C0=CC=CE = wrote:
> And at the same time we got the following error log of glusterfs:
> [2013-04-15 20:43:03.851163] I [dht-rebalance.c:1611:gf_defrag_status_= get] 0-glusterfs: Rebalance is completed
> [2013-04-15 20:43:03.851248] I [dht-rebalance.c:1614:gf_defrag_status_= get] 0-glusterfs: Files migrated: 1629, size: 1582329065954, lookups: 11036= , failures: 561
> [2013-04-15 20:43:03.887634] W [glusterfsd.c:831:cleanup_and_exit] (--= >/lib64/libc.so.6(clone+0x6d) [0x3bd16e767d] (-->/lib64/libpthread.so= .0() [0x3bd1a07851] (-->/usr/sbin/glusterfs(glusterfs_sigwaiter+0xdd) [0= x405c9d]))) 0-: received signum (15), shutting down
> [2013-04-15 20:43:03.887878] E [rpcsvc.c:1155:rpcsvc_program_unregiste= r_portmap] 0-rpc-service: Could not unregister with portmap
>

We'll take a look, thanks.

Going forward, could I ask that you take a few minutes to batch up the info= rmation, rather than sending several emails in a row?  It makes it muc= h harder to collect the information when it's spread across so many ema= ils.

Thanks,
-Eric




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--14dae9340ee72fa16c04da67d8a1-- From debbugs@buxtehude.debian.org Mon Apr 15 10:27:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3743A7F4C for ; Mon, 15 Apr 2013 10:27:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B9D86AC007 for ; Mon, 15 Apr 2013 08:27:08 -0700 (PDT) X-ASG-Debug-ID: 1366039627-04bdf02d1d2092d0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id t0IigCZZNBMDGC1C (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 15 Apr 2013 08:27:07 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.80) (envelope-from ) id 1URlJC-0001Zi-32; Mon, 15 Apr 2013 15:27:06 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Reply-To: James Carter , 705483@bugs.debian.org X-ASG-Orig-Subj: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Resent-From: James Carter Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Mon, 15 Apr 2013 15:27:02 +0000 Resent-Message-ID: X-Debian-PR-Message: report 705483 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by submit@bugs.debian.org id=B.13660395475485 (code B); Mon, 15 Apr 2013 15:27:02 +0000 Received: (at submit) by bugs.debian.org; 15 Apr 2013 15:25:47 +0000 Received: from statler.bytemark.co.uk ([212.110.162.18]) by buxtehude.debian.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1URlHv-0001Pw-Kp for submit@bugs.debian.org; Mon, 15 Apr 2013 15:25:47 +0000 Received: from eboracum.office.bytemark.co.uk ([2001:41c8:0:80:59:10:a8:98]) by statler.bytemark.co.uk with esmtp (Exim 4.72) (envelope-from ) id 1URkgI-0002de-7S for submit@bugs.debian.org; Mon, 15 Apr 2013 15:46:54 +0100 Message-ID: <516C12DB.3060806@bytemark.co.uk> Date: Mon, 15 Apr 2013 15:46:51 +0100 From: James Carter User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.11) Gecko/20121127 Icedove/10.0.11 MIME-Version: 1.0 To: submit@bugs.debian.org Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Greylist: delayed 2333 seconds by postgrey-1.34 at buxtehude; Mon, 15 Apr 2013 15:25:47 UTC Delivered-To: submit@bugs.debian.org Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1366039627 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128202 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Subject: xfsprogs: xfs_quota misinterprets usernames with leading digits Package: xfsprogs Version: 3.1.4 Severity: normal *** Please type your report below this line *** xfs_quota interprets usernames with leading digits as a numeric UID so, for example: # xfs_quota -c 'quota -h -u 2000ad' /store Disk quotas for User test (2000) Filesystem Blocks Quota Limit Warn/Time Mounted on /dev/sdb1 12K 1G 1G 00 [------] /store This is returning quota information for the user "test" (UID 2000), rather than the user "2000ad". -- System Information: Debian Release: 6.0.7 APT prefers stable APT policy: (500, 'stable') Architecture: amd64 (x86_64) Kernel: Linux 3.2.0-0.bpo.4-amd64 (SMP w/12 CPU cores) Locale: LANG=en_GB, LC_CTYPE=en_GB (charmap=UTF-8) (ignored: LC_ALL set to en_GB.UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages xfsprogs depends on: ii libblkid1 2.17.2-9 block device id library ii libc6 2.11.3-4 Embedded GNU C Library: Shared lib ii libreadline5 5.2-7 GNU readline and history libraries ii libuuid1 2.17.2-9 Universally Unique ID library xfsprogs recommends no packages. Versions of packages xfsprogs suggests: pn acl (no description available) pn attr (no description available) pn quota (no description available) pn xfsdump (no description available) -- no debconf information -- James Carter Bytemark Hosting http://www.bytemark.co.uk/ tel: +44 (0) 1904 890 890 From debbugs@buxtehude.debian.org Mon Apr 15 11:21:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5B6FF7F4C for ; Mon, 15 Apr 2013 11:21:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id CF87FAC006 for ; Mon, 15 Apr 2013 09:21:06 -0700 (PDT) X-ASG-Debug-ID: 1366042865-04cb6c2c1c2156a0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id UDpM4MrQb2jPWHu9 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 15 Apr 2013 09:21:05 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.80) (envelope-from ) id 1URm9Q-0008LE-9u; Mon, 15 Apr 2013 16:21:04 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Reply-To: Rich Johnston , 705483@bugs.debian.org X-ASG-Orig-Subj: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Resent-From: Rich Johnston Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Mon, 15 Apr 2013 16:21:01 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 705483 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by submit@bugs.debian.org id=B.136604263930074 (code B); Mon, 15 Apr 2013 16:21:01 +0000 Received: (at submit) by bugs.debian.org; 15 Apr 2013 16:17:19 +0000 Received: from relay3.sgi.com ([192.48.152.1] helo=relay.sgi.com) by buxtehude.debian.org with esmtp (Exim 4.80) (envelope-from ) id 1URm5n-0007of-Mt; Mon, 15 Apr 2013 16:17:19 +0000 Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9023EAC006; Mon, 15 Apr 2013 09:07:09 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 15 Apr 2013 11:07:08 -0500 Message-ID: <516C25AC.60506@sgi.com> Date: Mon, 15 Apr 2013 11:07:08 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: James Carter , <705483@bugs.debian.org> CC: References: <516C12DB.3060806@bytemark.co.uk> In-Reply-To: <516C12DB.3060806@bytemark.co.uk> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [128.162.233.55] X-Greylist: delayed 603 seconds by postgrey-1.34 at buxtehude; Mon, 15 Apr 2013 16:17:19 UTC Delivered-To: submit@bugs.debian.org Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1366042865 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128206 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/15/2013 09:46 AM, James Carter wrote: > Subject: xfsprogs: xfs_quota misinterprets usernames with leading digits > Package: xfsprogs > Version: 3.1.4 > Severity: normal > > *** Please type your report below this line *** > > xfs_quota interprets usernames with leading digits as a numeric UID so, > for example: > > # xfs_quota -c 'quota -h -u 2000ad' /store > Disk quotas for User test (2000) > Filesystem Blocks Quota Limit Warn/Time Mounted on > /dev/sdb1 12K 1G 1G 00 [------] /store > > This is returning quota information for the user "test" (UID 2000), rather > than the user "2000ad". > I don't think this is a bug, username must begin with a character (unless you created the user using NIS or adduser --force-badname). # Default from /etc/adduser.conf # check user and group names also against this regular expression. #NAME_REGEX="^[a-z][-a-z0-9_]*\$" From adduser man page: --force-badname By default, user and group names are checked against the config†urable regular expression NAME_REGEX (or NAME_REGEX_SYSTEM if --system is specified) specified in the configuration file. This option forces adduser and addgroup to apply only a weak check for validity of the name. Thanks --Rich From debbugs@buxtehude.debian.org Mon Apr 15 11:21:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5C77F7F4C for ; Mon, 15 Apr 2013 11:21:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3BDBE8F8066 for ; Mon, 15 Apr 2013 09:21:15 -0700 (PDT) X-ASG-Debug-ID: 1366042873-04cb6c2c1c2156d0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id DcJENWivHMNFfTfK (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 15 Apr 2013 09:21:14 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.80) (envelope-from ) id 1URm9X-0008MD-HL; Mon, 15 Apr 2013 16:21:11 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Reply-To: Rich Johnston , 705483@bugs.debian.org X-ASG-Orig-Subj: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Resent-From: Rich Johnston Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Mon, 15 Apr 2013 16:21:09 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 705483 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by 705483-submit@bugs.debian.org id=B705483.136604263930083 (code B ref 705483); Mon, 15 Apr 2013 16:21:09 +0000 Received: (at 705483) by bugs.debian.org; 15 Apr 2013 16:17:19 +0000 Received: from relay3.sgi.com ([192.48.152.1] helo=relay.sgi.com) by buxtehude.debian.org with esmtp (Exim 4.80) (envelope-from ) id 1URm5n-0007of-Mt; Mon, 15 Apr 2013 16:17:19 +0000 Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9023EAC006; Mon, 15 Apr 2013 09:07:09 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 15 Apr 2013 11:07:08 -0500 Message-ID: <516C25AC.60506@sgi.com> Date: Mon, 15 Apr 2013 11:07:08 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: James Carter , <705483@bugs.debian.org> CC: References: <516C12DB.3060806@bytemark.co.uk> In-Reply-To: <516C12DB.3060806@bytemark.co.uk> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [128.162.233.55] X-Greylist: delayed 603 seconds by postgrey-1.34 at buxtehude; Mon, 15 Apr 2013 16:17:19 UTC X-CrossAssassin-Score: 2 Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1366042874 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128206 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/15/2013 09:46 AM, James Carter wrote: > Subject: xfsprogs: xfs_quota misinterprets usernames with leading digits > Package: xfsprogs > Version: 3.1.4 > Severity: normal > > *** Please type your report below this line *** > > xfs_quota interprets usernames with leading digits as a numeric UID so, > for example: > > # xfs_quota -c 'quota -h -u 2000ad' /store > Disk quotas for User test (2000) > Filesystem Blocks Quota Limit Warn/Time Mounted on > /dev/sdb1 12K 1G 1G 00 [------] /store > > This is returning quota information for the user "test" (UID 2000), rather > than the user "2000ad". > I don't think this is a bug, username must begin with a character (unless you created the user using NIS or adduser --force-badname). # Default from /etc/adduser.conf # check user and group names also against this regular expression. #NAME_REGEX="^[a-z][-a-z0-9_]*\$" From adduser man page: --force-badname By default, user and group names are checked against the config†urable regular expression NAME_REGEX (or NAME_REGEX_SYSTEM if --system is specified) specified in the configuration file. This option forces adduser and addgroup to apply only a weak check for validity of the name. Thanks --Rich From sandeen@redhat.com Mon Apr 15 14:34:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E6C627F4C for ; Mon, 15 Apr 2013 14:34:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C69198F8073 for ; Mon, 15 Apr 2013 12:34:38 -0700 (PDT) X-ASG-Debug-ID: 1366054477-04cb6c2c1c225af0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Sv8HpuqPT1FoNzJq; Mon, 15 Apr 2013 12:34:38 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3FJYaqO022135 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 15 Apr 2013 15:34:36 -0400 Received: from Liberator-563.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r3FJYXBb002585 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 15 Apr 2013 15:34:34 -0400 Message-ID: <516C564A.7000709@redhat.com> Date: Mon, 15 Apr 2013 14:34:34 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Brian Foster , Ben Myers , "xfs@oss.sgi.com" Subject: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 References: <516798AE.9050908@sandeen.net> <516800F7.80502@redhat.com> <516C0752.8070007@sandeen.net> X-ASG-Orig-Subj: Re: need help how to debug xfs crash issue xfs_iunlink_remove: xfs_inotobp() returned error 22 In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366054477 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 4/15/13 9:21 AM, 符永涛 wrote: > Hi Eric, > I'm sorry for spaming. > And I got some more info and hope you're interested. We are interested; TBH, Brian and I are spending more time on this one because we have a mutual interest in fixing it for someone who helps pay our salaries. We really appreciate your willingness to test & debug, since we've been unable to reproduce this locally so far, so as long as you're willing to try new things we're willing to keep suggesting them. :) I'm going to take some time to try to digest the new information, and Brian or I will let you know if we have more things to try. Thanks, -Eric > In glusterfs3.3 > glusterfsd/src/glusterfsd.c line 1332 there's an unlink operation. > if (ctx->cmd_args.pid_file) { > unlink (ctx->cmd_args.pid_file); > ctx->cmd_args.pid_file = NULL; > } > Glusterfs try to unlink the rebalance pid file after complete and may be this is where the issue happens. > See logs bellow: > 1. > /var/log/secure indicates I start rebalance on Apr 15 11:58:11 > Apr 15 11:58:11 10 sudo: root : TTY=pts/2 ; PWD=/root ; USER=root ; COMMAND=/usr/sbin/gluster volume rebalance testbug start > 2. > After xfs shutdown I got the following log: > --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return -- return=0x16 > vars: tp=0xffff881c81797c70 ip=0xffff881003c13c00 next_ino=? mp=? agi=? dip=? agibp=0xffff880109b47e20 ibp=? agno=? agino=? next_agino=? last_ibp=? last_dip=0xffff882000000000 bucket_index=? offset=? last_offset=0xffffffffffff8810 error=? __func__=[...] > ip: i_ino = 0x113, i_flags = 0x0 > the inode is lead to xfs shutdown is > 0x113 > 3. > I repair xfs and in lost+foud I find the inode: > [root@10.23.72.93 lost+found]# pwd > /mnt/xfsd/lost+found > [root@10.23.72.93 lost+found]# ls -l 275 > ---------T 1 root root 0 Apr 15 11:58 275 > [root@10.23.72.93 lost+found]# stat 275 > File: `275' > Size: 0 Blocks: 0 IO Block: 4096 regular empty file > Device: 810h/2064d Inode: 275 Links: 1 > Access: (1000/---------T) Uid: ( 0/ root) Gid: ( 0/ root) > Access: 2013-04-15 11:58:25.833443445 +0800 > Modify: 2013-04-15 11:58:25.912461256 +0800 > Change: 2013-04-15 11:58:25.915442091 +0800 > This file is created aroud 2013-04-15 11:58. > And the other files in lost+foud has extended attribute but this file doesn't. Which means it is not part of glusterfs backend files. It should be the rebalance pid file. > > So may be unlink the rebalance pid file leads to xfs shutdown. > > Thank you. > > > > 2013/4/15 Eric Sandeen > > > On 4/15/13 8:45 AM, 符永涛 wrote: > > And at the same time we got the following error log of glusterfs: > > [2013-04-15 20:43:03.851163] I [dht-rebalance.c:1611:gf_defrag_status_get] 0-glusterfs: Rebalance is completed > > [2013-04-15 20:43:03.851248] I [dht-rebalance.c:1614:gf_defrag_status_get] 0-glusterfs: Files migrated: 1629, size: 1582329065954, lookups: 11036, failures: 561 > > [2013-04-15 20:43:03.887634] W [glusterfsd.c:831:cleanup_and_exit] (-->/lib64/libc.so.6(clone+0x6d) [0x3bd16e767d] (-->/lib64/libpthread.so.0() [0x3bd1a07851] (-->/usr/sbin/glusterfs(glusterfs_sigwaiter+0xdd) [0x405c9d]))) 0-: received signum (15), shutting down > > [2013-04-15 20:43:03.887878] E [rpcsvc.c:1155:rpcsvc_program_unregister_portmap] 0-rpc-service: Could not unregister with portmap > > > > We'll take a look, thanks. > > Going forward, could I ask that you take a few minutes to batch up the information, rather than sending several emails in a row? It makes it much harder to collect the information when it's spread across so many emails. > > Thanks, > -Eric > > > > > -- > 符永涛 > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From kdhall@binghamton.edu Mon Apr 15 15:35:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1F8EB7F4C for ; Mon, 15 Apr 2013 15:35:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E4F8F304048 for ; Mon, 15 Apr 2013 13:35:43 -0700 (PDT) X-ASG-Debug-ID: 1366058141-04bdf02d1d221cd0001-NocioJ Received: from mail-vc0-f170.google.com (mail-vc0-f170.google.com [209.85.220.170]) by cuda.sgi.com with ESMTP id jVX24ZzaFVD6dpTi (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 15 Apr 2013 13:35:42 -0700 (PDT) X-Barracuda-Envelope-From: kdhall@binghamton.edu X-Barracuda-Apparent-Source-IP: 209.85.220.170 Received: by mail-vc0-f170.google.com with SMTP id lf10so4325449vcb.1 for ; Mon, 15 Apr 2013 13:35:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding:x-gm-message-state; bh=c41aPdsMFEZxedUIo5+o1UeKh07f9Ymb44j3IJLG7cU=; b=aSw71K8tz4vLe9SAl8uBCoulmP+8gMcIbtAViYmCARg9VlfX7YVLPDpU6lEMfOKD07 3IoekbzzVUK+WvkCSOE0S2rBc7DJIRHtlx7GhnbWRMONQb9844kLy7cZ/qDFI4rxfb9L m+PuI5vphhBQvnLY/8mH2dJOF2n34P/I9Z03viyqz1eYzAW9J8HzJiQ9lh9mBZx78l9t sTzQkKNNDfw4LJXjx+XX7BKrI0Q4j7RySXDr/LNXnIOM+5mtlAsf68rDkTzb6fBBG1ab f8pJUWa2GGjBaVP9vhR9CV7j2OKT+ZD0NfGHNjd7YKG2fYfxChXnZoeVLK6sRCn2g2dB crtA== X-Received: by 10.52.174.196 with SMTP id bu4mr1574549vdc.117.1366058141284; Mon, 15 Apr 2013 13:35:41 -0700 (PDT) Received: from [128.226.118.196] (omega.cs.binghamton.edu. [128.226.118.196]) by mx.google.com with ESMTPS id d16sm2421157vdh.11.2013.04.15.13.35.39 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 15 Apr 2013 13:35:40 -0700 (PDT) Message-ID: <516C649A.8010003@binghamton.edu> Date: Mon, 15 Apr 2013 16:35:38 -0400 From: Dave Hall User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20121215 Icedove/3.0.11 MIME-Version: 1.0 To: stan@hardwarefreak.com CC: "xfs@oss.sgi.com" , Dave Chinner Subject: Re: xfs_fsr, sunit, and swidth References: <5141C1FC.4060209@hardwarefreak.com> <5141C8C1.2080903@hardwarefreak.com> <5141E5CF.10101@binghamton.edu> <5142AE40.6040408@hardwarefreak.com> <20130315114538.GF6369@dastard> <5143F94C.1020708@hardwarefreak.com> <20130316072126.GG6369@dastard> <515082C3.2000006@binghamton.edu> <515361B5.8050603@hardwarefreak.com> <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> <515C3BF3.60601@binghamton.edu> <51684382.50008@binghamton.edu> <5168AC0B.5010100@hardwarefreak.com> X-ASG-Orig-Subj: Re: xfs_fsr, sunit, and swidth In-Reply-To: <5168AC0B.5010100@hardwarefreak.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Gm-Message-State: ALoCoQllDw2OKwT90uJ41WyjZBjQ9jck0s1GqvVVmYn4XFKHw0YW8Nc7zop3zq7u/JKZ6/OmDWEN X-Barracuda-Connect: mail-vc0-f170.google.com[209.85.220.170] X-Barracuda-Start-Time: 1366058142 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Stan, I understand that this will be an ongoing problem. It seems like all I could do at this point would be to ' manually defrag' my inodes the hard way by doing this 'copy' operation whenever things slow down. (Either that or go get my PHD in file systems and try to come up with a better inode management algorithm.) I will be keeping two copies of this data going forward anyways. Are there any other suggestions you might have at this time - xfs or otherwise? -Dave Dave Hall Binghamton University kdhall@binghamton.edu 607-760-2328 (Cell) 607-777-4641 (Office) On 04/12/2013 08:51 PM, Stan Hoeppner wrote: > On 4/12/2013 12:25 PM, Dave Hall wrote: > >> Stan, >> >> IDid this post get lost in the shuffle? Looking at it I think it could >> have been a bit unclear. What I need to do anyways is have a second, >> off-site copy of my backup data. So I'm going to be building a second >> array. In copying, in order to preserve the hard link structure of the >> source array I'd have to run a sequence of cp -al / rsync calls that >> would mimic what rsnapshot did to get me to where I am right now. (Note >> that I could also potentially use rsync --link-dest.) >> >> So the question is how would the target xfs file system fare as far as >> my inode fragmentation situation is concerned? I'm hoping that since >> the target would be a fresh file system, and since during the 'copy' >> phase I'd only be adding inodes, that the inode allocation would be more >> compact and orderly than what I have on the source array since. What do >> you think? >> > The question isn't what it will look like initially, as your inodes > shouldn't be sparsely allocated as with your current aged filesystem. > > The question is how quickly the problem will arise on the new filesystem > as you free inodes. I don't have the answer to that question. There's > no way to predict this that I know of. > > From shtuchka77777@thingsfromheaven.com Mon Apr 15 17:35:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3A1987F4C for ; Mon, 15 Apr 2013 17:35:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id F0E918F8071 for ; Mon, 15 Apr 2013 15:35:24 -0700 (PDT) X-ASG-Debug-ID: 1366065322-04bdf02d20229c20001-NocioJ Received: from debian.50.lenny.32.minimal (static.85-10-194-109.clients.your-server.de [85.10.194.109]) by cuda.sgi.com with ESMTP id oW0kCfn0YooY2DjD for ; Mon, 15 Apr 2013 15:35:23 -0700 (PDT) X-Barracuda-Envelope-From: shtuchka77777@thingsfromheaven.com X-Barracuda-Apparent-Source-IP: 85.10.194.109 Received: from Unknown (unknown [5.39.15.248]) by debian.50.lenny.32.minimal (Postfix) with ESMTPA id 484EF43A27F; Tue, 16 Apr 2013 02:35:21 +0400 (MSD) Message-ID: Reply-To: =?windows-1251?B?yu7s6PLl8iDj7vHz5ODw8fLi5e3t7uPuIOfg?= =?windows-1251?B?6uDn4A==?= From: =?windows-1251?B?yu7s6PLl8iDj7vHz5ODw8fLi5e3t7uPuIOfg?= =?windows-1251?B?6uDn4A==?= To: , , , , Subject: =?windows-1251?B?1MrRIOgg1MctOTQ=?= Date: Tue, 16 Apr 2013 00:35:05 +0200 X-ASG-Orig-Subj: =?windows-1251?B?1MrRIOgg1MctOTQ=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_08E6_01CE3A3A.3DC44470" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Barracuda-Connect: static.85-10-194-109.clients.your-server.de[85.10.194.109] X-Barracuda-Start-Time: 1366065322 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128230 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_08E6_01CE3A3A.3DC44470 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D3=E2=E0=E6=E0=E5=EC=FB=E5 =EA=EE=EB=EB=E5=E3=E8! =C7=E0=EA=EE=ED =EE =D4=CA=D1 =E2=F1=F2=F3=EF=E0=E5=F2 =E2 =F1=E8=EB=F3 =F1= l =FF=ED=E2=E0=F0=FF 2OI4 =E3=EE=E4=E0. =D3=C6=C5 =D1=C5=C9=D7=C0=D1 =C2=DB =CC=CE=C6=C5=D2=C5 =D3=C7=CD=C0=D2=DC= : - =CE=F1=ED=EE=E2=ED=FB=E5 =EF=F0=E8=ED=F6=E8=EF=FB =ED=EE=E2=EE=E3=EE =E7= =E0=EA=EE=ED=E0 "=CE =F4=E5=E4=E5=F0=E0=EB=FC=ED=EE=E9 =EA=EE=ED=F2=F0=E0= =EA=F2=ED=EE=E9 =F1=E8=F1=F2=E5=EC=E5". - =D1=F4=E5=F0=E0 =EF=F0=E8=EC=E5=ED=E5=ED=E8=FF, =F1=F3=E1=FA=E5=EA=F2=FB= =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF =D4=CA=D1. - =D1=F2=E8=EC=F3=EB=FF=F6=E8=FF =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB= =F5 =E7=E0=EA=E0=E7=F7=E8=EA=EE=E2 =E8 =E7=E0=EA=F3=EF=F9=E8=EA=EE=E2. - =CF=EB=E0=ED=FB =E7=E0=EA=F3=EF=EE=EA =F2=EE=E2=E0=F0=EE=E2, =F0=E0=E1=EE= =F2, =F3=F1=EB=F3=E3. - =D1=EF=EE=F1=EE=E1=FB =EE=F1=F3=F9=E5=F1=F2=E2=EB=E5=ED=E8=FF =E7=E0=EA= =F3=EF=EE=EA =EF=EE =D4=CA=D1. - =CD=EE=E2=EE=E5 =E2 =EF=F0=EE=F6=E5=E4=F3=F0=E0=F5 =EF=EE =F1=F0=E0=E2=ED= =E5=ED=E8=FE =F1 94-=D4=C7. - =CF=EE=F0=FF=E4=EE=EA =F0=E0=E1=EE=F2=FB =E7=E0=EA=E0=E7=F7=E8=EA=E0 =E8= =F3=F7=E0=F1=F2=ED=E8=EA=E0 =EF=EE =ED=EE=E2=FB=EC =EF=F0=E0=E2=E8=EB=E0= =EC. - =CF=EE=F0=FF=E4=EE=EA, =F1=F2=F0=F3=EA=F2=F3=F0=E0 =EA=EE=ED=EA=F3=F0=F1= =ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8. =DD=EB=E5=EA=F2=F0=EE=ED=ED= =FB=E9 =E0=F3=EA=F6=E8=EE=ED. - =C7=E0=EF=F0=EE=F1 =EF=F0=E5=E4=EB=EE=E6=E5=ED=E8=E9. =D3=F1=EB=EE=E2=E8= =FF =E8 =F1=F5=E5=EC=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF. - =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =E7=E0=EA=EB=FE=F7=E5=ED=E8=FF (=F0=E0= =F1=F2=EE=F0=E6=E5=ED=E8=FF) =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=F5= =EA=EE=ED=F2=F0=E0=EA=F2=EE. - =CF=EE=F0=FF=E4=EE=EA =EF=F0=E8=E5=EC=EA=E8 =F2=EE=E2=E0=F0=EE=E2, =F0=E0= =E1=EE=F2 =E8 =F3=F1=EB=F3=E3. =C0=F3=E4=E8=F2. =CD=E0=E4=E7=EE=F0 =E8 =EA= =EE=ED=F2=F0=EE=EB=FC. > =D4=C5=C4=C5=D0=C0=CB=DC=CD=C0=DF =CA=CE=CD=D2=D0=C0=CA=D2=CD=C0=DF =D1= =C8=D1=D2=C5=CC=C0=20 > =C2 =D1=D4=C5=D0=C5 =C7=C0=CA=D3=CF=CE=CA =D2=CE=C2=C0=D0=CE=C2, =D0=C0= =C1=CE=D2 =C8 =D3=D1=CB=D3=C3, =CE=D2=CB=C8=D7=C8=DF =CE=D2 9=D7-=D4=C7.=20 > =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =EF=E5=F0=E5=F5=EE=E4=ED=EE=E3=EE =EF= =E5=F0=E8=EE=E4=E0, =ED=EE=E2=FB=E5 =E7=E0=EA=F3=EF=EE=F7=ED=FB=E5 =EF=F0= =EE=F6=E5=E4=F3=F0=FB. > 2O =EC=E0=FF 20l=C7, =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3 > =C2=C5=C4=D3=D9=C8=C9 =CA=D3=D0=D1=C0 =D1=E5=F0=F2=E8=F4=E8=F6=E8=F0=EE=E2=E0=ED=ED=FB=E9 =F1=EF=E5=F6=E8=E0=EB= =E8=F1=F2 =EF=EE =EA=F3=F0=F1=F3 "=D3=EF=F0=E0=E2=EB=E5=ED=E8=E5 =E3=EE=F1= =F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=EC=E8 =E8 =EC=F3=ED=E8=F6=E8=EF=E0=EB=FC= =ED=FB=EC=E8 =E7=E0=EA=E0=E7=E0=EC=E8", =FD=EA=F1=EF=E5=F0=F2 =EF=EE =EA=EE= =ED=EA=F3=F0=E5=ED=F2=ED=FB=EC =F2=EE=F0=E3=E0=EC =E2 =D1=E0=ED=EA=F2-=CF= =E5=F2=E5=F0=E1=F3=F0=E3=E5, =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FC =E8=ED=F4= =EE=F0=EC=E0=F6=E8=EE=ED=ED=EE-=EF=F0=E0=E2=EE=E2=EE=E3=EE =EA=EE=ED=F1=E0= =EB=F2=E8=ED=E3=EE=E2=EE=E3=EE =F6=E5=ED=F2=F0=E0.=20 =CF=CE=C4=D0=CE=C1=CD=C0=DF =CF=D0=CE=C3=D0=C0=CC=CC=C0 =C2=DB=D1=DB=CB=C0= =C5=D2=D1=DF =CF=CE =C7=C0=CF=D0=CE=D1=D3. =CF=CE =C2=CE=CF=D0=CE=D1=C0=CC =D3=D7=C0=D1=D2=C8=DF =C8 =D0=C5=C3=C8=D1= =D2=D0=C0=D6=C8=C8 =CE=C1=D0=C0=D9=C0=C9=D2=C5=D1=DC =CF=CE =D2=C5=CB=C5=D4= =CE=CD=D3: > +7 [ =EA=EE=E4_=D1=CF=E1 ] 64.2 __ 47 .. 6.8 =20 =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC, =C4=EE=E2=EB=E0=F2=EE=E2=E0 =C8=F0=E8=ED=E0 =C0=EB=E5=EA=F1=E0=ED=E4=F0=EE= =E2=ED=E0 =EC=E5=ED=E5=E4=E6=E5=F0 =F6=E5=ED=F2=F0=E0 =EE=E1=F3=F7=E5=ED=E8=FF ------=_NextPart_000_08E6_01CE3A3A.3DC44470 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=D3=E2=E0=E6=E0=E5=EC=FB=E5 =EA=EE=EB=EB=E5=E3=E8!
 
=C7=E0=EA=EE=ED =EE =D4=CA=D1 =E2=F1=F2=F3=EF=E0=E5=F2 =E2 =F1=E8=EB= =F3 =F1 l =FF=ED=E2=E0=F0=FF=20 2OI4 =E3=EE=E4=E0.
 
=D3=C6=C5 =D1=C5=C9=D7=C0=D1 =C2=DB =CC=CE=C6=C5=D2=C5 =D3=C7=CD=C0=D2= =DC:
 
- =CE=F1=ED=EE=E2=ED=FB=E5 =EF=F0=E8=ED=F6=E8=EF=FB =ED=EE=E2=EE=E3=EE= =E7=E0=EA=EE=ED=E0 "=CE =F4=E5=E4=E5=F0=E0=EB=FC=ED=EE=E9 =EA=EE=ED=F2=F0= =E0=EA=F2=ED=EE=E9 =F1=E8=F1=F2=E5=EC=E5".
-=20 =D1=F4=E5=F0=E0 =EF=F0=E8=EC=E5=ED=E5=ED=E8=FF, =F1=F3=E1=FA=E5=EA=F2=FB = =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF =D4=CA=D1.
- =D1=F2=E8=EC=F3=EB= =FF=F6=E8=FF =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=F5=20 =E7=E0=EA=E0=E7=F7=E8=EA=EE=E2 =E8 =E7=E0=EA=F3=EF=F9=E8=EA=EE=E2.
- =CF= =EB=E0=ED=FB =E7=E0=EA=F3=EF=EE=EA =F2=EE=E2=E0=F0=EE=E2, =F0=E0=E1=EE=F2= , =F3=F1=EB=F3=E3.
- =D1=EF=EE=F1=EE=E1=FB=20 =EE=F1=F3=F9=E5=F1=F2=E2=EB=E5=ED=E8=FF =E7=E0=EA=F3=EF=EE=EA =EF=EE =D4=CA= =D1.
- =CD=EE=E2=EE=E5 =E2 =EF=F0=EE=F6=E5=E4=F3=F0=E0=F5 =EF=EE =F1=F0= =E0=E2=ED=E5=ED=E8=FE =F1 94-=D4=C7.
-=20 =CF=EE=F0=FF=E4=EE=EA =F0=E0=E1=EE=F2=FB =E7=E0=EA=E0=E7=F7=E8=EA=E0 =E8 = =F3=F7=E0=F1=F2=ED=E8=EA=E0 =EF=EE =ED=EE=E2=FB=EC =EF=F0=E0=E2=E8=EB=E0=EC= .
- =CF=EE=F0=FF=E4=EE=EA, =F1=F2=F0=F3=EA=F2=F3=F0=E0=20 =EA=EE=ED=EA=F3=F0=F1=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8. =DD=EB= =E5=EA=F2=F0=EE=ED=ED=FB=E9 =E0=F3=EA=F6=E8=EE=ED.
- =C7=E0=EF=F0=EE=F1= =EF=F0=E5=E4=EB=EE=E6=E5=ED=E8=E9. =D3=F1=EB=EE=E2=E8=FF =E8=20 =F1=F5=E5=EC=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF.
- =CE=F1=EE=E1=E5=ED=ED= =EE=F1=F2=E8 =E7=E0=EA=EB=FE=F7=E5=ED=E8=FF (=F0=E0=F1=F2=EE=F0=E6=E5=ED=E8= =FF) =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=F5=20 =EA=EE=ED=F2=F0=E0=EA=F2=EE.
- =CF=EE=F0=FF=E4=EE=EA =EF=F0=E8=E5=EC=EA= =E8 =F2=EE=E2=E0=F0=EE=E2, =F0=E0=E1=EE=F2 =E8 =F3=F1=EB=F3=E3. =C0=F3=E4= =E8=F2. =CD=E0=E4=E7=EE=F0 =E8=20 =EA=EE=ED=F2=F0=EE=EB=FC.
 

> =D4=C5=C4=C5=D0=C0=CB=DC=CD=C0=DF =CA=CE=CD=D2=D0=C0=CA=D2=CD= =C0=DF =D1=C8=D1=D2=C5=CC=C0
> =C2 =D1=D4=C5=D0=C5 =C7=C0=CA=D3=CF= =CE=CA =D2=CE=C2=C0=D0=CE=C2,=20 =D0=C0=C1=CE=D2 =C8 =D3=D1=CB=D3=C3, =CE=D2=CB=C8=D7=C8=DF =CE=D2 9=D7-=D4= =C7.
> =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8=20 =EF=E5=F0=E5=F5=EE=E4=ED=EE=E3=EE =EF=E5=F0=E8=EE=E4=E0, =ED=EE=E2=FB=E5 = =E7=E0=EA=F3=EF=EE=F7=ED=FB=E5 =EF=F0=EE=F6=E5=E4=F3=F0=FB.
 
> 2O =EC=E0=FF=20 20l=C7,=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
 

> =C2=C5=C4=D3=D9=C8=C9 =CA=D3=D0=D1=C0
=D1=E5=F0=F2=E8=F4= =E8=F6=E8=F0=EE=E2=E0=ED=ED=FB=E9 =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2 =EF=EE =EA= =F3=F0=F1=F3 "=D3=EF=F0=E0=E2=EB=E5=ED=E8=E5=20 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=EC=E8 =E8 =EC=F3=ED=E8=F6=E8=EF= =E0=EB=FC=ED=FB=EC=E8 =E7=E0=EA=E0=E7=E0=EC=E8", =FD=EA=F1=EF=E5=F0=F2 =EF= =EE =EA=EE=ED=EA=F3=F0=E5=ED=F2=ED=FB=EC =F2=EE=F0=E3=E0=EC =E2=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5, =F0=F3=EA=EE=E2=EE=E4=E8=F2= =E5=EB=FC =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE-=EF=F0=E0=E2=EE=E2=EE=E3= =EE =EA=EE=ED=F1=E0=EB=F2=E8=ED=E3=EE=E2=EE=E3=EE =F6=E5=ED=F2=F0=E0.=20
 

=CF=CE=C4=D0=CE=C1=CD=C0=DF =CF=D0=CE=C3=D0=C0=CC=CC=C0 =C2=DB=D1= =DB=CB=C0=C5=D2=D1=DF =CF=CE =C7=C0=CF=D0=CE=D1=D3.
 
=CF=CE =C2=CE=CF=D0=CE=D1=C0=CC =D3=D7=C0=D1=D2=C8=DF =C8 =D0=C5=C3=C8= =D1=D2=D0=C0=D6=C8=C8 =CE=C1=D0=C0=D9=C0=C9=D2=C5=D1=DC =CF=CE =D2=C5=CB=C5= =D4=CE=CD=D3:
>=20 +7 [ =EA=EE=E4_=D1=CF=E1 ] 64.2 __ 47 .. 6.8

=D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC,
=C4=EE=E2=EB=E0=F2=EE=E2=E0 = =C8=F0=E8=ED=E0 =C0=EB=E5=EA=F1=E0=ED=E4=F0=EE=E2=ED=E0
=EC=E5=ED=E5=E4= =E6=E5=F0 =F6=E5=ED=F2=F0=E0=20 =EE=E1=F3=F7=E5=ED=E8=FF
------=_NextPart_000_08E6_01CE3A3A.3DC44470-- From bfoster@redhat.com Mon Apr 15 18:17:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 176F67F4C for ; Mon, 15 Apr 2013 18:17:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 05E79304039 for ; Mon, 15 Apr 2013 16:17:20 -0700 (PDT) X-ASG-Debug-ID: 1366067836-04cbb057f6229220001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QNrBpjHVuJfZan6C for ; Mon, 15 Apr 2013 16:17: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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3FNHEbd032292 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 15 Apr 2013 19:17:14 -0400 Received: from laptop.bfoster (vpn-58-37.rdu2.redhat.com [10.10.58.37]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r3FNHDLR014318 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 15 Apr 2013 19:17:14 -0400 Message-ID: <516C89DF.4070904@redhat.com> Date: Mon, 15 Apr 2013 19:14:39 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: yongtaofu@gmail.com CC: sandeen@sandeen.net, xfs@oss.sgi.com Subject: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366067836 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi, Thanks for the data in the previous thread: http://oss.sgi.com/archives/xfs/2013-04/msg00327.html I'm spinning off a new thread specifically for this because the original thread is already too large and scattered to track. As Eric stated, please try to keep data contained in as few messages as possible. The data confirms Dave's theory where we are going off the end of the unlinked list when attempting to remove an inode, pass in NULLAGINO to xfs_inotobp() and the attempted conversion to a global inode number leads to EINVAL. The next question here is why wasn't the inode listed in the probe output on the unlinked inode list? Unfortunately we're probably going to require to start making some debug-level changes to the kernel to make progress on this issue. If you are able to recompile a kernel and/or xfs module (which you referred to doing in the previous thread), could you start with the patch appended to this message[1] and collect the xfs_iunlink and xfs_iunlink_remove tracepoint data the next time the problem occurs? E.g., echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable ... reproduce ... cat /sys/kernel/debug/tracing/trace > trace.output Please also include all data relevant to the crash (in a single mail): trace output, stap script output (so we know what inode to search for in the trace), references to metadump images, etc. Thanks. Brian [1] - Note that the code we're sending here is debug-level and lightly tested. --- fs/xfs/linux-2.6/xfs_trace.h | 2 ++ fs/xfs/xfs_inode.c | 4 ++++ 2 files changed, 6 insertions(+), 0 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index e8ce644..227eb33 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); DEFINE_INODE_EVENT(xfs_destroy_inode); DEFINE_INODE_EVENT(xfs_write_inode); DEFINE_INODE_EVENT(xfs_clear_inode); +DEFINE_INODE_EVENT(xfs_iunlink); +DEFINE_INODE_EVENT(xfs_iunlink_remove); DEFINE_INODE_EVENT(xfs_dquot_dqalloc); DEFINE_INODE_EVENT(xfs_dquot_dqdetach); diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 796edce..a43bec5 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1670,6 +1670,8 @@ xfs_iunlink( (sizeof(xfs_agino_t) * bucket_index); xfs_trans_log_buf(tp, agibp, offset, (offset + sizeof(xfs_agino_t) - 1)); + + trace_xfs_iunlink(ip); return 0; } @@ -1820,6 +1822,8 @@ xfs_iunlink_remove( (offset + sizeof(xfs_agino_t) - 1)); xfs_inobp_check(mp, last_ibp); } + + trace_xfs_iunlink_remove(ip); return 0; } -- 1.7.7.6 From apache@prlnx02.cloudapp.net Mon Apr 15 18:20:47 2013 Return-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=FORGED_YAHOO_RCVD, FREEMAIL_FROM,FREEMAIL_REPLYTO autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 17DF77F4C for ; Mon, 15 Apr 2013 18:20:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A7230AC003 for ; Mon, 15 Apr 2013 16:20:43 -0700 (PDT) X-ASG-Debug-ID: 1366068041-04bdf02d1d22cb70001-w1Z2WR Received: from mail.prlnx02.cloudapp.net ([137.135.130.87]) by cuda.sgi.com with ESMTP id R6KqDEFP47BszEtl for ; Mon, 15 Apr 2013 16:20:42 -0700 (PDT) X-Barracuda-Envelope-From: apache@prlnx02.cloudapp.net X-Barracuda-Apparent-Source-IP: 137.135.130.87 Received: by mail.prlnx02.cloudapp.net (Postfix, from userid 48) id 4E734E3611; Mon, 15 Apr 2013 23:20:41 +0000 (UTC) To: linux-xfs@oss.sgi.com Subject: Offre de financement, X-PHP-Originating-Script: 0:mailer.php X-ASG-Orig-Subj: Offre de financement, From: Gloria Pelletier Reply-To: gloria.pelletier@free.fr MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: <20130415232041.4E734E3611@mail.prlnx02.cloudapp.net> Date: Mon, 15 Apr 2013 23:20:41 +0000 (UTC) X-Barracuda-Connect: UNKNOWN[137.135.130.87] X-Barracuda-Start-Time: 1366068042 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.01 X-Barracuda-Spam-Status: No, SCORE=2.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, FORGED_YAHOO_RCVD, FORGED_YAHOO_RCVD_2, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128234 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 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Bonjour. Vous êtes à la recherche de financement pour relancer vos activités, la réalisation d'un projet ou pour autres raisons. J'octroie des prêts allant de 3000€ à 4.000.000 € à un taux fixe de 3%. Pour plus d'informations, contactez moi : gloria.pelletier@free.fr Cordialement Mme Gloria Pelletier. From shhuiw@gmail.com Mon Apr 15 18:29:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 652AD7F50 for ; Mon, 15 Apr 2013 18:29:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D7BCFAC001 for ; Mon, 15 Apr 2013 16:29:08 -0700 (PDT) X-ASG-Debug-ID: 1366068547-04cbb057f6229ca0001-NocioJ Received: from mail-ie0-f181.google.com (mail-ie0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id FeUgkDcI5pnefeaX (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 15 Apr 2013 16:29:07 -0700 (PDT) X-Barracuda-Envelope-From: shhuiw@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] Received: by mail-ie0-f181.google.com with SMTP id as1so2047550iec.40 for ; Mon, 15 Apr 2013 16:29:07 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=wcCNR2mAuBBU3X8eZcsdQyhlo5mWcFyn+G6+WfT5UEU=; b=BNi0+1HHeiwwAjxLT1gSB+UvavC5O0rFuhFSECAKVaJx8a4L4SsuB3kOaDoAtiBSEh 9U11WzOexDLRabq5k1+326mZrMD5zjG75vbXTMAhaa0N5ZS7XbkE1lTsb4QCT5OQ1npX pYBWHyo5ncJbDh6DaRqXVgzGEnlhsv7RZcRJ4vZOK91M33Sb5N/l7Y0EBEb9CPgY4ZgL fOun+8T/GbGmQVB9YsPzmi2sU7aKxtwzdd6u/lb6MdCLw/J7429msEQ4VIJ6+mpWNHZK zdwet8VNFUB3JFJqV2s47q9xjO5RcahYsjm88uMZvVQB+VlB+1Scwe9DBaCblNMo13TY iVMg== X-Received: by 10.43.90.137 with SMTP id bi9mr12729326icc.51.1366068547218; Mon, 15 Apr 2013 16:29:07 -0700 (PDT) Received: from [9.115.120.152] ([202.108.130.138]) by mx.google.com with ESMTPS id a3sm14549928igq.5.2013.04.15.16.28.59 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 15 Apr 2013 16:29:05 -0700 (PDT) Message-ID: <516C8D34.7090602@gmail.com> Date: Tue, 16 Apr 2013 07:28:52 +0800 From: Wang Sheng-Hui User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Rich Johnston CC: Dave Chinner , Dave Chinner , xfstests Subject: Re: [PATCH v3] xfstests: make install support common/ and tests/ dirs References: <516937F9.1020101@gmail.com> <516BFA10.6020102@sgi.com> X-ASG-Orig-Subj: Re: [PATCH v3] xfstests: make install support common/ and tests/ dirs In-Reply-To: <516BFA10.6020102@sgi.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-ie0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1366068547 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128234 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 2013年04月15日 21:01, Rich Johnston wrote: > On 04/13/2013 05:48 AM, Wang Sheng-Hui wrote: > >> diff --git a/Makefile b/Makefile >> index 6edd55c..611b36d 100644 >> --- a/Makefile >> +++ b/Makefile >> @@ -52,12 +52,15 @@ LDIRT += $(SRCTAR) >> endif >> >> LIB_SUBDIRS = include lib >> -TOOL_SUBDIRS = ltp src m4 >> +TOOL_SUBDIRS = ltp src m4 common >> ifeq ($(HAVE_DMAPI), true) >> TOOL_SUBDIRS += dmapi >> endif >> >> -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) >> +TESTS_DIR = tests >> +export TESTS_DIR >> + >> +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_DIR) >> >> default: include/builddefs $(DMAPI_MAKEFILE) $(TESTS) >> ifeq ($(HAVE_BUILDDEFS), no) >> @@ -91,12 +94,7 @@ depend: include/builddefs $(addsuffix >> -depend,$(SUBDIRS)) >> install: default $(addsuffix -install,$(SUBDIRS)) >> $(INSTALL) -m 755 -d $(PKG_LIB_DIR) >> $(INSTALL) -m 755 check $(PKG_LIB_DIR) >> - $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) >> - $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) >> - $(INSTALL) -m 644 group $(PKG_LIB_DIR) >> $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) >> - $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) >> - $(INSTALL) -m 644 common* $(PKG_LIB_DIR) >> >> # Nothing. >> install-dev install-lib: > > > Not sure why Makefile above would not apply. I did the following: > > git reset --hard 2bfce6d3 # Revert to commit before v2 of this patch. > > Attemted to apply patch > > Applying patch v3-xfstests-make-install-support-common-and-tests-dirs.patch > patching file Makefile > Hunk #1 FAILED at 52. > Hunk #2 FAILED at 94. > 2 out of 2 hunks FAILED -- rejects in file Makefile > > So I replaced your Makefile patch with > > > diff --git a/Makefile b/Makefile >> index 6edd55c..b01491e 100644 >> --- a/Makefile >> +++ b/Makefile >> @@ -52,12 +52,14 @@ LDIRT += $(SRCTAR) >> endif >> >> LIB_SUBDIRS = include lib >> -TOOL_SUBDIRS = ltp src m4 >> +TOOL_SUBDIRS = ltp src m4 common >> ifeq ($(HAVE_DMAPI), true) >> TOOL_SUBDIRS += dmapi >> endif >> >> -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) >> +TESTS_DIR = tests >> +export TESTS_DIR >> +SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) $(TESTS_DIR) >> >> default: include/builddefs $(DMAPI_MAKEFILE) $(TESTS) >> ifeq ($(HAVE_BUILDDEFS), no) >> @@ -91,12 +93,7 @@ depend: include/builddefs $(addsuffix -depend,$(SUBDIRS)) >> install: default $(addsuffix -install,$(SUBDIRS)) >> $(INSTALL) -m 755 -d $(PKG_LIB_DIR) >> $(INSTALL) -m 755 check $(PKG_LIB_DIR) >> - $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) >> - $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) >> - $(INSTALL) -m 644 group $(PKG_LIB_DIR) >> $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) >> - $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) >> - $(INSTALL) -m 644 common* $(PKG_LIB_DIR) >> >> # Nothing. >> install-dev install-lib: > > Will revert v2 (git revert 2519a97d) and commit with this minor change is Dave agrees to your latest version. Thanks, Rich! Regards, Sheng-Hui > > Thanks > --Rich > > From sgi-linux-xfs@m.gmane.org Mon Apr 15 18:49:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C435E7F51 for ; Mon, 15 Apr 2013 18:49:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 92D188F8073 for ; Mon, 15 Apr 2013 16:49:34 -0700 (PDT) X-ASG-Debug-ID: 1366069771-04bdf02d1f22e6d0001-w1Z2WR Received: from plane.gmane.org (plane.gmane.org [80.91.229.3]) by cuda.sgi.com with ESMTP id SDlWhu1HDnec9QGQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 15 Apr 2013 16:49:33 -0700 (PDT) X-Barracuda-Envelope-From: sgi-linux-xfs@m.gmane.org X-Barracuda-Apparent-Source-IP: 80.91.229.3 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1URt9O-00047w-Q8 for linux-xfs@oss.sgi.com; Tue, 16 Apr 2013 01:49:30 +0200 Received: from wombat.san-francisco.ca.us ([75.101.60.140]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 16 Apr 2013 01:49:30 +0200 Received: from kkeller by wombat.san-francisco.ca.us with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 16 Apr 2013 01:49:30 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Keith Keller Subject: xfs_repair misses an fs error? Date: Mon, 15 Apr 2013 16:47:32 -0700 X-ASG-Orig-Subj: xfs_repair misses an fs error? Lines: 151 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: wombat.san-francisco.ca.us User-Agent: slrn/0.9.9p1 (Linux) X-Barracuda-Connect: plane.gmane.org[80.91.229.3] X-Barracuda-Start-Time: 1366069772 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128234 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi all, I recently had a filesystem stop, and went through the usual umount, mount, umount, xfs_repair path. xfs_repair didn't find any errors, but I noticed that I was still getting some strange issues where a file in a directory didn't have an inode and was resulting in IO errors. Thinking to address the problem later, I moved the directory to a different location on the filesystem so that future backups could proceed normally. Later, in an attempt to collect log errors, I re-ran xfs_repair on the filesystem. It then found errors and corrected them, and on remount, I found that the directory in question was repaired and no longer had a file entry with no inode. (So I can't reproduce that output; I didn't save it, thinking that the second xfs_repair wouldn't fix the issue, and I'd generate it again before posting.) Has anyone else seen a situation where xfs_repair misses a filesystem problem, but then finds it if a file or directory is moved? And more generally, is there a way to use xfs_db or similar to try to find other inodes that might be causing similar problems? In case it's helpful, the last xfs_repair stderr is below. Unfortunately I didn't save the initial xfs_repair logs, but from what I remember (which could be inaccurate, I admit) I did not see any errors. FWIW, 8495309 was the inode of the directory that was reporting the file with no inode before the successful xfs_repair. --keith Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 correcting nblocks for inode 14653773, was 18446744073709486338 - counted 1 data fork in ino 14653803 claims free block 1654114652 data fork in ino 14653833 claims free block 1654114653 - agno = 1 correcting nblocks for inode 2161878797, was 72057594037927936 - counted 0 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 Phase 5 - rebuild AG headers and trees... - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... bad hash table for directory inode 8495309 (hash value mismatch): rebuilding rebuilding directory inode 8495309 - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... resetting inode 9161151 nlinks from 10 to 9 resetting inode 9161407 nlinks from 8 to 9 Note - quota info will be regenerated on next quota mount. done -- kkeller@wombat.san-francisco.ca.us From stan@hardwarefreak.com Mon Apr 15 20:45:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E6D4C7F4C for ; Mon, 15 Apr 2013 20:45:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C30388F8054 for ; Mon, 15 Apr 2013 18:45:16 -0700 (PDT) X-ASG-Debug-ID: 1366076715-04cbb057f5232d00001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id mokN4wGIFSAtKWda for ; Mon, 15 Apr 2013 18:45:16 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id A02646C147; Mon, 15 Apr 2013 20:45:15 -0500 (CDT) Message-ID: <516CAD27.4070408@hardwarefreak.com> Date: Mon, 15 Apr 2013 20:45:11 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Dave Hall CC: "xfs@oss.sgi.com" Subject: Re: xfs_fsr, sunit, and swidth References: <5141C1FC.4060209@hardwarefreak.com> <5141C8C1.2080903@hardwarefreak.com> <5141E5CF.10101@binghamton.edu> <5142AE40.6040408@hardwarefreak.com> <20130315114538.GF6369@dastard> <5143F94C.1020708@hardwarefreak.com> <20130316072126.GG6369@dastard> <515082C3.2000006@binghamton.edu> <515361B5.8050603@hardwarefreak.com> <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> <515C3BF3.60601@binghamton.edu> <51684382.50008@binghamton.edu> <5168AC0B.5010100@hardwarefreak.com> <516C649A.8010003@binghamton.edu> X-ASG-Orig-Subj: Re: xfs_fsr, sunit, and swidth In-Reply-To: <516C649A.8010003@binghamton.edu> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1366076716 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 4/15/2013 3:35 PM, Dave Hall wrote: > Stan, > > I understand that this will be an ongoing problem. It seems like all I could do at this point would be to ' manually defrag' my inodes the hard way by doing this 'copy' operation whenever things slow down. (Either that or go get my PHD in file systems and try to come up with a better inode management algorithm.) I will be keeping two copies of this data going forward anyways. > > Are there any other suggestions you might have at this time - xfs or otherwise? I'm no expert in this particular area, so I'll simply give the sysadmin 101 perspective: Always pick the right tool for the job. If XFS isn't working satisfactorily for this job and no fix is forthcoming, I'd test EXT4 and JFS to see if either of them is more suitable for this job. The other option is to switch to a backup job that doesn't create/delete millions of hard links. There are likely other possibilities. -- Stan > -Dave > > Dave Hall > Binghamton University > kdhall@binghamton.edu > 607-760-2328 (Cell) > 607-777-4641 (Office) > > > On 04/12/2013 08:51 PM, Stan Hoeppner wrote: >> On 4/12/2013 12:25 PM, Dave Hall wrote: >> >>> Stan, >>> >>> IDid this post get lost in the shuffle? Looking at it I think it could >>> have been a bit unclear. What I need to do anyways is have a second, >>> off-site copy of my backup data. So I'm going to be building a second >>> array. In copying, in order to preserve the hard link structure of the >>> source array I'd have to run a sequence of cp -al / rsync calls that >>> would mimic what rsnapshot did to get me to where I am right now. (Note >>> that I could also potentially use rsync --link-dest.) >>> >>> So the question is how would the target xfs file system fare as far as >>> my inode fragmentation situation is concerned? I'm hoping that since >>> the target would be a fresh file system, and since during the 'copy' >>> phase I'd only be adding inodes, that the inode allocation would be more >>> compact and orderly than what I have on the source array since. What do >>> you think? >>> >> The question isn't what it will look like initially, as your inodes >> shouldn't be sparsely allocated as with your current aged filesystem. >> >> The question is how quickly the problem will arise on the new filesystem >> as you free inodes. I don't have the answer to that question. There's >> no way to predict this that I know of. >> >> > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From lancelot007@dedas.com Mon Apr 15 21:46:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3F0B27F51 for ; Mon, 15 Apr 2013 21:46:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B05E4AC003 for ; Mon, 15 Apr 2013 19:46:13 -0700 (PDT) X-ASG-Debug-ID: 1366080366-04cb6c2c1f241980001-NocioJ Received: from host.statushost.ru (host.statushost.ru [178.20.152.129]) by cuda.sgi.com with ESMTP id E2IAeyyG0QzVWm03 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 15 Apr 2013 19:46:07 -0700 (PDT) X-Barracuda-Envelope-From: lancelot007@dedas.com X-Barracuda-Apparent-Source-IP: 178.20.152.129 Received: from Unknown ([141.255.188.199]) (authenticated bits=0) by host.statushost.ru (8.14.4/8.14.4) with ESMTP id r3G2jKbk050985; Tue, 16 Apr 2013 06:45:21 +0400 (MSK) (envelope-from lancelot007@dedas.com) Message-ID: <495147C0388C4BD8837BA4AE3119F567@accvzkq> Reply-To: =?windows-1251?B?zvLk5esg5+Dq8+/u6g==?= From: =?windows-1251?B?zvLk5esg5+Dq8+/u6g==?= To: , , , , Subject: =?windows-1251?B?1OXk5fDg6/zt4P8g6u7t8vDg6vLt4P8g8ejx?= =?windows-1251?B?8uXs4A==?= Date: Tue, 16 Apr 2013 04:45:26 +0200 X-ASG-Orig-Subj: =?windows-1251?B?1OXk5fDg6/zt4P8g6u7t8vDg6vLt4P8g8ejx?= =?windows-1251?B?8uXs4A==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_115F_01CE3A5D.36DA2A80" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Barracuda-Connect: host.statushost.ru[178.20.152.129] X-Barracuda-Start-Time: 1366080367 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128243 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_115F_01CE3A5D.36DA2A80 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D3=E2=E0=E6=E0=E5=EC=FB=E5 =EA=EE=EB=EB=E5=E3=E8! =C7=E0=EA=EE=ED =EE =D4=CA=D1 =E2=F1=F2=F3=EF=E0=E5=F2 =E2 =F1=E8=EB=F3 =F1= I =FF=ED=E2=E0=F0=FF 2oI=D7 =E3=EE=E4=E0. =D3=C6=C5 =D1=C5=C9=D7=C0=D1 =C2=DB =CC=CE=C6=C5=D2=C5 =D3=C7=CD=C0=D2=DC= : - =CE=F1=ED=EE=E2=ED=FB=E5 =EF=F0=E8=ED=F6=E8=EF=FB =ED=EE=E2=EE=E3=EE =E7= =E0=EA=EE=ED=E0 "=CE =F4=E5=E4=E5=F0=E0=EB=FC=ED=EE=E9 =EA=EE=ED=F2=F0=E0= =EA=F2=ED=EE=E9 =F1=E8=F1=F2=E5=EC=E5". - =D1=F4=E5=F0=E0 =EF=F0=E8=EC=E5=ED=E5=ED=E8=FF, =F1=F3=E1=FA=E5=EA=F2=FB= =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF =D4=CA=D1. - =D1=F2=E8=EC=F3=EB=FF=F6=E8=FF =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB= =F5 =E7=E0=EA=E0=E7=F7=E8=EA=EE=E2 =E8 =E7=E0=EA=F3=EF=F9=E8=EA=EE=E2. - =CF=EB=E0=ED=FB =E7=E0=EA=F3=EF=EE=EA =F2=EE=E2=E0=F0=EE=E2, =F0=E0=E1=EE= =F2, =F3=F1=EB=F3=E3. - =D1=EF=EE=F1=EE=E1=FB =EE=F1=F3=F9=E5=F1=F2=E2=EB=E5=ED=E8=FF =E7=E0=EA= =F3=EF=EE=EA =EF=EE =D4=CA=D1. - =CD=EE=E2=EE=E5 =E2 =EF=F0=EE=F6=E5=E4=F3=F0=E0=F5 =EF=EE =F1=F0=E0=E2=ED= =E5=ED=E8=FE =F1 94-=D4=C7. - =CF=EE=F0=FF=E4=EE=EA =F0=E0=E1=EE=F2=FB =E7=E0=EA=E0=E7=F7=E8=EA=E0 =E8= =F3=F7=E0=F1=F2=ED=E8=EA=E0 =EF=EE =ED=EE=E2=FB=EC =EF=F0=E0=E2=E8=EB=E0= =EC. - =CF=EE=F0=FF=E4=EE=EA, =F1=F2=F0=F3=EA=F2=F3=F0=E0 =EA=EE=ED=EA=F3=F0=F1= =ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8. =DD=EB=E5=EA=F2=F0=EE=ED=ED= =FB=E9 =E0=F3=EA=F6=E8=EE=ED. - =C7=E0=EF=F0=EE=F1 =EF=F0=E5=E4=EB=EE=E6=E5=ED=E8=E9. =D3=F1=EB=EE=E2=E8= =FF =E8 =F1=F5=E5=EC=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF. - =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =E7=E0=EA=EB=FE=F7=E5=ED=E8=FF (=F0=E0= =F1=F2=EE=F0=E6=E5=ED=E8=FF) =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=F5= =EA=EE=ED=F2=F0=E0=EA=F2=EE. - =CF=EE=F0=FF=E4=EE=EA =EF=F0=E8=E5=EC=EA=E8 =F2=EE=E2=E0=F0=EE=E2, =F0=E0= =E1=EE=F2 =E8 =F3=F1=EB=F3=E3. =C0=F3=E4=E8=F2. =CD=E0=E4=E7=EE=F0 =E8 =EA= =EE=ED=F2=F0=EE=EB=FC. > =D4=C5=C4=C5=D0=C0=CB=DC=CD=C0=DF =CA=CE=CD=D2=D0=C0=CA=D2=CD=C0=DF =D1= =C8=D1=D2=C5=CC=C0=20 > =C2 =D1=D4=C5=D0=C5 =C7=C0=CA=D3=CF=CE=CA =D2=CE=C2=C0=D0=CE=C2, =D0=C0= =C1=CE=D2 =C8 =D3=D1=CB=D3=C3, =CE=D2=CB=C8=D7=C8=DF =CE=D2 9=F7-=D4=C7.=20 > =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =EF=E5=F0=E5=F5=EE=E4=ED=EE=E3=EE =EF= =E5=F0=E8=EE=E4=E0, =ED=EE=E2=FB=E5 =E7=E0=EA=F3=EF=EE=F7=ED=FB=E5 =EF=F0= =EE=F6=E5=E4=F3=F0=FB. > 2o =EC=E0=FF 2=EEI=E7, =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3 > =C2=C5=C4=D3=D9=C8=C9 =CA=D3=D0=D1=C0 =D1=E5=F0=F2=E8=F4=E8=F6=E8=F0=EE=E2=E0=ED=ED=FB=E9 =F1=EF=E5=F6=E8=E0=EB= =E8=F1=F2 =EF=EE =EA=F3=F0=F1=F3 "=D3=EF=F0=E0=E2=EB=E5=ED=E8=E5 =E3=EE=F1= =F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=EC=E8 =E8 =EC=F3=ED=E8=F6=E8=EF=E0=EB=FC= =ED=FB=EC=E8 =E7=E0=EA=E0=E7=E0=EC=E8", =FD=EA=F1=EF=E5=F0=F2 =EF=EE =EA=EE= =ED=EA=F3=F0=E5=ED=F2=ED=FB=EC =F2=EE=F0=E3=E0=EC =E2 =D1=E0=ED=EA=F2-=CF= =E5=F2=E5=F0=E1=F3=F0=E3=E5, =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FC =E8=ED=F4= =EE=F0=EC=E0=F6=E8=EE=ED=ED=EE-=EF=F0=E0=E2=EE=E2=EE=E3=EE =EA=EE=ED=F1=E0= =EB=F2=E8=ED=E3=EE=E2=EE=E3=EE =F6=E5=ED=F2=F0=E0.=20 =CF=CE=C4=D0=CE=C1=CD=C0=DF =CF=D0=CE=C3=D0=C0=CC=CC=C0 =C2=DB=D1=DB=CB=C0= =C5=D2=D1=DF =CF=CE =C7=C0=CF=D0=CE=D1=D3. =CF=CE =C2=CE=CF=D0=CE=D1=C0=CC =D3=D7=C0=D1=D2=C8=DF =C8 =D0=C5=C3=C8=D1= =D2=D0=C0=D6=C8=C8 =CE=C1=D0=C0=D9=C0=C9=D2=C5=D1=DC =CF=CE =D2=C5=CB=C5=D4= =CE=CD=D3: > { 8I2 } 64..2 .. =D77 * 6..8 =20 =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC, =C4=EE=E2=EB=E0=F2=EE=E2=E0 =C8=F0=E8=ED=E0 =C0=EB=E5=EA=F1=E0=ED=E4=F0=EE= =E2=ED=E0 =EC=E5=ED=E5=E4=E6=E5=F0 =F6=E5=ED=F2=F0=E0 =EE=E1=F3=F7=E5=ED=E8=FF ------=_NextPart_000_115F_01CE3A5D.36DA2A80 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=D3=E2=E0=E6=E0=E5=EC=FB=E5 =EA=EE=EB=EB=E5=E3=E8!
 
=C7=E0=EA=EE=ED =EE =D4=CA=D1 =E2=F1=F2=F3=EF=E0=E5=F2 =E2 =F1=E8=EB= =F3 =F1 I =FF=ED=E2=E0=F0=FF=20 2oI=D7 =E3=EE=E4=E0.
 
=D3=C6=C5 =D1=C5=C9=D7=C0=D1 =C2=DB =CC=CE=C6=C5=D2=C5 =D3=C7=CD=C0=D2= =DC:
 
- =CE=F1=ED=EE=E2=ED=FB=E5 =EF=F0=E8=ED=F6=E8=EF=FB =ED=EE=E2=EE=E3=EE= =E7=E0=EA=EE=ED=E0 "=CE =F4=E5=E4=E5=F0=E0=EB=FC=ED=EE=E9 =EA=EE=ED=F2=F0= =E0=EA=F2=ED=EE=E9 =F1=E8=F1=F2=E5=EC=E5".
-=20 =D1=F4=E5=F0=E0 =EF=F0=E8=EC=E5=ED=E5=ED=E8=FF, =F1=F3=E1=FA=E5=EA=F2=FB = =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF =D4=CA=D1.
- =D1=F2=E8=EC=F3=EB= =FF=F6=E8=FF =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=F5=20 =E7=E0=EA=E0=E7=F7=E8=EA=EE=E2 =E8 =E7=E0=EA=F3=EF=F9=E8=EA=EE=E2.
- =CF= =EB=E0=ED=FB =E7=E0=EA=F3=EF=EE=EA =F2=EE=E2=E0=F0=EE=E2, =F0=E0=E1=EE=F2= , =F3=F1=EB=F3=E3.
- =D1=EF=EE=F1=EE=E1=FB=20 =EE=F1=F3=F9=E5=F1=F2=E2=EB=E5=ED=E8=FF =E7=E0=EA=F3=EF=EE=EA =EF=EE =D4=CA= =D1.
- =CD=EE=E2=EE=E5 =E2 =EF=F0=EE=F6=E5=E4=F3=F0=E0=F5 =EF=EE =F1=F0= =E0=E2=ED=E5=ED=E8=FE =F1 94-=D4=C7.
-=20 =CF=EE=F0=FF=E4=EE=EA =F0=E0=E1=EE=F2=FB =E7=E0=EA=E0=E7=F7=E8=EA=E0 =E8 = =F3=F7=E0=F1=F2=ED=E8=EA=E0 =EF=EE =ED=EE=E2=FB=EC =EF=F0=E0=E2=E8=EB=E0=EC= .
- =CF=EE=F0=FF=E4=EE=EA, =F1=F2=F0=F3=EA=F2=F3=F0=E0=20 =EA=EE=ED=EA=F3=F0=F1=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8. =DD=EB= =E5=EA=F2=F0=EE=ED=ED=FB=E9 =E0=F3=EA=F6=E8=EE=ED.
- =C7=E0=EF=F0=EE=F1= =EF=F0=E5=E4=EB=EE=E6=E5=ED=E8=E9. =D3=F1=EB=EE=E2=E8=FF =E8=20 =F1=F5=E5=EC=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF.
- =CE=F1=EE=E1=E5=ED=ED= =EE=F1=F2=E8 =E7=E0=EA=EB=FE=F7=E5=ED=E8=FF (=F0=E0=F1=F2=EE=F0=E6=E5=ED=E8= =FF) =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=F5=20 =EA=EE=ED=F2=F0=E0=EA=F2=EE.
- =CF=EE=F0=FF=E4=EE=EA =EF=F0=E8=E5=EC=EA= =E8 =F2=EE=E2=E0=F0=EE=E2, =F0=E0=E1=EE=F2 =E8 =F3=F1=EB=F3=E3. =C0=F3=E4= =E8=F2. =CD=E0=E4=E7=EE=F0 =E8=20 =EA=EE=ED=F2=F0=EE=EB=FC.
 

> =D4=C5=C4=C5=D0=C0=CB=DC=CD=C0=DF =CA=CE=CD=D2=D0=C0=CA=D2=CD= =C0=DF =D1=C8=D1=D2=C5=CC=C0
> =C2 =D1=D4=C5=D0=C5 =C7=C0=CA=D3=CF= =CE=CA =D2=CE=C2=C0=D0=CE=C2,=20 =D0=C0=C1=CE=D2 =C8 =D3=D1=CB=D3=C3, =CE=D2=CB=C8=D7=C8=DF =CE=D2 9=F7-=D4= =C7.
> =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8=20 =EF=E5=F0=E5=F5=EE=E4=ED=EE=E3=EE =EF=E5=F0=E8=EE=E4=E0, =ED=EE=E2=FB=E5 = =E7=E0=EA=F3=EF=EE=F7=ED=FB=E5 =EF=F0=EE=F6=E5=E4=F3=F0=FB.
 
> 2o =EC=E0=FF=20 2=EEI=E7,=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
 

> =C2=C5=C4=D3=D9=C8=C9 =CA=D3=D0=D1=C0
=D1=E5=F0=F2=E8=F4= =E8=F6=E8=F0=EE=E2=E0=ED=ED=FB=E9 =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2 =EF=EE =EA= =F3=F0=F1=F3 "=D3=EF=F0=E0=E2=EB=E5=ED=E8=E5=20 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=EC=E8 =E8 =EC=F3=ED=E8=F6=E8=EF= =E0=EB=FC=ED=FB=EC=E8 =E7=E0=EA=E0=E7=E0=EC=E8", =FD=EA=F1=EF=E5=F0=F2 =EF= =EE =EA=EE=ED=EA=F3=F0=E5=ED=F2=ED=FB=EC =F2=EE=F0=E3=E0=EC =E2=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5, =F0=F3=EA=EE=E2=EE=E4=E8=F2= =E5=EB=FC =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE-=EF=F0=E0=E2=EE=E2=EE=E3= =EE =EA=EE=ED=F1=E0=EB=F2=E8=ED=E3=EE=E2=EE=E3=EE =F6=E5=ED=F2=F0=E0.=20
 

=CF=CE=C4=D0=CE=C1=CD=C0=DF =CF=D0=CE=C3=D0=C0=CC=CC=C0 =C2=DB=D1= =DB=CB=C0=C5=D2=D1=DF =CF=CE =C7=C0=CF=D0=CE=D1=D3.
 
=CF=CE =C2=CE=CF=D0=CE=D1=C0=CC =D3=D7=C0=D1=D2=C8=DF =C8 =D0=C5=C3=C8= =D1=D2=D0=C0=D6=C8=C8 =CE=C1=D0=C0=D9=C0=C9=D2=C5=D1=DC =CF=CE =D2=C5=CB=C5= =D4=CE=CD=D3:
>=20 { 8I2 } 64..2 .. =D77 * 6..8

=D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC,
=C4=EE=E2=EB=E0=F2=EE=E2=E0 = =C8=F0=E8=ED=E0 =C0=EB=E5=EA=F1=E0=ED=E4=F0=EE=E2=ED=E0
=EC=E5=ED=E5=E4= =E6=E5=F0 =F6=E5=ED=F2=F0=E0=20 =EE=E1=F3=F7=E5=ED=E8=FF
------=_NextPart_000_115F_01CE3A5D.36DA2A80-- From jeff.liu@oracle.com Tue Apr 16 00:40:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5B4A27F4C for ; Tue, 16 Apr 2013 00:40:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 497E48F8074 for ; Mon, 15 Apr 2013 22:40:40 -0700 (PDT) X-ASG-Debug-ID: 1366090838-04cbb057f5242400001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id VqjS1gTvWpICVoMy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 15 Apr 2013 22:40:39 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r3G5eaIR001720 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 16 Apr 2013 05:40:37 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3G5eZdn014632 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 16 Apr 2013 05:40:35 GMT Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3G5eYlR000684; Tue, 16 Apr 2013 05:40:35 GMT Received: from [192.168.2.176] (/64.174.228.57) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 15 Apr 2013 22:40:34 -0700 Message-ID: <516CE451.5010203@oracle.com> Date: Tue, 16 Apr 2013 13:40:33 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: "Michael L. Semon" CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: fix s_max_bytes to MAX_LFS_FILESIZE if needed References: <5167E160.3020800@oracle.com> <5169CC34.9080902@gmail.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix s_max_bytes to MAX_LFS_FILESIZE if needed In-Reply-To: <5169CC34.9080902@gmail.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1366090839 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128255 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email Hi Michael, Thanks a lot for help verifying this fix and sorry for my too late response since I have traveled to US two days ago. On 04/14/2013 05:20 AM, Michael L. Semon wrote: > Update: My tests on my original hardware go exactly as they did in my > Pentium 4 test. xfstests shared/[0-9][0-9][0-9] and xfs/003 through > xfs/136 were run against it. No problems. Good job. I'm keeping the > patch. > > My final version of the bug summary goes like this: > > On a 32-bit x86 PC, with a Linux kernel that has CONFIG_LBDAF=y... > > xfstests generic/308, by writing to a file at an address just before > 2**32, causes the following conditions on an XFS filesystem: > > 1) CPU usage becomes very high, > > 2) The xfs_io process cannot be killed, > > 3) The best way to shut down the PC is through use of the magic SysRq keys. > > 4) Afterwards, attempts to mount the filesystem result in a soft oops. > > 5) After an `xfs_repair -L` on the filesystem, all is OK, other than for > what was lost by zeroing the log. > > J. Liu wrote a patch that solves this problem, but he found the answers > with CONFIG_LBDAF=n, which is a condition for which xfstests generic/308 > passes on the two test PCs used. Ooops! it's wrong. My answer is misleading, you can think that I drink too much at that time.:( Actually, it quite the reverse, i.e. this issue can be reproduced against 32-bit kernel with CONFIG_LBADF=y, this is the default configuration of mine. In this case, I observed that the s_maxbytes is larger than the MAX_LFS_FILESIZE. Hence, the current patch is written to make sure that the s_maxbytes should not beyond this limits. For 32-bit kernel with CONFIG_LBADF=n, the s_maxbytes is just equal to MAX_LFS_FILESIZE, so the test is works to me. BTW, I only verified this fix upon the default mkfs options. i.e, 4k blocksize, that is, mkfs.xfs /dev/sdX. > > Tests were conducted on a Pentium III (kernel 3.9-rc4 with numerous SGI > patches) and on a Pentium 4 (kernel 3.9-rc6 with numerous SGI patches). > > Could you verify these things by memory (no need to retest)? As I mentioned above. > a) With CONFIG_LBDAF=y, generic/308 caused filesystem corruption, and In this case, the operation should be denied with -EFBIG error returned if trying to create a huge file. > > b) With CONFIG_LBDAF=n, generic/308 passed the test. Even don't applying this patch, the test run passed for the default mkfs setup. > > c) Having CONFIG_LBDAF=n helped you to find the answers and write this > fine patch. CONFIG_LBADF=y instead. Thanks again! -Jeff > > Otherwise, the conclusion is "I don't know how you got there, but you > got there. Good job! and thanks for finding the root cause of the problem." > > Thanks again! > > Michael > > On 04/12/2013 06:26 AM, Jeff Liu wrote: >> From: Jie Liu >> >> On 32-bit machine, the s_maxbytes is larger than the MAX_LFS_FILESIZE limits if CONFIG_LBDAF is >> not enabled. Hence it's possible to create a huge file via buffered-IO write with a given offset >> beyond this limitation. e.g. >> >> # block_size=4096 >> # offset=$(((2**32 - 1) * $block_size)) >> # xfs_io -f -c "pwrite $offset $block_size" /storage/test_file >> >> In this case, xfs_io will hang at the page writeback stage soon since the given offset would >> cause an overflow at xfs_vm_writepage(): >> >> end_index = offset >> PAGE_CACHE_SHIFT; >> last_index = (offset - 1) >> PAGE_CACHE_SHIFT; >> if (page->index >= end_index) { >> unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); >> >> /* >> * Just skip the page if it is fully outside i_size, e.g. due >> * to a truncate operation that is in progress. >> */ >> if (page->index >= end_index + 1 || offset_into_page == 0) { >> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >> unlock_page(page); >> return 0; >> } >> end_index is unsigned long so that the max value is '2^32-1 = 4294967295', and it >> would be evaluated to the max value with the given offset(when writing the page offset >> up to s_max_bytes) for above test case. As a result, (page->index >= end_index + 1) is >> ok as (end_index + 1) is overflowed to ZERO. >> >> Actually, create a file as above on 32-bit machine should be failed with EFBIG error returned >> because there has strict check up at generic_write_checks() against the given offset with a >> *correct* s_max_bytes. >> >> This patch fix the s_max_bytes to MAX_LFS_FILESIZE if the pre-calculated value is greater >> than it. >> >> Reported-by: Michael L. Semon >> Signed-off-by: Jie Liu >> >> --- >> fs/xfs/xfs_super.c | 6 +++++- >> 1 file changed, 5 insertions(+), 1 deletion(-) >> >> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c >> index ea341ce..0644d61 100644 >> --- a/fs/xfs/xfs_super.c >> +++ b/fs/xfs/xfs_super.c >> @@ -585,6 +585,7 @@ xfs_max_file_offset( >> { >> unsigned int pagefactor = 1; >> unsigned int bitshift = BITS_PER_LONG - 1; >> + __uint64_t offset; >> >> /* Figure out maximum filesize, on Linux this can depend on >> * the filesystem blocksize (on 32 bit platforms). >> @@ -610,7 +611,10 @@ xfs_max_file_offset( >> # endif >> #endif >> >> - return (((__uint64_t)pagefactor) << bitshift) - 1; >> + offset = (((__uint64_t)pagefactor) << bitshift) - 1; >> + >> + /* Check against VM & VFS exposed limits */ >> + return (offset > MAX_LFS_FILESIZE) ? MAX_LFS_FILESIZE : offset; >> } >> >> xfs_agnumber_t >> > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From mlsemon35@gmail.com Tue Apr 16 00:55:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 61B037F51 for ; Tue, 16 Apr 2013 00:55:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F3513AC001 for ; Mon, 15 Apr 2013 22:55:52 -0700 (PDT) X-ASG-Debug-ID: 1366091751-04bdf02d1d246510001-NocioJ Received: from mail-gg0-f177.google.com (mail-gg0-f177.google.com [209.85.161.177]) by cuda.sgi.com with ESMTP id O7Pa4WuztvUMIBbD (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 15 Apr 2013 22:55:51 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.161.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.161.177] Received: by mail-gg0-f177.google.com with SMTP id q1so13490gge.22 for ; Mon, 15 Apr 2013 22:55:51 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.161.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.161.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=cZwgGAqWvCclbXPpLUhc4WLV3Zd/83Ii53+54bpm3iU=; b=RmbsIjDfPWVExDU8nNoq1xPyzbPxEvM7glrMWOJUu6OU1FWeaU4l6QayKbS5v3be9w taLN+1RNftUxOBxPumDKWZ+lqZnwMgA8X5Q1PGBYbE3KAn3n3zyImr7BWJ1qcgSLas7a 1v/hN8T3BPHXybPzSu5D2r6nJfnVWqoTayra6Rjv8onOZDFwUqf3t/o6TaPbyr6BoBAK pp8Kk0BcfpaTJ5H9NLZ87+Th1B+g/NdN/zvskkslpJjfaBA8N1FH+wnr+1/a1ymxcQgr uvC4oNT8i3sTqSQkgoTfT8/V+X2gy6DCmkFNlUbBCQ/s5bXdza/CWaoY+RD1Y0Yw+xP4 kxMA== X-Received: by 10.236.71.74 with SMTP id q50mr358927yhd.188.1366091751140; Mon, 15 Apr 2013 22:55:51 -0700 (PDT) Received: from [192.168.0.139] (rrcs-97-78-60-146.se.biz.rr.com. [97.78.60.146]) by mx.google.com with ESMTPS id i67sm580359yhq.25.2013.04.15.22.55.49 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 15 Apr 2013 22:55:49 -0700 (PDT) Message-ID: <516CE7E0.6010307@gmail.com> Date: Tue, 16 Apr 2013 01:55:44 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Jeff Liu CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: fix s_max_bytes to MAX_LFS_FILESIZE if needed References: <5167E160.3020800@oracle.com> <5169CC34.9080902@gmail.com> <516CE451.5010203@oracle.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix s_max_bytes to MAX_LFS_FILESIZE if needed In-Reply-To: <516CE451.5010203@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-gg0-f177.google.com[209.85.161.177] X-Barracuda-Start-Time: 1366091751 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.128257 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 You're welcome. Thanks for the explanation. Now everything makes logical sense. I'll re-run the tests with different block sizes. The tests have been run already with a) default mkfs options and b) with an external journal and realtime device. Your related patch, "xfs: don't return 0 if generic_segment_checks() find nothing to write," has also been applied. The suggested test case hasn't been tried, but the patch hasn't caused any additional problems, either. Anyway, I hope you had/have a good stay here in the US. Michael On 04/16/2013 01:40 AM, Jeff Liu wrote: > Hi Michael, > > Thanks a lot for help verifying this fix and sorry for my too late > response since I have traveled to US two days ago. > > On 04/14/2013 05:20 AM, Michael L. Semon wrote: >> Update: My tests on my original hardware go exactly as they did in my >> Pentium 4 test. xfstests shared/[0-9][0-9][0-9] and xfs/003 through >> xfs/136 were run against it. No problems. Good job. I'm keeping the >> patch. >> >> My final version of the bug summary goes like this: >> >> On a 32-bit x86 PC, with a Linux kernel that has CONFIG_LBDAF=y... >> >> xfstests generic/308, by writing to a file at an address just before >> 2**32, causes the following conditions on an XFS filesystem: >> >> 1) CPU usage becomes very high, >> >> 2) The xfs_io process cannot be killed, >> >> 3) The best way to shut down the PC is through use of the magic SysRq keys. >> >> 4) Afterwards, attempts to mount the filesystem result in a soft oops. >> >> 5) After an `xfs_repair -L` on the filesystem, all is OK, other than for >> what was lost by zeroing the log. >> >> J. Liu wrote a patch that solves this problem, but he found the answers >> with CONFIG_LBDAF=n, which is a condition for which xfstests generic/308 >> passes on the two test PCs used. > Ooops! it's wrong. My answer is misleading, you can think that I drink > too much at that time.:( Actually, it quite the reverse, i.e. this > issue can be reproduced against 32-bit kernel with CONFIG_LBADF=y, this > is the default configuration of mine. > In this case, I observed that the s_maxbytes is larger than the > MAX_LFS_FILESIZE. Hence, the current patch is written to make sure that > the s_maxbytes should not beyond this limits. > > For 32-bit kernel with CONFIG_LBADF=n, the s_maxbytes is just equal to > MAX_LFS_FILESIZE, so the test is works to me. BTW, I only verified this > fix upon the default mkfs options. i.e, 4k blocksize, that is, mkfs.xfs > /dev/sdX. >> >> Tests were conducted on a Pentium III (kernel 3.9-rc4 with numerous SGI >> patches) and on a Pentium 4 (kernel 3.9-rc6 with numerous SGI patches). >> >> Could you verify these things by memory (no need to retest)? > As I mentioned above. >> a) With CONFIG_LBDAF=y, generic/308 caused filesystem corruption, and > In this case, the operation should be denied with -EFBIG error returned > if trying to create a huge file. >> >> b) With CONFIG_LBDAF=n, generic/308 passed the test. > Even don't applying this patch, the test run passed for the default mkfs > setup. >> >> c) Having CONFIG_LBDAF=n helped you to find the answers and write this >> fine patch. > CONFIG_LBADF=y instead. > > Thanks again! > -Jeff From service-client@lesoffresvoyages.com Tue Apr 16 01:54:42 2013 Return-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.7 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E29AC7F51 for ; Tue, 16 Apr 2013 01:54:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D0D408F8071 for ; Mon, 15 Apr 2013 23:54:39 -0700 (PDT) X-ASG-Debug-ID: 1366095275-04cbb057f5247dc0001-NocioJ Received: from s4.lesoffresvoyages.com (s4.lesoffresvoyages.com [37.140.202.98]) by cuda.sgi.com with ESMTP id DuUTXCjlHhhX6xeJ for ; Mon, 15 Apr 2013 23:54:35 -0700 (PDT) X-Barracuda-Envelope-From: service-client@lesoffresvoyages.com X-Barracuda-Apparent-Source-IP: 37.140.202.98 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=lesoffresvoyages.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@lesoffresvoyages.com; bh=IGfY8ARsTjxED0PNln72wKSCl77Bbc+3SvI0Bex+/jE=; b=GSw2eGT5wmAEuTDxYdCfgeIeeEOyEEWEPsvbdArg+XXGMcNW7FBNeYmYlBwVdzv0Knli6WumV+hB qQncrVlQl3Mm/Dy4+b+S8YR6vseMUNhVTT98LGrk8NbeXjnFnaGhN+zG0rXuqcSVe3T7GDyHwho9 vnkrO3VP6P3igxfxZPM= From: Vacances 5 étoiles X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 40140 X-EN-uuid: 1010-101040140-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Vos prochaines vacances a moins de 99 euros !!! MIME-Version: 1.0 X-ASG-Orig-Subj: Vos prochaines vacances a moins de 99 euros !!! List-Unsubscribe: http://www.lesoffresvoyages.com/ZcBEReFX2tYK4UeO7ts9aSVvUC0WfGwW0SUBKGd90cc.html, Content-Type: multipart/alternative; boundary=0e22cd6353ef9ce5face0e3fb126aa42 Message-ID: <0.0.1.72B.1CE3A6F414E5A9C.0@s4.lesoffresvoyages.com> Date: Tue, 16 Apr 2013 08:54:35 +0200 X-Barracuda-Connect: s4.lesoffresvoyages.com[37.140.202.98] X-Barracuda-Start-Time: 1366095275 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.88 X-Barracuda-Spam-Status: No, SCORE=0.88 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128261 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_MOSTLY BODY: Multipart message mostly text/html MIME 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary 0.46 PLING_PLING Subject has lots of exclamation marks --0e22cd6353ef9ce5face0e3fb126aa42 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --0e22cd6353ef9ce5face0e3fb126aa42 Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit  

Verychic a sélectionné votre email
xfs@oss.sgi.com
VeryChic vous offre
jusqu'à -80%
sur votre prochain
séjour 5 étoiles !
Voir toutes les destinations
Sude de la France Espagne Vous avez une préférence ?
Italie Maroc Choisissez votre destination
Londres Portugal Séjours de rêve
à 99€

Hôtels extraordinaires

Localisation idéale

Grâce à leur solide expérience en voyages de luxe, notre équipe d'experts sont de véritables dénicheurs de tendances des quatre coins du monde. Qu'il s'agisse de la toute dernière ouverture d'hôtel 5 étoiles à Shanghai ou du plus confidentiel des hôtels de la côte amalfitaine, soyez assuré que nous le testerons pour vous.

Nous sélectionnons des hôtels situés de façon idéale pour vous permettre de tout avoir à proximité et de gagner du temps. Avec VeryChic, vous vous trouverez au cœur de l'ambiance de Rio, imprégnés de l'histoire de Rome, ou plongés dans le calme voluptueux de l'Algavre.

Label de Qualité

La qualité de chacun de nos partenaires fait l'objet d'une évaluation personnelle, rigoureuse et régulière afin de vous garantir un service impeccable.

Absolument tout passe sous la loupe de nos experts: localisation, agréments, services, réputation, recommandations, évaluations, fréquentation et bien plus. Tous ces détails font partie des critères d'éligibilité au très sérieux label VeryChic.

Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From Yann.Dupont@univ-nantes.fr Tue Apr 16 02:24:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 70F9F7F51 for ; Tue, 16 Apr 2013 02:24:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1BE7BAC005 for ; Tue, 16 Apr 2013 00:24:43 -0700 (PDT) X-ASG-Debug-ID: 1366097082-04bdf02d1d24c930001-NocioJ Received: from smtp-tls.univ-nantes.fr (smtptls1-cha.cpub.univ-nantes.fr [193.52.103.113]) by cuda.sgi.com with ESMTP id hCMV4eVTJOv1uVWK for ; Tue, 16 Apr 2013 00:24:42 -0700 (PDT) X-Barracuda-Envelope-From: Yann.Dupont@univ-nantes.fr X-Barracuda-Apparent-Source-IP: 193.52.103.113 Received: from localhost (localhost [127.0.0.1]) by smtp-tls.univ-nantes.fr (Postfix) with ESMTP id D6B78403932; Tue, 16 Apr 2013 09:24:41 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at smtptls1-lmb.cpub.univ-nantes.fr Received: from smtp-tls.univ-nantes.fr ([127.0.0.1]) by localhost (smtptls1-cha.cpub.univ-nantes.fr [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 0xJSyi7Sydx3; Tue, 16 Apr 2013 09:24:41 +0200 (CEST) Received: from [IPv6:2001:660:7220:0:a0f1:f89d:e68f:47c9] (unknown [IPv6:2001:660:7220:0:a0f1:f89d:e68f:47c9]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp-tls.univ-nantes.fr (Postfix) with ESMTPSA id B45DA403927; Tue, 16 Apr 2013 09:24:41 +0200 (CEST) Message-ID: <516CFCB8.1060804@univ-nantes.fr> Date: Tue, 16 Apr 2013 09:24:40 +0200 From: Yann Dupont User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130308 Thunderbird/17.0.4 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: kernels 3.4 slower due to allocation workqueue References: <516BCACE.1040900@univ-nantes.fr> <516C046C.8080908@sgi.com> X-ASG-Orig-Subj: Re: kernels 3.4 slower due to allocation workqueue In-Reply-To: <516C046C.8080908@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtptls1-cha.cpub.univ-nantes.fr[193.52.103.113] X-Barracuda-Start-Time: 1366097082 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128263 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le 15/04/2013 15:45, Mark Tinguely a écrit : > > Here are the allocation worker changes. > Hello mark, thanks for you answer > The biggest performance commit should be aa292847, which limits the > callers to the worker. > > commit 3b876c8f2a361ceeed3fed894980c69066f903a0 > Author: Jeff Liu > Date: Thu Jun 7 15:44:32 2012 +0800 > > xfs: fix debug_object WARN at xfs_alloc_vextent() > > commit aa292847b9fc6e187547110de833a7d3131bbddf > Author: Dave Chinner > Date: Thu Jul 12 07:40:43 2012 +1000 > > xfs: don't defer metadata allocation to the workqueue > Only These 2 commits are candidates, the others are post 3.5. I'll try to patch a 3.4 with each patch. > commit 2455881c0b52f87be539c4c7deab1afff4d8a560 > Author: Dave Chinner > Date: Fri Oct 5 11:06:58 2012 +1000 > > xfs: introduce XFS_BMAPI_STACK_SWITCH > > commit e04426b9202bccd4cfcbc70b2fa2aeca1c86d8f5 > Author: Dave Chinner > Date: Fri Oct 5 11:06:59 2012 +1000 > > xfs: move allocation stack switch up to xfs_bmapi_allocate > > commit 9e96fe6df44425b69ed89f6ac20352cec1f127d7 > Author: Brian Foster > Date: Thu Jan 17 13:11:29 2013 -0500 > > xfs: pull up stack_switch check into xfs_bmapi_write > > > The last 3 patches address an AGF buffer hang with the allocation worker. > > --Mark. As 3.4 Kernels don't have thoses patches, is there a risk associated with 3.4 kernels ? Cheers, -- Yann Dupont - Service IRTS, DSI Université de Nantes Tel : 02.53.48.49.20 - Mail/Jabber : Yann.Dupont@univ-nantes.fr From st-sales@stocklottrading.net Tue Apr 16 02:44:18 2013 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 319C57F37 for ; Tue, 16 Apr 2013 02:44:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E472EAC003 for ; Tue, 16 Apr 2013 00:44:15 -0700 (PDT) X-ASG-Debug-ID: 1366098252-04cb6c6e2b132070001-NocioJ Received: from mail-ob0-f170.google.com (mail-ob0-f170.google.com [209.85.214.170]) by cuda.sgi.com with ESMTP id 0B6cjkYzAxFF8X72 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 16 Apr 2013 00:44:13 -0700 (PDT) X-Barracuda-Envelope-From: st-sales@stocklottrading.net X-Barracuda-Apparent-Source-IP: 209.85.214.170 Received: by mail-ob0-f170.google.com with SMTP id x4so185740obh.15 for ; Tue, 16 Apr 2013 00:44:12 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:content-type:x-gm-message-state; bh=nKZXYfbPLC7GPpuLoj3PlAvig8XK67/iu45CiT8HAVE=; b=JtBe8QEx8AVEjNu2PyR/OkHbtFWHFzbtsHFAPMLvn9aGyECKE/FsKl9B0RCKgBouzb D8gvAdtHNeHOMUCiXuD831bBd9HyngrVRFmleqGflMxKHTJhWEaNgB0uFG9G9hoCsOLv 049BYbpbiRKUIxIfRPK3ICGvvCV4DN9WHqx6TmQfHgSIzNvbXuCoLc8Fc+WhenQo9fkq mBa+Y2JD/68Qr8bRH/ht1wm3nNklnzhM0vFJ/GeyscZWcXb3DgIp+Ykmbb45OCEGYCGw po1Xs2oTKfpUpZVVlguVPBsruvtmXzfeT88Y+jNVrYi+E89KnnaHWZngKhojpKsrh7LB vKkQ== MIME-Version: 1.0 X-Received: by 10.182.209.71 with SMTP id mk7mr392154obc.57.1366098251061; Tue, 16 Apr 2013 00:44:11 -0700 (PDT) Received: by 10.182.125.103 with HTTP; Tue, 16 Apr 2013 00:44:10 -0700 (PDT) In-Reply-To: References: Date: Tue, 16 Apr 2013 14:44:10 +0700 Message-ID: Subject: =?TIS-620?B?w9G6q9fpzcrUuaTp0sHXzco=?= =?TIS-620?B?zacgt9ihzcLo0qc=?= From: Stocklot Trading X-ASG-Orig-Subj: =?TIS-620?B?w9G6q9fpzcrUuaTp0sHXzco=?= =?TIS-620?B?zacgt9ihzcLo0qc=?= To: Stocklot Trading Content-Type: multipart/mixed; boundary=e89a8ff1bfd6fbbf7704da758888 X-Gm-Message-State: ALoCoQkN8i88qPRW6Dvz0G3VM+PJ8S1ROFf/1Ixl3u4igh4fesKoTQLWquDFhYT3g544+rpXbiS1 X-Barracuda-Connect: mail-ob0-f170.google.com[209.85.214.170] X-Barracuda-Start-Time: 1366098253 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -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 --e89a8ff1bfd6fbbf7704da758888 Content-Type: multipart/related; boundary=e89a8ff1bfd6fbbf7604da758887 --e89a8ff1bfd6fbbf7604da758887 Content-Type: multipart/alternative; boundary=e89a8ff1bfd6fbbf7304da758886 --e89a8ff1bfd6fbbf7304da758886 Content-Type: text/plain; charset=TIS-620 Content-Transfer-Encoding: base64 IFtpbWFnZTogSW5saW5lIGltYWdlIDFdDQoNCg0KKrrD1MnRtyDKterNpMXqzbfgt8O0tNTppyCo 06HRtCDD0bqr1+nNytS5pOnSt9ihzcLo0qcgwdfNys2nKg0KKuK7w7TK6KeizeDKuc2izaek2LMg 4cXQytS5pOnSt9XopNiztenNp6HSw6LSwiC11LS16M3gw9Igt9KnzdXgwcXsDQppbmZvQHN0b2Nr bG90dHJhZGluZy5uZXQgy8PXzSDit8PL0uDD0iAwOC0zMzY3MjkxNA0KDQoqDQpbaW1hZ2U6IElu bGluZSBpbWFnZSAxXQ0KKqLNuqTYsyAqDQoqytPLw9G6odLDtdS0tejNocXRuioNCiogKg0KKqjS obfVwSDKterNpMXqzbfgt8O0tNTppyCo06HRtCoNCiogKKLNzcDRwsvSoeDBxey51enDuqHHuaHS w7fTp9K5os2nt+jSuQ0KqNi0u8PQyqek7OC+1+jNodLDu8PQqtLK0cG+0bm47OC36NK50em5KSoN CiogKg0KKsvSobfo0rnkwei16c2nodLDw9G6zdXgwcXsIKHD2LPS4ajppyAgaW5mb0BzdG9ja2xv dHRyYWRpbmcubmV0Kg0KICAgICogKg0KDQoNCi0tIA0KKkZFRUwgRlJFRSBUTyBDT05UQUNUIFVT ID4+Pj4+Pj4+KiBpbmZvQHN0b2NrbG90dHJhZGluZy5uZXQNCg0KLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKlN0b2NrbG90IFRyYWRp bmcgQ28uLCBMdGQqDQoqQ29udGFjdDogRGFtaWFuIEJhdW1sZXIqDQoqVGVsOiAwODQ3MjQxMDI4 Kg0KKmluZm9Ac3RvY2tsb3R0cmFkaW5nLm5ldCoNCiogd3d3LnN0b2NrbG90dHJhZGluZy5uZXQN Cg0KDQoqDQo= --e89a8ff1bfd6fbbf7304da758886 Content-Type: text/html; charset=TIS-620 Content-Transfer-Encoding: quoted-printable

<= div class=3D"gmail_quote">
3D"Inline


=BA=C3=D4=C9=D1=B7 = =CA=B5=EA=CD=A4=C5=EA=CD=B7=E0=B7=C3=B4=B4=D4=E9=A7 =A8=D3=A1=D1=B4 =C3=D1= =BA=AB=D7=E9=CD=CA=D4=B9=A4=E9=D2=B7=D8=A1=CD=C2=E8=D2=A7 =C1=D7=CD=CA=CD= =A7
=E2=BB=C3=B4=CA=E8=A7=A2=CD=E0=CA=B9=CD=A2=CD=A7=A4=D8=B3 =E1= =C5=D0=CA=D4=B9=A4=E9=D2=B7=D5=E8=A4=D8=B3=B5=E9=CD=A7=A1=D2=C3=A2=D2=C2 = =B5=D4=B4=B5=E8=CD=E0=C3=D2 =B7=D2=A7=CD=D5=E0=C1=C5=EC info@stocklottrading.net =CB=C3=D7=CD =E2=B7=C3=CB=D2=E0=C3= =D2 08-33672914

3D"Inline
=A2=CD=BA= =A4=D8=B3=A0
=CA=D3=CB=C3=D1=BA=A1=D2=C3=B5=D4=B4=B5=E8=CD=A1=C5=D1=BA<= /font>
=A8=D2=A1=B7=D5=C1=A0=CA=B5=EA=CD=A4= =C5=EA=CD=B7=E0=B7=C3=B4=B4=D4=E9=A7 =A8=D3=A1=D1=B4
=A0(=A2=CD=CD=C0=D1=C2=CB=D2=A1=E0=C1=C5=EC=B9=D5=E9= =C3=BA=A1=C7=B9=A1=D2=C3=B7=D3=A7=D2=B9=A2=CD=A7=B7=E8=D2=B9 =A0 =A8=D8=B4= =BB=C3=D0=CA=A7=A4=EC=E0=BE=D7=E8=CD=A1=D2=C3=BB=C3=D0=AA=D2=CA=D1=C1=BE=D1= =B9=B8=EC=E0=B7=E8=D2=B9=D1=E9=B9)
=CB=D2=A1=B7=E8=D2=B9=E4=C1=E8=B5=E9=CD=A7= =A1=D2=C3=C3=D1=BA=CD=D5=E0=C1=C5=EC =A1=C3=D8=B3=D2=E1=A8=E9=A7=A0= =A0inf= o@stocklottrading.net

<= /span>

--
FEEL= FREE TO CONTACT US >>>>>>>> info@stocklottrading.net
------------------= ---------------------------------------------------------------------------= ----------------------
Stocklot Trading Co.= , Ltd
Contact: Damian Baumler
Tel: 084724102= 8
<= br>

=A0
--e89a8ff1bfd6fbbf7304da758886-- --e89a8ff1bfd6fbbf7604da758887 Content-Type: image/png; name="image.png" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: ii_13dd8ef92718ec1f iVBORw0KGgoAAAANSUhEUgAABCYAAAJDCAYAAADXQhXsAAAgAElEQVR4Aey9aaxtyXWYV2e68/ju G3tgd5P9mk2yuzk0B5mUGdoSZcm0bFmSDYGJEAOCLSABDCR/Ev1K8it/gyBwgihxACE2HAsWREcK JcsSJ3GQKYrNbjbJJptjT2++83TGfN/ae5233+XrthMYZAO+671z9961a1i1alXVWqtW1W6VUib8 TuGUAqcUOKXAKQVOKXBKgVMKnFLglAKnFDilwCkFTilwSoFTCvxIKTCZTEr7R1riaWGnFDilwCkF TilwSoFTCpxS4JQCpxQ4pcApBU4pcEqBUwqcUqBBgVPDRIMYp7enFDilwCkFTilwSoFTCpxS4JQC pxQ4pcApBU4pcEqBUwr8aCnQvee++8qg3y+r6+ul15spg0E/rpPxuBwd7JXSapV2p1fGw0GFGc8F V4twt+h2ed0q/eM++0EmZXZmprQ6nXhHrHjnPpHJaES+gzIiXYf4nXY73u3t7ZWt3d2yQdkba2vl 6Pi4DIlrmd2eZQ7LGDwIiP+GCSPChU79LC6WZ7q48GdEPvvkzasyOz9XOoQNyWoyAg/qKy6HlGfa peXl0qUufZ7HPIvfHHmL+8HBQeDUo27GHYHPDHW0rD54iMsM73rEF58W/0bQ0LQ+W4ejoyOeeKYM YQgtDg8PA8fFxcVi3q0WZc7OlC5lDOtfq90p4/5x4NaZmS3Hx0dBx06nXWZoK2llWT3e9bo98qMs 6haVppyZ2dkyC67H1kvM2q1Is7O9XfrEO3Nmo8zNL9D+lBE4lKBBts/E+okwdQ0ajye0S7e0qccA /AfSYnYu6i4eLejWBg/bW36x7axLh2bpUP6YfKT5Hu0yv7AQbW6cY+jR4tqbmwu6jXke8iyvtKFB tGvVtPBixXPStw4SQwC6mQ6ce+AxS91JLCNQd+pFuGXZFrbZ8tJS8OshdDB8Rl6GjsaXzvKP7Wc/ ML5t1LXN+4PSh87yywzvZ7lKr2Pzp67S2zofUo40M1/LF6+jw6PSh06L1H2BulqvLlfTD0e2ELQi 7gA624azM70ygF7Sp0uc4H/CB+Rl+R1oMZyMoy3FU5rMgac4Hcjj4s29bbizs0P5h2VlZQV+X4k+ b/068gfhbfKx71qu+CdtrUMX3uxAzyF0kY7yyiy0Gtrm1KEDL0JE6jgI3OR5w+UTr/b9Xcq3n6zD c7Bh8Jk492wn4mSbtymvB09FbXgvP5mHccRNWrXNoAGDIW1lnwCn2W6H9qHNiSsebetHW9gHlqn7 /OJStIW0kUfklRF5H9MHxqSbpWzbStxm7I/U3T4vTYzbheadlWV4GZR4piHKrP2ce9tKOrRIR6K4 l9fFY2l1Ndo92pgyWoxJ1sd6teQz+y15tGhzaT6Gz1q+pl4t6hQ0JV60EWHjY8Zj6CC9GDhKa2mB MMYd0plPm9/WznbZuXGrbGxslNULG2Wb972F+bJIvbfBVTq15sDVdjoirTjzPEn61u2wD3+M6cRd +Ma2cKx3vOpTzxv0hWPKHMMLXeJ3e4z/OOL19/fL0YsvBG8sPXK59GyHfcbS8Sj6UvAuOEjbaFfy sm2ln3xsPR2v4sG2jnLrRoef3sC4sEJ5q3PzZYZ0ppFuN2lH8xyD84jyFjbOlnXqbH+2zqutTunM 9aBbYQw+KlujfpmHb5ZHk7IrPeZnyyrz3fEBdYafj0BhH5y70KxD24wH9CbKsU2kxRDeknftH/KM 48fBwX45hN+X4bX5M2eCvmvwcdc62V41BF/T01Z4twv9huBn+zu/LHVmyubgKMactS48Sf/cGh7T 5NVYPNelLy0sVrxM+dLHNt+l7GvXr5fVpeXy0MWLMQbYF1YXF8ou+LVoq3npLJDGd+eh4RI0cHx2 /HB8sZ3atPHi/Hzka51/7b1/qVx+6KFyQB33qZ/xHF/s/47/Oc9Vmd/+67xnfxO8N41geiHfeZ9x 7YOOcYL5+ptjrLz3DW+I+XtrayveZX5Z9iI8Ojrsl629raDNEuO86SwryzGN0Hz23jwsV8iyfW6G nT17NvLaR3aZI5+jOv4i5TTziBLqcswr88m8xCnDo8ATf3xnHmJjmqzfgw8+GDFv3LgxxcuAzDfx jkg1bvbvu5Zl3SLinfU1yPiOZ8pJzbQb1F+w/glZZuIQ4ZZNHk3wvXHvGr8ZkfuIaxjxs+4+XoSn eUn73lm+ccxXuppW2VLwudlOEfgaf7IOTRybYaft//psf8dhecV+6Hx/R/vXPBE8RZyTkG1t+N3i NNv//kuXpuOfvJW8eebc+ZAblfGOmDfmGNOFHnN1hzFV8F3CHPO/ssY+Q/Gi04byQAMWybsJL1+9 UmYJe/gd74jgnStXGecO4/5QeaMBS8yNe4zfCUuM7xPwEPaZR+4Gi4z1+8yLCOjVa+bB5v3uy1dK n7DHH31LvH95uxp/fZhbW42wPeTDu8GI+VfYPzxgPllg/p0tu/PIOQd1WXWiq8y17fkZ5m5koRp8 nmzulO7Wdhkim6w+8US82frBC3H1vZBpFmmfw62bZfLK1QhvXbqAjL3APH0QcTJ+vGz8Oc88vEa8 MbzTbtDeZ2ECXTrrq+WRC/eWm61xGYBPi3qMtnfi/T3nL0b732zQxRdt5ALjTY6QLxlPhZ3D/bJF GWeVr16FZm3eLdEme7SXcbZefqUsQ7vH3vnOyOOlK1em+UVA/cfy7gbr8IAwAo8m7CBpryCv2SZC vvc57ql/h/a9deWVeP/2xyv+u4ZsuUB9FtGdT0IHWXJEW52DniEL1xEmyJ9n5hfLkrxVw3/2l/9K 3t5x7aqs2DEXZV4moV0QOUCgU0lHTqmUpuF+CMkdhE6FKZVDJy2FFwW+I4Q4lY4FFC6hj6A0qTsA WQAqxQr4CH7xTIPRUSxnQHnzlN8iz6NjlCcIp4IZhgmFXsoRv0p5R7GlrMnECa5SqlTGI3/wUpBV ufDZ8ocoLMLe7lbg6b1KKLNtKIt20VnrNJ4vu9u7Iaiaxwjh027cQfi0jiZRGUqF6FgBk/IGCHlD lMg5hEnThaDKpDhUeKWi1tV8Bsii3iu0hwGBOP1BJRJMxihPiCB9BOpjDUHgP5AZVRIijxZ1d5Br IfAyENFGKnMKobaX+RbCvfJYCeXkL+49aLfHG9toTJ4ZX+VakMYdwrcRZidM5MaRPiqr8Z7rRLry YHnSenRIPtRZfG3TOdrKeltGAEiMobsDYSgaVWj8JVooMeIxD7+oGKowH6DEDEjfrQda8zKOgjyZ R95ODvJY1Jt7204+TFBZUjDsEb9PvipTqfSYl3mqFKiMqUhaxz3i7GN4UthXKSFS0MSajKiXcabK ev0sbyculufUIM8p+AZ9qSOqZCX0kv4Y3pV/fXdUD0LSq0WYafoaz0iv4hs4WiHea+gCtTAmWJ7P KtlkdFtXoxyfbDNxkTbWvTJ0yLdSqQL7s6DSPwNvHO734XcGa9rSvmJdjW8e4qf6JP01fh1YN/jD NhdiQm4fBL4RwJ8wRnHVQBCM6wvKNC8NE+Yt3RcY8PZpbw1+1r8t/SnTclr8rGMHJd06Z72l34j+ YF07TLpkeQJawUuDg35h+op0RrBsIx+Ae4/Je33mbIxNm1ubxR61t10ZHCqjHDggUPQ6+2F86EIj +4Ng+6p8jhgjHYfK5iZ1AkfwHmOoEx2NuraffWQ1DJ2VUat/hAGPuixiFFG5PYAmKs00rANl5G8f E5xURjPdssekdwwui7RVG4FFc+cR45DxLE1D3zF8IPS4zmHcbFFHDUzHVtl3xNW4MSGfVhdDBcJB 5wCBjbw3GXs0Vc5RnwHpZuhHGt12+S1S5yPH0Z3dMqS99jFijim7u7FOIztJgjP5i7HK8jZ0mUAT n/u0fXsWypLPROYl7865c2WGcoY8H+4yDVLvYyZcGp3JuhJAWtS5BR0n5OVYNgGf1gKCGfScYE2O 99QhmJJyxOFleKK3tlHGzCH70FwjmXipaHsdbO2EMeTc2fMo9P1yUAsq++R5RNxllHqYNeaXfSxA B23wps1L/6gcUp+J7cREqtGoMqxtBe9p8JOm8xg4JuAMcXiGj2k7hYl5cFeYGTKfjGehOXynnXET WtjPwnAkjgJ0alPWvgIIfXEovRBYFCT3qN+w5o9K9KmrL03I5xhDl3P3CFzEL/Mb07YhXGEU6WFU GO/thhJ5navj3BJ03ydyjFUaI6ABZjIac1x2xvA47zToyPPry6vB9yRDRoUfEfo71HGWd1vDW9UY V5UcPF7fxmWTPnIK/2FQYJnxzrE6Ie+7hsHHQo7nGee1rhlXo73g+J95qgimYSnD8pp5+mwaf85V JI5Xhk/fEWLo9Jm4aYiJNHVmgX1dvnGzfPNOo5RRnX99L2Qa88mweMEfjSTSpFmnfOc1w00XaY3f gFCE810jPMsx/RS4jzoRv1mn6XtumvGzzAxT9hFfn6eKPsqRRkiQC/pl3CzfvPP+R93+4prtIF7W WWXesATp5zt/iWe+y2ffpYHUdxnX97uMuRoaNMYOlNEB72Mxy8UFQKNE0yBhmIuhQoanUcKwplFi ibGYmaLsg2cTrEeA+hFyZBolMs64VpDbqysZNL2+sr1Zlln81fhwNzBc5RmB8M7XtQK5grH35vxm 2UDR7G6slbF6yFXwS5xI1TRKdGvjxrBO3yH+jqsswMFkVBaog3PY3UADQ6uue2u9qsuEcoZzFW4H yMs95sc0YEzjE8ewgXIVMFlbj+d5ZIQMi3CMHHGtcbcs879G2hXvxZ3nJeb3PXBNI4XYjja3y82L lyJ95FEr+c79V48PwvjgvQYIrxoDtkJTmSaJcGvVJu+7GSWUIQz3l/N+lFXjeyPSsZhKGU3Q2CGs UW4TjNdSTli7bXxovtcokZCGiGa7apRY4DdCbjT8HPlrktIoIVyHr8/RH5qwM+AdvzPQsFsbzTRK CJvIGKE0NRPc5b6rdXFER3SwGcKgrriHgGjkSaUUqsaHcIkQpHI+YCVH4U5ec1VeZaSFtNyZVdlC oQOh0agyDigAwYV0ZhTlNoxD/irdQ4wDKnlIS2VWgwZ5uAqJisUV8SgUEFaluaqUKWzvHaLEodwv zZ/FCLIYwpUr/wp44mBRlWGiErw0hFi+CkMIteTv81DhTYGSKmpM6bGa1BkzkHW5kpd4qag5GCh0 qlioSCrYKSzHSin3s2ag4cIqcqsxYIYbFTiVLVdbFcBVumYQYmdpJPPQ8LKD8OeAdxbBXUVyGwXd cAXrrmWQX9SrVsQUQGfnEWQheqzW2TYYAMYw6oSfK5gqDhptWl1XsVXqqbv4gZ1KljR0VazNe1fD TNtGOF1ktVWDkAO4llwr4yAs3uJm3fRgCDpyH3kRbtu7+pV4i7MKagjg4BdtTxg3UZcBdM9JQjw0 2BwTZhuqkLoirXeAz2GEIKwPf2q0kG5h6OBq2irbqg3jiTJcPZ6QxrYV9yg3ipcOt/FXwdPbw0kq jGCkkS8DB+47pFVAF/9Q8nw2PT/DoGzEt6uF8YL8pJeKsAperDhTF9+FQYGw5Ev5YgFFUqOMXjMa 3swzaWsepstw07nanIY5lRDj2ya2t4qR9ZXP0qOoMgxWdU7vBdMIKtRHfeoLvuYVyjvhOSmbl3xJ IWEsyXDTG9f66ClivhpThFgpljbWvUIs0hs/yzEeHKhNMLwujqF35hd5QQc9OMxfvKy/7xUupEfS 11ysru8Sou9DkcNBPSmJa5SH/k8+ppVXxfMIBdnBesxgahlkVBYQtgQ9J0bQdIbE4iA/yXMaJaxW n8nCHwnInz5ket44mTgWGrfTwuiFoBLeNqQf7zoe9KkHiiu/8d5+Ge5Xq3nRjqQ5Zmxo01/mwO/g ADrS5go3jj9t6GHfG+LphaG+qIL6Ex/TW07wFuMJPY86UPd+ZaQ6YBzaY6VgCTzXWJ1wbNcQF5Rj LDpGYdcwpbFDj48xY7ErT0PoIK2iH2M0aM/i4bO8FGXuYQSg2MgjhAviGSA+jo2TMQo743v71g6G EDxxHDcZm48xfg4xcjB4hrFFT5BxeOTRm2aZqsF/gnAlD2nMgAkriz1t36JO0qSCGjfHNX57w0l4 uwRTEEHPkzErUxq+9Azah1/6x8Oyj8FhHsFqD+NIG/xaCC6QvHQwtGqAGzt/2IcZZ8MoTJ0c8+1L m4eKiij1MxhnmWA1TIxpY/u548ME2ul5Ft4/jnEKXozNvaXFssb4uoWRR6MMA0hUIejPnUYPx5Qt 8pDH2sxFrijNkrdzSNa5SlXVXlp3ed9lXpCv7M+2VXjYQDsNkLu7rGZgRNAItsVPTxFxXLaexIn8 yKdt2/Hs6toQbwwpvMjcfUi8JXh6iVWPoD2N6/hkHa+wcmKf9l7o0V8cRx3XFeYNf/EH3493p3/+ w6DAEuOUY5KygAZYlbBQoJvVRzfsIPwrX8SqMoY4Qc9FFTzlz1Da6zQDxol9+oxj9war0RWfYRgY 4jkDj5mOl6VTL4aZZyp9ZjGi/zcNB52aZ40jbvJwyDvgfg6lTS8g80g8TBt1EO+5blkmnpDlpaJp 2DIGQBVW62H+CSqwxrujftAoIVfSF+hvgnlYpr85vKSkV4J4Oa8IepZeZoxs4mz4DxkfqIPjaJYT 7bJXK7w1Gpln0tpg6x5tQTnSX3kgPFV8R7tJtzU8ZzLtiDDTZP8X1yOMrJYdwLsh985ntp15qHcI qXDn+BGB/PFZOli+Xk/mbRrDNJCu4WHdHIfM08WGDvmvyVPwT5Nmma9XPapYXioaTqRZ09uhGc88 BXEOuZh7DQpCXsO7DXluj8WWPu/CmzpigEutsEl332mAOOfYzW+HBUlzWmnf5gfD9qhfRz5UDgf0 nNBIYd2l1Q58/Vqgt0RCek4sU/bUKKFRIUFPBowHSDIREl4TypSNFW0IVHZoT+EmssQ9N297StAY oaweobTerkVELWmUqJ6oBzQUcmWeSSsMEHoShEcB5TRBY0GP+VpPBw0OnSsVDholFjHKa2zo10YM 4yY0PSP0lEijxNSAQUTjp2Ej0+VVj8kV0gUoOzEfCrcwaOjxcYY6azDd4V2C8lX2+jQYeN3S2AM0 vSU0VmiyH2/dindp+IgHw5UvvVJOvvNeA8oIXPq1ASoivcYfy9c4IkwYn9IDQg8JId+nJ4VhESev tIvP8vkovWjA4Tr5CpuVxFfWee6Q5RUIkMYK36/0sAsoc7u4g6yZnhP3s2Ai7GWe8fTDf4KfQrBF UBkiqCqs6L4XChWDwR7C5Nsef6L83C/+3fJ//PN/VmaX2uX6D75Vequ4cIDQ25/AtWTxqPzpl/+4 jBFe73vDW8p99z6GIMZK69b1sofLx+H2HgPb+fK2d76rfPELT1NOr1y89ED53ne+Xo7bO+VDv/gr ZbLbLy+/8q3y1Fc+U7Y3r4RA+/h7f7685/0/zwDSK5/59L8oz7/02fL+/+hvlXc++Q8Z8zBMIJR2 evzgnTFWjSGabqyYQbQJvroKyykE5kMI0PFCl2Nu6oAQshHSIj71UmgN5WeagMwMjBjTXOOpKkkc qjRgEZSO3CLPcVnrjcoqhoUexptD8H7pFoJ1C5UAg47pJ2NoT27jiVsyEGp7tDTFjFEyeoODcuPq 8+Xbz3+hfPc7/6a89MI3WNnsloXOUrm6+X3cd28yfiAYY4wYjfdov2r1eZZO0O1paEK4Lwvl7NmL bDHAxRrPlPWNZcafjfKudz5ZHrj/Uvnas18tzz37tfK+J9+PwjYszzz9dPnKl54OwTzcxRFsFWKz rtJGgTiU9agt5IFvwmhDXCnks4qu2zScWJogzw3p6K4waxAwPxVd20/ec8IwrfkLsZWCfPV4iCYh LMrzagSBfEyvt4M01AigUnsSLC/eOVmSv/eWojFEg4GTQItJy/pZZ/M1juWZr0YP78XTSbtqL6fF CqxLKKmk0QtAhddJNMFyzNtJ13wE8zcfIcO4iQHPZ+MmDsYJDiTc+mrQ06BmPJUV8wnjAmVIvzto YHzC/GU5EZc8M9yyyCTqbVlCxvU+6u9NDWmoS0pHmyUOGYmriqQTRShh0gacxVUFTA+oeSZ466zB RpC+4i5eCbyOdD6LU+KugSnrbb4Bvie9beE2Mw1ffducNjadPGgfWUCBdPW5NZCG1g+eJQuNYdZt gpCT7dfDiDDnc80T8uWYvMKARatYDo01jT9kYLYePQVpM4UGFmKrH+MJZXnWQ4U8cdb7KnoQ+JWY j1WL+VdHqSIiHBEgT+xptGBFe0J+U+OpHmUoxy09DogTK+k8W6D0mUc40kvhUCGSPthiTDL7atoh mkYU4pl2TuEJhfvQq2HE8zdhopzM0XfJZxKeFNAPbzHxVxFuUYbbIQYIU6Fk23ZhMHVco2IKcggZ bh8ZsKLPAF7aKAl6iUzAKcqivAAJVpUaHhS2yT6TuP1UA4Kre0FHYrWZCDUdzdCuOBNSjw7CLNtQ UBqWEJDcBrexuIxzxn7ZAc9oBPuXdWPcgahh3BDn2JIm3kzuQTeFjVb4GMRz0BNauzVEI6rbvPbg cctasywExairPGUdqE72pWirqBbtCI/IA/sYJOzLwcN13cEQMRoDDL9FvcRo52PHTif9uu7Swa0m bXlKGtAG8ndsc+LdkvxP3MDXMnnvCpllOt8rrFnmIXOHvU2+IiBII4/6TkHffmA+qYDpHCioyKgU qEC+HkGaj/ROlC5WCLCPMRJyh0E5FISa16BgjFXw6M7uXtlGBtpFjrl583rZhU/dnuVWkn2Maa4k S+cD2sNhCjJBM+nmuIsRTsG2bnPHHN8r7F24cL6swfsXL91THnjgQbZbnS1u63Q8CgBFx9FqXCFP sQR32yF4o4r1uvhru89RVxV0lWVBpTX5xWcNCamox7P9TJ5xvHQsKFzJI5X4WI4nVJpVvMZcPk+f Qu7p1EqbymsaCCq+s6dAN/Mz71o5zbE7XpImebipcJpGfAWVWvHXg8m58OLSxcr4QLsLWab34m+d A28UpRFdLJR6yjde1ieU+LpvpMJqesH0xlXpFrdQ8JeqbQLy13Q7Um34kM5C4mF54hxAeuueYFka PtJwMoeRJd9bXhNUfKWp85eeW95bvkYJ5bFd7gXLmxpBiGOLN/t/cECNQ8gSvDdvjTsuaAo+pyEh 6e6zBi7LzXS2f5blAqrpbDdBWjXTTutFeL6Pm8Yf20GjBJJbmVuuDA4d5p2kpVFzbNuv8VhjO54e dm6T0/CgDCqkEeIQ2cMwvSacP+3f+c58feezUvgBPM6kEun9ozEiQS9FF8WEFeZBvSI0Smyf2B6Q 8e96pb2df4Tmdg6fT27jCE8JRkFGMF3iwlvReFPQQFHzyEytSO4xl/cX4T/a4W5w0iBhnNzKEfco vHpNONLedKECGLLicr7OL70lIrxW/t3KkeHKX30XOfJdI50jeYKGCA0XgkaISO+8zNaONHj4Lo0U 3gsaA3Lrhc96TWgY0CghpBeX9xotUvn3uQl6MFT+HlWo8fRO0INCo8bOLVR7ylqv8TeWHhkaRsQh fvBReE4QV0ijjjg0jR3xkj8rbJMQ99xekkaSxFGjRIaZ5qS3xNZxxTdrmSHX8ASizbalNx63E2nI HCWPNw0RjSRhlHArh5AGiXU9UoE0SIyg6a26DePFiT9sC672OrYUrmCXVE6cFF1Bck+85wG8430f LE++jMVy/1q598FHy+W3PlJu7dxkdWYTQ8LXygwbpfqTQbn86DvK+9/7d9nT+lB56s8+V176wTPl 3jc+VLZu4GrSXizdxa3ynnd/oHzwg3+zXLt6tXz/6tfLuXvvQVAu5dl/8QKdf7H81F//9XL+/H3l zBveWS7c/66y3Fsol9707vLtF/+szCywR37jXlz2HUBUWENOY+WISjNvhEGB8In938oyo2tE1KuB cT06BIuACCIVJRQmkLlDD5vG55Vym2mEGPNDmFGQiSwj3D8hMOSVB6Ppam32kZ5nZdkzjKVn9B6m niwmFqe4YY2jeWSawJfnSsAxPybSffbHl/Vy9vCNTHRH5ZFH3sYZD6+UKz94rkwWL5XlwQUEpZus gB6yB/eRcmZ9oxxs4wp0gDt2OUAoYF/scRuhkxZmUF/GuLS1d6Pcc+7R8spLN8uzz36DYkelT0Wf fu4pjBcH5db29RDiHCetc8eKhRAvHSvFXGHPCUT8Q8iuCBU0duCJ9xA4hFzS0gwR5lYQvVaOZ1Ri qoYIwZHCFLpURlMhdWIyvXyqgURFP+MaxzAFa/lVhd/0ui9KQNMK4qL3ip4kwd/koTCpwhirjaRN Bdb35uGz4Cqoz9kvvPfcCI0bChDiIn6WIQQteFZJVgDW24PKBD6mNa7eGfYtEkc9zcP8vRrHelWZ VQqrq7Zt8nEvve+jEAus46p4C+aRE7rPgSs0sZ5psPAcBukSAq/lUZY4ia/gfeQhboSp+Ihn1J9r 0t6rEPhUN/GcdYnwur7Zluarp0Qq4cYN/uHqhCMPhZcOOOnhMF8LYBodzM+4buXQMynxrdCo8kl8 bBuFG9NYd+PKH5ZtmymcWJ8wdqHIGVdcVLjs93qemAcZRDvZjvKDXk9uhRmqiPOvxb3biUzrukMo jwopDkakFdpuDwBUTsN4Im+KNHQOWuFBYdw2Rt0EBZgBxoZ9ttvoRklrTRWUwImIjn+eM4Atpdoe EInJV3wYcPRC0+Awy3aAeZSC9hKK9a2b1UBH/YS+K//QQXzaxNMjY+RWDIjQRuk91FOBeMTC8IEn gnjzX96ZtrtBGCVa1gu6eE6L/XuC8tBy1Z98j1DgrG+LvN2aUfYwVBDHSXiiYVaeoL3xEyyzCGQt Bsk+23IoqfKkAMd4j1AnHhPaaQthY5l0c/xaKHTz9O8jBR7zAaTtANruagiyUQ2zjrTjmPrf6tcG MvIKAxXpHD/c1tFyopAu4Ox2l/U+Hh/Q0h6S45X56fHgIK8HxQHvpZV0GTOXdqmngmEIq0zC0d9q njjAe0NPlWXKs++Ka7QrNFSQHa2qGFUGBiYPrA8AACAASURBVMuxFRxhNLbEM/EVTOgsQXOIySRI P8eNtystWRVbW1gqC+SxS1z5e59y3DLp+RKWB0exyonRCJrEahrt5qQYgj75QZ3ShdbyovUyjeca qCSoIORqZowVvHdMcQUynwPR19EfSR+GJwQE2yLGbAVLcByjHNzavFVucDbHNqt/169f43c9tpxp lHC7odtC+7RbtXW0Gg9pNMZqx072HCMnyTL+0svENq6a3HG/mkPkD8fDl156OWgaRkvGo5WVpeK2 o3vve0N55PLlcj9naXg2jAauCW5mtnzNPlX75cPrgMautjuupmItSvKckPwQRjH6gYquvCIfaTg4 qs8qyfgnlWXzMMwxW94MLwiejZ95Kxtk+maZcCRj8u14LjhkmIqVeeolsYXS4bvMLxVhcRVU7lXs t7Z4rsPItoJKxJj2h+gH9gV+mZ/3RAgamShwJb24CRk34+stcdQ9iv5mmPXrwGOu4GtKOMLrQeW6 WWfzMa7108MjQSP6Pgqania2kX2Xh3i2+M5c5f3kOyHpb955jgsZh1HiZt3/xdd40RZ1QYZl/896 +Crvfe+5IOlJoSEjcKm9YjJelq9xVrnOq2k0lAi2U7ZVpsn2yueI2Phj2U0wnmnmmKalZ7P9jSu9 hWx/lTCNC56rI78Ijp1CniWR3hUIHGWOOBo3NEp5lX8YrVl4G5VFjQ0MOtYh0jvG8n6/GtojbJEB d454niuhV6dz8dL5c+gR8HmtzHuWQeYRifgTeKNT5ZZh4+/XCuJuvRLfqVfcR/WWj11lAqAZ3jw1 QC8JQTXTMyaWkCtuOSO4rSEVy/oMiYhY2Rri1j8TFgeyz+zoIVmDMopVVjkXrrnIgNLbYwumkOHe a1RoMd/1L+IlhHGwv7lVWmzHVUGmQSKN8XO7h2kE88p8zMP7AX1h4HYOFewqWpnoBEJeO1RrgTnh FnXbcU5lLkgjxXh3vyzTBoJepRoRsqp5LoPvNLoI5rNdG3NCzrl1KzwljKuR4xb1PcO9JodV6LfN nB04Wm7eSxtwiLgXLoS8pNHB3zb57dbGEstTHpgoO2EQie0ohFnuKjPcBF66hUlki2vCGrK11W7p uYHB4WbNHxvra1U4cVdZ7NYg4dU47MOuaE66A/jwldrrY3XtDPTES9XMwflGff7TPl5Nek4Icplb PPI5Al/jT3eF/YF2oBs3rofwrsXeBmsjVDlIuMqj8Prii98pL7/8Ynnv+3+2vPUnPxSeE1vbV8oP fvBs+cKfXI0JeWauX77wqY9zWMlM+U/+3n+FweLF8sUvfa7cc/nx8s73/tWytHK2nH/ksTK/iosO 1p3Fi5fLWy+8CUVlVF688hTMMFfe/9d/rfzUz/0KMu4Kwh5KEtjsMAb0Fs+Xy2/5CDIYIZPjOOAv lEfacXDMSjGCYJ/B1/k6Vj/GCmCsonEdObG3YRgqM7/YK9e/+/Xy1Gc/UTYu3F/edPmxsnbmAoYM mJbtJ3peuFXBFTnEDyhRreiaVvFwiHLvlcyCrK5WK+QxhrIFA+aAbm0EvA6/FspFD8Hbhh2TN7YC hOMJDAKu0HSM27Pu00JHAddMyCsEYIOlPdfJwiW8LS6VtXOPQcefLyuMXH/4//zP7Jt+oXzwI/8x 21Eulj//8idov6Py4Q/9Urnvvsvle9//avnilz+NhW+2PPqWJ3GlWmHPMvu8t6/hzfJK+ewnPl6u v3CN/rhSrmDUOH/v+bJxz33lm9/8Ait/HDaD58aFe+5hPxuWR4TdKYgiwt0MTN9BEfHMjwECm6uQ HoSpIatNXRyQq6iswpH+CFe3Bdx4dE0b4gVy5Mogk8A6YbpPK+SrDHqQqm2o0uiNljW3dwjSxz3Z ltMl/7Dm6ToNLRfoaGu4kXoeQkwetINWaq3Zx0wULTxQ5hZQdikzzr+Az6sV0UopdaXbVt1jIpDn O7YL5euKbuO6DUX3fhVCJy9XhOM9ZaisxOo18XWf9uBLJxS3LnVVxkhDJqEAxRkJpJkF3zMInuJ7 zKDi4YHWX0HV+ssHlqvhRONArKhSpyGD3QCPlvC0AVEPSO2gCHmWwRE/z3FQuVcI1+UztsGA37or 0Vz1BnA7g4fWxNkK8hu4Hls+5TgJu23oWJdB4kcbkp/KuhOfZykcU471U8C2nWwX8Qxl3nt+8oyG APvoKgOUxoFYUYaG866s2t6U11W5hn8oFKUfDx/o7naPNFAEMWKByHwhCbwzYAxQQVC4WF0/g/Dj YbLVRC/tjCeOknGOiVQjh3XXKCOobKqcxGGz0M7tDb5TSTSNxgQNDm4x0YjUXerEYaXL1p0CPJ/B MwZ6jBHGP6Rd9lTCaRu9ByBM5Y4PTU0vnx/QxsE3lBtKvYjyk1YKX3MaFPjn/Qw/hbIFeHyWMsJD RR4WeXBruZUEgwqY4hXBNhWGqT5W2sqIBL9A2z509AyII2h1yKpvHIBFngqZxvPwWssOkc2MeTWW V+vxyKLkBXk7VuEjDhiajjbUCh9GAHB18NfYpJXfQ3pVIIKG4kz/nqENYJByjKFgclStOmrEEIw7 oW+5Fa3NljqGDnDE+0Ol2zZlop+QZxzSaVhEIDiIAQnhv0VWs1RyjuEjMMbAMimbO5xjQt6r/BT8 9lwNAAdV0XnCGI55pjD4Ul7QmDTS5ZD+MbY/OqbI75R9SNuO4RHHnjBGmM7kpAn+JI/wLoHu4R3B JK+HyjFjXowTxJ+2eRRLeso3LPoO+UTbmak0JB8NBm5DCcMp+c9Bbw+ojJJJq3dM8AL1dnV/Bp6Q Bo5Teqi5hWkf3vNskm3adIHrHGPrvm0PfWfgA9tsnrL0ILINnWz0XJpgwN2gj8zCfwceZGX9wNH+ lkK+wn1TETj5bFV+nCBdE4L2PDgGRJ+BC7bZd32FA8SuX7tWfvDCC+WVV16JA3odt9KIKw94bzpp EF5V0DIMDuQUizf2Wvgt2pEiq6vP3EtT+TF5lbQZV5zMd4An5XiEoHpzs7zy8rXy9a8/V/70M58p GxwS/MY3vbG89a1vLQ9jqFhDYDRTa5X1yTrmM69+bKAie1JRTmRUlhOSf0IBZZ48Cb7POCqGwWMo 0HMrKFn021RKm7wYRg8yGqFwN4qq7g0iz+RVjQGZvwYV8Zi+txw8FTQMqPgnaCw0Xmwj4Z1lu1ov Llk38/AXcySh0/S3s7mDPk2jRBoFTJ/3lh15Q7qpt0ltYEAKSNQYK/1f9UXx8icEvuDnIaWJW7ZR 0sJwwTH4pJKbcSKC8ahv5F+naRoljGP8O9JEwurP7dbnuZmeNCchcTVc2c950FhuBcj2shxxSfy9 3lG2+RJ28n3GMVw6B41Qoprpo/14l2CakDNrHlhEBqg8KnpT44Rx5UENXbnlI9KTpgld5jMNFObe Mj/mG+emIUb8SjKhng4ZQKdelPF+TDyNDLmtwzDbSxksxm4DAOM0jRKeN6GRQaNE0/BgXLd3NCEN FZ5FIWh02KgjeLaEiqUfKRBm9g/LS2mUiJATf9AJ3O7aBI0SY+SjtosR6CTrq9W6vEr3BeS+K7Rn DyU8DQkedNmtz6AarNW+B8xJGiUEz5BQkc84Ecj7KSD/NaEyXFSr+M3wuK/TqdwfgJs0CyMBVw0M rMxH+Myl85VRIo07xG+CBgcNGZGGFxohTKNnRW4FkY/9GS8AnWQKZ1bDkKCRQlxi2iDeBr+1MxXt 8ywJjRKxOFEnzvyUQS1X7wo9KGK+QGbTKJHhYSip+cvwNdoq2zqMDOS5TbjgNhAGtbLqId712KLX BJ0njBUR7r3A+2UKdBvtSJnvNeAMOsFrAYfMo1xydoMDrXvHVQysTJzfyKCgAqjHxLvf+8Eyc/8H UEjP0LkQnA6GKJX3lKM1rGAs27nPZHI4Qki/gZB1s/zpp36rfOmLf1LWL95X3vDGt7HF42HcIkfl wctvZtDmkDr2PLeGIo9w3x6Xc+ceKL/0S3+vrK5w5kJvGcUVoRtBq8UyXgvh1Dm+h/DuKf2YGwij 2RAIeOsTv8oyGYIB90oDoVYhjCLmI2Qh9Hc5tOv6y+Uzv//Pyyd/55+VhfVzKN9vQHF/ojyJR8iD D7+lDGZgQtwFhxg62vjnjjBEoOZFGQoGlsR6LFfqW1M2GIg/CnquACr/QEaUSSYq3DMUcI5QJruc YzFC+DtkAo2vTZgH8Vyp1LihgGFe03x9Z13cloKBRYG105nD8nxQ3vr4R8o73/1hvnLwEDTolofc UtMeloWZe/EOWCgX37RYPrB+P3vxLjFGnA3DAU3Jqvu43LzyPcIeLd/4zD8pN29wuuv4sDz6yOXy rne9vfxjDFAXH3gkrOU3X0IBQfFVWM0vLqhoLnAmhUqoK8CefzCHYhBCO/hXZ1lUtFAA1rXbg9Uq pZvJAnoorC9guPFAQgV9BeswEkBf2xaGCBoYpmJkvd2eoYImqHS75Sj2xzOwzyGwL7hCK/2dlMhP GIN7m/qKh4r1KoYL1681lITAj6ITdEfZEye/rDFC8bW93Baj8uxqqs9O6u6VlyeDt+g3zdXTPrir qKgQ2Jek2+wCSjf3Byhkrv6rECvMRp9SGQCso0aQKAtaBgcQx5Wy4Dfp64BA2H64ydsfSct7DSWu YgffkIcTrPdadDVkuDqscuSZFpbvRKxC7xc+PH1fw4D0inMViOvBdp6RIfViZZm8FcgFFaMF0kgj y/DZtveMklgtJI5eNQN+STPxFyeNPuKqIjtDXTSIjDHQRbwW57kQbwK97D+e/WHbhDLENQxEgQHt Lh/C7bbBLArvPAOq6rxfCkmwbraXvCmcYezyCyJ+dUOvmQG8If4aVSg20ppe/vZLEX6Np41BU9xs OxoyDjSUf/ehcXoNHDMm9VWaDXMQZzIQ73kOCjJ/B+ddrPvWQ97zXSot4hf39O9qvLK/oASylc52 PiK94dGWGhdsA8LDc0N8GDQ8n8W9ny29EVBiqSQzIQNJzcseNtlGEOqBl1sptqCH21hcWY861O0q jTxwM0/t5qWDTqWk805D6/CIlX/oLO/uWCfCPevG7QHhXQDPCxoTFCblqRarFR661CEN1Sl9BOSx BqhoZ4qwffiN2aZHZSO9rqxEZ9ImTCMPLptlDQOa2z1onzgMkjHVwzAdIGL0p23pPNE/bbMDwkdM nPuc4+G4Ia9F7tBGb4E2wqO0pcErmpJG490AAWkR/GNLH/E858FzePwyxjZu/PbhBSbTMGyCrQeA WU8PFXUccNuKc4NbHzWuekYD1Q4+00Mj+NHKASqn876nLiOFOMPlS9Cy3yqM71HfMNqQp3w7S5vb bvKRRrc92tyv7yz2SAtN5bMRND6k3rsoXBpVJuc5a1yeBr+ebYOAZBsa13NLXO2zPE9QiXmf/BWq oHDUQbHaL4XsYNQJ3pN/DKPeKeRHQP6RpnWcDHo9XO1vGgFU0r79/PPlG899Izwi9ACJQ3iZD4J+ SRvq4XhlHU1rPxS8l5li4cIA7+O9D3Yb5i3Cqjj1DQ/Rx3mUt6q8qv5dGTzs14Tzz/J871Y2Dwh+ hfM8vvzlL5dLnDT/D379H2CcQBgn+8DDAgHzeN2Aw3DFIlOUUgkMjwddq4kD90zfe2McIfkqn50b hcUzK7EdYUv+AjJP752Xndciy0bZGafJp95rdGimizDnJHEg+/iqi4ZLjRwJpBN/zzaYGkFqXDKK 18RbGrhVQNz8p4GhaXAwrs/m5RxjvATvp0ozC22Zp8aRprEjaZj1U0bIdIZluPkmLdKQknn6zvKs azO+4UFTbwBxFFfTienJuBHJP8Qj0vTRm2ZZkU7c7ohxO47v/TXTGNWtLBoDsly9LTKOYU1cI+sT ODSLM50/62060zeNHLlNRA+ILE/aa0CQN9IDQk+fmNiamdf3GvQFD0pOMCy/wBFhPKfqdpIevr9W fwVBw8M9Fy7Glg49KJrQNEpoUGkaJeL+Wq0w3uVAzPSgMD+NFmmY2K0PLVaF32UO1hixoqcAfUIv iWe+8fXbKKjQUo8bLoowPwp6SFSjJeRBKZ/gaSCs4MG3hWw0sa8Cm3h8hMGBsKs8hwdE/U4jQhoc NFDozRDAvJd5++yXOtITIuJVseKv6c3nDPil0u6LGJ8Jy3Mk7lDW55jrqP8OMlMTztxziYP598NL YhMc0yMhzmSojQDGX6mNDeYp6D2x/53vlW8jWwgbyDH7LP5UgHxuXhijd0gX9eJ5m7Tiq4Eo87F8 4RZf5mh6ZGgwaULWJbwemEOML456Rwi2FQdtVUkwhAtrlqw3hIBHxHbtBWHYNr81Fqcf4DwbD7nU S+J73/pmta2D6BolztYGhvCSAP9z5y5ACOQ139flxgN/NEa4CKrRw6tnULwadD30cBuroV9+CKGH BE7KTtROknZeBa3ZxbOc8g0Tc6aD+/KZHcsyq52z5+4vG0vnyg7c5XaEEd4MH/+936MD/3H5yN/4 tfLTv/D3EcBwwaHufgZxcICa7+lyQG8OcwKcMhigCLaXy4WzWFGCcxQkVEpgeOddJnVVVZVq9IAQ GIekGbIvWmXGaR29nZVRBEDKGPFTSNSk0CXNIuV1xgflqc9/tnz84x8rV7/1dLlvjf077X7ZfeHr 5fPff65895kvcAbGu8v9b39/uf/Rd5YzMJE69W6fclxeoxwFxy6nirY1lkgDgwmzLMEDfiYYMlRi dDfvEE9ldsAS8ADl/BAGdYW7zX5WD7uL9CYE9zBOmFcVbCj11sih+7qMrpKMgodhQ+PE2YuPkZzV W2WlLkalpftoEpTgAfVij0gbmp+/7ywriLOs+kB7cjgif46jK3Orbyo/8VfeUJ757P9ZNndvcPbE PaGwb17b4oC0c5xpgeEB74udrRshBCnwK1yFIoww68DuoH3IQKGnhIOiLtaejO8kJh8pALtaHJWE PgpTClGmVchVUNdrwnuNDr6PbROkSMFLHrRcKEkbVwYGXsOPMHUd1qPj+YlV9/veAh8nX3GzrPjq ADgp6C3wrPK1y3kn7pVsO5hCD88pIaswBJjO9IKGAidj8fMwPNvRPPv8VETG5KGLred5CCq64iuN bMRZPvc36A7CwKNSrGeByoDWd1dojzDMued5iKEgwbLIEN0S1QAPD+mosCHv+PWaAWXFxIryoLHF 7TDihC0tcAr8oLmTrvEUbm0P+5j12tTFinsntCHxNAJIa0qlTCjKvWlzQpb2QUvqIz12qLNfftBo EZ9BNS31NY51N6+oP/nBxsEDegD0SQuiQUu/wOIXPjKN7vPiGuljchOb2yBdK2HecIwmlBNbdmgP x6YdeMGVTPMLrw7qJh7WPbZqwJ+uhvuJ3MNepWAdQ3eNG36NwvziQEvwM73Ku+UF33GvgWmM51MX eovBoQojaVT04gsw9HPPRpGXZrnOg8cmyqEu4H7ZYYkJRqOQ7vXD1mEoufJjlFFXU8FofPNGGE/0 2nAP4RFKq7RVuadyYYCYyJN8qnSIUOTWATt2G76fYJSYaSM0gZeeFBre9BbQFV+l2NV0t8ro7bB/ 8ybeWuDrhE/95IeTMCG+ro7yn6sA0sK+o3eC4NVus4VrnoaRLh4ZKsfjWb4BBO0gEEYF0pF/n3KG lDm8jsGafkBHKW330oLbSA8J6JfQIa8W/D9hHHc8EYYY1YauUOzjaQHNKQD+oQza1WM87SsjDLXu nx2Rb5x3wZzmAZjLTpDE9yC8Ie/2rAd5xtc2uGqQQzSw+5dZxuTRDO0C/TR87lG+9e+T15arPY4B 8IzvDD+Ev6ptGAzAxpVPobtu/z0MoG0ENMvpU3e/hLLDPkP7t/3CgypHGkkd/xRECHPfvFsq3AO6 SbwdxyGu8v8yxjVavLQ24SGExW3GEBcReqyib8OPczE+wYfg5bki1lHvE8cOt8ncBAfHjwW8pOT5 4Cvb0r4Ib/lVhTMYlzVIbFM/DWTSIw5vBjnbf0HDF2Cfc6ucY4D99g44+XzHyx/tQ/Zh+6p4fu6z ny1P/cWXyssvvhgebYYLtqVeJo4fQ7ZN6lHmO3/WO+Jwre6dcSvjg5ykgcltHJBsClmuRnNamnSO JfAIKTXAZ1yzru5vJ7YMt4FIY/NxPPdwbg2cv/m//mZ5z0+8jzO9ngjvN/GLvjYt+XVw02AH6Skk j6joxdzyQ2opkYgK5aMNmq810GX6OIeBPOOZ+E3viBj7aWP5vQk5l2Ueca2jJH6Ovf6EMBLUMkwz HwoNQ74r9uYZ5YCD+XnfNGL43p8QPMW98pEwTRtPdXl1XIMSJ+/lgQTvY+tD5lvTKupNr/W/YP7G NTwPjDQs6gdKSpEZVzpL86SNr5rQxMU80iCT+Zvuh9ISlpDpM47P8csIzavveM40zVfeW3e9un3f zO/k/cnnzCfzzfeGJy4n2993GoSb4JkeI+Ret3KgZeBtyBhI//SLWBoqxE3wXiOGBgkNGRl+e4aL aNM/Gir0opBqek14f4vhIPlFj4gVldkGL2TYNJP6Rm+JhNi+wby7iHKeWzk0PKSXRHpQpDEir833 5uXWDWEHvhduepDSCXALQCsYi7HUbRs1eK9Ror3MPMh1W72JrVB6SwjpGREPyBq57WJqYNAYQbgG hqo3RcwIy+0emc8Q40bmkwYNnyMv6LfMvKrBQYVfY4DQwgMhDQwRwJ80BHi+h58G9WwJQS+FjDtk G4jGgfSKiAiNP2kc0CsBN4lqG0bdNnfUmTTxzPwf3hHglh4QfhZUsBzv85wLw4yjx8VJo0iUZ4Qa fJbv0ijhVe8H5cnwnoC3wlCRCTBKxJYNnuM8CcP9Mho02Gf+EaMD7vPdGVjeGVRvdCF5Jx4afzQ+ pDECRSzenDRYNKJPb7uymgK5q4VOjGmU4KFS+plg7QzOrQOk0Q6uEU6YYTQgsQqOLqAdDrfo8tOT oc+qc4uVnCU+N7bMbx/vB40IAtnyo/epjHPJaTkmcMoQB/djVpP27fcZLzJ5lT/wHxncfmkeDhYt BI5DBNvtTc7EwCKkW+osh1qMOHxyjIBvnQ/3d0IR3+H9wd4OhiUYyzohgCErI1Tezvff6c661ZWo hq2qbv8u9fi35h/5qqTJHAg/gVwlKAV9yUCzjH8VkKStddBYMOa+41c52MctXgqzxjlGiD7EetRS 6VVwRhnW0OC7FLYqsUzBjMz4r6CugKSyeRIU+JwIFKzDrR8e6lFmD2OWCrmKk94FTnhO7gr8IeiT 0ViLUOBeUW6Ct4t1lO9UOkNoRICLiQZc9pgwYgsJefilEnlQlzrLcyVcCAGUTu3+bvfvL6D8aEA6 xgAzpq4aOowjvvaHOfZG2eR+DSF6oFWmLMsOwvMuz9pI5Vn8VJrNV4U26EQVfL+gcsjq7hAc3DYx 4DwWuwGRpgYO42s00Eho3n5FYQhtzde6etXYo2IpHhpLdIF3pVpDhQaQ4AXpwPvAlSJAIPqyvKyR Qg+FY96nUcL2VSjzdzdwgBM3FavwCoJOR/QZOs4d0Y2TuCrMyG96ubhq6+c3D1EQVcqlh4aOjG8m 4uKvMvjBn9RXvMzPeO7x9mpaw/xqgSvDxol6cp0aOSjbvBQ+NASFUQe6uQ1Fb5Uh45VpxtKOeOap J4fpBVfqNJZZnv9UiOUroWfe9m0VcVfvwVPD2DzRuvYV6qVAbb4q8G47mqNcjZIa+Ky/46ntKe6W 7S8MVuQfYzETiNzn9hQ/A+pnKUdM9LafhykOGLM8lNH0QxTQwB3+0tW5Bd/ItwsIUn52s4tnkttU WhhG7Kdxerr1Jo71S3qrXIMIcpfzAC+p7wEr5dIOwkVdVlCS4tBJynBryCbt0FMppy6WFV+pYOzw ecTEHtsY5FUNC+QBwqWD8alDHwigLhCourefQjP5M3iY/MYaD50L5CHyCaT9wxgCE4RB4JCBbR68 4xNbKJgLpHPv6THt6afNhtB7qOGEPMLjwjpbPco6RAF3JZTa0eYIx/CoXjgTxsG9cNekP4KfB5/F gWd8WWrMuKMy77YXvY70sNJwL0U13izhyaMxaob5Q/pN2LZ3gOeHW2c0Plu4xo/gddpXI4Vb4mKv MnXS42SHuIa3ES7j86vQ0znKLV+L0GR1yGor9VtiFeqYMhSGGQyQaGcZ9+gfXP2KlgaEoQeF0e/c 1saaQhg+PKx1kfgTtvYdRWODl3SPS9XPXcWXj8ONnPgerinYpwxXWXg9g7wt2Leee+658rGP/Uva AAMVtAp5hveOTfZrDQfVXEjdoILzR0ULaACvx4N/XHTAYFMZHSJGlBHyDO/D889oddmOMTGG8JxX GYBuEFCNeZTHs7lZqmzt+GbfFqqvrGAQpi1fYCvt008/XX7mwx8ujz766DTPjBsJXgd/QumDT2J+ Bh/ngiYYnkaE6TuiGO5PZdG5KJ/z8EbzTfCekTUfYUzKqVWYjHfySu4RP8tOPNKbI+Ys8s10mblK pn0sDATgZjz/md/0vq5TPPPevO8Gvg/gYh5C4FVHT5z07Biy4DTNp5G/8aN8wnyfcayX96b1yxSO 9Vme3ha+M06GZTqyCxya9fbd9Jl8pJGQYdO0EXrnH+OEt6vzSQ3TdD6T9w8BaczTN7Z/xs94YSwg jlBTMF9Nr5kmr744iWc+e13iJ62i/Zk7BY1Pps94hmmUcH6O9uc5aeFV44O4eS+f5BkULhoInkXR nV9jMRdcGO/rmW96poSf9/ZMCd8JGiXczjGH0VljwwpnC7ilk8MAy4oLS5SxglLtF64MmwLzzQ44 qrjehzIuuDjiKv4K8VTKfWecOM2KlXDPtfLMCLdXNMEtFx5yefLdPYTvLMJbzMVbrhADrpqnsurq s4aKjfvvD6U2zzTYpez79MTj859u9xT8JsVZ8Boh67yIAcJD0ZfISxlN8IBLz5MQ/Pz6jHOw8yhz /CFbz/3ihl/ocMFFmauPfJNf4DCN78xpk3z1M3vwoQdjwUdvYmEGQ40LB4KHZQs++z4PuDT8ZFi+ X8Jg4kGWa8z8ey7yAIbpGdOBnn7J7WLRZwAAIABJREFU4sraZlljy4vbTlhyn+Ybke/yJ3GzfD+3 vSYt68+TJi4mO0/drlGvDeajBMs8YAFEEIdLXOVZwc99CuJk2Jl4qsIvLrEArx6GzJDgs9s1Zurt Nhm+xNeRhPxkqHWaHkQM//rFjg3y8csbeqa6PT0Ou2RLyTkir7Co1oRlFp1eDboq7uFGjqDmRBpC vrFz9vSejupgMGGDfYffHBLOMQLzV59+rnz7a8+UmdG58ou/9BsoKjA/Bxre2H6JLQQb5W1P/BxJ +QaqEzPM4X77VpduwXkPkwmNSYd0kOyyOjzmOOOx2nNYLJRXUUIQClqeFQH9XWWe6OrszK0gyrva 1oHCxEROuAo3KcgHpRgpcJ5RrnO8W579i39TPvNH/3d5/htPIZzslnUEQ778BluhrMyyz1ZB8Xi7 fPVLny5//sxXyvq9D5Q3Pvzm8uZHnygPP/bucoazMQZDD6RDyBYfBg7PhrBvihdFSh2Eav7yTsNK nMhNQB8l24HOqqmg8ToAjPlHvav+HeSW5PVjHYsLgejlQSv6Nh2TPCnTIV+BRMFdmb6FwNTSMARt uriujNg24qc4Jy0UB+h7DLHMf4b2c5XwiMPlLl1+EgNBJw51euqr34Wmi+XNb3lX+fxnPslqukeZ iGMFltVlEPDkd5UyBf3wGAitvRHHOkIE66yAJW/R2BGhR+dZQvDfwTVaPovVYeLnZBmr7RBIPP2j gGgesZIN04tDCng9JguR0/Cg0GZ+nmpuOJzAWSLz4ZWh8BfAVeVGRTHqwqRkmhAiySdoSf6pKMqG 4oeqFHWREhrvgh6BIO/Jo1o11SOmmi4DR8skrYaCYz7DZ56mV5n0ACT5Pmln+eJhOo0S1ldPFOkn 7oEfFZAGPqsIyVt65JinQrWKkbQbYvAxzLx8Nl/BvJzwVLxDwZnW29gNMD7lk8E0MCZonm3B8Jwh TpVrFcWyrJ94Wo5gWOah18IibW4bqQi41cI8/Rkv00zTkVfe+95f0sBycqyK/CgvPvcLbYynh4zl KsxLK7f7qER2oescbV/RDNoTZj/J/L3aH21f6ezArGGCgsNwpieU934eeMKAO2f1uFeokBaRD++l 3TaHMmk8st5n2SeuIecGB0xZT+MJ0SfqdN7rPeQ7t0xZLw+SVHmks0b8aFPw1dDjidvm2UJxjYNg ESxMv4sQEoYj8aSt186dLSOux0zurhJ7EKbGEgUb3fyPGYv1BgjAiAcC0adbTmKuAIHv7AwKAu88 a8OBbRdhZcAKyASLvVti2hhwW0x0GivoCJW3AzQYgXccVkmZbsdIpVacO7HqRBHmi9FEugpt+Bok wqA4Tzs6vga+0py8F/iqBq0cCoLGoLbW/BnOYcCA4EpWbKcgjUbBlbMb8XWLEQaJLSbjOImacmzz aHtogBkFAY35SpqgnDK8xydNtxAIPC9klrZYRHDbp33sJFEHPDOO9jAwMA5SVDkK44VbqzjfAZpJ p6WNM7G1becGRnA+M8qoE19xWYSWUVPz0jDE2Oz2mxUMTp4FsY1XQxz4Snn2AFcgPNFaj67xPvug Se3ZPXRqJn0NQXh/7WyF98MYgbCLdHsJwW4RfriJAWqHw7FuvPwSZ+wgdJDnOgsE9kO9xfYZL5YQ FpYvXGJOY1XGscF6QiN5aLnHp2GpiyskXjUSrvAVE3m42V+bz9mnbcsfB1RcVJUMiQPsN26F+N3f +Z1YMdMoWB1U6diqMbcaY5MHlVOE+PR23FV/pAnE4QevYFC2qxjkuFTNLxoebicwPH+GVnG8VpGq 8ayKY5hG+YhHH3Pu7DB/u0CgHOF80NY7dLxFe3gA43bZpG0/+tGPlsuXL0e6H/cfFbZm+6tedjmA 0flRSEU4+eUkD5k2QUlzuFfNIxn/5evX47XPGddrnPkA7yqc5vkPRjReeAnU945l5ohqGYpo09vC +OnNEfe14pLpDUswzF96DRiedUm8Emef8+f2AD9RqeEk35s233sv+Jw0Cw2dMOOnIhyRIiJx/VfH T/qGLF2H+ZWOxNNryCq8y7hmcxL3O8J8bwDgwZPqCRm/Cq3SZ1izLtGazLmGCRnHq79s7dyqEzKr 8SI27VG3Qf0Yh2aarjKq0zcYx4XIizLMzzQn2+xk+ZGo8cf3GmwGh1XJ0iZxdA71vc+CxrEtlGi3 sFqWi2qlc3thplm2xohex62uyL9c1+jLtr4QRmSuzhcj5jCNEoIeExokNGA4N3rGhN4SLgYMmWP9 uV05jBHM2wekz68++AnRCe+F3LagAUKvUb3iVjBCaJTQULFKnmGkwFiQ4Fcv0pMhw9Io4VZFty1q rLil0MP9FmGupucKe6bxuqqi49xcg54Kq/dcRB88E+V6iKyLCGmUyHhe9eSTonFlfrzT8FAZJTQ+ zKNb6gWakEaJjK9BQ4PFzvWrZfLK1XLroTeWcxgiztIO10ikYi/cqA0PfoIzjRHxov6zzhanqzVd m2kyn7XaEOEsr5Ggk54bjUziU588m38aNXydRgjvm0aSfKeXTpcFjjRCpBHF5xvoEBpBLE9jw9Xj gzBimLZpGPGAVCENExol8v1Gr2ojZd2bbFfNMyYiAX/iYNF84JrGCsPNtWmUyGhp3NAoIWiU2MRT 5gHaXiPEHHqjZ16NaNtYjFGPfBWIMcKJ0s4WAnKtODTj66ZKMEoAW1RmJuXlbz9b/pDJ/sXvvVQe f8e7yl/7yEfLpQcvM2HCVHTWSZd9yAh8nfFZBOLKsFCNRk7CIs2krLSnsEXn1fJQnScBQVDmW2ji 7S7GBYwA7RFGCCdsJvBQeBUkFbIRUz1gTZVJd3E1hQGEcAVeA5Yr4tdeeL787j/538o3n/liObh1 lZW1SVlj/3KsdKH0uvrlMpYrWQoDfI2K+82y+fzV8oVvfrF85dNr5Yn3fKi8830fKg88+DCuwRsI 9EsICa5w4k1AuY4rHkRIFhxUVylvCjAKfMcIFHoehCCikk1dqUrUxbMzTFt5R1X48xhhXgMkETVs TxhE6FTSDPsD95RLQnIPYb2H50coPSH4QDvqIU3wKUBpgHYYgrBTBAx4hwQdW9I/8sv/kH1Dt8oL 33u+/Kvf/xgreavlb/7iL5RrMPRTf/7pSrgil/BCIFmlHHvSvAYshLqotegEomBXGYUGMKOKtx4V vqsEu0ohCwWAwT4UMSozwdAyRNgjaSjSYYigDQXjSLucMHxnWCj6GKGEXMlOoSHiwyPycp5JYTyV uQ4DkckOcauulB5pC9asEre0ENFmcagk6fXysCyVe5X5PEBRXAxXERLCC4U4IFo9cx/tzZMGg9v3 1YGtodxLU/6Zr0a0Dm3bwmBkvjEB0xel5QKr4Qnuee8zGNGdbFyUQPkIZoq2vrODJ95ZdhhgjAtY LwVyaegKvHGnwHNCTsg5uUcbULcql4zFVSGc8MrzhrrUbZQxNETYt8NwQ1wFJCmVRhOv4qDylHh7 TbwynvgK1sl6q0TYJra7cW1r89X4U7UEpCF8AQVPQ15sffBzoMYh3MNKPb/Cg3HtKyqafRUXrLzm 7bYzPUti9x/vm+DBkh5y6FdLtGS3UWz3VdRRePW8kfcUbMKDwAaiLa2He5StR7aLeDtRaFyybx8x cHlmwwwD9xHjl/h3N+bigELrcMQWEcuawBctBmPzmWMCnkeJVmjzsNGhdETokC+xkBT7+xH4yt+h 0GM0OHYcIh/bxm0bE8bRyNd76x0Wf9KRXoOBirCDyoj6mUdsl0AY6iLsTJaWw3vA93pN6K4nXfRE C5DHiNtGoAkq8uxnpSdOJuZP/DZ1tmHCWMHqyAKT34htHX3qbxqV+Bms7ZQcyrmHcXo2gofoym+z 4DDDJB2u8tTbyS/OviBPPY6Ooa+ul7a9/Cf+ZuynVCFh6axgWODdHsYBPSP8trfnobRrGlsP620G boeJeoCyhvQ5VpBsQz8XqduinhQHjn/mz3u/jDGDQCm9W85XjonMQZYrW3XBS2+i9hHeFqSXP6Iv QGuFGj8tplFklTI8SFme6mJ0XcSTw7NRDshXDwnP62FAoR2HZR4a3MS4Ih0WGWP12HHuGRN3nnSe 1RRbQcDN8ry3Lzk27VE/DSxSfgnhyL4hjR0H8pR66XFSeUiB3nc/bqhoy7YUVhj/5I//OAxzx8gG e/CrPc162h9jXiKyV0eGyvNB7G+Pcvax6md4xg0OqJ7tZ0AaH27HJ0/5l18zLO8jUf3Hz0nHwov5 RF5yau2ZSvvo9STf7LAdyS8laPy89957X1eGiboq/78uOde8WmLPBjnJb/KlCqpp78aXJ+Nn3n7R QiNGE3KOC085mQdo4pTeEuY5PZCTOJnO+IlDpgvjdp2X6QzPd8YXTO/P93lv+Mm4Gk62ieP2sTSe GU9o4lCF3In7a+Wb8Y1zErc0EhjHud/zWJo0bd4b5yTOBBh8VzhZlnEzdlxPpLWsLC/qf+J95tfE IcOaCGQ9T75r0rD5Lu9V6OQBP995A6XXuZbZIAz/bukQjlD6Bc9OinR6rDDGCLsaMQDr4Pu+56sx 7s8hqxwxd28zD86S75D7ADQ/txPodbFJvrmVI8JYmfZrT0sodduM6WF8IFEcbu28rgGCX4t4Y432 9Wq+hoorLJAoG2jQcGur4Hif4Hivkj0FZJgV5g7PsgL5aTBCF4aU2VBQM7DL+JqgEUXwKyyChzC6 OLD9yivV1y4itPpz1XmyznuLgy39tKef+myCYYLhxu1T/mEdluFeh/N45NbxfNYo4baPfeJfgxZ6 HO4hCwznj+IrO+FlSX5u03DrhudOiKc0lE5XySM/vfkSYQkvceO8fEwbdjB4CBzrWbYwEJg2YQvv ez8LuorXww3K2frOd5Dbqs+GZpzwIGE8d65PPNrM9RomNF685DbQ+qBR8Xt5jniUEaXAJ3qEBCCz COElAf0N98sdwv0PPBAGjFucW3IGXDRJXaPOwdfiSzm70MjtIUJuaVmoPW/8LCgfN70jvI984mdJ PHvinHIvuolf3VhaWSvfQ+9xUcXts8LC+UthjLi6z6JPzSdL8M9LDZ6JiI0/yKYKztXA4gTtgVqC E6iTakKPrRlnVlrlW19+qvzW//I/lPvf+HD59f/yPy8PvvERDrycLbsYELr0pbHbI8yS8X14hBDK SKPQTxsS5PSvYqJURhx/8eWMiB7P1be6uSVKT4FNJYA4I8556OsiwX/x1E04Jn6zITL2XA4sQ1Dk PInx4LB899lnyx/9/u/gKfG7rD516Lh8y566zdKhhypKTGpRvLiJhiiRz/ykj9AH82Is6R9tlqc/ 8wfl61/6PN8dv1Te8OYnyoOP/2S576HLGCnWEWJdyaDByEAMXF8Pt9AweugybqYQg7IgTEwqPoI5 JXqVIqb16l0V7rsEw1EV+AnE05KhUaOtMq8AjqCKsWeCx0nkQfgEi1qbAzzROGK7ikKyhxqKhhV1 Gw5HV5RRZ7Gsnz9b3vTwm1hJmCmf/+QflWXcn5/8yfeXZ57581BSdGVViFNYFkKxlv7iEnmSF3RV 0c93hjvYz2gI4KrwK5/15DUGdVeUNWz4jXfz7+C1UX1HngIYy0fWizz6uCnHOSKkk1ZTJRV6WFe/ fiJYhkYTv04xVHkn7zw/IQXG2F4BHk4woZiTxm0a1kMDmGc9aOxJVzJxFAfB6/RHuZGnAqm4+gcQ Q3lXsL4qQDgPxTkTrtSTgYgSTltijNEYMWwxwaEkJY1MK556fcyzwrqA5dmvfEhXjXKwZLVdirwM i75LmHWQFm200BR8xUE8feYmcNLTJWgYPFD1n3hPuVlXcVAQsT3FxXDjxGTLVWU5Viy4lyetcVx5 9jBM+cRftpXpw7uJCdm2H9OWUkxlRxwTjG9cy/GaPON9gmH5Tvf9uS6rMkyctrc4evBf5hNpKMNt BQNW7fWi8NNpsb2APKWFboHWU0u7hia9FTxnwzFHxV6DrF8/6LDSr2eOijKmpvgyBwWGI3GXdxLA QxYVNvxChJ4bcwzqS65w0JZLug2S/6JXJgHPRaAiQTfPjdj3rAaUxksIM7brLgLoGpPEIpNTCN8M 9AfQbxX3ThXkHor9PHnDKFG2fKfiG5/lpEX8PnuuKp0l7R7vPRPEccqviiyhyGNWZfyiD0IDtw7M nydfFN5d+wc4HM0fl3PUZ2aVr+YwaTnm7kO/FcodoNxeYbK0Ly0iQKU3Tx+8/eKLBq95DgqTf/xa zDFGhhGTZRcBpcuYoMur/Nwn3BV5K+HBpirIbl86pC73cODWLHmoJPubwbNAULl2K4TtNaJubn0w P+li3xrRHu5ptD0ED2adMW+MGEeUOU+7H2CIdPvNIoYJrfymP4B35jGKgFEcrLpiG6nsEy9+kRt/ fKZstwPqVWN6cZ7gArzCmRZ+BSb45sKwnIWOawgZnksyC9Pn11bcnhF1Jy+3igh+Ucf+PK+7I20U X9/BuLBKHOnp6tnqDMIKE6pjlP1ARcoVJO+78J09xXvPOVk9ey7muzDEUCcPrg3jCu29idDqYZcP wG+L4KcXwSECijy/Dm/4hSPHpASfNX4lqBSmgmS8FODz/evl6laoWwhnuldv41UzgHewFcV4UY1P jus2KWMZP6fr6JTTUa2qSb73nXxrOxkmRDrHCp6jTeq88jnjNJ8Nc2w2fuTFs21X5Vi1oXHEUdoa N7Zf0mY+a6DQ++P1AhqHxev/Cx/IN01DwMm6uFVIBTDhJJ+lgpoGgeaKdaa52/W2Cnzn25O4N5/1 MvKMplSOTZn9g5Hkhwwdvs/+4f3daGP6pJtxEk7GdavB3Qwzzfh5/2rXk3m+WrxXC28aY07GOdku J9+/2rPpXqv9T+Z78jnzbbZT8z7fezVtXk/G8d3d8pbzDLeNnOc0Ltj+kb4Od2xVgtEAodEiv6SR 5UWh+Ye5wjPClI2WGc+5ifOi3P7gWVQq+03Q0+C1IIwTjGuCRgo96Jrg+zgAszZM+C7PAdBIkQYJ jRHNT5XjhjfNRqPEFGr8NEh4sPOe8zmKZT4fcX/Dbc8AG1fwBkFRpt94toRnJAh+ScJxTriKbH9+ FYWxBs9bmEG+Efq1AcKwplHCd80wt3MMa6Xdd4LGi0zjswdsrjF3XkMO2CSu2xhuXbkahgjfCxol VtlukUYFjRN7xPVrGkLgXz+7CCDkO9O4kKEhwHT5Pgwc0MQzIs5SDw0TGiWE3M6iLBjP0NN7z4XQ KKHBxMNBEzJ+eLpQXpYzNUpkxH/L1TMmXEQRPMhS0BgxC31y+4nGiggjXoYZz+0wB8TTCJHg2RMX 2fJu62qU8LyJbc5xO1PTKL/scYAcswh/plFCmU1Da34COPNrXtUao7OlQO8EaufLZyO7orOKn9Ef fOLT5cuf/lT51f/075eHH39XCDoHTNRH49p7AEXLAXnCsrjGBKR8hm0UJo1w/FFB1mqhi76uApYV Sr2CNfnE1KykABFUxunvAe4vV6BgmQxFgkFffiFexOTaIXCevRkL7Mn71tf+onzmE/+qfPUvPldu XnsJN9UJuLuSiTDB34HKOvcjyg88ogTyQusDHfAlru+I69W8hxgoXsSL4rvf+mr53Kc+Ue574OHy /r/6s+VNb317WWffDet2TE4kRuG0TvFPNwyVRuo6gcHF1T9WQwOIhkkx0gLjs4YNg4X6Uj2QJtLy pFFDykCBKq3JsTBUKz0M9L6iDXQxi0+lBv0QfsDBPHQF1kAx20Kwp16zHYwCnL/RG/fK+9/zZPnm V75Q/Hzs3OwiHt+snpJhW28W9larZAhpfJA//Lnqb1uEYYI8NXokjDmZszNUAawOt9zyLAjSqADq KYB2Dv4IW25B4GrVjmHwGfBr8649v17uWeEwPzrpFp8oGh6TjwoDMNtmhc+TPx2PSarwpnCvUu19 ejw0lV/rIx1yy4T4G9efPB8TCnEU0H1WaExF2xVFVzdHHpBW94+gD3EiXaAPvXi2zOAD+McCLUf6 2TyuSMc7GluFIyY3rsYxXFqGIQNDwxE0klaGU1NoRGUJM66ZJe7pmUKUeKcSKZUkjSzg6rI4+lk6 0ySYj22TAnJOqKbLNMa1vnkNg4V48gt8eWGdTaNXivwh7bMcP/W6zQCmIK2xKFa6jCce1pVf8Af4 SY8EcRKmdOHe8jJceg5sC74YYbjtbj7e660gToI0n7FNCHMLjO7pflnEA2OtS9SZqNJMhdzDTOf5 zOsMY55fM8BBLBRalVDxD4MF9NSAGwf3Em+GVWnPmBiRf5vB38ne7RIgxf8+Mge8gwJq2/MxkjDg iJeflZ2gtEqHNnFsX8NcGVMZX2Ovnp5ZHu65isIaBoJY7ae/oWC6NcKtGdbZ/Pz6icYK3S8JLBP6 zCE4W+YYerV0HWUSdZtCn7NW7NtSaclutMikWNPf8pc21tk/uhETpUKI+wXXEFQmTFg2TbQD+NqO GvU8E8FtCzNMxF0MBwpKnnui8YfGKHMbZ2kDlGP+aUTpI5BpsZ7lEMgBE5dlW+cB++h3ODvhPCdR 34uSvMtE7PkI89B5C2GLr5mHa2lsp3CssV7kbx9YYgz26yM+b4CH/Lg7wbuAMnfah2WZbXV6teA4 g3stafh0NK9i3NVIanvCwCFguoJtm2vg0AghbuanS6aGWDoFZVf1F78ZTq4+g6Dk+OYngKXPuvti qWOHPuz2FPltCwFnHtdh+d4tRv7iyxcYRsR7EeFMPtFzRz72s8IrGI1dMe8zTmrkWOHe9hY06IhP tB042//Mz7ND+uS9BG4L8gxxTOM4G1vyuHfrkuPPETjtwKdnoPdZx3/yHDCW23Z6WswSTz558MEH 6SP0AXALDyjC9FD03v4X507w/HoB3ZbvwY352WeeKa7Gzdg+yhLgap+RIElHe5DtEzSCJ+Rr2zD6 lnGBvM/wZljkF7HujFcHRVrTNdPms9cES4rxFF4QHNMcAzWMztJ/lMXOnj1bnnzyyXj/evhzEXw0 IqRxQEOfypzeHSpzhucXDXyWX+SbVPTkc8Ewwa0LusGnQcD3tlm8I07Ga6Z3u4SeBXqleS6KYHrT yeNC5pHzmfnGNgv42bwE3zknmMZychuFaT1QMudI32fec8MK/zzXIfOKMYJ4a5xGb5j1zk9/Wpbb A25x5o79aZFxMBZN6F83r+twztkDlCd+nntgueKbODX7YNYr6W/a7J95mLdh1q0ZJ+uYcY1jXuJq X56jfOtvWXmmjFtERtC5UkFfu/+nQePfd/tLEyHPg0i6iLd19BPi8o/PUZeavyIRbKTHjHU3H88i k+7Gy7p6Ndz28XyJCnbK8sWL9T086lwLpKKnQreGcmtecR7RNCZe5ozhyj8XCPPsiIQV5IZdFk1W DzlPog5vMd8JN1Dc8xOhPqfRw/t5ZIJDjOYaH4S4MmcnaKgQ8sDL9JKY4E7veRMaJpow9gymJtT0 Ck+JRriGij7p/VwownAYJRqv4/Y+5vku8odnTQir6Gx3A40SKurOZEqkaZRIQ0OL8yh6teHhpAeF +TWNEmmIaMYznzg4kzHTxQnhxhHntTHh50kHGhf26rqmUSIi1n889FKjQBohmkaHfKe/hGdNpLFA Wgstxr48CDO3baxRHyGND+btfUJVFp5xBKT3RHpxZNkZ1/KacJPnk3HywMuMt1GfGSGvbsFfzWex NrwJbhNJOECWOAmLyAoVB1ZvZukzGxfOxxkTLyDP3A1iIamm+ckzJ5rxu7fYv5fuQE6uKkIJOdl6 0NyffeqT5bf/939Ufuav/e3yvp/4IBZE9hxjDTtkW0OPwaqL0DRGKR5zdsRopBCO0IZy7qdA/cJG KMyRMUIWaeg2lWdFsKYCAkoGBg66ID/dmMNmIv8jECJUyb0A8gJ/jE+W/OyDSxwmMdi5Vf7pP/7N 8ul//QecQn6tdFHCumxhWOVTUzN+4QCDxHgMbhhM6FIIhnVZCOcaKDRMuCQ9aeNGjAeCxVh/PTF6 5DOLoq7QNzp4sVx5+sXysRe+Ue5/5Inyvg/+dHno0SdwYVnHRRplCeFYAVZBJw6HDKEDRYzsw0AT 1gcw5+pt1oPiqgrdvnDHW/OK6Ir0PMahFNAHGvl+2MF9m0E4ihFpCYZSHz7/JPSzfm0MENK3TXud XeGzjwy2o6Nxufc8xEPgmYHufoLylz/y4bJMPVc5rGd1Yb18s7aeNgUnSgi6eL0bVLvE7vYGSyi8 5U9hK0HxK1d3DXdiiQNJOeDtF/77/6v8xkcvl6/+1z9d/ot/+kJpr3BCvwYKcHbvtYrPJOhZ5ZZG CIXKFCxTQQ2FmbJ1d5ffFfb8TYVASO1zGE3q9HoH+OlGlVYnLukgjuadYJk+pyFEQ4ZQCZOVAGy6 UMydAFlRDuW2zmBafv3sRb4bj29brs0z6EI5ec14Xs1D3jDfhOaAYd3dX5irS8YR3wTLS3pkGAVN 4+Q4kO9U0prQLDdattG+5mu52ebN7TVulfCLFtK3TTwn9KRtEz/Lks7W3fwSH+mqgBFgXrw3zDz8 Gc/BVrdaP5u6z/sQis2LRJbtIaDxWS/uHezNT4VON/kebT5DOg9W9RDIoC60VhhRMNkjrXVfYMJ2 1LIeCnMqm24L0Mjg+2W/0oAw4XaSWcbKIYOZBhIQjM9GquA6ie0zEYwsD7fDIZZ+t8dsQrt9th71 GPR7CK37KJCucMvHgl4GKumxfcHBBG+AuT0NExo+qk9aGu8Yw8iYPr5D3dNtvK1hA0VNOsUnTzGG 7SAo20bzGAbcDrH98stYw+1n5kIdoe9NMneVx3Guj9FJxTgmSsuHE2PLwixjNnl7/oFK8gBhJT7z ST4TvBfGGBnF2wMJ4wBIJqsJdW9fu1GGD62UW5Q9c/1G8KDbFGzPMDxCt5i0+WTxIh4YLQ005OPW iy3y9qBL2+Eq1nt5wYHxgGcPojxGEPRrGarZnqCzx9c2YIjoO33Gkm32IiqIKnJe9ayJWzfCM2WO yksjPQ7iyyQanKCTnwh1tSmR90mSAAAgAElEQVS2R5Bm8+AWbreH8PEQTwT2Yir0apiBnm7HOISO fYTJOc+bAC+9svxtQQNX9vU4uoQi7anv27jdriHkaei9ybN87Bc8zGsHWuk14oqje0/12ughdHbt d5Szy48Oh4fKPMYR6ES+tqFGhhWMHrtsq3HbyDXaX2HIA0Ll70t4fLjtanOXsYJ2C96mHA15JIsx MJWYVA4tz/vpM3T4cYPNbnt59seHf+bD5dmnny7XryLncEaIhlJ5KecK+4kMQHSu1fhpWiGvzfsc XzLs5LPhgmlz7qlCqjnB+MGXBHrNeHlflVylyLjie0yfGTF/K8w99thjryvDBFpzKK5pkBD7VApV qFXMfTc9GNAI8E0oh7WQalAaAXqMj0d6PsrHQBoAUimPMPqMMFVKeTaeSnCWpVLunBCf+SRuzolp XAi+pawMn84lxFVpVbkVT40uTVyPGJNNo7LeIV4aCYyX/cP49huVEo151i1+0EGF16+MuN9eEOc0 SoQRwDqQXiNGpOU+jX5xdb6gq4u/z+lZ4n2cLQEtlEL2rD+/MDDwDqJGvtFXrVONe9I3kKnxEafI u1bqmnVLOhs/5lPyjjzrDKyn9ZD2zfb360gJpmvSNMPzGjQmjpD4hWRlPQw70f4RyJ/gB9sNaBpG xEnDlWC50fZ1vAjjve1dL/pXczztpLzRYW4QFvDg8z7bTTlAo4NtR8E/ZJRwzPZdGNaJJywzB/nJ yEXmP40SHG0dCxkx/DC++7wo7bnG1g3S6I3hL8GtHfoPapwQ/MqG3hAaJMJIAY9pmjPcXxyCyXuV 5vCWqCSZKDc8J5gPcJPD4oEhm7lxqlJSDswZZfgnDBVblREnWkE8G+cqnOWweY0SQsc8Ab/Kkcq1 PgDxJQqu6T0QcdiWkQaJfPbaDPM5t3ww4U7fnfSQaBoplMmE+AoVcpJxHdpb4KhBIBZcqKNzoNsl 0gBhmvRmMKyp8CvnaJQQfCdNc7uHYWng0DuBz+AZFKA5qvJRIG/aJCHvxUFwq0l6T+jFEUCZlitX Z/luj2lCE0ekTYwbyG62M7hqYND7oWlaWEM+EZQ7NVL4nJ4SzXzdxiF41Tjh1g3v9Y7QEKFxognr tSFqglwi+IlQz5cIOYhnFwjdxiG42PVqwGGwlQDnJKgipjAS9wjgqQRs3bxVvvb018tP/OWfKn/r 7/xK2aF/uy+Sk+BQ2lklc/8yrg8D7j3MAHWhLg9F38k+JnzX03hWaZbCCHuu3jjAB7PgEjHLQOA+ Wvd+I9fGwW3f+PpXy/rGeQwM5zjQEIsTcfrhkVHp4ItdlC5W2T7xe79d/vVv/1Y5e26jzK5z2B5M 2PXLE6zAO6z0WPX3LAM/qSkKruRTVXCq6ssQi4IsvoRXagYveYsCbLwOq1aoh6ygo2w6xh/eLF/7 0ifLd577Srn/wTeVv/SBnyyPf/Bvc7gjrrs0dihGkigSk97aU+9qzd6sqT+rswx9vJEOlk0C6YEU 6D+FRD1QdB+3bRxHdTOXaLaTtx3aQMoShUz9oxFH+hPZZ17hbMt7GIntOBfPchghW176B62ytsA+ cz9/hKeHB0O+7fHHyp9++rPlIoPNCnunm4KVAlQKarFP2iIJsx665Tt5JP4UPgWFbcHV6Kiz9a7r abgYSyMFGWGWwdbXk8EHywdWvlD+u385KB8Cx4cu/3L51f/2kfKHv/E/lU+8sIUxhg7MPzPIfE0v zwpZhu0gvoIGifhuvQI8YP0UUKW/POjWDoo2caRP3HyO9qxpkOWZVu+LpIv5+ROHEFBq+syy5eCI gTq+mmFB5m85gGkT5yrkzr+WZRwV++yPEUbFs44nr+JthQz3Z1oNQuaTbZo4W4es250lV0/Gi/xr nPM50lFP+TPrUqWAH2RU4ssTpk26ZJmGkSzKNY0rxQaIt++iPO6NH+1DWOIprgkKPf6CLpmWvNyu 4UGfHozpeQ/71F0FUIW7wwTlAVauMMuZKvgabtyOMF15pkbiFHhQnvXwMMo5FVtWLHsot3LNBA+g 2NoCfoJ/D2sjTK6+Gmo9/In7IX1yDl73vdtRPDPAuvuTlvsIPgOMD/PmyX/71jxCU3xFgnpYFwUd Dzn0wCo52zqMauHJMzG6jK3xWVPS6vkyRrn0nAPzH8KHY9pHwXvCeHiTyUGvtWUMyp5ubSt4RoKe cAPGSoWn8BagnG36h9tANHOKrx4cXSYdDRCTAYo6dAzBgwHWiWkSX9chc8p3sPIfRIXe9ltbG5qo bHsvz0hn+v8MRplDjA3fRUFeoW49jDzmEcq47U+9F8CDIYA6YYCCJodMrpgJHEXLoWEcXLWAoNYJ TxWMHIxvqHZlFmXc81p2EFJtdw0NGk7C0IDyt8Ihm7bLPvg6VwV3E0dF3zaLr7GIJ1XRACXuB+wl nbAtJKoHn8CsYZzxc74afDS87trm0sxac43a19foQ76r+YgobCGqtinJv4cYf+THLvWOw3s16JCf PBHn5iAEafi2H8zymweHHvyxIi6k0wjWAxe/3rIHn+yDk95zupkq2spTGk7dNuYp7gcIHX5iV4HO z5aq6Nlu7jMX7HMqLioeqXwY7v3rASBltIW4nMej8dG3PFqe/9a3yy0+VzeAJ6VTm8WGnMeMZxoX UWwg598E2yT7r2Ennx3bsm87FmTRxrO/R5tG5refDZMPKC3eT+NVBQQdm2U69nmYm1920gPEOcdT 2y+ygmu8KMO0PybQM0FwnBSSL3JO19NApVgPipMgLxlf47H9BI6VwaoDiKMhK37Lsd7Xv/rbu+Uf /ezz5X/84OPlv/kyil7yHVfLDIWUayrsplW89p33FGg2t5+5T5w19uUhbsbLPIwvz5uHcc2no+GA cSQNIIabPurB+6y/hhbr5LNGyJvEy/LMR2Va2iV+mb9hzXjiIKU1NlgD0/ozTkKk9aEuz9tULeMd cV21tF7dui5VdPLh2XTmKQ236vJtE0vIcqQDD1PaGF/I94lT1v/fd/tHOeIvHkDSPx74k7TM8uNq nfklrskPGimEJu9mnAivlScNGwcs1KXHmIdXapiIcbMON74HX+pxlh4/hulJIRjXn58JbbH4YF56 Ztzg1+WcAY0YjrX7KHNCGiPyjIn/l7j3ALSzqvK31+01uekhBKT3poAioihlFBQV1FGxoWBXQEex IIojRVAZFVFUVGREsYNKU4ciVUSlKaEk1ISE9Nze7/c865x9c3IFne8/bSfnnvfsd/e61m+vtXZ6 Vv8IShQgIkEJJPLSAYxrIFs3+mRF8oZFIxloGqrCODsecUWdoxaUyBf+cSz8HZe3b1TbP9U6CKta h853fdUDQ68KLTYSCihhmIn+CsOb56x6VJ3AggCCIERt+ElQgnAFjPBbp/FOXVlTTaM2fNI17GW6 tGnByuuNFwV8yBfVP7VXc8r8y/DXggEFlCjvBCX0K0CBYYvzFhL9NW7pYZPOPAsIMfW370qZDFNA jpJnPfyi7z2YgRmeLJtlFCAp4QUadBPLnqyo1GwVobHLTexKZIjKnwJKFC8BtSIJVPxqv1VLcSzN Qt221hWQQpUN1Wl1fquarCqHroASRa0jPZ/iT+NCrnapoLVs2HSexLsbnZuhDM0gic5Gj3ivfZ4d dTO3BHxADBigQQa5DYYvs2Ocj7BBqyYhgVSH4Uql2PnK06sxmH1+8WFDzs2bl0gnePrmVt6MUUrZ /mYI6kZUE/qwNr7ogfvjhqt+zt3jN8NAd8WcLbaNHXfZPTbbYpvYdZ/9Y1pXR/Sja3nDNb+Kay67 JEY2PBmH7b8H6DAizzTCcN1IrF6zOh5/7PHo4/RnqJ/rdRRdNU9un6irRw9b3SfEwS3aBHYNxiHI rVGVj83yeuWkwhQCLxOoGIzmBavQe2yarUiINIyuj0f/ekssw1hmz1B97LP/C6OLK1gGBWpIwVss hkmgnnyMk6CHGQjM2M7VzZdW34SokV/RQ5UG1jk2PKMoako5XViIV4kPc52z2za1hQEmjFuJnmmC +ZE3EASLxRj2HDSgaEl6+ziBp8NGkEgx/0EQp19ccWW86hWHxZYLEclhbHj6OQqTIerqhtAGwduO iDlUfUoXkCUxK5uDRLCLusSaDJVEfLNENOPIjS79GVdtTLqyeRvO03ElFZQMaIPR8XS7ofGPsajp 9PjyQb3x3WteFe/56gtj7BenxyP9EN9YmG+wLoxVnRu7xJpEfKo+4CcTIfNpebTZoBVYNx/z0M98 LW+lqegLGtz6aRjVU2iJ+ZwLpCPx1w4yKOGpNeY8TXBR5rdgWj/MlafTto0Nbn3Xu9F4ckpbtbBp DMLgqaKhSohlUIxayQ/LNEnYUh7f6fQz/xRvJz0Zk8KUl2stJawVy3YsCFRlPL5lVL2RwvJ4raDx HGfWWfsq6vvL1AgkqT5hXMuhyoOLeKZD+CJZ4qlAO0QYLZbta3jT8gRbNSuvJhRMNK1KmWCGYWp7 qyKCbv5JsJGf5VFHfshNmvj2hX1n/vZdK+LvWp8WSBBEsq6e9OZAprtV9XF+t1Im+91rHjVqlDfe 8FxPu3pS2kpZyKjCBFPeTvtLRxkEJyx/Xt+aDH1d3lgwwjiXSXRM2/72hXPMsjTSlmnEkJemrfHL Hhg7r0uyTm4KSiJ4qqBqgyoTCVpk+SkL71pgDocYA2755uGpmfdK6xyJqo7I1ML9J/MsqOCNCUP4 K07vaW86ykQDw1HCXPvMepAGKhnnEpA9tJHpW/ZW4mlJWUJqgHJp00KQIG33GBc3k5Og6Uh1bKAt ZJ3bWfMERWuddelibdXitmNLoKaROWEKo9w8AyWWpyOWeZR+rYASlRRcj2xzx/AY0ncpUQFQbJgJ ylVHXI2W1jPnZJgdX/ZCj23Jpj+bME2svdqHGBakqWRKBYWHKm3pfO9DPUXCro06256qbejc3/oY 8xKyju4+pfsYb2VDr+O9/SfAYrtO8Ft1l1Y2/zrVKOwX+s8x5rolzWXarhVKZwxwuqs0heLqjZRV YCzHvIAN72mgHN9ZGP5soB+zbLSp5fczjfFVxHWVkugiLf0HqFM/gND0VgyG8lvpnUbbn7GTgB9l Mgvb0j5SZUcDqI6l/E3YXJOpTwLvxHcd6oT4XYgIvkzdWhNwLPjJXGkG/AXrrK8MseCN655pFVcY hGRyavzL+//Vb+pg6ZUm0tk2wwB8V111VSxbvoKDjZnQJ7Q3+1BfH/PccWZY4+VmSxzWFaUcdc6d sl/52+dcpwnvt+/99uNaIoWTAIOBizMczylpw7djoqRrW9s/xne/8CMwrj2eklf5Vrpxs83mc/V6 xdDao48+Gpdcckkce+yxaWXfNMzb8MWZz/+WkzEs46Iwgzk2qgXQL0/6awpU+74YiswVmjbyneMu 4/Bc2O5KnLfFK+K9Mf39r4yf7gVDf+cb49J7dowz9/ho3Er6qa9vPo5H4lYe2e+r6VpO0/FNY03a JaygRAmTkcsfwpa6+d6Pe1amxbdOv8yX50pZ0zsamNtKSRTVkopv5W9tOsW/xK1NO8tXyk5+CQ4Q wTIZrvz2uTDsJT3rrjOvTdKc6lcNZxhdpuUD/qZg/PLR2zKV9PQvrviV3/+9/V8pR5aJPGvz8lnn d215rH+tREdtON/Zj8WlxEW1LkUSxnceNA2yHjYx13QCD0UiQoChuAJK1PrVI+WkpISghHFsqQrl WmKxJzldqxIQswCGNQRdAAltRRS1juKX6hrub+y1ugJG+KyURAd7UgJeMMWqb7i/9XLAPOlY0zdx MJO9AgsyvQmZ8pXP1VCs/bVONYBObttIR34FlPBWq1wLkSjsRiLRw5OZjFEZ9GI1oxZ0KEBESbuA Elkv8vR9Ag/WEzqmaUElzyJNUQtAmIbhdRVQoyKjUG75KHkJirBabgIQpEoFhxZj6ypxvAZV+kBQ RT/tP+ish+BFASz088aRJg5zE9iDhq1953tdmZNTQQnfqd5ZgBrVNEte5l2ACP2U0BDeqNiiqIAR DCiTmAQlBEakKZWW0M6HUhBKS3jzxhMrV2RY/whGFCOX/i7P8jLGybHNszJG/tbGRHHazJgOD+YY 8IpQrxYtoMTaqjSJYbU7UdwENKWgxD8CJEp4NDAqIttOPLOWKXOjkxDJ6wXJuJ2JtdMuOyP6yUKA 2H/elS5xm+EgltgPh4f5TQqeWKWUhKnlPomvjV2Zz+TgAx/iChJwiI/2ASAHKMYTjz4Sd9x2W/zp lhvj3nvu5KQIgqKjMdb0rotlSx+OO2/8LYxdR+y8xzNjy112jCcfWxL33XVbzJ/RGnvstgVEqQQ5 ZcBgUB1E+IL5c2Lz+XNZEBRn6slrtgY4MewbkglSbw9i2s2cumrjIglQCmr9K4WvljVbxulqCznt OHnmuZ2FRAKxAYObMsm//uEFsegPv0twYqdn7oc11i1pm0YMq5EOEiFkl7UXR5D0FqTwqj3zG6U9 M1f+yOT58SYS5U86bUfUMaCzSAbC2EWRdvOQboJTngbeZdGIK0FiKbPBIcRSAsT2Z2AM0SZPrEYU B3Fv+0kUadjCKELC/yHg+Kau2XH3oiWcBqIrzgJtOQUO/Lj5dbHQQcHBDMJU2XYyV2SXGzqbb2aN vwyiVhVsH4muJJ7sc8OyoGq0UOJjAkbF9nesyQh6z3w9ulhdMA/1DaDC8/aMd32xP77xxo/ExXc/ FD2IQTd6JQX1TJsEjiHScQwpxZP96bN54Z8imRTQ/knxfPOhXoIYEkQyTIIFNDji9hWGTpUCy2t8 +0TCqxm/NhhRr7xpBmxqtayUe4Dyykh5Ci9jqp/EpfNIuwGdijGRiCBJu+2Cv/YJZF7ojgzn7Qjm KaFq2Ybp93H17knP9J2L6ppLfNqelle/esriBq2BwQRiTJc4piFTUbl9hvFMWDdCGVvf2xapAmA7 8c52zLYkjOMniThPe31HWjKtKZ7JQkkBGAuVdBowfDMbY6mNXMkLXpTO+BOEURzdvIozHQl420GD hwIK2ef422dGN0wL5TZcL31RwKpGmEPVycbZEASY8gSxmp7X92pgUkbbsew70V7HhH3hOiAIlEYJ YcpsT9tNYMM2YE9NgMbbXWTyLYvAgsBJHfXogBl3vNrfbnZKFk0ACPTCRCSjiz9US9784Am6EmQt SHY1M75Fi2VyC9mT9SHMKOsGI4xbL5BAoA1biDNEWwkKtfKskahePtMBZpwTtqcqHCqTKC1hX/V4 RaZlwWCl40nZCdWOaKhKk1Nmx+MQcUF40l9bCTnekUiQAVOVZTptofRFggXqBdJmgi3eZuKy40aY V3+SZwMiqPaTfSwQIsDlipZrDnPCNXTMzah0u+3P5qZk3XgLrcBEqDD/xGENokNzLZNxU70jwQzr wPi0HOP4jfZVTk7qIUq8XUNgQ8Cpn7zb2Kgto9kJFFGAjVISPOskFvoYt66KrYLMzPNR1TB8SZgJ xmk+ShQqoUn+ghdqgw7QRo5354/+9sME6dF4/BdwtoyAGiSmjri3g4x54w/zY3zA8BqVRJKDseBN GORmVln+fCJ/WP60JN7LmGsk7Bgivk2sG7ZpMpsE9AYOnWNS8fBpAk2ONduQ96bbhH8z/avzxpk+ PgJqdex3VrZTdSI3IB1jfFqONcYRhqKdi14Pp8ilNivolRwn7VkOwlvvjLiR6C/EfdU7565+hXkr /v9r39TX/rRfXXcEG5Y8uDjuv//+BMX7AIbd75U8cJ1xPxM4to3Lmmib68q34Zx/fvtxv3N9cI3x k37VOMYrQKbPOt+bvuutbVO+baMCxrs36vIqUWgPks/8LYNrmmtZC8a7zc84gsWW96GHHorbb789 Dj300Ew3971MaWP5qz//V76SwUNK6an6v9heqC1IsrHVdtVfVSfXU9vJTwHBBL0EtX1nnNH4Xvwy eqL7A+fGi/Z+Y/y4+wNx/wE7xI1MS9tbOsS4plFcYUx9n858efC330UqorwvZSi/S5z8rv4pYWr9 yHRyrTdubRkEoQsDbHl0hrGs0t6G9dl3+ZZv21L/TMvwGasiuVHqWOKl2kU1Dd9N7QdpAlbOTaQi TK62jOXZ/PxEvA3QZ+cEfW43cNUZroQtfllG/Kfm6/v/3v7/2zKbZx44VudkMuSUpTjrLv1C4YpX 1q+Mi9Iv5WWCEKaZbVD1ZR0ooIQ+WU/DmG6NE8yAqkvgYmNu7KPQszJ7Oq8GtXVdjadxELMOuqZc G+p8196EVz1KdxYnMFH8rB8iU/lqQ9VIYvpVA7vnDRqm6lJ9A1Cif+XKtDuR3tWylDBpGJO9Yg0n yuXqyB7yGB6s7D0l3OQ3TG+5jtIrRNPhN1E1Ui0o4RWjM7AXpVv7xHIk1tZuIskgPWUbTGAHQqdN CJ1gg0YrdYISjdxMoRtl3xsBZPZ3bbx8Wf0zsbxSlibSqidcI4CB14cKZOQtHfgnPDN/fnAxekof dLOP69ZU80k7EVUMR1rMG70aZarpJ0EK/YbxS6Yfw5mcOsbYouWZhn8EDpRqkNnfUAV3lg5wQ8Xa DZMAQq2Ew2REHnrYc4P0k9as9n/J31s2SnlU5xyv3vphfMNYngIw6Odv7Uz0Uy/7yvj+1hXDlOuh KYotinJI1gXQ4lzZIL2P81rYJdXn8nuI8biqm7aojqMGaMwxD1fmzs84BZToqua3AmnLVZS35Jvp VN9lhCl/GlcxWMsi4+Li6aWbZTLcTPQ+MpQpmAUDsn4dqD6bYgvEHV95ClvPQB6DMquXKYBJkDhN AowN1jBusCkVIAWJc0BJMPMWohIGCQ+v6bv6isvit1f+Kh5+aDFW9HtA+2B6ZnYCXFRsErQqZqkK wsDK+PNNv4pFd7fFM7bdIp699zZYH4eJJFwn1755EiQ7r5VY9WBkvDoY+F0d82OrhQuoy0isXLs+ Hl++PHVOJQhGQTy9JQGqFV5dAqRC5FhKDVNK1Po3i52ESKUyXgVKCP5XCJ66Qa7e/Ovv47HF98aW t90cuz/nwNhm932ja8FW2SYymoalmai58SBIPMXJjPjJt+0paajYTguSJGN93fH4PYvi/gcewKr/ 7Hj2AQdguX0GDB7MLB+ZcbdDS6hLmxL5VEk0jXoSZhwGZIw+GhpQp55+8DeiEzLNDVj4E2hpqm+N LbbbMW6+7teoqtehIrU+VQAcHymJQPk9nXZ8iP5T/IrDX5BBxnqEgToMo2blKoQafBsEVU596t4C Ma2/IIAnVkoNOEawXZrGjDRO9pLTvhMHLloRuy74bXz8qEvi1395KNY+uZ6TX8ASFFssi4RYio6T k78rG2lFWsGNRuItF2v6v5ffbjaebsrUjTLO3VgkGhWZr28S9KnYv7CuqR8p0+SYoJIyJB3US+ZI wEMr2T1VYtO2sCzmJSNiuv6WCLWPFAs2TT/J/EtckoZtYloCRI4tpSNkmNOwnkyKaVTrZnu5nBQi V0BFYCVHH+U3bRl+F/TMl/CG1Wii4eynlCyoIvtKCojOD3EaKzPfAlMpGGA6uloiw7pk38M0bUAc TRssXdzUQIFj82c9N1712lfHI597a3x3MdOTMkhA287WL0ck5bP8pmla46wneVrNs4YFtfFgG9pf ltlv29F1x7oYV3/L4Djxo5NIL32ehAXxbENBBAJRYeaORAKPqmGNwXRbP/Nmgsc4/WU/DpiPYcnD lcvbB7RdorQGUHhMpz4CWi6oI6bBONDOiYx5vdd2qupAu5tnk8wf5RWo8ERWqRvLniejlNm6edWl UgwDjKl2+kH7BDqBqD4+ghljLOKjSiUtXJjqC9lm1JcUcr4r2UZDo6LBugOzpaRZbunWzY9lwGW/ V9vCtUU1ESWY2sl/kDGmGoRqEXRMdJO3Y9o2gJvOsmusMkEJ6mB7MrHzy/XLn+lk0pV4UPzSfpTB T4YeUMIyV5ZKxl+uABXwgXwSLCGNlOCgTInS6U+hXUvMwH1CBns9hZ8DMOO1orahY0BpH7+1reGa o+tUgoX21PjjAH62rwCG9etk7RCgGkGKx2tQOyEIdQIL9o92KtSX7aDP1ZOtF+yjPLYhCBrl4b/t 7gPtm/YzIHh0KXlhmcir33FC/o2s38YfZb1U+iJPUYif4ABtnsZLea/KjXN0bBXqIOb7jDquaOOE gz7wpExwxjllewtSa0Q1QSQK5jxx3DZhrDXLR1ksb9aHOg+QvqDlLEET9nXnpe8LKNcPCGJZeZHz wrWrg/Hk9tdGP3qF9sAgZXMtpB/L+lC+ScrFIonsTfzyxf/2n6Q6MlPBS6W1br75Zm6wQNSWj2vM EAcSaYyVULkH0UYFLHBclTqUdcYTziLpV/zohnRlHLqmFWeaOsPWOsOWT1njSriSbiN7BZs+3pXx XeJbpgJKCFQIipuPAMUNN9wQ22+/fWy99da5zpQ0/Ta/2t/543/oj+uwa3DtNZyFcTZL7R64/27i iKMrbV7Wcv18rv0t2OD+ah6jrNm5kmx/QlzffXW8q26H+KaRcMaRQTfNkm7lTeXvU/qVADXleapw teUpUaZ+W0Pj1ob1udiUyHfMFlaFjCrja7tYL8MVRjjfVuugvy1VWq+kbVq1eZX3Jqx/rZMxT+AC z1wpp7yvDW/62Ya1CVSfa8OV19mLxJn67n+y/61daYcECPjtHm65zTfHyZQ6lvJOLefUcZnj2P0c Z1q60i/5o/pnKiBR3nl9KLvXRsdc1cilwERR1UB/Pt8LUKShTNdWnrlfYBNXwAZBiadyeevGU7ww nnG8KnQBRiaLiH8aw/QaUoCEwlAaPUEJ9p5JgAHGWmmJYb5ns2/q1tQwpqn6oWcBJHzGCUoIQm3g 1gv3/RmzMZ6NjYlRwIU+mO3iPKxQkkI3KigBXV0kP/RLaQf9dOxfk2GqvyeBi5owGXbKH/MYZU+v o+xJn0x5709BiSJ14YopYCCTXxh81R2LBEOJnu2Jf3GCFd6iok2QAkr4XTsOlIhYiYrFPDmtat2N nwBFdZxZDutepCY8tEdHDsAAACAASURBVM4w9geulEnAoUhS6F9ACZ+LK6BEggxVTwGIOugbpSoS pIBu5J630B6GEhRF0S4BDuPQboISf+Moo6qpAhezasas40ggooAP0jEeoHiLVK0kxd+k9xQeHDRv ZBx878YpoSRR5aR1g0vmfQR/T7yojGXRbISkQP6TuaYN3Y7hpfHjw4/cnv3Gw48eDRBsbRijbNHm A0f0S/56d1z7m2vi8p/+MHrWY/ALkcv5CxCjId8RxE8UnZdpbmbT9nc7e/8uO2wX87eYj2g1BPEw J5sQrLNnz4q5XOlZhy6NDF7dNJkjDJV0c9UTItpDDIpRdZ5Jd96c6TF/4WzGPHev8n4tQMWqlWtg KmGmsFmhroPEgJIeusomjz/l4MwkvyXyYMPwqpw6W+kmjMdB6cD498QDf7k9Hrh/UWy7623x1nef ELPnbUFdMHongc0tGBLJNomtZfpgLtkuHW0SuBhiW70iHnx4Sfzpd79BUuQ3sRajcM0dM+Leu14S /3TEq9PgZr22C+iHUQAV29Z05DU0CEmxkkCyH/zA9tJHnviwieBBd9oURkPagAfaUEZgh+22it9c AQPaiJVrBp8SDBK/Ook4bRV4Wj/JcBHHxd5rFk1rGBWWjhlzQUrRbe5ZH2t7FA2aHvOmIR7UA2pL PrWbg4RdNlvL9Jg1E6J7bCgWPmNhdC1eR5tw3dC6VfEEoIRuehXUsByO2yQqyV+jbyNWBpen8Xwr MaBLXWnL63vLSn1kYHVJ8BuGOkm4Wqf0b53GLQgQ8/WMD9SBej1q6JgVW2w+P1YsXwaxKjNTmSvG cZMUyLNe2QfkY9l8HhhV3aFCKCRjQ1jnlQyyTHTLjM2ikzFnOhpZXbsSI22jjD8MujoHddlvjMcU oafeaVOAd5UxWmHQzF8nw+azn2wn6+RYbuuKeRgPbaVO/TDWA5xu1XfM4fokQJZeyshinAw0ZZbp L3WxXLaP83a4bm488+jT44dffHl0gcD2D6+NRT/+bJz1EAwj2Xjy7VgxrgCLpxhu9KZhWSxT1oV3 9rvtU9rdZ8PYX0V6w/oY3nbyven48dk1KtOo/jas4RLIIE9PQ0u7exWnzK4AaTINFFbVmgSHYLp0 jl2N+LqeCVTK9MmANrPRTsDk9I5AEA/jr2QF8U3LciiRMMZgcK1oot1AiFJX37k0yPqjVEgrzORQ VcqkmXApUg9DanyNJZq3hJVrXQubdiMLvFaqFQsdMm/uwq5MVNY7FnoiWmQp0AQqemnnCZjtOiQa GFzJ9E40AUg5B6i3TnBNEKRVEUWIkHE2C6W0iBo96MiaosbJemkX0AtsO8jYQzQY135zfpCeEgeq NCjhkM49gTzrBHJolzo3P9YTpUpAhqKejbCB2xEExlLUkXQ8HU1HPWS2rFtuwhaG/kiGPtsSf96P sk4zolKVRhUIy2oZBDZHAMucz9MgQCQWe9gsR5GOqxcgwVlntvtsh7ytgiw6vB6LNtDehn2Q13tO jgPCuu4z7nRpN4f081pT+hBtPcYOdWMvQX4mQT0W/gRA+nu8MQSi05N53g05Nl3cbEfWLsEnplHe MW/aGv1UDFJpiXHS8Hpl0L1Yi/XwFatX5hhspCyd1MH2s6yuvarWeZ1oPftoPXUeHAYco70c497A 0Uh5nXe2wAykOOZCnI5BTNi3uVbh30O+Sgk5j1TxUTfa+aKIq1IFGr/sH6JtzJN+EbAzrh/Dlbll PWqd7/8vneuF7g9IXt53332pgigT7zqj5KRjxjq51lgHn3WFDirPfru+FucYM4zpTEOFyfjGLcBE +S7hfefH+a8apM7bNPQra1hJr4T16mxGXIb1nc5v83Ivdl7ZN4bXPfbYY3HZZZfFcccdl2Uy3f8r V8ZDGSManNzAwYb+fRiVZeD8w6JNTaP8NqJ2EY7+yR2x8+lfiB23PzcOmXlq/IG0K9YtKkxkYSQ1 nFgbt2Rcxi4vk9EvYYq/v9955YOx2xnk8d1d48xdPhS3ErnUKcNX4+o31RUmPd8RrjilJTT8mfEJ VIEaKpKY+pX0DV8Y4wzL79p8yrPvyvvMo1qmfObP1PeOnZGa8vq+pFXi+F38nk41y/clzGT+NemW NAzzP9H/tZIttcCH+fp7k/7X8ymcZSvtU+pQ6lRADtMpYIT9kRIXrH+ukUpN1IIZUwGKosqRWbNf +ltQoty2UVskJSLq5E1Y9wsIof2JPmireZstSEOW3sBRVPw6AEobNuOWJvbUp3UwrbWMbxcM9AZA gS7oCv3L7x7WGqXkLJc3YOiUTticMPUwwko7xJMr0n+6qp75xJ41dxa3T7WyRzGe2T/T2CXqnZxk pJpnBps1g1P4lkm7C/o1s/HNrgIsGnycKIYdebfSOnOaX5zXt7t3DcAPTgxCT1A+b+EozvdeATos DQft4ZXZOv1dH5s5dPAmDultn4srt3P4ewZLpSoJM5AmUA1jXgE5eLeS9JJW4bmAOrZdSnRR7lnb bB3zkShXRULXP4P1fRuqTzoamnxyqD/fFwkZ/XuQNJ9N/02DPjIdnXn4LK1SbFBkHvjrzFt1Do2H JoCBJEMpx2ztC1Rd7bWepUy+0q6EoO6K3g1ZttrfW261Vb43nGF0w4w71X797YHF49RZMKSdtt6q Sgv6XhuEK2g3aZd51Zs+jK+k7ebwl6prqLbR2bHRMOaCsa7KwS79peuo5pk/nuIPc1ICr8IYuRGX yWrYsjn6LDjhvpf7pfti+fjy/4fzZED9LA2g9fd2xzoYvzWrnkwxVU9oHFgyJoUQyz2YPdrN2I3b jV6dV/XQJ2Dk3IwbIOaaId5UD5AxSOaH8BMQiJWFyNPoKhGSCUp0VAiwZBxA7fzWCKSkgUys6VpX JRgg3/+TNYRoJ6hp12E0cxgwZAADbgMMjPFZYGXY57BuVL3iaEPbOOtNPGnYcTpuGDGo3g3rohur 8BvWreZkdwMDhZNdmMd1+HUjEjOKyLQMTKowZIIVYuUfFdT8qk2QtbJm4hJ+yyN4UtbMmGC5ghhC fB6itTjL3sHEUs/N8DoZsCaIQYlijfVM2/eoOOkzX4o37/xIXHHWZ+ITF90eu77jtPjoC9rj0nNO iItuR5WEyWj7ahBTWwTDGN7b/uUfjjPefUTs2EV67SNxy61/Ql8aMVYmpRCDZ5VuFjKeMs5JhJGn xIAbh+WRqbV+hbF1LOf4IFy6SudUHys1kNCsdaLaMw5+a5z+yY/FYVvfFxed8Kk465oH4znHnRYf 26cvzv3sv8ZlK0bQt4ctse+ou6oVjk/zcxxlOfGXqbFMzi8J1zE+qf7E5LHPZ27zzHj7mRfHm3Z1 bHJ7wLKb4oKPfCi+fz/tixrL6GgVZSZt85GBUroo06MdTNP6FULV56wv/qkfbhzKJPOx7RtOjXOP PyJ27rw1PgO4cNnDa+Jln7kkXj/8nfiXs34QD66DyUJKJqUjygChYcyjA729nu7mWLj1G+L0z70i 5g2vjz/+4L3x1q/cDTPbE0PcYuPUSwkIFjRHou2Q5SFvAQpVNLKNaAuJ/AKqZF9Wf+vnya519bRS Z18KOFgH09MZzvr5zvjF2R/2gXUwTDr8qEQCCf62DEkQJECwkfGQqR6DyVZ9qJGJ4NYgUOPVkoKJ eWUkC3XaTSG9NubeCOuL88ObNrRj0g6Y1QPz2YfBJ4ENy6N/D4yskhnWow4mxTL0KPLPd6rlVMsl UOJNDwIXlrkbCY0eDFgp2cEqzwBnTZMproZ3nrYjDdKjnAOM73TS86pPT+GViHEdsy8c6Uru1LHO KRmhc9NLZps6Yf6dQKqQcCMHBMY01KUEwTYAkq1dtybntePW8TxBHTz1V9LBK4cbBChk9shzDIIk QQzK3UCZDTsm8730iWjkt1IJNIidkGXIclge1sg6kNKG9RWAZASCZ7iBGzJWrY4GgAfBzPUAKjPt R9ZHJaBclepQyWDRzo3dbbqurgc1PY1g0u6ANH0QQ4IUivF7I0ej9jFQS9Ro6TiipVkO6uLaNQ7j oJ2LlAOjjVex/gblUSqLwUbq1J+8E6jIggNu0QbDqDcy4DItCSHHQjOnRBpBlSHWzlI/e1M/BEYv VroFJNsoi0YrxyA6HXfuMI38lmjRbpJ3mPfA1GkXxXpuoPyqJQ2Sf6cGoOl3VUokIDrReR3ifT/7 QRsnFMP0kfeG28ISxTNZP12DvBFkiPo1uHbSjqOz50LwcPJBPNVD5kDAOWfW0Dar2GPW0baCjI7h Tomy6nyqpQ9shuL0f7p3Jcx/x/fGkVMZ15NpVl8o7XjvX/6a0gRKOyj5JMNRAVsrYG2hd5x/fnTW szzX+tsmzp3NFyxIQHjp0qWZnnRFvqvGN45rpekUZz6CEvvus28ccugh8YNLvh8rmc/SKpbJ+LVr eNqO4sQnbwkjnVIm0zYtifCy9xlP/zvvvDPBiaOPPjppHddI/XXGrxRnY5lK2f67v61P6X+aJtfY 8ntqXoUBtA39PKWrjqfJccVYTUe9dWn8lTCpDsw8mGRKa8qRAWv+mFdtOcur2nLaXmkThIe8+pk+ cj93z5gsCxFLnKetg/WifDoBXxlcneFNb4yDgUxD72oTZJhqvQ2rBIBzXedfP5VU9KmUYbIc/C5t WVtOw1ln20fG3neGK1IRMkeTaVTzMk7FXRiH71BhkmrrWcKXUH7X5mnY0l61Ycrzf6n/q2WcmkZt /xcAo+RXvm1399IsP8+Vlt207KZT0jJeuXo2bUawhj5V2lPBCeOlwWD2BcEMDwGUjDANKQ7VNdYC /I/g35B7C33H/uPObJnS3gTf4+x9ahdOZ1+Q38E4W9L8KeWIvy4ZVvby8ux3YaZ9FhL1t+F069kT XQ2mwSdxEpJ+5U+RYkhQonjKZM5vT7BCo4fzyjzk/SQoUcJWwYmiLlDW6knjjVVgIu05SMdSryc5 vBhhLugKsOCza13F3gS222YgFV8DRFTeb6T7jKdrhi90Dxaw0HkwUwtGpGf1j/nOYGhPBSVKmAIQ KF3QwhWYBbhYSQBBgQIACER4XajhW3gWjPBZqQNb3N+qUiSURH01hOlNWjrDCUqU3+lZ86fYmEAP OcMyMCfLURMsHy2PwIO2JMotHD4XtZwSPiUkqz98r9uM9VMn6KCrDePvedzWNZcw2pPwWyftMaP6 nB78GWMMg0jmzVHFT1qkOGEKpRn/Mw47WpXTTAM7YXNTc0Nj4pbtzH1uPE/GPHlU1JkNPVU3qIzx qsSVpznwWwkM8DoJY1F+T8Xc3Jt4bsYo5ZoVy+P2W2+JG39zRTxw719iPVbXu6Zz7VobBDLgw0jf +mQKZBTG0OU1k2HuHtYw3nbbbh2bLZifaFM9tgY2n7d5LMQ69QxOGOshqAeHiS9hNg6ax6bSBSE6 3VNPCiTDovTEAGl1A4qAbKDjhWGPri2wRbEAY5kbYh2EWQ+nfSLcDmrbxNs98hSNgqRNCOqShrJo o7RNQZlV6xjyGjjao5EGa0e9pF1mc8WD8ZPzz4jd9js09nzOC2Pe5ltxogVzxLsEUGibFqjXZiQF lj+6OO78/Y3x8P1/RR3kAcCJ9ZS7D51imPkF7Vh/HYz7/nwNQOaSOOzI18VBhx8ZnV3z0gAj8zEX PikR21qJiAYNddIh9pGO7oHhgQwmT5/beBYMqaf87ahzzMGYxUKMi9657+7x+3sW039GoHxMHttB dQGwm0mJA9OUgdI5bmTxt90Go6R3/Dx+estjsW7a0XHy+98RB791PC4+6ePxkztgejjBk6nUqOqY DB/Xgu707vPiS4f2xKWfe3Oc+hAL+diW8cbPnRv/vPe9cSWbeu1mbF4SaX4KEWib+0kqjDLq8iSe MNkeNYSaxODfc55cL9y+LZb+8ptxCapWfdPfGKefsl0c/OLVcfHZF8ZvAQ20AzDOaaMNq2SABLzS AKad6dMHAlx58ku7pT+/ZRQts0xe47w94ogPfzEOW/nZeNvZdzFum2LrfV4fx33zytjxzEPjo1cC slQL6jhRTcJ4sqUyKQ3O1WrbJwCQnWt3yCRX1SYokwyy+W61c0P88Uunx10H7xfzN3trfP6UF8Ru Yz+Lk07+RTy0Vga60ofVLBMgsI1Nz61Mw3EddRti2a+/Hm//yUj80/MjlsJwCqC0cHJbiGi/JUwK wS3TJ9iQoAWbkf2in+F8Ng+dvyUIrLP+hbjOl9U/tUS3XgIcteEELyTcTUtgxO9UjeGbgJmKfmnE sJqmX+aZylCuT5VgOa6bIRqUcHDsm7dMsemMMR+8gUhwdRwgoZW2a2DOGdX0E4DguQUGROmtQZjl LAtt6Xe2QTWsIExxXvmYGxUb2BzWLJl6jUw2sba1eQrAXBAkcUZrqFQ/wZMG0vc2C4khT+VV7+hk LeqF6ZQwIlMICwgbOjmJFsFG6pXMDZu5hosGYYRNtwvxyxaAigmkFBQVtW0MV0+7qtYxQXnGADjq qJtilqYNkoS0BoYi2djSDoP9iu0LUEVO+Bk9hMu24YRGQlsQg0bIuKYvImoz1LlJE0Ypg8p1U/gj GZFwsWWwLekpAZWECsjbq79aWJ9TRYdM2imDt3cw6SplI3klZuoBKhwLlDQJwiHa0pMMwzl3BS20 C2F7ujj2sdYKjncB/ChBYp55Lanlc/xWGXztezjWVFWZoKz2n/YzxnuYqYwVr8dyfVUlg+U2y9pk +ahPpiORQ/wZ9H2XYpb2FR9FYuv5qIoxCAHbyfwTlG0mXBPt0EubNdLHTYwVDWI2U9ZWbbFAcNmm VsN0RxkLG9jrXC9QFKFI7DUSFbSb6Wi7ZDpinNMgKFRzHCAt1wttHAmY2PeO0Rn0pYz+/5Vz/BSX Y4Yf6Vf947zSrVyxIq644op44oknMO4MsIe6jQCRdVNaoqyVrjuuHX48dMl/PBdX1pV+aIEu5t9p p50eDy5+ML7+ja8D0vbA7FXVCcnWvCvZl5LZ9ZW0zLsLfekDDjggtt1u27j7rrvi/K+djwFpbA9R hlIeg1dWkMoeUeKX9dF+UO1RtdqyblbyrYvrrrsuZgHcHXLIIZNMlWtWpYUAVvgn2DHpah4n/f4L D1Nv2xhMRqNmrDBH9vjX2+OGE7aPWPzlOGCHD8Qt5HcsN26d9MABscMH/LWpq5DMEc/70oNx84nE S7c4vnwa/ca/vFmi6pvPME1P5QqTLHn8dON3ah7nns56zzwZYewU8eanSls/27nS1htD1P5ma0hm 1rwLMz01TuOgoSpp5UP1jwc3BdDQ66lrWAk8Nc1qEuVl1r2Uy28t5Uvr1LpSvlq/8vx30y+Bqt9/ kw79r99U/7+X5tS6To1bm6XpPNX7AqbkO/K3Dwybzm/KpTNcrTN8pkkY35T3k3GrfoLzg/RRK+FK P6nKoUvj23xLiwlKeKNH7sVsmesZV5PlbWAfZF6XcaatKZ2HfEVVQ2kFDyG72bNSBdJv9p9NHGs9 J0hp4FI1jaKe0cE+35d0fCX0U/1ucH9SMhMGexMHo61TgkIpy+Y160LGfBBGW2OXne4JqDD4rdsA ryEjrOolBiXS+GIPhxu6hrkQ0x6gVG/jSE/+bKCsqbrBMxdnkxf1qLo6DMjrBBx0xVaEgMUA4fwu zngDNGIFzKikWYxdGqY2XX8b7lHq8IwZc2IZ8E1e00lZal0xhLnLvM1iNYDOwGNL8/UT/C03cRRD lxso6xAHx/6WLnqitZKWt3akn3E4nMAeQqahwUuv9dRpEDPVgavPAjed9Jt+qsGgRpB0hQDGE9X4 teCTaQg89ZPeOmktaLmintGPf1EBqSieGrrqSL8BGmhZtZ+LhEd5nfEIIwihNMQE/KjSJKtWDcdc xptjobgCauR1oaS3joskdKPslbq51KFcD/qfMYCJKrvG4wAhmFBukrWTL1Os/mmFWJwO0dWHOoIE i/MHlitPzN0AId2SiMk0JDolNiGKUjyR8e5p7PTOxrj0+9+PX/7oe7H04SXRi6iOTMt00LCOVoVf ZaQERyrMFMM5KSwJuS23XJCi9F7HOQbSM4eNeMG8eTGTUzqt/HPOwJzlrnjUIIZovHFOmz3Rk8iS oG1C7UHdenV0OxqmRQcbvOLVQ6hvyNA0U7/N58+Ozfhoi8ETW3VTV65CQoFTt1EAj2RyYMQ83U7j lFijL6dKTdSvn2XMZQXSHTwAQhZDoXWDPbF00ePx0BKMVf3htnj2cw6IPfeFOVy4FfXAGOXjS+OR xffFY4vuAKS5K5Y+spjTQ5krRK8hptswvuDNHMOAGSANEMxDserhv8TVP+sj7L2x2zNfGLs/68CY NWc2otmcIFNfSVOyp+3870IpYaL4O8wFc8GbHFxwZ7GedKBy4bV7c2c2xqzOuuDuiXjOXrvFDddd Sx0Un8buCMS+bSHTN8hJb2GwSSLrW+gcl5QH/vhYLD/onfG217wMlG887v3+OfHBAy+OG9ezIpN5 J/YcXKhH7WcIxbHYO17ygt1i5+fNjRN3eVG8h7JMIEHRNW9aDKFrvw41A9tUZ/nNS2JthPbQFJ9s rWPW8StwUnuy7rj2RMX4nnQqpeAVfobXTwa12RNT3qVjvAhb3HXdknjxJ06Jd7wYpJaT26s/eVJ8 8Ijb4iEM+Zj3GCDSBONBprwORmDccUBd6mGQWlhEPWUd4vR5OG2Q2G3VjY/FzfkxPNbCxvH8OOxl u8TO45+IC1+IZIplauqMGdPYHnZ9boxedgOFrmwU2vXo5SOJaVErZcAeAoux9ga0y2FPO08c814B rGFK6ytAaJ2uufqheNPHToj9d5wdbQctiR+8+8Px+t/9Ph6hW9TLN23bRuBNY2vNoK8DiABKBPdx 0mvfL11/Qzw848o4/WNL4rKzzmQ+KLVQWVwlpC2XbZntTl8Y1wIL0KgOYrvLdE2VdpDh8uYPARwl QjzhtZ02ccRzrarUvQJM+T6BIL6LDYqUuCjtTRopqcG8GIFxU91IMEPgUNWLnM/EdSxo06OejUUm zBuGlL6y7WQE6gQkcDlOKIdjbAxwM0/PWbC1RaIB4D4YoRkzZ0XLDBhUNpEER0irfYiNnYVcA4ne iCBwWMZ0jjzWSho97U9kWWgH1T886Z/G2ijzaT08OR/hXZttbnsA5qoLOgcmuq4T0ULyakHtYz1G iQRxp7WwljEuJ6a1A2BiNRoCpJeTcNdl7WPQ0AlWyHD3so5qX0BjrQ2c6EuYNxN+GuW2jEoTTAAq CpJJfK11o+Y0WBpECQ8JJ/tmcA2ECMx7PenJOKcEBafNrTC+Tewf2v1JFRrmsqdFgjheY+l+oX0N x5R6iW4wYwuq44A8OinFTMIyuLMtZ5OHfWZ7rYOgsP8ZNGl40rbxxMJ0hhE1nEegWXnqAKNOGQcQ TbXvZQ69GlN7H13M3WHmTTPxvKq0j/TbSa+DMIZ1rbbXvIYzbdAoxlotp8CGbalURCNtp/HT8emj MdN2oe+6GH95QxXxBQtSUoUy1QNgWH7H1UxBBt6tRlquEzB9VjMgD/muRiLJ+dvlWkN9bSuld7ym sBExXefaegCMlYD7lnMBIFM76Y2R50yIjmwf5m8Xa0MHfZTzinzmUa56wJJnMJSmI3KpAdl0rGf1 TQsynHO6lXmgBJE3nfxfuTJb/K48M/apmPuQ4yRthzBPH3vs8bj2t9fG4gcWJyAhqDCI8dQx1G4E kmUe3K8dp7aD9Ssf6+bhRXHul0AWjKu+eOHzD0PiCkNuSMl94bNnxIkf/CDqcL2pelPZXx2HSoHa l64tAhWkxRzy8GR6R3OsXf1ELLl/UUpCVm4DswzVTdq8qxknMFYKwbfplLVVuohRw7rCOs8Gr0Fv m8C17Morr4LmXRX7P2//2GqrbelPpekqa7r0D9GYQdbPnDbWkx//4851f9cdF6c9CAoau8c745MT 34jtz31+7PzBW582fwGDi+IY6ndLNczz4ksP3hyHx5fjDMY6G8rTxnVeFDfJBBaPmu8DvvxgfDfe Sh43V3035nF6Tbipj9IVAuzWzeepTP5keMpRGN1WjLIb3o/u78bj/dOmmbE3/rGurrNPF97cSp7G 8gBgcPAtdkW89KXf3JhQ9WkSqKkBkd555cTTgkh/k8AUj9o6l1elf/5euUvYp/o2fm2dasP4rqSv f+n/2vAlTAnnd205U7qE/cC282RbCZMSxu9UvWBPFmAXfMh86ANVHjMf7A0osaYTlOhxf8IJTlie cmtYek75o/HiVN+AEVTyJKUl2Je46i0Bi9rgXhuq64Q+KzdzCEq4bxUpCQi5ySi1IIWehhGU2MTJ qMK0F7sSm/sb541jsX4jGOA1oVOd6h1j0J3uWTptTJjHdFT0dRWltnz8u39UK2lCYlEjmPJ3HhIP s48Vp2rHMOCC4EVRCzGOhyDarFAVttzcMRWUKGmU76mgRLHfoKFJbUys0W4B9JxghDdwrEdiXeOW 9VXVCjaJvDGjABBKWbDcpit+ghKCETMoty4Bmirgkh78EaDoqqq4CDzktaD4K9UxBxrzCcaCQMdU Zx6GF/LIvDngmEUbKJkzFWzYJC75GUZXwhUQQ78N1FOnBAUXtseqqWBYvt30TwEk9BWkWEvZZiHV Wa4J3TT00/9qLGLPboBls54aXOJ8eGBDbMj75NHPnTaXybdxU/cO9wY2TXW0k8CkEd3j00gam6Lb tnYl2jBguegPN8XiP98aM2d3RfssToUaudqPDpLYq+QPwSAxTXpu3FtvsUVss/WWFSZsjEkBErPd NlvGbBrfjXbAAYMI0QCN50mGDBCIACfzbcTR6iuENETlCMyj0hIyWK10mjpwnnSOtshkwDgJVPBe xl3CRR3/rs65gBVcqdbbnzd6rIUQ6B5gYQFwGBiEAKFetlsaOaSeDRMQ77npM5CT0mDDok3aOiHS IRJWLL4rfrH4r7HozzfFrrvuHvchLfIYxj5XIzo71IfBT4CIdgAaT5cpWWVwS3zXoWNE2zVjiKJe Q2ej1HPNirjvnBcmwwAAIABJREFUtt/FA3feE7dd/x/x7OceEPvud0C0z9mC+nPK2gYTRxncA20n ICLKqb7cBCAQJ65sql0AB/NmWm6IdNJOI6UssltttXX0rMGCL8ycIIxtmhIBlkVKyA/O/krmk2dV cODKo73nkbjlayfGGy6AcFqPKspamCngjjlzp8Vw91pQYOwzwABxPIqhUk5mR1GXOP7w+PH0OaBq EuqIrbWMxcrVfbHLLlvF3RhcrZBTSLfMXRCzQYUlFtcufzxW97ht1Dg2heLydDHbkaxIQKa2vgHG fy4LPCfJY8O9qMSAXA/JTFN+mIjxJvT3uJu3re+O+PFpH2JcvC22uv+6+OZ3Lo/HWpC8oe2VCmrt mhtzZ0+LEYC11esRsx7lxHP+LCRbOGldi0FFyjHMdbQz5zAGJzASg00KmcJomRUL52OMh0IO9/88 3vesn2fhHEcN7TNjAbfLTAB6bFi5NNu4HjsfXTM6uNYMA7QsuKPUYQiRlWZOODuxrzICN9yM/vgs +rWfK3YHGOeN02bH7E7E7dE7X49xDG9iGceoadeiy+LzH78RZqs3VqDzu+5Jri+dtiAWzkI0fg0i zxDvXonZOKAwO7ePtHKa2mf/M+basa+xgEWu74n42jHPjwtB+Yf7ne+V1s4xURqe7ySk3aCZRzLx A7RZ3vZjQ/NJBqFKnOUmz+Jl/zg3vTXDcbWJowzJENuuLo6M3SQMCSQR4Hw1TwkugYl05NNC/2db 814VHctj/mk/gvwsfxLt1cxyVMOESXCOwYiMsNgPs2l7m4lEXxqtZF0aAJxrYo3SnkIT49lRZ4mH KXduksRzXXUedwpc8KkHaEipBcK5ZqT9B8okEKRtCMuvzQEZ/TGQwn7T4pMSFJRzACBACTBVtzQC qaqGbTLOXFLSAI6LNEgbPyUEPA2fOXtmXk0pA63tgW5sZDRZHsPzO5kvQS2eO6lLOsrj2tsvuEu+ nvinhIv50H4CIxtYl533+qc6Wc5nTnQ5yfGWC/umY848+hwgAjDFdlcSII1t2uasMYKIMumqvbnO JMJIOWwPAchKWSxAhcTxis1ptNdM9goNLDVTP/vLOgjYNrCmSVCkqoRqH4xl6yEpAxwESCHwTT/B jPdTXkGjNtpb5tY2aVYyAjcmAEN5ZvHe/hPcUL0urzuF2aMatAP9YjvzQ3BKSSbBDW/NaGQTFvye gDDsgjB1nc0yknbWhPACQdMBGrzZRZF0Ggp9Ym7bGKmQM6atE8DIcU6cbva9Jjb6Nt/ZdhAUOc9o 2xJeEGEBdXcsjDB2OiGce9l3ZgKIeSOQTpA0GXreexuL/aLfMPW2n2SMO1pYV4jr+POKbeunvYyF Wz4j0/BPGpblW33rclpoOhVSfDLYf9ODPacTLHA3qzwpnSMw6dXMV15xeTz+6NJ49OHHUZsC3OTA Ybi63yvZJDiRgAR1cX0pa4xtmKnlkiNI7a/8kXPN/vvjbbfGgfs/J9fwb37j/FiGbYdZ2IvIdmS8 MiKcePmVsUlfI9SjHKBMMG+vu/762PtZe8Yz99w9PnHyJ2FM+hJEVs1L8e5cD0iFmUFKludvneV1 L3a9q/S3z8xdnN+CELcihbp4yf2x33P257aOfwJcZS3EP8cpxEC2HgcopTX/Npf/N5/ZtIVjoPR/ isIzFjSQLWMlE/ejKzjNy7YmD27p+SBg5dG88zROmzPG0QaHTFsybq1vjVORlNg+bo6JE6eU6yFO FAnbWZXgMX2Zw6L7X57LuDS2ZSu/fdZNa31LnIoUx/ZxU0yckF4b/yxhjhGuMKTmoWQG3GmW1YBl 7Jf0TD+ZUt51Ql/6HmoOWhJQGjBUGqM41z73JCLkdaL6F+OIfRwCFWa6fBe1DtvJ56kqBUUaQLrW OdhLWVXTyPBJ69I+OVYrc3dw0LUXMW6kjYvLPPix326PxklbHhRD3/527NX6nvjkwNdix/MPiwPO emiT8MYrbeCz7WDeT9X/7vM68/C95S99/dT9L3iyUcrCenl1djrrz7siATO1/w1n+mU8GKeABz4X 1YtW1n2d0tGuZ/rrp7HStQD4gzCmurzZrabv2ulL1wUP2GToCnNn2MLgzYDBtD8NY9jZ9LeqEsXW RHlG4RF6vFovE6g6JSbK3GnkUGGqK4DEVP/y2z1q6ql6eVe+lZ5IKYkq8CAY4UFHcc08awBTt4l6 B7+LlITgRAEo3N+EOPz2qsriNM4ok93T9re7g9IStZINSjIUIGFSkqKqmlHS830BHaS3OlhLtEeR EpwEKjYzSvin+i55FHWJ2ms8Da/xylQ94NYNVTcEJwQlEmRhjw8+m0F7298y7TpBAZ1AgeFs/+KX tAmghNIQ2tiYWQVqMoJxbAf3dOIUoKQAI0WN5B/1Z8nbbyUnKlCQvzZ1KLKmtIaHN5a/gBH+Tsfc UpKi1hX1jnbqWK4GrX3vDShK0ub+XAXLakGK2rD/mefGsvD9vcBu6Hff9fu4/NrfxPMOfnnstO8L Gb+e/LKFA1AobaDebDNEfRNomSOTA2X0V9mgeceBXfRwkvcf/3ETk3Q8Dnvxi/LGiT4sfq/nlogB Bu06RIKSyWXz8p8MwwLAiz2235JnNnkYrVncBjATQygzYNZGASnc+DwtHkRKohdxVQkpJSpECzs7 p7OgdLCZsw+yofMKVQ0MXCJiO4TRzd4exKvZJxopb1q2bwEFheHzpFBmSgveucmQwPQO1D2mbxFb U7F+QJgNLFqPczrTzcmkxImo7wgisY0YFjTRVPfAIKU2ISYgeAcJ086VntMgLocgQBff/Ye4+6b/ oJacqhK+HRsZ7V0Vi/Ieu7jAj49DpFPoQSbFBOoOimJKMMGKcMc9afZvAJxYHe0zx5G2uDkeuf+2 uPWGK+LIN787dgeg6IeB1VhpPSCF1wp6StOBwdHpHQ2cyiuJAUHKaY6Ek1cHqgJD5yGGXBezNt88 Zs6HCAU4GaSP2H5yeCQjxJNG+pJBrBk0w8RvXrhfvPKU0+PjB8xkIbs/fnjWR+KcK7eIN59zTnzy 5bPixs9/JD51/pXxUKb53Dj+7CNj+Obvxbk/WRavOPG0OPmfeuPq29pj34Ur49I7muPVL26L60+8 N760Bl3teW+Kf/3BCfHCGRLT9bH8Vx+O1536y1hZUSerKUnl0b6bJEDlXZoXxrOP+Gic/flDYw5X 27Z03xc/wObFaT95TNV9Pg0x9zmvj0+f+ol4yUKQ2KaOmLn+t/GR714e99GW0zobIHgR+RqaF0ef 8oU46TXPir5L3xHHnXFNLFn4jjjzgvfGwduvjAsOf2v821/XRcvRX41ff+LQmN97dbz3FR+Nq9e1 xRZvPy9+/b796F9EKf/67/He15wet7iWNcyP3T/wyfj2m3eFaFwX9/70jHj7OX+K7V74ybjgm0dF /e2XxBc+cEr86HEJ5m3jyGOPif3n3xCfOnt1vPaTX4zPvHJu3PLFD8UHvnJt7PH2L8Tn/uXF0Xzl SfGuT/0gbn2C0/cDjosvnPr22G8+J7iP/zKOO/GzsfwZb4gLvnN8HLjVE/H1F78tzntws3jf986I md86Pr56w17xwZM74jOfvJibGjaLl5z2izjn8Gmx4o4L4y2vOjuWb3lIvP3kXePyj30lFjE2npqU 3tglrh/eEPB0TnFnXYVJqIRK9Rc2dPtRvVB1xfNU3Nf4pRi8TBVhSjy/DSNB4kcJApl5/QvBKJHu /PI0WkasYqMFwp5kveHG3wkAEAdOhnzR3+fjgjsyuiENW6bEBOlqZHC4yvB5W5HM4AwYQ0GMAdQr 2iGmZFIFWyQS0/oz5aJAydBalToIlnGY5j6kDwZhlL2isQHgtIlyeOOEjC8zOBlUr8vUaYDL60/r OBEehngalC/CT65KJjqNrEJIKX7ZuA5jp6S9gfXX9FogvLRsr2qQQHIPa2A76VqPUURMx2CW+iGM ZdAbuYlJCRylBZLBIW/rth4iTvsROm8GUk3CvPPqTdKo57SomTpokHGQ0yIJeuwoMs7pCxhGXV2u NTC/lhdjrHRW1Kn+IUHFmq46RB17RxlcXqNpXzfPRAoExlODctrZyba0PUlzhBMW22rOrNkw8lyx ytVivu/neQDgWXsMqigKQnPWHINISTAYoCYhgCUcqZcEmKogis33cGJlnvaf7dFOe+UtIvSzoIFS MHUQFO2kk2KXnmAjmWd72G8bGNeu4dkffKfD3/T72Bs0fDpCX5iOJzN9tH2CMlSmiF1aLzcv9xj1 U4cloh3f7FHZOPY5v8dJqw7CRn1bpSn62aPWAKDZL9PoW0ls50GON+rcxH5Sz96tYbZRmOgxxpJj Zwb3k5uew9pbO7yRg8fSDUmsFyK/lvAnSMXRvv8zLluC3rU8DnjmBXtrL3X8zrcuiPsXLWLP74KO WJvSjq4p0jbOez/etENVJvcE94Zk2B07+AtiybJPsA9UnCpXqLnQ5i94wYExD+lMDYbd85dFcfDB B8ctSD+2Qmjm+mN5aDABAyUzBExU32pDTfSss86InXbakW19lMOUWfFVVEH+/Kc/xVfO+yplXZ/r g0NDsgm4pNJHPJcGL2ubZcr0Ceze65oqCOu3daU5+NhvdXHVVVcnTfXyV7ySvV2wxZdQD9RT4NPi /o85+j8ZYOaxTqZRxm7sh2+MOT+sMnm0tWetuSbTNzKqXUia6cqYGhm9OF497VtpM0epMRl7nQzk 7nvsEX9k3uhMX2c8x6XMpQxlASFkhJ0p/k6Gme8EF7KcP42j5/77xrDVtEwvGV++XbdncAhm2k2s 55OOdEoexa8AFIEU6Kdu/lg8cMBb4rJq/k3UGWSrEhS/SVfzLFhRnGnJmNpGghyl7NavQo2VkJWy llN8mXIt5hvPOK0lrsHpE9sv98YEWZ3ZFVdACfvux1ejpvn445UX0OfHs56/hzbQ2S5ZFp5LX+WL 8sf6koZ56Sb7nz6x3A2MBSZIvvv7/V+dt+zn9r9jKPvR8lOG0vYJSpBa6X/rUUAP27B2rTINnQBR AYYEBgsoUYAj9xaf+xwr1fCCEbWugBK1fuW5ABXmIXsuQOFH2V8l/4otB8MLSnhrR61zTdaOWxnb LCZ5G5hgRa3TBoWunjVqqluOjaRp9Jvgw1M5/WWea6UpMlwViNDg5Zq2dXkrh3TAOHtuPMmsrZkj BZAwXiP7pk4VD10D4btzsWEfgcdopw6usU/livqF7wqoICgx2lqpryoc7msFwJgMTxj9ivFLQQp/ t82YPelnmkpS5He17OX2i5WEnU47p2QC7zpZK70StIAUllZ1jjUYIi2ugAOCDxq59LfPKanA90zK qc2JWud7e8ibFgUlproCVviuUtJKiALMqEaiGkcBOUr8Yrtjqq0Hw3n159gMxnkBG0okvosKiV5F XaO2XwUl0pAnYIP+2pXwgEdQQqfkhKoctS6vB4Uem0Ubai9LV1HHBSSB78070Wsj/INnpKohhpiI Za+q3QgzcXdtJtT6dStiyeI/MtglnDmZbcaS6YJtecOpIISOHdIoGk9CHE7kBtvZpF7rSCz7y/1x xeW/jHvuviNmT2uMOZyMjwMsdGDQrbkP9nykHVsRoE9UeD2EheDALIjLuZyoj04MxPT2ady6Ma9i K4LSbGCwKN3Qq5FIGJYxboJohijrnIZkAsRdJ9dpzsJgR2s7J8cQuIOYUu/vRzUCQ2XjSB9McGLh FXMDnE4PI0nRCKM80AdhyslyI6dFrUgttHH9h3Yj3PiVuEj91AmYHQCGWTOaYnbXdqQ5iMhoX0pq qOqgJfNhKl/HyZZG9MiMNGkTwAVoQH7L3nBCB1HejLiGhJALoKLtnnwCiZBP5byGM3SCSyhBDEtQ Ej8t2JOMNiKaEf3t7l6HDYvHsdKLuDeD56F7b4vvf6M79r/v8Hj2/i+KBc/YMYYkvAF2JHy6lALp QDqCtaMNZXokiyDsAEe4SqWZ42NJsrUu2ogSb7PLTnH79VeZW/4v40L7BoWoc8wIVtQjzTEyul28 9HkHxbNGvxdveONt0bjbkfHew46PTz0PAn/9dfGrqzE6t9Vusc92V8bDDxoTiQkW1CHAkub93hcH Nlwe5317Vuw0rzu+8pet4vVHbRU3ffHcuOjBVeirvzq+dNlHY8vbPxJv/87D8eTwbvGuc0+Lz7/t zjjxG0ujm/1DEXldbnZ8JzGmB203UTczdv2nU+KsM7eJP3zmn+OiP47Hls87Id757jPjvUuPjS/f wub/3GPiCx86Kjb86J/jBVe0xRve89F4zwkvj7e/+7ZYuuyC+M2ycRgQiP8tXhB7Nf4+vnjSrfHc A3eLuTvcEf27bh+9vzorvrbTS2Lm9ohdPbQ89th/u1j03Y/H7577pthj183jLk5nzj9uPL7+sgPj h6Oz4+UfPy++/G8PxHOP/01su/Nr48S9/xTHvOWsGJuzc/zza98VZ3zosri8rz0euubiuHXDlnHQ gZvHj3+wjAohVQMBrmTNlrvtGLNW/gajajDwzXPpsxfGCxcsjwu/+j3accfYaa/N4tYV28bJRy2I W3/y8Tj31kdjwRGfjk/9y5vi+73PjCe+f2p89ZkAWYfMiQULXhy7zXtG7HX4XnHRHTOZc7Rb88yY ud9J8b6DBuPGb58Ty/Z+fbxoh/a4onE6iC+nBvS9jJfO9i6EfnpU/5RxU97rLYGtv3Nrsp/w9znB BOZD8ZcB82O/pl81jGLvAgi6klZ+Ux6JFNUFJGSaWFhbyM+winGrX+9coRApAWB+nhrLDEPx580T 2npwdjrO+1jgraFzzvVJqSIJhrTvYZ0tgA7/Zn5brnL1rLcs5A0YbhJsrpVgjkfSUmKB7zbyUGVG iaQ8TWId80rRisi5gAD1IaKfXInJR4LLssGRIGhAO7I41GnDgPQ0fCnS3uYmArEwBBPeB5NKDfJk XgOInq5m/aBZZMfcnEaJ6xqnXtc4a2Y9AG87agEUMnpktsjXupbTdn+no9zj4zA/lod1uRHpsnpO M52Pg+shRgELTCM3SNc4xCFpAOT82KohXiYATUyqYe4cOot6DyKxwxrkgiczXnGEJ30lOPSDDct6 CeLqJuw36ip4pXpGH3E1LKkhzDaYx16k0Vjoow61DqU8GiBGbCuNQCodoUGebE/rSL/IxK6jnIIw 0+ph/gCMJF7zVhLHDf72YQuErqoVSqjYhoIVjahxzATg7oZh7mFPoFGzjLadLiVlqIsbfd6kAVDU QRm1R6KtiByHvjNwceSnxIbSCzKlMsy2f8anLRzr7j+Oy376vZuyrKOOtnsnY8WyZimIo1FTJQr7 IH71FFDrgJgYhDiWkdbQpeoIBnN+CkyUspQTRJmTjUxYpZAFBJCJ+u9wk+MrR111rFFWZ4HSZ85b 1UT/gJTA7667nhudZsbyDcuYEuzrzLcCnPvt2pF1Ibrp1n6erqyOB9ed08/4TOy80w5x7bXX5Nh5 7WtfxxjrjBtvvik+e/bnaScI2VSzcXAybtkLR6EbHIv/8i8fiK232hopiZPjk6d8Ii749rfjj3fc Geef97W44cab4leXXxFz58JwVQn2XE0mq8pYpN90G9vCaVABL/yuSE4wdxjTvb3Oz7FYTlqqp65c +RMkDneJHXbYif5mfkIA8Jf1mrlBmXUlfsknPf8f/sjw9QFAyki3AjDIhGtnwls5ZJiHX3dxdJ/3 kkrKvzk+Zr76uzH4rDPinhtOQFrh6jhh7pvjB6xZMmO9g2+MXy7aJc7Y5cNx8+hzUnXjxLrz4vir Do+vHHZFPP8LO8Zvvz4R7266Li4ixdHRN8elnOgfVi33kq+8KHb/yG35y7zTUC79T8AcB44FP3mC P3pMXDrydeIujq+8aO/4yG3OSt3b4tJ7do7TdjgxbuFXa+Nb4uLlX45D8l3E4nMPjD0+dGtFzF8/ 8tnvc3+J64/frhoiwnKcTH2KGxw8etNynndI7PvxP5NGtSwZcO847Y/XxPtJ5ur3tsXh51fil7mm FAQNO1kP61DqU+bdegAb52I63vtca98iWWD8m1CpHUNia6p9EBKM+OoR0fZV4JW9945bbrkllIhp Ip3VqNaaXwEmSjuWMliebNdqpct7x0VxCSiQhuBBee+65dpS6X8YRdYd12nfF+f4KmtMiZd5kbbs kn6Wy5wMV8phfr7zU55N0/f6lWdt8GwsZXqn1IlPSjuoaqpklgBDATNUafSQYLAJyR/3LFy+I0yt JIWqHPrrvBbUj8YuNXLZwZCD/dtE6sKbObzus0hMpG2JjP3Ufzo5xC3O517md6pzFFBCUKE4JRkA D4Cl02fS5kQVUEhP2jHVNvihOsfma8q8wMO+tJ1hWjeFU6wbdFWN66gCQZPMMetCggLsTylRQDq1 Tka8ib1QaQgBhoYVlUMMQQmNXwpApPoGZShMu/ENXyQtVPEoQMUkgEEYwxdgozZPn5WO8OaLdKQl QKFbC6DhNaezHE/ETxsR+QaJEfbZSguyJlcZdr/XV4EAAYviL2+cahZV1YgCfFSTIlxl5Hm4Ud75 bFt5uF1u7Cjhn+7b/ARBdNqYsN2lS5SQ0JX3lqe4DMOPEtZvgTUNaKajDBq91KE0k98z+Q2ZGCto gAJW+KJcDyogoVRuSubivyX7pa7YlvCgSkncv+caN+d0PHXUc9OHGIEocyNM8VsWCCe512O5AU+M 96MneXs8/Mj9MXfeNnHAgS+LXXfZBx0SRIEZpUpQDHO6PIbIsJIIvd3L49Zrrojb2NRXrl6FjYh5 seeeOwEctKAfiS40hOu0njFUGdaTD0QkjdraOCMZAA/h6lHMnY1FVK9u9ISvjw23H+Mp67haRsOJ 2mFohlhrbkOvFv3naSBmgtIdPKs324Ro/TgSAHXo9qkzPjqGDQAWGQTvUcUAUACUGMEGRP0QC8dw A3pgSE3AxDe3eDpaEf1002+is1TFmBCYQDR/FGJWSZF26t3RxvWmczklpa1WrOGWEU5BBCs0tpWU NAteI4tFLrR8C7pIb3iSmlcawvBMMPi0rZGSDQ5EBqqSDo0QPJWTnGQ/yFMCWiZBSRRsdsykXyCe JCa1MTFGeyxd9mD87DsPxR+v/Y94zgGHxF4HHBy77LEzJ2EuRsTPOrMsKZHBlQOKRDdCqDbRjuMQ VoJKDeg3H3zQi+KGn/0giSNPGXtlgqijQJZMnoR9G20pwTw4sCFWjzL4dn52/PNRu8UrXjoWS/7j D7F28XXxYDOEyqyD4n2v2DcGfv/FuAmR606Il5ZRmGtQ+0FUeQ7ef/c44PVvi1eP/jnOP+kPcdjL G+P31/XG4W96bTy6qi9+u/nBsdO9X497tj4lvvCtrthwzafj09+9IU5/67vi+VefH3dsgHllkiQT y6ZgGStoc130ofLSO2eneMZeMKR/vjYaj70sfnrcLfHvF/8mfn3nEfGSo18Z37v13jjioL2w1P+z +MKFd8SC474W+8y9K05903fjOYe9IPY84Jlx/U+WcOvC7GjtXxRL218TJ56zT2zXfWXccMXc+Mu9 y2LeF0+OV++8VTyy4ZK47P71cc+dy+OcT38ttuy9PN68jNPdfWbGsm9+Jn6+cjkWmcfjzh9eG098 YtfYd8FdMb73XvG8Qw6NFzz7XbHuofvirz//bTw+rylW398TW374bXFg9+K48t4Z6OmxAA/PxQ4A YFBrR6x/cFkMHvuOePOr94ze330h1rZuHzMmyPsXv4+uE4+OZzxj22jqmhNtu7w0PvXq18J8DgD2 XIUI+Xg88uD6OOT1n4o37blDPLRmRjxr4f7RfPUVseKg58X+268FhFmLWsv8mFi4RYxQv92O+XBs dfdl8Ys102PubtghYJxq+wBdsGSAprNGKKkkU5BEM2PEmyhkmgQDtG6tSKOAgOCWp3wyDYqMK1bv 0ilz7hrg8qf6RHEyIYV41gaBzxpkdSIpri3TqH8r80CwxI3cKx0zHJtjIRpUH9BgpHNakMG5pP4i E4OTasGMIU5mtIDN5sZ718EkcEjXQqk/mrdSMP8krDwRcV0qjIPlNo8U6ac8zbSJwB0ZyV1kdQQk Kk+ZZKWKvEuAz4WBNmARTX9+ZR0rgSp/BT+0reAVk141NkF6qpIZz42gAUk2GWXTy6tNmdCWz6Rb aWtP573GdBCilANWq56EXZaJ+II06qy3sB7UEbeP9cnIhvPjs0Yw65Awm1DyiYh5XWiCCeRpX9I2 GupMpp/3dQAS8mwCCAyGaKJd6pGOGMYIMpOWu7W5SkrVC/ojC2phdVkonym/EhT4a+W5bhRwgzXJ trZuBlNKgZ6jzTv5CxBNtA6k5lQb6wD4bkJSbE7HdLAaTiWq9cm8fWaTFAzxZg6J4pRAYL2HGs12 bHWsMQYsSY5D29P88Rlm4x9m7Va/V6Cji3o4ztPStn1i4YhYxojrZnH19If17WP82qfZytX3NFeC CSinYOeG/YMyDEEkCbjYnuZvP1u/BoAsW6GcqOeJKOOj0zFIuOx/M7UvKS9yRTEOcSxIL8OqmhDs LvGZn+SfbQp4ZF0tjiX2OU++KauOkidYNpXYL0xLBvov/DE/15Hs+5pnVX+0gWK+Gs32Bo4Vy5ZD NyDpQ90GGJMVIFOpRxkE6ko61imNXPKtm0yfnz6ny76qhM3f+K9dszYefPDBuPCii9jnBrDlgUTb vYviG9/4Znzv4h/EkoeWcKItMUi78de1paiHraF865G6WY5BzjPPPBOaYjze8qZj4qabbow77rwz DVZaNvPPrB0B1K8yomvKlYVhjaLO9rEf61MYq0p/0X+kI8PhPr161aNx99335PrWy603GgefNXsu azSKTZTRdrU9JutezeP/5WusaoTOtbKy1tJHqJKOrpYhPDYuPeIXTKUjM2kZ+NvPuCuOjZfGYpjv Y3e+J055/Whc+N0qo0ooa5HunafEjp9HAurhr8YlR70vZr7riLj9Gw/EgW0fjTuYs011x8RPu8+L ifdPj7bfEZupAAAgAElEQVRvo+rUtF+c/ufr49JFbXHUhZUkShu5XvisSLKAYzJV7zgSOxcHxvQH PhF/ftUzASZur0Ta5O874+JVX444aZuY9nUZ82fF2ffcEJfetzGPZ599T1y/wznkfwExj4tfLfpw bH/89XEJ5Tj6exDgjW+KXwx8JRA9QGrEsbtnAhA/vG96vOaiSmaCD2N7HhU7XnVItJ20U1x66dsi zj9/siTOactfPs4z2/ttl94TO5+5R3ziDreAvaj/x+LeXV4eF5neXp+JO64/PrYD/HlX3eHxncYD 4uxF3404do/46O3OrYobHd0nzll0U2ibNK5+d7QddVFYp+/s8Pk45qW3xL17nhq3XfP+TOf9018b 32f8VNp1UwAn98rJNDcta9U7vypxK+CAHmUN0T/7hf2lhPG9bVMkHwroUCQ8Sr8azji18Yqf35at vPe7tJ/vfLZ9LYeuAEFEyH1mGjSDTpUPbUQIRqQ6CGuh3455gYfyronb5HRFrcPnMSW5meQyfeYi KNEq7cJzraSMoIRuA+vGf9qx5xb7EoIStW6qTYmUlGCNmFThqAUtjCi4AM+nU5VD5+HvsNKMtNNT uamAhGFqVTlkjpWacFav4SBCNwrPUW74SEnS9MUfYEBXsRdRKYdq4t60MfmuWg7jbRzFkFmsQwIX OkGITFdJQi5LKICH7wpI4bNOMKCoXvhbqQmBAUEJnaBEcYIWhfkvfuU7DWKWH3xXJCXqOYQYT1Cj G6lV855Zk54SGQIjliE/jI+UnCCsTqBAZxlqwY705M90pUAJU2xPFDCklFFQovgZZ6q0xHoOb3Qz 8m/lT1Hv2GBfcNjutaAat3Ts1gIRNVESlFCVQ1cAiTSEye9aQGJttX8baGNtTzyd48IJiFU2Rwn8 BggTCVoZhNz8kjBwOCFayonfE8tWwpQzu5pBN/uGowtd+1bEWFu22xl7EfNY9BGNhlBSD3ac2zd+ cc3lcfkl/54W5nfdbafYfodtuUqkAwaYQdql6sQop3ISRXXx+OM9MDUMNCaWTH1FHQNJAPQkezkF UYRVIlC1DwnuNgxRtdEQ2otop4ItdE5LK3rjhPeGD/2bOPX1Uo+OCSxgAzz0rXmSdFbTyJxkQphN a5zJQjg3dfh7B9j0B7EfgP689hZkmmSObIuyoFm2isFEmCcWkApxI4FQIf4XzJuFGHEX8xrCnwnS C0DRywliGs9EQgTKmxkrsSdx4QklBIlSFTIIk8QRm2amrbQGJ4osjvXE8wRSeqIeY5gtSEvMQPfJ NpLN0RK9BtMaMVo4e87qeHTpqnjisUXxoyX3xW9+c3mc8KET0Tk9BJ4ApHOsotM9hP5Ck9Ih7Ugs YDtB450SKvKZ8g/bbbMb6blBVBY6x4PSKDKSWNlgxkgQM6Eko7AX0TLyQFz7lePiwO80xz7HfChe tm1H3PjLi+MnML0to9+KW+89PY7fC8maTjqETWKY/D2tmwDIWr3m5vjxp66MLQ55KacpnMoPfi1+ fVNjLDtoT8rcEFvPnxZLH5wZ2+361/jZuf3x/Nc+Mxb+YmmsnJibAMREN30Eo+XpfbEt4ai1vyRC WkDNOuvnYpjvPoyw/j6uuHNNLNh129hwzyOx6jkwHG0zYmZjfzx2113R/Zx3xFnvf1086y+nxtdv eSy22H1N9ANyTZ89P+Z10qcbHo3Lv/DBuPbKt8aXjkPihz5ouOvncfoJN8ceb/1SHD2GnY1GAL2b fhu3rHlFvH4a7cp1rwNXnxGnt3E63jwd3W9uWGCCapd3Wl1v3H3NafHifU6NLfZ9Ubz+mGNi/V9/ Euf+nKvhNvwkXvU6iLg3vDT2ZLwm0UofaYOlrhkd9sF74tIzj4m7F50Sb9h6u3jJAT0QIo9jRHUi dmMuYPoxmjdcFacfe3v8++zp8cKTz4s9xv4Q3/nStfHXvunxqesuip+/42txzMAu8ZJDVsdtn7ws 6p9xGsDEH7ilZQ0gyGh0rH4khpkvX3zPN+LetUtjWR0qKVXiWQLYfbQNRFQw0PHtST9UcxLHqjzY D20wa/XMSw1QjjLAkgggbukrCWvXHcUaJdBVFfJk3rGmM03DqnIkY5ISRsRP8BBCQULCdcc0ZOll 8hIcYU61wrRpeNEypcOvQuQRj3DOOz/OR8FLQRIZ3maYUkE/GVXXI/NVAmKCOQBqQdk4RTE8cU3Z dpAI6GPyWA5tA0wQb3Qc9QgW9swffzJjPMBYE6ux5nTZ+ILBazCqNw0xSlU5JstMKypkwBTFCCES bpQ1mXziZANTXsVDm2lnt+Vm1sp2pNHqsbPDfcxSbHiyUfNOpi1PTCm0xg+VdBhLFJg1ibJzMUXW ZwSOWgOe9o0+SglkW/FLN4GqW52Lhe2OqhuDLZndOhh/1yyvLc3wSPZMCI6wDgq8Svh464an/SxA McFpXAtMUz1t6TXJts8E673SEKkuQt+aj6o764nbSdu3U646iMU20kn1FoGSSrFSTcU72mXedWm3 g3Y3La9o89aSNGZJWwuYaWS0V0uKnmhZV/IX1JyButcQYRzj9mdxdfY/7aF6hupJto719PaUunoM xdKe4+QjAV3Ua4yrKon9O41xLJGc7Wo824H9YrSL8UcZ7WcTJQfqBPibI4s2oWwpGkm+rp9ZVtJq Zt1vtpyoYnQxzrUroeKRQFs/88X9S/sSOcdIT+J5hPbLMxP2ESYPBDlpUm7keqKJ8tCjFiHzKO3a CjDkqWXZC31tHXWOdddZvwerIvb54j/9p9T2byPkGCJdmWnVITz9Xb1qdebzGLYeFi9ekmDmOkAA VyONIjtflSpxrCcoYZ/wsXsr43njt+nzKzP2fcXZ9g7thvj8OZ+Pcz53dlz9q1/Fqf/6GfbWZYAL b4lf//rqBCWUyEnHfLG/XFNUsehCOueSS34Q8zi0+NxZZ2Fo8Ip47n77c2vV9nEy0hNeI+r+PcLc qJTBVASnHIc8Zrn89n+1/x0DfAqYYV+U+hh7kIMbhj5+o9ENvXbrrTfHtttuBZByL+/6E5SYPWez lOLYepttoJEqRK9x/ytufe9GJsoxIbMmWJzM4/67xQ6HnQDd9jWyWBznHnhOLD5597j9zCtj+xsG 4gZ8r36vUgDVEkj84Jyj7zzy8Dj8cOiDJUhEPH+X+OFNE3Hs2yK+c8/Z8fa9T4k/v+XlsR2SCecc 0R0D55G6kgzHnhv3fOfs2OeCD8Vt1UQLw2x7eUCUkmmkP3jhL2PxwA0pPr343DOqBXC5FKarDoZ3 HhnbfOOI+MqLH46ez2+ax7Mv/GjcjnTFyS+9Mp6/ywU5N9511dcj/q0t9r73c/Hnj1HY730v4k2U EwmJL718XawGn1CaYt93nhd//OYZsc+/fyL+4nzW/fnSeOCb18TA+3kGIChOhtk9rsw9GWk//k4H MKqESqMWdnX4+2afV+0QVzy/KX70z4vik+9qjEvue13siP/2r3k2wIQBK27/c75bASUWnxsH/vJI +oo6XP3eqDv8mxng4KN2jKsOmRk/fuXtccoxDXERINJTucL8+87nrBXftrcxSvlL3FL+so6kP2F1 tWmlB39K+Hy30bPiX63zRu+KDYssRzXNEj9VYzisHMSAtX5TQYlaCQ9Lo9oGjZJrZ0m/9rtIUDhn Hfu1QIPh/C0ooZPpG2JO+7sPekJwQgmKlmrXVUKxT3sTE/bOlJwYqzLzawArastm2DyAe/JJtpDK Wmz4viqD6O0cOq/c1o1VVT561lasItT6Q71NumL0UjZTGxOd0BWYe0yJyPIOpmsy/FSLlhNebV7d B7rd06su7WrwXKQdVlI+jVVq5FJX/H0WVNAex/Bmc/M2Dg1faugyb3+oxjF8Ufcwjs60Sjqm4fMI vNiI6hwy2JVg3FzBA3xTN9XSBsZaAIJu+TMkQQpIMQ7/No0+0KnSJYhQgVVoS8pWnKCLznQ2VMEc wYYJDtCFFwwryLGW+s7iWb8u2m8DoFCW0XzLM+W1DBl2/vwELQQd/GwgPaVhixOomEBSsA7pzmIo 03w55uH3AH22HlMJG6VlvMbVatcpuQHgsKY6PmZDf6U/YbvYzwQk/DYMzGWlzYmnSvDyqtRHF2qJ LDqpIspihK29yh7Qh8qXkhM6R5kqHuV3evJHG2H/yDWuWbUK8WMakcZxkkoAlM3Ob08cPN30BB+6 AFWLbpgxLPb3j8Tvb0G//oFFcdQrj47DDz2cCQ59gyTDk088Htdfd3XcduOvYwdsROy6Ayf2bNSO iu5uDCIxGbW8P4Rdgm4IVu/11rCIp62WobHRU44JxBHXxhPLn8yTAI25OagMO3f2LJihFlB4AQhU S+pHYdZVUVANAwYHQltxS2wHsiiwyY1x2jQ+GNvMa4+2hZujOzYWD69BDxyJgRF06MYhDgRoOlDR 6GRxnwbznwsWC5KGH104lZIYhhjv6aEz+LTSYeZZj0xLC0Rwez0kJAuT7eUNJp5IzerCxgVjrptF Zm2P1vJ7Uv1D/eVG25NJIfNsXZP2BUWk8f3PMoA/kdsdaG1dKUrWkQY9AQMI3EAe7SwYLejZzkTM qYXFqBuR5a232Czmz5uN2N3aWP7k6ljxxEPxjS/8a9x96/Vx0KEviT2fvS8EOQYkqfMYhHQDCzQU ZQp3jIzWxZq1bN6cSHljiVbzkwDntpMeiFIX+SEXeQtIGVJ3jv4alACU6YQtXIbV3s5HHo/nLdgy utcydlavglBmbK1YHf27C4pAvLPATIxoeJJ4nN7dfcWj8apvfTpes9fi+OyPHo+lpDPUTTu7aEPk P3jhe+Ok6a+OL77j2Dj+1IlY8rMPxb1Pzo7DRqdHN6o/a1dzfZGMI30okVe70Xnd7MiS2+LSf4M4 es3H4vSvvCRmbH19fP0zl8eSWQfHrqwpLQN/iG+dfXc07nlkvP3I+XHr+94YV778ZXHUcVvHrJ4H 47LVjfHMN50e797ltrjwrK/Elfc/iV2AFYzdzRCT50oxpDIG+lZF+/INIOFrYh1qQ4d/4MTY8Y7r 4rZdV2EDAKIdY5s9TRjMZHEcQsJkQzdEJOOgj3GxegOSEIztodmPYIUf8K2XNNZiRwCCY+XSFbFs bX9st35lrF+5mjk0L+eetkGGMYK6cjm3pDzyWKza69XxqolfYVz1pvjL+Iw4krYbwUjo+Dh9sP7J WLx2RSxcsS62G+6OVStYsLCzsu5JdMqRSBlB0mKrJ66L0594JObePxGHbj6KChD2AdYti5VXfzFO nn5afOuC82PikV/Gp1/2+VjSjSQEhKc3gmjU0VteBmColRTQCK3zVPFx51BKQzCPejHO6dxw3suw CS4INghC5LrDuBpzfPHbdcd33jAjYyiDYTr6+8k1SmaD5/+PuPeAs+yq7nR3Vd0Kt2J3V1XnbqVW tCKSyDCMechCNgpY8jhhGzM2Hh4GBsaDbZD9zMNgP3sYgRhskuQ8IGFEBhmbIRtJKAtJre5W6hwq 53TvfN86d1efLrVEGv/e7r51ztlnn53DWv+91tr2SYk2v2OiirRlkibJi7ss6sfJKIwzqQqUOI7D WBwjTBsLlVbE0gQJg3mB6KdNWlnczZ8gilIfLjv2LU+yEPzSDoAshPCCEhcCuowImHqYE9UwnAiJ U7H6Vk6YWd6ZpE6C4SB/1lGcdBBeMMO8cwlxcVP1xHlBhtWxJjHtAqEhTCLm6Ef0y0lwDn93zgkc KgKeJqI0yix9Y3piMhhV5x8n7iYkpNTNtf6C9ItG4lPmyjpjJwpArsJgKPGqThITNj2z7ncwrEpb uAiFI54oC3XVAoMberrMg83kWQkE1Rxk6Odok6UZrGUTXvsMJhsnfAhWCDSxE2Nt2JdC3A1QxSNG 6yxuLrIBGAhoUAWZaddOgoYblfKS0HOZE1sYhZCYpt37AAFaW6qAROSb/iOg1Un8BflAPPiZH/tV EEtMxEo46C9Q0cbcHXMa86lSDaZnO+jiqFPbkbAhXcL7AInIh3PlvGsl64L1HAynYf3OCuY2M6GG jbbznWsY8QgmCG6F3aLG2FEkt0iZcLYJdRrSHfSBVogb+55GWgWYHAOTtJOGKsfof1XqsQqz6ikj qvC0Ead1qOSMBGyUibDO8/xJ/RAMWov3ZCtBFMulaosSAHOAWOV51TKViX7FMx13MiA/kuNbWoFP i/oqwPvmoAkOHTzAujSE9MJQGmI92blrJ0eEbwzJplNOPjl97atfw46VGx4yEW4U0A7Ur/NKAUgw j/ByuR5Ni184k6NShGKKEOahuLNelljzr7/+/Wn+N1+TXvef/lO678GH08Pbt6eP33xzMfdQX0al pIJtq8pXhTHcSX4WMH75p6h7POuC89Irr7oybdy0Jb3pzW9OIxBxVcbHogAz7Zk7NtMHTkCNPPAQ Wcz55J15zqCEaeUy5D6lgc84WYk+tHHDxvTsZz8HGupQrN07dm7nxLHNae++Q+nuu+/GVteqdOGF F6Xzzz8/5lpT/lGdTHI2vmgH6OiFOWKOpIJSuuOt6fyet0VbxO5+ujFddVWR0pmtb0nP/nOYZtY5 mirqM+dBqaUHHnlveu1lb0rtt+5MV1y7LZ3y+XdyzPxZwBtnpUXG+fmnnZJ2PHRWuvzl70svbH0w vf2hq9PFb32Y92cEOGr6uY/aF2Lew8/82pdnZ/8iXYWUQ+trP5fuOq1I2XAads/u+WedmnY+eAr0 7ftJ44Fj0ohMP++MtI1T1e4k3hf9t4fSX166K13/J9Actz1EPpjS+D37dPL54Onppy99X3pJ7yPp 9+++Ol30jh1pVzo11jINZNJbCXlXuvai1el3zvmjdP/vHc2D61uoy8DsWR4NQWYpA/MpEFXUn084 whjutpseSX/1zYX0Bry+9DpomFe+HNDkPWnXW65Jz3n7dnzt6ymdzYkpv9V6ZkLUI12dvgDYty2l Sy9Pv5n+IglN3PGJ7elDXx1J4iW3vr7YqPM75+tipLgsNNaFeNH408iHJbNen86V22Y5zMrw0S7E wVVpxdyWEd533ISfHo3neKc/+Yg0Gvk52v5HVT6sY12u14ivET52kJkLGdBBU4S0RIQu/hRSQoAM rKMrQYkcLKuAaFxTMEEgYtGhz32ADwRsYe3rKpokjQtaMEe7WaOKi05QwjleeiY7w5RBCe1NCDII SpSBB8O7lpRdBiq0RaETdOhvBOiHMZWx7G+8a8MO1F7eP61T8qIMVhBQUEIVS48bdY1bLQ+Ik+le Bw9ygLK1woRnIGERHqbCeqXzNI5wgAf5NA5tSMjI5zD5fRGQv9DWZWe8xnlcR7w6mXuP1LTOAiTg Kg3Gblr4t21YW4ASGdwhfNkJOAhkxDe8EITwGyUrsiqIKi3+DBdOXfrs2MgWSBCkMC+x+hGun9+q hoHMbEtCUMIw2eX4BCVMV+kKJSicObQxISiR/QMoaQAC+ntceG7rABn4Zgx/nWogdNLUpyFt6jD8 rFv7IWBF+Df6pO97SFDVxSVosmdyaxp2ajx97ZmkJYyj4jF0FQiemDhY+JSecFCGgTcGONmksqgu KrrKWfWdVGobxCx0EYQ7erRjB9jB2BO7/HWYoNtv+1b6/C3/iIjlnenMM05Mz7v4QpgKOgiLpoDE +DgnKgyP8R32IUB6VrNjthZ1jWAe0JMNEADCQukJw1pgxaolpjYikrMGNQClBVoABGQKOqmYlsoM YERb2rJxHQQqTBXSETIyFQCGCtIPFClUNKxvbVxgHYX/bWmMUx0WOGWjeXEm7Rk5lIZRL6miNtLR 3peWJN4o/SyTU4g+UgUCE0pe1DgNYYEBpKiyO7Wt2ElogTLuAyns5BQPdbUFWWZozBlRJ+qlo2tN Wr+hP0RNxyn7oYNjITouABBHLkIY0q0pk+LmSoKo84skBI3dAVBgh3XHtotjAfvYJdu0eQPEBcZe EN1o5T19G0Z5PO3et4ew85wm0psG+trTedu2pvu/90j69MduSF/83C3pkldcma66+ufT6eeeB+NU MDEt7GpKmE0jBTOOcdBuJoB28uDuz6JMCnUYO60Qq1JL0fEhjBRdlnHUNUG8IsMDYNSJbRBEK2kf s8XHUX7Fm6HZggh2Z3CeOpRmr6CG0zX8T+m6N38vfWRpLO27+Nr0shczkS2BAgZRBjg2M5qmZJSf +Fy6FvWIz373sbTU/Yu0C9mhjxrMXW5dzo/3mXCrA4bM0Y8qSPo8+LXr03W//t50z8i6dOlril34 Zk5TmZw5I73qWaen3oXb0/XfuTUNzWxMp155RXrlC0fTLTf+a/raB34rdbz5A+nnX/fbqeWD702f ptgSwh57KiNhH2nFVkdtAamQK34/vbbv1vRH//1QeuU7N9CmllVVGZlsQDlWpFkAsRhW1Js6yi38 Nm7ahCV/dgXpExKoMv09jI0BDH520Caru/dzfCrMPYS0TFRR80QDA7LhogtSfcdH0oF7d0BuvCDa KSqGmJpakK4Y6E1reznNgGNA2xCzbamxg06DeMRo5UXPS0tffG+a5XSYh7/13bT6dy9O40v7kS5y D7UnrT11S9p+/SvTtZ84wJFFEL0UXGK4EEt3dxayil/s7Eho885dCJ2Et4SB4YM4YDCG4UXqSzsN rsMy+34bP8pleNvO8F4F4lR7clzppz6+YIinBQhgKAHgyTo6+0EwI4SToayyABm/DKu2AwQjwlYL ZSj6jAClTAzMvnlHSF3Gxl/UMeNbYKCdPFkiDSk2w0DGCRX4Nce4BQxj/OMbO/b2QXfjTdf8+zNP 3FDmowyF5dcmhMCFBiwl80JMnbCej276fqtBTtUTpJfHVWHTWKSEkoyq8ZJH4/JUjCbmzTYWKY/t 0kjlPO/ITIxZ48tuifpTcoEWKjoydzXiC4aHOAuDlTB0MDnjEMSLXN3N7ZEoIk8hLcE3UUcuUrQP aFssiM2oakQfAKxaggihkgrei3pGoR5goqgL81JjZ9ciqBqiCksTjD3GhFKFOd44F+cpK3lVlUMX qm3M+zR8ASYRZsb6ZbHTSCodriAOqTMli8D7YxfLeqQDRd49pcFxO6+B0oafDL9SMO6Sj4LyjyH+ PgWQXAX07SQtvobIgniAQVcNxX6tvQjXxknK4DGondQNyQYjL6DhuhWFM98UsgrYEvZDCOu85fa2 zKhil1RBnNIhGOYM61HN7Yxz+4TgjGLEMnsaau4G7LKcSkPMUsez1Jk2LeJo3HXrecWuMOVoo58u 0sZLHI9lnxS0UsJREMQZRqkc6wVh0BgX8wAS/pOIdtfEfqkhqz6IHds8xi99Xud9+Tk8+ZN13fPz D3K1aYx/CalCx6bHLnui0yPbt6cdj2wvaAD6jkZoBSfsj6tYpx3zqm94WsiuHY+GtfBZ8h7jjTgZ 4ZS5GEPaJ7Eqyy4z9BQ/3jU1F+PD72xX9wmqHd2ocjya/uzP/jy9893vTp/8zGdDFaMXG1btqDwa 1kZXtU0wxf5pW5uWxrQ72Dj41re+w2kGm5j7EeuFpqmiTmEeTT/mBQIXRwgTm8gRcRXvica4zF7k 3YwWLn8fZSWM67MAnAk7X9o2TzzxRNq27ZQAaYZQQVlk7FVpy1byNMpcv3PnI+k7SFX89hvelKP9 ka95bunC9pCnGoySvgyg+dA5p4eqCfRAhZPBsnO86HzvrxE8JCa+cVNKf03Btz32ofSKL5+SLtlK uYrg8f6Ot56TrkJi4ZYPvCHBfyMx8UIkGM6NEOowL4v7N74hgUYaRSzmz18MWsIc7dPR+gEc3vZf zkz/ofu30sfe+/pGGi9OdyyeZYvFmBV4OUeg5dW3pBvSryMRfG66efzm9Orqp3Oq6a7fuyhdtfgL 6VPk86ts3O76wCXpu4unQw/QbrOoYTzw9XTadasTpjjMBPMC11wx3GY1hhyhDGrOa9E7ijfSGWVX uZO8ofai+szvpovT1ZftTJ97+9+lpivvTj/7LIGJwiE4EmugUhqttSvTZV/4NWxonJ0++YXfTB/i ONH6nb+fXjj4jnTWH34n/Y6G7HIjMbdYU9Z10XZH54Tc9rn9c1rlqzOJIIOuLC7vc25n7y2/bYml /ghvnKa37Lw3Hn8N/9yfDJPrKodXqiunGxIHvCjXaXzbCOy3o+xU61xfcrq5XNLpJBrvM7jhg7RM 2eXwszMw4+RR2ydZ+iHnIYf325PPPTet5rQJXQvruq4Xet+jQz0Ja9nBjCp9JZPax1qVnQzsvn37 4rGbjVzfCQ4wAaVx1uRe6EolEvQTOBBA2NR43uyGAM5jQn2nG0dao5/8dKB2WSkDEGyYxM46Yer9 q1ElbkqjbtCwVmbGWEZdGw7mcQL/prHhODbTvmv8hxhLGqzsJl4Be41dakQ835u+diZ0buwtYp9K WxLdMs64eWidbFfCcG3Eo58nddSRlli1dUuEM96wm8VTWwDHvCMTA/RfT77Yx4apLoxMN4CIjdDd 2lsYWudGM/M2deRpHC3kexpQRaehyOwM67tso6Gf8q7BeOYkAIlSF/bzOGkNXrjCgQ+qbWj88kTC WDfdzOGeyqHrX78urtqY8LvVhMnfr0ZCSpfzoZqF9/3Q90MA4qbfBD8rXdQPIGQefXeIAxs2rl0P L9AX4fTT5poqbvXBQdoITQNpPJx++X4v3w0ALJywZUtaS3zKRxQwE8YwCXfGqYCs9M3NnswIvanK rRvyul741R6kAzugS6YI6zvDPJOrzDMIFiRauPpzoVONwZUwL9zFIGMKotJkwPSXyZSx8erunnFM QyCNsrPhOa/6qS/uQDZOCSMX4SCQIChMQ2LLd8bpzwW1+JXvi8nWpcydmxyuCarBfLiuBTHDtzLS fBlEVy40OeTW0yx0NDgEaQsDpw0Cr1XmGSDAhbpdRocBYrmJOOI2bzlPJpTvLdOiEzThTb/IhZ8S 3m+NG+LP3dkFGE3BC5lXd9gqGM8MMIP0vCrtkcuR6zfE1XlnOk5i2tHwnXr17mjGlXtBDMQeIs06 ZbkJzeUAACAASURBVDJsEaclYScMSQgZqiod1l3hGQi7I4cPpcOHDqbN7AZWIKxMS+dYsOhUMX5E i59ttAhxqu63uspOvF49fSC3ZXzMH3c8FzvOSlf+53ek6197cTryrQ+lLzq+aBOrvRDfp/1llmBu iV16O+oaqxppZD/HfypB8ROKmlNvMCm+18q5Ne3pAOg2pH1PPJaOAGh1VRmYxK26SWqGIbN/ES47 28L+bH8rnEwXO5Jj+9PjSFh4mI4Miv1K13z6trTlpdekX3/ulelE5Luufd8/pG9e8KL0c5edndbX P57mJobTP7/ntan+lo+mX3zNVBq71Z1+v7cHWGdUGpNyx+pXprf/bE/6zC9/KN31wPnpmsqWCBH5 ILFigULKBumeYOzpR7XKQDrnmv8n/c93XZKqQ3ek95hlrMNvff7r0jtv+K/puT2gkksXpMHT35/e AXHQWYUBzhknaG2pJW3ZPJwe/cyh9L1dviAvukaY2uafSb/3njenn3v+1nT7I9exG1y8sN/aPBc+ p5I+/laYnDHq/ZGvpDsGfzX93PC/pD6imQWM7O5kIX3o8bTrSRBb1EM0BivTopSBYtPRcUyPyGI8 0M81ElkQ3TZxwQD5bJ+WqYtptdGPggHnPr4nrHVl3/M7x5HX3I6FlBB5oN7c1dXfsRXJ0wYygzld a8EwznHzjMWct9ilND3GVHxPPxCkEDBThNi+owux37ijfxN+TsaQcgsIOPw9StL7wjaMdQkgwxzY CjpeZSGpQ1C4GI0xqQuwmr6SJNaXxEidU3W0dWE7aKRz1p12xoKLukx5syclmC8m9kVA2ylADCom /N0911ZDG+PDXW0lT8JWgW1DGSosEs4H2k2YOjKEHQTCMWfQAJF+zkejeAVKznwig+RRoaHuYV75 JsJSN7bZKItKE8h9Bck3/bU3QQPFjn0TZXQ8zEOALLIOLMJECpQInDQTXmmKJXVVyW84vmuhjNpK CNsdzCHWzSII8qIilTDdHiVn/P4MM82VmYgTRACtSW0RyZA4rlkmHMCmZ6A/6lkL5oo/TtH+tqYG LHUyA56SREkBopjH2yGUyJ9tXWf+cSKcI5+jpO38rWQFKUecM+TV2VJpJRou+jEdCOO+nN7BLmY3 oKyqGfPU9yTE4jhSZgI7tq8qJe50at8j7E8QbzPEijsr6rOO1glPG7puOid3QyCMmzaqOBIZYxAw qvP1QZyO0g/aAPpt33nib2MykIFtgiBTCqMGSDF05AjzLMALkoNt7PyrlhTSHzX6FPc92OJYA3FW YQxIXk1Tz63Op9RvjFf8BGQYrdzR7sQVjnD2g2IeK7zKf5/CDJZfPt19MdwAGxkDtNs3v/6l9L0H vhfSMCbvXOP4Ue9ayb0RbFJp4+lcwPUTTtiavva1WhoaOcL4BayizsLAo/MCdeJYjugbaeQsWMZj nM/UJR2tCM9d9CvaWobfTYDt2x8JY4HdqK0p8aChamPJMbnmBsBAmvZjgdQpAC5tZHVR1/v3AfYC bLV1FO/NQ+TD8Mwdnh5GASLGHGf0fXyMLyeU827ZLGOOp5n1XgD38OHh9Cu/8otp/cYN6Z577kkH kTjxyHM3h1pbJ2HGXfcL+kI1j/8Tznp3btd5qkFmzPTLDJu0omC7fJXv7UOOp+b2VakfI6DSBrOz zBXUd9hf+fab0pmt/yVt3rw5pas/EnFXAkzlG/omC1H4gUikF5+jWgUO+w26eG+d4UxnpbSP/gFK cDXv9LIIZ36r2A7TxaZHo5807Xp/evHZv5Pu5v0iEhs61wrDhwHOyz8DQGEO7khXvu5n0v1/egYS Ew8uxxmbE8Tx0ouuTbdHfk6OONLiHen3zu9Jv/qJifSxem+68qPktZHvIkBBO+X7leUoB13AiK/O fGVn2WN9rJ2VTtv5qfRW6uzih+vpp88qwka4G69KrR8u2qPjtVfSn5TQMI6ifgUbQz2nqM5i7fZD AeaGMx0ZmZDuw6+QSCkkEnK/yGG9Gt6fbhkg4jkDBvGi9Ef/HD7is4z6lcLEPX6+L9qleFtOqxQ8 wI4yIGG48re5rnM/yd/qb9gO1UGCQSznglAr8pW/izwBbqzMT6g9Mh71z+4+jI6e8qxnxWNZagJ7 90/xU0qim3V296OPxzsBjGxrwnUEPQIkix6Od9uQkOplAI4fPBTP9YPQDcx7y8eFsxiE/QnfQpPE 4kB5s5uVI20w5IIUqiDo4oQOGO0p1qqyzQlpsKVdT6R7Dx0I8OOk5z87QIlR5kIlK+1Sdda2aSTx ZwAc4gQN1hpt9ZUdxyKUH8OWRLY5IUih81npihnsS2TDl83EOX74YGrhGGndRsrvXD6Efat8GsZh yjdEXnzuZJ0+DEDhmqz0wV5oAQEVAYlsq2EfZSm78ikcIdFAHRo27DxAH93LAQXsescnuU1N3zS0 K7HIuvZEA6wBtwx/bUPorzPMSjdHmfNRp+bTtMYPsrYTp9oHOa+rAMfN36NIyenOPOOsADB2Uye6 idmiH3Q2QK051tfsBDt0SgzFlT/T0DeH4SF189BjoVrD/SHyOrVnIqTE8nGig4JR0I/DrD+PN9J7 ydnnBShxAPrkmdxTjgt1oZMBd+GS2JEgl7gKwgdyroKVcom6CuhsG4Q0S2E6sn9f+tQ/fiLde/ed 6cH77oKYqaXnXHh+OvXkzexKeVIFEgRIDkxB2E2x4ztL5927Z3/avXdv6ge98WjPRcIsVmGAIU60 JK/hx1YGvqDBVMsk/hxzCWLTjcSAYtVVmKUquvoCFL0ef0m4Vow/dmHDwKM2XcSzhEF9FuKUETID MTk2tDetQll7DWog8xDLhl+HEcn1a2H4H8OiLbYmtOzuYq/YlJOJ0hcMHyzps5/EOOziW48cJcch QSJAkK3fS7R2QwxqMG01kgPucE0CCIxB6I7S6ENHOEqSOFdzcsjIMAQkFm+tDxmkHo5DXSMaSP5a qF8tAa+C+RgEtetGGkPUsxOEsoZUiIzbNAToAuowYXOAxVzx8w3UZz8iQBPYNRgHMdMw1RmnbEVa Yz0DbjLteOCe9K5770kXP/9F6bffcm3advI60qZ0UA3a6Ni0lfSZy/aOQPAgjWHZ3T2O3WXqRLsQ mfErdywX917sNgzWvpe+/LHb0zintnDQB6MM4r6tkzwp6bKUBtZuZPcI4GRhEOmVajrMQsneNO0F MdLWnfo4IrYP9HT9pmpag7pOM4S6k5cW6duQOtl0wslp0xyIKyhsH3VsvRVnRUNEO7nz/FRQwpzK WDZh3XcwbUF3q5Y2oP/bw44qzA1v+05cnRbu/5/pXV9foJ9tSy875bPpxjvuSw++/Py00d1cpEHq HFn7xT99DYaw/iK96pc2pxeu+3L6W+ooDNBBYjXRB5/9ml9N+/7msvQxpFRGm5+DpI87RTCxLpZM MHPTMJ9LiH5RtgCskLxpX9efNp9ST3d++A/S8LlXUL9kqO2EdNppg2lq+5fTf9uV0jl3fyz9fdPV 6X1fe1PaMM9Rp1+6PYg6S9bEBFB95N707YcfSoFL6Bdj2B1XJuMXnJ1q/3pD+vTiJehms6tLW0kY KmlBplP7gcfTdhQf5yCMl2bvTbd+64l09alI4iAZZbvXW0Dj15+QTj5hFCNLnWnThgF2zoUA6TeN uNQvZ9LAB2cB7FQNZzcQfFA81/A655gIj79zjARNADWEsS+Zb21FxDzEs1d/HUzAglyOTeMwNr/T BoF9ISR7/Jb6NnxISjix0s/0wzN2mkPKhXlNMEH2SwNLEnQr+7b5jt1IvmtRfYCxbo9cYFxrY6VO v9QgYStEGnZ2AReQGgomlfmFMSpgF2LlxBPqIORVkFHmQOkZyxCMAoyitaekFVBzlKcGwSHzWSVO 86CLNPFT3aAKg6TtAutUUNazxZtama9lbI0PZl2DiXMyu7y37Nw4lRU8DostmYq6rwkWEGYK9R93 7V1Q3BnpgakSi5kkHY2CjsDkNgMGxO6L9Wm9wdBrhHNpgF0O4oi2IEwT+abSUxNMUYtMPmkLZNRc aMmzhH+0O7nxG9k8NveR5KAvmN9GXJY71ClIm4ZHCqBQd2kmT4SCQCRPjL1Z4q2uX0u89DUBD94p 2m5cll8gUlCtlbJ10Aa+pzFSFbH2ZuZJd5WtS6VsVjHXCmh5hFGo0NDGdYCEEKOFKRZUpyNG+VyI u/r7U5U6l9CdxwCjuwLu6BfABtVEmkr4KW3jsZxKInRju8ZxoyTGBASeIo6KY7YC3rRi3NY2nyEP Pcz5q8msR7D2QHSoXriIAdAWyqxKX5WytNIfPFIxQD7yoBqQR3h3KNFD31MNR4CCBRjlOdZv/FWF iRXc9d3aJy+OEQ3VWl+L9N8+0jRcIR1IXDryZDif8s5o+P+ofyibY0K10k9+4qb06K5H43Qbx6Jj REnLKfLt6TUyBROCUZRNqcrRscc5eeJkpDAPpf37D6FCpKHuApBwPvhhXDEzUQ/0AZ3zkmpbrp3P e97z0imnnBwnFezcuTPyJa0iaNIYTXbpGFvFTTGWZbKvufrq9JKXvITushS7njd94uZoW+cnpbjs 9/ZFpR9dp7LLc2VxzZELYBT5M5z3GZiY184Sbak0peomxj0wsBaJj52AEwfD7oV9UDDZdvO7/xMu 1jb7Az+lJdz5k8lSvSPc869LO771xrQNsvVD75WmK46AzmnX5kZp+2I3OtTsKIPOPNreBzAe2gpd psrCArSc+XauND2HqE4gQvUOv7cvxz3vVzKVccIE/oXqyQXpj+74emFfIf1Uqr/h1vQ6jHTeSFo6 JQEYMYRl86CRJ8slOFK0mEOBsK++PF166aX0x8v5/qp0443vSl+45QbMexbABPv8lIONFmjDdo7j Ze86LR62rXEMIuP46JWAip+aSbfUqukV90VviLwL9LlWu1tvXVjm+Iyr34FFkU/pYsGXot6UiKKD RbgswVS/4oqUbrkMencg7fjCl9Op//mKtKN+y3JcRV1SFrJlH5IOtp6tv6ymc3Kj3+U8uGaW+1AG JZbjInbzGHUUKSVUjTcH+OBpIDkeAhxTNsObrlfLnMP67PxWhT63FhatC/x0OU3DG85nf1ntJZ8+ sn79+gBZtJejy2nZh11r/V6Xv/Xe+ve9cekyUKO9Ht2yMcx4Ovon1BsZb6p6TDTGwglnnRUBxujT Ou1LqL6x5JUyZ7UN3/ncopi39/G3+POUMMzRunxsaJ24VGsN50aAEpa4rLoRD/xR3VW3DErol+cf eBIYJk7P6nMgijQVV8IIPHg8qOodGsUsHxvqO+mQMTrmxKHDRr/sVrFGuusv816GGdYxnal2YehQ 6+Be45U6gQr98okaqlu0Mh9nl8GINtbwDEaoeuoI8ujRDFo4Y6rWISihE4TITsY/n8oxCT2EcakA A0KSkbV2nI12mX+dhjHLBjAFAAKM4N0yGBEhi2fDr3SxMYFnBhy8rvK5lKf8rASFwIibLKp05G8y 8GC+lIgQfIiTQqAP8ikgpis90UN9H+bnvVIV2anmodN/pfOd0ogCFhmgCMOXlHcaGi47DWPqWuBj 9C8bx5SekV7TaWdC2xJKToSqc/g+/Z+KA1PnQNS5mLuwxzPEic5J2EVUIm8eewPdMlU8N4Huq9rx 5KM70u3fug392kkMK2FT4rRTOVITdQgyNYPOvFY5R0DTVIXQLkQ3QEKroAYTnzs6XRBoGot0B7pV IgqiQ5sWNFVB3LPgyuB7/KcMXQei6IPYg2jDEN/0NGfcNsHcwdSugallWy61TsGUwEy6u9o/uJFd NwiVCVDC+f3sShEXE4WG4lrTk6gcULrZEc4S7k7rIDCbias7rsVurcxFMAVMyq2cUT8DsKLeuceJ tsJwK6Zi3tyxnEfsuA21CI/n2/HII+nc887mODCOPe3pTwNNg9StkgZ1iKjR9Niju+EJYDoQBRvB Aqtz/uAgxzayy9ELgdsJU9DJDly7jIMLGQvNIqKuLhjBVCIhocFPd4k0OjqLSsrY8DjtBMAAQ9nL kZK9TKSKOA0PA+xUITJpk02bNiAmO50e+x7Hlv3p/5cu++nL0rOfe1Fat4lBzKklCF9D5IOGITpR 7WUXg8lrkv7gDm9m2iT0gzRqLFQSR3XKP3lgOM2fdFl62ctm05ff/+5022HqFmKi96JfSm/89avT ZWdRkpddlX4DEMrz4quV+9L7/w5GiH5QgwCsISHw/v/7p9L5xPHff5L6nvyn9HVUHtTZbWmm43e9 JP3B37wsvc2dKjJZe/LvYAIUb4YAoT2tRJlW+/RyH6YXeeLJUm0+DY9zxCZHk378269hGCPV0n4k ffsvvxjpj9/1SDr8sl9M1/7KxnTnje9I797JWFj7GO24Kh2EESnGAIzo0mT6ynWvSy1v/Yf0wi2b YdIm8FM9g3aYHk07Pv0H6Y8/eE/ajdnlKsYyx0cR8ya/ghDBeNuaLPxzHIuoHYl5+sQs4NTe2onp Ja9+btr11Y+kDz7GtFp7PN1z3+3pkv/4qvT6DXemf/inu9O/fPGb6Zo9r0p/9LZfSSfTB+epNydg Rma685v/nO4DDLFdmujD2hhYBM33/f4nhtLm33hLeu7mu9Of/NkjaTf0YgvSI6AOaWl6JD3wT7em ewHP5mxXTqu5+wu3prt/EcwWkeolnueWKun5b/58+vLrBaX4trKQDn7zf6QP8mB6NdrH+SL6hM/8 8nRsmWXIFTuX0VSiQaJSxicIbN7rL/NExnlTvLNNnR/yfGTY6H+0rUYJbessApnHaCZIGiRfzB2K IDpetH8xT5w1jFFKvKo+5RxE4pFOodZhXymkgSIj/DFNx62qI23UuU5GyZ3JABost5WCM51BRN3W Q3x5bKhHjQqUCVQ4jhWLkwFzYxQuNaxdy/R2MQcKJJlvbTIMEaenjHSvQeUMQNLxtghzb/t0Mjcw GSBjDiFLGWqqilEX6hAqOeEJGdZjhUV4bAwbCcwR6wAqW/muIBzpM8wPZKzYEcS/i7RUJVmCmTbP MaZI2/lTndlpylpBTaxTxpq4a85ZlKONBbGN+JXKsA06Fa/n6q63eVbkNICdTsY4upQdMM7WRQBI hAkbJc0bQ/TSPM/aVoDFVfLbTp3MArxqkFSmXkDG3tZLvgfI7wAgyRjtEeo51NESjL19RDFDBnsa pQ57yZvHqPaTrpJxs8zLQWwzZ5ueAIb5U+pKMU8aslCBQPR1yjplrm4lbiUDpyEMWrU5wb92CL8e wggyKDUyC/DTA2iuGtu8gAx+Xf0DRZsSd4/9hy6i/ZEFmOtmxksrYIOLtcd2KnZaR6pG0dXYXWf9 6VadgTqqQMhJOKry00cduHOprRA6McSaaoyomQgwmlfSUg9VGxNb6INrqAuJK+vFkz0miF9JJu0y rYGYXYPYpZsOnrgkYNMFkakurECPwJ2gl2CG/VKpu7wj6qgpqIZiZ5THZedxhT+ss74OwTj/3V// dXryySfIXxXwgXmTNcWxOkk/8N512KtjVjsJawC7n/3si9Nzn/scGPGH0oPsCg4iBeh4Nc6gWagn XV67vPdd2VHUcAXIwHv6mW3kXNVJnVxzzdWAC1cGAH7WeRemc845J1133XWMdz/MvyLeGNvkzzgc EwPk8VW//MvQAuel7Y/sSJdjYGEOVaGPfOSjcdqZfcv8FGBIcW9mYm4sXXmjdzjf+XOM6SybRZqZ QZ2HPvaHf3gtcfele9mA+MY3voGEJCQ/660nmnlMpHWamVzr6Md15V3nfYBLukxXev+i/3B6+gJG GB98+0PpfGb/BYwOHuMkOHDlb/J715VMm+rX2gHd6QoiPUpfY6WPoEoBlb8XZJap16/sn+MNv4uh SXa+LlXfc3l64Mw/SRe87ex0E2PuA1/6EudYPBJAerGDX3QQgXV7E9Ee4y4+I2HUs5reevYtycM0 brzxjvSWT+1Mb7ii0bFKobVG7zohrbvS/dXVPWnp5pn02TPeR3syf5p/AzXKEHXhY+PDol62pdf/ C/YfQmrkE7y5NF0PsH09xiurHE2Sy/7ylyfsdVB/66mX730ufXHb59Prd9yy/L4RZUMIIucN0Dzn IQeI68VxMkmc4sFz/dX/NU5BiWpp1Hk5eAYZ9FugXFnNczlMo0JzXsvtHWVuvDe8c5zrftRhtP9R 3iWDCobzO9Mt6jrXmG+Oupxe9lmZL7/NcRqXToBCJ+jgoHs6UMIwHid6zOhize+lr49LjzI3ZHsU cTyoH5ScoIRO+lsnGKEkhK6X9UD/MnDBZMMR4cTJO9e/OEKUtVum2ZlDUEIbE7H7z/yfDh4dgxEG vwAlBCN0DQa2l/VGN+6a4498CUrohtlArSA9YY1ksMKrQEW53KtY85t7CsbetMrHbkZEpT8ZgNBL oMH0BB0EIMIGBM+qa8jXZNsThs3vIT74BtqoBEr4zk2FtQC/WZ0i4m9IAggIqD4hCKBqhcCDgIL5 1OClLssRrAQG4uXT/FHyFWpy+W0ALNAyAhOjxK1b1ZD2yIHy0aHmyfzoos4AJVa6DKYIShgmJDQI 5LPOttYpfVGhPjK4ovrGUvtcOkBdeUqHIESj1eM+PuJPBjKyWor+GZQQgFAtw02Zw/S9Qep3PbzY Es/ZZZsVnqy5hnEbErvGAV3x/VyMsljyINDUQZVojIWSQZUXRxdPl2uJl5kpKgCFzQ4QrSXkmZdm WIDbFtOmgdXpzBc8hx34k10pEWUdT8MslAcOHUGKBbFcKmA19iG2nnAir7G0zAI2CjGmJICnaky0 wTy3SfAfFcE0XLXqSR0av8OoJSdxtFeVlmhmFwkCERH2JQwNVqH62hkkrO6BSnsyh2KNAgZt7DzV kCro6INw46jFpjnEnztXpWn07pvY4lysjaXde3an1YNn0XBrAS5Y3K1ESmz5neAUr6VIjP05dvzZ QVyoYtiE5mcCEAEqTqtwt1JgxFMmhgEQOAoVIGAOon6JfO15ci87wK0c4bg1bWDH/kT0YiUsDqJW 8dijj0EwwEDgr96q9e+EOA3BOgyhKyFjPnp6MKJCR1bkXKkKJSoq7JqRBNIREJfYLhhDh2xycoad ZRBgFnFPQ1izoTsNwIROT8ygbjOb+mE41q/uSnv2Y9TofXemr3wJw0xXXp3OvPDZ6IchjsyOwNi0 zD/AEO3hBK2TiAkxeO7NY+xUU0cSYE3UWceRu9OX3/Xz6bvvraQJRHcmOyGwIdBm7/tU+sNrPp/+ B8T8KiZXDUZOQeSrPz5LfjS20kod1+/92/Q719wccTux1RY9/YVJDiI+Ld2afv+nv57+AAmZBjnG JIMkCoYjFamXsHNhyf1HFYBQp5Fg4fSTttax9PA3/jT93HOuA+iQ8GSATHH2OkT5POm3T92bPvnu V6WvvA9DcROjHCmILZUjX0p//I5b6QigpIo28k0rolHN9fn0tff9RnrRdTNsbo8BdMEckP4jf/Xb 6ZcRMB+bpL5IY2H2M+l3f+0z7N7MpW6YhBbqSXFdTNOlRx/8aHrzr9HOBK0v7U0PvOfn00Ufod8i lTGKhEIHffrQff+crn3Fc9OfNINSsghX0B177F9uSG+6+5OpdYHjbukHLhsTX3t/+uOvs4gydymK 3db+QPqbd+0CRBuLCafnnr/FKvdXGCtH0qEDh9M8+SXVKM9DH35t+iVOopkGNBRu0j7JyG3XpV+9 p85uJMgzp+t89Y+vSM+5jr5GpRWGIrH4j+jZSKMfaE9B/Xb7iSpdOvtHdvq5+ywBbZ/PIIBgRSbd ZPBk4oOhpa9bn/5sTwmI/K3LrP6qYrmj666mDIvh7J+OE8MrpaBfW9Q5cRG/YR3DrEE0j8xXseOx nFfem04xrefcRzXxQHsSZ1YVMd/a4LAsMsyFjjhr986d7PgDODJBa0vDfIQtANK3Rpxb4qhSnluY +zp4fxgDv+ZB/UdBAHe84shSxvKh7dtBrVelzcyrzZRrGqJTUGHB3X3qQNs7VEiAwp5Q4alBgh71 EeqMhSPGEQvhHICMBW+D8WyhXqzDGYgrbUm4g6rEhKpmgiwSW3WYmcdQxbBNNwGw9gkEMGcLmPCW ebQAMOYBUOvM71R2HBEqg1wwSqwXnDhj3vxp6FLd3nkMUkp0K+EgEyeY7Qk1uhrgizYY5gEzl3bt gigYTYPbTkEnch39bTTmombm3Mm5Mc6OB7CFUfdEiokhACAWV3dqhklf6Q1PRCGxYLC1HUSisS4J 5kzPUCs+Ww8AF3WYYI33trM7MEmdDO19MtWwA7Rq7dq0AbB4SlUcxDsDWGT+GWMHxVNEZOA9KcOd M4300huoewA12j3AKtOYZLwzB2t8chFCoAuiwAV/mrHpCSGC8kqOaNtJcf9p6movkk/txH/SyacE 2DRC+tbp1AIqI5RbENa+vTBCvRHePthKXpbYBYz+jZ/2fxYgshb59VDmJeqmJhBpfR05kvZTPwLf Eto9zAfRL2mfh3bvpjzz6VmnnJoGYG61tm2/t3+GyDt5LVaDBoPEc9llQr7s9/3uBbL+GlDiwQce YJ7GiLOgquOGctj/lIxQInGOeVRQUHpNWmQt7bNnz+50xllnoC6FfSrKmvueV9eDkBRqZGB5nD9N hnyf5yNHqzvCxqkK6SD6t8O0QwfSnVsAHz1CfT+GJJUotJmzy/d+r7qH68O/fgf1O+gEwZYbb7gB w+D/i80H2p2PnHH9G7MMa0YAlzFB6XM0Ysdr8YzfUe9I1nd6KlGytMhh6NAdgju9AIXudh1kzpeA rAGg28+j71C/5r2QBo1ofuQ/y5IRxJB39o3Mudjfg7ua0xvCCMR700u/wVHv9FedR1J+Pbhb9ME/ EF7FH5jsd5E/XcTxa/+YRq6/hKefSjNv4LLr+vRO5i17ntILzdvewAaGLxqO7/+8wdg556xkQA0V 6wT2Id7DqDXtne97J/X3wXRV9aPpQvL1zW3b0/9L/4n0rXDS+ObCsWm8i/fm4Q6MTN7wzRmMeMfr hQAAIABJREFUTH4JiYkiD5UHHkk7rywkkMhA4bntjemzu99Y3PvXcjaezKNj58OvYD7/7EL6QP11 kW/9c/7NS9kVz550ck76xNW3pKsvLuJ88TmfSFff//vp1RgavZHvYz3DnsgDvDaNhcrt6ZYv7Eqv P5UxzPuV8ZpGVpkRmMnvI57Lb6G+tqUvAd5c/x9/Lr3trl9JN930atEYP/LTZed3/pQ0GGMeMa0p jJWvDLf8QemmXGbjyM8Gcc0qAKOiHcvAh+99zkBCuW/6ruxyvMad49dPl+cx41kGIwjnhkmotbBO uE5mMGOlQUzjcH3QeWqHa7LPghLadojjRelWXcxtFUBt5xl/YZQ4vir+CEgcz7+nYRjxkJIRMuM4 u16ocDSe9VeVw6NENYQ5AXuiPYre2QL0yGoYLELxfRdSPVMNQAIoIfxURxQcOJ5bAzA7z1wz21Dt EJQoOwEJjw31qOJx7F14ysXI/v2xiRKSEQTOYIPfBRBRjoD7LDmh5MN8B0AFLuxMQDP4bRmAWBA+ KIESAhI5znUhjRafL//JAERWmRinnNlPlQidGz6CEdk/gwG+k74KCQquugwMZGmGCZj1DMLk8gpK HCHuOiCxJ3PoclqCFQIFphdHhjbeaRjTsBkU8Ztj0mqkr384nmNDgn4mjW5+NJApDy7IMNQI5sXj QlX3WOmkUVw7tKORJSagOFHkLlxW1/BpPd37ALTW+sa7fFFCQjXkLWwyPYmU+xDqQ2Pc/yAOwQcR 6IZjoCkJIUHtgiVBopPolslXt7IJWVulHrTJMDunuGwLxNv6dPGznoUaAoZCIHimVdmAoTxyeCQd 2H+Yxbwb8f0NaXBgIOxOKI69ehVxwcTLiEQeWJSLBfroxcmxg8Zd5FSNNhlxKqsLJrUdk7ZVQIV2 TpGYwpBSbw+iLgx+jb10AFh0d24AjSyOtgwDeyz0rewOeXyaui0D3bBgSBR0MbibUckYZUe5d5By da7h+B52lyDYrBN3uSWAXMgldCrkt7+vP4iSkZFJdE53gt5q9wGwgF3kOkYilZg44aQT06Ejh4Jg XIN48/DQYcRM0SliIK8hTeObh8mUoNiwcX36yZe+iDrGiBo7gHt270OyRMYBMgTkrgqx2o5kiGoz nTR0BxIq1lc8Q6BKyKkT2Nm9ijx4bCrMDYvxDBZxZ+gsi9RPXy/EJ4DOurVMQEyuFCZEvDm5FfUS jOdM7Esf/dD16Xk/eXm66Kd+ObX0tCHFBWJPk4SFc+IJEXPqJBN3tqHtGWcc8z6IuvnpdPixh9NB ABh3LBT/Na/UIidXcBIE9eBEnxlJJWO6GHCK7C9IXM2OYT8CBoQ6z04iv0MCivqdos5nGdg6CT1P k2mpwohQJo1bKg5uvpxSgxGm/wqkCORIwI+N7CcPFN+0Gk5Da63onDQBNsyOHUq7kWIw7+6oNy+B CmIgVYK+ow2pFdKx7VYjklalcg4PkSbjQXFqdfIXx46khWD6IUgsNwz/HACPZZbAVk9aJlCpFgGA aQ+zJq0qY4nRlI4cQiddKSQmw1bqUEBqevhgmqaeFAM21+0YaGvGf6ZWEHe2pSomc/QVtslJV8aa yYe8aR/EcVybHU+PPjzMOELkn51jddXte7YNRhFAbwGdqKcMOjXXEJ8cLyQFqK00OXyIX1Fh6wYG Yyd1EkOp7jS7jFv/WXojMwaW2d1NQatxmAbrzTpQksD2jD5I3mXaJQbMj2H9GVY/d+x1fq9Tlcnx oBG8ADX4xnAdjAvzn+cr/TyiNAh2y+kzP/uoDAUDs2ByqVH16sNwa6RQ/DFu56KYA8mP6iCDGH5a BXA4DrM+z/hSXFL9fHes25kv7BsSKc4bAoaCNc5tlpObiFjDfEoJWA/2U6UBTEd7EfZzVTDqgKiK JSvVUBc0Y15zF1Qn02P9KJ3lHN3BuI+5hPmNpYfBSr4XmJOdv5grI10+st+AzdmUnEBTEDEzgG0L 9FmnXeCyUG2YpR+Po+7lzr2JmZanX/Suxn4zYUfJS625AAb7KZc7QqMQWjXLwf8m+rXhwjCm4qQU 26M/3RlqAbGXWfdUC+1wtABmC3jXWSuokEiviW+alewgPtXTBIRN37abE8wgLecUPgwwUEOm0wAF 6s7TmfkRjjE2zWLb6VGY5A9WNVXZLQ6dc8LYV5uUUIi8AAiwg+F9E2V2zpjSdgnzj7YiBLKUqFBV x/qLMUKcnoQUx4ZKeNK/qviZ53bSV31QwnmKHQ5tfdgGEqGqwKk+4RGRswJ8EKGCnB45KxjhPODY WCL/c6qh9LAu2+68i3nHeS/SgUg3T/z0j3pi/GuXwyNuK8yJrdRRO+/m+HaBMi8yR/EE8EQy1NUc +dE2hUCps4h2SvLxs6p39VF3ErSOlxi3pBV9mbDHc4438/Kjui/C5HznttuoP9Z68wdB5UCy/4Wk BHOmY9tya6NhEeBkGhT2wYceRDJkE8eY702XXPLSdMbpp6dP3vJFaAuMkzHHxTi2bq23Z8gcr3GO EsJxrwqjXo5JwZ0Pf/jDafvD96fnvOAF6fHdB9JNN38cBpyNB4Abow8Xnze+jxWojmQpmyKo7b2H kxBuvukmVCy2pu/efVfMR0H30DeKWd3Ui3yqWuY4jedG1F4EVsOZP24EMFQviDkOnwXWhMvYFl+P KtPevdhrws6J62NXJ5JH9J2ODvoM6/A89oU0eKxKh3VaSKAUUf+of91Vz4yiceT+YJ/wfu6Gn01N 7yskaWRWstN4ZdMbCwbAcP6O6/7qZ1P1I0/dvS7C35iuqN4YdI0AuDvqrj06mcun65d+6/u/eHkT Z08cdYb/1htPJV9FOYq4/j5d0/P3kT/XEiVEynEvoqZyKh8cU4bb3pLOfEURBy/I34fSZU0f4jh3 jKOThqoFxh1lWJHPG6+qAikULuffOo548LaWsiTDjZ/ZmWY4dvUNgBwveOM3Utp+Q/qWII0SE4Tz e/vozs/flL7td6Rlut+++fNpJyd/mH6Oa/GXUDH6y0sJhVqKGAxxlJ3xXIr6R2vrDanyG59NM1jy /G0CeExr2ZlmzrfxZ4kawzhLlFs5AwDH1F05svioiG853kb75vpYGccP0v62oyBa5JP7nKflNEjX eHJcZkMVN53zeWyCUU7XwPDjPoMW4dH4o3S269/sxEIA2DUMAsbxo7z3yNBg+gJ4nQ1JkAxCZHUN n62/tfBPGr6cJqwuG8Bcy71+AhLxDWHD5gQ0jn6CEnFCR3zFH9QvpKZU49DfEznyzrq2JhJ0um6y X2WCwik1ERQYcSclCAQgqJusxmHdZSmKLDlxBCl3nbFAcvPZaKhlrNq6We9l506/G9eLABzag8hA ggEyKOF9HBdq+jgBB52ghC4DEDEv4pfVN4xL8GItDLZOiRPVqXU9rJXmaRFVEZlwAQgBAsuZT7lQ ykB7Ddn1Ec7vw25Yww6F76JuuBa5yaGZxomv1pCIaAKI0AlKtDRosDLQIPigG4e/O1rzRV66kPJv lld1c4E2EyQJyRfXyZLLp3dkyYj8Sn+lIsYoYx91zfEJcfRnnTlIiY1sX8LjQJnYwnipp4Jk2xLG o4SEqh3+rK/D+A3Sr3UHoPO8L7Yk6WJKn+LWYK5Ap8bEMGl5dKjOTZ1QE4qn4/+puDOhc6GUfHYB dLFzwZLJ0MUz4TQg109DdcHRuhPgVdBCZv/O+++PXQ2JRndPa+jzd3CE5sYNJ4TdgCq7/d19GPQC vZ9hYFeIux0mTgZOAMAj6xYhbGsw5Orst7Gj6RJcgdnqaPcYt8L4o7vg7TCJq/pkyjs5sq8dWwF9 HJW5BBqI6OtSN3FASNF4jrNWCGmlC9ok/lHFaMYuRYVzRGF9AlSQWKw1gTDBsHWgctFNGdcgxmy+ nKSmYIJiJ4L8LtG5umrjaU0b4tVrkG7oYecMJkDG15Mt6qgLbMCS6klbNqUTt27imYmBXXmRUneb x2YQ14Xw1Ujo/Q/cH7qfP/PTl6X2s0Bl2UmDEkXKoZd7CQ6IWQZ3DQCjCUKshTqrtqPLjGhpEObE 2QP6VMVOg3R5G/Yhxtnpb51CnHlgK+moXoJl+dkJjGfCbMPwzMKg9iIp0QvhtrCA2gr1uAfgaBo0 q6ML/SsWTe1MqE610NeajoBuC3JInNoH7CPWvwSjFJyMr8RidnUmQwmmsDdg5RNG4lY/v5MR1g5G jkumw90+mQkn+licSMNj1HLf8zQPfzWYasutM06Z0TDEyUCNPst3+vOn2NnjyheRlu2Y4yuAkiKO YMyNkLK5H+VusOYksquZHvEoSWCe86/CvUyKfFgYCZSYJJy71cFs8d6yGL+gh04i0N3zIEh5dmSp ylM48kp/tY74H/m2VmWYY1ySlkya7ezunaBMG+NzhLlMKSctwjcDmpmSoIuSPOZHuyyORV6GCLdk cHaWpQARaBP6h05pC8M6BgVmggc0Hvq3dRhlcnImL8a97AhTMPONeYQ4dOa9aP9iTrGt3Zm1D9jm IcqPn+Gcb+xn+TvD6UzXvOqi7QxPuyyxq66/fqbhfb4a1vxY39aJ+bc+zH+oItA3lfxQSF0QKvqN HzWcO/kmGXVv/ISpwkR2sjBMEo/+RBaGKQUmlJgyfkHQqnMBV5l7mVFBBKUnou7oszKAMk0uMn7D YOJYR8aWaiWk6RGicYykO/mk3QKjLohRlxhA1Urd0agP2j1OBqEPzcNYakBSI451JNkEjd1xn7EO WEhksJw/aPA0QzrNLD5ULHmgBhApVkJKOxRs68OUFbvtvY5N5jYKE2WZYQ5ynFmfOstIDqgk/GTu iU+QwxM3mvm2BVtASwI4tosMM2WYY+FT5UKnLZ46AKyEQ0TK7q5lFaxUkgBhOKQLACQpV8w/1qkd 0vioY4Ew1RIsB3AGqmccEQsgUUMVxDRl9m0PbStEnu1Hpsuv6J3mwqR5aztQNwFGAHREn7Vf0NcF 65SIGIfA66LNOlxUrQd+5kfgQskNwRNWGOqKHX7COi80cVRx7ltxYgfvZ0yK3TYl3UwWiCTqVUkI e7/Pbewy9KJ+IvDVRbyzlGFc6QoyL/A/Z9qRX9Zu64N2b6ENXMPi1BCrhTZfJM6q7UIfU11ulp9T VQ/vAjRxDBN2ljwLVvSxs7UG4lfJGRoCQ51KeBXjyrpStzqrT0mE69wpzDrUEtD5fbz8Af986XOf h9gDWmOt1rm+OI/Nw1A7b6o2pfqBoG1NIySs3VU2Az71yU+ni551fjr7jNPT8y68MJ2wfnP6/Ke/ iOTYZMyRAt7knroy1qLOotJ5slwxjn0VjjLr7CA4Vt+4euyta/EXbv1K+pevfyeYEqUxVb/SWVX+ 2LExhfDjBj+euNqu7Yyh/QAFTyIZ5XGBxZxlOcgDn/gVMwL5LCQ+jcR+Sc+IeGKe5lmA3LyYHD3B QDGPSU+o+nnVFVemrZs3o88+le66695023fuQKJkP8w6x6U7FxoeWqjOQqK0azPXVjZTflyn6po6 9Ln9Zbx1Mt+ZaVxOw/5MP1np7zzv73iuYEeOvln57dE31Mpx4s7vnYPNo+TxM+2k5/Dmx7SeLl85 XL4erwwrvzV/k/x0xyvH8eIwrKBLrtf41j+6v3h5aiojK28CVHlT8Sr//TZ+p+YHyhQ2I74BmAKO oZug/4Q01AeJ64OF3/H+Gk/R95hfVqZ7vA/wW1lG20C/lf5PV26j/WHa33hWxm0cppvTJkBRB7m/ eeX9Ma7xbFwRJ2EMYRw6/bKbw8+jsD1JqwN/r2XnCUk650xBiWmkEGaRbtKNNpg476WBQnKt0T8y aJhpoQlUvgUfgO6h/WYKIMIPGy6DGjXtEeCXnwXBs5t02kGiW1AiHOuxkOEEqvY6JStU+5hvPLe5 w14dSV6zm58taDN2Wwuvxs5/PKj5QJyjzJGrWS/HmIvqSIZqKyKf8CEYMIzUYaz9fiRYwJpZJwse H6p/Pi7Uo0GdoaB8wmknor6/oCHysaH65X7pu4Kj5Ru+XSOdxU9QQvBhoSHdoeTGeKOMTdIizKsC ADLd49yrBqrzIIcMVPguu2yfwefsP0YdmYbhjeOQkpo4j0bVKTUhKDGMtLFlVIXfq+CMLsAGriPw mWV/33kijWolATCYD06K8X6avOuMw+97lNLTAzDCfGRnHj2WVLUObQ/W9x0IACKOBkWNcoz4PE3F OPupr+EGeJK/j6tqwziPC0UuPN0HQNTXAF6eoGweG6oLIMwNFgCzQeIRmDoMXjDISSCCEp7WcZh6 zaoe8dGKPxV3hXT56n00LAtZ2UkguHPY1cUu6DAdB+Khs5ddFSgdRS9n9z4ZOwHdEJjq3A4fGk1n n/wTGGPcwG64O0iTdNIjafYASL5rKoRQ6K/CVLlQSwgF4Ut8sXBDOEgrtzR7hJuEnIwbjc7irSRB KxUyxDZuCwhTL8jMUgUkCiBkTecAx73BEAF6iIrKlGuFUSLSM8mXFkmLOFrYfYNk4xYCjpMtFGQ3 3TCMRkdXf1xiSNWRhQV3RCETpiHs6EwdABBQUbFL1kLYFol94qywJVUFAFHiopt8jWCZvgZBr3X0 s848LSgQjVcqbhuMDgjA2kF0iDk+rAnmQGOYB/fsDikCJUpmMXCmkc/B3g1xCkOXqCIEvqdiCCNp pK2HtKanKAnE62aMOdao4xGsxiqq3tFDmSDgemASbNVpOusotiieGDqQDigKztzaQX1tOH0r9iRW oR+/lroGRcSIUtMi55+zU+1ReDon5MxU2hds/xlUMsqEq/0yE+J+430GBCQCZby9Rs/yHZO4i+28 5Wm8z9/5rQyliLX3MrIBiBhAR/8wvRClZ7KXQRAkMW+GNz4XD5kan0OCgavf2M9kjp3MZI7NY8TF N1lqgFfUsP0PP8ru0ZQyL7olGAYXmMi/BC7xhT9+Lia5LLnsBXFdTCCxsBkXzu9MzzwuL3SWi+cs 7mocvven8zrNJMVNlMtxazxRD414bRP7ctQB710WBYeojSiTufVdjDO+NU6/wcMklp3vbQOZDcWQ Yw6gT1h/2VmSo0+Fby639Z4Bqdwuls32tq3Md34f6fN5bnPTVsLEesnvvMY935l/8+37XHfWrWnb T3zvCTbOAToZuQKgoD1hNG1Px5G4UXHkZwSLsnhUozeqki018ihbO0+9K4on09sBg9iBnRnjGBkf Zb6AMSTNnNcZ+sEs4z4MHuJPA0Rbd7Loez9KXIrZN5kvfp6KEBMe2WihT9o7/b4u4cCc28Nkbh+O nX53Tei/FIi5lP5BI8yDqJGDOPLUI4gFUHShhkd+Tce26oRbamIO0nhjgFgcdWxhjZfMh96qC2gv hntnlA4h3fFDh/iQxZX0DKNEhMcph5FS5lQjth/LiNmHmpgTBflqEgUs9gGqCRpQZnfkW/oERdmh kAiyfQBbK6wbjuh5iDbz2kN3R3gRn0Y5KA8zgaeNIhQCIU3b1GC4PIJqnsV5ESLEjITRTubIDvKD Pdc4Ttod8Jj/AQSUFFAqLuYIy0MfogMFyDQJoz4HsKI0hCeAkEhYoZ6grlph4tqr1D/hBZfUrzR3 SjzYbrPz2IphXp9iR0oJqnbri7wJ1mgfw/6szaVgLqjD+Ge92VdJSx15RljYcQjpBfqZ/S1OPaHc Me6tF6TizLvt4HwkeBVp8TgPISJYKzlia+fjdLsAhqzGHsowzjcUn3yz7kWNec+uKUD/OgiHcZiU /RApYxA42raw9p07zG82pIfXMU5x+cw05esxAb7PwwGIREYl84vSUkqIFGpYzhmO7WKcU++srzQJ RafNaP82wJ2LLngWhNZEOoTq4Jmnncla14W02BBrMH0vWii6J/eW5Jld1GsjCFUUjlmeeQopzF4k Hek7AtcF+Gw+CnDD5ojYee/YLuJhTPE+Vgz6QYWfEgyGLOaIog9GeNtSRyT5Nh6Jy7DG56lb8a2J GYifjM4SdTXHPNHVXU2nbjsl3XH7Xenxxx/n/vT0kQ/fmFav4ZQavjHvbtaAn+BoTepQiVXr6Md1 Mm+53b0652bgamXc5fk6v8vMXqx75QrIAb7P1e/zGnC8oDl+3x2Pac3f5HDluMzT93NuxAj++p33 weQf5yPjV7KkHP9xgh3X6+niXBnYNJ6pHh3z5fSlr56pTlbG/+M+m3Y5fePL9f5M+X6mdP1+ZZw5 vO9y/PrlspbD5zDlcOV8Rpu5XvO9O+ZKmBjWMF4DjHU9dt3mOdKh3yiFF+nAFGdbFIISE6wDrt8C 3ubH4ymfyRl/tjVhOKB3C7L8SbZHETYoXLdYUzLTbSCBBgGHcI2NAe+1OeG6LiiRAYlsILOfuTaD F4IS826MZOfaluPxfqXDb3XDT1BC+xJlKYApQBkZb520Rj+SsAcAbLOfqi7ZBYNOGMEH1TQEMDIg YZiyfyuqr8ann/Ykmoi3t6HykuMTaFBSQeAgHDyVs2CoVZBv3/WRN5l6fwINMuvmGTH0sMEkk5/B COMwjFIK2TilMTfBJ+Z81jleNMLBEwpKqMYhGJPBBwGFZ3Ir32tHKrtO5vRwrNcBPgAa6AQadOZN QMKjW3VZzUQaUFUL1ThUTR2CFhWQEMSBaAr1+jgdrgFG6Be/iKX4k0EJn8qghM9LbE5pi0tnOtkJ SgzDhz4TKGFYNkbdfWTxy182rhLZ/vIAVpRftFkiwbXMxhwGeROp70Fywp2ATZs3pYsxRrXt5NMQ R11Me3bsSbt3PJ662KUfWL0WZHYkHUS9YwYUTQbbHR7TN53MzETykRmZLZgnAIkKp2woItuJWGKc 1Yxu+MOPPJEefmwnHaU37Xt0Z1o1iIGNPo5JWcBGRP+W2KmQ+XQxd2GWcF5ksA2N8H7VkbRxcBvp DqT9B5/EzsNiOuFMjH7BaFRQYTA/hvfED+0HyKgozdHahlG0sT3Q2jLUMCZMQoNYra0iLeF29hK7 nG2IwcokzqJzbEUp1i1hvnnTlmDsjVtx/p6e1eknfuLstHHT5iAmWwBQWhDDbluaTlv6B1C/wEIv BJ8qGx2AME2Upc3OzMSjioXgjGep96PCMcvuh7sg7RD48z0w3TABcAQQ/fMAEFNpYOtF7MBxTi72 OPYcHIFpaE6nn7Qx9W/ZiAqIxsJmULvZnZ48tAuL8GPYzziYHt3+EMQLRDp1J3Fku3vVIrxtJVPp sz9dQTw6dTvnwlbxfqWLhYdv7VPRj/hWgt24dBKivAjGJCZ8+ojxyOzHu6dEyPfUpwh17qcrg/hs XMGUcm98PuuMN9s+CA/+2D6+j/bPnpYTf15G/gSWoJKLcYNfMB0uQvyK2uD1irrxWckP49U5nbij 59jLdWgZQvLAPBqG8L6z7Hl8WG+OQ527YDrF+mVaDReqAnxjOXR+V25DwxivZTRu33uNPDTaQeIy t3ekz0Knn/GYX2PO3+R2Mb6cZiTc+CPDa54smz+/c/EOcIP4sr9x228Ev4oxUuyW5nLnOMkpdVio GUTalqWRb+PK+Xbc5Z0GMh4ghXEoXaAkhcCIeTA/2tFwrlAaJbefO8uWiWBhE0K9xjnrmDTa+Eax /Rbi8vikJcaTTj3/QtUIiTP6iNISSiepgqZuPInFDrP56aVeZlzwYLAEmuqEr7AL6+6qhJDqTDMC F8QrADaPeP80c6GqUx5j2aFKCvmZ8x1+NH6aYzGYhyGzztuJVxsU7pQ3odupRJrqJ1oBXxCkZf4S TDUvNcBUDTmOIWonECOZND4OeIK44hK2FvqQAmuhv0ebk94SeRl3FxvwopnjZGvuavBeMKJJpMc2 Z71QbFUQQ8AC7Dd29un0wYQL8NQgblx0WwBXHRfGi4gZzDdqPJS8HaJGNRmdc+048+YsC65hm1ko BXamiVwpghp1WYEA6oYYsS9Zb53ErWi3DL4nQqmSQSMgfkvVMX920h62iWGtU+eCRZjH5rqgAzQQ jW99WwbBKyWYlHbwdKfYgabe3BHXzoXEiHnwiNcKa0Iz64Bh20lCCUABxDznmeYU64PJh8pEIx/2 dQmgRcozhbScBmzb6WMz7uxgk6cL+wYd1If9Ps5up88ssS5WMLzrt+ZRCEGJmCnC2H9rjIOoC/rK OOuQdSPIHxIU1L/zeYeSd/jPAiIpVhuin8RneckieV/E9hLAvyAMrg+d6Oxa6EfT9CmE7GgHxqzI wQ/pVNVS7WEOkCuDy3musM78+UyOos5cR8LgJwX7yle/yu7bSOqH+H/0iSfSK664PObof/zUp6kP +qPzoECjBeHeuljprJNiHjj6VjDCOi16UjE/OicYjY0dgN9yRLyIT49+T5SRV4Poaxrh4bXkfIo4 w895uyhjDpLzptqG6QewEFEwT9B+/f2r02/95m/EDuwTABKuDVu3bkm333Y79JKtUszxVgHNH3OD 85xrgADgciZzgj/iVQY3i7e7VujWI4EZovD0w7JEhf1S55gOxpjwMmj+PB5YvwG+zX4RpvHe77RZ 0EOY7JwvswSETJzri3nR5fucJ/0ETvJzBq6Nz3j8zjo0j6Zrn/cEB8E3PMM/GEXC+GwYXS57js/4 7bM6Ab383mfzHwys6fEcaROf9x0wGGFYkXvTLo5QLdZ760NnveW0vTffZRcSEfhFOrxQQkPxc/Oq WrXfaIRSV44/l0X/SIOr4VrpexN8Lz2q83S847lyGQOcIlDESXr/Zu1v+cnb07V/uV1znqPuGw95 TpN/0QnYWyf6l/2yhIPto79zna4TybbsFH3P+vj6ZVH4VdAAhnczSxqwHxreU60yA64KPIoOEY3q GitdVtsIe0G8jGe+X8sas8A1O9d4N3y1SdTLmp0Z2lF0+6dgOLux8aY6rC5O1eJqHibWDoZfN/RD dlm6IT/XYNL3ofqgWkcvc46uuQFKDNuVMgMbbxp/ZH7dUaffyfzKHLewNvbJLKPCLghQp26UIlBF 4QjqefbkppO2pMETTmaN40hwNsS0ZxD2DdXDhjpp49S+tkbaccoQ4TwSNJ10UjoZif5zsVZHAAAg AElEQVQB4rW/6wR95jMoEz7UH+/7SDc7n+PkLTwMG9IH67FfxbcD0An7WF/a+KlC0YJfVufw2g8A 4kkX2m7ob7T/QUwcVLALtopn4QHbX5dVOJbWV5+SR+mhsmFOw5un7O+zJ3PIN9uu5bR9V3bmdzXh 1gOImDftRDRBv3paRydAjMYvsxtCIl9Vjs1ntB/jL91Udhq+nuSYUI1fboLXPv4MgIQJH+V32paI k8fY+FAqS1DCwyK6ydNWABTffaicSOm+4gkULsCxg8yiKYPDKhpMgouWuooS+RplCYaTjyVC3ZWc Qs9ccSFX6iqqANABhG3lJIxVae1p69nNa0r7H38yDB6ecNqJpDOb7h4aTwdm9oSBsjaIQK3dy4i4 e+fQFAQIEXp2dz3PXQNUbF8FUiWxsA8RlAfuvSfsFaw/sR/R2tl0x6OPp0V08ldBKHeh7rDh5DPQ 5VubzjnvzDSwbjAWhXaQoQogxv4j6BR1H0pnPxeDLCPzMOzbCIMUR0c/g4IcsOjHMWoQeT5KsEjQ KFZbqWMbg+M42arjlBHsPwAarGWgeTLJElYMXeetyzjCkw4rYqRaifYvrDsXO+NTz1hL4vqPgvLJ 5KqqosHKASQlNg6swot6xeghJHjoPGskTdCj4qTorif/eiBU+9cwqXQRho43dugBFtAjEOQgfxw3 GvrSS4h5YoNDK/JNhLvgpPOozlXAFtW02A4ZixrL0sJQGsBw54FDd6X77vvXAMYmx/dGu7cgWm17 u2PuDnZ2EnySoC4KmTnN7+wbxxJcxZujOGjx7Hcrv81x8GJ5YY82WH5hcwDuMFAkIATMrPNnckHU EmZluJXxGodhjpHM0JMFpezc3ZwmfYloKmc5nzlMJqbzc74Gc8J32QmM2Oef4ojz6erGPFtu087l kUnSoGJ5V+Xpvjetp8vfU/KBRyaGfGebSyjLcJv3sjO9H6TNbYtMsJW/z/f5XbltJKL9+U79tcJW R0EY4BlEWv7eq7tXzicZ0JIg0JaEcRhvTiOIfsalu85xGhBl80SD7FrhBFok4vlGZkiR6WnExK0H gQNtNOg0drkASq9amPFbF9ZxBug8DUIGV7BApHiG97l8tqEnSwic1Qk3BYMscBAELm0qN6JovUYZ FzhNpzgpgd0a6n8YJnZWxhniQiZjkfxohLECY+sc7k/AIfooc1WN04qY0Mkx73gOlRHLpg8Lo2J+ qipMwvDUmGcWPdXD+Rc3D0AxOoIEGOmGygaLi/cao1T80nZY7EXIlHw0q4bCN6EhBBCxBOBRh7hX bcT8KCVRR1JDIkq3SJuaXb/rY27rYPHXwKNzv4u1s8kku+CjSG4I/gURQfgO0wYMwdILhLRt6zxF XgBKFimPdoaCMcU/JCooa9QJC76g1Dj1qyqPgMUw9TaKBFg78a2SISBfSnfMQuTNAgoIPI+QFyac AIrCyGgN8Jg8TNueSrFQBybRDTjUhBj7EnYIPNq0CYJCwlRDyGJBdJ5Y/7oBGaZlRJUmIQ9Wmv3C dQLyA6BIHVkkxQ4fSTOA+G3kZwnpAgnPKfpXhZ/E5DD9kskgvh+ReyUfxicRzWKTdgNgOGdKFKN3 CMAFUEtGppDm097HHP2uX2AK/6FGHUgPqIccIpeALWD6wfyugqCQHlCyxWMhs2X5TKjbnj+sU/VM A5cL9I8MQuQ5yvHhvClgCxxBD6W+LCtgSStj7ok9e9Jd99ydfvIlL0m/8PO/kM4/192Zerrtu9+N k7F6IM78yvlA+iH6vn/tcM/g8viMICvCCkrk7/M1h8/POers77PviqiOn7bvG100wvptnuNd7y23 7SjQqzTV0NCRdPkrfiade/a51N9UzDcPPfRg0maHAGwHu3jZDoUnzDCTxM86MG7jKucv5/lHucqU PsXRn4IBboxzGfpgvJm3ZMJb7J+MTV3MycQhI9uHkXRdjtOr7yWOeyCijcPvZSCDGXZc4oxfp5/M p8ylDGUGIYIh573PwTBzDQa/kc+IC78MShiXaegsnXORTLlxt8LgLzu+yWlkvwxQ5Of4xnRME5ev +kcdGWfjXQYk8rfGFWs+7wU5ct4NZz2Unet1zB/UhUy5gIJ15zcBSjTqSNGjXH8BIpBGdmVQQj/z Z/rGbfmNy3t/kRfDNPKe44hrLtu/ZfuTh1z3AUo18mK9Wg5BG/NZLqN5jbmRsNkGhPOXoGoGJfTP zvupRvm8D/DBneWSyyBEyStuM1DhPOnMZDoxV3LVLwMEK7/zWQBCMALGgLUYA8zMkb3U/1o2JHWC EhmM8Nn1dJR1TLeaMBUkpT3Nq86YEZCQoc3pZVBkgjWlRwCad9mtBCX0l37RvkT3iScEIOGmwiGl AhoAQf7W6yLvsr/qAcj0M+OQP2iGMCLZ6IOqs2bKupl1TpsQ2pnoHVxXji7uZwAlVAfxqNAMSqgu O0VabhoNcMjBSQAAZdAgM/ZZzSG/WwkArIVfOgKfFmuw+aQuDKvTX5ftT6yGNonw0BCCFgISYVAS xNgZYYirzDmLZGw+DnBrDAGWcI13XLU1IQNvOjndnGbON6/D6a8KihsGpi9gshp+s3z0Zw4rCMFZ XKm9AUpE/qAPy6CEoINzqaCEznjKYMVKUMIwh6A53EA7EVCiH9pwyPWaOAYbAEYul35hfwL/sCXB t/l4UEEJD4uozRZjK9OWxr/SYSuLHSsWKF0wHl5ZIF20bEBXSgnsQVC1tZ4awWQoI97cTEVhGNDd x/lFREg5AWLDhnUwR0tp7749EK8wMdBBEg9jEIsjIGbaelCaQGvg2pkoGA4mRBdk/oWjByvKqSqF IqS6IYwm7tm9O3372/8K8jqezj7z9PSSf3dmevLIfvS+29J5/9dFENrVtHvvRNr58OOIpWxPh498 Ox0ePpie/4IXQ3iC9IpsYVviIMBIpQcr1QyAEaQ3Vq85OV32M2eEQbIHdu+lSelGEncN2kFCQTUO n+voDFeqq9BFhthkl1XxYMh7JkBEutkpXIJ6kxnSYGe1mWNuIP49JnVh4UCjrDBAENsaq3Tx8LQR 7SxIeJlmC/Yl6qiuzEucU88aR2viuY2dD0Ec606E0J12tyE1dNaCTrkDvrII0EAdKuq8yPGOO3bt TnsOP0l+OYeWeuxVXBrgQ4G0qflRGJ2JNDMKMYNURbWNRWbiCZi3kbTzyXuQTkFfe1jDjiC8TJ4k VqDlBVW1TMxo30DCKQguQtl/zKNMnIQkWSneBcHl01EnQZS/4yZe2OeMTyKyUf3hn8MZt/e6zBjn eMKTP8aRCS6JW12WyLAvl3MRcdnAxOm94yAAskaZvNeV0zBu20tgIOfLUDm/cU9cmeDL+fW5IMEi yiK86fotfxpJFfnHw7xHPfiy4XI+ctzmxX7kxy62kR/Cl/NT/tb7HEf2f6ZrpNxIP74jcDAKjbL7 bbm+o83Jy3I+cqEaieR85/fxvf2F+rS8ua709975wfJl/wwYSWiFH2EEUmWiQs3BD0lTwC+uxCso IRPvDrESR+2G52cbOvfFJMw7Gepof+IO0IdvaoY3bsaPZZuCmKjxrWV2AkYMI06EsVwCGPrn+jXv GuAkMyFtY12qWiDg5kXwxBM1/KaJdGSQnW8nIECamatiUhcUIB3X9iYYR8eX6inOGTLrcyDjYTuC +dQ67AQYcUd11jbgpx2BRcXyeOdi2yJXLIElY07ckdcAOckQi43KFDHnQmy0soCsIo/hSFcApJny EyAkHDxBZNh4YE61b2G8lkniSBFWJsG0RJpKGjVBXLVwRDCfAkgwr5OWI7xphrmY8DXS62KxqGLz ogqi7xGktp8fyFjMMw9NytSTGe1QMCkV0hAyiMyH3eYLRlzmq5k1Rom0ab5r4QxUTydwoa8Yp2ny TSvptVFX0zDmGsUMexAT3ANoNKM6J1GhtB5yGGlBQAVwtkndfMrKCyRbiIs6FdDiZbRLSFT5bH9l PbD+Le8sjM0SRpqVmlfKhtAUAqaJvteDTQe80wQgBjljrkYFBQ/VgEIijXXQftmG5IiSEu2kPUp+ lJJZw9zPxI5aDm0v+CHhqFoNa471E/WuRAd9t4uwpmOddpCpdn4zMPbOLx4v10bcSl11S0zwzv4/ A8EV9W4/J8trULWROdEJBh88fHiZwXPuycxBMJgR6gf/Yz/0O49QLAMS+jnf+N68CvLTW4qyMCis U9eEKpKUF1383HQAXdk9uwupicHBNel73wNAXfDIXpuU06bsH67tuDxOv18unWfy/GPY/Jz98vWZ 4iPrONOm9YlvpSv75Xjy1bD5vaqvC4BMgnEXPu/8tGPnjnTBeeelrZs2pT94xx+liy68IF188cXp Yx+/KZh7bXMo9WKKUXZuTN64dXntjocf44+2JGwr5+qiHYv7WJsa8eb3uQ/pHX2G72Qe83uZS8e8 uvTu9EtLZDWJnMWQYODdMWnx0ufsZEp9yn7mZbKRDp7L3+Z0w4/whvNnmcoux2O8MuNZAiD8jc9v /aDxvf457vLVOT7sRdAGmamPdHIcDamE8Cv9kbnWZcAj7FSsqIOcZla58uje/J358l7JguxXzm9m vEtJFmsF3+nyN6bv/REAbtPLZTimjPjneszx5ff/Zu1vPsmX2yU5X9aYeTUvOvub7/zle/19r1++ 7+BWOrnssl0QpR0EZkOakHVHMEOVDJ3qGrNslGZQI4AOwpQlKVTlyFJlSl4owTjL6VO6ODa0BHhk FQ1kI1O2L3EKqvE6GUWNCQRwwXMGMabJj/ahRjsoPSr32X6Bp+HpxhhbIUEhmB3rLifwuTYSnceF 5tM4lo8OZU3SDTXsMWzkXlBiz+NPhP8iG7M6jV+WDV8OjKIK3/jW9+PM1wGMVG2hwtU4cXG8odpw 0EkKV0UaQumI6YMHlg1eju0/QIMUqgiGmUJqctngJe17KmVT+mIMeig7T8/wCNDl4ze574ZBz6dk ZEOSAg5DfKvz3nj8doGwWe3Bd9rF0FVOPCmuggn7CG/95nCWbHKUDYwIwdok2EJca6B/RmhX8zKG n051jqaSmolp60z/eC7bl8jpK5VRx1ZETltJCu9Vv2hGWkZoR5BipFFv6wWBaKPdDT/D5tM4VAHR ZsQzuSW+i7xzmqSgxMie3WFDot6QtnHDUMkWr9qWmJTGkyaD9tLl+y0NoFc/N7WezlX6OQZrQpFb ViyPl4olS0KWRW2Wwq6GiApL9sQg8eQCmxe2WGgbC73qClLQvpOBkHHM4QrjVQ70gmHzO1bF4+bJ fEjUG8b103gkhPy5U+sC205hVSGRiFYssYNnz3SvcpyMIIqNJLNSpG+ei15veI2ORfpEbvyCBIHi k/8IXwQ9Jm/mSQKoIoGKUcnQSW86duLyAxd6Xa4X0wrDeOFb/Il35MO0DO+z/EIh2o4/eY3nyDOZ IWwmTErRPPXWdrDO/B7ydw5jl9PYk+jGwCW1FGCGIHCNSVTbGYvY2qhxnvgSkhlLSE3MI0a1BKEu KNSEETKZO/No2ynVso6TKNog8oUbXJRldjJDKDGr0T+ZKw2m2VZKNKhX69FlghtTTIRF2Ztix9uF oZ0J3h0/d7MlPAU6piCwJU61UG9bluvUe3dMrQ/7aTCS+OlsH59l9mRGlSAwrGkr0m/4SUSGzZf5 DECOeBSTl0kQCJNZ1XYGCUR8EkUuWKbrAmwaoa7Bs8SSqDwvQ1LBkyaMyx33NheXRn/SOGLoAUff Rb/b9IlfXXDzYbwCTeZZZ9lMU6kA7z2JJZhiGUPqqArD6IJmv1dyJqSXmHxkJoIYaPT7NuK0PvJZ 2qarOJVxSbjkus19y/opL9aOQdsl6o7rJN9adtslpKoIb5tr+NU2lwCQ6DCeOD2DfFsG+5Bxea8k gfXeSxlkhGSeos3pTzlu2yuYEPKpwUBrRfAzO8vkPKVTdcA+pWFb20xr/vZvd5KcI8yLRxGGVAHh rDsZe3ccJbA0bJfr2/lL8E/oylMZZACirmnLACEYXkpEuLhSKFQvVMfqQeqoPWzqVLmGEV/fmTmu Egu2tbsw1RoigISxr63CX/sI5jmmGwbmEmNynN3qVewImIb1McpOueoFvYw9T68J5lfGnrE5T5wz g/0BnEQbkZ4IdFMDcDBu0Ko0xNxueVezCGo/J5hYyu6BMCHZpIEKM8H31kWdMEp0tZDHSQBlJTya A+lmrJJeM+2K7l6AFDX63SgSEfax9rUDqX/deiQMxuMYV8HUWUQs56eQUGsbTFWPy4WBdgw5R00j fbEAUbMa2zYbic8dfI8ybIUJr1MX2mOIMpA1wYNudkPq69fHHGcfDKkJ2nSBvlNDjNQTLNoALXpp oyEIvQpEStW+4c4R9WkdCKr3yagR1iN8TU/w5nDPdGolDz20+Tzltl09mpUKClsvSm+o9mGeWrhX fWPB8Un8cdoHedcApXOBIJh1uYQUAvKiaTVj1R2PXoAX+15WAbDllUI4AoFpv/BozgrAzBTt5Tnw faTj7nAva4ggtCCJOr9Vdszsa33428+sz8gDaeqcq2YQuVWaoQuCbR0naXkUs4Ft5lynU4QXdpJs cAdowDag/09LPJGHWF+Ja5D2kKnv5hcEPXUiARY7kvjp8s6095nA9/4HdSFtRV2uBCYsiz/nkFgv Qd2YbYtoKY9H0GprRNsN//y/vppe+u//XVrP+Dlw4EA697xz07nnn4+05pp0w41/zfzj0b7CQlEL 0deNyHjDeXU8Oga4z/Ni8fI4fxvhj/Nm2SvHQ5TL7mk/M5Avi9mjaKzIUpGnoBOYE51Hr33b29NG RKGdE0ZhEG+++RPpkp/898ybtfSRj36U/ovkUkRnwo35SNqMJ+fWsJfUyJH1++O6zPgZj2umruxn n8i/zMhGIP7k/pLD5zVI/2An6es5jN+Ud74z05m/9ZrTkTorf+e3y8+NcM7rShlGOvh5zXEY/nhO qQOda105voij8UHOQ+NxOVyEJx0VjB0/y2lZPzkw12X/kl/5ViAwp+E1aAji0/mtLt6bx4ZfpM29 deZ9hCuF9RtdDud9uUw+62wfnd/ndMvf/P/R/lnCg0wt5988lfNlnvNzrt8cJpfDMB0Y24dCXi5n BoL42EKnHtY1XVb58N721DkPCkpksEKgorWlYDTLEhVZRURpitzughLZCUgIzPnTboSSEt5nVw+J QNQY8deV1T86JfJZ72SYlbLIah8CEjqPC9Vt3Lgx1PPiofHH40Jl5pddCVjoh8EegqlWcmKeuYTG D7UO10tdoeSz/OUxoET2NU9arNMuwhRrHQXIr9I6ojzciQSQtGyDefelJ28Up2sQlnWqlZ8SExum oIsFX3AZhPCkDdc9AYBjQIlGHjMo4TeGEQwIA5GURaBCaQ55x/K3+uk0Mmm+XSt1SjBkUCA8+OPR oapuCEgIPDjf2qzDDXCC22UnPVYGR5ZfcJP9y37axCh6nnmHLkEKUwkKXfkUjiboAyUmArhogCaW Kfe/IWiDAC8IdzynPY3synY0sl+d9snU+BpAiSbqQ7/y8aGGLT8LSui8TqIFkF1J5ix7LV8rMnDz NFIfA8ABOquoNASaA9KF1V1zFzx3/kUJ1QUdx9ibDPdqkaogKBQrHOaIzMPsAvUGYbMIY9zdglFH CKcJCO5pMt+G+K5xuXMps8HGoDRXLMJhkZpFrR0iQxGnSQ1aseg+cP99EOzoTLEgXACh0Yc9i052 /uew6F7zyESou317D4al0DaML2xYP5jOe9ElgUoP9ENMYbNBZsaTHiroQ7/00stJr572PfE4RsDY oeOkDrT/2XVhZ4kOPzU5whxUVL0Tl+us1tUXMW42NTORxo4cQJwG/S2ONlO1QiJV1t8TKsbIs+ok S+z8SISvHlgXTP3w8JFgJGUGC2N4MBAQVRY8jrprghDHsOdSKydsoP+zUOE6x7FCgAfdDBhtSjQD oPhrhSCVoPWYSoksSGCiAZmC4LYjIYPBztsmBjETMf7V5m6Mmg2m9ezOTVKuSVRhtFoOC5C6OGZu dGhPGlkYTnv37+B0lUfZdTqA3QnqBLFvmr8gDCVeyLv65xKCARzRRrGDo81k+kocySkRSamC2afO 3VV111ijZtGXiDCYf9pe5laC193FefIVu270RRe2YDz4XqLJcDL3MmIuihKMMvWeeCA4IiPrrmIA BeaRDCwgwZPfWec6n6XWZOA1UCUQkZlz37vD6ckC5tP+Et3StH3HN/Zz8xKMJs8BpHA1P9YHVC8r EwsR6diyNHwwyd7mMBLglqlgeGFwqcswEkiaLPkGDVAmM/Du1ptHgSDjCJUq6lM/28H82lcFtawH 86gTlAj7FfhHH+HqLo3ElHHIeNq3BStcpIPobdSP6VgH1pV1qqFPHwNMYdzK3C0CZNVMg7EqFKaz bQxTZZx2dnEyjkwfcVqP1rmAT5SB/DfR1xfQoZcwNB/RzvYnymU7yWxVuXeJNI9mILej/SfGEGl5 cojjTyAr4iHNlgADYT7Jn21qPRi/bd5BfmUyc74IRD0WdWgbmr/4x9U+aP+Ovk6dWT77piL70d6M NYElT2ax3PGthSUG8yfQ4XjU1sIM9d4NgzzAz7rWLkCIgzMn+Z1lmqJ/G692YxStm+d0ieY1vCe8 upxKGii6qMqFxIxtsorxUxOM4MF6IMPRdpEXvptlkVkAKOimPboAFyz3mACTY0b7PraOBcB5KoJx WPeeHEGDRf03h/QXNnNY3MhsLEQ1mP86Bo2VhPC0nMoAx+f2I7TIGMiSAzXqdcFF0Hl3TTdlAoyh fRbpBwuUwTltMzaBBhQxJf9Oh0oGOIPUED8ls0gmIA1AvQsqyLzTyaO3qWoxQ77DnodjiPqUALO/ xlItA8p3lqOT+llDf8fKBgaayD9EnTsyUzC5CBywT0Dd850nkHiyhhI17Vy7qYspyjsD4OuOrnns lIDhXeTN/DguiN/nGP/UOa0BUILqDoRgB2XrYN7tQaWxDQDHtixGC/VLfPPYkMA0GOEAjZy7JQoA ZfpoL1Us+5ACdM4Jo5qMF9uqk7Whl/Gjc55aJpy5t28J7B6hjQUNN0B8KMnjzmkn73oo0wR5FUiy Tv83b+cBoGdV5e8zPVOSSWZSCQkJVYp0G6JYFkFZV13F1VXARRd1BQtWUCxY1kYXu6KuqGtHRRDF Ciq9dwgJIT2ZzGRqMu3/POf77vAlgmvZ/57km/d973vf28s5v3vuudrQMD/Zn6hTxzRBIzUaBYzr nQdxE6QyrhRmiLds2yhMuMCbZB+xH/61ZLt0exxNhaJ0jmB8ta9lQKSJNGTaMn06+oZyNm0sFgjo 3Hff/ZxA8XAC7LvvuUe8/33vjl//5jesEG+Jk1776jjn7AvyuwSGaAd5mpKh2PAyosrYaZdwDPjz VInfD3OsrPFsCVbCq3Hc7tZvsitt51oegMS5JQWZ10cAEsfF4aH++LdXvSqedvhhcd7558URT396 zJszO5Y//BCAxBcZ2ziime1Q0wGZ0nYRZWhYkqGa1vxnAqpk2f+vEXVfthMW4c+wvU8hl2utJkNt Wyn3Cs5TZF+DasMq74r/8uxVt/Kbctet+k630ob153iRGhDEk3Yaqn6nvq1+VxtXroLT3mvdav17 X9JQ4vqT9FfztZ0/4n4sqo3LPmafL9/Ks/ub8sN785JxEqBzVm3+9ee77b6piXi7tFbTWfM6b02D tJ1fHXD/v67/kk+jN/4sB6/pUPmj244gVimv3BoDGDHCIl36qzkDxHKu1fCwNeYCEnO6WhK1gEQZ A0v7cK4UqFCWqaXaZ4VFtSjbkSP+J6psmUd436aADoAMHyJvMR0Bt5F5hslwKogpQAKXPuKoQ96Z wXu1FgQHXPjw5/GXtTTZwjv8p7YEL9SeGGD+p/BqvU3de1yoJJAuqTVRjgkdh2eRGqrgwwzHXNym hF3kwGLYUn/rDYPfNhaXH5WqgMDOXGdrWwPBXx0GhfgCpghKFCqaEj6PwYcUKhoJRUNBmxcCG4IW giv1pKt8Kyih8F9OtyhpV/OgFpRQ8Pf7Xn7VWSSjq2NnQWpMlMirV5Z18q6AI6appGcHrxV/lj9A yBD1VbahCIKYLk/I6GYBpBc+xlBN1yZ+pqmk0ataHOXZkzi6KMdaEKLEmzxrtS2VbUi+21GjQlsT acEIub7QBni7BtplMXpZ3IvWxCzMLWhfQvIIUX+PRY0bEP7rYQQkT93YxBGRMvoKOnZUT2XQvsAA wqyr3m3sW9SoksKNR04NADo0Ys9gwU4LU/NgArRBIWQLjHUr9hLa2efUwzGWrrjOaurIVXYFG0lG StHa/zLlruCtXflwrMIuxUZWCxVo57NKtvOinXKVaMniXVgxGEi/3d1zY3UPx2PCYLq/uBXQY3Co IgD3gSYNsX+mqxtmFaF/AkneCXgUYX6vxx8C+NCHoayHonv+rggrTake2zgKo86EndsknL65V0BE 55lzwR+KS396edx2662xfv3K2Gffg+KlL34FhtYwLiKTCFNXEYZhXrEFsR7hvhVGXAZ8hMJPAAOm 0vz603aGrIJ5lrGvdzM292k8TqCECtyKwc8RgJdpbuWAuawIP5QXjJSCB3/8jzgrG4U2B6DFBB1p Wnt3dM3bJ/Zu3ys65i6JiZ6VnOveHbPnzI8ujLqtXLscMGI521kwINUIU9IyEOsG1oNKbkQYYUvH AAzQACsJQ+zfos5k4hUKUxiztui4ClJOCBoDTC6LduJqou1FewcylR7n6QrVIIJRartQt+ZBZjI1 IghzjPp1z771XrYiNOHHVfRC7otW8FawNi7TUQRRblLIUvDVrQihYwhF9W67gWE1bikFQPwYv3HI uKuKPUzbTsCAtBcmLeupOin7rnxrOWS7YKBIIMWwcFOYy3IwHbjVN1S0Q2qZVu9TyCbuBP1Ik8cK TiDAWG7GbbzeSx4JatxOqGoKWd7aGrBODEd/lme2C97Jfpb0+73PBYyxbeWJEk99dWYAACAASURB VMRh3IYrcm7YCewQjuVn/KVsjc+fIWWd895vt+lGXvBcOV6RdMgICUYJOFo/Q4wJWyl3VdIzXYbP e1f29dc/vDnrXHDSnmC4luMI6TNfxutxh4Kmllsp95K2Zr4zr77LPlS9V8W5CYlX0FIq9eZeeePO rRvEs4W8q8Uik2G7UghQO2QrapgCGIKYjksKb5knwh21HvjZflJDA8FtmEnXo2MVgGU4FN6k3P5B +j2qcZj6GmKP/kL6oO1uI2Uz2kc7oe2bPrWORpmQh9gu5kpnv4ZrmQxFxc23AuoYfW4z/WhgY0+q 8at1oQA9ytjlKRPmVhOHMjmWqeHW884xdwuqo4tlEhB4N23cgPFeLEkAUridw60LEwAU9WprkIY2 Df0yceRxkYQ5ICODvzEZFvNGuJPU6RBxarOhl8nRMasZQUgGbkAVSyZQQQGPH50k/nreOR4MeUIR 9TDBqRWdpH0uWi/1ABX9uDuetAIoieRrQ4PO5ZJitFg/GuTk6skWguQeN9pH3mgkFdVLrm0wFmqw TPRUBGnb/ajnrTP+NKJ6KABj+9/ApGn6FazJCgyNez7RRKAOU0OC9Lj6Xk/d9JNGt4MMCvxhX2Kb Y7xACX4FiCxPkLQU7HUrlG0OY6Ma0WoDuNeORy9z1nivKzmVeU+GVc2eSdLUjO0fp2rHSY2D2Z9n U+/ayFhJO+1njBAY9ejUBKl4lyeulDjNSKGsH+Ze6rke44HsnmExYRO2hziim/FkBOBHOyn2N+tk EGBkC3NnPenaTF4FvHO/K27zSF8zcw25rWwXElSiXiXbuqx0rgzynfS3ghJ+20s+PfpaY6zam3C8 yXKmWE2TJ0qU5wpoYD9zjnb+s+yZt6kL25GaggcffHA8sGw5BrLvjyc9kWNE4Rt64RV2ZpXQ/LsV RvB01Dokjx6PLD5haDxwJdKaYvVNPuqsv3zQnzHb+3TnBeEUcnyyLRTKdkGZe/Vn2sv7dMt8yCM4 5lrqziNuDUUAoeyPffE/x09+dAmnU2GMljHh1SeeGDfdcnOOCz3YqfLI2gkWSzSAPZptg7Bos7Vk ch5pNqbhEeCj1t9fe5/tgjJN4Z6PFXr/hGhzOa7zorSjP/FTfZepxv8UVdtd7XOJ0xbpfWWuqgnb bwij9r1+Mg36NzCeTWvOsfRFQYry3teGu2Nai82K4l7ixWOGVwm2Ek55V/z6TprS1DC+ilPG6235 puqcl9rv7btq+GqIUr8auKzte6UOfOfP/OfV9FXvd3zWvTYOnwvt6O5z2gqh3Lyfes99ifv/sv6N s9Rlptk0cVPK1Xqp5LySo5J3r/5q699ny7eQ5VryVPy7FSOJOYBZIDVfnMuLZqrvHN+nMffUghAF zPW946Y0DpCYR0AjK5QeU7Zv+L7c157IISih0Uu3gLj9cifsMWxgT5uAg+RWDjX9ZrigyQ/Igrme Gab6vhO3fMa5gBTal0g7VVwFK4o86Kfqpppjt3KUI0O7GOd60ISWRpjvHymxdIqZtkluCyhRQIrK 2z//t4AV9WxRn1sGYYVZ5m6prPMX7YcCOuwIOOz47Le6FW2Ecq+WhVtABAbKN/ppg58owr8CvNoS bplfz3zs9hnfSYIXzuuCErUkKDETvkQqWhSCFE4f2vKaxD6HfgpIURt3fvQof6wvtS/V2hg17AUs UloP8GKl/osWxUzqvIATXgt5r72JQgVsKc+116JloZu2Qh6ZzSLmwANIghHzaXJryVgb5WArVFtC TYpCAhKF/hwYUfx4bZRZ1lCSg6XMisy1zFlOmszCyQwhGMswaD17zmxsTcydS38f5Thc1ITpvBpZ 6oERbGxdHzvDBDSCsvWiPdDROJNwGtKAZlsXx5HNnw1KXZ8riAoFFSajkl07viset954ExNEU+yy aBGDhGq/dGSY04b2SuYamHy7YeZyZZEQmkhjN0bXdsLI5cRELwxofcxhFUEGe/YcOogMMl1nHMZ/ AOCivx9Dl5RpJ0Y8Rly13bIRy+cgXQMwAajfTgJkKBDVc3XFcRBB4qeAEhd9+SvktwcjkrPinuVX cj8ahxy8N2FNcrLGAuLWUCeMAb8ZIFhNrJCtWYU2AkBPKw3Qva3yLqp7p5A/yaojFToBKJFMSP04 2g1ojOBHw/bjMCXJBcGoKAhVrHXLrDgMyEzB+BAGJtEoBRoeBVU/zhPloZq8miVjsTA2jSMo0Bjr 6tBE4V0DGhkKjK4I909uY3WtN9aRRs8b9tjRxjGEFoyNqgJv3cq8KLBWGMOK4Gg7UcAkYVk/9TBh CjMKEJJtRv+2qSL0CxoIMLgyVvwolElObq4M2gZS2OZexi4nPsMmLMOTvApEcCNnl+ELhOnH1b9J yqcFA6ht7QgWW9gWUvGW3xXB3cnHbSSuLirkl7CtIFuj6TQv+k+hiPSUvOnXaSXBC65TgrH+fVdN 15Q7zxVGtJIH8ycJbChEZvkQjxOk/vzOq3EL8liGrkJnvvnGMpGRklJg51rUJ3Xzu6l88pwMs35M F2TdGadPxmkYmVff8/O9fmvr3PfGa3sok1qmkXRlueC/wpi7DQKBn1/RmrGO8jvi04917relzgWe rHvzaLkqVBpmppFwLY+Sd6/l20wP/lLDSuGKtu1WK0EpGXmpCGCWj+GoLWLbEazSPkz64Y9hJriE UDLEmGD8efY4aTUd1pXtVj9qaQiA2IqNx6unPJBJwC5sP+BPI0Eem+yxnXkaBOGRMyY0jJTS5mx3 losqmBOkGXgiZnVQx+RjjH44zvs8QpIxQ8HU+FXx90hSNR+Gec52Snk0op3l6Q9buM86Jgy3KuS4 zLi9lf7ginsPYQ5RxS0AKg3Uu8DPSHMFZNRGhELd2DSnTSjTS4qZjJyUPR61hXSOqJHBGGHbEcyZ QSK2AGyMIpyOM1lPKOjZVl1JcSsDeXRlpgWh2OOkpjNajQHkesSm7cBtFFl0fO8R01iHzHJOo5wA rTRG7GJUwL7cS0s+xz1qy7FU4VjtGK4CWhrYpPPl9o1J5qohvusgj56lbrveUfXS/PbhLoMhIJIC Of630o5sD9Mpg2yLzHNtpLdV8AP3VP+k/LMtYjtCGxcpSOMv84sfNdPq+d75bRKQZZQ5RNshjtme M27+jF/7DvT66GG/qBorE4xjjqmOSfbhXlZ6Jgmrme0Y5smCnwR4y/GQ94IxpsNxTyDKfPJh5Uoa VYsV9LWfq4LuTGh/tx/mmEmbzdUNn+k3E7QlEpYaaEOoXI7ZJwlzmnFQ5/Y5qY1yUiW3rBLa1gpD XwwQpse/8E8Clk6GNqzKn/zrvGiWzGO27QzPFqOv7AE17jhS9s2A0d/7/g/j5ptviWc96xnx1MOO wAjmfQjyr4ojDj88NmJE9ZNnn8283JfgBL0n67sSHuESLM3emAmwkPeVeMtl6o0JrL61v2hbq9ZP thPSVdJfruV725qUMXjrvK4DwdiuNGr5xjeejJHr7rjooq/EV7761bjsZ1fEUUcfHWe87/2AE7fk IpEaWY5VFaqmtfq048U0lHSU+Hf081c92y5og0Wl3nnctpJjvO6ON9XnxwpXrmZKCMR/LVVaXcWl GDVsZIzVv+GWePVhOPr3571k/KZpO6o++72UfaQab0mr1x2/s62Xb/IdzykcE94OMWwXXXnwWxcv /Lb8dCtghenYjninvxJnbh+t8VC2lJT35VXtN7r5XK7Fb238+XKHP1P+cN+uDnh2Rsv3pC+J8Es9 lLh97/3/z/pP3qdG8CJCE1ZJk395Nuclr4+8qNw5t0qmsV1NI0EG3Eo9F7Cq4rvytwAL1oWABB1P ZmzKS7ExMeXwKDf6UchsYdhT6K7dyvEo3sEj2GrAyCAoUUtpawIH58cCSuR75t0k5pXyLMjgfKwQ W0CJTuYjFxgejdSaE7DoQJ6B6aSQOGUM+UcNztksEGjA0VM6erC/VGgmsoha3hrQloqWhHyEQIUx uS2CAsfgZiUvCujz+OUxmrxXE7+WnHP7zAdCuGWmhqTgwY6ghN8o4Ot/O6Ahv9m+3Er4RaD3u3JS h5oX8gWGIRjRjFaF91LaXax+XLZ5rMQIsWQ+JAGIHSlBiSp4kfYl8FuAC/0WYKMALzt+b70JjuQW 1pqXpmczZVMWPcor/SfBS0gCIA3WY5WyPvBTtCJqQYhaP94LXsgjlZNXtMu2Dd6i0BZ4rzmAEQ2y D1VQwu0d46R3DthAoc0oMtSCFMX90a6ctFcRhpipsjMqkDTJIMNkyrzb5BRWtrGCIzCxgSNDxmHe i02J2ajxtgBEeLSd+96dUVsQfp1eXd1XIGgHGdTegnu3ncdVp1al1yPaVN3UTaa2i4LzWE3BBo2W SU0wGg317ZyeMR1gYwEMBWtcSJvLly9nPGAfOIPJjE5VgI2P2GFaZwJUuBe6Hc0O05DCF1YhXY0b IB+kBkCAVT0ZcNT+hzWOCXCxefMARt9cUQaYgIk2P9/97vdzj2oPCFczgkcHK58DW7bFb353ddxy 87Xxh2t+F4cd9uR43OMeH3vvvoTWicBB/gQT0s4BeaxvQHsAVNOBzLQ0ICyoxTGuvQrcG+kETVyn YVBTkacewECAQvXtIQSS4S0TsXjpUsJkfzyDZm7bsKypK6CZZKSU6sBS0Jxg9bEZAIbyxe48e6IR 7BysIdZSAaGs7w6Mv3XGg+vvjXvveQDtlNUwwFj878dQ0AR7ydu7QE1ZtY1lZKfSPhTWvFeINF6Z YYXKURjhIggbhwyPfmWIbUtJ+LMdKZT7zp9keH7rN97740+6FX/lHR/lhD41WZon/PqcKpmUaxPA Tv9QR+y698vjzac1xqePuzDuypipXiebarwygR75WgSAEq9pLGS6MmzTBBUBOfOKm3HacH023Mwr 9/oueclw82s6bIm7Wj76N3zzp8Bs3cpY+r3q67ZN/WRJcS/LaZlm/Nzr3zSV52o0U2We8VXLqLwr V9+ZNuuyfG/dCCb4nO/4trwznuzZuNmGi9HTkifD1a/pm3Ij7aUs1EQqYRm2efYns0CCK0yP5chP RsOr7pLhlbakf78vcdjPWtAw2qZtFMcq+r4ChX78aU9Ev6aD7pWggcd4bsMvIjZR0P8YHxRA+SpB CwFY3V2hT6CLdJL4CnBhgjJ+QCXC0K6IQqaxWlf+jDfJK99uZSwRrOnhqi2cYeuQXwcq/h5vOQog Onv2wfGK4zvixxdcHisAOC2rIfwLUDYz6QyYB9LVwIr3NIT8ZstHIg5BBZnTPspgG/41nijymtY+ aOMKWQrs5tG0eWSo44FH3ip0NqH6vQXh13bm0ZKCBfWuTiAUtVM240xCAhnGpcYCHybQKTvXpwBN 3sabq8wPbmpJCRzkmEMZtlKWSxnL2xF6h+oBAknbBH11K3GrWZF5sARrBPtJJvDBoc74t+fvFQNr 7o9L7lyTJ2+4ot7I2K6GxFbyC/tBu6zMWwIl0yh/tZBGkykC1KpOzmPkR40uBT3HXtPmysIg8wcx k2p+tjfKxvG5lbCyPMizQK/hOt9NAixl28JPpj3rm+8sZPxmGDKprGaOWB/UYStp3kq8Hmnq6qbW 0vMkDsOk3pxTPQI6AVvj5XsBE1fYBEKaYRynU34JnBgH5F8BfvOhPxcTtA9hGgTe/C79Ec4YIFqd Z5bSXu1zttEt+LHNuCVuyvgroTagpYKCYAJIHTJ/1OMQeR5mRSaDxL/H4zkejAI8FabeuAzvbyWt dW9Bw8QjXG37FY0J2jj/J+m4lexQU6R/iqr3U/3NF7g5LjquXnftjbFwp8Xx+P02xLkXfCq+dtFF 8bkLL4wlWJV/x6mnxoc/+p/VMQP+gLLbRj8wdLJcKeCs0uqcZNiPQSV+04ZvfBnK9t+VsS/HO9+S oZIX32WbMuJqnjQg3oj2kqduHHvsi+Nf/uWl8aUvf4mTybA8v+tu8YUvfSku+fGl8fCqNWiFstjD t6n5VY3dcEpJlfTxairOWreSNt//rZSinX0ZMo+Wv4J2zpG4FY0E35UySM/VP/r3J00BBDwXoKLq bepSAAkdMjzCJYDthGffGWaJs4Svv0cLNwGB6ruSHr8tQrV5UJtOKmF6LWEVt6l4qvHrv7hVuLBH vved4Zb3tX69z7mQujTsQrV9rixQlHe11xJm7bfFzTKolPYjaav91nv9plDO2G/seVwqV7c+qBEw xmKWVMIxTMn4/Pb/qv5LGzPuqfz5APlc6qU861brr5SP1x1BCd2s/wJUZKD8EVTwZCnLwS2PGsbs 4LlsbRO4SD+MzdIUkOHcCPlObQpLzNOgdiRBCLduqDGhtoQAtsAAlt1iPf7nwCMU+xKCGn9ChJ0a Es5/1Tkw/cBLlHHBZ4VyLU5UWnX6yD8d8gTEjyCTNh58n9s6uHbNQvuaOen+2Bhs3rTDplaFIEU5 iUPnmdWtHEzWPsbYIO8FHHjuTpfKH7cVTG2XUFbDcGOtrYjiNQGV6oNzYdluUd57LeBBcfNZwEEQ o5DfaUhSGif3vQAPbolwS4floYCfRpar37rNQ7eqnkx+JzgiKKH2QS+HOrgNZZ7gBX61LyF51baE 10qtp3P+qdWmMI198CtFU6SyIeMRvyVtugjomPeNzM2ZJniYRyM2DGdefFcMXHpfDGF6L7m95xHO reI29Zd0NQAECVyoHdGzdk2+akZGF95Yz09DlwWC8V5qBwuoR4tGsKIL+2GSgESxM8GqVLr9T38a FXST0WfQzdVMmq5H4Sm0yZz6zskrVxRpwnbqLRjsUiiQoVBoYDGeDGAdHcbZFczeTapKR8ybiS0G qn8zx7ypjjqT1bL26bOia/b8WLlmVTJX8DhE4wrTJPt6UU1hGGxGK6KtFYwHbYKGpsoqbsXgJAIu jO41198Q69Y/FM989tNjn8fvh/EP9gQTd3Rujo1bbyeNHCtV10YhYeQPOxfu/XdLR1sb+4aHaFBM +mQJIRz2k86gvYVJ0uFKY3ZTtlHIkP3hD9fGDy+5NHpQA2XZCqMr7NUmjWNNCiYwwVhBv+76O+LW 2+6LhQAqrz/phLjhpltzX6tbWAaH+mKvvXbHCjzMLhXWghaFhiSb2DvsFok6VIRTkIJ5HAcMGmVV UmGoHxXbDWvWxFz2jw1xhM4Afnd9XBvfupoOEEBZNrLXWGFRoSNbfj0MJA13AFBjJs1mYhQDLCOk ewIGocrwAIlgA6GRxopxN7Y63Ll2PQwlhgCJt9ftG1th3AFMOjiGtL3d/ck3JCNf24hsBw5UXrXz 8KeMjUIQwiRptCxlFGVwk3Sz4KuUmha0JwVxXf1GppdMZrtL5s1vjIv3tkXfl8kmJx7c6xAUjGfr VjReJtmP3sSJArM8TcG2VdGwsMwKGc4wq7S2ccMwTBn2FN70xL3PCilec9Lim9q8KkAooPutDIs5 VEBw4Nf/jpR9DEeZQt+rXdPYOJjPbnsp/VBhUYOHJV7Dtxx8Ngyv/gynuOvHd7XpK/Hr5q8wwvqz rDTEZ979lXLO7TJ86ApmCd9wMj7jNZ5HrfNKbIZjPko5GK/fkLiKB/7aFhMAwZ95NR7D50/6E5So o5+oLm9aJwUJMr+VcjVM82sZmk7BHIVsV2wzrmpMggEj/CTrkWgYSDHMaLyMWeqMaCODBplxtJAW 06AKpvZz6umP1qXMYWoH8S7tehD/OOOEWkm5Skw5mie3BtkG/Gaawrz+HUPND5E7tszAfZuTCvdz mOC3MC5tG2D8BLhsn4EqNhNFXQtjIJMBiHGOBWMItN63I5xOkg8NQ9YxLtcJIhAXlZdgBYhDCurC QaZDA3eb0JLQGKNItiBDPWM2B1VgkBK1fQVaCwV/hpM2BUizDI31KEghGVbWGVfzNkV8m5rrljH+ NT7cQr46052vSOs42zZQ6mMsxrjrBECCbY2xYZy+l4AOdWbfT9sZ3NuPvZ9gUtOwaxvlIJDiGF2H BpnHCzrvbON7j0dWW8GK1fhjC2or2wDMK5oHowAi9EFA7Y0wDbmaxNgog9DGeOC2jn4YPHKAC39p Y80Y3upgNcrtMH1OXtRbNhreawCUgsltf2rz0UD4hjQZv5ptjsG1RHnQibM9zoQxnOB0pSa2VrQw XzJ8My4THuEPsm3H9t5J20kNGedSwpbUarCfelJGHvUoM2v5kJ6pmiDvti21AgXczJ/aNIJSlTrj aGo1aNCs68e9iflmgnDcRtIE89yCkNFEmVoG1mEH82IFZiO3zDlSGTfMkilzZaUPZngTCxSF0ifh /610xBHPiO98+79zvjY/Uh31r/KBec1aqrqni4mZIsug+oy7oIYNs7trblx91TXxs5/9ghW4zvjG Ny6O5Q+tyLHjZQj6Rx95ZHz3hz/KxQu1WRodj2m/UknDVBQVx+0ey0PxmynIhJriShil7MyR/qqv a8o0v6oEVb0dZKtGrsQCbDlHbaMvCLZde+218cD9K+LEV50YPwKUuO2OO+gL8DwEbvPTECj/KTd7 c2UMqARs3LzHT0lruTruljQWv3/L1TG1UO09g22Ot7XvtntfXtRcC4hR47TdradKGEatUP7nwvxz 72oDznhrHbj3W+Mr5Nynv6LdUNy91qan1r32/pFS+lMhuvh7tPTWujm/CgL+T/E91vvasGrvS/y1 1wRdavLvO8Md4cSSvyT8v63+j4/v37ZPfGiPN8fvaxNTvf9L67/krVwfJajkIcp7r+apPOtfAdTn 8pPn0N6XdaCbz+Wd4IXjSO22i/Leq3N3amHWJEQbP5LHP8rLSNZtAXk5IDvdFOQFKgQsnJ/XcL+F rRWSxjFLnAlg6Mg8koK0mpncDyjnQBpPnm4YNdQhX8GcIJVVdre+SvV+7w9KN4R46d7VnPi3dl1q S6QDfzx9ynm2iwXeLdxLeSpHJZlpf2KrcyV+BhnXammCrY9Sw5yumE64Ql4ae9SuQqEevrMctHUo uNC7ek2+Kpofal8o3NeS7yyfzZMkgrAS3MBN8l7tRQV/45oBWLEZoKKftPmd5Le9nByiH93VWBgH HN6MkK6b2hT3rVmdfieHpsUGdw3UpDlfVP+MIeRr4LNQL3EZT+YLGyFFe0SQQkqgoqSj+pHxqyEx SRw91fw3YtPRtBQNCNOk3axO+qhXW1B5bzBlscZ7q2Zmlc/zWZBIzQi3lM5kDu3EbQgtmRWWKwbG BZW2ocV5B21qiBOwHo021pxmpC2svuFV6U2gYhFAxQb40Qo/9WhfP+LW6AqLP5lUjX8NwBi6/zpX LWSqmbzcUtHO/lq3SGjzQQOPg9gGUHDQANng6BYYUgqI51FWV+AqYTDpDAzknvTQu3FTLJg7LxYv WBTzd1pABW6K2++9m4naEwwQXDgFYgKBUq5tLo2zHrsKqs6OwcxOn8FxK1jWnsNeqp12XgRzNi2u v/n2WLHiAQaODlYk2YftShSNSLsOC5c+HuaDFTUqC3wCwUXBRyECQ5JoXYzKdCKgu28/BxgYNEYM BiWYRNLbzArsw6vWY1Pisvj2d77H3qqBmDZzNurQCAQUtN+68dUVKgUeB4xBKu2BB1bEWedeiLp1 fbgqsyeAxPBIf9xw860ctYp19Nmzkvnv6JhF+c2OhTvPzn21eSY3gxolTbBqIGBEE+NvFp9bElqn t8Z0GMY+BogZgBEdNJ5EcOlMfpPcTnIdHIfTxRaWjatZlUVte2gTGhB9WJ+nWPFWIeqYMmvjzN9R wIIFs3eOuQhI69c9HHf0Iqhv2xJdqIwK3HS0el42wg/l4+BbBFrzrDCo258SAgr/WqZ1YkCTFX0i HxpmEK96dHiUbZIU3Nzzr1aJhhQVJBXARMDtv5Ryrlr6jfdmQUbdQb4wVsltKfhCpieLga0tzaib eMqBgq9lpX+/k2TE1A7QfwrOtm+eU7WZ9ynEpk/LrcL4Vx+nLn4nKOH7FJJJgwKGWkC2IWkqjT7Y v/BTyiy1Tvg2Cf+u7FumKYjXfF8AB/2VPNgfS/plLEt5+G0t6V+3/I57U6UPn7WnYPqzzIg3ifS5 vcf3Ja2+tzz8GVZJf+WDR/46rammXlYGrM96hLF22u7k0JZU+9a36c3TT6wr7l3tzXrhvlJ5lIkg FuBZexdGA6nH4S2bEWhxduWXtBWyHh23FMpsR63sGc/xx9X/at2q0ZAgCWlrQHjZxkDvtoZJhNYO J4PhPo4ARWvAMYiwFeobiD8N5JWIytV64WdeXe2wLXpUp0yEWzkUBAVGsn2Vb7i6/cJRw+MdyUHm QT+97HUH4sgxaggQsa+Xtmr+yIv1S2ETEQAM2yvcBpVAiar7hKW6vEKqWhWmO9OOFKdWRTPAxzQl FPNBHfcxPs9gUmxHBbOFsulVnZJwnZgVwi1TrSO3kR+39Nl+J6tGqtwqoPaE27S2El6uqBN+Gp7F AHGXYC1aX25Ba2Ql3cFIzRSv2wBU+0mP2hYartQWhq8mqfMCSlieFc0j3plf84JbE2PPDMBRgR+P YE7CPcky0C/tQdVbhThXrNwKYnuqJ1/azxkn38ytlC8rIFzVjNEApKD7Oo8VgxmrAywWlJikjlKc MyrisXwEduooL/uugl8rk7JbUHyv5p1HjXZw30K81mcl7bw2kQi4LcyB5tv+ahlnn6W++ohfAEoQ tABzakzY5jQ26VjUTvvMPZq4GbljmcYxXdkXYB01XcRkuP5zm4eMieCGdZ7HmmLrSGHbY60dl6Rh vmsX9Gd892x7jxpNg6SktZ20Oi4I5A6wrUNNF+C5jCM/5o8aH9rCKMKafdcxIUfW6vj6WGNECePR rs/7x+fFD77//RxjHHsse3kDy8gCLcVbefBZAKKS/3QjUMvd4tKzwKLfaFi6lbnOawOg/nQEgPnz 5/K+IR5a9TBaGptzceWwpx6G5uDdGNvuSR6hhL3jeJNpJ9xa93TzjxHuSMWNcuWjTHPxUnnFwgvl nETaV61aFc997lFx/HHHo415U1x19VWxE6eM9AOovuKVr6A2puU2lTUwQRzbswAAIABJREFU7x1s 7xmz7Vn/BmBjp407PukmWGMc2TZ5Tlcv+c73FTfL+/+KSnv5e+MTGNiR/tqw9e9Pss3+pe22ViC3 r5b5fsf0/DXPaia4KFDC2jEvPju3SQkMKChUyRX92jTpvOP3xe//xnXH+P+aMP+30vXX1P9jxWm5 FW2YUvflWvJUaR3liXbCbS0oUbav6UOQwWOy9VPI740/t7cxX08R/gooYRrmcSKTWznkJWq3wiUQ wUcCDnOrAuQW5IBxABBJwdntoIr5gg/llIN0Y04YEACHCiAhKNFRxhvmCgEJx44CSKRn/ygcwwNM sEA6RQi8M5hve5DdtmxSpH2ENILJ7JgOPcDijUxPghJu6ZA0jjkNHsTnTdwLRNSjLVqo3Ct4SwIF KZhzr+DexXf+BBKkohlRAASF+k7Sa6nkdzx7fSwyvzORQ4u9iU78KrxLJcw/KZNqYEW7o5+V/7UI 8DlPU85pvLNa3lWvUxdBibmWRTVNBZAwT93MwzNYgNbuRPQAVlTzItCsDoLPaaCT8pS0h1E0PgQl PJGjj7Tndouqn4rbI0Y75Q2kWj+dmDUQaJAEJGpJUELSrgSCNGVpe3CrS1dqSQwV8IG0SW7TldwW quZMyWfFtfJXkELbaC7WCVIUA961fmrvG8dlnJicWtz2wHUrWwcU5pzVFLZSPRvGSAZflXMnNhkT hQxXwhXYXfmuQ1V3AyvwQwv7Y/bMufHHq6+BwWqL/fbcOxa/fnHMxHqok6nG2Nbib3MPAgvM+bZJ hBRWDhsRDtpn0Mm2YlwTxnQuQEQnaiNbYTBVd732uhvi0st+jvbC5li9diOMxgw0Gu6Ia6+5Kxkw VYjd7qENjFYMp7SgvipYsdtuu2NrYk50c+8xPSKT09n/3Y6GhRoQbQwcuSe9D+Gytx8NiJvjsssv Y4XiOvIPQ4qGB5w0QjbHzVERE3I/MDb2aKcKVzc9dlBV33XrMWiCZsYwZaLhsRmoHTt47bPfIcTT EOtA2pY/uBIg426YzMBI14FxyCGH8C0CAKCMqtsJoMBUuuKDpEMaYTBhtDR62N6Oape8Wo4mJoF/ Mqc+o/KxeMkeyTy6xaW9rZv8boy1azYlU2yls5uFQWIUQ2dqudDQOhfDCKNu3DIDe3vb4p47b2ew xkDawHAaCFTYdLAWqErAgIidmGwTDri2ge0J9eWxxfHMV7w3zn7vs2LLzy+Ij37wvLhslaveJFyB qUoyRk7G/lJTodoOvU/hqHjkqlAsA2WcggLJmJIuNSwqjFeNZ9bCR2G007q7q36kWSDAanP7huQ7 jz4tTJlhGGeCcPj12XgqfisaBz7bH8pkZd793nxoV8ByKmnxvjCvueJOeLWr+fYvjSbqX60Nq29H EhgcZVVXptr31ntDrs6SBuJUONtRY6XEb1iWmf5U1Tb/pl03238jeR+hH5onc5nx806yjPUnUGN5 lDQKnJQ8p8eaPwmUkcB6BNV5c9iiQHvZ9ahj46iDFse1n3hH/HB1pd4d7gQT1AgpdU5BZR1lWlLI g0GrOzzeev6Z8W9PWhDXffLEeP/FV8eyIbVF8Jt+KiVWyj/TTJwyDZkWroIpAhaqZ26j4U80TQ+P N3J1YfaBh8Uxz3lG3HXW6+NbD2k8EQHStGXYCOCUvaTg6Gk7jcRrDow+t3dw4ykaE7YnHSHrWSDP ulebop5+kkaHKENtIPTivwvwYBhB3/x7dauc4Y88dGVccI51hEzLRDxO33QcoIIqwhljoFoWVIYV GyNcNRxpxenkyjIIc+7htG1HN7Z9GDNamVDQTUj7Ajtx3OZaBLHGGM5TYTpJt6p92ywnBiNZFNtk 5oUJzrrX+nQdW0fUzpiuoOO/OuxcYNR4BBXFzo6u+IeDD4uhO38WlwwBlDiBUSaCO/qdIA+2H4Xp ccpDWxiZYPKlwO32jQQZMlLaO5OlAMahT3tBPHWsLXavG4zfkvcxjPuNZQVgJZxysJ5zdQiQIrdp EK4AhHYWOgC01brA/GpqGhi02zfYTJfj6ebBzbEZYKGLEyvGcaeDMS45ZmAc1P7Mu9J3M1nkRQPJ rfgV+MijkK072u14Gz+3P5gfmoHHuHmcqGMlNZbto49w7eP9TOYTbkvQo3Ukcasmi6tahidg4DCp nRRtnUj6dCtU+3ClHPNL64l0Oeeo/cBtAkMziVvbGhuJsx4QQ40Tj/LdQtlbJrJ9GqXdyuctMHIt MLmO58kM46ZWhUC7INs0gEU0hslbxmhSYt6CnfLahX0mt/H1c/qIQEUhVZvHmVv+Wjro0ENiv4P2 j5uvuZ6+SLy0gXqYVNuQ5WX+siAMmHkyt19ZBlBlzMMDz/pG1OcWQIz2S4NmPMMoNiqvd9x+dyyk /x94wEGEUc8Wj/1iyeLFcfjTnprjmuF8/KxzASzW5ik2Bu846Jjnu7SJkosaGe3UH9/50x/TjlVa +Zk8xzafuGZqbSemjb4pEGU/8Vhuxz7L+WUve2mceMJx8Y1vfjNeeuxL4slPPDTOPe+8OOzJnMLx yXNj42YNjQN6Aaj5jYKxY1QlxkpZVMCuLA7cC+HH/5YdcVYMaJMvTosZl1H5O8mFIclx2PFPSjfb k33VOUV3f9z7PL3K1I5SF0WFXpDRNqSBSYU0wzJMf1IRBH0uYXp1cUdSI04qwnp5p3ut8O77BDWp i37iybTxXW2YmT7CLoK4V7/zVxuHWxzMcUmT78yHYIN5dz6qaMBgJwi/5XvzZr9Lv1wNR/+ZLnhZ 48tvCU9NMcuoxDXTIwEtc+JwMWDQbRXGWU2baSj51c0yLWXgs98al37Ms2mQytxZ0lbK1fqQpkRr 4jd/ll1Z3fe9ZfD31z971dHmbYKXn8aYZZj+JNMqlbLOeQC30pZMj1TK23vf7ZhOy115RCrHfua2 DJ4tZ8vI7QTj9NM0PssYWuq/uDv+yX8WY5guVpT9+r7z2flCP8pN3jteluNGi7uGJz1Zo505Rd4k T9lg3MaSAyvaE3ltQtPOucUTOdRKaFywIPZiS2A3Mtta5orNaLC7LOA2QUnAweNBfZpdzecYi536 008j2tzSKHE2IRNNIjhLdazE67ZlyaLoRuYp7vmy5k/HwoXhTNDMgmwv9pEKjTP/zBU44TqbNrKZ QUehWE2HJOqnk7Jt2HvvqbLS3TLWCHWxHzGXOb9oRnRTFpa55HtpjOdZbOtXwBdAUONEmsV2QCk1 XaptwXdduCvQS4IRhle+0Uh1Ib/r4juv5VjQjWha6mdWNa55aLRuntYYplFAY3M13NmEO064DdSh 19mEkUI6gZf7OvyWbSWWiekwLu1GzJHPmc/2StI7m7lPI5slLb53C4d2sqS6pbNCfq5QA994RGhb tR51H8Kv7VFbi5K8nPzffA5smEsb2MRBB7r5vpvFfkk3SXf95DZPnmuBQN1m7bwot3OojaEGhVSM XbbLA0ILUGDYqb7SX+sZf5L3yzcR+y9dygJSpU4/X3Xb8dJopA4y2TholJurhjz0qLAmU6maqNOX E7DofSOq1p717nYELc5Pa6WTwpAMcxLHlg09sfHhDfHAfQ/E4/fcHyOMM9kzS6Y5TnQAvy00pHZW NwUHPNpPob+5uR2tgp0YLOayZ7IvmfZ1GzbEjTffGtf88RoqvzcFtHaQReYS0gET1+HRe2y5QGAf Y9WzjlW7weGeeHjNBiZ71ZRh2ui0CoQyKUWwFRzpYvVw3k5zEwHsJB2uKC5dshQjnRvjq1/9L9J+ L0fVcX67FQtDOonQX9/AyqwCjBO7AiJpyBVEGQP+u8Wkg+PvPHp1w6b+2NBzE+kLtngswCDo0jh4 3/1i6dK9KTuZlDFORdiQ+8QeXP5gzJuLmi9MaRsMcCd5bAYcqPNkDkCEAcpUVXX51040VbTiK/PB IzeEpRCevA+rmsMKyABN4Jdz5y7irOIlMbwH+9/IC5+RSD6hzAYF0LyH2VUtegunpnRiO2PhokWs nKHujRX+++9H8wLk1DpPYiIrk47PCqqPStN3jvnTH44fffurDC6tseu+rGSvwWYGzNQYaqpoeiWV bRQy+jJZkoP1Y5FxC4hMpafGY9P02TGrtbK6NzGGCAIwg1g+5Vfr622z5sY8mps0OcpxfgzSnoSQ lZeu3DnRMLD+OapNoYzro9Gjude6WXYaF7UMHosUMLeNN8VMtJRaaMsjA+yHAzySpkr+MeIvYWqd fZR4FLRKuRl3L+pwQ0ySxa3491pbx1TMds/W03bvaz6sb9kzjnz72fHVtz05JkH0t21dHpee/964 fK2eKvVr3IKMHp9Zwqktl6ngFu8Rc9b9KN7/6V3iqXPnx/SZ1M02AMBJNIEIw9Dsz+VbwyrtKfNE fh1AdR8F8R2t3zmefMLH4pv/eVS0MpAObd0QN3/zo3HmvaywN7OPnvSk5g7tS1LISOGU8nM1O5mj ahnSbRiM0USiLJqYWFoAOHUzb2lDx8mYehEo7XRVE0ZHQdVTFjbStix7+6/GMevrmQixaeOq9mb6 +STaWlqjnoam1eZ+TqggDsdg7WdogDFbK38UtgSY0pYAYXtkpfELdmjdZxyQ1UQ5Ho+SjgaMVm4c YPLvG4hm+wYC/aDgKcektdQzRtJGhmB8KpoQdBKWbxxXGiiPsc7p5AcghaMK0RGI3fb/p/jCCYfH fLZNDWCbZ+2dv4g3rMHWD8skdcwH432bAJzRAOF7gZ4Owt7MyRtDjK0D2AdK9IU8eTxnDgXZBxjD SIurOd2A1LMRitvWY1i5qzcGN6yJftQGR0jHdBgeMhrDlG8LNg6MZ5CJMNs4ddDO6sMgWyhkhgYQ RhX0t7E9Q/tHE+QZu8ixcuMG5gMAeOrCo1MbqkY6+bxCpG1CrRPSN0OhnP9bqXuZdtuJJ/m0wdhb p2rdaaDWlTKPkXXLT7tgFR81M284GZvv3jVr01iUDKa2lCraDYAQjIlDpKmN9uRJJ86TeWoIbcXJ Q6DFMnKs38KzWg10WhuAHSDzvY14ZzJPtTJB2L620r7VEFR1Zd2mDcxFm9guxHHDtmnC8ZeEQU7D 8gSaekD7h/Hn6ReDaIJ0K+iRJwENAU3BgULyCZIjl8y2DL17piWFJHpB3v81f9ySoEbALdddl/16 jHHZsT4FEaKuc57jXwUwqqRF4brMGyUuy6r0/zHAfmmEem+i/V/x81+wfWpWPBkh/7obb45rWHg4 9c2nsOVvZpz2rnfFia8+MT74wQ/ERz9+NnPf/bllaJhtjiP8UuAT/XMFoLqaVFMkmS7LiGZSIcpV PkE+pZYEBQRVBFdSIHKcoF5M8z777hPHvuSf4b/Wx2233BxLd9kldt6ZcetJTyF9787FArerWh9T 47bxGKkZr9IOUVbLjCgzKf7hG1pUGun0G+aWv5dqBUXH3CIMG7Isr88eWatm02y2NPk8JXjTlu1b hRQMpRxzeSdvanvXz79evCHOf07xuSwufM6T4kO3VZhft4cVYKFW4FaoNk3+pE4EpulVIAXM/09A iRJ6AirWVZVMRxGMbfO2deMxVNOabYT7kpcCePhN5lceljQUfyno0s+aZGhNm+Hzvem1hxWhW/dS Jt6bW8ELBrFMg/nOb3knlfhr06q78fmbT/kLno6wvbrEW74rAI35kabi5b6AF4ZhOv221n8p+5JH y+hvq/9Ke3R+d+tDbf0brekoaSnPBdzy2TSVshNYcYuBz6UN2P7amXvTL2OMeSygRDpW/wzJW/mr 0o5+dgQlagEHPymnwQlS+G4982COl1WBspm4BSUE2FtpAnKd3ms7QthgM2O61Nj8jDj18yfFobE2 vvXON8cXV8DbIzSO8q2gRBNznaRRzMIXqjk5cwcjmYIS2o2Y07EgugE21iGf9TJHzOFbAQmpABUK zY8FSuhPQEIqoMRMZIZtrKirmSGpmeFxkrOYHzeTTgVkVf/7ODyga9elKUArOD8apS0lw6As1BrI Uyd28KgwL2Xf4758U7wpwAtY6E9QQQCjaFlo4LII9YIOtZTbJCxPvivvStglPM4Wi42EKQlCSAWU 8F5QQhKUKCCFwEIDfF8Pizm7EL/pSpscXHck07se91ojm8VP0eIo6dddEEFQooBiPkvlOR/4Iyih XYoCOIzTHmqpgBK6FTDD+wJK7AhS9FK/5Z2ghO/Ls3YoJAEJaTryZ18vp4yxy2LvuQtYMGlBBkWm rS6+pKcd/jTqyT3ReawdjE1ZhZS5FpEf4ycjJ+OrWzORCEyoNeG4LTJeDyiwdPGSOPTAQxGgtsWK ZctiXvecROc2wfAMIAR10Dk7ULFVqGiiogQDFszfOR5ajvbEJrZ7cKzZihUrYvmyB1EXYrcPxjRG +E6VZRHHWSB/Dop9NLr2draNEOc4k2ozxh2d8CuTdQVEmMD+Qz0ztOqzMqW58suE7DGCI9t6Y+2G dXHLnbcBcsB0kSe/b6ezC2L0Abw0A6Y005lcuXHl0pUF1iaQr1zpJT7ClSFwxYMg8FfRKPG+HrBl mqtr+HUwXLN2U3z94u/ETXvcFIcecEDstfceMCF7Asy0s5LLXmcYY+0VLEQA2wYQ0YeaUwO2HmAX SQPGU2CuaR4Zn2rrMpKOl3WpXgGDIbPDv1wlagA4YUVTQVCmaJT8Gja+k3ex7AkQgcEJkG0y1OMg QtCatasAoFAjQntiG7N1E4igIJphZ4X5XQ2Zd8tAJkmqMIxVD8MPxZotO8e73n5UNN/wxXjHdyL2 O+5t8a8LNsaln/ps/B5+OInv3b5hvU19b5lSB4JhU8zXlPdSx1UHLySvbe6u8e9nXRKvPZTJ1Hyt 3xLLr/oxQh2DJO/rAGK69n56vOOsz8bzFzmUsVJ8x/fj3Hf+Z/xoBYKbKvC4VlaeDPQRKunaMS2P +HjkTkNytieNgfpd5oN7mWfDT4CL+vOdWzcUpGVK/ckIFJCiEicZqZ8bBzzn9Djv08eATk/Gip9f GO9946fj94BPBJLh/E/pqk1/ubfM1VoozyUH29VDcay56v/R69wVw1mx7+EnxZlvfXp09N8d3z7n 5Djt4vtYTWUvKkIFnyYZhn3C+i3xV8qGOqcdZFnpec3dsXrmh+Mjx+4eyy76NkDCrDjmjLPi4OvP ic/+6FaOx2KVgYnQ9md+JMOVskwJQ7V0tZdGx2bELvsfFx888+joGloXv/vKm+LkL9+HoNqPJgCr 27Rxy8OO7BaU2jCswyYmCSdIK9GTFgS5TKtbUrphELVQPcgYYx3m2EkAaaOCsAQuuhkf9Z9bxxCE LUMZY7eH7f3Cd8UZz8COzIrL471n/iAGdt8/jvnn42PeLZ+I0y8d4MjNCQAJNBpIRxtpUCh2G8Qk afZaTmKwyBwUcjuJwjTMDZWSeZuOMDbGhDi2x8Hx7pceGo/vvC+++vkfxA9X9sXTXvSGeGnzbXHe Fb+KmwZZJcfOglofBjesAV7AZ21b9KK5Mzo4EV0LDop3v/zwWAyYcc91X49XX/kAgN/iOPYFb4yX cGaU9dG/9ub4wre+ET/oAxBh61mugFM32sZQRd90TjLftCD4m17BFwHk7t2eFqc942lx2GxtHdXF jeuug/FgrFXoAhxqn9MdrYzRrvwnKq/wTl4zXMqmEUbE01Io4PzZDrxXkBYw6Oc46Q0yHcQtADmA wKrWSfqjAM2zfUDNlBYYV+1iqMlgmnNPLFfz0oIWXB1pH2HcNu50I0ysxSCsA+Yg6LYQmFtWBPSH AR2MfxqgiVshhpjX6tHma6D9Cm60otkgSOnpHZX8oG1F2q1b94tiYilaAVsw4JHzk2Vhh7KvsFEj DUWrmTKkRgsgnMVlnTcBcg0wj44xp7ulRKOmzcwdrp94kolAiMwzrYp5rDIG2jY7nL/Ip1qQI5RP 2lKxLKA+hCsFJxn9ImAVht25WZ6gCDX5wV/4R+DrOc85Ki5Gm+EWQINpCOAoO1SIa7Zv5jOP9ZTy ufJ2u7+OKc57+S/vK33A55mUiSDF6e85I9auXxtvefMbGZSb4mNnn4NW5PT443XXx+tf/6Q4+KCD 4qabbqQCJ2KfffbJMveYcGdQ6yvnxJpYyxjsiRyWX/rzSlLlHwRUVGny2Tna+Xzd2rWx//6Pj+c9 75hYgd2LSy+9NMt03rx5sWL5MrZ57owdretZqOmmDzVzWtnqNPytDRXJOPNXeSBO3SrlkumzDIww 3asFyXMWXz5an/INFsHUOrje/2Zy5bzUv22hCIIZIO1Ct0Ler6UMpNKO9F/ajtfyPIC790/42G3x pnueEbP+5Zb8bnz8gPjwTRviorNa40UX4aS/vFTmgRKuzHIBqf2wCLW9AIaCDxmPL6px+izfW8uI W+/phXe1ZNi+K+n1W9NRtmWYBt+pKVHyL3Bg/yllVMLz2+LH+CXTUMIu/vKqX35/Qrjp6jeFjNt0 CnAX6kVA7KUv609dF0WZEnd++yjhlG9LWKV8S1z/e/XvKMo8axsifaX+jV+QQqOTUpY1V9Ne7i37 Ui6mz7z7zjR69VfGK8vg0bQ9iv/UIjN80uH3Ai+2YMvJMEbUtKvyHgIggg6SgJVgh/Wsu1raakoY H2qcqT1QtCc8DptV19iCH0ltNcktHBq+FKgY27s7tn7vzfGMq54WHz58fozduzxgcWNswyP9yW9W 50YGAA7inyGAXwj8qY9w1bjWnoS0dtmDsWLlQ2hMd8YGnj15Q+F9AAB3ukAX1A+Ar92pWqpnPppA 8B1gTvF0Dkn+RxpCa2cT2uxpAJN7T+kS/O/JqePx8dFXz48Lzvw++ppLczV/2YPLKtoUzJfFAKbh FGOV2pFI7QLmsGLosmg76M+TM6SJqsZC3lM3bslwK8gstFCKm2GWrRoF1FjF+OORo8VAZvGbH2HQ shHh2nhr3/uOWpwycJmna+jGCRsTWytlpbHLcrpIGrnE/R41Jao2IXrnL7QRAQahuUk9SyV/nszh t25LkUpZ5AN/PMJULdzVfJtgC/360Sg1dcsL8AcBCW1SuPVDWssi52rmQP3NRydnJTJ17XYP/fSP rN/OHoVuHH4+pQXSRtspR4b6Ts2JYgDT57VbabtsUKmDb6Hxx6Z1NEQJYEJQ4s6VKyo22Cquf/K3 cWfOeXfWdKLrdCLkfpCOJFDh8DhC4U0nEXZQO7r2Htyi4MBmR5qLeuTs7s543J570Rhms+rTD3Aw PXo2cHQnBZl2AUQHYX5cBZ41uzt2ZjXAvdD33L0svoXQPoTF1q0emcbEq7ukenE3YMSsrooVcGfV bgp25wXzUpAYxf7EKP4rAg0DGcyb4AnVgIAAIzChgcuKdVwn6VwxyjENgZopuZl97LAa+FEdltUw tAPcu6v6t8CJ43gjQrzARU5AomsYrdiKSvkEq0rJkBBGRRCiCB33+TWzetkAUyiLshWG3j28Q6hR 3XDjjXHnbbfHokU7xfP/6Zj45xf/I1kaix4myE0b13Pu+goYG6zlgxp4uoSroYMw342o9bjCqS0O DYBWfjD92OGg6TIxUkv5nx2o7DdqYhXR1fB6OmcTzO3oAOlOn4yLXOsQAjSo5SBZD/e3heNT+/o3 8maA+u1hlbE55rOvde7crlw1stzb6SiWUdpVYCJOsIOyTaOThKNtEvehjxLnNlZSb/nZj+LSfdn6 MrIq4vnnxwcOXxeXfvzcuHF0BoNhhWkSBFJAbeO7iio0eh4M5DLJw6TfCcK2k6vi+GlhUN3KoDnM YJdTLPXWOmf3eMEZX4xXTnw1Tj352tjUOxFzdj0q3nHB22PpbWdhxbw1dtnvufFvb3tbHHznmfHK 99zDKmZTHPDck+N13/hW7Peh4+Kca4mTPf6umNtG3AJgf7BeW8iX9eyqaBFg7APe669MYt4L7tlO PHXBrT0ttAPBBicobQvk/irawgj9yhoRbJuOgEMlUB8cMQkgJpPoaS7byP+Cw14c//6Gw+LO0w+P Fy07Ot5y+qviwx9cH8e97ZsxxNakVvwOMTgrDCokmybLSiHbdPncanmSh1EEJN08Gtg+rYBr3kyr E615tI+UMLzXyKBt35UBmS+ZKQJJBs78apPANjqKbZj+vtmxc/vGuOmSL8TF147EwtnTYt2GzbQ/ LDbP0Pgps5PhE451rbHP7C7E28akUdLiFofcdjJ+b3z7Y9+Lw6bvET+5c1EceeaZ8fS+T8Unb7g7 htpnxSImRbUGXHUUmBAQMHy3HGlXwnqfwG3bKNsWeltByEdizS+/Gu/75XgcuP8c4l6GoDeT8YXJ nT5unxc4Mt8CTIblVhbVMRXMrHMZ/mkIkabRMpVpaNcSM37beW9Zqz0xnT5Mr087D7myTn/ehMDo WKABxC7AjE7a8gDlu2Bef/zye7+Khic8JY56zvzY6yX7xNZrvxsXLm+J/Q4+mKEM4RAEXXX8WUzg ecwn+bUumgB5J2k/dYwRk2ihDCr00Oa03D+BkJ4DGHWd5QKjtNtuHbFuxa2xZU57dC35h3jHc5fE 3m0PxleuWsmqxjyM62KcE+FtK2OnJzBlm6B+XMGfQZtctFtbzJ/JuN1zd5yzbCz2n7UgmvaaGc86 9B/iHxpvi/f/YQPb7Ppj4Zw949jXvT/2v/778bmN1kUFCGinfBS+BQW0ASED4/aOEbYOzt7tqfGW PWbFuod/G6ctQ8NtK6r2ez0h3rjXaDy0enXM3Zs2glZZI8Yst/az73UbeSdrMogzyZvIfDf1YTvr Y5weoTw6YbRk7DvZ2jFAW+m0bdD3+gcAnhG0PenCfiBz2URdtPgtebVftfDTwHM9zxpInUE92A7a 8We6s90DTNRR3rMob+cN9/4afxN1os2HUfKVR8xS3927YdyMMK2TDaRtGvOgx7463ug2TFgKTIIr Zszxz/Dms6dTJrOP9jMOYOweTg1Ia0+j3zkIYASMA9VsADLSYrtwa0eehkV49ttF1iFt1P3Gk5S3 zIjbfDoYExzHVQtfjGbPNIVZ0mj9KFA7Tuy+006kCaCK8nLs+BqvM1GwAAAgAElEQVQMZxFEHDcU RB1XJN3Lu3T4K/5oENX+8+rXvCbe9IZTyAdpoMyzfAjHOd5/WTh/Ybg5P+PXscF7wzR9Co0zUMHS sPVCVFKP/Icj0wZHF3yJo+O+ez8uXvRPz0fbcCHAxN7UaUPcuM8+2Jv6NuMh7YA6cAyTl8lxpxqH da+Wh2OI8Qi2mV4NS3s1DWnPg2//8ZjnxatOOCF+97vfxVOf8pRYumRJrFzxECDFyjjwoEOQVVA9 pp3cfMut8bMrfgFfRr+kriplQGiEVcj4Ku7UGPep1GGM+PFd5T2v/CCRCSWFfOI7h7+UHHz7N5O8 oHxjEcRtE/6KsFsbsFqptVQEXd1KW6p9X7k/KU574+6xW/w6Np+yw9vnHx8jn/l8Ohp/Bza0FM+N u4TnOFPbPk2vGhyFsgVX27FuCvF56k71noDy+0fLj7Vbm1fjcdzJsY14pRK31wJKVBCEiqDr96bd n+VRQBG/LXGWvKSbf3Ygy78AKL4q33lvvAr1J/xgOD57tC7S/XH+4XvHm65+pBx0rY3HsaAW0PC9 8RieVBuHzyWf5sFwasPyvVQAqcpTxPHfH47PPbc8RVz22tfm+GP5bZ8y4nvE22PeWYbGW5u2SjpO isvu2zfOesoH44+MY45df45K2g0ny68aru7GUch3grWbquEJPjuWW899xDMyjF/GVd3cwrVp/boE LwQ2XFt0njCOOcpYyB0NaCP0AVqDZyd1PHhdjJxzbvz6xRFXnHpK3Hpzc7zyi7+KvT99dJx5B8AJ Za32ZAFSBDVcz++rqtjrrtug27/gJW5Cc0HyeS2ajFI72pLKcvpbhbuk1kNFLwAhlXfFTdsTUl// AXHeN98Yz+H+ik/8Q7z5BnhZ5noKJzWj9KM9Ce1VcJZI3M14twu2ce6c+8J426pT47g7KwYv++GZ CvV5ekO1bIutCN8VexECKNIEi9raZ/D40PRXdZd/Ecx3Y8q2NetzQaFoGfidNirURLiLLfWbly3X KUnexBMvFPYlv1GET5ADYCSfGYPHNm9BrhrPcCoekb/MMzRGfFLzgrlwf/ASq9dipBKZnLA8ktWj M7XxMFk1nCkQ4LPX/vUbYubinTEUztjD4nQuhHkPyOLJIdp8sCwrp43hXq0D48sjWHl2ywvMtE6k my0/GzenbQ8B+Trcd61uw7zltpvTTzdrnxRQrGEsTFILpvp9F++EYt2SIzUIMFFu48jjtos8Ypx2 t4K25Dv9FXdtR2xh8YWtFfAk3CNrdrNFdwuLXr4rgIQGMDvh2R6L4PUQhOhEHm0m5SDNpKvGQCOT lsK7k5sks0C2UyhTsCrf2DllInzvTwHJSdp7J2/fK8woaHrV3c6o2rwDxDAokSdpuDDjBO83drZp 0zS8R4fGzZWQ3B9PmrQ74UoW8jthqY5qstQScKXdhBIQgblCUSEcy1xOVnIqJkwncrdBKFwYiBoJ kpO64ZRPdLME0l0/GYkeKpoJ+qx8gy/e6dcgjWKSCMyPar0OIlsYiLSTodp1C5oJubqKUKSqt3YY SnlNIuCMwxR5hBojGu6uumQqsvwmYXxchR0GZWtiVSVVW427Wn58muVueKX+/Nr0OeFQuaSaLlT1 r/psqqNbbtWcW0/NhK0A4LdNhk9d9lJ3vuuGqfV7VfMt68nJkejZNDueecLR8eyXPi/m1z83DvzZ Z+Kcd54bv1yL0NQh4y2IVBV87KyEZzlSE8lUa5zOOjEfTgL1Ai/UmO2pCN7UGONjF1o5z4ojn70k dm4+Kc554mtwpv6BAYDN2JbTiyHXmQBpT4hnPmuv2LP/9PjyM23jCJ8chzq7dW08vNfBMfybm9if T0dG9byFDqYByFzRJyTLVwTcshd4SG0D0tSO1pDtfwR1cSvZ9uQe9zGZe+uSuhY1F2hTJZ4AUpW7 jvxafk7rGmpV+yXLAn/aLlA7Z4JTVAYGZyLQHxCHHFQfd16+MMZ/+oe46spdo23xPPbd18UDAIOj CFkKzGk/A+bXYkoQhzrSLRlS6wQwxLqRfXXnitoaVCgjaKWvasXdtssSbaUvUIZpkI16R+rlRAf3 mzvAVCav6dOwIUFa+5nMrJs0zDixLO5dd3uM7H5OvH7h1fH5T1wfja2stgN8ZTpIn8bYGCFSyBCM qag1V1qaqvnJANE23DIwPHhIvPLjL4wDn7RbHHjIEfG7s98Sp33xF7GmaRZGcFETo9yGPEWGtGZe qQMaD//JyzQ0Urg3nySdMuU4p6Gb4+EZr4vXHrcsLvvyVxDAAFoQ9hQ6BLwER3Ily3TwESMYNUQd 0e4FVAXyBIxk/CwPQSYF1BbaxTCAaB1lNWrbQ1VtAi2nst/UcpwQZCS9CrhdCOQelbmJsW4cY5d3 PzgWx7/gxXnk8eic4fjOZz8X1zg2sK49vcMxgfGC7U+TtIs2JgUBqLUYyMutBiaQNuDKkm201TRh hGrS9kvfnKStOX6nAgEd6q77NsTTDj80Dp6PwcpdeuPaX/02zn1gVdzFuCez2UF7HIcxUq10kvlt EoByFMZKGwIzFiGgsi9148jKuGvbIXHC/sNx1XU3R3f7bvHs3efErhPT431z0Lai/AVlu1oBnHbd I1r611Jmjlu0PbRcJh3HaKe5Sks/mqDdj4zPjH2758S+bHk7sHt2PJkw6EW0OSbzkQdjK8zc3Fw5 bsJOh+Ao5U96BYq0zSNoq7DdT8AKfluZ6PWj+uQYZbGRehnALYVK2nABJWSgcjilLTvnCbw6vqld 4Gk+o8xNjp2zmdhV67WPqGkgkGVfUqAz7n6UcBWc1f7IscxA+aXGA34EolppO9oQEAjooD05Bzpu TtB27AGeZOV4J3An0LjZfk2a5qH2qRbPOO2KTllhePE/TPvOObGZuZLx2u+IlUozjWqOkCfyo4CQ hjVJDztk0FRhTmfcsn04b7YwjjXz7FHe9mMBQ7UUV7EFaCFGkbsALFzdGKf9jzFmFObXqCQZdMeC wqh7tS3+taSmgWP3s496TjztiKfHlVf+Eu2dwrBSQoyrptd2pFeyWam7/yEix54cE/GX5e34zNjT guGy2++6O+7+yH/GkiWL0+DlKaecnJpMV/9eg5ML4klPODTuve/euOyyy+P888+PPXffLb74pS+n NfpWwCdXPd1i6bHqthN/nYBN1sUATFkjbd0FHtNg/U6D6VvPNtd/ev4/xqkcV/ogmhG//e1vYukS DGXvsVt84+L/ynHGcetjH/9kbECApxVVjFFTN5YBAx9XMl8lw85fPlNGPFf4EMuMNsp3vpcqfwlH JssWTHhqvjr3/r3UDeAqqQlm/RdbD7aNFIxgzGupbP3RTf9ly4B8xo5Uefej+NdZ306e0TA7Op4a 7/v95fG6pfje8x3xwBVt8ZyTf8qiCppD9FXHrNIus23SF3JrBuF3IQi52qp7bXstq9z2Hcm0KHBK JV8KmoYrmGe6Sz7kZeVjzWvZJiL4MY3taQ1szStU/Jc+4rPfSm4z2oAQ5LPhSyNsvxsZq7y3Pxeh 2HSbvhJe+nUecAyrpr8I3gI1puGg9/w63vHg0bFgwS3Vb/ePd1w5GldcsCBe/vXKd1lWGTNyBfkp NAWmFIfq1bIo5ayTW0wsxxJ3bXpJfOUrvin1fNC7fxXvXH40NuBuyHdNcVC895or4vXxmTiPPerz cTVPkgujlo3xFeFf9zzGVDfitjxK+zPukrZKGJQZ26M7mEc74b3V9K7Nb2mHxc053IUPye0/udUd rQcXz3wupDaj2gE9uKsdMZMxW+plVVt1evnEHcmxY5g5Qa2IQVbm0cGDT52VmuIDnZO5QOA3E2hT RFBvR3w4PvnBsTjpV0+Pc37zrVj630fHeyf2jn0PrAii+s2Tp2iTbZSBVF+1uzBXDXdAD4XrSQDP JO7zmXlxO2Kr+Ez4hl74MEGAfsbk6cx3XrUNWPm2Eue+Lz42mj51bOx9w7Picx99Rzxt1Y9jBbat pPXwMFIn5aJgHG27wF8cFud+/8e4boqvfW3/WHw4aWSudTV/gPikOZTXjlSrTaBxyOjqjJksNqg9 UWw6FJsR2mYoNiH6Kdc5zm2Uce22CLdB6OaWDu05uFWj2HDQX9Go0M1tFV1Ll+TWD8MdfuhhAKQZ U1tBSloFENbO3Byz5CUBS6SVLFiYv9qtKCUdBQDxndtOZi9dEgtp72pxWB47oT0vuf2iUBfunphR R9szHttW7ZYL02AbLVs4hljU6Objotngdgu3a+yCPFLsQXg62M742UB7VPuhHAVqq6u1HaG/WYIN 0HZGK0lLO9v/51AfUiPtZ5w+Mw4o1iX/yXx4YDs7KmrG9TbmQk0gSNNoW49Fje5BdRLTNoICmeCB U5/onpOWp2840Xi84DQatODA0qVLQ7XDm2+5KYUwB4pemJn2tn6Q/r6cVB182kiUWhTTRbi6u/P5 rnvujv/+7+9gyPLSePCB5QxkMMVM9B0OLDDg07HWKoPUxq99ejMr7Bz9aOdlVaitjT3bDDiqQjpg w36TZiY2Oo4rIrndBCRyPI06sXccFKifSUrmRIbP/HmtCLgKjqzMEEaqRjs/50SuAFXZ+ynD5IpV U2MlXssgGcQmVuwoJA0TqnGxlcHYgbOBicjBsQmBTGG2kYFwGOZ5Gid11HnMKIzsWlRavv3t78RD qLI85SlPjCVLd2HwYkIfY9XeFayuOdiYoINSsXZX1ZNlKrcCQHjW+6aejSnMDiCYDYFEdWAQcybl O2uWezfbqQN+CCjuq6U4Y4y60SK5JHPSBDPSgr2McVa6RxEClu62G3XTgvbKjfHQQw8gCNBR6zdG 3yZWw0jPhHvFYfgtd7+XqVW7QObacnQS6gPeVdujjc6wYMF43HvFmfGiX3w4mbVxtooMjWAYCBBm ZJDV33G2VjA5zJruypPHzvVgN4AMYsejfSZHvKrFwQDUz1GsMu3NLRzROh0jqxrAg6kqjGYLdk1G Bq+Oj7/8BfGxbayEYtdjEua5DWSzYeuW2Lh2ZfSQv6bffyJevO+5dI4ZrFDPSKFjctsAyPWG6Buh /mgj40wq3V0IdSOsVAIcufJOtSKAeuQoINsoYBj1KzhiOciAWB8D2Ojo7Ka8AdAUVgZ61mCgDJCG ghLemZhsQv19Hmc6g4yywjnStzF6hmgbCFXkLI29onCN3QEETNzq0E5zha1txkDcdsnb40XLnxGv //hX4opDL4o3/vtH4nTqTovL0/oZzMdhhCnHDgZQUIpYg0X5EfNLpTs1WU6p7k9axsfQgEDTqRPU cqJVWzDk3XmGgaEedfvued0cIzsYax8CzQcrbeniVAPqapi+SXS0OU54UbhrnRkLFi5EiNsWa1c+ iDv2aUR9ERpW3XdTfP7kl8c36rA78BCdCRSkfno36DL11E8dD7KSyxG0M7qZhke2sCrIVgVS6kkC 9ZSpAvbWbQjwqFXPW7AmfvLh4+M774G5oO8MYp9mcAKBF+a+ro6VcdI0bbIntmzsR1OgAsBNsMWq edoEFqPph20YB5uFQdohtLrQIOpZcWdcdPqr4mfTtsWa1eux1UHLom0LCgoObUWAmEzhjHa2iSN0 aYtaSm7kdJs+LFD3wiAu2GUpmmEcH7VhNf2QffwIrv3092kY7N0KQDVEW5g1By2jRtoJeVvrAMwY MMFRja3YP/EYy/UIom7vaKUe67dtjOU/Oi/eev3C2GNue9y+bDntCwBiZgfgwJbYcM96LFJjZ4L2 OW/eAjSdtsaq+x/Cds0mTiyZBbAJ04yxmEnsMXTYl4a3xJoNKGZio6abMbOOtG8GEZ+gfCfY3lXf 84f4ds9dcWnTOOEqUNFuqLtp1MUgwHA/Qr+neYxje2AzddcIwLPxodX4Q6tp4S7RSaNeufqe+OJF H4nLOGFojOlh3ZaVcery3yHsOuZwDHQjZQkwuAh0/imzm2LhwyvjToTbbtI0g+WhAdLUT5rHBexo Z8jV0Ui9X/qTL8Yvft2BQUo0BNi7oZHXUezerKfsGzBy5fHSrizUDfbEKEzPAGOjg9sEW9Xa2Osw 0tcTE2zvU8uuHdAn65U+TESAk+SNSVUjg6ieJNDU30afdyULZkOtCA2LCYa2sPoxSrmugwGYZHxo njObMQQAhTFOo5jbqFO3aAjsbgUcUHvLY0mbHWhpS6peKqAKVDQz1qtl0UO8GviU4WDwJN90O8pZ YCWFR8ZRyflEN5mXXupxxuxukrs1NtG21rEyIWiqxolWygWxBckEPwT1ehXaGauIOMNvdR6j3jxh y/bmig2jG22cMZu2rs0Jx/Zpo23R47xYj+0RmHvj74MZdgvKXLQe3Sd//+pVKaDNYv51DOxkHCkC VRNCjwhKEZJk5t2n/NdSnipCetXOOPXtb8cA9fUIRkPJiyRgkwVEY8E2gyNnyuh/QSSWr/OVwrn3 zjFJABy58EI/vP+BBwGghxnLemIe4+lvf/fb+OyFn47VAIC//+MfAUD749e/+iUA+LPjl7/+dayi bgRD56BN8vKXv5x5sDkuueSHOd5+4H3vjTvvvCNOP/3dCV4f+5KXYGzzgNSMuO3225LPWQDfJFB1 8403Zpl/4+Kvx4n/dmI8Hc2Jr3/zW3HFLwBlqLPZgHXO2AIyYtvWLNXzSF58WwUdbFP6qDw6+tPW 02/Vj3mXbHf0u/KdwOkWTu76eylXgymH2voXpFPI81eEvtJOjK8I5Lr5K1SEy3LV3TDkM/xGEGTa of8cRy1DK/JZEZ9/8BOx+0MtcQht/lr6bQr9yLJ+M2VLgDDUdhK4KFQbp261z0UY1l1BVPJ4XOP3 VDrzyWCd7san/xSCq351K6BEyYfXHSnTiqNpFVBJOxbwwQpaaeOAuQT2PtMgKCLvUcrVNCjgGkYB dkpafZZHsV4Mu7H5X+JNJy2NXePyWPP6HVJxzCui6VsXZx48Zcp0mk/7uuKD38uHlvrScKaae/me 8M23aTIuv2Voz+94kWkwTQn6EEamB3f1mkeGXxinvHbXTNPGHdO0jDGS1VWQVXxW6sBFGPOfgEK1 nDPfhFdACdOYdVetD9Oq/QnrtgmgXYO6hWrrWzfT3tTwSFtldkgSbJDcimEaNJop2OA2OEEJybry +yIUWi/el/fpqfqHZQbVqvOpaABoa6LXHs5VOFYerxlBcxPPgU7COb95dzydu+U3rYiv/QeaEj0s DlUW6jMcteskQYlG4hWkcNtGPhdQgvlTf8ozjwZKaH+ic4R0EKfpkqeXJufNJYOET3okT+Zwi8fK H/0kGj7/nbgLt9//1ykJSrhyXrexooXhws1Mfl20Fbc/xLor47jP/jr2e9lbYgGPCtl5ehRl+WhU bDWUGptk3u8hTbtxmsYkoIJtUhsOHgfuIQeSBiOdPwUeC1ihu+1YoEHgolABIHwudiRqQYyK6ExV VQGeDZgZ8DSMuZbHDrTJeYlyK6CEr1vwV4CI4r02fN3Ke4EGgQXDUItCwMFnCV3IdNsk/wDVgh8+ F3/eF7BCN8PxudiUEGhQK1vD6hr2zCPL+UaQwplGciGj2I5ogCcar2rP+G5rdV4fhz/3G79v530B OdyyobHLlfgVlHDxbpZAIHyENARPUQtKjMPLoBef7x7tD8DERgTVCuKvBzucmgxlQlfwz9UKBn5P t1jM1g8BANU9d9t1V2QbVqBhihqY5FU5XMAeml0W78rxmAtiyaJdc1AY2DLMVoab4/bb74hvoRJ5 +623p9A3B4FIBLsNwU3Djh5DOguL7+2szmlcc/78ebEIFZeZM9i3Cyoj07du3ca4/9774o57EKJh /pxcZaikshLk1ZXqPCaUb0YZqBUqTbfbSxRGXJl3tdrBTsFbI56ukKtG50kbrRR0Gurkqmq4K1Ou HDfR2SQ1Htwb7LfGJzAySGWOwey6CCGzpSZBM8tvGpEUFJkEpPC4jgEEhssvvzL+iBXynWC8Dzjo gNh3X9RGyYYDvarblm8eCwcXxnBDWpl0QbzcvqK/FgyGtrSwcq/Aj/D/4DK1MFRXBfkCiKhvYD8x AvN0BAPjmw5j2dLWEZ2AFgftswcM7VisXLsBhm0bgs/OhMekgmB7z533MwljrR8BQhCqbJGx/CSZ mlx9Is89DNbJ8Pli2uPiWSd/LD71mt3j5os/FO867Wtxh+6xT5xw2nGx67Yr4+yzfxPNT3xFnP6B t8WL9nA1+u74yinvjk/87LYYWfTy+Mj5p8YL9x+Mb//bf8QFv7kr1iMITIwdGe/51EHxm/dfGD9F WJMhd6V6so6Vzce/Ms796FHR3f+bOOOJp8SV3UfHf/7ws3F03QPx3TOOjNMvA1RBKB4cWRKHvfaM +MzJT4hmmNPxlb+Lz575hvjMVTDR0w+KF2Jv4pOv3DVu+sr7490f+kbcKec7cXC85vSXROfDP40L P3d1DBCnK7WWiYDVEMJc817Hx0fOOjmOXKqqVmPc960TOU3i16iKCWxxzO3CV8ZHf/Af8fTpCDR8 s/KHb42Xve9SkMuOmHP0u+N7Zz8vpq2+LD7w7LfEDz05YrI7Dnr68XHSa4bjrOM+Hfdd95P4+gUI JIcfFDPo2CNsHUIWox53iZe958z4wD8uAaxBOLnlS/GB930yLrmDY2bp64IisqIedzgKSNcy49nx hvNOi1ccMo+VXQa9G86Nk977hfjjAzA+B78+zvrMa+IJOz0Q5z3j3+PrG/aI//jaadF89snx+Zue EG9+T0O87/T/ZqBbEPu99XNx2WsejzFAgImrPhdveM0FcSPHwTZ1PS4Of/sn4tzn7USs6+PqL5wR b7uoNw573dlx4Ym7xy1ff1+88YzvRNdL3xnnf/zlMfeqs+Otp50dP75/PJ6M+vYT2Wd92Q9+GPe3 PDXefN6Z8dpn7xY3fOyl8bZPX5MDXcTR8dGvPy3u+vI347K+o+JTnz0xnjD/gbjgWa+JzyzbGP0A QJ2zXxYfvHB+fPV1X471T3hzXHzB86NtzU/jvUe8K27a5Vnxrq99JJ42eEf894eOjTN/TpkwXrnq rODhJLzXMcfFcUc/Je46/+T4+r1z4kknvCyeOacvLqHdrW16cjz7+NPibS87IJZ9633xn1+6JK7t 46jgjQfEGRceFX1//HF845rd4z/ec3I8b+/B+M6pZ8RXOTGoB8R4bPQp8d6z9opfffLiuHrN4njb 186K1+zZGGuu+Fi88nM3Rev+L4int18aN/58fYwf/rr4yKlPiVh9ZZz7uvNiOULr4Pi82H/fQ+LI Qwfj8z+9PdbQfxsRJpoELep2i+e/8qR474sWxy2XfT4+9Infxk6vflOc9qpnxozr/yvO+MJX4ler YMgPfEG8+/gXxlPnA7Rtvo5yuii+1/fkOP+d/xJHLhmIH3zmorjo5v54wVtfEvOu+mp85ob2eM0r O+OLd6xD26QtDtrpmXHOEXNjZPnP4vUf/X4sG2yJ447ZK6787uVxNYJz84K94/jnHxtv3xdAhH4w c3JTXH7pp+NXt90Tgw2L43HHnBifft6SuPuuK+Mj3/1d3MKYs3Vgbpzw3CfFHjPWx5d/dUesWd8S zz7kKXHiATuhuQA7/vBV8cGf/zquZezsH5oZbzvsoDhy7kB896KvxUUPro91jMsN23aLt7xyUVz9 y2viBtL0ry86Nl68E4aVGYNvWfZA7LTbLtG87pp4+7eu5uxt+mSCB4wpAq2bN+SKRjMrMJ7WMwCw NwbDWA9o4UkZk843dKKJNasBazjbhP7r9qAh/DXgrxUwuA7wtAEgpQ7hcQIVzDHSKr9oeIPca6dh EibTI0kVqOtkLvi2gzFEwcKxzK0yozA8jvlu72hmflnCionjxf3335uaGN2My4Lam6h3j+GuZ65R bdZtHK3GTTjj2wiTuWwrzPMgc8hMGMhO4pAFdv/vZsAZtwGqIdHinMY2K8GJQcZwUOzUWGpl/hpm PvdY0tUsWKyFN9BAqAJTP5o7zk1ltTAFIsyhSp7EAd6s9DIlwOSLv/QPeVDjZBy+Y+/994vjTzie ueJctAzcQgjTRz4pjhzTclxT6q7S1PzDc7nf8apXR8Q6GMgK+T3xMScLYk2nTlauWBnL738A7am2 uOXWW+Jxe+8Tu7Dl9JlHHBFL4XMGmeufe/TRsec+j4sVy1fEC1/0orjzjjtzEeY9p78rga/Lf/qT eCKaFp6sIa+0++67x8Xf+Ga86Y2nxI033hSrAXm65nRHLwziM5/5rOjunp15uvf+++K3V/0+5ghA UsY6qkGmtqjGUskYOf5TwbaamUppWEB+mEXDH+aw8q/ixmuyn6+5dSvc4GA//Jxj9t9HRZD3pCKF Q3kqqay0l2eFZWGrImTanvz9T2SYZRWeESxGrv9+XL7k8njwQb684pRY8Irv5kJVEZ4N07jUnChu CtiDeDetCtUlTcZd0lDrpn+pqOmXcOSlDbekRz+13ymkG35SDUZX4vB7Rp98rZv+7Tej9FvLS0Bj A+VoOn2WTIPxG4/5t+/1029LPnRPAMKwqqTbYNW9ofFL8fzW8zIMBXvjNTyv5d5n30klb1kGhDGV d961C0zCm2baeCeVdJqHkiZTYhpyS0vVn+FZJIY/NnZ+HNP06amyN5zHotptMfqxPIxzKl3e1zw7 XikEul3HNEiNjV+Mf3liZYtFccsX+W77crNMCpleQYlNaDDpLuigNkQv4+k0xg4pgZfsf1ty1VpN C4GKClyAAO1YH/vGOz97TFxy4ofi9vyK8sFd4dF2SWbSVe2J/p7Z8R//dXw88I+nxBWtP463HHFF bEKwtGwXLcF4ZCva5sThKR6DuLkNo5vF2yGFfNwljw9V56WDZ+cgbUy4lQMpnjnnEZsTnuDhO7dr lJX8gcH58fYP/HP88uPfiPuVBfsHoh9tHm0XaVtCuxJ1Q3+Md5z0x4zL40K72LegseR6FhMGVDkk PI8HXc88OLC1MX7wg2/GqqFZsdSTt1Yui+X3sCWaRWi3UQmlMR0AACAASURBVEi5laLa53zWPkOt rYYewHm3bSTIQfkXWw6OZw+wSFj8ap/BBQLX9zsEY3hXbFOsxk3Qomhh8JiUtiy4q7UpMYN5QGIT Qqyk3Nz6IXAgLCEAspUFZjUipFx04Gr4GqL0tDOp2LDw3jQVA5xuESlbQDzaU72ICeo3/RFm0Zzw WVf1UDQcKnXlX8oLTQvbhACPpJ0O24DlXuxF6Gc5vK1aE8X4aCeA+soaP3liCNpdfZRTF7KoNM53 kierCJRpO0IewsXNucTRQHtas7YSr/48AlTI56GtPdjxqrZ6rmlfgn6zWbkXWoSigtQHv+OW284a oChf1PxB+1djZ07alYlPlVNVDxuZFNWeGIUh0pCIjNIwTNE0VvdbQUx6+/oBD2B6O2gEDNR1rFju vNPiOGCfAxFsN6HS3xt/uPaPsWrlwxxZuTZuveXmNLiiGuShhx6Qq73TO0DV/h9pZwGoVZWu/+d0 cDh0d4cgIYjdIhgIdreANdYYY7djB47KGJiMYiEqIIiiEiIgCNId0nDgdJ//71nft+HIde79z70L vvPtb++111575fs+b+GVvjGbdatWzdS8RbMQMaNmdlbYWEqLcR65eTsb0DrK2AqhtipIKBw9wnHu dxE+y3uxpfoeoKUQirbPtVzK9lKpSZa6w4BAuNVgoCchajVTXW6NCt7TyYCB/UtY9c5hNm0nHlQv YfDTYfrdLump2CBbyknrV4AKea3LqAODiuqSVSLZJyjXawuDgk0nBuZQNR5hE4lcOtpSGZvMxEAM fN7QOQaAfscWaRMaINOmzyCCRzP1OagPtUIVmglmJ3ApqNgn0R8ZTOJEiOBEFpxAsMAApLGJtW7p qAU1kPoikYYsDm2A5L8YrQGb2uxC+2ATbVeGlM3ob7YRX3x1mDgtoz9tc1uGBD4rEwao2+HK382C igPOtATs5WshTWVQOnksBBSeukTJxLpDKVorIrXH0erReJdmTBqjzfWO1qATP9f6+eQtagrARNSM PPxf1D9Ztz16rlrM+LvOuuxrVZ79iEb+5VZtr3hU4xv3BHp9TaO3DVbnE3upe84OzVzPAlWBxBXJ ZaMWzdV0G2APEvRUGjubkHXtDm6ute89q6kd+6vXgL7KrddfbVa+r3tmNtLlp5+vxjCM+WkdddSV t+quE7fq+SGnafyueup31m2669X3VOO6C/VWWh+1T1qszz9cqaRGvXVsn9Fat7wuRH9jCMV6LOx1 UVWqpQw0I8xeWNshEel1Uecr9dRLJ6ny3Yd0ztiftT2jq4Y+/YyeuOlvuu35KcrJvFhPfXKbGky/ R9ePXqY9Cb100aOP6YlL5uu+SWk6sHcd/TbqBW0+4GydfH4LzZpcgBZB3YDI129YHMZ3IvbwCbRt MfLOWoTBbcB4zk/po6sfvlGnZ3yvG467TLNKO+v8Bx/VbS8iIbrzUX2+tr4Q4rM/AWShSVJYdJhu H/W0Tkp6S49cM1kLNjTU4Mef0Z3DV+iOxyap4pD22vHxE3qty2Xqc3pnTVs9UD0Aqlqe2kMfrqmj OrXKld24g9ofdaNeOme3nho0EACom84adqte/Pt6nXjHQsLZDdZ5Lb/T0MsmK7XrCTrj2L9wbY5+ 3EK7jv4R1cBm6njAoWrfpkI/vPsWDFlT9et/iL5cMU3ZLJp1GzdVkxo4eTtioA7Sz/rnV9vVt1M/ HX7Ieo39jUg+SZjeNKwX2qZLz07a+emzeuuAy3Xw4E6aOrZKa3Ic1ade8HfTrGN7NevXSItGPaU1 bY9Wz5MPVXnjvqoz/209sqC5zj/9PLVYMj3MoVT60hphNjFpjPp2IxbmbTCFtXfWQ2ujkRrWS0et rqEa9DxOvett0eSp+WzO3XTEIcu0eM5u/Bo0UnMkaCnYrHc5tpuqFo7TRznHqE2flmq3aQMEFOhy JtoCrGcN0CI4etBNOhNfD8qfry/Lhujz925V1ZrPNfSZFSpt01oHds7Q3I/e1eZ2x+v4U1pqxWrm dWl9mByPC2KZt2mrKtaxEAWC9SStYy+1qrVTP/60Sfk1O6rHgFR1aiHN/u47NDeaq+vBB+mr8en6 y+FNtHHFWF37/ho17HmWLj9tkJpUNFHRom/0RcHBatujvVoQTrV1zQY64uD2mpyfrvpNstS4B1Lr zH66sV8NLfp1qjY3AiA5YbMmF6Mdwfyr06GtOtRspjMOPl6Dqubo3I93qXuznrrtxAPU+7iLde3O lzSysK1a1s/XhHnzVV63i47uvUqrtyXQ363Usn1rNWB9S2ucqssPPUrnNtihCb9M1o+70nRY90N0 xQD8WgBCL26Els7Whfq0DDvzQ/qqR5Pf9RvhLJLLmhLRiPWlU76aph+g9rTrKys7aUj6duU0aKJd MxaryYH11KYbfcNa5/XK/xzJaU8t/CVBiKcjESmsl69tNbfhH4I5zvrvvST4WmC9trZDFYBuEuux 98AsNmar3Rq7NLFaF4ec2Wy4O2E2iwAPDV6mwPBXAnQncI9VuzPQakm29CEUzG7Lnmqg1z6AXFAx e5l3I0dqqWviEqDAtpk12FiS2McC0Mjm7zCxJsCtAZFpMwzuyaeccsYwCzqAKZpdAG2e+47ikm5f RzwzMAnkr0c9reGRwr5t0H4ne142dXWUrPqYGWUhpQxmjdyUzv2BQOf+NPKWsu+YoI9Ul4O00jQ/ hYdIHBybWdif6CfH/5hsVBigVBCIKvzCXD3sKrQMfiBE+Gw0JusB2LJP88cfpuwfUgRCuG+rpyCc oL2830cpgf3Tyfty7Nt0D/fx22CMPwadR733r+Bjwv6z5iBQOftsVJYP7Kk3brtDnTq31XXXDQ17 d+MGtfT2m6+pW+f27MVouiEQsOProw4/DLOOOrrptr8iYWuEpDgVzQnMBqFPRn/4iQ46+FDe7Re9 8vKrSF8zA2NgBsWgtwEav5MFIaYjPJ6MzNgcz+9kesTv5Dz73s0vxD4cMIwYLRc1R+xdTeE5h8F1 2iOUB70AQHj3XbeFtvi//HG/V+97j4G946DvE1r4w1/UXl/rhjrn6S2uOWVkDNPH8zrrqUMe1Bzf f+EHymU/DWnVCB3T627NpfIJBz2mOVNvUDtN0LCEkzUuuYcenPGKdH0L1f/5DL3/HpqKxXEGlGf9 xrPaxUqBY3mZcu4M5QQm9qIPlTOif+zqyhd1VPc7NI9+c9pbX47NQBswiN4rZIj+xHnWSz+er46P dtOtM/0+/fTMknu08tCL9a7fvdej8XeeqOuzz9HbvMfe91v1ko7vc69+4a6kSz7Ujhfi9YnOowlc ccBDmhfe+WtdmzFYo8gbq99QvfvzQXrhuMc1Ld7G1esdHfs7YtqrM9k1a16nT3Jf0onxd/n6+myd 9Xasr5zP9F23+37S1BuiFgT8P6aXbp8Vv4Gv8998Q+UXX6zXeYZTQvV+i7fpzHjdfL3fM0s0Df8g sbRKLx7lNou1sZ/pT4+H5lR7Jr4vjuquO2bHb+Er9qR9v615ESW/qx1kBvNkTrrv0vs9GR8zft7l 0ps/yFWIvS/CKtf98s9UhJ+GkGj7Y3rdFcaJ6+O+T0o5SHdP/VLXtDX2hfPtV6nroc/oW8ZXG32n m5tcoHettXjB+7E+XP2Khgx8XgvjFTN45BS0SFij1W2A2rAHG5QIGjd8e847JQEedL0Z2uHyVuG3 /6wddZ6e5buAfR5xtXJPfFa7njo+dn3Wczro9rExUKK0v96Y/7DiV7Ru9FU6Y+QKFcYZ3a5/+1If nwtRsH60zrpqlHbX7qFLbj5Y4+59VYvZJyKHmPYRYGeYQVOi3bFqs2mGltOWXj0xUI0912B7m9P0 2tCjRYmxtOUrXXLfp1rOr3yeWXXoTVo+9KD4tXE6628faQFAygIi9NWqKFIxC1MZ608Id4vfLB14 mZaf0y2Wf+EoNf4g1oIR0OALPo78TPi3o2Ds4Nt12wof1Qi+C5IiJAMaLeOgQr7XTK75Yweg1VME EgTAgGvVfxuUiLRKDNbY1MS/7aMiSgYlqgMPBhgMSjjsaQRUZCWgkRa/ISrfPw1K+Lm+7uT8kTkL tpR76xIu8icX4U8ENkRjJgI/nAf32sEnRsjDu+6mfRMAiJwMRESRtHzcCsDcphuFvJdTFNLUvrhc diZ1cdt6PNRAOSBKdmJqkyWDEjbXiJI1JwJkEgckrGkRpfIE3BbQTk51aZ/8uBZI9DuLdvh3KdGM qdV1rXLlsJK2Y7YDNasTWt3Rm2Uaxxmoyqahyl2zRn2IG7QaUogqwcvtQrXYoTJrZtbV8t9WacqE b/XFZ19o3Oefa+PW9aoDQ5eG+rB9lrdshpO8Rmg/pKBGXVWA9B61/vownU2b49iyAcx1iaZ8M12v vPKBHnn0Zd1403264oqbdNtfH9RDDz6nsWMnwyy2hEjCW34qdYJgTEWdNAV1/0SIPxMe5ajpW9Og hMgc6IdTR9SxETPnMamqIPaS44OhCnV0qzzZ94NDCtoppLUkMnGpXgMzCBOILepnqyEEeEoG5hWp NYNZiR2wpabVYnFB7bYK8wIItjLCOhYh8TYxVxN7vprZOEPMQh0cAtZSkAO6dcILd2ckn53UFpvW xjhya9W8mbp0bEs89Q46AMKmPsyLwws2atQUZg2GOAOGLbs+ki/Ch0IwlrFYWjKWwrs7EH0+72ON hc0GNraBUkJs24miF+b61NkhSlu16YCpRie169JVHbsfoNatW9PmWdoO2GMb25JKkEbazGN05w5Q rYS6gCPt1RTV7cZN2wYiyAPHsdONpgeHiCwAdlZmsMeOPk0guQ12rFiotbl1dfjJV2pwVyRwTI7A xHvBYGLb7CW9VUuVTBurMR++q9mAMcvfm6hZBeVq0KqJCmcuVuqRV+qSUw9Tm9pMVCaYHb6lWt8b 4t0O22ybboeC2YA0FUyADQu2qv3l92nosX3VtU8dtT20kzZ+/pHWzl+t3S3aqzkv1qh9Bx3bt4MW vfWiJubif6B4qb77+AV9NL5QB550rPYsWqldqV00+KJzdHJ71N6RJIWY9RCB5UhZHV41mfFglWKr 5vudHJ72yHOGqN68CRrz/Q9I9WGuypfonTemKKN9HzVt2151jjtC7Ze8qWVt79DjL72vh86AKH1j mtoMuUydIA63LctT96tugyFrwvNQDYdZMWORAtpcbikh7eu+DHPSz6etC5Dctj/0EPWpX6Xv3/+n fsJdTq0ay/XeyFH6aUW22vXpCSOF9JI5bQeGjl2dctwJ6rp1jBZXHKELnvxEH97VVtPHjFN5j1N1 eOfW2jlzueqffaeuOa2vmjXKUIfDAYjGjtWW7oerR0NMX9jDE1gPytITteLVR/Q5zntWzMYp23vf aVu71mrL2pLQ9gAdfdy1GjVmjB4+4zBlz5umxQUJ2lXVRoMv+YvO61FHXU/sjGpfidaMHq21hP6s 0bSZ6jM0vOWxVwH40TfTftSCpL66YvDxOqZjXTQzYKJYg7JqYCpj4o4+WT97rRqc8VddNaCXGuFI lZYK9txpno9cL2Sj2rAkR92uvEvDjzpQHXrXV4OuzbXuw9e0afVWFbZkTvAsg3vQ8YxTiBnmffjN omzC3yZbwQOLOSKen7JikZYVN9ERxx2jgV1rM1/Q1OJacibSK6SwNpfYtXSjavQZrHOPPVBtMGOo oO+sRm9NsgqAUzurbN2ySN+MHKEPlmKixtisrMA8CzCyB/Pb/gq2ba3QQedcoUt7w8zAMNvMpZJN xAyNHTVadT+JvrUqeQqM7s7ft2tnVX0ddRhARrMaatGtOehsvtb9+L3WAaZmEVK5LmWkNztIVw+A mLz7Dp2TTCjXCsxKMMOpdcAxGtyzg1qkl6lll3ZKW7ZYWxq3UyeARDtotH1DUm2cheJIqVVn/FNU rNZ8zGfKzRjxr4x9oHXdtjqs7u/6+09LVYGWXL929TX563/p5ZXF6tympXKQLBSmNVT/3v10Wl2A IPy5FIf647OFHrCEvzi7oVpWbkKTKEXde56if/Rtok1b12pHrZbqDmi1B/Ob1ObddVar5mpTAw04 jxmXkYm/Iv7Zd0P59m2qbNNPf+nYSAV71gEKjtHzv2J2gymNHUMGkwDu8TgrYB6nZGETTJ+wugTp Whrgp9U9A6PKgLQjSEuvaYWAOgfGmLa3mZyd/RqksA1lCkCGbSZdvm0mbf9q9X6bB1qd1OZWGazt XrsSGAeg4qE8m+tZ+y6R8ZGMCmwW0om6qKimo+kQCBVLZRnzwWGsCWmvfezR2XyzIOJ0Fl8TPMO+ MRLNsHt9cr38CEJcGmBIpH5VvGcq5WdQrtV87di5LtoS6eR3iFFHBcmivnXYSw1QmDC3yqW1A+2j xKiA95WADvBkEyeWOlmia0AigPEcR5JSN9d/moIfHNrWGoWVEDp2tn3f/feGMGN23GvNphTaNtRn v8LdX6HP/uT8PsY9djECN2L+kOLENpei+/1t8840aInNmzcHLYdly1bo+ede0FlnnqXZs2fpsMMO 01ZCLQ48+XQtYQ9tArE3d+4v+vSzsRp40gDaL0nTp08P+6JNcLp166YHHnpIf739Np1y6qloSdTT pZdeRljyt/3kkK+WpVComlub02ucx5z31ZiTTUY4feBPjBTna7/kPnd+19++e/z9Xz7cE3x00KVJ 7DHbtm3S+RecpxOo8/81VWeEo7J8zp+DzuqoCcdk65gR7XXqhTFwK8rjb4/fih4P6ZeXqmDiMWOA GD5m/Mma+tElIVvvMztqPPcf/kIHDR7KWt3nDPbPBJ0wqAfAgVd/5iH/Uq4cq6JRiboOgLkJH6t3 HzP+pFBOYDb7Pqo5I6o03POQ+4/gGT98dnn1qoRj53W9I6DFx/snmwFQxN5kXx3euw1iOn9f3nn8 ESm8c4JwYxXSJae1h8nP1g2rBmqIz/V+WLNeEGBNnfDOR301QFM+uDDc73eecDz1p80G7VdF+1Hz fuJ557r641S9ntGxaTZ/glaG+uqxeS+p6kai5fHM7OxjtPzmXH18Ke1HGaY1ej0IKNGRKDWsW85T J/s5dZj6i/7eex8j4pDSe9sGAMb9di357TT4qGpt6joc/DSgRIenQnkuMyPjGXX8YaGe6ReqHP4E UKLDM9XyPBvyPNF3X57ofXwmAA/U1XVwitogopd8/aK7btCKa6PnvSldkaHsY0ao3akXhXYr7v13 LXwZbIvx5vc8fsLAveMtFMqfis6nqN3E/tDSN+LA/aJw2mN58mltdC5FduodY6ouOKWd/jGwqW7B QfnAjtBe7Nd2bBmcW3r9jKdup7XTqi/QFGc/jhJRuUNqcwugROtX1LpnD7Xuda+mYDZQdfkHenFw 7Hp62hn68OTJatK5kw4eNEhXbzxHn1zViosna9S8h5X4YD8dhGZXl/7DNeXI1/X0cbH+yjj0Lj13 bpLeufl03fX7kRrUJUO50OVOFi7bV5o1Jpx87GQG/IATWmvjIsBukrUlIjOOquMf1MQh5XqEMMtd L784fM6a01vvDO8TfJBVtThbE4Ym6q74tf6z++jj6/d1dj57RyKC2hTo+ZgDx156tduvanz3LeEz YOtAzTjxv2pwGWyIUvXQnAYsGrKn2WFmI17Lx5Xsv2vh+QJowPOcIhDA4IDNMXIwC7HWgs9H2hI+ jpIBDQMS3ofDh/ucInDAdEL1ZFDCQIVBiUjrxNd9rnq51e9xXQxG+BOAB+rlcxGAUf0+l1892VTD 9YoS8STDYS7PZ4Ls1aJIaNo4aEuEi5y3eYdBiQio8Hmf8z1JaIBGUTZ8XBdQ3smC6ciMw78NSmzn 2T5vECL6RL9t/mGhij92cGltiqA5wb2R5oRNwf6nlGw7Fy8aRssCkwnSV5EAIcICZFvWIpj2YiNl rAP107LVvklrbUMlcRdS+ES4ltow76lIZgqQEBXlFOLnBKk8diU278isRcezgDSBEe/Vs3vMjwUd YZMEO44yIGAVx80bN6t9qxYwx1s1bvwUiNKc4JykU6cOaBD0Chu0PVW3a99Bl1x2uRb8tkgzUX00 EWDfBlZ7ZLlEQpQNc1UXghJnaIUADWWEKgV4qKpEewI1+BpsyEnEwayySmcFRBBEiE0m7KzQ798Y KanDj2al1VQDbKabIDVcuTVPq9bmwQxn6Pije6oeEtRtmwu0YtXP2rUbZhIfsJVI9cuqQLog4ApL cbwEI1WFfY0FWeW859x5cwNwwDBgUzGhAWNEHTOxmU+C8a6B1kmD+vjRgDDdvJ2Y9xAoBk2SMMfw JLZTxVykG/b+UQe1dfu1KIJZTYZp3rB2JY7JqDMfhzKtXQtpP4MtAT8SGfRDdo1ahCYEcKI/akKQ NkDyXkrdtm3EbIX2gJSh/7C1BwQoZcCnslDtLEJLgjoUor7rTcEbeTFtZTMf/zYokZLK5u1zaH2Y gEoq+kVjH70A++DrdXX/5oAnqMjvAu0ttwQPJhlAKOHXt/Xccrzm51VCdDI2mPxG0UrxgVC1fIwe HfqtPr9qpK6o2qOSXJxXFgCO4aTRPkQKUCVyuDpaEIYV1LV8t4q+ekDnLnxfx175tM7LbKyDOq7X 5Nt3qLALz2OclRbS50gj00qnaepPzTTk2Td1S49lmvjsh5qyaJO6HN1SjX4fpffun6/pc2/T1RAT qdxnKbolngYLyhmje3J5diWIIm1j4q6YcKjNWmzQr//6RcvqXqznXx2mQ0o/02U3rdLSJBzZQNiX ow20ekGyWg+apzHPF+jQs7uo/jsrtfkiwh4ymZZMflznr52oEy++UT3yiYyy222LkyXayv4oymgb 25g7NJOJ84KdMHhEI6hdDzvwVVM19/fD9Jc3n9NFLabr8Wu/1rw1+erIJpuOD5LNaNp4LJqZb9so U5tWwvB1WaMJIzao/BQcgRbvRM0RZpcFomr2m7rpgkk6ZNiruriwpY4+er2+veVTJbV6Voe3nQLi j5nTtlXaOfou3ZVahnQCx7VEb8lhjhYQBi+5cK1mvHejDv0wQe1POEPnnXKcVkx5Xa//juS54g0N WH4dJiTtdUzfHP22dpNmz6/Q4RCoZfmow7E6OepHCUzYLrR2Kqoma8T1P+vN0x7U60fjOA6fBAW7 GYvpZoR4Lv5rdk1/Qdee87EOve51XcC1ogLic+9xlAP8JjBOVJyjdV8/oss2TNAx592pU9Fm6N5q vaZ8xRo2GB8ItG0eKuo72Jjt+LOM355rxfH29rgryMtCdZs1KgM1xD34/8j6VWOfvk6f/jhcDx8P Icccr6D+ZWk42WQ+lJkxxMzhpQfm6KshD+g8mKtU1jivrQ7x5zXGRPT8JcW69NxzlES/37q9qVp+ 9pHe/qW5Th7SXd+/M1srvntFQ9dO13EDztYBjLnd26u0aytaUS2IWIT/jd0wRNtYA+w0q5wyd+fN 1pdvztWKtZerf5OamFwUaOnGQs1fVKLDBsAEMJYyc+bps0/LNWNGXUCnwequzRr3zc+am1Bb65f+ BCFzqU4vyERDYQ9+Tabrt+xBapf8O/4HcvF9AurOcWm3DI18+3PN2rJRG5nSDZvWQu0eJ3Kg8sn1 0B5at1wz8zN0VZd+Oj17nZ5cuVFr6tRUy2w0xAq3afwvYzV/e19d1AQmOXeHcrehOro5SVsaYXaR uEW1K1rgMJB9o85ufb+I/aZWheoz9xy6eRsacHlrF+mpLXP1xYFDdCGKjyWEls4pgnmuymatxC44 H400QlKNGLdWWayLecyV1cvXo0HTKDB5NkfYhNmaHUGyWLFZ4kcHYnyXmRrW43zmVwC1kIAZqA7q 9F5P2cRDGE+IngTKTUMangg4sK00J0YYU0YOYZZzmGuebyzTsEhs5qhP5rGG1IThNHNcxFqSQ1va v4PXygTvtwYKGHfB+S1gRTn3FDPX0wERCuhnq7uDUjMuGWeMzRAVhLJ2osZaxndNAP1gBgLhmMF7 1YUhraI+llo5ykd9tBAbIZHaTT3yTBxQNwM4FRzsgqjI450L/a7Ut6qcdY9zRZVE0qJ9GvGOacV2 4pivXIhs+6xIZU1zsj11deI6nORPxCBFv/+T72Dm6BuYvwbyytEU69Wrl/566626/4GHYkAPfWDT kxBFgmPv+KZXqqfot7+j4+rXrXEQgRXVj6M83ud83vubGZwo2QTUIIOZvCnffKvrb7gBPxJ3av3q NUTx6KK+ffqi7o33dtrJ97runvOnDDxZq1etDvTV9dddrw3r8RGzHRMimFhrzFhC5Xp6H3X/GFRw 8jnXJUrRu1Q/t/81/45d33dflGffNWs+ItVjbemOoGL4sKGMrSIA1D8S2tXv+/85NjAQBn48c3VG cu7Hy/X2D7m6gWtfX//H0tyHwXkvpqWrro9pFjjHL3c/p6/nddJBtMEvnyzXG1Nj908YJvUc3F8V r76qlVcPUI+KpWF+Awco+f3z1HzNE/oBQGkFmgCDR5Zp1u3PaNJvXdWHeTGnU3uY1dM1kvXaY3Xu Hc+Gawdz/DPnqte5et//scZQcIASloK7lRNsQw3tZt9iTjY5MLs8c8xyvTmtTH/heNJyBElzy/XO FyuVy3vI0vnZgAuXdJBGPBY0SPzs2dXq88vYFXpjSo7cXBOv/ePcsgPtKPk9qtc7moP+9jvY8aVT YOL7nqUBK4ar+z9jJllUSnf3ul4fAQAlv/02Y+dS3XYSe2avd5QSNA466hm0NYYc1VEL771GNw18 JfZYxmYM6OBnt47Si48FjQ4aNbzDxIWddTDvM0NDdc8pX+moLm8q5fBn0QCJl3dEZy2850rdMeRt 6n6x7hz4lY7o8pqENsLCHzrq2YwhPJM8d11OnlGxZ+7316CMP/u/e6zfeqtD24mYJ5IHJ5pDMkaF /k5IWKaV7WN1+7l7J628dojex6eE3+WXe5/XxNkd1Yt6z+NZoZx5n2vFK5O0g/bXJMAJ0izG8rs/ rOHNpClL0CpbmKlPJ63VxgmbpDX/1IA5gLaet6wXQYRouQAAIABJREFUFvRG62RFaUed1m6VwCWg XmMS5WKY2/Q9aDXb/8cx32jAgM+Ced2glx5W0ms9NHD9XzXxqjOkcZ+CgrRVu2MvJor633ny7/rX zWO0Zkg71Rh0gtqOvkqvHosp4/0oRXx4rc56/EN9dOeN6jN9lHZ0aq01n/+sY577XJds+FBnLcEs Ehk+lJ9fJyQ7hbbWhM/Yz0QVAphBrTZr0sfsP1FCsl2K/4ld392nExJu16jnR2jlPy/WdTOlRZ+M 1XePE8GIvIuaNyO8+z80luMd0D1Vn36ubx9vS/SvZXvNV1ykNSZsupGJMLp11/7a8uiFnN2iV178 RqtOaMzxJm2tvoyZL+Gs6VX7nthK2aZNEqhvlBphkmnzS6dtXNvO+DBQYW1/gw8GRaKUzfobtBY4 n8UxszIAAiGkqOcN56qn6iBBPWheByTYBI+V7Uw8M9KuqKA/nQw0GEywPwgnBwuoniJTjgiECM8l Q/XnWJsin7pEeapHDYnKMvABJ7sXiIj8UdisIxFBR+NadaKswVTI0eEc4cNAhJNBiQhs8W+DFm5B hwUNx3Hww1E4asXDoe7mehQ1yOBDlOwUs7pPCp931I3I10SUz+BENgJfgxPVNSii69F3siUvaRDW KWyqZoBMvPhtHZfbhL69RFsaYs2K7dgklqFy3bLXAdry864gqUlG0lIA4QTLrzo18IQK0uKQZStX LYf53QnBBjJFYzREhYRHsEhYShBDzjt16U6/1tGqFcuQDOJ8bzObBptzpw4tYPxaqUu37iyYDFmI gtogstROi8mbiQTKXq69O1QiSXF8c3tor51VHzXrPmwYyVq9Zo2S8rO0C6nxnio0K/xOEGmYw9Ij /gFRxgAMDjN5t44dO+AR/Eht370NwjZXreujJty4Bh7KVyCpwbEikyF31xY86NIG2wuQVReoTkMk bgk1ISiT1aR5GxCiSq3dtFbN2zRTY7QOfvxxDvFbc3TMEf3QNmFqMdiqHMYUG+oStB7yCnJ5t00w wNjxIv0rLy/Qzp2b0QTBeSWaG5YgpQC8NKhZR/VSCVuJmm4GgIs1WRKQxNUAdLBdlJ2cJcNgVcC8 pEPYFcBcFRN+dWvZ72imJINeFeNPYnOwO77kkstgAGopbQdOafbshNpDIsbEt4pnYhVMVuEePMkj EUDjxBta1D7RgDHx448Jal9zciQL+7UowWHdVqSre4qb0TWQHRB5dLb/x1JZPgghg4DfdFsAS+w4 zoRXFdobWzasVc0d2OnVtik2GyAEgH132FmeQQI/z0ykQd9yxpjDam5etybEzK3d/DBlbULFDhu2 djzdS0siauI+KC1NVfN6LZS68S098dUywvedqkPWbmSB9KjFzjo/h37brtzSpkjnTB9DwFdheoOt eLkZV8arpWw2y6mijTzeEhKw8yvvrCtPaqhf3nxESw/vp85IhlHyhoAu1IKRw3R7nTP13PBhuuEB QhT961YtyWnAZklI3jQkrDAYmzds1PZ8BiTaOjZHqqyyvSCAD/1uQNCys1Le0/OpmMnsAc9cZ+zU Vfe2OOr84Wk9h4+J1AYHqTMMUgHlJtE2lroxNQJBvHPcfbqn4FDdffzDuvGhhiqd+ZxGrNmpLgmN eJ6lH3naRrtvRIJekdxaLTZN1UPY37dalaBT2gCCAExUEOqyHOeVORUOhcjmJYA+Pwttm2T6vbww Rztw7Ji0/nftpv7uqxLMgRgl+n3zJu2ocy7eeddq/u9TtaAqUyeyEASCnDqawXYEBKupM1iDT5Ct W/cEjRlrO1VVWO2MNmAtslPSskrU8DesI8wRzLrvoT/siNSOYD3erFmQUAFDuwkTsrKamIAciJ+A r3UHzBeYQojmU0m/FlZiwkH/u52sLu3oEX6GCZ4CNCIMdlawHhbloonk/irYqe3M5dySWnQD45I7 q5hvCfgrsGPE8iJMptbvYV4B5rG65zHndthhGSCGfdo43G/+T+9q+Cw7oQLxPnQ4GybAx247sKQN 8SFTjAbU9rJV2nJomboy5nBWwObL8ABU9Hva3p4ZQPuysbJOsvKxYRNQCsBwd1YvdU3bqt/yFmlh YoaOol1DtAjUnEtwcLkZjag01rV2nC+if6ro950wKFU7MPdJbaTWOcv01u6tKl9fpUPQoPD8qwTg 2r36e90/fYCevPgKXV20SM+8/g3l82TWstTyXC1ZNEE3b2mhg9CoaLPgA11Z0Upn9z9RraetUC7j OAHnsQloaNi5Ji5yAUVh3AGYVIRtJcBJaU38Nmyeq9Gcq6x/uC7o00ApG37Q2DVblN6wIxsnaoy0 zR7WqC15zMkazEH2lBIAoyrmUkVlg8AsJKTgDZ79KS8fbTL2LGubZLnf6F9WITQlWBcBWr3ROwJF LTQAk+hjqwHbVtcMq4mfAvYC+4ag4mGM8sUCh0SW8vBAEfbHEu+L3JvIvK1iXpixdjYnR7EoZ12q ZE90ZAaPsTyYP5vVOfxuAf2azrcJAktY8zy/IWi8pmZDaBiIsLZDLfbLBhAXdlRaWcn9PM/hmL0G OGxtBn1gTUczQrbTNbFQzppcTJ4c1q9mlGFNAwMmTol8gykJH61QhuzX9IeJUs/DUrQXczj2c12H EsZdKfujCf8MQOsaECY2O7EZyZ8l5/PHDFHEHP1Zvn93zgBh2C8Y4zQHdWLlgLi78uqrtGTxEn0w 5iMEBzijZW7ToKHONjn9s2RgoXqKmHqfcx+7naPjqNOcx+d9r+vv39E5f/ucr1tD8OuvJxHae40O QXPNoUbt4yoXYLVnz16aPmOGWjRH+xPQyH3jsKApEKd+7m8LF+np557TzpydwbwnaNUgoLCgwhLw eLXiz3UNoxHl9vBeyJyjflH9w0s4Fzfuf87XfE/UFrH39ppr3wVIuWjGW269GfqmAXtfHsAEa9r/ IdFrof/tH8EAhRk7j4fA4C28Xz1r3q2DHpuvv/2bZ5S/dpoG08ZRgtTbm5J+vU996tynAx6crXsS 0tW+9SpNeORDFR83Ul3LFvNOsaxmMM++6QSNR9PgthkMIopLSQlUQMhQ/taZQtgb6hTrz7jWF+uB x7VNASx1j8av6x+l6Jx/G5Rw8mNNn5kmMLvJiPHp8N6adat68c4HPz5ft3sdd3rncY24+SQAGvqF udgboGTlsl9Cfpdvf2AGHQyYwinzzvcGE4c7WWOqVYXhb39wMS2HWMGmqWPzzu0d+fvwNTuIL8cc 2qm8a0etHHsrmiVfxkxmQImyz/4NFfwzYwBQbzRrVy7FxOQSjZnaQc8ctUy3oFEyashSrQwlxP6E t4lXqC+aviuXzg7v4PZLMV1NMrCb3O8AdYQHmJ8x7I/lnbZ4X3l9O6v9ysX6qfwKfQko8fQRy/XX zy79L8+MPXnf3+gd/Uzv08GnhNuNVAytEPXFNfgYs7XGqhHHqNvtsbqZIUp//2ydHweTYppe8T7i /qivywBu7j+kge7v9aBm/TUUreTZd+jUA9/QgWg4XMlzbc6WNOY5vXrd8RoeyxJACR9G48QaFOp2 mtqt+mIvcx6ZeThfOVrT7det1VpA7INu/EiPH7Veb7zOPFq2WqtYD0Na9hLarY+Ewxvf/U6tU2fp r/duVtdrr9S6lW3U/4h3dVb/Tbp51PHq9P56rU5oGvaHwjUb1PqsCt3CfryYu+1HIqs2mnAcF7G8 OMS46WP7VHLKZx+san2EWqz7TkvN01maHk92xlkKQHHCgB6a/uQNemhJdIVv9kMaXgkzn9dw8rj8 +klojdfGhBH+JRHBNup+cS2J2H2ZjGNt/kKHXfdhOHH+8EfVsXSGTnqTeUUf7Z/K8D/oZFBi/+T8 1pRwSjBAbBCCfXQbv6ux5jHGP152pClhzQprUfx3ySBBqetLiiJhRBoVBgciLQlrP0RAgs9HyYBD dD4CIXwtOo5MOyK/Fq6TU3SPj0N7Geyiff8s1UbLz74kqmtD+DgCHmzeERJ1iQCJ6JrP+9gww16o gXuBXMIt/mMfFE52kPlnySCFeygCJwxUWKPUDjANRvg7Ov7/0piIPdraEUhQqEwZhHZsUzMzBtHC xPK3J6zNPEwYb4JBNwNgmmcPsesrkM4fAAKfjaZBATbxJgdtP5JA1IUkVDtCaEDye033HAgILpOi IeqzB/U7UY2RDM39aWpAtw5jwzchWBfJftv2bSHeU9SlVw9AElA2PNSvXLdGfXofBKMPQgOh7nqY RvHmHiV4JdRRIapqwKCmgBrjfTyFTHYSU1QUU5m3zwRqEzZ1v1tdHHu0xtlVAp7li3HWaYmHCVkD ErUxHUiDrPtt/s9asGcLBGpNte9OmMoWjemoGkR4cExWCHUmx7btScHrfjYDIJ0XdsSGY48+JGw8 JTi+9DpVgPnC5i12oOOQq0ih82lLGJ9M/G90w+TDjjhTeIla2fhl4B1rEG0jvUG2Vv72mzauX8xx Q6LmYBLStAW+ILiXTly5YB7qS3kAQw3VuV2rQHzsxr/EkgWLQWIxNQDpL2HR3oHX3FTeyeGgUgir Wm7gCObPjrBqZODcLNO2rYAFoXWYPPR9tEmbwAlRW+LnIkLJ5yGtQvPHzDfifRFRW/GyvPybiPJV qzbXYOGzGqQlRnbwaf7Lm4yJvUScW9as1xiQhNi5qJk50qg1ZGxaYYbREm6aJhBsNfCZ0aRXd816 5k7waAYY9eFBEGY8iTwJlTCVu3eox3H/0E1nzNTHT47RN4lddDJtZ/aO0QOxT/9xH3sNUkUQQsZf XVSasvakEWKQdoi/H5kpkK2PzTmxy1E4O+uuLph1lC37ly7ctVGdqjoFs6CSItTFauLzZO3nSNdG 6Kt5G1RZ6wI2LKrEQl4GUeoNNBUiw/UsR9ulBghyg4YATkjiUwPCALiASn66Ab8mtMMuiBeApoTK DdqYk6jTLntAx5RP1APXTNLCdgeoc7yOHs8mUsyAlQC6FHox2TNXr9z9jsZ9OV+bkwbpLF7K7xD1 ic0EUokSU/nlS0Gj4Lcf56jenYeqpGBzIJjg6Kl4LDILDeDmZWx43pm5gRCBAG+Ox+RsALSwz9FX SXAZ9onSiLUhZee/tGX2PMJZHks/+l5HeyZxbyaEfLM6WdqGXUUaC1oW5l6ZWcWqD+GcuWQ92joQ c2S1BldYFnm4NXusEVJWxnyr0xBtJyKAoCHkKA1VAUDCTwtoeUOkcfMevYl1q4FrHRtb2HxDHQYw wtGH7MTQZjtJLO5ZDeqo1haXjZPVbNTbXBf3PuYGLZrWQ9LNfGfdykrfiEf7GCPo+VfIOgTCET6V aGSVYNqVWRt/H4BV9odjGjkBM4v127cS+SZbLciblALTwnsYQCjh/hKYmVTGYRbRU5KSM2HiISSa NlJTtMDSUnbzbhARnPc8MEjnuZhJ6ENmhRogVUkpmq8dOPGrqurAxsxA9hygMyrRSKqJ6V0D1qKk PYxJ5n9BOes5/VmPfkg5oKuqFk9F6yBHi1FPzzytM+YzECn0bQlzsz4mGtu+f033LM/ThnKYetfZ 70tdC/IS1Tmzjc5rvkMvTFilJUBvNeq01fMHN9Rryxbz3sl4AmcNZjwm0uZJaGalpqNCm1FHrdAO yMJn0R6Ai617AHSKt2jC7On64Odl2lTVTocwTnai7WCtGYMkaaHN2IOYO+mYqdRPqokWGCAuVali rJnRTuR97PQ1DC3WW7eBze8szXYyg2cHh5XsMZb+W0PCa5zXMIfSTOJ+a0o4BYbPA518ZjQrqIOj udhJo9eYKuaMr9nsw8kMRw2Oi2jz0ji44ZCglqQ6mfGpwYSzGYhhFedlsY9pWjCm0lFjt6PmQOwg UdtDPazNRw1i9QfoMJiekYX/HybRHu63eZ3NvQwUl9BW9ktg0Moq8gZo9kAUJlgqnhSLtlXsPqBE m5LYAbKfB4cFAUn7YtpiLbw88qSzNhqMcft5/zYTYJNOp0Bsh6PYn2h/8LqzV5pa7fr/eEhbeYbH Zjnz1wy7F3fqcO/992otPqZm/fwzEZDqo4EUI9bDPuIF6E/S/teq/46Y9XBbtds9BvZPPlf9Xh9n 44h7zeq1+MxaqO87TNWdt9+hNm1wjgmwdmi/Q0JUMs/NDCKIub1y0GC59/4HtGrl6rA312JN8fpv usp7T0xLws/2+HRP+9jf+5Kf689/lMge3RO7P7Z/bt22WcOGD9fxx2PGiAAj9rz/qOT/kjnqf3Mk 7v/ot48jlXvP0YQkE9WOhsQ48VoZT/4dpQBm8P5hraZ9jLwZ+Ajdk3i5TqqaoKvJnPeVNPoqrjMP rckSTIsq8UczIzbXXE4NohUlMp6dXCd/qj/L/et54hRJAX0c1T+6x+econsNXkc+ypzH4GuUnCf6 +FwMvBAuDabq5PEj9PXJsZyzbu+mwRwazEnCl5mjpVWvTywXf+P1j35XwvxEtG5UT1/zMyNNAv/2 cQAL4gxSv67tpaXJunRQzKTkwzPG6JGeC2LPZLyWzbpd3ajQ5Z8t1PIjuui1WS5liZ7o+yzf3n1j iRbf2z6z7+gO2BNrV1/1O0SpfPqNlJe+t7x3f6UvEubriX5PRVlwhnSHOgws1tDxK8Iz3+CZiXuf SbZ438TZ83Cf38vjKuoLm9X52G0Rc6oZ64uk9Gs0uMPLOrHBWJ3+/lkYspg135f271tfSUzpp4fn TFXHFxvogtEwaTwrADtxcCl6ZqBHiIQGtquz3/5S/Se+om8GuGXcBoxtaO1IW8LnIjMOH0cpHVrG KWn5Mxp4O9rSJz+lxyvuUWdCpL8y6ykN6fcd7bVvXjivfYCYVqwCqHda/PKFullE7bj7Yn08CY2J j2/UnOKmaBwjzEFrIPenp3TSo7dowqTJaq0Zuqv//ZrMWh7WF0CIkAAMAkAR+6UDjmyhNd8s5pzX +ni/A0o41QvM/xaEeOHnf/vHGhO1TVfFwZWIGS7eN+2D1kT1Qkq59meghP1LJEPPlMNLFqLZF8Be BL2uXSLfuHTHISX7aE5MY8FlOnJHQzSId3FcF74vYvIjrYTI0aXzRo4ofexkU45MhDfWfIi0G6yx EPmYsPPLCDxAKh18RXjPDj4j4mYXBnWq+4GIlcy6Bb0W/GewL0eaG8mAUtbSCD4xqGusDvvWFNfD KbRhvC/Cifgfa0g4GYiwQ0ynKrTL0bkNTjGrgyQuw2m3tSegd0OifU2f7QUq4r9zyGvtiep+KLxO RuBEIcf2SeFkcw9H7IiSgYp6/DAoUeWxznv/JynZzqxMGFvSElRYo7vZH7052MbVxJzDidUHtWpW t7ZWrdkBgWkCh8bcja+IujWCA8t6WQ0CQrZh7WrvFzD0WZQdM5fwoms1TW9IWFWwYZXh1HIV0vvG tAmOpzBtqIvqaUOcz1limV27nk4fdLpm/jo3gA+ZvHQGse33OHRgLjGjmfwV6WasbFvOZEXKkgYx Z0bJoe7Skb4mM7hM9Tm8oaXcZgLsM4PcELKlSuY+EyqBsXYbeCGyBJR8jjZie+JUOIo0CNIspFSV +TFV0/owHPVwlJeGmng5GgAJ0G9F1Bn1BphtNhkmWDGSiFQY7IDmJrCxQozwMKQ+qdh30eYwBXZA ZiKzHI2JDJy5tUQLwtLgH77/EWegLXT0EYeHBWYzRE+ng7rj7A3zgt3bCY0H08kzUmFaazGgbCs9 Y9IErafdf50zW0ceeSTPt+doUENMblr1OFDNk1sEYCIJ4rYtjiSxHNLGVWsAJWDwSwBg0NZIsEov EvIcBvWOHYTgM8FIuziZuPHCbKlVkLRDqEbJeUyMGZxP5duS68AbhI0FKIs+oZv+kAIBwyBxlJHg JT+QHx5x5MWnR92GeDe/eYSGHUwIRpjV7ONf17R1W9FgMTMBc8DzvQ0mg8xmZVSoTtYmTRnvxdaL t5csE30wUBxbelqanKXcxbP11YybdfubZRp0bW8WfhPdSEkYRRlGRWBSldBQx131dz381+PVEuY0 B98X33X9Wl+twPwGpjskii9H9HvkRYdr84ibdf/UmVpFmNDcgpN0CYun50tKkr3fw0iUIUlfsxbz GLzuZ1qy4nEY23AMTbhdq5Lqq9vhp+r2Vx7UcYAZlTkLdOZJqfptPBMaCX2Lw8/QldO66sQX39Ck XbtV0dLhxdC4mfetRn1yl0Z931hDT+rDqkfb8C+ZueRk0Csmy8WXd0KBtv++Xut3IzWuaSaAqRFy 8c0BXavefZP1xq1oDaDFUfnbN5rT+CKdsn6iMpgPRbwTHRuIndhtZlaYfyyG5emtdeRVj+rtO49S 6eqJ+nXf0KCfkgANCP04b5PmzkFNGjC8DCbPxLmzFe7BR8Jt12joUFS3bxqjsuOH69ZhJ6B9go1q /2N1wPUPaNQPTDCAEY+TsP3TT1SJdaSOmrU+Tlc8NkKXtOccWiz5J7yiWe+iMeQQqTXKALQ26Zsv GZgevzDSDPKg5ZHGpm+/EpaCFqDtkJvDQtr7RJ353gfqPuI9zdyeoo7Dr9BJfdrrH48SYabJIN32 tzPVlSFSeVxfNa/xnF4aTX8CUiWZUQbsMCARQCxC09atf6COuuYxXdodUyIYyIYHztBvmwl/uQv/ EoyRVDaiCt4nz0ApsvpMOqAEJjMFMKUG62R5Ypa6dD9GFw6/AA0GgKw9K3T0gYl6E3VQA0om4TJZ y0qYv1VERmlUB3OBDdu1ZBkq4l4cPJN4tzxA4/KUNrr2jAt0SueGWvwVAATjl6UvzGN/9+yQpBkT KtGacQjJRVpQe4AuTduMR2ZGE3MoHa4if9c2LccEI78SkCENBpixZSecldkNVKtjT53aGWAXAOKB tycT7WWZlnTuolbc602zEDOIYvIaKymtSFVv/Eg8PqCPOtIn+dvmakItzFiW7AaoReOkLE+bAXXs bMnafO439MMAARgD1KMK5qZORmNddOwgXdYM3wmMhVpNl2rBrny0TVjzeXUThoH+4nbuQiIEscj9 NSkvIRN7UPrDUg5rX5mh8TypixaafUKUQ20WBqaRG/1cvydHlbZlpL/suNIEcyJ95Q3fa6F9NVhy V+y1htxWVS1iYw7rEPUPJfmZtEeIRU69arDuWAvBHtOTkCzUQyMgaPBQjs3/rHqaRR4W+QBoGNQI bU55bpdc6pXKcTmfHPatNOrsvTqT/cARPgpZc4t5nve8EupbRt14bPCDkcw+WekJRDleu62BYaI3 i70paA8xPvIhKLMA+ByuusiEBTenU75BCZuGmGgP+2UYi+EV/9d/KnkW1aCr+eNKmhahTW0KZRri iSceJ1LHZVqzYWPw22SmYu++FH+q748WNB/un5x/7z3xPvmzPNE5ZwllRifi36zerOtE7YJI3/T7 Zv3ztdd17333avI33+qC884K++OMWbPQwOwMKLFHL74E0Jubh3+ZVqx3pjw8qrxzOcXGRvyl+b2v 5rH2CJn2/okBDNE9bi/G559V0ndQlK9HyWMjB22NY487RsOHD2WP3xm0xzzm/q/J46B6in5XZ/5K GEuVaEz6nFN5cYwuDBEX+B2AdNbA2JiyxppNPlkTQu74n0GDVP7pEOGeSuVzl6rtPadoZeW44Ljc 93mMUwCbGXOA72KYhnI0/Ap37AAujaXo+QZI3BthLeW51esaMbrVH+1j59lBWf62HMzag35cmTX6 GLPRu0T3mYENeS4Zr5erhinhL9L4gV335vM7W6sB74KUiT02IdyLob2id7aJYPSMqMyKSgSImK1F kTOi81GbR7/3fjNXvTZNv7GDBvpkxXJV2TRm5UpNqOqi5VzbW+/Dntdpyy7VydNjffTKw19p/Dmd GGP7mHqvPWby/ux5xfTp3jblUfblsK+8fP3joS8pr0sob+/9PHPw8tgz3e7/5JlfxJ/5Zxpaecwp v0+UIrBgX7/GrlSWv6ZPV5Rp8vZrtfKFw3VDMQ6Q+ed3pbn/kOiGkMqLpuvmzika9mWZ3ivL0EDM QdzRMXApBsDswpdRPj7rqth3K877WC+iA5N1d4I+6d+J0OTsj9TNdQqRVEyjlh+o/q2X6qOf2J/4 7T2zlP29Jgyso3o4vHJFwrF68Yhx6nnVD9TjB5152xGafWUTrSpbHtbZqLJecy28KNyJX7mt0SiB kl+LyeyAJ/VryDiEsdgQrUr6iGY66LBDteq+HjpmXKyUilot6Dui1fAeefjY4AFR8Xx3UP/6i/XJ YkxSPGNyql2KH5Ywx0rM/KJlsJP5VYUeZFllnWAG4iy7oecTMCX0qgIVxvzDHHfL1uDbohItWksT qwDjN+xGw8KTJ54KmbpO4ZyBdEz3nfYHKso2b2HmksgTC1tZrK38TCbAgO91fgMYfv52zLqccuJR JrzHV9cCico2QOBkxjwpnX0bZ53W0MwF3Akp/lUBUL4B/x/VAQsDF5G+Rez+GO2NA8Bwa8TsR6YY DvftVA/thlwPPGuT8NnluvP8P9Qv/jsCRFzWpm0sfqRdmzbvBXasTRF7Wri0949BiNr8yqEuUd1M f+zmY5OOPZlxcAqB/39JtkgghXKj64Rzd9jRmPNM7mGt2swYcArOMwGNnHZw3slaE1Gyr4kobefA Jh7Vz0XXou9E23gHooUJVX2L8oYXVOfjREBVKlIgmNY0HL6ZYT6wRzelYkffENXF3bk5WrN4KWFA dqoDWg5NmjZGamOixrIZBg1EkNFUM50+Z20Aq+nnwzxv+n1DACkMKlh66XCXVtP05E5DCrv+9436 btoPmvbTTE2Z+h2aBltCFBDnN2ORjuZEdi28jdtnAeMrBVTAAAhbdozhpf5mptk3ApFmR4bepK0S Z8bVTGRgJCESHQqtDuCApVB2BlOrFmAInVtZTrQOGLe6gDKpEJJVEL4iVGd5kqWaxHTGZKAIibdN VJKQdFsKYrW8dHw6OOYvu59HPUQdE7YSQAR603n5ywe2hA5sVq+emvH8Pb9v0ra1a1DvzVMmdS4H 4Fi1dLH2IGnFOyiMXI7yICoswUuk/AqYohBn82nIAAAgAElEQVQFhE2tkrITMQcAGwlEt5+VkIiK DcBRBtKDMupRp35domTgmXXzBtp+DdKo5eG7Jo5Ii4t3o5HBudUrtWjBktAuBnJSIKrdHv4Ozrk8 ViKCJj5ogtkGBEENCOw6OO6rU78RkQ2IdIDzz/r2cREAAEtKAALc9ry6Q5FaomF9C29pbg8Tpym9 h+rFdx7WSS3LNO/FGzTsnGe0p90hqondtDV7nFyvdEuAWWwSIeT3zPxaY/dAQFOGNS5S6GcamfzY TXUdoHMvO0d1vr1Z17y6DMLamghx5haAyLhJBf4Mihr3182vvK6/X3uwdn78rP521k2atK6WGvZi M2Whd/LrMmMg7A/RYek/68v5P2nGiq1oZBA9grGSYUaDccyL0C8wwxl11QSitCmRLpo3q4cEPSXU 3TbjSTCypRkt1Hf4KxrzzjDVW/W9Prj9ej340m9qdPzx4XmV6fla+d0YvfvCF9reHA2NhvmqceRw DbczpdG36/4P0SgoBzhkLrhLwubL5uGN2kyToR7XOjE1W42aEQmB/mhqyT/zhhYKySCPgZyUzWu1 pCAGGFSVztc3MzdSoNvRQAKNxANi3c03bZzEPDYJk9ayiZo12KUf335CE9bj8CeUGvuTYBWztcv0 y6/zNJciUkzReSyQiZ9EQtiq6S9+pG8Xl6r5oefposxFem3SLH075hn97ZJRyr34SU344jYd0ZbQ mwBFZlLTacMqgJ+6J9ytt/51l3on4UPikat13TUfKKXP4SDg1Jm5nQrSvOPnqfqS/vYa4P7xuuMQ fAYKPWbtzyWAlqyhv/+EM9N3x2pNZncdUn+1vh75vj6Yvlm1Dr9AF9Xdqe9m/qyvvnhPL970gn7p cLk++OJeDemO6Rp+azIZT4kecwCaqd3xOzLiDh3btEzz3yBU6jUjlde4E+O3bmACU2s3BM2viVol fgBaNQjq81WeW5Rh2LQwpYF6nHK1Hr/pJGWunKH3n3pEL321DuCkuwrYRBNxkpsef0ebG/lc8pYN WrpiiRazHqTQT4ksMqnuM96vXvvmStowW5PRuFqJbwab7dn3DxA7fQWjtWeH1kBcJ8CY1szM1ay1 OyG2CU1HW1Uwz6oA0rJrNVCHBo3UkjWqMURVNq8KsgJohXYapMHIieP10qZaOqlNqTbt2aDRG4rV FtXDMoDdHDP0ECyFNdtr6JmX6aUTOqpg+Ww9+sV4fbalVE2JboAeKTQg5oBZtdWqbj01r40zYK/x rDvJAOLJrClmzpMa9NTfh5yg47LKtPD7T3THJ1OVR93sr8fMgfetDNYXa5KFwWqJI+fsRNQSRPO+ UEvBbKGAetmPSwJtFRxfcik4sjQI4uR54bFCe5qBqfIG7baFoMsAKK+JJlsqbRNdZ5JQLmOaNs1g bU72eOMdrK2xl6nk/pq0afB4zXnf6zJLIViK2NjttNYSLM8NO41yaFLPvRgYxUn2xnIIlAII3Fxu zQcBtr8mv5afYR8ReUhDDIzYoarzh/pxzXO32Osd99phpk9kUP90JM41cXxZynpkWqAmbeadO4Fn W/uC5guAhKXfgaHg/v0ZAe/XPrf/eR75PyaDlFXUy1XymuU+9PxMRBJtHzLt27fUU088iAkEeouF aGRSpwA8ebXjvSyUcLv7EyrrCofDfd/RfhV9R9fDs8gf1jf6zYCIP96X/fEUCg1Fe7CzAKTTLgBd 7PLBjnzJ0mWsO9fqvAvOwz/Wl/jQ+VWXXj1Ui5cv19333kt7oe4N8GMmy6axBiM9CC34SEjkvcOY NdBicpt+d1+H+sfawU//s2TaxemP78O9PMPlhPYxjcGeb+FKAbRWm9YtdOdtt6B5RBZoGpslxugQ l/R/Swa0ov73WAhmHX9aZD/9faHH58sa2P5G3TM0nolmie6PmUfwbi4H4t0fmgvmq0rjXovnnzVG 49sP0ADecS+Ty6WgJsyUd1kRoxxVw/UKUU6iE3/yvf/18C7xOvjYz4pJDNvrxun00YrnicnhNFAj PW7HRy8UFT5U40dKw07+Z3QifLusKPV9YiG09qsx4CA6We07SYfp+RUeDyN1UrsbdOdFgTWrluOP h9XL9ppZPSW9dkoYMyldLtPyjoPVsdrFw845RQNvnM5zxiu8xYybNLbjKeqwfF+m8qqT9DKMzf7v edjzK0L9AvgRz75/eUkzCYu+X3nV81xJn1X8yTP3PZ11KD63o3PRmIl++2290nm9XLhsZQAlOtw0 I1z2+f8pue3ePqumxg4qkrsy3fOUfbE2+57HoQEhlP5Il+hfIyo1/PTXMQWMzSMDx77fQjf7ZAvA /cFnq9PKzzWT32WMVe/zKd6bqqchJ6n/8U9r15rXdJHPf/ycJrY7Ue04NGDsVNLhVs1grXnw8PAz do79Ow1JtH3WJEN3Om/sN7wT+48jE+IqCFPR7HBcwR7qVAWPZa1rR15wStoT1zTocLza/o4Dcs75 WnTdeWzG4VRiiSNzYKcJ+P3STvYwgxJOVQhc9yaODUo4PKjUVNc+8oFKHxysg52h5YVa9N4nGtkj njsOShg0sPmGQYZyNJf9ba0JAxLh4+zOC+jhz15QgrwszOGawQp/nHw/DviC1kNkeuF7wif+biFj /E8EKDiAQZ22BA2Ap01GMzsCJUKZaGjk4ZfKeaP8+5dhcMD3ORmUMDjiTwSKRPmj31Hdou8IlDCw 4bIiZ5m+z3kMSkRaEP6OnudnRpog/vb52nHNCn9XEfbVySCF++0PCVrKQIM/e5OBCtrLTi6DlgTH kXlH3bBHMjYA2fzZf+xEZRiMcLLp8S7AC3//u8QeDyEbv8HOpVhdQl5vjp70/o4RJzA7bKrOk0H+ mNduGAwYIhMswRcFE8XJ55y8aVrtOIHJbSbATK01Jqwmbe/o3ltZbuNEQbglPM/P9AZdQnn+2Oli Kg7wLGItqx2rY7TEOK8/sY2aFvIFnusU82TN8/j9X6dRyBL7w/XqIIXzR5+YqmWsWJsdOIX6UWCw D4Uo+rPk+2N3uTqUVy1TuFTttw9NUAQP61y0v4dgzsD5QB4FwjZk8p/o9TiOJbeVQQNrniRg224g yHUtK4PI8o7Of0t2/XF/uP4OVeoQpg6Raj8KQYJN/wanpPSxpdpmPmMEE/Vgg3Pfux0NCkQbQgoa C36fEvooresAXXLVMJ19CAP/2MN1PsQGo4HFcq3GPjAaYxgzzCaaGFtQoQmAKPkAMNa0SEPKX2Wn oQAEbYrm6JYrX9CUOlfpk/ue0nPD8PQ67RGQWhxBQsAm8b6xzdftWqWcLes0eTnhn3gvswVVFaCC uyDSAWaKS7OVjVR655K/6653F6G+7DZNRAMrDwkSjAB18l2OC906cZ0mvvKA7vupo2645zbd/05N JWGK8fNnm8gRY/Zdd0iwoDb9w+RPtWqjncASKQRgJyWlHJQ1N4TiMcFXhoZLYc1j9cgHJ+oBGHIz KOVr3sWpnN/D8wl1/7LtqljwoY4dtkwHXvSoXnv0KcCojZr48ls8U1qzlOuXnaLzB/2ub//xsj5d 3RWnWOs188dn9PyX65hHZMIUJ4/NJTMXCVG8nrZ7D3MvlJIHytlZwx57R1c/yPtiJpNROFlf78Hh pq+TtyR3u+Z/PUHzbL7kc/gmmPPlRM07PQcpN/OWunsuMPtI1B2Qbc9utx59vz1HO2sQavWswzTv 4xf14no2u8TYamW/JQvm/KgdcxeFvOXltAmLW0FJpdg+9PuKSrW//XQdmTFZnz5/l77tcY+ePKeH 2s/5Wi/8PlEfDvtW0656Ts+dmaJs1hnX10BKeUGOmuycpQvuGKONvW7XhNuww4TQX/vZX4MEqyyx VJvXrdY3v30R/Bqkej4wtnLonzDuWaOsgZEMyOh2Wr6EMJYDr9SdF7bX968/pZen19a5d9+gIU1/ 1esPPqznkgfrrgsPVM91v2nKlh/01UPTtfSSB/TQeU1VD0lJHmWVMdfKAUNalW3UfXe/rxn41hg1 /G49cTGOcBeMQtKBc0GYmnrdB+vBwQeqQVoXPX48Th7nvAPYmq9SJKt70thMC7erZOkEnf/37ep5 4uV69Ka/qrJoi7754BOV12ivyy46Uy03faTrPsbsgt6qwdqxdNGv2rl4ESYlhChFlTMXfzpp+LKw plcujlVrdhmofg3X6a2p67Um32uMmRjWWcIzrli0FN8UucIjEOEji7Rg/jzNq8EYZU1hUQp+GLof d71GHRdb+6y6nLdhqt7n2Tsh1JZhVvRw/wE6euscPTbF6wxaD+s3aBUaQkx4GG4A2YwytUomhPSi 7/XX1bU1nEgit57UQ8k7f9UDv4ChZzbQzuQmaIUcrBO7mGHDnwrj/I151IP1xURfCSZurUq36NFx szQluY/ePGaQHoAwy13/LdJVnDwiiUkmn1GvYsZdIsCZGb/dEA/5fLyYJgGQOGSmCXYMadBIAOqC AS9h7ShlDTN44XZJ4BP8YZDFxEsa498aAw4Bamm519BcgOIAGLBeW3vI88jmkF7Hkw0oABqVUabn ovc+Ftlg9kHR0FT4PqKPvHdW8V45CRBQEGNmxuyI01EobCJi56pFlFmDfvT9bs8qO0CmTB9zANGF I1fy+t0dS95akJkmOpmvniul7AdeKZN9TB77vvAe4fcswJSjFn1cwMeARwoguZ1o8pDwjjHGH+CY 5zRt0ZLZF0vBfhWwx5oo1qLw9/82Rcy413KvPf7tPdPgu49347fl8CMP0zNPPaEbbrqVdZU9jvbw uuR9yX3h8eI6O3EUPxf/Hd9wY3tyyPJv/7icePaQJ3bsEqmdnxOOwq9A51i7Mhem/5NPPwkOMTdu 2BSAil/m/YrfKLzeU4CfG773PtXlRcklRqUy2ELtY/X/n+obXXe9nNiawp/Yt5VtvDczjpnTdt59 371/U0sESfkIO6wpGIC6/XikUNB/+Kc1ZbKI7h0DHg+BgWd82glgCnMwE3AkcfDnKnu5nSZNmqRX rr9UTy66QK+NulXNJnwUQNAwlkyX4KQnjT21Wfv22kL/uzzfj6quNjRvjHNpj7nfNXHKGv2lTTqC lsZBSyqb84ktMXGljDzmQUW5NYAwvOV6Y97JdTLdYgYuPYO9PX6tuZkgSyeqJfsPsDZVFJrSWlgV aD1aw8EMambyav2jfz+NHfy+LjqxpipWE4bz0HE646fbdEP9T0PY0JoI8waOHKnJNzfRaMC/2jCE 1qSs27q1WsXnix0jXnTAtzqtzc067fXT1LBjx8CQ2lzM9yefNUnlI9tq4sSJtBl7wWJCnL95nep9 9DaUjkHFmHaIqx7qSL397fXFa4vr6hSBNwHk8bvgy2jcqo6aMnClnjbYTL66Gev0z9NO1OOdX9dr t7bSpA8r9MnE1Rp5SmpoY5eTkTSZUJnPqP20W8J7fkS/l5V310VdJ+vkljdp0JuDQnvXpq2TElbq peP76oFuH2r09bU1+q2YE9CRg3DSzjPNwKcnrQ55Hj0Q4QvP/PjtAo0ZzzMHZcrjqoy11X0R9V2I MhLqv+9cBAa4r9KTKZd7uo9YqZEdn1edcxfH646GG+dTAJTrmX9hXLqN/J2Rgaklqpx1eJ7Hicfh 19e0UeZrVfpy9T9ZY9KD03uPQ4+TOjjIPwlNqCm3tdE3jLfmWNf7/nocN2Xdjez8rVnV89Lu2jT+ DTTKG7j5AP6J4kT5VdDqUeraM13vXDtAL7W5X8/d2EMLvk/AKfYWXXcEIcutaYWWyEHndNaPNw7S vy54RW2btFGL1kilKSe7bjPeGU32Tl3iWkGN0NDE/BRmuibreXMiBGbWb6uaTfcQRh4hbloz1a5R V/WaNlUW+wr6j2AFTQENstTj7G7QEPPU5bAY1OZLlWgE2AG7BayJMLgOVY3Nu7pbowBhcO3KFvCC DdSoC1EHrfEdl6BDBMPwIkBJraNGnTqoNvugU0LqFr32zKNadeo1OrJXTzU6oqsmvf2w3jziOrVr 0xWNPzt7JowpZdkPj5N9yZlmdKpF/6XShj5XVsbeiJA2mf3Y5h0WVIc9Ew0ElxElX3NJNq2waULr Nq25B80KxqhTKoBNpbUCSVHEDf/2deeLzu9/LrqeBWDiiBwOF5pvAITkc+5/+4RwFI0ttXNU2xom mJhYiyEqN2T+kz9R3ZzPjrNr01fW0ndyHaP6NuTdbFpip5xR8jML44CM6+C7ojGZaeCG5Dr5XN3w C/KL840xjzXoGuEBvuTfDgmairlJ9ZQFsOXUgLnESAzv5FCiTlHkDs+zFgg8EulHm8wGZ5cItRpQ VDZaov9dwpoBO3c2Tkui7bjLC4A/MSlq7Fb7PLDn/MJ167Xs2+/VsGcfpW7fQcg7GJoymJKNm7QR QtfhHZs3aRoDJiDS00BZHH3BwEZQ9adjUpFymwAp8aLLWPCmun3H9vBtm1bvsXb+aBBk5aqVwSeC j+1gKgmiPoSIYnEIEmLKXbN2Lb4gijB9aI5ZhP1ZIFWlMxKxr7Cdt38H1BgirMrRHyA8rC2RjIp5 RBA5PGAahI6jU3izt+TNdTYjZk2PDCShNudI49iSP9c/t6BI24lekVRJ6FAkptiF8N5cp8msLWFP zWXlVdqIyk3v8pbUieswa4kwT5x2pkCsWGPABOIq3rUEVeb69Qh1xSCpi4NKHhaYprb4vqiDw88C wgnWzspkkSOEKfUtw0dECm1sFcBWhCFthORxya+/AP7AYIBOOp59eQISTHwf5GJTnoyoJAP79Y2b N2rBgrnatGE1virYoKnTqtWgf2i+OLwfr89zGdyFO9H0QqrKgh5pzxjAiQhtf9tJWnDKR8eVLvtW /7jyEL1fg0WX9wpOJGmvMrQNCmEczDYHzpIy8nFkl5j4nZ68ZSr9woJvnwpIbRe9cZ36v4XX3XwW jWQiV8x9hXZHTXrPLu2wwzuyUUqMoPfw3LpGkx+/WN9ZTRTAKzFxj5b9OlK3XEGAWpjTilmva+gJ 77DA4hwytvYwHtbrq/ef1BeoT3q5M5m4Z8ZbunH+aJgfgJKK+Xrs6m/0D8TBlTDou3NjKLAlMLG0 TqNvOVFjcNhpU4XUZKQ22NMVFo3TnZdCfLEom2jWjg9149Hj8RlhVNt3AlbAuFbQb1bTLNyNY7c7 BumzCrzfo1//zWPnqe9LzBcAlYK4rVjxihl66YqD9WYqz8Ckp7A8TT9+R5QUGEI0CinXBc/XW08s QQuFzZpftpF3TffN4Z/04tWn6M1M7OCYWyZW82nPXMw6ApQIEzdvxKU6i7sLeI+QeLf13zymC6fZ 14rt8D1kPX98dZcWzX5Ztw6ly/hVlbNc3z1wmvo+DYOXR8SO8PBYY+/+6R09PZc5VcKcIm95xRy9 8dgC6oqkl/LyJ/5D1057E00KHPDl0IcL79L5Xz0KwFaoXTDq7D2a+uwVOvZVmE0AALveBIXRz89f qGPRBspDWlGx/A6dMIHNh3FfQfvuwUFsyZ4l+uKRSzQRJ4/u4eTkXZrz3at82Ghhsnjl0EZFZmTN 8K36UR/+7TR9UxOpbP5ufBswJy+bopcw38nF90JexYu68vt/QgTA0OO7IIl2+mXMYzrnSwgzCP1C zjHA9dvov+mMj2BQGcuJWSN1+S+j0BaqgihIJUICKDNExp5xj+vsKc8w/+3hGSk1BFIu+Q0uFm9f oS9G3IgPlPKghTNt9WKdPiYrhPUt2rohxAFfMm8RFkeoSNrRE44nSqYTnnMGzK+J9yr8MVT9qvdf W8QLslaxlmSv+0lPvrIY8fouogvg5JVGNavKoqb1P7ymYbNoUuZnEgtTIWFeixZ8rGGLWaPZsMv9 nuOe1omTqRvrXwIbjEHmMsboTpjYShx4Lp/3kU74BYYXba5dDMpkTD1+mLZaM5kX9lxfsQW10d8n 6b4FlmwznmjyZ9fM1yhv1Ngg5lCVhPRKfTRxFMwGAB/7jx1YZQIsVNBGBhw97lbkfaBz5/q16POE b3T9ym8hfGDk6ZM81osiNmPXzWBsZRnrD4yttcDyNm5QGaCdI2uU2bGj54z3A/YVm3XE1mKaztoR fAzu2YGrfRI5qpNDaiZCEIURDQCYR7tXseeYTTUh5GQ7SjOpGRBNdp7pcnaicp3n8bhte3CAWcki YG0Ob+ThmWFScci7JbOJ1+A++4Wwlpe1eyoYF0WWinBfLtfNSNoexvMoJN8PMZ5A9JhAtlFnEwUp MEHe2/IYtzshKku9ptGmdqRrk6Owx3E9lzWkEG0Lm8OU4iTa4EkZzzGBb7rAYI3bxxoW9lNjwCNE 0aFdTKQ7+duEtgmgiPgJF/6DP66rXyq2XnmNcX/v+/ji7u07cTZ5vB544D5CiT4Q8mZAJJd4gaA/ vfP6n+sdpdh6te93dP7ff8fyugg/3/dXT+E8YyOUy4UYcAIIxX72+eefq0uXTgFgNLBnp82ZEGWu j2mJ/zaF5/wxz/7P/m/vjy5SDwNQsWqbhrGAx6ZKJbTZPeoJI5Cfl8MajDYK18zQhbaP7v/fflOO x0D1ZOY4bNQ+yXVLuvtXjSPS2SfKunS0VkzcrGu4tOafp8EcxghaZzUj6mRgv9B0qH8YIOD0mikT tITnhLHHuQXjJmvNzUTeskp6PFUy3out7QXTnmLVUVIi61Q+2ryWdpshrg3TU4FBu2mvDO41NhNU 6pnroc5xZQaX4RTexXm4GJhpmIWxk9ZozaTtum4N0Rge/lUVK/+B2cD1IYJDE943OKRlHVo98lSd /15sTw1OTmmH5Pg7xNrsNy2t+kJfrBka2uJJnhMY4Hg7nKjxtNkH0nnvaHO8zVa/MiDMUYMMZpQN oJjBjhj4JH47ua4RSBEx9r7H+dwWv477WqtPhrYlJL01A+Z9vkovfOWoE1MAH+AFXMjorzTpFPap OJO4ZGU7Tdw8kfe8QXV4jtsuJXmhViRM0vj118h1ezD+/PmfrtCoqY4uMonQnDHNlqx/faVvzsgM /eC6/zpupV4LEUi+0S0t/UDSe19o8iC0DlwOH7aLWLvzPjaNLqb+fmenGMgUA788dooRQjHSdH3H G9Xk0o/3tkHu7ph5kDV2Y/1PX9NmdZHmW1gVpQBQxde2MVe0UtIoQk8n3hku+5q1CN1Wa0edp798 TXhbQAqWTuYcPEV8DfRa6LUyKbWb+rdapy8XsTfHy2RRCKBEAut6BE4snrxGj7w+ER2MmXpsSLwm azC7PYJjr69IuDfsSNMlL4xDkvOJrl5ehG8pNPJ4jqV6Fc3O1MgPzoxeIeR52Xsofe102LC3NXvY vst2OvkF9GU2zKZNB2L1aKpjG23Vd58QdJJz1VMESiRCOzrZfGGXNy32wN2ZrFvMoxrMqf1TLQRv vhYlm0asy03Sc7eOQFQ/R2dT/0U7UBC59N7w+8ycKCfPYM9xv4dv1vg/Ag8xUMLgQwZap6nxevnu 0jgoEeUPPikALHLROK/CrH1Xm7ZqAF1Tn/7aRn4z9k474sx+Kfv7n4EGdWjnrex7TtXvicqpHQci MJQOIIFDbu6fbALlVd7lR6CG80QghI+rgyTRNZuYJqO5EYEQ1UGJHayTBkH8PIMNWxGWGMRwqg6M RL4nImDCe3V0vZ75V5JBiJ2A/vXCr31/bDJTPUVghc/vD0pE+SJww6CEk0EJ+5tohTmIfQY6tHox dPi/SwnZ2dloF8XUy0sYDEUQ/2ZCTSREG3vv3r105fnnEILnZbXNzCZ0CDbAEEH5IDO7YAYKq/KV irS7U7eeGnDqqaqJGsnatauDs7Ld27fjzX5nCMXZimgVDpllqXzr1s0hdkz41EZ6k4IvhR0B2a8A +SkB4EjDeVSj5s01ZeaP2kNjlyJpT0Olqlu7TmpZqz70WRGe5rfry/ETYBxz1a9fX3Xv3FYH9+6B xk4trVu+VEXbVxHrnTpiF23m197XC0uQpDPiK10m7+noDltRBTrm6GM0aMggbdi+Qct+W6o2DZrg Ybumps36hWghhYR+YQPIW6btG1ayUXRTesumMCtFMPatUZHBM3xCPmgfhP6mjTgqbKY69Vpp6nc/ a9q07zV40MFq1tjqVIAJFV5Y07RqPT4gWET/H3tvGmtZdh3m7ffum+ep5qruqu5mdbMHDm6SEqeQ tmArtBlIipQ4CTLqTyA4kZTAlhHbsAFrsCIHljPYQOz4R4xIVgJFASwbEUSJmi2JoppDj+wmu7vm V/Xmeb4v37fOWbdO3X7dJCUif6RVdd85Z49rz2utvfbai5ylWl+aL5vXni+XzyH5R5L/mc98JoxT PfXk4+R3C2Zivjz57NNlc/FOufn8V8rZS4+W1uMfKOce/1A5hfGXHo7Y/MYv/Twda61cQ5372fc+ ywTOZMaxkOff/FJZY6JpD3GEA+nqf/KX/yMm7qPyj//ZP+JYzJvc44xhTw7Gr2IU85WX3uSsOt8Y 5Tvmesw//IPXgsDyehyN2KghonHLAcohQePuQ/QTexfUkEyB0GIyUjvjPmPMYKSDeoxHsM57Yc5b nPnfkxhguAYhKrOgVAQwD211bDuBhwt/yENGPKzN0z+rkExeUoyk4ZltkAi8FECpuRNaQPrSxwa1 MUBQ1Wkr4UqD+CSNzMfJI995BSohVZVPfJINIaiXQRhO1T/1cwdehibwlBilPgzWDUNMNIJaJult uZpEtRN6D5NOlcx93DppMbD78ZTIJPP76UCcNqHC2XptuuY7RKwZGL8OUKky69R0k9y1Fqi77oTA m9JHhXWywK0SmOBMHVTuFcGsUKTuJlFPTcQUgPXCuGr3LiEIdHEJhyoNXxPfISZHVZK9SaA6koVK Pwy5fdMbX/qwS9MHISGCupm3jGsY7cTV2rLeNabpcY99+o1lhAeP+c9jHu7YQ1rD6KLMzQ67E+uA dQ+1vE87HLMwmJAC0LCXQh4TLH62jyprQ0j0xzF6JwOzjsG5PRbUQQgUsQogjUH6alzJSP9Vm2aH xYuSlF6Y1E2IMftUHxP53JMfK59473Hl+ZAAACAASURBVNXS/uw/Lf/nDY61YCCXTAPnAXAbJR3t OchIHjGvj0F4eavCPrhsgKdzrxpHJIiKJ4JcCor8NtpLIkWbEr0Q94cy44wnjRcfsCasEk9GX+Ze WwnH1HsvQtIe5wIEM8cK78hHYki7Bl5LCVdNvdGvEYA4LkODjeNb/ZRfJljDnEhQMbhAXTAPHJMv E6RNBbXLERMI5rMQj23yR6Yskngj5GERHqDMOwiHvQK0pZohR0F22UXRgGQ/R/tAt5yefLr8tU+N l5/5uV8vzzPXOu94C4zHPOw/ClnVlrBu8YTxR3hMWt72srjEcTmIwhGF1ZSpB8PE0Vfxi/AQQHBA Uf5Qx2fcDyMQcN7aQqCgbYYhhcsU5gDNrG01WKjTfuuY9tHOjP2lh7qxd8tSajxrg77cQ18eM0/w cqdd4cAhc8UG9dmiDbw5w+rwDvp+5hK1KXaZe3bIQ02PAepzjutIR9nl2qBOlxFo7uHPhSYI9FHj pe+FbSnawHaYgoEeJg+rfZS0NaoaxjPJU9JBPDSg/PM/8jdCwCFTkKrKMgYKMnRzh1Zwh+ebgY1b X6M8jDtndJEAbB/zdUxrKDK0E6mlcXacfuZn/0X50R/9MZgO+qfCMcocVwUTt6nxkGlUKVZ/c97I Z8wv4WXGzgZCNZ+nXz7BKNCz7kXUucw5g4IHPfL9/8V/HoZu/+d//I+YlzkSQxuoGWg/M64bHfYh 08s0TSnfrYNj6B/DddwIK67WQ7M83WkQgWmA+YL0PCaixuQh5+DViPzh/+YHy6c//ZfogxyDifm3 0rAUL+HcpXfH84/6Z47d4Gh7m18+hGfYTvCTvuEvbSJchKaTIV/13HPdXzJf52d/Qu70m1alJ1el 1R02NABIP9PK+M1wo4zLpUU4IOACWj8yl6v1OWiZd+Nm3j47eRM+d+MzjGno1szH9yyn/s00/Ray /OYvLHHGP+NkWn4LChGE/HaMCdUNEvfrx3x0M1y+Gy6/fU+8m/mrKWB9pNZC1l0KLzJf43fjlm7p HjbUwC++bTvLwNNb/ATnONPLMqndIohPphEO/PHbn/RUMjamVZX4fn0Y3nAKag2X+DbTa7p1t7+C sCWuZBZs65y7Mv/sU/o7t6VQxnrLb4U73e4Rj77dhBTc2t+dM9/18OXwXmB9OWKtcU4+BB/BDVVB gbjgt1eDK5gQ5F+26r7hEQPBTRZtEWmraIt1UojrP+njCT2sGwoFtljLH7/ySNiDuHP7Nkfuz7OW DHXsQ3grR8IYecpkdwA8Jlg71qXXaxzCz7aHD2xCH0xoQvqt0t7Cw+97TzzXqI911uImeEWo2omC Rxs0bNlGS6kJugm6GzbDZZgM3ww3gO3CgzfeCLsV/R/+9nIR2mUSvkJjkzL9G5Q7jWEqdGmxbntD RhsaSjtSafchrwNtGpM0Xw1huna3oPkENSfUoMjjGLqtskmxzobG5JNP+sltZ6+zqeSVo/fbqWOY 03LVeHh7iDgKppdGN8UvhEq4CV5NmsY285rS8OCP7iu1vY2n3//+EGDcufZGmdFOYt3nFFTEcRTr 3z5XC6fyiIo3fgge42BbpnN0RfdTdZ/X9oTvLehMjV9ewlC0xzc8knrIJqPwzGNX4+kNagorfgRN 225wneu7fPlKEMJ6ymzuT1SqqE4oMhX7EEJnLlwoo2c4a3N2qowjeezBAM/xDFbBe9nRkThC4qK2 wOLmQnn1+qvlsYHHIdJGyvz1a+Vf/8K/LF987vXynZ/8YDn1fX+xfPaXfwsDHkjLf+A/w/L+ZBga UxPimMVYQkP1V4l07Tp87dWXy8033yx36cSjWLbX4OX6NPe3T86GMGOYxjhzei5UFk/N8oRI2Wd3 fpktW420IJpm0nEHDQKQnW2ZJZkFeGLsQ/DtuKASYLch0JghJEx5SAR4a4TEomphEh8u9kNoEWhw bmSYRZ98FOK0x5hIuQlgf5vdKIjMQc4d9yAM2WcH9QKL8OOPX+UoisdR2AFk8jiCMHfnvYfMJS7M NvAjP88Gj0OMH5DfOrcEHJPW+PkLqOoyKXBzwcriPJ2MXUbUl+ZgviDluYZvv4xh8W10go4K/jd5 l+nWWNv4xDDxxsptJsE9dpanuN1hS6YAgcoAwohzpxEKEV5m6RYqqJ4zHp+YK7euz8Ow7HEF6gXw RYWazi9Br5E0rd6HMTUWBvOxroadRCByvLOBaqoEBBRsF6LYHcVx7WwACr7UzNmhA0ukez+ufcwF wVs2JN88jysDF6rQhNti0lBQpsqut8LYaV3kFHrI4Ht1qseIKkOGDAAmaoKAiU0rM6rtDdqV+B5N kflVZfsIBlgcJMxVU8YnGBNEcjCdFZF+yG6T8Srmlx1I1MlMy50wbZz0gY/HM2Q0QqhgxoB9R0JR Q0sKv3T1SJIE9hj2AfqVzpLOPv795NWPQEt/tXtkvkLAA54ysJbDozPWgfFdcLW9QvJRbt0Ew0jA iK/ltj/bVua/G/XD/g9x9RMUaPhu+4mLwh7Vo3VT7co4pi2jZRiJF3EwrG1tfnE0BXfzdIKTiXLx Fmf7hMeRvOJQY357MNjmP0ybOeyUupq+Y0B3CatB0gmmh3yy/WSSzM/6MX/z0dq9DHb0IRm9uiym Ja6Gk5FREGZcx5dMJiOOOqrDEydUzGAqrO9+0o0+rNAMvMXTcm3D7GqHwF1zd6VkxPFQmhETrvYJ jmGWoz/wvks57ZsaXHX3bpAFxNtBxojnVXDjG5OhKj/GIqa6bh9zXjQmddKm32wyr7RIW2JKodoW YWYZJxo1jHIcLJbPfx6tpgHshTxBmyN4GHLHQJzs9/Yf5tAdtNxsnyH83cmnYTE2RHowLFHP1JUC lzEY+V0EYBKSPYx1jwKMyvBBNG1QZ/aTXdK/RJ30o13loizjvk3a3lO9x5w8j1aARxqGIZZsSxkk b4hQ3dLyDbEradtoR2Efd2/VGUSlz3FgPdlWB4RVy8BC2C7WlW2s39lzZ7BnhLo0eUioDmhUmTqy 3XpYK0xbAtBFNBZCynuM3Z/pAdRBqbfpRx8tc2h+qHmnwTGNIntrxhB1to1gop88RmjDAfpGL+lt oj2igGObuhx2TkSIwOQTdWg9BsSDP9SD9ivETSJ5h/rzWuopGGjztl3a55gZyW+KPrRF/xoGd1cX S6tdEuvEZCVETxNOIsH5bphyCh6x8NaNaQJ5DGMSwcw4a53zluqult8xoPDCtu6jnwa5g/swfWj6 9JkyRt8yzV7S0G6SfUlDnmE4k/eHKKfHPxTaKgy2fmcQpinccEw1QeLcH50+iHPHfDI3juNvFpxT gimPmcGRb1VXglHHku8Uxa6BstRq+cvf970x5n7sJ348wvZRFzGve0yQNhOM0wS/Iok6Xf0d702o oigUaLpGthHXN+taPOo/UW4Z/v/n//75cvnKQ9TtaLn6xOPlx37i75U7GGqboB94bLIFLRLC7Cry AxlEmoFc5dyNe+TWVZ5mAhEfhzgCSvtrY+sQ+snx84M/9FfKpz71F1i7MLxL3VDVUQbrNefyZlp/ lHfb3jU85/E9jjvkN2KJSFImMoXaMVbrOIYTZOoMKxvaZAwzLd26wfwSkjHPfHXP9+ybusmUmr9+ +TOdTMun62iWyTDJVBtf0E0Qp3wPB/6Ih3GNk2lmGL8z/wzvU3fD5NjJb/FQ8LBVM3XNOL5nuYzb zKPp53v6+S4YzzyauOqum+uOkEIQ3YR8mpbv+R0aDHX+6WbtZFt3t5rrOzNp4GRa2S+q9scdv6aw IWyzEO6k9ncOeztoljnrybBZ//r7y3ZK3H2OIlBU8CCu+ct88rv/P/7ZcvOn/7wqP+Xf/sgvlO/6 59+FTYqf4k4Ryk7/Su0K4+1C+yuUsAzeoBRamrh7M8chdMAoY3KrnorGmGkq1hwhMeGFjhHG+Hrr nxBOkIcQQgrX+wboH8IOBBMJaT9inbUmBRIKIzzS0QGOdyYolOhAjZdChzHWDA01K4zI713evZVD mMJq1pH0CX14jR1zbSQI2mbIafYufM9pbNMlKGxQmCDsnyCASOFDUyjhcY5DeKMmGC4FFLprs8JN 63u0rXyUOh7LbEoriEjwfZI5O4UKCic2a8GDYQL/+jsFFHEbB37GSQFBCjWM47uCBu1FzFE2b7lQ KCE0hRHxTX2GZgV1q1BCgYk3OyVk+BRKZD4plMhwX++pUfIUSmyjxSsojBikfvL4iXRIuIFHuhnO 4zDbDYGEbtqeOCtNwrtCCW1NrPWzcQ+NIKQ9CTU0R+mfcawjfE7+Aw+IkTgWW6/h8moyCZwAFkKZ kh6sujvJLKI+3bN5WGY4z/TFvRvlLgRVewZiGQJmdZ1BwZbWyvKN8ghq0FexnK6GghKAcQpw8fxE OTuL2lPLnRriwLhrqeqIAsDN0DrQfVTKIVf/HaLSTWTUpVC/QY1+Y2GxPHrhUlzn+fuf/4PyBruC Vx95DKZwpJw/O1b+0l/8VFlaXoJA455cCPItBpOW6rcpjwTwAer9CLNY8tiJoEIlgbRvcaiKERXU 4w4FAod4UhZ3pCQ69lF1lPAN5gqi7hjNkEGu3OvB2OUBA+z0zGmuM3wMNSKuqmIi6keTBPKeuBC6 WOV/883b5Utf+jK7l7vl7IUnKdIakyAEMUH23BKWj1DVEsbNClDIMkJnYUMj8u2jPP2DU+XqMx+A SFYVcZ5jLffKwJlZmAGYjx6YL45pHHMzh2e+BziisY/KvTcATGJAzuMp61jf7aVeRwYhVhR0UN8y CveQ1r/4wktlDgHfEJ3pmHba4baLc2fnyt076+XWzeXy0OWzQbi5q9krMU/dStj20F4y9hI14xDv GsV0eXCX1tMYGt2TUFLDIlTV6TsyikFsWZ+EHaWcHdVPJn8JNo1RhpScdpfJ8TjCAcwEIiKYDRhj 6knBledjlbZP0K8mUMsMuxz0YRlOMoE5YSc2hBEQYGQWxBplkGA3vouUgqnYOWSSUDARuBFXAYxG OgXbYRjDje58CqEJwdNyQ9JH/UZcvilwMGMKQRSeOKbMB1Yv/JyAXZT8uSvuGXIXZJlufwr/TENC 4cA+S1yZgeqnsVaIHSYzF1HTcGBrd8V6VTjjYmq7mo/GHK1/aWcZFwUmtpsaK0GIEEcGLQl+gtFf YURJw/jiJRPlu/HEwasEFUa5kEu4jLDjKpEr3i6j9jl3oUIYSLxIh6dXEVpfpmYYf+Im3lGPpK2Q wd1bY1l/+ll/Mj7Wr8ISd8IVCmmUdpIFK5gK0png2510NQyi7cVdvIlPsYMxd7dZJss5bAhGWBVb 1dEtk+ns0F9Ura3sqcCggo9tLmOcxLvqhATqSJFlvEMQQH3YV2PXnn5vvpYvjo8RRvV8tStk7kzD vqpx1BAAgYOCPMvpPOMxOibA6AeOWdORgNmGaR3Gf5I6V3inlo03FJXZU4xd5jDCVZMKcdVmoNy2 vdpZJM7tERAFxD9Gu2BHQRVzz7F9nIXRcdhP39qDMAjciTdG0VyEguizfshfo7OTqODJiG4RVqNe MtnH/AIYX+JhOewjIajDox+c4+YJ51vmD9uWDlWGwL2FENf52HGyrwAOnAYnufaSPu58E3P3rZtl DUHt6QsXyhyCDIkoCWFtPaxSf3vMEW00FxR+hlAPd4Uxjvkh1EA8NqJwaYo2n+ZYyTaDeoT5a6OH 89uep3P84TaFJp6aIJbB9Szaj7LILHuFaA95WSbnrCgbOBs2/Oj39gHHiX3aPj7EDvIMee7gvuu8 Sdgp+oCkYz/t7JhV+2Sdco9AwImvmhTelrHHMbA15jiFnmP09ZhHyNs4Mirj9EO1mtSAcM0e5932 Fuzr9lvHrR3B/qZQ0Gt191l3R3EfIcyxczThrSvzET/Hvz8F6Bv0w1MIk6Y1skr/2GcesV1DzZl4 uVNonkIIKarXB95rp6/7sN6sa3omaFeCT8dmzMvE1j/eKagaCCu7y+X7vvd7EMgNxbEOBeuzMxhG Zt1/QOsscrZ2LG31jLmRtH0KVbrkxb/KrXIPT/5E+Px44KlWmOuCZ4kHy7PPPgsBuRzCgO/59/79 uMnkb/7NvxXtF3QUi5HaVN9KCNzvFy1olUHWrM3NNeipVvnb3Bby8X/rw1xrvEKfsD49hklNg7jj XbBu/7hgv+mGYPBYK+wbrlvOv2FYkn7EYhX9yTjV2sWYpm+77g0dsk5yDFZIrYtcO/V3PAisePH0 T7r5bnqC/TWh+S6TmKC7P9NPMH4zvXRvPhPnjN9M33DdzK7fQjDh9BfBPK0368dydYP+HiXZwk8h /jDriPmal0/jduOZ+DTTMmxCvlu/h9xoZ96mYbysAwUSQneZTnILfCL0/XoPN9ITtAfhd5a/DhqP TN91JuZ0w+ETGhg1zoYRe1XfdTfVjBelwi3LFIl2/yFCH8d5Mo7ezfb3W78su9+mp1AiMtMByHru 9HPmzP+Q4y3/7UOfLu/69R8qV1lTc95JoYTxksaVdnHNdO3rCCWgA9SUUChxxBPisxJEsMan5oRp qCGhUCG1JyJd1oKEYYQbO6wbCh+EeLJmJ8TNTnxo+FJhhAyt+/rH9KemtkSGbyOUfwDqsRGaEg0P BRX7pDcAXQEx9RatCYNeZLO4D/ojjStOsgl3EiiUkFF3JXM2SqFEChp60MDvrwUPKZRoptMUSqQg ohnOdPK60bgem8iLXC8q/ZGWDhQubNZlTaFEMw+NXioUSCFECiUUDKSf9aqmRAoLUtOiB+2s2DSh 7vPYxhTlEVL4YNq+J1R5oWGLQ2pPNLU4MpxP82vCEt+JX7qHwctGv5mtbUYofPDq0Oa3VJ3uTfCY SILXhHaDxrxryUF4uek8e+Z02Ji4wUbNSSBP83bQt4aapwRl7OgySDW25RnZ2Ckl4jqD6gIWSR89 xIjJ+IfK6Oxk+e3bfeUMAoKPXXyqzHNc4DdXXyzLg9yMcG+da+1guNowE5wR78NI1w4L4A0IrVtY a7UC5hdXyr17KxB4MHjDEAsKPrAFoBhVInKImy7c3XQyvnnzVnnyiSfKJz75Z8ub194sX3iuIv40 EDbA5Kolb3cqZYZlIgZcbEnSndKWaSAUUIBxTLq9qkegmRGLMq8uzAaXuAjGjTgyVyZwAGG2D8F4 dMxuHrsPxxBAXOxetjc5bw7zP8GENzODNf3Zs7G7tAGjPIlKsobk1ridYZOjJctoefze5z7H7joG QC6dxuCHiwkTE2ewd7nHp6eHSQLCOYyB8tzfwYYGBhS59CQMPY2h0XDENZ7aGtjahjj0+s9lzgpv 7qGJcZor8CCAWewHIUx7EAJIYGwzSWyg0ryNOnQLwkQL1R53uXbtjfLQpSfKuTNnIbLpdBjF24Og v7a0ULRfcXw8WOYQtIyNTpQ33rgGU3LM8RbuwOX6UNtpj90XYWBfGyAYTGPiczL35478BuXtCLQi ZMUgu/sm0+vPXWVxpLXRiIAwpk1ILNz2WQi079FPm9kXIxz9EO+KpuSRTKJCCXHwLLc7rObt9y5E fhDixJMBMh37sCDR2+IITW+Phj6rhVghmIII05X4NE9/4poMpvhvHVb5mY4LrPElEgZgPFcQiLlo Gce4gUf0tWqHXzcZFtPTfopg3ZmGeWb9KdgynDvkwbwZkDLJZBg2LPbXggg1RNRMcBdO3E1XjZFd /CMsaclwyGyIT9Sb9YN/ENm1m2H1HyQPBUIhZCE9AlnZsYNu9TsOHR+VRgdCTPJTgLlO/pnGtnEM C/6BE+F3iGc61oETlhoZ7rIL5hU3A1hm8PBaw1DVdnEFJ/OzLkxLHDepM9/j/D5+a6glhj/j1LR8 Nx3T0ABsMGbkI5HRkmggXQU+EoZqgtg3ZK5sO90V4g3Ql603dzZ26Sf2Z+vQ8CucO+yFIRyHyVxF urzJ3GAc26cNPgq5ZOD3SEsNAzWL1HAIC/F8ry8sVDvplEVBLYlyiw/H1RgHcWyDvmsvVRtLAVpc acb4bNPX98jb+ctyLjOP7lDv5zhW0EIjYhvhr+fcHYOCTPExwog90o4W4XuYeVfhp31XBlrYt703 UeFUvclGBnrpN3B9fDImwcdjAusQKRIKIxcvRtz1xcWy3mCuDpk8lynTsW1NXR2ALw1N/Ir4jpGH nYg4/kHdaUhLodfBKMYwdSdOGy2OtsI0BAMHu4wj4rrj32ZdamFX4ACByBJxW1sc9QPHAeZ761ht IuvJYzR97PKMItilA4aQ4oidoR1uqpnc28KOQglB7BKCWSd8b7xQq2FfQR7jWHEetkCZY/EnH+vN 42VrK8vM+cMhap5nnG9hr0Gh1SD1ZZ90DVIgRQOUI9pCg1S9pDfM+JRoXsY+zyY4iquqtSv0B4Uz lh/HsO2gFpq3dzieHWf2nxX6kWuHgqWzqNruM6evkf80doXUCliEsVKQE+dM6e9rEADior0M61Et jX6EIP3UhdqH9lXLpds0vxHqYA0/bwUaJb67ZRPEuWcbWLf0O9ffAXaNFBcuw/Rvkme1248DEIQ7 z2QUHXsx1sDjJCYrIr3DH+vTn9puzqWpBRZMAvUX/tSbV0gqoCYo42CzfCc2J0YhfH/iJ38SYfpN tH8Q5MB8O1ZyrvNoh/1QsG9H21HfD4Dftms45t/qqVO88cf4dKJITdEvMhKaks0atBnvcRTyEnae nAfUCnzq6afL5StXyquvfrXSIGThDYOjkVhkdP9P7eZD/E6CDt7hX+PPg5m+woq+4ZG11dV7bBiM lr/+1/9qefaD70f7Zz0EUyIbtrOoj17q6O3yOSnvr+fmjr5t5S/B947ASgaRb9c7NzNUnRZ0S2Yv +5LuzOYdZjDTbPrb3/wJTQFFODT+ZNwM2/C6H7+Bs/7vFFb8m/AAHqRjft1MeDM9hTP6m04KFlyD fM968Dvxth4E12eFkkLmmc9w5E/G0b0bz6ZfHkcwPevU8E1/vxPS3e+me/rrlj/D+stw+R1h6zR1 GyffvAbUbyHixdv9P5kOnuEoVunWybMOHvEbeHdSqbtjxuu4N14Sh4ZTtFG2R7qbRqdeacf/65cK N9j9K7x/ufwgf6UVBIW3u9Al3rwkKKjot92Z16Qt3FBSGzNBTQlbVsFDHtNIv3zql0c3PM7hL8E4 3nWhcELYgKFUAKFAIoQUrFHqQOjuTxtXCiRkmkNbIlZ4hEjgFJoTzP8sdO7KEY+d7UiVP+RDBeRX daQD4+f256hm/IYadhXmODqtUEJomSbgrRzJXKsDoMaDkNoDvitYSIFEfvtsuvmdRz5YQDt+3RoS TSGFa5ngBpEbGYZ1KtWYtQIBtT7UVFAgkEczqhgw/pYdUCjRZPhTKJF+1mke99AtBRxqJ3BnqU4B 6oJUOgoKFe4z5/kuDoJHTVJ7Qi2OANaWEHzwkflPsGnThCaOHhWBOyM/6A6EKwoY3HhqihamEGYL Ck/k0f1OTYlmunEbBw4+FU54dMN3tSMURMRNY40I07UgSvtbwgwbyW7UqUAgBH0cb2/9A48IcVwv /goGgml0wWNCcHdOhkSDWR95+Klye+5m+YU3vlDugsi3X/5AOfwKdhpu75aPPPXxcqd/rTyPQcX2 BkQBdT3A0YlDDIbchqhaWYeRgfCRSNqDiZaBUUVnl7H0+tL1sgFhtwuzfOEcVnFPYyEWwl67D6+8 +lp591PPlAUI+y996QXOrq6Wx64+HjtMEgnLnNu5u3gjJu4BcByEuB0KhoFuiESs9ECsyQtBjHku WqK5FwaV/sUTAQxOKk4MuFuG9sI+dis8ouGxgJFROqxCCQINjGIfAQHX6h2YFuqUpYSF86gso8Eg AzPHNaJtBDGHEIxTHKl448at8mXwfQjrtaGuPIThShscMti9IQmE2JXD6GQPO1LWu7ta3ucOBxBq MTsY1pzAmOfm8mJ5k6MVVy6eK0u3lsqd12+VZx5/D2rU7EYg5Ojtg0kaw+o/Z7w31nfY3YJxo/Pd 8ox0C0aJMqoSbBs7uUpWSRxL8GrwbpMjKNoQuXnjbvmDz32RWm2VK49dLovzaxD3MqgVsxy7yBA0 BxgtlEn058iWiJUxTjcnetsCWUsw26FqDANzRDr7MFIy4DKAMoeCjKvElYyN7xKUpiWzZdgIw2Qv c++iHfEII4NChKovgYNxUqgg0aWwSqbdOIEbOJp+EmS6Cebhz2/9DBP5koe7B7qlf4aRObfNLH+m GfiRhvhblniSvuVXSivxplvmb97G5U88411HwPwiXepAKtj39Df5YBLI291OIY85GC+JHpn1PCrh TpV5+zMdn9aVoLaCzFPUN3Wsn6r6anXQKlHv4hw/vq1PBZem7XsIpIgno07iET92YXEzjRB08h5M vOmQRqRFPgSOd3cbHBNZN9Fedft02px4jiWFCwpyLHMsivQ3+5zlsg0GZWrBS4bBeaYj6CG+u5tR dphSw7s7CxZVGcRNfJmnBK8k9C1snICnxISCLvmcXsIc2wdY/C2jzNIIhL8GT01X2xamu6XAjnQd 28Fu1OWNsU44jToOYRTUcg/L0Csl5d01RObKKyEdM4O6E9cjTsP0J8+vbyN0VcvCYxkjTPY0QLTX brRLVQbIj9Bisg2ObAPitrn32KNA3gJ0xO68Qo/YwdeYJf3UI3XjCCq91kzct5mPvKqqFw03b72w jizvJu0wyo667SbOLvAtBCYyw8fMhT2kjxpYpOfCdKxgwFrR3oTFiT+0v+EsMz8FF7wwAAhA+m3q ewBBzhZCjDdgkCep976lxdDc8AiHuHgV1gg7c73UiYS/i7W3rlgbmL0sP/VLzBEcnxtkog9DTOCL PVPmNQhN6td5bQNmMtqJMjs3HiHM6UUgOz5Nm1Nvm/xsGwUIDBylrlXetH+b+dA+0aMGCXE3We9o PBwoITjSKaW8Q3jWZt10HGywTtjmRIsn6MTTGgp3/cxLD4F6UCPKfr/DPKIND3cRQ0uM9DTc55hV Q8dr47w207l+kLr16MpgHEdhScCy8gAAIABJREFUviJNj8YNULcKODXsuc23mm5jjBtnBInXAwVn CEnG0GLbpk20fq6myElgPjIak+Dzdru/J8VrujmfWe7qZqjK0HLUA/jmPB1XYqPdEjaICLuHQGqX Nf5Dz763/C8//VPl7//9/6H8zr/5PGsdx4lYUzXIHFpQZKRwohqHEkR13TYRiPdojfCP9ojK1412 j39VBPurbZPt49i5fusWY5G2QcjGNml54/rN8vd+8r8vX37+ea4crzS8ojnrds34llEwfTURT4Kc r6M+DBBoOm/aFSshuu/ScVubd8uVy+fKD//wD5VHH30kjPgaL5gm+6FIALplus6Zf1xwHu62V5AM n8yvmg/2E3/uHjse9E/mvDt/5/yEjJfp6W5+odlHmYX0M2xCvqdfup/0zLD6NcNn3rq7ruqnW647 GS/j6K5b8zvT1N00krm1jBnfMELGTfd8ml7WiW7NcNZDaJpWSTyAZ8bPZx0kwuyyi5tppbvPxL3p 9k7vmbbx/DW/+Yi5IQUR+nlbivNMM5+Mk/k0v333l+kbxjIL6d4Jb9jwqf5kHh3/hl/TrfneCBJ1 rp/pKMhxMyOPrbX+9/+gTH/h75TP/+p/Vf6nhb9QPNLxi2y+6e+RTyG1M4w3RDq6D3lEgflV6GPe DmAuFlIzIt/Dsf6TwoiThBcKJVIQEUIJhfQC64zCceEQo/YBCLtjJ595Phhn128gj3M0hRLh4R/a 7J1AjYhZ6keIYx0807aEfluqHwNeGZo2ElIoofsxvJ8Q1z3HW/VHwYIChLQlkV4doYRx6uMaPoVj bl0TnOksmWk0wyuUCA1Y/MKmBaE0FpnCB5w74LGNdJf5l+FvCgPUlBDST6GEbikoMGyC13fqrnFL DWwKpp1CiO5v/TJvw6SQI/PsrXFTm4Kd0g5u4mj7ZngFDcLxrbvVkZqHUbbF9MI94qkVkTYkIhB/ UiiR34bJIx/p1nx6LIXFuMycPtV07ggpPLJxVNeDT2ktNb6FMWi3twO4dBZ/Rf88XdCrhY+CsHjJ 6DgoPbe5sLdQfm/v5fLC5lfL0dJKef7Fz1Mo7BacOcMuP8wC6jIeKZAjZQ8zGFjtKDzEbsLBY9vl UQbEGMcTJtnVaD2CEAHp2fzKnfLCV77ErRyVDYSbLPDf/sGPlosXHioDDOJ7i8vl+MWXuTHiWrl1 607c0EFXg7iDEYex/sPnniuvfPXL5dkPfKA89vDVIMwVGHj7xSg4qy6sDYxDcYLYbVO+Y349DMbq +kNUfYmlIMIzmWuoYnpOdwCi5hBTu7cwVrKL0GRscgaBB1MejHkPZYBlLvP3lmDmvCO8VWY5u3Tz zdfLGGdyJYzOY+Cnt/Vi2G24eOURDJRNlDMzZ5iYyJsrJY8wVrm3CRGjtgMtowGv/vEZrMtDZE+f LU//mQ9xNcxFjnBMQ0ByvQoGO3sH2HXjtoFNrgDd2odoppwUkd4NWSMRxqjeRJvi0iMYB33s3WV5 Y6n87nO/Va7P38H+xGi5iNEld5MPKOcxEl13ZycmLoRl3iXKeRNjOC2knI9efRTNCRbh3tvl2lc5 y04WMuKq0cexFgQZgqrwEvESOP4kcOwvhvVpY7jD53WiMokyMDHBk69hZRiDaKIuDSejkloXuuei ksIAibkkUqXKDmBSdDOsi4c4uOj7rXsQp/UCFgjzxzBCEoYSdr6LS+Yj7r77M7zlEd/Mw/hBpGMM NfwsM+lI+JJYCF0yfW0gaK9iF5seMhUyt9qfiN140pSYTILDdMXdfM3LNATzzne/fZfQHFLKSTXb j40jdOOuW8b12Sx/hm/rTn7GNYzPzH/YnVfGv1oDCeadeBIh1McHCCPT3Kau+k2D78jL+tOPMivI UTiWOBjecOZpem8BitRibBk+/RW2qMZehbauUJ2nPwmmE1fhWndVdUQ861q/0KLg6cLkkZ5gsBkH CmWs4/gmLwUCGk31eIdaH2qH9JBmGE60PMTfx26DWhKm4/W1Q7xTknBzTDpOtKcioWofSxss2lNQ KAdiZZC5Y4/ys/xEebbFk7lHUKwhQ+y1jb0w3WpCqKY/7g4+85eCj539us4I51EDr5y0LSlIhKUy QrCi8TtDWgfaVOhRGs7c4TGfQ9JUg0zBlUSBPW4GFX4l3yuUWxim/zo+xVlQqKJAxmM0xywsIYAg nT7iyDTGbjr118sRN5lwhbXHGrQ0cZJgdMK7SZqSJ2MibEQgGFZwofFJv49ol16INnoG7V8JDNdh lNXkmCaMRnGHrWPGF5rpbt2TnDNIZMH4qgQ3qtL27zE+qTPr3vzj9imEzwPUJS5lC4FpjEfmRu2H hLV02i2IX/se7ahtoyHK08PTerQuQmOCPm2aak7YB9zx97iN355TbtEudK4YU9r9sB93M/hqLwRu 4l+Xwbrto91N3HlwkrTMZ0e7RuA7OUxd8y+EiZTVmxfswwpjDacmmeP0CPw0gGr7+u1YCmYW/KIf 0oeM427c+dlZ7BVRFzUtYH1WAM7OD6TT0ZTAz11AIfBj3h0H39gtlFD5JsH5Roixbd2KL+VJoWLM AeBuH3UdEUfdqrmS3Un63o/+3b/LWjlcPvsbv1P+yT/938rrr79RpiiXxwnjFiwIOevGcuV8Em0Z OePMsypR7dB4RM8yb/tDXW6fxvc5ifDsE5/4RGdNc553XvLWEHHMcDHP1PEyb9PUXQQsP72lk7Nh 8mf7RTgCSleJbS/apmqFepzye7/3u8unvvMT5FfZ7olbzGh/4zsvaFuER4C0gmnpl+XpZPpHeFFl 37U3d+BNwjZNg4vZvs6H3pzg6O8IJWh62clc7+Usk700Xv7MI9PVrcnkZ5j0j4D86aSZDvXTfpx+ xhXyuw4Sj/QzL/3F31+GPemp2xgbUSmMaabnex6Haro38Tf9zDfTN2y65VM/3+MoBPg1IcNkvOa3 zHGWI90zrbdLI9NJfPKpu+/+POKZwpb0N59uMEzY3kkPvm2BjHPfuWqXJo76+Z3HgvJ4S+RTp6N/ bMQ4N9dg2pmOTl+v/e2bQuKvUCLqDaGDm1WmJ13U/9KPl4+d+3HmRjbA6FM+nQdHmK9l6HbZmIhx wRydkLdxyOylunyLtS5tTKThy8ifNISmNkUKL7Q/kUKKOK7h+lYLIVIYYVwFzaMIcS2DxznUlpBp 3VxCIzCh1mzITwifuNjAJ7Ne5RzvdYiu/uYxgDG06gPIL4USq2i22gptBP3raLh5+8c09SeDnuaR m0KHFETUuXSEElEu8tQ/BA+Wk/W7n8sChNSmaAogdDe8UAlBKh0F13MF7ZmXQhFm4AcEBHGkAv7i aKWKM8mNIzL8ClV0czNEsBwKL1JgodsUGp79aI7EkQ3ox6af/kLe+tEtlNBvlTxSUDPBXJl5mbeC CgURuqm9oXjD9xRG0KFMoiOUUDAiTam2hHY+1IJQW8KbN27fm4+w/lEY0RRQ5LubcsZJAYYWPPzW xkSCNjMmOG5rH1ggP68WTc2J5VpwY1jtTiQcwxMqlHgnOxN9qrPHkszC5aTh4qwKu0SBBIkoqGL6 3LWXy2/Ov0QhUSFGXfArZHr+qae4L3eyLGzdIcx8eejp82Xm0gQ7bNh5aMGMHUNcrrD7dBer7fMr Ze1rt8q/++nvLk9++ANlfv7V8i9/4xfLtbvXIR4goLih49qN62WG4xFzGOuSYHICeOUrr0IQqGpL vnSiw7DaDlHGTuLdxQVUqzk2gdrt8UNgDrJOHK7bkLrxdDXu5QiHH8doKEAlQkzT4BDkEgJQoBFv fWO1XL/+BruIXJsH4791b7EsXX+57GMvYnSyvwyQ78TQRNmYmsOY2yw7JJ6NZsdyajzwlKHTCOgo xyHurtzjxgtuxHjx+bBl8cij7ypPXn0EQhwjWHBNA+TZwn5GLwIKSCwEJr1l7NyVmDymH7pavuOh x2MXcHDuYjmD5dTTl9sYAn2pnLt6tUxfwJAZgo82O2N7CFz6IEq3OV7yrsefRPX3THnkkafZNRsv M1wNuIvAaLm9Xl7+yvPleu8NRvAYqmTbCCRGyoc++D60Vzx6slFeevllmKrh8viTj0FcsIuIBPbs hbly/fWF6EsxEUOYxtn6qEKvHeWucQark6MEjtoJleExbQVIhFPfuKtxEcYlYSQEGfjoZzwlyszP J8tbpBOBuv5UBFm1KDUJQoMlUy6OgrgIuifRFcQZeYiX4TKs4cxbd8PrHsw93xJZvmcYwyUhJ0Mg M+MCZly1B2R8M7xp5XtHHZP6ieMC4Ke9BsNkvuZh2pbTfASFHk38sw7MS0FPP+rqpuG3EHjXaWa8 JD71N2w36ObPsW58mZYMF/XEN0jA6FREgovxMHht4yYYJvAmrsSCNZ91HelI/OJmaDULLFvUN/np phDDPMU3y41zBVY9kU0n/bJcVYBKiFKHjnzF1bkqhBBV9E7a9lXzVHgvs1sd/6iEElF3MDu2i6AN gxBowODpp02KHRYqhRiWz5+17s0z2gwRx1B5BN8sr7gq4BiD0beeXKhcKMShwhMVTyb1A5h0x0So fyKg1N6PM7KCCE6PxU6GUuZxxq0Cnj3GlTvdpuQxHNt4gzlQJt7dDt1gr+NaUXf2QTZ2+RUo7IEn Et3Y8Q9m0z4JseJcaPQJGHjHNYmWXuY246gFoVFEjwq4EB6Bs0ytt3VYW9aFN2gcBVFEH3BeRSsj NDKcq2u6hkritglLxq4DR8SEytglaSCAolHiGIvGRD3e0UPdW5shIACPY7QeDrluFW4viIg9iL2w n0CdqI3mNZzM5hSDvqRQhTjDaEkonMg6P4Bo2mKBt87UJJDRDe0IvmmEakE3L+L0sN44f0nauP+0 Zzmpg+jlvIvXcZu5j7nbW160w6BdDBYb1ovJ0Nw5QrshbFLsImSib21TRx7zUSgXOJEuAyDerWs1 XNyD2SSfAYkg+ly/hMcuzCX+feyqewOHfcujWR4D8vaO0JRQ2Ia74frJa6Duy6HxAb4KRr31xLJ7 vWJnjPDteWGv71pD00UBnQbavCLOm4wsr/1uREKC8gjOWzFS6jzs32qEhXvtFgG/wT/iHT+ruBZE ddwsUz1vsKJE+fzW33GX4Yx3gBHKj33028sjVy6Xn/kXP1t+5Vc+i1B1P5gm64VZsuqv3yBe3cGi r+NoHXZDJYjwhiBqzP7R9Wy6GVd/QfdIl7LzVvWF8Ln/x7AOI317mXPi1g5QOEAT4elnnirfzW1i jz32GNqP0BSEFD/jWD+mnfhWzwo/U490qcs/Ltgvsm98vbSO2Nlcg/b5RsNnetm3fAo+TSO/M1zz eVIe2iDLuBnW75ij36bvnpSOcZNxzXRkQrvTlkl2bczw3saR7/HyDn+ybPnMoOLaxEk8PAqW+WS4 7qe4WH7DN3HvTr87Xn5nuHw23ZvppfvbPb0RpTt8d5pviUvbpOaFfpbVY1MnlTncCH9Smtn+zbjW Z3f7Z9yoM/LL+c28FZJJH8priJP2L9J9F6NXC2s34ls6wnaBwKrCMh7777F2sr7kLR0Kwyf7d8u2 WoJd4JySYF4JCiq8/lE3BQ6okofXWm0kMdzqwNIdu4apIY5vIJTY5lYSBRUBtQAkw4RhTI5fLKFF nldHbpDH/u59fDJsPKE78jpKrxBNt2M2cASFEmpDTiHcF5Zv3wlt96YgQeGBJN9xbaBTmxCCYTRa KSiU6ONKcOHQTRqMC/vdjBee9Z/jOxUu/aTVS7g+BAZeH6ogw6tDdQ/xDJvrmr+U6c+bQpbqfEK7 pJbhaLBzBDqjz7UQHk4hhW77uAXTrxFN1+2X73TQUHBgujL7arILN9GGL8uYUAjemzLC7Od7JyIv G7hzZjEEK1lXmb+3miQ+69Rdu771w/iGEZ8UMOjmt3YmtimXbWV8v4U0TLkKTZG2KHKTLGyL0QZr lEuYxDbG1+r3/N6jPy5w9FYhmNCCzjiCfmidOhPfKZTQWLowz5HgBfDNfMOx60+fC/b9IVG9u/A7 MB3gMg59qOYvIWB45cU3Si9EzR7IeValzRENpU3jF0bLw1xFOTM3W86enUF0scXODlfb0CEXbsyX 5bsr5cV/8xxXpNwql//cJ8tTn/xweRPG/TrqRYdHqF+j2SCpo/Dh9u1bcWZFot6BGbuPDO4DdtQO MWgmXtCQcW7z8SffjQaEqqZYk2fC9fy299geI1gYxiDLvuEtHwS3RCWrND8ISRh6XoIIsPD9EMZb 2xvlK6+8FANhhNsrFtAiWL72Snn46Q/BICAdtfuT3tLyOtoNTCQL6zD1a+Xd73qU/EkEo5gLS2sY GRtGIPEC8Re5joeGgZG4eP4i6VOfaDb4U2reC9Hn3cciYR0Ojs0h/RouN1e9NQOGZxPGZfoMajdI 5bgGdIG6mbxwvsz1XohJFFEsRzUYoBDCOxDtM3NnEEycY7JCkoYtCncSn3jiPWXq3GT56X94nXPV EGgQnO6uDXD38pmLM+XVr71K3ZTy3vc9gx2KOxBxO5zVvVWuXHm4nMfffkAysdstEbOPEEGBkASP Ku8uLhI7Eq4SQKrPyqxVUO3Q1R+Rlu0UhBITtukGk60baeguE+gzCU7j+q67+eh3EugsfvYNw/hL Ykx38zUdFx/7lP7m7c9wltOn+fiu4EHQLcZB7Z/pOvFL2McuO+maR4uf/uZjeWRsZZLcbRfMO9xq PLNcMshCZSCtqgPDdvImHXGwDELkZX2Ql/YGTEecxV0w3klgPPHrBtMWqnF+f2ch0sNPZj0ZdsNu y+ySljgKpptp+C0uCfol3qYfuOGmO8jE0/eIQzy1FbL3mL/4mnaEz0TNgzInRH1nufKJp/H0U5hi /3T3XmaOxKr2IS/L4M/5Idqcseqir+BMbQzb0fgaJ5SZayGwQwpY+mSa3ZXGvweGUJsEcasJ6QQD SNrGVdNAxlRc4rYG87bc4OfPGyCGibMNUzUCwynTqnsbBneLND3vf4Tw9Yh5refSpcCzzUKlLQFT OLS85MUALW1+A6TXD7eNSCGIITJWwkVYZzti1PXj+yZj2WNvI+SvkcZg3CAKDKN2woaMNnkcU2fb jHOFB8eOHROz/TyewSOOyok0vx6OvvlrI0C23xvedqYyufGDfhN9k/IzvxlBwUSE2wJPnI7VpKAM uqmNFUck6nFmZhukpbHKWceCZRNwE2frdYc5/gCtArDAsCcGWilf2G5AWq+R3x0WTsftuKqP4LLP UTbntFGOOpi+BndNzytEhyFiRjkTqYHLXghgBTmOuahPcRUHK4P+odCkLZGBu7sgToHa3dimrez/ 6IDQD+hTCnto49hFwd0+SYcjLcpCHe2Apztvh2jj9WCzqO9hcAXvJY7cuGthnhrCdTz007fU9Atb PaAR84Du1rH5WzX8xNm+uA3+3gJ0ijJ1hJ74eaOLY2Cb9vQIh+uVZVXzY3hYoT7HmOgXPj3eo6ZE jHfC+ExmLNzI748CzqPiW2lrgIJt0fg5P/gd2hI++e641e+VG/PN4TqGMMfLf/1XfqB8/OMfLz/7 cz9XvvCFL6L1yJEKOqvpUJROHd2vqQrzqt78+1bI+ZMarTx5VOlRN4FvRVdU9X9/vq1D12HqYUAK plf9OslFPWTOmbZ9NeZD2sa22+PIqQZ1/51Pf1f5+Cc+Stsob1yNtpdmM17MTXX6pmc+1lF0D/x9 d2Mm6iIz/BY/7RtNBtR+tolQounWnaVhuvuSbkK6++2vmc5J8brTzjQynfTP9Lrd07/5NOw7QTON xCmfGa8ZJt3e7pn5ZRy/T0rvJAa9O001DIRM6+3GbrPduo1Odqf5Tt/deMrk22bNdnun+E2/erbv OJ2U9jdSB5bdXzOsaSXkMRG/xdf51bwNYTh/B7hLbUU9mh7v1pmwB+OrwGCSeZYJulqHeTZZ+ryl w/CDpKVQwmvB29AX0qfSlx2hg4GAFDZIn5wETU2Lpr/xQuOCOfwcRiaTAQ5jmGiUKUhIhtJ4IZRg TegIGGCs1ZzY5zlbG2xcajCmcfTDiKTTBIUSUwhw1jiSz4JcptDI08bEIcIFr9NOSA0Svw8VSiBw SM0P3ULbQTcBwX4nTP3dEVw0wkTYrj9qaxyypveAexwP6fL3U6FECgBiHSCOTH4y+N6qkRoMGT3q E/cEhRXeoqIWYgolfFbUeRVKjYh78FpYjaqO1dSRQ0BR9yPxsOypNaHmn5D5J04KHFKTQv8USvie kEKJEDLUjgogeuijbpaFkAJia4p1TXsYalCkRYwQcBiHelMo8RYAR49nKbiYuU/6Rz9SEJHChwno GG9MW+fa0KYmxVvSqx36VDnuo0FsCO+el8FyYVP12psSYvFiN8Vzmhrv6jNziSP3DOMIAQMWonUA 67fenW0nlIAwDQkNhG5BREmwBzMIgeX5cIl5glTpBylZLfcexYgFlMW2WrRdPKsFvFkI3ZwMZDok yvwJpq1WxQDHEWTw2x6g/Tog4WCextUI3PAIdVD/M6r+YmcehpHY9PrDHYg3d1EhQYLaOFaKBkMj kyN+yQTL3Fgfljd/pvsg2PFghMHjQIIdCsIjNoY3jzhuI1UhFVJ30gfjW1+ovxoWHGQYJFJV+fdY g/hXzKuVXiURZ+x514Co+Fk2oSJgKpsOMiyWx59h3JkSPMuuiqzlFLwG1XjeNBL5EMxv/xnPSdx6 k0F1F08m1O8gfCX+dQvcq/aPtIgn6FfVX/Wtm7i3aV/9tNeR4asyVgSj4XQ3b8MlQe7CmLgYxjj6 WxbzcfEZZCDptsME4mJleyRYv3uMBdvF9AXzSBwsRyxauDfTTTef5qUfL1EH1kuWMdPJb3HNfMTN dt5GY8ly6C7+6S8uGa/pJk6JS9aRYbPsnpUmYuCd/i6Ojbkm0s10Mh8arVIVbtSPfoYz/8TP8uoW 9mzw93iCi6Zusfts3ry7c5y7ucZNnLNMGs3MutNf98TXd+PqLu72zJgjEB4oxHEOsg84t1UGcW1T 57VKY8RrYb2udhsjk2pVeK7fOuEPVrUr5j3U7klbOwt9MnP4a8TQUcEMx1/Ha9W+5uUtB84lXt2n dsUw5fYGGyFugKHejpkLBa/yFWfHhleUDkIQ9IHTAAvIEG3ulUwbCEwtfwgjZPwDPyIxZxxiUydu i0Z46JEVBm0w/3ELg9+U2/AyghppHJmdDka6jcrpoTv/JBOGbMUBZnwTmxLeEDIFsz/KjUrWbzDo 9nXS00BmL1oJMt0UMQTCheMBPcTzW7sTHpvzmAmDtfSyWHvXtxoNYZFZAYsCY4G0Q+MKJNrWiW7O f/QJ7di4siuoOFRrjnlSbRMFSobz6bpxgOaIa88oTKjl32CMHGL90sUVW8Eh+OFUnIMytC3sWwof WmifHYKj5bOO4mm61hV1rd2NeFrv9lfKT4NitJX1BjVVOjUaGwhNWC8VrtiOdLaw4eHRlH4Q37Wv uj7i70/tCtvBO+YFj7Uc06+0w9RGUO8NHbbbMsL9u9gyEifnc1kLlfz8VnhzSB88JA2FXGrZ2G/C mChxR5grPE7iuq4mzjRXbp+mbvbpl24CxLqEu2qizjFqrymkUnAecxtEmUL7MH5J1bgDqEqzx1QE jUWrtrxd78ImcR6e38SfaGv+uNZE3ddP3/2FO2W1bR0bju9q7JtJHSb8YyVm7FfaTU88/lj523/r b5Tf/p3fLf/gH/6PNCiaIYwnx495Rl4mEcJ0O4Zgev7FOb4qN//e/77vr7sQ4e2g/CeF2iW86rTu u0kXiYPphbZSvBHPjJvAp2nZT10f2vQNjWV/9KMfKZ/85MfLeTY+9mg73Rw7vcf0AdKiV5FKNXdG CuAVtJjTHX5mQ/aRX2UctJnpN/8+y3Fdj/UOjd1nmlK9fXfTK+ew/dUg3scYG+kvVzeEfwD9lQUo CF2Fw2okMhLCGKbzuWAfy37m0zCqz8ea7riswXj+N4z9WYFf7mwzsUc+cayEPiVIXGfanXC4uyPe YaRJXjbUNdibLXaH7uNkefpJaxUtjg5OlN24lt/yVGXV+OP9eOYVmgB4t2rVc+0UCI5Pd+YzrvHM u/nLujDt4J55GKdTfsJ3wPSoiyin7vyy3sxLsBxC4pBHGNZqmxTGNX/B9VtjlpZZmiaZZ/0iPdw2 Kb/h8wpO/WzjFv3BNhFX0wggnPip1WAY8bMuhdRYaOKue9Q18a3DTl3V7uJgeNMUKuP28frAHwXY CguijxDe7xHXSiANtfre6Ud1GPud4Byora7QhMBIsuB10Rq6VKDcPKPvMS8NYiq48L1XmxM1jLAO Cdv1msCCEuuMbhqy9AaOlnQaMErarbPDcTNdOJz0x3WPX8Ikdb5G35pUQI57frsJERpyumMLQVA7 4TxhemGqw/bT3flwn6CsVQhmmFMzZYa6WKaN3UQJY5deFIAgHevfER6Lh+zCc2yczYAENcZnawGL Bh+P07AjAVAoKVvs5if0S//wsbO6xPrI3A1+3sKRoL9XgHo1uUc0Dlx7Ad0V3A9gJF8bbwr1fU/I 2zn8nqJ7eCRhio1mj2GcJm7CPYUhlE9IoY5153GMQ/CeuXK5nBlEO4AyCttTaHRcofik4+b93b3t 8M9jO7pvQAPN0n7jtGUe6zAP3zWinTYoIo9G3q7TGg8NAQZHRhKPWUwMJIhH3qCROOmnXQlt0cxz Y5M4NL8vcQGC30Laq9lHq6LHOiSOmzs3KLPCkBHq+mH7JaD/WdKap948wiFtkSBNdR7a0OMaHtsY G837T0o5dzQJXVndovlPMkLXs28PInzfVQqIgc0CH4wYbi3O52owbgM1jX4Y3A1UVydZxEcxsLT6 4qsQ2e0yOwbDd57OMw5h44lpiOMBmDoJsuHWeHnk3OXy+MQ5Bv1WeeTJJ8vFJ55k0kJDgnwUKuxv yazQ6Gz/92CpcQ0Dl9tcL6JNA3f37WwyL1qfd+GWKZQw66HQpznSMPD6ULn25hvl0YuPlSPOujz3 B78Hrr3l2z70EbRluAZJImpUAAAgAElEQVSPqzaH0U6Qdah286vFvyILKDRFd+HXOv8C+Q6wwM88 fAnbGFcwqLYWRJ27oj1cEboMbvcWlsvoDCqT2HwYHBlH0wFjW1wVOn3mIjhi0A48Ya/QljjHpEbH JPwQhOgA4XfZzexRsoPBNA/CqwbcC1GhkS4nYQ2suSMWhtp4lwnwWM0u2g6H6h1z5dsR8doQGuwB k4YEM3M40TWUt0NbcQ8QPAuq1y2+t9fpTAgn0LrYYZHUyOfhsQQxDNAAuy9cw7mFWtHq+hLaEhuU bbE89dTToT2yvcONIDAn1rsQxFyDcJKo3oGY30B91sXtLURVEEddhBbpGE4iWCGV70qkjZ+MbGTW 9ScZ+nQ2Xqji0S+8nSLzNo2qr7hKPwhN98i37vO6i0+Ci6iM7voeTI5jgbxit5BnlmaNxcdwCnKM /06Q/s0yWJf2OReuSJ/3IBCok9i5focEHZuOx7zdw6CZxztEC68M18Ql42QdZF2me/fTuJY7hVjd /id9y+BJXDm/JJifacloNME6ViNCxqgbdmlr604hQ/rbDparWaZ8V2U+VF7JX7cg8JlUzVsNButa Zk+i32tLl9croaPaDxI1HuHQJoHPFVTPNOBqf/MWniP8R5m0FXCoMMX/wE2cxcm8rEvLLX7irSHU dRZQNTfixhiIPcOo7RX+4OYzyg+OYdMABlMDvCvkuc7uwzbxe1SRRACgan4AaXirzTA/RCqx4z8O 87MD0+ztHzLCwdwRWDzNUxXS2Cnh3QXXfqWxSqh8Q4ShSwmSURdz/NZQ/VzhyFwb3F0Gg1EnjTjK QPo9zMstBRSE9djH4Qy7McwdPQhT+tQ4IGwYQbp+MzQQ1EpQuAIypFbBMXNwoW/3oh3XWvU2ErQa tJ0Bwd9mbmqtbcYxoj52X6YQ1HgF26b1S/QetB9o5EoIYSmxPu7RCW8+6WEnZou15BDBhcYf95hj JaJ6J8bKMQtw+6YHKADazfK0Iay82rHlbgnr4yLjvWeNK9+sI/oKCIVwwjoIAL8d3Pf2IaKdgw0H LgPEH+hj7gW3TdYWaglr1qhd8r7JWmKdqzEjQXsE0cnEHPWq0MUjGlv0D/P2nnHPFDtLeZTSvuxR llGO2ShIccdEpmAUomWXtHcQTA2zBitm3pEo46kNjDbEwO48hi2pNw2ienOVt8oczZ7iPnp2M6h/ ryA9AxHhnLdI/gsrGK+2/SizMEQfyfPRTYJbBiDKYfm/SXANi3nH8ostfcK5V6jcdXPdFIcHf/rH sUH8bQ3jHdHWht1jDTPKd6BVcAiB+Ou/9bvl+RdeivE1DKHch02nABCIdBg7bY58enV4JGZuChGq Ho8bawFhIlH9RMU+wEsl6jCuUfmHu3Hj2IW4RVjmBNZ1wU88Sc31Rdx5Ny/ydv0x7UHGiIZO+1m3 Tf8973uyfOTDHyqXr1whMke61peD+KYTkCDzBoZqnSvCngTpWabAg7TMJ/IgfY+D0NED9R53jr4F 0BFK0K/spznXy5QzYgKOYIpkIGUmkwGWmVZAIISwEn/BMFW86jvndG0Z5M0O5mGYDuPpO7+IV/Gz sa7iFPl1VnkZ1TpP85YhFRQShFCCp+M3wb7t+qxgwHd3gqMcIG9eWZYQMNSRYo0wDZJyLTEc7Fto jDhWg2k2nwTD0U9MIwQRuEc5an/zFoew52E8fjL3MttRfgIbP+tSPC1DGps0vKxH1HGdb9abWWR7 pVBGVsz8s24MI1j/KazwaZ3aVs16a7Z/lDVi8gd8Ou1fu1kPibO4JR5RvhrPjO4z80+hhjhm/Kgv 4vhMwYd1lu2T5e0WUCgoEHIOUyihzaeEnNcU1qQNCf2cX50Dq+vOmWtZWwTdmkKJ9I8joa79pJ9C CY1aprDBuNv2zROg7dqF+wR0SggwmIf7ZO5hGBOCYWUtF3wXkpn2HZY5vtNvFUbK2Whc/qOOZzhB DQOhMkgdr6E5MXZmJIQVGj08bR+roSOUSIdaOJHHBXKW6RhvFHcg7DlQB0eU6y701YG3CwApWPA9 jC+HEUyObE5diaOSKYio/O+vOcYTBljfFUYYTnCjoimMCMf6j/lO0eG7hRIZJgUEahcMcgVmCi7u EUChQAoAFAh4Xajh3VRSGOG7GyPWpt8epQj2nfJ6jDZu18LPcAol8jvzzmfamEDFMcLSWTt4ZJh8 io+CBm1JiJPfvuexnAwXx4zqD/2Fs9ABgkIHoRnG79PYUTxFGO1J+BQUXkzV7+HAnyOFa2iiTqD5 mbAtfVeDri1kBG8H4aORtRYLup1UYskFTWLdxSB2dVhkJ0/DgCMlHpkZKJeeniuv9SyU8x89Uy69 BxXZIew/0LGnJ6bLe554uky2LpWdRQiD60jR2KV5+OrpcuXS+fI4V2hd+chHy+zFhzB4eb38xmf+ 33LvBkRfL52RfPdhwC+c5bYJJwYI8YV7C+Xe3QXoW7UQXEypKIhWsITBZ5ebSVmjdBpCdHdSYvIs wopzF8+VkYm5sjaIOiz2FtocxXBZ9p9LtHB/p0BL/PsQgn3l7KmzqB+zUE0ySJAYcvkpBB8MKLF7 IfCnTp8uHwH/idPnyhPP/BkGiMQ3CzEL/eSpC6JV7ty7y87BRLn40EPYbnilbMLQQDpCDMhgIGlS qgIxoDAiduEpgzseAxw96VNYgfEqjcupRna4w3mgu7c5j8UZLQQTfb1I6sgL8gnNFgRCjnbWdI9z SDf2oEHQd8wkQ14axdpHi2G4b7ysLXKFKfXZggg276U1LLT2YbGX9G/evM01a5xhZ5CcOf9UmTs1 V27c2OSGlReCyHNHR40Ed5n3JZ6pQokdbYBsI8Hzqk9Bt3hWHx3GLAlMnWXW/Mmo2cd8T8Yyv3VL gYBxEjL9KDJ5yby5q617+pmW78mAB0Y1XqafkHhkvHzqL1Nq2MCbBPqpM5m6irCk98Q4IQ/aPd7r /Dvp+006nW/excvvwAs0knGVuc+8o04Im9+8BjTLYDwX+ggLHhpiVENARrvCi3zJ38Xe/By/sShS ptR4yXR9mpc/w/rL7wwjgRxEUh3OujEvf9ahcTKdjBMutXvHrc4jwvLHuGTWqT/7ejLOGSfC4t4E 5yJHr3lEGjzjGBHPKEc9h4mnacq0RVjewwYK3+7GO9dF/xFP3PQz7V2YaMfkMMc2omz4x4JBPSrk OGSeiVsvcLde206szE3m5Tl/r3i0ziXUEj8NIfYRXkOoujlexNV3n37LBPou3oIq/s5nqvwfs8DO cjZTrQ6vAh2A4R+BINxTwMHcR8lD82IIJlUeo4V2A5JQcGBX3vCoCozCpG5wTMBjC2QEYQFRYB+B uKAz4QQu5H3MTUQSfjuoIvo9yU7oAIIKj2Z4DCJxVCBwDGHRJg2ZfgUoUGKRtvUp4ePCpoBCQ7uH YzDQlD8Ye3c0aBq1KUAy/OlQETda2/nGKYw0jsFFo8XVdVPMHQppnOisO+bNPQ2AUt8eL7Df91AH CnXTwOQIOEQdgpPlJhjCbzQ3EFRbx9bXPgIQjziMuHNFPYSmDLs9Hs2QqdQgpxoD3uKkOiKDKwge tRNUY1Uw5TEV+5XEedwc45E2x4h1g9sR1sidFexLPaTTQz8CI5LyKmXqDtwsE39CU2LKBZ2dCVc6 +9Ykxh01grqHIMrjJ+Pg7fo8gGq2AmqPuKhZI1GmjZUB+rI3ae2pOWMP0Z/6P6BiV7h2up86gAyi PjAeS5wp7UmYu3nxrY0J5/ot0iKrul9W6+Z4veu0Rp2ESnJzd5c1JnZqifNNQyAKrmRonkLOS45N 206hRc456ee8l26+5zyoMIvOElqem9zoou2JD3zog9iseq386q/+annh+RfBnzPL1H+LPkPOaEFJ FNtXqrlQNxn+eLrQuo5HTVUuOIhUBT7pLxHFP0bFrRI5GKRKx9s3qOb4DhT9E/GgueiXffxiXoce aOG+jqBuYvJ0+f7v/0/L6VkMsBJ5j+MQpu2a7Hd8iCeOzKSRfozpWLTI2fLEzGnGRCSO0fInNn8c cDfbtcm5z2dCum3hDgHSERLIAKoBYfgO8O5XM37HjxcZTCF218nDWyVkciNP0hYyvUzDb3/BpFcB Tswj0sDf8ekOf6aTaVqiFDqkUEI7CQkH3IAmzeqcalxp6Nx5zDR8Zhl8l0QXa8M38zMvtQpjw4b0 sizNuOYjA79baxZYbw+kYf1QjvyZRqZD0LdAE+fUTGmmZ4T8VhihAGSN9JttaPqGaeaTbt/y9mfu 31qhP9V119do/+h9lrcuv7iLR+KS3z67oRKi9MFc3hcOGcb13D4uTGEIUdC+nesOZh0rYQrzsXaL XJP70UBUGKIAxHZOdiwFIEWNM9dLfjKrh67HNXjsIo9laFAwId3UVlAg4XXtHiuNXy1YybAQDzCF XP+JLQk3H/J4xijrm9dlJ5z03YKmbitIj/kiQ/KEwRXUoOhl3RvgAgQZ810YbY1djoHTJnSDT2GN dVtGeNU5aHk1jC9uwM8JLTQtnBnTyGM48mcNXCtDlazLtEIar9S/p9ZEUeAgpK0Ij2XsoGmUt3Lo Z7wdhmcc2aAfmGYau0x/nwmGu0YZHsJ+4C3EN3FNJ7g0IQ1hvvv02bIID7dz/WZ43+Zv3sQRRzSh 6d243IMH85tFptyuNau8tSPcjAPvVOoyafDSaz0Fj4I2b+NQcDMmXUI5PAZDBySNSoBxu47fFD6Z hrQT1qTKCnkfM0/l8Yxt3PMISGjWGjiB9FtoP9yq2zk1PNI74hHGeU1tCDd01CZZWNgvp+hv9oWE FGrEdaGkt8KmvnDIMQ7hFGUIO2DxdfKfvlF232T8PXYwGotnJan3OjFVqjbZLZmenSl7UHGPfNsz 5ZFHT3E2BUMmZx8vs1dPleXDZVR3OdoA8XpMn5zmdon+g34qZaXcXlgoN9dXSv8cRjfu3Sh3vrxV lsaHysNoTywt0KF3BsrHvu3PoR2BSgtdcRCjaafotNPjw+XOnXXGLQQchOAw12a6mzDIne/TVJ67 CjbjGmnfuHGLK6i4+50bNS6fPV2e/fBHg7meR1PhgKu7GMZxJtzxeMjizTCBAOFIBpNPG0HAzj4a A1t3YydjdOYUE9hQuXvnFexNfBWjY5wnn+PmivYGY723nHvsCZgYiFHIrxVuwFje4vw3k6PaFsFU kMkh0rcR6uCR2TMwAiWMUg6MDsKA0PAS1EFQVIwAXUjaKYjfNoyDmhA9CC8UmqCgXlaXFlhcOG+O MCbiQah4fEI6Joh3CGCoTD7AAaLqqA+hhnXTdm/uqIxTr+6ETfajOjN4WE5PjeDWW1577WZZxHCM 1wye4sq/Adp27uJEGZk7Szttw8iwO7fDNaizc6QNI+eiA6G6P6DBPgzmQeQKEoEyMgouVLH3LL63 lASTANWjto03G0gA9WPd3xdtVDjJy/Rq86LaHaoIQbVkJDJl2G0nAZEZizTMF4PRc4HWt0dBZOzc HZJx0J6GzJ/M7TZxR1jYJUYkFvAKd3cJg7mjH2kLQ/rT4xoGUJLqwqWl/hDA0O4aOxS/Xtpimxta 3PkQ2hD1/S3U2+g7Q0ziMpAahIwbJxCetejDltOBbVlkaNUKiMWfxrP82k+x3DIXwWC4kFhgf3Rs y6Gh0RBQUXbTCPBJPO17eB+weat55O6/BKqMhel6a41XuCq0c7E1rXUmEgkV45in4X0fwd8rAxVc +C3uQhx3oB69kcO6GYJZUvAnkzBBm7vwqvotMWz5jWd7aGxuD/VzGTGZMvFRkGGbK0RRy8D0DGsc b4eRCa6uuaQvk57h7HNeQSpJbT06dkLVH9ySERFPbwuwn2kocJC+KaM3SFir0r4g+K7U3cGmZoT9 1Z0nhRpazveGjX12WYdhbIfYSXUuVDNBMD37uXVmO3hOV9y8xpKIgYu2GpynZObiOAphicQPjR6J VPJ2QrfOrW8XJ41iWm7LK35C1LyDmwVExlcfmRV3TjchQmRWXZi96WSVb29dGCKN0Frg/KYqlHPg 0IMgQIa2n9uONtjxHwLn8YHZSjsFLYExpNjumKt1Y/2FkID6I2HS4jpLjDiN8j6OQMR6d9z1M2dO Oe55b9Pux8wb4r8Pvsv0Cy2QO0eJSx/adS3mwb1FCBHnB9Q5+xhrEuw9aJINE9e6l7B17oy5g3r2 KITaAsFGOafiVt2mgZDt3HmydrIkSWpqBlzUGPEu7BnXDxdv6nCFND02Y/0fWybqwSs0e0l7H0Gy K8IMba69ELXBtscmYdrpB8w9m6ij7pPHBHWusMK7uTcozw5+1G7Ml/ZN8RX6cPdIhkcpZGoU8ijY 0OaE9iXUYrG92hCYM9RrP+lN0vdadg0KIg5twtru4if+tts065ztssiOv20+S3161GYR7TRtS0yC n/XsLRTmfwCu4uKYXaatF7my1Lq7QN17xMTbqFw3nStUyXZ3Q5smwcSDw2nScbG6wlwzQduEABtc 5mjD2C1k/rDd/w/yOWJeO6oJ8BAoES6A4RVCzHqeTOdv5Hnhifd9I8G+JWE+TSp/9b/7O9+StP40 kfs1kIxrkzn1Pd0N6bwfa4ljRb/70d/xrcmUx+44/bHDlJKmAsEUKLjum0caNwyhMd+C+Z3UPcMt w4BXN6RQQndHvjv74mRe7ijG/Eh8841yMQ470Chn+md54puAWWeJh/OBfk2BSqYXGhPkG4IZcBC6 6zjr3ad149xkeumeadWR4+H61MRHR8PHnN0oj1oDagvq14T89tlMJ90Nq7u/KBfhHkyhmdqD71lf up7Y/tYH9EXkXZfVOIlL1mN+P5h69ZU45zGbZhhpl2Zcj66p6RDGqymH65jHIipNjEo4McT8LCi8 VcusI5TAzfjCMZuBtrnXhiqcSPsR+WxqUjBxRz6hLQF9UJjH8wrRSIw/XhsqjEEP5c0cCiWkY1NL IgQiEQota9fTBhhGocQDIKPqjruMNHC+ZlzX3ZBcva+p4DWh3RA2slhTcjRoY8I8JtSmBNTg+EbA YyX9bCBoBFN6THp9H43DBI927KtRAaOex0KM0+MmCDT9AJsOeXNHU9iR8ZvPbqFE2m/Q0KQ2Jpa0 TwiNpTDCGzhW2XjWuGUv71HHzAfemJECCLUsqp7AGs8YExRKKIyYAm8hBDTQCU1QQDFZH3EJjda6 3tXqmCP92/Q5BR3dYB6G90BR5M2RoRnqILUcu8N3vskvNSBTKJFCDMOsUU7B+Y4L0ctCtzAsfB/8 kwIJXRVSLIPbDPT1O10TmilgfgCCiDvsZVKz0X3KgHj9ngyhjOj44GSZGT9bBmHK0PcsZyFuD25D aKoOyXjYWYMQ5daLAwyZLaIN8Ydf+jLW41fL7OnZcnP+XvniK4sQfhul91/9awQH58v8raVyCc2J H/gvf7hsrS/C3GCMDXpeYtkjCTNc0fkjf+2HgkCP6xhhKDUWOcLNGKHGBX7uBIxBSIUhMAjp7SPk bBBYOxgP2yed0elz0FsQi0qO6E/7cLB7ENWmL+PZ6jvEQuit8qWXPs8tGO1yZ2MOonkUQ5+r5fWv XYNxHSX8EDdjXEZb4nzZOERadGDdOGkjSACHoCpDkCBRqoBnqJzlho3Pff5z5bkvvFAuXLoQEia2 W5ESyazCSMdktoWqKaqNMECqffUiHBhBkOJRGHvyDji/cf0aBPNYmTuDqi1EpsdBZK570Z6g+5E1 TAI3fey3EcxsL5ZbKzfAiwG601suTl8qF7jhZGn5Xrlyjomgj0HNLSkvP/c7Zf7614IAnsco6Qff 82Q5z4D/MuW99earDKpR6OvdcvXhx8of3vtqVX+UK5gkmK+KSeY4BjhrFV4BViUkYDlVcALh7WLW trz4y5gyNzE5gStP3dzxlxFwJ9Bv7ZyEsbuaSTMPiWiJimBGecrcChLNXn/mbmKPu6e8u5ArnHDx 8N3+IvNG5GAWDBNCIdxdsNwZG+dKLxlf+4JMkuHdpRC3Q9KVyQ8tA/BQvbefHUivSHWTdpf6cSEL Q0U8DRtAlrDcgbs78sFA4ydD6m+PPuMOuWffhsiTBg2iQdwUDlbiKAa/5cI2igypE4EMtnUinjI/ nnGX6VdYF9ocpO14daGXOZGdxzh01F/sUoscYQQX6TEk9tpbkPkJWwvU6QjpW34ZEA3G2i7G8ciB TJ+xzVeG1qs0xcdyy5we0eZEiGMP9m0Zf8srE5dlty4UfIwx2cp7KziJnVDCUdqoWxoXQRBMMH3K Hhd9nfnJNMAmBCyVgCKnenCiPmSIB1nwnKcGmbNUmbRe7JfiEDs71Ps4woBhBCz2E/1sP49yaCPC /hW7p4S3j9irnPssu2f0Q+BAmhqobDH32Zfts3FtZKRB0+BvPVW3XBgAAYm2QKwz8hpBKNIDAdKi fD6ta+tYNcMwvEg6HnGwrsJOAN6H9IOw60JeSsrt9zvg208de6tJr+1EHNtBDQ6PzYBsCH5kXpGY MWf3o/0wzY4EfY8FcJi+Yx31iw/CHDpzjKXjA9KiKccZmwHgH8I+xrqaC+7KR3tSx/arfZ6rCCXi 6l7qzZ0c7Q1R80zkHCGA0ZdBHsM6s0LCPY5leKWmdWddCQrRPL4mk26b2H/0sU60k9ORrNtpahJn lbaaQJA7wVztDn9crWpapglOLQwRe+TEo3Ajs3NlmjI7rteYpyclGlho7DP2r+2BypbSEHVjH7N+ BqgvcdDf6XjGMcDPa07b1KdlUmNPjKigwNt6STX6bRj6febvwVHrhPWRtXWKcjo2o32IJrFmHNff CX4b9E8NZmqjYpMdhjEHMBBaGyCjgUz7vv1lFf8hBNhD1IlaKxqVcizZN6xDkR+mn56bQRhFHdiG o4TbIMwMqpjDhgEUsMURDfzHEMrFtZLgqGaN7aTxVnfVPAIY8wJpCRIu7hY6I6udZX2Eyjfe5ven 8CerBpKpc14V4uk7feMkyHAP+BG2Gdow8d2VRtXPqnw6+dYJubb5M27OL8Fw498ULjyQrx91HsZL 3DLtZljd7O9C5FW/syrHBo19/1A3nvHznZ/xMu1M3/jp7nsTdPdnGpY04xgmwzbdMp1mGr5XmN6P 34wTYev0M57+GcY0XVutx0wnw3WOW9QOgSvvGTee1oFlOAEy3ANelrnhYJj47krjxPY3L8C6caOs W5NDvxPz1ANI/KP9zLcrT7/zF8c8oGPMK9oCWqGfPLUZ4bx4gJBB6D42ooBXIUVCHIljwdmCDhjl Gccy0pOnR/eaggfL5CZTnxsiXZACiS7nzqfHLLt31Tue9YvzfGhJ1AywwojUkjDIAO4awBQeON7B d2pJKJxIAYXrmyIOn15VmaBxRhn5jWFHzYPQrdmgJkMKEjqaFPWGUcbUP4UOCiVGz50LexRqKghp MyPDn/TMPPK4RPMaz0iDcsfRAzZsPLqhcEKhRAhZtJ3B7yybHra/TLugUEBQUGA46z/dFHa0EUqo DaGNjelaUBMRjEM762ecFJSkYCSPkXy99sy8fao5UYmC/HoQOLAe2hoeNxH/FEb4HQCualI0IY93 jFDGvBq06e8NKEfQlVLDPdB1QlNI0Qz7du99nnd20I1C4EkQeyZtGwJSxgEaKAb5Nky+TOSp6VNl neuOFhfulNPn5iBs9xE8nA5jXf27XMVyr11+7Rd/HfXDrbIC07u9gS0DBAAH7DhvL29ij0BVkKPy +vzL5fq95XL1XVfLBY913GEnsp9zsRyj6O9HeEF+e/tr5al3vz9sNYyMQBRiOExG7fbtu+XGzfny JsZYvvrqq3F29t3veaw88+RTEMswuWhZ7G3C6LPDp4q2RjlV3ZVokzFy53RiFPVaiOcBrI5LxF+D KT8+5rjD0nFZXuBaHAjS/vYEBtE4z74KIc18wr44hFut2k6VD0D0u8slqF6sFobGp2L3FFy/+Lnf L7/2K78W2ht//s9+B80PI3/gD8EJ1+FtgOMudbPGNaVOmq1+tDe4gnTvHuUn7QOYhNu37paHL14u j3AsZJHz5Z4pnoS50tAbp7Iwvgfzxu0nC2vz5eU3Xyo3l26Uu3fvlPHWWHnPo+8tt4cnYydzgetd B4Z6uY71GkKXBY5yLHHrxvly5/Za+e32zXJl4nQZe7mUZ1fHy2t9t8rmqe1ydvah0HbYR7tAldJg GmBCjnaY5Civu5IyQ0MS73QUCf+qMmCqZIwoQxDSlWv8jf5Eme1n7rLLGHrfuv1LjYM++qJgWoaR kLcThrCAOrL9xEMGWSZChiZBwYkLi8zaPul6ljzsF5COaZmGTIEMmYYXFZhsEkYjcDLYG7gTKJh/ SxK7uITpMOuU0zj2DdtLXMxPjBVCuFibj2WUjddPRnuvXtT0S3W8irmr1DH3OT4gAaAwIHC0QCTi Dj2oMb9ifIe0/JbJJhP5jgCZZ79C2EMY68ayV4IO+q1Maw2OZ0GmfwCmagfG0atjZUwUllk2w5tG MFmEtf5lyLXof8yuQexE4+6CvNtb3QhimkIIo3i2ZIYrlk0OJtKS6Tdt632ECU/ho7YarLNe6588 g/EnL8vo2XfLnOV2fgrbMpTVW3qs4wehMjR7wLW56GFFPP0th4E9FqaK/fTAXLTfCpJ1R+7mGsIU 6lNBi6rPapj0t7Yot4QI9UG9CHHsgzIcMUc6p3g9l1L7Q/AOYQBhFObaftqEca7UcKbMogyq5fRW D5lUhUwyzbFwMhaEtFXgInYEE7jJxK4AdZS28tgFbDT2aRgTlAURQgj69sBbkEFUI6KHMu6RrsYd g/klrMINj1J4U4bqly00Kkx7hTkILGhHrtwi3oDlJbxHAkYp864ML2p3h7TXFvYN4ngDhjIpEAsp OJOnTaBAZ416ies1+d53TsRwo3Ue9i9Iu3XqVGgiHdLOO+wUKSTeo65pdBbe+hgYZdYmkccfUDVg 7uBb41nU5zHzT4/+Go6sO7443KZP9E/NYq+BO6Co80PaQ7xkwn0esMOiMOTU3OmyipB0m+vBhC3S 3CVsHEnAX+2sLa6HTSAAACAASURBVKQU22p00eY0WNmhjRUSeN6zOpvKfM1xAPuet9JYp15P6tEa KifmI9tOYkKbEaF2iU2Ktpoj9DuGWNgIcZyFFoc4CtSTGiFbEoWMxUPri7E1RrtsUj6PDgm5LxKx rBPS2YNAdW44ApcU2pqehkjNvxcBnIKnNhoz7vgt8HSeG6Pe1QWKuQrhhTYmEJPRmGhVIfCIuY86 tc9PY7PJYzFEizVLol+h2iB+q2hKxhwXGEKI08f/FP7k1oBzdUK+9+lGPxZyPs8w7/TMsKGFREDn /0xTobECNSHd8hmOtXsyksE81rh10iW+KYixbhk2tR8iTp1Y5FTnb9jM3zhNYYdjIfHIOKaTbnVy ocFgnTTLlH4+0914EZewTTB/PN6SbuZj/A7wHmUifLNMHX9emuEzz3ST9gmNC9LJ60k9ypHCAesv w2b+pp3v/3+3v7hmO4iXZY6jr5Q/wfrTz1/imX75rZ99LOe3DKu/xjAVMiiMTeGD78HUsTYIHulQ e8JwCakxke5uYG5V8mHsK9wXTKkNyEEtDCjfF2KYhuUIgFk9lIGUhmiANiiEXrQwuuHO2koZx/C0 woeTQPfY7e9KM4QTRNDg5dLwStzK0TfLTQ6s0eUu+CVOhEmBhOn31cINj3gILcKvuxMAbMMnjVAG 17CTII9f6JdCBYUSh0NVeT3C4ZFFhQmG7YQnjG5p/FIhhd/D0AjpZppqUsSzxj1vv7hH2AnqXKGJ 5VLrwStBU0ghth7nWDp7LuJHGpRDcO3XyKXCAt9DU4HnNHhqc6IJ+ttC8qcKJbohhRX65bpvmBTM eIxEuiSFHBk/bXd023ownFd/Hk3RH1PYkJF45hESnfK4RrNdFUqEIU/oRt21K6GuikIJQc0Jj3I0 Ia4HZeNohjrUiLdQHcetBRQPdt1m1M57n5I4VbOcbA7poKpUB4EYqcFgcfWmRN+pMxPlqSeulC/+ PtKQxd6yjHXPiQmsy05eKMMcd7jdhpjG2NrX7r0OUYNaNJUwxrGBvr4xhBfj5V1XH5NeDEbQYxcD Q6+VuRkakV18r/pwh2Znj104hAtebSnjjvk2CELUa2mkY3a5hxFQnDuHDYkz58qdX/5M+c3PfjZ2 ML/tfe8vH/vwR0JauYhNik3O0bZQtZd89niEKrvuwA+w610GIa6P6NRHELstrMMOz5WrF5+gztk1 5pjJPrtd3oAxjgGwKaRgExi3PDt1pvRBI0qMtoZVE1frAUaXwRZML3n1SjBCxG0iaNB+xByaHBrS HOX9n/+v/4xFcBttDBgzNCDcsT59BsOdEI6nUXMegQifogOsIjC4c5fzmuxOri0ul9npsfL4lSvl AoPr1mtfhWHbK2dnJtkxRQ17d72s7syjhbLCnbDz5ZWvvoBdjPlQ2Z2dw67Ezr3y2le+HIbX4ujK YV959c03qA/OTMOU7l+bZ2LtLbeo371bC+V7jp8sz0zOlu05CP7LCJSg40P9nTpUEGH9yXgJpqFQ wt10dxDcWZQhkFmRQQ0CXC2SJMB9Qt2aXk727s5pNsTbLeLaThZBd6/VnvA7hBC4qVKt0EKiOncM jStEPjzjizzcMVUDQCZYRpcAdTiY/gb+Mnhqe7hIibsMuBoEMsUyM2HJPtKnTKZBWhGfOJZJKXDc MsNThl4G2EXLpwxeGDijLPqFQAE3CX1BJlztJIUylYEkJ+lKKKG/aRgvjrPgbjxxkiHWTybE8FEy J3dwCgEE6YZGBWmEpodp6lfjlW0hQ727T3lxNy3TFHJRNi0XYutOpj3djW9YyxMaTMTXX5ABDwYN /8oJ9zp85mM4dUIwgxJaFx6/yPTEUSOTanCYvnil/Q2JC+sj69dUzC7xNl2FIdbIDoI/IXDl6ZLg URTj2lfFUwOaTtZt6tM8SChsNhhPzQhv2xigSsTB/mSfkzmzpM5D/rQtoFCo1/j4uJi47hq2hU0H CZXQRiE+p8CiPw8xH3rDRZs58hADhUK0I3H2YHA9MjQEftvb9DHaXOJGYsQjHY49j4ipRSir6k98 jG8+0bdgJp3xjkCkB60x+5nGhjZRGRwDzymO2jm3K4iLFmfB0AaBgilmwrCRoPFdrUN7Dal1FeML oUAvVqdHsDVhnpvM7WQbaQRxQTgd9AtBQhuGnTm8l2uVJUjClgPto02MQ4QcTBwhbFGbo82RHyZh 5mSWavA/hrhybCrMoBNWCyVtH/NsPX7MOXBT84LfJsejtKsQncI6oYxtdqYUfDnPYraRNmO+ROAw zC7FJsKRXvDrgXChyksLQavjv20fop/0wOh79MkyqQ3jWFrRiCL5jnGcTyOVCibatLHj3PlBTYk4 e00fY2AF3l6F2o9Gh8dfVhHyKJRhQFpLUXfxpO0co6ukYR/rRVNlFMJ/kLQVAtoPhCpWvAZeavZ4 zMt50vFsfYSGDXWnAHJjA8vbCBEUgq3yW+MnjuOWkzCRHnmGtg3fWnxXA9DcRmmPHcK5CzbGrke1 xtm09Elwm5+/E3OH70IY7JOGoO4k5tM9PP/0z5+IGtBQq3OStIACWJmwYKCbpYc39NYJd4qbtkk0 JiiDJ/0pY5mgyr5HiZ27Z0+drvuZxhNVjedIKvHwLK1au8s0k+kzjSPGf1Nw0CKs8Qwjbq5L9lnX l1MwbR65M43Ew7hRBvGGNsybIzK/ZDTNS+v6MqyWw/QT4hiUY7RZvkYZk3Ft3gBhnv689SNv6TA9 8XJdETxC8C7myCbOur9F+EAZnEczn2gXjKAH1FWdaWZd62zZoy3Ix/qXHtB2mxBHOXCbwv5Qxm0a NbWOxdWjFeYdQHg1SVzP9DcN+Q4hGe6cP8KRP35bD+avtrBzi3F0U0A6hYaCbWh6gmm62aDRS+2A 2H+adRaB6j9HMLRsL3HEu2r/GfqXgoWmRoNBTVMwD/utkOru+dTWlDZ5PPK+z5wZNr0iJLjUDJv1 rp8CiFPO3fzWOTpqihNh36aKoJtHklr2wzo/NScUUqTGRNiWqNM/6THGupDgu3N7HOegPgIUKiSo yYDwAEomXBRQxPGOWqAQjuQfxzb48DjH+aX7RyhojGBWtTNxf+RWiadQovpiXanbqcMcy0MQX2Y+ NArIpwky4v2s12pDKGBozVdCH4USowjlFTbE8Q3TaMQ1fGpaeMQjhRIdAQaZGD4FG808ffc6Tm++ CJB2kj4BlhFoeM3pDPkpMA0bEeGDxgjra476FBj4XK0FAZYx3RVWxDGL+mhECj7qpAhXjYvYXKjL 5bt1dQQueWNHhn+7p/kpBBG0MWG9K3hQQ0JIf/FJiDB8ZFif9vO85cP21uilwKGZeE7z7dHUeSog hRV65PWgCiTUmkjNiUtsmAje1vFOEP0pCFsIFY8BSKyovhUMFZOBzJMEaG/Lc0tqK1wv52fPlatX HoY545qQ5Y1yY+ewLGCs6fS0d8crzGDXEcuMEjOD40jjGHz/H3tv2tzXlt3nHYwECBAAAZKXl33H jjW1pUSSS3FSlaHyxpVvkEqlkg+QD5CPk2+QVFKVF0lepJxSOZbKsiy7pbTbkrpb3fdyHgCQAEEM RJ5nnf073PgT5O1Y6pbVzUX+cc7Ze+15WmvttddWm0DbEGsYZ9w5R5r0CedObr8eHu9zXICdGo1a nlCIAwj3J5yf0gr9HHGendNJ5lBrQVJ0jB69RiRX1zaHLz79FG2Cb2GhH/Mz7IDuYujlDkYpnz14 CpPDrhG1JXN6huaBQg+JOK/39By4u8X7GM854Mzu119/Ndy99/VwC82PO9+6w7lizuqiCXFjY3v4 9M4nMBswgwg6tE7utXWnHBdxcnzKlTZ77PZLCEoYG69Xvllf+5ThJZPf7/7Kr8A0oUKLcSRWUToV GikLe8PT5UfD4ePnXPWzgXo5Z3/pOD/8s++XYOL6NqpBdIhPtm8N3/rW5yUM+f53/4RzzO56PR5+ /JPvo9XCzto6Tcc69XqO4yu4v+Aox50728M//If/YdWBFnd+8x/8Kowpgh52ks+gwjUk+vgxRmse 7w4PHrLryy7h0d0nw9yrK8P3ttaHn8w9Hr6PUdOXGOA8QVOkGFsWVdk+dzhl4hoLwuvIIIgzdlFp Zsh38fjJ/Pgto6vKe3Y50hntc6cMdHeYFQgYn4yuAg77nousYY1fkDH3+IAaDxfSwy/fVHaFV9vB vidzJlM7C6ZXfi6WxO+7qSgMUWDgIjDHoiXBb5mNVxzLY7z2K9/Np4u2br4HLEsxqYRR5V2G10U0 YDrG7aJrPILxG48QN15qwvNb3ORBnGIucbe+VI332It49nPjKeECaVh/F+pAfNz8JZ3CJc64mxaR VLlNSwiu71V+XxpUm1vm9l1tljwEiaeMpAtFMWHWDWHMqwyYGgZ1zzr5cwwJ1ql5N18BvCuc3+Yp eVfAlHIbb4H+hLctPLaj4OvYNqeNDWcf1PjfVRhId5/nuF7D+OtYDVHkqIp3SKf96hiO361P2C/L CKQBaRXTobEmfG2zWA7VPasvUQcmIvYr5hmDWY5oTehQBmdtYfI33kAqW8y/VqyxcBBJONgnvGJy Di0CjwGYZ8N5k9CCwlM1DsCpnXS+K35wViGO1FLw1oYjxuAcDL7RZ7nQKrdMrGFXJJ5guF/61K1K SlTMxecrjF21HUqTgvrjqIP5lxHWKKb2KE5gEorJpqxzHPUwAudKKn+01QEDfMKOPlLCulJULREN Z1Zalkewwipl8omwxDY5YBF3nNZxGtqj6hEsj7woOlqmXTXrqKbbGgaJFYasM79rU2QHwbNX7u6T T+vENqv2lhiwviAOzbP5V+NhjjnafqXA3fWo6sC82V7UdRnSZN7wVgvP95rWlmlBHFZZmUcVXhkw Y6naqopFO9JH7AManHQsVx82foAcsnoggOG3xnri0R2PASokSdmtB4+aqMVnMh4BsX979bRM2br9 nz5f+a1Iidu1nTRc7yXWTPOlOzIVvs33RGb16Ceh7zgwnjBg3qglyMjULQEKSz/AL1UN2O6eqZdB z20GMq3pL1aGgoQw6vXtOLPPOF86F0jMEEeYeDp8gfP02NdYy9kU2oKO1PiaIPMaAYECsnGk4G58 xs0c0eehAhEmfbhnOA0jriBTa/7VYHItvL1+exQ+sFsrJE3fzb9lrnxD87HfNTL1pC9eylNMfBsb YVgNLxheXOlK81YCPq5e9VtNhdiVMC7rwnoWkg/HXtle0JHwlj1gWgo+Ijipq1mbv/H3oJDAOjUO Nbd8N32FEtJj3jQimN4kBAHHKaAf/zUltDSKlsDfuOs2lVbHfkeQkHr3WwGX6Sac7Z+03EA1XIQR 1lUfNuWOQEr/WbAdFEpAuQ0r10aBwwJzfOpS/MxtGu00Hxq8VMPuObyGggdpUCFCiLrlCDeFG66f MnPxM17x/WalHA5pPxaVCu8fhREBtRTdFBM2EJapFaFQYg/7Ej810N6xL6FQoodZmxKlKcHqMh3h 6IUWBlRA0fqIRzkEbV0dY1iTRqnv2T+zAgn9+6McMsdqTbiyPXGjAjhlxyU3fMiAB6YjGmUvYnSX /vKmjcmv5cNw/cqjIELBhaAQouJ1Xf6YY6VN4KFfhBS+CwoKcvTCb7UmFAwolBCixeV7b0vC7x7K IGbnMGpKzJcGhUKNfa59N+3rXT2qkaFgpI5y4B7tCXEFBQWCeeiFHeXIH69kNe+xPRFhSAQUCiXi ZphZbYndVyPdvZUIeeZ4xx551oaZ14Jq3NI+3gsiuiAllPAohxCBRBnC5DsCCe30PDXOdwBHm8az bkVc0V3CnBTD6cBkoHi04Dk781/d+/7wZP8rJuyD4T//T/4BjOLm8ODJ3eGf/+m/Gv6KKzB/73f+ HpMoTBgK1SsIIRYxBOhVlu46OVW6MzfHNZav51GZvnEyPHz5o+F/+t/+R9whorlqbYmzwRKFR9xD 7k0hL47uocL81bCzjTrwEtdErXNfNlTiweHp8BlXev63/91/NfyLf/En7OJ8PfzTP/j94bPbnw0/ +sGPEDZ8zVqHJXk603i1IloBVOgJ6iWvIOYUMKhi7fsrtDPcyb/34x8O3/tXLEYQYKp27yA0WKWT nNBY7orNYWfASYr/TIbjTR5qIoyq5RCWLGY7qFGtIMHXuMdtJNqeaXcX23OOywgBJExlniQET5mQ PMt7wk7mI4QE3/vX3+O6zntohVAPENZX6WRqa2jQb34Rxhe35asMsBUJbmwjzHE8hvIt8X2OAcxf /y00Ukhgn92yn1D+UyaAz771LWh9zs8zpywtov7kpEXnmvN2j0VJ9hPUcBaHrWtzw/9x9w8o9/bw O1fQHnnyfPjBwd2RwWC0S5gvSJ0WEU8ZmPCKCbAcVAg+I0NEHTDUa9Jx4hHH3V6ZJ8PKuFY4Ijyl zl8ty8QYZnS3biSAZUbDkLowGd5+6g62jL5xiCuObtan/VWG3/B1Bsp2JKxgXspOAoKu6t+ElWiX YazdRsKGgdXfOPwWYrQw40I/7VHUkQOe5sX8mYZQdcG3+VNooLYHGZWyr3jFVdvC3VkCVxmMw/h9 pvxjZCPD6vhRI8ez9PpXIibIe9UV7oJxZEH3u/JKnVjOCCy0w2C9lCaI6VmHLb+G8b3iMG+kKeNj Pqv8PFP3PoXKz/hS3ylLuZM/40tbGq+aEmHCxa3+w9MFR0bN+UZ8NRy8Ukuos/76Ed7xtoDKvfUr jNkY4/HbdG0biRvfLbu49g/TluiTOLE8JeyCkRPXvMhwwc/VmDUOIqh2sh3tD8vk0aMwpzLi9nPe PU5kWPcdinmkrWwvwwreJCHInJbwRImzmaZeqq6YS8Wdr2s6C7UImBOEDQcIUFWjrHnTMIJ54rFE 9N684FWldTygPPExPyxOV5iHFDhc4TjAKkzB/DqMNUYRqQwCj0I05x/rwfzMg6dGxplHMaiEeebG l8wnpgUWgg8Er+aB/zUftvL5rVBiznJRL3P0LzWszmEe5tz1J94jtCEs7xxxezSDSahwXITP0Q5T y+Gc9kZPcLgCQTbH0btjhKmkNGpSkMfyZx0yH64NuxAb1wi3wm+OHatV5p4jCR7jAazbE+rWO9qr UXWzjLTja8r/9LgJyIirBFTO0YwVj3V4JJCKqTx73OX6MRof1KU9LvOVaXjMw8lRDYpD/K0r+9xr BBWLlFPCsIhVFuEab63ODtHeUFPlGukpNDOv1a7UoYTs2aaM0ShgMB1bwRlGYUt9gy9hwmCpOqcy laoOSxpTsy4hMLfQzLtKHM/BtX8fkI62RbQvYXqKl7Qgr32QUvGl3VjQR0Kf+KgdjgoyXsCzXIZ5 /PhxMQkyCDI1jkd/gnOKO5D5LscPf34pasDddufVMNYW2j4npD+UUIw+I6NrX5HZVHCg0dxiMBv+ LLNsHLo5Z8uEFtPJt/EnbmmDpNen6YENsCY8NxziJmNlnO6S70JH6Zf4wgjn+ILMvYz9LrejUQCT oGDjgwgLMh5qHDgW+CU+3ylE1ZHIlVfCmzchuMFXW+Jo8ajGm26Wb4E5yR182bMjtB5krvsyG4+4 lk8Nj8AKdXwAg6amiW3k2OWjvk1+YWXUOtBPSP0b93TzCO8KJZ608W9+xYsAwHC6ZfynHLrnXf9d 4ogmhYKMykvTigle0lc4K13n0zAKSgTbKW2VMGmvfBdi98e0exDPMCss09Zn3/7iWt9C2l8mTOHC AX01WhXjjViuweNaGu0K19YV+pTCjQiS7D/M1my8nQ1rChsg1yyDoG0j/Tk1PsEaE+4KeHc5rq5W p2vx+q2bZRzzrDHzT5oxzCkQL5XvBw+mI8Ma0TxoDGJdDQ7OQjvycdaOfDyXJphxv1Yu458YvZTN 1MbEOnQF5h7ZMudYQxjLzobErEXLczYHMmb21ZBsII1ikWXOhYduMsCTaeRSiLvvChXm3FS+jZYQ wkENX2rosm5/aGHEz3EPwwjGlXiMw/cTxsKJxzkIlyo/V+7DOr9PsbSB8ZSy7bumogkSIcVrLli4 RhsIapUqRBjFKoxn1+IGCl0E49lrwpyic9jIVrwgrkKOp5R3m3fdNqm/PdbsyqPp5t26IQ+F+9FH JbRQ6OBvj/i0OxGQHjiXdmKzpY6j4GG6XHvA90vabJd+/kZbxmtcLfacmhvwhE/Ij7CDodByB3cT AY4CCZ/icA57rHPwvML8XtP62MTehvNb5YY8e824cIBWU91kxru9zCMe+db/fbC4wXloB9Djx9ww ATHmDqIN5vWYNUkwOUjA/+Tu3eGf/vE/L+NgL5BY/f7/+4fD/a++Gp5xdOEuBOlXDPHDP34w/N7v /TqCNu9Af8YRBW78gBB8dXKI1JZBuQSRdIwU2rvCMeQoo/wXP/7TsluwvrANY881nL/x97kF5KNi Iu4//rPhD//l/wlRBFl2vjZ8tPPl8N/8159wfGNheLx3b3j4DHsIh+z+Y8Dy//q/VdGFoGMirnvI eZcRODxAHZDnKZXisYAjiOU5jkIsYqhznnx6HeTpychInqLpcc6uIHvi3BoC0w8ju7zEjiHG0pQ0 ryIcWIJRuELeNxnY3iLhRCZBq3r7ImEl4pYgwJf5qRYOS1eM0jE3lxw8R1DCwHrCZPCQGzdOyYdk p8zbxs7a8Mm3/wNsUmwWMyUDuX51k/PjqvQpzEAqrzCDJYlrB4Y/+tM/4daTr4fN7fXh668wJPrZ p8O3v31r+Gf/DO0KhBHLi+fDj+9xs8b1W9DOtAGqZq9Q8ZYQPeUMxZeffzbsoinyq9+6VobXNtmN WH6yOPxnex9zXn0bY58Y2ly/jyYIiyBhJrCAaF8s0+m9ieAlg+gEQttdSA1h1vWHEN1OzCMqu3AQ y0ekfxU1HlXTTsmH7eBieB031acl8mUG1TyRfrfP+aJkzeMdgsSxfcZ0Fom/pHmqTtNvNSy4hSBI ewi1eNB/lVIrzX7FQjFnO3IUSOK87F/Qz8cd0ZEpdadb9v4FC4ECJDVlTF9VdBIu4ZXq/TKEtrk7 wuVPGjIrtXsNvurT3pLhgrKEgbpFmTEHlD2Bxa0EWYTxdojtHY7OkN9XTCoa+bP8MtKWn8grXQUn CgdqR5UynTLZnaAR5E0lCqI8NqQBPQVtR/y041DCRCIpq9Gkaf+6zqRVQgcJHKTeGq0p2wqkc0Ze X5k+6ZTqFu3h1YQyk9WGxKGAzYVPWwoK+SyfAgTbyXYxn8XM+85PQYiCABl6DUMpHHD8ybR7E4bl NL1FmWv6D1QW44bbFah3j3tEQFGVUfIJ46VK7MOMAzVtJC42r29D/GDQljauWhurrfJoNSooVMhh 2R1TgsymjOIK41lNDY836CeTaBiFCQocPGKiEGlxXaO77PhYduqV1ipNJo3uiv+SdnkhE07bqD1A xYzq+NSp4e3nXqdc/YZ0I7SxbNaVxNeKAgX++b7MT6LsKn38CmlYF+f2YTNP3rxFQyOZ5LR2w5dZ y47RRBiFSPQX6tbbMrQBcURdvcTStnYLTIvKKjyN1/pdJJsR4/Xavmq/b2BfsG/XLnzhkEPD0YZK 4UsIQF5l4hU2KelfoB5lIKoOzTPje5k2kHn2qN/50bjrqBBDEFfDjtr4mNcAI/lggoLZZ4G3TZn3 zomzjHTqVgg4t2x6Hesa64zz/iv6ETkuQ57P9rFjQtyb/CT8XrgbQB5o2WEVN43lVoeibu0L9ssz +oNCCa8KVWBjmy+R9kva9jV9xLmnhBHWo8EJU/2TOEq7hHov7QjmTDVUnHNrngB/avNKlvCkr5tt YDzVdkZqHRKPc67HUEpwSvxeRbtOXiplwqodU32BcquJ5O0f1oFCdjXUPMJ0QN/TNskebXqVp0Tw AX3R23SW6Qe22SppqUFkG6p6VbZRWPd26C9X6H+HCO5LyEoeHW/2YUHivmcEZr8L6cOfX5oakJGd ZZRTeJnlQPpP0ZasB7Ogf3BkDKuPQSatbMBkMW7DlPZ9sYQeRHQGw90lNb7rRJzpqwoDEr8CFfMx +ZsOmgoKBmT8AwoLxatjJPiZtsIU85KyGYe/WiNxncK/ieZC/fRCiQgFDJ930664qbpJ26QJGKRP J+DVuCyf+fInVH7Jn/Zlkre0UepCd8E5OIxyOfAnOPUtXuJvYXqhhDjiXwhTAcc/b1qf7z48YWYh edVd2q828Xj3KEDay3T69jfMhbSNF7eUL/7B8dt6rjqCiYq/aVb74RcwTNGZrQ+sQQOMGhXj7RvB sw8q6MqRj3InTA/eviELa+xeMX3EeuPa5I0cI2VCOZmGhf5GjtfgKWTIsQ79bS9psJq7dQDEiR0z 37U3oZBBocSsQKKuEK1Q458IKrRFISh02Bm9yraEjOVO81s+eDl8HaFEw7nwgCfwuGsPCiU0mul1 owolrrerUGW6P4Luu0+/XYIJjyDhFIHKYrNB5W0cBaxJuY1DGxIy8sGJ/5QmNGoPo+Bi3MXv3eud eAWZe6/UtM5KSMBTAQO7xeW+/PGtUSgR4Q74PShwUJBRYfBQCGEYNStyFMR+7E+8AniSCTimryBB IYV5KRIHvB1+W81AZmxJKJSozYkWOPFJg5qu2hVqUEgvaGNCoUTcS1AC/yHovkVbpa1LyID7Hu6C x0AYFPCZCB/a3KLWBIOnhBXl7ruAv1eZe4z2TJrvPbANT/A+wM6bxzWe10Q7MtfjDokqmhJso6HA xeH+g10Y3efDb//9z5i4rw0/fP5s+H/+7HvYSrg+HC3bceaGm7c/Gq7fuIm6NpJRwp9y5aTS2ldc ybm1hgEyZDHLGGuY4zrKY85SeyuG18XNIURYuYKVU3byHzzY45jBwfAI5v3w9IfsPmkkEmYV45Qn T0+Hf/LH//vwyce/Nvzj3//Hw//yv/7PMIowbQguHp89QDABM0HGr3LjwtbVner8n5AnDS1CXzN5 qe6NsIJjEU+fPq47wl9ALMvIr7HD5NWpVxE82Ancwb0C07LOQrXEThL7YExgGuFE2AKB7KIpUy4j vk9H9azvFpTVeAAAIABJREFUPsY+/V6Ee72CdsMVrgld5bmxifCHHbQTyru8szB8zLGRL9c+RYUc pgkCU40Uifd5LPCfYmlT46MH/J4+ezgcPCJObt3wjDlLf0luZRSeHDzhnDz4kNqIAYanT/YQmMiA bjJp0bFpkWswvnDh3DX7GGYWXAQS1vfDe4+GTXZR1xGwPPY2FY/XnK0P31n81vBbh5tMDgiqNk6H P8Jopsym87R152Iso2m+dVfgo/2DFRiDItohdMv+BIlL9EoAq9pNoQrfOl1UDZvGuEqdqgUioS9h XUIC+puloSNU/nWTMZJQ93iGDJrgzrpHjup8PG3rTQleo1SEvosS8QmvYdrnEYKZDxlrDYe6f62g pAh+2tGdQy3sm6dXhD2D8a3ddBg9mWeFCX67qNtOEv8yIzLV/e7pcWMwZAisJ2+msA/4fkgfc/df hlghikKVVZkBwDIqBKm0qEvzQ4IIHkiHOMsAlRMCbgfUpWlqa4VA9DnVzEemR/V5F1jrQImuggzD yhxp08L0XYhl6D0So5FWy6DmRtlVAFfDdtrIsPZqZ5m4o5kgY3SVMNaRafht289T9/Z911O1ak74 pc7Mv3lS6GNeZWSXKYsCkdccyyq8OYyKgndOfVWfoZy2TTFDPEtAZEUB3uCg2VPb4AoM7yoTquy8 N4UELJvtZd8UthlXV8ijx63Umjmhb5h/hSokW2ENb//22JW3pcwzHsybbefEoUFD+/sBdRytgVcw zMcyzbo5ibMYmO9VbMUYv5OzQkjLYd/Tr5hQ6yfvMpiWnXx6NOGQo3S28xHhda+2VLhAHLqX5ob5 gSvXPotnP+fURlBwyFiic0H1jH1ZY5PzEEJL5MujFN5k4TEWJpyxDMbZQIObCusKZPzJVzHpOJxT X6dM5pSu+u6+ZcJ9HqGYxwNKu4A+LyhMkJgsWw3sVrggLpBvijMcM1++VgBV7UwStg+/16cw2DYE oCor6CzauCnkQQCOOtdoiZz2KWOQzCEe5bDSqMnS0GDw1Pi0zQ5xP2P+O8COh/OGfa1ip27UFpiH eLRuafCxTgmjVtMJBNIa+S+7GeBp50EtuGfcpLS3v1dj+CqLaQk2zavEA3FoVNQx6bEVV84X7CQo XNVGA8WufqaGRvVHCweoUbKqP2U5k4jT3X5Jthy3EuMvKG8JbYjTfnuFNrf97UfO7y9o8yu059oS YalT+9mZaxLlfg7DpVDlnHXG61+9UnbJtoFAcv4RV002d/tMj1m6BILWi0QVNVxlkKzW9ss+Qp3q e/Yf3Wq8vBlz5Th6FEPgXJPjWJPfh5df/BqwS4xdZCprmMDSeIAWZALn/8W+I46QfpVv10ZhbZtN IObfXccskDh9d112Xasou7SDE2ZUXN8VOggJV26uSeaB6Neg/xx3JeQoTP4Qzvxr22ASgrS8BMVn 8m0deFTANPyngKEXOIjrt3G5xogX8H1imtFySJwKR3phR+ow5ZNRTzjd4m68qYsIUhKnfqZnWXt8 3atOfQHMo3k1nDmdxS0k/4AH0vTpS59WhTNvFzDe4Ojvrw8jqkdZFAYkXbUtgqNbn9eKeiYPfXKG 82e5DWf4XsiRYyJqQCQ9614Bgn3DfPiupk8tbH3k7V2BvqCh5IBuakpE8CCzF9Zttj4M8xBbPoKC hzvYo/NIhxoUPfRCCQUqvVCi3h82hrFpR/Rho0Ghm0KLCCaeY9hbkIV/zhqsMGJDTQHGhFoS30Wz ewIZWsrx2E0RaFxBDQnXPWEOpvwcTQNhA/5qF9ro3LEKPEPjowQOuD3guzQgmp9ChAgcFFCozVDA upe4/V5Uo4EwlwkdDK/7NvkL024Yl37rPnYkLjDrK6x1lH8fmqmHba44X0QTQS0JryOPRkJvi0H8 jSZsME5B7YmDH/xo+EtoC2EH2xgHbP6MAH1uXHcfDvuEq3LxvUdY86uAKPGYvvD07r2K0/cITHwP pCyl9QDtJb55VDtCsK04izqiPxnbecuU1YYQ0IjItaC67fHbunNn+Bztf41cqiXxoz//N6VFIbpC iRtNwFBaEuT/JjewwfDqzRW6rd3qC1rcDUroCYUePr1N7F2weERFeLf5EsxuET0EkImQeJEwdifJ 89d0HX5hymBKIWwksyT0JN4VDtTkCCF0AhGlLQh3YBj345Eqt7ggshV2GNNrt0WJ4Ywn/DjRSxhz BhzGUOb+AKncybxqbDBMZ3R8tSY4yHtwuM/tHrs8MShGvs6XrsBMMCkzYWjcUi0Ed9/sgBqo1Jq/ xswsi+du5xBkqOFwBSndyoq7QeSCLcd1GJ111Km1cK+mxxKDTWv14somv2bnkexXvbgr5aQm82H9 yOy7M3qESnNd7SchCPFpmnVe3MmMd/idyuc8TPnVa6RPR1iSyKZCFtCCgPQvbYJTjsUccyXlIVeB HqJyfMLNG2ekzxJSRhtlHY1XZlZIHCcllMHS/jw7dpRfRtpVQEGK9UyTUQfUI+kVIQvSqYsS7Poq DMLqOYQq8UkwyzztM3nUbi31J9FajDDErBO7k7ZXmqop4aSoirVGUl3E7EcSwNbJ2G9GZsy0DSuR K6Gu1oTvCh1Mr45NEMJ3wTyaLj2AnjIKGHTXrkfclhh4i+CUIIf8uPiaN9OqWwfIk/3E6zBlvp7v QbhDwM87mVJH55ytJzII+HHhy86BdetibP7sP9alcR7zkxF5TRzn1KmaLIKMrvm1jqzgK1z9eoIQ TnVImWI1CxwzSt8dA0cc4ak2RVAQMC0ihLeENUDDw3qU2CihFuU6Ia1aWBlbCls8DmOellnhzFPl jzp30RXP2y9sD4+7WK5nqljx7oLmcSYNgBaTTAYUOMlEGjYLsnVfdUl5rI99yuzNDwotPM5SYSmv OJbd7yo/8TnG7QP2+2P7qXVGfN7A4g0fCeP4Mq8VvhY36qAD69VxRMb50fNJxzC2l2Nwn76Qm0tK q4OymQ/Lbp1raMoxus+k+nJpZLBeMZYUbji+ja8MWpI/w8u8m171O94VML1GKLhIfZuDlzKMhJHR qxtgEARoG8W+dIXnKnXxDOZwj/S82WGdBUZGTfX607mXxeTaHyuNVk7nzddPHlc/UWvDM4RHjMHa SQeXyioBxLl9kqtKTyGKPDrAZMkNRkjOEUosz0M0kS81KRS8qS2gKr5MsbvpCgXVdjjA3s2xc5ML PuWzP8zCOfiqOtr/3AWwLhw7aicIPh02u2ihKRhZ9O5z6+kKdoFsK/PB3OiRi2PSOSXNU4SjHu1g oAzznqUlb2dqSFB/gQXimqP/n7N4O58Ip8zHp+5QYA+IyYjEaZsXpEG7asbTsXLG0RDPz54Rb9m7 YE3TRoT2e8TXEN4pfi8sB3HWbRs8FchBGjj8UUIjnmXaRUExYV6QvuU/Jq5dd3ucA+gz+un+kv41 HsNgrhLXfkq9e8vQEgLQeQg00zmm7N6Eso8NDfu/PVlDlWcKSZ3/JERw89y8Ryo8A/oMvH36tm1j //f6Vlp8mHtGH4JY3GMOcRNhCbXLPfrjSs1P45qsXRHLqPaJc4fHZJ6QhxPiu4qWlH2++pVt6Vik b13DfZs1T4HEHuVTQGZ9KBAxc7b/VQVfgGPOo3LOAY7bCzD7fcHzw8cvfA103SFrSPqIjF6tLW+x pdSKNIr/6Iu9twK6hC87DPjXN2i9doThdLe/95C1LHHUs6Ekf869/oQSEjQapo+HyEuQ7469cVY6 5CFp9kIM/f0JpuFP+kiYwtZXS6/h6pQ8+e44C/heRx8Sb6sr8RmlZGTENH5xdY/BSN2qfGSp2KVU Ed/WeeomaeXZ58U4IpBJ/IZ7K2xX/wkfHL/rlwT6p358J0zv5btlV6tb/z6+2ffZ78STeOOve/Iy 2/76KZjqQZseZ9C9HuWQZfdK0BPmSW/EUlBh3gTfFWIokFB4Efc3K1yhTX8UVKhFYZOoNeH7U+bb 9Bc1IjZkZru+ELcpkvaihkSgjm+w7q7BnOcoh4KHaElEgyLCiDx7f+PK9aD79HvhiYaUZsAjAHPV sVgnPLbRwHeFEvPXWAd57mFHcJ6jUGpLCAoNJoDWyLGLEkTooTACdwUM42hq2A03YUsogXCjoOHH r+Ki/q6xjilwkOFXGCDMsfkcAUPwIwjQvscCG7zalhDUUgjuKcdA6mYR+dtLIMIBtRLYWR6PYbS2 uVBmwtY3639pR5C3aEBcQ6NCMB3fY+dCN3HUuJgVilR6IjTw2xxGKOFT7YdJe4K+VYKKBIAXrSMb fJc9Cd1xY0KB9HpeQrRD3uO3TZeX81EbXUjfqY/uj8KHCCNgxMpnVmDRoU+vKPwzOCBy3C2UAIlQ QqLIHUwZSG0xrF7dwljMJmpBEPcw049evRhu/uq3h9XtW+wS7WNT4pwbJm4z2zKJvJxDRf8jtBJQ Ibn/jLBY+L4OEw555WYYSqX0OXZzSfwY4tAjEK/Z1fQI0gFE5jOuWntJh1+/uYy9BozGoTXhTvKV K+fDn/7FPxn+5ff+ANsR58PHn9yAQIT4R2Xlszufc8XltyC0UF19wpnBXQ1c7g33v/6KkDB0tNIa BPdVOvzqCtbSNzF2efvzOo6hu3AKsX+AfQuvbjt4DtNDXBKg+1y3U1ezQdBrTIyi8oNQlYlgAtIO xMryynCDO3S3d7aRrK7WVaRX19yRogW5CvQMo6AnHOKWeT9lkL46R6LFzRlH+ywkpOvgO+d2j1dH WPcF5zmE7CHM6xUk/O44104XaUIZw9BDZMKgqKXgmavPOMLx8O5jrhd9Mqx++zN2zF6xS466oTvs pzBwXtNKPPPkX2nay32s9cM4PbiPKiPtexXjl/9o67eHX5/794YDjWpunQx/yTEZd/4k5a17+4ZP SPN6l/qVUJdJk9mcBYl3FwIJ61LrZyAscXZ8CeGRDLmMk9oFLngu9BL8RegTkVov1EYxmMZ7juTK XUbrW6bTND3GUAsN+XrBgmGdGUfdloIQTJU603MnvOIg3AmD2vPdnt+/CvPjLvgrNFQ0EKqgwzyb X8fDCgIvx4aaKjUCq80RRJC2jJcQWxthnktIQJsYrwytdab0Tv+rMof0cW1/eGziBOGTsjqQJgGH +AoNFBIat5pCp9Rt9TPriPIr7JGxNB8KS0oIR59UUKEAxHoqZgz/yqsZJX3HssKHummCdF7hX4IF vGUmJcr8XQZOcOZNxsp4rCf7DR3sAro4yavEjH1WwZa7tl6/+RIGUabc+lDQEXwjMS/+VEM3/6WR 4pMyi6dwzadhddOGjDvD5r3KyXMScpC2cUl8KAiSKbPePIaitsopAlPDvKb/ps3V5DC84E6dwjLT 8x+FqH6l35Jx024eoamrQmkXBWOroC1S92oASVAbrwy8x45WSNf5zB19yy9xYd8175bHXwmsiL/m YhYQe5/HU7wG1Gspz1jobT+NKZ4wX2iU0fCnMKCVd/qXqs5z9BuygkYS9Vv1jgCGfjeHYMRxqgqu QhlxLF/qW+aajEB3uQ7gSZkPmeutOyquyrIBg1xGJ0nDoyHPaIcl5wjKYlp1SwVMt99nLOx1jMG+ qmCBOGzXBYRPC4yBAspCBY3vjlPqzP5ZfZj4Xis8VJhsH7Jfmy//MIfQCUog8BJBxir51pq1xyeu Es6zp69oT682O6W+TxWcEEdpXFhmYlFI+BIG3J1QSkebMwfTR9XCOWenwDXNtNS20fBZGTzjCOFr 5h2ZeY+9qHWkhpXzpDWq8KYE3BA2yxAa1t85t34covnh0RlteJi4wo/q67SvQgqPxNVZZcqkxsk+ uLrPs67U9avUp+uyR77WqJNNbljymNY6u1CvSENiWMEQkwfzHuOD5zJ1oADhVENhjDuPtXGSsgQf Gmv1tqhzBN9H1dgWlfzXYxznar7Zj0uNHHyNawqOKd1lFt4F4qi5dKnwwnguCWsYwVhX2CH1O2e8 v/jkk+q3u48fF46YjlE1tgS/Kzct3imuS9IR37HX4+Q7brNP0/ca9ZyxNw5xav3p3vt4+neZxISp l/FjIriT98SZsGFOvYHANTJCdxKfzveL6y9QcfCx5u4UeXa821bWUeL3aRyXtUMfT+Hh4C0HaxyZ 61XpU6bg90/DJS3dXQt6ML8RIkx+lZ2xLDKLrkUpW4w3Jj/G5Tsz65toCc8Ir+/gzT6JvfyTdvIR bY5as1re30TMtFjjfDzOYd7E85/xTe+tTPXd8t7HkXf9C3gYh1D5ak2YPKnZcYqGrd8j0lhnhhe/ 0scvdSSO5fLbsLaZbZ/01LZI3HF7E/eYh9SXcek3fROPdSTEbQpbrhf/iOP4dPwHpnA6EPdbYLnM Px7WcfCDV8ICcIRWg/GangmTpx6z+cy3z3V+1lW1P2unYB83fPB0Uyjh+lwCIr5TFz4VPpg330uT ojFqbhoI2qJYXN3yMsASPLSVb7Ip4fXe2pRQKCEolFCrYgU6XWHDBrYFPNKJMcBhw40l+uIGTLU3 XOk2AevNPnmUcf0EZlxwc8Rd/A3wZMr1E6dmI3bCtWulzQiPV/TgkQuNXM763cF9H75ii7V4l3VZ cNc8zKq77AoqdriYQKY2Ng2ek/YnauJdR2BP+QQsGww3yNcZtM5XCBQ0ir5OXNJoggYu5W0Er19f dg12HWWNf7n7hM0bjgOzxrnhUkdXoW9yA4dh9DOmZ8TLoY/hiy+/qA0ftYmFZQQ1bhwIGssW/NY/ Bi51n3WL/zoCE68C3WLlf8E6LeimZswC9elNFve3ng1bHHnx2IkHFxJvIV/yJ3kT7xmClC3rsl1P mrwY7BZle0i5dtisD5jmIRsggnn4mKd9VvC6T8E86bZdX6P77XVuOJEPg2YI+O1xjeV23Cbu69xe I+TKUMs0GSKm/3pjxw7xePOGCgseTy9jl/DnN0HegGft4RqbTu+CRaV8MgkSShLrEzMDERnQiv4B HeJwgcKjaXD6enf4+O9dH66frQw/+PHBsMsO4VW0D7TjcIhhnlN236+tbTE2vxpevjgerm9oyI5d oCcjcXVtS/VqBjKnea4sQtRRwd6D+/LVI1TyUZdlwCzZEbmp4/ljGRzP7kGMKaUiDUhgVEg2UQ35 zvAXP/xLbvHYG1Y/ZnePOy5XEQrcvAmTcY4V9rPbqDF7FpB8sRsnsXnAztkTpF6vvvpKbXjocIg5 iM9jGq20NeAWlVDOQUVewXjnVQQj2nlY3UGocWWBIyJcnQfxus55oJVNLE1DCEIh8ZN5R7MA4cLx 65fYNng+PHuFoRaIzCOEHIcLqJ1jUXoZexsvPZ5CuKVTCHXqfYk03TmTUT+E6K8dTwhTdxPnOe87 B3Mskyez6zVxVzGQ+ZOvHzNRHg+/+Z1fGfbuYSjnz3ZhFlHhRyNkk/pViwSuGwbmnOMdtCW6388P Fod7954NDziSs3ED45rXXw0fnW0MH+19Pvzuyu8OX87tDM92ngx/+PxPh+/u/aAIVYURgkzQIpOA lt9lyiT0S2OguPaxpxSODAX14OQuA2nfGjkdqojBs07d7aMabT+r3WHwXVBdLGu3feRLi4mZo16K 0SUOtSSMv5hFCOMlFguzpuBBRs/41ujouqOfwg0P9FP6rf26gKfMjYxi5dM0LQNxFbNA3LqHUSSS yh+1XmWxHhTeVW2AJ5jvcddUgdW4XFYeTZOyKyh4xTV8xml4mUkNIFmxqTvTNx+GUyhhedVEsf7M e+WPtGRYa4zCCKkdpAFI47TPyRhZdxpU1c24JgEjYY3LBU/Guxicqdxid4C7+SaCybEWaL5lWmSs i2mffEUd68x8mo6gW+JQa0HBn22kkEKGxTj9iZcwU7hGzOiXX+rAesxcVfGRnnZedBNXDRnTta9Y Vx73kYlcpF5XaPuxzqh73CSaEr9P2KhqX+vZiVnBBJVbgjOvOvMduShCAoSQFo93iQpFVBUP/tbd HrZ1SghCuW9s75Qg5zHH0iyneEKNiRbOd/upfp7vt1wakpR5ZFu88KtNya9zgBa3FQ7NMT+UIVjK b/jnECElODKftPXWTQwF83zF4n6XuU5DmApLJGxU838FY602QIHqfeaN9plzEXMHiPxeQdh6gp+2 NgiMAWSO07EDco7E3iMx89xWNMe8rbDCybS0HaiDM/JdxipJ0+MYYWrN80LtOpGE8aI5Zr0K8/Rr MlECxVXa0atLK7/WOXFf5VYNBQgy4WVzRWn+MutSzenkg3RH7bQF5radut3iDIHELvN6WaImHdu8 2p46cA1ZV/xjnSCEYSquK013IQi0F+IxvjXWoQPax0FSZUBofsQ11mplSJcdlfDCo1XYd6DOrKd1 BNMebdt//ARVWO2dUybqZ426rJIal4Ih1lMqGAPHa2ULYg+thjL4SnrMrrUDoUVrNbpeoyFofhUs 20bzpF/aX/u7pf3wGoJwEer2Ywi7NfrDE4XpGMd6fPdr1iGIDuK8zqaC41BtsQPmC4X517h222Ms WstXA8O2sA9dw9C09eQOiU+FhBvcYmIf7sdr/50xbVsW28GYq7mD74QJfvnj7lwilACD5zh7uEkz ElTlyR+N5hl2FKrR9x27/Mx7EVTNL8IScWVuAknfb9NOOr1/cGrsUwezzJECdN38ZdfY8AnXl1W3 1EeewfOZ9/glH/mOf9x9OhOEqSHyKsdl+HFzPbW+jMva1F3o4857/Hr/vp40PDhe8zmqt4+pj3H1 cSQe/Reh1yIACCMsbn6VmZafhKv0aZ3TF2MLBffuo0eF7ndwfZbNB9sZ9Nh/qDjAS/sbhkSrzWEt ixHttS3EjzZHvbe+l/C6Bf5t29/jAV5RqeAkZTJOy5Dy5Dt1Ng6isY7DCCcf+lUdEz60k37Ws/Hp 5i0d6ac+detxxa+64dnnYXLTXyTA9pdPiN/oOoaPW1+W6mk/4/FvHky70uXdMs62WcqVPCbfeeqv wOaEWwUF609cf66h+idsHSWCifYIq2lJqw8Y8g/0aSuMWIJXKt6K5xZ8i60vlBCZp+vFGWuYQglB jQkFEgowXBu1MaG2hJsBp6yx/jyuXMII+RnCN8sLg1eInuMv5NiCAgi1RtWK20AIoVBCQcUmcZaQ AmFB4Bx+KJoMcYtQwqOKHltUWPFUoof3XdwUPGSHPWF8brJRoF9ATYXNO7e53nW70tWIrJsIEUoE z6eafNZoPVkfLwoeRqGEwofVrZ3SAk3Y4yaUCL4CDQUW+48eDOf3HgxPv/z2cBNBxA3a4SGBZOyF x03w4BWclwkNrqNN/qDVax8m8Ww1QYSrvEKChWhuVOzjn7rqk1fjj1BDnwghfO+FJPFTS2eRDY4I ISJE8fsxPIRCENNT2PDg1WEJMQzbC0Y0kCpEMKFQIv478oeA690T+MbYmChH/pRh0Xw0vNzIYay9 UCJoEW7UKQocFUo8YxP+c9peIcQKfKM2r85o29qMkY98B9QcIuFfk5gEcmMcenwJsSN2eB8xIK/R ANhFhNldGO49fTEsrXne2/NySJ8wcAkrOOxhTf4M/EPiO587QlLCwsYI/PGPId4YosvXIS6h7jG7 VUwuNEYJBc7OsE0hxokSKO4HvopWwGt2CinMlTOwTzFEhlrFGVd2zrN7Nc8o3rruGWR2klcJSyW8 YGAsoCXgOfHlOay8r24OqwgQbixeH+4sflTaGeeMYTUqXiCk0D7E3hPUb2Fk72xCVCLV0bDjVW6+ WGeArW/uIOxA5ZhrOc/mNGaGzQwEBS9OufLl7BnMJ8QqNjVOFcjAGB7hfophzQUFChChHlNBHFHX UrrbuQQx7Yn8I8zwHu1yThiCfBEL86qTKxhZXFClV2EJRiFZXF4jIJmbg6mgjYgOhovy4X5zE02K W9cRaAzD97/71fD4Jxg5otqOGUzXP7rBzioTLASok+Tq9tmw+1fPuLbUSRVGGSGRtjN+85wB/nB1 uHGGPQ4mxL3V+8Mf7P/x8EfP/xwLtwhnTtk9dKKUwSDtkTnW0rwCLBhn/glhuGSgVHk+oR1kvNWo 0E9iVygmjIhip6CMhSIw8eiKCciglyCCBUEwrOXOgqGfbsXoU7+CGhJCiIbCh9mQWYtNCv1l5haY iAz2Em2UkemBIUX44Zn1ObfBSb+MShJeLQ/TMk8y8zGgaF50d5wIMosy7GGwJmEHfqVx0sous+yZ 8GLuYTKowYrX+lpgwpxDsGW8LoSORevyKrvhAc+8HzMZYY6FToUvSZbQRZ5QgV0Hybd1IVSeZMAA y6UQxTp0B17cCRyIDbIgZ3GvNqCcYyzB4kkaMhh1tIs0FNT0cSqIsL+W4AZciSNzZZ4En+LbN5Jv n4kjeOZXsEwloOFpm9ju4taRI/wV/oylhtnF/SqCKO1/1NEHrwMVB3eNlWq/oo6S8S6jqRCxzheD f+I441mn//DvQcOSGjn01hIl2fP0wQMZdRheNW/sexI2pUGghIu2tByeUbYcaRfz7UJRAk1wjpC8 a7NhmYn7SI0e/Bd3EIpSN5bhCAGwaZ3TL+YgWIxnhbl5FSZaJkRjo6fWI0SH/RIJCce6INrIr/27 GHqEBq8gMtUss208tnGuANR4fbfcJfEnHOEVGMgIK3Q5o3zGUcclIIYWmUvO16+V9oD+ak2orme9 vGZ+KLCPgTsP8VC1yPdrGP5z8m/+5sGfp8w2TAkr2B1Rq+0MQfIx5TeMTPwy87JiQZlzbexoG0Ej uva3K+RhmUVaWzVl+NFni1ONo1dMYp7JtO3tf+bfiL1KlSocFjYQLOD3AuGAmhHe7a09lPlWx5aj jFOC63GYKgdZ9jiiQmvb0BuSVFtUk+LQ+c/48fdmjGUISutbWzbO6drQMF271SL5Upto/ghtC8Lb P2osUNcSNV4tplBkkzSWNHhLWy6yVq0pTMf9kHjVkNBeDxMK7Xg6rNL2TxCuSASsoY2oxo7aVa/B XSWcBp/rKAh5Mz3fHUvOTS8onwIWa34d4sijWCVApt6iwWB9OEf14HyROaPc+X4XXMATybANuZ4z YYtV6nanAAAgAElEQVQRaOmprSF+wLpJfBEq6Debv+BfFn/8+mcfvtInnT4f4iZd33v82e9ZP/0F w/dxjK5v/zX8i0twf5qwSeftWN+4XBbPmxpmXJL2LoIuNUYqPhlshAeXhXsT60//9k3xaMBxtg7t lwqnDHtZv5zFT2680UIhRg9Z40robv8C+jzJTBpftUMTkomTcL4nDwk32xd1j5/4guH9GW/edZ/F VXCyB47au9X/RWrQ5yFufTrvizf44vRhdJ9tf2/k6eu0fy/82fLx/S6YTYvEp/QuG5+mlfRmx3/S zjNx59nnIeWc9evrsPfLuwydfcDrOx/D9LrWSqEq+PdIh3AE0y9oO6nCqbHCfCo8V4gBWAb9j7Wv xry/Aq1yxNq9xzp4hXhPeS+A8/M4AcQa2uN701GOcmNn2tue1uEl9pjTS/hAoDJu7bquAILfHHiv Fdq33XwFFffZIJE2UKDh0VbB+T7gfC+TPQHl22Dt0JYVmZ+cIboQpFyp2xviuAgTGlCIIihQFjTC 6ObA3r17420X5Tr+eeA62eLe5bYNr/b0qs8edBN0F/eY9F82t7j7PF1l07fh+a1QwiMiB+A/pC7c oH4BLXC6elS37JSWJfF5TMOjG9qdMJ/WofX0gDhy9ebXuAW+5sV1+RVtuNDsd2DWc9hFQGDYwC63 VnjV5yZaD49JZ/cHP4Bus/6lCUcoDRI2s1zrkw+vCVUwofDia4+BNkOj5u8ufJlpVCr0EzVCCpqw pbQkqH/dvblD+PTzz0uA8RS7JdvkRZHUQ8pc/dr8ks5z6sjjIUKOtFxtmjdeC8rlphfcj6FPvJZE 2xM3pXvhTbx1Y31ja/gRfKebKh6fFa7e+riEEQ8O2PRp/cSbK7/u+kwhdn/mvvNb/z5HoUdJiu6H 7TxR1Nc63Ok1fqoxKRX0+zJwMOeclXgBz92/oDI+4X5kG0ApWiBx59tn4p+kje9IL2E8CyYjpKTa dJOHMyZ4wYnFSUKmJsaOsuNdOyMuFuI4sHjvJc113o04wizLgNRxBAawkPNpSrl9z4RqHOXf0tZd dUjDC5VXpQCAaSe8k7aqrZbBBUpIen47leX+eMOlHOIlzspDS19/bYo4ee7cuFE4xiOuUHE2XNN+ IxMu7yk967LyCa5h+3KLWd9d+DblVnwhNEy/7rYWj1/K0oetcMnPmIVJla59XngYNnGVFNuwxC2Y 33pS92n/qDwmjHUpGI84fbvpXnESj3FZh2n/7NYlDb99r7o3HN/Wpf1GN3+2/3pr/2rDrq96L7u7 HuYjaapOnPqo+Pm2f1bcDddyBKxboQ+n/ze2v4Favf112t+0LK+QevS9b//0nb7+Z9vfuik342nj zHiEfl4ZXeDPunnJnQ7PJwvOH5lf3DlWTV1jt0LmwNw/LoMat3f56173kzMfzaN6KeESa9rubrir IXFR4JzV3t1FECQ0xBNqJ6QtDH7XrkZb5HwX+kUv/pMfOF6p1cMcqpOCux09lBEt3O588Xmpcbpo 3mpWn5/ap4TserAbf+Gbj7LUzDMWohdnVP5Uz3yA8Fa1S3c4spNhPLodQKBo7Orqb3xnWGPxi4qm /trDyI6J30Lcxi/qBkb6XWDYX+MIlzsU2eUIruqPggu+BMeVj25NOFGNVCgjZCfCeNwNsS+osmmc UYkUT3VOYXbXI6qX2RnJjom4atVIiLiLtNR2WWbzKl7A3Q13NUw3+YubONn9EKcH1TQFmaQefsJO ksTHF59+VmqZqmCqnqla5hMIWndDZkH1zP/+P/0vylmmMAxSiP1Z/G/6NlzPCM7i9/E6/znXFsE/ i/hz+PYoRebs2eT6upj1+6bvvozvwjV+j6xkXXkX3s/S3XXKurcOzHOf775t/v+0j3G8r/2zflqu Po13lbPWSDzN47vANIXZfPbluSysdIrHaCJ8ECdxqbkwK+iYjeOy+HVLuWbrtc9fGesk2+8r12x6 /Xfy2cfZ+/t+Wf56nPf5v8+vj2P23XDva/8+3tTT+8owG3//bVxC4uzj0S3u4sTP+ZqPaqMbtL/C hQPW7fInjHRbaBoFEFn7y6gz8UgXRjBRfZN16TlHB0sgwXhG+lz2ohZYX3fZKBMnV4+aj/WPb/u4 ACWYwEXBhKBwIkIKr+fuQYHF4cOHZdTy19AYUDDx4snT0ugTLwIJhRH9VeWxJyGOV5ULJZioN6qE 9VHDzmq4K4zI9xEM9GOPPQPS1Ges488fPirbEt/+nd8u912MMQYecATx1ub1IYIJ7S0sQ0MJdR0o 4023XiiRsHHzOMcpTHsEGRFq+NTv5Ic/rCA3/6P/GLqDukdI4DEGjVgqiBBchxUObHLcQvqqtCtx 166Dt2kIvgt+uwkgBM9vNzIUBOjW+0cwcOs3fr0EE3v3v66wW+St4mhpK4g4bdoN0lIRmBQSf3L8 pc9j0gmOeejB/DyDzhJ+83d+p2iHuw/vD3dujf1KQ5aCwohoUfR0Te+mYEI4pKwKIQLanvD6zzPo It+1N3ETu14auVQw8eTBw0L93V/79WEN3uYe9S54xFBQE+t/+Ef/Zb33f9xwW5Sw3iNCr1jsGd8T CHctC5do0Eg6RtsBKXMh1IAigZ4JKY/2R9wwJzr5nQk+RmWOjlB/ZhJw8ndAh+l3wsjg10+I22yc /Xcml+lMZoUcJx2nqCzyNYDosNN9zfhJxNXZVdI2HifPqKgYTal1G0fLj24h+8RP2rqbluqmpapK fOZd6MMqZLDsnm1zIpSNuxAH/mFw+wWsIsqf1hZ+9nlOnfXxBcdnBBdK4/u6ykSd/IobtwPySANO ZbD9+7Diphx9+HJvf1L+YpwtH4ISy2g+F1tZkufE4be/muTfk0bFgb8Li8KvxDMGGSXdffv7fqH9 2TV9b/uDL6QMvtv+jobkUTehb/8jypmy9GFxrPY/el/7Uw7D+DOOxDOmcvGveUif/TvR/kxYB8/o T+S72q5r/xotlreVveq0lT/t+q66KIERLYAI7q35J3PXFqrvwoPHj8qQFQrw1RYSDRIJpZKJkNO5 TwGI7ZyxHiEpFhZLS0BNAZlXVTID/fVdOx3zHuvZLvsKJFTFxBDB+IsgI5G4ELBDLlGh0aoyMsSi r6FEDT4GLvtegIB5/fzFxV0QAzRBhWdLVdVcxkKzS4jERQiNFxBhEiDCHjv1qvrtqsr5dHciOvRb uGkdonmAPZweNNAYY0+exgwxIY5CCUGBg6DqZQgMd0JCaOhnuJfsDGS3JMRKcPp4xdf9ryjXZ1s3 hq8R6btD4kLfg4SJ8Bss0qpFvvzxV/V9l78KW9zhceGX0FCI4M5IEQIs9u5YCAo2QhzUjkYr0y6E UnZEJCgkfATfJUDWaTfdNKLF9U+4UV52GO628L3wyXAKntA3KcLnnHlSodAWxym91iw7G+O+hNgN iF81z+xI2C97qHDguK4pjDiHKFIw8+jRuPsxkhNjiKh0Xp9fGr744osS+ikkdM0Ssn65/spMOp8F XOcdp87ZsWjvHGZYw/muv2NV0E3IeFN46BwWmqD8wAlewjsHmEboChlp45CeMV+hIUIjZO4w3ghG jasAfMuQslRe6EN0wQtzb+iaPA0bIfcUF24pn2n7bt6ExG8Zq+6sA/ydBxNeDSvXSHceF3GvOa3l Tby0Qco1rY0moD8PicCxpca89DjmPe3Q15Hpmz83RMTPxpDRCtlwUnhe7W2e+SXuCH9dVysu4vhZ tn/a0fauOmt1nLrty2b+39f++tmfUje2v2Ad23ZZb/TXzefK6dh/32p//K2fCLZsr1z9aZwKzZ9i c8fxtIYx3NTrk0fjCLQs9k9pQ9NN+5unfgxe1v7pG6EBTM+ypY38ThmDq5tx9e2ftKq/4l+bJdRz NizsP4Y3XPq08Qg/q/FvnQixB5F6Md+W0SvEXa/9Tv+rAP6hSRQkVbsRj0eUrHfxUlafuts+2pcY YX+4xkZqIGNCBk5wjt2CuTWuskcURJ65pegj3rUdEdhAm+05Rx03X2JPorlnc+ExjLv0g1eECtnw 8H2V9eIl60YEFPVEEBFQYCHE4KVriLTGOer02ptQSNGDNMIFaGn2Agn91Z44JrzXhap6LK0wC5/s 3BgWWde1NSFssm5cBgol1B5Ax6NE+xFKSAcIbqoszQge+ngilNAtNEBoAt2MpwxnwjQrlBAeY78P fcW6DtRvBQ0vWlln1139pQVctyOgyHovXRA/69XNiQglslE0x9znOivjn82JCCSkA6RJQhOYljCm haFO3qM9ES2OpF2I/DG9Hp7wPYsTg5fBCw1qX92lf/XftuRbdEKjEw2vUGIW1tBuHUU2o88VxswO mz1uYvwE7d7LwPVIgYQwa3Oix190EEmA03pv3Bm8NdlBJ5RwAp9+IhQxE1w0DnTLZO274PcshInN BG9lOCkIujnRmXYWCNN/4fWjbeJLupU/wlyWRkXGH+OYBeMJZOHO5BX1O/NQ+TMfSjcDfrf3+Pd5 1yv5rpITj4pe4ibfILQYGBht4S/GvNVBn2fD+Z2fE78Md+8+ReZLi1uCs/JXTmN6xiHDqpAkUIRb SyNuPpMHn308cRdHd39VLvOo408BqS9RXeQ8z26bJC3LGIGCcZtGVBjdPZryQ/i3e1dzI4zQ57cc +POh/f8db3/aXE2l6g+t/e0zU//ATch3fcz8SR+5bCdLoUQfVg0xdzs0JiiB5fy0CcEyamKMwokV iBxB4W0ImSQZDbNzVPrsdRqxUjgRK9l59oQF3G6lU9oSLFxIxioPidOnhIewDqGjXQlBoYR2VLL4 KQwJ9EIK3cR5i+BwoYGY8I5yQWNWQhEgHG0LuBsyC6ccxThDQJHeo7XtIniapsXI6s+Gevvb86yq V3pVmIauJBpyN7nYEhzHqmzCqGs0SjDMnHXAroAETIiXECSFdMmfWaGEAgEXfO8A19r1E61RQuRJ ZKi9oOql/vO8Vx2z2M/ukkTvL0SAQgmFESE6SkDTBC7JkgSHux2CBJBpCGpLeF71LvmKymh5tD+m Ib5inCJ82InYpg4khmeJiD4ck3Lh6Ba8CDF0y5VgrnfeT6865jeBZ0Udh2FiXCMLGDO+T984hsDP OCvjjQjYvB0lYDzFHLTxHPc8nQOyxvsUt0hcnq4RaoEJYUoY1LU2JE61pkJryOAVgAPSuG4YH78e DJs0a13juzQVDQeUUIF31ydB/F7jz7Ul9aOf6Vtnzkd++yvmjbDF4LUy6i5kbTJt3WRiTT9hza91 y9maWuvzLW0mpN6Th6QfYUjhEIfhxCmhDGNhFkw/P/1ktiawjKzb4/zYRgPxWa4IJMS13Cl72t/5 cwLiqfro2r/KBoICD+1npS2m9jcNyw9E+zXtHyFU1R19zbT69rfvhIjO+mA9mFbc0w7Gb91UGcmn 7dLntfqmOOYHvNDGb7U/4WRKqg3Jt3m3jqLFF01h8xyhhHFVGYi7b//qN7jVk/Z3c9r8+z31G95t G+vC8hYdRfoKmKpsvPs0nOMleU/9Wm4hbV9xt77Vl018cQT7UdWjcTZIP/xZjX+TmW3/pF39oa3X vWDEPFkvQupg7MNjSP39bpv+4y6ygglo5gX5I0DtSt/Tbs7DCh1qfPA+K5Rw7tXNzV/xhGsII7wy co0b/BRKYNq6jsx5gEihhN8KIxAXj8c5cJc+8RfQBp5mA0MjZMMiGhTakXLG091fGcEkf65ppTnR tPzq6Ibxsrajulm0AWYLa5Ot0iIdGjrJTnRCjWtdzWfT+PPzhpqKbe1bME5AOiHMtcLdbFYolAi4 jmdN1y3reu+me458cB5xwlcYEfw+rO6hVdSiVMtStzpCSR4VDkjnRGPCdTwCCOPJhkK//pc7a6b0 gqCfddqv3RFwlFYpR1MCiqNCI/UbJXmXRhCKZqHevVUjNAOL+Lj+4x+hiJsnPYQe0c2NkX3aGKtj dBIEn9Abalq+qXGE6GxuCNIFCin8jvZEebQ/0ZbwqXBCWsF3tSMURCic6MENDOEcukpQe0L7EtqV EBRKeIxD0Djmu2DRweO1Nw49J5hMKnKaTkD+enBQx63e3xO54cTNBOW374KLQ10B1S16xhdw4iuh B52pwhCu1KtAyMIb3P6ZOBw8fVo9ju+mXxM07zURt7StVgmZyrdu5tef7/wMZ7z5GZfh454JW3dB d3/GYcmTJ/2C27slHv17SM0EN88Jp8Wfb/2DY5xRm0s8wZuty8ornglbT+KiEAly4Rm8C46WuXMQ p75n4iiCyriBKd0WrtqEejVs1IZL4IJ/FuKGevHR0jBc8pa4e0TdPrT/22MpdZW6q6dtNNN2qcvg 5bue4P5bt3/rD7a/4zDEpfHO5u1Cmu0jOLPzTnD1z68IRBbx9DWo4WGJNDeZTJ0XvRZMkLAUQshI XPZEtsIKjVYdOFHzvGAtm3ASGj1hYZkkoBbbGb6KvP0JsdG79e/aTsji17v372pP1FnRxgArjIiW hHjLuOcqsNljHtGScNGOgMIFXvm3T1U0A2W3gbier46LUdx9zmo29AREiBOPcPTQEygKJda45UgL 3FR2oeVoSh9m9j1EioRGiI4exwXfpVRVTo9oKJyIYa5a7Fnwb7ObY/vLtAvZnXDxlxCx/uNmGq8R pmQX5HoT1Iwhx10Q/QwTQUkEIzm+8U3taVwhPFTRHEUcSeHNU2JEokQCo4hi0hT8LiCvswa6csxD YmOWyDDMPFo0qmpq4chz5oLjxzHj2PeXMZe5wG/fXYOFYox57zXTyoM/wTUfpVmoB+GzSTB+vhmz fu926co8lRafHrgbNnNG0k/+iqDGv/BAn74r6FiWaJsVSWkZjLMDw6TMzk8KSJKe7hH+m2bSN7hr jd/e9y5efuIlf1MdNLfMYUlvbE2ybx6IM2H1DxSuHzPpSxdVecHNbR3J94hOmxGv4YxXpm4qK7M5 Oa48i5v5UtrBPIbm8l1I2VL+v+n2T/zmc7b9TbMYUp5pO/Gsuyo/72Sw8jl9d3lO+xcCeInDb8tt mKpj4lmg/U9gdlOPul/W/tEsMewu+E/A68vgWmDdJT+Jf7b9zUNpZpoH3n/a9g9rWfGSTtpfTUTd BOOabf9pnOEvVnCtBz6mujGsEP+Kq5VH959F+5t++IHUv2kJqUvrU6gn76lf3dIfLuu7KY94vdDP TQhpAd00Xqlgwlu24i6+m7xqW0orqLEjqEkhiOvPa0Ln0LgzLmmHx/wWEcQrxJC2OID+EEIz9NeF lgd/pBMiiHDDQhsTBawP2cg4bar0A8YvR0H7aJ+gDMeBnOMcvVBijIS/re6m75mXun3DfgBIJ9gD okGh34HalYBXhZZGIe9Z93WPhqWm3Xpw/ZZWUAjR409CCZBDS/gU3LgQjEpKzTh6fIUSCieEOjoC ljdeRPhQHu1PfzVnrzmpMMLvCCXip1AifkYRusB3byERz2OeGtgUZmmS/rtoiVbvCipCFyTNebQ7 xamNDeKVJjC9ni4xDQUNwvnXHNmUXvt8PO55wa5EYYx/IpSIk7RDNIHi1j89+sukN2zfutk7T/SD diS8IlTw+RxtHo9yCBFKxNZEOV7yB4P1qAqePq3BHP9ZZtWrSz7AL0cNeKd9FhhLnHdVSSVa4hb3 cnjPH/H8ZRHJomUQF4osDIkvz0RZYUnXcFkQ9dN98vO7uYnnL4RthTEAULnHL2GTvvg9ARKCoA9j PIbrQaLIOjH8rF+Fbe5JT9weasFs5ejdE5fxTsB7lQn8vkyTPy89ftKMm0S/+fVbwk2oHTMFi+ah C5/0xcn7z7v9zWvawTxb5hBw5ksIoaF/8jn6dPnGzz5mXEJwxXfnQ0JAYWyED74XU9cEpiEyxAvU DgkfEh+6O4dKbAgacAxgvhZC8nwyXhV3y1EA46ihqBAg8ddolTDfDCvF3ec9ri6+hm0KhQ+Xge5F hFC2C9Ck1J4bfbL6bNiBmfY6TS1uDw9YaJInAkUgYfgYtQrR4U7IfiM66j5vyqDxzssgBIZ+ESpI bJyujHkr69kQVCFGJnxwdMv1Xwop/NYad9yMMwRJCJgQMw/B3cgCTlzubEhwZFfC3Hqc40m7iqvi aky8i7xWriUK+oXfM5yxJyG+oL+qnEUw0I6zEGGFuyJji44Yya/HSDzG0RMzYoQQ2SL+HsTzHvKz rVH40Pv5niMkvue4Rt+uCiW00H2GsEH3XPuVXZEYsjJ8QINWTDzDNnXoGHT8BGrMMY6cO2fd+/Ho OK25MgF59v7TXK1/G8uZrzI36dWHSV56N0c4BrNEvQDmzTlA3Gn8g+GcNs3ovAvRNuzjLQ/8a77m wzj8ZX4Krm7mX4ib73WMgTFymQHLCtPwFcAbOmF95p2XqW50yxpgnvpv37PWmraQNda09PcXuOB2 Sd4pKen6fyyzcUWg35c/5Ugd9Wn8rbS/ZWnlNG9/m+2/gBFdheA5WpK692neUo9xT91daCvLAm7c fh7tb1r2R9P1aV7zq7zin/zoHohbvv+m27/Sannp0/Jd8Nnnp++z8c9Tv9AGurk2T/0b2ii8kM8j 7UK45Q649odOCO2ge+iF3m0ew81qSoxXhY9MfLR0DCNgC5/ERxpjmw0R6YgIJDz6mWMdcavjGtIk TWgfYYRxqSWxhsZR0UvQEB7fKME4x0En6DYYyg1m8sW0gdHWc9wmoF568BjAOrdtFJBe6ANvtXID 4zVHlPa5qMDbPq4zR8mgh4vMOm3YrP0Vj+GaUKLKRZr61zpvOVmDl5rtjWhT9AKIxOdzXGNHHYXY rEpaCkW8bS/0QIWjjrh1oegCv70G1fVdoYq0ghsaguUoWgK/rNuxFVWCPdaf0A0VoP3JnNynqZBB UOMygpoN6beWVjZXFEToJh0jHeG7aYzCprGNIsQIjaC2hEIJNyXUltD+lDYmAgojei3KvB9C9/Qb G+oY+e2Vq4EbtMsGt3zZB7RP5W0d2dR42rRJxC3aoQU6R5tGocQ3CSSSxuKDe3eLQdFhVKFjUDAI HbAT4xLsD89f+BrQqE+0Z3LuMcTGVHjm/wUmDKW97hxHRS6qh6WO2C1UqhfmPOAOd+GO/UyCVtX4 q6WyKBHhAi4YZ5g+v1UB7gUHC+BG1dK8ZefGxfomTJuaOMaRfBi2ymC+ucYsRiGTXhhN04oxVhcW 8xCQARVP98Trgh0I4yoBIsj0mqa/uiub+gqUxB0GWPAIwa/cvHkhz7qH8PC9gDKYXtIxL1oYL2jZ kKkWUtc6W/ZiCkgnC/btdlYy6q9bGHdK2MuMmsYIbEVOfNpZcdGzDYzDHQshDHfmj3Lkj9/Wg+m7 e+LcYhjd3HVU1dc2ND7BON2DV9XUc7ul9uwuRStfIbU/XsPmlV8yGdbZNv1LgqHXaBA1fdQ07LdC pMJ5qnK5jtrZCyS8dZaytaW4fb3rJ+Fwk/ws8tvnNh5j9MxoQDdVaRcakaG7mhMSFpbduirbEglw yTNnRfXqd0cmoURTl6ygEhpM/F58KohTxztwm8A0FUQBHue48+SNqiGNUcyqdibelGIMGaJj/CLu 1k7TTjxMVxEbLGqlUUA6PUgk5LyoxMHC/TEPGsXU+KXChjq+QR7CtBte4kNCxTBlzKoRYRPxAo74 ITj6NH13AVeNtIC4XNiFp+ywHNDHtklPgiE7OvqtS1j4AoTw8LnbtA4kAOJeRq/E4wiI0BMdfkdN c3ZXxLo6Iy/ZRRH3fWB6EiKCKqLWu4SEGhJC/HsDWIWDX3B92s9V6ywgDxIVgha3het8LxDlfSog wgrdNXDljSNC5hCfPcgI6OaYnoWcve/dq48RJgyEt2vYFsbhz7Gsn/OXu9D6GcZUg2N8EoNZG8RX sGBYcQJhTJKW86hx+e2zD2+YxD/h6whuD8Hp3Qg4CToM2+fBOaz/rrTBcW5O+ilzpaQ7ZTNMxWUW WmLipYz613eLJ36z7SCzZWv3u+JG1+cp76ZnPO8EqtY5t4di8LgRbDZdcT60P9ry9OEwwNaVkHp2 7Us76vfvQvubt3eBeU1fCU71Udx/Xu2fdM2HaXrMtzSuyHcx5LgH7PtFO3Rzk/nNvJB2CX4JIYyz r4NOKCFelVOcGZpE2g6dxKId+5lQekC6RPCop7XranSNq6WfIaDOtaHO0dqb8KrH0FWGUTARt6Kz 2mbxXjOaGNpL3JoTu/Ebw5cxhikOkdcjf8p2FfTEk/nz6erI56RxfNTRD0H2Cb2R6yjrKEhzO+f6 a0GhhNqYW1fHY3RPMXz5lHWyFyS4dlsH52jkCdqEEMTxqKegUGJRQTpwCr1wcu9+fffhyrP9Ob83 bnosEZfafosI4mPDqm7pwL1W648+GjYJI9O/3zZWnrR0iuFvMhy1G9UMXZSppp0UUuh2jJtrahnR hLY4+969KRvSHcbrGr3X1tuvXmIJ6unepAVRdBL+s/BcOoP4rZvUVdLXmGbys4+/dIe3fgjiZK1P nH5rZ+KQctlWhvdb2GsbV7s8Y4vCTQ9hk6OsdHBudxmPPnkt7F+29/Ln+xX98dE+ddH60QI82hn8 28LNjyqOCCU2W3r30bZ8RH6TbsXT/CrAzJ9FB20YsJMmxnOxlCnoz9/NhPvw+QtaA7a7Z+pl0HOb gZOvE64TthADTmHoY8SymLfaaWaiIY4w8aFhXAzGvsaO3+r8sHVuPxsJIBeHxFeqj409KDf7I4Rd n4fKCGHMk324ZzgNMy4QEFCEM/+naAm4iN1ebzfBYHBPSJq+m3/LXPmGITpj9SimnvjFS3lqMWqT WRhWwwtFgCg0cHIlPRe3Fa5m9VtNBRlziT7jsi6sZyH5MD3zXED4niA2rdp5YQIx/ApClvjXQjmG qr/T4mweSM/6NX2FEqYfNUPTm4hQcJwC3hr/4AghRoy7zlY3JtfvCBJS734r4DLdhLP9k9YZ74aL MMK66sNO5cJdSN+rj/bHdpBA1g7NClf6KnDwDGjqUrTMbap7mw8NXkoMeL5TQUQMVfkuvETlL9ZQ /vQAACAASURBVDdyuGxIKMTPePXzm9OFw6GCKwiOgMRH4DVXJXltpqA1bbUiFEqEkAjee5+0d3ZC Yugq+LM2JUpTgjEzHeHohRYGUkBB+oJHOYQXLCbHGNakUep79s+sQEL//iiHC69aE8rSnzQrz6cc jbjV4svCarjscEhoxN27xj3OMfl14dqejUFLOKHgQlAIUeERUsx9/NEk8NAvQgrfBQUFPQEQNU2F EkJ2MXxXaBHm3+8eSlWzcxBP7QQ1KBRqSByY9vWWf1Gzy2Ie6kc/Ks2JRkhINAjmoRd2lCN/3Jkx 7zm/GmFI8qhQIm6GmdWWiDrnqBQ8xlo7fBJLEhlYg8+95PbxXhAxYo9/Y3Xbr4zjPAuDcezscMGN b8d53JzP3hq/M3OKc0PA9/5bYUPms5rHQdTf+MPUG1Y35y7dk3bi9HmpWxAIF5zL8Pr8JMjs09Fv 2FncEsS3PFUqLa1Kr0VimISrWST4uhtvh1fhOv/6bv7x6z7H9ZF4HP01AxC2h7685sG2c90qhk3U 1jTB43LoKXjlDn9xe5s+H9p/rCLrs44MshZU36AyU3/Wca171J14YYSrdrv2/bm3P3mZWti+wreQ 9h9LNv4tH/HF6+Dn0f4mF7pHbaPQMj3N0WWpXmfzOTsvVT9u66RlENIu9dH+FA3YO7R3rw8dKYnm gEDDDQtpA+kHaTjtUAkKKIr+gIzw3WOgPTjnCbFT1fv5HiPas+5FVzGne1XoxxxLzG56GcOEFlGQ EIbSsDGoPQkYpBWgETzuqWalELtU9RFtixkaQ6GEQsi9+w9YfBFI7uyUjQkNPWfNNby2NNSkEE4V SiBwYOeovv3jWlpufuA+4bRv1/8SXBiuuY0vF/+aximCiTnWu9rMuOhdXwolQo8onnfNlcmPBoG2 qBQ09FD12TZndHet96Y16bwIJXz2/UCNiIccsbhFxZhGoOiT1s7mw7JHa+K88QFJP3mSdpiOdBBR hBKJ02eEEiVkaB4KIObYBJRuKCEFd5pzf8ZkUDvbVIYtypV6UyjxFpBHjzBKR2x3fdZ+pCAiwods aOxDC/eaFG/Fd4kDx8zGnUsHbAatk2SpOXZul4T94PQLWAPutjsR2y8yaReBQlnTPxQEyOTI6E6E DIPoqF3TGvwsGn016eakLhNaRCXf/UISAjRhkqYEED10yoPS5LjJWBmnu+Se4dQv4bK45PiCC4Pa DLu7HGcg/wVZU8f1t8pu+BoHjgV+ic93y57FqspKePMmBDf4akscLXK2GImhbpbP84nu4BehiNaD zHXqrCLhT6VPCdXwCKxQxwcwaLEqLXPPx0gQkvzCCrtnTJjJW+rfuKfz3bwrlPBOeuvG/Io3S+Bf Nv5TJsNoKT6aFBIElRf6jjjBS/q5Us+nYWKV13ZKWyVM2ivfKXueVf/54CmeYVaQglifffuLm8U9 7S8TJjHglcLRqijjv4RVDVOIdkXdzkGfUrgRQZL9p3Ye3eVQ2MACbBmEFdTy9S+1zHJBu4DVbgU8 r+h85c43OOuczZPYOGvMfHZCWpB6VL4fPJiID/FzJ3mIioV25EOCQ3jOPeVC7649hUCIC/cnJDrW kXBj7pEtcyTqMqtCiA7fx40K3wpqN6SNGXdEAhIACieKoOD5ECm6xio1cinE3XcXXwmT49toCSEc rKvBOF9btz+0MOLnuIdhBONKPFnATxgLJxA9NFilL965qysEyz7FcsF+KtGgEJFdgyICSNtzr9fa +Uh3lyQsUtQs/sal0EUwnux8FOHBzoP7FOJKcD2lvNu867ZJ/e1BsFUeTTfvlMk8FC67Ncaj0MFf dkJMS5DwOZfIQS2yzpPiJv4mRM05fekpIhF3OgISHBZ7Ts0NBA6xiL7Dzlu5gyuBISFRhIZXwHId bG7c8Oqwe4YFsltSvYE8axNB8Nyz48mfY+5941McNaFyLfHBM+LG7ZsgcfbpJEzOxfutv2M++LrV HGAdA84xvV858id5x7Nm6+DEvf9Obp3VL+SnhdVtFsoF9/IDLxDBjJofGtNOSNNzjrwQP4F07/OS eJJm719+LU/Bm/U3jZMuv/onroTxGTfxbT/BmnKdFfTP2jKtV60wfX7F+9D+b9rfzQrXmqoj6iv1 mbXP+krdW6/Wf1+fVfmt/n3XL/7l9zfd/l3/qP5fibwZB8lDOXf9yu+U5W+9/Stzb/8xf6m/1GHq 3noXnEv6fl4aF7mlS3t81E9gVkCRoxzlj1DCb4USuW0j4Xza/nPQA684whE6RXrigN3tWxwzdDPC GzhiOFt6Y+H26rDRbFD0cU3vrsX8Ahry3mON2mRN0T3fz4nb9d98TccsWUvvgONtXWV7CppF8Pjn SGGwScAtXNvUj9eKaxC7jF16tXhbUyrA9ha78AjvEa4HlllLd6BhBAX0MWzt90PLzJoaUJNSGkX7 UudHMNPYalBjMqD/VnfNeI535lryZTaeNKrtEQ7fA7mdw+8tlmaPJGyxJmuEOvae9POGqtIs4z1C HeuuNPo4Vrr95RfDR1egsymjcLgF9fAlS6rHJBHoeBRU/2jI6P4cGm2H9nMjMhsipuG7N3NFe7LS aP3QtN34UOuzaJdmlFsc7WMFzEc0IZMn/bxGXKH+/Rd7lbf++9PPP5+uGRdHOKbfSRP47fHKn1Bm aZyr1PXn0LWC/rcpz33qzY2NW91tc24y30EI53ENj22sr72hPj8+g3ohbIxgrrU0K9JL/tSykoEa /9nvuH94/nLUgIvjRHjMFDmLqs4XJvQ2mHr0LFK6yRjWQsCcvrIBk8XEkYXZhSBxldAD/DMY7omC MwJ7qk5tYdGpiKa2MCpQcWGZ/E0HTQUFA73aqVJr8eoYCX6m7UJjXlK25NvFwt34KTxxBvr6MR+C 4bKg9e/lZwH4P2mbNAFDdk8qAqIxLuvpAqFtfvl5o0TyljaqOm1pG4cCH8vSQ3DKzfpK/K3ueqGE OOJfCNNFZjNM0IcnzCwkr7rLWLirIZZHAdJeptO3v2EupG28uOkuxD84flvn1aYwUfEXt9qvhfPb MLVr3PrAGsKsUaNivH1DHKEIEfxy5KMcCdODux4KKMzVnPGxuCiUcOcjZEF2QEJYGP41eAoZcqxD N9tLocWVbrIWJzsivmtvwmleoUQveDB87Xj40iCCCm1RCAoddpqfOyCKL3aan1d/fR2hRMO58HBX pBdW4Bk1TQmYOkPaFieZ7o84u3jfcePCxVNwxyNqmlHRVHiQ2zgkUmTkg1OB8J+ABbCHUXAxLpS9 e723cC7qXqlpnZWQgKcChoG+p/vyx7eK+IhGQi+QMB4FDhIDFYZv/Q2jZkWOgtiP/YlX0FkaH7Y3 S5CgkMK81AlN8Hb4bTUDmbEloXpmCCDjSXxRB3UHQyKvdnQgbhRKmB/dS1ACsSOUWiZtlbbObkl2 MMpSOH3J87MMugojccHgKcKy3H0X8L9GgodNRXN0HMdQ3vunY6sfk5nbe5y8O1YFx6q/S6HFN8Xb 8kuAQq84wFHYKSHlHCLonnyUQ/fHtC7z7/HFSVwGLe0x3FKe4Ob5zjKYT/InKOis+brt6hpGojRx FFL3J+6mnfJaan/9LCtecMtffHE6d78ts2VyntevymgexO3yobuQp++JS7e492ufOEJfr0aT+hp9 L/4VV+jjvIjBV8tr0rc/FrQ8Vhzg/F1of4+ips4ss+uV9I1lq0YYq33EaeW2rH9b7T9W9Pg39d+3 VeW7R+I9eDqL+3Np/5aW6WXM2i9m6RnzJFjvuZWLTNZ40r3Pu/EkLv2k1wQ3Jry58LK4Z4UT4ksL sKiDfzKoPelmiHG4i+7myNNjhIVqVbbNkJ6eyMaGtqY0D73B/F43eEFblGFt5v1AMaysBcK0brRv 3RS41/rTwuw2DcdrXina4YkbLYYLBrFlMj/CuDNrvUYPow0p/iSU8ENowokcF3C9ErLOaXNJqKdr GOV6wDUoJ9L6QAQLvp9wi8N4ZPMltqW+rCOfalfqPvq/occMJ3j9uMKIGNXW6GUvjCik9sd0t5iG ZoUSwYmAQO2CK1yBGcHFQxAUCkQAoEBAzUnxr/Aufem7a7Ot5LdHKbaMmPJqCFO7UoJ4uS68HGb+ xMbEAM0mrnNg8jGDWvlR8KAtCfNk/nwPLRB8BQ4B/YXbje7MRkWPo/+tjc2yR+XRT+1SCa65szaw zqCJkUhfuAb08PhNetJiC2jJ/jTAxuibxe1CACdNBu8H+CWtAcf/TPNnUS2NB1WrwaH3XKggcYT0 q3y7WySsbW+UaqMWn4XE6buL90hw6KHLCMExzoDvCh2EhCs3Bm+lCWqusi0hx5uApV2hRH8SgnTx Bi35Nh8KJ0zDfy5nET4E12/jUsARAkQ/3/UbF8tRaFLuMLK9sCN1mPK5MCacbnE3bOrChd+8TPls 6U0Ej8gNqk7bu3k0r4azNvu4g19P8EC64NSnVeHM2wWMMX86Jd99GN09yqIwIOlKfAVHtz6v4s/m odzaH8P5u7T9wckxERmDpBd1yjJIRz4kINT0GWBwLgOJCOGwE0zo5s5GBA9IQIbI82frw7AP79/z UYKHOx/driMdalD00AslFKj0Qol6fzguIkPTjujDRoNCN4UWEUx4RlSQhX/OYqUwYkNNAYRXakl8 919/r/zrjwwt5Xi8xCEVDFcJakikVuZgys/RNBA2ODe6i9T8vDEYz5C0l8ABtwf4e9WnwgBBIUIE Dm+pZBbG+MdzpCVAAL/wej/OhRrPNvkL8aU3fJ7Sp8mOxAVmfYXdBsq/P0N8bd/5GFVartCi/M/I YzQSJCQS3rg3GiGnm6D2xMEPfjT8JYSGsMMugte+jbA05v3uw2GfcFVnxL1HWPOrgCjxmL7gmdte I0OBSQ/JS2k9QMSJbx5D9NXuE4RqwZOxnVXLLOJQR3axci2obnv8trDO/jn2bDRyqZbEj/7834zH OkBXKHGj7cSVlgT5v+l5UYgSQRXNaB2VwyV/zqtBLvH44PQLXwNz3fx5VIzGG40q5/BaA9uckMrI GpHv/tlmu8nprXVh8lFoOAruO6fp1fXBtdJR/E3910BZg7JeTBG94+WyMvRhXUFlZk07ZZgNs3g0 rrN9OJM7gWbq6YnZOumzNBtn70eh3mwM4SGulvJz21lwk79898/3xt8j8v5WPD/j9jdvb6VJPkIf lB99YNocM7+ECW0hXg/iV5zg6BN/3QK6ncP4HtFGK7innTzKIay0o6HSWgolvLmjNDORA++iKTjl dwFVT4QXo14ajGybQz36GRpAbQUFEmWTCiEX0mK2t98w5pWgghCOZb7AwKX0QI5nTLamCgkUtW7b MWSd/F5Ae8KrxesYaMOrBzSDoFBiHvpgmXVGxlw7VB7z9AavF6yxuclrj+vEZYR3NY79lCvQCfP8 4SOjwPYAwnAY+Bh5LEf+7JHXbGAcUwse1QxIRwgKHITYilBg8RI8nwHDvaQSR2HGGGdve6qP1zDi /RVl+GzrxvA14pvcmJX4fEojCL9x6/agoeqXP/6qvu/yt453slng0co6GkFeX7FpUUctEfbfXRlH qxsf0/FLN4BamTR4meOXHvWMIcwc+1ynXXTzGAw7GZMA424L329kmCnpjEM0Kr2165wNOjchNHDp Jkxoj+eV++4P8WsQ++vWztHwCEaFA0chhNoQ59B5apM8enQ83KS/2RcCEWrUdaHE5/XiwinCN+Em Zcj1oD+NAUxotIPJaEzFkD8zgzXOH56/JDXQzdWZkDNBZwfobbaUumHu1r3CvJnHaxFM+LLD4KRv HwOn144wnO6zzL8Tf/xsgQrb8pj89dLuEhLAgPm8AMS9wqByx944Kx1QkmYvxNA/C45p+JNpFKaw LfJZoUTypPe0CLV3mfEp3lZX4sNmk5ExQv2zQMZgpG4lzSe/tWQ0XOvQOq86GYNf+NvnxTgikEn8 hnsrLG6BhA+O3/ULQv/Uj++E6b18t+zuHOjfxzf7PvudeBJv/HVPXmbbX7/YrfBdUJXujF0Kj3LI snslqMSE1rZzZEM83xViKJBQeFE7Jrj35wbFCyiocNfDWivjVrw/hUZJf1EjYkNmlok+ELd856mG RKCOb6BxoJXtHOWos6INJxoUEUbkGS2KCC1yPeg+/V7QyNUseARgbqRFSigRfwUUCiW8k9xjEHss OvMchcoOSwiLwmfhyrGLScDgjgbuCijsGxM03Hwbj2dCCxp+/Cou6u8aC7YCBxfiCD/m0ECIgCH4 WYw996mBqiz8EhTBddFXOBCtiITNM8IBtRJQkxiPYbR6v1BmAtQ3gojsToVw8IyqYDq+x86FbuKo cTErFKn0RGjgt/0uQgmfEh4aqyrtCfpW1GQrCEKJnA2NASsFFUwozHvPS4h2yHv8PCeq2Ni7yYX0 nfr48OdDDfw1a6DmZ+b7HjJ/u2ExyyD3eO96N3zWgstwEr9+/fo7ixu8Pq5soszi9t9qamhs0XC+ v7MM5DPrrBspfV28NxyJvTPOPiO8W4b31ePseuw6+b46mYn+r/3ZlzmRpd7fl+/gXvY0fN9mPY5+ iV/3lLXHD07wfPb5LO0i5kjrzt3qbKCII26t6wgm1KKY6Cn68hzflQ7rTo6GKpR43naqFU6YnxJc GP4SuEJ/Ki1LGEGFaqUtwXrHedyyVdUHyfXi69ApsUfl/L2GEe9JiM86EeiFErqJo1DiAsiosubk eOedxriW4ezdN8KA/vauhPd4xxkCitBJ0gymsdG0BEdWP9jvfmqLSjrCDY8ltFfVfIiGpaE82lEG s2HUcyxktF9FWaE3ljnGGNtVs0KJ2VRnhRKx36Amo2u2V4oPaDlIO3gDxy7HHqUh5tvRCjVjehtV Cipy0KIXSiiM2CLfQglomsAl+VEosdmulpU2CJ2iVscNhB536QvR8EwYn6YhvmKcSpsNhm3qwA20 WWFDH04NjGy8BS90k3jZ2FCDQi1bNzS+CSKQEE8hxVPyto0AJ9eEflP4+C86+Tno3gX9YH4Xzgf3 X9wayGSdCTwMdUqse4QIkx+zue7+XARl2vMd4419v/KdqT9RymVPBqKCN/ssJp4QSTv5iDaHefGX cIlcJjPHOcxb4ZCg8U3vrUwJb9yXgf4FPEZ2nHLLmjb05KkIksU3jDiVUfk2vPiGTf0kLcvlu2Fj 1TzpqW2RuOOWcGPyFxdt/aZ6IM2oHsZtCntJIcWReJAIC0zhdCDut8BymX88rOPgB6+EBeAIrQbj NT0TJk89ZvOZb5/r/Kyran81AgCFT4YPnm4KJZyEizjgO3XhU+GDefO9NCkao5bdCYmKxdWt4Qrr VFQvjTOql68QRGhTQj9B4kWtCq1sK2zYwLbAVQQe7n5seHafvuiCfcrudaloVij+sJBrSdvF5hOY cWEPHHfxvfrLhV4/cUrRlJ3w+WvrdWbU3Y0eVMvUyKXnSXs/iY39NfrW6/Nhd37c5XHXPMyqu+x1 V/mnn9bue2waaDX6ExZJ7+h2IRU8HXqDfKma+RUCBc98rhOXBIWgaqW7HcIm1xF77jNqmZ4jlciI Gqfql8cQNzk3ahj9jMndAA59DF98+UURizkH2qtHqhopqC6ZM5x+R2Wyd8v7OgIT1TG3ICdeaIwL 0M1FO+c37289Q/WTIxcQDqpllmplYV7+J3kTz+u2vTd9p11PmrwYUtVMdyFmz4yq/imYh495hnDw vKqguqZu7kMJut9e54YTiAh3OAJ+e1xjuTsLqt86t9cIuTLUMk2GiOm/qm3uEM+nqGbO047udnzr 088qjH8i8JsVyE4IH15+qWrAm5Vcs2S1nPNdF7RlJGPlPJg5WFpTfxk/52B/3sii2w1uh4pb4TR/ K1INx9ym5Xe0EHw3fpnDbELkPWujOOYt36EZyoAzaRuuNBBb3pz/66gh+bcc5t001Mzwu8pHnOn7 ic/4s165maC/2pbeYBYNPfMihA4hwHQbWbT5yv6RaQHWh1A0ekvbd8vfQ7QBShMUD2+Ecg4yryvk xTAxqu3YneLFP1Bp8CGeBls1cOfRB8H2vQxSB/r93Nrf8pO3aMDMtn/frslzhAeVz7Yu5aim9j+y 7usmjfoUrcHYmlLzcjzyOcZ2FZsLMZztHBzmTt/M01usE7an2hLi7rDWly0m1m0h714n7rHOWVBj Yho7jQbocSKQ6N369zloGWmE94HaEpOxbBGlHVhXAhrJzobGheMdIERLQuFEBBRSiPYWn72RbAX/ MtnPV98WxCjQ7zUb1GSIICHC/xzNINoC/SN0cD1e+/jjskfh5ocQmxn18Y4/SSPHJULLBN3NgDp6 wKaGa7PCCYUSJWTRdga/2xgWtb1l2gWFAoKCgtBocVPY8Ro6J1eIX2+CmgpgGOuBtd42i6AkgpEc 3/im9kzaPkdaybe3QcPZamu4IWL+I4zwu4C8qknRQ453aCQ7V4P2/t6AcgbtdA59NtdosF5I0eP+ NO8TV+GEmknViTgLyYTw08T2AefvfA044V9sf/oCBhj7xddCpr+kz8Qt/aa+ZblfNAa09a+7j0bV LsMF12fZfHCCBj32HxJnCIFKy3jwgKQpRrTXthA/2hz1TlmEhK+P9qcWbNKzvClDnsmX3/78zs9F yisqtQ0Rf6OMf9LwO3VWHDoe4ocRDl4ECcEP8eQzbhIKyadP4/UXXOMybsEwgckNh9GXRYMy90cp etwJnzgST8XGRJvv4Pj0l9Syy1RXdnXpmd8eNJppOAmr7DrpX3GZLu+GmW2z2fT7OH3XX4HNycux pCESjTeEse+ChMcuTPQK5TKtIxcUVSob9GkrjFhauFJ15nOLRdbWFyQ8BI2ZnrEjnSu/YmFbAYbX irr7obbEBsKBUxYCf+6ClDCCheiQ8DEupbrmOf6Ci5ugAOIAzTb+DBsIIVygFFRsEmctgFlQwHXX IJoMFZg/EUqojvkapl8i46nqlrzvKrXvdtgTxufmGTjutDdQU2GTu8uzQGtEVkNWEUoEz2fdHZ4n 50IvCh7Gs6IKH1a3diZVTcNFKBF8BRre3rH/6MHgdV9Pv/z2cJPjLO4gqEqYRfsxi6HCCI1IXSY0 uI56+YNWr32YxLPVBBESanWGdGZhNm8SF4pwjD9CDd0jhPC9F5LErwxesYMWIUTOmPqtiqhCEAkB hQ0azlKIIfSCkVzNFsFECGIFJ54tFWpn45JzpVGzLKSGlxs5EI+VoCVCieBEuKFQQoj6pfNriHyZ kg/woQYu1IDzMOvVwJz2/7H3JnB+XdWd561Na6lUqtKObEu2bGRjGTCBsLWH/nQWs5sM9Kc7CdBA wAkDMYF8mgnJfGaaTtLNBDI2kHTMEnCY9HTYTICwmIaAgzHGGBtsLK/yIksqLVUqlaRSqbb//L7n 3d+rW09VksES8AEf6V/vLucu77737jn33HPOBZh7K5o5qvlZc6XoZ8qq5DEf6x1ivl2+ohKx+Z3i Sj7v9DLNc9RBeRaQsRjOdIX6AdJ4L6GvJQ8QC3LK5XZUKcSiXqhHXUqDfnjet9CNt5tvm0U5dXdp gV+DypT0l/Sa3mckyrj9OGlsshoT2q+hCCOsMFAXC1PGwCd50Xfub4ZSVdjQMPrPWLAoR6BAOe4n hBJ5jHgmHj/q93dMLaVQgjjPkPapm/unrqCVinucGLvjQPWe9uevPnjsuWeWu37+3IeFXuU9ks87 BMD/WDBUbkZY+IBGL2FO8jI+wogSEDhYCFGmE7aggjYwQoBP4Ccle20k6BSEgl4jlCiPGac8zjLR rPS7jS8IeAaEFSXggwLA/1QTdh88ECaECB/mAtKDv2jUGcIJFcDh5eDiA3EqR2e/TnIQr5D2iC75 XRKOBRLU3ynaBfgkrw7hj8BjCEIrUffQKkxIIiP/sfkFUQsVEErYAXbwAKKVFmDU+MIhzZsYCCmI w1M4jTrhieKa+26T0b3C7dE4h2aC8tB6QKPRQgq+Vsw5BvOGQtSh+wAQPkCr4cUIh6aCrhzZzSZH CeTzhNpVt48Qn51fndgVp3YVGRbMwCPAM1jIYRT77mj6egAPbcqp3kr4YHxfbUJCPIQSGoPyucKL wGdMsTmicfHmhU/uQnMCU44S4njQiWOpT2PYmQUTLfUZCAHF7Fe3LDpnOGZIJpwSmNT4PQ6/eCPQ fBd+1BE42XuDBL7ZhheolLUUnHaN52uzL2M60QIhRglewJYqgmWfIBDUx8+7DJR3OcLug8vBHFmt knKkOw98gPL8yHeY9CYuTNNB4WBC5TrBA8o+VClVeYdPVG+J0+xb+SVD0DkhhH4ayjBpzT4rwajH XZttgWvsuDbK0pbbi/tv5Lu+sg9OKxtnLEoc55VjWJZzOCTEMAqauPdj66n2mQSnNAHbPnRMi36g VssUQ4otKVCrZOo+yB/v1O6SJuNFqGhKG+OgGOeFqncyO7XCeBRzArQuDqhem3JEmnZq8LzdLUdU B2GEED4IukXcWoqHAEKEr0144Qgr7+YjqBjQCRwwFhC8kdzfwwWT0S1hyCybUd1fj5jaUMcsnj2E B2aCBarBTAZxGCIAgRKAE0YI38Hdu+vzvyNDf/Zo1W7ziuEDlb0oTEQJ3qkwczGu9rEXNRh/cvGo GDkJA3L5OINcqp1HhL9XDNkxjQs7C5OLx+KUHYi6VTAx3cCTNf1kDBmnParLapA7lWbYqQC7JtiH dmQGD0XM4cx0GA/1TY4FXS4mBSdgw9u3pzY5uyyJfDA0Ui0t+8EuCIIJFjg7RehpC6B/2KHSv+iN HgC7HAF6/kAwvrov0jm5A8CbNgKMIfkt6VNfEF3tVTzea+5L7RzSGHn3w7sheNYGYC6k/FrvkpA+ DpOhV94MR4cEJTAa3T296UExF+yAYCvK3AXw/TYXYf6mA+EU/FmqsdUnIPNrPePxqbRWvlEuv3xL +t/+4Oz0dx+6Pv3dhx9O+w6tTBPyd9Jqr+yk8XPAr11xhxVN0/rGDNPT2kmUlmj8tFBDVZOfDwAA IABJREFUS1esa8TJo1zkKbVNcYB0gHTyXYc0lutyxnG+63E5rqSVQH1AtFeEm2UjLma3fVp2x+3y t9KmnalpCeLGR9KZZy1O/+P/+7/Sd775g3T1h7+W7rzrkdTWJQdrLeG0afcxLI81kDqam+Y9x5T9 OFVhFrKLJGCI41ElCORUFuZj0g2xoNScy7zLnEw+CzDeLeZGdvqtoec5m7Kls2SXY94ucViUQnOc Rt2HcztKjHTyXD7ShA8ev/rkKqUBrod6WYxbAyTSqUc4wUDn8mXdbsN37u/Di/qqAbWhf7RdgnF9 9bfG2PB9N9shjvACiNOywANUL3XAz7iusr9eeFfI+a/qohzgMrRP2CeL+R58j2V/yntx/ml7/vRT /WL+pC36xZ3TV/eD9839c5h7I590hzsU9rOKRP2J8dYVbYfFmsOHNbfDP1qYYRPQsa7q5C7KRZ5w mI8toMCUg3SATQubeqJpuVTzPtyGccHBLBQNS8aNbyN8S5AxD8A/GAjDU4Q5h4USCBUMbESI3muW jBQEFGHeobQaaFN8DIA5x/rBgjtQn+AZ8DMx+63l3oo6VBYzRcC0CIFkCAUyTfbCO5D0h3iX6CLa EPAJHQNVH9ikWCo6hbAhzDfUh7Is+PAJlEH70kIJ8xjUDz755ifcJle0I6DHAaoLAQVgJ9d9vE+M ifIM3aKj1QiKPigMcB3OQifoutMRVhwgP598ZcFHFIpy1ZsH3+C82ARRfEp98Ykdxp/vSnsIQQBM PRl36D8aEoDz6Y8hcBQxLlfeRXiMAPUB7UkAvgFYoXiHqhzQAFhYQbqPB0UgAc9gzQm0LgFvbqB5 5pP5ImOOP52lnVv5sc6B+3jSL8AIMLl7In+0t8t7UwoCmuUsxXZ68z3zAtUCARM+4893rViD43NN cJxTxs1cmOiCQ3/iqqm2KeggvRQgzDU2lPe4RUX5TxMXU4O5BDMuU/bTac1rs85m/snipTCmidt8 Ls38+eKUO9Hzb9bbjLve8v7LsPO5UtbXJg55c9UdDGR+RjAWCBd4/lE+p8N8QY4QQCC08Ekabi8a 9R8JJCYkxe6S2cEyTFx07eqR4p/MH1pM4vqGSkDT4EQQwgkJHwAYC4QSJZAfjrCyYII8+wFASGGB BMIITDpqyP4kiCOUqCH3r3ZgpToQRjg+pvB+ea0GZLhSqWWKucW3BDsKAGqGXmbt4XxuqTUaYAKw 8QRKRqIUSpBnZoEwDIXVM4kDZjaqmJg+2ZtyTNheMU0HxCSwxzqkM9MRRBgIY6cJYwBAjA8XzEb0 P8dNxM2IUCaYCDFAJuKug10V7E05YgzBBEIJoGQkIi6iHkyFmB2rbeIc1GD80HTJzAv9qIUSRjzJ FcbDzCyOLIFgKjQ+Nj+BOTaj4TTwMIcZFV6564HvibVdetbKRyiBv4mDXUflcLS6T072iJ3vzLDG LqVwS2afuk8VTGuvsX3ycFqxZEE64+zV6cq/fHHafEFP+n/+4lPpS18fSPum1qWJBT3idcUktcvn ib6bNjHZIZRQJ0IIoJU41/aGPxUEASFIkAkTwoeK3TpecFDeSyksIN3vfoSjDQkSs3ChLOdw9MeR ea7zlo8OSmBCq23yVi+hgz7K1CZG/+GHR9INN3w1vel1T08vf+nvpte98R/SP37xdr0b2j0UU8us JrFLmi47PE/7jzWZubLadZagaLEcHO+vFoVNeu5523Or3yHSY3bXO2cc+sTc7N19Lzpdliu48RNu WY6ydTzjeZMh2lEaV9cB/lyA1gHAQrGsr6JEVYloPy90SXEcmk8jvnIv3C9SjZJ/qdOr6o77y46/ 6+TKmJZjULdJHxUp78m0LvDVvnEjoD/UZyjvyWnRX0Uo73bLMtB+wP0h3OwraQaXNf6P8/zhKQN0 dX1u0+1wdR5tOZ+r7wMcwoyv75NnEcC4KLwsHzmJyUdoUOo7D81XzYVceecRPDivq6Oi/yFYrmqq NSqZsxlthBIcL87IlZoyCCWAgwXNqFJO8FeCE/uXgFcooelTIjQltKSuTThKoQUFES7oHQIw5QAw BR2XY00NVMSbf5oCCfJLUw4Wx2hNMAUNZlo1KYmwT/jwZgblzANU/iKqfqAxiTlHnZf7QblqyU3J il+A3wDgNaJe0fK2dWtqgQd5Jd8RuKrP9Ji4/UBxMhdQamCWviQis/gTDjGLeKUpoU0O9RKhBhsb tL2iGEc0MhCMwBfED/5BdBtcAPoN0IdS2BGJ+sNGEX33pgt8C2DeBqGE00gvN1J4LsPi3YCKW4tg vckRZr3wtIyhhBm8u6UgosKu/iKUwJQDsEAiHGEqXgokhjQOQIfeB3xPzAedq2T3zEcJMPn7A40P 3x/ofKUfT/+5G4G12HnmiZubs8obuwkQOCZx20sS533hvTHxs/qZGQlP3BYIkF8SAOOV5WGA2UEJ u9LMFFCeciYarsOEh3rNOFMXQB4EiTK0E8RE6ZRlh8GE0UwB10WT1eRrvw6uS5UFkUKtkTTu20d/ 0pbtElGVXNrTU0vWB/ftJTvuhf6x80O79Nd9snoleL4vxtng77PceTBxNY7v0bikUxd9jR0f3S/3 T1sm6qhcTmmcrRpKfyhPueb3b4HGqX7+jAlgfxAeF/rNPaLiC+EnHvdSjAsUHkFSPDfVg32oNWJ8 r1xtN4p/iQpG0rK1a3N4hjHwQg+GorQRrREVYOfkqBZpaxTGd4QBdcxDIp7Lj0rtNaf77PL9mvzZ AbEtqYUelOWccuxFzVDENWtOkO/dEDu8hAihJdGScyv8TSCYKOE4R1Z5vLwDYlwEFeMqz3GhqbPt uN0O8Db0r4wjwfA1ASyXM6O5AKEEC3UtzYJRsFDCjATqmd4JmWvHohRKNIUXtEc94ThThM/Hf+0f kzNOsTrYgQKhhpnv1UKJKqf6C9MA4bcQwoQbou08xhUmwkIJxhpo09wHEYdJsNmGnVhZ+GCmIgro T9WWHHUqjFCj1OJw28YtGQfSBtWnJo4dXrpMf/YZwbsKc1HG6XXJFFOm3gFReDQLG0g3YDdasrQL 9S3165g0djt2HKm0ZfyNes7lewTKzQ3X91iv7erMYWlK/MZLn5T+6q9eKRvib6VP/vfr099fszNN Ll0re10JBCd1hKsEZ21aKLRUQGIGPSwW8Bpzglz1r520LDSwgKESFFT44BmsDQF+4PgqBAsXoo5o xaVm8kgxnnObcfeF/DIc9c7VT91QVQd31qn3nvs7Kt8fbRJYtqVPfOo76YWXrkwbVqxN7/7jZ6Wp kaH0+Rv26aCX7rCoaGvjyc615FTyKQK/C1w995qGcIXD5L3xu0OzDrtsdEW4gBeSEcl/jN9Ma9ar iuv2wDWdBw9TQ/rDDz7HuHPV6TTvkM/VvnHcB7c103/uXPeUhx/aCm7gkSWAfjWhbIsy4LgNaDC/ Gkf5ofkHjipCUMDV+Vxpb1aZosGZvipxjr6ASh+AWbgkKN0bN2Ue4bgr2tXP/XGfqqJVnT/q8492 qABQ+1En1yolJ1e8T/Qj35PbDtMYCYzgHUgzz0NBxrnks7gHzDZE9IVvTimaqP/4/dBHGu9+KWgA ibjNPJmX7YvqiOg+wgk0KDD7LIGjRLulJQbfMJUX85jzlX0DH34p7dlTbVwoDr6dZNvxdfN48UPS tgTKdNNR0u30kmUmPiYwBZW7R22Zy6whLyxnHSFeycUpGoCzbKnpRJijxQ3hV0MRFufAXo1Fmxa9 OLkEnE4YoQL80/jaVeGfCseXcdoXu/25DPg296AMYMfbhKkDnAkJKyYw52CBTYagxV6B6hrRbeED Y0j3NiJBb5ImiIUUOPpexilmAug+QgTfKvyAAaELQD0HszAHYUNLWo6IF8BFyMFx6n0Kk7Zcmisc JR59pF2HGRv1IXC1NqcehA780JpkQ8gAn9OSNm5b4dAb/OVwYnpfh8TN2DcYZeAhuO02NDeyDzHS 4+Qv0lUGp9kIJMJ5tnAw5bUpKBsgu7PWRxxFrjGJ3qjPcZKX6jii9RFCCoC3jE0OxyNRfzjh62TQ zkfJgoQfHzlXJjBPUBCZx+EXaATy8y8nVwgHPyb5sDfURGrVtBgZvTdM6Ez4fpd4b/hVap0zNoEm skFctZiM90vlgXpRqo8PPOqiH7TFhGwCVi6PTHiiXT7wDPSHPIDFL+3RFxbm7mu852qHtoJZyXjk Q+i9yCdOD2mfvtBn6qRvCCQA7O0B6izV/YiXApZom76oTtqsdpgqoSD2oeDHT3m0E9+n6uX+mRy5 J8aJK3UZ1wt8MxDRmdwfO7/i3gHuDTtUhD+E/cw8F1CnGgjceD4KQcBp08+fucJAubiv4vk7j+tY FioRrp+/6qLdSMuTrZ9/JOpPxLP2QKmO6nHBpwTtRv8LLQPyPa7UhcChQz+gIzMX2IyiYm8AB6ED jqoI8wyDIckIMBSoZJIOHj+EEeE/IgslcGRFOgBRJQ4xhlmI0yFyHhoZ/qG+jHDCYGbCAgkcZGLa AZCHbwkA4hnaEiEK0MJcdaM5wXFhcVW63BYGbvxROyUgqEAdk1M6OkVw0ZiwQyvwVnbIbRtqnwLs RQE8bKPy6MU9RJ+ftQcCRzsVCBIslLCgwfGoSH8qxqPqk/OaQguXLdPxXQGQhmfr2G3Q+HqXgzx2 J8rFPhoMgHc7vOi3UMJ5jKl3HkgLwg/xz8+NNGBGHIVGxsy4hjmJ4gglgHBipbaDWZAWhwUdtOvd D9uJRoH8x/0j6h2Og3qe4CJgQPvBQjRwOBYMgAGCebUGBTglnnc7fMV0A02JIR3pxrUJ3vGwrSjz n5l7cJkPmCvsj6JZ/rHEJyYOp2f+8hPTK17xZC0Kbk/b7t6XPvmP29OS7j7xSnoCkjx0LtTz79Bi E4GZzDckgai+Bpy58tP/EFBowQBYCGBBAdfyB07kSThQ4zotX2v8qJwSMxBlFa1xcrvN+EyJKuR8 tD1KcDoLHsI02SYTDgQxnZ167zqgZQvTHXccTn9x5VfT9gceTGt7x9JV73p5uuSXNsiRvGYg1Rka FiwskGucJuC9CPossmCngqYhUIryvSm7EItolW3mN+PQm0jLV9p65ScOpUOHbk3velqmRcoDyvZ4 R/kB/PU7C92L/uY08gHaaLYddDK/+7PycnuUc718D4SNl3sWbfn7YckO3QKPHw4ym+DypAedF7/h NuAnAONwLw6DE36edDW4nRKHtPkAPOOCQzj6oHtzXuQrnbaB4BkiVPxRG7RTPo8itw66rjqBQK63 TlPceDGO5fMgr0asygZuTvO9cqWf/BBK+PmDxv3xgz+hLPcFPj/T/jiBQ9+eeaJcffAapC2TwLd+ 952Zr7FhkrUi4Wtibta1JfPBED6IpwZwls1vGqGF5m82M+AR+MEDcpJXCeD4WFHC+JuwNiWCBx8f 7o2NsixpkY6pqWh9eVJXv+g8QgmOGAfYwKiFEmUlDjc1L5SOUMJOM+GDVkiYzg9YI5oF78CGg/mI +hQv5aMdiVBCA1qfxuHTN3z8eFQEb+RfJMz8od6yzpkchTJPBR22YAGeBEDAEKdl6YjTBTomPYQS GksAGlsKJaxVQRnnxyaEtAHAs7Ys9XHEODxAyS+lPml4Zj6LvgRfJBxwcZAJLwHd54dQouZJwBUe wMaH+4QGhfmVOLFLeAA8SJmOwIGTvPghZDAPAW7gqV2coYcAgjQJdfTBhEAjhBZ5rPQxpWWiKx0c YXsS6JPQgh9wIm0J8jtRLedD5WPk54/YH7bjID8OP/8jgGYC4AWu3wtP4mHLqJeyaY9JGd4V8FGX tBNEJUa8lKqD5/fK9RNnoV7bPaoe2oydel1NAMHjUyMv6hAeUMcVdp0wPTXTTH0ZF/wgTqoDXOrp ELGf0IcfAgClkU55E3nffzixEj7xYeEPZlzXA9Fh7Nwfp5vgOU4fGGkmPe6APvAj3xC4RHJ7BCvy Vd1jp3DjDHddO/O9VOiqR3HKUSdjOCwc10cLbodxUKQeG/AB57tPvv/T8fxp3+pyHv/ohP54LN1+ XHVvHl/w/D7AWADlu+v7ifQsmIGJsN1nCKokbIJRQBPC6eCzQ8KRXwg5/F2gSQGAyw/VyzYRLQRW MCX79evMtqgIrpAgAwgiABiMJqAxUdqGWhCBhN8qmpN7Ks2bJOeXQZC0AIZI2ZGczTliJ0NE6ERC iWb7cfoG74EAh1aMotUzyTuSnVixg2A7S4i+wWeTN9XFESwgQIhdgQLfDADlyTcecTuqYimJmJG8 Ep9TOyycCJ8WwsJZpIUP1GEohRUQbBb8FkYQt1DAeQglSCMOlMINTiEhHeeWtvmkTQshAr+Ik+c+ gRPPSkhuMxxhCSccbxV9o488X+Nb1bK1c0+lHnuWdjjk7HKWXwkazwCDYfVPkmCqS+GE8XzFLEWT XurLO0NOt+dt1DCnMjMc80cxP5RxlztV1yX97emFv7oxvejFT0oP/eCf0z9+6u40eKgrLV62Mh2a 0DfZrjGSt/Qwo5ZGANoSWfxQCwb0NunjVGohsD5R/2LxL4Q2LeYRESAAqMrrKrCwguScEumP9o/L z4Vft52FGSVOmYQGCDCFY1pBV5e03qba0xc/uyutW35LetPrfyMt6zyY/vBtT0q3vXp7OjqmzYIF jJX815QVRelT9wdaCSzt66mcC2tON19JejkPEzeY2pFvWkNeGUbozhwMjTMN7+x8fXpJemNa/MaX pGsv0ox106vTtdsuSH++9e3pZsrrmzuuzUYb9C/on/B5l/1rljPtdr+gV/XClcSTQb5J6uXnBbBp Wk3UqUd18wOP/gAW4EdEf0wjne/0sgxpxH01LmlNvEDKf2o8xf1syGIziCcc+blfqih4NvJdJ/mE /exdHzhNoHf18yzoA3iz2s7t+Pm7jbo+5Xvc6BPg+yQMftkPNkrcLvwaUI5plI3Uquxw9u/DWok8 wPUtkmN4tRZp5j+ImAeJDP0x/tjRalMK3ye0CbgPEdEfyp590UVphU6bALzoY3OjdpodOfojWsFm BTQDZ9gG6MeuXbsi2t2vBabywummtBPY0OiRNhybJ6RxWhcChCfk+AbFAU7u8kleIxJ496s/i+QU 0RsWgYRzbHbWBa1+nVglSfCw+IX6KGvVyeKeDQ36yAZe28GhODazou8L5cRaGzpyWNmtBTq0HWeX vVoUO0zd+JkA8B8xKVqMliUnfwF2mE0YvAWqhzRO/GqJv+g98wyyot4l0gwEOBkM7ctedQLzTBxR 7xLfFnkFjV8vfo/NgME1iyRDkOmg7ofTONgc8MlZdkhNWW8cWEOxX/eLLyhO+4qNRbXlU7k6ZeLL ZgZalxuFw9h0i6CxoQH0r10TVzv0XiEc5jXK48wbcD+g8YThDQblAJv22+QAFR4GbUr6GHzDyMG0 fvXatLpneeCRxhqJNVtr1So9o8X1mok0r592qtxK8bJn6ZS21apvWG1XnK18Uwlvy7nnqv1FacPC JWmJ6M3ouIQy0voBemTmvEwavotkbnlEuOSBcyLQfVYfZnw4+iA84bqQPyjHH7/+fI8Ak6UnXxPO 8h0gDQFCCWW+bTjjrRIeeVafVKQmOGUZ3kHaLNP47MJen4ZoT2WrYEXYwXUZclikVxiKZFw+KuNE Yf9Rvu+NfH5mPtwH0qLdqK6uOY72QkvCpiWukmtZj9NdH1eHo3+q32n+BukTaY4T9oLd9Zn40ZbL O29WGv0XgONrpCidK7j+ZYS6PtINzTZO9fOPtnJfyrZm9bvoD/dfMmolnhk+9x2Cb1wEENaA4TqG XwhWGAKYXhZw1nRxeQslSu2gdiZZaUgglKAMI1Wx5C5V2Y8mEQ+gT7sknMxhgQS7G+VOCDihHSEh BoIIwMIIwmhJLOXECN0LuxuYb0Ac0YyoIUvc67iI0mGYC12r5b0uEc4Yec43PoSrW6dtBKg9CyWG RTjZB5jW0WnsfsSuh95RFugVCddaR3ELKUoBA3VZKBH3pTbJD8ED9wkBXFe1aY2JUgBBefCBqv5K UwRmZUKnfLgthCJyCzhLQAChT+MToXpJeST/LPgRqtimk3TuA+GFBRakceII54aHYE9EtMwjH/A3 2RRKkMdZ5RbU9IjJYKcCCC0OxgqGQWlob7AHQ9jCCL1QgWuhBEwFDB7aEtjsInCA+YDx2LV3IHD5 gzDCOybEHR7Ve0KZeLcVZk+DuHQ3QAuAKetZJqZF7wAMBjsjFkoMSUhjCK/bRPTtMKP4u3P+qb5e /jvPS2945UVp1x3fSrd8d0e67puDaaJrndbWHYyGnjjvhr4+TtNBlVaOIb24r/tykoU4i/wwA1EB Cw2og18Lh5cur3nCdc/gUWimXN3mowhE/Xnucb0u5rjbcTpX5xF2fmWmwhzUl77yLwfSRRfdnrac tST98lM70htf87R01YfvUp5oMPc689ip4pQCGw+mG5xq4IUZaaZZZYOmt+SjAYDwgTnadNnvF/ml 9pvb6Oz8WPpsOpSOvvW96ZKtr0mfm3hruueSrelmXk6VMR5tUpfrLftQ0llw+FGOdMLwMgbS/fOi 1nFwDQ77SrrxuALwWO4P1LjEJdzkwU23KOtyhJvgetwO+U5ToOaP6rRGBaTD2zG/0VMW8ACbEQjz Jw9UNKe+23zftEdZxgteD6Cf/HzvkVj8Ad/9YLzjWSjNY1ugRpB048f9MZakFYgRVprbNH7ZVoEe 91oKJMAry3qs/Z64LOng4jdkLBaIZS+E1eiXy1H3pMa02R8coTNupBt+8K1vpXMuvjii1pogMpIJ b5mGlkS3+Iwd2x8MfAQYNg2NTQ5pO9y77a7I2/yUp1QmoHmjo7VHZgZaCKNxGSAyWzvN1nMJ2wXd r2GMFak0LQGEFJggAHFCh/iFI6Jv5h9I522Yuv+h9H3RK4Qfm579jBBKDO/arUWweBnlcwrZqEwt jkrgYP7ggEw3SuBA7xLwJWG+ASEFQByTD5xpm/doV52c6NXxwI7AWa/7X6HxGZTzaJth7tP9Daov xJeIb9iXHVjDH+Ao2xsF3qgoaS+VlqdwBO3W8IALXdeuQPr+gNoeqsbMz5T2vbExKaHPQ1lYA09A Or4hSAdKPiMS9OeY7tk8Bf2krZE90hRVWXgY9xXegP5tv/XWKHr+lguCh9ihMQEOjVUbXnaOfazw S+YNDfgHgNlwVFqW+7J5Ok6zbeaxV3098sihdJ9wzD+sQhglPnhoz0B6MLf3vAufHEKJATngPxHE TFl+ECDHB6SPxB/miSp4PO/nbwRigacJd67nb98L5V3HSwRBg1gIOJcc4uYJmImdPIgLOysmfEzD xqEciwETJvARLFC2fD+9MHVbqjiIKHFaL8tHnWqT8jU+icItoexDnU65HKFs2YeS8TLTBQ59hYkA lzB5HhsTs6hL9boH4PkeXQ7mgPtwXvM5sNhmkii1Iuhq2UeHaY/ffACecY0TfVR6s13yT8fzd7v0 gzZ9Sgv9iAW50g3ce6hSCs8Ant8LM8TOCyEEdZZjUAglwIv7BEfMVwmV6UtlFjLTmpgDHeflyTo8 bKsQBBgnWQe0SLI9KRM7/iaatqEIJpwWuyXZOaYdXkVa7kh8E3pHDGG+IaHE6N69IaiI9Ew4jBOq nGIYUM3sz4mH1Mb42DxSai166U+AVTKVFraiSrRKZq9s1oEhMRVDsjUsBQkIDxiDVnaAZHVLcFDL BGA6OjNTMynBxMTugYiX5QIx/2ntrpieLglmOCe7U4wQuykwIHFKh9KDVZYtplikWPSHnajCg7kd mIoKCXOr0VDT7NTiHoEEQgrSxrXYjUU/TjQRXmzbXXcjVCDFULHYt/3oI0e1EyBGwwIEMy51oRw4 RNuqn7HxWKHySfu2FyU+onw8dtvhFWn0xwIGqiOOjSi7NDwryhMHcEwJoLppXxQINADbgoYjK+Ji Fu7XPRqIH9P7uE87IjYjYoduSnbFHavWBJqFEvU8ou+RMLOK5y7Xd6qul1zQreNq70/b9o6mv/vM gPjjnrRCOzbHJnRfXR2pfUJMkfZx5RFEnJs0JrRTVy7c3Y9Yi09XAkinPdorZaMkK/osnCCtcpep 9qRZgYAgfuFEE18WJ6/d/aRcGaZkGS/z56o1cNW3tnY53muNpQd3taUvXHdvOu8/XJwOPrI3/fZv PSl99+7hdM9D02lUu1eHDx9vrjNXvT9OWrwPeidCaK93j7kcTb0mbNywIWgbu8+GI/Lh4t1o06OS 9g0MaJ5Q3czT8A+LtfvGu4e1Ttr8++n6o19Kb+q5OF2to6KDlolcuD/UU0K/fGhBQ0ITE3pDPxQH jzqhu6ar3i0El/oA6nfdjkdG4w/Y5m/E1dS09AlnnBmYk5m5JxJ91hW6TxnXz5U0aBrjw/27H1zd F3+Dzjf/QN0IFUg3X7Rc31B9/0pXhXV77gdX8N0PjxX1AWUfiLuchRLum/OcT9zPH41b16MKZt0b +OU9GZf08vlPqu+UBdwm9woecX4IvRg/a/iulW8p6Dz+cgC3Zf6B8oDLEqY8+TahsaDGPifY4Gjy DlFOgjbSS43Lsy64gKx0UO80AP+A6QabF6WwgTzi9kdVugn0JkeNI1oK+NjQluriaPEAnFbiR0rA xkYJ1rKshRLKrIUSonmxmQFN5BtiXPK3hOAB00/MO3CKWR4bSh4moQd1ZNEhmQiW0Nvfn9j1h26W YoY1mjOhkWDHJoTC9aaEeAbSvBEBHfWGBnVbGIFfKwsjWsJhasC3lYUWTMuYdSCUAGLzIkIKq36f ynF4gXSDjlVHhnpTYkS0mcU/AN9gk1DiCADMB9TCCDIExMFvgo8Lt8CBa6+Qyj45jgYF/IW1OV3G ggf6xaYCwoc4KURCCZ8CQrvwDcs03vv0Cx5Hz8dg/oL0JpDHxgYCCwsowgRU91T6qAoTDxXmJC/S bSZKfaFpKXwAPxP4lkBzYkobSycDaUcVLDcfs0rwsT4Ov5gjwITMRFyeTmEiwYgsEFAGAAAgAElE QVTgMLGU4McoqQzg94Y6DITLOMTei82QHguRfMqaeFKWtCDUSne9rpPrnGlGyO2DMxde2R8XaV75 Aihb4hKG8UIwEXn6Wio3U/owlce4MHbgeSEcX1LuB+nxfeXGXLf7WceLzjT7D1MRjIdw4stV3SWU +NQXY2gEcJUGlHjOjhzlN/N+Es+fPnguYveNftMu49nsj/vbTG++l/Ee5/mNugA/F9cRaQ2BhPM4 DoxFcw0SaOBXAsEE2hWYanRmu1EYjPBJIR1wMxt1OQUsbEAoMRfYTrSZRznK4NBqnVQITQRr21AJ ErygpGwIJdCgsIABQiQmIuxFtQgFZtmKggsYv4qFUAIh1EGdeoFeO0wFPiYmxSjYrhJUq4MSDntO mKSs+UFaxWjkNpRe45CpeC24yMxVWRYUA9oakxJMtGlRHQyIM4orQgkLAGBEIOgs8k2AOVXDGgwu FuOpdAPCCuxC2XWyUIJr+R6gEbGXk0g0MCH4yIVDQJHfM/rBvVtroqV5E3D77hNMAbscYdKhfAsl Ajn/AQeBg+09SSbepkUGDEoIKbQw72VfXOnVLklVmLLBGmncwjY011lf1Ef8zSC46BODbOA9gpGw 0APGwjui5Rzmb9blTtX1155/cdr3w+vTwwOH0h075L2+Y22alMf5SQkA+CrbOnjCcLR6Bgp1xE4t wgklaf7gB1RXMCohQJ0eeXoeIGVwHlEW/QxHac4RNSIIiFK0rZGNCvRHq+QIkqyCZV25+rhY8FCm lWHKGcfXMt9p9kdBHG2Ilk7MmZruTTfevC/96jN3pHP6u9OCnr3p2c9ckbY9sDtt3PLENN4QYJb1 PtYwczG/XfuqxUg5N59q+vGaT92WznvXlWnzOe9Nz+16W7plDppW07556Efdv1yW+68pqdJec600 T/703encj56f/vTct6TvFANkOl0kHRekLtpo4obPrdwn01sXdvuUcblIMz7p1JsL1DhFPlnOj7Dy SvhF4B+4X8bmdPIPsWmhb28+oQR9eDT8A3hxPCiBAhBKAKUJKDQJ6NG8THopuOA4cnxVhSBDZqXW woS+MS8Fv6A5vaJR4gn2zKz7Akd0oj6pg0byAtaneY3AR/FTv3yc+JCcZrPREO+k8H2yF4KKkl7C R8A7ALRlc9BIaPyxAIJk6DztIXRAAGGairlGHB1aaFU4v9LOFG0shBKxkSH+abVoBUJHazzaPxQC AcwnEAKQhuABgYI1LOlLJcaqhBjRt7zgJjwfsDkQgvOMEAIWaRAgmECzErAT7YwS7ROmT/QHiDEr tBcjUX8sTEEoAU5oaCidOGDeBO0Lm6KSjvnGlPwzDYj/wocVvEglPtB7orAB3gENTZulkG6hBAII zDLQjohjxjW+ayWcmMqmMuCad8CJNqd7+bQOTDlOBvp+j1+IuBB5/B6HX6wRMNH280dSzJnkpB9B ne9RvBPNOhxnJO0XgTBtlIwLacT5AexolGUjUX8oF+kQZcWN4/Qy7jcYPN9TWZa0JkSK0iOvIO4I JTg2KsoLqWIVKvVM0lw/9XlhXPbF7bhN8pwfefl+jNfMZyEwUfSXfNflMlyd5p0P0uL+CQjKftbt F/WWOD/15x89Pv4P9+Dx8T3U9w0RFfAeWRjB84Ax65DfCB/tVQozmrseNuWIiiSUII5QgsV4E1AJ bRPBOSbCYyEEDMcR7W6vxsZQi6qacVDhpSJaHWvlQFOLy3lBhMHEBZzlWkAf1A78crVPuuOHVDee s+kXBBlAO2G9cGw/mqROB/TI6af3Tabl3KlP4zOkvk9KMBG2o7YZ5Qr09WoRrJNA8o4BSQtEtHGa BEDI7ZSK+F7uOdvkEg+bT13D3nNsNsPgfI4A5TgwTDR8BjnlOCbMtqCYcBA2+HQO4rYT7RWThBkG 9qKGvQhD8rsA8QYYu9Dokv1o36aNcsQl7YDMiI32SuVykwQEqgeCvOfYaORbQ4b0Q9p5wnYU56lm cszwYP9pHxTRRtE2jI5tbVva2XA/+sUwGUpGwH0iz7agA4cP1vaiCHmJn3HWWZEPnnd5x/Xe2V4U gcIO3TNMBzsgZ2E2JCB/re5nQOPGzge2owbsRddLCIePiW6NTffSZekDLPaL+SmWPIqfDtiz6+Y0 tnRB+uI3BmSVsyL1r1qm5bcY747FiRPx8BOJKUZ7jJ0c/un4uSwliO6wYJ9GUwKuXL9Yvmdhxcn6 GyIGlYkjRVVPANoRmHcIVKvai2AOqB8c84tQIfJDMiGnkzPCEAsUcqn6YkGE8y3QQPDgvBo5B5xe lZGYRm2ncRm4aAx2SjX7xtv2pSddtjLt2vFwumhjX1rcOpTulir3AjGPpxu8s087pjGnmn7wGKcn qp3Ids3np4N/wIVHjLOeKPQDfmBe/qG6Wf7WMB//4I0ddv4nJUwLPJWCfkHbPWamZ6ZvVGza5kaI l/mRXnyfxJv5v2j8w1xaO3ONn8fbY2yB65z8gzYyEEwglDD/0OQdaAN+AQhT0Ab/QNqYJoul4iU7 xQOwMWEzzyiU/6AdMVf6MjlGBPaiGaG5G4DqhQlHjpOOKQemoTjBPCTlB/xR9Ixl2u7NCO1iA0vH JtKRTAftowrn2PrAIr/5p29SM7LoB060gdKEgzgCCUwQeyVYGJG/C3xUHdgtEw61ERsWwrGwAfwQ RBAowJoTaD6ML6qchIefiSyoKAUQE4gPdL9OQyDhOtcUNNbVWwBhkwk0F53GZgFAX9FScLqFAeRZ IwJNBcCCAWszHNJ8ayGM7xehBH6d2Nyw00u3hbACQQHtwVchDCGP0zvAtbbEcW3l9kkPUJy+wO8c UAL9CRNShBCi59WZLBUqPqzYyGgCQgk0JdDQtMaEDjvVGVgV2FyD2FqRuwEJxtbmPF/Y2OiU6TMn ez18bCgNynzooMKPBmY4ogKbj5QP0x9rkfV48BdgBHj2M8+/ctIz37swG3eewYFY5l/gKxwgwgpE W2oTFX4IAb863biRMvPHRJmFt+vmOtPvipBTFwsEfqjgWR0vcHPZk95D7ietT6HmLKIE0IdY9Op2 qK/cqmARrMQqXbhoAATRy1czJFGR/rjvvp8yPerOCfQ1BB65buqs685pJb7r4eo2yvwybNwmnu0w nV9eTzp2IBf9CnzFA9R3gDTajHvRcyqff3M8ooD+MO5u2zjut1VPXR/CCH5xoojqD9BCl/KMJcwF Pz9Xt+ErmhEAwoxpqUTjX8J+J5i0OZOc472chhYFC9m4qg1gWoyBVTBxYAVjEUIJEQAcWPFrw+Sh CLNwhbj4h1CCMOnAcFYTXKaFSVNYEo6uaFeEqAYWmRJg9MhJFSqYCCUMtVDCCdmhVezUi6AZcN5o Qkoakv0OjQewZ2oinE4RRrCAoymEC0AwCGKQcHLVu2ZtlSccoBQyhEBC6TiwAhBYIJTA6SV4/kVm /kO7CAaaQgnjWHgAgQYHh1YIL0gvhRIQbXYbcFRFOJ6hcBAQmDhDqFm+I5TAEaaBuuzUymnlFQbF 4wZu2Q/q948yhHFOBdAPAL8Spc07aWWcfH4G236WOORRLwII8leJeQEQZpRCCdKmsiYQjqva59Eo Ag+Iea0KnrK/B/Y8km767iPpX24ckqPLLpkrVAtRFuPt0k5A5uBFPFcWq/wAL/IRHiAocDwyiz/k GWbh5IxZaUaMa9UYG1rgtOedLaOQ1qY+IlwgXPUvd85Ic1x9P2XWXH2I+rk5QVzEdKu11NYp4URr SRoemZal0T7NeV3pgi0b04Z1WiAwj8h++icBfh9MW0r6cfGf35YOSCPp6O3vSk9XZ5iDX/Xpo+n2 dz1t/q5pbn7qn92qb38i5t73/frssQz6oXoeK//wjHdvq+Z2tXP186tny1i3ZwHkvPyD+hd90HVO yHSOPE74gObYJ0eMleIeq2Z5p9c0XnUFXSvqpIxpn2mh6yHddZBmmmc811X2o8R3PVzdRplfho3b xCuff3OE6M8Jx65qONp2vfQ9II+By8e9aG4t+QfKzNXHx8o/wC9E3yVgijDPNfOFHgeumHH4pI6S fyAPk0/oSgf8gsYBsOYkvIKFEuTZ8WUg6U+nyvFbLaGCT/ACHz4DcBpCiVKjErOOMAcVzY500Vnz E/iakA1k/NCesFlHaE1oXAOkUagbj2BpxoG2hDUpuA5rQ5EfJ3oNSrPhgATlw4PlkriqDn5mSMed cnSohRBVjniL7GOKeBwXqnYRZCBwALwJQ5x8p9l8A54DfExFAMbQvAD0G15mfLdcb2YaC30mDa1J NEMB/DUgjGChv1x8A3Sb8YKemxfiGmHxFxZKUJb6plWWnwGhhPmlUtCA8AFhBdoNJdC3pccmQihh Uw+EJH5mJa77UaYRJp35H19VnNgFT8G1pc1mnJXaXCO0JdQ/O9z2Zgx1oCFBPuVIR0vCMCA6uEo8 8lQWfHPCV3nKF5sbQ2rLJqEn4yeot/NEEkUQ+PgeC0Bs5yKuP806zQC4X6eij6eijscyJqeqrG3x XF/l3GfGHlRUsZqQG+/FfASAeppv0IneqdCmaNTtvkB4mKRh1U/23lLGhGwuwuQ6y+tc91CWZYkF UaRt30OzTOdYtRAry9HGhAhYCCtyg80xyclxadZZ5ummavtY0sE9JKm5Tz0xrvvneHk9Yf0losLH 1XOanz99O65N9YNnzy/y9A5Y+BDdVRneSwCcEsCPOoVDjvNJM5DW0sJ3TM9okdL9nFDFBBaFmriY DOFhrsHJHWFfqvX4sCbhur844pPwoiKR0qLJKyXULs1wsJSFoRjheCX/ikk+GkQQgu2mfEnAPNg8 Y6kWQME8BJJQ5oh3aDt5+tDhmqnIqJW9qCJoULSLGVkweEDesPV8tdC2XehhLRh8ZCg2ov3Kx8O2 qErsfNhmtEOaFiK7tZNHRQIOqq/eGcBZVclYcAY5YIGDfUXAPNhZVSDoD+WOahDNWIQKZHZoBU5Z L3HwHtJ9ndm7Mu0U+Y1jOtWXEmA2gPPlkXq/BDpHH34k4rv0F8JtB1IwFgfV12Mi/rEDIsZu16Kq Luw8vSsSOyH5nrzTQYWx25HnL8JWyYRJCWZHjI4FGPYCDnNWAkzHqBaaB9Q2zIPNM0aVHsyDkI/z FqD6O8Q07cxMVslUULeZDoQQaEO0xCiiTbJv33gwFbwLBgs14rhQ1XdAZgIACzNrA/EtAE0b6kg8 BX+6e9am5fIm3+oYlGBCTKgMUtr0vodmhD7L0JjQq8knVtHxzH2qbdN3SmUZw3E9inS+b/0Im37P lK2KmEcgRrjOj3IYUcyUr0rQqurLf0krBRTGKa9ug2toaeRMt+f8soz7W6VJpbpDZoXSmBif6kj7 hw6nhYs3pGFdW8cOpRXLpD6seamzrRJElfWcqjC+G6DNvB+eP+El6rkxN3TBE+9Pb1x8YZr69KfT +WOvSn/Uujqde9Vz0rlv+da8Xbn4ynvT37ZerfE3zrPTlffekC5NV6X/rDbLL/3H5R+erTauSce3 8eut96Z3ao4vOKB5+zkXXS3pDAXp32H9gObYkDZXHaT/vPAPpuHNe5/vvrn38vlGPI8f4SZQT7Nu cGjXbQthXv6hri/Pb9QVdZ6Afzgm3JJ/gI8oYU7+QYIMAP7BwFGgCzU/W0jho0FJAw4Nybmk+tOt ueWAeArCJVizAuEEy2rHOwpaeJg9hsxXRFktiHm38UEF+HjR8RxfoPl/cPGBxNVQ+6qS9kNA3kSI MGRWdQ6Lf1ghPuegHGfjqwoNTp/wAR2c5aMKoQe0Tl3oEj+CMMF+qeI4UVVZ6Z7o+9Di176n7MeK tJjPhUeexa/4pupTHzQp1aaZE6ofQHPDR3m2iR9oSSiDAABNAUxCe3QFhuVfAuEA9JM8g+kwcafj gyq0QXSljr06FQPgaFQAPgahxJAcXXKPB/Q8uZr+Q/ehYgckoCjTKcuJNPAwtHuQfkgrlbCPOvWG FeaqIVIRT2OBC+Xp43LxFAg+RtSv1q6B4O3iaFAJhjAHhdejTrRhh9TP4yBvVuFMfFR81g8knLF5 6EO6N44NBeBZ8VN1TAK3VaoHcRQ+rFZpUwShBKd17NO42tQjCjX+zObiG5k/q9G5CHWzr7MJ9+zc ZvlmfDZ2FasZkiKzLFeGC5Sfu+BcBIQJH0A9sblAfjQDQHnqnQ9cP/lzER2XM15ZF306GdjZIuUI z3sP6qcJFR6Zy7E4YTl1YN46G53jHk40joxSeX/sDpxoTBrVP+Zoec+uzON+on4bd64r5ct7KnHI c/2k+15LfOMYj2vZz9gd0sTO2CEx9+4TOODGYkuCCW3JhfAh2tF706Z4tCNJu9UyEUocEgMROGL2 6U8wHpSfAxbqfQq7Ty0EYTjQlgitCDHtth91MY4NBbolqPDJHAgllmpXpJaQFwSjFFJQDhyEErMA hkKLdvuV4AgwYITdneEZqXfpwMrlMe+YEoNhe1HsRGmjJ6uRViTe2PNfYUq6dEwZzEaXCBNaD97h oFSoabK7oYW+zUIo0yZmBdVM25iC2xRKkFZCUyiBQAACjZNLiPYgKv9Sp0QYwW6IGY/2bFqh7YBQ 27QAAkEFvBzgNIQSCCNsHxqncJTMGbh6z9hhAWAazCSw47JSQo9d6heCjibQBviwNNG21Hz7NAbs rDWFDbPKqj1rdRivZJ4OihEA0KAIRqEpDJtVWRWxQIIYQgoEE3MB5nZejM6V/+OkDe8/kG67daeY 79G0tFdaG9JAaOk8WoQTcKFtHEmnK4KJlnZ9KgGFxgwfFMqAXgefREYBc9HxIntW0DT9uDI0HLXT gSrkZmiN3BKaZhnRt1zAbZT4ZZpxy7QStxoMpYQpi2ykNUZ79mhXVI4gYzE7oePh1koc2l6KnmbX cCpifv5c2Y224KpZ9zWfbalvmenVYF2usfzbPMfPTT/ekP7kis1pc7ohta5o1HZfFfd838ito6YL JJh+1JkROFEbs9+f2eWq2KPlH+iHNRXmqudEaY/zD/OPzomeP3lzPf8T8Q+0dKr5B/uiqPkHNkIy /1Bq3s11lyHs8zcjBIkbeZFrVPujCB8UbGpobveiGyT8SyBwCBBNN3jDA6GEBRJ2kNmvecSaFggl 8FFVA7TO9TToXuAoraJ8mhsllIBv6K0L44uz8hdBEov1fpkXDogvYjEOlNqfsUAXTu2bSjyBBRLg lunwGNRHGv4k2lSveRVwAeg9tNlOspPoMV94mFWo30G3M88AzUbQAB0Nv1rq91LxECzyLYygTnDY 2ICnoDw6D20SOrifLfkGC7wlC0MoEfyC8Cx8qHm7wDr+TzMfXsaAT6qA3C+EBgCCBoC+IZDAMTZg jY42mepiaoEZB7xBHBkvHgMhTlIeAotwoJ2FEaTFL2qp/lgoQawUShDHefZCeF0B7RgQSnDa14mE EuB24iXYKkihzpwXiEFchGC1KFf807yaSNMHCPX8xLrKL/s6pYXGJIuNXJa4GQ7Xw9W7G+Vk5vbK +hymDpghlyNe1cfr3mRRXOpn98rOR81cqJvx/DW5czymd0Q8NizwYmGsdwaCz48TOUhbqXqcFjg5 nzvHnGKZcAzWQiDOJAxTw7sIOGzGhzTeTccJA9RHPZSjn/SRdtnRwwOzvW+THhO9cIRU3Z/K+913 fdRv4gVDTn6X9tw7tHO7VHb65RFmqPrjDFEF4jhR+mPniEdG1DZtCXxl3Nw2YfpdgrUBGCeWu+yw oKrO/SxSGmWwVQX4dut6lW+INhQBD4dbOLizJ3RMGuYCjwF5s75/tXfanj/3r75ZA6b5/Mvn6j6X TK9tO2t1SUlpGRPSScNZ6ZCk9qjQAhxLVz67JXqWC4SDJgQLOi/uwPUCr1cLTJ4nOOD263ljKmEC 6jAMg5kEyhsQQNTfjohlEyyQaKY73iZ7VEvVnda8oj1xnPOqLIQAt2QuZpl3KM9aEggnLKCA3CHi 4IqdqAFCGAv9xccLYpqaDWgyWJBAHoBpRgnkWzUTocRSnZWOPwp2UACra5ZlmmG3gcAAQQTMQQkQ 52VK6JCHcfw5IJxAKBFCFnxn6MfZ5DxvFu2ACTiCAvAYf6dZRRNtCGxBV2RBTVWyEkqQRxkLSiwY sf+Lkz1P6rIgBM0JM3puw1d2QLBLhVGi/xZG1IyTxgNNihJs3oF6ZmkrahxOQEEtU5SsdliFkMLf Gp79DR1irkf1nc14/3DOY7v2r9mQtj6plRZ0PiATBTGZUoluC8GE6hVZRTZgYQAtheDi5GvImU4F /1AJFWYSqbei2VxLfsN0PdJVIJxiqgPstFVlKFeV1RdTVhlh10eEcDNO/WUe4TItMuf5Iw4kTWrX r21KizCJX4/KeL3V0S3NrCP6trRT2SYGW4Kl6TnsrOep8kdOhjaZfpg2rxUPQDq0zvRjwT/8dlrx 9xW9g0Yt0ikdK0X/oAH8jucfPp5eu+6zdT4dM/9w4UU6TjaXn49+PDr+4dPpjWd8YX7+Qe/7IvE/ 3MePwj9MTT05/dmtf5S2P/c/pI/pHj0uQddVF/wCu7tB43TvhH1sKvfJ91bS95rOU5ax09g+zj+c Xv6B54BPsZJ/gK8Ifk958A+GH5d/6NPGh/TioprYuHCF+YqGJTCp+R06FnHN96sX6JvT1dBijhSv cEC70z1r1wTdIm9Ytv1HVEe3NNCWZ/7Dpp7wMIdWr4oqMPM0WLvBcXiGXdpcwawDU1AAzUtgCFbU C9hIyX9Y/GLGoPeUxS+LY2jwchbLOp4cOg3NR4sAOrp/TPOVirZtOiOtOuvs4BXQrIRG4X8q+AJR uwUyB7XmJRsd8BQcCZo2bUpni65zBLb9SiH0sc8nd43NKW8akEYcLUYAXGhz29qFYaoZmwjaMFmg HyYUHaoPfPuUgp/A9BLziH7dA/wjfqk6ZS7ZqzjiAfhHwCYcU/It1uwjvidcZyDrjzUrfS/W2IQf oQ9u2/i+oom5QnwLPA19w/yUTR5O68BHFv6qDJh/YsqxYcvCWen2VWU8eIbDOkkI55dPWLV6lqDJ OFyl6Frn4VsC31QdMudFqxuhBKah+Kw6UwKU8FtVFi7CnaVQokivgpr8vAA6Lu8nnGAijQCgBIQC 41o0sIhE2MDkfUDSokH9DumlJg+b8CMaGLx6d0nlcVrXMV4+MQgWKFhQAeGJnwYT++hO/ZZoMcOu 5RIxsCxSe3p60hJ9xKShZlV5BHevYFZmc0jEm/029s/01c9fkx3AojEIpxZ5ENEOjUu4IFc4FvF6 BhDL5SsqqR2MCsCVfF7uZfoIqIPyvHvBzOiZAdQPkAZDAWG2TSbpsSDXFQIfDI+uQaBzP6MupfH8 Ih9ctQHQEz5wFuXU3aXnWIPKmGlwmgUUjlPG7bPQ18tUZSm9hiJsvwTkURcLU8aA98d95/4YhxJ4 f838wLAgUKAcZUIokcdILtjr8QshQtE2/QT87XKlfeq2nwXC/DxOjN1xoHqijtP5/NUHj30IJei3 +uLxRmhDP8t7JJ93CEDIYMEQPh543oyrhQ84KyV8JN8f4ZKZoA4LJQg3wYIK2oAMw5Dwk+JhqFSa wFMOoQSndpSAs0xULv1uS78yGIymtoRtQ33kV1nHbqneLRPzgvBhLiA9pOqa52aBCACAw0vUMfvF JHT26yQHdjvwyu13STgWSIBvW1E7s8JOdASTDgGqg0t0DyzI5gKbX5BnoUK1i1H1DUYDPxIIE8Ct 8dUX0uz8EoaFOD4pnEadaFLENffdOyp7hdujcQ7NBOXZWZWFFPQWVchBOSI1WDiAAABmgjjh0FTQ FUJuD9cuQz6saLvGAWaqCRZW2HmV8y2YwYwEJsRCDuez2wL0qv4SwGPnYqq3Ej6UeYQRShhCKKEx KJ8rQolw5IkKq8YFvxIwDz7WKzxqs8tWQNiCThxLfWLEOjPD1lKfmYt7xVAs1g7IOJpD6pfnOTPq RTWPKThxdDAN7MagZanohr5nSAPvoP6HCMAygFoYMFdzldZEjToXygnSmnS8Rp2Dvtd5CiDQiY6W iY0wvIehbGcuPqHEPb5M9V0idEBYMqXjVNev7tPRxQvSfXcNpnWrztecr2+ttUv80RxzvCt8jNdH RT9e+6m0/6pfq1q67oq04Xc+k9LWd6Qb/unydHb6cnpj14vSx/SOVvzDy9M139yU3vVLf5y+P7k1 vfO716U3t65Kb/7Si9L7XvjV9IK/Oid97t3T6fdX/Wb6mN75trZXp0+OvD/l2tP2/3ZpuuS/bHuU /MNvpg/ueE/6lXR/ev+/+aX0f3zP/MO/Sx/5+nnpvz7tHel69Xpy7FXpyzI9Kdt4zju/r4wZ/uGp /+nb6StvPKcezfvf/2/ScxULngN6Ovlv03/fd9WsOugnfExXplEdXU9Lf/z1z6ffOzulr/zBuvTv /9/H+Yd5+Uc9+9PJP/Agm/xD8ARZWOAH7U0Mx32dj39Aq4G5s+QfXMZXBBAII9CwnJRt/6gEJPil sv8hhBIWRlAGocTweEWTVkhtvrN7SZo8LLomnhuBRAjYVSZwResAHGfjo6rsR1MoAd5hzE5FP7s3 nhUCCXiIvWgFFJsW4AG1I22FwxRUDhaZ7dggCLqcaTe00iLcdjYV2MiQ8+6efEw1dRnCeTaal+vW 1kIJfE8dUT/gD1YuWpo2iWcohQZe2IegQfftvKYAgM0C02Xa88KfMOkAmxFwHiskmAh80UWEFggk +LHZwYqCK/RVRDI2dVYqSA0hiNA18nTF10SvrvQJfgAgDLjfEdEf0jFBgUegfYQtK8a0CZr5O+Nx rXxgtaeFWSgR/dOzLoUSCB1CczL7pKKeUljRFEpQ714Ju0bV540SSvRLMDeod5E67KfK90XaPuGT bl8SPh4UoQTHhU6PVTxLu9bW80EcF9pchLEQ8CKqI0+W81VwutIh1iVBdhi7q306kmr//v3hYRYv szhFQkBBvxFGhHYEaZmBQHCAgIH4qPA4y3bzhjNCgEB9rpty8dPHOimHanUOFX4AACAASURBVBPa DToiadyQhBz0hzGZmpgOQUQsHjX4CCeWSaLHgm+1JI8rV/YpTTvdOl6tBvipxv3UeT9jARZ8aBiw kF0kAUMcb6WPgFM5uGfSDUEQNCYsHhkbL6hhYFmMsdOPeibnW5NvCA0G5ZHmcryiJQ6La0o4jboP Z3wlRnpZPtKEDx6/pq8M10O9LMa9gxPp1EdZ/VQ4ypd1E6ZO3znvGeBFfURUAbWAV4JxffW3Fnam jTFwm1aZxnmQy9EvwuwMOa3srxfeZduMCeUAl6F9wnw/tOd78D26Dx5H1+f80/b86af6Bbl0vxhl +uox5X1z/xymf+ST7jBzlp9VJOqP7XrRdmBhNSypMospCzPwJ4G65ViXnChKeAFEnnDKnRBUMe3k kmNB+eHkEgeYSzU7a/k3S+sijgITAWbcEE6Eb4mofe4/dlpFLmG8bIc5h4USCBUMMAUiKji+A2qf EyXBos0snMOcYz3OrQzqE4tV/EzMfmv1DMo6qDsLguqdeHaKVd5E3wtvV028S4IQtCEQMHQMVMQX ocRSMUkwE+NiRCxYcDnwg0FRGUw8LJSoBRhCpG4LNlzO11CrZJcGUF0wQsCQmBrUMft4nxgT5Rni /O8cscCA63Bm4rhHp/uM8OlsGmHBh+uysKLU3CDMfU6pL83dG5drXmnPGhOoVTLuCB7sHMv59McQ OIoYlyuMMcxJgPqwT/UCeNgGVijeIakNDqwsrCCd40E7RN8QSHDMFz9/+wj694gG8w0yf7AoDVpA wVMEvWvPTlsu0A5V+3YJbyvB/lQWkNLzimZXAgB9tvMAmgnKVLly8V8iVzVU9LlMB7+k2bTnNK7t igezrUIz/VG/KJcrMl/helyH07na9MRtG5e48RwGFyhxiMeJIPQvhLCKT2mjZlSLiMU9adudD6db bjkQ/VWFoJ8WMH/g+fl4+vHq9Lnnf0a80v8a7T/tz29L3/iPd6Q3tH4l3fPGxelVW25Pf/L6zvTx T2g+gn/QYma6pXlcfMfBy9+aNv/fGu87rkxf/vdvSCt+52Xp5qt/GEeF3qB3r7Pz8vS5ifenadWz +CNU//T0F3dcnz78w5502Ycr0T/9mZd/eP2vpo3vfW7quvNP0raXbk1/9J1bM/+gRYc0hSb03UxO vjZ9QUKJtitWpU2f7Rb/cG76P799XfrI7YvTyz5Y8Q/Pes+29JWz36N7/JjwX5muvV39ftNX00fv 6kn/7u+1iJn6rfTxkavS1OW6lw8w9f6r9K7br08fKuqQ0zd1/9fSps9fkha//cJ07bUvS0f+5iOz 6Dd3+Dj/0OAfTyH/sEishGpnmGs4Ef8Q/qaE+aPyD2hewD+MZceN5hXcqLUv0ZKwf4lzVq+LbBaK rJRDcKEUCzFGNdf1aNN0GL9IQxV9pkCv1jwADrRDg4LTPMQ/wDOEzwJVh8alT+OotS8zHzCYfU6s Vx0IJR558KGob1IaEACbGfAMXPdr7bRyuGsWD8HGRghGFmdapDLTi7XYl78FTBv25KkpNiKkHTGq U8Ts8PLg7gE9kBm+h1O/zCdAV8/VvUGH8Q1lwGGltRVJaxe/0g39zHS/3kBQ+UGVBUyzKTtR0Hzy 7Ayzc+MmoiFMwByz5A24s8PDU2GGCU4IW1RXn4RLB0SH4Q04lhvgntsKTUvaBpr8RCTqj/1LuP3Y SNGGlfkSb6iwidEubZk1KoOQAm1LYG3mA3bkNMr5NA74BHxGnAimVC76LgsLhBIHHtkRPiRaWdsG Z5dotnDFt8RhvdfmHajX4TMyL0pae6bnhJsgn0mS1Co1drA1yZcMvhctzUI/iThE2JoIhHfs2JHu u+++9MADD6S9e/eGAMKEGqJDGCED5hpLYNhFhKcmtSiWbSqOodq12OiSXReCh0ceeSRtX3J/OnvT 2ZEGA7AA6aU4ikqI0ZGWdMm2WTuvboN7jjw8hAvfzMGoJIkwavTp3nvvjnroT592ltatX6/fuhBc dLapj/rHkWMwEhVb85MYyR+tjSktFgDuoVqgoaqk83/3V+9G850o3xfKecFIeix2xNwah/x431Q3 4EUnbQFcwY2f4mU58ut4xkM6h+1llFYaV9cB/lyA1gEAk13WV/WgKhHtqx8Gx/ErQSO+ci/BkAu1 Yk2qEnW6K2hcYeRdJ1fGtBwD0COfPipc3hNjRl7gq33jRkB/yDOU9+Q0LyAo73bLMjC3gPtDOPqS +3w6nr81PNRo3X+3SfsG99PjYRzfB3iEy4USzyKAcVF4WT5yMtQzJXi07WcqNC0QPMBskNfVURGt ckdkSiqK9qjNaCOUWKQFHCPnHWTahNEADkoF8lGD5iH7l4ijv4qCTZ8SoSkhoUTNRJRCC8rBVGSC Z+dV7HzgTVsDVdQ8E2wKJMgpTTlYHKM1AR8xKKEwMKldgtW5PhgFQ22iEf4iqnS00FC9rPOKcqUO BoIIBBcAQoioV0S2bd2aWuBBnoUUhAEIezBA6ifAeeQQ/bARVdy7EuQhtPDin3gJ7E7MKOmqXs1j aCegQQFzM6LdItpekftPWZgHBCP0IX6ZGQEXgAEA6EPJ0ESi/mCnSt/te6JkOsBBKOE04k1tCXvT 7iUzA+8tzyyYCqnbciwozi0RWJSCCONzRShhD9s+exwfE3xvCPMY2dBosrAqa7aVdTzW8MAD29I9 d0lzSgzOqMa7rU3vAJpBetf0J6qHXgNcc1KOZ61FZYASeRnXtLuWHkQJ6pjZCHG9OUvl3V6uRBkl vvG4Rv1c9Yu20fAUzY8aGvW43rpcs2HXl9Pdd5fzleyOTqn9T0sApoX0uZvWikHWyRcyYdt09pPS wZFv0oVqoGjsNIDpxbz04xnnp82XXiG+7a/V+n3pvZe8J933x+enb/3ZP6XN1x9N31Tql95Y8g/V bNChb+V1l12ann+pnuV9V6VffdaF6eM3daTLX5/SR7e9J71269vTba97WTr3fc9LV152NB1V9fe9 95J08evel773oT9NT//w29PN+X5NP0xnav7hg59J9018M3jg+9/3X2saNGuY3nBZOOm8+iX70gNX pXS/2rvwNe9Nt/+tThf5CG28Jr3jBV9Il2z9SNDsV1+rjry7K2298z3p9nf8dpq8RsKKV74obVbf /vJlupercx2vrep42gfflm7KDXbd9ul0z99en47+fh6UWR2pNApN+7iW9M/PIfLhFVTW9JJqHucf ZsbDY1iOH7ydPEvVgtYT8Q/WxrVRozU1T8Y/2OyUOdjcmnkFnhECCTb2+OE3Ak0JwoaWnDoikCAd KM0/lrCpIhoCfUHLwmYfCCQANnKB9VqbcDpHCRwXymK+hiyUII62JRsbwT8g7FUfMesY1z0AmH2W MBcfQZ9w9Yk56JGFGrWCX+HkjH3S8mIjwrwB9aF1WW1KaIEtusXGBmYc647o2OjslNpCCE7aQIsP AcAsoUTuo4US1AsOfIE1LBFUmB8oy3pjIzRF1W+bYqLBUNJi6oTXwHQDgQSCB+Z/WMChLJxQsAbM P0vhSJ2hgNPLNHxi2FwSDQt4BGtZlke5t2mDvFetWgOUPsK7mH8dFC8awgvhzQWhdZkzzK+UePAP 1vLuk1ACXoK0pkloGUcoAXA93F7xZcQLnXWis6DTdudMWICd+HHFLh/C8JMECD7CAAsldu7cmb77 3e/GD80FBAvkYU6BpgLaD0wwX//nr8t8YzCd+8TzRIw3Jc7fndDxWJhwjMjOH0BNEgEEGhb79u5L e2V7tXXr1jDHAId62uXsDS4ijvsSI8SkjkCDckxgixa1NEbVrjraEv39/VG+Q+Uc5uMfOiCbKr0E e2T7tFxqVavXrE6rVq5S3zmfHDalWrWYuYgO/gz8GT48s4jinWCyZQKOxaPGotRkYLwMDvs9ivS8 KCwJYxPfca7U4V+dTlrOI60kvGhihAaE2gk/DRm3LpvLuW+kxy647qdMK/EJuw9ua6b/QebViaqE hTCBl4eiJmRFpWVblAHHbVTvlAiU0gN05V6iTSXA6JX3Dx55lKvLFG3N9FWJefyL7AiWwolZdahu O9kq6yEct0y7+rk/ZVmHf9TnH+24g2o/6uHqNF1Jo97oR74ntxemMWImxiYrgU1TKOFdXqrjHjDb kCQxBA+kNcHvB6sZ3v1S0AAucYQSAJP9MX3KxI9oRxnhBDsgCwvaDh5HiXZrEl8k4jeVGQMIRNk3 8MLcQx6SfYIH+Edk6w/YEZWdWNlJ1SHNeUCZzg6LwU4vqQUHVtiRao8i1DKdx85JDRXfUkdxXiU1 nYiPjM6wH6h+MouxOAc47gs7RhxQAU4njFABW9bxtat0oonM67RDhKPLOP0hlwF/ctHMrgjl7MzK dYAzIWHFBOYcKkf7QIspSwRyRLcF0zMkAUE4txLzYCEFZ6gvy9J9VDkRIvhWS2JsL9fUg5dtAGFD S7QH8QK4CDmGdL99CpOG4yyO++I+w8TFYcZGfQjcNWuiHhgKfjinKp1YwbS1RMvaJBAJZim3i+Oq lt5XUZPagZWyEse4ctttaG5I4IDzKqBfZ8ZHuspg34tAIux8sQGWQM0nbnDs1+6s9bFcdrkIsIJ1 VZ/3a5caOCLmBSEFwFvG9wfYbAPBdf29RM6p+zN+dCq9/DdflD7xxWvSngfUs7YePe/OEDKgPDSt 80JZ58MvVCd0xNs4qwMtIYQAoXpTIzyDkD/iqhLRe+gxAo0KI19m0OcLqXy0rIJVGfUrqqrfzuAl onhZKe0KoP/mAbjS3xLKuPHIL9NpcFqLhanpcW0ytaXNG3tlwiEnmA8Oprvv3alGGLdyRi1bOIXh E9GP7/xh2rr4fw/68VufvC2dlz6SLrusanvr4renp71LGhMye5tFP3LX7rznveny51+R0hfuTZf9 p+3pnC//Zbr55s0Sb5wXGBc/UeG7L0wvesH70iWLt6V33P7y9JS3b1P+FohHTa9A9jsM/ZjhH/4+ vWzxNSm9+tp0+wWNyVtlOEnj2Recm+6988L06y/5QLp03bb0ln/5jfT0/3hX1QYVP31L2nzfXSEE 4V7+5lIJX/5U6bfcle7X86G9p29RP++6ML3kBe9VP+9SP38jPe2td6qOC6ihhlbrlvT2rYvT25/+ Lgk1KvrnzMf5h2okTP9PNf8gA1cPdfBpJY1u8g+lQMJCino+1Lc8H//gBmr+Qb4iTgbmCfaNs0DX DreEEpiDcux4pzQQMRE11AIJJXBSFlpjPcpHawE6A03kt1y/EloLlSf82OhQBtoTHJ0NbZgLYoND GTYDtbYEuN7MwAwU6NGah7R6sWuNS2ikAP5BDFEaX1QtYiOx/CP6DmzQdSW+NbTwh9NgEW9hCkIJ gzUXiU8WG0PWSLCGAj4vEGwgtIC7QbPCZRFKsPg3PXbf0UAshRIs/CmPQ+xqVVf1ok3OLjkqVNR1 FnhDwcIR+uT+zELMkcgTH8GpXDZDQQhCv3B22S9/FmyY0Db9GszCCPeRK3yK42hg4lC75HvcLvfo dJshkdfUqMDXBIIShBIGzEI5+tZOL51ebm7gXwLgCFF+80HFaSi3ZPqZiFmgQMqswjtfBac6HeKL 4AGV9e9973siQDene+65J2zzzzjjjLR27VqZTKwOmyn6jMDgK1/5inYF5PBFH+jFF1+cNsghEvUg xMDHBMKJYT3Ynbt3SXXoYFooQUPXgi55r96TfvjDH6bzzjsv2qw8fUt7Qg9nqRjyPpkysPBBoEFb nL+9V2UWyOCVdvl1L+tO62X3RD7CjfBFIeb/zDPPFK+8SO3r+EAxeoM6w3e/hCH9ff1pzRrZSS0Q swszo99x2hPmaU714D6K+ljwMvYx8esFWNSjxZEW8rrBKM07YaLQrM6LaNIZD8Nx+CLSr/zEofTX EO/nnp/edlPWAFCBGlc4tOn2qM8/cKJ2pdFfmBl+LJrBcR1cHXZf7LPC6XU/c3vguR3nGZe+0K6Z p8BTSimMwEEmEvcSXJ40cMNcRmNMeRxhWcBBfghYdHUfos3inup0+pvxuJZtEDc004mzALZgo85X utsm7zhQH2ibVusyxyFVeX42dXbuaxmPOnKbs/CVFvds5Bx3NPqgNI9D+fxJA/w8PK4eQ/JjB1lz gqSTsesL81BCpSUkIYMWXU2hhPFsAsL3zVgiiJgUVWDhHMIH+qAJemnmcUcQWoiAeieEemB40PDy UWCkgWMGhDD+JkKNUwS7FDyAGx61CWSwoAJfFABCh/6cF7sdCvfnvAU6y3yn8ucFmIlSWCFEhBI4 wML+FKHEChFDgEU3x2EN6N456ssCCTxj2yu1j/5CeODTOPAhwULeOFFZZj4iXBA84pXgYvazCjz+ 5HIwXRBvxiyEBLoiYEja2Sd9wbrVQditkWACTBUAAgcYtiijOPmUgUGxKQj0kB94AWI+auiTLa/Y gziTHAaQDOH169eb1Ta9y4FQgv4aXB/MBu3CILATwjKVHQ4chzk9BCViLgDSe/Ws/KxDyKB0e72O 48D0LoW37vxdBzOhsUegEemEAeXjXRstQLxqN8HfPd8FMwRMOPMpYGFnRE7Bn2kdc9kxcSS94rLn pJve+Q9qZ7U0Hy04YGQZmUo4IVIvQUVFNL24LxfxJ+xOVSz4hUomoHpdfc6bszyNFkB7EiuInusq fiHqit1H4alK5dT/Snof5VQ2+ADqyD8LHriWfifIL9OIy7OOzB70PI50puc9a3n6V7+8LA09Mpie +OQz0+f/54F09/34EpKXdeGeNshzOfWfjH7YxHauvvCOVfRgJvfmjycdF9rSwl8aE186Pz3/idOa vqvJdVr4N751S7qs8/Xp2ve/OUn5QhoTz003T14YFYAVdWb6VdMPcpVW0g/e6Tj1hTzBpPxI8dSA b73l3PSC9Ib05avfkL60u2rjxtxGINz4trT1Zer5a65NH02vlbnghekzRz+fXtfzOT2vqq83v31r epk0Kz79179f9/OWVPWzvfNZ6T0y63jilT3p5ddUbUa9+uPvjvjj/EMMSDUm+Z07lfyDeQfGmjnN PJH5DUw5A8Q/sHOM5hhCCUxBK6NBPSPxFE3+wcJcyjJvAta8nBIfYY7L5hvkOzzLH5XoAk4v2QBJ +q2XP4Z97XpLMy3BlAP/FT2a89GWkMgC29JacLFcaRFXsoUUsckAvVLdCCvaZT5qQGuQO8aUw1qX fZrjhrJD5bnMQHvhaVXGQgkLKVznia5Bt0WH0JJcXVHQSvNT/BRQcR3qU+ZfLHRoChyaccqSZm0E h9GywASExb/LgLNE6zYv/qG78ATQXY7YRluFPADegAU/QokSEEr41C5rUSCkQHiA5mNLWpTgWEhR tl3WU4Z5XmhborUxobrSOjly5zlIg8bP3/wFvqoQmNA3rgbCTfNP5zWv1rIgHV8hJfVYJR4AQBix Vq+cTUHhaNCW8AYIOGhbGk4kjDAO1/immfg8eZeZLMptb12mn8qwCTB1mnBu3749ffvb30533XVX mG4gaNiyZUss9s8+++wQCECs+SFcuO2220ILYr08ui8Xw7xunUwoFMbZE3XyYyf1mAZxn/C/ct11 YjQPxMkRDz30UPrSl74UmhcQkLWyz3nBC1+QVq5aFUIJ7NERlHBFuLDtrrvTMmlAIJRgUiK9vbMj bXjC+nR0/Fg6Nqk2hvanHTsfif6h0YEgBdMOTD4QTtz+gx/I5qsvbdy4MeoOcxHRIjyLV1zRqRzh H70uq2Mu7ZOTT937sMYOAm4C6QVgs+ZqqVwsqlUOMDNAmEV5V8e/TS9te1Pq+t0Xpc+JLnfeIqbi 9i3pz6WWebPG1O1EWcqr7ePaFN6seoVjhsjv81zvtBerUbfqUGNBfKgrPgYyTgT5JgNfZSBkQcBq 5r4ozP3rV/aTd6YEFqjub5leliGduK8eH/fB8UAo/jidkn42ZDNNMK1Gfn5GaiAEO+S7bfIJ+9m7 PnCaQBs1EdezKGFW27kdzmUG323U+NwnfeJHWOD7JAx+2Q+0utxuaBwIpxzTKEtBAeWGtVMNoClG HuD6Fi0iXqU1GZRAzH+MP3a0OkEG22XvrLgPxufdOPuii9IKzUcA5zsDqGiighmqlpGiP2IK0LYK BoFdkAwQnV27dkXMnrXDWZW0E1DH7JE2FhoJpCE4QIDwhBzfkCXUHBNqp1Yj2kHoV38WiajNcl7F kVDsrAta8rzdKwYkCFKxMGahzg4DfWSHok02ohBgWC3q3ytGHjvRbi2WcU6FhgQOEx2mbtQxgVDb lKomviS6hQOMSyhivxJW2yQtnF9JW6L3zDMCj3qXiAACC2SewxGkveoETqYg3HimjjwJd+zXYb2E IeGoas2i1Kd0xrX0XA0+jiIN4NrjNmn9ut8+Oc9kF8k7F3ZU1Sl6wg4ITM1G4TA23dop9W5Ov+gK QF+Yz1YIhyvlcWQF2IM2OxV2SIXXbPrRlu1J2R2xZ23sjNevlqBe9Ag8HFjZsVVL9AvmwI6sUFt3 eKfKrZQ2xFkS9K+O3ZYZhg8fFFvOPVftL0obFi5JSyRAHxVdw6O233toAiq53iXkHS+/l7iZx/hn We/69MCdt6ddD+xNT1jTq+9rNHUtFVsqElmaVz66ZmYv9GbKSDuzkkbMJM0Tgk+peRXxEwG5LPxF lZfT9Q2AUldNsroQvAgF5+lOXb9QXGcplIiiuVJwwaEuWYbKhFW8jjZiLrnkjHRUi6fxsem0+ayt 6c77/zEd02Kl032mktMBeV6nauZV3hV+hB8N/YBhb8mnhIrEd1F2cfKmt6Vz266IpLVvuU6aDtpY 6qKEyuQ2InKfNBHOf1u6MSLVgp8g7Xuujyz+HDf3i3+gTgSZgqr/MOP6J9yKKmi8739/et5T5bBT 33dn50WBy0beZOC8Jl37ks9KQIHxyM3pFW96abr1z56Y7k3bAo8/CDuSBCzPPf8P0y0q07X4KZE3 NfYv6Ypz29LvfbGVPjEtvxUfcRE9O+H523ucf6j4FPMPwasWC694rrxEhvzsGMPj3gHhsC4AeEc4 bS2EDEozn+jNrkDKfyxY4FkgkGCTQy9kjfJo1kzgMP+HdqUW3aUpR11REWCjolvvIkKJEsLXhBLC tCMLJSJf9DlANM5xhAzQbegev+AzxI8P50V2hTjzF+1K+IpuNiHgbxcdixM5OI1jpWgyDhwx5xjq ZIKroDdJK1N9PczmhsBaEiFUVxp8Z2gl6t69icECfY1+mD8ArJlKQGhwkPuAX1E5aCZ0timUoAwL fPBnCRqizOxxc/2Mg8v5pA5oN4IH6kAYsUBaFYQB6L7BZh47BvdHEvcBIIBoQgglsvAi/EsI14IL cC3YsOClWZ5nhXCEey+B/hzQPVgbwnngB4ieAwhAOniOGbzJYa2IUghR4hBmk4TNEfOG8BHjxcYR zrJXiRfDV9VUFkqw+YFPrVXaXDFwslcppHD6XNdOE5C5Mvko/RHOlX8q0yCyaDdgtnHTTTeFwGFg YCDMNbCHQlvinHPOCYEAphgARPvGG29Mu3fvDnMLFv+LxDT29orplJBhVB/CAZlUQMTBJb9fvxX6 7RSjv1gv96ZNm6IttDI4aWPz5nNiEQCjhTYFu0cIIdZIFZfJ65zzzks7d+5Kd//wDn1AlYfyMTHF S5ct1aJbzHg2Q2lHiqn72S6fGA8//HA4x9wgh5tnqb3RI6Ppbgk4MFNBWwMtEPoIk8Q8BzH8aUL4 bdD9A5xqwCQNMLHPxYB6EicfDQCED0zw1iwwUSW/mrQ/mT6XHkgTfyhGYuvrtbPwtnT3JRfWtqA1 AaFZlanjilKX66VPBp4N4PeZK+VIJwxjbiDdPy9qHQfX4LCvpBuPK8CC1P2BfSlxCVO/ccE3ISTs coSb4HrKsk5TI7WgoU5rVEB6EFXdPz2N41J1RdiIRH9S3wVQ363wAdqjLOOFqitAP/mRV/YnMvUH fPeD8Y5noTSPrfF8Jd34UR9jSZoRqJOw0tym8cu2CvS411IgAV5Z1mPt98RlSQcX29KxWCCWvaj6 0EiJotQ9KeFGsz9HpZ3VdPb6g299K50jTS6g1JoYqdbOs9LQkugWo7Jj+4OBjwDDvia6WdBL2+He bXdF3uanPCV2RkZkkga09sjMQPNet+ahANkqWC1TD0Xb6ErV/RrGhhWSlgOAkMI2n6GaqYX2ES2I S1tR3oap+x9K3987EMKPTc9+RhDX4V27xeSI0VB+S4vzUZlaHJXAIU7QEIE6kJ170Q4wHsYGVTji EjjYrhQhBUAc7Yqj2jmx40s8dnMsWMcDOwJnve4fJmZwYHcwKggG9un+cGblXY99eTcE7YOdIuBm zEzId+leSihP4QimRcNT7zqIIH9/QG0PVWPmZ0r7ZoRglh7Kwhp2mkhnh2QuJsrtHtM9swMELv0M 1dA9VZxjTd1XnFXRv+233hpFz99yQQgwdnBUmuDQWPUecPwXcMy7ewo3GRBmw1EE9ToCDBgXjfMu x17dw5FHDknFvNr9IH+V+si3g/afHQvXmnXKj+8YxFMEi5eOp4EHp9Lr3/yK9I1b3pfufAjnsfqm NSdBy2cLJ3jzTkwzYxEvrHLx/+N0NVoRkY7jQh9FBRYguP0ogko1FanbmIwGvc+3oJy6VpcRW1Dd HviU06+FikSASqu+CfE6fX2d6UkX9usdaqXd9+1K133+9rRjtzRftQiaWTblYqf4YsFXzIuaTwHP jZ5707OvTPfecEXCCOOq/wxNEdOrG4LfmPLtqFyFL1Vl/YtFf9RW/RkY1aJRE9ehQ7hErQoFnZE/ MaBrsfgPnGaqbvIRXJgG0zeclFO/3+Gq1menK++9IV2xmdivpaNv+mL63a6XpA9rweU69ILrfujn VJqQUJQ7nMxtIriIe33ti9Ollz5fG1AvSZe3PT994K/emT7/hWvSC9MPI5/2u7sxtsFdcUVLjx6d jDYwmYaD+cALJBz5wnS6VmdAvewO+jMb4InnAsYRukMb/Pg2SyCNm/R/NQAAIABJREFUPvpZOE7a fOBnU2JA36iD8q4ryqse0viVNLBsc752mumz6m1kznX/vCMG0/e56qBvHHVMn5rjQ/nynSjroRxx yuGfznnMoeTBEx+BXioeGrCK0z74sVGBhrbecfguCy0Oib/qEs5hCXzBXaU5e0yLzsmh4dCkoD9Y fWIminYEmt77ZSq6PdMra1pa69IbIggwgB0PPhBX0knDJHSpdtYNNhElTjqamsYjDY1M6BdgM1LS Htl2T5WoBbu1KDARRSszfFqpvTGZScJzhnlhFlBEITYrMA0VtMn/DeA44YNauCKsGNLmsTUnSCcc V6V/9+570rR4lT7uU9fAy8IFeCUECQDOKo8cHQh6Hwn6s0zrkr5NG8O85UDmrzBRRAMSYYnT4BF6 pOGI9uKInqvj1PmQNB2oB4ALoD1MOcM55rGJ0LCEjh/cNRDmE5RdLnwLAsBvacNi6sBh+XGaiPRD 2qzuPXND1Dl+YO+MuUuk6DZFLCa1yEcDZeBr16edas9AGsKffsaD41lDJ0P0/I67wsQGp6ctNpz0 fPhO7Hyzj50kwe5KvlsJHcATOK/WmmQzT2XRrhxSXxdq/gMw+WSjbVTrZhxeYsKB8Gsk53fIDHTH yPbUPzqeBuU/BLPQlr6/Kb37aHQuN58atc3+w/tTTSi6+uMrUbwrUqadqjBEmx+MBjuFX/va19Kd d94ZkwaaECt1DjYLqQsvvDB+CCT42DHRgGhzAgeCDNLRlOgRU79QH/diPfwR7Qp9+9sIOLSHpzYA BA+0hebCxjPOSgPy/EobaGNg7gGskmrUEQ32DTfckL7xjW8EA0RbC7Uo+F+e96/TLz/zmaFtcce2 O8M5Zo8kRD3390gDojdddNHW6BttdOjl6xKh6JYfiqN6aLvEvO/evSeEGZh+bBUuJyMg/EBrg3vE DIS+wnRRx08DmGSZbPnFzpjGar6JfKM0WSD69lNCf4/oZfVuNOX48V7xYwKGsFC3aHxKm1Fp/HJ6 c89T00dbvIoVCSTfEztJ7o8JAu0A/Xp2SK3NIMfiW3HwqC0WwGpTFdS7heBSH0DfXLfjkdH4456B L3Yq+gbKE+ShFpjMzH2EhQMgFCDk+rmShhCH8eH+3A+u7gt9j3ZyPmWC8VJdfAuUcxwiW99/vk+3 Rx1A1KWw0z1Wkak/ZR+Mz9VCCffNea6XuJ8/BN31qMFZ9wZ+eU/GJZ3djsV652N8dZ+UBdym3wHi /Gz2YgYCgR7EnlNeALfFO8y4UB5wWcKMP/nUBVhQU3rWps4mMA+aseBEF+CsCy6I68HMLMJAYL6B amYpgACJeEeeiGdkyPpech9rHIQPAh8b2lJdmpwiTRQ0BBNEbLpRZWCzV+1Q1EIJZdRCCRHYxA8P 2uqHBqa6CgfBA7ahmHdgM2p7Ueolj92Pg/KfA/EsoVe+ddj1Z/GOfMOAEyuYC7BjR0Rh1DIBBBWk +UQNmAqO/zJYGLFAc6mFES3hxFosa1ZEPfqDqYh3VhBCGNgxQaMDOCxzPW0XZxXOSq1xRH4V7CyK XRF2PazqiADAOyi1MCJXTNzqmzkpLj7qq1bFVPvsS5R9chwNChgVO65yGQse6JftReOkEAklfAoI jbFzsUzjvU8/wmhVGGB8ANKbQN6ofggsLKAIx5e6J2xFDbYX7RCjSnrpHBNmwsyv8WOe1bfE9VTD Q/cPp/OedG7adusNaeNZy9Pdj+zXt6ujfztZ2IlGxt4braKtAK2E04Ko+KdQBPlTSQHMb8RVqT8O VFXyt6p1dh1V+uy0Rxdr0zdW9Xc2fsW7qP8IItpxosn9y1SkjdOudM8IKfQOHxtvpec+Z31a2nE4 3X3LzvQrL/nX6YPX3Jm2339QlkzLg6+woGN2C6cmxnywTHMqG1mej5l3Y2GUGfmLXnVh+p8v3Jiu fus/p3P7NqaNGyWoFz5z67IF4peWnSWa6jFcJv5pcVqmOZ4ZIuge84W0GtoXLBPesrRA+UvEA6xV O909K9LiTh3ljumVTGo79Z50ti9IfWpko+Z8aCbzd58WRuyI8s7yi423ra9OL37gD9LK9z0/fWfL X6bnvPP89DHxlH9z3XXpurb7oo416ueIThro0FhT5xMU7+ro0U872fCpognPfHJH+sCLN6X/suVD 6eo39abP/o/t6S+++lC64tLutEZavNWiVLwJZeTEd6We+djY4ujnOtXZKzrKfX7x9zalpR86mj57 4X+T4KoraBS0zfSNfpsW+elRjk0P6B7ghXf3Im1EaP6lbdNDl3Xc5crv2DSOuqCZxiVuMF12OWsc uO2yv6btejDRd+qIE99UtzdrQniW++82nOcNINNy36d5PtrmHv3+0Ta48YwVjvYUXyrfdDi+hu67 3+T5PXQa5mrgAfBZ7CijbcmmG3HDAvH4U8obUjqmnb3SygM49Yu5Fo3qJmDWcVS0KXgErVvQhOjT AhIt7sPL5Q9CYWA6C/TRhERogPAA+gAf0dS2tMZEOL9UWfMPq+GvNO9Dd1rZ/xOamRHPNCMa4482 dHv1fqNBgaaEjxLlis++gGKuD9PQdfqOEBRo8cxR5ADHiALL1d84DSQveEkL00ICAuhuSVdXFXS8 wtAYqA4gNArYEJC5JJoG0NcpjUOHvmXMMThCk+M7Od4TrcRDGqdVSkfDotRyQGuSNLQjKAP9RguB q7UgaY806kGQQRnqPfrwIxIg9UQcHAMajQO9B+ojOUnfkTcYwtQiI7of5jHIw4nmyk2aTzTP7RQf yXigBQkMSEvS0Kd0tBZwbglPwLs1i/6rD7yjpu+j4h36VRiaj9kFmw5oVZ4lCbA3IKD3G4TjI8MX aMx4gsP6jWtzAgAXvBVZ2GCfU5GpviyVwgCbFkCn3p8pfTNTKhtHjet40KfohEofGwoOGpgdcoAO LELVbx5or1CqXCYfPmgDxxV6knHaY7mWjAGLby/AOXHjU5/6VCzSkQAilcS5JSYUz3jGM0JTAlVm 8MhDQwKhBKd0YPZBn5cuXVKdeCEhwiKpOyFhHNwv9lg7iFhIMJEdlcBhhB1CEXnMJhBUIORAG2Oj CAPaEd/85jdV9lD6/ve/H/2zs8rBwQPpe9qpwqlln4gwHxyCDfqCcOHzn/+ndLekeQ8++GCkM7Ef FYOHj4kFkhQt08TJ/eyWn4vbVPett/3/tJ0JoF7T1f7XnSQ3w80oiCGDRAZDzFpUKYJQElNVSxo1 5q9oq9Ua2mrx8VFzDamZDlGfIBUpRQwJEQQJmSOmJELm3Ex3+j+/dc56776vm6B0Je89Z09rD+ec vdd+9tprv+GrJjsNGOAPCiCE+kCAEpSLH5QJJ377X/8Tq868C/M/+cSP1UzfCTruGJBqJGjHwFEo WD6wRBriBnH/40em2hW7DbXBvTAAJZWwTX9oD6hd+GgjDde4J60PMEpb7B98C3GTvApvce5HnHi/ g08hXTDawBVezcVlYEWo8rDku4FN5B9txTX4EN/9k/xOGz3NrtojyyfCUz7c/+DvryrOMNkAu972 lpt32rUidJ/yjrJyjftoQ/g4JeWNeBGXcJ6alzmJh/9Xff7wDEIlzCc7tE3y/AlPBSEvu9670MyJ 9Ok1LTv+xe9lCghxzy8owNdY1Qj/9Ooqm6mHVkGq8t4z3T/anEomAgjEXlF+gBEIF/xCCEmBC/aI Vmqg5LhQzibnirZEDGiAEqxeIFwgTKQUcRyUAIzgxwRWP9Qu+TmpDBCgBIQ6pu8Xzd3hD1ARe0WJ x/7R9tIeK5WGGHnFXk/Cgk74wQV2bRf1YzkggT9AA6AEoAMUKyKxrQPtCOJAABS+SqIBEcIyd6pJ ASjRRZPRGOiJEwIMAktsn8Av1C0pJwYnfRVEBq1iL2aW9rOqkPinhFDASkiQAywSXiCEplDFjHCu aZkAJSBvM+VfTIApCGpoRBAnwBLckD9rXdG+KFd7uG0Iudm+gTCCPwQIgYDCj/sUsEgFGeIGKAEA wTFfEEIKJ3KwbzS1rM0KB2MDgjkTUPoeJj30B0x0QqB3Jl/Dn90H/cjem/Oademwpf34Rydafa3e 6FoN5LVl0ubStoWGGi1O6J2SUN/QgIBD/TVxVxR+TuqfM//cjSuXO/QkGj2/wB2T+sLEPl/o8GSF zHBFxjzrDfx4DxBI/CqAQTGzn/7K248hTSqR5UudlH8p9VZd6+lDcQui0O26Gsk82oY26KAe1ruz JlHLV9sLz75is9//VG2mVXS1Q/BRwv8K8V6kNnkAf5n88a5A9LFvzTI78/F5dnXPp+zhVxsB/l1+ N8HGntXTDrpmnn34/nv57xo7KC8p7xb9+9qTH7YVNx9iPc8aqzjX2IEKd5BZsmKlZKba7qfYqBkz XCZbuvQmO1jARLmEcg1kPiEFlAjinS3QlMvt5pLr7NMbBrpXTe0DdpK2uh08e1sbmPfxi7X4gJZG ybZn22hpwVLOd9+92svAWMIYNU11O3j0uyZve+LvTBwECMyYY3PFNVbKPYMep9uY9+f5NuUFC66z gzWhWq/3krGcCTYTrVHD+9iY3mfZtnqP8INoA+pLe8TJDkyoY6z0Z5DXi3HVJ99tsrhpvJjA0wYO Uogn4yVxIPjxrbPCGpo2+PHzMuqZxpjs339epqgjbyfhgP9RdtdxJp5+nods06wUP1XK8whQIp5L XIlLvag7v6zuetfi+ZFPDkp4GbF5o3jkz1hFvOizSBtUSJ97UHbCo51iTI92BpRgQQl3gA2AEhBa xaSPSSFpuY/wPAu/rNLXDigBMfmHAB6WyZ8rcgCgQ3v6Nbn5xYIGcV1m0IQw3QLKEeTYlgCUCH/k hSaghPKKo8qbAyXYEkp5ApRgobh+pUqr/J1yWQL5oasmsC5LqN25BijBCjtHiUJsEWWO1DHaPN8i GkdUMp42CIjbEAE68GM858f2B04BA5TAPlWAEp+q3AANEPYfHJQQ7wArABgIB4QAYAiKNLhjcQE/ l0P1XoYf6aBPtHiM/JCm8wD9WayTomjTdBtoC7bXRtvlEYvThvwC0ODbNXnWyi8dp9mCkdqE4J58 Ig7p+EG8c+HPAgWgBNs8ARwAFzg+lPEdikUIgIewF4HWG0+EK4sTKaERwQ/ZAI0VrqktCQxcds37 SkAJjhpn20ab1m0djIBXCkrU6UjYauWzISqP1VcX0/VBpxSdUer3Ze9jME8n1/jhZqLOpP7xxx93 AAT3rFmzXHOAOKyIcdLFk0Ku52nCD2iBYEEYnS4gBWACBMiA1gPbJDhTe/5H8x3x9M5cg1ZpmY4M VcORFj8m/XRE1BFiSwUaDA4OaMBfo4ddoY+uVscGcrxnpTqLZUI0VwpF21xHgHbUSz5XsgTlodzT p0+Xkc5Zbk+iXquLlK9SqrdoTDA4ow3Bjzwxkkk+aEp079HdenTv4TYxZkhF+30NeLvvvocDMwFO AFTQXpT9v00pEBUr++RJRx+DDe1LG1azHSAfaDZWLuIGj+IqMPjxDhID/rRPxCcNbn4Q6Hga5p76 Qzr3z/lEnPBP3dmwqLErTxdxxCDzg2lRnTyN/IhLvKAAZtzop96BAm/F4b0ifoG/ElGOQln2ucGm vHiO1Fpz+tfZVjmJ+0b+UaaI4vuh9b4FkUdNUlZ4exkjQn4NP9o57r3+SXjBX3GcEr64CeeHsPFV nj88og3gG88/8vjs8z/LHp3a367a/RJ7Xs9/QxR8m7RxXof4xuGNYAchTDK5QkBBaAaUCDCjWGgh fkutwEEuvAmUwL1CVuQZzF2Y0afZWh13uYQGVjZCNdIT5X8AJJrzx7I2tAjNiHwyzjqLb+HI3fgj bHCUKIYwV0r5AeGham0ubIXKpPoYiKO/qvMV9Tib3Fc98m/JIyV/OkqFab0GHMAJKN3CgdsNWrmw 0d5WCCTmlIulAmVdNbHb0TbhnIOsJxGhdx6wkveaDmx4B1AByBDWt+N4MICIFICoQZFU9Q0/wIoA LjbzFXI4NhIABBoNsWViheoZfgEoUFa0FMI/NCvgEis3aCpAAQyENsNKDcQBwrgmiKdZ7/tsEZpQ 54QiL4AKhAryA6BgvclVPPWciBvaEqRpklfxYC034YAVrJ9QHsAVVs0RSFBFDeK40BD8wo8rQgpC C4JJCM867NRykdMFjIjvhqwkvGweHvkVtUu+sVgt5J3X2pSHcsR0XXR+Ren+U+e7U8fLNkkX69yt 1J645ymrW638dDxcQ7kAnBKttOlZ64vVuMiUB83LGBtjnMwm+gpqQjGGZt5FgU1ifgFH8WD2BZJ4 FBW1UFqK4I7wkTsBPqK8HqdBAnopYIyOyNZqe6lO26hbr0mttg6dcvJ2tlOPDjbhuRftG4f0t7HP LrRnXvhQ+53Vv0n2Abf5irXdaO3oQzGSTV8b/Tt9bOpuce8J1vleKX3l4zjvE78Xzt/J2p6/YfbY E3C5ZMQg2+JhvZm8axqm4lhH7fCxxbW32hGV1zkTeDIxp39P+37gQPr4WHyJHIn/5yFt7dYY+xTA WPHqRbtb599KTV/lzfiMsJM3fczzT+WkqK9NuMD22PQi5++8ES3H/dwGjMvGT/ervcOGtL3Nb8mX 8YhyUi7aiy2Fn6gdcd9zfAe7RzGJE+3oxrX17a3UJCnqQf6UF35B+FXn/qSPOiCXwosf8fmFmzAo 6gZPZBDCg1pr+7IvyMifMIhyQzVqpyiTPyL5p+M7/OAEf8oX+XvijfxxHkkZwoB5oVzihWwTbl+s UV4srMazIS/agbKGX2RJWFCUK9yUF1BiseYGxAN0QBtimYDckAl497OFixUOCKNpAVCRzUz0/ADH cgrAA2et/OmPHabO64f2xEppHPjihfgAgrA8idxA23o63cepHCFToEmxWnG1GupxkB2QltgWitYl c6N6yQ2aVPl2S9y+2KFycs92DcYYCDfEfIXjQQEoVmrug2HtKtmewsaEJl4ehz9LtJWs4+JlGh9l Y0kLuKuwOSF+aFsu0ngXWpha61c7znE3z4bFjThcga0UMa7CE3sNYXOC+9jeoRmHHsjSwpGc9Jpz NNZG3BhbgdnbqD6M2QAbABXz5Ye2VCwYyOlEOIQ/YzRjc8gG6zVyf6B2Y5sHQEMXxQMAWSdN/Cbj tvzhz1GdS3OZjbxDHnA5IH9+Pn7nshlakj6u5xoK8AzNCbFzoIClHEARqKP/VfNrLI+jP/FCE4V3 gHaPxQjizJOMCECxWjsQ4NFOZhE+SOJgk4stGWzxwH4WVJfLgNihQppk0WK15nqt9O1jkwr7UwsW ZgCUx5dMAkT3/rol0ubM3wtdASs0qTZsS0BbS3sCWs6JaHre7SSzbYgav8g8Bh9f+uGmH+2GmHwR /+KJNZNttAQAHQKkAHzgo2B7BUI3NidGjhxZAB+IBxDAhB0Qgfhs42DwBhwAuHj11UkOdhCXLRvE zU7QYHDIBn/ieyejsHYSxgEI6JT7SzUbNXH40iGQDoEH7QrSeN7q2Co00KN65asb6khaaHIDQPLR Bx/atj16+laQ9WhLSGBDs+NTtWlrASeALG30cNCewB4FJ3y8PfVt+3jhx9atWzfrt31/WyCh/4kn ntC2kJ0cLKFeEHlDBUHFXV//Hzr1AKvgHu8D78Q3/zjNnj+nlxtv2qf3efaOwn84cqmdO30/2/GC SYWBgTTpe7OHjs/ydF7cOTpGK7N27QOOPgwo4vvgorzY38iKug+OCsc/fS89Uf6HtM2Fp/GJE7xI Rj0ZqGIgjbg+xCp/4keZ0rzkWRiQY4Bkj6wPhgorXvlP00YeLcvPsFE5KMGZ63tcNDmFI7yeEXcf tfmLtLkTe3MbxUvq7IO9ykt8ryNlUNy0HM3Vg/iRJsIjzzwzv0Q8HMSL9sJNPmkH4s8ujxc8ideE 8nwLfPPn7+2qiMU8WracYTNtsPVRXddeM80ufkfW0Uc04ejPMYRd+ESZCnkoOu2UPf8T7L7x29mN B/6vTZU/E6wQCkMrAneAFmlOCBuu4qmVM7Z+1Gt/qB8/qkjsBfVJnwSBdevZD5+pXrZscbRdc39P u/m4m+01DQi0XxcNAKyKxDnkscrBoIcfQgUChxrDVTLRmHBBQwMeAgQ9wk5n/MUeP3EbjYaP2LFn 3WUT5X/S/75gZy78pR379/fc1oRJWIBW5SqW3LPCwSQZ3qYBIvaFxjYO2i60JWKbx6d12cDCAMlE eKkGUbZlZPsid7L7c1Bi7r9+Z33/Mctq1adiDyKABCUpgBLc+3Gh5C8CcIAAIKAAIOipA5TAH16A F11yIQJNk1iBQOigTOzzZBIOAIFAQD0RAhio0TLAXkMQ1sdjhSSschPmbaNrVpqIrfzFL4xaleRG ujD+hSoplAINnMoBrcDAld9lfyhLa+1DLRUQhTCEIARI0uwKVq5VEdtOgg2aHtRnuerYDqFDu0o5 +pPVJ1aTEEIg/HjGGC/lVBA0KILQkGBrBz/a6xMFxKoJ1rW5z3T1MqGEdB2rsr3ZobqMMB4dgJ9C lM1NIouvfN16p91szaJONmHMKDvikJNkD6OrXXfr/1mrbgKrZJRTivTKgyPSNJbIpoB0IL9ynsUM NOr7bB4g4L9OyoJ8SgBYePlzcMLHe91TgpL6CmvQVo16beOoa2hhFVpoWb9mlQyP1dn3v7uNVW2y 3hYtlA0QTSQ+re5kHy9fqO1ZWq1X25S59giM/zuUjr9pvxu5MR6kk0L6Yvw2NFmMdJ+5qoPyflx9 dI1sApHXKmnTcIUIg2dM9sM/xpUoG1fyj3Eq4qU8KG9Mup05f2Jw0W3wcu8N1KWYv+eZM/Fy6j7G H/j4sdeqF6OYaleoV5QvtmUAOqT5kzbicI36Rv6EI+MGMIEbCh7EY8yKyS9uZJrgmcXWu6T3yBeS lIdTfg0++KX3uL3Jcl7BL54/+RTHJ01KxV0LzzaItBifDoPt8KXcyAHBlyv58INwBxX74ea5xIIF /RzvQJqetCxkxIlE7iZNAkD4AgbxJDOkYARxI16AxJzgFcTIUS2AOU70+lT3WqrOThOUPIzcAIXm JYBFEDICmpbQ6nyiq5VSayMZB/81Wo2v0mSTI0QhFjkAJyA0MNtp7GDe5STwIVb8C1tCNa4BSqAV sULtgiwBsQ0UEGRVnmd5Ji6ofTKgAxkDOwi1Sse20GqNSSx0WK49GRPp0KKEZwANce8alDhEnVXW T3Wlx/9YMsxmGucW5V0bIMY2GgchNCd93FZ41NkD9KcJYKD2SN2AEjEmA9aw4IE7bEvAAwAhBR4Y pwEl0HCMxQzG9pAngj9p0wUS3LEowr1JHkrj4hVjPvfxzgT4gZ90W1xe8XbMx/wSAUQQQESM/dx3 k1FstCYY+yFkGIgjxeGNbEDb8j6kGpNL1NhsWQKUYLtGEJoXDpnkclyqaVFbstKWqJ2gjmqf9EQO 3HF0aPBKr+WxTx9PPkY+JLYh0EHRUX2mY05Tf4H7ABMCfOBkCzQdpk6d6gACAEWFViA5ipNtEewb B5wgPsAE6CqDMwBDXJmkA0Iw6aeTobMlPu5V1St860RrAQBYasdIDPwWLxbCrDR1+kjpZNDGYAvH Oj0g8m4vJKhHjx6yBbfcXpn0iuflZUNIUx78MJy5qR5spfw21bGfFZow1FMutQMgBttKygVarNHD Kle92knFsI1sUPDBr1I5AD3atpFNCrmxSdG7d29bIhQLI5hoUdA2vbbd1nbccUffUnLffffZHnvs YQMHDnT0knoDVFBX6L8BUmwuuxHNPX/K3q/3LBl16i3jTGN0yNXp9tuVt1tPTax7n/uClyf+xICA e+/rZ+mor6Eq64Q8ODM0dZjdYJfJJwbQPLDJpRgpTwN5hryjfF6B8KfhxfeUKRWeisOL3WkdIgy/ lCjfqvzDbq4ezfEgfY1WpxueOMNKBtGU/YTsN22/yIO2u2cjbaeXv7D6QBryW6l3HaAkpebKFuEb KmOEp9diPjwD/Ir9N8azsUvLOBenTfODD+F1DQPtFp8ACpjZB5kjEzI8Lc8gWRmhTRQhZVNwOy9N suuE4GIXAsAQIp+gdfJrUH+0Vt91S/LXNaWWOVCIcAQowfFhIaCwihJEX0Pfs059QW39elu+6GMf pMJoVayKsEKyVHVzICIS6xqaFaxyMLiFuywXKvp2e98uPOpss1/9yrot29POfO5i6zXyTDv0b/N9 dQNWaFaw7WO9+jeI474WVzYe+4Xf+rXZwKHOF6dUzzJBxe+RUSRMLJMw0UED1XIZrMJYFaBEnPBR u1TPZ/It1uKPNfboTzt4MrQ7GpQlx4ciUMRxoRwNypuZ6Z6o3bWa27Agm8THsaH4xfSJsFzGkaGw 9ZnBK5UjjFyxPxNCcwMjVVAJKy8SSAAAmHSv0H2VrtAy2ZcIoIKwoBCMcIf/crWVa4PoCo9F+X5P jkaFWN0BlFii1WrquFSrXC5Y5QO+CzaKt1QgRupPWlaA6yRQOcBAOTQGcO/WyuGt+xCEXLARGEG5 gygjRq7YvrFC5WqQoS0ACN+/m6+M4IYnRrGW5OBJpPdrrlrLlhDOKH9LggXCCfSe6saxoZADYQLd UeOEEE5YdWIy5e78RJH0G/KAr/hnwvj3bOtWq7XfdiudHlKqkznW22ad6W8WCrDeUpoDguekOdO4 GWLjGcaYufFYTUN5D5v2pE3DccW7GiFfdUx2WxPaahp5Z5CEyiEPAMkGtnPwBTW0tVrtGa6vW2nD TtvNNmmothfHzbaDjhpoY5+aaff+ZbJm6WiXqD+ro5WQU4pLG6X+6lf6VvrloPR9cCBBAfil/sRF rgr/NH3w4ZqmgRdA5BL1RaRlAu+kC+kjL8oT6fBnsom8EP4bygv/SBfXLIPGv8jJaTzuyTfqQkzS RlkaU372zoGIvA2alIlqNQ5LhYQOCJrsHyTtTV78In2UO4CI+FYJT++DKf6RFj/K7WXP+aLaHQQo AY/II/zlURhn8UvDA0AOv8a3JIsX/gVeRTdpeJRtreRRKMq86j2rAAAgAElEQVRNUwFIRJvTPkFR P/jEDz/iRvqIG1e0wBxwDQ9d43Fge22t3oFoS01g9H5VFACIsFfVNp+UJSwKoAR+bPsEgOBarv7V jwDNI6dbQrEvsa5FVp/YshHyAmEprdEqtWtGyLOVQImumqcwKccfEGKFxgUotCWif0M7AmLcYft7 VZdNXVMCbQnfDuqhmkRLHuDULwhwophiMQP/xgWNbKz1baHyr1I/5Kd15ImrWyARyHZO8szyIL/E aRc4ACXYxqGP2cELFiqoA+AEYzKLB/M0lnX0lNkfFg0cJMjHUZcJtJWuTDa3YoEg1WgA0EDbIgCG AApCTmB7SEqAEgAVsQ0zwvArlTwS6cOfK36rVK64Z3xH3ghKywN/jisPQlMyyoYfsgBtgDxQJZ4l knOgkq6b+0KFAxPyR24AlAiggjj4IeFyZUGC7RVlWljqmG8fQ1sixn7iA0pwchf+qb0JTubAzRaP 2BZK/Hb6lcvWBBSncmDo9/OoPEUfiYy6PB0sxJUO/asQAkFMqNGOeOWVV7LJhoR6JvNMtOksACGI 53ubdAWsYJBHwIdHABOUBX8mI2hEQHQu8EBrAaG0rrROfJa5NgUfHJoZ8+a9p7z4ABo8X/ijlYAW g4MJ4kVHtZNAgQ8+/MCNNAJMoJEBf8pARz9r5kz7QPGWCETgBI46NDb0oVTyYkrAfGnCeC8f5SE9 E5G2AidIG50q/LChwSkjaIcAjHByB3WskU2KFmoXTgHBUOQVV1zhbTJs2LBCW1Hn0KTg/uskOvTi 5x/vyIhH1Hox6dWXcLbqcHuR0BsdPQh2XcNpdrFMXfey8dZwblEpZxe5c2c8y+ZDGwciwtPBpzh+ lIPnEBSoeribu4Z1a9KFVerm4sG/ycpBc5E24FdnI+wRvYc05RNnbEhYPN0u+Zy2o2Zp/Xi/NtYm GyjOf+xN3mn+MIp2z54/3eWXo2af/6wbDA2dHZ+YZf1lOExN7xR1TctA+vhFzmk51+Zn04e2TkHT RXUhHWAsgoY+fF91gwfgRIncno8AzbBFASiBdW3iI4xQntiTGHkXXx3sTb4Z9pwqYSFa2KNw2xPq B7A3EZNuIgE0ADg8OE4Glh59LEv3XL1dOPBgO0egAiqXAUiEgcxO9VIPzQENwAmsaBcIIELChlMK SkQE+eVwg4MSqF+mWgDVa563R+vvtHUPmI294wdSJ2xnC4Wqh5AR+2hh5xN0tS/gA9s0ADACkCA8 9a+QoS4EDfywJ1EivljKTgmggQEcQcNJAypvnG+rULkJa6e2ZdCPgR/hopp9yPqhRsqAzC8I4QBB gFUKFw4UUCLQIcrZ0C4rg6uXCpTwlR3lE+CDC3bBrJlrcfhKypITx4E55eUKOxKhxknZEEKW5e9P CCclMi7GVgu2cSxXm2AN3a10I7QqDMAiPe4LP/9FxroGKIFXCkrgZu8wFrch9lPHip975H/4dr5O +uOfp9gF/6+/dd2shb3wtz/ZEfsebt948CT77kkjbf7CRda1k4zNlUgQ5VMt10ReYG/0pIxRhXFK hQo38kWB6HzzsSzixrUQhxuYelTerEz20AAvACxzu6f+kLYYlAh3hJFESfVja2bc56WOfOCtiQq1 YQ4BMJHxkRxVIQCrfmurLxMYVfOptZbNjat+u5f17FJrS+cssH0OGGAPPjrFbhzxvq0ukTDYcr2m sPrW/L3KFnaivF/3NX3+zfXH5Jf6hzv80vQbKxvvHu8gBjYjLfFJj60BJu4OVAOY6ZVkTESGDdCA NMTlRxiEX8or/D2w6E8s3sEzeAT/dDyKPIJ/gY2KpdzcGXnGlTRBLnfncZv456vUxMM/0oY7rtQB GzBQyHO0S1ouD9Sf4B/xgm/wRnOV8dJJbRXyYKT3a1L2kLNc61XyffB3frS1ElDTJu4kfRO+zTho Z35RPqKQRzy3dKECvzR/0uCOXzy7lJfzyR6R5+7PIi8H71+Z+tUK+mD10xB2J9CKoExxfGhqcyXV mIh7TuBoqXF8nfit07fPj9MQMJyNBgVXKNWIYC4Uxi0JC1kBkIJfFRN2UZ3qjPFLbEwARGCnCkJD gjGXxYfszVDXoDAHKRSOnQlAcQxoOyDhqfRH4w4LGJrxGMeOfxEClOis+RZABSBESl4mTdhbKS/A +LwHbLKV4+PwJKHyBApAHgCU+Fi82VZfkss0RNlMRjEbcmB9kcI4nQvQokOunRjbSYhbpQ6WsRRQ AttPTPkBChz857uhA04IOSCok2QRDODOl8zgWpXKkzGddsOoNYTsgAwRtiGWiXdKIYsEYOH5KkKa j283Vb4Rx7e6KI+UAD54sj626+pHglIWtVGpNGM4Cr1AKsNiad5wwoc+FPd2UCLhCWjBG62zTRzA COPXjP3t1mXvOnAg/QEEGBEUoES4uSKThK2J8AecqFovGUJlSDUoIjyu5R03RYE4ozIJ16tVCLAz PqBQR4rw/+TKoAwIMGfOHHvqqad8iwTbJPBn4s6PCTkAAZoFdBCAAQAV/HATzjXchCNkAGxwTziT e/zaSnDGnQkDbKnqYIcffoSXoY20FTgWFCOahEMAIZSPiT4aF1tuuaUNEGCB9gIdDR0YV4QDTgyZ KpsYykj/GzKbEXq5Q2uCb6lW5aEDoSy1Kge2LwAnsJ1BWeETdYc3bn5s8aCsaFnQDpQJuxe0y/33 3+95DRkyxP0pN/xJ998gOmbQYAaqGKw2F4DScszp1qNHeRONijZqNyjQaibrtJe3We1ddnzbvzr4 En7w5h6tkNd130mATVtdg0jPwAIxiWMQDGQ67qNMxImBJe65wi+QfVZJaGfyRahAoAlLzvj7RFFx FKkwsEXdY0Aivxi4AJginLywueADteKwuut5ix/3DE7ZCofKqby5p+7QfUdX2n3EkSXx9u2zvGlD yp3RYzZsi8cK2gCejwLQ0GCbRkvl21k/0mDrAkr5++Dqvtmz4ZZ4FQ072PnjzrW3dzjK7pYfx6c1 R2kdaQcgPeep+1SjhjaEmn/+2aoR4Fvx8492oF6F5y9e+Dd9/m3tn9ddZjPEY+9ylb+V9r21iTZS J5nnTxloYygMVrHXkzbBv9HvcTvpm/8Q9N7ZNtPzCaGCdK1ylJh7UOVQmws3V6xu0zeiLYFaeyf1 QRiIigk4W7wwZAVlapebWasKaWPtPEACmbaQqb+AsKINjuxuped88hpdgxqkuYbQsFSnC1Vtvlm2 kqHAZdrbWM2AOlXG3c7kDWLAVrr+fW1LDTIrtdIBcQZ5UGg3hJsVj/kCbt2AlfaMQr5vVFdU9qTn h1dTYvLLwK/viMkvk2NWHNppgH9m7EXWb5wmwO2/KSvW2R7OT9dWuwBa0kNWm7v1tPWrZf9H/Svq gTUyfLRmGZtCqmyT9p1sk1xwwaYP8TgSVB2N9dTWC/ZAhpEoQB+MW6XEalycP44/7ljRIK5rH2yu s8iVFqvd87U/dRP9GPgxNBXbObi60IEgpfbplD//j9etllVzWauWm3WIsLoeWzjqNpcB36IyFlv4 plyUKfxxI8QgWCDUpHkTlhLl7aB4CBkYtmLfaImEyzCChfHLIKxus5Vjq746vi3xD0Ei4rECukrG /DB+uaXG/+Z7gMb9raRjf+hDhb4pOGVX+sboH5uG/OeuTxe3sn+NnW7f/VY32+WwA23lB8/aXC0u jLj2PPvFJffYkk8F4LeTxiLbG/S5saXj8yiTCZIxU+Mn2zTxL/zEhBjZ2CrG2afsrPEjXnOUjsVp PhtKg3+zw3fKn4KQXYZQ6FZ2skq0Z7pkja1ZWWL9d2tjhxzSw159epKGL/VDJe1t8pvSbqnV5g19 U8igJgOhJC+RQO0Va67wX4Mfzx/7CAEGuFvfBfR570ZxeIwppI17rvyLiV3KlzCXA/Lx1flpWAr/ NC5jWPAkXvyYTMdxm2l87iM+92gUQ6lMgDvqENdIE27iQEzL8UvDuU9lHXg7/zxuljL7G+NVpMeX e37ULWQl/GNbCPdRjjQd/ilFnLimYXHvGmwqX0rEp/04hU4FydpREUIGKebXCL/QHnrFlTbluLEy km/UkXTpNlrCkB8iP/Lnh5tftFNciY98WByOf7G2BH6UO2QCt7GTyxZxegdxNLj5pfCeSFYopnRe xfvcQuMQmg+UFTliVTOgBDyYR4T8EMay2dIBAUT49lDJDGu0pYPtn2hXsF2TLR4QixPYiWgj71W8 xgD6urbO5cc42Usrvu6XguifWdBwjvkftaGTyh8EKOFHkMtjlRY+ACdcSyJfBAkQnvEZIi/AfQAJ AIhiCq1LQIliCk0J/FlEcMBCY+QiuZOpeTbxz3mHXQm2Y6C9uDFCVlivHxTGJSk3CwOM4VEHtnwE kIB/kC9w5G0UIARhce8gicoVdi0oExS8uPf2YsFCMkBzxKIEY3+qDcF9aHmgQemkfAKQiDD8uedJ FKAGpRXk4kn4E8eMptpThUDduMaErmhMQAAVaEpgADM0JeL+C2lMABKsZ+UPQVNCNpR2/u7xFf4A PKDJwG8LWTpmcs4HxsAMGBAaEfjhJpyOAnCh+OeT/TwMkAKe+BEvAAo6JsLwZyReuHCyd0gABHz4 2KZgywh5UTbK0VV7b3CTL1srunfrbtv3394mv/66pwWsyEAUob9KUwaYIv5oPaC1QUe3iYRqBA3A Etq0ZZ4fAEMGxGRAAoY0y8qz7RiUsUGdB6siWfpGwQfh5l1Zf6ZMTIbvvPNOe+211+zEE0+07bff 3vOMxxJCFXWB4hrhX/YaHX+TdD/8q7173cGZ15PnWucf/NVa7nm5Pf/46dbTnrSfbXO6jdKHCdXV /cBGTdnOrtz1Ypvdfj/79TP/tNPrb7GfPHGI3XTYv2z/67a1cTfX2086nGij9LHV2HF2t6xs59xt zk37216/FwAkoixMPplchk0HGbawpTcN9HB78ie2xdCHGHk1cuiED1m5PjALkVWcm+1AGU18J++M 6o65w5ZGHbSVosOJDzrvijan2n1Yxy5K92bu3v3yV+2p4ds6v0P3vdzeLN/N/vDXo+zhE39jk3e5 1F58crhtqzb46RZD7R908ipvRe3xds9z29u1377CJoMs7niRjfe2mmM37f9ja7hjnGE64qmfbmEn PyDtDNWvaZd7gt2rMg20Ofangd+wa6a1dCvWtbUn2aPT+9m1+15hM7xex9o9MgN+UF7WObcMtH3/ MCVq4oDBDhc/Z6PP6Fnwo33P1ncCKME3sXbt4DyvLAo89vqtVIFTUp0veH6sndnD7MlzN7UT/6qB FOBFK76Uu0z3PtDpnneW5wHvdjKYA9WoPUYuvUH1yWi29mTs8bt3nAfpARBqVCYEMsgFNV1ral+z qVPKBV5odUh9a50mX4gIFbv93saPPavw7j2ob6jie3fJIrqe/rsjbJC3ewZK7HLxOBt9ugru9K7d fOCudsnrmZDpgsZxI+zty76dBT93ifU6/cE87pH2p7f+YPvnLnvvbvvB8bfZDL5x+dFPel+pa9mO P7X/u+8k62Yv26WH/s4ejzT5tZQtAOrs7YBf2r/P2DXznXSznaiVYQhQIsAI3IASy2SrAupQ1c7K 28gyedV37K7bBtrW7ms24f6f2G9eU1wG9y2H2J2XHGbb2Bt25Xl32r/zOKWV37BLf7a53XftE3qT zLYd+Eu79QCB0R89ZGdc/Zy916q7DTu6nz16xyib3WOIPXTOgeIx1S696F6vA/tCy1vtbdecuaWN uHe8zRDqXtLlIHvytG9bd62h3HXv/5l993Q7RY/52WdvtrP12ZZqYMUmBHYmqnT8cjEBSrAdhKNC A5RoUL9frbwwhtm5ZWvrIQAoBQ1iYu9AQz6ZdzsqemeIF9RFmhgc7RVWtWPiTzj+EAM+8EYHCXMe X6ABoAWAhBuUlJVtVpSwts0KgTpwV6PvrFs4OBChq4fpyj5NJveUI/KNMkW5FeyEP1tQWFUhfwCT DlrdbU7gAIRg32qLHJTw8ulZp6AEoAPCAqAEBJ+NgRLEWSSwa7XK3F2gRCcJwYsF4MFj01yYinrh 94ni48+RXy3UDlCxfODfu4d8fX9KW9Xbq28ttN36dbU+/ZbbwgXv2k69DraO21fZVq1X2YJ3Zfqy qqPVr5fMonGvoSx7ts2VIOb6jOEpsCBowMds0jBmelhEzjz1V51OLtPh1YSIWzTmNuGf84zxmKjc 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 NX4rE/oPHvjb+MCxm8VPbntL7Krns8NbXy1+7RivDwOB3LbXyXHzmR25TOJHUqp3+8Q1ce2VC2PK G8/O9pyoZ9Oh9n6GUHHoLR//QNyjXSH2Pu/tcf7Kc2PBa2bHjOGT4qYTj4zp558rjrfFT1eeHiMf 1PKgs+k09ozP33RtXLlwhhwsMnPw+jjnjVcIQDo6kfdnf/TKuO205fHiz9wYb/rMcfHAx3aOV5+v ge9934/bXyrfDTLRv+2Tx8asyy9KE1Ge8cQXvjV2+7V8IrziWXHWd4+PWT//AVXLbw/Tv07Vd06G RLzppOPi3uNmx55nHR4XrD4n7t5navSMfEF5HhPTf0K6PeMLN10V799Bp9oZZLO36gGIdj/pj/GR 258Vb/l+NXPCrAAzLfltK57ZEc9kwd+jcof1DkzXO/BPavtf77dlHHPwtXHC8XPih9+ptnvt1kwe Zr0z586NOXofqNt9aqe9zz40fqy2XKi23Cw+Gzd85PiYc/GPY48jDor7PzIv3jfvN/Hh90+Jn52v zjK/GQkeDRqmbbNdPEMd3rr5H4mbrpofp7W8T7+eMjfeo/eHd8/vH3VN0muExQyKE7Mhe5/0+7hw 7je0rOsHmrV7a5z1O+2Ycpye2+Kd4/iLO2Lntz8n/uvw3ePYV14Uxx8zJy7/aZVNp2ZIOzvkZXhL 7VqgoIEdj42rfj4/vrPHnvGznLXdNU64ZEX8curu8eFfy9B67lFx0+kT46SXvSx+Kf5djvp+XPHd lfG8D/0ipm3Q7JoG5VN6ZEI9a4uYs2VbLB94dZx180nR8cWXxV6/Ul/R88w45jtnxCkP7Bcf/OVA zNtnm/jN+14dl+3z2Thg3rAsHV4YL33gS7HrF+bGlUe8RI4+fiWnlm+Kc3//SS2tOTJedbX2oV41 I04449Q45cHD472/iXjm/9kmfvexw+PXL/xqvOc5a+PSa6t7CwY8UlzW67lX8ytVONYTAy98fWz/ y3fHTu3HxDfj4rh3/6PigS+fHdv9S4XAbz1rs/S8jVNMaJpMzscjQAkG6gxsEIEGJWxuySyIFY7x FIMSlEB5gEo+8knHmXr37GV7eb9mpaVeVfZw6gckwNfWws6gRGZU/zC7gNA3CGFQAmHuOObEmO2w gEd5gtrU9yHgEdpetuG1ogYfyJtzU1WWHHUqwDMypRWH+ThSXkmP6dr1c7gdXvp6Vu0zAgW4T8BQ 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 vZ6bBS7add/BlhfJ8V2LOjvyawdYh/JSW1q9zDru3sW2FNdZa81kVmKGuWiBrV/8uc2d+oktmzvb 2guAVNdr9q1rbxt04F525K4f25COk+zwvsusw64rrP2gPnpBOlqHpmLruGNn+9OLb9kPr/+13fnA wyrX7Ovf/Ibt0n0nbVEqKSFEA6j5V5A/e71cCAY6Z96BEPbRsdcN6WO7Hz3KwVZl5WQ74tlRNq+X nHa98Kr1GrXO3ri0l2uDI11yH4ki4KwTjrKjxLPunka7+Sd97c/3Nmlv9ia7/+MbbW+VWX9uokh4 6YSNUihV2sc3Nto15420XlfdaPukAu+faRfug5899KLNveId2zj6aE8W98cFANP9i5xzgpQXX7MX jlvng8wZt5lde/5I6/3Dm2wIdao/14YfO8YO//dHvF3OekpKjNuHWJ9D7rQ+J3/fhZuddoz1koXE i8fr3uQQcMIvG2zERaOt1xW/sL1VVtSn9oOnbPax76icP8g6Q7MKaT1p7+AJpzJeYf1BeEbbB08I 7iwPeYWwjnCOpI1fNnx755QB5afxOiiOsgOMwMuOGap8ro6kjXpyDkWece55kC4lln9AwRdH8o28 cmEZPk+U/smPz14HX7QR1w70mDmJewLwpXWi3/NZlRQIbgUeAoMKI65Esx9lbeVjJl2iQJ541uYX FOCAa86ziopQSBCW/cGLxURYRmCCiY8JFBIQMyH86les9B9hCE7IB84xqyGh4pRRSiQB+ptp+1xY 5iQsIgiKdaMxC0JcrBVFUDPoZ0YhhD9p8DDND2VB9kecKxAECiKcsJxSIo0njHjInXeKH54Iy/Kj lEA5AeHTIpkRSJQSHpj5Qz1D8cDgnwE/ygj8RWSVEhGH8A9+soGHH8QuJOxagnPLoFB4bOuauPp0 CQeKCgcRAhLk7z+1I8cAFKGM4BjPl3xRNFCHpiUrkq3DFBbOLpmtywIk+EMpwTmUbzmRhG79y7IU AGy+UiKut9UfReptfXMRt90jsi6Vdyx4xOol+yOMf19EWf44DwsG8uY8d/1FGeXFRRrwAySRYR99 PNl+NuLn9tFHH/lW4SzjpE1Ythk/ZAu89JnIGPJBOcERS0uwyMLPP7fZs2f7Mg98TLnjWiVauHCB 58PSOQYrHLHoxMH2Yg04+G2pL7TvnnmODf/VTfb6G+Ptxlt/b/NWLNVkSIdoyrw7+XIu6V/pQzny yxKD5SCXJbqAF4VGpMnG+6BR7co75f2ysktM6b9txzVdZqWXzrG+A2nj/7BnP/m17Utb65dTFuQy S06iTK4kVXLyivLxD5WTnZSjcn0ZBfmlhEKaeoSvLXgY/JNXEGUQzjKDtiWyDtE1Ydl7z7ZNpIUn eCN9KBY8teKxNuH+meX3dtZET66NVYVoJ6+DdvZChhHPslHub1NNMiD0tLoPrv17TW8RpTxtkB3o NvuelR+UtE1yR4ED4v6jDs3SpZFbW1IBaV6k9zZVudk00Y6xmxDfAK0cVhKkCYWBt6/y49iM0vcv P55y+BFOm5NXs+evTMAGtF+Mf+Cn32QnDfghlA6BCzyAMKWhjmXue07vh77fsLwIHvABeXFEIQHB h7Ul5fLrJGfqKEKyzrPZdjyxsjzRbn30QuuhevjzSuVR5A9P4A7O8TcRyzxRSMRW4mFxGek4Eubh +LsSbshuIY5vCZQS5cSJWsqyMhQWHpD/J9/yQvEoJcJpJkqJjtoZih+0o5TnYAgsITnyy20vrniW baKUUAPnduOI3TdIkyOwUvxygclJfp7NokkjQi6HYiFwBgoG38a7i+R9tx0SpYTaEkLeZmVuWFWQ JuLdOlJ4A75Yxkt+5VqOgmzPTuRYJy09TZU81IU6wAMvDjLBDoEZUEoEjnDewIHCgFEnsIxPpKgy vpW48oRcUZJOqLmyQv7R2GKcH0qGmNyA19OrXPCOKyAIEwbVx+AKDVdapN+FOghrJ5lbKGX7P6JO Ulrw2x4V1UkgMgsI8cF2IHN1hD5bGAVuL/VXIFwLJFSLAlunvXLZSgZv2bNnzbTd+w7QbES1X3s1 BUx79drdyjSYADyQhl+jNMpsAbps4wpru2mRHbXXt6y9trDcZ8g+NmXCIlssM0omqNZ37WT9/vM8 mzXlM1sjbdXXTzzSSvRAu43T+sd3PrH1Ah/vzp1ih0x/zN6ZuM5OOXqw7XfwgfZcZR+Z6rW3mqYq e/She+zBB1+w7v162n2PPWEbNm6yq35wscCGXkApOKhSYsfhNf7S//D8XfjoHWDQFgKDowuD96+1 AcVXevhFY+bYUHvWLrxQg3wJwH07/tz2vv5Du0btrFczqbtOuR/W2U6ZOdIuOe5H1vTiDDv1pn7W e8yvbcKEgTbH+rk2/NDBfWzerD3thONG2aGlM2z41NNsnx9NtwoTAhFRt20RQjXior7J9aN2WrtH reDcZ2xyv60D39JSbfuqf3V6t4f06WUV0wfbiceOVJkzVebpdsCI2Sqzn1tUlB4wyPrOm2dTBDD3 u/Fj+8MxFTbyZtViPPUq9G9kj96729xpA+2EYaNk/THLfjr5JBty9XSb09RfDli1H7TaDioqGmc/ GlBs1x50m00dnqw7ztaXc18KobbPUvAQxnn2GkGYL9y59yxPpMvPM9osjsRzzg9wBYghn4gPoZzN Bx7Wu+aINGk+uTCdRH3iGHly7SBc32OpADrhXk6aD/HMmGT9T8AT+VDG9p9/UgMHrDqN+iP8vd3U sSPcyS8LRGJmjiP9YGs5fgJM1Gi2hG+DfjEoduMASMSgj/Wh4WMiQAL8cQ5gCCUFYQng2BrmSgmB FTT6UJhlcu6DRgli7gEQwfINhBL7lecoFWy5awmqTQIViYfttO6pAsN5ss9PASwDaKvdNpxUv1BK rJfSja+6Uc6AARkOLtR+CL/E0FDdl64BABAWDqFM4JpzF/bcl3iId0dUfq0tnLslZYY1RQAD0kJh MZHkn8xVxC4fUZYrRFA5Z+7Jl1TIN1DsQ46AZcCPUiVMJ8mf+0B5EQoLwvC8zfZcvmRDIDAbRzwU pp3ZMkNJwZZgvhWY+NpLzgAIIMqGB0UEYVhoAHU4zykjUtDJ84VQSODECmsJTGOxgsBaYo123li6 UjIqJUBFABOC4nyz8iEN7ylhQAeuNceSptQ2r2q39u3keVzvAGtJASChlFgrxUn2u81+g7kM/ocn Ievoj6nFpA8/lDHKOp9AKO9Ubh3krwBKYv10m3/WKs0iLa/A+qB3397WpVNnRwVYM+DIGvKBxtZb 3WY+BLpCIoEUCC9XMrCD7rTPZtgvfvFLmytH2CwXxcqhMYcjkuwSXJHkQfvQ5yD7aDe3fhDOQtHh ZSgt1pyxxBSlBcqNWs3Ettc7h0KCH36tKqs2WcsUo32+bJW9N2GaHXpYJ7vkrDOtpEMbO+SIf9Nb gaH4v5i8829eB+6dPtj7VRSO4kmkxFa+/PcqrkNp3aZTst34+vo/yX32Kqv+0Sg78sBzZKl4hc3W Ms0JjBfzyo5ys+8p5ygdoBike5jeey9TeYRPogZZFeQIOSR5gFyMASvp8ynqjR4mlAjcK0P5kEOR hmvyylqLEEe+xPHuoAiJPFGOYCXhpEO0YdwfsinSERbh8EdbuLyjNso/iPK41yw/cSEvOaeO1JV0 1CCfFx4n8YkprvyYLcvTUbdmHEn9CCKeXzYN4SxlYZAf5WJtETyEZesKf34dPCz9Qzp+23z+4skp QIQPojzaHgUC7wb14Bw84J1DNvP0HDwAbVa6IMLABSz3dNJ1siAleXWDL44r5csHol/YaceujhmW rqjUkvJaq0qV3MQFgQmyGMPPV/JhiDIK9CQgwRJxHgoLrisl5yGmQioln1BGtMdSQDgbK4mpM2d4 vP+RHGIwu1rLywqECyAsJKIfKtBAvkkTGFD71m1tvfo1lrND+FpC4SBHUbZC124BkcYh40Ph4AqK VHGQtXIgjyIsGpRmW0qHUHJ0Uv2yyn3vRhUWfiSQhchBH6yXJMqDjanMpQyo007dpEyShaLufx3l pfiJdJEevva6hnIyV3iiat4CmyuZC6FgqJIfoYSKk7ovXWkbKZ9A5b1BZVPfdmr3yIfyobVLl+UU J678EP7PUtTFrR6wkhA/dcQ6AuJZmZRgTmuS56zRsCsYPEzj2dgWFCuKDfqVaVnhbprMx6ISK4kF c2bntpEHS3VOlQtuJaH6d+myoxqig2fXIS03KVDtKN4G4YoNqhvHwsz7GzxxLKrSi+gdhT5wiI82 9u2NDzOYv6pH8MFymT2Vdy63OZqJmK/B5O79Bgqo8FEkYEDOIOSAarCeiwCdBprSRshKQZBHx0Yp JtbUrLH+7VrY2g1r7Pl3p9gOu3ezFkWtbIOWeVidQEjrctvjuBPtj6/8Ves8i6yf4o7/xlE2c4Nm 3upkZieLjBU1G+yzWWvso9er7OulE6xrN20ts0ovYqO0oq3K7eMPJ1mpytpjr70NZ0yfyrRz2XK8 eOsGHOQkLQwucvKvyF/ZCPlfO4YWmgKy519UYJNMc1av1uBbA3CoRkqhxrpKzUJGKs32CBzWyQJi /JNN9qCUN70r7rRDX+pnw/ojUBLQ2Ki2eOeH/e1v9efbmFGX2ztqcvw4jKvXshn+KT7KiJw5hsOm bBzvLO9w7t3Vs2mSo764rqzUIEUdBmucxl/Vx04outheuvuKXJlvVw62a1XnRtW1etx/Wq+j9V1c NMYebDpXy+8H20tNz9lFBS/omTW4tv2/rxpor9ac4/V+S7KKer9bE/XeX44yx1nf3xbYsfcm31c9 2y4qbQhT6pqtP+HhHTx7r/nnDNhjxinygifuM58//zr44hjxXGfzi/DtHbFSyufPz/Pv0lKGfkEo J2Lf+QiLI3G6qW3eVzz/bFras9nzV0ZRH28zXUf/RhmAHoAXoI06AXoivKa+wFZtWOTXWEm4RYve C+fVgKN4ZQJScjsbqaPtUKzZFfmRyacsiCB9EIqJMMsEXMjsxqNiXamHpcwMkGvgScmXb0gpsVn+ blBUOKVCMHh8xkQKWmZAytNAwEdtzVZQE7x+FNiI7Sh9KQiBCnOTTJ3GzEeZgAaE8Fsrq4OsIgGg gBKjKV1nGCADHgcjxMkSAmAB1Qt41C1b7tfZdB6Z/mlapk5BVCzFDNtRFQnQYNaJIsN36VC4q2dk 8ohYBDzETiFr0nIcoDgToGuzm1sWaXCPQgLQQVitlAQIc3eiifJiRgIQKdvBi/IFAISZ5uLqSjXC BlcQOY/ShjKB66BKhZvyp22irQAXlB9mmVxvVDyOsWJdKWEBgCKvABubdV88K9IH+EDoQ8yEhC8K FBpQmFz6elGuNRM2V/cYxPUWvY+rNqot0veI2Y8GDcQLARyi6J9QFvKd/d8QA3MmEBisQ1g6vDzm Fbv++uvdTxROInfYYQffPatHjx7WWY722PobywJ2ofBvVgP2Kg3Yx7z6qn3wwQe2XBMIWCZ84xvf sLPPPtv69emrnFVGKleRI/9IwUFdQrkQ6ZDLFXPn23XXXWcVFRWunAQ/NGA9hQIxQ/Qz3BPKCJQk roBQfNxnsOIEm3LgIw188KDwqNHzLGZbcuEJBpr4usLPVW1t8pzWrl5kHYbuY0OHDrGlbzxnvdrt Yu0EMaq1FLS1Bgj/Usq8DtHnxjuCqTuDwb8flqrGEgUeo/gEjCZ3Qd8f6d0Pg+L9cfa63N5Y9bpW YO5rfyK5wuGjvbLk5aVxhHteKUvULyZiiHclgQZgHJuR8i3Rs0bekKeXI5YoM6vEIJ4fRBn8og/P pU0z9/JS3uBPo5rJVL45X/oQ+dJaad6SdqpIkor84SWOb4R6EsY90q6u4owm0jVtHu0b5caRPILI IxQykT/p/i5tpv0jffBEfbfmGrnrqPwJjzSZGD/l3pkQID6bX/55/nXkE/lGPOFeHx3znz9xTHZk CZ8eDVqywVIOhuzsxBYTuigqYrKCc5QYKCToGyJ8e18ligq3tFSuWE1wvlbQId4XlnGwtXhMZFAn cGcRFha5QQKhug8GnSn58g3J3jaSibGUw60hUh769qwyIrBDWFdE34+VBLRR7z2UtaLwAMKUV0Gi O89hBOLACyglWPKJdSXOsltoKVRsX44czJEU4CzhaKZgQBmhcLBDs3cm5Y20nkZYwCnljzhXaiAz NCmAtQLyP2RvgSwQQsEQ/KEIYKkt8j8mGLLWjPXCLVhVuGIgEmaOoRwAK8hjZrIMI233ZvesNH4t LBEWD4EbcKwNUQ7n4JOoCzxuwaF7ibLg9fI4SYlr3rvABVks4NYTerdcUREJpJRw6wddBz7w7eHV n+AMmxpt1nnEdZKCjdEbSz+heHf8IvMH5UMoI2Qu7jH5CosMe+406aboGPTjI/UPVuf/z5AEujCO ffrpVNv/gP3s6mt+KtBd7btxMABB+NeoQQbvsYd9+4zTNWMkYOsDB8GURoGrRh314pYKFHxeMcNe qFpvVeqYlr2/3Grbar2YtlmR4ZRmsjR4Unjfgf00s/ORtmdLgFoLm6cB+Trr0tjevrHroba59Xfs ir0W2qy6ofb49B7WsksbK2t80lpvXGYHHvcb22m3z2zB/Nm294B+NnjAHgI9i+RQs17Ag05H8Ek/ Jx1cX/EVeRC8GwilIABCfW1Vs7CIi2ORHOnlaPxV1qfgKhcsRd97iZv1KMBiCwmecCSnkb19bcCP pZTgHRycS76tk229qwgffsT9I8oJqoqRdkifK228J9haZpLHRTbmpBdswIkT9SGOtxMvOdlm3IGl x3TnzpWjeh/S56q8PMbbVX0KpNdosjG6zxMf1OfmyCqp2bbqSn4+GP8HlcfCAIryt/ftZp8bAp5W iTSewT/5J79Nfe2n3ofsO/FPZtVc0CjRtvL+Z9qA+8hvr9wzVb4x40a9wtHxaNcAACAASURBVPKC +6fTi7YHYNCBe5uQn85pM2iLOmSUCOxRrulMIVctG9AxEdfOor5FbaA+BmqlvFBKsCYU80uUEYAM 8giw4Xxp/lkw4Rmkf2LmIxsW6UgD2OgmJ5MhyBx0YGYpBUSACvhdWEipkFMwICw1sHazTA1CoWYm mfBCeaaYgAw8nW/QrhcaRVpZebkDDoR0mC+SLCxIOM/NdKgvDnJBnJn9yPHAIL6c4iLDE2mzR8BN vcBIAZYHWGJkI9NzlBIBQuhpACWAiQAfCPx8Ye7tmZmFQFkBoAGowBsWDlmgiUXESi2x2IHhtcoI 4jyACPXgPKwmmiRvoCg/6oTCISwpiA+lBOdBoZQIs0rCAR0FekexqnAlhQQHMyGYYWJBEXpiV3CQ QO0WIITLHKmOLM8CfAA8gniPAkzE9xYKvOD5nx5RFMTgv0JWCCNGjLA1cgTdXlYSy5Yts0VyFsmS CQbwMYhn2QPbdaMYYCCPjxf8rITSD8XE66+/7pYGp55yqh2w//74U3Rq0PvwRYQcyr1HOsFKgW+t rq7ebrnlN14XFCP0DZRD/4HcQl7nlBlpnegTsYyIZaTUNSfXVYkmrCbod3QfeguEUTTY1TltS7sw oNxZTjKxqGB5oLxuC7dIASa6Yfh/2onHf8cWzp9lh/dQW9QttrlTPrS9Dt/J478Kf7gPftEXM7DN EuGhRMjFiSX6ZG/jND1hOG88etQr1v2G26xvLywTf+Z+qcL6wfNWeql5ktO0POoAxdEH8bqOsqMe Yc3xncc+sH633GF97u1rvx76M3vbU4tfg8xYzkHdqDP/yC93nt6TX6d1T5M3O2TvN5E2yCNJpASJ extQP+6tvmhrGyoip2iA38tXWLQZhZCOa9LSX6Noj/Kwtoj7jTCunbz45piJuGg3nbjFCLwRlkub 5NDsLzzI3gvHzLaBNw+xa+VlPJcOzig3myptM2pEGwd/sLiyQDzQuS/NsIE3DrCMj3IPjzRxJDC/ nnHNsa1+tJU//1QZEZMdwUceKCXcalLfNcgAfogjygfqxrlbUqQDNQf04sEXRVGp9rNS9+NLOTyl JkfSzmaLjviUIA4CJ2BVwTJR+p/2UrS3VidWxPn6cinIOtnO8jOzSf0eYWZfs+v/fJkdbMvskZ9c ZaNmbbFd1E9B7oNKMgXLSpdHGtQymeFTCpoJZ9cufEa0ABdkiCUXOLnMj9sJZX8bvVsacK3HjEzE rHkMVsNXQfmuu0p4leR8GqCU3wUlvJZAhmUh8wOdVa8GyajFkv3sntFWeWH1DuHgkokHqIP6/JZy PkoY/XH1+jWyVNQOO8IJOMNkSWetMEvswEEa4siJHa6wCuzRs4dbN8Y4g2WYbLsJtRBWg7gmPmcF qfD8sIhvK4UJjizLJPc3pRMwhCXLcDQYV1stL1tnZZKlLDth0ULk64Vt40/UDT76/TI9q/J0e1Lq GPXdQfe2UvdVrkn1IKwnmaiAqAM2FmHFy3afEHUirJNf6REpvGtb7XAi3BBLp4jiGmvJlulSm5Td 2mpyAIotQ7mnnCNivb9YWZYL87LzRgs9x0Z9F+7sUtaoXcTcXpMKWWqXjmGyYXFexFZMENo+zJZj LRWdw/8LxOfB0oomeb6ulWPDaZ99ZsVqiJoqOdWRlq5I7qoL5Pl2QJ8+VqaGWaqZOYCF4IA1FmrH DXUKtfrIahdUWvmsQq3/nK7rOq0T1DriZS1t3mw53mlbarPnVNjoUfdYJ5kg73PIgdqHfq09+coY e/qRp6yVvJBWLZpqS954xmp77G1z69vbjiU9rfWmOquZ/7a0SnJUU9vBPhv/lrVWZ9ijnUBkfa1N /Gy69iBfbmtWLLE2cq7pGpa00VFK8PuyqFyzUpiu43mZGQC8QgdFx43TpcKDbrKJr19qu9t8u3uU THk6a2ZHLyGdc7viFtay7S7WYxelRPjgALQA5U6Zlesa80YEJO0NlZQIYAqksxygTL9CCYmWhaXW VnUpdyGkMKVv17mrdVV2DlhSQZADxl6OPG2TTwo+AdclJQfbzR+9ad/fnZKGWdOVf7Ufdjvb/lgj AaJOskTPoER+PYokdKKOfGgldHiqQwfVoUxtUXjOqTZs2FF6Z07T7iGn2xPP3m5jH7vLhjVVSPiX SfAgULQFlByZdhKY7Eq969M8dt3NymUC9uw5Xaz14032SokcYk7T+yhe7gXhl/3lvjnkLxJaxKwK 7cb/3D0TobQIRdJ4uK4BxM5Pm4h4LlA4ZoolDOwIg/COOsCDQMSZJQ6qiMsOpH22RGFsZUV9w9yV dGJW59Tanz9lx7ZqUT8EPTxcByAMi4Vs3cmK+HComZ1NIpw6wB+zEPRX26IAB7yP8HOd3Y4t0gSg CB7efYg+0D1oK916mYhDZRIsDILo1MNMk3AcXwJYUVxw3iLjc6J1ajK3OYCK8guwgrdsduCIdaQ4 xCrsWioTbt7A7ZCEe3bg20FtvkGzkB0ENgiP60rlDaBASZDbB1wKhJ3EAwDxdZ7qcyD2J0/tLKyx SyfrpPZaq2dcLyHvzi4FLgAbrjkngbZhLlMeLHsIailtfmjecfgYaz+Jl0GJValvDgqwALBoqtFg WkAFgBFEPFuABgAJoBEABHDCThws4eA8KHbn4LpMoI4lCWUS0izDQIgHIcxD+IdSh7YDCNTrGXfq 2UPrXWUdkAK1zWUS9D0TAY5QZ69y4rMCv1IAp1zPj1m1AB4BXgATsb2Xl6G2hSib5RyYkzpg1JKR qEc+2KBcKOrEOX4lABLLN21wcJG93lXWBuF3IsBGrWbhcVrFNaBjke4ZZUhrtfVuvJci4ruqvZar 3QAlO2RACeBjJzl6pF/Igv7sdRbIe4b/4E+h5DXWANCdd46Sz4UK69Gjh77ZUh/QF2siINndggG+ +PS/Sm2xQbNvPG924Vqnd4sZxY7qw+HB+rFqU7WNH/eB+AUYN222ww79mpdB/Sgt9P4EFkgMJZLI WbS0Ur6NPp5s48ePtylTPvHlGjvt0t3enzhRS80SsIXBW1HLxFdEA/4nlGEoHZjhDKWE511AXKKg YPLDb4ISZb3pS0gV0kKyqFqKrdb6pgq1g1eJlBS77iJgj8JD2ddslO8sPeey0gROblrRZHNmfmYd WtbYMhlRTJ28SAORKvnASgVGcitf6l/uOeQYBTNwZgel6O9jIBzvS/47lH13GHDXs/epKPiXrlpl WyTrUOgEkQbZS/+tJMm58ANEOg9PzxUAiyaYsDzQYEj4BnkaFNYcXDfihFxtnyiNgiM5kic/7jfu IY5xD1HnaA+OyF22qERxEvHkGDxRCtfRZlE/+EOOBx9x3sYpf7Qvx8gDPBT15Ei+/IKXvPLr3iyM eAJEOJ5E3gZ/EpqkjzC/F5apvnOF9Q4G7Yh2+OmYrid+gODlF00fEwdufSWuKI/6Zml932vtwzcv s14ROPYSK57ARXK/5EeaeObBRp2gqGOEx5F48GhddVIybRN1BP8QH2nBEOvVx5eoD6UsdtWRVjCy alY2yojiQi3NUptxLNM3ztOHwAsQzkwbJF9RSkCxqxcKDHb2AhvQt7WXLK+XXOXXWsuQi4SHVbiW hzcmsnu3Xa3+mSttv3GH2m1f62YFC5d5figgcLirP9ZeSghkDooK92ej/j8sF2B2X04Ky1IoJVpo sqJReADcsFb9GZMW65nAyMywZ9N1oIMEN6SEYr+DloayLBIZhxNZcEIoJYKPoy/NjKMUECH3E8VD opQAE5SWlUv+b5XroZQIfhQaKCw2rlrh1pRre+5uXSSnO+s5rFT+gQlWp4N9ZHTIbuoR1FH9xArV FcqmiXzKUkUEu5ogtwtTBUCk58hEAzIm5H+UEzgEnqyShGviHE9oQiSUEFmlxGphLpQglBe4BCUG lFWMhOVrKCYCv4IlAiOAB1gOWu6pt/4JJ5cREsoKwtcrEKQaSongCbyBUgJCKbFOY/Dd9OxRQpRI ZtcInzbo2Rbq+XC9PSoCVEeFg4kPPLTEEfZVPi7TeizWfK7Ubhsrli21Tp3lvVUfZAAGjnvtuYff AnuHAxYaZNqMnMPdVqvStla9cbNNfuV9/3A7tG5nazZ9npj/1Gn2qVhgVB/23bf81naQCdDmpjrX IRRsqdMOH0ussE2ZurdKe/iOa6xfj300eNKgqLCNhGmlLVqzUlpOmUKr3HffesMfVmGDBqcFekB6 SOvXrrDWLVQR+m9IddWfZoDJw/+X/yA8Y9CXU0qoo6brZZAI4ZRp35N62+vH9bBZV75pvbR0pa5e Ai99Eal0kz7+OnVgLJVQr+7pmFlKbi+5rgNoitrIIgWlAIoJlrbAk8QkzUHZDhxTSRYCi/JyIkEd NB7MIYSxa9Z1XrLfqXbMPG1netex9rfet9s3buxv92om7ndvvGGv2yyB20QzWtZWH5EKoY50p4Wp OWzc89B+Zr8/qouN6PeYPXmu2TPPTLWbXplrlx3H+v9NPoBn0OzOVKkEpPoW6Dk2aqlLAIE/n9nF Gh5bZU/2Ga1HnCzlwNwylAq+1ZYEmT8DNQRKltgCzAWu2geFi7djWldvY51D8ez8PG33UGTQZZEu 2gYeiDWzoazw568wwEvUieeXff4Iay+fxIpjRsYBD9ci2iHqTN2iDSXhnS/h2vo3yqde8JJ3pI/7 5BiKD55/vGtxv/kKihD80YcBKGILO0qOfg0wGj4kCGf4R6ce23yhiIAIyyolIh4v3YRzHUoJnFqG soG0gIdtUaMEIYvM2gt8uAJDQMRnPzLgwAes6nMgzqEYTHOObpzriFuvd4pvpR2dfZoOPihASDif 8kAJjbY7JrMlOD2M7bqIyyklnFF/UuVEmAXGN4qJIxRbY/pRbcAsyIqGOs1gJN97AAZ4mfFI/E0A MHr6nuShiEjiE+DGOekgQAigBT4IoJJVRnhg+odyy/TC5yslgicAAtYFrbQFZgAOAIuDi1QpgcBn RgT+VjpHRnKO1QFPg2tmKFyVpPvNggv4sjMcUXYcw8eEnBQlgEj8UY/giWOACMADdeJ6W0AC4BBE PNRVIBoKkJHlIXwHrQVl9oOZDo4Q4KIsPfcA/WlAuaaBef6Ss4jnGAA+G7a9c7cwkNadwTuEFQRL O9bL23qV1iq7bwj1n96vytqgSM8bewbkOH4Y+CbZvaql6olVQn29llXBo88N2b5KA9n333/fLScW a0tO6LDDDrUeu3XPlemB+lOp8iZOmGgfaHcsloQsXLjQBx4oOlBMtme2SwAxrB5QpoAhZObgZTPJ wQ/COjM58t1vXapCmO+2paPfu248Jh3qNGlC3btoHS99Vq3WkNOWQgjeHuCOVpJ3tcIa0Kh77rWW T5odtHd/a1elZWX6/bhvX//2neFf8Cfk8vaKPviOOTbuyt6sc8xZFWJFePXsQ6zPVeO3++7k0nnG FXbndWpz5KIGHtVqQwa0tNW23svt1YnJlXBiSbbbKgOrFfxDBYW1BHlSVrzrMfCFL+oQcXxrYfVH OsIjLvIlPT/i45y4fF5k1QbxZJcsZvOI8zhmy/mifIMfnmwawpOeO+EAw7AjT7ZNs+fOX3++vZgq JVjOKuNRLWMdYf30rOr0/EdM76PlrEl++WWp8Fx5Xq6ut9JF9kSqlEjyHb81Kj2L/Dhmz/MZ4z6D J+IJD0riLtKW8oPshtSKlr6edwD5vlr3A+4hRYO+VywuoRoN+iG2Evc8hK3CkrIy7ZtpM+JrNVla LJxcIgVGjZSqG4R/Winfep07aeSHld5xP33RfnlQEsTfd377W022ymEnO2lIzm8QXtw0eaY13HKn TTpN8Xc8IkxQYF+76nbb/eEL7OZ5whnpbD6KiuVKB15gMmJjWt9Nuqcg381LMi9Huj+2EvftxVX3 HCkc31OqZo6KJJuCUKJATHJBTGS4NZ/wdyyv9Aj9wWl1WDbS/4e/qIjnGP6lwk9Vrcqv1gRxEOFQ felm427i2pd4aolIlfhXCnPRl7I7Vn2pnDzrvlGQhIVidgvvwFUrlFdsvbkkg6mWKBwZvkXPsFAK D0g29XJOLeuIDB+OtVmS2UFWD2Cs9fPmubPL7DadbkEiOZOtBzgKxQQKiiXCGJQFMZGxtESTPyrD W1sPAIsQpxQr8a7qRj0c60mIyQqww1qNkzupLkj6lSmmcWtNlVOpNgLbQGHBycQFxG5d2ty0WXgt Exp65fE90UXnhVKUsOtG2/ZltkCTbmwTWi9Fv6ffoZsrI1ZUrcttF9pW78+SzDvjjJk/RQDrDQIe bpKsDhDyAYZeKp+pzTB/VU6zCgcE/ZRPptmAQQPtrtGjtbygxvpKUE+Z8ql39jiQ2nnnXez0M87w 6gNkABC1hWjg5fhTH3jBFm3jow2o69VpbJJDyvVamiHVpH6s79VWLkUCyJsrrWr1UluxmteVDoTO s95KNXtSXKMZPGsnE+4WNmvah4rW4ACQUlwgpURHtac6tVY1Nmdahb5CrZtkpl77cRfVNwnvtZPZ cxurksbNTTwFfMSknyhzmgT87/3dsG5trlOPDjzbYUfY29MabewrCxKQ8TcBSb3QmKoPvWmyjXXz hAW2+NZMPbVM4ka9S7lO7LznrfoPx4jhGFt9pQ7z77WbpUSq8g59i9X3vMjGLrtoawZKf4Nm+Fen QscH6cRyrUO2jklwIjSK5KjzNimG5v9WVR15nS1f/Qc7tnikHXTbDHun53S7TnUuQXjIyqZh9+9r zer3SZ6QyrxeZeK48r8fm2F3jVtlP7Cxdqk6tE0yryyYMssqhkmoKA+otkDCaHf5qlh0cZKev8rj OgnzSr0HAKgaCb+HTm1njc9U2ujGDJ/CGZTXpJYF/lbpOoj7o5z4cZ1/z8HLEaGIEowBRvgySITt Vq64RhmBAgTQA2+Ekz/n2XIijL29hcJy987zyKb1UsSzrWcTNYh2c+sKCdeqdcqPNJSZCjM/JwH3 m95/cpncf7aukW/2mChRtEWZahLKIeJRpGCxAbE/ObRitbYP1ncnt46JMkUDBbxu+8yHzKlRhqAA QRiE+A0FiBa9a3mEhIN+CAVmPoIwxYxlGTgUDIowRBoKiY0ym9Si9OSn/qoZIQC0bzgOLlmmEcsz 2IM8uy/5tq4LNXhrrJQPmCzYIPNUIGBBwYxISzlCYmBeIyEI4GirOm3STAdHaIOWp6BRX8+MiZwM 43yxUkpgqFCWFoICOSePHqg/G1TXWMqA0WOAC+JxdAXFrEf4igBQADgCWMBDump1HoTFkogseMnm Cz98C3UP3cs62xJJTt+mU3XJEks0oAE7dDVmH6o/TwavSxWGsgUgFY4uN6iuABCuWW4CMIAALB5G GoBDek84vAzgAegAcECcAzja6rkRxjIYvYAKS0w0l6bps8CGdADJzQI9AJAm9UmxPGOzwgNAJOIf 7pSUP7MpIfgdrEScjgFG6COY9WiSRQXWJKtWJSCDdyEolBqxDznhLIuKQVf0C8H/zxwZ+KGIKNI3 Bd180w2S11Ns7KtjtKRSztNkUQc8RrbzowyWa9DXJGFSiKpPhegHkPHEtZRjMb5teH2HJCkbUDRA n376qQ0aNEgTD+1916eqqs3Ow/ads2fPlhJC76iUIGCD5JjspMHykcTaQfetMomPX6IUScqnDOqS KDC4SpQT1NcVeepfOHfSd+R7DbisT/zcFOkbW7FimbYhl2WLfExU6xnip4I0KPMKUyvDxoJ6a1++ s/3ljXdsp/Juts+gwTbz87m2/4EH0KpJ/l/yX9qee48+Ob/4wX3n2MUFfczGjNHizItsRNM91ke7 YfX/4fv5rLnrr985x/06FRSM92fLVt63aivvYXan3Sguf/9UZigEqMM/Q4lkSjhRSjxs50oxNDGt +8HuE8rLUN5BWJEi40JuER6yUdJIcqJ5/0J8fB+cb6ttSB/tBk9QPi8WHrzT2bKDl+P22jyf55/h y6bJnmeVMdlwzpt9/69ebAXH8pgHK2aafsPsHn/HpVQ6BO6tRDpwSradtsbm5Tv2Uis+odFefJF8 x2fZmt3/9u4x96xUZj4Pcc3uIZN7geLa6r1C1qNc4Bl4eoXz7GJSBgVEdlIiystkhUbe6iRrUEK2 o+/SsRjTdin9m1Bc5L2/u373Xju34hzrf9WsNJt+NvzZR7TB/ZM2UiFYXbbVuK3A/mrXHtPCbr2u yH70dk+7fPQd1uPpb9klFZr8Qu6ligkyCT8A7psqVUigjGBJR45SfxJco5TIUVq/HD5Q3igj4rpG 56s1KQBp4YpjBHAiviXwkQDhwyntAWWJgFVeRw/nD1ihZWpxWpsn64kPTABfyHysLcNZNjwQfBHP NT6tsMJcKeXPOslm0MpaLUl1H1IwiDhnC++QvShRNokXp9SQ1z+9DpkfcaTpqDEi8pl0Ec85Sz9Z MooFJ4qJ2IEjlrPksIFwAecs7QQjoDDBOWhQ8IMFKC/KySklgvEfHMEOKPUhHFlCPtGi9mHCA+UF WMHDxBdh8LEcZrP4UEIE4Xuiq1YL8HRRSuBvYkNxtXUCK4nC39Vm+UtqgxJN+UNMWjLmiC2APTDv TxEzf74nrz6cHKlPdjC/VZGYi/oqnSC0N+tlr5EyolSN8cmnU2QlKWCtASejeu6hXo2ym2ZKdmXd kwjQgxlpoRQBNGijlASap9bAo9F233UXeQqVRk2NzEx+g7b4XLRkjV7+RttS2Na6H3KItdmtv2bC NZOmfKRXt3lT3rbK1YsFzFva0IGDbd89tbq3qFw7kcpstlWhTZz4trYV/Vzn7e2Ab5+hl0qN20Iv obYq3VzS1TYvXWCrJozROqrEmIZ+PD5er/CX9CfbYcc5x+hkOffwh0620ocSgcjMoAMCxU26doiV XptWFl6dRtrsLdTcNcwK7kpCdt61u5+scaUEZT1s32n3mC8ZoCzyJo9qfeQIMABx5On5ZzNOz/2V VRrogZNK7YE0PA7vXqntW1GIiGjxhpo/2rCCO7ysmOWIcou4j4k/tiGlP3F+NUBynHCNDTlZ96er BDDcYyeVJiVxTR2jHjxLrr2ddP7Yae3s9+qwIbeY0D3WCBQH8PA29titwjnaHksG2pz8IixlTQ5p /Rhw5NopDYMfIICSJMhNWNO8Ioxj1IFjNp8Ih4dwfvH805Yh6gsp7hMmt46QVUFOKZHmx17nXnZ6 r6SJukQ7xvW2Cos6bwswAvKyaVm6BqjAagcFEQCUZRGJJUainChJB1Aob9m2LaeUUOGkh5o04OGZ s1YU5QRKCSiOWUsKuT72ctxaAi21nj91yBLbhkJtBYpiZw6AhQ+USANl0mSVFEQhxFBKNCMEgwRQ +JVgzSjkMyLrtypEYpvQbFqWdzRo8BRvD06tfPZFFmRQIuayKbZ9jtkojq4ADKwnxfKBfcmDABsO TDRQj2UhpGGPczW+g5cAI1kAEumzx3ylBMIfsABAAjCsYYpd2n2UEZiaMsNBfIvU7FRS2sFJFmwk Q2l14anwRSmBMqJM9YZ8Fw4NLrMEsAD4QAALyoCw6sAsdKnqFTMzHpH+oQz4UeM4GJF1Yye1AeAi X9mQTaePMgdAgi+UGPCF5236O829+axHs/TbuMAks0ePHm6ZFRZOsPkkhr6brPIvP3lMJPgg3ftx taJepOnTZzrrSy+/7D4leB/YRaNEYKdI/RTpSMMP5QNLJSDCsZDkyLfMkR914fuIAT2mzOyiAS1Y sMCXaJAOxQJ5kRZC4eC7bGjSAmVD5EcY/Y0v2ZBUxjIiyqQ+/MiDwQaE1QMKkY2aKWpwkL5VUUC6 Qik+CvRDwhdoaYxuy5errFuz2h15dtVs1hIpJzorH3SAHTVr2k6Kmp/85Bob1L+fl3H1j39om3Wf O3btYZPfn2RL126yvzz3gh12yNdst527uxUm7QWplARMpNXA2gBCeUIc19Qr2tgj/y/+dNWyR/rw 6JvDKi0cIz81RstuVI6TJmSu0P2dr3toJ6BL+8WyQZ4fVFj8XfvlFb21JGCclmB60NY/czWw66ql nQoJuUD6sPzDCi+W5fmyVOXPABKKd5QyCwrOtV/KioMy6v6ujEJrrXvqqnRhoUda5HXIFvIkjGOJ touHwq9DTsYpXgnUt2jJp75x5At1o30grPnWymKH76mNfKsgV7AEZAtLKCwKWQ5Jua5s15E6Zb/B uK9of9JSFoQ8C+K+szzUPb7f4CEv6grWYOImygrrS2R2g/rPGC1E+ob6p+z1QvXZesxv/LCbde26 p7WYqx3Whlxje/5lmg0q28169CjItQPpss+P8rc+/2QiIFEIPW5jWsjqQgW+fnlHObjv7M8a/vAH Ee0S+XXoKF8Fktlc+73o/ciRmgVc4M9NMiDkOXxxr4XF8mmgnfl27t3b1uUG5xv9vYt84hnGQI9+ liWfPEPGVFnCohLryh0VmN1ivL36gEpZAXao1rLidFDOEkwUOpee3d162CM28+xsTjpfLCtOySwT PkA50WTftFvGXm2HKmrS84vswe8faT+en0jpcHjpclrxTeob8TeBYiJLf4cT0vZyXJBhRFFRq/Rs F8rELUqJfNqlvLNbXMa24x1aJH1jPh9KCQbqmo51FW4oJUK2s8yzOFU8hFIim0dWKRE4IMtHPu44 U4qZsK5cXSNnnOr3wtMByoVN6b0iZ/MJXIDsDiVEyHxkccQxuYRlZSgLaGuoAEynPBnkx7KNwAih fCBvzoOSsuSoUwFghKwVR5QdvJSXpTW6zucJh5fBF5NjvKtsPZ69ptaBFYIfRUXQ5hTvxDVHduzK vumthHvLZYWKj4lF8tG0LUIpEQqJfJ8TWf4iKsNsIR0NHUN8nIwso8PLJviqnGNdQOeyUh7pmXnZ KE/iC+fP9/XedOIIXAcZ6mgPOOBAdeqJMNisj4r1YUXaDxyT+hYtpJip22Tdd+tml/3gu9ZOjt3a svRCVhCbtLzjgfsftQmTp1vJgIOt16W/suqdekor16RlVFon2q7Q8A1kZgAAIABJREFUtjxzv826 c7j17NHFXvzLr2znVvX29pvaZm19WyvdpcSWf+tr9oOzta1VY0fb+fJLbGj1Wtu/wwZbVN1grzYO tXUr1tqaJeMFTARCHRQBHlIh7vjC/3xpzR6CFyEG+ZFztem2KPiaxYk3yw2PX+flgXBVAZ40V26a EQKUH2lDq+4DbsUDgrZLaRmki7pF3tk0hIUg9LLSdHSjAALe/XrCKIsf5/qRLvKO/Ekf4ZxniXB+ 5EGtIw08wZsNi3yyeXDu7adj8MYxx5fmH9fEBw95xuxE5BN8AWDi2uuqi0jrx7j/YMocgy8TlLRT JgAeL5d2yNA2nz9liWgbnkPWGiO/bpmscqfB48+PcvPK5Dp+vswjHXz4s1CnWawyY3kb3reh/GUj gBKUFEGAG9aGVumI46rEKVXE6n3SvWQVD9wTYKpIwDyfQiGRHx7XBQKu2xKiEc8R6wm3kgjBAoCI c8W31Hl43G62vENxYSWBciIUFMAcxAxHrCWCcM7oA/3SvwcfMbMRYCE7k5GzpEiXZkR+AIwAJigl 2nTr5o6usFSAwmdG8G/rGCAFhQGKCIR9lpiVAJgg9Fm6gXIi1r+67wxZS3QVaEIuMmiHAgQg+AEe tH+EUUajAFSADfYbz1KAD9KEoiQUI7F84x89T/IL0MEsSfMStpa2UQAJaw3AEPUPZQTXTqpr/jrY WN6BuWZsDbo1R5UrK5oGyU4WFwLeo7+IvlMdhfejuetMYga/zOK7LNZ7y3dXqHdzhWT2Aw88ZC9L IQEtXbrUB8c4fIQX5US9QDcDaJQGyPEYPNOX8AurBZQDnHOs1JIOvmMGkKE0ID8IRQSDA/LxgXk6 eI+4KINr4smT9eQoHRqVNwRPsqwrAWzVsmjYIIuqVulAE58XlFuEgkU+pOplqo0aoiiN93aQzNsi s1ccf1KXBtW5Xktvjj/uWPvNb39jRx57nJtZl8nCaosmVfaRo7sunctl7THA6/DQfffZuAkfWudu u9oll15u0+VTq0z+oB64937fOQQmygE1cOec8/O2xDoUhgzh4wnK3j/1+h+RnisD11BIkDYGhTzz spcvtt6vJ32mD6gVX6xn6IPDzPcJ9oSKm560s7o95nm47CBv/XjHhu69j02DT4NjKDco1TV9Ps8/ +ueQHcgReqgA0dRJUwR2brdnvd7gCR+YKjwwL36UXCFNXF5dUZyTl9+zBrehJICvrn6I3fDhj232 gd+1h3TNoAT5wb35T+9CLC/EnByizqGUIC+/B9UFJYan1bkrBuIovIvei/YgPPAQ5ygOmHDgfvEJ RfmuYFCcbjLXjny3sUSSe6Z9gyjff+QNRhMl95bI5mhnwukPqAe/P5/bzf6ssHiOT990jU1W+AGq bxEDm/rkmUW67PPfc8893WqKOMjbWHlDj57R0R6nDKEIyoFQjkDx/P0irlUeFJYe3p5qf9oFincp uwyUOnPt+kR72i4/scxaSgmsjkDLjBM1DP6nOI/nhlIi/EypIn+nlPA+WP1BLPek7HZSRrBlZBst zUIpoX0qDKsFvlWUEly3Kfmb/eCAMb6cgzRZ7MA1u3TgYQmsgMXEOYe97NYQbDW+Sfijrfprpmax sOTnTjBVP2SXW0u4KkB8KteXcmjSgZ23mLSQJx2X9ZTD+6IXwU/5ExMYfCv+FHhPMn4VOhfqCaX4 oJA8RUxgsAQBecn0Q8j+sB5wnozcj2uOgQU4h2LJh8zUc3FZXAFPyH/CE/WMypRWi+WfhCEOClRH 5DX4JjACeCEUEORDOERYyF6uuQ+UEhBxtGl2UiFkOdYJ2vva+fhTpl9M3mARERTngVMcI6hscEpM Zkh4ebm81VF+1s8XeWXrCAYAC7C1uNZ/6f1JloCmKMCLxik2BEZAScF1WEp4RPoHXABxRDnB0g3O sY5AEZGPGcKysgnlmYgtQvEvgV8JCKUEyzggnGNuj3Q/yUwhnQ2dTHSy20vwrwl3eKOi0RAiEtTg aecz+dPPbPfe/WQGOtbWrl5p++y7r4MHgEVRkYSA1rycfvq/56rdqbyTnL7pNZHsRXw3SqOnrkfr nTvb0vWb7ePZS23CsiU2bt4Mm7tsofYJl/8JlYfJ/9y5S2zJR/Nty5KVVrup0lZMW2Slm9QFNMjx YSvNpqx40z7//B1twbbaHlw+xybXLpCZf7Ue6BbtQ64txN6ZZCcvH2FHTBxmwxb9wopmP2sTP15i WyTMGtQdMJvC2lbhny+dAABB+ecekxcPT/YXafOPwaOH4VEJKEi4HOimCYKPsCwRTpoQlhFHOLwc EbLNrsUE4I60kYYaRPnBTxxhIdy55lvwfIkjIC0/0hIEAQSoF+HBn8Qkf4M/ysrnof5hHZBNB18+ L3Wo0zudu+dsgvSc8rJlZvPAUiK/DX0ph9KosGblZdN5XchfPEEelqaJ84jLP+biKUcU9eOce0lE PtlnnmHKF8+BNAw2AJhZyrZFpI9jNi4LuqJ8+AJgAEpC+cB5AArKYkkHgAXlQ8yShMVEhNOHsvUX hOOqoLZ0MiKARPYHmHKSUKiXSV0+8MAHBb9t0bIN65ot4cjnQSnhWvuMIsJ5EAb64fAyduUoKpdP acJVvyyFQoIwzDWz60cBHLETB9tZIdjcSiCbQXoOEABM8AvAADDx3TjEwxIOzNQjzoEDSxxEhIXz S5QUBd12dKdXHpn+cadd4iddpOWoDZgdWIRlQgAOVxKofIQ+yzncYiLy0n1ACHicXKIACGHPkdkF b9eUP3gBCJ10EQAjE630yXMmzhUlKSAJcMYyEpZQhJIj0gJ8AvxEGEf4WM4RCodsHOexhIRz58l7 riglcITFjhzs6oFfCZS9AT4AHfmEiSYmm2z5xTpzHOeGaTnAn3XEHPllKYa2KCdwVNlSwJDB+F9e fsnOPPNMOZIe5QoJlBKAe6wTUAIwyG/LLjAAGs3IlBAHAJds5JtFrrvTTOXFt8yAe9kybVkrpUC9 HEfSZ8DDLwblMTBniQflRB9AOAPyiHflh+pLPXyWU+0Xig+sMAD4lWoL0C3hlNlGzunATfxoG8pF YYHjzhKBVpQs3D9bYtOOOFtuqXrXKz1WIUVaLlosC5FKfe9/fvwJ6yC/H9wrS0xQGrw/4QO76KJL 7W059OS3oxxjFkmZ1qG4wf7zsvOtetMaW7xitX38yWf22muvyZIz2YqUMrHQ4Lq4MFEIxTPRHbtl BUoingk/+CgvFBXZZ/mPzpnZ5rdGCiesJFbomYa1xKYzn7L5mjCqmDXLFt97nIdXDfi5vSs/IKtX PWqnyqoF3lUrVsg/2DC7/28/sl31nq1avrv9atI6q5x8o51x3SRb/f7Prd+pf7Qxr1xuJ8qiYLXS 1NR8xx5XPjz/1TpOum5Qrvw18jXGO4kcQEHBID2ukbk1m86wh5Ru/qK3bHi/ZHcxnl/lejm4nnSd fCNstPWqx/LVJzgf+VPOuz/t43mF7GKw22/4e15+Uo/X7ZhXrrf7VEaUV9x0mj38+UJbrB/t8Pyl 3byN2OKWJbS03fr1u9s1f1voZTzxnaTOtAvxfG/Uv6rqVLtbu9XMn/+G/bTXar9X2mH9+pPtoXd/ 6u2Gj7Wq9afaQ6ov72q1BmUf3rC3P0L/fvQenvbHP9rJypO8/TkNuc4miH/1qvftuiFD7PoP13k9 7jphtX/ztMPq1d+yR51nlVsFvTe8n6f1uimvKj0b7p/f4vtOUNzb9u67SZvXC9PWbd6otqTOfewX 76ssPc/Tf/6+LXtvuPU5+SEbO/ZK+xbx+mExsqrvCJsk6yPuASukP/170ga0KfHUO+6nqt9we1fl rlv3hJ2ueNryh2/M97TPnZNYTWBdwXuX3GfyLOf/VT7I9A3T/sSvP/6epP56Tp/dfqSt0i5Ba3e6 xF6YPl1tfr8dKx4sXHj2NdUn2O9fusp6SrmELxreHfhZFrph1x/Yy7Lerpg1yk5Q3mb97fKnP7AP 9S3/8pDVtlJr/RcsmGfLO59vr2q5GeEfvf22ffjn822A8ontQfucc69NHDvWPnr0QuvB86/ZzS69 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 5MCSA98XB/4f9F0gNMnnB3IAAAAASUVORK5CYII= --e89a8ff1bfd6fbbf7604da758887 Content-Type: image/jpeg; name="Image ST.jpg" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: ii_13dd8f87a7a37f2c /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG BwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACZAMIDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8kfj5 8VdQk/aA+IU8jCS5TxPqajbCvGbuXivXP+CTf7Dnjz/gpp8bbbwH4alj06GC9a+8Q640Imi0OxUg PIwIwZWJCRofvMcnKq1fOnx40/R4Pjv41ghl8QhB4h1BUjR1MkjC7kAz6sTgfWv6pf8AggX/AME3 tO/4J/f8E8fDmn3cU8XjXx8kXibxNcbgJnnmjBht87VYJFCVGxslXeXnmqbJsfSf7In7Jfgj9iL4 J6b4G8C6dHY6XpgBuZtitdanOR81xcSYzJKx5JPTgdBXqquzA/I4xjHvVBbGC0Yost0+SMIGyFP9 K+WP+Cqn/BTbwF/wS2+Bd54u8UT6lrGv3Z8jw/4dtrtYp9aucZ25wdkKAgySYO0dAx4pFH1Jrvi6 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 --e89a8ff1bfd6fbbf7604da758887-- --e89a8ff1bfd6fbbf7704da758888 Content-Type: image/jpeg; name="ST TRADING.jpg" Content-Disposition: attachment; filename="ST TRADING.jpg" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hf4z9ono0 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG BwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAJEBCYDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8Rf8A hVmjR6DY3Tvqxmvd+EMsaBdrYHVDmurT9ivxNc+GNF1i38LeK72w8R2n27TJLUJOLuDfIhcbEJAD QyZyMjbz1GeL8ReMLix1a+tVnwVlIkZlXA5OFHpxX9CP/BKrxVofwx/4Jg/AjWE8NS674z8SeH5r W2sdHskk1PVI49SvR+8fgR2695JWWNScZyQD6OWYKOKqunOfLpe/3HmZpjZ4WiqlOPM27WPwt8H/ ALBvjLx5q+s6dpHhLxBquoaCgnv7e0uoZGtYiMh2wmOnp0wc9DViw/4J3/EXXPJTTvAfiy+urqOa SC1heOS4dYkDu3lhdxXayndjBzwTX686z/wRx+LepftXa38TdN8caH4M07xbdyPqOhw757m0spwF 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 UzeB/EQv9OtI5dYutQMUDi4AtI7lbi3ge9uVW5luWjlsSYjAv7seieAR8G/gN+1hrvwL+Jnwr8O+ OvHuv2nhDQnvNT8P2935VpbaPp0c8cF604k05mjiuAZLeGSWTzois0Hkgv8AmX49/aZ8XfFjQfEO heIPFWr32l+LvEr+NNatvIt41u9WaOSM3J2ICvyyyARriNQxwo4x2fhX9sDxl4U/aDtPirH4guLv xzp9pBZw6lqWi6ZqkeyC0S1iP2e6glhZ1hjUeYYy+Ru3bstRzOVSc5ac1r21Xwwb0eiTmp+sZ6rR JZqPLTjCOvK3a/T3pW9fdcXr9qN1u2/prxH4p+HviUftG+HLv4VeET/bfgix8c+GL6Gx0+OXwxB9 gsbyDT1YWfnMIY7iOHz7eW1afy2adZhIET5+/ba+BGtfs+fDX4EQeJvhlL4F13X/AAVc3upR6voE mm3dzL/buqhHkWRFd3+zC2AZsny/Kwdu2sK4/bV8e+DPi7qvxO0DxhrHhzxvrOlLo8l/o2m6fpSW tqLeOBEtIbaGOKzKRQRLG9skbRmNWQq3Nc98ev2ovFv7UGn+HovHuuDVJtKikmtf7O0PTtMkmkmS JJri6e2gia6uHW3hD3FwZJW8tcucVFVczi46aQvrfWKqL53UoXb1fLrrqXTlaMoy/mk16NQ+6zUt ForpLRWPpjw94Isf2dten+IWvfB/Rn8NP8GdL8SeH7q+8L20trqd99m0q0mmtRfW8+n3BW5vCZ2m tbkj5wvlTMk8fJfFX4+6J8KNO+G3xLi+F/wpu/HfxP8Ah4lxLLL4U05tC06+h1q+s5b2PRmgbTzN LaWccRXyBErPJKqCUhh4v4x/bD8c+N/hHpvgi+8TH/hG9L0ttBtbJNI0+3drQvZs32iaKFZZ3A0+ yVZJWaRY7dIw4TKnj/FfjtvG/h/w1pV9qmrXdr4N059I0n91DElnbtcz3TxqUUM+Z7mZtzkn58Z2 hQKqNvZ7S0/w/vLr1fNG62fL5IKfKqMYyXvWjft7saaXr70JPVfa82ek/t4aXouk/tG/atI8NeH9 Et9e8N+H/Ek2n6faC2sYLrUNGs724WGIHEcRmnkKxL8iKQqgKoA8fTU47gFpLHTNqjICWgGT25z0 rW+IXj7/AIWbqqanrmpa1f6jZaZZ6XE4jghVbaztYrS2jIRVB2QQxpuI3NtyxZiScO10Sxi0+Bnl 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 S3luba4Z1WCzhcSB7WMAlyMFvlJIIKKKAP/Z --e89a8ff1bfd6fbbf7704da758888-- From infodesk1@london.com Tue Apr 16 03:24:20 2013 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 5FBA17F37 for ; Tue, 16 Apr 2013 03:24:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4326C8F8087 for ; Tue, 16 Apr 2013 01:24:17 -0700 (PDT) X-ASG-Debug-ID: 1366100651-04cb6c2c1c259750001-NocioJ Received: from omr4.bezeqint.net (omr4.bezeqint.net [192.115.104.9]) by cuda.sgi.com with ESMTP id JOoI7gEEdGqYVoTX for ; Tue, 16 Apr 2013 01:24:12 -0700 (PDT) X-Barracuda-Envelope-From: infodesk1@london.com X-Barracuda-Apparent-Source-IP: 192.115.104.9 Received: from mas27.bezeqint.net (mas27.bezeqint.net [192.115.104.157]) by omr4.bezeqint.net (Bezeq International SMTP out Mail Server) with ESMTP id 062AA3C0BE; Tue, 16 Apr 2013 11:24:06 +0300 (IDT) Received: (from mas27.bezeqint.net [116.203.116.138]) by mas27.bezeqint.net (MOS 3.8.6-GA) with HTTP/1.1 id JHL23887 (AUTH dorit137@adv-levy.co.il); Tue, 16 Apr 2013 11:22:11 +0300 (IDT) From: United Nations Subject: ======United Nations Fund Beneficiary====== Reply-To: alban.chamber@lawyer.com X-ASG-Orig-Subj: ======United Nations Fund Beneficiary====== X-Mailer: Mirapoint Webmail Direct 3.8.6-GA MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="-----f63189fbe714bc020ba464fe3fb9b75e" Message-Id: <20130416112211.JHL23887@mas27.bezeqint.net> Date: Tue, 16 Apr 2013 11:22:11 +0300 (IDT) X-Barracuda-Connect: omr4.bezeqint.net[192.115.104.9] X-Barracuda-Start-Time: 1366100652 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -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:; -------f63189fbe714bc020ba464fe3fb9b75e Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit View The Attachment File For More Details! -------f63189fbe714bc020ba464fe3fb9b75e Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document; name="UNITED NATIONS ORGANIZATION.docx" Content-Disposition: inline; filename="UNITED NATIONS ORGANIZATION.docx" Content-Transfer-Encoding: base64 UEsDBBQABgAIAAAAIQBoZ9nwlwEAAJAGAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIo oAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0VclqwzAQvRf6D0bXYivpoZQSJ4cuxzbQ 9ANUaZyotRakyfb3HTuJKcGxISEXgxBvmaeZ8WiyMWWyghC1szkbZgOWgJVOaTvP2dfsLX1k SURhlSidhZxtIbLJ+PZmNNt6iAmhbczZAtE/cR7lAoyImfNg6aZwwQikY5hzL+SvmAO/Hwwe uHQWwWKKFQcbjz7IQNAKkqkI+C4M6fC1C4oXzqF1CDEjOpY873CVdM6E96WWAsk4X1l1JJq6 otASlJNLQ1JZReeDkxAjlWbKrKG+q6j5ePQChViWmLxuyNsujh8P8yNVbaoq6ot2DJiiFbJJ q5t2TIAyHoF6qvO7ODNC1gnEhfaxo5Lu+PYJnHyGJsVumjNeoWE2QtuD/5M+Im7La/TCjrdX Hqy6UjMemLssUFTT4Hzk1BoXjwNUTa5ApTQTHgJqaLrndPqASLNzhVmMe+au8ut9gLRfgNff 4cUZ1DS9kgXtnJn4LuFivZYVtKfuNbGG78+rpf+PvMtI03/ShTPCOGysCt3Sdbz+n4z/AAAA //8DAFBLAwQUAAYACAAAACEAHpEat/MAAABOAgAACwAIAl9yZWxzLy5yZWxzIKIEAiigAAIA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyS20oDQQyG7wXfYch9N9sKItLZ3kihdyLrA4SZ 7AF3Dsyk2r69oyC6UNte5vTny0/Wm4Ob1DunPAavYVnVoNibYEffa3htt4sHUFnIW5qCZw1H zrBpbm/WLzyRlKE8jDGrouKzhkEkPiJmM7CjXIXIvlS6kBxJCVOPkcwb9Yyrur7H9FcDmpmm 2lkNaWfvQLXHWDZf1g5dNxp+Cmbv2MuJFcgHYW/ZLmIqbEnGco1qKfUsGmwwzyWdkWKsCjbg aaLV9UT/X4uOhSwJoQmJz/N8dZwDWl4PdNmiecevOx8hWSwWfXv7Q4OzL2g+AQAA//8DAFBL AwQUAAYACAAAACEAij4P7EsBAABMBgAAHAAIAXdvcmQvX3JlbHMvZG9jdW1lbnQueG1sLnJl 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 zxKvepMjvM/1+O6b2M1qH02xqp5wir6p5Q9FefP9fD01ONr1Th0a09gOO88v44aeOkE97Qaj ipk7C6NOlYpRPqdCuXS0k/P8YI4YFSWdBF/EqCCMSoBLmtEnXsXBriBLjAq6BSvqcUp+3k1O jYVByp3f9AClswJoM8cx2CUtJk5pKcOhFd+HfYUfpPaFnoplxcCp8PvH0wvMvEHVsujfiqe/ K4v8a1hOH6ef5NdpiVO6/vLOkW3QWsphezUq1UjEHdWddJ3v88hxCg9QWkmv8R+/wSnOuTc4 RabNZdT5OjoHKycr3035BOkpMUKen88LPXe7OYquHT1OZf6XOKUMQ31OMaOF+76ecpyiDqUa lfLnfl+vdJQy6tJP0lKx0WTwApHutub6yfeTllJtSvMolKfwGOVxSrcz5QPyM3Nz5/k5qT6l n6l8v265uXZXp47sR8/1KNfCyvwFqE3FRIpNsAbeyMe7ucLxjlSTQlOFtJSy51rhEWQA8f4i eD4KX/CO7j1s0dKVtuu1s7br1TO2//SH9ur5j2zVgWtWs/WMTVq0354rYz5R+TrHqYlwSrxS bUozZj2Pz6tN6ba4JCb5S/c18086S7k/fx7FrLVoqI3nHKfmbDzr9FLNyxfw/i45/69mKzl0 /MDq9SfRWspanHGcEqPmbHoLTr3pOCUtpTpVGVqmeAEe4PzXPG015yBaav+NOpXqVd4ij1fp eX1FCw6ipfhs9fhUX0NV1PMAxajK1czT4DitDk235m28zLf5N511vKrweVULs1iT0Vj58HM8 9bO8Oa/ZSPIVjk9l9ClPodY3g+zk9APs40gWsEJ6aqXdRzZ+4OBC9pqssqGjSuzhJ0fbvb0G MHO9A2xIgE/0uyWhechV3OAUukr6SLpKjynPp7815XOdnoJT8sZU31Id2vcCVYdKhDOaoSXP Tz126gUP4uFp7qvmQXwbp2K5TorEV5Z+Eofk+YVR9/Q4FYRTYlI8fEp1rwlSr9Jj4lejps3J 3bOvfIry7reXS5fv96c45Xw//j3iVHZKhJU93M5qRnzf1ufl2Ea8vp1iFP6fxyl8v/w7yPvd yZ69d4U41SPEqXvg1D30U91HP9X95L9vh1OeXyhOvTmVOhfabvkjSVZ5762cWv0tnFJt6uiE epyS3xfy/N66hVPdnJ7y5ybFqhYFqzQXVksZCX8/Dn9PDu3ZoddEo7e0dFuPKQcYzWyjAAyL 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 Ok7xuy6P0OdUW85N6dxXbUorHm4noqcaoKcS8ETbNcf/bBK0OxuH2bP3tLS6YXBqOH284zrZ 3rzOjlHy/G7hFJm/vQXdnaa6XU4dmz6AXHo/j09TmO1X8aAdgVOqTR2aTI6CWRQbBre0BQ9E 2rxe4W7+rDTVWmUoHg23LU8x2+/5IPsjNqR3qomb7ef6p/6LnNL5XvsYepyi/hTy9nSUDyg+ yf+rv+ehf1/PiTvijzjks8hxi/s3OHWDV99klRj1bZxKHDjJtKSpNENJ/p+W9rsKMJNQPmAK +cLsbg9YQhMyFK2YMa6V1hBOkTeHQVmsNq2og3Dd07QZ51A0V2t6HzLSxSn2LIRVLTn/KlOt upVmqmZxTm5BBsE///+1fT/1R/mc0m3Xp8V5XvxSLkO5CPFUGSjldZWlkGZynOLvRJpJekpe ipYY3BwNpT5KcUo8akC/irIT8vEaUQ9oSh1L2qoxnBOn5PU1Uy4Dxklbiest+B6tYLkyEqo/ aX666lEuv46OEpOkmcQrPS426bFMeObXqzriZ7ZrQ76fv3flicUqMUq1qSj8Py2XqSC/7Lw+ fL+uPXpaVc1i23X4qO09+qZtxfM7fvUnduaHH9ixS+/ahQ8+tJ/+4Q/28z98Yj/69cf2i88+ hU+/s4///ivWP9gvPv+f9tm/mL33qy9tySZmrJZvsmcnr8Xfom+JXHfe7D14d6eoP6kGxdxZ OFUKpyajn4o08w+9VAajpqzD00MvTXPZCvQW7Cpbrr4rzbJ9He/sJNrlnC2BS4u3X7ClO+j9 3XXZljsmvYOuumAr6AUWp2p3X3H8EqdmrT6BL0gP1ssX3arZdAHtdcHmrTtvs8g9TINB0lWl sMOtGmUv2BcLJs2oo8aE7prG/RkryULw2NxNzMJ4iT4udFTN1utWs+26zef2XB6bjaaasgz9 tPIyrIJZtefJDJ4mX3IGVrFqz1oh3+ex8WvZE7HUmt053Bp1ed6a3vkivGLPkEcq7GHmYTwz bpkNZ4/HsVOZ21661fX7Pjt5iw2fyswnepWfKWK/kqI1zAhcYY+NmMWM9QWWV15nY0qW2bND x1tu5x54vkH+j5mVz97M2htYPJCXl0Z/RHJsNPlQZSs8TrUkj/p1TjkPjvO9GBWMQRPBGc2G jI5CPymrw++Vlvjk/D90kjik2YDaG0TfS/MsxDbHJJ73Xy+N5WpYME2fKx22iFOt6aHSe8Sc VDjk6ylxSoxpwN9PA3EKbSZONSYvIt2lpTlPmkn45ziV1ZL9P1Jj7XvNwmxEn0xbNaKb49Re MhN7yaJvHZfralOaQet8v4ldbXeIU3vx/m6bUzMGmNNUU/D+WPU5pT6sYyXsK/J4mmOUWLXk QXLp/bXvVITj1MuDo23XC/HMSafHd1ya8/zqc8rlJ/6Eprqhp+CUt9fGGNffqx5ff6nn199H Sq/RPhxauu3tLYXvh3aKCXEqAJt0W0u34/rRvytG9ecYWrHc1/PRTlfhAaKXYliBvvBIn4X+ q3gxCq2UOKgQVvFenrsxkx09FcXnioFXif3yLevuQRbVOMfSWmVZs9Y5brZCa87nOao/4eup tpLGeblZU/b5gFNt8AEz0qWl5P0xa4LzuzJ/4lS241QbOKV5fZ5O+WtzSllAxylYIDZ9O6fQ NnxmNzdKnIJXqrH5M2ikn8QoZX1Vr9Ly9ZV8vyT+juTnKTOhTHgT6lmdOuZSx0t3S3Up6Sl5 gNJTrWCjsn+Z/Ly8ebTqoWK/ZOYyiUlZ8FM6SjySxtIMW2kqaS5xS15gl47ZTovl8H2z+T/S Z9J+v74Po3NJuM4vsCqS690w8hQdut9t1ctW2Ka9B2zNrr12+NxFO3n9Qzt29cd29NI1O/uT n6KVPrWff/aZffh3v7afffJb+80Xn9ovf/9b++SrL+33X/3RPv7sC/vyX//dvvjnf7fz19+3 mTDoybylZCr2uVkO2uOinMxdwWLqVkvw06gblZLrK4RTk/AEC5czwxVOTSMrUamMn/y6zfhz 9Ehpz6rpzFbXURmKReITXPI4dYH5FHBq1yX00wWr5bh6/7vw6x1bue8qrCIbuBHfjzrYAvTX su1oL9YKZgOu2H3dandet6Vb4c3GCzabPF4Vnl5lnTSU6lpvkyOENyvIlqN/pjOLfbpuc5yz 6Sr9xddg03u2AE5pzdvyLp/5qlXDsOm1eH91V8hvXCJ/cd7Kl+D3sYoXniRrAqPy1rKH1XTL +MEYy+yVb3c/Md16PF1p3R+tsM4DJluvR8ttwLNVNhjfb0wF89ynkbMo38b+Wfh/xcx9x/97 rniLvVDC3ovFm+xJMhcD8QkfG11jzxessIJptdb/qfGW2qILXGhA3TGZ/+9UdFA8v49k9tAl 8gFTqVE1IPeXxv7PGU3IBKKtGifE0n8X43LoTeCM8uhxMMWbuRXtjtJA6l1Qj52W/D1l1uXt SSc1JmfeXJxSZg9miXGxvEazuvS3EMnvoGpXqmPF8Jj2kGkBXzLTyQmT29JMvm/lFH9rDdFE HqeYsQ676nNKjNJqQx9WM7jVGC0lPZUYT00LPaVZGtrDJic92VqmRFnPFmFW8Ehn2zTue7Zm RFfbRyZ995jsEKM6MI/iVk7tQU9JU90+pwZ6nKJGJc/P55QyFAeLesKpHlb3cKrNvY9Meu9o W9xH3l84+05FOU4pQ7F7SAIZilRyfsygdbWpDHsjv53z/f7SHEW84xQ9TuinKHqhIv0FCzSj wnEKn037G3qzYsUqeXHSOB6nPD1Vz9sLccuxKcSpIJwK9i90vJLucqyCcfU5FbiFU4WW9FCR JbPixS6e09L3jOzJ3o29Rrt9F3PvecSiGmVbWkaWNW+T6/pV5T3ltlMNR1opg/Mu8yjpgVfW og0+YEv8BHGqQzvOj/U5Rc5a/VTqw/rb4lQ75mmEOIVWEatu0VMww5/FoRqV4xTn/a9zSn/z PqfcfqjoKekn/T3K+0vlvupOHTvkOB4pXyENJd2kJeb7nl9LfL+Ouez/BXe0xKGWzLhVbUp8 ykE7qT6lx71Z6/irMEs+YZeOOW6518KpTpoPwudO4HwkTuk8oWtYdw1MXkKsyoVR0+cusJf2 H7KXD7xmO48etyPnL9mhc1fsrR/9zC787CO78tFv7Ce//S1+32/sAzj16y8+t19//gf77J++ glW/s1+gq/74b/9hf/+//tU+/vxL+/R//IutP/g+ftRi5g7txPN6nb3nd5KhOGwT6UcqZL7Q 1HXoCzROEdm+SUtftQI4VQKnpm88YbNeph+K2tJ8eqTmq5/3JZhFHUozKRbKz0MnLeK4EM9v yfZ3HKfqQqxaseeyrT3A/L/dF20Nx5X78OU2U08iwy6PsG73NbfW7P+JrX3lJ7Zm3/u2cveP YBX9YGT25q4lv7eG+hkz1yvrcWqaOIXnJ0ZVLHsL34/9RODRXHw/8Wkuaw6MmrURDbX+Eu/F 76u94jFq8TnnA8oLLJh3jL1E9rLn4gy765GZ1KPmse/8KnuC/PnD42rt0QnMnaD29Fzecnty 5EJ7dMQi9qGqZbYSnh/1qWHlO5jZzrzacmYqlW5jPy32JpnCrKrSjfbQiBobMLTanptUZ+NK 2GtxfKXddd/j5Coy+D/nmiSS2Xtx9Epwzk6JJ9NAD3jDIForLtrtCXILp/D1VO9x/VPkE6R7 otE9ypuLNWJMJF6y6wXnGMvvVSI80t4wbn8YuJRKfiMFnRSERfr9c3qe9+p94pTLrutrcr8+ p8Qq7cH77ZyiVsV5R5oqiEb773Iqqyl/s0kRdn+rcCt7ipxffg9bO5LseR459JHtQ5zq+E1O MSPiu+DUmzPg1HSvRnWDU2W9XYZCnHqjuAfz/BrYnJ5htqhPjC3u7dWoNj7hcWrbMwFmUcCp 0cyiyGvKXvOa7edx6nhh5l+eS3f8CTEAnRTF+T8cPoXDAtf/i77S/FjtzxGEE1q6rcfc8w9Q a6JGFcWKhk8BcWlAocUPmmyJDxVbJM9LW8UPhDc8Jj2l10WJURwjxDr0UgAWacX0RY+xgv2Z ATiI9zBjyc1Z4n48+kl6LoAPqV5ksTWz59MW2fwO9nHItkZtOlKH+r+0nXd8lXW27pGSEELv PY0ktFB0FEfp4iiCitJBCCC9hR6qgHRChzRaQicklFBU7AgISBFUUAYHpDfbOOWcO3fOrPN9 fu9+Azhzrt5z7v1jffbe7373zk4g7zfPWs9ai3wvf9NH4eWLDmevBzqgMjMYKleiVhWmXh9y Vuz4jOKcOq6ujzeOa6S/P6kG180wl0cjr4Uuke9bDNB1VP1TETrGrXRAFH53zXcQM8L4ut7s 2SpuZpH2TCkvF8s1XMfroC+8ehKMRFdII+m4mKNz5IvQY/+45pzrfRU67r0Xsx44T8f810Xz OeT3cz3OzEKTz08hDaWcn+bMqOdWvolC/A6KU8oTyu8nVhUOpteR40FoGXkh69SKRSdFeDqK fKh0lHSVcn9ilatTcUyevxj4IvYopKfy/BJ8f75fXd4+efzEpDroKOUCdUz80p7FetTYavCz q8PXjOC2BJ+zONcm348lRj39/Is2eNxES0pdZambs23bW+/Zxr1vk+vDM3HmnB344rwdPX/B Tnx9CT5dcjWpC9eu2B9uXLOL16/YtTs37db339rN7+7aldu37PKtm3YNbXXnpx/t08v/sHmr 3rJnX5nM/qd0N3tv0Ovs+piFRz2J3lvmjCfgwROnFC7nh6dvYhpecmKqZlDQBzU78zB5tUPw ivvM9Fuw8Ygt3XYSTh1AUx1idvrHXsClxZvRUtuOWsr2E5a266Sl7DjBY81XPwTPVMciJ7jl GBw7aSt3fWErd35haTmfm5i1ZNNJWHXU5qzia6V9hJbS3HU85isOkufDZ677yQfxRxxg5qzm 5XLeGuX7TsHRT/AlUotKP+oYNW7Zh45To+Z8QF2LWVApJ/EGnoDZuewJSbK6T42xJzu8bs27 wpXeSdZuEH3S+NC7j11jPcYzu328ZqfT3zs8xToPXmFdhiST32Om+ohV1nEYe38HpViHYSvJ +61y3opuYzLg1lryrOn24sAl1rr3fHu+91QbwM+9x7A5Fla/Nf/u5eAUcwBLVKantjx8gR35 yePBH+1gl89COb9K+H7KFsOTp+Pk00rgYVAdqii9uSHk/HwtJA+f9/+b2hK8kA+wKExSTtDN ruB+iUJoKM4L4vcgmPcIlabifcU5neu8gO65ghZJzaAMGqxWeAQ7Suj3Imet+pTrNZY3Hq+E +rWkpcQpedOLwc/y+PrkGVRuUPuk1HMlPeV2UJE3rFCKnCD5zhJFtWdev7vs0Ob9Y8oWtrBi +axd3aI2om1dW9XvYVs78FFbFx9uWQM8D4W01EaX72M+Ojm/+/1+WcM9b3oOPNk+6kmvb2pM U9s1ppmLHWOZSYE/Yid6aRd1qNxAuFmzHHtjUmvnoxCj9iZSp9L5I5mzPoL3GIXnb/Aj9E6V cPWpmc3yOz0lv9+y1vnQVNrjG2yaQau8n/SUl/MLsz3Up6SpcofWcqxS/m9fAr1T9Pqqf8oP P++nvYVij9NVMEtz031NpT2GYlEh+SmkqeCJt1MK/cWxPE4FWKUcoMv3oZ3EpaJwSrpJbCoC u4pwrDDPufxgQFMV4H3v51QwjJKucpx6lryfcn/wqgRRnCgGtxyrqI2JU7FNO1pw9Ucdp8rQ 716ZHJNYJS1VI9yrl/icCgtjDyJ6qmqle5yS30/awPeni1NevYfrM2z6RU4xp0HcuMcpcmIV 1PPrsUW80pw/f4+vzhVz1BMlPvm8eZBT1Gi5tutchfqHxTa91z1OURvS6+GofBRik2pSeZwi n+fPoC5emP4Trv2Ou3x/Ok+80tyOggXkBc/H35ghzhdRM0Y1IzSnfi6E/OfK83k+SXn6YQxf M4rXqt9XeT71TolR/k4q6SuxS2zybvl5w7Fa7ChRjcpjG7yGUXH8LGpy3sNouAYwsip/B2gW rbRUKL/XjZq1sIEJI23G4uWOUxk79tjO9w/a/mOf2sEvfg+jvrJDX16g3nTRTl287Bh1jvrU H6hLXbp1w765edVx6sZ3d0xx9c5tF9dh1q0ff7BzN83ePnGb3YTL0AJJ1KjYDT85wxLQVo5V zMIbTiQswjOhninqUGPwnScmUxdKpS8qDW/5ao9Tc8jTzcmkrrQeJsGZ5TmnHKfmw6mFmw67 nN/CjeT8YJU4lQqfVu05bav3nrH03E9taRb1Kjg1j1jK69N3nrG1e76yNXu+tNW5X1r6jrOW nPWZLdno5QDnrj5MPYte4ZTDLl6DT/LtSUNNST6EF0IzCNUvdQSewibuJ8Im8ckFOmz0XDTU gkP0b32MV/Bde3nganuk9RTHqN+0neIY1arHfDTUYnt5KLOn2DPcfRx6id5esaovzOqFruo2 jOfgVBf41B1OdUVTdSHf1w5WvYQ/vYP4NSaD3itmVozR8aX2u/g57K2a4fzq8QnzyB+OtOq1 GjtO5ctXxHEqqFAIzGCHSzC+Bv5PFA3Cc0eIKbpVvakSv8/ludbfn98Tm8Qa7YYRZ+TT055C he4H6zgaSTMmQ8gLilMh/E0kTsn/p/fSe3iMIw+o89D5peCg8n41uZbEUOuu5nOK99R89gc4 Bat+kVO8V1V6AcszO0mcKkmUEqdglFhVszx+kuL5rcsjZW18+9+wZ76BrRnwG9vUJ8q29me2 H/Upx6nBqkv9nFP3+qd8Tu0Y3QQ+eZzKHQtvYJRCfb7ilPp7xap7nHr2/8ipnIENbd7Txf8L ThV0nFLe719xat+QAKeG1Q70T3k9vl6fr8eqPE5Ju4gLhPZtaA6fv+ujYHNYhL5ye6LQMJrH p9DODh3Tcw/BqPwK9FQBl8eTLqKmBJOKoJ90WxhG6ZhC9/3HQbBKrykoDYVWCoJnOqb7hdFP YltRXl+M9ykeiKIcU09WcHNpv75Wo8UrFhLTwkKr1bZi1etYRZhTTj6IcHJ3cCqMHGBVWOJ6 yPFURBLVqH9GqreHa6Suu/L8OU5xDfc5pWu6PAm/xCnNI/c4pbmCmm1HncbNpuC6zfVax+TP q6VcGF/P51Q9/G7SV/c45emmOlzLdex+Tvnn6L00l101K/FK7y9fuj6n/BGqSd3jlJf3Ux1K Wkq3YpXmfv6mXpw1afSY45Z+D9XTW0E6i/dSnUr1KLFb2knMkq+vCj8PV5/CRxEbzWeMgjec q5qUuCM/hWpS6vWVlpJeUp1Q932dped0X8zSaxy7VCckHmZeRaOGcRYTW4N+E3J+QYWsIZ9x yLjxNnHmbFu8OtPmpay0LXvfsd0ffGzHzl20w5/93o59dd5OXPgaHfUN9air9vsr1+zrazfs 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 LWsWy2dP165qM7s+ZknxjW11b82crWdbXq1uOQPg1ADm/A1i7xS1KXFKWkq7p+ShUF3qfk6J VS7vl8cpz+PnfH7/BafEK+X8nJ76F5xKfqmyTWJOuvqn7nHK01NrO4a4Hl/NoNWs9DxODQ53 Pb55nKI25XHqwRnp4pMf3jxYtFJzeSTk5aNWhY7RvD7l2PI3kV8iMB+ppXwW3nNF4EdRmOF7 +JTjkz/i5x4/HfdDtSlXf0JPuZygfOvcF7d8r6DO0Xs4rcVzea+Ba3qNjisfqFqYdFxheq6K PjfMyjd8xvJViGNeOtfeyszmqVDK6lfDm46eqk7doxTX1nJcf6vy/60yPVTR5PUUkVyHq8Mp 5bykKeRvkw9bfnXVrbSPqhr9U/LUKQ8oH6BqQrrGyw+ufJv0jI7LzxAbgV818Jz0ivY3ioc6 Xofruh6LK+KL6kW+jhKT/JqUvBRim3Ybik3KDXq1LjSM8macK40l9smHp5lG4oZ8exWpL2kG unZzqA+qLPm/IjBKv4/B5P4qSmvCHPFHfj6/piR/uRgilqhupIiGN7Vr1nDc0WOdI62kHJ5y fao7KZfp5yQ9fef1g4nBdXleXPa9jvr+5DeRp1F5T/lJYvm5K2J4/xjdh3t1YXs95lU8XK8O v/el7He/a2kbNmba2+++adt3b7f3D75vR08ds6+vkPOjNnX+6mVYc8350C/exEdB35R86Qr1 S12/i7b6Ht30PdrK3cIuvBR38aX/8acf7Kc/cfvXv9jFq1fsj3831/87edFKe2X4JPpd08n1 reV6vwk/AjOUFrHjYu5um7XuNLPSPUZJU00lxKwZa9RHdYT9U/Q4EYu2nrLFWZ8Sp2wJObsl 2YS71eNT9O8et+XyBhLLtxy3FRxLyaavF7/EcmJZNn1TOWdt+Y6vXCzeds7mbzpjMzNO2DRm H41LPmrjUz4hjjHf6ZCNWPAhfo8PmTF4EA/6YfKVb1nviTmu77b3hC3M3NvOTkW89Ul72ZO4 38YmaU4S+xrh1ij8FSN4btgMPI4ztnN/pw2YupVdU1vQV1vQVdJOm63r+E3WSTUuIn5KlvWe mm2vTs+xfrxu8Bz6oeftgUk51mMCum08s5SInhPWubyiODdgOv4UdJdyifHjV5BPTLd+U9cy t5Y6Fhqu00h6sUanURNbTX1suXUdzdz1gbOsQet+9nDreGvTJ9GadOgLu9+zLy/dtrc/Om7L 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 VvWCUb3ol8TcKfkoxCn1+JPXT5xSLmxwlRTOQyG/35CqSU39KGLrilMpbXZDOPV2oH7qD3wU /1FLiVGJOOX70aWVnuSgOrhclTST4n+6RjVWyl/53BLDfD0lxkhH+bkoP54nTvm6yOeUn2PS UZrqN3zi/l/1USSpIk71Yr5va0tXp60Vev1Ne7YM8SD2tkzsgSHkN8Wp4uipUP5/C+a8NFW2 fOR9noJT6pkUBNcSOKW9HwaEiVMFqaFFZ8m/pzoq+dddPwrez++zFAIPdE5MUp5Kmkq3f8sp r/eEzykdxS0/9qf9PVc24gpoKPUdkuctXZqUTsNoDlROPoPfcyI/3015KMX8xCY/N6VclHJS YpR0lD+nQ2wSp5STUn2UxyB5KuAHjPHyUcQ7ue/X4iqf5T3Pi+cpNikWSUNpiVG+hpJ+8jSV d40+ewl0ka5TryU9Li0mTinmp/yT81ZwdN4KXrsYrx1BHFHx20L8bigBr14uXdKqlCvD3zK3 vUBuISOsqoXHeMfWbXadPUsewHv37uH7u2g3buE1h0vKUV25xbwPeSkeEs9DV4lTYpivpx6h px4/vmU//XTLfv7pNprqof3082O8F7/YzYf/Zbd+MXL0t+yDmBXW/cOFrkZ3NHmpceolsYRY 3lJvTVQfdOJ9jlHoqcnE+pSTmr7qm8BSfoqclGNUgFOLyU1RvzRi3j6npwYS84vEl9ctZpOb wdEVH3rXWHFqq7UbSR/0IWvsvZ7ULw3cSK8JWDVaMxvxGZKDGrfsILE/euAuIF8GJyct5f1g z8wV39kMcQlGTVxwlBjfCTSU2HUSRsFXODUbTTVvzUmYdtymrdBsxkPwbr+NmPs1ubIviUOS o5oGs6bvhFfUGtNnSSz1dBX6inhgb3r19p2CLzFG8+03kDdDVyn+h6bqSPyv0/A4vIr0ZY/W /CvNtcLnN4j+fkPoVTuY3rY9qe9tOwqv33Cr/nak/aNNH9t96iZzwh7buZuP7NyNm8Rh4+mR dd0uXrtGT0c8NNJWcOo0nDqFV/0krDpC7e+R787bgeNn7Iu9h23t5q9s/tI1NnrCTOs1cJSp 12xwRISlpz9EJv5fyoxOyoBOygOL8sCkgvAqL3zKDku0cpA7EKuUm5KmkldCmkozPsQo38en 2VTyUxSj9iqieHH+zQVzLV4+OOXlqby6q5x4/HKjqZ5Lo35Lyl+pJ+CzFpErpUXkTmkfNS5t 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 tVbD58Is7jl8HrW8eDicdTUBz+FEYnzTFtM7aelfkp6aAWun834qfSqmeJzeShPIVY2HV372 dnJqg+jRNIBeTa7bZsmrzL/efxqxwCIvReo56PupetbpYzHe+F/Wc8kaYD2BN09ejtd+dpx2 2S1x+uW3xst/2hTbqbHesvubNBNxA96JTZ+ir8gP6uHc9gmcYuWc2rTV/FQJPUXN79t/eT/+ /OHaeOaF38XMu+6JoWPHR2GTZrE/tVLqIvWROSbjf3LGWKD7ky6CXb52v7pKLqm3/Iw8yvWW +/y858ivNCsRTtXhs86oqkDsr5D9jamfOPgg+gFSP6W2qgafqqYclbmqStHo0IrMTawQR1Qt iIs7NYpJF7eKiRe1jHsuaxALqJ3K8lPMSrySGR89nI/4781P2f/PtYy+fiv6dU6cevzmzjHu tCpx01EFMehIZiTCqZFwatxJpWLa6XJqn8SpBZeU+xdwqh2capc4ZY4q5anQJLlWyuN96is9 FTm75FO+ZFdZPBWJNbnekSNpZcxJuaQ8zyRvEosyxvw9TuXxw+94VaTVuOb++gu9Ntco5hR8 KsBDmDh1+k1Rq0vPqPGza6Lej7rEfrVa8v8VsTU41aI+MTg4Vbf6IfTcMYamJw4G8HtczSKb cp0kn+ytpKZKMz2KOFXDOBu+hvy8po3klM98Y8/8FmPJDTVOprOymJxxOLWU5zVGM2Reh8zb IJuSj0LNhl6TUbKrFq/VU8Ykk7eD79KA76WHwhyV9bz1XTzLa9dgrhraRUa5vLf7POby+3hf l/rKc+092+LwzB+ex/Wymq0sziY31FryRHbJH9nje1/7Gbmhvsl8EdmMDzWROkomdWjXOtrC KT/nPnnm5+y9YX5LPnkNedaEz5W8tud5jTweaIzPe8ktV368XZMm0bFly6SlWhIDPKJli6hx yMHRoX27xKkW5MUWLlwQW8hNvUf8b+3G9eQs1lBLxXNuD3W+eNd3ENvLetFmOapcVxkD3M4y Bph6LVF39Rk6yvif3Nr1zdex4cuIZS+9T9+8J+jr8HTMXfYGOorefXgT7l5B3Extspj+DiU4 NeZeequjYWSW/SLk1LC7iKP5zKfH3q2zmSc/+Xnifs+mXNSVo5jNS8zvqPPGxGGdr4s2Z90e Z99Ib6FBD9Mrb2FcMXAJ+ulh+hHRZ5x15aBHUvzv4n4PEAucj9fizjj6FyNh14NxyxTqhqe8 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 U+x+xarpsGd9bErhkOXm6Zw/rHJtOLUpebekz86GzNE4OLUjdaG6mm9k00b9eXB6OrbqXveL 5VgXW6L6csOa1NsbLmvzwsnVm9e0O+69q/3ld7/T/sN//k/tnfd+0b74xFNtx87duX+xY23N M718T8rN95U2HXvC7rwPH776WDFq+IT68+t2u27by3hYxad8P1iVhEnFoazrT1XbZrmyq565 Z+xZi5fBPG0T2sj2kezvessxtBMbSLRZ3hk8xM7RrrEdo0b/XvklZQ1bHvbgDt00eDT8UXP3 2T+2F9/CKJzSFmHP2U5PJQ3b8ZbNGe9iY86DZ7nvB3dsKk7tmco46jccaD99LhwJq9j9fhL7 H069+Vz69yaGgu3v0nrq/8wpMelvJr7ir79wdfvKsfnt0Z3p4xtOff7Qgvb01av+n3AKq8Y4 tGMsWsuxTleNmIaLjHr/GHzsdbhFV3W+2N/X6a+5/i12P9oLx9j/LsZi9HiLPib7+2PfMae4 NLH/lX6a+KvEAI4xKozlJ66i662JxgqnlkQnLU1am36+a8OlDYlNl1aGUytzPfPuCKfuzJjp n/xqxqV4oW0Pw7alL9W+k5/N+EnXzvpEvYPaTSN2B6fEobP3ie3DKVwamuqyrG9NPYlTtBL7 Hb007HwjPsKcH+L6+KVGvEXXUtE0qYNpKHWymD51L7+UuWwPx941tNTBXAM27c++Q+HV0dhE TiRu91iW6noJS9T/YicwYMy5iyljP90k9XzO0+Px8Ifu8tvxylLG0Eh4JY9k3X5JfnbBwSH7 yneVMSd6Wf167Ke9LJ3fPmU71+CT+1C2PAzP/RIzIe6PD8r9qdj08Lx8U7nvftNifBSjPa5+ Uf+UfzFL9R7/PE7NRF/h0vCBD1/Fppxv3bYtbU1i/qQNae9L5u01r9PKpGVLl5YvaOWSpZmz MGP2hUubjSUbTm1IbDm/kHg9CQPE9NEt4vzUPxc5tbGuwzUUp1K38ZXrF0VXub4t2Vb9rtSL YRce4ZT+TdvCOjGClbAq17F6yfyMib44uinXldjzDVO2R/dMRzPGjrduTZi0Xh23Oeu5nsRB b94U21P+Hx/9+vig1iUZA0qM/tbt0QYZs3v9lvyv7flfO5Nn81TmDFmd9z3XmHtsvvcViVnf unV7Wzq9NGMxzWsLVy5uVx6/qh06ciRzDK/MXFGLo0m1E8TeJf5y155oybSR8l7vyzu8af2a xHn2uLyulejenrAHn7QxsGQ818EzjMAe++np0lkTm6G2CSZppzi2syhsy/O3jR5y/0cbppdP c3VWYY98yuxtn121D7+1baotG9aPfOoL/qfSRrmH9BV24dFg2PBHyTeXYY5ZG5seTrHnVLxx GHVZ2g/VNsn+TXmGm+M73JS2xrrEvOxhO8/z2TW9oH34wNb2rx7LfFSJS3/3xVsqjuK1p69p b4VT78Qn9cYz112aUy+GU0mlpy4MPZX+vRP/1A+fSvzg+Vvbdz93vD2Zcf0e2YFT8xPzt6B9 5erVxak//jU99Ren57W5euqV+Kd+9Bv01OtfvvJ/01SDUZYjjgJXur2v97+9yKAeRz5+D0ax BUqdXZnjKf2ths2PnW/Y9KzP1VoVi3HyS/EVPRV/VuLxwhDJ+BNzWYVTxkyXMEm8X403mxhz nBpMK1vghFNYtSbjUEjr70lsX+L9MGplrq3sfveEm/cmnuLjZ9vuh15sm+58uh24/bH0o7qx 2o/qCql0v7ZZ2uaDU3vyrvNLYdTg1PbUkRi1yXsXzYQ/OIRZI54Cr3DLnIj01GAUZhlnos/n uzfv56aya/U+Qd3udzj2vCPRWuLQD6SOpqX4o3bnfGIoromOuvrKK0tb9Ti8zhQMUP8XL8Id 9jkxd7iEK2Vny1KcHWZgmDwSvTRiG6wro7iS/COfJT1EbylvMNA252VfHPP8OudgFR01zmnb uA7sYrvDHMk6VmFUxVdERxlzl74a/il5xviGYtl7fXLRdtTb5N2frv67MrYh9d/wo+PTsPFo O0+FTatSL6zesL40lTiKqfQtWpax8xYknm55GLUiPihxC8Yv4rMpJoUTWIUVuIEhkpg9Y0Qa w5i9rziVuqvrqTmcYveZ5VR4kPevc6rHbFymTgy7ilO0VspVd81yKuc0xsXU0gWxQS6qvrsb M77g+nAKq3Dqss0ZK3dNzr0+vAqnpqOBxENsLp9Hrj/lYpQxLWquEteZuSTWbUx/rbAJp9Zu zLgaM6l/w6/1iWM3juGmXKtj1ibtPLCzrdq0KnNepa9ztNWScH1N7uWmzdGG0Wczme9t25bY zsLH6fjKtuZ+s/vt2ZUYHX2/0x7EA8/I8+rr4inYacXudQ55rqVxkgdTJHn5qOQd7MIYnOoc SpvK8Wmz+K0M+XznODPsi8rBL+9Ffzcuq/22dQZO/FH57+WnSpvBs6ryUubQSLjz6zEVfo9x k6zPJP+wC8o/tTbtgHCKxmbXYffbFg3Lflz22fgNt+Q5en6SeM0deT57Nyxuh7avzvy60+0H Tx5pP//qx4pT//apE+3NMEZc+gfSU5fg1Kvh1DsXTra/+sNjNd88Tj1+1fz2hwfnt69c89vn 1BiHdsX9fRy85eHCsviAlibeoMYbCh+WJBnLdXVscFMPhU/pv7TmYfqK3yoaK9vnn4pvKuPn Oc4Y5bZJjhu/nWNZ9su3IPNxzM8Y5pVy7DzzSWWs2MXRS0s+ESZJybs812J8vuXRW65rWZhk uzyVJteHs+yJ5lKU2ALLjxU2LYt+WhF73+pPJs7wTmP/JbYjZU7nOtekrHlHH60xRLdq+4QD 2or6z1ye+hGnpNk+U3n/Z5K8m90God0eX0febXMWaZf5PrS35GHPOxhGXRF/C62gbr8iLGMX YxM7FN+MeAc8sM8cG/xMmKH+V+9jAVZIs7Hl0TTD3zTsffLRJnhh3dgP8ugr1cvo4yoNv9Rc rlx99EiuVb0RJmapr+2IucMO+/VvEssw+jVZykP/4QiGHPvQVe14/GnyOa5sd8lT68kn74jd c7z9M7Hj7co9M7/wXnVJ2rmWH0pMxFXRinvc82zbk7azOR0l+/fm/u7PPTc3pDaFb1+7VrLu mRlblpbyLNQ9tAldwz9kjkj2L2Vviq1vm3EAYvfT93XNqhWJ31va0/LM3xSdYpv5DDfGVrZ2 dR/LQftiQ/l4EvvNN5m0RR2TsrCW7qvfqZfdI32St8amyK82wyeWvLYpx9Jx+Dvybkldb7tz 2qZMeZxTsn09LoWTxvwTU4GJbI/GUBKTUXbI/G9+LrwTS8iu2G2KYVZYaRsbpWPFbDjO/ZGv 8mZ71ZnJM+JB5JdH7Aif7Orcn6WLF2WMjjAqsYcrly8LE6fCBDb0tN2yFHet36B4IzFGM9Gx 9mGT59R1b9cug1EYwfbm25IPa2wbv/EGa8RU9P1dZ+GZ585GMrjnt3YJTkk4JdmvDOVqw/Bd 4pM83ps6Lu+hbc7XOdY5R9N122DiqnJsb+9u6Rz0ns0pp2LYvYMpQ9lsic41+v4OvtFj1jFs bmI7HHnpMjZDY5M8um9t+6efOdXeefGT7dUv3dLeeuZI+8W5a9o7zx9vf3vh6vQHzpjn8Tu9 ev5U+2HSGy/c1l5/4WT7+ws3tl++mLk7LiTeL3rp3TN3tXeevbP9/OzHsp4xKV48mvmpjrbv Pnu0vfXt29ufPfLhdjq+qQe2z2uPHVzRnjiRueevn5f+U5nb4+Yl7c9OLWh/ftfi9s/ujX/q fvF+ixLvt6y98nvr2g9/f2P78WMz7fUv7E68X2L9nohf6sv72ptPXxE/1VVZT3r6Q/FXHY79 70jsfUfb288ea++cuZhWnjbG7IvFJqzAkhpviI6hdbJ/llXxF01VmrAocXoLM8+GMYrkVU7N p5FjHFecCs8cjzlYgzHOM5IxI5zTEq8WhF3KxEiMslxyjzjCcKxSvy7nU15xKn6pWU7lmNJi sfOtDJdWZ7nmvlzL3eIsEisfRmHV+lzfvBs+37blnaGT+Jx2hU+7886y9Y36T9tH3ec7qPFn sx+nvPPsB3xZu/Oue899R9pz4qS1GcXw7Qubqs4uzRGfUbRKxT3EXoZTeGQ8of3Flx7zLQ+/ j23DpyOf7Rgm4ZttfE001bDX2T7y9Ji8izY6XOs2t+5vKiZeebD0C1sbP5CEJ2Lv6Jqj0W50 i1iG6l+bfPYPWxy7nJi9wylHPnn8X9vxS75KOabKzzZl45a6d8yfgj0HYsfBHsvBLttxCrMw an/urf0H1E95Jp7TsKWwswxOqXs8L3VRzdmQ77rHWPd4u+2pB7RXsWlz9BReYdKqsEnCpnVT mWc19e106l775V23Jvau8AY7NqXd69jBKduNczXiQvzGlsEe3Ck/24RT+nJfklMZA3JwStn4 VJzKduyk8cQb6neMK5hU/EgdiDv8HMUpdsLBqbCHNsOfS3GKj0y57l3ZLxNLwZ7pt/5d/E2Y hE2rVi6vtHzpksRNrEg89bpiFE6xM4iHLVaF6ezibAyYM2LMMcF3VM8uz9n3hCNsu74p+9l1 y86bb1BdzxaojMEL7MA5eTFFeSP5Nucyyrp8VV7Oo53pmMGwYRtWpsR2aL80fFmuj89stFGx Cn/UDTilrIsME6fV9zkes8RTDP8VRmGQJUaNOMKxLq9tw86oL/r9OxNzd0/GTXr29sRRnAxr jrW/PXd1+/n5E5V+lJiIHyfW/NUX7pjl1Bvh1C8v3NR+9WI016U4deZoe/NPbmv/6KFr5nBq eefURy7NqR/M4dRPPz+HU0/933GKLsITWgVvFoUXmFAMSH1e445HDw1erQqbKoU9q1LXd35M 2FE6SB+p9HFybI4b+qo0lmNLZ000XJiCRXXusGreHc8mNk9/44zPl9+2L8SuJOzCsqG7XJ9j zU+/IucbsYArEyux+nR4etrYFd9sq+/N76RVsQ1ueDAx8rmmtYll35qY+VWxP+LTDC6lTtNH CqfY+dR32ufqQLEUvgP1Xr2X2YdT0v748Xflt/fR91DxZ2nf7U254vjE7mHVAfauMARHsKLH dPd+S4MtOGTfSINTIzYOd+QRV74/bFLG4JW8mGWeXH4k9r5ht7O9z9/Ry8axHjdxsNiBQbQU 7SNOAU/Y3T4U2yMGjf3FF23gMAaH/Mam6qe7P3F3E0YNLaVM/KOfyt/kN0aljNKYOdee3Dsa Z2/qliMZ2+1w7Jm4ZJt5KTFp/LbEsav0lcp2jPNs2F18u5Z+lw5OeeqhHseZbzvfvTL1lcMn dXTFJYh5C3tWp55dsWRxpanUtxiAMxsnPBj6ByewhV6yf3BqB73wGzhFJ2HULKdSRw+tNTiF QfJJ+DX2Y6GynY/m89s1uC7sHPHwqxN/OGLYsUuf9cGpHuPe4y8wi3YqP32Wl+KUe4RTtKc4 j3EOzKryw5xN0YZYtWrFsvjyFrdluY9YtSK814ew4mDzHcxEQ4mLNf6KJX75Xro+wpbOIP2K scM3hSNdM41YmfdzZ+wf8TKDKZjkeN9oxQziScrHDoyofZM8Q791m2GPp8AdrJGU2b/7vGv5 rd0zeOb8kjzKxakeN9x513nUYwrZWopjOR6jXMtg0GCV91h7i6aybcQF+o1R8g/NZf+Nmxe0 z1y7u/3zz93QXnnu7tj8EveQ9N756zIfbmLVzybGInF/P3n+4+21sOqN87clru+29ov4s957 iV+qx1G8e+bOMO5U+/mZaKtnbTtWeupfnznR3nj5ZPv2/cfbfdFS79NTH4RTn17XXp3oqeLU FxPr90T01FN7288+gJ56O5pKYsPDHUxha6v6f6KLMIXNDQ8Ge0ovhWull8Ip++TBlLLZRS9Z r+PmlEOHvc9uOLENrs65leW8ODnsgThFe+FT11kTXk04Wnoq56356V0jbiWtCqemHvhGYgX/ KOnlaCq6Kil6akPsluvuT3/fXN/Oz3yrbX7opZrn7vLUozi1K98Gu99MGKO+k9iQKj496ztT 73nv1H+9b2nsFbFPsQca28ScVNU/UTs/9p3dqc9xan/qauPHDg5VHEP0FQ1EL4lhoG0wp49b 3n07+8MeNjrcwih8Gb6dKiOcwqquq3pfKn2glGfb8CMpt9sIu92RPZAfSQwEZmAI7eOatfcx io6ikXDFvmLOhDE4ZTt+sffhFBbhXCUMm+iz8jXFlsj/Jj++jfMoB6fopAOpmw5nLocrw/3i T7GL3y3HZL8xQ/bmGeDUodxzuooPSDsCnwajxL4YO8QzGXWCGAXjjBgbyzHq6NmYOfVr6tOl ixakz+7CsvfRVfiDD30cvIxrT/uEJYMb7hOtxD4nX3Eq9S/u2Ecr4lLxJ3Yux0vaAYNxjh/z tYx8/G/yDS02OOgYusr5BqOsm+sDh9j+9Luik+gcHO6cSr2WdX25et/i2BPzm+2PHe9SnMI1 5XfGxycbjaYcx+KXccAwB6tWxae3dMmixEcuqbR44fzSWcYCr/4aefZsfsYFr7HswmQ8+odS 9zmlHZLnaD/bXrEo7wImYIN2oW+xNNdEU9lum+PkG6wbMRjYgDVjO5+QfM6hnLG/WJZ3kDZS lu9dGY7DqYqnmFPOuF77xEvaLy8thXnKtS6mjw0Q5zB0aKO5Wsm7jEu2DU5h0+CTfeP3RzbM a6d2T7U/vf/K4tTb566f5dTbZ473+aNoqudvL05hlPTeV29pf/dS798rLv03ceqvw6nXvvmx aLbD7RPb5rXTl03sfsdj9/tAnJrOuEkb0893Z/r5Rk99cU97/fF97XWciu3vUna/t8sGeHTW TodJI2HR8FvxK2FI1y9hQdhjnzz0lGM647rtsOx0g1U5DrMcI1/5uOLfWjPxb9lGZw1bot+l r2LTwyjcKzth9F3ZBmmqJOul47J/BT9UGLQ4MX1L7spx97AvKufr4dbXE4dh/Ir0yUoZG3Pe zQ+cr3TFYy+3HQ9faHuiF3BqJu/ojrzjEk5hk/qOXQmv1HveNdrf93Eg9aG52/im7PN9DPuF 93NnbDv01JgrCqOwio2u+uGGPxiDVbTNifQ3wpKy82UbzuDUmFsDe4wx6/dglLKwSF77q29t 9BQu0VuVL/EMVVZ+V1/e+K2uO3G08s8kdqjsc9FB+KIuZNPDKPyhpfwenKKXhg0Pf/Dp8KGD 5dOqfck7uIZTjq3xzcMonMK6svflPGXzC8P5+A6GTYeikegnLNmTuoi+qvXca+v71FVpS0jy GdtqtzZs6iTJM8KoA/FteW7qho35zvGp2r5pX8g/k2XZxlK/9/mclheflqhTU79i1PqMg4cB tM0lOZX6GT8kfMEdLMJiv3GLPwqTJDpyLsPYDG0f+UbewTi6Spkz0WD22V6ciq5Svj64/EX6 cdFWgz2dJ91GV/EXuRdjG74M292lOIVR7hc9hfF455ju44rdMLbQYc+bSn/j5dFTw/63dPHC GvvQb2NWsvPNhOEjv2144NuhqYau6pyhYYZPKu/8nP2DQdgweMPe0TUVdnW++U7FO+CQvIMl 9X3mvyhn6CJ5h62ktFSuSz68cT2DpcrGG9sdSxcpp47NeYpFbHPZ778Vr+oa0pbNb3EYm7QT JuUOJtFGw6ZnGw7ZJg0NhWlzWeX3lVsWt6u2LWlfuGWm/fmTd7Qfn70lY5vf3H6RuPS3no6f 6pkb4nO6sb117rb2dlg1OPXWV2Mj/FqYFV31xoVb2rtno6fOnJqjp463188fb//mbOabf+nm 9rU7DrW7MmZTcepA/FPh1LMfgFPf/zRObShOvfa5y9tr4RQf1etfSv+pD8Apvipp1s8TO93Q SMOXZF/ppLCmNBLNEv2ES8WoaKFiTliDW6WrJozBl8EYxyqzWDWJv6DhnM92rFr78B+16YwX oTxlYxt9tzLnck5lFauip+Zyaumd8V2lL+/CO2KzPBWe3Rn75Z0XwrPz0WZh3d36W0X/JU5+ OmVtypgVWx/6atvzmcSC3PFk2536ll9KvPkYY0I8xYj3885UPVjvYo8/0mdnf74b7y6NxUfl O+qxRYn/yXs8U3V+vq/U1X1OQ/a+1LXhRsU7hEX0DKZgzJHEVmCQffJglDTX1yTv4Jd91nEN 38RNSHg4jqXDRlnysv3RW7SbY2Yyhg6uYM/wKeGKuAkMKkbl3uBUpawPO554ifJb5f7RUjg1 eIZHtslbdsEwCvOcq/REtIa6mu4wT/KhsAWrjA3CnoRLV6TeYaOTcOkgvxWtlH273PPUFxg3 7LLjeVVfgpSpzazdOuP5pVx6wLr6WX0+FTvZmmgQbKKj2Pz4o4b/B59om0txiu6ZtdeFN7iD RUNvFWPCF3pJKk7nvw+G0WG2z2WR34NTZUucsM49w7PhK3MM35R7MZ15MNauWlXMwqMakzZL 9r/BFHEVtNAYywl7LsWp0p45znPBKYxThu3WzaHG5yStjf10ZWx/FU+ReBN8qjF6wyvj+dFe /FKSuArzsXlGbGs4U99PviXPDht8U6WdUv93zdQ1Fa519mBS2JeEMzjFRtj395iLaltmf5VD l0vaK9mGQ96Noa+KVXm/al/eF8d23nT74+CY7fhUseS5L4OVzmsdv3rqsRW4h2XKVd4Yu08Z 6hbsGb4oWmnwCJ/m2vtsl2wb7Dq8fVk7sGlhO/2hVe2rD2UO+mdi43vuY+1vE/P39lc+HFve R7N+U+fUC3M5dWt7+6WMP3sJTn3vuQ+3H164sZ2/9Yp2Ktrt9LboqXDq8Q/KqU+tzbhJczj1 he6jwqk34qO6lJ5665lwKmnwZ9jpOh8uxtjRU4NV1jEDO3CGb2ttsSV+oImfa1YPRb+MWAmM occwCZtwqJgYttFf/EtTygqr2AaVhWnyYNhgoLzln8rSNdW10Eth0dK7c83RUovv+Vo4lr5S pxLPd3vGfLoj8/x+Itd86um2+q5n2pZPPNV2PnCmXX5fYuQ/9PHyTe1MvTbGm9gZXlmno4aW UhfSTLSTeQeM0cMOQFvpF8xvJV7Jt2abREvpJ3Kw6mx+lrBswiga6mD0DS4Zz2jwB7eGfW7w ZfSrtR1/xnblFXvie+oxhPtr+etscox8+MVvhXvjWuzDIlpqMOXIoR7bZ/usTTAM8htn8Adz 2AYlemzwzD46S5IHy4beUn75pWiN8IneoN/GfOF8CL7x+uZTj1Rdk/rXb/UDRslb+dQh2JNv 3DOifXHKuu/et3xZkvpHnaQMcb+0hvpbbJy5Bi3LL7XUvIbLi0nsbGIn2Pdwga6yPlhiPy5h EWbMcoq97jdxSr08h1NztdYsp8K3meSTlDs4VsscS0u5bzhYnMp10HDYhN1i/Nj+xDHSPFiM VzglVSzgRAvZX/28ch8vxSl8qr7G4dKu3EfMo69oNEv9gPmbzKW2LnGIq3Mf2f+mwik+K76q RQvnt0ULolfDMHlxis/KuvF9aQzPEmc8a8+rfud7wo56znmObH/67sqj3q93JMtqh0yOx7qL +9kI+zvUdRXdE9tBku1DC2EKftim7Yllzuk7Ls2UezpYo2z7XaNj2PmUU9cYTrmmwTH72Z67 j6trPOviEP1nSTuYPwqrsGeuD6re4+yzjf1Pnrm+K9tnZtJ/YNOSduSyBe30TXvbv3ji1va9 5z6RsfNuTv0e296zN7Vfns3y+Vvb370QLk3Sjy/c1l57Mdz6avpZJe7v3bOJGTxzR/TUyfin xABenbjAq9v3w7tXEjN47sa97ePT4dTWcGr/qvb4MXpq/iXj/b6PU5/Z0H70+zsaPfUTnPri 3vbT4lR01SXi/cQvSmXjCz/U+cWqLIsnZdeLf2piu+s8G5zq/GCvm3705VlWlZ8rZcnLLldz FWaJL4Mrw2bovDhUsX3sd6Wruh2Qzwqf8Kr4l3ydf2L/MI8+C3uyffr0N9va+8VMhHGn4486 /a38j2/m3InnuyOsuvUrsQfmGk4+0RZ97Itt+uOfL1ZtvC39fDcdKR3VYyny7ucd5Z8qVnmP 8w4dTH9a9aD31Lso9kg/eJzSrueXEgPd+3Hk/caovMvi/cRSmBuensKXvanb9iXGnL3vytJS u2v+JmzRd4ldDnP8HjGAtI9tYil67F8fHwJrcAbH8Eeezri+vZg4sR/ioDzKUvZMxthTlm04 g1O4cuLo4bL34Y46ujiV6x+MkReLaC6Jv4k+sl2eobvKJxWG8W8V91K2c6hn5S+9EU6pezHf faVBMah8ALnXuOKb78wPI8Mh937wzPde7XC6Nskz8rx8u2wl7C+7cvzIr741HgT72LLM2W4M JKxak7g0rBLTR8PgUMX3pf51nThUPqJoF0xhh3Pd7g1mFKdS55ZfaQ6n/M/iVo4b7MEqeqo4 NbH1YQ0uKQu3R95ZTsk34ZQy5R+cck7ziNCeuCSWQqzDsGvO5VTnS7fZ0VXFqbyrl+KU+PM+ 3mC0aZ7L8EvhlPL5nkYyh5IY9RXLlla83/pwa2006uJFC/r8J/PnpQ9Q7JS5bmlwakPKUaf7 bughvPBOsNPZVtzKtdJXY3xaeSTvSOmS1OeO7e1FHPK+dW74dgdL5Bk6je/JOZybxvGu2e+c zj94M/RR/7Y75+wfHKr4vpzf9SjPNWEnRknj3ON9Vh4/lbmtvLMSJuHUsP8NJml32SYmnY6S 13L4rgan9q6d1249vLH9xedvat9//pPhFPYk/vzMze1Xz30snMr6+zh1sv3kxdj9PgCnfhD/ 1tmP7mm35xw49Qf7V3ZOZc75S8Wlf684tX7CqV0TTsX29yQ99cE5RcfQLjgxmNR9UZ1X2DP0 jzwVWxeWVcxF7HL6U9FAo09VlTWx1SlHwhM6TTyEOAn2RLxSVp035fRzdjufMkpPhWXrHv1W reNTxfuFe7PaL9cxfX9Yedr4gOHlQ3/cVj/8p23VQ3/SVuT3svu+0ZZk7MEVsfmtvOUPKu29 53Nt6tq727zth9qCy49e1FNhCtsfLTWTNPTUjLoudaAYCanGaZl8A+rAg6lntfO0sbybo+2E U+pynLo8db6xV/dN7HnVbypa6pqjVxU3cEQyRl/XSOFKfFbmIKztYUtpn9gEh11QPswxlh4+ 2W7b0F17Z/RF2h67274aaw/P7MencQ7HqxtxZcT2DW3Ejoc/Za8Lg9gG5cMddkHrxajcs2Hn kx+7Thw5XMxjO/RbWep19TNWWbetyhj1UL5xulT7WZ80dYu2sTgV9YrYf76B0kb5VtUTNO4V sRdW3ESe0/jWfcfaD+yx1XcyzFLXqseNG9vHks34ranjsQSrilNh0rD7YcOIveMPwg2cssSH 8ufluY7f8patLszBN/cGf6TZfSmzbKxhlfKduziVdTY8bQPHyT+OLRaGn6Wncv+cQ7IdP3Fm 6KWl4a/xaffk/eRXsk9cOdaInejzhKR/cHQQfcUPiF9402Mrep8q+fVrE2tiu/2OwXrx6KWl bEuqudLzP9j0xFLQV1iET2x9fi+cP6/01IIsMYuuwjOxFex+xg2UtC0GqzCGXc374JlXuyPP u96JtBNtV9/LX/1Esg9XbJen3pn8P2yQfKu+UesYNlhY32y+W+dwvPeqM7Af552Tx/l92/YP u6Ht9T7mXtFrs8dO3tPBT/+xbNA5dnAXv7BxxEnQSUNXDU1V73GOGVyy3Ts+WFXsmom2vXxT 5mpZmnkwl7Y/+Oje9k++dF/mkbq3vfLkyfZ3tFRY9d6Zj7b3zn40sX/pY3X+tvaTl+5uP/16 dNfXbmw/e+mjiQ28I2M/fLz01DvPpM/w89e0nya98tzN7ZVzN7fP7p9u92U+kfs2z8sYf5nT 4+rM53vdvPatjy5s375lafvHpxbO9p/6i/szHsVDC9t3P7W0/SDxftWH6rPGS+9xFK9FU732 xOXxT6X/1FOHSlP9LP2n3vzK6Dul/9T7E01UtrWwZMRD0C6VwhHL4km4wt5XebK9fFHRNaV7 on06z2KrC1uwZ9gPHT84yK+kn29xqpg3l42TeItwseIt4qcqvRa7In2FY8OO6HicdI71ietb 9wA99XKlFQ/8cVv5oPStYtWmjE+4PGMMbrz7S23TPU+19Tfc1+btu6Et2nO8LT94XXFqJhpq Rj1YKZxKnTzi/dj8BqfY9bzD3k3vO01FS9nuG6j2e74TbX99fHFqX+puiZbaHUaw+enjezj6 R8KMStFS7H7YwUZXcREZJ2/wC6doJEl+cefy8UnhW/m8Ykt0fI/P6PloJmn4rRwvz9Be2vdi HI5+KPGG0UA4pS4tf9OEVdbxiq9JKnblnqlTsYaOckxxbf++Kksshv8/yqG31O3qcJzyWzn1 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 3NXm2CrjLJhb0fFsvLdh7LShq2ijK3tqrELE3NnGw4tklTEVJvuK2fZbP6OOki9tezKr6rFq 30uOWF8jhpey4/2pqfK6z/F6rfOpm+RRjZswlio4BfsqwyrHZJXHfqaM9Nn6qLRter5+FhqN 89aBtPPJoqwTbp1r1vKcXPKc+7JKhq1M0SecW2S9F+5jjao16sQs9uAjc4z9JfbvJbj0359D J73AeF9i+97CPyWnfn7l3vJzx1mFnjqBnrqjRU/dVl7FTvjKk9eXlx6/tfz9Z46WTw62RTpH zN9Di33lkWPMm3Si/SOw+x3DP3WsaiS4oIZJHsiGjDuXCbJI7sQ8e8SWyyQZoQ8pY/mCM3Kq dW4jjn1mcI1nyCRtgLLL5LHsknfmCcZ5DzZF7Y9qrrw/n+E5n+HWZ8io4Quw9jysY66JNtZH bGedjwGYNfYQsX43P0QMOrET81tlaOv6HZvRiX3EMyxQ/2lDG5RVY9L30g47dkoboH4px07Z 7tlGOt+sLIpyST/Kcub4KeMo6jhf4iK4z3gfy7qcMpZikbZsm/b5cOgWYylc36OOn0qbX50b 6R3z/2nnUwuRZEzY8ZpzTsiZZJgM0o+VnJJhoZPwb4XNsGkH9Hp8Lnmdo+loM5ZQ9tgey6iI z2OrtpI5MkquyBmP5Uvkb94js9Rbx48cihiL1GLaCNVT6iXbVnllLLs2Pxlm25vtvjoo+wRy xnroNvetv/LIPBk3kexS73rdd2R++WU9H2Ie1i7avfa2tmCU7V8Px4O0gfppMq5aPSGPtPnp 62k0OaRekQv+vmAXbW34q2Ca11JPmf+j5JT/vYxKX1nEJ9KOqZeMz6t6qnJKHmvb27Hv8Vu1 +amrQk9x3Xh27/P/2OFU8/z75xTzUcgp3qm2v+SU81QYV+E8frJJu5++KedWClsgzJJV/XBV u18PWjD6FLC2j/ED4beCV7bzMkMtYjtffUBX7YBhZ8dXHGN3qXvmd192yAP3ZZickjVeD0bw u7WHvP38VYZ5r9rI55jHJBvtm6Yu8no9X22GrTrK7+wz/ExZ6L363mr8fbVphm7j+1h+kzvZ 77JeeN6ybPx5lnPPp86SYeuz/F7W91qYlk/oT8sx/b9rF3vK4dldxFJcX35wmXmTnjkRrHqL sb1y6mdP3lN+epl5a9+DUz/5yi3luw8fKXf0M48geurB2c7y0BKcOkpc+nUffrzfW879TpJP MqDG3VUtI5fkkxwadr4JuKB+kV8Zx+A9Hsc8R81rrruh5kpd5LHMiQSv1EfaFXfGXMGa3rPM t/QAz2Vdw12sXd9+krnSTzOHBJoo1mJ8EJ2EDa/7DM85g7Zi7lhTB8ftrDXfxryzbfegp4jv 6zuLLZH758h3zcXny9rJR8rA4jWlv3GcMQabxHCip7CBLaNBNtYZR0SanmN8IX3/VdIc7c4C NqtNbG/7YMss11wjJ9Y2VHfQxtqupe9CrSBDZInjklwL0K08kBGuAygfcj6jhZlJ2oXp0E2e nx4bDtueY6X0JXlOO592Om1+8Qy4pi3QsVQ+R6bJKPOaJxgDE2SMPiI1i7zwu3nN/bDTkSf8 Q9jd5IX5QzvR1m/BY9cTjL4l9dExyzHnBtesZ7Vv6bin2ie1PhpTdWBrm9/O/8K+c+pof3CO I/1z0Y9l3+ce2MYHtrUVdlTrWWuf0LW/lsi/DIfmqMsz6iz4MM/+BG2cTLK/4P32F2ZoZzNu xXbA/9y5ex0X7X87OTLAXLIdxE3AqN2MKx3YE//z5Aj+j6F+4rRH4nhqdIi5GybjP55ljfW9 rLG+tBd953rrrDXbYCy078+t1xrMMWWamxyNvobv3M827i7GhcE19y0bslima5uL65Qpt2o1 z8v81Em5zefIoixjcjBZ6FZuhgaVm2pRnudYUds720HjEWzv9e9ooxrVP0WfO9rGsJ/Nxr5r CasHbG9ts21vfU7G3rnvNZngWvNVBzjnBPEckZ+10mkjTRkruEzfLeyGcE6d5hwW8lD+yUrn IdTeGnPkxjnW+qLf0LtrN2s9YvODTXvQv530LbramLsCXpnftY3tW/iu5YrfO2xrtOGOZTA+ IfzC9CFlkPory3HljGP68K02r2fMnTY7n+lvDLs98YH+h5Z1n1M5p/2uxpJbntVF3uN/49b8 9qHsH5ncz7Kdushz2qm1Bcgg1/ZNFrk1vzzKa2okjy33PkM+ySk1lXXHz0muea4xN0b9honE UAxPMB8YNtVp2oz96P9FNOwXr9ksL115pLxx+X7W+D1bfnHpOmIpiAH8Jn6pv7yW+SlOsW79 3eU3xKy/deUT5XdXTpTfMVfSq5dvivQvTz9YnvvkRrl1uq18fIT1fFfxT+3bXR5l7flnT3SW v7qxvfz1rV3lP929q/znezqLY6f+8azrT9XxU//j4THWn5osP/tMo/zis0vl559j7NTnmY/i 37MO1aPrrD21FetP1fFTV9efevOJo+XNy0fLG0+w7iMp7Wqhp2CWOkqeyKmr88YSO6eu4nww remn8t6067XGQyTzwk/V5KB+LPPIO7WQyWcOsDZwHyySVR2wajescn3gbjSR6wzrYzImoucs Gg9e9Z4nL5zaHdqJNeWZY7aNcb5yqpt1pqa5r4Gvavs+1vU9caH0LxwrffNHy3RjX5laWCeW j/aMtLZCjMMK/Xr6+w3bHNr1RdoQtyv4lGRZQxsW7fsaGmPNc7T7+pxMtkW2+8EW2kn5JFeS LW611al9ZJnssj11axvn1ntkkCk1UsaeB/vwn8kk4x0cp+u6VXm/n2tS+6iF9PtEzB7fye9m WyiHdux0fH+/r3wy5k52RZtJHdJuog3fvmGt86ybQR9VRlk/c233Req2dbPmQ9OhMXP9wlgv inqs305WeY/POHTgQJ1DgM9R/1hv7TumTnLOKtdH3kvbEFuuy6pZ6qSscl7ZjJmw7tp+NDif 7UXaQGWK3B/s7Qo+dcOo3o522NRHW0mbCZcmhgeCQ8kqueP/KXvmp5kjlvotk8wvg3yH5glO ud53cGrs7ZxCM8oV7YfqR9nk/xpMoa14P5wKP12Td/YtfJb8Urc1mprN7btxagIW2LbKjxH6 3moSuWT7Osq86TJHG1r14eu3qzHgud6JjHNfe5RMMiWnPC+L5JTP9Hzkp/0chUeVU3Xdj2Xf W9O/pd1Qu6MxHhm34XwZyamI1+Bz9BXKqFF4NAbHZFUvY8B6YJdzhWjDzFgQv79aRvbYVzHp u/I4/cOWV31BbpMzMsdYCefcCu3Ddctw2j18rnnC50xZ9H8MncPW/eRR1WVXYyY8H/0383G/ /HCbekfGmCzvlt/ki+VeJnkteWW5TvZYN9zP/pz5ZJvJfT/D6z5Hpi3MjlIu+C+ITx+bdv1l 3i/lboPyvEJ9uK8xVv7j+bvLr5+9EJxyfXrTW399Q3n5xaPvyamXrpwrz9yxXm4mfuKG0bZy Xk6t73o7p27p/D2c6mKMr5xivvQPyKm0wcmmmjL27+q8RckVbXzJIzWSTJNbdf/qGCqPU6PJ p5z3XBuenxd8glE+b+hTMOuCLGIs1f1wirXjd93NWomnWOP3nis7nFJ37TmHTwqu9bLtuP+5 0oaNsO0UvrHz32QND57BulIbF58v+y48X1ZvOl96Gc87uXSgTCxul/mlVdrCFeaaoFyRFpfo D5GWab8XZBXtwxr2qRXa/Hn4YVpRs9Cmrze1lLER9nfVKs7bt02bL0/UQDIobHEwMNfTkC0y KLWWsQuyy+vecwg/kmtsyCif4/znssd99YHtpOOs5JR2v/wsr/lZJr+PdjX9Qzl3bNrtZJL7 ofv4HdrjdnQULAstBkui7aeuyCq1VM49Y/21zgeP4Ez22+sch5tR70NDwSd11Tp9xuAUW/Mc 2j5Qjhw6FP1b62LG7lm/rKMR88/3kkuT1EHtrvOkSbSCdVE7337Wo7LOuka6fLKv7PdwHnTb Gv9f7aeyRUZ172qL1NfF3Kd7utFXg9i3qOPoKFklc+Ym67H6q3IKHw7refue5NVe8rvv/70I nzxn3nfjlDY4uSJHtAmqc/xfTe6/F6dkkZwyb8zVwe8PTsG798epOo+D/4l+na4O1qBX09Cm yyn54vikbOeNUfCcx9qhbGtt79VKXpNjO5ziGcEi8tX7ZCJ6mHt9tuPS1EzyyLFY2g/VTtoT 69gt1zWhTZaBaDvHICd31FtyaqSX9Uj6ibfk+hjX+9FRzmnlmGU1VX8vsYLEAvqd5vhcv6t6 ZpLvG/Pho7GSTXLI8iqHZIx+LMuwKftglh/z17JMm085cj+ve3/a77wvr+czgnU83//Na5ZN WSSHTO5bdmWKyXJvyjxuLfvyKDnlOZPaqvW8z/Ze64uaymueM/ns6OvRx1qk7E7Tr5qmbzNM WRpEby9QxhfR2yfGusufoaleg1O/eOps+d3X70JPMY/SN5mH4nnWlkJPvYqe+jV66ldNPfXb Fj31E+65fPNSuWmirdw4BqdWiEuHU49tVz31DfVUk1N/e09H6Kl/OJN6qivmo3Bdj3/9zEJT T638f+kpWaHGCf1EW59jlTynjyi5UllVY8ODVTBH7kSMXkssYMQDyqZmCr3W5NY7OaVfaoD4 hwE0kpzqfoC5keBU+91PkC6XXbCqTz6dYbwWKTm158GvlU70Vzt2xba7K6eG+K6m7YeJnTj1 WBncvIm4iSNleuVwmVo+VBor68RKoO3pP5uWltD3y9iv4FTqKG1/6qm99I/nsdV4LRjFuVjz kH6/sWva0pwPyZTxeMEWuCJbZE36k+zvyyWT+3JqBZ1k/muOHNiZcy/vS+1l+2l+7YE+y/Pm MTmnRfq2ZJT8CS3l96Evr09ITeX39Fj9pH/I+Dttfuoq9Zb8UkvFGHrqrjzaCvufvuFat7Wz WOejD0pdUl9pJ6x2lGrvW0FnqadCW3F9P3aWg9j6jh0+Ennt71rf7Au6tT66lUPa/LT9TVB3 pzg/S5s/Qz03rxzLexY5rnMn0fekrfI7y0J1jwwa2lN1lLa+Aex+Y4P4QUYHQ2Np30s2VQ7Z zx+lba2aKfRUk1PmlWW+V/sBi3uJKeCcNkFZ5XOyH+Jna3sLnjRjMOSSfQffwY5O+gN2P/nm Pa2c8pz+MLWZ+/rA3L6bnpIfcsN2U04Z522Mt+dkjEySPbap5lF/1TZfNvFb/c/JWzUTcYDk z3UnbK9lnPlSh1WuNTml1uJ5xmq4Pph8klva6cb4Luom4zc8NibDOd1zflz9Z45JHuqBQ/BK PTXOPYMcq6c62x2L3VG6+D19+K/Uio4DDi0F+5JTfh9/g3bO6oeq8RTytJbZ6t9y3/Lt2jvu B5sos5btYBH51VTWB8+ljvL5mbyvsvCqrpJJWbbVTVleLePJKbeyRfufNgWPZY/brAveZx7Z 08oqz8uztP3ls7zP8/P0z/aSJiijs/StxmBVn2utYP9boQzdPDdUblsYLd//HPP5wZxfv4h/ 6vnbyhsvsObH10+8J6d+9MQD5dHr58qNo23lZlj14DKcWmsvjx9sK89c11m+cUNb+Rac+s7d 7eVvT3eU797PuvNw6r8+uIt5k7pKnd+PeWg//f9y6tVHXH/+/dn95FDa4tJvFHO/cl4ehW2P 9j80kJqF/TzvtdRN+qRqrF9dDzjsfFz3+caRy6idZ/Gc1GgDrAE1gP7pZ9t7jtj3+4lrv49n 3MuYLfxP2gO70U7dPKtXLeb4XdKe+x0j/Dy6i/uYg2IKxu1lTO+xC4+X0etOl4G5lTKMrc+2 0PKxji9n1f4xrGnQ151ja1pkfxUGyCjP659aIt8K7fwibc1SM9k/llG28ftJG9jN1sljWydD ZJPtmO3bMWIUct49eWOSSzV+vMY9yB7nipBFmSefk8zyunpBttlm+gw1l1tZZdyg8x0lo3Js U/pH/M6ySjZlXJ77nstYcfuX9iGTP9Zl+5vWVeutbZU+AOuq17b3b8X4Se+RZfu4v9r8tDU6 v5LMxEa5xfcir1ot5u3jmnXaumh9VltZv2MtFdr1Gdr5MeruFHXPsQHWZ/un1ku3Me+v7Qvt iX4y7YrOvyqf+rtZm6+zHVtRe2iqVkbpb1IHzU/TfsY+GgJ9lLzxv/a850JPwatWTvl+G/qq 2Pp+vfan5JTaSUbJpdRTjSanPOf+H+KU42N9P74n23Jj54zHV3PIHLkky2pbXufTUzvZNte4 BNrK0Cjqq+rL0r8lu2zLvdd8butz1F+VgbJLThlzGOsk+xzvJX9dvxE/GufkV/qonNfd/JVb 2PrgkmkULTUJu9z2YfNz3hD1VJ1DpANdtSf8bfLJ3zZtavqt/D7+fsukrEqbXvS/KDNqSznm uF9tBZZby7fMMXm/z3Tf/pdby5llXj+WzAvtxGcEqyh/+Yws06mXklWWc1niVp64tR0yeY88 smy3airrg+f1O8kq75dTbj32vNe93xR1Y5zyPMK7maAPtbdRRuYWSs/YRBkmnmKasnVidabs G+spl25dKz+6cqG8+fzJ8pu/uLe8culI+V9fu7m88szp8vLTp8qv0FO/vMK6VVdOMCb4RHnl MtdIP3j8vvK5o+PlY8PMczvVVs4t6aNqL08chlPXdlRO3dxRvnPyKqf+vsmpH1zsLP98Yag5 v9986KlffA499YVV5vdjDto/glPa6CLGHHYYRyerZJIskkHyRs7Ip4jtwz4obyJxPvKRx3jA mL+CeMAcFyyb1EyyKu+pseTV9xU+Khg1eBF/GDF7/ecZk8W4XZP6ql9fFJzqwp7X6Xfhc/cw N1LfGWx/970YnOo47fUXy/SZZyI1bv8U8/d9rPTNLJXJ1e1oDy07K7BiGYbIIdMM9rAZyvCS vgQ4o3aaN0aCazJLn1RDXUX/xPkyQ59g/8t1OmTUqv1mdFLyxf61DJFRMkb+yC2vyxo1kDwz HsLrsio0UuijavNLDmkL1CYox5JR3uuzah7YB7NyviP9TX7HiJngu6uV7NOn1pJP7qeWUmfZ P7dO2uZbP42dCO1DvbQeyy6ZEPWV+iJ71El5Tn+Va8C7xu4+8m7SF3UtqW00mb4pbfqueyLv rJ/WN+tX9h2so5PWYd6D/qhx6uIMeVabfQvzZ1817U3Gb2xvEvPB99bu1NVe/VCyaqS/J3SU fijtfVPoKXkkX+bhjxqqMusqp3xH5lEztXIq7H78vxFLge3P96y2eienPqjdzxiM1E7aaH1n YQtsaqz35BScsI2VQ8ZNyClj6GzDW2156mK547mql6qtz3ttp2WVPFJred122TKQNsDKPP1e 1d5V9ZW+KcdijfDf8Dv4DBll7ITaqeop2k8+w3gLYynkl4ySW9oCR/f0l2EYpM1vlt8yxTX9 VDJKu2DXrt01Yc/M8cCyV05VbVW/v7/f72v5kFehmaIcVxud1+yTqZcs4+YJrlG+M4bPPJZV /VnBpyb7/N/8P0zyTkbZ/3Irf0xZTm1rWu1/XrMcu83+Wdr4klNurRc+w7xqrdRbns9npNbK /OZdmeI9jRIDM87/Mbs3ONU/if8QDa594ugCNuyhjvLAWm/57pdOwqm7yv/+5pnyKrEJv/3q J96TU//tsXvKQ1sD5cRgW7l9Zlc5u1htf08ebS9PX9NR/lI91eTU35zaXf7u/raw/X3v3K4i p358fgDb30j56cNNTn1eTq0Fp175IzjVGXHgz1ZfEfF9GWsuv2IMVIy7RbPAJHkV8epckzvG BWoblHPpqzLGr9oC69wUMcaK6z4vmBj3VDtjjPe98Cz+KeLQ0VN9DzLG9yzzXpyDjcSZD1wk dgNfVDef23XaccDEYrDG1J57+MxTPPMkc1GceqaM8V32nXuyTN/5+TKxfaJ0L+wnfgy7FrHZ WyvTZf/yVNlYmi77GC+VtuDJeWKaF9AV2MoatA1z8Eg/lfES67TzxvapR/Rn23aonzbh1IbX ad9N+8gTnKFPLjv0P8kXx0DJE2Pz5Fbdr5rL6zJK35XzT6QNUBZlDIV51FEm2dSqt5JTnpdz OSZJPmnLc2v8hMn4itBb2vr4naG3+M4yyt/m77Lu2seUU2m7t76Gpoo6WeuzvqvgDVv5ZB7b AtkUa8HzjG0YlWseyrhoL6jLzidlHbW++f+rpVIrTeLfmaJNnuV/TlurPkLfxTTXGrTddWwO /caIUZC/+LAYt+P6htXOxxqHxPVVPg3EVl+U9kAZZP8hbX/v5JT/o74pWea79PpetFfa/eSV 19z6nLdzCm7hD/ggcRRySvueST3Vyintge/FKZkia+SHfintfn34dOSU5/UjGQdY10nS7ofG atFIVVPBEtpK88ulnA/C96vNT4YFv+BDHc9U4wZlniwyZsJxWMayyyTHDeuLUlt5HGOL+Uw5 ZVJPhQ5Dj41zPIyPKjhF/mnyySnnDTHuoh+t1Q2jHA9sMk5kCAY614iskll+9+Sn5TL6V5Q3 z3ssc3ZigNTi9puiHFf7n3nkT9gKsSVYD+y/pR7Tz+XvlldZ7v1vTLLFcp1l23JtWVcHeS35 k/k8n9fljMxJbWXdMJ/9tzynjvKczzW/x15z37Q+TV+KePSJMZ7DdnCmUQaJVR/gWp9adpp6 MDVYjhOv9+e3bZV/fvxO1vN4oPzm2TvLL5+6tfz8mXvKz54+XX75zC3lDfTUW1eYt+KpE6xX f3Ok//Lo6XJ+vbdcS1z6nXOd5ewCnFpuK1eO7S7PHIdTH28r/wFOfftkWwlO3Zecai/fv9BZ fvhgf3npU6zp+/DeqqeSU19ibQ801fu1+zkmyvg8NU/OUy571FKhi5pzxKqNTKmx3A9O6ccK X1Ydd5s6LPQVMeoZexH38cwaT1i1WfjGYFP/g08Ty0dM/APY+7D5dT3AGCp1lay6wNxK+Ka6 WF++g3Wkuu/mO5B6WAex886nyxA6boLvvnn+Shn8+MWye3Y9OLXNGKHVDXw36N4t0uYy6zst VxtStJGL+O8Xaefx28xgXxln7KG+qf3Edq+wdd4j23nbIHVK6qg1+LTqNc7tD27Rd6MdkyXH HZeEP8m+t8k4iVabndpIPmV8hddsG40vVxvZNtpu6pMyVt3zHhs3EWsrsu+x7PNeeed3kz9+ 11ZW6ZNSQ11zhDXmt/bHdfWTyXuCVbT31mljJ7SJWB+N27WfaB21rbOu2/+0Xttn1cZknQ/7 CvXKeHRjKNRQB7HzySnn4jW+ymea7Hta16yj/vfWx6zb0/z3o85bAJPUsZt8ZzXuNG30NAxw 3VfH4CxgFzT2UjvZEGNwunY5pyxrRHTtoj3r2WFTailtecEmYiLezqmrdj9tev6Pvj/fl3rX fbmlTTXi/vElqqPejVOhr/ieHyQuXTYlp1JP2TeSUe+HU7Ii7bL6klo5JV/0VZnkke/SeD79 VvJNrlUOwVu0kM/xfCun6n2MQ+W8rLKt1sbmvteCU3BQTjXUWjxDPskYeRXj1dR27+SUnwNj JvBJqadG0FUz5JFhAzDKORhdc1neOT47OeVWXTVijAjfwd9iuZQxyWvLnHZijxuUO5kTZZDv J1u0X8sqf4u/2f6UbJJ1/meW/2Sd52RY5VLlnc8MdnF/luXkUXIqy7nnLffmk0mWe23a9tXk jNfljmwyj/d5zmPzG+fnee+xDskpk9dMm3OMZZkk1oIxvuOj02VgZqGM0gcf4jv3Wn/h1Crt 3hF8S59Y3lP+4bPXlx89dnv5P99gziRY9F6c+qdHTpWzK13lmj7G+e7tKmfk1FJbefr4blJy anf59l3vxqmO8sNz/eUnF4dbOIXNTz31R3JK/eO43bT/BTuIrZBBnku+1PiIpo5CH4UdUJve jr8KPcR+nXtJu5xrvzMOCq0ju0zJuVZd1Y9+GkA/DWDzG8T253jd3gfRT4yP6mROJPVUl/4p eNkJp3pYY77nk1dK/13MQ3Hq+XKAe7a4d/mWC6Vt/jj2PrT45iF8+I7JnS0HVibLxsJw2URP Hd3PO6V8WgbGZmDRvoMxPmqFdlsdZVqFUTVmosZsLdBO2uYfoa3XL7VG2y6jNtUutPm2b7Ge O7Y8dVDOvyeT1FfqH1kkh/RbOQ5KHaR+yqTfyn311yHi++SYeeRRaioZZjKP10x+Rqt+klfy x3PG/sXcfY6ngqeySQ0VXGvGUJj3IDF51bdc7fDqKOupddH2yPprPfa8dVaO1X5lzbdK3gOw 6RBjqcL+x/+7H20Wce3xHJjUrKvGRdiXzPgl66f9gwb/zxqMavD9ZtAzJufhmcUWNwVv9rK/ THuufWxoT0+syeE4m/5u27Ku4JQxejFGarg/NE/a/GSV70j/k+ySQ6mpXJtSTpnHc7KogS/K vP7XvjPP5TM8l0yzX+JzZUnE+8HRHAMcupVyJH+8Ln/87u6n5tW2p83wPe1+5Mu1GI3PUL95 7Fa/lW1x8II2Sa1kG67tbwidYtsso9Qc1QfjnIDa9ipzzC/bbIeTPXLLZ9p+Ww5km0zSbqh/ yuu22W5lZMZIyCdjKWocOj4zr6t5ZJv3wjKT8X7GWBhfEba/Acax9hEHqM6Cm8b9jcA4GaXd TxuhcwjLJxns+LBOY9e7GV+FP87v5u+r3Kz2z+CILCH5W9RCluHQ97KAfpYcs39mmTafv9Xz lm2Tx5Z999Mu6u/2fHJLliVfZFFyR6bYzngu+2OtW3mTyfgInyGb5I7PSPZZP6wrcsnryTDZ lfctwajlSezmpOnxvWVwYr4MTzVK/+wCif2Z8TJEvPr24nBZmuwsD+wfKt/5wt3lVy/+GXOi n2EuWvxTLzxQ3nyOOAvWqHrzyRORfnbpZq7fUf7mz28r9yzsKicG1FNd5VMru8unN/B3bbeV 567pKn+hnrpp99v9Uw+0le+dU091hH/KNahST8moV7+0Hloq9dTrj22X3z9+yjFUR4NRxo0H h2BLMEXdhM9pZ05Z9mWLnEk/U7KnlWeey5hz99VUci5thJG3+ex8Xt+Zp9Fj6Llz2v6wJRIL 0XvuKqf60VPd6KngJawauIfPIA2fZowxnNrg3vm7vlzGj51k3oljZWQB3/9+NMQ22n4Jf9H8 cDm2SbzBBtyZY44XyoLzIS2uHwhWGSthP31znz5W76laSt1he3MAn87BTexZsEpGrWCnkU/7 ucekrU5eyI3UOm5t/2SUrJFB5tEvFWN+0XleM4/JPPJNPrl2os+SR3KucgrG0K9XV/mc1nlq Q0vxPUJL8X091gclp4zxC52F1oq2s8mq/G3mM3bPvmXWUets7TsuRP21bi9Rfz1vn9U6n/Xa cY+H0FAH9EfxjBXaRePSN5paKvuoMd8UdVdGWT99B9Y9/cKOpY74S/6DvbT72vrk1F7Oz9Gu x1hWYpdGmc9gEEb17GYNI9qsvq4O2j3mg8Mnpc1PDaStT1bJmRqDDgOb/Altpa9qL5/HszNu 4m2c4j9OhtVxBr+HU/DNdybn3sYp7ZTEPcR//RFzyvbY9noPdrIO5zHENuY7NbZCHiV7ZNpV TqlH5NRVjRScgnnm972nzU9eaS+snELvBqewCcpHnuHY3ohN5zjH91ZOOcYHTsGgmiqrjK9Q Y2n3S05NkUdWvZNTqaeM/dPut5vf17HL+Wt767yA/FZ/ozyRt2odeaKOUmtVrsihWqb9Xyyb 9s+8ZnnO5H9hn0w/l3nM6zOr/6va+lo5JX/kikmWeNyqqSzvySivZx7Pe491IPmUW89nPZFV puSU56N/x31ul6dok7D9zeOPn4NPMmpkerEMElMxNL9UxuenS89IXzm4Mlo25gfKrXNoodNH y8tPPsD43rPMm34Pa3ycYhzVLbGG4r89dX1w6heXb2Fdj9vLtx+6qZyeb9/h1MWVXX9yTr32 Bzj1OvEepuCFugkWyQLZJF9iTtnmPOlvYxj8kTveZ37ZVe9x3r+6fnzGW5jHa2EjbGow7/W+ nNei13v47F40Ux886jkLk0idZxj3i6bqZ8xu91k+jzHA3azLO0LeMWIrJt3iWzt26nNl/prT ZWT5SOmf3y4La/vL0gbzn66rLWBQY7Ic3UJfrGPfHcdWS1l2foR9mwexN2HPgTny6QDjj/Yz 3sg23D6ucRJbsOvaI4dZzxD/TVM/bXB9H7za9Dp80BclO0I38Xm2b/voh8sq+aSWSrYc1F/W HEPluUz2zW0vTxw7HHrL++y753WPzeMzZZicMr/njJdQI7mVVWo/fVYxVoqtGir78Blb4Tk1 lnGCad+wXltXa72t/caqo+o562+tw1fbAPukxw8d5rc7Tov6Qp12XS7j8IyhMMk215I0dsK6 Zt2y3rpvn9Ax16YF2vxp+QJLZtQ+pBli6yYZqzjAOCjH7To2ak8n8xegoZxbQn3kdoI5KGRP jpGSSY751ZekzU8bXqM5Dsq4vbQD+h8Hp9BQ8sljt9XuV8eorcKuhYj3q2PeHE+lxvIde81Y PW3DDfikPnIbfQbKy0epp6rNzjU0eqMdH0CT2F7HGKomX2SPtly1h3NSuNVuVjmF78O2j/57 +rZso2370weknpJPnq8aroVT5GvlVMxNxWdo+2vQzu/Mqyiv0EzGXMgzOTWGnnJrDMW7caoP O6AasRtd1dXUVs6JJa/UWb1oK+M6/K7yVKbIpMoZ2VT9UFmG/f72sbRlp8ay/3XVxsd1OOW1 tG9n2c86ks+37yVXLNMyxOS+57TtqanynFrJlHm9Zn2QT6a09Zm/lVWe9z7zm7Iehc6asnxq r0b7YSOaQldNjDPmG7vSBH32UX5HG/Gfi8xZ0ViiDA8St7e9UL518ZPl+5c/W/4VX9UPL91Z Xn7q5vIGcyr98srHyuuX8U89dXt5GT31rfMfLydn24JTd8x2lQtLcGpfT3lCPXW8+4PrqS8b l94am86avpcOlzefOEI6Wl57/EgkNY5phx8wyvjynE9WXgVrYE7khTdqpeRUMEeuOV9SxGTU fBGPTt4693kzBoP7tDHKQeM3Qm8x90QP/Om+1zUX4doZOEaSU6Ze5qLwuJfrncxV0U8a4hnj pFE+c+3Gc6V/9eOle3qjDC8eLivMhT7PnOiry84rhx7ZgENL+hf0IaFJiOXRr++Y37kF2nXY tNWcb8i14m3DTdr4DjG/3VHWBtxEj2zAggMw4CBJTq1RlvbTFmnrS91keyiX5IdJZskWuaK/ yX3P2zY6t4T2Pu81qZuME3RbY87rfBahtbhPZsk5ORVz1fostFz4mmCnfJU9Ed+HjyfH82or 8po2vky2oznuqmon2EzdrfW59i2XqA/WUeu8/Ul5Yx2t57WR1rgKtdSqdZq2YBMWbWFLcT4K n6u28r92nl77mNbJ1jgm65/zfizQ3s/AlnHiHsbhi2kMXTTMGKi+HtomGUWqfDKWj3WNmnES U8xxJJ9kh7Y/92WN29RM/k/JJvNprzNP9iHcl2NXOVXnU8r+QuNdOFXnE672vORUxFTgP9vh VNPP9KHa/eCOXLGNljGVU+0R8+e7s/02yaCqqSqn1B/6nIJTvFvzyqPKKTQtz/Qdyj/zOmbN 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 V6NSY5T2dvuIjhORUdrSrW/WS99T1y3RZ4t66TttsV5bdy3Rf6s/1/1Vck/Nlvnt2BDmK/Ae 3TpNXR2l3RscYOyHrKNNGqCNllU9tLn70UMdsKqFcU8dTfSFaVfqWdWNvWfItou2qZeY2iHm he9jjMwknzXFbxrG/yD/5ZY5jmSSPFInqX1CA6md5Ff2+/E+eEwfU8Gp4jzvbT2b6tfvmFP2 P4JTxlHwPHc4NerYh1s4xXNTa30hp+BRjBsOThm7eROnHOdL22/MwhdyCibF2NBbOaVtUI2h HtPeJxdkjPvUEjf8UzxDbGmyR5/Pf+RUwR3tbF+GU7JIPsnS+ngN7Zfmf9ev5m+s55Rz/aoX g1MyKkpwqtk+Dv/b9zh4JJt894Nd2b9Te899r6MuWDfiPY99Ln3frSPWC4vnjAyzhBnTU9T3 Cu8SSxklmyz168GvUVkEazwubya5pkwZo75mTrmfMiSn4J+cytt81yCl4BTsk1MwKnNqoMYp +ov1nPJzPd//6v/y9wenvA8HB/em7x5fJUft6fS7H57BR0UO2rfuZXwVc88Tl35loS99o6vg 1MmBglNPkSvwpVXGYR3am94NTp0spQ9rnPrHz+UU8yTCqc+em02ffZ+5Eu+AU/9u3B9FXbQP TaRmirKvxigZ1niSuAdKE3F/LcRBtMItWdUBazyuTtLHZYyg8RFuy588Zwe5bTOzOFdGqatC X4U9sOdRbHoXiaUgJr2J+PQS8X+5nPox83ZgEzxtnMVbqXzutVS58Gaavv9yapo9nFrGFtK+ yjrzwc/ynsAC2vZl9Il6apL+clU/D3poGQbNEe+VtRSsWllQx2Dbg1HqKts34xpsz+TSIcYw 6QvK21wvm+x3e546ynG69s21AxX9dH1PaBbZA0Pkj+uyS201S1FXTdFnVnOpqcwTuAzLLLaL 9rHDr2RblPvr/C9z8+X4cj4zt338N/WWnHJbP1MxztaYd7UhfUIYpf7Xhq6mmseHZpFRssa6 FfXM9/TW/lW9fc732usivtZrvSYYZ72VTQv4/eYps/TlpibQWvTj/ByLnBrnuiH+fxfx5J3E 6fXCqi58Sw3NjamFPrAaqq2RHEjoqM7mJvQSOgCmyacB1ke1d7D0/tkXGEOfTfM71FYySluc LDJnbNZJ9D1c+pyyZqLPIbM8N+x+Bc/ot3xdTvFsfV4+tx09xXNSD/tszUPhcbm0o6dqnFJD 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 cjFrN39zLkXsht/rXCUWr/c681Kop+SJvij5pK1PXgWr5JaskjdxD3zv1RK+8/LK4rbnyKiI v4jzZFO5rp8XnHIpgybggLF92vLkT2iq0FD6o/r70L/wZTwzTTsc9gs0lvoo4iLUVMb3OZZK Vlkq1bnsw9Lut0C+Uu19vYxLdHyVOmySeFvHUMmoIZba/HoH0J98p3pK/5T6zN9qnbVkHcgz dH2MuPY54qCWBveke+b7069ePJF+/fKD6Q+vn0sfXjqQTnSW0v0Wx08NdaZvVxvTUwvN6WX0 1BtH4NTt7H7nQ08x97zz+WL3+/2T4+n6U+Pp91cms91P35Q+qs+eXWA+KsdPraZ/Y9xULldZ vkzO9NrYKVmlJrqdpmpijK5FG6D+K5kkp/RXGSNoXLrbOX6C49knxbasUkPlssMp+YWuIk7d EtrL+IuOM+8xlzxxfQ8bE8i44sd+mvqfeDcNXCLn7CMvpH3HzqTS8j1pP7a+vqUt4mlmaSfx J9F+HER3qKecM74KH7Y2Ck7N0O823s8ip5aw+cmp7XXzJBGDME9sOrEUrsueI2gmddIibdgm 9jTLMvxyec+BzXxMTq3zeTJLtq3y3bJN5qiNjJvQzy+b3A77nzyy6J+SXxZzsWvzy+fxu7O/ iZh6NZJ2ITVU1kr8x2BU6Cjn6FVvuT+fC6eKPLDaDbFjMpbK+Z+M93P8lH7tMu+o72n0BdVB bls3bbfsR7q0Llrse0X9tW77Pnu+DLPIKd/1/J5r67Me8122abZDxVgYGIUW6NnfSXvSlNpa yIuEhjK3bEc743hrnFIzqaeGyYuptnJ+Qxkkk8ZglHF5aqoiX5H3t2CRHFNLySnHYN+WUzBt N07pB5QLX5VTET9Rzymfj7bbzCL6HJlTsC1zyudWxyn542dkXrGUjW4bz2d/5c44RVtJu38z p5pqnCrvcCr6G8GprClqvqXdOVVop4JT2JH+FpyCRbdyypgJeWc+p4JT2ANrnMr5KfBPBaf0 SWkDlFXBKTWVeis0lXz2Pvju+97H0nXvh2zS5he88vxo28Pu4P2zPli06U0QPxT6SRbJLLf1 Tem7klPqKRmm9rKorbKfCpbkmAiYo55SN2XtVNNW09hEBvxMODVP/1M2Zd8TS69z3gf9Ur2M n1JHDedYP2I0+e48NovPMTY96qv/xf/htvV8nJj2CmMftyY70sZ4a/rw6SPkUX8gc+rnj6yk +4lJP27Z13iDU4st6ZWD2P3uuQNOXe5KHz3Vl34PoxzrmzllzN8LcAr/1JfhVGgmNVS9D0pt JY/UTo6bkksxxrdDHnEs55aFZ+ZVdwyV9rzMKllW41QxrreIuZBRkZ/d4834pvY8/NMc++f2 xBPvpPJTP0kLj11NU2efTV3LB1NzdS1N0JeorG7QNquP0E7Y8w4y3mmWem2836I6iDxHi7Bk zj60S9hiLPo2cw/KqGX4JKMcO2UMhcvDG2vkQWKcklpHfxQabJPPWqUtOYhv6h701BYMW+Wz 1rD3bWj/Y7kFw+4mb4X8cUyUnNKeF75+eeQxfVMyyZgK/VfqLM9xKa+MmciaieP2l7Xt2Oe2 bXPbdRm1jibL8X1cY/87x1yoq+gvlXlfXa7jL3JeXeMp9DfYj5UhOU9ZjUFyKN5R+5NRT4NF vsPWWeuyxborm4ybCJ3l9ZbQYbke89/HuQfqqC700378TP3mnWhqyKWjlXmjOhh72dmceve1 wSZyyna307bSx+/TD9WbtdMI+f6mJ8jbQHzm5Kg2P2Lo0D4V8pg5VnsBG0V1ivFybBdL/3vB KXOLZD1V55/alVPcQ7kgQ9RJ9drmTvRUXCtTvN6lHAr+uZ3tfsEpnqfH/R7Pl2X2SVz3vQ6/ lvY+j90Jp+STnDJfXjd6owU9YU5xczqYq15d4nMOTvkcbX/vnFP0IXZ8Uf25/6Pm+evoKfom 6hl/D+9bPafkURELj6+S3y+ntPe5z/G/OddfjVPGU6id1FWyqp5T6iv3y6rglPfCdbkU77nv s+++ukoN5ue57n77eL7nFtejDsilYI/rt27LovBPjQwXsRUyrIj7w2YBr0bQlTk2vcYp9ZTa Srue68ZNqIlm5xezDyvnpKDOuzTWT0b19GNbRxuNwswBvqeId4efdZyyL2oJTuX3YHQ2DU4s pM0q71A3c8mfWUm/fPGh9PGrF9Jb98+kY22lXO6DUycH0VOzzD+11JKuHWKc77HdOfUbOPUx nLr+1ET6A5y6/t1yMYbqhWqO97tTTskg+ROsqvdFyaEuuYKGivMKVqGD1FUUdZT5kfbgxzIX uvETckk9JZPUTBb3ya+cM6l2TF9V6Zv4s86SdwL/Vcf5n6ThS2+l8cd/nOYuvZTGvnUlNc2s psbp5cypqZW13G5b72XUXeSamLSe0/6rq1bw2+ibct7DBTg2Q7vlHFSH79rKesp2TU6Zi8J4 v3WWR4njkzlLaLAVdJIcklHrfIYMO0j8xAYaKjglw7Zh2QFsfh6TR/qlprHPxFheOSSXVmCU Y3o9bsmcgj2eK6fyeKta7iTbKm1IskmdJKeCRWoo5+aVaWH7ifawSjs0o+2Pftca/S31VEVf LO+++sa8OdZ9+RRjQXxXrXuhm9x23eJ+623wK65Tg3ncehz11XM97nY/ceOWQXwm+qQ621rw cxc5z9uaG1NXG7FXcGqAuUX7ZRQ2v6HeLmx86DXY5HKCObLlVWYSdvPyGDHN8EhuzZSJNydm c5Ginc/tmzlFv6TGqYhLV2ftxinjUXbsebxLWdvY52Bdnuxm98ucqtkCM1e4NvoWwTyfWfih PBaayfO93ufsukv7JC7Vd/n6Xex+4Z8yj55zvptbvAW/jXMKyiltvn20x8Epn5ntU9i0drP7 OVZcG5s62XPlhe+VnLoxfuqr2/1kaD2n7F+F3U8eWeRhwSnnJCs45XVyKmx62urUUW6rn4JT siZi1t0f8REuZZu6yaImC4a5HqyTbd473/H6euM9tEQcn36nHNsHl/RTZT8UfBkgZ2G277Ee 50achftlUPYzcZ/1QxkvoZ5yXXugnCn8V/irq8RFcUxNJYeMaXf8lJzS1jeMNhpFy2VOYYMc RVvlz0RPqf3i94ddxX3dwzPMi8Q84zVOPXVXf/qHq6fS766dS9cOj6d7iUm33Ne1J/un5NSV Zeafupt4v/uIo9jF7uf4qY+f6s9aaodT5qT4kpzS33QrhzKf2L+Tw49198moHDtR01XGpeub 2slHUdNT+qNklD6pzCn1WK1kbVWLu8iceuBaKl0gf+Cj7/A5b6Qp/FLLV36cts89nQbwSw1X l9JghfhrYqwts/SV9T1trGonq/JO0M+mbhfxFOTuQeuYO8lYPzllPgrnzDCOwjZP35Q6ahFO bazMZRZtwKQ12iQZJatk1jbtlwxb47OKIruYywNmHEJ/ySm35U01c4p3Sj8FxXFR2e4Ho/Ix 2i7Hpco092sfdD37tmQSbVfWT/DXNk0OZ13FOfqk1Fv2s7UnhV9KTtmezWKDc5yvfDKeQkbp q3LMiqzSHlfmfYy4B/uBssYSfUT5Yz10X9RV2zOP1+soz3Of77vFejrNbx2jLe2HT93wqZcY vW5iIdpbzGuDL6qxhM/EcVHN5BZtYrxuJ7kl0FpdLWliUD5hVxnYn5cTI/iihnryc5qfoS+5 wynzHckpWE+pTunT0TflfdXeeiOOwu3glPGBu3HKPkC+p/wHuSCz1DB3zCmu0eYnb7xe/5XP zue1sy2neF7hn/I5+j3xfT5z1136rF16bmbmHXAqfFQug1PmFTKng+MScntf01NfmlP0Q4o5 QWhT0T2yynG+xnZmdrmP8lX9U/qaglP+Tv1bfpb71VeW0G0yyjh198kp/5+sUfNE3J/baqf6 8b6xHnrLc+SQ/JJtFrdlnJ/j8fBxuW6d8L5FsR747lsX5FHkpMjaCRtfHtsLq/RB5RyXNUap p4z303+lT0s7oJpI+5xxfvWaSj0lw+RMjgPk/MJfhV2Dc2WUMe0xdkr/1CjMMt5vAEY5zlfO Gesn62SSdTzqtdv2MZv6q6nH+WXH+tLUcHd6YKox/eK5k+k3V8+nFw6O5hiKe4j3O9ZZ49Qc nFph/il8U28d/zJ6qrD7Xb9SZvwUWgq7Xx7re4f+KcfqmlciclDIreDTfo7l/TVNFborfFWZ XfArxkPpq8o+J7mGZrKEnorlDRsgdkCOlx4mDv0cedK/9Sra6mqq4Jdae+anaeHBS6k0upRG yYU+zHwdMmoG21OVfvaKtrk1tMwsz5v6v2RbTtEGqJaq0k5MYwuK/H7moo08tPJJVi1TjKXQ tiejttRJ6ipsLytcL4vUUzJrDTuiTLIcRLMdUWex9JicKvQU7RC5bjKnbHNoh+SVGqtM3zjy U2SflO0Rv9V4P/vZtpNySh1lGyV/3LbfHWyKfrdtYL3/yjG+6ihz/JmDelK2GFcBs2xL7E8b 6xA+KeuY76qc8b2NfqH77GNb5+WV+32XvS7s9l7rvuCV9sA+NNQQcSyD5EboxN63dw/xfPBJ RqmnOloas++pD1vfvra9jNfdlznVi/1verS/jlPqqYJT2vSCUzPlej1VcEpmFRqLtpz4vps4 hc9qgfhOeaW+2o1Txk56z+WI9/ircMprfSZeL198nsZSZE65zfP0HDVS1lNyqna+1/j9nut5 cspl1lMc283uNwJ/5FOeRwNe7EcbNKMhciwc+cadX90YBZ+hOjnaKZ9z3t7FP5X1GO+FMRbG +MmUbE/mXTB+JrPra3BKNvm5ckk7X/jJ3B+cCt0moyIO0HPllFrI99alvAlOySD5JJtCW7mU P57n8fr9nus+j1viuBosbH+hqeSTJdcH+BHaKfuhYEfhl/J4kYtZHaXG0iYow+RUGXa4z9i9 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 0N/T4NRHOpz6zE5P84WjvuYbOPXA2Zz638/0Nz/i+3t+LDkUmTe94/drOdWuO383vx9GFU7d uuPz4/vj97tEA2U7FHYN5vVI9o8/+2rh1OkcE9FRfH/0klyLMv95mZciORaPxhcYzg2EZ5fC KqzDPRqtLzkTl26GU0+HU9lOPvxSs/OpV5rD5PgN7P9Rc2XpoJlKsV7E/s5+bK71jfI8E5PY DC/246OTl85Ws890lFiT+Yr49vjzzEuOW9iEQ/IXjG2incyvV5gV+4FT67FVdBROsXPmRT/O d+yKN4VVx2Fky6ndzKl+EP9f4lXxQd53lPmQtpLXtWWtq+iz8M0a93LhaSqxiNVcv53bOsxJ ey3+vvAHm6b1XTOmfjb12rHl9LGWo5sWUu+N16Sl2B6M0k+mm2gu57FHa8VHaO665EPmtf38 f+b2wylrUM3mOmLSWKVtaDvah6I96X+OWtM9Nk9MqsalJmI7at8ao3y2zR2OjmID0kc1lvRC +NR//lxZi/fycHKvssYh36oYVfd8febhwwg+Pv4/8dql+cwrmxiT2JQcl9UUWzlHbXwKS87W U3x3WGQtZnPit+tRtfPP0lpbxjFEa+GW2BVG0V+nPsHfs56qbMKqkheYOqqvJZcCh2qOTH1t viVjErBJjMzn1CWfLWPsUs+Lvy9a3TntON82vqkODKb/0K2nNuTPhBe1v68OeKaeb+VDN6cq t9hmttX5lU/qjLogJ8d+n1e/aGxjyWk372kqfSPfa1s5ZU0r2r5ySk7q78qpOseE+8asUqfT /7Ifd7yvY6WqhureVh69Hacwiy5zbb8Xd2o78tvdu/9V8d8oXleWOdd/jUe2Pu869nutHfL1 LYYd5qxQKlfoJsewCnNwrOioMIb+8trnsGlWHxKnsl2gqWIPWu3lc7nncHApWmwlDMMra5ku 5fy1cGp+fjv3s5VnFXuT8Ve7aS+rmbfscC5z1KbsX+ppjoYvNB+e7Gkem+9vPrvb03zxpD9r euDU+TP11D/c7ssaVNFUzxnva32PuRKferec+mXm+VMGbmftp2czX/lzrzWjKSPh0XC000jK aF6PGEOVPEDF3Hx8fSW/L9oImwbDnTKHUljF52duCvkVF/Map+Rj9OcYbVY4lfXlh8LG4Xwv Vl197EvN2nPfamYfeDrr9N7TzKwel7KW3JVrh8llC6PMK7C6mvlowgScMkaKTWa7zflQ5nhN ++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 2qvqKL5CrMI79+L73ZuibdTvLJzSD8hvxuHCJz69Tmnng8YNPtFwKu24zg3t/9jEouimiXBq dCRtpnAqY0PCpXIseX98gIVT4ZP1QSqncGgxuqjGr7AGh+znLxT78rmSm5HrunbLsZZhhVPT cjV2ChtxUn9S29mKj/44bXa/cmqicup88+UbLaew6qy89B8+3dtyyrzpGe97qqfCqZ/9Bpyq ORQljyL8kUdxAWsylrfnoy9nLK55ZI3dbec5auc7l8fXlouPZh3DJ7OGVOJZo8WX9/3kYyQn 49YPmsFnos9SBvK6L+cM3cqcTLfjJ/z415uZT36vmfvUK817n/hMM7RyT+bsPWo29h9IrnnW tljZy3wPJ81WnoGcBP60vfjV9rJuPC21kLEvcihOoiHuyRhfOkrMSa4fPYVP2FPzKvDL8eVo HP4/68HSU8blLidmQU/JS98Kq2p/Yi/Paoc/KT6/++X5yUWPD5CWOoquOoye4vszfuogsRGc oqnoqXXxj9gYnBKHYH/wBIOqnip+v7QBDKKf7LcPqy5Hu1wOR7CLr4/9Oc2tyHvXoq/YqDZO xyeY35Z99Jd5k5a1p3yOnrJmopiC9q5da3vaWfX7eF/7jdogO2FMjLW/Z2KbRsKn3rRppe9c 1p6LphoWr08+xXjatjFU1oynqfy3s5lLSU669eHNK+s/LeOkoqcqr4zVxakSmwqnMImeMres edFt+QS9psGMnzJHo/mvNtLP83lbcSY+vePOGDgxKP0a+sl4KZrpOHFDOTJyLLzHLj5BsSzz ++EEvYIF1fdXXucZlvFT4cJyNE1hTfo3zhEr8r6Mb5ptcx6qb8/z5r+TK+Fz9pf4VDenUkcr h/DHdRT+QOOL6/dvpB67Bv8hrrnuVGKK9lk/cTX9jpk8qzqGSuxQP8K84nxs7CN76LmysVVT e68+ePan2jn1zXt1hG3GpMqEem6d79ExdQh38EjejpwNOerqnu+233YvPmmaw3u6i61m03HN 9V3btRTXrd+FNe7D/dmqo7XuqqO4Uvf7Pbjk3vEKV/j9+Pxcp/KobiurKpfsrxqqvnZ934eB rufeFN/lvu33e/UHaClsVuSOFGblNb/Gctq4rX2O1fPwHENaXmCzfBUarNVIeINV42MZOxDe 0FiTGWtVxxPTUkVvhU3iUDhUdZLtamL8rl84Fb9gy6i0ixzjE5S7PjNtu5H/PL7/XFu/3fw9 u4kn76YtHWd8/k7mkXlgtKf5WPTU5w7PN1+81l/8fq88dL756z9qWfWfPtbT/JdH27FTf/vU +YyfOtf83c3zDb/fP9zF72ftqTfK2Kn90zWofhX99KvkT7TrT7V5FG/iVFjTraewSm56yfmL pjLOF6doqjLvRBjWm3n5+h//ejiWuJPciKeTi5GY1sCtrCt1O2N6n8Wp+A5vJQf9dnTVEy+H a19rpj7x7cyD8Y1m9b5Hmv6Fk8Kple37w5PkzIVTN3YPMt4s7ZdfJzGfndgoxZq93ZyyRi5O yZfAKdqq+vtoKvqq5qzjVOVT3eLUZvQZu7YRGyZuUeaFS1xsNzbyWsZu3QgfT+JzrH4/+egt p+InTGwKn+Snm6PdGsKbsYPsizVI9hKLYM9av50cCv48OqMtcif47vDpagpfIEZNRMfItXDM FrPkB9JTNJjP0Wi2bJTz9Kvl+GGVtqFNrCefwpwUbBQ7oN1p20pt07WPqi06x/vRsFJenzE4 /H0Xw6e+8+ebocTpR8OtiRy/Gp31Jk7FfuoHzCV/kN9vKcwSk/J/yj+np9Y7c1DIoTC3BDZh F78fXdXyyziy/Lbk/xVOxTdYObV3yim+3JZT/BTH6cfIg6lrJxZOpa2dxSlz0FfdiwN4ghf1 dR3nS99UTjlWOJVn/GucCk8Kp/Lc61jeu3HK9/n++p0lFzD9qvr96hFGKc6ht6ay/qT38kg9 fzq9aip5FL3J9ZtI7LNoapyKbWXXMYrPr/qu2Fv1oLKL3fXe8/faeeyxOqFuqDs4xVaXvkyO 0VEY1HJqtcOi9NtzTskDzDXMh9JyKuMPUg/bfIo8uz8Qp/wmPKKf6vadOFVZRU/xIXZzym+u nKrxqcKptMnCnxwvnMr/WhiEQyktm1pGFVZ1eOUY/uCNOBIGyaOoDMEpHMIpjKoskW9hPSvc MR7Y56tm8lmcswYWTdVqrfQTw6vKMdd1nu+6elV+hz5sNGK+n0+o5Jal7ewtzDQnmTtmd6iv eXCsp3m4cOrCHU5lzfnflVM/x6nCqpZTv8xaiXfj1CAtxMcXVtFU8vMuJP7UG/9dyd2LpuqO Txk3Vcb5Pvpyzkl5POvMfzzaq6OjBm6/Hl31anIxXk+c65Xm6vOZiyKcGvrYS83lJ7/aLNz+ WjPyx59priRv4srKUbOyfpR5rI7jS9uNfy1jhNKP2IvPYiOMMm/fevTKWjiwkj6uNeZ3Y3+v RzvV2JR59ugohX9PMScFjsm1wDFz7xU+xX6ypwp2eS7smb658Tf8RRhFU92b9RWPwqh9cwJ2 9BROyaG4NzGrk+T5WYdxM7Zyi183/fbC1dyzvvFBuLke2yA+xabI38MUpeSpp8/FnzcV24BR k7Evk2EUbtFZU2EBZtFYE+kj45WYFkYZb8VG1VL3y6Pg72On2A/+cXaG/ak2SPvT39T3ZIf4 BvkwRvjz00b1y40XHfO+N/NJx/bRUeMDQ5nzKPeR+5rLd59yKrkT07m+2J95DeVQ0DPG+NI7 Jf88eUTmkuD728p8HrvRpXQUdpXSyfWjmeRY8AO2nGrnozg2RiDPwDVwy9Yzw6STjP2ueelV T7X5fXfXU8epQ6d6JnULU+icqnVoIvkKOOUYHfMmTqmPqUP0T+UYTsnpo4ucfzdOuVb1++FQ zQWs3+9ahVPRYvZZh+RqfLW+r+Smx76UupStuOWl+Koupj/BfvK3iYuYkwJz+PsUfZaqDXDI PqyqTMIor51X93Vzir3GOLZabjndvp1x5upcZZM4jf36S+ogzcH/6F5wis5yvuu7ljrodeWA +qmuYsxZekp/yzXoKZ9Tp2ky9VtsyjXwB5ts35o/Yb+cCcfwSfFZ11V83m+tnLL1f7jfaW0n x/g9tHHFa/4P7Vp/tPXXx9+Xe9Rfnc+9Oa59i0vhhbwI7KFx6J2yDU8wBaccxxr5FphFU+HU zsZ26qPcmuglhX8v8S3HcAqP5LKbe93awYuxBdZcnM9+czRNTYatc+JUraZdUr9jD7dS53fy +jjrl24PX2oeGI+eWhhsPncUTl3va76dPIrvP9RzJqfeFJ+qfr9PL7bzUfzZZvPzz++ecqrM R2FN3y935qKIpqp56YVNYVSZMynxJTEqeemnOXrhlNw9c/W168u3a0nRU+bqu/SUHPSskfhE 1vwNpwZuv5r8wbDp1mtN3015g6+Fed+Jn+/16Kf4Ch/5YjNz+xuZJ+lLTc+9TzXji3vN8sF7 m62dG/n/9jMm6TCM2m+283x240eQN7EZ278SZizzAaVdL6XN4tS1XTkPiVnFbyM+hUvFx5c+ Km7xAVo741AOlfYeWyPXrzKqbGNLV+IP4hNajrZazhjdtbzejgY4SH6hXPS9fO9OYlHiUtXv d31vLbnpyTHr+PywaZPfMKX4KWOnzMV9mP56sV9pn3iFLTWfD0+Kzkp9rfEoXPK6HbuZ9htu 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 OdU+HVZVTqVOeSZOVRblOD9XfXaeX7XWQTR29jGtfR+fX8/uR08tzmTsEO1nTg/b1E6+G04Z yz/wwAN1vG7uFE01E33E3ieGgv3v/Q8+WN6Va973rnfnb5/LGJp/MTFG+vrUQTzCqTqWz/0Y 1Yp+kQ2Pba/Z/di26S6cwqNq69ZH1sIe2MVpsBfKCdZxKm089j157sSei4/AILEU8tPVOPXs n+ipaMGpcMp1bHvW/2uckh+p5lFK30trNU0lFwduVU6FI3XOb9iCU0ODyaGe+b7i/WqJ7e+M MV1fYiWTu6LG6mWcenr+1EJ+8+n4brHc3KixtFHrU1ofh31TO8ep5nfCKYzaDIO0cTHoWFVt b/gVvohN8Zv5TetaivW37+Za7vhNFbzK9jCa8myuPR/NhV98394H/5V4YqyjhcXAyO/Zxsa2 vpuCU+cSo7KberA6j1XiU6Khsx6VOVQ4dX5zody1t1Y+sDda3h/bn3U9Ok7dUb73nreOUzP0 EgbdyJpTKXUtqnBrOPpqMCzCLjZAfivaq5+dMPzqp79yTIzEVNbrEL8up/roE8mZHi01G721 EO31wKdi/3vPs2Vm96hMbF1MLqu8q/QxB3uzsb/GZh39sx4bnLKU9r8QH/0KfRPbEn/VQmIm 7bMLWteXr0qpNsD4FjCHRqKleuERex69dD6+Cjn9nK85Ko4ZQmPhlXV4Xacf0Ue1fqqOjTMe 1UcY5zadVW1/GUfR/cZUNZ9S7jUHaz3xbviIl3v5O7v5G4exM16MrsLazTyv+THVj6b1jaPm UmcX85zZaLjJjNfmw8QNfU7GPmPRU4Op/8PRUY0t6j6NdCY6S6GRGptevW0xfe04RmGe7Qn3 pjL+S96j2enkpZ0cThvDYHmbJtIukyMpDFvP571wZjX7W2HYuby/7XAIp+gn8eedngrfq10v 7M8585zM2cWobn357jz2iFVvsX90lfN41fxPTV851mI0+LqwSuwfhr0VnBJbSvcYw+CK/cqp cMOc71vpKeMg1yjqGFuiZ9JN2OM4/jSWNTukzxh1K06Zq4FT9BTbH071otuMZbzrs/E/qW8z GVuvpA9bDg/k+DN/iqaSK9XaLeKo2ZfkN6ab5O7X/+FUtS8d25wwyvhe4R+psYHpYxunxJbx YeknaQMaqmNU2nT6SMfdg1PiM9j76CR+KDnBxaGz+WFS5VT6UXET9m/qqXAq9r2asyLf+YRT 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 uS/8UE3uyCy3ac9zbkO55DmRcw8mybsjtqvB3KfO8njtgnLN8VYeI4vUUsak+0x8Tm5TY7lM Zvns7Ic4d4o62KWxMjJCJtiGy4fkhVolbHC8I2qf+IymcSkjUhtl2x96ByZkm+9ndb3XU0/J EtmgzU3/jv0pvy81k8e77vGep00wbH0wxO/M9bD78XvlTzLK995r6Us6tC/Gfvepk5JT7nef 19JP5m+Rl+oiueW6zBro0dbbEcy6RP/O87VBeg+8VzEnDe+4MX/6K43DMyZIu1TGTKuBIs6V bban5kbK4zzGY40LsM1VK3m8bbD2PJfGJHmex7lMLRFjgmkL9cvEHCHsc5yU43v14Zvbz7FR Lh0fZRvr9oiTpp0dH8MnjC5QAzgflcUxU8kgYyPUSeZScpyv46Yc51v9U0uRL919jvd1PJUx FaOMcx0aOdFTveamyDxK2P60+4Xtj6V9QNlkndPulyxyGdvYfta21FPeU8dN5X/3Ptg+ZNyU PJJTtiMu3Zd+KLWTOif9R/LLbXLG2IeI0+Pajo0eQz9OwmHvrfcyxqKxb4ZijMQiz6zB8/O+ 65eyz7Bk34fS4Plo51qEe9oK7VsY/3IwN1guw6mbxwPlmUuD5c/wT33tA93l2/qnsPs5Zurl x4bLq1cny6vXpsoPr42GpvreY93lOw+fL9955Hx55Vpf+dGTU+Xvb86XXz63W/7108dv45+q Y6hy/FTET6ib8EvdVtBIMsv9aihtfO2x6yf2v/9Jzr+vl3lyosupjQ9fKx3LR2Vp56BMM85s f2+P+sG7DluOHMNI/V2mjllnVm0XqPfpC7avap6yFeNwqe/OK79BMWZin7q/D+tl0w775NQe 2684jy6+92RPi1PoKtu2+9ifbLINtM/uOFKP13evXupG31zo7QkGjdDX7IcnsmtAtjS1lPkh /Bw592QUDHKfdj05lDa/9FMll9zu+5b+pdRFGV/+VnzK7amzzuJU6K+oG7V+WFecA0dOGdOn lqpz5BArAZucR36aOTocwxs+KPjkOF/j+mLsLtyQV7JKpqiD1EntnEp9JKc8R5+Tc2243dhA 4yb0T3muc3TIOvfJqdBfcM0c6tr+3nFOwRLbdrVDcAluuH5XTvEuJaeSYcEp+lTyQk7JnRan +Pzb4pR1Ql0mJ2Wqn/09ySl547r6yLG7PvMLtJsyyDy5nhecarIxYiiaNj/j/ZxT9zZO0Wbl +NzkjGN5PS55FJxaMWbtbTjFdTKmTy0lr9pzLGVbfVdOEQdgXtrImU4bnLkrnPPj3jiVcRRw Cm6pqVqcwh43OkYevjZO9WV8ehexEndw6tzbcCrH1J/wy/qo/hqhPfEeqC1luX4p7Z6u215o 41M/yabkkVopP8sk2SVDklMeF3qK6zjmaZ6lmmkCLssqOS+T5JgMc7+fZb+cT045Dse+hXMk OW7V79DWtYzeMm+SsYn2TQ7nhsrlpbHy9FF/cOoLbZz6myanXmly6jU49eq1Mex/o+V2TvWe cOrWDnPNvx2n6jjfHO8rb1qlGSPRl8smo3J/xKy3H8963/VvkUP962X56ufK1s0vlYUrv1u6 G/AIO7T39AA/1Co2iU3iS46I8duh3WjQj7CfXe1M8J3+qXPfxjzt2CaW+bxOG9OAWZ67zjPa klfU0V3uYy3oMe5fMirHUdkHV0/JI/elvyP41IwFlFvGCNovH4Y9XfRBOy+Qr0tbM1qpFxub xbgK8+8bO9HP+Fj392JXGYBTw+gq4wJTL8khi3xqL3Iq9ZRaSnuetjsZkyx6u2VqqdOcSn5F /46+3oVzjJM63xljZ2TUEP4J55BXR2nnczyv2ilynsslWLSMTjJeomontcJs8MnY9LT5yR05 5Wfjyc2JFH4pOOXS/fqaZJHcSSbph3KMVLX5OTZKdlX/lfZAtVnVWr+ZnlLDhJ5Ca8sS23H1 SXCKd+qunOI8NZDXUXsEp+hX2n/yul7H99PrBKfQR+qZ4BQMeLf1VP42/5u88fvUTupBlxFn DrdijBTvZV/XheCUeSiMY1ejqeG0Xcgs+aum0pel/a/FKdow2yvbULmVesptxlCriYypljfG r8muHBOU/MoxvTtb21zH4+jLYNvyen5Wl6m/UlN47Ran4JF5J2xHq56iTaf9Nb9f5EdQT9H+ 2hbbzpo//V44pb7SP2VcenAqPqunlsIGmJwaxD9VYynooxqf3k09jfG+J3rKXEqhm6hvp3WT /ij3nd6uf8o4QO+n9yNj/mSU9+U0p9RP6hnbzrTPJKfcZvEYi0xxzo7KP+eLIr+H3LNPETyk f+hz4pw6bwhtbWhc9IF6mH0N7BYN3omlxVl4h65m3XGsi+jYGe7/Cve/wTM8mB8ux3Dq+mF/ efrSUPk8/qkvf6CnfPsPO4qc+u6D/eWVx0bKa1eny4+uzZTXnhgPVn3/cfJTPMw8v49cqHoK m+BPnp4v//DsTvnf/+Uo9NQ/f+aw/PNb5KPQ5mfRntfSScaft3EoNZTL1E99xK3LMT8PkLe2 59pflI6Hvsz88i+UrWe+VIa3j0v/GrHj2KG9p5vcz0Xu3Rp+uYNNYiS4N+ts26J/bbHemQ9J 7aS9bwlOLdEurLFdXq3SJqxQ1igb9is517JFfdngnsunOs6mjsORPbJKFskoWbVNHJl+K7e5 Ty3ldj/Lm25scB28Z53w4wLv1XniGFzKpQl+u7zyGLf1ss2YwCFsfkNsP4tPbsuYCW1/ae/L uL97ZZT8SvveWZwKX1azfnR1noNR3bAJLQWjhvsdy9sXOmoO+56cqva+kdacHMvwynG6aif7 DHJEPaWvKvWU3JFlMkgNpH6SL9rv1FTyZpciv3KclMeczOlhLoc6xtfjw2/Fdao/i/af5/Gb 2P1sd9VLOSZJ1gSnYJWsuRun5E3GIdzGKXgUOozryCmvqY6RY/Iqv++3wan8H2F7pB7oZwpO sZQ5crPFqe7KKcdzy7XLxB/5H+WUvFIfaiuUUxFLoZ5q5kyQIbZjfq4ay3wXy7Rj1b8ka9xv e6s2kjNuq5zCbxdcoi8ZnIKnfLY9tI2Wf9qQKgfrZ8+XSWH3C/+KsQRNTsEjdcISNq2JccaH YO9TJ8xgy9LOdc+cQouNwDQ5pT/KePTklnmTKqeo48SmDxDz1z8wjP8YVvUQ24SmirGIHXX8 VOcpPqW9T0adxSn7kOarMA7Qe+S9k1OuR1+A+5w2PzWVJXWTWkk/lZ/lVPJLhrnuNotxlPYh 5JK8klvBRPbJpuTUUrN/4TPxmUXMxCp9r6a9bx5//QxxVc5PEblUucfqqWW1F5w6XBgpR4uj 5Yn93hanviKnsPslp37w+Ggw6vUnZtFNk7Bqonz/ccZQwSjLy9j9XoNTbzxFXPozzjkvn9oZ dRwx6P/636rNTz793/9+fxRjy43ly7FSySSXxk3IsNgGm4yfiLG+LJNV5x75eun44xfL1vXP l83rL5RJcnjM7R6U+4gL26WN2+S+LGP3WmUs2UXiJ80VZTz+Hvmud2zbaEsa9A036Adv2a+l zlm0963QPmzwnNbVVGxb51qb3H/LBp/XeN76NYxhtq0zhlktlSwyVl2fhvknWpyKXBTkimuO Cc75oZ1nOt43/EHRL4q+UyfzhppP2XeWuZvglLnKR3i/XfZhX8uYiIwjV0slu1zqg7Jo5zvL 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 XzEe8Edw6qc3Nso/3tojR/qdedKrvS8Z5fJKcEcOZby5HMo4v9RS+qFSZ7VzKsYIX/1WOffI N8vRrS+VjuOPEo++V5Z5hy9vNYJTuzyHNfTUMnOarMCqOeyplhXm4lsYH6AdZQ4zYu4a9A9l 1ZI2DereGrpqifu5yTPapV7t89x2aSs2tQHKKK67Rx2wnZNJa4zblUcyammWGGvu90ZDnxft B9v0YZlDSdug52QMe4N645wtsmqa3zWJtpJXMkkOZenudOws42/RVH30k/zsvrsxp33/Wev3 wqb2Y96OU1PGb1Hk1PhQH3yhv80YqWAVemoWu5+2vg1seOuL3udR/nv6onhfZZXManIox0QF p9BF2vi03ckiOaW974jYc8+TX8ake748MlbdY+SU+0M7sV9NZqy7Wuyd5pS2Odv1lp7693CK cxpwSt0UY52IM5VP6hqZkL6s4BTv5butp/wtyanQU/ijtNep7cx75Lq/T3+Ttr6Mo3Dpueaw MD7d8fPJKG2I6k712AmnaNeoB7al0/T3ZYn9bTWU8xna9pmrudoIieW8uB/HyrYzOQXjvJb2 Jb/Dvr4+LX1gHu8+i2N51tFTb8kp9JY8qpzid/C50UhOkQ8Tu97bxaWfcGqR+Kc2TvE7zEeR nBqGU0PkpRgahlNoqkFi1tVU98Kp1Fa51H+gHcYxwN43719qVJf6q7wHoTXZrz6yaOeTSfqg LGoqeSXH3Ney9XEN193ufZVPmxxvbF6Dz6md5jjGfng7q3yuPt8pWDnJ71iY49nQX2xQFqm7 6qm0+82iOR0TEJxanih7c8Pl4Z2u4NTn33v+Nk59Lzl1XU4tEiuBroJVcup7cOolOYUN8IeP TzC+itxJ19fLL4NTx3fM59HOqbT/tdvxHDN1nrnmcz4P7YF9Tb0ls1zPOHXXPf7cTeaeuv6F cumxz5SRyx+hLmPL3L1Uji8dcp+xP1NXGvbhzNVBLOkS/aBFtEsv88X2Tziux5hpntsEtlHi 6qaJa5ihzskui3bBVfp+FuPVV+BUe9mSXRT9WR4j74J5rDtmS23mPFWbrOfSmENzL4U/jPd1 nb6I82cu0OdosJxBqw+imQZglXHe9k9rQc/TV2r/fA7t1HHuRFfF+nli+XhXO7AJxGf3v1Xh 2u0cyvVOjm8VeclnS8+FDljJOPhexkn1oqXYNtLfFfnOnZtjdNAcs8RP4I/KXLKO4zXfrL6n 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 sF3MMz7JvjFtzyrtwgF15P7d/XJI/vmL5D7c5T2fWYUHxATqW5IlaqopdJJFDqmdRugryqce 2vVu6mIXxfW+85VXHiOv1FdxLjEZckhWLVJXG/SNZZHrcsntc9RxtZdjttw+Ru6tOd4Z3x15 pR6WQ5P0hbQFpk05dDrPfxPfp8xSg3ncMMeZm6Kf/pP5l0JDJW94b1t+K373met57KnlWZzq Ol+11GAf2rKf3BMUfVLTxJxbXM94ida8vPif5FTEUKCBQk/BLPnVQD9tNGMi9DvJJGMqYtwu LJJhHie3jKEI+yDvqvu9vmOk9E/JGYs8UQPJj+BXMwYzYzLdb74qdZHay2PlU9rwIsdVUysZ LyGTglPYDS8xLjvnZ66cct6Qmne2xSk4JBNs+4MPtO/autRafg69oy2N42RR+q5kjZySc3Io OKWtTYbY9sswWJIckxvBKa4p1+SRHGrpKRnD93gdv1fGxLqcghnyyeODU3yP36udz/8R9r7V ag/0e+L/cIzrXsM4ClkVudEjvo98X9SHTfY7D446y2IsoOO+Zd5FOG2MhnZFOZmcMldZjN2l rcyYtOAV/TX9U/bXZYp2p2w/g1O0kbaV0fdvMkcWOdZXftnvN3bAdtXtXsfjZZXnyD41l+tq JotskkkZg+1nmSSf5JT7klN+llMWtZM2vgl+44hjS6iT6iP1ldrqrpyCRXLN87UbZtx6xGTA K7epqcL212nM1O2ckk1Z9EuZXzrmSOC6jpMKrWQ7wv+QDfaBI76B75NTstx75D2JeJUmo6Iv YFvDvfS+rnAvPdb7Zl6Pqqkqf+w7yyX70dqDdjbs69gX0d5A/WK7xfUNnp3zSXmObZqxfTPE R8/jk2mgm1bmN/l9DXxi1Uc1t7jG/BDEGdBWWP+vLJPnb1E/VX959GCSeRKbnHqU3LPXF4JT P7m1XH6K/U9W/fRZxvzemCSeYgxWjRJvMcoS7XV9rvziudXyq08dhKb6l/+a46du51Nyqq/p h8q5eiPWHD+Vy+SWLJNVYf9LTt36dvisFp/+87Jy68tl9eCDZWb9PeV9O8ybO8/4wn3sfbQj DW3yaKsrcmqdnNf4WS9yDxf0dRC7vE+/VJ5ox1MHyRNZY3yFOkvbnzZA2dTTecIrmWXpJ0/M YC9zvGAvzD6k7Mp5dtRcMd9O2PiIIYRTwS10nOP61VHRr2hyKvs72vfkkHExxqq7rtYyrsb3 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 TerG6rQNG1LXJL5jcUvN7sLeYrzjjvBLP5gdXp9z2+bRuoa2NkM91m7wLdc48dQ1Y5w6/UtH pF6lL8iHJM8+pnTXdLGg3hPfIru/dsqYX3N52prn05wzxlhpK/gE2FzMl1bzs3Vc15nL9ea+ aMmYFp9bEF4O6O+mLVma7eEZXzwzbOyLrpsRTk6J7+yw6i9LfF/KXy3PKb9Toufsi+syDsw6 8vP8jv7MaZn1eRfPn5NYCPPsJk447HKsnV+UfXELkjw+H9c7pnUGrYeWz0nGINE7+OKz5pOo 90w8AxZgyMCijFfJfCo0Do1kfj73wRbJ3BG4U2MnoqeGY98TD4FPYxPiIaoPKZxp39nxK3Wg xgh244vEJ9AJ5rfTBjf/C1asXW2to1Xh1Fi9xruSr0yw5dnXdis37sNn03w+7kN7uMY5n8UF ZYi2quUr56rWSt10DVY57zpls+7nu5rfqmqyvFNji52T/EZbjGsxhPX71Hmci13RMdue3+N6 31O/K+f8Lnn+e/sN7mV8n7F/4tH9L7+X3qqf7f2fJfl8f9qPIX3gsGLplGllU/q8nzzrQ2V3 4pXGMqZ+A59DvndzdJW50tfmXltGMuY+/w8D2NnE19Eu/BR8Q46N/cMOPGhxd6098zmp2fJw bmXaueabqvv5bJuXlsaSME7CNWuA4E4bd1i5k9/Qvp9vis7yu9p1jVntWmskmo+C/qGNzENB X/E5tfkolqRdFW9hHBQflOOlaZuNnZo3L7bSzBm0cNGy2PyscZV2ZEF8X0nW+J03f2GuU38z n3rW+e2bGdtfX8b9Tk2M+iGZc6bGpmdNj+xPnjS1d9zV6cnhx4F6HQalvzFtEk41ZmRMZJiB J5MPOZA3cf+lPvPcI9xh08G6idcd2Df/Z/we0VH6xDW2OPY+42LqPBmxB3qm3qPnvjz61vgy c/kuj73PHFKOl2XM70DWnsJq+y1/ZcpUOx4eiXZYfEh5396V5fyjBspfvn9PuSZxFN/90LZy T/TU7WesLXeetb7c/IHVdZ3fa09YmrUTl2YNRevSz8s69bPL5fs2lavP2lluOO+IctMFbyzf Pf+IcvMFR4Zvbyi3nLun3HXB3prmxD81+6RwKrY+nHLc8tgAp2dcr7n+KrOwqfLpUzXPucVZ b37q/9yferY7/c8jUidiqwuPBtan7m5O/y2cwqNNyR8TLxIGDaWObEyd25h2Tp9VnVc/tTvq svjc7WOba51U77U7OCXPNa2tYJ83/k0ytqmNxcUpfkI22jYGTh6d261VlrKact2NiYoNDPOi xcRRVd91+qU4hFGY6HvsG2Ppmm4eC7EK4ueMa0lMDU2X7fi6C7nf8nx2aT5L4+HT1GmxK0ph 1KTER5jvb1LKXeNUjf9L2Z5UeZU+Vnxq/eGeZF55cxPiFaZYWxCPFkdjrQ6zlsQWyB+ES/ax Z1l0l7zKqTCncco1da688MW+a3EEa+ihA5xK7HM4xf72q5zqxt3iVIvLEzPxq5zqfFe+xzn3 q2zrMc+zx4lWDrTH2mHlQLuMF2vThjdO4UFt61MmXPfbxCkcaoytPEqZxzDl2X9U1vFJ/0cM urHptjjm+WCxuoDReKUuDOZ4fsracNr7jUNDZV7au3fu3lv+9NzzylGbx8ruaK3Na4w9zhxl qXs4JeGUmD+6pbVZTdc0bhn3p02jX5qGwQuswK/Kqmgwfia2bRqMHqOXaC26SpxG55M6wCj5 XdxFdHuu9f2Nh5j0mjmVOq2NxS2cqn6msKiuRxU2YVTHqfA1x/X8K3Dq8Hn4R2tZ90Os+ty0 9wc4hU/iKQ5NsvbvYam/7IHqNF+02Cm8wChpet6pvoctZmHOuM87n2XH07+uqdpyevux5XZ2 ndiGopH5pdj1xGOw+3WfSWxG7DpsOfSueTDqulV5h56zvodnS8OytzrGbDyvrMLufI6WNLfv 4ryneXzt4ZfrzO07uDJ+xrxb3BrKGKQ3rphSjt+zsnz8HWvKF/btKjeenvklztmZsVOJTT9r pHx//6Zy22nD5fp9g+VbJw2U69+/rKZv7esv33jfnPKXPU5d/+Ejyo3n49SR4dQbyx3n/065 9cN7MyfFG2rCp5nxOTW9hFGH7/tsmZtkf3psf9P+UMo8Ssf1kv3kObfktMSrv/uPUs/2pJ69 IeuUZAxYOLU8Mek4tSU2942pn5ujsbYnfmJdmDQcv6q2r3Iq/WjaSfuk3qnLuKVd0n6pu9os efrb2ib11lad7uYFSVlPfWlzRdCzbWyuuUHqPFZhWae92FSWpV0eqJ/VPvhO99Rn1g5oO/iw fUdrR30XLmFWm9PN7+MvWxEeLYsvoZ7LdQO5bmnaDnZI/jN+sUkpl4eGS4fSUEltTlp9rsYp 5Vrsui0tNTM+ibqWfGVUOBXuWEt+RbTRYGL98Ai3VoZZ8hunqo4Kn5ZnPhR6aSKn8KhyKrqJ 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 xElNTRKXTksNpi/DRsI/pV538xDkmYY3fOf60vwR7HqYZJwndmm/9LnpJVxqcRPiKPimxPzx cWFU5V6PU81/2BiP8/W5jXNqSdVT5pmonAqHsIldT16/cc7RVcvjz6Gr5ko5P5jzxou9+ajf Kz984uny0D13lO/dfGN59M7ryuN331Be/OGd5Z9//HD5l58+UX757A/K3z75QPn5Ew+Uf3n6 vvLPT91b/vXxW8o/PHRj+fGtV5QHv3ZpufmzZ5ZrLn5f+cZ5R1dW3XTe28otHz263HbB75bb zn9T7HaJ7Ts+9rxop4mpj5+KZsKpYy/JWN6Pjyd5zrlm/r6PvURPbV2b9eYzTspcFMtG0q6k v7c+dWy7/OGRsjT9VXEU6oxz6rF6V/1O6cPilLZHO9PGTLX+s/4kpmm72xrc3Zi3zLsYXtFM 3pt33/mfotGjrbx37GIPrOO/4weafMgh4U/i9qKLcMp6CWx7dBUOSXU/+Y1R1l4ct//lM/RU Xz3fOJVx4NFebIk4VdcUyf1eTk+1fpcyLaaCf8qYi45R5oKN/TnleWUYNNTTJ3hkvBS7H2bh xEieZeMULkmY0ziEO/xR2OFa+fSUY9c6pncmcsr+K3HKvSqnosfcY2u0FM3UbI4TP/9a9dTB nHJctVCvrPDhTNRT45yKblF2DuYUfVQ51TvnenlYNq6nUmaVt3YOE+yPs2QkY9Zzjf6SMkx/ /Xt6CptoJ8l+1WAp212fuovhse97JfekKyVcajrPf27fr66wgWLfQOZ9XDQzc1CEcw/eeH15 4Kt/VX5w7TXlri9/qdxx5RXlzD98dzn2TUdmLd8NGXMfv1TWxTR/45ZwyjFO0SpS4xRWSY0h OEW7HMwpx918E01PdZyimXCKb0qyfhV/Fbtg01p8V2yG7uu7cMr3sT/6TVg0kVPymyaYyKnB 9OuN+eGLamOA6KmaF7vfK3HKGF5cWpI45YULMwdI2LTA8ZLldR+nzEnRfFSVVWIpemnaVLEU 3Vjfl3AqfU7jICWcsl4r/xQ7Ef/Uouho9dpYXX1p7RUbEFsP21DnO+efyrnwy3ms4uPo7IT6 ORnDHE1Le3WxZF2cIE51esp8OF18S+OUZ+d5e8byloTNy2P3GwiXV4Y9i8Kp/nBpdfw08pfm GfYfbr6DwbRp0ZGZM2p+jpdFfx2a/3jG/ovLcz/753L//Y+Um2++vdx95+3l0YcfKH/z3LPl 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 uYR77EuDW9iMOvVfQ14F90I+Glf/O+tojO8O3CKGyXtsiueKyn4Uq08Z6h8zBwd1JDLVPyEm dRqn+n8932+oOJWjcb0x+fycU/L/oaecU7LjzNNKHkWV7Hmd3sMBOIW+8Vrk0lDoIDjFNlgF E9BY8CHEnog5VegcQQPBEPLO4RT8QXMFnkRMQ0/9gzml/y7UIQn/39+bU1HfR1pU90Efp6Sp uc/CfcN67j04wr0D8/o4pfuQe5P7B07hb+Y9+/AZH1usY9FfYZwCtY0CVwOLqQWGluc9HERL wSn6yvU1yk8RpzwvXXYYW0x+nM/JKjtPLH2U9hkuG3LPtOl2fK+e9XeX286VS23v2vfc99e2 YpnHp458tN52vb3EFs970mb/4ma78vxz7Tzd7026j+BUvfos6KkmjXdE+8AN9Brn4nXgFGyg DQuc0raIU0WWJVs5FH+4ngPiTeRQoMlgHXXlIo0Fp+S7x8bGOeW6TaxCawUOMsaXBptCvIol nIJZgVNsh1V9nIr7/NBJ8Id5kpxTsrXkVvxvOAWznFP6HJzitef/wYP4Nnjm/JKvDz01RLWE Bg/C5sOprARO0UdVjWrxJozzhVFoKjhFv5a89MCpZDgFo9RYB6uo8UZcPIwJ5f9nPAL9ZBiF 3srRfwCj8vWb5KjfAJcyxaIhGpPFNpbuw0Nn0TSWNFNLb9o3Q4wamqP4mjQULVNjoTPU0vR9 s/TblpQO129BbYx+dtXkH9qqpb+xuQ9Pt6dm324LnnvQfnPj+fbU1eNtzpWj7d4fVdr0i+rt 7cdusc6t6+yTrh22Zfd+29Zx0D5sO27vbN5r77eozlLnUWvXvdvW3WMt+4/a7qOfWfuxL2zn oRPWsu+wbdt/xFrFqT1HTlr3yS9srxraKDS4A6NYsg4eMWaKZeAWOYBhTDDLyunyG0pPlRcq v7Zigk1U3aSxmne+UPl+5U2VNr5Z6/VMwynG+Q6nP6B+Y736jPgC8OmRL0GjD4y94PmHSWim cq2vVR+7Ru9ZjtaYk5GyLXV6Fhr1nFfINjP3NrlLPHuMO2IdY0NGyGbj32hSHxJ/POPv2bdS /XyW+OcbNHaFMZPRtag2o/7vYeof0i+kuX9WfOKZwsfhYxVlV1hPP5G84wL5+3yeO2lA4mn4 /qiVjo4aCK+07N//9DyKpCTVTvZxdUMsFtdTBYozEZ+qFiO4/iLxhVy/al2rc0TfLaZ15PqR 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 YVrL1Axr1UExJ7oeU/fM1tY3v4Mz6s6ips6ouX2a2RT5/ODUQwPbKk49wVZM7Gu7l423sVX6 L73+m7jwjjKbofls8er58f1t3cPD7cTbj9rxN+fZhgVD7cVx3X16fUyZLR/WxV4bkW0bp3Sz 7dM1hu2kAls3udpeHVtu80b2sjWL7rU9O963i+cP264Dn9vug194f13anmBTYFTQVIxLQV9e Yv3YljxhibMJfdVo+ELXVtm/V/tUdrV1y660yqxy6yW/VFfZkdSsdpaRl2bl+Yr5U9/mAtVZ 8uUbTle5ZCqS769KY/2F+jFzbAVxe66B9M34965vyG2croktwv5hC0M915dlK+ANrIJBcCZw J7AHu4LNgTWBg8z/FZxCRwVNRZsGy/CMOFM0E5xCS6Gp6OdbLyGa0FT494i/g1P014VT8AVO sXwpThGrjw7jPNqhctR+xTZi+mnboh0Khl0JpyoVE5CjtGEiJpo5msrbp+CU7DLcYs7+bO1H W5WqHg7LSGfscGAG9tjHEdK+kOaex7om+QszsNXuO5ONvhyn/Lo6j7x1Gw8n9Axu62VbKRvw grLh9ZR4HYfzyPtwT9+nOkw4nrJA/vM88Ig6DflG/SSUD96N44OeoqyEssc9WeZcro1GdE7p OXg33ovy69zSOufCKY7jejwf22KqZ3TSNfL0fpVqlyrWPFFl5c2XXlIf3r2uoxh7ljEoTuze 4xrq++Mn7Gu1Tx3fs9cuqu/+8b2fu88P399X8gse+fhj9e993/avf8uObvrQ9r65zt5avNim DR9ug6qqrXdhieWmKi+kOWAU4ybh++O/UxGnxCrZQBgBp+ABY/vBKbQHdrxjut4hN98Zhf3H BmL30FbYTLZFMWYRE6Ixi6Rz5J9iwi/FObAn4o2uJ07BJu4Nv1hmCv5HljnW9Z3mMAv/IXYZ DjFhh7k2NhsOcQ/+M8UxbPNj0FFqo8Enic8PnQST4E7oJ0VMY+AU41Ogu5iIqUBz0TYF15or Dj2pOdxKi5bhlOL/kuT/g1NNrtY/E+sojkpaKrGp/r/LuObiD9oFTrXWGBIwCV3VVutp2s7+ NhoXyuMl47qKdipnmPbDtWg9irGnzY13Js2Z4BbvxzK6EibDbPKG9ycvQn41Se5sTdqrj7n8 CHwD/bsk2Q1F7WxcWUO7p0htpH0a28Jrm9i0cvn9ihLsD4NS7d7yBrZ27u32+pxbbLpi1V/Q ttdHV9iKYfk29+ZMm6n12cMLbP2zIxV3utD2rJtj25aNszVzb7IVI8vtqZu72OvDi23zpGvt o8kFtmlSnq0dXyitVW4rp/WxZZN62GvPjLMLh9bZuTPb7OI3e2r8fDCJGD/mMImYCib684b1 1tJP+P4aDf+jj6lE/EXWnfzX4xr5NEutR243cSrHqvQNw6mO2fq3FG31efpelY55yudO4hOc Yhz1brKRfNMwB7uD7agdR8X37/uxRTqebx4bGGwFcyZsEXYBW+V8Ur3YmaS6IbbKbYpsAzYH DYUd4jjm2BLO5fj/jd+P/K1hk+rixOsEfUWcKWOhEE8RNFVtTtVLSFC/4bZiCjYcThEPEfVz gl/FYj6+P/x3sCjopp84FcUBwiRiJZjQURyLjuKal9NTXTV+KnHQTIXYYeWdc0ppiZ4KGou5 71c+oK3KpB2K0UxKe2wu9po8wgYHbUu6k66kMceQ5tQzQtweuueynNJ1uQfXDOdxXc4L5YB1 dAt2P/h5eZ6gpf+enoIbPDd+W/KNMkA54dkoK9zX34e0oQyprLKPiWXuyb15LyaWA6d4RtZD uWXO8eGdmadT9lWm8buVy+fdXnYrS3Wp0/L57ZWWOirdhHb6SnF//G/++K7d6s970v797Fn7 i/r7fnXgiOLR99iJXRo7SZrqe8VWfC1+oac+eXmVHdT/qXasft02rVplD40dazdU97S+xWXe PlXeWWNkSMvzD6roP1TSMrq3T2IFvIAd3l4kTuH3oz0H+4yeylR7M+1R2EPsHnV7Z48Yht3E VrIt2EmOgyu0mfg5spvcg+vTZo2PMazDJjgJm9jHxHpgFMex7pzSPQKnmMNJ7kHbFM9HPAfP 1Tmri9trngebDb9iio8nLh1/HnHnMJiJmEY45WP96XjapjiOmAq20+eK45q3YLyK2pxSn2Bx qrl4xX0TmzazBg0aildqA9D4RrRJEauPdkFXtVIsBToKLjHHB4i24liPl5R/M9n7oqltQc8H n9jurOMZ9Gweg+98kg1TuqOjYBFpQJ0AXsOpmOdJpDsDyxq3zTJYBaP4Xq7Lbl7DqXuL69kf +zZxTk2vTLDJJQl2//XJNrt/W/vg8dH26Igqm5WdYMu0bdWIYnvtrnJ7RKya2LeV3T0wxZ6Y 3NtWP36n7XrjAbuw5Uk7sHqWvTn5Wnt8SKatuj1fjOpnH08ptE+nl9jrY/LtTfUJXjtvsK2Y 1scWTvmNvbV8qp0+/rH9+NeDrqN+0k9BV6GtIm61UHsUrEJXEWPBsR73J1YxNmAmnCrobcUd C61anOqJnpLdSBOjOuZIH3SRDZWmKlDZyVH6ZaosxlQGc2R7uslGYsOCNoIb1JmxD9gK7APf PDYhcAqb4/ZC+51Tsh3YQjgHp7Bp+G3YxvW4FsdxH+yZt02pXh32B5vBdvIKW8ocPcQ9sXcs M13K7weniJ3A50ddHE4xYffoo0cbFWNSMMfPR/tUbVZ1aNdaNlx2z/UUdhE/n55bfj145JyS vuKY2pwihp34dddM0lX4/Go4Je5xHte8HKeqSlW3Vvo4p5TeEac0vpHSsizOKddal+AUsRTk HWlEGsMi8oa0Jt9Ib9ITW81+0pw8gjeku+eb5qGOQt6iSchDjg/XJv+5BnWYkI+czzHkUeAU +8hv7nmlnKIuRFkj70J7JtfjfOZwjGNYD/wK9+R9g3bkGBjExHPwTjwf65Rp14LaxjuRNmzn fGIXiuQHpfxR3luqTjPkuv7y5x2znRs3uoY6Ke4QO8F/poj/+07+wD+fPm0/nj/vsX5HxChi KL7+/IB99/nn9o1iL2ib2v76a+7z+2D5Mtv88iv22NSpduu119l16uubp/87MG4S//Sgny// FPH/3stWuaaK8yP0L+wonxMT7TjE/NE+hQ8w1OOdU7KNzinZx+DXQ8dgS9E52En8dKFvE6yA UYFT3Au9xDqcgkXoLbbDKdZDDPxPWitqh8Iuo+eY0E3cnzgObDVj03KvbMUZwCj8kDw3sRS8 B+yFP2gkNBX8Sde4Ds4pMYl3JoYENoV/JqKtAqfQVDV6Sm1SbRVLGXFKPkH1bWqsscybax5p JvVdkY8Rv18b1UnQU3AJTsEjWMRxLdV/FxYR18/+mtg/Mc7/iad9MaUTfcB4X97PGa1l8oB3 hOFM+D15b9IdPpEXnlZart+6izVOVl1Nvhz+5XFTXhO7vaSFzai8yqaWJ9iifuJU70Y2taKO TZCemtyrjS26vcg+fvY+mzIwy57oUcdWDWljr+hfVKtHdLbnbku3+dc1t3k3ptmyMRW2ZEIP e2PeENu3coqdfOsh27V4gr0ydaC9oHH/1kwbbO9KO224r7utGVdpb8n39/YD/e2t2X1thdqx Xpjcw46895D9v7NveruT6yhiz2mnisdUhBhA9BNx6skTllqkpyKdRXsVvr+sERqPoqiv5afk qn97lVWrPaWryn7HXPlP8/TtdVY9UWNPFCqNcpV+WaqfwalslTk4xffKd49941vFNwIP+J6x TdijwCnqq7U55faR88Qjzqe+yrFwBhvIxD5sBjaA4wO7mHM/tyc6F/uGreIc5nAm2MnLcSr0 Hee++ACDvmJ7GJeLtip0Fb4//H2Mn1QvIUH/B24l/fJLTum55deDO4FFHPNzTtGvT7YczaQ6 MbF+9JOCZ+gr/IVXyinam2AVcRFXxCnlCXoKTmHLscekf5g7Q7TOPphDvgQWkafBf+fpr2uF fVfKKew7tj5winWu+z84pTzl/lwXjnA/WMNzhbIRnpEyh/amXLCN61NmKHO8G8eH+hPPS7nl mpRX2BvKUWAQ6zwXacE/P+hzRXniGjwnz+vr4lSJ+Mux+dqeIg0+U/+a+kp+vb2bo38i8g/f P6tditiJv5w6bV8r1u+s9NZFbTstNp3c/4Wd1XRyt8an3aZ/Uuk/qed3aSxAaSni/d548gnF Ua20J2fMsKHXD7KBXbs7p4hLR8fRz5d2qohTtOOIVdIq8II4B5ZhFP18sd3Y6HTFRKEvnFOy +cRNwArq8rCBiTYq7CL1+cAG4h44B1uKbUUfBU7BoqCXardTobNgFcfRNhX4xTEeL9E+0gjY Xu6HhsiQpmul8fZYZiwl9FuO2tPCs0T7Nb6m9sNdxkZyTsU1FeNuBE7BI/yd8CyMq5SqZ4df zVsyJiCxh2Kd5km/4FSSeNO0if7Tofi+ZOkgNBQ8glUe8xdfh03oJPx+zin5B/Hvse1nnIpv I8aC2AoYBItIazQTzIo4FcVCsg//JpyC3eQPy6FdC05dnaL2YmKuZDtuzm9qd5S2VHxfXWfV Y/0Vh96rgU0pr2Pj1H9qXPfmtuyeHrZ1yRS7t2eKPaI4QDj12vBMe2Nkjj13e4Y99ttke/r3 BbZS/Fk2sac9dFu2PTmq0naqPevixift8CuzbeP8YbZu5hB7R5x6ZaTGXZpUbZvnqO+V+LR6 qrbN6mvP3ltmLz90o53dQtxENKYsWomYCfjDmH7E+oU5zIJX7dQ+1f6+Zd5GRdwfXMsj3q9y gGW0SLdeRT3l/1O8q6bMYrUPd26nNveYVRarnpwlf4fSMkvffrrKY7bsR6Xq1diwYCtgDPVX uICNwA7BFmwC3z3bsAvYAurMNfZDNgZ7gD3CDmFzuBbHMMFBbAnXwRZhK7gnx7Gf63E8bEKL ebyfWBVslq9LN3Ee+4N24tl4VtdPattgO331uA6so/8efAqx6egqYtXhU4j7a5l4tdgg34/Y ApuieAnZU2ko+kPhw2MfGos5LIJB7GedCYbRP7pYWpbtsI1tTDCM8dJDfAaxhWgszqNPVVfp Kfx3+PJCrARtUYXYYKUn7CLeD73FMjxjP/uYSAMmbC9pCguw38RKsJ1t2GN4wTL6A12EnQ6c CueSx+gp1j3tlW9s4zzyl31wgzyGG1yfMsB+ygbXrM0TZ4/8eJQx8jjE8XEO+c1+z+94O5a/ i96T5+W+lCe28ew8D/PAHvbBn6ANwzNyXs276ll5X8o09w+cDEylXLG9UnnQRe/DlCHfz1eH DysWfYPH+vEfjxNqc6LPFKy6oDE7zx9SjJ84RR/g8xqz88Lx01Gs3/Zd+q/Hp3ZWfsJzO3fY 8Y/0f7p33lY7wTO2YelSWzp3rvef6lVQbL1KKhTvJ1+m6jq0TzFmexSfLt2kdIEJ8CD43DKk L7wtR3YOPjFeepri+uARDIAPxPTBCtpL4EPnrGyv48OGdvKFcYz7+xSPl6aJZWLSYWFom0JP oZVgEM/AnH8Boa9gWPAHssx4AcRwcE/awpyRssUwCB2H34996AyPX4/bcp6DZ0LfwSP4Q/wE bVMw2JmkOev0l4rGNVRchq5F2xQxF8FHCKfaaByituo/1aq1xlkSG1vJn4hPkXg/NB2cbCHu wCoY5LF+mtN/inFvAqNYhj/oKOIkQjtVTOlA7ATHsQ3foGsy5no32MR7BhaF5VxxmbyAX+gu T3+9s9cPSDOdm9g+19pklFq++kxlp+hfiH3a28wB6TatJMFmyde3oE+ize/VxGZc09LGFte3 kSWNbd+yybZy0gC7X2NPzOmbYA8PamirfqfxJ+7ubCtvbGtLBibZhjtzbNfUnrZt5vX2wbhq e+LmbPX9LbRNz421i9uW2pfi1fqlE+2tmcPsqTuusZfHXmdvThti78/+jX1w/2BbM77c1k/p bh/MvsY+ntdP46HrP/KK7YM5HneuNinv16t1tjXUvxDDMd5eJZbhB2SCbfn33m8JVYMso2XE qUrZ3Ap9550KlT5xTpUXKRYqS/4QpVGm9FS6vmU4VSHm8L1jN7AN8IS6dky6BHuEvcJOBE6F +ivbnVOymdgl2IN9CDaMdWwF+36VU7qXc0rH/D1O8VzYMvx7wa7R3s42OPrPciqxUX09qzgr bqCX4Eq2+AJv8PsFhrGPY2AOvsEr5pSYhC67FKfYht8PXUTMORPtUEwwiVgJYvoCpwoDp5TW /zCnxAXnlO6FbXdOyfaTb6Q/eR9YRH5fMaeUB5z7a5ziOtRRajgRL2fUOSgnlDXXWJQHbaPM cH/KZdDnPDd8CmWU8gd7wtjHPHfQkhzH8VyD94TXHM8zst2P0zM7YzWvKldbkc4nfqKF2jJv HThQ48acsb2Kndih/yHuj7dJXZSvj3HSLyqG4isx6vjevXZUcRXE+31/8qxdpL+v9BScOrlt m329Y7ud3bbViPnbvHKFrXn6addT9J/qX1ap/3rI5y7fH2xyTqluka1lxkyKqa4ROAVDmLDn aCrsOHYdPdFBbT/YyKCPsI+0SWEH4ZfHjOtY7CecYj/74Al1ftqOPLaceit2IR4nUZtTcInx kuAVbGKOvoNnP3EqiqPgmt42JVY5p6QjuCf22Dml/eg69mG34eSVcIqYQNrj8AnSf8o5peW2 YsqVcKqFeASnWtbmlHQUnII5tFmhm+BRFI/+E6dgE7op8gdqzKQ4p6J+vlFfKd6ZOgLpTJ8A 3g825SjuhXfk/dkHp0Jeoac4pk6zjtZUrMrt0Eqxbm1tbLXaliqTbEKeYiZ61LfHr29tjw9o bRPKG9uILoql6NnOzr65wBbf28smXZtq9/dOsPkDGtjKYYqluCvTVkhbLR3U3Dm1c8o1tuHu Sts8sZctG1Gm/sHp9vS4PrbrpRl27JPFdmrHctv//Cx7ccxgWz1xkG2YqX/9zhhga+/rba/c UyRG9bZ1E8ttw7SqqB+v9JLrKvWHajP2eY89pz0KFjVQGxTtUD6pTSoat+JJb6/CH1g0/g92 1TVDLKNVhvUo7KGYP/XnFati+SoT4lSu9FQJMX/q25evvM7Q9xuTbcrR9+C2Lq6P+L75dvn2 4QHfN/aFbXznfN98+66ntI49YZ9zSvVS9nM89WTsD3yi/soc++K2SudRh3U9hV3SfbBj2Jlf 6insF9fGhrFMXZzjOR82ORt13j/LqUZ1FUuRQiwFcXTyX0krsZwtVhWrT9T/5FTEnNr/5uXY X9VTcU6hnS41HgV6yjmlPPlJTylmAk7JVhdLixDvF+IsmHPcP8IpbDTpi50mH6iLuPZR3vyM U7ou+U4+k/Ycz36fK60vpacoA1yfOkzQU65blOfkM/dln7MQTqhORJ57XUP5Sp5yD67jdRGd w30oh5Q7rsF+nikwiHfgOWEV27h2YC1lLdSn0FscwzbKIeWM41xv6Zm5T5WOianeU6G0ZtzZ Zxcs8Lapw2LN9rffsQOKM2c8PzhFP99vNUdHnVAb1PF9+5xTxPzRf4r2qVPbt3ts+ulPP3FW hXiKZfPm2bwxY+x3v/mtDbmmt1XlypcRk69Wz0TMHxP/+CDmL11pj5aCVYEZMdnCqI1G/j3Z u0hTRXEM2Ennj7ZjC/FBYQ9hFXoHOwmnqPuzH5bBFLeZugc+vdqcgkPcl/uj54g5DJxiX5jY Hu4bxXBEsYbu39J98Il5LIfu+xOnxEvtQ09xf/hTo6fEHfiLbqQtiv94oJ86sE1xJPj/iLfw 2HVdk/1XzCmNkRQ4RbwE/j/8frQ1obPgFHHmxEm4npJ+QjPhI2Q7+orzQqxfGOOXd4FFpC3c YTlKY/WhVHsc7+is1r6obsD+yEfL8SnpOZasfyOWdGhifQs72APXp9p93ZvZ1JIEW9ivhc3r n2KLbsi0UYWJdmNagj16a5FdePcxe2ZorsZSb27j+iTYlAH17fk7km3FyHR7ZUhre+mGFrb1 d9l2aFI3OzC1t+0ao35Viv9bIf/f/KEF9vjorvbas6NVXl+0/9j9nv1/5s4zSqsq6/Mo2Cgg UBRQRUEFqKJygqLIQbIJQREByYjknEEQEFAEERADQiOgIEqyiAKGVgFFxQCoiG3ufrtXr9Wz 1sys+TJfZs//t+9zyhLlxR7sd82Hu+7znHvuuenc/bv/ffY559iahZorZKjmDOkrXt1sL0lX 7ZrYwZe940vsFfWzwn+HTkJLwSjaoRInrC/37aGnaIeCV9f1X+T6Cqahpeg/1Wzig1a1c19r Ik61zWujcdM11oTsbKMc3bfMROdUQbb61GTK149vWu9pipgS/EjYLOzBzzgl20C6ay3lDTaG fHAKOxDsGO8/2gZbhp2CK/5drHRskLNG7x7bKIe8pGM7YI37nmSHsB3lfj++s5WPsrFzoY2d ctkn2DNs19Vy6g/XVFK/zjjnEe1NwScHsxiTFk5F8eeR1qqojUgPTLscp/ABsk/oP0y5LJTL 8YhLL+TecJ9ZdC9Yo6ngV7H8VsT/BU4RU5Ere0Y/X1iFfWfh2fAMuJ88H+y4M0RppHO//RmJ f2zjeXBv+b7AfrMdHjineL6699SJK3JKediXYzqntB/nALucV6oPPHf4FBaeH/5Z1uEYrKkr rPHVoc05f9LYn/I9r86Vukk95LzJwzbyUIfIwzYYBYf8vuhcOEc/vq7XrzVWDt9rjXUe2bJF zNN2cMeLdlqMInaCOPQvThIfobnl1SbFuH4XP/hQvr4z9tVHH9nXirW48P4ZtVWd8Vg/+vkS Q3H2+HH3+Z09ctje3b3L49I3iH+Lxo61gT1v9T5UjEVBvF/EKbFA58NcvoyV3ljXETjFGi5g uytyKrCK9o/I90eb009aCX8TeoltzgXZdLeLsqeBV6kqE/7AKZbApsAhOBXaptgWYizYjs6C bYFT2GZ+wyhsM/9hI7aZ4xPrx3bOgTRiCdCC8Jdr8f5TSnMmaf/ALtqoSEuWloRLcAp/INqK fa7EqXjxKI6xa+GUNBV8ijgVrzl7Ff/Hdm2DVxGnxHOVi86CRXCpsa4XTpGH9NBuhf7iWrhW vgUq6lWulXE/oj7XfBtEWhaOwW7ug9+LJnka513tIHWutbs6FtjTo9rYol7qB9Wyivx+lW1e p/r20M2pNrKolvVJqWQ7Z/exDzfOtMW3N7J53erZ2E6KrehRxR7vV9+eHpJiW3qrrapPfXtj WK59MLGVnZ9/i71+X3Pb2D/Htg0ttmVDmtm021JsxohS2/7EaOfUj0dftPPbV4pVw2zjfTfJ /9fLDs2Wrhrdyg6oj9WhaW2jOL7Rj/ua/lENJz1lSROfcmbBMPpK4Rekb29V6SnareAUbGNd MmWJVe85UHpKY/NlK45CbSSlqu9JivdrmI1vTG0biqUoEtuLtcCoZL3LoT0kvO/uF9E7gq8E jlTkFLaq/N2OcYpvYpiErUPjBE65fdI2bIZzKJYPvxB2JVXf0KSzb9BW2A/s4qWcooygp7Bp 2D3ODW4Fe3y1nKp6bSXNx3mjtz/BjygGPZrPg3Engs7KirU1Edfn2ijmI7wSp0K8X5GeS2AT x/mpPH1Xi7fwhwUeZWuBV8H35+myx7Ar+v0vcEplYrv9+YpX2HQ0BkwhDTsfni/PIXyHuM2P bePZ8ux+TU85A/Us+WYo55SeecV6QLmBmdQj4s8Zw5NnijaiDPLzm3PjfKhX5HU26T885Te+ QPr4cS5sD3zkGJwzvGI79Tikce6kh/rKucJBzpd5RJvruLWvq2Ljhw2zU2qPwt93Xpz6UT4+ xpuFVfSf+uLUKY3np9hz6arvFe/33fnz8v2d9OXCqdOae/4T+4sY9oVi1+nfC6NO793jzHpl wwZbN3++3XvzbdaztLW0lHwXMU7RRoWWoq8vc/m67w/bKDsIG2AVPj/3+2HrZRcTsXVaw6ng +/P+vth02U40FbbyJx1DP6rINoZ4M/Kjl2AUa1gUuMhveASLYFLYFtqvAts4hh9Px8QGV+RU iDHkXDI9hj7SHeyD/uLciFlkjD8YRLw9Pj60E5yi3xTp9AMm3eejglOy8YxP8Vv0FLHptcUj 4v3w/Xn8Ob5D+fri9Z94P7YFPYWWQkNFLML/R//eGKfErajdKoqvYF4v7iHXyYI/FWZxvbTR cX2uWWPp3B+WSF9FPsM02bMExSu3Tr7OZg/qaq8u7W+bx2lOw7sybUHnejane7ZN7Zhm/bJr W5/06vbJH2fawcUDbMVttW1Zzxo2pWNlm9n1envsrgSNl55qG/sm2nP9G9nh0fn2pymldnRc M3tjckt7caQYeFeKre6fac+MKLb1YtAzE9rbS0tH21dHNtj/PnfALpSttRdm97V1ozrbNo2h 9NwE9Ree1NnnDAntUvj50FIwiliJ+mPXuWZiXD/m/iA+nXgKxvaDT8QForNKpz5ktW4b4n6/ FpktrL3aVNBUDTL1LZOnODxxKlPzbhVnKR45J9ca6T1gCX1Ked95n8M7jJ2CI84p2Qy2+fse +/YmHdsAp7AL2BfyB05hjwJfYAo8weawTzmnxDXSgrbCBjmn5H9xdmm/wDIvX/mdTTommgr7 xvr30FP4/Yil8L5O4gdzdMAQ2qbKOSVNRBraKOKUvu3hlv7/Fk6VqP/vLzkVtXcxblJ4FuWc 0j1FU8EpYtPhFvETcIp+vrAMnfWb9JTyO6dggRb0RbmNVjlsC8+fNc+fbwqeD/+vpKd4PuSl XPbjOZZrbWkh6gmM4BlTF3iuxLsQk0n9qNgGha+PGA//NpGeDt9Gfv5ct3iDxqfOUp+4HtjG cTlXFtjD9nANnAv1hPycJ2Vy/Wg29qcfIZyqVqmSPadYB8ZJIobiw2PHXUfBKPx+cOqi2qW+ /fRT+0Exf98opuKimHXmTdqpxDDF+9F/Ck59deKE9+9lHIo3X3jeeXV02zbbuHSp+/0Yh7ac U3pXA6OI92uq9wdNBRfgFG1CrNFT9PWtqKlgFXopYgP9ndRGLztYkR3lOkYMCN/wtJXwG7uK XoJRIT4icAqdxeKaKabp+A+nWOPzY59kYjJkl0NfV86F86BsNAZ2mvNh7DvODS3Hf2y1n5u2 w6mgkbg+OAWD0VLoJrQUrIJT+AFJg2O/pX2qjnhUuxac0vyHiv2DT7Q5EZOOvoJTrqdi7VMw Co0Fr9BTaKwmPAs9hzCOUrQtwdO5vhDPF/jLOoxNBZdCeyB5A6fKx7HSO5EuO9o5U2NO3N3e tk5UP9vhLexl9XPaMb6TPXZvB7Eqy3qnV7P7WqXY93uX2x8ZD11cWtxF8eqdpLu63aC+u/Vt /cAU2yROPS9evTqmwF6fVCJONVc8RWtxqtDW925oq+5Ot02jWtjmqSp/7q22YEBbe2XVJPvH 29vMvjxq3x1YY3sXD7Fdc3rbtsk91N+qq708tbvH9AU/HuMiJYxjzIm1Fi+NxXi0xKyHvlM1 pKkCp+DXdf0XW+m0pRbXa5il1dH7xngU+t5vo/4YcCpVsRRwKj01SZzSXB55+dZQ70Aj3m+9 20313uLn4f3mHWbhP/YDe8Fv7BTbsT/YGjiFDcD+hDSYEb513a7pGNgA0p1Teg7OKZUFb2AR x4JT2C3nlOxJ0FPsFzgF9/hPXmwOv51TOkfs3++hp2pVq+qcYpwk+vcSMxH56uiHI1vG967i /lhX5BT/r8SpwLaiPGL1orLQUxwDfeV+P91PxkBngU9RTJ9iBWQ/6esLl0JaaKvCJ/ibOaVy A6uw9bABe8595zmxhg0858Cp8P9KnMLuu465hFMcj/rB8+J4HJdnFWIxeb4wzs9Ba2eQvovI S5mBdaRzLpyn8wV/oMrmP/WQ7SzUL7QYeSrWQeoPx2AhnXxcO7/9vFU302WTsmV/T6h/1Dnx 6I29+zT2ucaTfe11n1/+z+q7S7zf1x+ecT2FpoJRX4pJjEH7pfgEo9BU+P0uvvOOx0+c3PWS HXtuszEO7ZEtW2zTsmU2sk9fn3c++P0Y24++vs4oXVM0n2+kX+BT6K8Eo9LUJxZe0YYTNBW2 r+ISWAU70Dn4nrCN6BcYweL9qcQq0uCQx2nE9BMaCkbCINLhGKwkjf+cE9uIoXCW6hjYZY5B /yDnlH5zbGxxsNMwiTQYyRqGudbT+RPH55xSmxCxfpHG0jz04hQ8glvwCz8f7CLN+0+pLelK fj9i/eBULedULecSvj/nFNzSb3iFnkI78T+0V8EpGMW4tHCKtqtUXT/p9KdKh+W6ZjQb95Rr Je4RHtM2habiObjG0jWXc4rz1zcG961xgzoa1y7ZOqZWtn4tk2xK25o2sXV1Wz+41NYPaiHd c6etHn6r9StItCUDutn5LbNsWZ9M2zKoga2+paotbH+9Lb6phj3WS5zql2Jr+zWwZ4c2sR0T CmznpCI7OKeN7ZlWYluHSUfdk6z+vU0Uw55pr9zf0k49cLs9cn8rWzeli+1bNcL+2/tb7P9c PGDfKMbi7Y1zbNPMO+25GdGCL49YdG9v0th98AmfHjorLHCrrtLDHL9wrZxT05dand7DLbWO 4iIymlsnxVLj+4NTjYuwA/Ilaz5EOFWaX2hJeufRUwV6VzNk97FLwRZgD+AQtgXfCb95n3nH sRu8884p7eucUhrbYRHb3EbIZmBHWEinLOwB37TkhVMwxzkV8wGyL+WHOD72cU7JXmE7/Ttc bAt2j5gKtnPeV8sp2qeI+SN+jzYk+vcGTsEh2qBYE5/unFI/qdDW9K9wivFrnVNiYUVOMR4F sRLBD+txf7pP+ALhEOP/wajAKcahRV/9y5zSPYYLPAPXIHBK9zZwiudxKafIy0Ie7jU6hWdM PQn14Vc5JT4FTvHsQptXmGOO58u58J1BPeK4gTled3SupFEvvG6oPM4jfCNRf9iP/5wL+6CP GJuS82MbCxqPa+XaqINso75zXOoS6ZmyPwnquzCwV6+ozUn9eU8eOmSfqs/UZ2+/Y/8hH9/f pJ/+cu6c+vqeUX8pjZF06l1n1LdK++rMp+rz+6V8hOe9ry9xFBfk9yPWjxiK0/v2OKde277d tq1caRMGDra22XnWNl/xM+oDBacyxSnmmo/0FP6iX+OUGKDYdNpz8IERRwGrsI2wKWJV1DZE GjawIqewi2gY2ES7EXEMaKrg14NPYQmcwrcHp2AlafxHb8GrMGcix3BO6Ryw2RU5FdpkWKfr WlkT58caXvlYuNJKP3FK36DlnFIMuvrXwqMQQ4KfD18g195I14eu+lc4RRsV+imKoZCeEqcY K4l2KueUOMl20tFV8AgWMf4snKJtqiKnMsRrfK6wMMTZc0+5/8T6wW3uD+1zrCNORW13sIt8 6Q3l8yvOtl6FdWzYTRk2tX0tzd97nS2+ubFNKKlhT465y15eMMbGdMq1rXPus+PLB4tlcfb8 0GR7tl+8LYBTnarbytvr2bq+jWzN3YnOqe3j88UqjT07NtfKZra0HaPybHWveHu6T7LtGtXM yuT32z1C8ylO7Worx7azlWM62Imts+1/nNlh//Ojnfb90ads19Lhtm323c6qGkPlw9NSc/hK qz0C/97jFjdSYyUNX+XpdUdr7NkxT4hT68StVYpRVzvVQOarIpb9McsZ+6DV7zfBajXKtXrp zax1fr61UhxpWmPpgmx9z+aqHbWp+jLK71eaXyDNpe9O3dtM+awyNG4C36C0OWNv3IbFvmex G7zT2JNgL9xeyV7AHNLQXeznTJJdCO3fMAQbgI1iYb9gt9gHO8WSKk5hPyiLfHxro7VIh2f+ vS17xTa3TVpTNmxif+wQto/9WPAlMQ5tsIe01dO3l/GT6EMVxk8KfXyrVb1Oc3xWssT4Wh43 Dn/oQ0UbVZFYT9w4fGJNn13SfB5J6aCgjcK1cR+5X1yL22Cdm9832RzsKTaSe0Ia95n7xuJ2 k7zKxza+CfiNnebb3/1gysdx/L5rG+WjO7D/HsuMzVUa7RuMr5CpMvJ1vBztT/wYfUmzdQyP KRNvinSeRXyP6NugKd/MGo+HMTYz9L1eVKA5FlWHSOc9zJJtYuF3jr692U7+VMXqkh6+cYI/ EW74M9f5BIYE7Ya/j2fDtZCf7Txr/H3cP/5T79gGZ7gP1AfuHXWUcsjj+4s1fmzuDfdDPKIf FOWwL/uFZ8M+5OU5sJ106h1pjeVrLtD9Wv7AA3bhozP2wZ/UB0rtUGirt8Wrs9JGX0pP/ffv vldc+mf2o/pPEQP4lcZKh2H/vHDRvtF2+v6eVjrjVXz85pv23bunNe/cO/bpKwfsyFMb7Ogz G+3JmXPsoclTrVux5t8mzgOG6ps7V/PCZav9Jk2xDymyZxmy6bQ7Yd9gAHbddYVsOLoCuw6j UvS8sH8ssIqxJrD97IOvKTAM3eLliVXY0xBHgd7BnvoYFdrf+abyib+gHOapwu56vIPSI95E 6WiFNLWx+bEUv4YNRkOwD+Vgh9kGt9iWLP+gX4fYEtloHUPXCJfC/B1oqcjHp2Pp/EOsH3Nt 4eODS6SRn7Sa0kk3agzauHryYyrGv776+tZUn6k6demLlWQ1NIci+etJ+9SWZqopTcV8JCz8 rwOTtPCf8d9ZmFcrXmNTMMcWfcvQjvg63fcqRtPPOfg+ScOPyNgWKcQH6jisM3mntDA2E3yn zCT8pUpLUL1soHJSZAPi1X7RouH11iW3vo1rF2cTO9YVcyrbgx2usfltq9jc1tfayNIEe25a X5vcq60dfGKRbZ57r02+JdeW3Kn+vAMUv9eptk0uVBxgz3jbMqLAnro3xTYMaWy7pxcrxryZ 7Z5RqKVIcydmaT6qBOfYH0c0tZ0TmtvLk1rYbsXy7Z/ezl4Yr769YlfZQ8Psx4Nr7Z/vldlf //SybV0yw5aN7i8dtVb66TFpKsZIF7OGaewkLfyuNph+wGgrzeehPHAKpkVcI05wteVPWGIN Bky2Wsl5VrdJsbVWnzyWxumy81mqP4FTqkPoqXJOaWxaOAVb0E68y9hG7B/vMe89bdH8dtsp G4jd4N3GfpIXe3RZTskOsN1tlspgX9dDl3JKtpuy+D4PsecwCfvlx44d53Kcok0ebgVdBatI wx4yHgXj+9WNUxuqvpkZ44+FOROrVKpk11fRuLRa14+r6VqJmHQ4hZ6ibQpu/ds5JdsZuM99 5l4ElmGzeTbY4cA+1txznhN2N0v1HTbBIto2nFMqo0DPlbFVK3IKVpG/nFPa76o5pfKw+eWc 0nmUc4pzUr3iejhn2ME26hAL9YG6BKe4dp55YDX1gTLDtxP1lPvk90h5Q5ncL+4T9RWd5IzX dn6H/PzmfrGwnW8lWMa+Kaov6bIXZxVrflp8OaYYCsaf/Uz/iTunT++XGpuCvlOMnfQXxVbQ XvWD5p76u9L++slZ+1qMwifI2H9fqg2L+elh1PnXXrfzBw7bG3/cYofFqqdmzbUHxo7TnL6t rbWYil5uKludK1Zky+6myZanyOZniBFwJTDoZ5ySLYdZDRS3ncx3vljgnBIb0Cxu+2Ocwv/E dspigQ9hDJ/IBxi1EcEkWEJ+GMNv8sMc8pVzSvtzDPoPoxV8n9jx4RH52fZzTv28f1dgJFx1 pmqNL4/YiODfQys5p6Sn4HITcZaYdDhFXnRVho7F2BQ31lY/3ks5VU+cUv4amtvj9+BUeRvh r3AqQX7CZOksmJQkzsGppmIbC32D4RT8S9Y7kq7vOjiVpLqdqjpZX/WwdWoN616QZOPVj5cF Ri3qeK0t7FBVWukPNrRZvE3rlmnT7uxg+9cutN0Pj7U142+z56Z0tHm3NhDPqtu81tVstdqe nh6QYat617WNw9Jt36wSxUDk2a7pBVoKbdtYzY0oTq3tl2iBU7smlyr2vNQOzGivNqjOtnVs a9swroe9+uho+2L/Jvtfnx6zj8uet52PzrekCU9b/Kg1VmOIxqG4d7nrJBhVPfYffsEtGIXW gmss/IZfhVMetoaDZ1jt1EKLSyuyltJSbQsKdU/EdXGqcU66NcqQ3XVOVdBT4lS64gADj7A1 2AC+XXmXA7/cbuh9ZhvpvPPu34/ZmXJOyf64LZC9wB5R3m/hVOBjRU6xP1xym6NjU85lOaVv dPjG4mMmaWw/vtthFeP+MW5S3dq1fNx05vVwTlWOOMU4f8RRJNSp5b44/HhwKisWRxHFpf97 9ZSPDSE76/ZX14r9xn6y5tngy4LX3GfXYbL73DN/PrLvxDKji+CRzw2h+w6LmNcoT/vDL7QW jIo4lS5Oqe+RGAfTrpZT1A+eHedL3eE8YUA456CdyeOsjfGDa+E/30JcS9BA3Af25T91DYbB IdI5RmAP94A6xn/XSbL56FXYR/30eqxz4zhoKHQrv2FU8ClTXgP5gu7s2dP++cMPtl/jmh/X WEe0PX2vWD7GnIBRjIv++clT9rl01l80Bu234tX34tTXHyhGXfrp6/feN8ZQD3P8fijf39lj r9mZQxoP8PBRO71zlx16coM9M2e+TRk8xPq07+j9u0vkR4VPeVm54m6m6jj9dPRtJ5sPJ9ze K819dlpHPrGofcp9X8SbxThB3sAjfsOuSOuoPPlPvC1IeeGUt/vLjsO/oHfYh/ysQ37atsgT OEWZlMM8S+SDNewD38hDGxQc4z96jm2kR3qK64jGy6Ac0tiGhsKXR/xe8O/BKK4PJnHNpCdI sxAPSCwFvGIeRcaqqKmxkurUUxyj6ynmTZSeinGKuX2vllPEjOD3DJoKPYWOCjElDaS7YBTj r0fj28rHqX3CXItwiv0Z/7up/BEJ8EzvQhPV6STV325Nq9ldJYk2TbpoYtsatrCd+k3ddK2P Pbuk8w02qjTeBuZcb4/e39sOrZtvW+b1t7JHx9qbjw+xdSOKbV7XBJvVqY49cofapvpn2WOa V+qZwZm2d4r00oRC2zel2Jcdo7PtmYEN7Yl+DWzz8AzpKWktxQPumVRqZdPa2L6Zmptqaidb P7Kd5v/oYsfWzrS/v/m82qwO2Wdlm6zB+Kc0XtLjziX0E3oK7QSb8O3hA+R/3H2r5f9b5/kT xj3pnIJlxdNWWOqIuRav8dJhVYvsbGtXJNsmRrmeylH/aLXTEZdemgen5LtB02er7qrtBRvA O8z7jS3AZrDm3caP4vZB7zfrwCl4hH3AVmBrsCvYI+wqNgKmOKdka/zbWtvZ97J6SmVjl9BE 2JDU4PfTftjsK3GKuIrLcSquZg35n2tajRuqun5izsSqVaK556tUqmS1q1c1xqKFUc6pFGL5 8ccpJkx9c//desrtsO4ZNhS7iW3mN1qC+8y8ldw77jXPgPuKPS7/joBTenbwCH8fcxjhC2Rs VcaMo93DOaVyQx8dtsGpJirrajkVmPILTqlecM48G3y4QR9R3/xadY3UFeqM1w29u0EbUaec fcpDHeSeUBbHYH9nYOx+wCPqL3GAbKcM6ib85HuHffGP0rYW6ilrzoF17T9cZ/vUdnRGY/KV 7dhhJ48etc/FJsah/bP69J5TXMRH8gWe1Xb6UP398y/sP9Re9Y300znaod4+4XqKMdSZ3xc9 9aH6X310+FX74IDmoD901M7tP2Svyu+3eeFiu6/3nda7XXvXUnAqT2PrsGRi+2WbG8leN8aG i1MwhD6h6CC3+zGbjW1vKAZgy3/GBO0DJ+AHLMDXxr6BIWgg4qfDHLterrYH1rDG54cfEObA o7C/c0z8cRZpO+UHtlEujIRhnDPlsD3wK3Cq/DpUDmnkxc9HDAXXwpi0aCni/9CMxE3AKH6j p8gXtU/JryvG4f+rpXGT4jXubNIlnIJpNRkz/Sr9fvAINoV4Fta00ZGOzmokf2SqzpcFXZUq /x6xF43V3teQ/1rDuAzspThVT2U1EOfSVY8b6v3rkVXD7mnVyGZ0jlf/3mq2oE0lW9alsi3v fqPBqfta1LHRrerZjocm2ItLJ9rMXmpzenCwvf7YIF+eGdHCFvRooPasRHtycJ58flny/aWr 71Ou7ZvaQgxqbq9MbaY553Pt2UHJzqmN8gtuH1touyZr+9TWzioYdWCu+kxNv902T+hum2cO sP0rJtqFg8/ZP06VOaNCWxTr+PvXOI/QWLRXsUS+v1VWVzoqUVyDU7DrhkHLLX/qo5Y2aoHV y2xpN6Yo9kHfQO2KmiluVP6WLMXuZBOHrrZs9fOFUyVN1QdU7bFZcCozavPgPcYuYAcDp3iv sZGk8e7z3vNe8947p+SvcUbFOAVf8OFgI9wuyXbCnitxCnZhp+BcaJ9if+wb3+ZX5BR+P/SU GOdjpV/i93NOaR4qdBRj+vmY6YFT0lNJ9epofkSNEyUfXzR2rGxbU7UpKS6d//+/cwr2wCba 4H08A/0mDRaFMbhhFWnwC83FNuY7j/a7uvYp6gDP2DmlbxzXU/oPV3i2ITaGukP9IJ/XI3EY LUn9Yn/2CwyDwzx32MP3EnnCPuxP2dQZtqOlYHrgk38/qSzqs5cpFpKPY1Ou806M4je+4WzZ jG+lnd4+fNjee/01e0ftUszncUF9ev964YKPR8uYtIyVxPyIf1Hev2lOj2+lub5QPMWFk6fs 2w8+9DHUGUedeerx+32keMEzYtUnap/67NCr9pp8fy8se0Rx6bdpHNpWUd8CMbYwV2NYKa4C TuH3Q0+lxfSJ6w3SZMOx3/jwiIVjDAdYhW2HK7CMPOSHFeVcUBrMCJyCP7AijJ8O+3w8H/Lp mJTPvsRUo6VgJWnsD5PYhm+P/2gjyg7ls0/QgM4obWMf0srPR8cmP/+D3xC/HlrJ/Xtq92Qu RPRSYBPj1NI2BafQUmgs70+lcvhdO17jSWhsvyS17dVXext6Kl56KlG/GZP2ajmFHqKdClbB G9gEe4LOws8Hm5hH0XWV6lOatsMy8rJmv6aKR8HvV1f6i7YquNVQ9b5vzjU2ukM9e7BnbZve ropzakW3yvZwjxr2YMcqNji/ii26I0vxdwvUR7eTjW6foHFli8SSNvbWGsWPPzTAVo5sbYv6 ZNjyfjmKTc9VP6pc2zmyyPZPamuvaoy+I5Nb215xadugJvZUvyR7VnHrW+/P0dizzezQzHb2 ypSWtmtSGzugsWf3P9Dbyub1sm3TbrdN43vYm+um2j9e3xS1NaGhxCMYVV8xE/XHKjZdcRPB H4jOCnETxFOEmIpqiqnImrjMmox+0JLy2lnNVMWOqS62LSiynFy1xYtVaVnivjjFuEk/45T8 gU21jffXOQUvsGExPeWc0rcsacFOBG7wDcx+2I6gp/h2xUZgM2AMNuq3cAp9wDGwVb/QU7KB V+KUz5FIHIXaw4mhwNdHGgvzeuD3Y75EYijQUcROhDFor7+ucnl/KeLxGLePflToKuLSWf+7 OXW1fr8QKwF/4FA6NlzrAvf70V4QxZKRBsf4X6hvkGL528j7e+kpvl+oO9QRfGtwgjXfHv4N pGOTJ3z3UIfw+cGd8C2DxuF7BZagkVzPaz/2IR/7U1c4BvWM/clHHWQ/2FWuzbQPsRecE/WS PNS1UGepa3zDzBo/Xnx63U5rOSu/3rvHj9upY8c8/vyi4vu+FZu+l1a6qFiJr8Sjz8Qh5p6n reo76advpau+0+8v1J51UdvPykcIqxg3neX0S7vt43377fXNW+2lRx9TXPqdmtejhTXV/aHf XFEefs2IU43FnBRxCU6hNeAEtp4FpmC74RO2O1UxFK5B9D/oIvpSoYFcpyg/6TCB/1G7klio /7QRER8Ba+pKb5CPY6C/2E4bE7qJ36QHTlF+FG+tvrmKvw48go2BX+Fc4FHQZpTD+ZMfrRf6 fPl1yXfJmLJcD21OXBNcQlPBqwz5geARsSPOKcUqoLHC/9qKmajrnGLu+kZqr4pxSvlrKQ7v ajkFk0JMBbxhgV1wCn7h7wtLKtt0PYFT5GV/1jCKef/i+Y4WyzLErUTprXvEoQldkjT2ntqh 2la2+a0q2Yrule2RnjeqfepaG5hdydYOa23vbHrQ7u+YZgv7FoprCbakt+L9xra0vQ8PtpeX 9LeNEzrZ4js1z8cdqfbssGLbO66l7R7Two46p1rZvrGKpRiSbk/f09A2DEi2LaOynVOHZ7V3 Vu2e0k5xFW3spendnVMvze1rL8y4w7bOuMtZRfsT8RBoJWeT1nXU9uSL/IGutcQxb6eS3sL/ R37iA6uLXymjF2tZYg01t0eNtOaWl6p5ehnjUvETufL5NZZmatREekp1oCV+P/QU8SjanpEd 8/vpmxSuYA+CX59v0NA2wruPbQhMwV/zM07JBuDrw45gT9A3v5VT2A/2oWz8fbAttCEEm4Yd u1z7lMdNxNqjiJsgxi/E/THmAXEU+P1qVr/B555nXl+f10NaCnbBJfox0RYFl/iPjqKf1H+F nkIPYEfD9wBc5jc2G31xpTiKSDMRlxfpJW+nUhnEUcAw+OVaS/eYtix+O6ekZch7tZxyLqju cA1oH+oJ3yxwg+fJwjPmumAEz5p8LM4e8cbrnrY7p8Q2ymrZvJnrIJhFvaK+eRnUF10rnINB /OZ+cQyvo9JJnBP1mDLQ/hwXVobzoK5RR9HfB+Tre6OszDXUJ+9E8RPnTmr8CTHr7An59MQk 5pq6IJ8fmur0sePeZnVRegtfH+1V3yvPxxpTnbk+GJ/2K7ilOIrP//SWndi+09554UU7unGz 7XpsjU0dNtx6Sk/RJ4T+BUWKbcLvlyW+pMv+wiji/rDt8AHG8Js2G+w2/j7iCvCR8RtdEthA XvjCfjCHdq3AGMqAJ+gb8qOjGJ+CmGriCtke9BTMQR/BlXAeMIV9Pd5aeV2HScfBI7iWpZhF jk/cu8cpKj9MCvoucIrzDT5N91lqf5gEe5uKScHf5zGNKitHNou5EtGT8Iv4CI+r0L3gd1xd +QLFp6Rk9betwKkGunbmqrpaTqGH4BSxEOijSzmFvw9N1QidhZYSw2BTMnzSviniWZLSmxD/ p23E/rE9Wz5A4t7Hlypu4rYExT/E2Sz5/OZojPQVPSrbiltr2kLF/o1qdq363N5suzUPx8TO SbZyUJHN6pFk83vU0dhJiYrFU6ze8kG2T/Hqa0Z30PhJ+Ro/qYXGn21ju0e1tSPj29vhsW1t 3/3NbPtgtVGpD9WzA1Jsy/1ZtntaiR2aofk8tJRNb6+lne2dfpPtn93d9s+73Q4uuMN2TFG7 1axb3H8Ho+qP1fxS0krERhBH4XHq4lGC0mmXQmsROxExapXngVNJIxc4p1KadbMb00osN0Xj J+UWRpwSi9KcUxqPIsYp9/tV5JSYg63k3a3IKWwA36O82ywZev+xJ9gA7Kd/o+r9D9v/XznF MZ15Oga+Q84j6DD//pb9+s84VR6HTnyfGIWGCrqKeHTapeAUc3rAKGIp4BQLacSbZyluAiYR a85/4tCZT+q/hFPSA2gD7mtgFb+xydyXK8Wl5+s50S6FXy9b9hyNFMWlZ3vcBL/LOaXf+ACJ sWDOJY8RpC5cRVw6z49nxrkGTlEXeJawgHW4NpgDXxijHB3E9wjXDEPYH6aQl2tuWdLM06l3 1De+jeANLOI3HKJ+UD7b0f8wizz851zIx72lfOoU2zlO4Bn3+NDOnR7bd2zPHmcTjHlf7Utv HTjg80sxlt9f5ef7s9a0WZ154w37+qOPXVuhs/6mmD9iKj6QdvLxaU8oFlDx6hdPnLIL0lZv bdtux8SoQ08/a7tXr7UFEyZqTt92Pq4IfeGcU7E4igy4JNueKpuMFoExgVVwCn8deqMJz0vM aahvd9gAd2DSLzlFDMRPcYPwIfL9qSz50IipYOy7ipziuM4pyhcn4Ar6x7WR9meuCn6zP8eF U+QP/IrGudN3JbytyKmYb5JzhHesGcMC/hBjD3sCp2iDimLv9S4WFnt8H/5OOI32QnfR/sR/ YtLh0y84pTJ/L04Rtw6rAqfQUiywy9ul5LeM+laJ6xU4BavS9H41FK+ISec/ZbFvjuII6Cs8 pV1V9dttZKv7xNtMaamZzSNOrewVZ4u6/MHGt7rBXlsx0JbfW2Lz5f+b3jXRlt6dY7O71LQH eta1YZ0TbN2MW+z4ujFW9sgQjXXeRXF9xerLW2xl42+yQ2PkzxvdyvaM0ly94tSG/im2cWCq bRuTo9iJlrZfY6GXKZ5i/wzNAbKwpx17sJcdmNPdXp6mcSimd7MDmqt+j+b6aDDhKWs48RmN 6/eM/4ZJ3n9KvEJL0RYVseqJWJxfpKWID6w2+GGrPWS+xQ9faOlt7rBrEzUeSxPZp+R0a92y mWyA6oqWpooHKFTdaKVvk1bSSYXYsnzV2ZxovlT8frzHsIff2BPeZ/wuvPewiHebGDrsBgyD HfxmoT3JOaf33r+jZaewDa6L9G3N/tgEymC/sAQbQzr7sbie0homcmz2c5snPw1rvtWD/WMb /r2K8X1oKdodWBPnV6fmjc4qeIW2wtdXpVIl11bor4rxfalJGjdb/aRJa1va3LkFw/LUN5ex KohVb9Vc/V60Jp1xk9xO6x5wv7CVbndj58595NqwqW5HxRL+sw8L18g9d12gbdzDitoAm87z wNaG5xC+C7DRbotl2yP/nTSYyoJDaCj6TxFHgb+POAp8fmgufhMHSMwf27Klr5um026ldgTZ vYJctUuWlCgffIsYRvwS/ady9W4VqM9DjvrisY3+VpwjmolrdR+cjo/vFT9suPZQf9DoxI1w zdQbrp+64PxQGs+T+0g55PFydb+4Vu4L9wcGtWrR3H1+1BXqGfeH/cjDfeW+cN9Io06RhzTO EY2Nn4B4mnmzZ7o2isb0e8WI04NB8MfnmJIvj/h02EXs34+ff24X5ef7QfrqC9qspKl8jAqt 2U7ec9Jhn5zQOEtvvmWfagymky++bG9sed5eePhR27lytS2bOdO6tSj1d4Z6QaxfseajykGP YNu1JMumww7sORyAVdhztAZtU/jIGin+IF3Pju3oINbwA/vPgpaJ0qN+T/xG26C3yIvfjgUf IPF/MBCusD3iUqSH8POhkfAnFqo9IdJnUT734+l8I5bqHMVQeMmxQywGZXI8mMfi22KcgnNo KebuJa6P60Mj0haFrw8mwy40ERyLtFGip8UpHpx94uT3ayAt1ShV8yrK/xcXr7mn6MfMdema aonDxF/QJ4r+U6zRNHEaIz2sYRDxEfjx2E6fKo8llw5CT9VSTCj8CWvGmYJZLE30ziSLUyG+ IkV1LEnfX4laiJNIUt1jHqUmqpdJyk+sBe9TpvoUpGq/+YpDX39PkuLKa9uSrlU0P2Il6SiN 2393os1U7N8iaaZ31gy2mV3ibM2QfHt8ULY9MTTfZilufU6nG2zBvQU2tmeSPT/3Druw9yF7 4+HhmmequW0d2sb2T77Vnh9UYocndbftQ4vsBS2bBqXb2j6JGpOpwDnlfj/pqYMzO9iROTfZ wdnSUzM7arnJDs/rboc0vy9L4nhxCBZpIfaPOHXS0FZoJ9qofJGeYo0/MIqtkC9wqMZNF6Pq j1xkWR37WpUktU9l5Fpuaqbe5WLZAunQwCnVb+dUrsam0b3MzItxSraDdzq879hT7Av2AD2F 7eAbFztJW0OwPTAIu4G9CZzC3mB3+J6mvOC/Y1+2sa8zSvbFeaQyOA7pzigYpm1uWy7lVFKi l0eZHI882K/LcQpNhY6iDYK5EcMS2qawU3A3PUXjNsnvx7xSjJlUWiydIU3VrmWJ+wGz1M8X RsGqSznl7Ve6P9yDX+WUrivcr8txChtbzimVg50Ndh09EGx2eAZhm/vP9Oxg0dVwKqucU9Im MU61aP4Tp0IfX7iUm824eOg/fGkwL+qnwLcD54Ue4vnyTHiOPNvADrgDp7DN1CnqhDNZ61A/ 2D/EPLCNe8f9YQ1jKI82Keorv6lTlMW9YM1COkyiLO4l2/hNOZRJ+eSjfu54fqtizt/2uaZe 27PX3n31VffdMRcibU3E+jH+BDxi+UExFN9ofL/vzp2Tdjotv6DaqsS1HxSTThpjqH+qfc4o PvCzt962L0/Kd3jwiL338h7buWq1bV36sD00fYb1at8h4rGuJTuD8euL9F998/H3ye6jp7D5 2Phg1yNOqe6jQ7QwJkUTMQXd8hOrIg0Dp3zf2Db3w6lM2IE/D38bfPJ2Kq1DnyqOBcsiFuk8 OIaYgo8PBsIs2AK3KD/oLdhWPja4zpvyOQfKQY9xfuwX/Ij0ESaN46OJ4G4UF6K4Ru2LloJV pIX4c/QjOot02qziNB4t8RQ/cUrz3AdOyZ8ZxbA30Fy/l+cUTIJX/xmniEGHT/CKvsHwKvT9 xQcIp/D7BU4la/uvcQo9Vc4pMQpOpWm/RV2r2hPi1KpeNe2hblVsnti0uGtlW3VXfefU5vEt 7fgjfTWGX7ytuKep5jTMsNUDs2xWx6r2QNcbbdHQYpvbP8cW3pVtm6Wrzmos9fc0t/ye8d1t y+BWtl9jAR6Y0FVxFWLXvXn2dH+1Xw1srLapItul2PUjszu43+/AjHZ2aFZHxVJ0sjJpqzJx KjCKtfv75PeDQQnj1lvy5GctZcpGaaunvc3K+/hKW8EsdBa+v9B2VUf71Bu9XLEXD1tet0FW uVGJ/HtoKsWUNy+UrdB9lA3Okh+rEE7l5nv/KjjVNF8+hZxYf1F9v/JtG77RsTm87+Hbl/ea dzxV383YS957Z5H2wUaTzhqbgH3Cbv0apyiX7WGBORwHOxT4xX78rqinnE2KzQgsCxyEDdhE vt1Dfyn3AyqNb3riJ+jfW6t6NW+fQlOFsShq1ajm3INT+PtgEDqqhfx9WdJK7VuVxMajkH2U TxAm/YxTsXGUuDdcu3NK9pP75LpI9ynYV+7XzzilfXw/cZ57/gtOyXZXtMvcI8rFnocy2Z9y r55T4oCYA4+Ipc3Xd0yL5s2dQbAoW+29MIo8eRrTjbEq0FXoLzjFOfFceLb8RuvyHcF1cc08 SxgFbzlfvw7l5fzJw8K18h//MwyiHO6pM0dcob5wT/luwh8Inzhe4FEok2fAcWAR5YZyKBt9 Tb1s26rUNXXHdm3s1Ntv2ZnXFOugcSQYK+n9o8fUR+pd7wtF/ATtTSywipgK+lX9KB/gV59o Dipx64z2J76CvlM/fP6Zb/9QjCK2/RNpKTh1/sgxe3/PPnHqcVs/d77NHTfO+nTubC2lCT2W RXa8WUGx7k1+xCmxiv5T6B9YhbbxtiLZQ+w3cXEsxMVhu107kaa8Qd+4r05lsM19a7BD5eED RKPBH9gFb/DT4cODReRxn5yOWZF/bKdsyiP+wtum9J99ycf5Mc6sj2cXO1bEKWL9onPgemCb s0tpcIv2MWL9iIvwa9K+sIlrwxcYxYuku44iDh1Gob8Yi4K+U+gv+vji82uo9g7nVF31D5NO JN4PrsGpBLVroZ0q6imYU5FTxPOhoS7VU2gmOMUapuGzg1Vwy/tRiWOp2gazSGso+0XceX3V +wboKS3J+l5KU32FU6liU1MxKlfXnKnrXXHzDba+b11bdov6TnWuonl7r7HZna6zB26uZZPa XiOfXx974f8Sd55hXlRbvuYoOiq2IiCpM92E7qa7aXLSBpQMMigoKtIgLUhOChJEySAoSJKc QRAkSM5KA4JIjmI6zjlzbnqe+XDvfF/3967676b1eBznwbn3Qz0VdoVdu6rWu39rr71LseMT 2sTZe93ibcFLKfahfHfjnixtk55+yGb2SLcPCrJsXLsq9nbHBNs3+SW7sW6cHZ9RaOsHtdU4 su1sWe9mtmFAc42nlKf+VYqjUOz6x4NzbevwetJQikcXo3bq3x3Md6nPL+1U+AH3jWlp+8a2 8okxkWAU8RH03yXuPGHIEvcFRn2rojR4FcamcD7puMrSYIlD39e+s61+50IrnVhf/5hS35j0 bH3T0gUaV+HvOSV/kMo5PSviFLaAbxs7EOrofN9el5fdwLawHduAPWLONtgESziOZWwNdVa2 4Z8LnIIxsI1zBE6R5uk6H9cv3h47H3YpcMqvG9NQgWXYG67Lsfj4Aqfw48En2sdZxucHjwKn iPUrXaqUlf5TKfcJ+nXFJuLQiUuHWeEfvs0a1vVtaK3AqdzMaNwkYgOj7VHbf2AK5UgdHhsb bCfL+MawqaEMuCdsJ2lsQ2MwD/aa8mcZu0tdgeM5L+UIp8L52X63nII3gUeBU/Xy8iIGKY2x koJfMEvj7QdOsS2NGC09B54xz4vnA6fII+8I7wPPEg5zH+H9oNy9DHRP8IRlniVc455I9/qQ ljmWdcqLfhL47EI5sD/vKeXFNtZD/CTlT5lyTY7lHYWXTzRp7O/A8CGD7NLX5+xLxaFfUBw5 /aMuijFXihQ7IR79KN30rfx99KEKnCIe8Cf5/hh/9lulX5Gf76amb+ULvK39bohdjGVB7CBj 2F7Web9WXPqXn2yz7fMX2bw3RtvIvn3tmfx8e0KcxPeaLFuFnsqRTz41pqcYjyLoDbhBnAJ2 HO2B3oiXzWc8CmIpSMf+wxFsP8cFHqCF4BSMQON4DIPsPensx/6wBu7QryqwKPj9WA++QbQW 29kG3zgWPcU8nBeuopHYh2tHPsaIoeSDvMI0GOb7wklNwe8Hn/DluXbU/eHrY5l+UmyHUazT PodfEMZ536kSnKKPbyUxin7DcOoxjVnhfsQYp/DpwawwbhJz2owCp0gPGgv2sJ19gk8waKnA qhT8ltoPZsGpqvBJy5X03sOpeH3H/EcpGZ0VOCWfLf+szdA9zekU55ya0fERm6j2qDeeuFfx 6WqnUt8pWHV6wcs27dmqzqnZzyfYsj4a/0hxEOPFsokaL322/oc47flUxf+l2OjWFW3KMzXs wNSe9s3at+3U+wP17/j2Nuc5jUk76Elb3beR4gH1/48X02xd/0y1QzWz/W+1sM/Epe3DGquf lf4zP0Jx6mIWvNorP2DgFP69aHwJxfG5bpoT6ye10HkFt2izor8UMX9xiv1DU6HDqqpdK3mU 9hv+oTXtPtTuSWyge5dNrK7+vrnZsgFii2xGDX2rOXo3GmWo7UH2o7bKLy1LvoGMqD7vnMJm yl5gM/nm+f6xrXz7fOvYE2wSthMb5L4+HcM2bAC2hDRsKDzDbmG/WMZmhPqtM0ppwa4FTrGd Y7HPpHFe7A+2hnNwvZKcYh+uFzjF3OP9YJV8fsRToKWI82Mito9xkkqLU8SnwzPuFw2FVqKt CX9fFDuRYo3r5bqeQmvd4ZTi0PKyi//RwXbni8o4cB2b6LyRDSb/3EcoS/YNNpprs18oc8oH +866H6eywK7+V3MqMKiW+tfRPxHNVLeOfMbSSj5+3884lRFrn1I8mNoUGJ+T54C+pW7iz1vP nHzDm1Cv4T1i4r54zrxfznOVDe8GLArvGftQFjxbysvPpfctvIucl3TSeC8pL87H/pRVqCv4 efUusx/5Yz98hlyXNqqVS5fYwb177IsdO+2y4vJuq72Jf3hc1DKx5/j9iJ1gXApvizp3ztBK 8OmG+PbTzRv2/dWoHYs4QJh1/SuNnX7+a59fld/vK+m0s9t22Glx6ujaDbZ04iR7o18/a9uk ibV48gmPZUlSew59qNBT1WS3fCwK2TDsOAwJ9v4Op2T7lIYdZnw/j6dDj2hbMae0znH4+eAT mieaQvtVxKrAITRSiFNnPzjCHM1Fn+Cgs4ht97GOxIrAKuef8s250F20dQV/IFyivcrZpWNc d2kcQ3jHOTkW5sIjfH9wyvWUzoVWQi/6f6Z0Xu6Z9irS0VbE/nmceiViKDhW41rI71debVPh 31yBU5XFs5J6Cs30ezkFnwK3OAdj8LINXQWX8PmliqnJ8kWwXknvfyWxqqLe80r6huP1PjOR 7u1Z4loNcSpXZcP0vvx9H3Ytb9OfqWhvt37YhuaXsdeb3GcjW5e1xQPq25mPetqbTz1ok9pL d70cb+sK023JS1X1r9/7bcrT99smxZcvVlvW5LblbHyLMvofcFVbPaSlfb5wmH29Zrx9NrOv TX2pgS18rYnN7V3fpmt8pfli24bXs23/uHyxqKW41My2DW2kMSzEKTELVqGn9qitat9bT/lE rB+xfB7HJwYRH8EYScSowyHaq+hPBZtgVIhjJ512rOSRCyxp5Hx7qtcYK53cSFpS7fnVcxVX Lf+HvtNU+bBqyJ5mB07pO8+SbamWpeddS+0hsqt8225btQyD+MaxrTCLNOeUbAI2hHTsSmCT c0p2gDSOwdbCE+wXtotlbAPnwJ4EBnEcdW3sC8eyzrHYcZaZWMYmcQ6uh90rySxs0N9xqnyk qbBFxPP52LMP/pPH+QWfH31+ib3AdqGhshl3Qu14jOuXoTlsop2K/lQlOYXmYnuudBV6Klvp 5I98Yj/xW3HOwKlwv7AYXxT5dU5pzjL3S/m79oidh+0cB7MpM2wrx/NMKCeOKfms7lZPRbES 6Cb5PWOcytN4JnAKnx/8ivx+eoZqn6qtOAu20xaM/uJ5hrgWr2cofzxT8szz5x0K90e+2Yf7 83vUM+b+YRQc4t547hxPebIPZQB/mChbfweVRrqXn94t9sdfiJYKx3Ferg0Xqb/wbpInYmla PNHMDu3fa2tXrrCinbvsipjyo9qZGA+JsZGuFZ30OHRiKmiT8jhzaaWLRUV2Xby6Cb/k//uX WzcVb6Ex1HUM41lc+fK0+wS/kbaCU6d377Ez8vl9vkGx6R9vsXUz3rM3+/e35jk5lq88NGxQ T3Vx6iP4KRmnGF8q9TL5iNBOMa0Ci+CU+/1k47DnlWQfsdmkwRXsPqzA9rMOIwKn0E9wh32S tQzD8L+hceAT14KJTGgv55T2g0XErbMeXUc+AJgSyx/no83K86f7YCx02rpgE3lhzvnhF+xi PzQWeSGdfNHG5O1sugYs4j7557z7/bQ/sef+zw/ljXQfA1DHRXoJH584KJ8fvj84VUG+xCqK Q+H4CtJW5RRvAafQTMHvB6fw5cGfoKdgD+1UJfUUXAm+QI4hnRgKluEUGipRvKym54G+Yr2i fD3OKr3HcCpB321V2QfSfs4pfdvyX77XoYzN6RhnUzuVt3HSUIM0/vlrDeT7a/+47ZvVzb6Y 281GP/2gTW7/kC0pSLZVvVNt8YtV5C8soz5W2vZCvG3oW9MmtXnMxjT/J/2vKsc+LKhnC19/ ys6sGGMXNrxj68Y8ZwsLm9iMF2rLd6h/KRbm2vaRjdT+FLFou3TU1sENNX6FYi/Ep88UU/GZ YilKcgqfX4g1h0PE+MEk708l316kt/D9RfETMCwaR0ntVDq20uAPLH74fOvQ7x17IP0JcUr+ kxp58l9l+ZSqsqoh25ctn3BD9JS+78Cp5FpR317sa/jm+c7hin/X+rZJwxZjL9juNkU2F98b 69gV6qvYFI7FDge/3d9xSs8sMIj5LznFsc4s5Zl01qlPs59zSnUVzun9gXV9bDftUvj9XE+J Uego7BIx6fj8iJfwPlP3xMb0u0djJYlf2FbyzP88aHeCR7CHfr38y4O4P/QSPsGIR5Fv8Oec inQm+eTeYYpzKsYfzo+dLOZUzM7CosC3Yk6pfLl3tnNc4BT1BMqAbaRzLZ4V54B9d8spb2PS t0ebE2OSwaK8HHFK9duIU9LIYhb6CR8gvj/i2GFair5Png1lCa9CXYQy4P0hj9RpnC+xfJN3 eMX9cF+wJOxLGvfH/hzL+8XxMIr3jnTKJXCQZY7lHWUfv5aO43jKlfeDa3A9+lJxHJyaOukd u3Hlsn36yWb7cs9exeUdM/4x5X2h1C7F+EiMf47/j9gIYidg022lXZF2uiUO3bxw3r6L6Sni 0S9Kg106LcZJl10586VrNNdTn+6wPUuX25F1G2zDrNk2dtAgayzWt2n9lLVr10blRzwJdTWe PzGL8vHJxvLvjeCfgyvY78hOE0MhGyi7jQ8QHkWcusMh9IpzSmmud8QAZ4LsPIyI0uBNxCkY Aqv8n7S6duAU3Kqg+DnanvA9Rr47xdvofDCUGMDa8lfCKs7PedgnYqDyKD7hUwzjNHFepnAt OAeT8F8mir+whXvjPplohyJmD/8erGJbso5Hg6Gt8P0xRnpJTj0uTlUVM0nHXxhxipjGiFNw qCSn4BU6KXCqJLsCpziW49gHTnEMnMIvmFBJ777yHLhVQfXpSqpPV9S7yZSg97CK3j/25Xxp 0lM1da95et4NFTuzsHtl+6BLOZvciXH6HrLXmpaxgvr692HHKnZm1WDbMKqx/693Srv7bG2/ NFvTW/2fXqxo73d62Ga0vs9WdXlE/+6tYXP1z47JLe63eb1yFReYa+N75Nl69bk6vHy0pjdt 48TnbHpBfZvVPdWWvlbXDoxvqdi+5orry7etQ5vYFudUM4/3g0+fvUnsX8viWApiIugrhY5i fqcvFeOoE4MejZdODAX7Oq+0HPr/PtZ/plUZNs+6DNL/6Wu1tFpJqtfXrOtaClalqKyKOaV+ 7w30XWfJdqKn4BS2j+8c+xB0lNtO2V3sK2luV2VH+f6xm9gMeMF2ePJrnGL7f4pT5JM8xGw0 x7OObcHWF3NKfEIL4Qck/Vc5JV4xRjrtUrRJhVj00qVK+Vjp/OOD47F7NaU36dPL/xDx/bGO H5D+U/Sj+jmnqktPoVODnopxSmWIZnBOqUw4r9tJ3UtgcUl77dyP6SdssesNlS/3Hmw9989+ 6AS2BUZxz0ykoUH+OE5Je8Q4VaeYU9Jxiq/wdijXV+qPJI7RpoWWSlYdEX0Lp8gfzOEeuH+W 6aMMR8gvHHNNqGXKhP2cL9qHMuAZk859wRXOAWPQSOzHu8g20gLHWKfMYRDXYn/KnTn74Ick X5yX8idelfdhy8YN9o3iHvbv/sw1j7Pq2HH7s/TTvygm/VtpJzQSY0wQa/4D/+4Vm/5665Zd PXvGvlEcxUWYdO6c/9/X4wOVfkPr+P8unjpp109Ie2k6v2uP7Viw2PavXG0fz5lrk0aNsvy8 uta923PWp3cv3Q/vi7SPYuAYk7aWbH68+ID/DB8bPPB2oRin8HnBJzjlPjMdCzdgTuSDi+Ls Is0UcQo2OKd0LtiArnFdJLZE/r7INwdT8PWF/UljCixCAwX+ocuy5KvMks8STkXHqC4lv16m 6sNcH9Zyzgr8K17ahvxx/ccV68A4GHCN+0AjoRHRSAlK577gVXVpfMb4c+2ETtP1iXWEbexH /9+KVWkTCnpKuolYe431d4dTanuS9gycglH/GU6V5BdtVfyDKy4uzrkEd+IVewGnaLdCM1WQ XYFTleCUvuFEvYeV4VVJTqkc6orxtMNsHlDbVrySYrOfT7FxrR+1wS0es8ImD9q4f06y61vH 2tTnKtvQJ+6xiU+VUoxepq17NdlW9KwiDVbGJuWXsh29U2yz9NV7asua2vIBm96thq0Y1Nxm 9cu3Md2ybem4bhoPZZYVrRhhi/Rv3pni1IKC2nbk3Tb6h6Li+kY9qTGTGjundoygTaqV7X2r lTOqJKcqvKox0MUd5hWljypoubzaqSrJr5c0ZIlV6a9+vtpeTtuYKspPyDamyvj+hsy3Mr2n Was3Z9sDzZ+1cgl6ZukZll+vjsb6U0yUdEIdaQLqv8QUM2FjsvTtZugbxkbAHuqmQTPxzQeb yfft9kf7h31Z5/vHJjAPxwamBDuEbWLCxrAv27Et7I8NwRZzfuwIacVTzG9IHrgmHMQeci5s DXqKZc5DvB8TGgo2oaeI7QrtU4znR5/eB+8rHcVQiFWko384Z33G8VP5ZKmcmDI11dM2dFNo t/I2K9Lp/6vt2eJUunhWS1zDJ4beoF8R7TrYdcq6pjRHiKFDlxBHlyEfWqRNouPCsfzTiXQ4 QUwDseJhP86Lr4198bXR38nbhqR37qTJzqF/lMa1SOfaxDww51zMva+U0qK4Pf2zRXnkebh2 0fPxZX1X6DTYCRN4pnCGZ8UzdGZqnWeCjuX/cVwbrYXv0OMydF7uh3iM6roeOq2a6pDk39u0 uA/lM1f/Q4PDPH+eZeCPc1hspv8e72aop3B93j3yy77Ul+rp3wD1NdXWtdN1Da6Xo/LK0nqK 7Fk2vkqVe31tS5S9bN2wiV0/fVbtUhp378Qp9c89ZmcPHVX/XY0n8aXGPb98Vf101U/qK8WY f6G4dP2j9/bX4tfVG/bX67c0jt9lP/7aKcVQnNE/fs9f1Pab9sMV9ak6d16cOisfYJFdPvaF /lGlePbDx+34+s22aupM2/jeXJswdIS1qNfABg4caCNGjFB9SeNJSsv681U58Wx4Xtj3FK1j 17HnqfBMvsF42eDK0hCJSfQbVTtTqvSNpmQtJ8j3VTUePSIeaD1V7UlsT05RGx2TlpPkV2E5 tZrek/Ro/Ae0mo/xKhZg/8M6jCAunAnfnMffiROwAl0DM+njC7uI60NHse6+QPbXPvCQNDjJ fvCNvlqBXfjV0ChoGm/f0Tq+uDr6lrD9cAI+wADahsI/hdnGhNZyfSW+oq9Cvyu4h8+QuED6 BtPfivuhD1ac/vcB4+gHjE6CYeQj6Ca2sQ5bAtfw+TmX9LxK5ol8eUyFbCrj9qHl6ONG+fOc qqepT7J4na3nmqB7qaY6Xa7e7aTHy9rLz3a24+/1s/VDOtj6AW0VH9HQ+mU9YIPqxGkciPZ2 cHJPG9GynA1uHmdT9L/e2d2TbF3PJMWXJ9iK1qVtSctStuLlira+b6LGryhjU1rfp1hAjd3X T+P/9W+s/Wuov1WeHZlVYDc3TrRTCwZprKV8m9+niW16s5N41soOSUd9IVbtkqb65PV6tu0N aajx7fRfkNb6H4iYNbqtT8lDllr8gEXiznyrrKnSa/ovorjEMpyKVxxF5X7y/0lLleutMQD7 aNz0vvL3aT9YVmnwPCvTZ5q1GCVNlt/dyqtNEU49qTiAPNnfXNnX380p1WXhQklOYbOYsBFM 2A3WsS3YipKcgkfYFCYY4yyRfWM7+/6MU2LE7+KUromPkTYq9odR1N/TZdewq+gpJmInaJOC V4FbxPvh5yF+oqSmwr5Sz+e8fwinYsyom/v/gFMxDsGGX3IKvv0WpyL+RZyCEbCL5wd7sP2+ rHcA+0/9AV44Q1TurmO0D1qF7WjlKJYGn2DE3Yix0piyu7CVa8Aorsu1YFXkW+RfUNKJ2g8O hvoRz5Pr8b5wfedlzJfMs+cdClqJ41xrUfcSi7LEokzuX4ysKdYzzxQ7SUtXfbe2bMcj995n s8a9bSf3HrATO3fLN8dYfOqbW3Rac/WTOqN+u+cvaUw//bv3wiW1PYk7Srt1Fh5dKt4Gn2Ad rPrua8b/u2o3te/FolN2/sRJO6s+vhfEvxs698XdB+zw6g22YtJ0TdMURzHAOjR/0iZMmGBT pkxRGSqGVvmk7ChH55TsMTomWeWFH43/GabAqeqydWJQlcApsSriVMQgOBUvOxk45WliknNM c2xnorRHxDBxSucjXgGfG7qGuAQ0C9tcqygPaBrGf4hiHbC/YieMov6BLkuP+gXDIeLS6UeF pnI+aT9YlSwOMicNXyHraDPm9DsKbT5wAVbgV+N/wcHvBjNYhgfB3xY4FeU/0mPk2Tml/KO5 uB+4RLuec0rr5fT/3j+aU+QpWXmLV/7xXdJuSDlTZ2A8qQz5sYgJ5D+K1IGTKz9udTPS9T+Z p+zAlAI7OrPQLi0a5awa+2S8tFOKHZj0sq1+vZWNaVvZhuWXtWld9O+ol6rZllfTbVPvara2 44O2qt39tuqVyra2d7xNV3z79HYPaAzaaraqsLYtL2xgH/TIsA971bcVA/Lt+Pv97PKat2zX uz1s9dA29snYLrZ2eFvb/VquHRvezPaOFKuGNdX/FfPFqFa2Y3Qb2zOho2LT2/mUPmqVJQ5e Ii4tEHfmu14q7xpL+kraKX7gYqvy+kJfRk89WqAxaws0rrq4VVGcKj9wrpV5dYY1Gz7Dyrbu aeWTpDPTMuwJjZuQp/p+DqySH8v1lOrX1LGDnsqMaSL8Kumy+8Fe4OsPNitXviXqvF7njmkv 7Bg2w20bde3Ysc4pNJQ4xfHMsS/e/lCCU9g8tAzHBT3FvnDM5zEmOQtlG9FepLE/jPKx1HUO 7CX6ytun0FTy98Er/IJoJvpPwSp8PaF/L+MmwSfsHXb2j+AUOgH9QPwB9th1kexk8I/djZ7C 3nNu4vJCm1HQVqTBKq5DHrg2U9BP6LSgzUqmYQujtMjXSFngbwsamucNI3iGPCvqG65xtA/7 8RyoN/BMghbgf8DkAZtLnmjHQj/y3nE9JpbJWx3FETBxH5yX94Z3j3eFZw5/8OeFupHrJ70H vHNsY1/yR3+qbNnRDNlMGJUL+3T9VHGJ/6nWr5NntZRWR9vLPfCga6rDxDXIF7dLY0TcFEdg DhNaKjALBn0r/vwkjUTat9JTTLfOKh7duXRNLLvsx9yW7vpRy3Dqiv7he01MuyBewSk01XXp qdNbd9iWeQvto4mTbWCv3vZcm3Y2b948W7RokXSp4oz0zOAUU6bKiWcdtfUohixwSpypLvsP i6rI1+V6SrYQbZSiiTm2EY4xJWmZ7WiqwClP1/GBU3APOw97mKOpsOnoDuw5y7Xkm2JMCLRU ZH9TdC1pJxil7VF/KNnpGIvgFm1ZkcbStbQ9aCl0FnqLY+AW+2Dj8aXBJziFbkHD1NRzZBlG MUfDoF3QXLAtaBr0H9xk7npKLOBeiGGHUWyLOPW4x6mXk6Z++BG1SWl70FPh/MzRUr9HT3F9 8pssHYXuo39UgvIH74njSFD5o3fx3cIp/qeYLNbWlz1NkX2qUyPVnuvQ2hYNe9bm9GtnG8e+ YitHdrfFr7e3uX1a2a4ZfdVGVdNGd023AU9XtAn6r9QM/VdqzWu11B8qzRZ2UPxf+wdsWa9q 9tHLyTa5tfpSdSxry3tVV6xFTVv1qnx+Gidp7aDmtqxvfVszor2dXTrSLm2ebp9O62szCtvY nNc72NrCZrZZumr9kBbSYM1s5cCmtnFkS41F+7TG92trRzUmBVPEKY2ZpDjzKoxJISahpx5T uxQ8QjO5ztIcTVVWnHq016xiH2DZ/hoPsO9Mazx4ilXq1Fdtd3q+mp5QP9888SlXnKqjObaT +i2col6bxfcuO8S3j03AHv2MUyp37ANMIh1bhg1hHa6xL+nUgbEvpMMjlgOnAlucU9rXt+u8 XMv1kewd9gYNhy0knXk4ju3YxeDz41qwJTle9TwtY0dhFuwKmgotBbuIq8APSDwFY1GEWD9i 1bk+981xd88p2hYifw22Fy5gr92nJltJneDuOEUbFMyI6tvY/juckn9OeqKYU2LjLzkV6Su1 Gzg3o7amwCn8gIE/oc4Rnjn+Ndc3tDepvNiP58+2wCjnmjQR14ehzDk3/IRXMImJZSbSmfMO ck+kcd7AH84Ps3jfcvU9s847gHbi/WKZfXln2If3MEPlAovgVI6unSG9ie8vU+VUT76jGspX Q/EKLTWi3+vuxzuwZattW7bSbolH18Un+PPNV8TtSf9o/NjLJ046j/71xjc+R1vhB4Rf6Kq/ 3bxtf5Gvj+OuFinGT2m3xLHb2u+Hq9edVecOHlGMxn67fui4nf9snx1cvd4WT3jXCp7rbi89 88+2Zs0aW79+vd51/ALitcqGZ8e4b9W1jL+Ptqkotg57KP+y/HTBtwenEuQ7gTnu0xOTXC+J Q+wDkzimmvQLPr6SHCPN/X7ilMcmqIzwnWFjmbDlj8knhu3P0PsFp5K1D+u0G+HXIsahhv5D TP5gVDGnYm1fgV9wCp3l/IoxintDTzGHR0zopWSVBbaf5VoqBxgVmBS4QFpJdpF//JRwCR9f 0FOwiftAU8Etxq8gjfnDcXc4BRNLcir4+bgGeQnr7MO1yQ9pTKyj8fBFpupdhlP4GiupjYxn 4OWu8qE/Mz7oDL2jNVW3y5XtzNR41+NGDLZ1Ewpsyiv5Nr5LPZvx8pM2p1e+rX/jedsjf+Bb nTNtbLeaNriN+vA+Gy9OiUF9a9jSgmq2uFMZW9I5zlb2qW4LeyTYu60U66d/+a7qI469km7L CzKVVts2DWuhcfqesnm9NRb6W13th30L7dTK8TaldytbNLKbHZvUw46887zG8GtvS9W/anHf erZldBs78G4n+/TNlnZ0XBufUkessATFnzMlD1tmKcOXW1X5+irAKumnsuIV2ulxaSu2lVP7 FduYs16mcLZPef3ftcRuQ6yi+vmWT6llTfNUZ1V55MAqGCHbmaP6NRP12traTlsMdon6K/Yn cCqsYxPgEvoqtFMEG8G6c0o2LHCKNg3q2qH+jT3DxtEWBG98O3V0bJ2eF2nYI+rIzjcxKnCO NK87/0ecErdgF5oKDQWvArfwAzIR90ffXib6TWHvAuPullPwg/JkLKGgUfDJue3Wu3u3nIrs PjF2qhPoe8DOB06Rhs0nLWKj6uRaxv7DS7hJXDntVWwP+xELQV6dYXperltUJjw7ygaNG+oc PGd4EZ4rdQb0KM+J94Vzun1VvmpLQzGFPFIugdvkGTahtQJLYac/e10XXsFG+BPeF87PBKOc Zcob+eJ9ZD+Wa8lmZule4VRN3SfahDbYXJULzwS/H+PTpMl+LJj1nrcx7Vizzv1+5w4cdg31 jbQQ+gitBIuYvtf6f7t127fdPqfxJ7TtinQSPKOtCq0Fpy5/XqS+vtJimq5LS32r42ijOqNx KIqk205JS53YvM0Ordtkc8eMt+4dO1mfF3rYth3b7dOdO/UeyuZTr4G3YizlRZli5+Nle2nb we9Hu1J6Ov19id+W30wMik+4wyP8grAIHeWcQjdpOXCK9OI0bUdjpcE92XiPzRAzaMehvQed gZ8M3VRLsRIwKYp1EF9Ux/X+xconegrWwCg0E3lGI7lO0rFsJx1NQTw62+EW/PVJjMnQO4zf D53k/jOxCrvPdjjAduZM6CnmMCK0KZFnOIQW9HFnHxdPdF62oQnZTkxFMad0b2XiNM6f66ko puLXOBX0W0lOwSgm9mdiGS1VrKeUVxhVEU6pjNNUD0hTORMzSZtpDb2fGWrXhlU9unTQ/6PX 2ZX9S23/iokap+8J65OfZl2y4mzT5ELbvWCkzR/R1Ub0qGMDu2bYOI0lMfHV+ja7b57NKMi2 qeoHNb1rki3oLb51q2ljW8TZzC4Jtl79gJdrzIoNBWm2tV+G/tnbyHaoT9SiAS1sTkEjWzN9 iB3bMMdWfTjFNi2dbZe3L7OL25bYiTWTbcW4nvZBv6a25i21m83sajvHPWVFE1r4hIaqpLYo 5klDNWaSJpYDkx6Rdgpcgk1hgl3s88Crs+zhfu9bduEES3/5DatSI9vKJdWwpoqFyNM3ngun FF+N7cQ2RZySr0Xbs6S14AffPewImsk5FeMEXPJYKtkrbFOIv6beG2wM27FnXgfXcYFT2DTO G+LZ2I86ODYpTdqJtOBDJC1MHB84BQt/y++HtirmlMahKOaUtDWMwvdXNq6Mx1Dwn3natzgn 1yIW4K45pW8Mnxc8yJFexc64TtB27M8fwakoFjziVORng42RhuOa2HvWQ59dnjVaCU45M2Kc Ij1qH4JTSoNhPBNxKLQnMud58Tx5DjxvmO58UpsU7VIss81ZxrVkX2lvgplRPKB8Qvp+uX/S KAPWuSb6j3EEk2VzyBv8CXmAPbx7bOMd4fy8Z6yTR/KEhmIfWMpzhFGwCE4RR0GdtZ7aCeFU mtZJqyA/Tz3FAH+2+RPXS0XSObRNFamN6vxx+ebkryMewnWTmEU71TdfKR5d+uhHtT2RBpNu wSHpJhj2wyX9v1ftWN+JYd+Lb/j8Lpw4aVd17CV0meIyLsnvd3rbTju6frMd2bjFOfVC5y6u 6w4ePWJ7NJ4gLMW/Ace93qBnhZ6qrvvAlhdzSvXytDTxQvYvtD8R1waT0FHeFhWLp0jUvoFV 1OmjSTEV4hic4xwse31fzw9OYdvRIMFHVl72ntiJ6tJMqXpv0CyupcQffH7RmO3w5VcYpfPB LRjl8YNah1P4+hLVfsZ2NBbcwueHjmJCmzBnG3oKLsEuWMXk8Qqa0zYV/H5wijyjm8qqrxea ycfs0P2grxiLgntDWwU2lXkYTlUU16IxaeGex2RoHrj0jzjFfoFTLDujlO8k5TuRvMnnRz9j 6hHpNTJ1j4w7n6j3OENtEI9anmKwKj/2iG1YvtjOfXHU/u3qXju4apIN6ZhjvZ+sZi/Ue9wO fzTWVk98xTZNK7TpGkN2zqiOtmbq87ZobEebP7CxOJVj73asbBPVx2qh/uc7s3stGydOzegc b2sLqms8dI1d2Sdd/6CqbXs0psTG1/Nsy4RuNrNnfevfuYEdWjNTsUHH7dyxnfZ/Lh2xf798 zP73pc/s7MezbNWYjrZsVFs7PO0Z2/tOu2JOlS9UfATMkV5iHCT+k+jx58T9oZ+U5jHo4lVc L/UBlpYiRp00jrm3QOOm95trNXuPt5p9xlvlmnXskUTFPIpTufqus/Ut54hXlGeO7Fa2vvNU scTHViUWW2neHiW7UMwp2Qvqz163Vh03xPyigdgHW4H98Hq27Bz2rJhTYg92BzsDX2AR/OI6 bo/glGwcnGKfYk7peqRzXeeUjsM+wcLfiqOAUcWc+hU9RV+pYk6p7xTngs3uu5Le+2M4hSaR vZRtLOZUTGfdLaew+4FT3n6BX+hnvCnJKdkDpTmnxAf6QQVtQx0dW+jaT+eoA6fEifCcw7Nk zvPi+fI8eAaUFf5VGMX+sIztMCzSUuKa6r9M2FrywLWY0HLM4SvlAxtT9D3ThuT7xp4z16Rd jHPyzMkHz4n3jfeF6/HeeZuU9mGd9DxxL0e2NANtputiD6i74v/Dp0YMRbxsUs+uz9mpQ0ds 94ZNGnNC/4YqOm1fHzqqMdKP659R9OuFQRedQ3CK+ImLXxS5/oriKi7bn6WhYBTMgl34Bf96 VXGAig+8QbuUznNZvIJT13T8t9Je5/cetAPy+e1fu9HmjBlnBdJSUye8bWfU/+rg8WPibZaX BRyPmC5m6Vnxn4wE+Yqw5/Q3ShSP0uTDg0mBTVXjabvHRsrvJEY5d2IsYp8EtW2ho+6wqoY4 EMWicQysgjdwivZ/7D1xcsQj0G+JGAqY5O0/KkfapxgjAn6FPk9BRxE3ETQTPIJf+PbIO3H1 pHtbm66BzsIPSHsVdgn/WtBSsAlOMcGmwAHS0V1oLbaHtir3RYp78AgWoZ9ob+M+WPexppTu nBK3YNlDZeL+IaeIOwz9qbgOy7Ar6CfYhJZjgmUhP8RQwKkE1RHiVe6UL3Eq+EUTFU9BXE/c gw+6nspv3ED9Gr6wU4f32dWdM+z9gS2toGFZG9421Wb2am5frX7bhnfOsbmDO9vSqf1t14p3 NP7kEtuxeqotnjTApo980d7s0coGd2liU3u1snHdG9uI/Eo2vn2KrXy5mi1/McW2F1azfYMy 7PjbLW374Dq2UZya8mKeFb7Q1j7fvd4u3bhlRXpn/3r7tvpZXLT/8a3aXi8ct73LxtjCsc/b jnfa2/a329mJCfk+wSXGlmAOp1iGQzCIsSj4pwfrZXpOtwdeVB+pV2ZqPRpbiX3v6aV//faf Z9V7jbXMwnesSi354uGUNFKubM0vOZUDp2QbfsYpMQ1m/JJT2ArsBpyCM9Sj3TYo5s85JXuF LSvmlOq4cIltv8opbJzO+TNOyTa5voFTYdLxnAdbBCt/Ky7dOSUbGmInaJdCM6GrQtsUrCpd Kuo7xT0EjUY+755TKhfZQ+w1WiHiVMQL6sl3z6mIAVH7UtQft9jXKNvvvkbXU1GdHCYEHUNc R/gHxz/iVHE5iw1Bw6Khee6sU0buR5U+9bLTM+E9oV6C3oFNMAg9SRlwHaYQl492Ih1tx77Y Y1gZ+SJVdqrLoI0Ytw8dF/jE+xb4RB65JmPQsh/vBO8K2xqp7Ym4c3x+OfI54vMj3g8tVV1a IVExAUwr5i+0/epze3DLNtunsSF+Unw57VPEnhM/AXvw/f14SeNPSCPBqXNiGD6+oLVYhmWX xC80GJz6Uef5Scfg87t44lSkpYpOaYyLIruluPQvd+y2zfMW2sfzF9m0YaOs8JVetuj9uXbz h+/t1LmvxOZslSt9LKK+A8lahlP0QcLO3+EU7SC/5FSI7aO9ibqo+CEuoZlgFAxz3SSGVZMW Y0J3YUPRVJEtreltT0GXhJh07H4NaVB8f66lZOvhFYzifyJsx58W4iFglMeoi0f050IzRZyC QZF2QlvR9xediJbymIoYp2AQLII/NVTHYB1tFTQWvGI7U2CXz3XuZJWdx01IS+G3JJ9wCl/f Lzn1aOAUzPoVPRU4BY8Cp9gWOAWbfskpOFtFPkA4Rdtdony0lHvgFHoqW+9mgsauiK/wmOop 4+zK2ZN2aNc22zj5RZv4cl0b80wt/dc3wWaJU8cWjLAuteNsULsM2zhvpH0t3+D/vH3cbpze aoc//sC2L51kK98daB++2cs5NeH5pjayRWUb2zbJGQWndr6WZvsGZ2os9Ia2743GNq9/vo3u XN2Wzpmg/6l9aZ+rLnVW/oL/9dNP9pX+8fnT1ZP273/T+Cqfr7TN7w9UXGBH+2Rcazsx/kmf GBedMWgr9JOe0jhIjPUXjUcrbSVGxQ9ZovH95vtYSvx/nn9O8R9FH0dd/PqTYtVL9Zxpqb3G W/bAGZZUp5mVSZT9Up2yrurMtfW9Z8oG8XyJ9cyULWC8vyzFm8Aq7ELQU3AB2+BjfWo79Vps OvaI7dgtbBj1XngV+MI53Lbp3OgkuMU2b5+SjcHmsa+3SWmd87AMy7BRXMdtIpySXQxaCzvE PrAIVlGfJ0aCOfszdybJhhLnx8Q6mol4CmImiPVjuv+eP3k8RdCE3A9TI407kaVxKPAb048q Rz7SetnydeaonYX2O2lOxkvKVFllaZykurn4t9A0YqkmbHLkc6O/btTXCVsMn5hH3JA2kK2m fQatA0dCG03QGrTrwDjSsVkcS3wG++Hb43iOg1ds4zj0UMQJ2X8dg/332AjXM4o34Pnrmugb jiEtMIxzkobNZ0IjwQPnBO+Hyp5nhl+VsqfceE7oHnjCMTzfuuIEbKAcYFK4N9YpA/JI/A7X In+kh3h6lnmPeD84L+8feeC5sBxYRRrvJP4+36Z3grzx7tD2lKkyoZ9U80aNXUMRQ+E6BW0g X0vT+g00Lt8Vmzd9phXt2WfHduyyW+oX9aOYQ3+oy+IK8X5MMAndxPIt6SF4ha+PbTAMTsEx 2qluiEPfyT/4r+LXdWmwc8c0NqB4RfvU+aMa01bcOrFV/7Xac8BmjR5rH4yfaMMGDbKtmz62 r69fs/M3rlmThg1Vx1L/GmIkdQ/JyjPvAZoDvZEoPxl2PV518mTiEVRHd/uXon/aSE+hlaoq jQm/YBRrQby3fGUxHtEOxcQ6sYDJmjPBMfQS/aNK+v6IqUCn0MYDv0hDo8ArYtThFHHfxFyg m2iXIuYcVkW+vWiswQT5wEhDG9IfjHtiYrmmtqHFaG/CNsEn/G+BRWwPMRWwCibBsTDBEFgC L5nIL3mFT+SXdXx7xC6SV2+fkk4kPiRqn4q0FWMpBR6hm2AQ8X60PZEnlsM2rs0y+aSPF3kk b+zHGLNVZXfwOfKcgh8Wvy1TZbGugfoTPnRvKTu4a4f6gn9uaz6abxM6PG4fKI5vUvsqNqtr qp2c85rtVLxD34ZVbGwnjWk+/x1p8nV28tAu6a/ddlxj+u/X+7vnk122ZdUmWzdnohU+08IK Gmus2m6N9C+raja/W4odHVHH9otTxyfk2+ExTW1c10zbML6bXb9w0s58vs8+v/SNXfzhv1vR mWt28dqPduHiObt67ZL9209f2qFtC2z5mA4+7dJ/Pg5JV8GkMq8wpt8cH2+W8SYY74/xZ+FW wtAlzitYBp/u/Ot3jvPtXsWwlyqYbWn6D1Xu4FlWrX6+lUmK2o/rYh9kBzLFjMCpLH3bNZ1d 0k+KWy/mVMw2YCPwrbAdW4RdKOaUbEhu7dg/w2VHsCXpYgv7/v/iVIhLZ4z0EJMO19BV/H+K fr70naJtCl0V9AM8ZDnilOyeOJUtO5wdOCVWeZxJ4BTteUrL+w1OhRjyP4xT+i5+D6fu6JSo HzB6C479Hk5RJ3BO6Rl6/UDPn2cJA6gjUI7UB+AYTGHfwHi4hWaL+BfpgaiNJWIsrIKv2GD8 l3AJ9rKP+xxle3ifSrZB8S5xfq7HtWAY+WE/8gQ/uS5pPhefiU3P07teX+1SqbJT+Fhon0LP VlE8wOjhI+y2/r2xcdkK9ek9Ykc+3WkXpJW+k4b68+Uo9hwufXVYseQnTtpfrt0Qk644l7yt 6tx5ZxX9feEa/aWY3xKT0GR/E6e+V1sVrLolzuH7O3f4qF1Q+9SXO/fY13sP2rwJ79qkIcNt wpi37Pihw3bth+/sujRVs8ZNnFMefyK+JqpuTrmhR+AUc+w9nCKWIuiipOR0aQi180hHwSjS SfPYCPn82FbMqdh27GfwGZIGp2h7ct+f9Cg23scu4pqagi8Qu0/8BO08rqfEI9JZL+aUtoU+ vego2Moc3QSTvD9YjFP4Ark3mIatx8eHrYc7LGOrfskpj6nT+xM0FmxxTihvcAq2op24h2g9 yTnl7VPaht/P4/1inArL/xGnArsYTwkmBU6xTp5/lVPKU+BUvPq6wSn+U0Vf3wpxD9mRvWoL +vywzZw41iZ2qqhxjmrajC7JtrhXjv1l61T78P8Sd95hXlXnviflJLEgTVHq0KT3IkiMJbHE Y5rG3lBUEBUEC1aihqKAijTpMFRHht4ZBobphRkY2jSKithykhzvvefe+9znPvf53u9n7Vk4 JzkxniQe/9jP/u2+99r7937W933ftdYdfTXiRykaeVV7LZ/6rLYtnqod61bZP+c2fv6Ot7nv 5A0r13rdVqXPfk2TRg/V0z/vpZHXegzFm9tq8X3dtWNkt+D3yzCjtj4xQK/eO0ily8epqtz+ 7KI9yjpQpbzDJ5SZXariAzUqLSvWgYNl+h8fOfd13yZlzn1UqS/+Ujs9xm/2hF+qkZl0lnXS uUPcD7pjTvXdd9J57sOviX16TayxmtoXyO+G5td5ZlmY7PdjXt/71XtguurdP01t73tJPUa+ rg6DrtHZKUlfodRjo23pYBvTxfaiu+1vZ/RBR+eoXez6t//v+PViHfYMp2wnsBnYEGxFtB3E k7AX0Y5805zC3werzvj9avPSWaZPCjgFo75br17wA1IP596j7b2kp+uxtotdzaweZhGc6uu2 eGgq+vnrgsZyeXUx09FUfbx/T4/rcfEZPUUeIzkMST4buiHhlHVjbWwGjfSX9BT7sg3WnNFT XodfLGqTL9NTXI/4VdBf/h8HPWU7l3Aq0TFfpqfQvpQJNh9O8c55x7x3eI//lHcccxpgO/tx DPEifJ3oJCaegXtBR7Gc3Fv0CxK3Ij5GezuzyPeIr5A6Eeei3sB74Td85Drh28R/bU5FfYe/ MbDK3y3HEJ+ifRSMIpcCTpFDR5yKXGB8fqtSl6rQffhtXb0m5FFkb9qiMjMp6in0Em16C3dk uF+KLHOqMkz4+WBRbGOFjmIdeelJ26qS0Ebq/TLyKjzWvM9Rsa809EeRv3W72xNvV+Emj5Po afaEVzXi9rs0acIElbt/poMnjunI+yd11eWX+/ttHrhNmbRwPZ53j43Hlof4Rmi7az+a+dPG Oop2UeST0Y4KPx+MCsyxtkJTxZxAuMZvNFfw+fm46O8L2orz2aYSc6LdLrYeXx75EgmnPD6G bX/wZZkxbIv6C30VJq9HM8EomMT90tc7bKVP2xC3stYK7cG8LxqKZ4vtqNBMaCVsPtzB38fE eiZ0DToGfjFnPyY4xcT9BC75nEFPeU4cDS1I3gQxN3RgaEtVq6fISyfvAnZ9FU7h90M/wUi4 hZ5iznLkFH4/NBU5LCl+J8G/6vImJ518R3zRHfyfaH3h+SrM2q2yvCxNfGGs5gzvpzfv7arf 3uC+0B+9TL/bMEWjBzbSiz/vo2d+2l1P3HG95owbqbTUhdqXm6WMHXu1YG6q1qXvUuWR00qd /7aWzJ2l2S8Mc47EIL3mMekXDL9M6Q9108ZHe2vzE4P17sO99caDV+p05lwdLcvVEU+Z+454 OqyswsMqOXRSpYePqMh+79OnDuvDDw6paNMsvfHMnVrlfpfS3U/gRR53HuY0MHsaOafi7Hte NbcmBV6dc69zJ5w3wfaG1lONzTSYBc9Yd47zKmBUvaFvqc2Q36jnqDfU9fIbdG5bx9ZDfTrh FLanvd9zF//fe9jOdnHOCZzq0sHxPdunoJ/q2AiWI5dgVNRT7Et/FPh9sCOc95vmVIxHwaoz msq2lfX0TRHH8oBT+AIjc0M+hbXiADhl/15X+/4Cp8yqvu6XFk6RDwmnesApfptVvb2+Rx1O oXfgSeCUbXRkBjmArGP6a5wihhQ5FX1+HAd7/pqeSnxo+PaS66BVsHcsE7uCFV/GKew+bIAR vE/qNUywiDKEBbz3yCn2ZTt1Feo3XC/6KpMYlevVtRyKfOUZ0HjhvuDvGX+mc/ecs8O1g1/R 7Am+P/t0YRXXxNfHO+MeIscCs6zl+UZpG9XL5d7POSP0s0ZMithYe9uEZhc01XVXuc1k+hr7 SdYoc+Pm4M8rs8457PjRCXMn+PfMInQVfSTh5wt5fNZFsZ0vsauY/0e7KfLV2b/C+ulIdl7Q ZWitSu8X+02CebmbtyrfOYV56zZp6VszNeQXN+rtWbN18thxlVZXmlXHdf2119qvap8q781l VJdT+Muoi+Mra4n/z/oHViUcor1vopkip7CN8CgyCCaxL+uTXApsepJHwXomYjm04YVT2HNY FeJRLktsPGNjRJ8f7Ar9KLk+EBjlY7m3GKMiDpXov0RLsY18idBPIfzwM/A87E+/FPAN5mDv I3uif4/lyCnWobFgAixj4hi4hRbkXuBSzAOBs/QJCKfw+bGd3+SH4PcLnHL9hXzAr8op+siA i5FTsIvrc0/c50XWgoFTfr421rjEp8J7cmwqjIfie6IO1d51v/LighCfWjZvlva+dbem3tVJ E37eSgXT7lP5nDEaNaCBx5QarBd+1lu3/aiH+9x6SnuswQ4W5WvXjmytfmeDdm4vVGlxtRab UeveWe6c0ml6bdQdev32Hpr7wCDnpHfT5pH9AqdWPthDk+65VOXvjNeRUucQmVMZRQe126wq 2F+jYnPqUHWNyuxHOHm8VJ98dFTH893X16uPKO3FW7X8mRs9dtR8ayr3OWv2oK1+YG31vTsn 6mwziN8/MLPOQWt524VmWrORc9TU/sCGMM0cq3ev/X4PzFDLe36j7qOmqefVN6l++z4uP8dV PP5aV9eLO/r/3862q5P9/HU51bmD68X+v4d4VB1OBX1lO4EdwEZgy7Ab2KdoNyKf4vyb8vv9 O0453y+Ok0hbKvLSQ7spM4r+/dAH3CfPhV0kzjbA3OluTsEqYlPk65M7Gjjl36Ef2i7EdtAq tJWmHattsf2EF5ttiQai/m+/YNATX8SKIi++jFMwLsaZsOewifo0bPkqnCKHDlZxLfaHFfG6 X4VTlAF1Dsoj+Hj9vfCb3AniUrACRvD++VbgE2wJmsvbuH9sLBNsRkvxPIGf5gfr6zKX8uI5 Kas+aCB/U1yfifOjoYg9wkO+NXRd1FJsg6Vs45skbjXA5wi56T5fB1+/k8sBLQWj6Kdm9rS3 tMbxoI3Ondi7bXvw31U5t6/STDpsxtAu6rBjyugk2ENMiva+xKxYh38PHyBzWIWmIiedfVlP PsbJkoRRtBkmP53cdPphwse4Z/Va7Xl3rdLmLtDw2+/U6tWr9emnn6q0pkpHPvxAN/7iF4Gp 5EHy3vD78e5b2aZ19nNg49EgIS+i1v+HdqLtVGw/xXLI7bNtJJcCGxkZha0kFkU+YNBUIY8C RpHvzZycQPup/M1hz4mvhLmZhJYi1wA+sQ7fX4hPmT0cxxQ5BXOiViJfImESOXq+H87pcyR5 9sk69mfC9sMd5th8+MPvuB4G4PNDT7EN3yAai9+BaWYs9weXYFVgrJeJnRGfQgPS9gs/H7Eq 2oWFdr4w6z+hp/4Sp7gP7v9C51c0a5HkcKBPW/sd8F7Ql+TCkEOBpurk/1Zpfo4KMrdrl/Mo 8te/qVG3D9S4uy9TzY55envkrzTmum4a9dNeGnJpiqY+fb+y3p2lnIw1yt21Vlm7tiona6fy 92Zrx+Ytmjlvvt6cOUtrF0/XzAnPaNLdg90e2P0fjbxM74y41GNKXaGVwy/RK75G2kv36Hh5 rj44Uqg8a/8Sx1yLSs2qYsdoXfc6cty8qjqk6pNVOllR5DjacvdJOVZvPnmfmru9FMxhgkXw 6SzHq85zjkR9NJMZ1YA8C+dUNHesqqXbAcOqJsOnex/nUJhT3xo2W62GvKSeHi9xwA13qEHH fuE7h1Pd/V/u5P93G3PoYvuX8PuRS9GtE3bHNsX/efr7jP9/7FFsTxXrtMGW2HZgL9BasAs+ Yb++aU7hl0JL4eeLuRSRUaF9rxnFuB70kY5GCHrKz4gt5FlCvp8ZFXMomPe2fuoLv8ytpL90 5y54n04em6qntVZ3b+/QznlZ5hR2GFsNW4jBJPkOSU5D5MWXcsr/IdjCsZFT2PV4LOuiLuE6 f5pHgW8XVrGee4j27qvqKThAPkTwg5oBsIAcPCZ+o50D170P816OE0V+4DOES9w7mjDFdWBy KWAUjOSemCKnmAeG2U/HPTNxDs7Ldwin4ncIg/gO62oovsOwvZaXvL8+Phf9UZDvRx9/HVxG xKYu8HjjfZxHku9xD5ctXKT0pcuVuWlL0E/kQhCbol8jficaKok7VVpbkc+33+2q6Hc2TrAp 6a8iN+RP0Fftp9XH9IlZdszcO2I+HTKb6N+PXAr8hSUZu7Uldbk2LFyiVOupscNHKCMjQ3/4 wx9UdrxGVR+f1m0332xGw94kXzLFNpp3T056J5cpdXHsXCvn7zU3p/D1oZ+Sviiw0fAKTtnf 5P3O9JNkNgXNVKu/8BUSu4JjcX3IpTAP8ZuRZ462gkfMgyaxrW/QsLHPjy+NaxADw0doG+zj 2CfFDIoaiVgVjIp9PgXdZE4ly75/fIjehz7vmKO/sPPk0MEleBR1FOujbmJ93Ma+rIdprON+ 0VFwiftLsZ5mTr8QsW8//IChv0Lnb+DrC3kU1lI821fVU3/J78d9ws2m9gXi+2vNO6jNyyR+ GLSk31sSN7Um8P9nz/Yt2pK+SllbN+hU6WqNH/kzzRxzk2p2ztMjV3VwzkN/Dbuyo+6+pKVW z3pZhRsXKXPLKmXvTFeuGZWXvUvFeXnK3ZOluYuX6MVXfqs3X35C86f+RrMfvd7jIg7yeB0/ 0Yphl7gf9B9q7egr9NqQy53zd637/8/QJ8f2q9gx1hJPpeVVyi8u10F/y8dOndaR6sM6WGn/ 34n9On6kQLlps/T2Cw/rIvdDAZPOM4vQVGcPmZzoJ8em0FmNzSOYBKcusI5qak11wQjnqns7 x9V7YJa+99hCtRk6QX2emq3BN96nhp2dQ+R316O7x+RxrKGT/9etbZvb26Z2tZ1l6tYZfeQY lf/7cAqbhK2oyynquNRb2Yb/h9+M/R05xbHfOKfMJxiFT++MlnJOBf36hT7Sv5WMMZ/iug72 MN4zz8lz0y8keoocil72A+Lr61XLKWJVX3DK/y98g/b5dbO+glMdzS0YE/xetjUwKuGU9Zr/ R/ifsM1fxin2g3Uc9zdxyrYYjiXHJhyIjINhf83vB6+x/bxryggdBTvC9+DvhvkZn6DLB37w /jkGvsFOrh3vnWeBU7CLZ8OXxbZQDrVMZtwQGMW6oOP8HfFtcU7qPmg1NFusU8AvtkddxRxe hjqTyx9O4fPD99fCdqxPz55BT91x660qzM4Reoocil0bNgmfH7rofesgWEVs6mBO0s8EOXxV XsfEupD7Z92UaC33NWsewSLmaCl8gKeJS1mboaWYSsy38vwCj7dYFPq7hVPvzHxbb70yXpOe fV55ti+BUyeOqeLjD3Xnbbe57F3GtWUI59FTzZ27Rv4c8Z3EP4Zvy5xyXL6F8/zIo2jbznGf Ov5A/H3Rx/dFfjpaDIZZb9M/Qm38Kq5Dg8Al2ION5zfcgkHkeKM/sPtwKeZ4o1miToE36KhE S2GziSkxDhU2OolbkYvOMuNbMe/ifHdiWHAM3pCbAKfQTNHXx3p4hGaCRyzDAzgFy4LPz9tg KGP7wiWYBUe5P9bBKfIo0Ihwit+so51v8P85F/SrcIr7+0t5FJFTF7i+DKeI5ZFrwru4yHUK mEx/6b0cR21hPXf9j6/Qjo3rgpYq2L1DB50jPm3WJC2aOV7rVszSvdf209h7b9Dz91+v54Zc pwVTRmv3mhnKzliisoI12l+4UbmZq5Sbscq+wKV6a1Gqxk+bqVeeH63UedOUNvFhPXvLIK0c +RMtGXaZx5f3mPJPuj/JYddp6lD7wFOn6xNrpaMV5tS+YlVWVqvcOUCHqqpV88EplVdXqeiQ x6yudG7r8SpVF2drzqsveVyOWk6ZOYFT1lPnmFVoq+Dre+xtnV/LpQa0+SWfwkyrby11rvMo vv3wPJ0zZpnaD3tN/Z+Zq8tveUCNOg8M3wTjxvRyPClwyvaonf/vXW1niU9178wYcondhj11 OUV9OfpisAnYKbQIdW/G+sF+YN/Y9k1ziv6S0FRoKDiFH5A4VWgz9S2PMf+dbweORRsYnwVO Yef62Y8VOGUfXy+P2/EFp2yP63LKjOoIp1x2X5lT/t/97Zzi2MTGf5meor0u2gV/GvYOvfKf 4RRtouACuonyI0eSd4u/j3cLs2A7+4S8Ce/Ht0L58Y1wLeJN+Bzx5SXtpMjrsG3B9vgZuCfm 2GDsMeOfkBvJmCDUf0Lsy9fjnFwrjifFu4rfJd8arOIb5F4jy8hJ7+pzM6bqpf0H+P4bBh2V 0qKlnhs7Vnmucxbm5CptcapyHDMqcR4eOXynzJeQT24dhH6CPfgA6b+PcTr4fcAxrLDO7UzQ T/j6aOeLDxAdBs9O7fd4Vc5Pj31UoKcOmGXEusiBz0pfp3dnz9OUF13XnTRZZWVl+vzzz3Xw g5OqtJ668/bbQ9lRjtRr2rh+TtmRH0deQhLHIdZRh1P4k5xP0d7jIjQP2gof3BexqKQdFfY6 YVTwP9luBk5ZU7Fv9BOS04d9TziV5M4FTVLLKfxlgUvej9+wC7YxhWNqOZXic5AfgWYK/Tx5 PWNQoQcZSws+wSv26eK2YdSjA9/MH2I9cCr284dvDw7Bqail4AHrmdgXfjElMTT3VUveuxkR +njyvbAMk2iv3MLXJs7GveMLhFOhve+5Hk/h78xLP8Mp96P0Z5xynaJ7t546v3FTDb5koHO6 vq+7br5Ru7Zs9JiaOaooK1LJgWxt3JZmP+Aa95cyV289N0wznh+ud954Wssmj9HOtDeVtc59 GL81Vr99/j5NemmEZrz+tJa8/VvNefN5TZkzX0v8jc16Y7y2rVup7EWv6En3Fbhg6CAtf/Qq 91s7OHBq5ojrNfX+qzRp7HD3oZKpCreJyMv3eAH+rvf7m9/ncdcOW1MdrKl2m4nDqqhyTuvJ Gv3Pj05o1dvui8L+PsbxZTzE2F6KfHTa/bIcx/ElL512vfRDwZi+HNfcDGv50EI1f2C+x7Ca rA5PzFe/B59TvRZ9bFO72X500ZWOPwx0PbV1u2Zqc7HrOd38X+hBvl/SNhI7NHjggFCXhUXE K0Id2sdgx7Eb1HGxDdiNgf36hn35je0P9XH/Jm5BXTvYLvw4ZiL1bWwd67Ex2CS2M8evxLFc j31Zx72wP785f2QktpR6PvGl6JOK85CLbk4RS0FDxX4TvlsvadeLzqK9L+dGP3Eu7oHjgz20 b4m4TMy/53m5X2wy98wyE/dIOWBTiXGxP1oADuGzwbZEW42mYKxb7DT2B12B7sA3xsTvoDW8 jePjcegQfif+vS+Ow6ZHnZbs7zqb2YDN55h4XLxeyCNw3Zj7QE8l+Q1+BvMi/mbOeemnlby4 1q4LtnU9lfxZtAn9O+A3Yz3tZ/s5/5w+iS72dbv5PEzsx/uiPCkX6je8M94F5Uv5oWGjX49v hPfNvnw7HIuGj++Sb4x3RK4O54nvJJS92Qij8AUST0VPBV+h2djd2qwT78H319vP1da26eoB gzRj/ERtXb5KJTt2qWT7Lo+J6Pb/2XmqNldqzJhPXJeES+irmENB3h/6Cb0UWYUPj9yKJL+i PBzDceROHNl3QJXedqy03G2s7APMt79vy04dztirmuxC5a7boqzV6zX83qG2LfN17P1TOv27 fzGjPlZJdbVuvuU2axjr+Z69g54JvjQ0jW0uGoa88YQb+P2SfsBDPjhs8T4wBz8g/kA0EvkS +PeYE3+CUWisoMP8u0vXnt7m8dydhxbyLjp0DLlvXK+r/S/BZ+byQ4NwPeI+2PzQVqr2muzD djjFNrQK+5JjQU4GugU+BF3jeQe/E+4ZDcOzsh/tcjkGHpE/FzmF3WcZ3QSTyJ+IORZsi+vZ H+0F/2A6Yw/jd4w8ZFzGxAdpvtrXR5stchAZo7GJ74Mxhhs3st/FEzqP5UZuA8z4jWGCrX5e +Ea+RRM4Z43b1FNjP29D8445fSTFnI3ASr87nhvG8mxoQO61f78++pZt0iMjhmvr5o0q3Vek grxsVR0sdv7fDpUVOwfQ05oNS5W+PlWbd29S+rbVmj5/hja73dTCmZM05uG79OyvB+rF2y7T pJ910Jx7BujdObOUPn+OFk+Z6tygvVozbYpG/eoGTb//Or12++UeO+oabX/2OjOrn1Kd97d4 3K3KmP+kPqx2HyxlO5RVlq99VeU6eqLCWsq66oj7W65y23Uvf/helY4fLVNR9s7QL1JDx6Hg Twv7AFs7/kTbXvqiYA6nmBh/njZVsIvx5mkXDKdamFMXDZ2rhvdOUuvHZqnvA8+qXuv+gVMd 2nq8RP+fA6fa+7uEU11dr+1Bvh/11yRmfekl/RO7YT5QT40MwiZ87Zzy9bBDcAROwiim4KMz CyJT4BQTeXrYNeIpsT0vLIJPaIEYq4JT5571/bCevD/OiX2DndhI5sHv9yecwvbV5VQsC+4n sNO2N+ZJc89wA5v/Z5zytxm58fVyKonzcB/EiqL/CN7BTxgGr6I2Q3dFfoVxSPwNoD1a2SaQ Nwt/utsHSayHsQY7+jy9fA7ajLOOWDD5313MyPaOWcBqyowygT+wnLJizrdDGYV6jjU4HII1 8Id3zntgX94x+1DufH+ch31gVfzNNVhmHxgF89D19ANHPZx7Jtevj3PkutgW/uqqn2j5rDlK n7dQeZu2hvZS9Ll3NLcg9O1Xbv/cSbMGbYR/Dz2V9EuxLzDqi34p8oNuglGnDh8N+epxHEX0 VqX1VLV1VrV5dbTQ44PszdeBnXtUvm23ijdsU87aTdq1ao1GPTRC76au0HunP9LHv/9D4FTB 0aMJp2wPe/bqYyYRf28b/G6xzVIYm9DPFWyfbT36B5tPzOXPOGUOBU7Ztxc4ZQ1FjiA+wGa2 p/zu3Jn+aDqaJf4P2RfIOeAM16XPWeJQ+Pew0YFH6CDbcWwwvj6uy72wHYbib2Mb94SWCZyy bmEdx3Mu1oe2tuYDfGMfdBDPgj8PLsEi/H7M6fsh8oh3y7o4wa4Yn4JT5GbAoGbu+zXF95Ti 88Md1rWCp76vZNx79/PnfekTFh4FTvl+Gvs3nGtqLsEs1tflVBhb0dvOt8/uIv9PLvR9Nzaz GsI1l9uF7iMYhsMyct1TXI6tXH+DT3CK+4Wv/V2/h1PPjH1Ke7N2q6ggTwXWM9WHSlSck6H9 +/Zof8kerd+8IrBqw671StucphkLZip9c7rWr5rndsFTNPG+a/T0rwbojZu7afw/t9WMl8fZ l7dIK6fP8FgymcpYNFejb/q5Jt7yQ22Z8Ii2P3ed1jinYuVjA7RkeG9NGfFjLXvlTr1fka19 OWu1t6xAJZXlzqE4Gjh1+KhzYOtw6uP3KlVxoDBhkONQzRx3ajNmodo+scismq9Wj89XipdD n0pmE/1W0OYXfkWt1dxcazlskS4cOlfn3j3efaq/rt5Dzan2g623Pfaz9dRl/j8PtE1I6eB+ tTzBqbbmFDaHujS2d2D/RCPhd+H/j85BUxEj+Lo5hc3hWjAKmxd5FX1A8AUuwSgYRAwlcgo2 sS5qqjCWr31+5zdsEPx9jEfF8cSvOrjuTh4jfMIGch2WmVhmwobW5RTLlAV2lOOZs1/gFPrQ 6+ATdh8uRF3EMoyCG3+3nvJ3H/VUyPe2bcC/F/SUNQ8cwi9IvkKisZJ8usApc4b2TfH+YBn3 wzLH9e/TN7Cmle0KnKLeQntZdFRglL8P/Or0bUK/L4yZi2ahH72kjpN8P7AFnRQ1EjwJ+tnl Q3nDmqCRavVVYJjLEVbxfihntsOgoJ1qGce3xzk5H2Ue+OR9ODcT523vcg/PQzzM+mNw774e M6GtJj3znLatelcrHRvKcrtedBR56KHPWP/eb2YxHgf6iRgVPjzyJMjTg1msg1+sJ25Fnh9M wydIf0lsw194zH6TY4cqAqfKc3xsjvu0LXB+uvXU3rR12pO+QZs9TuKzo59y/tRWnfr0M336 x381pz5yXbZMv77l1mD3ezq/nv7HQ96d7x99A0OYp7iOHrmBBgmcsj1me9RMzYP/D3aR12dd E/L6kna95FcQ20JvXey+UeFU7K8CLmGLYU8Yp8PXirncrOPasIa8bpgEe7gX1nN9tjGxL7mA MIjlyDX2Rz9xTmw58xR/VzxH5BRMinl9MAhOYd+x9XAqxqxYZn30+7EvfMKfiL8xxLt8b/yO 7YrRVzCIZXyNjc2mhg0aBY3F78Ap7x/HGMZHCauY84zEudBUF3jezPd+oe+7icsrcKq2TCiX 2B9765BvQhzR/iszmDm86ms/AZyaOvlVle8vVW52looK81RRvs+c2uMc8yyVFmVp4+Z3tGbd Mq3e9K6WrU7VtNlvaPGKhcrcsEwH87dr7uhf66mf9VLqg5fqlaubafTIB7V29VItXzxfe3Zu U8HW9Xrx0Yc8Vsg1+nhvmra98EstGnqJ0kb9SOljrtSUoVdq8v1X6ETRTu3fuVrZ+923f4Xz KGrg1BEdrrQfwfOTJ6r0/ns1+vjUcR1zXgXa6MIRs9TaXGr75KLAqlbOAWzpiXUtralgFjqL 5dDnn+NV9AUIp1JGLFGzB+er/j0TdN69ExNOdb3SNrKzbWUn/dD/5YGui7bt6Pq99VSrLq53 1+EUdgH/HryK9V6YwXpsz9fNKbgY9Q02DVYxwQfugXVop8Akx6KY47tDS8EofIHopZBDUZuL jo467+yzwnGcAz8U9Xb0Ic8W42v4qXh27CD8wfaxP/YSRmMHg55y2UResR/3HO0wPAgc8H8v cgodQyzmH8EptBi+O/x+nB/OwJvoN4Q3xKfiPUS/HvtwDIyj7S88RVPFdkz4AOEb+bKtzal2 5ir9ONBmnrzurmYZPKLvcZjV2ddNNBY6nPKwXvN54QtlRZlQxrCbege/qU8why/4Ufm+4FLk FNtgP98Z7wFeUT/heOoLlD3vn7Imhkp9ivPwDsI+vFvfdzfKx/dCvWuQcykYY75op3PC120M emrnO6tVlrFbJx1TOmXtg8/vSF6hY8RJ30f474L/z8zC18eELxAuxb6SWAfH2Jf+KmgLjMaq 8nSo2H2sezqUV6STRW4LXGZfvzmVv8Za6p01Sps1TxPHvaxSb//od/+iz/71c1V8dFpbcnOC nkKndLffD07EPABYgM2PTMC2wxT2xdajS2BYa7fXgT9ncv6soWAUvKqbn97C+RbEq8hNh1NJ PCvJQ0fbwBni/3AStoTJ3zB5FYFTtt1BI3m/wE+vZx+ODezxMv0psY11aDDWx/4uWnhfjg/x sKA5eJZET0VORf2BvoJBcAmNxW/2iRP2P8SmzAD4A2PQSuRtkHvIOjQV2ir6AWEXnGpEjl/9 BoFX6Ce0FfE0jsEniL8wcMps4llgED7Mpv6PNOd5Xf7nexm/XyOYZv8p28OYIi4jtFQLPxf3 io7iGYixdff/45+++x2lLl6o6sqjytq9S6UlbsNQWqSiHGvv/EwV5e3Spi1pejd9iZa+u0Tz ls7VjDnTtMScyliXqg+OFmrFuCEafX03rXj4Rxp/XUuNHvWQtmxM05q0FcrYukmHnAu4YMoE TRtxkz7NWa1Vj12pJQ8O0urRl2vD01c77/1nIUe9KneL46oe1/qA+6A8ckD7HY8qN6sqqo+q 8pjbUcGpk9X2/dXoZM2RoJcCb8YsCIyCT/jzmtnHx9TuycVq/9QSM2yx4BdMw/fHHI3V5rGl ajVisfumneK+/8arz0Mvql7f611Wroe4n79LbDMvsc1p29nf9cWuUzl/Ak7R10xHfy9BH9iO YB9CPdg2G9vAeurJXzunzIRg08we7BrXhkPB3tmuwSjWo6PQRXAKjrGe/AnWwyliUCF/ov45 Ic+Pddg5noP94Q+2EE4Fm+rnxb7iCwycct2deWC1/VNsg2dxW/RRcb7AKe+LzSWXD19bzPmj nS8MgFGRJX+P36+tbVPCKetcf+9cK3IK7nA9OJXkKiQ+yJijTs4d2/H1wbfk2CTu1c7nhV3N /X/DfweLEj+fGeNn4je6Cn1Fzjf7ELOCXzAKPYXGwnca+GLmUEZMlHGoa5hBIefBHIL9kUsw iPeBpqV8YR2sYh37UMZ8d5Qv50NLEUuEVZQ9+/GewvvyPcFhvuf+ZlSz8xpq+N33Bl1EP34Z aenaYU7lbNzi/7DHP6zVVCH/PMf1WefooZ3IkcCfB5uqzaugn5wzwXpy0tFUaC3iWDANVn1U 4TZQJftVuNtjg9jnx3S82H1bWE8Vbtyu4s07tG3las2f/Kbemvy6TliHEZv67I+f6+iHHyp9 5w7dfsddwa53sc8NTqFJIifgFL+TfLxEV6Gl0CKsp75PXlmSF5HkTKCv4FPi00tYhb+PvAm2 sT+cgmWwDfbBwsBD2+XIydgeiRgZfi18WrAn8rOVj4Ff3E+IVdUey73CIuJP3CN9roc2xL4O 980Un4dzY8vRHPj1ov6I3MLGwyPmsAudxcQxMI08PNhDbIr8jNAey8+Jfmrq+w1+P1+PZXIQ YRmcqn/ueUFHoaVY5hxM6DKYB6c4nvKPnCI21cLca24OXWBm4fMjPpVs97K1GXkbPHNz/IO1 vky0IP1rtHO9u5HjEls2bVClcxjgFLrqQHGJOZWrArMqf2+mtm9fr/T05VqyfKHmLpqtZcsW aPMWt8Fbu9h9HltvTRqmsTd004K7e2r81U311AsjtH7bSq3ZvFpbMzcrPztTq5Yt0uTR97h9 8BN6/e6B2jn5QW18/ibN99i9sx+9UbMe+ZU+LXPe6eFi5ZbvV77z+/Y5d+JATZWOHqtRxfFj qjnhPHX37XXyvRPOpzgWWNTq8Xn28S0IHIJZcIpYFP3Ptnliodo/vUTtnloctBX9p0dOBR32 yBK1GbnM55nuvtQnaOBj4/X9H94UONU6xbm7/h9fYrvZvqu/X3OqRV1O+VvDJvB/hwvYZewD XOD3fwWnuA6MDPGmWiZxfWwYNgrdFLlEbh/6CfsFz8jtY5lcP8aZwv+HliIfne3RnrE/2gg7 d4ZTtofUzbGz1Nd5bsqCejq2Fa0V4ik+ju1RI7DfGU65zGJeNnP8cnGcQPiCH+7v9fvBOzhF Lt2fc8qayXaAHG/mbEdXwa+6ufCxbQ72HJ9him1CS//vWvv/lOIJndTXudxwJ/iCvU9v+/sG 9esffH2sI3aFvkJzwSjiU73NMBhC+fLOog5imXfKNvjDO4ZNbIcvvBfeLVoKrRXKs7aM2UZ5 sz/fJBqYd8G3yHqOY4r1hb7O76DvCfpPGtS3n86p920tmztPafMWKHPNepXu2qO8ze67aNtO HXBOOjqKceLhETnqjH0Ie2AT/fbFuBS+v8T/l/RLC8Pw9dH3bJXzKhINdkDHDh51X225Ok6c quSAqgvMq+xC5VhLlVtTwanpL0/Ugllz9fuPP9OHn/0u+P3g1IpNmzTk/geCTceeM9ZTR9ct 0DbYcPIU0BzY9bp9G8EA9Amcog1UwqqEU2grNFZgVa2uam6fICxjP9gEp8j9w/cHYwKbbAu4 Lj46rpdoH/ezYPvNRK4cXIpMYl98YuR9ENsKGsvfCctovpgPAns5hv1hXKKnrJN9neC/9LcI hyJ7+M2Eb6/uPGqqyCmYRt8QsAetBKfQUiw3aezcKWujmGMBd+AQ+zRq2CRwCj7BqYZwysew Lca1AqfMK8oFn2hgtP8vLX3/TMSo8P018fMnZZOMHYxvtKXfWzPvGxhqHQin0ITNbLs6+Zsm LrW/tER5OVk6eKBMB/e5n62CwjOc2r17qzZsSFPqikVasGSuVq1aYnZtdG76In+/67Vh4kN6 5dZLNOf2rpp47UUa9bT9fluXa6P5lpXvuFd+ljJ3btbK15/TSw/9WotHXq9/y12iklmPasbd /TR5yDVKf2W4/vfxw/psf77yDh5Q7kG3pzp8yHqqSlXuc7LyxPEznIJRx0/U2KcHoxbW5k/M ce7EnBCfIhYFkwKL7PMjboXWSvqnnR3WE7u6aNh8tXl8mVqNmet2wa9p8JNTde4195j73ZTS vo96uaz7+Vtp3/VitXK73hbORW/Xw3172sfSyTaQ/zu6Ay7EuirMCL4a13Oxy1FjsN8/Ot8P fmCv4BH+ucgreML1WM+9wZ0Yn2J/tpM/Qf/o6Cra8RKfOut73w19+kW2YOuYeB7uHebBH86N ZoJd0S7yrNhA7Cq2EQ1A+WAzgxbAF+nf0a5yHwmL0FMxNxs95faU/h/9ad7e35Lv19b/e9gH p/DZBdZ4jh6COSE2YxvNuSPH8A9yfTQWWiu2zYKZ3FMr27mW2AL/hxJfnzWZfWXwCv8Z4zf1 tTZhwt/HPsmUxKXIrQt6y5yK5UIZwybKjzKiDNFJzClrJnQXZc1+HEf5sk/QReYX5c/vWL9g mfcD61jPuSPr+CZZJr+D8eZ7+fm7ujyuGjBQa1KXadrLv9V266jyrBxP2apw/vkR6yHYdNx5 5qccZyo3o9BI5EPAK9gDq5K8CveJZH7BJNYRl0JbobPQYvCK7aerT7hdb5lOVx5zvxbOZd/t fOO8YuVtdG7h3nxtS1ujyS+85PjBUv2v//5vZ+JTVR99pGXr12vEI4+FOjh8wKZ3cVsSbD62 HZ8ZPjQ4kIxL6PZF5hPrsPHwJPj2zJ8zmgqNVKupgm5ybh+5gDAKpvGb9Z06dTN3bONto7l2 whfn59I/bNARSW4EbIKVsBHtgF1GS8Gd+Bv/Y0pgVKKZAkO9jvOiD2Ec9xt9gmg4tvEc2HEY hD7CP8Yy2gpuwam4DJf4Hf1pLId+zX1/9KEHh+ASrIE/aCjGF4E55Pcl2802/0ZPwSt8fg0b NA65GBwb41qRU9wjufih7ZXZ08rvoZWf8yKXB5rqglA2fh+O/SX9MjnOVsspcu0jc8lZbNK4 ka668grVVFUox7GpkqKCoKf2W3/vc90mLytLObt3KycrQ1s3rdXyFYuVmrpA69es0qb172r3 6gXu22SB5tlvN+muS7X4vl6a/M+OTz12i/ZmrtSOnetUVLxHhfk5ys/dq5zN7+jtSS9oyYtD 9LvCdG1781HNfPSnevaOH2vFxFH6/KRzU4v3qsDfdq7/DwX2GRxwXnrl+x+o4uT7qjgBr04G bYXG+iJ3YkHI98O3h3ZCR+HXox915oFlj88P+5AXSHyKHMEmQ+37G7VMbZ9e6PZXU3XFM153 w4Nq2aanOnQeoJ7+5vq7XV37bvZJwymP59GuZ8Kpjrb12OEOtjHYb+q/2AhYgW3Ajn/tnLLt IvYDowKnzKWoobBl/Ob+4BJMSmmRxJqos8MpNBYTnML3R39+9c/+Qbh/bGP0IaKdBg3oF3iH 7eTc/yGnfExdTmEL2ZfrwUvKB/sKX1kffXvYfzQM2ucfySniXPjuAqdgRq1eQq/ht8OXR4wq cgqfH/fBdjhFTh/HxjbH6DN0FKziN0wiHhVyI3xc4svrGxhF/Cn082AGsJ5ltBXsYhwN9BTf Dd8Q/KGMeFfUA+AP5QRPeHeUFZqIcot1EHx50d9HOdflGMvUB9jOetgHq/hGWeZa+IHxRV5+ 6WB19POeX/88TX3pFU2f+Krm2c+2cekK5XvsXlh10v9FWFWwIyP0y/ehfXaHvXzMGok8P/qk wJ9HjgSxJ9pDBSZZV6G9Qtspz8m7IHZFfgU+ww+rjqvSOemnK4753Jkea36b+2Syz39rRuDU jtXr3b53nNKWr9L/+z//N3CK+FTNJ59o6bp1enzME0FnYBPRUt1dN0jaifrbch2TvlXRIWxn GZ58wam2gVOhzz6z6d/FqULfFOSJmwfmUeCU/YHk+dG+iry/i/wbnx4MhCMwCVZyraidAkuw 4eZZyCewPwytxz2FOVrK3yHajnPE/dF/F8M8z7HhcA5O8TywlmcJ/DKj4BT+PfxjMAotFX2A sAlmsS2uYzlyiry+mCdB7h++O/jDnPZncAluMQZUiu+5CX0lOT6FnoJV5FSQE5hi7sKyEKfy /aInKQfaW3H/+P1a+Rlb+xma+fnJT28KZx3zg8uxbOAUZQen8GcywanGjRro5l/fqI9Pn1Jm xo6gqQ6U7VNpofsrd70mZ3em9u7KUDac2rxWy5YvUurSBdq7e3tg1d61i7R+4et64Zc99Zub +miJOTX+mvM1ZuStOrBvi3ZmrFdO7g7t2Z2h3bt2qLJwl7LWL9eMx29S5rxxHgfYuekv3K7n 77paC8cN0+9r/E0fKFDhoSPK8X8g3997ec1xVbmtb+V7X3Cq+j238ztxXCnWSvj8mEKenzmF lmKCWbSlQjc1dDtgxkskZtWmNicQrdXgvpkeU9H9KNnv1/75VA0eO01t7h6rpim91KxtH3VO Mae69lY790HRzH3SEZ9q5/hUL9vb7rbJ2F10ATYAG4JtxyagP7A3bI+aizm2HTuBzcb2cGwH 2ybWYVeoK7PMebBh2KRoW/ANYV+wQewTtvk6aCXYyLrIqlA39zmIR8Exjo2/2RZ1F9xCZ9F2 ija99c/6QfAFxvp2YIzPSxwq3J/vGfsJi3g+YlYs88w8K8dRZ+d5sLWs4555zsgsjuVc3D8+ NliFvoEFMCX64NBCrGdC48CNkO/g3+gw9A8aB14QQ2L8qng+GBQ1GcfBmuRY8iGSCTailZKx eRMNx/FBN9Wen2MCp3x+2NTMfvPWrg9yfvajbRQs6uD90VN9rL/I8Qt5Cb5PGBYY5Wej7RQ5 fwOcmwajiFlRJlHjhDJ0OQZu+XuCXdRzWB/KlbL1xHbKkG+M9xPK299e/N4oa8r3skEDw77s w3vgO+I4tnNMyKnw8/bCvtsmnfud72q/c/AWvPGW1i5yLHr6TBXv3BXiUpEtbGecKPrge98a CQYxPiLtdtFJ8IdlxptCR7GM/w+NRf8T8Ip17P+x21+dsN+vZI/79izy2L17iX+Vu78kty02 s4p27tG2NRs04blxtk2Z+m9//P+knXl4V9XV733bvn1VJkGFkABhCIEACTOitra33ra+2lat 9nV4KgK1gkhRnFDrBFZlEAVknucxBEgIITMhCQlDCIGQhIQZAS21VXt7n/vfut/POtkx+vS+ 9D7+cZ7z+52zz3zO+uzv2muv/YVd+fLv3kZV9/HHtiZtm014ZqLrF9iE3w/7TT8m/GNu+2UD 0R+RdmqMT5ctRON4W480EjETTLAIv15co58v5PRr3x49o29IZdBTxKn3Eqdot4It+Onch9jI mhD7AEcCfzw23f1c6KtoG46ProJTMKiJU1qGJoN/nHtorwr+S/QX27lmRN+LTUyBVTAIVsXr u2AZdj4wDG6hvVhHGxBsch1FPIO0E3yCTfSZ6iouwaTIJ6j2NLGHdS1btHJN5UwTr9BgIb6d mHTKwVK/Js3xb+Lr66br6abvyGMp8IPqObj/UmWIpcA/SNsUrEJL4aMM/ssOqlO/9sdXFZtw 0tumqtUmRP+pcjFqn2JESwoVH5qbp/x9WZazK902b1pnS5cssKyMNNu5PdV2rJhtz496wF6+ r7+9O+KHNu2+rjb13i72p6d+ZcdzVtiRPZnyZxdbYVa2+hFnSuOTv6vElkg7PXmfctqO/h/2 4Uu/sRl/HGXTXnncao6WWH1NuZVVHlMu2irlUapW7iTGmjlr1aeYTuv3Gc3lL9CELqKfFLF8 cAkOhfYnYtVpq+qg+D7iAhmDPuLUUuca61uNmKV49IXW+vczLO65ReLULEsY+arFiFGdEoZY YieNg5gkH77G9otVPoVOveRLU1/fZNphZGP4/rH7gVNuExo55fZb678Vp8Qz7As2q4lT4g+2 P/ga4VRY55wSszgPJjiEXUIX0RbFubKc8rAKRtEuhYZi/I7WLa7zslyPX5vKwj/nUSNHuS6Y jF2k/cPtY3NOyZayHiZjY9meY2Ib4S/luSauAV8cvAi6Cm4wwQFi01keaR/iAr/OqcCKiFOR LoJBMOxf5ZT79sQMeIT2Yjv2EY01oroI3JQdh5OMxxerOCSOh/+QbT2uT99f8Pehr+hbh2ZC qzTXWiyn3QpGoac8Rp170sgqmMR9Y+L+O5O0zPmu58bc6zON9QTKcA+5x2zLPaYMugutxfi9 PEPKhefJf/YP41xrcR265ljl8/v1XXdblfx421avVUz6Ro3du8XKs6Rr9pY6j7zvrlhUubfE x92tkTY6JZ0Fq9BJ5KNFW8E0ysKk4AOs03a0XYVlbIP2OqbYicPFxAFWWe2Bw+JUpcZIlO9l F/nSd9u2dZts+ptvW8WBQ/bl51/a5c/+6prqyMmTtrpRT1Fvhw1wit99xSnsOFqEujq/8f1h 57H72FBnRVykk0LMxDc5FcWoy+8m3QSn8BGirZgnyu8X+QqjfbH/wKTAGHQBx3atJTsNq9Bf aCaOz7mhq7DnnFvEr4iv7OOb8RPsn2ti3tRm1aidYE+Y4BQcwsbDJybWBZ6F9TALLRT8fcQ+ 4LsjphzesLy14mrQSZQjfxH9p2AXrIJraC00VOAUy+AWcXtcF9cEp+g71VXn3k3PB07h9wuc 4lrwiTJxrzzmTxoRTnGunGdsxxibN/cja1Ce/Py8HDuq+IV9JXvFqQPOKfLKFuXly4e323Kz MmzL5vW2bOlCS0/bbDtSN1rGqo/s6UfutlfuH2CTpKmW/m6wTb+vq435xUCrzFgo3/VOqyvP V+5AbS9OHS4uUD9ejXm4dqa98rtf2Nvj/tM2z3rWFkydYG8//6gzqmK/+r5rTJoyta0ePFZj xxpg01k7dvK0plNf4xT8gUX4+Yg9h1H062V5+7FzvE2KWHRiKhg/EU7hA8RfCN9aPj5L+dOX 2PdHvmdtnvrQbpk0x3qNmWLtewy1jj2HW9eO0g+95EvQdx0rmwKnOktTJcv295c9DpzCflBX dT0lW4CtoE7L+m/DKWw8+2EfwQeHPYJRrOOY6C5fJ5sFp+BWsG2wiPIsYx3L4YVzSj5BfH/E UPzH977jY0wxhi/6i/0G28dxAqdgHpzhegOLmIf6PteL3QwMYx+h/k6ZJk7pfrIcTQIDwhhU 2H58cPAiXnXeiFNisr4zWBJpoqj9iO3gHLoL/x0x5JGeirQWvGK7/05PsY44CvQYOTCI5XBO aTt8gKzjmLRFxei7oV2K9bDL2610nrCKvrzE94X+ssSeR3knertu6qn9wShy6LEchsE0ngdT Ez/E76BPw31jDo+4f7wLzhfdc+4lz4b7z/vBe0CZ4UMG261Dh/gzZL9sQ5moXiB/rdoOXR+j g2XzhmLXVU9+4pFHbbrGzM1JTZOmkR9le7rt2ZauMQsL5OuTJhJbatUGxTiGB6SrylWHhT3E SBBjjp4i/px2Ksb0CG1SdY3LiQuEXzCK7Yj325edb0fVLkVcOrEU9KE6qPi/XI03n7Fhi61d utLmzPjAzp//2P6u9iniKJj2V1fb6q1b7cVJLytHRD/XH66ndF/pb+vaQ7YeFuDro00IJjBh F10HiVOhLaq5nop1PSV+iEfk8+M/nKJs8AESR8F69ostZh44hX1GC6GX0G0cK2KVbK90A/bY 4zvYRu9bxJ3IN8i5oQnhFExlcqZpH+goeAwTA6fw+dEuhWaCRbCJebDv9J9qzijWM7Ge7dBK 8AjWEPcXr+M7q8QbfH1t5NdDHwX/IBqK2Ak4hX+QPlRsSywFZWAcfbLgM/cBLejtcprH65ri df4xOiZ+P/x/3RMUnynfH0z39jptF8/16XtD73Ge8LWb3v/s3busSnzC74fPj5iK/XrfylQ3 2lekNqWCPCvKz7b87J2WumWDLV+22DasW2U7tm2xDPXzfXX8SJvwyxR77v5BtmTcD+2t+7rb sz9PsvRp42zz7HfUFyJN+ZcKpeG3WX5mpp2urbHKwlR7bvS99tLIH6vPxEaN3bnC3phwr8ag yrL6Y4q7OHjYDundr1Kd64QYVQun6k9aVYPGRzstXkn/MTGeLzqq50urPP6cOIkblLuP6Sat g13EWqCdYBV+QPyDsIrtbnxScRfK7/f9URq36onpNlycSvnDVItNvNU69BimcblkB3oqV4rs apzsL5yK1fiI/WQfBvaK/DFwALuMfeE3tgJOUWf9tpzCRgW7FTjFMnxmruOks7BPTCyDRcw5 B8o5s2TPWE9bFcvhCJwKsX5tWlzvjPreNco527aN2004FfRPE6d0fYFh1M+Db485ZX3fjZzi nGEb9pN7Evjl90r75v5gn+EK8QzwhHYheBHaimADnELnMIdFEae+8unBDHRXxCn5wcQ99sV+ o33+a5xiv+yHcwnsZJ/4IdkPOgqfH+eCroNT3tdKx8HfB4OcU2Is/j1izyNdJT3UyDJ0FOW8 3YrtKKs6AfeN+837ErQz95Pny3ommISmZn2ot/i7pnK8e0zcY+bETqBlWc82XufQc2AfPA/8 fbCO34Nl02NuaGt3DFYOGeXwW0i71Jp1HutXp1iHou0Ztk+xfocUP0FOc8bbPaHpSJnaqjQm Im1Q+PfINYG/j/+0U8EjWET8Of/x9aGzYBUcg2vkUi+Rf69OGupIcZnVKd6vPEf9NQuKnVOp K9faojnzbPmCxfblF3/XpDgKMYp8FCWHK21Vaqq9ofa0gYOGuE30fr6yjcQeuH4SB5xTjaxy TunZwBSWwxHapIiPgFPM4RFcCsvpLwWfWI4/EL8f/+kLzDrYAXOwyzDHY8W1zNvCdAzsL4xi PTYb35b7t7QN8YiupXQ+sCj4KsmTBI8CyyLW4h/Ud6vlnH9gL+03sKiP2nXhUYipCL+T5O+O l7YKsX/8xu5j/8lF0ln9wpxTOk80Uw8xkv+hzQoWwR7apdBKsAw2tbi+pbWR1sIPiH4ibh2G eQy7yvj9UB0I/Qin6ONL21SIo2gvfdWR7zpB/nRdD9fOfeqqe9hN3wssJeaDOec+UPkEao5r DI1SjVGYm20Vypt0cH9ZI6f0Lu4tUv5zxVEU5FhBTqalpW6ylSuWqL/VYrVXKZZvxzpbPXeq PfnTXvb26Dtt2sN97Y1fdbPXH2Ss3h/ZxId/YetnTrYtq9dZvtpkD5YoN+Vh9QcsTbf3Jj1h T//XUKsrXqO+7VvspSfvsj3Za+zsiWIrkw+gQu95tXx+DWcveNtUleIpKus1zkczTpFbAp8f nEp4caW01QL375HDj3xKziSxyuP/5COkTQodRd9f+gDHTlhu3SdtsOuffN+nIS/NsUEvzLL4 5J/YDV0GKxYOf1WKxatOGvs1TinnlPKuui2XvcV+MAXbgR0I7TPYg2Aj/n/bp9gO24MtgznY LLgBd1gHcwKjAqdYz/Lm5dgWbcVyzqfJ56fcqfj8vneN8vl999/cB8ix4FCwj+wH5nAe/IZL 7IMyXON/yyn8Vo3niR2FnZSHU/xHEwX9QjsU+gidAitoD0IToXPwtbEMnlD+K3+gbIzWo32I wQiciubSafp2r6anov5TUfsU28GnMFYh7ISXcbIHtEtxfuwvOg/50MQaeMQcfYQ/L+Sb8Bh0 bU8bFv2ogq+P8uipBF0v99Pvo9jh7wY6CY2le+bPnOes/+ihoIvQqDxHJsrwLHj3eEbkB3GO UUb3l/oCZXhPWc7z4ni8p0xDFR93nZ79C2PHWW7adls7b6Gt+Wi+4sE32iVxpEq6qVLxfgfE pMN7FIuHJlI7U53ybh5WPHCllqGj6CMVaaUj3vZUp2XNx6WCS8Rc0FZFrB+/ibcgxu/CcY3b XVisuAzFT+Qo/400VXFOvvJfb7T335tu61ettS///g+78hf5/NBTf75iRQcP2rING23Kn96x YcNvc18ePj90FPYcTrjukM3F/sGPYDsp4/EUbhvlE2zGKdqcnFOaE58Ov5jgFoyKo79vI9sS lAeQ48AY9tfEKe0fPcXxm3xZsKiRU8TAcU5sC6ew0669tJ5zJ8YePYW+gK2cN3PKu87S/066 LvYPl+BNX+l52BM4RbsUmgSGBVvPHH4xZz0MC34/fHvx2i/jBMfrWPDG9ZHYBJ+Im6DNCh7B puvFKfx//KbPFJqKbYhnR4/5+Wl/tDvRToevj3i/OL3zxPuRlyJW6xnDI1x/pCVVv9S9g6cw mGvA//eLe/7Tzp874z6/QummgxorsbJCOZPKyhRLrngG+elK9uQa43YwxlTa1s2K91tqK1Yu ty2pm21/UZZtWbPIRt+dYpNG3KnxqbrYa79R7qSRP7TXHhlmI395h018/D7F/z2rcT9K7ONz F2x35i47WphmxGBMHvVjW/DyQ5Yx5xmbMvIOy1022S7tT7UKfQ9HVU87UX/Szpw7byfOSkOd qPMY9WrXUopjVWw6Gol4vihPkngk9sAuGNVyxDT/H3JRRG1XKi/NhS+QeaeJq6zrC2utzXht o2nwi7Nt+B8XWN9bf2Wt4gZIc8jOilOdZVtj9d137q06l2L+khVTMUy5v11HyAZgd5mac8rb Z7TNt+EU+8dGYasCp/D58Rv748tly1jmnIqL9Xo4x8TPA8M4p+Dnw8YxobvoP8VYiC2v/Q/7 9+8on5/mxAS6DdR5s0/sJbzC/jmntE/q6M477SfYVreFOh9sI+soS9sVvzk+c8pwTm5X0Zpa Bm9gVaSb5HfT7xC3AB/gTLzqf/GyM/AJDeOc0vuOtqE86+HLV5ySPxAOaN3VOAVvotjzqA0K Pce+umn/MLIz8VWqz3F8lsOoUIZj4O+jbQo2Rbn95A/UOcIoWEQMOowiRt3j/VRXREfRf6qr ro/ni95xjaP3h3vD/eK5us9U9x6u8G6ht1jm3Nd9hvdoLvbBOvJNNO/P5tpLnAr1BJ4HU9O7 pDpDimx7tw4xtvD9D2zph7M9J/n896ZZxup1RpxfA7F54gqM2p9bYBXFGsNDuunE0WN2TG1S jDNF3B7tVGf0vRI/gY5COxGrjtY6J62F3iIGMOKUfIPoMJVtkH+fWL9y8emQ4inKc5UPJ2+P 7dextysufsrrb1n61u32mfr2ftLo8zuheKpC9e9csm6dvTt1mt3+gztUH1edxtkEW/RdqG7A f+wlHHHtpPeFdc4G2Uivw7uPT9vIh0fcX8QpeBT5+WAYeWnRUMShMw9xgfj+0G7ul9Nx0FZx 8AOm6NnTvhR8fHAscAo9FTgFa/DtBZZ6O1tjbDtajPXsj32jPeAU+4o4pXef+pveYXgEp7Dr sAifHv+ZUwYNxRw+hfVs5/HmuhceKyG+wqkujX193Rco/oR4icApNNb117Vwn2CIYadti7Yr JjSXX4/uu8f66X+svh/6+eLr66Bnhe8PZsFl+MQ9hFfUNRL0PXGuQU/Rz+vZZyZY/Yk6271r p5UUF4lPpd5/ar/qSmWlpc6p4kJxak8jp9IiTq1bv1Yx6sqZpLxKa5bMVjzEz23ET/vYKw8k 2cLn7rK1k0fYB0/fZS898Rub8uwoGzfmaduRtsOqVe/alb5TeS23WG1Jhi3546P22m9vtyWv PmRvj/qRzX3pUTu9Z63G9KiyY8cUGyQNdVox6XCqul5jfdQrHvZUxCjnlGL58P2RZxb2EP8H s4jxayVOwSL0FsvhGVxj8v6+mrcfrzatp5dY2wnKU/H8Iuv/3If2w8nLbfhdI6xlp4Gy/Yrn 6tFfbVWKA9Uz75IUsWqAxk4arrGX+Oaxv+gnpmBjqLfSDoDd/jacYnvnlHgBc9yXpzk+wMAA +BSYRNwE5wBLnGdwSrYM/QSb2AZbh8+P+Anao+gzRfvUDa1aOM9Yz3ETVNf/JqfYJ3bTeaQy V4uj4N5wfI4bmMoybCjL8LWFOPDApSg2XfU6fVtNnFIdjDYrOOVtUrzjeufZ9pucQgsRO0j5 q3EK9pDDL4rdwO8Y8Y0xM5jw93FeUTlxRHVXOMl/zjPE9uHbg0uulfSd0WZFDAXtVegofrMM VgV+oafgT9BJ3FfeFe4L95f7BIvQRHAInrEOLjEPOpb11Bd459gX5VjGxP54F4KWYs62vCNM ybJ/+PwWiVP5ao8qzdytOL+5lrpkucekMw5Ug3h0vPyAa6qS3HyrlG2o0fdZJ1YxdnzI30fM BHESUVwfrDoU8UvcgldRXKBiJVQHxRdIO9UJxaSTJ935JEYdUsxf3vadVq4+WdvVPvXGq6/L l1NkfxGnrnz2V7ukqaL6uBUfqrAVGzfarDkf2U9/dpfbbfK1ommw+7RZuQ2EU6q7wzFsu8fW yTZGviZyjqOzAqdkM2Wj6b8b2+j7g1s9NQYSvKJtCp65ttJvOEUcunNKdjZwiuPDKTjpWkLH x26jj2ifIp6CcwnMoXxob2IZ7IOlrqfEDljFcvIq+TbaFh7Gax0xErAI9mDb0UqBT6xjGeuY WA6n6DfLOv7DIvKko6XI78eYXcREoKFgGPyiTMgxS9sTbVbXXXu9x1AQm07MBeUpg3/Q/YDo JW1PTkJ8f7E6XyYYxQSv4sQlxkXkWriH8BhGNecU54qemjd3jh08sN92ZWZ436nyfcXOKeb0 edq3V30axKjiPYotV370reLUCumpVWvWKN9fmt6hTNu6aZXNf3uc3fuDHjb3hV9a4YqXbf+O GbZl7gSb/8Hrlrl1qc1bvMwWLF2htq0VliFOHS/YZtX5W+3A8tdt6cT7bMdrj9iysf/TZj48 3D7PXWJ11WIUU53G8JWfr0Gcqj1Zr/Yp+QpOKt/KGfn/NEUx5+97Pyni+siRlPDSKu/vSxsV PKIdCk4Rb0F52q3Il05cxQ1PKuZv9BznVOykZZY8cab95J3VducDY601edO7KxYsob/F6Lm2 1zOOV39fWDWwZ3e7TWPWBk5hI5iwySzjt+sJ2ZtvwymY4fVm2ZQmTklLoY9YF9qqYAoaC05x fLaBX67BVG+GUbDJbaDsFHlpyTPb6rprvc/Utf/+Xc8/GzjEvgNzm+sp1nM92FBsqcdXyB76 fhttq2tAHZ97wG/OkbIwD76yLNjLwCL8enABrkR5Y9VO7QzT94dvW6xAHzmn9CzQO2Fb1gdu MKccvIEnV+MUZSMuhvx/si+yC6E9ijnnQXsUY0MxJ+aD/dO3KsT3kQe9eX/e0GY1gBgNraPf VIhR9xy02gfMIiYPZvPMvH4hVqFFuce8SyGXBOxxjum58Gz4zURZ9kGbFM+AewzTqDNxn9kn v9HDvBM8B/bFdqyPadXaxj0+yug3tWbBIsuUv29veqbH+NF36rAYcYr2JmmfKsXzlebl22HF BNaLFRdO6rsUc+rw8aktmz5U5KVAP4X8E8SfwySf0Fyqp8Iy9wNqW/Kkw6nKvfuk2TSOveIp dks/HdS+Mrak2VuvvWlHtI/Pv1D71P+S7++LLxVjpVxLVVW2VvZnybLldu/9v3b+JKqfI6yA S/yGBUzOKdlMfsOp0MYDu7y9SX68SE99k1ORDzBRuWfRWpRlTA84RQxgQk/5p3UcbCxtSbCF Y+Cng1NoA/o7+XF0TugjjynQPJwL/IJT2Ggm55G24zqIC8RHCY+I84PDsBcfpnNK7xQ+PxiE XgqMCpxCY+EHhE2BS/xmG+w/2gvfHowiBp3xgekzRb4+2AOvGPcdXnn7lPsCY93fB6dYhj+Q uf+WzvL2Ku2Tc+d6yS/rbXToSbSUljun9D/iFHGO0TPiWgOnuBbiKPBnoqu2yndXWJBvWeJU hcYnLCstlpY5pFgKMaqkyEr35treQuXbK8xyTqWmbXJOLVq6xAqLNEZV6lqrKNe4HYveskd/ lmzbPhxrF4qX2OmylVa/d6nG+t1otUcKrFDv8ar1m+ytN6eIVSuVE3mXndL01+LVtuL5X9vS MXfaxufvtWkPDrFzqTOtoabWTuhbqKlRO+xJ2qhOW92pBjvaUGdHT37FKZiDnqLPLpqKtidi //D/hXXEUfR4caX3m0JT4RekLNu0GqUxP8bMs5inF1m3F1ZbyqQVNuCVlXb7k2/aNb1/Yi1v klbpN0z9S3QP5f8hB1o/1elvUn2r3+Dh0tzyJ8MF1VP7q42hN7ZCU3/300R5APrKrvSSre6D XVe9t7/sRKL8X71lh9BB2HFsCTaE39ihEDMR6sOBR9gh30b+IOriPdFZ2kcPcaqbuNRVrEpS /bmPfIWdYjtqub4ZXye2SVslyG6xTScxi3xZ37nmGrtWegqfX4d2bRUzIgaLO1Hcvdo+tH1v 7XeY/EUD5c+GWV6P1zVyrUP6K2ecfCxoBM8LJDYwp72GXAfeVqPvyfsY6XvsKttA2QF6/5hT 3+PbYeJ7o26IP4LviO+NZZThe+M/7cV8c3xj/I/aqbh+GBbiAWm/IjY98ifCK+Ih8NnhKyRW glxIsBHuEbcB3+L5/uVLh5f4+mLlD6MM6/FFuj7TfmFVf10b4/2yb/YV2tTYP/GHxK2HXBas 49yanw9sZLxDWAOjYAz6h//UBXje/KcewHP2cnpu1A9CbATPYZD4M3jgV33beIeoH/TX9fbU /SZv3zD110qSnRvUL0X7kt9PtjalT4r0dIwNVT+gj96dbm9OfMnmvjdDsX4a20dtRVXFZVaY rnxJ2flWI3bAkfPVJ5Qrdn9jfJ7aqcQX4vpoZ6KdCl5FsRQV9mn9KWcROdGr9pa4LxA+ETtx ua7euXZQsVUV+QVqmz5onzYojlf+w5oDRzR2sOqyqRm2a1umzZwx286fvWSX//I3+/wf/8fO /PkTK1XM12HZgY2Z6bZ84yZ7cMQIa6NccfF6DvHYWd1/xkoinwJ2FzuLzcUWo1soE693lLb8 OH3H5O3zOIpGreR6SkxiHXqLvr7E/VEutlFnocH47f2oxC36/IbcgB5zIR1Gf2C2pZz7DFXO YzX0H23GcpgW+bzk/xaHmOCWL9M6OBavd9t1VON/1rv/Uu+x+za13H2Yen8D12AbZWAf+4DV aEj2H/qZcWz3R4qx7JN1sBWGwhb4yv5gjmsi7YP2plbSUy2JoRDLGHueMYtZH8b6JacsWpC+ uyHPBPvn+PT7ZXnQiDCq3Y0ddB3yM0gD+zFVFpbCqW4a97ttuzZWrxyvO3dus127tllxcZ4d OiRfX1mhHVTseGFRruVIQ+3ROE8lZUWWU5Bly9V2OXP+AluwZout2ZZlaRlZVi4f85YV823E A3db3toP7EjWKluyern0+RGrLCqxrM2pdkHv+mXlQR7z0MO2YtZsKz8sf7emisosm/7+CzZz wq9s6lN324oRt9uVTe9Z4Yk6yzt+3Crk8zussdFqz160+vOXNZ7vaatvUHvVidM+4dcL40qh neCUayfxiLER0VTEVpCHllj0qD+VfHwqi7Zq+4T8gGOls55aYJ2eXW5JGisxZdJyu+Opt+37 A++xVjfLt9R3qCVjP2UbA6du1tjVfQYOlV8YDd2cU2KSbAV1WlgFo1ybyL73Uf11sFiWIvuS +E84hQ2CA1fllLhDOewX3OkmuxaxSN+mWNRHnOorFnaWtuqudayHX6zrIfsH0zrGtFdfvevt +/L3tbguyo8eo9yzcGoAdXfZ+L7iaMSpeLsFTslu9tS2/bR/WMz0zzklWyqbQbtMkux/yHlH HFzEKd0fxRxcjVPBVwGPmnMq1AXh19U5Ba/glDSfOAV34AXc4Dd8Yzl9i9lXrPeRUl5PfaNw i7hBfIhwjN8wifwVzX2F7J/J/YEqw75hWchzAQsjf2JUjt9wyvWZ3g90Dc+eOolPWobmQUvR boXfl+VwiXcDrsEtfH0wKhlfntYzUaafroe6FIy6ZaByY+g59JcNGNg3RbGIOpZsUb+kfhqz uY2NeXSEbV+jGN7Z82zlRwssXf2VDuQVOZfID1GwI1P+PrUHqM2oQd8v/XEri0o9fvyw5sSe X6pVTmj5AdFI+P7QWPSNYjntUfALlkUxgMT5KQ5jP+PTH1QuplKrkU6DYYxVf1wxf9vXbras 7Vm2dtlaW7xwmV2+eMU++exz++zLf9ipy5ekpSrt6JkG21GQY2sUm/7Q6NHWVm3uXWXb6KND Djli1qLxfNWHSvHVkTbQe6TlxJ3Fq1wH2WdnBfzw9qnIpxfxifiLSE+F/r74/iiPb5BYCsqR P4k86mgt1qPL2A7NFXKrUw5O4UMMfINrLON8PEZQPIAT6DDYAVtgDCwJvkr4EfxjcAuN1cQi 9sM2+sZYxzZwIczZlnVwCP8h7EMDwjOOQzmOz7YwDU6FeEM0Ib5KluO3bC1OtYJTYg5MwrcH y8jlB7/aSUPBG8q2u0laC22m43Nd/PbxuhqPyT24UfUl+k4n9lJMta6BfOnUV9GIPRJ4Np01 vvtR2707w3JyxCP59/aXq49v+R4rLt1jufnq2ytO7ZWmKi7bY9l5u5xTHy5cJE5ttnU7si1D 73Ke3lc4NeOtSbblo9ctd/X7tmD5YtuZl6U62U7LU97lOtXRDuidf/y++23DgoVWcbRMGkvj 2x/LVY6L923Ocw/YNHFq+4R77IttM61U+fwK5fM7pHj0/aprVdWfUb+pC3asWjmU6s6Ir9FE vDmsIo4Pvx+cIm4CNqGXWjw21duj0FT4/1hO3iTKMb95LP2CxbQnxS2xKn7cHEucuMjuePod a3Xbb6xle70nfYYo94TsiTjvnNL3376T2q+TBylmRnUgsaKv/CjoKWxFL9kc/FpwCruCjkqU fU+CU6rrwqme0ii9xBp4g3/H/TTNOBX8ddgj6s+UoZ6NjUoInJIGgzvopMApNFVfnRP6rova pPgfdBasohzzm5XLDx113bXft9YtW3g7Fflok3W+A/S9w6ck2e2+0jNJsue3yMf1NU7pXLlO xqllLIugp/BxRXHYUaw2MQb0HWIZ8256BymTIjuN38s1EbpH0zf1VHNOoZ/gEjFKcKqpXVjn GHjzz/QUfj9YhKaBRVHZyG8X+Q4Vwy+uhPhzYs+ZKEe8BNuxPWUpF8apD/oJfnGM7loPx9hP SmN7F+vYhniL5gyDmXCK/Bk8Wybnj/QSc/fTqV4QYlTQWnDK9RZ1BJVjG/ryDhpAH+XIv9dP bCNXX2/2o3OnDnH7sFv896BkPSfZgS7y6STJX9Vb+qBDu/Y24/UptnP9FmfVpqUrbcOiZdJQ BWKRxoI6cNj2ZmZ7H6cD4hS66tyxWvUF1ngKym1E3yfYg6b6tF7xTmqHov8UbML/d7lObcti V9Snt877AhPrxzb4AWnHOqffsApuVUp71SgfRdGuXCvcXaAc6bMsdbNiKK58oRzp0VT/8XnP +Vlz4YzlKeZrs/pkPjZmjPwbih9Q3aCr7jWxz+RUpa0lam9RPB42XLYS3UHcGZzqyH90k/gR cqGHOAlYFMVL6HtRvB/ayLWQygYOMccnSFwgv1kP79iu+Rgg7MuP08g4xlxs34Ec6pHth0X4 It2vJ4bCIvgFg+BJ4BE8Yx1sIabCtY+2pQwMCpxy3un64Ax6y1mmbeK1P9+XWMQxYQtcogzb MMEs11JaB+fQn2ilr3FKGgpNhVaCUcwD29BXzi3dZ7aBY+RC575zPjCMeEf2zXUwrkd7tXnx v0cCx2ecSfk0xCi+8y7xnRQnc6v8alVWUJBteXmZlp+/y0pL811P5efDqEyt09hR+wqsVBpr d266rdqw3uYtWSxebbY09RkvLCxQDr8sxbHOs+0rZkkT/dJmTXzQcjZMtbxN061s3Uw7nr7Y 6rYus/w5k23CAz+17BWzxcMs+RrXWuXRAum0TTbnjbH28hP32sqJv7Xq9bMVK1GnvH5qnzqr 3BMnxaZTp+3k+fMah6pe41ApJ9hJ2qtOu//Oxz2ULw89Ra7Zr7TTAsX8TXX/HywL2gtekTuJ ch3GLRDf5iu3n9qoxKqY383QmFRz7AdP/cna/ugRa91R2rn3YPnBZE9ka+mnST01Rro/Qb4T eACn8LXBKbRMoux3srRHxKmoTTzx/8UpcSa0ITTXU7RFwSbsEXVkfuPvo+4N2/AL4d/Br4dO wveHbmKCmcnSc/FqCwrLYBl84n8X9aPC5/ddYvwUk35Dm1be1zdO8X/9xUX8e0FLMU/Svm+R /8k5pd/ug9I1cp1+P1TeOSUbQXxbyAcOi4iBoy8RnGI5Y/Hxm1xC2NLmnAq/8fsxwS7YBK8C l/AHsA7/NdPV9JQzRN+wayZtC2/YBoYwx0+HvoEn8fo2YuQ/wucHc9BDMAUfImVpNxskHxqM ifQVcR1wCK0V+f/QWfAHNtGuxb5Zh97iNxxjv+yDc0Ir9dezQj9RB4FHQUd5exPLxC5nmdYx h1ewzLUWMad6DtQZWMezwfeXIps9TFoKVqFnU5LkI5ZdSEBPycfSWfXY4UOG2/xpM22FtNSO NRstU2M9bVi83Er0Xe/P3eO5YauK1U9FcXjE4h3ZW2YXa09aNeNvKF9MheqexKTXKpbiyskz zqQoH8UhjYFY4uPPMwY9rDqvflT49Y6W7PPYCjiF5rp4XP3495b4cnLcVol/5cpHUZSzxya/ Oll9OvfYF3/7h/35b1/apSt/tRMXzltFrcb4+ficxlOotB25eTZq/Hi7Wc/OOSWb65zStcKo RMXOwSfiAZiwuXF65nDKY6R1H2KdH9Jg+qbRRMzhlTML/og9+O8iBkUaK7CKWAr45LHqureB U+yDbZiChoJVHAsNAaPwd8EK2ABzor5E+PDkp9Q5wi4mlsMYOASn4A5MgyvhP8vQLNj+qL9z 1DZGexbrgiaDS5TxGDuxI9qXeE7OKR2HfTTPIch/YkGcU9w/sQcWoanchyfmMIdTsOgGtVHB oqDB2uh/G+U6YR/4An38Dm3jcSP6Fm9SjosolkWslj+avlMd8GnoG0xOTpZua2GjRj8u35ny 6Gnsjt27051VxcXSTvL/wag8saq0RLHqB5XHpLzQMndvd04tXL5MYyVutTTlVNmj3LW5uTnK /b/W1s19x8bdk2LP3D/E3n72fnt1zF32zui7be7ER+zDJx60KQ/9zB68rZ+9O36EZWetV//i DXakWj7GyhzbNO8t59T8Mb+2ojlvaDyPKjtUc1S+PvXxPSNfn/x/pz++aNWqozHVNohTmmAU uZPw/Xm+WWkp4iiYYBGxfcQBoqNCjB++PzSX56QYj8ZSf98x8+wm/H+jZ1jsmFk2/Kl3rN2d I6115ySL6TVY/jDlspHtwYcCpzrp3e0uzZ8iNvUQp3rLhjRxSraFum2TnlJ9OBF90kxPJUrn 9NayEKvgMQeyNe73075cO6le7H4c2TLKJYh1zjLYJn5gp5rrKXx88Kqf7FiKbF/QT921HXxy TolXtE21ad3S26ZatbjO2olZjOHbWTmU8PkNlg6kfaqf7Cvtcn1ko7/JqUStT9R1Em/tuYGw 9c4p2Wy4JNvt8W6y8z7ekvaFjuou7vTUPqP4N/kZ0CL6z/TPOOUs0jo4xW84FfqEsOzqnEIL Re1FaKBQHnbwm9hA/IAwJfj84BJtUvAGllAWbeVtUmqXgjdoLObEHjKnPOxhcq3FtWr/gWHu M9S+gs+wrzjCdtQ7QlwDPAr+PvQ4z5sJlsGg8G6QbwItxba99F70S4r68vJu9BajiMvguQzQ d54kjjL1wl6prWVgv/7WQ/X7GGmp3z/+O1v24Uc26+33lCtpveujrE1brSQrV7F/Oz2+oYEc EWqrgltlOQUeR35k7z6tqxWjDks/lXv8xCcnGlxP4fdDXxFTgY6CU8yJqyA2kAkfXxQbqDjA I4rrLVYeJrHqoPpo7dNxinfnW05Gjr0x6Q3FH1coX1LEqYt//swaLl5QLNUJ59TBumrbpTby 3z/zjLVX/aer7mm87nsnPb946QD8fr3glH5HrFIeOfxXsreUi1M5mBE0FTyBOUxoJNiDNnJ/ njQVuoplIR7QNVMjvyhDrAXbRXpK753KwynWwTWO41Mjp9rqGcCkeL1LPkaizhfN5JpP7EL7 oHWYYAssgFWwB0bBNvcZwiFN8A4OhfYnGIhuYlu2YZ2X03/Khgk+kfPWYzS0fz+G9sd+Ik5J T4kzHIt5a3EKv59rI9Xr8OVxHdxXOISGgmfEjNzQTpxSeY9z1Lasg2vsiwlex+l95L5FTFX8 v/yM+E/g1DX/do29P3O6xsaoteKSArVRbRVvdlqxfHxoqMJCxfgV5yu2Yq/i//ZJ/0g3ZW21 9RtX28rVSy1t+1aNnbjD9kpj7S/abceyV9p7f3hQef6S7J3fDtX4Uj1t5mOJ9tEjfWzp6ME2 95HBtnTkbfbmQ7falEd/YJmpc632sPJg1JRY5bG9lp25xf705os248WJtm3xfDurMag+rquw zy6dsstna61B+urs+ZNWqbrUEeV2rzqp2D9NIZbP49Glk8gzwXhTTPxmCvrKYyikueAa/kLm nScojl1Th6eVs+IPSyzmiZkWN2a23T5+msXeM9badUu2mMRB7u+HVbSrECPQRe9fN9Wl6CcN p9AWcAqfG3EVfaWB4JT77cSdXuJK8ziKXuJJkpZRh8befJNTQTvBKa9ri1nYLGwRjIJbcKqn 5h5HIXbBIyY4FfRUiKOAUfgBmWLFo9ZqmyKGoo3i0m9SH6r27dp6ntpB2nYIvknZu4hV4pR4 OrxRT3FefXU9MIrrHKgYuG9yKkHsSZRtp58Q8XCBU3CMsY74z7o+stuBU8zjG7VT0FP4qAOn mMMlGAWrKPuvcCowCH0DG2AHTIpiGiKdxH/68XbsEONtUmgk2pdgE5MzSxooRXUUfsOo0MYV WET5iFFRngr2ERgHq8I+3dcnTcU6zon6CM8fDvGc+6t+QbsjbOIZ86ydU9JJaGjK3DZsqPeT YttELUvpq+2I89e7AesG61kNQffpnHgO8KqH2lC6qW48dMBg9/0lqp415bW3bOH0D2z665Pl 71suTqg+mqU2ammn3LR05Z+IdBP+P2Ir0FXkOKooLNH3KZ9dtfqIKD4KJqGP4BEMoq9UpLMO Nvn4aJOKyjBGYq37AOlDdVp5JU4pfg9NBqtKxKjCDI2PuG2XzXx3ph2rqnU9dUW5/S5++he1 T120GmJ/Pz5nVafrLae01MYoZ3oH3h1dr7dPiT9wiTiKRPk4YRYTy+CU50aQzY6TrQ7siGvU VOghpog3UXsS2ohl1PdhGdvAqmh5xKdoGzSN2CYmwTDfRqxiznJiJ3xbHYt4QTgVmEC7FNzA N4bPr4kt4il88XXiFNzgP4zy5bpGfGasRzOhs8K4wGgy2MY612XwrpFn7J/t4RgcZH/uOxQ7 iHngfGAX6+EGWigwCy3VQn18YRBtUpGfL9KA/EZTwSXy+sEyNJX393VuiVMqw3VGbVrUG/Bx wlDa9mCxtLHsAX4/OJUhztA+VVq6xzIyUi07W/m8FNuXl7dTy9Tfrlxav7JU/W3V57dMMYFZ 8gtsWmNr1q2wXbs1HlX6NssTX4rz0i1j0Vv28B097c3/6m8zf3+HTXmgk304MsnmP5ZsC0f0 t1kPptiix25Rrtof29gfd7c1iybb2Rr1Gzxa5FPt0f2WvXOL7duRascKcpRLpcgu1Byyzz89 Z5+eP2H1J2vtzNkG5aStlR9QjFLsH1PQRcwZe4o2J/pPwS+4RN8pxvTt/oK4pTLEAVIO/UVs eqfxC62z9NTN4xZazPjFdqNiLzo8OdtufeYD6/zAc9a252BrlzhENkC+LfWjgFFM3emLrmmw 4oHRNNjsJk41th/AKddDskG0GRBTMVTtDgPEArRUHy3DRsEe55R+wyJ8P8xZjo1yTsEFbYNP J3CK9gv4yPHxPfbQNnDK/X6qj8eLSfzvJu3WuZPqLR3VvzBW40+3J+fxdc6pG9u2UT8++Y/V NkVepUGyd016SjqD+BHaqIZrPET8fs4pXQcxgzCSWADsP/FtQV/ga0MzYZvJj+c58/QN8Z+Y btZjp729SL9D2xTs4f1szilYBK9Yx2/WwSm0F3UuOIFegh3snwkfW4j3gyfxbKfvPfjw+M85 MMGnTqrn4esj30TUxgRrZAf0nRMDwTWE2D32xwR7uF60FtfOtaCjuC62Zc59CetDmxRz1jkD ZQuCnoZT8AlO8fx59jAn/OY//j58gjx33gnenWTxK8UZRx2K2HmtF6dSxKYknU9PnWeyzr+7 7E0v2aN+eoe7y47ec+fPbeY70zzGb97U923V3IVWtHO3x0zApRK1EdH+RI4I8u4xR1vhBySO gmX4AOELfXoZUx4OoaWIqaDPL+1UrIdHtFVFeQAjlnlsn9qqYNTlmjrptGh8EDiVvTXddmze oXxJy+1Uwznpqf9tcOrCJ1fs1CeXjDaqE5cuWN3Fc1ZQXm7jXnjBOvJeqU5EPm78fvj40FE9 ZbdhFO1V8bLX1PFdr8hex8oew6fYxgmWwBQmeMQ6WOQ6S1opaKOgwdBJbBNpqWgb9hUnu/t/ aTvz8CzLa90jg4qCzEPCEAgJ8zwI2OO23T3V1mNra3cV0SKVQRBQq+BcUZxQEBkFBYQwzxDG MAfCkISEQQhTIEASZkRRat27Z3ed+7fePCHby27dl54/3uv7vnf+puf33Gvdz3pYz3FoMNdh 8K2IU84scY64HxxwHQE3xaDAFXSPs4pHLezHNh4Dc/DioYVCPJDnjOfiWNgFt9A5wT8Bezgn MTeORa+xjfWwinNH+izaxvEwjs+L87CduGnFSpXtJtX3u0X1ttBXnp/Sf4dz4+VDM0X6SfNz SG+hsb6pp2AUmivkp+gD+PHSWtRL539O7K9qtcq2T/HdzMztyj9t8TkPV61a4qxCT2Wkq/+k bfs0Z6HrqR3rbN2ahfKxz7QFC5Jstbi2bMkc9b/m+TJy4D12X7sqNuKhljbqkbY26oF4m9Kn nTEf1cy+nWzig61t/P0t7YPH77Shv29jH7/3Zyvcr3qC+zQn6AHVUJeG36dYX+7RPI05ls9w 8gjLWT3HruTtta8Kcqww/5CdOw2fcuyTPPlgT0pbaYFFcIdYHnVnQxwQXwXec3x9MCuwikef M1G88n37KWaopUrf8VZNcb9Kj7xj1XuPsq5PjbKGDzxr1Zp0sqqJcIoxlsrbqN1iaaTnDROa WMcO7Yo5cY1T0k5qP+AU7UkraaJm4kxLrbtVbUg7sQBPOv4/2h+Wb+MUTHJOKd+E7irJKXLp tFd4CxN0Lpjh2gm9o/3dRyHuEO8jT+V8Uv4pRktN1Uq6ufyNzqmaGusbW7uWz5XImCw4xRLl pdR//xZO0X4Wc0pxsG/jlOsNtRl4twOn8Mo5H/TfCF5uGAWHSuop+lH8Tos9P0Wcgkusx0vx /Tml/7nzR7zVcVwfHsExnldT7DyaqyManwVr0EXwBXahk9ophganwvjiSB9F8UD25bwcFzgJ v8LCeeASOir4/4J/kH3cG6HfBeOZ+D55TR8l0q3R+FyewzPGSVFzgt8LvwVig/hyWui1a3Vp +86KCcIqGMV9wSlYC6daaqxPQ8X+mik/NahPf+fU9LETbfH0WTbvo2m2QRoKzYTfHI/fusXJ PifUUY3FxUNx5shxz1Ex/wZaC00Fj5ifA/8EWoqcE5y6kJvneandqisBq87LZ0EMEGaxoJ2Y J/Ggxgyf0RgU/BXsu2n5Gvf7zZ0+12ZMnmEFp87al1f+5pzKP3vBOXVMmir33Gk7fuGspWZm 2sBnn7U6alMT9FtrRJxPz51TavfJUcEpxrDCqppqV2vT3otlseqHEI/7Jqfw7KGHXDOJRcT6 YBHeaR6dU2IO8UGORXsFzRRigmgqeMS5iP/Bu6DD4BfHVate2zmAroFFcIiF566VxAh4wuLa SL9bWAFT2A5viM3BEfQOsUDqcMAWtA+6KpzP44R6zTZYhGbiHDDNc2M6J8dEnIriiFwTdqB9 AiOdU4r5lb+5gvMKflFfg2M5H/0ANBQMgkXwides51jPT0lPcb9sI+6H38+Zqc+xkthXT9fl P848jk1Um+5Ufp5t2iw/z84t7qFYvnyhx/+2yPcHo1j2aB74PVmM+V0rTi2ypUtmO6tmzVAt 2llT5WFdrLj1Qhv8+w7W6+fx9sFjXWzkH1vbu7+vb+Mebmrj/pBgM/t0tEndxa7fJtq8l7vZ gle624wxz9rpA2vt0JEMO3xUY913S/fLx37k8DF7W+M5Xv7jr23eOy9a7s51duW45qopOGzn z+Ra9pF9lnlwj+3TvbMwVwe8CXE8xu4yzxReP7iF95y8FNvxWAT9Re6KpXYfsayXxvv20TxU 8vvVelzeP61r/OjrlvjoMKve6l+sTF3975tpjGfzNu4XwDvQXHXR4tUHaKn+bwu1F2gaYm2t 1MYn8FztTWvae7VBxGPw+KGpftJJ3kG18y3ElxbiFPxBc8Ep2AMDPDehton1PA+vyauz0G6F 9a7lSjAKH0c79bnxpRPjg1Fx4k+sfOgxmre3jmJ+5KauL1vGbip/g2uualUqS0vJYyNe3dZB uXfaPvGDuB9aqp3aPPJWaKqGOmeI+/E+aQ/puzdVW9xAuoZ2Ea3AI+1z86K20vmkcyao3Wah 7aSfz1ioENvjOboJdhHfC9tgEgvb4Bnrw75oKTRV0EjMw0H7fy22hw8/0m9wBN8Er2EN3vMa qskCj2Ap2wNfuPeQa6K9h1HhGjCHbbAO9pC3Yp/glYh41ETnr+NarK1+L/gnuE8WmAb/0IDE 8vBEUL+c7xutDIfQV/wWPCao3xAx3jB3MrVF+K3ALeZAa6P90OgwC0a1Vv+I/zmfIZ8lSwsx qpW86fXlr/rNXXdb0sTJ1q/Ho7ZAHj/8foyVWjFngWuqvL05XguWOCC8YuwUeurM4eMe89uz RXmA9ZtdVxHDo+459SZgDXFAfOmM9WUbdWjhErWVovoU0Zz17OPMytylGoIRy9LXKReeut02 JK9WjfQxtnZ5iv3tr3+3zy9fNXJThecv2onzZy33TKG0VL7mSizw8b49+vW3Wvpem7drH7FH bXCC+ES9n3i1wzyHU9RSoL9PrTlyWPgo0D6wB67gwYsVP6iThHaqhQ9NTIE3cMjXiznsw0Kc Cmahl9xPIc3Feo/76Zg6eh7pBH7j1/JdXBNmEfvzXJnuDR7ACNgDN3xeYNc7uu8ifsEBeON6 SfvBHBaO9TgdcR4dw3ngCpxBe0V5H2kj7cf+aK2wcB3OyTlgB/fDdTgO9sAbmMY58AGi+fCa lypdxpmDnoJHXItz85z8U1RrV5pW6yqpL8h4X+6JOCFxQeKA8K9S5epaL26qX1BbXtRqOjfX 5b9eunRpe7RXT8s9dsS1VFraJs9N4U1fumSuatLK37dNv8/dmmsma5vqpjNvPON9V9mK5Pmq mT7Dxo5628aMeks1Vl7TvJ9jbOTjv7TBmttj+P2JNrJ7c3v27ub24m9a2xStn/3M7+yDXnfY 4hfvt32zh9mx5FE2b/TTdnZPsuqEpdql0/ttr3yHh5SDypafb63+F3OHPWVvPvIb+2jY03Yy fa1dOpdrJ4/tsVRx85MTBzWuSjVp848Xj+/FL8F4X+ZDpAYtY6cY5wun0FTUScdLQdwPfeU+ dXnVa/VWbQqO6S2mKfYXM+hD+SnGW5Pebzin6nT6hZWr30axJnFEvgm8U9TKaabxJ9+HU2io a5xqaLepv1vMKbGqmFNqh4o5RZ/6e3LKtZRYBzOI8eE7pK1qrjaPWF/EKY3Zg1NaotzUzc4p Yn/1tU/1qlW8bgW1/boqPx/pKXnEYOn34BRaA07hpYs4hd5SP17rvI0XE4o5Rb/XOSUN8Q1O hfjej8kpeAQb4A98gEfcJ7zC28e4XrbDKDQe+gfewCnifdw/2zgPS+AYnGUbTGI7xwVPBfsx lhhNCcNgJ+djP45nXz4fntPfgEEsaG/ifDAqcIrXxAJda2lfXtNXgWlosA5a11HbGZfH0oY+ htajO2F5+/aMnWim91lH12hr1TRmapP8T+Pffd+e6vu4LZya5D6/7Rpfwhgqxk+lr98svaR4 nmpF4KGAU4z7Pa0+5BH5xtFb7qFIZ05Eefmkk4jpMQcVrII/eNQjfXXYuRXmoPeYoLZR64+a gIdUd/1AmsZQSXNlrNtoe7dl2qYVKTZh1Hh5/rbYV1f/XZz60s5evOysYpxv7ulCxf3ypakK vW76Hx/rZzWVY2zRoYPrJOrI4aGI0XtGSzVSf9LH+3o7Gc2F5DE/taHoqcCpWuIUbGFML3yh 3cRT7vuIM7ALXkWaiTY40lZwCoaxjeOvedrRLNExUb4ruh4sg1Ouy9RXQiPBAuJ3tNEwAlaF uJvrGW2DFayPE3ujY3Q+7Q8L4JPP/6t94BTr4RnrOY5jiPGxL7yK0//AtZQY5efUumK2aX+O 4TywKeIU7zWqo0EOqtR1ZTzvFHTTf+WU6tGKR7wfrhc8gLxGQ4W4IEy8RfPW19LnDLtr4lHX cbxffr+lSpWy14YNtbPSzunpaRo3td7jfikpydJKs22LxvXCqaxd6ZqfTOOe5EnPztis2knK SS2dYwvmTbP3R7xh494fbi/0f9DGiCXvD7zbBvyysb1xX0Mb8WAze+neNvbmg11txWuPWPaU Fy1jwtOW/dGzlj1jqG0a+6S9Nei3lrbwPTt5NN0+O3fQdu3TvJ/iVIZiCVkHj1rKuNfsvcfu t9HP97cF416344ez7ETubttzbL/Gomsu+lOa46Mgz7USLEJXwaeKj7xrt/SMaqUzDxVjqtw3 UeQHhFXECH3BByiW1VTN2oqPilfoKXkqqsmr3qjPcGvw6JvW4I7fWemGHS0+UfWIGym2r/bN fQPS2wn6DXyXnmJMLPE7Yn94KeBUC9oZGACn1B8mtucxPPGGNoj2xzml9UE38frb9BR5KXJU IT+F77C1+ueM46onXx+cwofunJKeQlPBp+vLlXE/OjmrmhrfSz8+LjbGfX1hnG9b/Va+i1Pk ivDl0HdH89A2EreDOfzWqB/B69Cv5zFsoyZKsS4SD0tyivOyDa31Q/QUvge0FWxAB8GHqG6f 8rzVqzs/0X8wB5ZEnOJ7uMYpuMX6SF+hgyI9Rt0kOIUugn1wiAXuwaiQ13K2KQfAvsHLQZ6O 81E3Fg8E3OF34HFA/WbQUmhx2EX9reCz4TfAc45JUL+kq7Z1Vb+EOicd9L231Hof06dj4/W5 J+h+GumxY/uOukddU+3p/736tb3+3Ms27NmX3JeO14/xu4s+nunjpbasWONxPubbOKj1xAIz 1qcqJwVfDnj87/heefrkqTicscu9ErAKTeU6SVoJPx8LWovcE3HBwxnRXL8wDL6xoKVytu9w L8Z2zR+yV7709apDMXH0RMvavstjfnCKcb7UpDhZzKkCxf3OeD3ah/r0sRpq21p16qT33MTr naKf6qntY4yvayrF7GAW8aeaam+pL4emQis5p8SjaD5E9LwYgW4SS2AKS9BU8MbXaRvr4A0+ Px9fJU4FRrENXVXMKXGuOMZY4ryuUdRewyfnlNoX+IGmidN7oJ13nVWCOzAGdqCJPB6n5/CI +UDY5uv0XtFJxZwqOhfn8/Nrf/hEvC1cC/ZxTdb5efSZoo+4Fq+J28Ej8lGlSmnub8X/+DzR YSHnxbXJSaGXnFM6n3v8xDbeI/oLbQXf2F5RnIrGkUU1a5nPl33c6ydOzZyVpBrEFy1Dc+tu 2LBG8b4lqkmxzBYvnm2bVXdi27ZtYpjmQ0uXX1Txv92qU7F542pbuHCOzZ07w2ZM13zzSxbY y0/2svdeHaJ6sj3ssbua22v3NbZ3H9Lcvo/ea7OHPWHHV0+2wg0zbP37A23SwF/ZuL532Ls9 brWhD3c1atUez1xpV/M13uIT5WvzDtpm9bH25p2yg/KsJ4l/7zzbzwZ1/z+2Iy3Fcg+JVRcK bPcR/b4V89tfeNK1EVqJeRHhVCUYJX3kcyWKU+SvvDa6HnkexgXjo/C5qHjUfjf/iVp/ymkN mGRVNZ4qQZxq2Osta3pXdysb38ni4tVfagQ/iPMrX4Re1vf53ZwqqqnmnGpgXZVfgE9wiiX4 uWiLiPE409Q24eWCV9+HU4ydwcdBfooaEcQeecR/DqfQVfCJBQ/FTTfe4JyqUa2q84t1zbU/ sb9Oau/a0GaqnW2nx+/DqdbyUsAVYnIwKXCJx2/jFKxiG5ziMa4ongenQgyQ87Hth3IKfwP5 KFjC+CcYUktxCXJS1ELHcwdbYFTQPBFvonpK6Ca0EZyK4nX67nVf7AOHiN8F/cQ6tqGr2LdD 23a+PXAKZrIP3OMRrcX3DpPor6ChYFXw1vDdo6WIC/JbYD37Bq7BqS5iVmfF+ch5ttU+MKqZ vrfGun5j/Y5i1EepI07fc/c9VrZ0WRvx+lv26elzNvSZ52zEK6/b8BdfsfmTp4lH2c4iPBRp Gj/F2Ch0FDyi7kSGNBZje5kjKv/AYecV46lCnA9ORTUnYJXmqMpUnfXMLNdU+CtYh37iOWOA WXjOGN/cXfr/b91maatUT3Bruq1ZFHkocg/kutfvs0+/1PipaJzvqUsX7NgZ1aY5W2h5F8/Z as3j+mCv3sWcaqxxYtSjoC4d+Sjq1zXQa/JU8Ir6cu49Iy6mNpS4XsSpyKMOS2AUC6yBVZFG inhG/I717AeHYJb7JcQo9FSIEzqntB/nYT3X4Bi4xsJxHA+naNvRP3ACzYP2gSUww+NzWs8j rGD9tfgdvgfpKR0Dc1jYD38e53J9pTYKXRaYx7FwCV8guS2/js4bXRdGEfOL/BXcF9oGTrE9 xADhUKlS17mXAn3kmquIcbCHmB9eP+6Ne6auEvFW7s3jgmKWM0/bK6t2LV4K9FRV1VrHQ4Gm glPlypWzVatX2Okziu+mb1VuKsXwUFA7admyefKkr9GYKtXYF6eyxKjsXTv1uNXWSW/Nnz/L 50qcP2+WLU9erNpgL9n7w56zCUO62eB/62zj+9ymsbp32qLhg23WqwNt3qt9bcrg7vb2Q13s 1d+3tZE9u9iY3rd7LfWR/e+0xZPftJO7U5SnUv1lLRsVM8hQXvY/cndZ5sLJNvWdl2xAt1+p tuAyOyafet75fNubq76cxqPvP33S/RHE8NBMoZ6f10+XTuIRFkW1KqJaScFrEeqmJ+jYuvKh V5CeukWxv1seU11a8apB33e1jLBWv+1t1yV0sToN1VeRpsJbzRhV2i/ap+/iVCu1G+S40VOM oeqq/I9zSu0N8T/yE7RN1HELngr61nCKvvV3cQo2oafwiYfnxH3wVzinlJtCV9V2D0VN1043 qA7FDeXKun8CdpG74pr4/chNOafUbrZT2/1DOIUeCiwqqacCpwLDAqdY715zPf5YnMKz4PVt 9T+DQ3X1H66u/Czr0FF8h2gf932IHWgelsjzQf6IsVPE6vTfFofx9lFvAi0UjguMC6/RZsRC 4RjHsZ1rwUhyWmzHJ9nWY4Laps866Gq+h5CTImeFB7BkrA+WFe+vfbto+636naCBW0tDNZaO bqLHBG1L1Lpmuo9EXS9Bn8PNyn1/WnjOCnLz7O0XXtG4qeH20XtjbGmSYigrUsQKecylkVKl p1LlZ4BVzLlxKEN+Po3tZRs8Q1fl58iDq7nimTsRJuGnoL6Ez98hHjmnpLWIBUbjqJjbI8pV 4WP38cBsk/bKV9115gDZmbLeMjRH4gqNN140e6FdKLhQxKkvvB4FY30LL1/yHNWx86ftxKVz Xo+iW69eGudL3K+jNVXeGB8FXj80FTkq/Oj0KT0WSH9f7SDzyaKn4EfglDNJ7MAfAV9YT+4E vuClgEFsYz3PWe+80jbWwSO0VRh3FfwXvl7bYVfEqWtji2EK+Se0BnyCIYEdtPFB4zhn9H48 bqf2nkf4AYM4Bq8ffAmahUfPZcGowDYdzznZL+JU02IWcr7AL7bDFDjFebgO9wGT4BUcglPX 31BejJF/WKz1e9F12B9GwTSe817IZ3Es9wHHYFakwdBmqoetuB/8JJ7IdupR0Bbg99u0WfNo HlE9/fQo7kfMD1YtWzrPc1UbNmlcn35nWVmKG2vexC1pm2255kWcs2C+LUleZtOSZtn4Dz60 2VMn2fiRw23iX/rZlGGDLEW6ac17j9vovr+y4T1+Ju3UxYY/fKuN6N7c3nu4pU0f0NkWDPmZ LXzpXhv36K02/PF7bd+KSZZHPE9+ja3qq2XknrC/nVafLUs1MBbPsMmj35Sm2yrvj2qkH9OY jVx50zVnVk7BKa+P3vCZqe4/97G8ivPVEHfwnMMtPH/F/JLmwl+B1yLaNtoSmdtXjKvcR4v4 FDjVqN971nig/OkPP2XXN7tdnGpqDZvIn6A+MWOCQt/5uzmlnAMaR+1LY/q/HdoVc4oaRfi2 iO3QJqGlQhvVSF5y+s3fxSk852gpxt3iS4dXjOGCU56fUs6derRoJphUvVoVK6eafrDKx1KJ UXgB4WmDOqqzK0610/3goSA//305RQ6E3xaxPnQQ2gp9BKdYx3O2h4V94BTb4or0FMeU5BTb fqieIh+Fbmqoa8ARxkjVqlHDmRNYE7zyfKfUk4AvPIcrwe8Oz4jtwSwYw7Fx8rezwC64FuJ9 cI5zcEzQYRzHvnAKhlGDlnP4d65+BixCM7k/VJ8/Gqqz+jT0VcIYO57DsQR9z6zDo+56Ci2l 789/T/reE7XEc//iVRudo0OXzt6u3P+HB8z+4z/t9PGT9tozz9vHoyfY6nmLfUxvysKlrp/w 8eFJT12uOjRrN7puIhdFvA9OscAsPOmwijgfTOIxGjt10OOA6CfyVIyjQkfhp2BhX2pV7BOX 3FdBjFC8ytY8VulrNXZzeYrNnzrTVi5eqXzAZR/je/nSFY/5XRSnzl753Ao+vSgtddb9fsyV +GCvXlZL328TxWGbyCuCNz2O/r3aWvQUtf1gFpyiZjd6qoZ+E4zzDVoHpgTuoJlYj08PrqB7 gj6CR5FGUptbpImC3sLbx7agqfxRx/oxRZoKHUXdJNdTumbJsUloGXgTaSbdWxGnAotgScQN cUr3DjuiuX/Rf5Fm8pxSLHk1xS91Ltde8KloYb/oOlHcj/XE8jhXFDtUO6f7gDswA175c52P z439YQ6cKlP2+og5RZyCc5wHRsEuYoHkufBVEMtjO9fieNjMvsT8auvzgI3VxawYfS/M6Vul ShW77bbbLFseib37pF0U98NHsW7dSh9DtURec8b8pug3ky7dnr07S2Op0mzT5vW2clWyLVyi OhTJyTZlWpK9M2KUbVqdbKuXzLdNM0fZhqSRtnx4Hxvb/xc24F8T7BXpqw8H3WVJQ+61KQN+ Yu8+2MxGdUu0j3q3tdlDfmnje3e2Id1utzUfvmKHcqjRvtEyj520wxcu24UjWXb+kHK5u9O0 bLMTxw+qzlehZckT6JzKP2EHxSlqSgTPedyfJ3tcDwaRr2IpZpTYFDEqeCvGeu4qfuAH1kCa q8YAeSoGTbYqAz+ySo9PssRBY635M5PszgGvWoV2d1qdRs2tQRPFaMQp11PeNilOo7jMf+f3 a622xzmlNiNROaYu7Utwin6v2hzaJvIUgVO0Wc4pnfu7OEVcj9xUFPfDbyfPIJwSG+OkpeLE qWjMVORJr1a1stdLorZfvK6N/w+Ooffq67GTONWBdlZt7Pfx+6F7iPt9k1PklGBSS9prtZlw KrAKHqG1OObbOMV2zvtjcAoNhHaCEWE8L49RP4MYnDST7g2OoHv4fiP9w1jmb3onlDfSfaGH OJ5zBzahm1jHNviD3mY7+3PucB1eM14Yb4XHHGGU+gN85zzCKvhDPBAtRY7Kt9NnUF/HY4P6 rtrot4EG7yx2ddI50cCttY/rKe2XoN9UgrYlci/6TitovMvSpcvs6sXPrFD9wBcHPKV6SR94 7YmdqjPBuN6tK1N8PijyUYyTSlu1zrnEnLuM6YVR+CrQWbymJkU0Zjfy88Eqxk8x/2GUf9I4 E/GKPBW+CdbBKfejy//HtsPpGZ6jytygsZSqm7RmYbLNnDRVXo+NGjv5meenPr34uXso0FMX rspTceUzaanzhqYaM3mKde/dx2LVtsXrvSbqc01QLJZYH9505pZlQVPBKtpOz1HBKfRIET8i Dl3TR3CKOrLUi4VDMAy24EuLck7Mu4HeuBYbxP/HtohTEZ/gHK9hHgyDeaxDu/GcNh39gacA ThC7gy1wxrmk+w1cucYO4nCR1mrMexV7aP85hscoFigu61ywgPPAF2eUWAE7YB+vWUL+C1YQ K2Q7x/FZcVy4LtopTvtzv3AKzx+1+mCQ6zH9B3iEUSEWCJvYBx7jSYR7vOconkj9dNjEXF5N xSzljHWNZtIBeCh69OghT/oJZxWedOomUd+P/FSy/Hz401esWis9lS09lSVfhXzrmzerLu0G W5S80mYvWGxjNQZv5JhJtjp5ua1almxbFKMb9/Ige/6+Tta9U22b0LODjere0kY+0NDG9Whq swa0sKR+TW1GnwRbMKilzX/yJzZnYBd7u9cvbPZrvTTHzHY7tD/Lth4+aZ+c/cyO7E+3PMX5 8pWzOluQa8flsTh3tkC+wBzLyVUd5nyN9SssjOr5yV/OnPOMi6KGX+SpiOakwrMeYnw8ukdd +wTvX32tg1MxT061es8kWa0/T7dqg6ZYsz9PtDaaj+p3z420qp3vsXoJLSyusfzptEW0PfrM qafw3ZxifjzF+P4Zp8Qu55TGC5Mjp5/8P+EUHgm8fiU5hZ5qqmtSg8I5Ja+Ej+WVnsKDXvo6 5vIo53yrKy1FXJB+On4/8lOhHgU5qv+JnoJDsAWtVJJTeCy+L6cYI/Vjcsr1lDgFq/Chk6tC /8ATxvHCKLgEW2AIr9FQfL8RjyJvBQwiTuexPP3H2Yf94RE6i9ds79i+vZ+LHBRsIgfFI/tw DZ/Lg7ZU69BWIefE9x5iwPjP3VejeCCxYNhFbJh4H78N+jSMo8Ij2F7aiQUtRdyvmfjUQgxr pu+xuTjWXLyrXLOGdenc1U6eOGVffyZPwokCG/rUEBv5l2GRR0I1ZtFTMz/4yOvPUhu98FCu 6lNsUSxwh3v/zh7Nc08F/nTW4/lj3O/5o8edN8TyGNeLl4LYH9oKXvEIvw5LV8EoNFakv/b4 XPXM6bFnc6rPF3xYPov1S1fa3MlJlpmWaX+9/Fe7+sXXdunC5+5Jh1OXvvqrnb/6hZ389Lz7 /d6dMMHwUTB+Ko7fmfoZrqnUvjKfRx312/H98Qi76up7qKU2k7gfnr8Q3wt6KcTxiN/h4XOv ehFX8Oex3cdDSVfhu4BbQR/BKcZYleQUnEOrwa+IYSH2F8UT0Sjulde9Bj0FI2jH4YTrIvil 36yvL9Ihzg9th1Mwi7wPcTrnkn5XsIa4H8fDGfaHGSwl81Xsh25igVP41Nnu59HnBZc4nvsh 3gfX4IxzqlTpYk7BH44v5pQ+X87BewrvL2KwOCWucT32raKcFJ8r10VnVZf2atO2vXNqyJAh mnfssu3KynAtRR1a6s5SN2n16iW2SnoqWTHqHfrdZWRkqI7SJtuifFXatm22VHOnfTxzjn00 bY7NmLvE5s+abbOnJ9kaedOfeOCXNkheiqd/LX/6vzWxD/7U0WYM6myznuxqM/s3t7HdYmxi 9xhb/FQbW/T0v9jiZ+6wSc/8wcY/+TvLSt9iF86csJTdObb1kGpailHHVY/i9CmNGzyqGmN7 NbdNnup6Hcu1w6qlfqSwQP7U0x7fw2fOWChqoMMhclXRXB8RlwKn2AafyGcxjor6FPX7j7aG AzU+WDXSYwZPsWrPJlmN52ZYopbGz8+0nw4abx16vmWlbkqwKnFd9B9op7y0YngtFNtqrPFD 6CXVrakfV0/P1c/VWMt4cQN/eHu1N8y5wJhY2hr6wm3VhnQixqe4Gm0UGoo2irEw9JHx9bEf bOOx660dnSHhdWjX2Jdz+pwZtJlqL8mdhTa+idrhWLX5daUjKt6i+n3VNSZc82LeUKas5pgv bbWV26yvfhFjcZgzkX6756d0b8QbuSe4SbvII3Eo+vncB/cM19gH/qCZgp5CJ6GjiOWxDUah jXjOvbGdbcTz2IYfJZ7/Dr9z/ktaeM46thGriWOb/h8s9fS/I9fANp/DTfUk4vU/CqwIWgcG wYGQn8I3gaZCw5TMScFT7r+NYkbh3uAsvA2s5b2R1yWG6fes+2Yf3hP5LniF9w9PBZyDaTCJ e/Gclr6bEE9kX+6JeyBnxfeJdoZRfKewh8+ccb0+jkrfC98HfRk4xffEnIfBf8HcXwl6/7wH POj1tU8j9Natna2p7qmOPrMbKt5izz33kv397/+wMycK7VLhBeWU37ERQ9+0zfLWHVSsb7u0 0w7F+zahq/Tfx6dHfG776hTpnFT5HrLkn8hRHmqfeEW9dLzk6RrPe9xrzBLfgzNopsgzsc8u Kb6IVwJ+Ua8i1FYPnnXmrNqTitcvw/0Tu6Xh1uk+xo0aZ3vk3zh3XmOmLnxq58WnQnn9Ci7q +ZWrdpYaSnp94Yur9vbosdZ70JN6nwnyUug3p/rlTVu00Xet30yc2mXxJFasYOE188dSn7ua cvcx8vjBpyiOF/nNA5dgDbkoHonbsV/gFN4+WAWz2B/dhdaqXiOmmEdoJjQZx/u59DxoLfjm 3kIdg/7BP0ebTjsOa4jpwR8YQ3vuzOF/ot8N+6O94AW1J8gzwRLWkfPhPF5fQudyvaT/D+fg vPAneADhFddrgGZUDi5Wn0WC6unHq+5OTeWLaugzqq/32FjjcWpJ71TVe6sjJrNf+QqV5Usv K5aU9Xq0MIxzxakdQkeFuB73ikakfkVgMON8eV/EK7m/ijX03cTjnZZPU59Zs4b6L6hNqlS+ lI0a/op9eiXf0rM22pbMtbZpx2pbvW6RpWxcaimrpKeWzPS6FDt2pmp81Q73VGzbnm0bN+1Q /dkVNvajmTYpaaa9O268rUpW/dmk8bZ5+hv23pP32V9+lWCv39vcpqq238IBHaWd2klDNbfp vRNs6p8a2rSe8Ta3X3NLUq2KVS/8wkb1vsPm/KWbavlttfPHVZ/pwE6NOc+1zfuVi1Wf6cDJ A7bzk51WcHa/FZ5T3+yE5gu4qJjDhXw7rHpK+CTgDTX8vC6SmEXdJMb04u3zsb7STLCK584w cQxm4Wev03ek1e2r8VOaz6P6ExrjO3iaWDVd2uxjsWyK3f74aOv06DtWrlpLq1I/4lR95aqa ttLvo1F9MUo1KrTEOacUf4FTamOIvXVQjM85pfacurReo0JtTpSLglFa0FBqW5xT2pagWFxJ TnXpJB+7eMV+tFHsCye87RKnmui3wcIcGdRyixMDaGObqD2MldaKlY64pbLmitF4VsZ3l7uu tObvLWexym3Wk8ZmPkbm+YU7MIt7I9YYrhO4RAyKPn6ITYZ7+SaneF2SUzCKdh4GfJNTbPuh nEIjEXuLU96BHBTaCL3EczgFm7w2knKyMIMYXKSZxEzxFO7QxsMg7pH7Z13gVMijsQ/3y2uW 8H6i2B51fxmzBqeinJQzyLUW9div+TNgGIwKLOP7hkl8nnCKHBTfdfFYXzEr9FECx+gzeDxY +1KPvq1yatwz94SOaqOxD430fmL0uSTKV1Bd7ddetfuF8lBc/VRt/PECe/OFV234y69r7OMc y1ir8ZLy+O3busPSNY4qTfE/4nmwhxgdcx3mqG5E/n7VmzikOn27pY9UB+LY7sizx9yH0fip 3c4oH78r3YSuwjsBt8Ic9EelrdBXMCuqR5GtOrSZtnO95rjamKbaaWstaUqSxnaetM8+v2oF 5y/ZuctXxKnLli9mnbuiuJ+45ZwSs14f+b717D/QOVVb/r7EpvLAqNZuXD31d8SIBs4p5YPE Bp7X01JTz6uLLzHijHNKDIEpsAZ+8Bj4FB7ZL6ZIT8E1j+FpHfvDH44h18J6fw2nuF4xp/A7 RFoL3oXr0GYTF+ORttzrHKlfRvwNPYXmCEzhEW3jOkXPQ71ZuAan4AXayjklPsAvzum6TMzg eeSt4P3qs9H2+uJ7Hb2PeuI3jIrTPcIlFraxjufV8eTpvcTofd54cyVxqpzifuXEoCp67/+M U+jVRl5fyTmle6K2nzNZ/wnutWJNzXESx/jDJor5xKq+gHLAakur3FzaPhz3rtp8jfHNVL3z jBSNq03WPFILbN3mZbY+ZZGtTJ6t/JT6VWkbnFO7dklXZWqeqnVb7OM5S+3DpAU2VnHhSTNm WvLiaTZHnFo6erAlvf6YDflZXXvjty3s4x5NbNHATrbwifaqmyQu9S7JqWY2f1BXWyJNNVZz zc/9SzfNdbPSzh2TD+iEfH+FBy3rxDHbmqN52U7m6LU8Faey7WSh6oed2a+xFEelpY5Zjsb7 UjOpvrwQ5KlK5qp4jnZyv4T7KZSXEqvgE7xiPd71mN4jrFavd+xm1Z+t1G+M3SLGVdaxdQYq X9V/gnXpN0qLalzE/y+rUL+z4t9tLU4xwFZtlEdvUEdtnMa+tOK5+gLiRpu2qlNRxClqKlG3 HG8DnGpGbEYMIK9Ae48PsJhTYhrsCbEf2ib61fDLNQ3708/WOCf64KGdCpyiPjn1X/Eh0I42 VrsFo2rVri1tHTHqpptusjKK+1a4sbzVFaPQU/Tl4+rGelyJuknOKbV/3p8vofe4Hu0j14Zh 3B/3EnJQQU/9d5xiX+4NnQJPfwxOkWuCU8UxPbEBLrAeTcUYKeaO5zmM8lyRuE6cDl6E3Fpg D+099wWneC+8LxgVvImwlvUsPA/xQjzn5LbQa9yPM1HPYaLnNMUS9FXQcrCUY/F10kdgTBSf sfcL6JOob8L60B/gNb4Kr0Gh9ezHMcynwtwdfLZ8rngmWrdvL0apfRM3r69wi93+8/9t//iH aQ6fI2Zf/6edPJJnY95UTb8JU2zt/KXSURvktdtgR+SXyFZuaqM0FeN14QicQQvt3ZrmfIJT +QeUf9rLfPH7VOtoi897eF51kchBhbgetZLQUdT1Qz+xkKfC58e58VZEuuuA1mVa6irVEVBO KnlRsi+Fp8/b5198ZfnnLtpZjZ3Kv3jZTl0Qsz7/0s4U6Su01avvjLSHej+m/JTaY8XcEtX/ R081qK8+G5zSY6y4ECOe8BpOkbevode11eaiiWBUVANVPnGtjzil/5L2x1PBmCnnlNhTcn+2 wxxyXOSwGCccnSvKQ3kNCq4pDqDJYBiPaC3GEHMdtE7xmFh9Z15HTyzCA0EsDT0Cn2AO7brz RboIFsGcOP2O0S2cB4axr3v/io7hNRxjP9Y7p3Qu9oVfsdwbbE1QP1WfH5qJzwXdBLtgVU24 qs+srj4HHm+4qaIz6rqyN7pWglOcm2sEPcU6eMTCOF84xb0QO2S/wM9KteVHr6t2QdevVlXz CmlexBbSVLUrl7MFMyba8bzd8qSnWOoO5aXWL9ScHaqZsm21+79XJc9Vjb3Fer7ctm1ab1k7 VDdp63ZbvkjzekybafPnLrQpUz+0pcukwRZPtjFvDbYZQ3ta8qgn7fmfxthI1Zyd3rOFLR7U xRY90Umcks+vV6JN7Rlv0x5pZHMfa25Ln/6pzRvQ1SYNutvmvNRNudkF8rUqvpAv76q4tCf3 lG3J1tyf5wosbccWmzVttO1OVw2lC7mqX6H8rbx/+ScOF9eVDfMjUic9QXoocIpclY+lUs0+ PIB41H0MFfXSlaeqKw7VfUxjhMUolhvFpvJaX0vzJ8KprtJTP31qojXscI/dVLeTNRCjGiSo TWnbQt+12ne13SwN1N40d05FeopxLOipNtqGF8/HxYg1xOo6SnPBKOrSwimYEMZ78px9vL3S Pu6v0D7ONXEKjsEJ+t20a031m3VW6XfQSL895r2lDWV8Z0wd1ZpQbqK6/G2VpanKlCnjnKpc oaJqZsdanBbijOgorom24nqcGwYR1wtcYh2aimuzjfvBq0j7iBYpySna75LjoIKe+v/BqTjp qIhTaiPE6OCBqK+YJzkpPOjURYIXePLgRGAU3CCeB5PCvQUtxTp4BZ9CvI/3BV/5fAPX8P4F nwQaiYX7YYGX6CxiftRN8rFY9Gn1nXE/7qPQb4NYH7G8EEt1Run3EzQVr/nsPW9F7LVIY9Gv gVPM44WWgrntNNa1gZ6jpdp26WKlrr/BZs5faJfRIGfO279/8TeNn82UnhpqCz+ebbukY7ZJ w6QuWyUeZSoOt81jf9TaQ0cVe8m3bVesT3XRpaUKclQTKeeAxwCzNqY6g6LaSVonnYReCl6J aK5f5vA9rGP3+py91FBCV/l4X8X592/b5T6/1JXr1OedbRvWrLfTquV3QZ6Pk3o8oxjfKWmp k+fFLMX8zkhfFUhfBU7d/8ijhpaqp7YuXvn4xs1U54+2V/yATYFT9cUkOBWr+GBNtbe1iHep TS5mi9ps10xaB5dY4Ao8wvMQcYW2F16gSfQ5izm8hl8cy/PAIz+eY3Ue8lhhPeeBbzzSnjOW iPwSrAk+OHQI7fl/9TXov6rfDjE28lUwDA5wHHqMY1hPnigcD6PgG4yIjhOPYJcYyDEx+iyo p52gWjtwqZbeD+zieV2YqvdVS/fKfqwjHnh9+QrOqdLlyvv8vbAVbsJQ55T7JCKvIO+P+n6B l2znOfty39XqybdeJ+JUZY35bZOoPr3mmo+PqWTLF0zzmno7dq6xDdJSy1bPtnWK+WXKB566 cbnifrMsddMqja1VzDp1o23fvNFS5QlasSTZFsxfrPxVis2ek6R668ts5fyJ1vMPP7cJmo93 wVv9bOhdDW1M9w42s1drWyqvxJKnlJ/q28qSijj18SPxNkf6atGTt4tTXWzyU7+2pGfvs+zU hfIYLbW07C36PR5X/O+opckLe/HyBTF0pQ19YYDNmDrKsnessWM5O+xUnurSnsnzGB+1JfBP kHdqpLgdngo4BbvwpePzqypORTX/qPX3geswaig1UP4pQRyKlVewprTZjX3G2vW98ASOc03V 9Ynx9q/yU7T4+cNWJraDxTaQHo/XnPKtxaY41bor0lMN1AcgBti2HZxSbQK1Je2km9qqDYrm sCOfE/Eqyi0ox6NYj3NK7T46hrgObAj9ahhB+8U+LLRPsAGWsQ/7l+RUvNpQOEWbmyDtUFvt czXpiRrKS1WooN9WqVJ2vVhVXbUeYRRzFiYo7oSOgkPMIUxbyLmDnuJ+Aju5Hs9hJW2oH6u2 m3acNp12nGv/M06xnvaUfj8c+zH0FCxqKD7DKGJ9kaZR/1bvDx2FD531sAQNQ6zPNY7uF49D YFS4t8AfeIWO4pGF+4ZR3Dv7wF7uH18F3OEaIZ4XOAQHGevL+GKYxHruA15GbNOcG+IP+hpW 8R3znZOLgllea1bfC9v5fdCXoH8QOOa80ntKVFtEfq1zZ+l97R+nc8TpntFU8eLjpS+v2oGc wxrXf8W+vvKV7UzdboP7PaE55VMsS3PMr5m72FbMnOfPD8onsXfLducMnEIfEdM7tnuPPBaa 12Ob5j+Unjp75LA0lerTShtF/gjFO+ShoCYtWgkWkZvCRxHpKs1NL4btlzaDY6xjXFXOzmyd M1Nz+G6wbWs325RJUyx9W7qdOXfJCsWoPLG1UFoKRp2QtkJLnS7i1DnpqWEjRtl9D/XQ/FPi h9pv2lJqRDdOiHIe5KmcU9I69cQFOFW3SDPAKs8jaR0MgTFhDBVsCdopcKiO2mp0E8yCX8Tx Sq5jf7bDryh/hWcvYhjnC2xzpsED7UsbH+WWFPtQG+66SOyBI3AojMX9f6Sdd3yVVdbvcdSx ICVAICSRhIQUOgFpioO9E0RRsSAC0hFBEMSCCAoDIiCg0nuAhN6LFCGUBJIgJaTRQxWwz3zu vN73rvf33Q87Ml7vZ+Y6f+zPec7TzznPWd/9W2vttT2LYBDsCuJBfJZfcy5Y5+I+es44Pkqc I5fPcYp+rLbDE87BNvQaTCKmB6fQUmgndFOU6kbBKfQTjf14j//vxpsDTqGnbitTzjGWe/Wc Is+C++UeWGZcMNzkXuAWLEUDwuQqGpcKq4g5h4RUUE6QYq3q/zerHWVrFk61YwV7bN+edZpL XnNOr56nHAnNIXU4w2mopWlzVFtL3NqxwTI3r9HznGY7Vi21HZpzY/PSBa6tT5umcesLbdGn g+zZlvGaB/FeW/5hR/vwkSj7/IUkS3m1ka3s29KW973T5ndpYHM6JdiMl2NtZvsatqBLHcWo mtmy11vazH5P2uRej8lHLZ/j4sk2ff4UO3nhmOXmnVa+Ya5dKi62k/n5tiFlsn06pJ9R7y9j 5Wz75she+z/iWaCbPndxJz+Xr4tViVPkSsAwYlIu70/MwueH78/5/+QHrN7nM0scoPjWW3Mt 4o3pdov4dENH8tknSKtNtWavTXScapLczW6QnoJTtLp1ZdfFfXx9teuQG6p6SrLjSbIn5FEw 9pb6RdSEDThF/EjaQ31jHwMnF9z7z7BFjjs6jle3XkxgX88ojoURsIJ9sG0lnJIdrSG75Oa6 kC2OlT2rUjXMcQpNdcsttzhOlbnlVs01VdHFptBhjjWeU/ILM/8e54ZPXPe3nLpWT7ljf4dT nkMwCxuPPfd+Mm/v8U86BhAfVv/qj+ZRoJXQLnACXmH/eQ+fnL9P64kZsd7X3POxIRjj2cr9 OR2q7xF2wSEfs4JLbONz8co27wtEI/ncPfgXxKWC/HU/jorr/TpGi9zCoI4tvkJ+d+J+MAj2 w6Fr/X34WvH10V/ht+A7Zzv9Csc0+faYZ6axdFRSUpLLo6itc5KjXeq666zXG/3tp3/8lx3V fLvnZPf/+++/WM6eLOvdoav+2+mKR221dapDS9v75TYr3Ks5ofYfsnzFpjI2bnZcYe6os3n5 Yk+G+pLpTked03/y1KGDjkNwinl68evh54NNrCM+BZP2f5WuvIwCp7U4L7nrh7Q/jMtxeRR7 bZd03b7te2zypCmWdzhf/VNpJvn+jp05b8XSUscviFm6fxh15tvAD0isavgn4yy53QtWWQyp Ji2Fvwr/VYJsb1xsovI7A06FiVPE6eEUuRTkUITK94auCZgT+OTgDByh/hEcwad37dgqtrMe nx75gPCHcwSaSfEbLcMjtsFAxyl3TvjFMyT/pI6BhwGnuH6Qy41PzPnKrvrkHI/k2wviT1xD 2kf2nNw4p6W0H8c6tmkZRrGNdewLN4hZRYkRnk/oMae30FTaHiU+xyoGVV33y3dHTsXtukfi VIG+glPyd+qeiU9VVAzJ6yliVMxD5XLOPaeUV+Q4dZWPrvaHWAUXPb+4R+4ZToXFKB89SowT bysrTpcUq3hARGVr80BTWzRtnBXk7rTMXcrv27DIVq2dr9y/ryxXtn+T8v2Wps7R/Icr1O9a q7HpS2xd6lwxaqllrF9tXy5ZYCvmTFXtyimqBbbAhvZ40l55VLX8Xmhqa0Z1tffvD7eJ7erb om5NbE3/+2zFGy2kpxrYbHFquuNUrDhV2+a9eoet6n+/zRv4jI3t2FJjKJbZkumjbMQnw6xA MamiYxfs8JHTdrqgwC6LVYV7Ntqkof3t/e7P2ZRh/axo9yb75XyR5kHU3IbSUq5mOn485U8Q s0IrkVfhcvoUc0JrBds0z5T2wwdIfaXw7uMtpu9kixk416L6z7KQHpPtVtWmCFEL1bjfOvIJ Nn1jsjV5to9dV725RcbVs7Bo6SZ8buIF41VgFZyqK5tCjl91LTOmCT9gQ+zL1T4wfKHWeCOx C58f/WZ4BHuwQ/ABO0Uf2/PLMU3H+D609/thv9jmOKVnL9HZYXzh6q9gc2VvKyvHDUZVkKai Bsl1sltoqSp6H6E+Tm31a4iPkOeHnURPYRM5N/dBf/3/8vtd1VcwjP4+dh7fGCzCjsMmXrkP tmHz4RHro8QMXtFSfo6O/zyPgrx8cry9ptK1pbGCuTqC/D7HKH0n5FVQ0wgfHI31fFfcIyzi fnmFQZ5RbIetvHLv7Mt2GrwiDoWOQi8FvjzOT16F6sqS36DzsZ1tAcfkp9N3BcPqy+dIX4Pv 3mkjniV973znxKV4Dsix5PeATaynsS/PA69J8is2lC7Ef+m+ZzS6uFdN93mzfL3p4sLlH39W TsJPdkm65MdLP9i2DVusS7sONvfz6U5Dpa/eYHs0P+LeTdtcLsUJx6ksVx+CfHPiTsSlTqpu RME+5fUph+L4AY3dxf+nsbv476jfh4aCTayj3ix56eixzE1bnP8QfYW/D2bhV6TtF5sO7da1 tqZbjvyOkz793IpPKidR+fNFJ1Rr9sw5O6VcimNi1NHz0lZiVLHaKX2W8+LUsDFj7fG2zzk9 FaPa0OFoHdneBNneGDSS3qOn4FR4mPxyaAWtD5d2qCQfFvkMXhuR9+AYhS7iONlndBZcCdgl vog53r8XJ92G1iLnz8egOB/nYZtnIMc4tml9iW67ug59gR8Mfxh5fzAGLsEZ5uhAh3jfHjEl +IQe8fqEV/bluDj1V4g/8Z7zwgb0lo9leX8fx9A4hhw/YlMwie8OTUVMCj0Fr+BWEK8KtFcl ceqmW8sGeRSlrrfSt5V19068yekpOCVfhuck7IVHXIt8EfiERuT+aJV0jUrRyp1UrPx29Tnv iI20mmEh1q99a5s7bqgdydpoe7dpPO/6BbZp4yLlAzEf4m5bs2KxciMWWu4+zQG9eYWtn/eF rZ410XJWzrfcDepzLZlqX80db/tXTbas5Z9Zv9Z17PVWtWx8h6a2etgLNuqxKJvyQgNL63Gn rR3woK18o6U41dDmdKxp06WlZr1Uwxa+Wkd6q7Et69PSlrz3kub9bWHZmxQTS5lgU6Z/agXH DlqxcpIunL5gF47k2E/KTT+dvthmDe1uUwaQx/6kZad+Yv/I3ejYQ34E9f2oQ+Hy+HiVhgry 1acrF3BG4A8cONu9wix0VflOY1QrfbRFKtevmvLao+QzDO09zcp0mah5qMZa2ZdVk6LjXy2p 90Rr/nw/u7HG3eqnNrKw6vK5YVvU/41TS1QsgfhUXdkcz6kY2XB8f45Tsunk+sXJvwd/sD3w KhgD/BtOaV/sUgm/xCJsFvEt7JmPGxFDxxeEJoJVbm5xPSswwNlV2cZQcQqfX0jFCkFs6vrr LSw01MIqhbp8v3rqi8dIQ5FHATM9p1x8XveBLaSPTz8eXyD35bnl789zChv5e5zC7mPb2c9z CobBKbb9p5yK0rngAJwiRxx9hZaCUzAk8LHJH6Lvyest6h7Bimj5HrhvnyPB/XOv6BI45JnP 9+kbPIYJbHefGf+ljuF8nkUwKKhZQd3bIE/dzdGl/q7fh/fM98FvCpvgvmORvm9ihvzmzC/v /L7aTp+AdX5/fhc0VWP5FeEU9849Ml4qQsfj87v7gQet6FSx6jsf13jJs/bz3/6XnTtx1tav WGvv9h1kY5Wbjt9vn9qBHXtcbjp5f8dyDjr2EGNC98CgEwcO2oWCQrHnoPP95WbsUU0l6qSr Lq18feREUPsITRXk/x12/j/YRD0kfIIwC311oUBjszZvdXrtsPx+RzL2W4bmCM6R/+/TsRPs /JmLdvHy93ZQPCsqPud8fjCKBqOKlVdx6tIVOydODR09xh59qq3m9ZCdVp6ft7Nx0gcubwLb C6cqq+8ihsCpaNlgtEEJp7SMDw8dBJM8l9BDv+UUesqNidL14qXZ0FXk+cEpjieXAu6x7VpO Bdrqt5ySppLdJgcBTUIuHLaehp2vqdoa+OZY9n40OEVDCznGaRkWeU6Rp46GIt4FpzgXuowc dnQV52Jfdw2e/1p1xSTFsuGy9BS8gvOwikZcisY2Gn6/IN+PvPTf41RQR5brcH2fI8LnoM4f n4N7gV189hDlZVbSeAH6ztH6LzeKibDEKuVtWJ9XbOqIt/RMrJTWXuQ4tUW+vwNiVHbWdseo dauWWNb2tbZo5gT7eFAv+/itXrZk/HBb88VoWzbuPVsy9l079tUC27nwE+v+UKy9el+UTet5 n83t96hNfr6ezXxFeX49W9i6Nx+2lRojldK1UQmnZopTC8SpBV2aSHM1s1XDO9nYDn+xjLVz LXP9fOXHL7fjp1RjRZw6lnfMig9kqtaL6ntlrrSPe7e1aQOfsxmD2tniET3t+MYZLtaENiK3 Dz8feXzlOo4p0VfUoGVsVY2BczQX/WyXYxE3aI6bj975/7qNt8pdqaOkvPVukyy0u+b16PqF Veio3L/2Y6zqS8Nca95xsJWq0cKq12lslatrvCb2SjYoQbyBU/EJsjWwRKyKk81hfkI4xXxQ dWSLmIee+BS56DCBvjJjqVz/WOzC7qNl4BC6CpuE7aK/jT26Vttg1+AGnEITuTwK2ah48crn L6CnqkpXVNCciGXKlXNzuZQuXdoqK/ePFi87lqD9YVSscv48d7g2MSqfK8F14RTbuWfuhW3Y Uu7D6xBi+Nhwro+t97qKV3QHNhS7jz2l+fuMx4eh/0+UnmPmCQ/GT8mnoj5mop7nGP4v+h/6 9dQYwJddM1H9QB0XzMshX77OCZuoiUSuH/qGhraBV2gp8sZhiNNRWgczuBevo7yvz3OL9dw/ r9w/GgtG+c+DxnJ58Pq8XCNKvg6Y1UicQ0/BwSBfnTzAwPeIjkNHMX8k98Jv7L9rvnvvz4NZ 5PfRVyj5/tVP4Hf3morf/y/N77Rw9UW4L+6H+FSCfid8fvPSFisHQbGdc+c1FumyXZT/jDyK RXMW2Kj3hlvajPmOTdtXrrP8jGzLkabZvHSlfH4a+yH/HcxBK5HTd1jjUy4WFtmFwkKXS5G/ V/XPpavIs4BL+AZhEf4+Yk8F+7Jd/Mnnn1Pnj7xBeObGY+3Ncow7lVukWhhr7Gtdf1XacsXF d9gPykfPyFI+4Mkzdvi46tOcPuMYdeKScin4PNJSJ1lW+/CT8Xbf48kWJf1S5aqdxe7i4yMP HVZFwhbxo0oodRCwn+KUeEXOH2N00Ur459BB6CPPKtjDssv503r2Q0txDNtgGMc4DSX7Dqcq i1mcizmA0FB+XhD4xrI719XrOI2mZwRmwBY4Ra0H9A9sYb3jkZ75CNn9QEsFOX6wxudGUF+D 5Vp6ptBe3g8XxKsSpb8S5OsL9A7bORZtFcS4YBLcDvL8iEG5/HStI3+f9cSr4DraqrzG5d6M nrr+phJOcU6uzz26pvuFQWg2WFqufAWn86jfB7+ITaEf+XyVdJ2y+BXDqrh853pVy9udcRG2 LWWSfdijnc0Z/44VZqxRHCrVvs5UbOprzTOTlW5frl9ji1Lm2vIFUyzzqzXW7cl7rf1DTW1s j7b2wUsP24fPt7CUt9tb+tQ3LeWdZ63vgxE25GnVQxKf1gxta+PaxNu09g0ttcddltbzbkvt 1UzxqUYaN5Vg016KtdnSVPO0vKTnnTavY5ItG/KCjXv5Ltu1cpqdP7TFdmd+qRhqkRXuz7BL JwvsH6f22pXcbbZjWj+bMbCVzezTwlYPb2PpEzvZ9k9fcbXQYRO5Efj4YA/5Emgs+IU/kLno fe46rIofNNeNtyLvL1T56JXUKr4Kr8hZR2spJ72rfIOdJ1h4+w/Vhttdr75rpRJaXuWUfG74 dmR7EmVH4JPTVVqGU8xBCaeoXXQtp+gDY2Ou5RQ2CFtFIzaEXw9bBBfYH23D/mxnX3yHvLKO 2Aa5Xo5Teg6Z693722Jks8ijqCAmlS5Txvn8ypaVRpcdJz4Fp2rp/4DPD99fCaeUQ0bOn7ed f4RTsOvf5ZTTU3qefxufglMJ4hRMqqb/N/7rKP1nqH8Tr/8dnHLHyJdYXY28dDjlY1KwCIbA IvIX8Pd5pvAefQU7onQs9h3Gev8l9886Gp+DBnvhlNdRbINdcAm/I5xiGfbg7/PjeVnmulyL 7XCLMcFoOtbTH+G7h/m8wirv64NR/O68wi1+C/bht2c/9G19xboY692oUaOgz6B7r6C6I4yf OiimnDyvurMXv5HPT+Niv/nW5VEsnJViI9/+wDYuWe3y/DamLpNmkj9PrHDjqLbvcr4+GEW+ Hrnk5PqRP4GGYqzvsf2a5zAryIVgTkSvoeAROenwCt/f+fxCxzp4xbjefPkh8Q9Ssxa2HdDc HRuXaAzMpm22cNZ8S9++2765cMVyxL+ik8V2RL4/OFV47oLmSrhsp64o908NRh1TbsUIjfO9 9/FWjlNhsqdoAMauktsXI24wjor8iaq/4RT2mPgU3HGckh1GB13LqRJeuW3iF5wSo9BGnlPo MDhVoqe0zH7Mm+jPxfkdp/TKupLrsF72HG7wGtQgUl6Qnnn8d6zHB4jthwXwy43rlX3HB+g4 pn14JTaFP7BkX50DTgQxLvkJ9X/ifJ5TjnHaH/1Eg0foJpa9H5DcPvhUwil97pCKVaSnytp1 NwScIo8C9nAtrs0ynwXuck1yQ8pqjBWfyekp9eWCvBH8rappK06V1/87tEKI+sdJFlPmBuvR 9jFb+flHNrhDss0Z947qvK5XDGqFHc7erJro2233zk0a57vKVixNs+yd6+1g5hbrKk51eKS5 DWzTwno8UN/Gdn7IxnR8wMZ1ucfefbqu9b63svV/pJpNeLmhrR36jI1/OlGxKNWa7dFCmupu S4NT0lNwarq0FH6/uR3ibW7HBra0l/IBxanJ3R6w3Sun26ns9Za+a4NdvHTczhUdtm/PHLOf ijS/5/xPbOobj9rC959VXcD7bd2ItrZxVDtbP/JZF3fC30e+X5A38YXLm4BX5aWryEmHY8yV CK+oBUidiZgBs1w+YKhYVqnLOKv86kTN7TvJwrtNUZtqVbsrjiVdVaXDCNcadxtipeo9ZJE1 G1mlGM2loPGESfIfEJuiDkWs2IGOqidOsY5cCmoZMQ8UeorxU4myRQGnNDZTfd4kNbjj/D7a VsIp9YlZR84CnHL+N/HN5zDAMuybi13p2YU5aCnGT+FPc5pFtpM8ivLKy75Z46aITTHON1L9 tUohIRan5xy/H7l+aCPHKfmWyHWmn/5HOIUfDJ3kNRb3gY33+uP39NS/8vsxHwN6KuCU+oL6 H3hOsQ4ekYMeJk2Bvy9Kmg1msB5WwDByG1hGX6Gr2O7n6uAeYRD8gUP+3r2GKuGRjmcfPovn F/tyHRf3Eofw9dGCWJXGIOh8gb9PfQndA+OlYFSSxjuh8+Al/LlWL/N739W0ifttGSdAn4Tt sInfnecHjtFH4Vg0caz6p3fffbcby11HfYxS15WyvoMGKW/7B8s/cVJ5CJcco85fuKRxvj/Z PI2jfa/vINu5Yaty0FfbKuX6HRAfTn6d6+JTOarfh/YhP++K9Awa6Ijq8BVl54hPzOtx2MWm 3HhfcQceoavIC2RfWASnyPsjpw/fH6/kZRDvylWN9SAPcK9l78hwNdK3qBbG3GmzLSdb5zp1 1o4o7yNP9SzyT59VjbQzlnfmnOPS6e+UX/H9D6pDe8UKzp63MZ9NdpyqrjhLpP6PcMqNBZJ9 dXnpjlNobfmjpKeqShNUw78nJpHvh28OhvwTP2Q3YY3j1DVs4T2MorHMmCt4BKeIZaGnqK8O y9Ba1K1gPziFtuI1uI44g/3XNvQG7MDGo4vw12HfseueKY5J6ovAITQQGgtN4nL9dHyi5jKJ V7/NcwIG+fgTnArGNgVxLucj1PHoq4Bruj/dC5yiBTkUgb4KFdsjPad0r+RThFQKUz2KcuLU zU5PMQeVyykUc1ydQN2X5xTXwO9XVnqKew44JS0lHycc43NV1HcYov5FaPmy8nMnWYSe3SUT RlrKh/1scLsHbfHE9+ysuJCtvPSCnC2aB1F1/raus7WrVtnqFSuUT5Fmy1Jn2suPNLX+7Z+w 0R0fshEv3Wt7JvWxBQOS7YPWMTbgvko27OlYe+O+Cjalq3x4Q9rYqDYJNrOLtFQvcaq39FRv 5aV3a1iSRzG7fYzNUT7F9BcTbMPA+2zx4Kdtdp+HbWvqWCvOWW37D2xV/uxRu3w0287m7rbi XSk264OO9mmnerZh9LO2fFBz2zkm2fZNeNYyx7d18SYYhZ4i7kQuus+lgFHM6+vnoyJmFaU8 QMZXEbMi1yJS+YDh0lXh3ZQXKA0V1kWc6xIwCk6FvTLScappj6F2/R1PWJW4+uKUalmLUw30 HZOLTr4EY3thFXqKXHU3byF2Rf1fOOXiCuJYovZh7kR8ftgkeIBugkv424hDYJOwT9gl/H70 o72OYh36h/2xVzXRUbK9cXqOyfcjLx2NEKXzkEdRtnw5u+nmm53fj7pJ1bTdcypJfXpiUjWU 9+E5hU2EU1yHa/wrPYWmwNbj9/s9TmHvse3YdBjGe/b3y/j20E7Reladb0/PMz5AfIH4BH3d JN7jF8Tv532C7I9OgU/BOKmIkviPjws5FsjXBiPQPfjifIwIhnFfaCkY5XnKPdJgLNvhGFqL fVj2/OXzwimvo2CU9zOi3/D9BToqqB/IdjiFxvJ5go5TeobQ0Hz35P7xHNBf4Hfm2aCfQr+E ZZ4N+ic8O/xm6Gny/fgM3Fu4fLg1tLx83To7fvac49R56Y/LiunAqb9/97MtnJ1i/bv1UQ3a rW7s1DrNo5GtOeaPihH4/PIyslysiXy8S0cV2xJ/ju+XHy6LeaOUr3fokMtLR1fh4yPuBIfc eCjVTcJfyDpYxTlYZnxVfmYwHxWvjKVCpx3OlG9RY1Dg1ALpqbxc1e5UHXY4lXM4zwrFIvTU keKzqjt7yc4oJnVW7bi0Va7WT5o52+5v1dpiFWeJFqtgEPl+zucn20peusulEEvgVJhsrctN F6cYPwWnYIjjh2wyusjpHzHF++w8wxxXdLznFFyKl38PLsEqdBL7sMyxcYpRceyvnEJvBH5E 1nMtuIQGobGM1kAfRel5Z53XTd7n52JTjgmKGWlf2IS/D/1FjrtnlNczPjcQ7QLbYF+UbAUc hHlh+uzEndBMQS5kwHC0FX5Rr6XYB05VCA2zW8uEGGOniE+VVV4WrOXc8In79ZyCj9T2c7WS tN3XooDH3ActRPcFp6IjwmQXxeYbSlmexkZNHdzVhnZ4wuaOHmDHd6+wjC1LLC9LY3n3fGU7 tgScWqN66Fs2LrV5sybaEOXXzR3zjm2Z+JbNG/yybRrZ0T7r1EJz9ta2wQ+H2xfdmlqvFrfZ nNfuseXvJtvI5Dib1TVglOdUSnfFpzon2owONeT3i3FtVvuatl7ze8zvr3vp+6gtn/K+Xc7b orGIqo10NFN+8wUaKz/VVk4aYJPfedHmDbjX1o96xla93cL2TmgrVrW2HaNbWcLg+eKT6iTB HDV45Xx8ikmR14fWIseCxty+7Aur0F7sz76RfXSs9FPVLuJUJ3Grs/jUdbJF9JhqoZ1GWSXl UtzRa7jd2KKtlY+uZSHVa1tz9JSeJ183KVacglWuPoUY5OrCOk4pPi77gx1yvjty02Vz4FRD McjrFuf3U3wKPjhOaT/4AYscQziX+tLsD1vgGDYN3x16Ck7Fyv4zZwsMqCaNRA7FrbfdZjff ovl7//xnxX+lN/Qsh4ZUcMfAKWJTXJNrcD14Suz+/5dTxEewk2gm2IWdh5e8YkOv5RTrfuWU 7LH6wSWxKf6j6tcRe0I3+fUsw6dw/Zej9Hyjw2L1X0M/VVZeCHUn4I73sTGWFx7BpyBGpFiX vifiWHAFfqDDYBP3B3O4Rxr3D6O4T8cibYNTPm7lOcVxnAv2EJNCs3F+eMh6xnLhX2Q9ORMN paOYU9hf39W6FYP4vfmdiU+6sQbiEb81zwzPCn0U3uPnc+MXxDDvA2yk87qxvro/vv/KEeH2 7Isv2Lkr31qOfHQn5S+78tPPquf5s11WbgLxqTVLV1nfV3up5utal0exY/UGy6Lm7Fe7XF76 2SOFThNRv9zPx3Euv8Dl++Wp3iea6mw+dSl+nRORukjwiRgVjXwJ8i/ISafBMPQVuot4FzkX tJydqsWuOUJW654Wz0+1Q4fybN8+5WQoPpYpPVd07qLliVEwyXHqx5/sjPIXWT6ourozF6ba g8ltLL5ufatRu15ga9V/pGYSeX5wCh8gy3CKuY4CjRCMYS2pP6H9YAcc8Zxyr55hV32CMA3t xH7kmcMimBSwSdeCf7LvsAuGuXNyfY5T4zjWEafiFW3hdIh4A1uczsCGy947TmnZ++jgCjrJ 51bAKXhDXoL36aGf0EzU2Cvx+XGM1nE+9gty0/Uf1f+JmFPAKcXX9D/E78d71sOlwCeofHt9 Bt6Tl35buQp2w59vdZwqp1oTjq9iFffD+d04KS3jo0RPkfMHT10tCv2/eeVzcJ9ltF95HdNA PqmqFcvZ3dEV7aLG8U4f1FH5cs/bsC7JdmDNDOWMpqpPpHkRxagv1y6T32+9bdcY890ZW21e yjRLmzzCdq2eY5e2z7VVI3vY6LaJNuSRSBv3QrwNfiBEnGpkXRr/yRYNekxzSiXb8CcTpa3+ Yotfa2Fpve+yRb0bW0qPJNWkSLRZnfD5RUtPRblcipWvN7WFbz5mqYOesKWTB9svZ+WbvnTY liz9zOaP/cCWTf7YJvV9ymYMfsE2DGttmz56yjJGPWG5n7ezXSMes/QPH3H1YsmTiNbYJ3QU eXy8loz1la/PzZMovx85FTDJaS4YJWaVcKqb2NRZ46pemWRVxSoYFfXaLKuiukqVO4+2Jn0+ sjIPvKTvNcEqxNS15tLaDfSdE5uCTXHxxDJk72XnGU8VJ7uCpmLsFJyqr32om5SgdTABTjUS Z5zfTzoLu0MNbN7DCnx8+OOwSzAMbtCfZjv+IF4dwzynZBv/iVOy2ZXEqT/fdJPiU7dpjrzS 8sUHuZ/k1pAjWF86g2vAPq7Psu+vo+v+XT0Fj37LKWw563n1nOK9t/9wim3EmYhBoY2cnlLf Cg6xHKfn3K//Laf8e/ImwkIruzmm4BKcQuN4zVRfuXCMV/L+OfQV433hFFyDPbAINnkfn2cV 7+EY2z3LPIPZxjoYBKOog8414Sbn9rzkurASLQUvWc9+fh/0FLmcaCR+fzQVvy+/N7qW38M9 I9K2vEdreXbxm9VWXALfH4ziPsvIzz9pymS79NNPmv+myE4rNnXhu+/tu++Ui/TNFfvp8g/K S99qb3TtbcvmprrcCbTUfjEqY8MWy9PcUpePnXL6iLxx/Hhw56LOBavQU4VZ1KQ97JpjkviE RnJzIsoHiL+Q/HPiUMyjmKU6tuguuIUPkDz1A2IUx6Rv3Kbc4gOWOlf5vsrnyMk5aNnSdYeL jtvhQtViF2fzz5wL/H7SUGfEqWLpqSKNpzogn+a8pcvtgeQnxakGllAvyfmwsK3oKXInqokL jKGKqCq7K05Rg5axQPj9GLsKUzx3qBnhNJR4gi/Q6yAXe9L+sCVCOsPtL7sNk/wc9XAJn5/z /cmec158goHGglPigdZzTscpPeecz2soGOJ0yFV7j113bNF/AQ1F/Ak/GoxiveOYNErJOGDt j78QXcV5OC/bOMbnuXMcjOJ8MArdVhV+8h1d1aFoqiAXXfd61Q/Ia5j2Y7wvdRHLag7eG28u LU7d4LQSORE0GMs5uXeYhZZzNWl1L2xDR8En5k3kHrjP0tpWQf2KJkl17dYbr7PX2tzvODVl QAeb8VZna39PTduxYKzyQxerX7PK1mss79rlqWLUNjuofs/29I02d/5U27FipmVtWmQ/7km1 lSO72+D7q9gnz9XWfB2xjlPjXq5tPZprfuCP2lna20/Y0FZxNvGVZo5Rqb3uFKfucJxK6VZT Nf7ilTshv59YtbBrPcWvGtry956ytLda2ba0j+2Xc3tUy2mlDX67s62aPs6KFKtaOqqXzXz7 RVsz5HHbPPJpO/LFC5Y9to3tG/OkZY5OdqxhrG/cwDkujyLIqfjM+fZi35zl1qGbYBNaild0 Fq/EqmDc7dJUt0tPVemknL/2Eyysg1ilOBWcCusuHaY6tc3eGG0hT3S20pHxVrFGfbtbfbdG +n7J9wtyJ5TjpjoUCeofwyo3xy5cgVPqF9dXLAq74myOuNNAfWJsE7qI9dir5o3vCOIR2t9z Crvk9RSv7E9MCbZwvM/3owat9/t5PQWn/nTD9VYupLybdwxOEZ8K19gpdFgdPfvwiHviHvAz eZv573IKew1/iN1cq6f+Fad8rKqmdOn/k1PqP5awSs/3r34/fQ/6DxC3qiC/A+Ol/Fhe7D96 xdXbE0NgBKxA4wRN35OWfV4Ftp379pyCoyyzDg7h6/Mcu5Zf7APD/JjdIP6l/oTsAtejcS/k 9l0bpyJ2hY4KxgMrNsWzoWehvvotMMpp7qvPBDFMNx5BrGI/3tOH4TlwfQi9Rqk/3kh6Dq3c pEkTC5NGLL5w3vYQR/rmG5dDcUb2/Tvm87hw2S4p53ufNMyQfm/ZsjmL3LgpdBQ106lHe3hn hnx0hY5TMArfHdqIcb6/5vrt1bweiiNJTzFeirl80UpwCl3lmpbx95FfAbOIYcEp9BnnZT3H bldNP8b3psxOscz0DNu7N8cOHjxiufL7HT97weVPEIfKF6+OX77iGHVKMaqC8xcdp1KWr7R7 H2ulnPR6qg/f8KptVcyuunKtPadkh8n/q6Ka38RcGCcEp4jLBNoHfSTbD7+0Dd1Dg1XwxXFK 7IM5nl3sx3uYA494z7ngFPuzTI5FwCnFoXR9/IW/cio4Hz6zwH8X5BfAF6exZMPRJvjT8J9h 86OkzbHt8AYeEPNBM8EulmEQ2+ASORdwi/1Y57UU53K6TPtybhgFh3yNP/x81KSAVegr4n0B p/T9aT25FeVCQoOaFOIUzGH8Lgzis0Tpf+o5BSfhFPqKz8S4KraT/4cOhG1wqor2a1A73m76 UylLGTnYvsnaap/3eU7zwLe3V+5JtN0Lx1nmhgWWvTlNfZkllr55vWWpj3NAvuatOzdb2opF qv+VprqU023fnA/s44732jv3h9qEF+vYRNVD/6h1Vftru1jre09p+/KTV2xO/4fsnSfibGyH ZopLNVNdpKa2oFdDS+nZwBb0qClNFW8pnWOUQxGl8VO1bNlrDW3V0KcUn7rH8nbMtm/z19nE SYOte/dky9YcWHZB/bo102zxsB62RgzcPeZlOzTuOcv8qJVlfNTadg9v5fIj0EX4/5h/ilw/ ciion0RuHzor0E3TSmopoa9gF/npzN9RXftG95zqOFXpReUKvqQxvp3Fsh7TLKKXcjR6jLM7 3/zEKj/ZXZySlo1PspbqvzXW7/hPuRPiFON+XZ46jBKPXG0/bIx8No5T4gs2xnMKfw79Y+zR nU0aO82E3YJH6Bt8QRxH/5r90FSeUy6WLta4sb6yj/j+fHyqmrQKfj/yk8n5C0V3yJbBqAi9 wihYxXlhYgmnxEt02h/lFHkc2HA45TXT7+mpEk5Jl9ZQPMHrJnL4ovS/gknkUNTSdtYRlyKH IkrLxLTIBWT+u5By5aSLgrmdsP0+7458OhgBL/DF0WATfrho/W/QNPji4CxM8qzivr2/D43o dSL78bl8g1l8Lq4D9zg/rIJJcIh13E+TRne4feAX9xboKOXeiI/cG88Fvj76KU7bqs/AOpp7 NtTvwQ9L8/0VngN0Fs8R83owZjs5OdnlygwZPkzzCVyyAwWaD+fcOdUaV1xK8am//f0f9u23 P6q+y0UrOJjnxk5tUJ7dNs33lLN1p5jyteaB0jy7O6grEdSTvVBw1DEKLcQY3/Oc82vNYyBN xetJ1aPAj0dtdXL+4E8w5mqPctaz5OsL5kWkVhJt9/pNgeYS0xh3xbwh6Kndm3dYimJTh3IO 2Y501bw9kGvZOucxcQpG0QovXLQT+hynv9fcU/pMBeLWAfn9UpatsL88/JiLTzlOye6SC8D4 KXx9Tk9hix2nwsUpctOvcko2mfFOLt7EOvbTK4yiOU7pOO/ju5ZT7IceYj9y0MlFJycdTuEP dMwSx8hb5/hfOXU1Fqb1wfkCPsEfmrPn3ubrPwBL4AqcgluuTi3/D/ptavAITvEKk+ACy7XE bcc0bXNajf+Onn30Fo1j2e7zJGASNSkcp8RYdBb5KCWc4vuTniJmVa6C/DS3UIfthpJceupO wCl3Xv2/ODf+SNZzfRhFzj33eFvZco6h+P9u0zGR8jPEV4+Uniple1Kn2ZX9221ctzY2sfcz 9la7e2z/ism2fcUs27VmnupPrNPzm225ipnu2rFLNf+W2aKlKYqzzrPF00bb7IHPWtcWqoX+ RDX79PnaNql9go16KtLeaxXmOLVhdHub+lpLey850T7rSo1Z+fR6NhGnVENJnFrYs5byKRLk 74uVpoq2eZ0SbFXfJrbsvWQb/3IDO7t/qR3PXGC9X3vKXu/7jO1eMt9+UV76lZ2Lbc2Y/rbx /TaWPbGL7R72mO0b2dr2/fUpyxzxpFWUn6/qa5pTSpoqHL+fYlCVr+ZLJL6dEozr1fpI+f+i xLMoLUdIT0XKB1hdMapq/WZZzJvzLF55FRE6V5VOoy1c+qlqL/kJe0/SWGHN9aF1970z3UJb 97Xwmi2sdIRi3TE1rXmc4juq7wubyJ2AS9U0bpb31ExCS0XLh1NLNgi7Q18ZHYSdIQ5OfCpR dULqJCg+noj2VU0K+WkTxbv6YluszpUk3yBjr6i7g41FK5ALECW/WV1pGB+nwQ+GvWc+OObZ jtRzEqrxCrfcfKvmntK8z3pemDeukmpCMhd3HT3H2HqX+yYb6vr5spu+loLPR8OWej8V6wJ9 8msuNtd1c0XpXG5Mk55DGEMsCa6QU45ecvvpv+Fz9zyPsOXYbtjBuCeu5T6f/GfYfad99L9j H88bXhnTW1FxNsZP4ctz59D3wrKLBckPh6bifJyD7w5WkL/AeYkdue9S5/IaChb5ZfyBDfDl 6fPDLdbDJbQV7+Ea44HhO3yhscxvSx8DjjBO1/trWc92+hnwh2UXC1SfoG5N6T+td2O/dRy1 SmrpXmlNFdNq3rCRNdYY1tqyJbWVR9YwUXVrVWu1jvrrfLcN6idZjD5XqRtutK8LC22XtFTx D99b/tmzdvrbb5Unp/qz//u/7djJ05p78Ac7rH7ox0OG264NmsNjSaplrVttxzOUh7dts3Ju 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 /y+c0tgPX2AefinYg92Pxr15HpgCp9hGK/m6h0E8hY/f0/csWyBaCx3lrlGfAacqXxvkq0CL wUS44zmFjQ8t5fd5Tvnj3t6HTZBzYRc2XOIiYBI8wt4Hg7AB4qdyx8Uuzyt4xlwrzmM9TtfH 6XeDpmoC07SM0++E2r9tW7Wu0G3R0onM562psTZSf5+t0i+Z585bcvpXdrKwQPWZLmt8lx+H Ob7XrtkV5fZz8ROy+12XnvqaOUjY/cSpMtkDzypuL2m75qVs3mindyl/2t5U5Z9NtzzFpZ8/ dEB50FUbUfOniqTXaOSiKJOvqjhb9Tu0TbzfBfEqV2NKnjTVuWMn7OTBw3ZYz3Vge7Jis1Id q07LfrN3W4rt2LBZfqlddlhaipa+74iV5smfVqz4Q/xmsvHlankG/5qeM1fsypQd8ILYdE7b 5EuHU1cVt5hbXGbY/XaIha8NHW7PdO9lsc1bW3UxAk4x57xuff2W4JTeC+HUbXrvuStE+ZkV 71dbnIJRsAouoZ2ITWCsR5Ng/2MMZ2z34z7b1AAh1qIyp9gHV9BlrNMfvKIv8kqw9H3BGBrX sy84ppx44gw6CPawD74Fekr/xzrfc8df655X/IFT5EWnr4CJQb+cR050bIXoOv+8fBZ0m7dN 0i/8wZaHzY/YPrQVc6SwB5Kngrm+xE8QF+jqdUlX/eKW29w6/MLu98uf/8LF8TXRe2oDjTkw C06hn1gG2kk81jHmT9GwCxKbftOvbrJt+3ZKV+cpHijHTmefsnNaFl44aUlfxNuno16z+Okj bPWYrja9z69tTnflkujR0Nb1Cbf1/Rra8r4RtvqNKFv+SpgteamerepFjr+mNqFjExv+QD0b 2e1BO7Z+jh1c86l9POBZ+/iltjblFfm04JzO2yRObRGnVr95v60dphh3MSphxG+kpR63ZM2F WjP4CdnwXrL/zt2q2vKDbZkYtXZiV/tqsubyqqVO6KA4CeVOf/M3tvujZy157PNmpbvsxqEV Nn/IM5b0+Vj7Q/6BgFPSUcRTwKpG761QW+nypcOpGuIRmgpGoakcq6S5amv/na9Msep9P1NM 4FzVmp9lIeJT/d6zrN5rM13d+bChy62OOBX6bqLyViyVv+tzi3ltnLUZPM1CH+xsNze6t5xT sjFVcEq6QuvM8yUvLTY/5vnCmjiNT+79W9vMt2kp+9BPxaUz1rlrZfdjXPX2qzDpmTqKM/Bz o2AUeZLI6+dj0D0/HKfEM587wtsDiR37R06hq+BAwClsaYGdkfMcpzReOj0lWz/scPmRyjnl 81Gg3f539RSaDU7BSGLRYRVLcqcHeSoCDsEdnglOOg6JmcSwBxqTubyyrUlLYffzGoprWPe+ KxhG4zPCee7lbGpwEOboGHY21n1MBf6qMH3vsIpjnOP5BavwPUXo3Z2aYNj2nPbV35l4CdgE k+AXf3fYxXFqihGXzt+2seyGbcW1NmqNOUfcvL91a8VnyCar74balmgq6g/V13Y16ebnur2g WojXNE7vtb3yIR29oLwPZaVW+v0fXLxfblmZfftff7Qije/fKl8SnLp641tDS2H3u3L9hl0o KLKUPYrJS1YeWtn90rckyfZ32K7lZNmZval29oBiKsS/bwvy7ZLi0YlLd/OnpKnypaXIR0G8 33H5pHKw04hT6XqeHYkbbMvadYrl224Z+xTrp7h0bH/oKex+X6nWVYrq3X9Tdl166lu7UEre 80vOJ0WdqbPFquUhXuVeu25n9awXxNTzV8VecQxOXZEdE19WnlqK4pdfHTLcnn6xp8U0b1XB KVjF3Ck4VdNzSvn179K7j+OUWOU55eMUGMPhC5yCEZ4t7IdhbHsOBfa6gClOP+l8+qlWXXn8 tQ4n4E3VasoBrW0YxvVoLqe7tM4+dwxOwClpGbgB8xynxDv0lNND2u/ZFvQjraLnglONFQvl 7ZE8q7u/2ILPij6D+V36reuZuKai6Z5cjx8qQlxnjhRaim30FeyCVTCrij4HWor9+K6oOV9f 69X1fHDq5pt+Lk7V1f+eNL8YxDoaijgJNBOcQlvROI6mglORsrnc9MubLPXIPsXRXFIMUL5l 5py2wpICO31sv00a/6693vFeG9L9YXuvU7TNeeMRm9GtvsX3j7PFL9awDQMi7dMuVWzze5qf +5o01NO329xO9aWnGtjk5+Js/DONbcBv42zP4om2atIQi58wyFYr39HUXrL7Pd/QFr/a3JIq cSqhnFPrRjxgO6Slkoe3t43vqCbvnKH2t0s7bdm47rbk/afsy2k9bM8H7S1tYkflSCJPUmdL eucxOzXvddsw4in7Q+psy1gxzhYM7WDJ8R+rTn2GY08Ff6SVGio+He1EY525vbU1X5cYCvKl x5Sziny0xKnfJv10e995VrXfPLtb61X7zFKMoNoA2QUHKV/gW59ZyAjq089V/qT5Fjd0jsUO mG6RXUfbTY2ettv1P3GH7LghmgNVX3F7sU01Zqo1b644rVZN9b8inaLfQbRiLxvFtnT6OlK/ oZYtyENGHIVsQhqn8Zszp7O13qMba8yFAeiaBhojY7SNz54xlfqCjKG82zN/h7qINZVL6I47 7nA1e/0+aiIyvqINWPrruBY/C9fTp++LMdePyeRhxbbFeMw+jvmxmWegsZ9rnd2P9yR+d7JJ YXNxmk3b2AB9XAV+Mt5zOQ9OMscqRO9mPJfXLzw7z8bzss4SZqBxPD/Y5/1I7pm0HcRMyM8j hrAOT+ErcRZh6t/ZAxWHAn9hFr4s+MX3i3+KGD7695+TfplDTb4POOhsjTreQn004/Pr78Xf LKj5Lg0q3jBXN5j/pHcR2fDYFyduxSiOpqk41VL6qa00Na0F7zBiWKR8lcTNYP9tJl3FOffp e6e10LPF6v8YNsPsFtJWUdKLt9x5lyWl7LT9x47bvqPK/5Cfr7zhyjOEltKcqcJvv7Gi332r pjwO36ndoG7Tt3ZRtr4SjflXZUe7LA5cKS6zo4e/sl3bNii2aosd2Z6keokpdvWk8lFkfGX5 h/bb1VPH7Ub+BXFKcXqywZw7Tj3es5pDlWNXiaU4pXffY5l2cPtuze3N0NyWPZaRkmaHt8rm l7TPdq1PtuTEFPmvTtvulEOWuDbJUvenWbLmTsGnSzd+J11UbPmlpYqnuGIXxdVCLQvEK+L/ CuGVbHzk+StR7Drt0o3vVOvja+XcyLe9GSet96AR1v7Z7qqT2NKq1RUHNP7W0/9cHf1+6uu3 hJ+qtuzINfT/ULOuakxojKShvWiBDtFvUuMuPIIjgaYJYiqIXXDMEluqyR9TU/HXnMt6FeW1 gwtwgmtorMMdfElscz62PccqbcMOeEK8X4i0C/zwmsnzEOY5Xabr4Iq/niXnBP1LN8quV1t9 whNix1mHK8RC0GAL9jxi+dBJFRoJjuoYrIFH2PuI6/PXs83+wM6nz62YCY6zH21FLlr6dHkp /u1W5ZO4Rd+x5vjqvZHavdS0p4YwNRFdTWGNA9RmrKr82NQfrld+jJqQMXq3zJZdIDtfebDO F9nR45mWX1hi3xWetMnv9LWZr7ay+f3vsy8GKBain+Lz+jW2Nb0ibOGL0lDSTptfD7cNPevZ 0ufrWMKrDW1mlzDX5rx6j731QA1bNlyaZ9ZQG/hghK378DXbMmmQLRrS2eYPUN3D3oo3f7mu rXj/fls5SDUS32pjW4e2s4MfPGWbxanEwQ/o3Efs8q6Zdj1juc0Y/IhtntTLEse9aFuVO333 RM3n/VB50Sc8o2UHO6BYiqPKrXTgox62ZKi01SeD7Ea26hCc32+R5b4nciERK+E49U684xQ5 krDzEdfn5/e6c7SfuVP4qW7vO9fuGqD5vm8oL4V8UzXEtOp951j1gXMcp2oMnWe1h813nIoY scCaDZ5tTQfPsqY9lJci6hlxKsbulGaupzlQoYrbi2kiG1Os7D1N4IDiyfQ7gVNR4lSk/pfI oU8eEvJV/D2ngtqsFZzSeMq4i52P8bYyp/w4XVf/f/CIWr133nmn4xTjPmN8ZU5x/o9xCt7A rB/jFCzy4zf9sP7/jVN634ITnlP+Gf3zsvSchFU8J9twxHMz4JE4o+PoL7SS85vpPK8FiaPn OwwYFvi54A96i374POgkeOX7djpMx7A70m9zHW8udsCnaHGQxjsGHIJRrk6LOMM6zIFNzIeK EbOIlyEnEoxqJX3FNnWmOE6udOp6tBS7mOONrmrl+pF9Ex7quYmpII6CGt+PP9PBjmdl2660 I45VzJU6Jw1CHY+L33xjFz2fvvvOLv2eek3K7yd/VZk0VNmNbxyjSkvK7FrZFcvU3KfdyZts T0qSHdmRpLo+yp90PF2sOmaliqG4cuKYXZefoCxb+WfFrPPaf+lspuZZnrMb0lVfZ2UpTv2M 7HypdnzPEdX9TlbN1f22f1Oq7U7caZvjN9ruJM2b2n7INn6x3fbtPmLrN261U1m5yuP+Rz23 4iMU+1FQzqkiWOs4pfg+PR+sypN//WIlTl28rlq+peWcUpx7nyHv2m87vWgRjVtYNc3FgVH1 4ID0bb0GxOOhT8o5JW3qOKV3+hrSM9U8pzTm/jOndJ2OozngDTxB3zgOqX9YQkODwSpYRmMd tvzAKcWVaz+coh8f5xBwSveFU2ILrHKaTud63Ubf/jh9++egD2L53D10LbEO2OScvU73hifU 5cBWhy2P/fiZyC9LY9udq+/KMwkOwTI3j0qM8tfDLmr4wjjOIR6dXLScB69+9W//bj+/+Zf6 LpTHT+9/Qe15PQ/vrvgbxKwG+v2GilnU74VXMIyaw3dWudseb/+EuFRkWbnFdvpcoWWcOKM8 lBftu6KTNvPDITajVwvV3b337zklHi3qHm3x4lRC91q2rX8jW9Kttq3sEaqaiA1tRudQ1ZZq Y28/VNP2znnLVr3XzYY8GmWz+z9lCe+/agc+G23bJg22T3s9bouGt7R5Q5vakr6N5Wt60L5U rqSU4Q+5vBI7Rj5la0Z1tL9mrrGMdR/a3GHtLWlST83tfVHzop63XaqJmDbuSTsoVu0f/ZRr aeIYnNoysZ+VJS+yPxXpnS9tg+MQjIpVvB82PXL4uXyz4hfL8LeWuJx+LoZC8X6+ji/1EtFZ 1QaKV0OXqJbicgt7SzGBiqeoKU5V7TfT1QqpOmi2VRs8R7mZ5sm2uFD5k2ZZ3NsLrO3AmXZT 8652e8PGdkejJuKUfht6N45uTNxMqMbFCMUUS3fIP9RI7zYxjTU/U5ziN4Z/k3i/uKbKAaj3 +mC80/s9ekoap0n52ERMAPlm0VP47RmrGdfD9I4IP2BRtWrVVMejuvIkVXHrHGe8x17ktQLj PetcQ2Pb6ynGfTSLH6M5hraAi97+VfnY/ymniN0I0+8V++APeoq8GLLTi1N8FvrnXjwjz8Mz +udlm2flHJa+wROeFX8VmgO7X4UvS9fAIRox9hyDXdgJna2Se+i+2P34PHyvsIpn8N9HI/WP rTPwh6F5FO8g3kVh61Q/LPm7wRpiYmiuDq+20UXM20VXcZycSOSWhVWOUdrn9RO5R5gr10bv LeSkiNPzOH7pXuRJx8YKJ/lfZ0xYvGq1nZZvKfngITuivEXMl8oru+zyzsKkEuWeqNxKte+q 4v+uyD91Ve2yxn849Y3G/jz5rQ+kyiYnVh3duVU5ZHdZUdoB+/rUMbumeKtL6Uc0dypL9aeU Fyn7rOIfmMt73Eqzsyo4lZ1+ylI3Kp5va6ptXvmF7UrcYTvXb1fdoC2WsGCN7dyYaqli1brV m2xvaprtlN3v4uXrmoes/BP5RZoHpflcslPCKBpaKr/0B07lK2794rVvFB+i+V/SUkXXZCss uWrHcvJsrzjV/61R9miHbhYeE2c16sk+p7E0RGMzcRQh+j3V438Bm0Mdvc+p1ZSOqa3xuKbG 32ryo3hf1A+c0hirY+gsmrfhEecAgwJ2BXELaC+ugx+ONRr/uQbeoJtgCyzDTsh+zoN7gZ7y tsDAXxX4nMrncYkLXqPRB/fgOegD+x98ipTOQ1c5n5L6JfaBdWx4aCHYBXew5dHQW7wzY7vz PML/hO5iCYMC2554qfPYhlG1eW49P3wj5u9OxaKzj+PYA2/5d+VN/9nNrv48jEIjYZ9mHU6h rWjUnK9TV34rjYfoKWrS3/yLX9nQt4c7e3TmeeVrzC6wk6oBnaW/7ffi1LJpo2zGK01tQb+2 tnFAlH0hf9TGftGW2DvClvaItJWvNrbl3Wra+l4NbPWrkTbv2Ro2s1sD5UKPtPGdImzmKy0t K2GcTe15r32kuIpxXVvaR11aWfKU/nZ04Xu2b8YQWzmxk33yxj02R3Oo1o/pZMv7PWhJI5+z pNEvyF/VwfbPH2pWsN3WjXvOVo3pYKmTOtuO8R3syISnXUucKB/W2Idtw1jZCMcr59/E523r +C62b9Yg+9upRLt+eI0dXvqB00rk64sdtdppK+buop8avKkYPq1Tb76RmAW/0E81+852x9jm WO2hS63+cMVYvLtGcYErpbMUV6Fz7np9ut3ZW7WnBsxwra7sfY5T0lL3jFpmj7631G59oI/0 VBO7TawKUcxfmOboxohTEY0Upxal+C1xCkbh04RRnlPYEphPRfxyZU55u18FpzTGwilsULCD sZRxnTGcMboWvuG77nKcglfY/zgOp9BanMc4zLjPfsZgmueUj1ljzPeahnPRFhz7MU7Rp+/n p+x+Lv5Pv0vi1oPYRJgJp/Q/qfdanoX+4A/PyLPQt39ensFrHJZsc65nCpqzsr8KHgV+KZ2r dfL+oaVgFvY+ltgFiaMI0/fkGUWffHbuzXfBd46Wpf9maDX1Ec29dV1kOaPIEQuP0EgsseXB GOIgsPnFyt8EmxzHtGS/11lOg4lf5NAibz5aq7V+E83F1Ca6DzbFOLGRz4J9spG2I3W/HL17 bpdfaa+z+RXIBlbmYieoL18m3VRa3kr+oPwTWsfuB6tK5e+BU1dk9ysTB76Vv6cwN19zKZWL dsdG1YbfIU6pXmJqshWnpzlOFRw+qLx9J+zqeeVTEqvQVBc0h6pQ86vKFPd3ST6rnKOnxalt Tkut/3yVbV21yVIStllywnbbsCTRvly5Saza7fTUpg077PL131tR6TXnkyKGAi1VCGfhlNdS parrIV45299V5Xe/rvx+YtSl67+zwquaU1V82TJUzwpODX7nQ3v4qS4WFtXMataXdtA4DKvQ Utj+8FMFnFK+ltq1pKO0rd9fLY3/zLcKtFCgW7CpwYNAuwSxEazDLdjA0uklaQuYE/BITNA5 XOeZxZJ4cPgEb2CL45TGd5dPQs/nmePvx7n053lEvAYajPPYH+auka1E5zF+0DgXxsAP/Erw KTKGOc5oKT6/9JHuDb84xn62Pb9gFHoKBsEyNBnnop2CmAnZSNU313EOdr67qtYoPy/g1K23 3+E4dXfV6o5DteuIU/p+62oOQAPZ+xyn9C7O8XrSWOHlnGIO4M9+/gubv2ixiz89kZXvOHUm 67xlnj3vOPXFgkk2/SXV3+gbcCqxL5wSr15vaMs0R3dlr1hL6BlqCzrcaRvfiLNZz9xtU58N Ub0O5Up6pIYdntvP9s4epBqKjRTj9xv7sHOcvflwmE1+8V7bPvF1y0v8xPYsf8OSZr/iGLVi RHtb2vcBS5EfKnHEc7Z0wGN2bf9C+13aUvtsyAO2aXJ3S5nQyTaPecKOfqz4CbFpzbhHbPWH D1mSbH9JE5+xbcpHsXnsc7bt415WuGmq7Zj5pvj2suFngkNoqohhYs+gBS72nLlSxKDTGg1X fIW0lauPKJ8U58eODLgW8uZCCx1Obtpl4twy1aDS3N+B0ll9Zyg/oFjVD07Nku6aY3WV3y9S bGs1erU9+kGi1ekyzu6IUi3VCPky9TuuL59mbBM0uTRJlOL04sQhbH76jcTGSCeJVZH6XUU1 VK4cbDwalyo4pbHpnzglPcVY6Wp4iFFwinEd/jCOwyn8UvCJdW/r4zh+K87hGj/uewZU5pQf 7/3YX5lT7ONcxm3fB7rGs49jP8Up6nz4eA7PqTD9juEXMYn0wTNyD9b9M/Ls3LOylmMfz8c5 PBvHXPyhdE04x8Qh2IQ/ChsfWoTjFfY+vec5TQWL9H07m6HuTT/+89E3z0MeCPInwgj0TCz9 6f/N2/vIYd5S7w5wyNWKF5NgkKsnJV5RUwp73n9ojpSr0yFucR65+2CUsw/q3YZYGt5ZmDfl 8lCIZWguGEgLcg0rV5vs/kOHva1cDKX2JXF6sv2d03qBfDrk8iuTne+qYvuufK88fso/QQ5a WvF1+ad0vKjsshgh259saRcVR1dSUmanFacHo5I3r5ee2ub8U6e2b7G8A3udb6pYPqlC2frQ VHCqUHXp844f0/ypY4pdz7DctDTN8z1vh3fscb6pdYtW2sblX9j2tVts54adtkWaasXCNapz 9YVt2axYv4PH7fd/+ovlX7piJ6TlCqSVAk5JT4lRhYpZdFqqVPOVxalCMRWbX7H8WE5Lfa1Y CtWnyr4o31rWBduTfsKGjZ5gD7R/1upHNrFaYRqf4YzG9FBp2VryR8EoxymtV6ul+mXSUHX1 nk/OWscpeCDmeM54brDPN1iFfmEJdzgHXrGEFz/E04mR5X2hmzhemVMwBw0EDys4pefgPvTN fhrb9M85NOIAaUHf6Cn9XsUX7gtD0DfMbYI7+BS8r8pxSpqPczgGf9BGNHhE3DnH0FjY8dBI bHOMc/ycKZeXVufAKGL8PMeYP3VXlar2s5t/aVWqVtP3jHYl765skWJSQ9lQ4BS2P46js8L0 jkctGnQV+5J2pKjeWKmlnz5vx6Wnzp0vUH2XbPvjxROWsnKm5kZpDm+/1soJq7lOfcMUQx6h GL0Gqi0Vodi+Rra6d7TN6ljNFvWIsHnP17epXULt446KT3+5iX2dMlm+rftt1FP1bHqPOJvY NcamvdjUPuqo2lSDH7K9U162Qwlj7fS26YpdH20rP3jZFg973taOec2m9X7S1nzwuln+Lts5 721b9vYjtmtGT9v30WOqkdjOzk191I6Pu88Sxj5kieMftV1TOtr2CU/anonP2sFPulnKWNVI nNLdNo7uaBvf71Rhx0MfBbV6P3M5kuBTHcX7kXMWeyB1PIijwA6IjbDpmARrPGqN1RmqOohq YUMX6Njn1kg5bRtqGTJkvnKp47uapflT86yKeFVj0FyLFBebinMPjlprzRTHXjOunTRVC6sh FtVrLNtPM40tMXoHVmvbQu/68l1F6W8fEx1Xzim9F0coTl3v4G1l6wn88eKYxlrPKexLjTQe M8bCKFgFG3j3ZyyHQ/igsPfBKbQT255NYRqz2WZM5xrG3soMYJ1x3msmxmi2aaxzDXNZPTt+ jFPc5yc5JfsecROc9/ec0ruj9vMsnlP094+c4hgs5Rifm8Y17OM5nZbS53Oc0jnoD/ZhryP2 z/MIDYWWcvGSWoddnMNn9qz29+eejm/qB/8QjCLOBT1FDAV591pIZ7Vq1tzZ+PBBRYUHsRTw h220FXa8+8Up/E7oLPbBIOyA6C24dk+rFm6+ldsn+x9LtBkcdL8NfUZ8ZaF65uTU3XYw45gd On7CTuXlK45bOkSxcMXSTNTxgFP4okrFLGcDxA6Iz0rxE/myD14S04o0Pyk7R/Ot1A4eUOzd 1i9s28a1dnDLl5axa5ud3bnDcvfvtrLjGXZddahK5Y8qy8q0SznK8ydeFSuXOnqqUJzKOyKO nVYdxF0H7KuUA7Z2Qbytmhdv6xatsaSVSbZh+Ze2fP4qm/PJfNuVopqn3/2P5eRdVGz8dbtQ LN+UYiSw+3lNVSBtmF8Koy6XM+q6OEudx8DmV3hV9REVQ5FVVGLpeueGU+98ONnaPdbBQhrG Wp3waPFH+kfjbQP9DmpIP9UWn+oqJ0Ut/Y9U0/tcdcXzheg3WUfjPpwK7GuBfc/b19BHMME1 1tXgUYj0CTrH8Uf2vLo6J1L/3xwP9JDGe2xt4gdzmugP3gR6KrAZEhfudJe4Qj8c874rxykx gv6wL3It665/LWGViysvZ52zNeqzopHQP2grZ/PTfYPYiSBGj33oJjQT/GEJj9jv7H3cj/71 bJznOKVtbImwDlsix/FN1dZnDjScantVl99BOWN+LvtdFc2ZgFN19e4Zpu8XFmHbw14Nm2rU Umyy3iPxU9GwDzaPa2lpGfJ7FijfpHImHZOmupCrGpqnsuy/L53SHPQF9umLkba4n+IbBkXa l31CLalvuOPUCnFqxcvhFs9SvJrw+O22/LUYm9W9kY19oprtmd5DemmUvf9MqE1/RXOBe7a0 UU/Us0+6xdrHz0Xa0v7tHKsWKt59T/xIO7F+ih1dM8GOLBlv26e9ZbMHdLLTCTPsj5mbbN6b HWzdB89Y8jTNkxr3sGok/tpyPnnEjo291zZMeFztMdVf7OQ4tU92wRPzXrX9k19UjPqztnNS d0ue+ILTSMRIYMNDL9GIkSDOj30+9s8v0V3EB0a/u9Idcz4pxZvXUyxF2BvKnSQfVeO3Nc9K PEObVROjQkYssVtfn2q39Z1mDcS0eoPmqB7VImszcoXVv1+xFNHtrGq43nljVNsBjaSxqHm0 8srKDthMf6tovU80ll2iObY/MSo6XHmTNM7dpzlU2Hd4b2b8ozZeK+UgYFx0vhGNVX5ukecU 7IFHaCd8Utj9sPMxdsMmxloa+zxzGIe9DmFfZU4xTnOMc1j3eoKYP3QG5/4jp9jPNdznpzhF XB+cIib+B05hX9P/azmnKtv9eD4afbPkXjwT9/P3rPzZ4A35nGAQDU4RN0F+QuLU8Uehofg+ w9FT7hzFN+g6GMQ9+Oz+Hv7zUysZTYXPC9bBKPLtNdHzwBDeKfh7YdsjJ5/zKcmG5zST+ANr mCPH+wjsYl6U01jlnPI+rLatA04xn4oYd2LbqT3FfRwTpdnQy91f6WnZubm2VTa/Uxc0H7Ko SDF+4o7iJ0rEKepMXZWOuiJeURuxVDET7C8mplta5YLshQXFJZZ17rxiqk7YCc3R3bf/oPNP wardG9baV8lbrEBxfrSiI4ftd/JJXcs952x/xFDgo7py4ZyLpbikuVPFamcPq1ZH8l7LSD1s a+Yvt0XTFtjnny60VYvWurZEnJo743M7efK8/fnPZhma41tYIp0kex61DomjCFglPolRAadk A1QMerFsk9Sfp4YveqpA11woVd6CwmLHqd2qZzXyo6l2/yNPW91wxddFxFRwKlzfN/qplv5P sP3BqaqKN4JT9aTl62p8rwqnxBs0i/c1BewI2OAZAY9czlYtORc7nLfLobPYxznwB05xHbqJ eApYA088d7jWcQp/Ujmn3PX0q+udz6nS+ZzDvTgHjcacKPqDoa4fcQebXMAc7HVBXIVnkmcP XPLxEwGjAnsf56ObYBKxEzAJPeZjBLkGLUZOCmL9OIfryUuLtiJ+Ak4RE4H/CU4R94emio6V DVLfNdxCX9GwCaKv7tA8mk7PdrbMXOXIzy+0I6f0vpN5QZwqtBMnMu0vJactfdNSm6WcEcv7 t7HkwZHiU33bLE2V1DfUVrwSpjqI9e2z7g1t4SvRNkm15ee+1MimSE+RVyJ33XDbMPoxm9Q1 zOb3ibPP+7awMU9UtXHtq9psXZMwWIwZ1s7Gd29uS0Y8aanzhtnJhImqdTjbMr+ca5tmjlLO 2SRLWzVZNRI1Z2pMF1s/VnU7xjxqKWN/a8cmP6oYv3aWMf5pS3v/ccue9JydkU0wS3qqaObL ljn1eTuufUdmdbc9U55zseWBPU8x5PI/hbwx3zEGfYWPqvHoNU5LERdITHrMe6ucrwofFi16 5FoXP1FfnApVTIXjlPxVaK+6Az+zmm8usAajVtgtr022W16dLAYqt23vqdaw/0xr92GCRT7c 1ao0fbCCU82lkcib1CyqoeK2NOZIh1OH1XMqRpyK0t+6tcYlOAWjGJfQUM01NraSX4jxMELj NONoY73be/sUfiO4QYwEMX633367YxX7GG8Zv9EbjPEsGXO5xnOKJef9GKfgkR+n/5FTnhFw w/OL+/wkp/R7RTf9Hae0j3h1OEUfnlM8M8/HvVhn6Z+Z52KdZ4fTLNE98Ab7HqxCM6E9vFYi DgVOYQ8Mg+XqM7ALShtxjfrjHvDZM5p78Pn43olf8b4ubH5wAz9VU3GKvxvvGBF6V/cxEXCI +D8YdE9LzdPV3xcNxf4gNiKwC3qfFnqrTcsgv1KcfFRwyuWu0Bgbq2fynLr11lttxdoEO5Nz zpIPSLuczrQs6SNi/LyeIp/fVdn5WJZKQ5XIxlcsn1Se2ETs97m8Aseqk6fP2KEjXynn52lL O5JuJ9IVn6dYil2JqxXzt9nF+xWlKW58/x67ITvft4V5qiuVbqe1L1+xFVdzz7vY9JJT1P09 Y8f2KGeS7H6nDhy1xCVrxKhFjlOrFyXYmsXrbPFnK1XraqP8YtJ4JdJDRWXSVIqjl57KEW9y VdeRZ8wv0XzfUpr8beLqReWjKNGcr1JpqQpOyeZ3vkScKii2r86cMzg1euJ0u/ehJ52WComI ld9JnBCDIvT9VatZw9Wfd5wKgVPK16K5PfX1/0isRVUxizgHGMDYz7jv2eEZxRK9Q/yT11fY 3NgHk9BZsIj4vYA/cCqYEwVz4NO/5hT/o4zfgXbiGbje2wvZhk9wjfnC6D4YRSw6/XNPx0vx BY6QH5bYCZgT2PCw3WHzC2Il4JWzA2pfuJ7f2fL0PaGvmBOF3RD+MN+Xc9lPQ6fBQM8lcilx HjY/4v5q6fvE7neHcvzhm8IvBaOw8ZEzGUb5eIoQMQxWYfMjJqhPvwGWV1KmuphFjlGw6vz5 fNWTP21/LTtjx7fGO07FD2hrKUMCTsEoWvzLYba0ez1boHiKyU/XsJUDW9tELce0v9vOrxpi FxKGqX5HiC3s19Imdlb93p6xjmFTOtVx565RXfmEwYqfGPiAzejbzpa801l2vpdsy4wRdvng OjufvML+kJlqS0b3tDnDutnKkR0t/l35n95/xPZN6mDpEx+2Q2N/bcfEqQMjH7GcyV0sd9rz 4tRzliNNlaH4jJNTutqBaV0t9eOOLg4dG1+NPqo133eW80fBH2r1wqqGbytWXb6poN78crfO fuL/YFGk/FQRI1ZYo7dU61ctVnF/TYirwKela0M0hzhE+SxqDfvcqg4Wt/rPVo6LeTpvibVU 7MZ9L41Qfd92dmtoU6sRe6/+P/TOIw1F/btmer9uqrEsWmNltOwScU00v1P1W+BUc42v7Vq3 du/m2PxaNtXcHMY/jY/M02HcxX7FWOpipFnqf49xnHG6cowfYz2tsp7y64zlfgxmrPccgEl+ zpDngecU3OAY4zX9MnZ7RnA9+zmXYz5OIkzvZeS7IF7Cz58K07vTD/On9D1o7kSYfsOc6/1T PKfnlNeF3ANOedZyP/ZxnGflvhxzfBGbYBHx6Nj5mCMFpwK+lH93urZCa+nv44+jseAdn43v hr65FzZPziG/IN8//ilni9V7Yoy2ff1CYiqozYL9LjJMY1k5s+5vrXxIYlBUA9Vylj8qTvY8 b+fjXDiGLZBlM8V8UvcltF5dN5+bGi7hilW7t01bqym7Ljbd1vqdkEdi265dtk92vyvSTXuO a94tfqhvNJZLO7Gk1pSb06t1cqPny8aXqzEgW/rr1JksOyFGZWbnBNtns+yI+ko/qDi9Daul pxJk+9ugGIrDduOM5kXtSTX8U8RQFGu7QMzK1zwqbH7EpX97QfOq9Ay7Ejfb/qRkS0ncqvry O235vOU2ecwUG/X2WFspTo37cKpdu/qfdvnq75WnXfkFL9+QLrxopbLnnc0rdFoKPeU5VQCj sGVe05wpcapAuf+u/eefpBu/UXzgRcU2Kk/tpTI7oHfulEPpNnzMx87uR1w6mqqB9ACcQj/V 0++kmt7n8E8R+8f8qbtrEven+AmN13XFAMZ8tBANJqGrKlilfdjlfJwE3IElMAT+uPN1nGs4 j77cMR33fVVewhq2YRF9+XtyDdzjvvRPX7DN6zFYxrq/jvPox2kqMQVuwBanjfRc+KvwOXlt VOFv4pl1LSxyufv4LDCPz6l1eMe8GWx8MA4+ocu4hnOCvH+cG8QSEldBrDk2PzjFEm5h3yOG gtjzcI1jnAOvmjSLc/yCVTBt+Dvv2vd//ZudVPxq2qkcy8hSXZrcIjubmWN/vnjSslPX2+ev SQupbR3Y0HYPayrbXwNb10v5/Po3tXld68jOF2OfdA63Rb1b2JB7f2E7J3a0/0mbafN7x9qc nlH26Qv1bWHvGFvSWzlqu4XYp4oJXNijga1X3EXSW21t3ZD7levoUft8YDvFFsbZpNd+bekr PzC7kmElhxNs18IPbPvckbZhYh9bPLyLxY942hJVDzHpI+WgGNPBDo1X7sDRyqM0oaudndrD Tk3obNmfdLfsWS9rXpVq+s583g5O71IR40fcBP4o6ne4+AltE4Pu6/g6doktjcQftBXcIu6i 4bsrNX83XowSy9TgFHY/GNVQ3KonTtFqv628SfJh1X5jrvJSfOY41UJ+rkf7jrPbmra328Ka 2d2RrRVvIy6oxTZknies0rwdjaX/ilP/ofGH93JiKVqIC5U5FdivgrgzctMxjnqOoKeqVq3q 5kuhqxhfaV6DMPb6Mf3/hlOM1X4+EUyozCk/lv8zpwImEX8Op2DU33NKusdzSqz6MU7RP0zy LOJze05V/nwc5xmai+loJLQSdTruadPG5RvCXkqeQI79YBMMtBYMgj/sp0/64p5wj3vxefEJ kuvX8U5/P/xT6CjmUDk7rbb5u+FvipHtj3m9MMlpJLEGLqGlsPmx7uLRxSi2YZSzB0o/NRXD IhqEao6CmKX1urJVkXeJucXEKt50000WHx9v6SdO2pbkFDsp5lBbPksa5JJsffCJmr1X0FM0 rTOft7C41OmnnNw8x6Wz8kedyVatVF1/Tr4teJV+/KSdyjhoKVsS7fC2jZa2fZNd2LfbzfUt TDtkl08cUw5axfrJR1Wolqv8tOePpqsW4gnF+2k+5ldfWeaBdDFuq61TrN+mFYm2bO4yWzJ7 qU0Y84lN+WiGbd+y125c+y/laJe2K1CevouqL5+TLy4pR594kydG+Ybdz2mpCptfoKeufPe9 4xTzrYihOH4uz/mmtu9Ps0EjPrAnu/Rw/ini/cI01oZqfCWGgnm+1WUzxT9VV+yvqf+buzW2 VtcYWZuxXmN/wKjAbgcP3HwlHWOd3BD/ilMwBf3k+eXiHNw1QUwEfXKd78vFQGjsRwPBMhiF jc/xSefCPK6BUWgkd09d789hO+CUrtNxx1E4pYaNDrtfoIHICSUdpr7wO7nYCc5Xg2Eudl33 gFEcYx88gkuwB0bRV6CjAk45/5W+C/rkPJjl+tJ3QK0PbH13V6uuuolVXEwf29j98EvBKLRT LeV3CxGbmKeOtqIRbzF77jzVmv7ecepYtnSU4ihyFUcBp/4i/1TWzgRb2KtZBacOjmxt24fE 2Iru1W2J/FKLxZspzzWw+IH32QftqyuWvL3dSB5v28Y+ZdNeCLWZL0XY7B7hNv9V1fHQ+dM7 13Kc+lzrcOrLoa1t9UDVR+zXylIUyzdfsenje9xj2ZumWuHeFZY0a7hd3LfKclOW2vE1H9uW qW/YFx8+b18oN9Im8QlO7VQdqj3vd7BTk16wnE97Wo7y0Z6b9pJlTn/RMmT3S5up/IJTn63w PxHDhz6CV+SZqNVPMej9pH3ELuLRmSuFHws+4Z8irsLFXoyIl2Za5myF+KSi3lz6v2g78/Cq qrPtW6sCIigQSCAhJ8zzJKBY61BtnVrFkVEBARVFUAFBBWSSUZHBAGEeQ5gJo0CY5zEQQiDz AElALGpra/V7+33Pd//WzsLUr33rd71X/1jXOWfvtfc+5yRn/fb9PPd6lov9wajab82TF3Ch RevckWoR4lxkP+W9+s9xPGs2eJk9PuAzq3p/d7slpo39smZLq9e0peZyNFV9kOqufh/swSNW Tx6/Zk1aSi+xPofu/TWO3t3qTpcrZy4OuQ4XA5QmaKncEOMjsSlajMZR2OM5hZby83rJU3k9 4MdbP84zxv8cTtHfc5DnnlOeRZ5TnL80pwJuBH4+z6R/4BQ8UnwPDUU9CjgVo+c0n5/yeopr ebb698/5f8op9vEe+D4cU/S6dkneCTYRK0VbMTcWHeoZBa9gE7krx6mSfZzHX8ez2WlRuIcW 5femz01+ijnYrZU/hE9oKeJ+xPPQTTzeLU9EO2kpWETeCjbR4BTb8PrxHI8gWopcVsOGaOSQ 1kFsITYSn4zSHLoW7r2TIwvX2Pql4nibdkhLHTrs1phKyclRjSTVuVPcz82LEq+cjhKjishH yc+Xla11BjPEKMUKM/SYqde09BzNC86Wp0rbjySftsN75ctbG+/m+TKH6uy2La4exWXNkyo+ edzN8b0kPwU+CuJ+aUdU/0+sIjeVc1RrfOg++NDmJFu7cIUlzF4sz0Sszf9sgY0dNdkmjp1m xZf/bBcvqe5ELoxSfVlxJjU9V/UH8uRHv+LyU+SoYFXAKfkXxdkgNyWN+Oe/Oi9FvvQXPooU aaojGsfwUGzYuc/eGDTMzfVl7lSl6hrrxajairXDJDhVVdwn7ldDWpyaFHcox0KOCl9glMbk 6/qHsV1jNqzwXGEfvAo0kcZxeKD9vraRY5HGd+d/0PbS/PDnctt0XjgEpxxz0ECwQ+O+Y14J v9jGNTjWX5P9HOP3ca1Av5GPDjgFh9BDnjk8whe4w75gf8AXOASj0GCeT3AH/nCMP4/jlr5L alb4/BUs5Dh459ak13tDJ1VRnYnyWveusmqMoqUCjx+5tqAxXwousd15/nQMeardqlucWVSo NdQuWEpWgdakzrYLmm9wTjHdvxekWPKmpao321xecc1t6lXHNrzR2Na83tTmd1FeSt7z2S83 s09eaGiDH6xiy99+0LLjB9vxz7pLWzWXxoqwmd3qqdZ5XddmdJLnr30VreehGhXd69hqcWp9 vzttY792ltj3blv/3u801/dOmz/ot2bnl9uykR1s0iv3Wuqq8XZpxyz7YvciS1/7qX3+2WBb PvoVmzW0m332XhebM66bJcT2tU3TX7eEcS9JZ3XQHN9OtnN8R+mol2z/5K62Y+xzjjdNlIPC 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 bcAjp+HEDKelSvgXHINWC/hHP+KQcAq+oHngFF50VztJ+9BYvh6tY43uj53XnOvrvLWVi/A5 K887r8nYTqwPTjG3l/lZbOOc8Iu4oosjSj/hSb+lTDlxqqres96jxgPq0OKjoCYFnj88FPgs mFOFJ3D7DvlKNb/v5AXNwUtLsTT9PxD7I+539sx5+y7rjO1PmGcfd2ipteUfta1DfuParrHP W/6KIXZqyTCb2L2dTe3YXGtQNbZxv4+2Se1raz5VQ60r1cyWvdbCtYQ+zWx+t7piVKTifjVs dqdarn4tnNr41r1aE/hJ+S6etOKkOMvdONUm9G5ln2i+1oaPHhFvHrCdI36rWkmP2kHpqhOT X7Rtn7xmG8b2sNjhijO+19kOxMdqbfnF9t3pnfb9mV2WljDFNo/vr7q1PW3RkM62dOKrZl+d sAbKRzV8V2xRvqk6WunVadI7YpU0VKMhS62x5kc1l6ZqSgxQ3j360UKK81V/VYzqPlFr+sa6 tenhW32xrZZ0VZT2R6huUpi4VqHbRPWb5PpF9dNawH20br00WbSu0/j1adZcc38f6jPeyjZ/ 0spU0f92vTZWS+NgbcaiVorNtlC+tqF+D401d7Ppnfpfamr1a8jfF6O1Elu2kl5gHNbfVPcc rN1eXzGluhoL/SP7IhmLK1XWGFbFrd/LWB+jexXGVx83YyyHLYy1jOE8/+k+xnzGZRoMbax7 9xgdV0vH1NF7jtZxIY2nDZRraaB4HNvZFlNH11O/KF2vts5bV2N2VLT0hxgEb2rqf5fHBvq/ JE/l5vbqkbwVfdBZ1Esnn4XO4jV1/1g7rVF9aQ3Falg3jdesrVab3yz5Vh3Da9ZW4zX7WWMt Sr/LCN2XwS5qcvzyl1pX9Oabndbk8/O5aaX1EvxxDNJ+NJpnlOc636XfT+1aatBSix2muVif ttXT9xaja6KBf313O+cnZ73DujHy/IlXrI0YXaO6WzuRun2si0iNCdabd2v+6v6FfqyZyFqJ jXRPcve9vzLu/6tzT6K+ZW8rb7Pnz1PMTOtIXdI67DnyRWRlqvZRvtbivWJfiFdXlZuifak6 QhezC4J81PlMzVG6aIXSVxfFOGr65ej4K19dc57BXOmWDK3Je045poO7d9ma5fG2ed5MO7Fp rZ3bqTV41yy3xNkzbH1crG1aME/3jPMtecd2O6W2efFS27Nmnbx9n1vq/kOqW7tb86rSLPXI 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 T2xBHyp6+ya0thOTqcUR34Haf9R8n9ABfx8+P2kpfIGuFgU+PuX6aY5BYU5pvo/PHPFIDHE5 DmzX+CTT9iBiR4pFudoEPF9r3q7YptwIzWHVceqNIZ0kJikPzueSuKXjqpAvWFhL6Zld+eJi kzSV/H/Kb5DJ/yeOiDHii/pxSFdJJ4kxWheftC595Gss1VkSi7Rf54t30k2+LtM+mc4V8+Qz 8yygf/j80hTO/8d9SweJTS7vAE0jDmgcFwfk66uD30/6R/kP0jeqQSh2SV+5ukcc53SPmCdW iC2sK3/CX7o8CrSmr6mkq9w6vBLffFYpb0J+P8WvnE+Q+3rGHWk3+Um9+/e45DFJ2k73q8/k jHX/Myvfz/dROv0X4JSeN8Sqsuhp90zB53ZzqPD9yQeomsJi1yu959of+zMvbjD1OCLoZRah 3wjPEejXMn1S7E+DmV/VPdberNvSflmiHjX+KpNLUZ1aFZWsyP96yU6ep5/p7VuOUQV379j9 R/TvffiI/vJ/Ib8Pf+CtP9uazfssccFGS03fYXFLs2wycaX41dnEnI7blPXH6Al/2qZtOk0c 6rDLg5iMfy929Qn8eAcdg8SqsWilUfj4Rs7fZaMW7rYYrjGJmhMjFpEbsYA4FKa+UpHz91rE HM2LyoJZB/D/7XOcUlxJOXyh07Y7Xg2Yut36kzMROm2Xs7AU8tJhVQg1+roTY+pKjEmc6h1P /aQ4aiXBKfFJOkomTSVOiU9tyZVoB6vEqU5wqv3oDGstHeVsMZpqkbUZuRh+waUAp1qPWIDm YtvQBdYVprUbkmxDk9fYwQvX7FjuLXtw67LNnxFvU/o2ZhxjzsqQj6jhSn/AYfXpF0ROX3h1 xoMAo8SqfxCnnjEIvVTI/+dz5hmvAnoKBhXOmfD9fN7Sy/XTdaTDvLjXj/v9lPO3Cz79LaP2 wihZps8p2C1O7eG7cJyKqGJbBlcsxCnVTYJTgbpJTk/BqZDaxKPgVOfK5FGUFad+aQMavGWz 40fYlezddp6aRl/eyLFT6KnTBbfs7E1qIN2kx/zNu2gq5hPc+c5O3/6Wvh70oM9/aPn5d60A jj24m28Pvyqw77+9Yw/vXbNv7ufYtw9y7c/Xsu368R12ZsNC2zYz1qbDqbQhbW1eCPXkR7e2 xV3Lo6eo8wSXlgVT/0iMwpYpj4L41KJ2RRyn0jv81pbDqjVdfuE4Na9vkCWSo/7lon52PKWT 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 +gO1HuBUi186TkX/6TnrXecFa0tcqmfVF6xz+X+yRn+gfvqn1W1d6jjbNj+e+l85zAu8YNnX L9qpm5ctl74dV27nWd6Vq5Zz/gJzB6/adVh26+Fdu/vkvt15/GfWn1jOva/tyzuP7dy9b+xE wUM7C7fOYJev5VnujQK7n1dgt65cs68uXrSzWVm2Z1a0JfVpTj2Kira4WxX7vFtR20i92R19 StjWnkVtVRd8gB2okdTuNZvX9lWb3fY1m01e39wur9mcLq9aTM+GNqlvU0sOC7b02EG2I3WM 5e9ZbodXLLAN0+MsrVd9i/m0jO0eXNqyx9Ukd/JdO5rQxPZPRSeho3bHtrI95J3vn9DR2RcT e9jJhL72xaSe9PjtTo4E2yd2sizYtS8p2PZMbYu1cTnpyvVTrXSvHsUnpnw/r25SI1eXVpzy c/M0JolTmjMjbaXndOV7iUniWC3GzLdjN7l5umKUjnVjGX41+f/EI8W2fLbpetqvbXqPwjWU nK+QbeKf9JFM7BFDpI8Uq5Km0rKaYlqBfa7+keOUl18h7aV5V/IVVodTqvUnTvn9O3Se4lJi mMcz5hjDPDFKmkq8cvnm3Kc+o/x7yt9WzoSY5esU+f9qwhfloCtHT+O+p6nQJPBIrKoJG2pJ 90hbsa0839FbfEdaL7xPeulfxSk0lut/yGttcwZjFJuSL1Gaqx7PBeKV5zf0fIVinXjlayrd h/IjxFCnp1hKW8l0ry4HUJ+PsdCLTXm5FcoNcZ+d+5PPU6+dT5N1xyr+bu7Zg/Okk90cBX1u PqtMc79dHZPQ6ehw6uoPwvcXgZ4avtTe4DsXo15STmD4PCvSa4rVo95Po1gY/lk/e77MO/Zi MfrZ/6yILV8+k567D+1i7jnq9n1nX31Pv4rLN5gfRS+Nqek2dt5Om0yenvroxlLDaBp5Ekkb 6AeFvkreeNJSN9LvcMNh/IH7yN+jfjl5Fs7IW4+ct9uGzc90FjmfXHOYNYzrycQo1ZeNmKse hx6nBkxHDxGDcj2i4tZ762IU+eLSOcHRK53fTnEmcSokabv1w8SjbhOUN6EcP3jEUjySdR1P zVkxDEb1DrCqC9s6BDjVhv+blnzXLfittuIZoE3UUpi1CINJsKp5xFz7ZNAsa4w1i5iDrw9u 4e9ryrI5WuuzoSusUX9iVZHTrcWgBBs3Nc5uPL5tF/fPtZjQBrZ6yNvkTDWxzWH0qiAXbA2M +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 GZ9bZNoa+r5vsUlrjjL/SX0LD1r8upNoJ/TUmpM2BU5NX3ua3lHZ1DU/Rv2jA45F4k8UuROj 8BGOXMQ8XXpviE9DqMUnRoWl0G+QWJUsjBp9oSz7JDF3Nh6WxFMzYjK1YGOXo6Hg0YTl8Gkl rzGWnWOWO051GreCWNUa9BE8g0u9JnEeLBJ/elKnT0zSskcsNSaIJ3Udt9y6wDctZZ3Hkrc3 ktgTuqg5bGoKexoOgEUsm0WgoSIXW9OIBXBqjn3Uf6Y1gFWN2N+Q9U/4f2zGc1qrAKvEqE8G Ko8izVpHpFm7XoNt8bpdtiQpysb2++9zSnX7fE6pn9M/hFMjPQ3ksSqgk36MUdrnM0pLn1Fa +pwazTomTsm2Bli1HU7JCnNqt+PUM0Zlwaqf5lRpx6kVcMr1DWwvTv28EKdetJ7lf2bdq/yT daIehTg1ovVbdmBdiiUO72Rns4/bd8xbv3Dhhl27Rh4EnLpz567dLrhkV3NP2pz58TYpPtKW pk20M4c225O8M/bvD3Lsxr0v6Ul/zE7++z07/v0dy/z6ge169JUdIy/wMLwTpy6cJjfwSpbd urrXvr2ZaZmrJ1taJL67gR/ajN51bHb/+pYR0cAWDXzPZvR5z1J7v2dJfZvY7Ig21LgIs61p 0bZ/ywY7fTDTbpzcazlf7LKcvcsscxn+44hGFvLBK5ZKnvv8AbVsad8K+AdL2uqQ8rY9so7j 1LEJH1nWBGrzwan99Eb8AadgkVjlLMApsUr2lFOJf8Mp9JTPKaej+b34nBKjxKoy/H+UZRyt zOtq9LwpD4uK8X/xlFXoKuXI+bGhSoxJsoo8D1YagSaAUdWJD1dmvSxjsvSUdJiYppiSxmON 9bWkBRjbq6E5KjO2qb96Fbig8dxpDsbeuozNdeGB0w0cq3HfH8+dFtN1A2O+9JQ4JS0lTVWV 64gxNTinFjzQdm0Tr2TilF5X5X1l1XU8/ixxqgL6riLsquauofM4VszS/Yuf3LvPDk9bwRDY Ie74rNK9uuPYLi3k66mK3LNY5WssMUr6yGexuKVzxTqfd7quvgddR+/j3pt18dJ9N1xD+Rtu HhWMkqaStnLaie3i09N97He6i6Xy6F2OovbDIpl8h9JW0lXilWJS8tuW47tQnp83v5t1vg+Z 8ikcq8KpY4WV0fMDVhpGlcHeHJphxYdlWBF+N6+yvcSgmWyfY/XpA1J3CKxqGkJfpKI2IjbB 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 OKjHcU5jrtuI53Ds4vl0X5zSuYGMrwGwU1GLcbd2LL4JtnUYc2uzrzbPXwde1WJcrjow19Wr xLpA3p/LG8Jm6T8xU5pJOT6Xk+P9SN95jMLDT95PuUvHk0cM8457Gkz6xWOs/36ai208Ru+r CYwSh/We9Zk5FnPbcZ7ndp8Fj68La5yWEnPgkHzwNeXvI2pxOxBu6Rx54MUw3W4AtxQ6X5pK Gkw1K4X8Fb6vwuOVp63kA1T4OUDnq+Bz+z05r39FTzlO8TunIkyqCKcq9ENXEWUH0gMkZon9 Hp1VnppVFfj5LNdRnVO9gbsMn2Fvf2aWv+8a6zptgU2s17Fon5vvpP6wY+h5lIZ+SqevbMbK Y5a58ig+QHrxkesbRk5PPJJeGjaXtd+ZpztwyhZqT5vxjOPDc5zaAZ/U62ibOyYdFZEtHYUP Dx5FZqObYJQiImsV99FS8lCMIddHvAmnetBPT/m9rkR3tGAPekT0oFdEd2pMvZPxRIxg7hMe 8i74RbrA4c7kQjtSX2qPV//1gTPtDeaP6XZ79Nfr6CRx7dXo6fYaOb62aKiXw8eRu8u254Mz rWUInArJglXZLl6KkhabZK/CrVfgUFs02Cuc+2oIEZpjL/fOtg59p9nLoePg1STrGpVh3fpl 2tCBCTYyLtHmxb7pYtsQPNzETvqgKzaPoB8tUZpTpX19W0bSX42eAKX3fd3tx3qpVG4vqdTt ZK8O9VUd5eV1nlCb+hvyfvJQfJuPYhfj3i58fx6nXivh1GswyotixsQi8oNFKS/Si+IFK0ZP 7S6lp8SpTeJUBHoq6Nf4uX9m0zv8g41HT2XBqYQaP7OYKj+y0KrUqCp8z14jutX6R7t1bIPt WZpjaXFh9D2fZjffvWifPbhrJ86dZe7vPbtwl56099heOW537r9rX9w6a6cKV9muiYm2LjXa do6Nsl0Z/W3HhAEu1rJdPa6fLcvubyvGDbR1k+Jt87Thtn5Kku3My2CNwww7u26S7RoXbBOD 6tiiCHoMEisjytEnnTXng2BOn9/YyhBtf20rqbWtCf8ta9P/i60PK2tb8advinzWNsKnzf3Q V5HPsFY9a9aH08+ifyVbHgnH+la3dYOb2cY4+pDwXdo1Co/eGI9T8lCITT6DpK2UB3S5wBKd 5Rg14T9zSv0rivD6leaUGLVzdDv2U//K6ooHi9/gcEr5P3kpnqWWUF7+PsZjeSLqU6uqDX/E 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 8kaTlDODWbPggvdIqxeP1ki3fvNaVyvi73pxQ6yRBhKjXH6O9xRzHHc4x2kl1Z0I1aKksyZL X/EZgU7C16Hn+XyxKKhD6TFqYjyuo2eUznf85PPEAccn3kds8n44HXWdWuu15nsuiEV6jWeL 553XO55Vngt6rR5TiDeeOWKKztFne12lz9dtzyi9t27rXHFIXNJR16L385zyeT+9t3+t55Xu +9A16zNcPpPf5FH+lnhMdT/qZFMz5cUXp5jJFV9jT/D7bmm6btHkpCasrrDJa+ttCrEohf2p BaOWWHvZygd/YZXMikqupvdf2QnLOHwWnxn1x22l9KMYYa4ve4DQUgoxKrmOXg5NF9AGF62A PGExPoQ98Gkf+cPS7tfw1r1Bzu9N5nqIUczZRb/UUqeqPU2f8v63w/3TlQvsxEPRSX2qg1xg wKj32DclTsk/8a7V0jNdoX4Uh3qCfhSlaMNSNJNmT5WiqfZ2vIWeu8Xna0bjHas4+b7t7f4x jLiFF5zZu3VcIz6JvR1cG3WzcvwT6pF+iBrViQu/tqHr/9fOXP6tdQ7cgVHsPR75wNrRWC18 fnM/OuvcB25+cEE9c7eqXobj2n97w1bBqej887Ysq98WJ8OoxG7YcZwc3Xn27KLFGuEbfx/k Md8xn35O+c30UYRJ+eT9cluoS6Gh8qhX7WzEk15Lzg+vRTxaSrGjCm/ioZdtK56QLXjUN5eS B9w3autL6J2EplrN/8Mx/M25II2/hXYctbWJjZbG34itB5usODHfOqlRtabF2hn2FSkGi6Jc hPVU9jN2lghrKemq/5SeGufUOeXx0ERD5PukoaSpPh1OzXd9aOX3G8NHMZKFngpzaoINxKOn xKlN6Kk46ZNxTu2OQk9NHtdTH+XUQB79L6Sn0AuXFeiia/gipKcU47m+P6ynNNdXeipgVCSn FtK/aDZ7nB6x9tXqmfQv5PoCTnXhoVCIUUdXfS3EqX9kBv0XrXYxnJoPp56AU4vRU7FfsZNb pafQjtJTyeip5EnMtJKeosfftu+ZOHVCnEqdbOeyqNvl0i+dWt+VP6Cnrn9ET0kvaa6U11PS Ui8Srg+F7+uHnvL9Z70f3eupYEaiZk/1Ol0lT7pYNYM1cCZ1Je33Vb+JR/jbS5zSPF/tjxKr 3H5eOCI+TYcJ6r0TBTtma+1lXRarJtPDSP3w5InzuTAxamoG+3NggHSTuCTmyAfhvBBcg+8b 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 XGg/HjPLnhk5zY2fBs2y50Lm2vP0qx8RGw/bst13Dlqw0YIX5ltkOrm63F5LIMcYz9qDpXUn qQs/AKd22eRlTazbXkteLsFmpqyywibWVRH3K2zfbdEpa2x8Ug7XSyWHVmpJ2SstYXmWbapY Z4Wrl9ipTdT4q8+089XUja1BDzk95XPK01KD1H0To65KO/1rnBKr3EAnfA6nxCTHJ/4Of7M1 zY1rvPZ59SgfxQ301A3HKXrqdqqvrnQVdeYCmuqW1vi2Jf4/3s77vaorS9Nd7Upd1d1VXTNV M9VdNVXVjoAx2CYHgxMmGhBCIBGUSJJQQAGUdZUjEhJCEpJQQAJENCYnkTE5Y7u6aqaeeWae +TvWvN8+9wiB3eAej+uH9Zx7z9kn3CvY7/3WWnstu14bAavC7VoV8SqtoSIvXTXTz+PrOpM1 yRynyE0/vu5VOPV764NT3RF/T81x1vrO/r5VTPvek5ya+mOXS9G+8i361i5zjPI5pTw/9Z9S PYrncgrtoZqF6jkvPeVqUeR8bAdTp1ln9Gj6ysMnZ9TIiKDnPLGp7kW/gk2/IB+dPD/y0j1O /diLT4WKU99zmqoz4qeOU4fRU09yao6dzJ0Jp2bTs/lDO5zznvP5HQ9Ql5fv5IwYzt9dnLpA jFK+v4sV4hQxP/EINolPPqOe5tQNxynqozd+87z0V4jFDPU5hV9Ia6eGEqN5XRzS7/IgpyaQ 36cYlTj1OmwbntGDVoFBzJXSU+KU/HAuVsW8p16L6l2v3DxpEJnLLZefTvM98/vXcUrxG+Uc qOf9Swkt9of4JqephvN+CNyTv2+StBXz/VjmePFD99BWXBAHHFt4Lr9vluZ67Zc+EqfELXFE xzX3jxRbyYn3WSUGaL/PO11f/bi09a6lHBKtd/YYo/v6fkddX+N0Dx3XNZ5mn/+M0mka7zjM eDFQx95FL4pjMt1P19cx8V5jR7PVMyr3cZRyzWGQ+COf3kTiT2KVxyDpK8bxm0PMkn4Sw3Rc 4/VaORRi1evp+rvCK3IoxKrp7J8PR2el1dnPxy+EUdPsH14ba6+/O8dGfjCPNTzlll7ehLY5 hMY5QixqJznUFeSN5VhaVYNVdPZZGbnqqdUtMIzeTzXkO2zstrW1uy11C+uYYEPe9osw7pxj lTSSOCUuSU/Vk0MhHSWdVQfDamBINab3TYzReLEquXQPOdu7LaGQ/hw51BVkXXJEai3zfRU5 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 /XbM+zYvcb2tKaullt9Bl3/evP+4Hbh8x/adpSZFa7elFVc6K4BTqeQDrs6vQ0810T+dGkBl nfSz2OV60ufDqcLeS1a8k3hNH769/eT+fUp9igPEgPpUo/aeNeDnU096rQPetIe8QF57nLpP v/pHcADukJtQ3os/jVpMVX0wqIcYFjXSS3o41nMDrXTTird725LeW3DqDtqJmrfkjZfL+r6k 99Uf0U4YsaYq/HZV+PJ0vGzn54z93Ep2sD4KK5WxT/urOacKPskUs6rYyVavYZOstPdL7vsF vUI+h5FoKVhV0PU5fa2+tCLYldP1gJqH9+h7ctOSG69YQr16Tp23RHpbpTRdpgfkVUtpvmxr 6k7Tl56e8wW7LSx/ly1AZ32c0WnTEhtt6mrqJcVvtrlZ2y0Ef/XH/N+dg49kIb9LllcftQUB nUPvqex21lfl2SvTo+3NuTGsNab2RHaAtW1Flp5TxjqpJIuKz7IE6oyMDY8nvz2J2ldl1JHK s6KkFKvekGUHC8hJL1xlJ8k3OFw89/mcIlbl8tLRVdJU/QOs8n6Hf9ec+ozf7p55muppVj2P U+dzp5BLAasyx3j5fslD7HDCy7YvllhQxC+sKeSH5M698FhPPcWpbbFD7dbmcHoirkBPRQcZ BafaB3OKnh7SU1vXwi701JZ4+6whzjxOxZAzIk5RU6oY/TLAqcnWFT3Caame5X8Y0FM+p6Sl usKomeT01N9Z24Lv29Z5f4v/z+fUC9a99GffSE9JU0lLHcudaccD6KwST09dqKYP2bfUU65v b6NX4+/rXt/hmGy45n/+TUtLjZMOYR7XVu+lnYaKEcxrej+m2OOYp628tVZvy1foGIVfj63G 6hxx5m3xTRxgbpSeGsX8rDnVzZHMy9IYE5k75cMbzCm9lm56LZXcdnSU/IfaJz7pteJmMvkH NSfL5zYFH9nUimNOo3iM8vjk5mzGii9ijxjldAznaJxMc7eOe89GXgbjxR+dq/0yf6z4ovdi zdv6DLzWODFLzHB6Rs8HH6QdlW8ifnhjPN+h01jcV/wTb8SoJzkFx/huJvGM4pUYNZk5Zwrf 1VT+PmLVeD0D1/Xv61jFez2T+8yw6TGniF/x2T1GH3IsdXxj/MgMtGwW+8hHH1eIH5JcdOUs TivsJUbFb5RFqfbC0A/JSYizMXNjnZ76+ZAxNnlJLPX2Wqy4fbdbKyVOdR07bwfOX7W9/Zes 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 v9OF4tQ85/eTlvr/wykvn8/P63t6e5O/oUy80dzrOMVcqrnT01beGl+xSnEnf55WPXU/x8/V omC8WKWcP83Rqg/orsdWGsefZ/05VPOoW/PDnC1meRpDeoYccM5X3Ea6xeOc5zf052SxSXO1 OCU94nQO43Vf8URccayCK2LKOPyVygnQPnFCx8UpscPnhz63z13/u9A4sUlbfR/6zBov7ozG D+p/Tn1WlzMC28UovddYbx0aMSDiabq/z0XxW9+neKWtri3u6POITWKUzyn3GTmm70/fi7ba J6b7uSDap7VgXrzpoNNTvu6Sz0/6SjEqfd/yG0pX6TsXq/T3cNo2n++jCN9r8SF7Hb69pr// IE6Nji21sSvLbTicmrgo0WYuj6Pua6atySug5zy9b1cmWnZzJ2uXPsEOWjM+v/oDx2DVp7w+ A6/o8UtNpcJtffSy2E6fw156Z3Syhoo6fOuLbUJEso0OS2BLDtqaAgtJrYZXtRaR02SxxdSu 2LjPrQfO2noabcU6q95rMOs6euka7z+j3hGvtw9av/tU3kQ+tV8Lum9it52WCvTcxefnWT7a KttnE9rHcQn943LRu7wc9Dy24tFALrryAZ15zMrrvoe+wj/YJb/hbeJdd4O+P/IntpMvCKtk WfApE/+h4lNpQS2V3HwTRt1ET920OPyAMr13rMLnJ1bJx+f01CBORW78zJZWXkJDnUFLncHv Rw4FjJqbd8hC8vbbAn5zLKJ+RWhOj02jZ8gr09fQgzGKXL84e3t2lE2LSrOV+PxW59fa5NXr LWZju1Vv7bPsimZbu6HI4tILWDdQY9lbuywyI9MWJiRZfVaK1a5Psk9yyX+oTbTTNaF2sBBN Vb4AVsEln1WlYtRgTpFHIU4N5FI8ZtT5qqXfmlMXNnn1kvyaSZfgziXmNTHqm3JKvr8bcOq6 4xR101nD/FmZODXTLgXec3kUWuernr4n1wU5xfqpnct+Ze2L/t6tn9o05/uur28JNZMcpz76 MX19v3tOdZND0QWrxKiu8F+7/oiq7afYlDjVHuTUNuoltYY85lTHYnHqF7YrTnpqJP2BJ9ip nCmubpLjVD56KjDbaSnHqQCxKXGqRJzyGKX41LfVU34+37+3vdkApzAxRXOm8vc0XzstxDyl OVRzsGJROu5iTuKOGMBcrflYY6THFKNy829wDtZ1fB+b5lhnmm9l3M9jFdfk+tJLfh6e5mzn 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 3tyUAKsO2MIN6KwNCfYWuazl2xijHJxlq8KK7d1wamDsKbP30VwfRFXbxzF1LuezPqGVmk29 9mliB+OQumDVoMtx7cjC/4gO+zSRnE7ZOXgEo4gTRsGpKMUKaRGl59BfZ20X93o39zZCGqzi Mnxi/sISYniMpVYLzr9oW7LP2ebsMxaUf4F657wmL7iJ330L/wPiVDAekCD8IGsOtOLR5/yi a+zjiEqYW2R/3EW8D1b9mZzdelj9WXqtbcthjkMYFV7Rg48DPdXKfF6M5RWrinieyG9FU8Gp nJpui0krsuiUAstMS7O8LHnQk+1wZbqNV+6183DK+cthz50qas7CKY2VEpduVFILqSr0u+eU fHviz0ucEpPEqtl6yuPUF+N+T9BOatJTjlGOVZ4/XaxynIJVf3GcinCcelIHp4j7PeJ6v4pT R9BTg8TT2mFD86evWP0G5p+nla/7oYv7teKjeMA4X49T8NBxinG+/Sn2+GtwysX8qsNhRLBd dXG/jV/IT2mc72Co6jfJQwGrduCT3/IDxyk/7uc4BUsdp0L/0QbFKfJT/z9wytdTrq+l75oX 6MPVj4tVC9Rf0o+JURrL+zpLvVfTa63TZ2rqn3194XgmPaB+nv819YmOPfT/ivv5tdHl99M4 Xz3fizlz4KTGRbkcC+u8vBV15tAkYpX2J6Y57yD9pnwR+p7OdT7Hd954zvkN+mW9d2xl6dhK P63Pta3jVODcxR+te02cYl9aOo0V+L4+c/vnGsUtMeptcY/lYvapdS84N+j4Lab446N0L3xG iT96r/G7Yo/Lc0kTEROU1nKxRPap7f0mXv0f6s77PYorW9eTPOHcZ8KZmWuPPbbJORhwzsY2 tsk5I3JGQkIogSRQzgHlnDMogsg5S0RPPufOH7Pu++3qAtkz14yvZ/yc+WE91V1d1V1dgv32 t9a31/brh2KbcoN6H19viVfij2MOPJEO9Tnl7j/3yN17Pk+s1+t67vNL+cFprN07lTF1Bvml afRWeoWa1Kt4KV6lTvU6uacp7JtEj6VJ1G4mxjTZawcb8Ko32UdxDfZRbAO5rVo8bq30DcL3 XNvt1vSNK6NvX1mlJZVVUZ9qtUp403jqjLVfuGit6KZGeFTdT56v77RVsC3q7reCzj4r6e1n zapTcOgkPOqHVyetkvOq0VM1ZzgHntUyb7j+HLnC09eZl3WJdX3PUcs6RU6wmx5MjbYlsYT1 7FMYx6PszRUh6I449BOPl+MLXLzHXlkUbK/Rm/X1JaH2GrWsqYvJDxLTloTZjGXh9uoqjl0H 5zYchlmJ9uHWVJu5JcU+3p4Ol8gXhhWyPWKz8WooVkdW2NroKgs6UEtv13pb70dco21gLtcq 2L6Oe7b+UKttINbR32P1AXKLMWhS9Nkq/q5L+Y22iHrTEv7vLWXfIjTbgogqmFNlmhum+GRn Ftd2kL7n+PGXRdi78jgS763dZ7O2MP9612Gbg45ajM9lU3o1NalG/BrUELOo7RU0WnJVh2U2 9NiRmjZLzC23iINJtj04wkKCd7jIjtxu5Un77VTGHutN2maXktBIaCbxSXEZn/bljMWe5xx9 dTOdfhIZ1K3+xXpKOT/HqSGseuyj8PpSiFdi1KO8H0xTbWpofWqo3085Pxew6wE5JcXDIubx 8Lv+fh5zqbLwUmQsg1NLqE+xtofTU297eipiqlt7vm/XMPQU/Rw2/sKbQ7XkKdePIm/eDyyX 0Pwpsapw9YvoiSVeP4oyccrrR3HPcYrHT9BTmjt1IX0tHpZleFkW2Zn4udanvF+gPtW0/gW4 Q28/5/XzfBRli59yWqocH4X8FD6nKpbR728NnFr7n85H0Yrf73+6nrrD30XhtIcYwBimMVnj tdNKjKkai/1xXFzSsdontvnjudvH+Ro7J/F/TlpKtSkv78S4yvso36T+TG49CnJ9YpU4pTlU 4o7yesrlyd/n2MNzMUljsPpRaD0N+cM11mqMlT5QLkq1r1Ec6zjK8bom8XZsgC+6dqeLuCZd s577HBbP9F10js73+aVjdP5oxoyR6EvdC70uzol54pTipQCrxB5fk8qTr8dil+snAW91X1yd j+sVwxRilJ8jVG7Q11/a59jD1vGN4/z30+copAOdfmOrz3Hc1ncRw/iO+l0g/nheE/jEPuVK xX/dM2kjp0u5NqeV+O0/Rd/J5xS5Pp9Tr5H/E6cm04d7Sqx0Zitzfpvtjbgmm3mgzt6LphcE ObetGTX0g22jP16PZbV00zvpuOXhg0itqrPk0jLLqau3smOd1nDytLVfumad125Z+5Vb1nT+ qutNUYZOyj/aY3kd3eT1WA+4uxdPxXHqVafRWWet7vxFqztHzyU4VXHiolX2X3KMKu05T//b C3gGL9Jf8DL1LNZTpN9CZFE79St8E2HpcCreZq4Xs8LstaUhsGmvzViwG6/gFhv9PvUstiNn bcaHscltx3623SbMQ3tR35qyMNQmzQ+BYZpnHGfvrk8gt3iIfq7x9MZIQ2MV2Jzt2bZgNz6N kEJbGsp849ASW45fYzX3Zj2sCoLpa9Ciy8gdLsG7sTisgjW2qmzpfnKJETVwr9bmBlfiUSyz 2cHl9hka7ZM9JczTzbV3Nmfi40vCb55sr5OvnLwgzCZ+ttNe4prehFXvrIq2D+nVMWfnIVsQ mor/j/7ysfSUCHBKrAorbMJLj98vo9R2JeVbWFy67Y5OtOB9B23n3igLDw+26Kh9VhQf6jjV l0S+7/AWu0pe5yb1++vk+xRXMwOhHCD+CHFK8W1w6sv1qceceuxPF6O0X7rrNjrJ55Tm+Dpf OvtUp/L4tIN14L14+IhT8ApOPaAvxp1scYqeFNTa/iFOrcXrTR899U7Km/8U8QN86T+md9IP H3OKnJ/fN+leJevNV4eip57MqYtoqfPcZ3Hq1KGFdiZujvVFfvSoPtW04UVqU8/BKeZOEfL7 lcFMaSl5KcqXfgdOeT2TlPurXfsLalNwivqUfOn/LpwSn6YwXk9mPNUYP4KxWaGx2t8nFoyM QPNQvx1/kLFS4yUh3aKxXnk1jat+HUc5JOXsNHY6Rmns5j3EKedJh1tilHrT6je+cnlilXJ7 zssOGzS2akzVPCWt5aQ5UXru6ljiFOdpvB2uWpXYyvlii7b+Y30HfT/FBHxcTjPyHcbGeBpM 38//Lv5W5+j8YdTfnqdmp63eX6/rPk1jTFdM5fvqfJeX47qkd3xtpTqXcot6LrZIbzqfBOf7 OTu/759qVMr/qT6k1/ytX89y+cnAe+h99J5ilx+6B7rH4pXYrvsy1DshTnn3Fe+k3odjVdfT fXb3HhZqTY8Z8XgvqNe/Ed9L4ANRfYqYxP5JceQfuXbFK3jhZsTTox199VpUg81ifFyRUEpu iRxgdRf65jgeiPNW1ttHXyTmV9XVWG5zoxW0t1lJl/pVMMf36g3rwF/Riu+v6/ZDa7p406rw V4hXpX14/7p5D1hVTO6v/txFa7l8zVouXbf6M5esiveu7CMX2E0Nq/M0vVTPWn436zEepz/T 6VvUtgZ4fI2+TWdZm5G5veS/1kZn2yJyYrPRVrM24l1ftc9mzNtu4z9cR5/WDfja19qLM1fZ Cx+sZLvahn+8Fm4FuRg1a4ONm7MFVsEG8ojvrJfWikVnJZBnQ2NtTbIF21NswY5Um892Hv1f F+3KsBWh+fToKLF1UWXMmz1i83dl2bwdmbYoOA+eFcIz5nkF59tnm9JcfLI5zWZtSiWvl2Lv wcNXV8Ywl3mfTVu6z15ZEWGvrYywV5bts9eWhdpbqyLswyB6Hm6Ms8+2xNq8nYfp25HBWsgF 9KcotBUHj5BTLMa/UW3b6dG3ifUQd8Qk26b98RYSFmXBoZEWERpm+/eGWuaBDVaSGmw9mcHW jo46d5g1N1LxFtBXbhC9dD2b+brEJXoJKbz+6CtskLrE4LdQn/qCLz3Aocc+Cs+j7vPJY9TX 5dRWe8j7fg7nHqDLHuRT189ea3fh8WDaMo9T8cyhOoieimQOVcRLAT013Omplo0//4KekpYa qqcKVr1AjWax3UVL3S1Fr1XBqMrddq8q1AbKyf89QU99Y04t+Q55yQCnVvzQMao+6JdWF/S0 86X/u3DK5cwY2/wx2x/rNaZrn8b3MYyLPgs0jvuaRfvdGMz5fn1Fekr+OGke5f3c+hT8dtf6 f8r7SUdNh1/qRas+3l5+EK3A+KlxdiizNKbKV6G5Sr4fUKzS+OoYyHvpuvwQX8UtbcWaR5zC u+VYxZjtX7u2Yo+/lb5S6LmY/EJolT23p9xexK8xlFPSUQrdm4lxXv1K+TlxRbpJ/FD9TnwR m5z+4bF4JW0l7SQ2uZ601Nd9Tvk66suscppJeolz9Tna6l77IZ2k+6TQXGX5UuTl8/tlSEOJ YcqvKsQn9fIVu8T8scR4jpkOj15NoAfFYTx/6KhX4NUM8n9TYNdksUp/T/6ur+KBe+XQUXs7 rs3ehFWfhWeyNl8JHusa+g61sebFMXTNSXomoY/a2q2ip9sqe3uY/3vM8ltb6FHRCZO0fiJ9 K85dttbLA2iq68Q1a0VjddxgftWVG7CLHhYXLtlRnncPMEd44IF1wrajV+9Yx5U76LJB+i7B pbO3reLMLWpYN6zsJNF/Ew/GDfTYDSvqvcb2lmW2nKM3e5eFZjXYzqQq2xSL92Jfti2klvXB 1oPUpiKZKxxq05fvIYJtxvIQm76MutaSPfbyilB7iXzhjOWh5P8O0bc9B49Fjs3akeyYNXdL os3edNhmrY+zD/HDv7cy2t4nHzdzLR5x+hcpN/fWskjyjBH2FvWw99FiH6w7jBaKtdeXRjFf GW/Hilh7bzXHro63N8ntvc48sOlL9ztNNwHv4uQFXBOevjdWRdoHcHLWlsM2d0cSfEpGyyW6 WIR2XE19blkMuUm8FIujsuirVISeyyb/mGthiTm2LznX4hJSLSI63sJD9tqubdssLSrIytJD rC97r3Wk7LBLyRvsds5Oe5hLL4jkFXYjZ6WLK7n40nPUY4K5u5kepwao7f+r9ZR6JnnzfL9U o4Itjk/k924Nids8VmjulJs/xWP50v9feb+HHKf4nPcTpx46TuH5+0c5teHn6BW8C0t+YAXz vwOjvm85c1nfAy2V/An7fE6Vkr8qgf9oqbsVu+1u1d5/iFPfNO8nXeU4tZJ+6YQY1bD+V2yf xpf+4r+Nnhp3gPENFk1k7NM47esKPZZ+mMQYLw0lLSUuaRwfx5grng3bV8OYHPAksE9jqsZP N1+VMU21ED/nJEbJRzGNMVE9abVuh9bn1e99jbEaS/28lMZejaMuV8X7iU16L+UBxTWdo32a yzpe7OE7jOYc8enFsGp3XZ7+g49c/2S+h68Zve/i5fV8JotnE3h/n2Xed6u15/dW8V61Nor5 Q0478p1ekpZiDove1zFe18I1uZoS30vf32e3uOLrH9+7IZb5rNL8KnFKz3XPfN45VrFP+/V+ ql35+6RVXU6Q93bcCtwb3T/da5cv5TWxSr8VfM+kuK57qjqg02D8rXTO6Cj9Pbm3sfg6qOuL U4pXxapDvfCpxybCqXHca4W8+fod8gbbN3g+n7k3i/E2B9EbbksOvmfWl4qtQUc10TuupQVd 1UmOjlzeMdaSqK9F49SjdTpYA6TXMtvJ83WcgGd9rv+Seqq3XkZrXR+ASYOOT92379qJuw/t 1P0/En+wM/f/Ymcf/redufdfduL2H6z73l+s6+5frHPwz9Z+6w/WfPWhNVy6h3/Qi8aLn1Pj GqD+ddWy4VV6wxlLrunHm92Nl76DubiNtjWzih4PRbYyLg894sXymFx6BmbhVc+iJ1OKzQlh jWHl1eDAov3423cn2cytaJlNcTZ7fYx9vAaGrNhn7y5F76gGNp813ufusLHvrbVx5BfHvh/k YvR7QTbq3XU28p21LiZ/sNFenb3TXl9IThIevYznQ7Wz11eE2+vL9+Gv32VT5u+kLrXH3lod QR4TVgan2bIwrgXWro5gPtn+HDz22UQWnvU8Wx1XZGviC6l95TNXqtp2pxZbCPWobeT6wsPC LWp/pKUeiLaMuINWzdzdxszNdiZzi4v7WZvtd3nb7SHzdgbQS1fg0lXiAusHKm7iMbjB8wd4 vB6gqf7VnLp+BF6Sj/PqVIH5U3DHYxPPA499Pvlbn1NP8lF8zvkuxCs8G45TOfSlILd5B7/I 7aS5dt3pqXeG6KmJ1rcLPbXlOWsRp9bQMx1OqR+FOKVIo196yidPfTWnyp6sp76pj8LnlHpR KMSoxvW/tvr1z7j5U//T9ZTvo3B6grHWaQPGXjeuiwWMQxqPPd0gVvG7G15pPNf4PJLf5b8N rnBzqVTbkW6QV05zl7R2kzxo0kKqOamOpPWUtMaUy/cxvmntWa3TKxb546sYpBC3NJa63B/j qzSWxlTlEp1HDSaKVfJWTw1oG7FKukf650VydSN47PQe32kKGkDfZQrjq65fzBXHxDVxSFzS d/I10liuU++l10ZQ39b7iOPSUdP4XvpMj9+ef2Qol1yNCZZoK57oNc1P05wzb96ZV7NyrEoh nylOcR9874XOEZOct53ald5Hx+q5wuk27pGrdcEo3Q/dZ3/eszST9Kar4bHVPZIXRfdOWmo0 9RBpV+enCHBqbAwei4PK59EnnX484tTrCSecj2ISemoCeb8x/B0UPpPf4v0US2DUokOleKAL 8ZeVMkenmF7k9OGuqrb0xiZ6VNSyhkez5bQ0szZihcWWVVhSrdZHbMX70Ggp1PXjS+sttqSG frRNltN6zIq7T1jNafrV4lNvQ1t13hyw3tsP7Pjg53b63p/tHJw6DZv6bv3eai8MWMv1h9Z1 5y/W++Cv1n33v63j1h+t5ervremKx6iqU4P4L+5b44Xf4YH/E1rtD7z/Qys/fsfSjl1kjfiT 9I7tok9fu4uw4ja8IS2sC4IXAZ+IYmt6Db0C8YTj/f5wW5x9whylRcynXQA35m6KtU+DYuyT dVH2Ebx6bzm1sPm7bdqnW23U26ts9DurbcSbK+3ZGQvt5+M/tZ+OnWW/nDzXnnt5iT07Zb6N fmOljX9/vY2DYaM/CLKps7ez/i7zlVfuZ33D/WipEJ6H4GGMsgV7Um1VZL6tP1hsG+NKbXN8 iW3R/Y/KtwUhqXD0CN6JRtbmogdHLHN99yfbstBDtn7PfgvaHW5he8MsOlKMOmDZh+Otu3iv tWRvs/7UDXY2m/xXLh64HLRFVpA9IPd3CV1xmTH7PLrqIj1ab+Xgn8hZbZ+z7qHi2+KUeiL5 /Sh8Nml7Gy+ECz0eEj6nnuRL/1tO4Yv+Gpx65KOgPqV1PVSb+rt5P3J+f6On/gFOfVNfunrk 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 +2IPdBjRyHXdeaWa4Jj1qYb2wmOYJJ/0WjSxXr7VtaPlCpzy+Hoz1EXRE8H5+X9eDskl84/Z /B7qGh9T1+Be3TygS7fXwVr38bmskl9qiCFc03s5BUu5RmY1K/twcDyunbIl9Q53uznCGmoq 8kl/hSGzqvHU59vJgRZ0k/pLFjrHk9dwn6uj5F7MM3Jsc4NRfyVOwZk6jidv1F2RWxxPJpnD i1qM10dNxfXb17uvus7X1XFeGdfo52T9ixxexin4BkuifuN8zAWO41pmf3Q5Zc8k+yI1crzE Ktmkn6KnTsW+I+CUTGpg3xzfp54/uRXrU7DF3GHzSngKq5rw8A1ZxDELfr/8PLg072ioIqrn Z4ySU1WErCqDS0Ypv8lgPq9RybnmySNWo9H0Xciqcj7jwJm7Q+n0Z0P1nJ30vzqQsWohPUzm Hwgj5+0L183fHyYwhnji0ufCRHm1cH+4cenhcP38vaGlbUe4geff79weY0rblsigSXOeic9v nL8z3NCxLbj++y7bt4bJc58NP+jcEW5atCdMZr2cGt++O4xu3RaGz3gmxsjWHWFsx94whnMY M/9gGM091Nil3qeZL3DMM78p+nDsWnTUprfov3cGbtGTz+DxOOpP4+XSWnkEu+BR4tQkGHVD tzUm/RPm/LL8ntyx9qTn3NArkTglq3wc61NqrQLDkp76pzUvhVsYo7Vy+144tTO8umlBjE+3 kA8j3/eXOfVIeHtngVN4AK9gVeIUS1mVcQpWwaXEqZ7cn+sYO5yxin2pVV1WU0U9JaeoU11l X/q3w6nOWJv69NDiXk5Rm/qIsV7qqfe2zOjh1Pubp0W/X+LUqQU3hyOPjgsHfjk0+v1+/QCc uqc81qa2304P2jvgE/MJ9+XUcw/IKeaan/EZTnVMvFJPrch8FOeuAqf+mi89corPfAn9bvTl 1IlNS8KGtati1HA9l1WV5PMq0Ek+H/I4eS+ijv9T5W17Qgmaqpi6VbmcMu/HPWyO/4O1/B/U /60HUAbIB8fpOgZVplS17oq6SD01xms16+thjxwy79coi+BYDX6+OrwSaqmU+4tz1KurOB/1 lB4KQ82W/H5qOfN8Ka9nHi/1nJVd1sySxjI/mGku6mFcU+WbjJUt6h9ZpEaKzOG5Okq+RO+E GoVrqKxyfWPc1zFkmU9dlrmf+qqKfoDVcEruRS3Gtdw8mjWfNAeGz5O/UOYknWStSg6pheo5 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 GDgwcGDgwMCBgQMDBwYODBwYODBwYODAwIGBAwMHBg4MHBg4MHBg4MDAgYED/x840JCnVN+h ir+lQ08kf9aR77mbvu+9d98/4e1zaA0tIctVRakPddtVLX9BTU8daSHe1/iO3/nIah+LkSf6 erZ7rlinciTX19y2iuInn0rFGs7XdRN1pvrH+vtbeusoj/U84eqn/h0ykmX+QNqS8bvorQIN JwYO/BYOpOylPmR6Fy9+S97nz+R77qb5vkzzvZmm5opVPV618+6wXwJDmyPKVmR7gFDhTl0+ 6qN61nridz4swhvFyBOJVwV/s5R7Lksb1F+K/qTadfvtpjvsttRdXCjYNOBVcm1I/+VwQKU4 p9SnPj2/9Bt+Z253H33znV7NO++m2lRQO+u63XW3nb/uNrPXXQNuFbukxzsNLPt3Hz9/GX/+ kz4CU0/1b9oKW9E6JR+o95o63z7v9tMXgJnYrU3GPa1Yl/fdTXu+nPPit/zmDR91vC/vj3p4 uGngwMdy4K6g3ZH7u5c/8e/M7e5jb4KKV/POuym4dLju9ouX3Xb2opvf/tJNr5516/kNWex4 LnW7r+/bL/pYRvxO92WB79a7AXap2+aiq6ajbn7xuFtcPu420wvgCgxrxCxttLefK+cGvPqd GnR47Z/FgdSHd2eSV9P/k36Qv1jKa3vN+U1p1y6wp15188ufu8XV425783O3uX7U1ZMn2B2/ kvsCWkH9+JEKabLseanjxN//SDwpJUm+HiinJOJEOcOPJac2hdpx121fdd3ke+hB141/6Orr 77r1xY/U/SkV5HrcK24ldplbctvfUDbwb0yz9G+l5JcyEyk3OB6/SxRiOAYOfAIHUlDf/Uhe TdlLffqLpbw2Nei3pF09C7yagVezy0eBV7vbx93h9ueuGj9G2W/QSeyNM7zSx7NDVT8vvBJv E6/A3+3rbgsuNZdfFcyaPeza2x+65esfut3NI8bGt9wvtg14BROG458NBxKR3qxQnk1cynm2 7PczfatfJZtPOZfvufvMXewCXoqtQdpbSmXWrNl29W7RHeavusX10666+bHrpj933Yz09jtc 8eruLxSq+ORbfFgNnfyaDLe+9Hc/smalIMlXyybtYZD1PeHODfV5idlI/Sbfdt3NfWwr0ol/ /4hZ9QRzEruytr5bKPMvnL7Lb274M4935/tW/0ZdnPNw/uOc/syXD4//i+NASvCbFc+z/+Tx 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 2AIzrnLHeo+xWFt/Cx+qbLgiBwM6kXFb1YPVgu3DfitIhhxPW9bZ2KPDWl6Pbazd0E7h2zgL SkkmZAAI4f2yjovlmu+zXJFaypXjmW2o8Iz4/Xb4z++dE2K30xcg1vJiDiVmouvRJ5xLql86 D7PpHQvFX/6NdIog8vwZ33zGvwNrUe7L0s/LtUjPcuyx+brf1HXDkdj3/MG7iYv2VxLXmGEG kHWRklvWtqXw88/LJ7efXE+fsLa3ZP85Ui7qjP43Yc8u8fru4n4+m+uTM5dv0sg7WbKbBqBU 5m5u4pG2nyBuOt+PtUJeE2aWitpXWKcw5nPs4aFvah89YfczJpHrzuG7qf8rY4g4agmcpbX6 pxDvJebz+pGEjQrs5f2IYQPupZ4V/pHqXdrFPONRnGaPQPOwosC2Q7YlXx9d1kYq9ezQB7Ha xRNn9aFym0/aH3+EE76/B8apnWsF4u/cgg7XTglvGy5sqhrJYiwHowK7wU38fQf2CNTIiv68 xsRWxzJO+wNrfHv2pZS5gOXmO7FpB/xjJtZRDmKZ8pv6gVkqSNThsK0QOdLDNtG4BrGHtxEL yX5SRvysTvQTX1uu5MNy41f5IqcLt7NklJX1vMl9cMy5fhKvqi9pF/117I88H3G+7NvIHXPL 2C/ieI1PT/g+VDyHT+P6LXuNOUvujIwVRaLkL5fErE/ilXqW/u3MN0/Yxvb2d/ZX6f8ZNclq yFvop/DKuaCcL3IEJ8DqmjGpxc9AirO/xjt+t05SaW/xSjKbOGswhM+UFELScf8svv7HhxVl NNYMWEWZI65z7L3Bl0A7NnbvWDvELo9iQ2LUL+ZEpgVFpwYJqZfdwdTnHOZ+WsowV5dfn175 S37O6Uat/Q7/A6++AxPoU/M6eFkjsizl+V+KVynnczWKvZqiJF5ZJ6k0lpXcoEe8g1fsJ7xz XwU2cvqUcYhOrN+E34e+e3N7WC64jWmsuxyOW3yOVqx76VPHWhdjY+LTJ/Gq+kPBshhT/wuc VEdBdn8mXp0oR+KV531E4/Chr2eLrbuu9CPDLwMfDDoBVFoQ1eURXokhBUd8WXLMajHHv4/5 zhH7zB5fXGObRAx/MEmdsGLNtgtfLrEKIi6tNr6evZue0bZ//x0ZMcabYaTLn4lXuwooc9x8 gcwj6/qLRN3tS5YhNP7yDT7blteryMX171/nW8q/ZStkn0RO8SE/ss+pfbCvUedZPs7Y231O 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 /1j/qhyoHPhlOJDdNNPsrhcd8mPx6kmhM98xzdddIsvxtoJZR9y4vPPn/p0Vz/SyRFmS85o8 f/X8nvpX5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA 5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA 5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA 5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA 5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA 5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlQOVA5UDlwOfiwL/85je/+TfI418hz/9HAAAA AP//AwBQSwMEFAAGAAgAAAAhALyN59/CTQIAOKUHABUAAAB3b3JkL21lZGlhL2ltYWdlMi5l bWbsfQdwVFeaNVM7VVv1V83++8/MznjHY4yxTQ4iZyGUc845ZySEAiCiCBJCCIRAEjnZYDA2 DjhiwMZmjI1NNA4Ck0SWhKSW1Orc5z/fawkYj2vZcY3Hds0TdXivX79+/e7t2+fcL93+Va9e vbKJnr/VPDBeDnb/vWnXq9cf+vXq1cfFx7VXr1/1Gr/r33v9G5976BTbmb/mhk848Ik225EH /zf8uteivf/WK4BH3nn+3+8f/+579TxRxWtMIPx5YAAxm3Dofl2fXp/36nlenuvZ/1WvPnz0 4DzlQfd/1o2pUKH2wU81BkybUvB9MG9KhcDC8SnAxjQbNnD7MDYlAgqSuH0IG5N5viClG3IN 4uHXcv+nanfP+2KD3JOA9ynovl8r+0Vg3pRsw2ZuCcvmJAVWbhWo39+f/DPs+SzVrcqj6hj4 544BIznxYZgVzky5rxvm9eRQ8qtlQ7oC8/p0mOvSYF6fwceZMG1MQldNLIzrE2Hmvn5dHAy1 8bBuSIaB+6AGKbqh6E+PfvRw9o/fVgs1wcr7l3ElGqiMLx6zrKce1FHf2BawTQJrbSqMddTT 9anQ85yu9Ukwb8tg/6TCIG3bwDYSlod0Uh2vP/5nqPax2sfqGPh5joGHtUP2v6sf2ERu3ZRB 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 D2f6iYOqBd9VyjhhDfMS53LhlsxEz8njreHd5+/c970r5CLZKxgdJ743NVDgzlro+jG8kR11 gPjos7HeejJ/iHITwuA2AUOIizf1c0yredGaYrPCLd/Ha//Hazx51Xjyl9hhPv/7+MFayGAI dhnLtvUCO+pYawt+EmH3PxHtrUMjqfO9YTlzpVQFcBIZ/ChFyhU2FCGLjGxCHpug3JpcKMmv 6qdvtis+tK/WjhtM7llfcgs6K9qlg0YT/7N+FtfKusz+mdo1d6SWePeGmzVAJZcvYZdIt8Sh 4a0y2FFfydrU2COYq9WFaYoI9tAq/BkZqUc4x1nd2bWQmLBo+Dcmq2xRtIUf54e76+JIT631 ckJnClXFQ2QAsTiPy55xz5XcbVPDEa3jO9boEnnN95NnwKMYpaL4UfjHI2iR0hbuM8mPGP4A 1ovDVJiCH3TFEN1ePkTX4D65tCxI3+Db+CzUTluH9dBqb/g4eryvReRVb/brqUURI3V0w3oV 30mlX5DKxEpZvBzGn2wejmcyrYq1cXF1oQpq8uFNL1QxOFyIX9dYqsqVjqwlL7/gnqoyHqr0 8R3S+uHzNTzkQEYNtvh64tHyb95W+ZP7qnjyQEU8F4D7opVzzaLf8INrGf3QYIjhGjPrc4MX ZkVQwTlN/FE5vqtKTl+MXmIwpLrWRDeR+V9VpIP7d6lrq3fU06aF+n/yJ7m3fYNai29pej/W 2sTj7YvEZxzjRrzbALgh+4K3buhtQ+FqDFf26mlKXzFJqbu+QGe8hXuFmAVwqhTfdIkJvKA2 FuQlxFWcoDalnQbir2nz9j9pjGNrRVDTMaRHMwtDZgT00sVdiZgzr0nn9+sc7+zGqkkqenSR Dsm08KOKB6giFs/wYJm+rjWcJQ9uyOHTD+Xw/u/IXx8G3DxhyKbrhxXzlBgG50CoH7jRV8M6 tdXU/s5ybf4WeiJxIxfP0IdmfNNbNWUgVDVjqF5P8Zdl0nPVJsYbDDnH2iqaOIgl1Cqe0gHO r94faKn7J9rp31mHIp11K85dj+f5qTDBX2VJwa/x4+/Y9v+qZfffw/WrsdObVvuivcSTl3Yt kwto2VxNPKFprIka1rI/66Nq8gUpIK6s8W46OnW0jk8n7yGvEN0DtyEy5h4zJo9ZRKY5n7Jo yLnUE3r01SqdnjlRawf1U2KoJ3xFTproQRwP8aRjffrozol97FuAwHqssptH4VvvoqTIIZrl 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 SkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsN DhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCABoAu4D ASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIE AwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRol JicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKT lJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx 8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQD BAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcY GRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImK kpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq 8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDqVA3ofcd/06/59u0smcxgsAOw/D6/59scIDyDnP49 envRK26RcHOO3+f8/wAh/OnM+ax6Z5Z+0rEI/gn4jkXLsGtcKDnP+kxcYz/n27fDqTIREps2 3FV4285x+H+fTt97fHTSJtX+GGvwRxTMc2xHkxPI4AuIy3yowY4UE8HtXy0fBWsWtvEy2V/M skagFNMcORgYBYueOuO/07f0n4dxp/UJQlJc3N+hzTp82xw9pI8cR2xCPtgN3/P/AD7dp4bi 5kB3DDDoTx/X/P4cdJJ4N1KNstpl7Ef7jwsG/l/n+VO48M6w20LousAe1q2G/H/P4dv2Zzwl Jc0qkb/mXGHKjBuL68VvL8pJWI65x9Pp/T2xwye7vkITypFJ/wCe1wHX8BtXH6+n005PCWtz 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 UEsFBgAAAAARABEATQQAAOcmDQAAAA== -------f63189fbe714bc020ba464fe3fb9b75e-- From Yann.Dupont@univ-nantes.fr Tue Apr 16 03:37:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B07577F37 for ; Tue, 16 Apr 2013 03:37:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8A2628F8078 for ; Tue, 16 Apr 2013 01:37:03 -0700 (PDT) X-ASG-Debug-ID: 1366101422-04cbb057f5251180001-NocioJ Received: from smtp-tls.univ-nantes.fr (smtptls1-cha.cpub.univ-nantes.fr [193.52.103.113]) by cuda.sgi.com with ESMTP id A9g1hlOBaKQBqAwQ for ; Tue, 16 Apr 2013 01:37:02 -0700 (PDT) X-Barracuda-Envelope-From: Yann.Dupont@univ-nantes.fr X-Barracuda-Apparent-Source-IP: 193.52.103.113 Received: from localhost (localhost [127.0.0.1]) by smtp-tls.univ-nantes.fr (Postfix) with ESMTP id C039C403932 for ; Tue, 16 Apr 2013 10:37:01 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at smtptls1-lmb.cpub.univ-nantes.fr Received: from smtp-tls.univ-nantes.fr ([127.0.0.1]) by localhost (smtptls1-cha.cpub.univ-nantes.fr [127.0.0.1]) (amavisd-new, port 10024) with LMTP id GfpXnQ2foM1j for ; Tue, 16 Apr 2013 10:37:01 +0200 (CEST) Received: from [IPv6:2001:660:7220:0:a0f1:f89d:e68f:47c9] (unknown [IPv6:2001:660:7220:0:a0f1:f89d:e68f:47c9]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp-tls.univ-nantes.fr (Postfix) with ESMTPSA id A2231403927 for ; Tue, 16 Apr 2013 10:37:01 +0200 (CEST) Message-ID: <516D0DAD.8080100@univ-nantes.fr> Date: Tue, 16 Apr 2013 10:37:01 +0200 From: Yann Dupont User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130308 Thunderbird/17.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: kernels 3.4 slower due to allocation workqueue References: <516BCACE.1040900@univ-nantes.fr> <516C046C.8080908@sgi.com> <516CFCB8.1060804@univ-nantes.fr> X-ASG-Orig-Subj: Re: kernels 3.4 slower due to allocation workqueue In-Reply-To: <516CFCB8.1060804@univ-nantes.fr> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtptls1-cha.cpub.univ-nantes.fr[193.52.103.113] X-Barracuda-Start-Time: 1366101422 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128267 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le 16/04/2013 09:24, Yann Dupont a écrit : > Le 15/04/2013 15:45, Mark Tinguely a écrit : >> >> Here are the allocation worker changes. >> > > Hello mark, thanks for you answer > >> The biggest performance commit should be aa292847, which limits the >> callers to the worker. >> Yes. This is the case : 3.4.39 with aa292847b9fc6e187547110de833a7d3131bbddf applied gives full speed again, at least on this very specific test. Will try to have a more global view of the effects on other tests. Thanks, -- Yann Dupont - Service IRTS, DSI Université de Nantes Tel : 02.53.48.49.20 - Mail/Jabber : Yann.Dupont@univ-nantes.fr From debbugs@buxtehude.debian.org Tue Apr 16 03:57:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E41BE7F3F for ; Tue, 16 Apr 2013 03:57:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 72468AC005 for ; Tue, 16 Apr 2013 01:57:11 -0700 (PDT) X-ASG-Debug-ID: 1366102628-04cb6c2c1f25bb60001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id pmXCyNEy1xf1aNaG (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 16 Apr 2013 01:57:08 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.80) (envelope-from ) id 1US1hL-0002Qb-Cd; Tue, 16 Apr 2013 08:57:07 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Reply-To: James Carter , 705483@bugs.debian.org X-ASG-Orig-Subj: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Resent-From: James Carter Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Tue, 16 Apr 2013 08:57:05 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 705483 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by 705483-submit@bugs.debian.org id=B705483.13661025688457 (code B ref 705483); Tue, 16 Apr 2013 08:57:05 +0000 Received: (at 705483) by bugs.debian.org; 16 Apr 2013 08:56:08 +0000 Received: from statler.bytemark.co.uk ([212.110.162.18]) by buxtehude.debian.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1US1gO-0002Bt-5F for 705483@bugs.debian.org; Tue, 16 Apr 2013 08:56:08 +0000 Received: from eboracum.office.bytemark.co.uk ([2001:41c8:0:80:59:10:a8:98]) by statler.bytemark.co.uk with esmtp (Exim 4.72) (envelope-from ) id 1US14u-0005Jn-Eb for 705483@bugs.debian.org; Tue, 16 Apr 2013 09:17:24 +0100 Message-ID: <516D0911.5080408@bytemark.co.uk> Date: Tue, 16 Apr 2013 09:17:21 +0100 From: James Carter User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.11) Gecko/20121127 Icedove/10.0.11 MIME-Version: 1.0 To: 705483@bugs.debian.org References: <516C12DB.3060806@bytemark.co.uk> <516C25AC.60506@sgi.com> In-Reply-To: <516C25AC.60506@sgi.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Greylist: delayed 2323 seconds by postgrey-1.34 at buxtehude; Tue, 16 Apr 2013 08:56:07 UTC Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1366102628 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128269 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 15/04/13 17:07, Rich Johnston wrote: > > I don't think this is a bug, username must begin with a character > (unless you created the user using NIS or adduser --force-badname). My understanding that this is a recommendation rather than a requirement. useradd(8) has the following to say: On Debian, the only constraints are that usernames must neither start with a dash ('-') nor contain a colon (':') or a whitespace (space: ' ', end of line: '\n', tabulation: '\t', etc.). Note that using a slash ('/') may break the default algorithm for the definition of the user's home directory. In any case, I'd still consider it a bug that trailing non-numeric characters were just silently ignored. -- James Carter Bytemark Hosting http://www.bytemark.co.uk/ tel: +44 (0) 1904 890 890 From debbugs@buxtehude.debian.org Tue Apr 16 07:39:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 299657F3F for ; Tue, 16 Apr 2013 07:39:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 166E28F80B5 for ; Tue, 16 Apr 2013 05:39:07 -0700 (PDT) X-ASG-Debug-ID: 1366115945-04cbb057f62645d0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id kIjBZCav63PEGzJp (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 16 Apr 2013 05:39:06 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.80) (envelope-from ) id 1US5A8-00074v-Q6; Tue, 16 Apr 2013 12:39:04 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Reply-To: Rich Johnston , 705483@bugs.debian.org X-ASG-Orig-Subj: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Resent-From: Rich Johnston Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Tue, 16 Apr 2013 12:39:02 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 705483 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by 705483-submit@bugs.debian.org id=B705483.136611576726057 (code B ref 705483); Tue, 16 Apr 2013 12:39:02 +0000 Received: (at 705483) by bugs.debian.org; 16 Apr 2013 12:36:07 +0000 Received: from relay1.sgi.com ([192.48.179.29] helo=relay.sgi.com) by buxtehude.debian.org with esmtp (Exim 4.80) (envelope-from ) id 1US57H-0006kK-2a for 705483@bugs.debian.org; Tue, 16 Apr 2013 12:36:07 +0000 Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id BE5B68F80BC; Tue, 16 Apr 2013 05:29:47 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 16 Apr 2013 07:29:47 -0500 Message-ID: <516D443C.3020903@sgi.com> Date: Tue, 16 Apr 2013 07:29:48 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: James Carter , <705483@bugs.debian.org> References: <516C12DB.3060806@bytemark.co.uk> <516C25AC.60506@sgi.com> <516D0911.5080408@bytemark.co.uk> In-Reply-To: <516D0911.5080408@bytemark.co.uk> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] X-Greylist: delayed 372 seconds by postgrey-1.34 at buxtehude; Tue, 16 Apr 2013 12:36:06 UTC Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1366115945 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128283 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/16/2013 03:17 AM, James Carter wrote: > On 15/04/13 17:07, Rich Johnston wrote: >> >> I don't think this is a bug, username must begin with a character >> (unless you created the user using NIS or adduser --force-badname). > > My understanding that this is a recommendation rather than a > requirement. useradd(8) has the following to say: > > On Debian, the only constraints are that usernames must neither > start > with a dash ('-') nor contain a colon (':') or a whitespace > (space: ' > ', end of line: '\n', tabulation: '\t', etc.). Note that using a > slash > ('/') may break the default algorithm for the definition of the > user's > home directory. > > In any case, I'd still consider it a bug that trailing non-numeric > characters were just silently ignored. > Interesting I was not aware of the Debian difference. My understanding was that usernames with leading digits would have trouble with other utilities on other versions of Unix and flavors of Linux as they would interpret the username as numeric UID. I was able to create a user with leading digits and trailing alpha characters using vipw. Because chown works using this username, we will look into fixing this bug. Thanks for pointing it out. --Rich From bobcrew00@khu.ac.kr Tue Apr 16 07:47:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3D9577F3F for ; Tue, 16 Apr 2013 07: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 20C018F809C for ; Tue, 16 Apr 2013 05:47:49 -0700 (PDT) X-ASG-Debug-ID: 1366116462-04cbb057f7264ea0001-w1Z2WR Received: from songni.khu.ac.kr (mailout.khu.ac.kr [163.180.96.124]) by cuda.sgi.com with ESMTP id KqcY6o8YQCEY0KRE for ; Tue, 16 Apr 2013 05:47:44 -0700 (PDT) X-Barracuda-Envelope-From: bobcrew00@khu.ac.kr X-Barracuda-Apparent-Source-IP: 163.180.96.124 Received: from [127.0.0.1] ([127.0.0.1]) by songni.khu.ac.kr ([127.0.0.1]) with ESMTP id 2013041621:47:35:443406.7664.2254064528 for ; Tue, 16 Apr 2013 21:47:35 +0900 (KST) X-Priority: 3 Message-ID: <17935323.1366116366191.JavaMail.root@songni> Date: Tue, 16 Apr 2013 21:46:06 +0900 (KST) From: FL Online Reply-To: FL Online To: info@freelotto.com Subject: RE X-TERRACE-DUMMYSUBJECT: Terrace Mail System X-ASG-Orig-Subj: RE Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part_729202_19523488.1366116366191" X-TERRACE-SPAMMARK: NO (SR:23.75) (by Terrace) X-Barracuda-Connect: mailout.khu.ac.kr[163.180.96.124] X-Barracuda-Start-Time: 1366116463 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=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, RCVD_BAD_ID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128283 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 RCVD_BAD_ID RCVD_BAD_ID 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message ------=_Part_729202_19523488.1366116366191 Content-Type: text/plain; charset=EUC-KR Content-Transfer-Encoding: 8bit Your email address has won,560,000:00 Pounds,in this week's UK FreeLotto promo Bonanza. without the sale of anytickets! send the below details: Full Name: Mobile Number and Alternative Email Address. Thank you Mrs. Laura borgotti ------=_Part_729202_19523488.1366116366191 Content-Type: text/html; charset=EUC-KR Content-Transfer-Encoding: 8bit Your email address has won,560,000:00 Pounds,in this week's UK FreeLotto promo Bonanza. without the sale of anytickets! send the below details: Full Name: Mobile Number and Alternative Email Address.

Thank you
Mrs. Laura borgotti
 
------=_Part_729202_19523488.1366116366191-- From tinguely@sgi.com Tue Apr 16 08:26:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C6A407F3F for ; Tue, 16 Apr 2013 08:26:38 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8D4088F809C; Tue, 16 Apr 2013 06:26:35 -0700 (PDT) Message-ID: <516D518F.1000708@sgi.com> Date: Tue, 16 Apr 2013 08:26:39 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Yann Dupont CC: xfs@oss.sgi.com Subject: Re: kernels 3.4 slower due to allocation workqueue References: <516BCACE.1040900@univ-nantes.fr> <516C046C.8080908@sgi.com> <516CFCB8.1060804@univ-nantes.fr> In-Reply-To: <516CFCB8.1060804@univ-nantes.fr> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit On 04/16/13 02:24, Yann Dupont wrote: > Le 15/04/2013 15:45, Mark Tinguely a écrit : >> >> Here are the allocation worker changes. >> > > Hello mark, thanks for you answer > >> The biggest performance commit should be aa292847, which limits the >> callers to the worker. >> >> commit 3b876c8f2a361ceeed3fed894980c69066f903a0 >> Author: Jeff Liu >> Date: Thu Jun 7 15:44:32 2012 +0800 >> >> xfs: fix debug_object WARN at xfs_alloc_vextent() >> >> commit aa292847b9fc6e187547110de833a7d3131bbddf >> Author: Dave Chinner >> Date: Thu Jul 12 07:40:43 2012 +1000 >> >> xfs: don't defer metadata allocation to the workqueue >> > > Only These 2 commits are candidates, the others are post 3.5. > I'll try to patch a 3.4 with each patch. > >> commit 2455881c0b52f87be539c4c7deab1afff4d8a560 >> Author: Dave Chinner >> Date: Fri Oct 5 11:06:58 2012 +1000 >> >> xfs: introduce XFS_BMAPI_STACK_SWITCH >> >> commit e04426b9202bccd4cfcbc70b2fa2aeca1c86d8f5 >> Author: Dave Chinner >> Date: Fri Oct 5 11:06:59 2012 +1000 >> >> xfs: move allocation stack switch up to xfs_bmapi_allocate >> >> commit 9e96fe6df44425b69ed89f6ac20352cec1f127d7 >> Author: Brian Foster >> Date: Thu Jan 17 13:11:29 2013 -0500 >> >> xfs: pull up stack_switch check into xfs_bmapi_write >> >> >> The last 3 patches address an AGF buffer hang with the allocation worker. >> >> --Mark. > > As 3.4 Kernels don't have thoses patches, is there a risk associated > with 3.4 kernels ? > > Cheers, > The filesystem can hang but only if the OS cannot allocate another worker when doing certain calls. --Mark. From tinguely@sgi.com Tue Apr 16 08:37:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B8ABF7F3F for ; Tue, 16 Apr 2013 08:37:08 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7BC98304043; Tue, 16 Apr 2013 06:37:05 -0700 (PDT) Message-ID: <516D5405.7020804@sgi.com> Date: Tue, 16 Apr 2013 08:37:09 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfs: xfs: fallback to vmalloc for large buffers in xfs_attrlist_by_handle References: <515CB2C1.1050109@tlinx.org> <20130404035237.GA12011@dastard> <515D0A09.5030808@sandeen.net> In-Reply-To: <515D0A09.5030808@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/04/13 00:05, Eric Sandeen wrote: > On 4/3/13 10:52 PM, Dave Chinner wrote: >> On Wed, Apr 03, 2013 at 03:52:49PM -0700, Linda Walsh wrote: >>> >>> Note -- I might have more attributes than some as the disks are shared via samba >>> w/windows >>> and samba stores ACL and xattr info from windows in xfs's attrs... >>> >>> >>> xfsdump: WARNING: could not get list of root attributes for nondir ino >>> 3412893285: Cannot allocate memory (12) >> >> .... >>> [1007383.689492] xfsdump: page allocation failure: order:4, mode:0x10c0d0 >> .... >>> [1007383.689531] [] kmalloc_order_trace+0x34/0xe0 >>> [1007383.689534] [] __kmalloc+0x186/0x190 >>> [1007383.689541] [] xfs_attrlist_by_handle+0x8c/0x110 >>> [1007383.689544] [] xfs_file_ioctl+0x437/0xb60 >> >> So it's the attribute handle interfaces that need the vmalloc >> treatment here, just like has been done for all the other attribute >> interfaces.... > > Like this? > > From: Eric Sandeen > > xfs: fallback to vmalloc for large buffers in xfs_attrlist_by_handle > > Shamelessly copied from dchinner's: > ad650f5b xfs: fallback to vmalloc for large buffers in xfs_attrmulti_attr_get > > xfsdump uses for a large buffer for extended attributes, which has a > kmalloc'd shadow buffer in the kernel. This can fail after the > system has been running for some time as it is a high order > allocation. Add a fallback to vmalloc so that it doesn't require > contiguous memory and so won't randomly fail while xfsdump is > running. > > Signed-off-by: Eric Sandeen > --- > > built& tested by running through xfstests ./check -g dump Looks good. It is needed here too. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Apr 16 10:41:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E06697F3F for ; Tue, 16 Apr 2013 10:41:54 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id BEB8A304053; Tue, 16 Apr 2013 08:41:54 -0700 (PDT) Message-ID: <516D7146.8010308@sgi.com> Date: Tue, 16 Apr 2013 10:41:58 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jan Kara CC: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: Avoid pathological backwards allocation References: <1365710996-16439-1-git-send-email-jack@suse.cz> In-Reply-To: <1365710996-16439-1-git-send-email-jack@suse.cz> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/11/13 15:09, Jan Kara wrote: > Writing a large file using direct IO in 16 MB chunks sometimes results > in a pathological allocation pattern where 16 MB chunks of large free > extent are allocated to a file in a reversed order. So extents of a file > look for example as: > > ext logical physical expected length flags > 0 0 13 4550656 > 1 4550656 188136807 4550668 12562432 > 2 17113088 200699240 200699238 622592 > 3 17735680 182046055 201321831 4096 > 4 17739776 182041959 182050150 4096 > 5 17743872 182037863 182046054 4096 > 6 17747968 182033767 182041958 4096 > 7 17752064 182029671 182037862 4096 > ... > 6757 45400064 154381644 154389835 4096 > 6758 45404160 154377548 154385739 4096 > 6759 45408256 252951571 154381643 73728 eof > > This happens because XFS_ALLOCTYPE_THIS_BNO allocation fails (the last > extent in the file cannot be further extended) so we fall back to > XFS_ALLOCTYPE_NEAR_BNO allocation which picks end of a large free > extent as the best place to continue the file. Since the chunk at the > end of the free extent again cannot be further extended, this behavior > repeats until the whole free extent is consumed in a reversed order. > > For data allocations this backward allocation isn't beneficial so make > xfs_alloc_compute_diff() pick start of a free extent instead of its end > for them. That avoids the backward allocation pattern. > > See thread at http://oss.sgi.com/archives/xfs/2013-03/msg00144.html for > more details about the reproduction case and why this solution was > chosen. > > Based on idea by Dave Chinner. > > CC: Dave Chinner > Reviewed-by: Dave Chinner > Signed-off-by: Jan Kara > --- > fs/xfs/xfs_alloc.c | 24 ++++++++++++++++++------ > 1 files changed, 18 insertions(+), 6 deletions(-) > > v2: Updated comment and commit description. > Looks good. I also agree this should wait for Linux 3.11. Reviewed-by: Mark Tinguely From ranto.boris@gmail.com Tue Apr 16 10:54:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A96FC29DFA for ; Tue, 16 Apr 2013 10:54:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 88516304053 for ; Tue, 16 Apr 2013 08:54:57 -0700 (PDT) X-ASG-Debug-ID: 1366127693-04cbb057f5274cd0001-NocioJ Received: from mail-ia0-f173.google.com (mail-ia0-f173.google.com [209.85.210.173]) by cuda.sgi.com with ESMTP id M6aQ5QmveufYyy9d (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 16 Apr 2013 08:54:53 -0700 (PDT) X-Barracuda-Envelope-From: ranto.boris@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.173 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] Received: by mail-ia0-f173.google.com with SMTP id j5so562121iaf.32 for ; Tue, 16 Apr 2013 08:54:52 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=ckFJ/NoCNtdQrHjIoNV2No1h70F7wyV+RXrwQO3CY/M=; b=OCdAgn7mytlqk4KouEWIBT6N8S9qbbRBFnTB+IGSVdsmavh5mjlTyB0L1QCxi6PK98 /L+qffXw4QXTwUXCCAynBZhubHJ2a/anAIbZ2lXiBC4NcN95Ej4XmzXGVOE8/YeP5xSz XDYnwOG3CveYBHRbCmgMgYYJyZna9clttHC+DemiHJ2gDR1DUXPGN2c64fDDj0k8tMr3 b5XhZp/mTn42E/2BENfJqsJgyuNomktCG6PwaO+XmlSIx3OiOR0M7wHizMcb2p5QeoFe q8e67T5ZpwItvTNjhfgwVp8fQFMvP6vxuDXWr1ZZU4W0OCfZ/DTJtbOr3Ps1y0VlDFgO 7UrQ== MIME-Version: 1.0 X-Received: by 10.50.46.197 with SMTP id x5mr8003706igm.7.1366127692716; Tue, 16 Apr 2013 08:54:52 -0700 (PDT) Received: by 10.50.1.113 with HTTP; Tue, 16 Apr 2013 08:54:52 -0700 (PDT) In-Reply-To: <20120828172928.999971219@sgi.com> References: <20120828172605.607853317@sgi.com> <20120828172928.999971219@sgi.com> Date: Tue, 16 Apr 2013 17:54:52 +0200 Message-ID: Subject: Re: [PATCH 2/5] xfstests: Use libtool to install applications From: Boris Ranto X-ASG-Orig-Subj: Re: [PATCH 2/5] xfstests: Use libtool to install applications To: Rich Johnston Cc: xfs-oss , Boris Ranto Content-Type: multipart/alternative; boundary=14dae9340be9d7a00a04da7c639e X-Barracuda-Connect: mail-ia0-f173.google.com[209.85.210.173] X-Barracuda-Start-Time: 1366127693 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128297 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 --14dae9340be9d7a00a04da7c639e Content-Type: text/plain; charset=ISO-8859-1 Hi, this patch introduced a regression as it is no longer possible to install xfstests to non-standard directory. The install-sh script that is packed with xfstests supports DIST_ROOT variable for installation to non-standard directory and hence, the command make DIST_ROOT=/some/other/dir worked well before the change. However now, even though libtootl actually calls the install-sh script, the libtool itself also checks that the given installation directory exists. Since the libtool does not respect DIST_ROOT, then unless you already have xfstests installed in /var/lib/xfstets, the installation with DIST_ROOT variable will fail with libtool: install: `/var/lib/xfstests/ltp' is not a directory Looking at the libtool script, there does not seem to be a nice way to fix this since it checks that the destination directory exists directly by command 'test -d "$dest". Hence, possible workarounds include creating xfstests directory structure in /var/lib/xfstest/ before installing to DEST_DIR or reverting this patch. Looking at the libtool --mode=install --help, the command should also support -inst-prefix $DEST_DIR but that did not work in my case (and looking at the source code of libtool script, it does not treat the -inst-prefix option specially in install mode). Regrads, Boris On Tue, Aug 28, 2012 at 7:26 PM, Rich Johnston wrote: > This patch replaces the INSTALL macro with LTINSTALL so that libtool is > used > to install the applications. Libtool will install the binary from the > proper > location and display a warning if any shared library dependancies are not > properly installed. This ensures that a libtool wrapper shell script is > not > installed in place of application when libtool wrappers are being used. > > > Signed-off-by: Rich Johnston > > --- > ltp/Makefile | 2 +- > src/Makefile | 6 +++--- > 2 files changed, 4 insertions(+), 4 deletions(-) > > Index: b/ltp/Makefile > =================================================================== > --- a/ltp/Makefile > +++ b/ltp/Makefile > @@ -44,7 +44,7 @@ $(TARGETS): $(LIBTEST) > > install: default > $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/ltp > - $(INSTALL) -m 755 $(TARGETS) $(PKG_LIB_DIR)/ltp > + $(LTINSTALL) -m 755 $(TARGETS) $(PKG_LIB_DIR)/ltp > $(INSTALL) -m 755 $(SCRIPTS) $(PKG_LIB_DIR)/ltp > > -include .dep > Index: b/src/Makefile > =================================================================== > --- a/src/Makefile > +++ b/src/Makefile > @@ -74,9 +74,9 @@ LINKTEST = $(LTLINK) $@.c -o $@ $(CFLAGS > > install: default $(addsuffix -install,$(SUBDIRS)) > $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/src > - $(INSTALL) -m 755 $(TARGETS) $(PKG_LIB_DIR)/src > - $(INSTALL) -m 755 fill2attr fill2fs fill2fs_check scaleread.sh > $(PKG_LIB_DIR)/src > - $(INSTALL) -m 644 dumpfile $(PKG_LIB_DIR)/src > + $(LTINSTALL) -m 755 $(TARGETS) $(PKG_LIB_DIR)/src > + $(LTINSTALL) -m 755 fill2attr fill2fs fill2fs_check scaleread.sh > $(PKG_LIB_DIR)/src > + $(LTINSTALL) -m 644 dumpfile $(PKG_LIB_DIR)/src > > %-install: > $(MAKE) -C $* install > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > --14dae9340be9d7a00a04da7c639e Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hi,

this patch introduced a regression as it is no = longer possible to install xfstests to non-standard directory. The install-= sh script that is packed with xfstests supports DIST_ROOT variable for inst= allation to non-standard directory and hence, the command

make DIST_ROOT=3D/some/other/dir

worked well before the change. = However now, even though libtootl actually calls the install-sh script, the= libtool itself also checks that the given installation directory exists. S= ince the libtool does not respect DIST_ROOT, then unless you already have x= fstests installed in /var/lib/xfstets, the installation with DIST_ROOT vari= able will fail with

libtool: install: `/var/lib/xfstests/ltp' is not a directory
Looking at the libtool script, there does not seem to be a nice way to fix= this since it checks that the destination directory exists directly by co= mmand 'test -d "$dest".

Hence, possible workarounds include creating xfstests directory structu= re in /var/lib/xfstest/ before installing to DEST_DIR or reverting this pat= ch. Looking at the libtool --mode=3Dinstall --help, the command should also= support -inst-prefix $DEST_DIR but that did not work in my case (and looki= ng at the source code of libtool script, it does not treat the -inst-prefix= option specially in install mode).

Regrads,
Boris



On Tue, Aug 28, 2012 at 7:26 PM, Rich Johnston <rjoh= nston@sgi.com> wrote:
This patch replaces the INSTALL macro with L= TINSTALL so that libtool is used
to install the applications. =A0Libtool will install the binary from the pr= oper
location and display a warning if any shared library dependancies are not properly installed. =A0This ensures that a libtool wrapper shell script is = not
installed in place of application when libtool wrappers are being used.


Signed-off-by: Rich Johnston <rjohn= ston@sgi.com>

---
=A0ltp/Makefile | =A0 =A02 +-
=A0src/Makefile | =A0 =A06 +++---
=A02 files changed, 4 insertions(+), 4 deletions(-)

Index: b/ltp/Makefile
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- a/ltp/Makefile
+++ b/ltp/Makefile
@@ -44,7 +44,7 @@ $(TARGETS): $(LIBTEST)

=A0install: default
=A0 =A0 =A0 =A0 $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/ltp
- =A0 =A0 =A0 $(INSTALL) -m 755 $(TARGETS) $(PKG_LIB_DIR)/ltp
+ =A0 =A0 =A0 $(LTINSTALL) -m 755 $(TARGETS) $(PKG_LIB_DIR)/ltp
=A0 =A0 =A0 =A0 $(INSTALL) -m 755 $(SCRIPTS) $(PKG_LIB_DIR)/ltp

=A0-include .dep
Index: b/src/Makefile
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- a/src/Makefile
+++ b/src/Makefile
@@ -74,9 +74,9 @@ LINKTEST =3D $(LTLINK) $@.c -o $@ $(CFLAGS

=A0install: default $(addsuffix -install,$(SUBDIRS))
=A0 =A0 =A0 =A0 $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/src
- =A0 =A0 =A0 $(INSTALL) -m 755 $(TARGETS) $(PKG_LIB_DIR)/src
- =A0 =A0 =A0 $(INSTALL) -m 755 fill2attr fill2fs fill2fs_check scaleread.s= h $(PKG_LIB_DIR)/src
- =A0 =A0 =A0 $(INSTALL) -m 644 dumpfile $(PKG_LIB_DIR)/src
+ =A0 =A0 =A0 $(LTINSTALL) -m 755 $(TARGETS) $(PKG_LIB_DIR)/src
+ =A0 =A0 =A0 $(LTINSTALL) -m 755 fill2attr fill2fs fill2fs_check scaleread= .sh $(PKG_LIB_DIR)/src
+ =A0 =A0 =A0 $(LTINSTALL) -m 644 dumpfile $(PKG_LIB_DIR)/src

=A0%-install:
=A0 =A0 =A0 =A0 $(MAKE) -C $* install

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

--14dae9340be9d7a00a04da7c639e-- From david@fromorbit.com Tue Apr 16 11:18:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 76E887F3F for ; Tue, 16 Apr 2013 11:18:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0E439AC005 for ; Tue, 16 Apr 2013 09:18:17 -0700 (PDT) X-ASG-Debug-ID: 1366129096-04bdf02d1f279dd0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id gHoaLDDms5HWbUwt for ; Tue, 16 Apr 2013 09:18: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: AlMIAOd4bVFFJtkK/2dsb2JhbABQDoJ4vBiFJIEJFnSCHwEBBTo/EAgDDQEKCRQRDwUoIROIFK52jjKPDweCYWEDlwSGK4NRhxmCTDIfKg Received: from unknown (HELO destitution) ([69.38.217.10]) by ipmail06.adl6.internode.on.net with ESMTP; 17 Apr 2013 01:48:15 +0930 Received: from dave by destitution with local (Exim 4.80) (envelope-from ) id 1US8af-0005Z1-Kb; Wed, 17 Apr 2013 02:18:41 +1000 Date: Wed, 17 Apr 2013 02:18:41 +1000 From: Dave Chinner To: Dave Hall Cc: stan@hardwarefreak.com, "xfs@oss.sgi.com" Subject: Re: xfs_fsr, sunit, and swidth Message-ID: <20130416161841.GB13938@destitution> X-ASG-Orig-Subj: Re: xfs_fsr, sunit, and swidth References: <5143F94C.1020708@hardwarefreak.com> <20130316072126.GG6369@dastard> <515082C3.2000006@binghamton.edu> <515361B5.8050603@hardwarefreak.com> <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> <515C3BF3.60601@binghamton.edu> <51684382.50008@binghamton.edu> <5168AC0B.5010100@hardwarefreak.com> <516C649A.8010003@binghamton.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <516C649A.8010003@binghamton.edu> 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: 1366129096 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128297 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 15, 2013 at 04:35:38PM -0400, Dave Hall wrote: > Stan, > > I understand that this will be an ongoing problem. It seems like > all I could do at this point would be to ' manually defrag' my > inodes the hard way by doing this 'copy' operation whenever things > slow down. (Either that or go get my PHD in file systems and try to > come up with a better inode management algorithm.) No need, I know how to fix it for good. Just add a new btree that tracks free inodes, rather than having to scan the allocated inode tree to find free inodes. Shouldn't actually be too difficult to do, as it's a generic btree and the code to keep both btrees in sync is a copy of the way the two freespace btrees are kept in sync.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 16 11:23:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8C9A57F53 for ; Tue, 16 Apr 2013 11:23:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6CE0F304051 for ; Tue, 16 Apr 2013 09:23:53 -0700 (PDT) X-ASG-Debug-ID: 1366129431-04cb6c6e2b15e200001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id hU7d7g6syToZ1QXS for ; Tue, 16 Apr 2013 09:23:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlUIAEd6bVFFJtkK/2dsb2JhbABQgwY2u2KFJIEJFnSCHwEBBTo/EAgDDQEKCRQRDwUoIROIFAyuaI4yjw8HgmFhA5cEhiuDUYcZgn4fKg Received: from unknown (HELO destitution) ([69.38.217.10]) by ipmail06.adl6.internode.on.net with ESMTP; 17 Apr 2013 01:53:50 +0930 Received: from dave by destitution with local (Exim 4.80) (envelope-from ) id 1US8g5-0005Zd-V6; Wed, 17 Apr 2013 02:24:17 +1000 Date: Wed, 17 Apr 2013 02:24:17 +1000 From: Dave Chinner To: Brian Foster Cc: yongtaofu@gmail.com, sandeen@sandeen.net, xfs@oss.sgi.com Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging Message-ID: <20130416162417.GC13938@destitution> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <516C89DF.4070904@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1366129431 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128299 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote: > Hi, > > Thanks for the data in the previous thread: > > http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > > I'm spinning off a new thread specifically for this because the original > thread is already too large and scattered to track. As Eric stated, > please try to keep data contained in as few messages as possible. > > The data confirms Dave's theory where we are going off the end of the > unlinked list when attempting to remove an inode, pass in NULLAGINO to > xfs_inotobp() and the attempted conversion to a global inode number > leads to EINVAL. The next question here is why wasn't the inode listed > in the probe output on the unlinked inode list? > > Unfortunately we're probably going to require to start making some > debug-level changes to the kernel to make progress on this issue. If you > are able to recompile a kernel and/or xfs module (which you referred to > doing in the previous thread), could you start with the patch appended > to this message[1] and collect the xfs_iunlink and xfs_iunlink_remove > tracepoint data the next time the problem occurs? E.g., > > echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable > echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable > ... reproduce ... > cat /sys/kernel/debug/tracing/trace > trace.output It's better to use trace-cmd for this. it will result in less dropped events. i.e.: $ trace-cmd record -e xfs_iunlink\* ... reproduce ... ^C $ trace-cmd report > trace.output > --- a/fs/xfs/linux-2.6/xfs_trace.h > +++ b/fs/xfs/linux-2.6/xfs_trace.h > @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); > DEFINE_INODE_EVENT(xfs_destroy_inode); > DEFINE_INODE_EVENT(xfs_write_inode); > DEFINE_INODE_EVENT(xfs_clear_inode); > +DEFINE_INODE_EVENT(xfs_iunlink); > +DEFINE_INODE_EVENT(xfs_iunlink_remove); > > DEFINE_INODE_EVENT(xfs_dquot_dqalloc); > DEFINE_INODE_EVENT(xfs_dquot_dqdetach); > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 796edce..a43bec5 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1670,6 +1670,8 @@ xfs_iunlink( > (sizeof(xfs_agino_t) * bucket_index); > xfs_trans_log_buf(tp, agibp, offset, > (offset + sizeof(xfs_agino_t) - 1)); > + > + trace_xfs_iunlink(ip); > return 0; > } > > @@ -1820,6 +1822,8 @@ xfs_iunlink_remove( > (offset + sizeof(xfs_agino_t) - 1)); > xfs_inobp_check(mp, last_ibp); > } > + > + trace_xfs_iunlink_remove(ip); > return 0; I would suggest that the the tracing shoul dbe at entry of the function, otherwise we won't get a tracepoint for the operation that triggers the shutdown. (That's the reason most tracepoints in XFS are at function entry...) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 16 11:25:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 56DE67F56 for ; Tue, 16 Apr 2013 11:25:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 378A38F8081 for ; Tue, 16 Apr 2013 09:25:31 -0700 (PDT) X-ASG-Debug-ID: 1366129529-04bdf01d63678b0001-w1Z2WR Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 9in5OlXXJC2EK5rB for ; Tue, 16 Apr 2013 09:25:29 -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: AlMIAEd6bVFFJtkK/2dsb2JhbABQgwa8GIUkgQkWdIIfAQEEATo/BQsIAw0BCgkUEQ8FKCETiA4GrnSOMo8PB4JhYQOXBIYrg1GHGYJ+Hyo Received: from unknown (HELO destitution) ([69.38.217.10]) by ipmail06.adl6.internode.on.net with ESMTP; 17 Apr 2013 01:55:27 +0930 Received: from dave by destitution with local (Exim 4.80) (envelope-from ) id 1US8hh-0005a2-Lf; Wed, 17 Apr 2013 02:25:57 +1000 Date: Wed, 17 Apr 2013 02:25:57 +1000 From: Dave Chinner To: Keith Keller Cc: linux-xfs@oss.sgi.com Subject: Re: xfs_repair misses an fs error? Message-ID: <20130416162557.GD13938@destitution> X-ASG-Orig-Subj: Re: xfs_repair misses an fs error? References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1366129529 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128299 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 15, 2013 at 04:47:32PM -0700, Keith Keller wrote: > Hi all, > > I recently had a filesystem stop, and went through the usual umount, > mount, umount, xfs_repair path. xfs_repair didn't find any errors, but > I noticed that I was still getting some strange issues where a file in a > directory didn't have an inode and was resulting in IO errors. Thinking > to address the problem later, I moved the directory to a different > location on the filesystem so that future backups could proceed > normally. > > Later, in an attempt to collect log errors, I re-ran xfs_repair on the > filesystem. It then found errors and corrected them, and on remount, I > found that the directory in question was repaired and no longer had a > file entry with no inode. (So I can't reproduce that output; I didn't > save it, thinking that the second xfs_repair wouldn't fix the issue, and > I'd generate it again before posting.) > > Has anyone else seen a situation where xfs_repair misses a filesystem > problem, but then finds it if a file or directory is moved? And more Not recently. What version of xfs_repair are you using? > generally, is there a way to use xfs_db or similar to try to find other > inodes that might be causing similar problems? xfs_repair -n is the usual way to find broken stuff without modifying anything.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Tue Apr 16 12:21:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1AD6F7F37 for ; Tue, 16 Apr 2013 12:21:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 08A92304039 for ; Tue, 16 Apr 2013 10:21:13 -0700 (PDT) X-ASG-Debug-ID: 1366132873-04cb6c6e2b162d30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TjaAvDmiVjKkjSo8 for ; Tue, 16 Apr 2013 10:21: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]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3GHL4wN020238 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 16 Apr 2013 13:21:04 -0400 Received: from laptop.bfoster (vpn-57-59.rdu2.redhat.com [10.10.57.59]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3GHL2Hk020615 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Tue, 16 Apr 2013 13:21:03 -0400 Message-ID: <516D87E3.2010605@redhat.com> Date: Tue, 16 Apr 2013 13:18:27 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: yongtaofu@gmail.com, sandeen@sandeen.net, xfs@oss.sgi.com Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: <20130416162417.GC13938@destitution> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366132873 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/16/2013 12:24 PM, Dave Chinner wrote: > On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote: >> Hi, >> >> Thanks for the data in the previous thread: >> >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >> ... >> >> echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable >> echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable >> ... reproduce ... >> cat /sys/kernel/debug/tracing/trace > trace.output > > It's better to use trace-cmd for this. it will result in less > dropped events. i.e.: > > $ trace-cmd record -e xfs_iunlink\* > ... reproduce ... > ^C > $ trace-cmd report > trace.output > >> --- a/fs/xfs/linux-2.6/xfs_trace.h >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); ... > > I would suggest that the the tracing shoul dbe at entry of the > function, otherwise we won't get a tracepoint for the operation that > triggers the shutdown. (That's the reason most tracepoints in XFS > are at function entry...) > Good points, thanks Dave. A v2 that pulls up the tracepoints towards function entry is appended. Brian >From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001 From: Brian Foster Date: Mon, 15 Apr 2013 18:16:24 -0400 Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and xfs_iunlink_remove --- fs/xfs/linux-2.6/xfs_trace.h | 2 ++ fs/xfs/xfs_inode.c | 4 ++++ 2 files changed, 6 insertions(+), 0 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index adc6ec4..338a0f9 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); DEFINE_INODE_EVENT(xfs_destroy_inode); DEFINE_INODE_EVENT(xfs_dirty_inode); DEFINE_INODE_EVENT(xfs_clear_inode); +DEFINE_INODE_EVENT(xfs_iunlink); +DEFINE_INODE_EVENT(xfs_iunlink_remove); DEFINE_INODE_EVENT(xfs_dquot_dqalloc); DEFINE_INODE_EVENT(xfs_dquot_dqdetach); diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 19900f0..d705c77 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1615,6 +1615,8 @@ xfs_iunlink( mp = tp->t_mountp; + trace_xfs_iunlink(ip); + /* * Get the agi buffer first. It ensures lock ordering * on the list. @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( mp = tp->t_mountp; agno = XFS_INO_TO_AGNO(mp, ip->i_ino); + trace_xfs_iunlink_remove(ip); + /* * Get the agi buffer first. It ensures lock ordering * on the list. -- 1.7.7.6 From sekharan@us.ibm.com Tue Apr 16 12:28:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C83597F37 for ; Tue, 16 Apr 2013 12:28:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9AB0E8F804C for ; Tue, 16 Apr 2013 10:28:08 -0700 (PDT) X-ASG-Debug-ID: 1366133283-04bdf02d1d280030001-NocioJ Received: from e7.ny.us.ibm.com (e7.ny.us.ibm.com [32.97.182.137]) by cuda.sgi.com with ESMTP id yMtNc9iN7Uh01SFC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 16 Apr 2013 10:28:04 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.137 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] Received: from /spool/local by e7.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 16 Apr 2013 13:28:03 -0400 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] Received: from d01dlp03.pok.ibm.com (9.56.250.168) by e7.ny.us.ibm.com (192.168.1.107) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 16 Apr 2013 13:28:00 -0400 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id 211F5C90072 for ; Tue, 16 Apr 2013 13:27:49 -0400 (EDT) Received: from d01av03.pok.ibm.com (d01av03.pok.ibm.com [9.56.224.217]) by d01relay02.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3GHRmrO310500 for ; Tue, 16 Apr 2013 13:27:48 -0400 Received: from d01av03.pok.ibm.com (loopback [127.0.0.1]) by d01av03.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3GHRlZ1014105 for ; Tue, 16 Apr 2013 14:27:47 -0300 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d01av03.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3GHRksN014004 for ; Tue, 16 Apr 2013 14:27:47 -0300 Subject: Re: Deprecating xfs_check From: Chandra Seetharaman X-ASG-Orig-Subj: Re: Deprecating xfs_check Reply-To: sekharan@us.ibm.com To: XFS mailing list In-Reply-To: <20130412010407.GE31207@dastard> References: <1365716708.3762.32154.camel@chandra-dt.ibm.com> <20130411221754.GI22182@sgi.com> <516740B8.4030704@sgi.com> <20130412010407.GE31207@dastard> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Tue, 16 Apr 2013 12:27:46 -0500 Message-ID: <1366133266.3762.32211.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13041617-5806-0000-0000-000020C06B6D X-Barracuda-Connect: e7.ny.us.ibm.com[32.97.182.137] X-Barracuda-Start-Time: 1366133284 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com Hello All, While trying to replace xfs_check with xfs_repair -n in xfstests, I found that xfs_check is quiet if all is well, and prints information only if something is wrong. But, xfs_repair -n always prints information on different phases etc., What should be our approach ? 1. add a -q option to xfs_repair, which prints no message at all 2. add a -q option, and it will be quiet, but is valid only if -n is specified. 3. Leave it as is. Since users have to change their scripts anyways to replace xfs_check, they can as well change the logic around the output. Please suggest. Regards, Chandra On Fri, 2013-04-12 at 11:04 +1000, Dave Chinner wrote: > [compendium reply] > > On Thu, Apr 11, 2013 at 06:01:12PM -0500, Troy McCorkell wrote: > > On 04/11/2013 05:17 PM, Ben Myers wrote: > > >Hey Chandra, > > > > > >On Thu, Apr 11, 2013 at 04:45:08PM -0500, Chandra Seetharaman wrote: > > >>Hello All, > > >> > > >>Alex Elder mentioned about deprecating xfs_check, and he suggested is to > > >>replace xfs_check command with a script, that says xfs_check is > > >>deprecated, use "xfs_repair -n". > > >> > > >>Sounds ok ? > > Yes. I'd suggest that you also put a removal date in the output, > such as: > > "xfs_check is deprecated and scheduled for removal in June 2014. > Please use xfs_repair -n instead." > > The same information needs to go into the xfs_check man page. > > xfstests also still needs to run xfs_check. That means we also need > either an override flag an make $XFS_CHECK_PROG have it set > appropriately or add an internal xfs_db wrapper that runs the > xfs_check functionality appropriately. The second is probably the > better option... > > > >>Let me know if it is not the right approach. > > >That sounds ok to me. You might also consider making xfs_check a hardlink to > > >xfs_repair and varying the behavior based on program name. Then xfs_check == > > >xfs_repair -n. > > xfs_check is a shell script wrapper around xfs_db, so modifying the > shell script is the right thing to do at this point in time. > > > Does "xfs_repair -n" need to provide all of the functionality that xfs_check > > provides before it is replaced? > > It already does. > > > xfs_check can be run on a filesystem mounted read-only. xfs_repair > > -n can not. > > -d Repair dangerously. Allow xfs_repair to repair an XFS filesystem mounted read only. This is typically done on a root fileystem from single user > mode, immediately followed by a reboot. > > > $ sudo mount -o remount,ro /mnt/scratch > $ grep scratch /proc/mounts > /dev/vdc /mnt/scratch xfs ro,relatime,attr2,nobarrier,inode64,logbsize=256k,noquota 0 0 > $ sudo xfs_repair -dn /dev/vdc > Phase 1 - find and verify superblock... > Version 5 superblock detected. xfsprogs has EXPERIMENTAL support enabled! > Use of these features is at your own risk! > Not enough RAM available for repair to enable prefetching. > This will be _slow_. > You need at least 16061MB RAM to run with prefetching enabled. > Phase 2 - using internal log > - scan filesystem freespace and inode maps... > .... > - agno = 98 > - agno = 99 > No modify flag set, skipping phase 5 > Phase 6 - check inode connectivity... > - traversing filesystem ... > - traversal finished ... > - moving disconnected inodes to lost+found ... > Phase 7 - verify link counts... > No modify flag set, skipping filesystem flush and exiting. > $ > > So it works just fine on read-only filesystems... > > (Oh, yeah, that's a 100TB metadata crc enabled filesystem with 50 > million inodes in it ;) > > > xfs_check has two options: > > -i ino Specifies verbose behavior for the specified inode ino. > > -b bno Specifies verbose behavior for the specific filesystem > > block at bno. > > which are not available with xfs_repair. > > I've never used either of them in 10 years. If they are needed, you > can still use xfs_db to get that information directly: > > # xfs_db -F -i -p xfs_check -c "check -i ino" > > So, really, we are not losing any xfs_check functionality at all - > all we are doing is deprecating the user facing interface to it. > > Cheers, > > Dave. From bpm@sgi.com Tue Apr 16 13:26:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E6F517F37 for ; Tue, 16 Apr 2013 13:26:27 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 67FB5AC001; Tue, 16 Apr 2013 11:26:24 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 1C14E500B4A; Tue, 16 Apr 2013 13:26:24 -0500 (CDT) Date: Tue, 16 Apr 2013 13:26:24 -0500 From: Ben Myers To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: don't return 0 if generic_segment_checks() find nothing to write Message-ID: <20130416182624.GK22182@sgi.com> References: <51682CCC.308@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <51682CCC.308@oracle.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Jeff, On Fri, Apr 12, 2013 at 11:48:28PM +0800, Jeff Liu wrote: > From: Jie Liu > > At xfs_file_aio_write(), we just return 0 which means a successfully operation if the ocount > is evaluated to 0 at generic_segment_checks(). Generally, it'll occurred if the specified > write count is 0 from the user space. However, for example, if the given offset is over the > maximum file size limitation although nothing would be written into the file, in this case, > the underlying file system should detect this issue and return a proper errno instead. > Hence, the beginning pre-checking up against ocount would conceal some real cause and confuse > the user space program maybe. > > To fix it, we can delay the write count verification until xfs_file_aio_write_checks() is done. Could you wrap these around 72 columns or so in the future? Don't worry about reposting this one unless something technical comes up. Thanks, Ben From jeff.liu@oracle.com Tue Apr 16 13:36:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A6BD97F37 for ; Tue, 16 Apr 2013 13:36:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 82FDB8F8074 for ; Tue, 16 Apr 2013 11:36:12 -0700 (PDT) X-ASG-Debug-ID: 1366137371-04bdf02d1f286450001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id g8FlwY35WdhzoXlX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Tue, 16 Apr 2013 11:36:11 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r3GIaA9H020081 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 16 Apr 2013 18:36:10 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3GIa9R0029422 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 16 Apr 2013 18:36:09 GMT Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3GIa8BT010155; Tue, 16 Apr 2013 18:36:08 GMT Received: from [10.191.12.86] (/10.191.12.86) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 16 Apr 2013 11:36:08 -0700 Message-ID: <516D9A0A.7060708@oracle.com> Date: Wed, 17 Apr 2013 02:35:54 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Ben Myers CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: don't return 0 if generic_segment_checks() find nothing to write References: <51682CCC.308@oracle.com> <20130416182624.GK22182@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't return 0 if generic_segment_checks() find nothing to write In-Reply-To: <20130416182624.GK22182@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1366137371 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128307 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Ben, On 04/17/2013 02:26 AM, Ben Myers wrote: > Hey Jeff, > > On Fri, Apr 12, 2013 at 11:48:28PM +0800, Jeff Liu wrote: >> From: Jie Liu >> >> At xfs_file_aio_write(), we just return 0 which means a successfully operation if the ocount >> is evaluated to 0 at generic_segment_checks(). Generally, it'll occurred if the specified >> write count is 0 from the user space. However, for example, if the given offset is over the >> maximum file size limitation although nothing would be written into the file, in this case, >> the underlying file system should detect this issue and return a proper errno instead. >> Hence, the beginning pre-checking up against ocount would conceal some real cause and confuse >> the user space program maybe. >> >> To fix it, we can delay the write count verification until xfs_file_aio_write_checks() is done. > > Could you wrap these around 72 columns or so in the future? Don't worry > about reposting this one unless something technical comes up. Sure, I'll take care of the patch format in the future. Thanks, -Jeff From sgi-linux-xfs@m.gmane.org Tue Apr 16 13:49:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E850B7F37 for ; Tue, 16 Apr 2013 13:49:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C99908F8074 for ; Tue, 16 Apr 2013 11:49:37 -0700 (PDT) X-ASG-Debug-ID: 1366138172-04cb6c6e2b16a920001-w1Z2WR Received: from plane.gmane.org (plane.gmane.org [80.91.229.3]) by cuda.sgi.com with ESMTP id 7MOsYUJF1qxVmWPn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 16 Apr 2013 11:49:33 -0700 (PDT) X-Barracuda-Envelope-From: sgi-linux-xfs@m.gmane.org X-Barracuda-Apparent-Source-IP: 80.91.229.3 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1USAwd-0003Mk-TP for linux-xfs@oss.sgi.com; Tue, 16 Apr 2013 20:49:31 +0200 Received: from wombat.san-francisco.ca.us ([75.101.60.140]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 16 Apr 2013 20:49:31 +0200 Received: from kkeller by wombat.san-francisco.ca.us with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 16 Apr 2013 20:49:31 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Keith Keller Subject: Re: xfs_repair misses an fs error? Date: Tue, 16 Apr 2013 11:44:54 -0700 X-ASG-Orig-Subj: Re: xfs_repair misses an fs error? Lines: 16 Message-ID: <6qi04axkbr.ln2@goaway.wombat.san-francisco.ca.us> References: <20130416162557.GD13938@destitution> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: wombat.san-francisco.ca.us User-Agent: slrn/0.9.9p1 (Linux) X-Barracuda-Connect: plane.gmane.org[80.91.229.3] X-Barracuda-Start-Time: 1366138172 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128309 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2013-04-16, Dave Chinner wrote: > > Not recently. What version of xfs_repair are you using? Hmm, perhaps this is a difference. I believe (though, again I did very poor logging, and I apologize) that the initial repair used 3.1.1. The recent successful repair definitely used 3.1.10. Is it possible 3.1.1 is old enough that it might not have caught the issues I reported from the 3.1.10 log? --keith -- kkeller@wombat.san-francisco.ca.us From roger@filmlight.ltd.uk Tue Apr 16 14:19:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 317697F37 for ; Tue, 16 Apr 2013 14:19:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1357B8F8081 for ; Tue, 16 Apr 2013 12:19:53 -0700 (PDT) X-ASG-Debug-ID: 1366139991-04cb6c2c1c291bf0001-w1Z2WR Received: from a.mx.filmlight.ltd.uk (a.mx.filmlight.ltd.uk [77.107.81.250]) by cuda.sgi.com with SMTP id FTwhP6JA0HBZipfK for ; Tue, 16 Apr 2013 12:19:51 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 77.107.81.250 Received: (dqd 18533 invoked from network); 16 Apr 2013 19:19:50 -0000 Received: from montana.filmlight.ltd.uk (HELO ?10.44.0.177?) (roger@10.44.0.177) by a.mx.filmlight.ltd.uk with SMTP; 16 Apr 2013 19:19:50 -0000 Subject: Re: xfs_repair misses an fs error? From: Roger Willcocks X-ASG-Orig-Subj: Re: xfs_repair misses an fs error? To: Keith Keller Cc: linux-xfs@oss.sgi.com In-Reply-To: <6qi04axkbr.ln2@goaway.wombat.san-francisco.ca.us> References: <20130416162557.GD13938@destitution> <6qi04axkbr.ln2@goaway.wombat.san-francisco.ca.us> Content-Type: text/plain Date: Tue, 16 Apr 2013 20:19:50 +0100 Message-Id: <1366139990.4522.97.camel@montana.filmlight.ltd.uk> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-19.el5) Content-Transfer-Encoding: 7bit X-Barracuda-Connect: a.mx.filmlight.ltd.uk[77.107.81.250] X-Barracuda-Start-Time: 1366139991 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128311 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, 2013-04-16 at 11:44 -0700, Keith Keller wrote: > On 2013-04-16, Dave Chinner wrote: > > > > Not recently. What version of xfs_repair are you using? > > Hmm, perhaps this is a difference. I believe (though, again I did very > poor logging, and I apologize) that the initial repair used 3.1.1. The > recent successful repair definitely used 3.1.10. Is it possible 3.1.1 > is old enough that it might not have caught the issues I reported from > the 3.1.10 log? > Yes, we had a system here for which xfs_repair 3.1.6 reported for 30 or so files: data fork in regular inode 3238731555 claims used block 1080914355 correcting nblocks for inode 3238731555, was 304 - counted 0 in phase three, and correcting nblocks for inode 3238731555, was 0 - counted 304 in phase four, so the filesystem ended up back where it started. Version 3.1.8 fixed this, reporting instead e.g.: data fork in regular inode 3238731617 claims used block 1080933203 correcting nextents for inode 3238731617 correcting nblocks for inode 3238731617, was 304 - counted 0 correcting nextents for inode 3238731617, was 1 - counted 0 > -- Roger Willcocks From noreply@cmtraining.info Tue Apr 16 16:08:20 2013 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3F4D87F37 for ; Tue, 16 Apr 2013 16:08:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CB8D5AC00B for ; Tue, 16 Apr 2013 14:08:15 -0700 (PDT) X-ASG-Debug-ID: 1366146459-04bdf02d1f292380001-NocioJ Received: from main.cmtraining.com ([103.8.26.174]) by cuda.sgi.com with ESMTP id WvYQLACMynqV7obz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 16 Apr 2013 14:08:10 -0700 (PDT) X-Barracuda-Envelope-From: noreply@cmtraining.info X-Barracuda-Apparent-Source-IP: 103.8.26.174 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=cmtraining.info; s=default; h=Date:Sender:MIME-Version:Content-Type:To:Subject:From; bh=JpMD9HBD0Sryb+AA38OJt2oDhNO/f44Z4pW1xlbFVgI=; b=fTtEh9MLpUitJUwOTklMGO0zMN7TXxKzKFhE3wBPvl1f0SWNUrqVuoEuobVh8IP4ocMfAR+CCIl7GrUSYHN/22Fn4V4NQ+GJI4e2nNVY8wZ6oCf2+YMDe/Mc7JzLIQFyx7DSlSuadbP1lImQkEZCnhjzev/oVBr8/Lyw+h9ezKA=; Received: from dm-8-183.tm.net.my ([219.92.8.183]:1735 helo=TRAINING) by main.cmtraining.com with esmtpa (Exim 4.80) (envelope-from ) id 1US98k-0001Wt-Rl for xfs@oss.sgi.com; Wed, 17 Apr 2013 00:53:57 +0800 From: "Cambridge Training Sdn Bhd" Subject: Enjoy Lowest Group Privilege Price of Integrated GMP & HACCP - 10 & 11 April 2013 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Enjoy Lowest Group Privilege Price of Integrated GMP & HACCP - 10 & 11 April 2013 Content-Type: multipart/related; type="multipart/alternative"; boundary="_Boundary_000_0067_0DC8DB17_39C5E0F2"; charset="windows-1252" MIME-Version: 1.0 Sender: Cambridge Training Sdn Bhd Date: Wed, 17 Apr 2013 00:53:47 +0800 X-Mailer: MailList King 11.3.403.1162 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - main.cmtraining.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - cmtraining.info X-Get-Message-Sender-Via: main.cmtraining.com: authenticated_id: noreply@cmtraining.info X-Barracuda-Connect: UNKNOWN[103.8.26.174] X-Barracuda-Start-Time: 1366146490 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 Message-Id: <20130416210815.3C5D2A42137@cuda.sgi.com> This is a multi-part message in MIME format --_Boundary_000_0067_0DC8DB17_39C5E0F2 Content-Type: multipart/alternative; boundary="_Boundary_000_0046_01DB7DC8_49A4D5D8" --_Boundary_000_0046_01DB7DC8_49A4D5D8 Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit --_Boundary_000_0046_01DB7DC8_49A4D5D8 Content-Type: text/html; charset="windows-1252" Content-Transfer-Encoding: quoted-printable Page Title

 

&nbs= p;

--_Boundary_000_0046_01DB7DC8_49A4D5D8-- --_Boundary_000_0067_0DC8DB17_39C5E0F2 Content-Type: image/jpeg; name="image001.png" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="image001.png" Content-ID: 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 Dtu4/aL3fVbZeJH0fVq4zyovz/vQ9jguj6952jRWz6qzLxL/l61LFZWXyj7bH8vgnyknlW07npUf FQ0GK0rbJ6mobagoTyub38bneezv8fZfnf8v075Vtl15Wl1+VrwrSpPKPOvzBvfPCqOiNK7sx5Cn lbuXbfcr29a9SHvwvDrwtDj9nXXgz+b109Kjonx70f7N08r9s95HL1tHn9c3eVaeP+u6ivKyorSp TP1/0Xfti/Qvn1f/KpueL/see1b6PO/5XvT9/bQ2oqJ7VHTur6i3Fb0jXrS+vGw/8lnXPi6PFT3L y7QhlRXkXzQN/479F3l3/lPGPZWtg5Xp81d2/PO856hsfr1s+/Gs6551r+fFubLv/BcZ2z2rrlSU HpVp0yoSMp4UJTp1PM2rsdNN2/X6lZjO9W21w7Q/sNn3JoHDuG089uR1I5M3/R5WRf4lJF5WzMBo mVF2i2uLZ5M9egj3Ozcjt30S99tEkdc6DI2IKq0G6tSa0DocfccYlG0jUbaMQN02DlWHRPTdGkLv ROgvMkCkbyLa3g0p79mI4u6JKAY2oXRABmc6JvNu/Xj6eIRS3yGRiICRuNTaiE3kT9jX2499gzPY NLiKdYO72Cfl4ppSjG+mjBrNSwhuVUDtttnUbn+HkE7XCOl+hZCeNwjvV0T0QCVxg9RE9VcR3KOc ap1K8WpXhmt7OUJmDkL6PYS0S5iln8Ix8yAuTX7GMfEDnOpOxCUilJ4TG7Lg02Q27Ajjy8v+fH7V h3dOBvHhhS4MWNuFqi3a4th4HkLCpwgp+zBvdRmh/RWsu93CvusVqvS7h8/AHNz6PsCp90PcBhTj YhQzeubhNECGXZ9irHsU4TFYid9IHd7DlPgOUeI9sBznXiW4D1LhKuIwSEGVseA7CZyG67AfrMG6 Xzk24jM6DsrFZfgdnEadw+3VY9RYdJLotw9RY81aqq99lRrrBhH0Rk+iPuhF4ldDSP5uPEk/vEbo x8OI/WYkDX4eRdKvr5D4zSDC3+xFwqaRDPxyOdPXzaJGdTe8vJxwdLLFwsIMCytLrO3tEKwErBzM TK5g8Rvm4r5giYWZIw42VXC386d2jShiwmsTHe1BeJzAyStLuV26hFP3X+GafCxXla9w2cQorqgn clU9mWuaaVxXLCZf9Smlmm2U6A9RojuPXG+cnqkYCh/C7SNcWNWThysTKFjg+EhkWC4gn2tFyXRv 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 rkJggg== --_Boundary_000_0067_0DC8DB17_39C5E0F2-- From david@fromorbit.com Tue Apr 16 17:05:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A3CED7F37 for ; Tue, 16 Apr 2013 17:05:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 82CCD8F80AD for ; Tue, 16 Apr 2013 15:05:04 -0700 (PDT) X-ASG-Debug-ID: 1366149902-04bdf02d202966b0001-w1Z2WR Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id UQ2wEGU29l6nXEqF for ; Tue, 16 Apr 2013 15:05:02 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApEIADPKbVFFJtkK/2dsb2JhbABQgwa8JoUYgQsWdIIfAQEFOj8QCAMNAQoJJQ8FKCETiBS8f48bB4JkYQOXBYYrg1GHGYMdKg Received: from unknown (HELO destitution) ([69.38.217.10]) by ipmail07.adl2.internode.on.net with ESMTP; 17 Apr 2013 07:35:00 +0930 Received: from dave by destitution with local (Exim 4.80) (envelope-from ) id 1USE0E-0007tQ-GT; Wed, 17 Apr 2013 08:05:26 +1000 Date: Wed, 17 Apr 2013 08:05:26 +1000 From: Dave Chinner To: Keith Keller Cc: linux-xfs@oss.sgi.com Subject: Re: xfs_repair misses an fs error? Message-ID: <20130416220526.GE13938@destitution> X-ASG-Orig-Subj: Re: xfs_repair misses an fs error? References: <20130416162557.GD13938@destitution> <6qi04axkbr.ln2@goaway.wombat.san-francisco.ca.us> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6qi04axkbr.ln2@goaway.wombat.san-francisco.ca.us> 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: 1366149902 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 16, 2013 at 11:44:54AM -0700, Keith Keller wrote: > On 2013-04-16, Dave Chinner wrote: > > > > Not recently. What version of xfs_repair are you using? > > Hmm, perhaps this is a difference. I believe (though, again I did very > poor logging, and I apologize) that the initial repair used 3.1.1. The > recent successful repair definitely used 3.1.10. Is it possible 3.1.1 > is old enough that it might not have caught the issues I reported from > the 3.1.10 log? Yes - there have been problems like this fixed since 3.1.1... Cheers, Dave. -- Dave Chinner david@fromorbit.com From tanauaoglub@neyland.com Tue Apr 16 18:49:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 49F927F37 for ; Tue, 16 Apr 2013 18:49:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B9A91AC003 for ; Tue, 16 Apr 2013 16:49:13 -0700 (PDT) X-ASG-Debug-ID: 1366156149-04cbb057f829a440001-NocioJ Received: from hochuna.ru (austria238.startdedicated.com [217.172.186.238]) by cuda.sgi.com with ESMTP id UBzxYiEZSWgpCUnV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 16 Apr 2013 16:49:10 -0700 (PDT) X-Barracuda-Envelope-From: tanauaoglub@neyland.com X-Barracuda-Apparent-Source-IP: 217.172.186.238 Received: from Unknown ([58.22.229.50]) (authenticated bits=0) by hochuna.ru (8.13.8/8.13.8) with ESMTP id r3GNmCZd007983; Wed, 17 Apr 2013 03:48:15 +0400 Message-ID: Reply-To: =?windows-1251?B?zvLk5esg4eXn7u/g8e3u8fLoIOru7O/g7ejo?= From: =?windows-1251?B?zvLk5esg4eXn7u/g8e3u8fLoIOru7O/g7ejo?= To: , , , , Subject: =?windows-1251?B?z/Du4uXw6ugg4ejn7eXx4CDj7vHz5ODw8fLi?= =?windows-1251?B?5e3t++zoIO7w4+Dt4Ozo?= Date: Wed, 17 Apr 2013 01:48:25 +0200 X-ASG-Orig-Subj: =?windows-1251?B?z/Du4uXw6ugg4ejn7eXx4CDj7vHz5ODw8fLi?= =?windows-1251?B?5e3t++zoIO7w4+Dt4Ozo?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0504_01CE3B0D.A6A72AB0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Barracuda-Connect: austria238.startdedicated.com[217.172.186.238] X-Barracuda-Start-Time: 1366156150 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128329 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_0504_01CE3B0D.A6A72AB0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CA=D3=C4=C0: =C2 =D1=CB=D3=C6=C1=D3= =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=C8 =D3=E2=E0=E6=E0=E5=EC=FB=E5 =EA=EE=EB=EB=E5=E3=E8! =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =C2=E0=F1 =ED=E0 =EA=EE=ED=F4=E5=F0=E5=ED=F6= =E8=FE =EF=EE =E2=EE=EF=F0=EE=F1=E0=EC =F0=E0=E1=EE=F2=FB=20 =F1=E8=F1=F2=E5=EC=FB =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9 =E1=E5=E7=EE= =EF=E0=F1=ED=EE=F1=F2=E8 =ED=E0 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=E8: =CE=D0=C3=C0=CD=C8=C7=C0=D6=C8=DF =D1=CB=D3=C6=C1=DB =DD=CA=CE=CD=CE=CC=C8= =D7=C5=D1=CA=CE=C9 =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=C8 =CD=C0 =CF=D0=C5=C4= =CF=D0=C8=DF=D2=C8=C8.=20 =CE=F6=E5=ED=EA=E0 =E8 =EF=F0=E5=E4=F3=EF=F0=E5=E6=E4=E5=ED=E8=E5 =EF=EE=F2= =E5=ED=F6=E8=E0=EB=FC=ED=FB=F5 =F3=E3=F0=EE=E7.=20 =C2=ED=E5=EF=EB=E0=ED=EE=E2=FB=E5 =EF=F0=EE=E2=E5=F0=EA=E8 =E1=E8=E7=ED=E5= =F1=E0. ------------------------------------------------------------- 2=CE - 22 =EC=E0=FF 20l3 =E3=EE=E4=E0, =D1=C0=CD=CA=D2-=CF=C5=D2=C5=D0=C1= =D3=D0=C3 =CA=F0=E0=F2=EA=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0: ----------------- 1. =CF=F0=E5=E4=EE=F2=E2=F0=E0=F9=E5=ED=E8=E5 =ED=E5=E4=F0=F3=E6=E5=F1=F2= =E2=E5=ED=ED=FB=F5 =EF=EE=E3=EB=EE=F9=E5=ED=E8=E9. =D3=FF=E7=E2=E8=EC=FB=E5= =EC=E5=F1=F2=E0 =E2 =EF=F0=E0=E2=EE=E2=EE=E9 =F1=E8=F1=F2=E5=EC=E5 =EF=F0= =E5=E4=EF=F0=E8=FF=F2=E8=FF.=20 2. =D1=F5=E5=EC=FB =E8 =EC=E5=F5=E0=ED=E8=E7=EC=FB =EF=F0=EE=F2=E8=E2=EE=E4= =E5=E9=F1=F2=E2=E8=FF =F0=E5=E9=E4=E5=F0=F1=EA=E8=EC =E0=F2=E0=EA=E0=EC. = "=C3=F0=E8=ED=EC=E5=E9=EB"=20 3. =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E9 =EE=EF=FB=F2 =EF=F0=EE=F2=E8=E2=EE= =F1=F2=EE=FF=ED=E8=FF =F0=E5=E9=E4=E5=F0=F1=EA=E8=EC =E0=F2=E0=EA=E0=EC =E8= =EF=EE=EF=FB=F2=EA=E0=EC =ED=E5=E4=F0=F3=E6=E5=F1=F2=E2=E5=ED=ED=EE=E3=EE= =EF=EE=E3=EB=EE=F9=E5=ED=E8=FF.=20 4. =CE=F1=ED=EE=E2=ED=FB=E5 =F2=E5=ED=E4=E5=ED=F6=E8=E8, =F5=E0=F0=E0=EA=F2= =E5=F0=E8=E7=F3=FE=F9=E8=E5 =E7=E0=F5=E2=E0=F2 =E8 =EF=E5=F0=E5=E4=E5=EB = =F1=EE=E1=F1=F2=E2=E5=ED=ED=EE=F1=F2=E8 =E2 =F3=F1=EB=EE=E2=E8=FF=F5 =F1=EE= =E2=F0=E5=EC=E5=ED=ED=EE=E9 =D0=EE=F1=F1=E8=E8.=20 5. =C1=E8=E7=ED=E5=F1-=F0=E0=E7=E2=E5=E4=EA=E0. =C7=E0=E4=E0=F7=E8 =E8 =ED= =E0=EF=F0=E0=E2=EB=E5=ED=E8=FF. =CF=F0=EE=E2=E5=F0=EA=E0 =E1=EB=E0=E3=EE=ED= =E0=E4=E5=E6=ED=EE=F1=F2=E8 =EF=E0=F0=F2=ED=E5=F0=EE=E2. 6. =CA=EE=ED=EA=F3=F0=E5=ED=F2=ED=E0=FF =F0=E0=E7=E2=E5=E4=EA=E0 =E8 =EF=F0= =EE=EC=FB=F8=EB=E5=ED=ED=FB=E9 =F8=EF=E8=EE=ED=E0=E6. 7. =D1=E8=F1=F2=E5=EC=E0 =EA=EE=ED=F2=F0=EE=EB=EB=E8=ED=E3=E0 =ED=E0 =EF=F0= =E5=E4=EF=F0=E8=FF=F2=E8=E8. =CF=F0=E5=E4=F3=EF=F0=E5=E6=E4=E5=ED=E8=E5 =E8= =EF=F0=EE=F4=E8=EB=E0=EA=F2=E8=EA=E0 =E2=E7=FF=F2=EE=F7=ED=E8=F7=E5=F1=F2= =E2=E0. 8. =CF=F0=EE=E2=E5=F0=EA=E8 =E1=E8=E7=ED=E5=F1=E0 =E3=EE=F1=F3=E4=E0=F0=F1= =F2=E2=E5=ED=ED=FB=EC=E8 =EE=F0=E3=E0=ED=E0=EC=E8. =CF=F0=EE=EA=F3=F0=EE=F0= =F1=EA=E8=E5 =EF=F0=EE=E2=E5=F0=EA=E8 =E1=E8=E7=ED=E5=F1=E0, =E2 =F2=EE=EC= =F7=E8=F1=EB=E5 =E2=ED=E5=EF=EB=E0=ED=EE=E2=FB=E5. 9. =C8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=E0=FF =E1=E5=E7=EE=EF=E0=F1=ED=EE= =F1=F2=FC =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. =CB=E8=F7=ED=E0=FF =E8=ED=F4= =EE=F0=EC=E0=F6=E8=EE=ED=ED=E0=FF =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=FC. =CF=EE=E4=F0=EE=E1=ED=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0, =F1=EF=E8=F1=EE=EA= =E2=E5=E4=F3=F9=E8=F5 =E2=FB=F1=FB=EB=E0=FE=F2=F1=FF =EF=EE =E7=E0=EF=F0= =EE=F1=F3. =CF=CE =C2=CE=CF=D0=CE=D1=C0=CC =D3=D7=C0=D1=D2=C8=DF =C8 =D0=C5=C3=C8=D1= =D2=D0=C0=D6=C8=C8 =CE=C1=D0=C0=D9=C0=C9=D2=C5=D1=DC =CF=CE =D2=C5=CB=C5=D4= =CE=CD=D3: 8 * =CF=E8=F2=E5=F0 * 6=D7 2 __ 58 . 7 5 =20 =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC, =D2=E8=EC=EE=F4=E5=E5=E2=E0 =C0=ED=ED=E0 =C8=E2=E0=ED=EE=E2=ED=E0 =EC=E5=ED=E5=E4=E6=E5=F0 =EF=EE =F0=E0=E1=EE=F2=E5 =F1 =EA=EB=E8=E5=ED=F2= =E0=EC=E8 ------=_NextPart_000_0504_01CE3B0D.A6A72AB0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
           &n= bsp;           &nb= sp;           &nbs= p;=20 =CA=D3=C4=C0: =C2 =D1=CB=D3=C6=C1=D3 =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=C8=
 

=D3=E2=E0=E6=E0=E5=EC=FB=E5 =EA=EE=EB=EB=E5=E3=E8!
 
=CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =C2=E0=F1 =ED=E0 =EA=EE=ED=F4=E5=F0=E5= =ED=F6=E8=FE =EF=EE =E2=EE=EF=F0=EE=F1=E0=EC =F0=E0=E1=EE=F2=FB
=F1=E8= =F1=F2=E5=EC=FB =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9=20 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =ED=E0 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8= =E8:
 

=CE=D0=C3=C0=CD=C8=C7=C0=D6=C8=DF =D1=CB=D3=C6=C1=DB =DD=CA=CE=CD= =CE=CC=C8=D7=C5=D1=CA=CE=C9 =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=C8 =CD=C0 =CF= =D0=C5=C4=CF=D0=C8=DF=D2=C8=C8.=20
=CE=F6=E5=ED=EA=E0 =E8 =EF=F0=E5=E4=F3=EF=F0=E5=E6=E4=E5=ED=E8=E5 =EF= =EE=F2=E5=ED=F6=E8=E0=EB=FC=ED=FB=F5 =F3=E3=F0=EE=E7.
=C2=ED=E5=EF=EB= =E0=ED=EE=E2=FB=E5 =EF=F0=EE=E2=E5=F0=EA=E8=20 =E1=E8=E7=ED=E5=F1=E0.
-----------------------------------------------= --------------
2=CE=20 - 22 =EC=E0=FF 20l3 =E3=EE=E4=E0,=20 =D1=C0=CD=CA=D2-=CF=C5=D2=C5=D0=C1=D3=D0=C3
 

=CA=F0=E0=F2=EA=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0:
----------= -------
 
1. =CF=F0=E5=E4=EE=F2=E2=F0=E0=F9=E5=ED=E8=E5 =ED=E5=E4=F0=F3=E6=E5=F1= =F2=E2=E5=ED=ED=FB=F5 =EF=EE=E3=EB=EE=F9=E5=ED=E8=E9. =D3=FF=E7=E2=E8=EC=FB= =E5 =EC=E5=F1=F2=E0 =E2 =EF=F0=E0=E2=EE=E2=EE=E9=20 =F1=E8=F1=F2=E5=EC=E5 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF.
 
2. =D1=F5=E5=EC=FB =E8 =EC=E5=F5=E0=ED=E8=E7=EC=FB =EF=F0=EE=F2=E8=E2= =EE=E4=E5=E9=F1=F2=E2=E8=FF =F0=E5=E9=E4=E5=F0=F1=EA=E8=EC =E0=F2=E0=EA=E0= =EC. "=C3=F0=E8=ED=EC=E5=E9=EB"
 
3. =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E9 =EE=EF=FB=F2 =EF=F0=EE=F2=E8= =E2=EE=F1=F2=EE=FF=ED=E8=FF =F0=E5=E9=E4=E5=F0=F1=EA=E8=EC =E0=F2=E0=EA=E0= =EC =E8 =EF=EE=EF=FB=F2=EA=E0=EC=20 =ED=E5=E4=F0=F3=E6=E5=F1=F2=E2=E5=ED=ED=EE=E3=EE =EF=EE=E3=EB=EE=F9=E5=ED= =E8=FF.
 
4. =CE=F1=ED=EE=E2=ED=FB=E5 =F2=E5=ED=E4=E5=ED=F6=E8=E8, =F5=E0=F0=E0= =EA=F2=E5=F0=E8=E7=F3=FE=F9=E8=E5 =E7=E0=F5=E2=E0=F2 =E8 =EF=E5=F0=E5=E4=E5= =EB =F1=EE=E1=F1=F2=E2=E5=ED=ED=EE=F1=F2=E8 =E2=20 =F3=F1=EB=EE=E2=E8=FF=F5 =F1=EE=E2=F0=E5=EC=E5=ED=ED=EE=E9 =D0=EE=F1=F1=E8= =E8.
 
5. =C1=E8=E7=ED=E5=F1-=F0=E0=E7=E2=E5=E4=EA=E0. =C7=E0=E4=E0=F7=E8 =E8= =ED=E0=EF=F0=E0=E2=EB=E5=ED=E8=FF. =CF=F0=EE=E2=E5=F0=EA=E0 =E1=EB=E0=E3= =EE=ED=E0=E4=E5=E6=ED=EE=F1=F2=E8=20 =EF=E0=F0=F2=ED=E5=F0=EE=E2.
 
6. =CA=EE=ED=EA=F3=F0=E5=ED=F2=ED=E0=FF =F0=E0=E7=E2=E5=E4=EA=E0 =E8= =EF=F0=EE=EC=FB=F8=EB=E5=ED=ED=FB=E9 =F8=EF=E8=EE=ED=E0=E6.
 
7. =D1=E8=F1=F2=E5=EC=E0 =EA=EE=ED=F2=F0=EE=EB=EB=E8=ED=E3=E0 =ED=E0= =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=E8. =CF=F0=E5=E4=F3=EF=F0=E5=E6=E4=E5=ED=E8= =E5 =E8 =EF=F0=EE=F4=E8=EB=E0=EA=F2=E8=EA=E0=20 =E2=E7=FF=F2=EE=F7=ED=E8=F7=E5=F1=F2=E2=E0.
 
8. =CF=F0=EE=E2=E5=F0=EA=E8 =E1=E8=E7=ED=E5=F1=E0 =E3=EE=F1=F3=E4=E0= =F0=F1=F2=E2=E5=ED=ED=FB=EC=E8 =EE=F0=E3=E0=ED=E0=EC=E8. =CF=F0=EE=EA=F3=F0= =EE=F0=F1=EA=E8=E5 =EF=F0=EE=E2=E5=F0=EA=E8=20 =E1=E8=E7=ED=E5=F1=E0, =E2 =F2=EE=EC =F7=E8=F1=EB=E5 =E2=ED=E5=EF=EB=E0=ED= =EE=E2=FB=E5.
 
9. =C8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=E0=FF =E1=E5=E7=EE=EF=E0=F1=ED= =EE=F1=F2=FC =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. =CB=E8=F7=ED=E0=FF =E8=ED= =F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=E0=FF=20 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=FC.
 

=CF=EE=E4=F0=EE=E1=ED=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0, =F1=EF=E8= =F1=EE=EA =E2=E5=E4=F3=F9=E8=F5 =E2=FB=F1=FB=EB=E0=FE=F2=F1=FF =EF=EE =E7= =E0=EF=F0=EE=F1=F3.
 

=CF=CE =C2=CE=CF=D0=CE=D1=C0=CC =D3=D7=C0=D1=D2=C8=DF =C8 =D0=C5= =C3=C8=D1=D2=D0=C0=D6=C8=C8 =CE=C1=D0=C0=D9=C0=C9=D2=C5=D1=DC =CF=CE =D2=C5= =CB=C5=D4=CE=CD=D3:
8 * =CF=E8=F2=E5=F0 * 6=D7 2 __ 58 . 7 5

=D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC,
=D2=E8=EC=EE=F4=E5=E5=E2=E0 = =C0=ED=ED=E0 =C8=E2=E0=ED=EE=E2=ED=E0
=EC=E5=ED=E5=E4=E6=E5=F0 =EF=EE = =F0=E0=E1=EE=F2=E5 =F1=20 =EA=EB=E8=E5=ED=F2=E0=EC=E8
------=_NextPart_000_0504_01CE3B0D.A6A72AB0-- From yongtaofu@gmail.com Tue Apr 16 20:04:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9FFE87F37 for ; Tue, 16 Apr 2013 20:04:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8D11A8F8049 for ; Tue, 16 Apr 2013 18:04:32 -0700 (PDT) X-ASG-Debug-ID: 1366160671-04cbb057f72a03c0001-NocioJ Received: from mail-ie0-f174.google.com (mail-ie0-f174.google.com [209.85.223.174]) by cuda.sgi.com with ESMTP id aY26DMveaCZuFktw (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 16 Apr 2013 18:04:31 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] Received: by mail-ie0-f174.google.com with SMTP id 10so1335033ied.33 for ; Tue, 16 Apr 2013 18:04:31 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=Ci5O8GSx1eKTY66BzyyyIg2/vpeO4yEJg/uFx/Ph8v4=; b=asLT4VUqS7vtwCWxlsmi/eAgiydvLdX0+elaq0N3XbxxtW+ZGGEqyrc92k6ZPdF1om mPCzkWrHZOKZwWJB9OujVTl1wbbl6WJ9ygUHljRG03t/twessZDPSUkyL+bRNPQeuSoA 1XTpj6elr80/ujHXc3szhHuyH1YisYdseMQhZYYq3+VKORuaS6kea9VnqdHW+GsYnXBJ RYCXrnJavMUfpktaCSWHVVfBVAEuC+izkKEBRuevIHLsqe8aFunaR578XHNzUB7nYIvX IFCdV4b4YJIou65oD5nUZI6M+M0AyH3VczoIGRbNdGtK5MUPVka+IMs+83XI99+ZinaK Z69g== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr9331353igq.51.1366160671026; Tue, 16 Apr 2013 18:04:31 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 16 Apr 2013 18:04:30 -0700 (PDT) In-Reply-To: <516D87E3.2010605@redhat.com> References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> Date: Wed, 17 Apr 2013 09:04:30 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Brian Foster Cc: Dave Chinner , Eric Sandeen , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee781023204da8411ba X-Barracuda-Connect: mail-ie0-f174.google.com[209.85.223.174] X-Barracuda-Start-Time: 1366160671 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128333 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 --14dae9340ee781023204da8411ba Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brain, Thank you for your update, and I have applied your last kernel patch. However it is not easy to reproduce especially in out test environment. Till now is not happens again. I'll update the kernel patch now. BTW is there any findings in the logs of previous thread? http://oss.sgi.com/archives/xfs/2013-04/msg00327.html I guess it tend to happen during glusterfs rebalance because glusterfs moves a lot of file from one server to another and then unlink it. Thank you. 2013/4/17 Brian Foster > On 04/16/2013 12:24 PM, Dave Chinner wrote: > > On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote: > >> Hi, > >> > >> Thanks for the data in the previous thread: > >> > >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > >> > ... > >> > >> echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable > >> echo 1 > > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable > >> ... reproduce ... > >> cat /sys/kernel/debug/tracing/trace > trace.output > > > > It's better to use trace-cmd for this. it will result in less > > dropped events. i.e.: > > > > $ trace-cmd record -e xfs_iunlink\* > > ... reproduce ... > > ^C > > $ trace-cmd report > trace.output > > > >> --- a/fs/xfs/linux-2.6/xfs_trace.h > >> +++ b/fs/xfs/linux-2.6/xfs_trace.h > >> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); > ... > > > > I would suggest that the the tracing shoul dbe at entry of the > > function, otherwise we won't get a tracepoint for the operation that > > triggers the shutdown. (That's the reason most tracepoints in XFS > > are at function entry...) > > > > Good points, thanks Dave. A v2 that pulls up the tracepoints towards > function entry is appended. > > Brian > > From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001 > From: Brian Foster > Date: Mon, 15 Apr 2013 18:16:24 -0400 > Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and > xfs_iunlink_remove > > --- > fs/xfs/linux-2.6/xfs_trace.h | 2 ++ > fs/xfs/xfs_inode.c | 4 ++++ > 2 files changed, 6 insertions(+), 0 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h > index adc6ec4..338a0f9 100644 > --- a/fs/xfs/linux-2.6/xfs_trace.h > +++ b/fs/xfs/linux-2.6/xfs_trace.h > @@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); > DEFINE_INODE_EVENT(xfs_destroy_inode); > DEFINE_INODE_EVENT(xfs_dirty_inode); > DEFINE_INODE_EVENT(xfs_clear_inode); > +DEFINE_INODE_EVENT(xfs_iunlink); > +DEFINE_INODE_EVENT(xfs_iunlink_remove); > > DEFINE_INODE_EVENT(xfs_dquot_dqalloc); > DEFINE_INODE_EVENT(xfs_dquot_dqdetach); > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 19900f0..d705c77 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1615,6 +1615,8 @@ xfs_iunlink( > > mp =3D tp->t_mountp; > > + trace_xfs_iunlink(ip); > + > /* > * Get the agi buffer first. It ensures lock ordering > * on the list. > @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( > mp =3D tp->t_mountp; > agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino); > > + trace_xfs_iunlink_remove(ip); > + > /* > * Get the agi buffer first. It ensures lock ordering > * on the list. > -- > 1.7.7.6 > > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee781023204da8411ba Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brain,
Thank you for your update, an= d I have applied your last kernel patch. However it is not easy to reproduc= e especially in out test environment. Till now is not happens again. I'= ll update the kernel patch now. BTW is there any findings in the logs of pr= evious thread?
http://oss.sgi.com/archives/xfs/2013-04/msg00327.html
I gue= ss it tend to happen during glusterfs rebalance because glusterfs moves a l= ot of file from one server to another and then unlink it.

Thank you.


2013/4/17 Brian Foster <bfoster@redhat.com>
On 04/16/2013 12:24 PM, Dave Chinner wrote:
> On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote:
>> Hi,
>>
>> Thanks for the data in the previous thread:
>>
>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html=
>>
...
>>
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink/enable
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink_remove/enable
>>      ... reproduce ...
>>      cat /sys/kernel/debug/tracing/trace > trace= .output
>
> It's better to use trace-cmd for this. it will result in less
> dropped events. i.e.:
>
>       $ trace-cmd record -e xfs_iunlink\*
>       ... reproduce ...
>       ^C
>       $ trace-cmd report > trace.output
>
>> --- a/fs/xfs/linux-2.6/xfs_trace.h
>> +++ b/fs/xfs/linux-2.6/xfs_trace.h
>> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
...
>
> I would suggest that the the tracing shoul dbe at entry of the
> function, otherwise we won't get a tracepoint for the operation th= at
> triggers the shutdown. (That's the reason most tracepoints in XFS<= br> > are at function entry...)
>

Good points, thanks Dave. A v2 that pulls up the tracepoints towards<= br> function entry is appended.

Brian

>From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001
From: Brian Foster <bfoster@redhat= .com>
Date: Mon, 15 Apr 2013 18:16:24 -0400
Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and
xfs_iunlink_remove

---
 fs/xfs/linux-2.6/xfs_trace.h |    2 ++
 fs/xfs/xfs_inode.c           |    = 4 ++++
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h
index adc6ec4..338a0f9 100644
--- a/fs/xfs/linux-2.6/xfs_trace.h
+++ b/fs/xfs/linux-2.6/xfs_trace.h
@@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
 DEFINE_INODE_EVENT(xfs_destroy_inode);
 DEFINE_INODE_EVENT(xfs_dirty_inode);
 DEFINE_INODE_EVENT(xfs_clear_inode);
+DEFINE_INODE_EVENT(xfs_iunlink);
+DEFINE_INODE_EVENT(xfs_iunlink_remove);

 DEFINE_INODE_EVENT(xfs_dquot_dqalloc);
 DEFINE_INODE_EVENT(xfs_dquot_dqdetach);
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 19900f0..d705c77 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1615,6 +1615,8 @@ xfs_iunlink(

        mp =3D tp->t_mountp;

+       trace_xfs_iunlink(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
@@ -1694,6 +1696,8 @@ xfs_iunlink_remove(
        mp =3D tp->t_mountp;
        agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino);

+       trace_xfs_iunlink_remove(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
--
1.7.7.6




--
=B7=FB=D3= =C0=CC=CE
--14dae9340ee781023204da8411ba-- From yongtaofu@gmail.com Tue Apr 16 20:36:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 73DF67F37 for ; Tue, 16 Apr 2013 20:36:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 10743AC001 for ; Tue, 16 Apr 2013 18:35:58 -0700 (PDT) X-ASG-Debug-ID: 1366162555-04bdf02d1d2a6a60001-NocioJ Received: from mail-ia0-f180.google.com (mail-ia0-f180.google.com [209.85.210.180]) by cuda.sgi.com with ESMTP id ALG1dLntJi8eyxi1 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 16 Apr 2013 18:35:56 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.180 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.180] Received: by mail-ia0-f180.google.com with SMTP id l29so967034iag.25 for ; Tue, 16 Apr 2013 18:35:55 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.180] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.180] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=34KVwZHmm2Wm8CQCJwuicEnRbRUZ+A+5R2pFXrt2Pms=; b=ir6oO3NK/DUzyiJlVmpPtfP3JNwZY97aUy5FCQimyZflQMiPH5tF0cy8AAl25sx216 qWVphdkfNPQjNYlJR8NH3hJrKiMoTe24hE6Srw7l0ElLX+6ZF/bFBze9j80RUsg7FyV/ cEQxGO7AZcbgTY8+ZMrAI+GiaaHLnynwGM/mnhBfk9IAawQmMBN04ZoV1dy4ONcoc8mL dcKRATJm11Uaz9u0mx38QYTz44UBgTv+dfb1aUEtyq7G9dBVRJDhWmZu03+xleSB6794 qcofjzEEj2XSKQ6mt6NXKjxY/+9mGBMU65LKazobcx2KZ0YVQpI9uySspLWAiQJTr4QZ xulQ== MIME-Version: 1.0 X-Received: by 10.50.51.167 with SMTP id l7mr9290427igo.11.1366162555641; Tue, 16 Apr 2013 18:35:55 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 16 Apr 2013 18:35:55 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> Date: Wed, 17 Apr 2013 09:35:55 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Brian Foster Cc: Dave Chinner , Eric Sandeen , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340b5fd5ab7904da84815e X-Barracuda-Connect: mail-ia0-f180.google.com[209.85.210.180] X-Barracuda-Start-Time: 1366162556 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128335 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 --14dae9340b5fd5ab7904da84815e Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brain, I want to ask a question, according to the shutdown trace. The ino in xfs_iunlink_remove is 0x113, why xfs_imap got ino=3D0xffffffff ? --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- return=3D0x16 vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs /xfs/xfs_inode.c:1680").return -- return=3D0x16 vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino=3D= ? last_ibp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] ip: i_ino =3D 0x113, i_flags =3D 0x0 Thank you. 2013/4/17 =B7=FB=D3=C0=CC=CE > Hi Brain, > Thank you for your update, and I have applied your last kernel patch. > However it is not easy to reproduce especially in out test environment. > Till now is not happens again. I'll update the kernel patch now. BTW is > there any findings in the logs of previous thread? > http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > I guess it tend to happen during glusterfs rebalance because glusterfs > moves a lot of file from one server to another and then unlink it. > > Thank you. > > > 2013/4/17 Brian Foster > >> On 04/16/2013 12:24 PM, Dave Chinner wrote: >> > On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote: >> >> Hi, >> >> >> >> Thanks for the data in the previous thread: >> >> >> >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >> >> >> ... >> >> >> >> echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable >> >> echo 1 > >> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable >> >> ... reproduce ... >> >> cat /sys/kernel/debug/tracing/trace > trace.output >> > >> > It's better to use trace-cmd for this. it will result in less >> > dropped events. i.e.: >> > >> > $ trace-cmd record -e xfs_iunlink\* >> > ... reproduce ... >> > ^C >> > $ trace-cmd report > trace.output >> > >> >> --- a/fs/xfs/linux-2.6/xfs_trace.h >> >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >> >> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >> ... >> > >> > I would suggest that the the tracing shoul dbe at entry of the >> > function, otherwise we won't get a tracepoint for the operation that >> > triggers the shutdown. (That's the reason most tracepoints in XFS >> > are at function entry...) >> > >> >> Good points, thanks Dave. A v2 that pulls up the tracepoints towards >> function entry is appended. >> >> Brian >> >> From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001 >> From: Brian Foster >> Date: Mon, 15 Apr 2013 18:16:24 -0400 >> Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and >> xfs_iunlink_remove >> >> --- >> fs/xfs/linux-2.6/xfs_trace.h | 2 ++ >> fs/xfs/xfs_inode.c | 4 ++++ >> 2 files changed, 6 insertions(+), 0 deletions(-) >> >> diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h >> index adc6ec4..338a0f9 100644 >> --- a/fs/xfs/linux-2.6/xfs_trace.h >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >> @@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >> DEFINE_INODE_EVENT(xfs_destroy_inode); >> DEFINE_INODE_EVENT(xfs_dirty_inode); >> DEFINE_INODE_EVENT(xfs_clear_inode); >> +DEFINE_INODE_EVENT(xfs_iunlink); >> +DEFINE_INODE_EVENT(xfs_iunlink_remove); >> >> DEFINE_INODE_EVENT(xfs_dquot_dqalloc); >> DEFINE_INODE_EVENT(xfs_dquot_dqdetach); >> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c >> index 19900f0..d705c77 100644 >> --- a/fs/xfs/xfs_inode.c >> +++ b/fs/xfs/xfs_inode.c >> @@ -1615,6 +1615,8 @@ xfs_iunlink( >> >> mp =3D tp->t_mountp; >> >> + trace_xfs_iunlink(ip); >> + >> /* >> * Get the agi buffer first. It ensures lock ordering >> * on the list. >> @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( >> mp =3D tp->t_mountp; >> agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino); >> >> + trace_xfs_iunlink_remove(ip); >> + >> /* >> * Get the agi buffer first. It ensures lock ordering >> * on the list. >> -- >> 1.7.7.6 >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --14dae9340b5fd5ab7904da84815e Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brain,
I want to ask a question, according to= the shutdown trace. The ino in  xfs_iunlink_remove is 0x113, why xfs_imap got = ino=3D0xfffffff= f ?=  

=
--- xfs_imap -- module("xfs").function("xfs_= imap@fs/xfs/xfs= _ialloc.c:1257").return -- return=3D0x16
vars: mp=3D0xff= ff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff

--- xfs_iunlink_remove -- module("xfs").function("x= fs_iunli= nk_remove@fs/xfs/xfs_inode.c:1680").return -- return=3D0x16
vars: tp=3D0xff= ff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? agi=3D? dip=3D? = agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino=3D? last_i= bp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? last_offse= t=3D0xffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0= x113, i_flags =3D 0x0

Thank you.



2013/4/17 =B7=FB=D3=C0=CC=CE <yongt= aofu@gmail.com>
Hi Brain,
Thank you for your update, an= d I have applied your last kernel patch. However it is not easy to reproduc= e especially in out test environment. Till now is not happens again. I'= ll update the kernel patch now. BTW is there any findings in the logs of pr= evious thread?
http://oss.sgi.com/archives/xfs/2013-04/msg00327.html
I gue= ss it tend to happen during glusterfs rebalance because glusterfs moves a l= ot of file from one server to another and then unlink it.

Thank you.


2013/4/17 Brian Foster <bfoster@r= edhat.com>
On 04/16/2013 12:24 PM, Dave Chinner wrote:
> On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote:
>> Hi,
>>
>> Thanks for the data in the previous thread:
>>
>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html=
>>
...
>>
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink/enable
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink_remove/enable
>>      ... reproduce ...
>>      cat /sys/kernel/debug/tracing/trace > trace= .output
>
> It's better to use trace-cmd for this. it will result in less
> dropped events. i.e.:
>
>       $ trace-cmd record -e xfs_iunlink\*
>       ... reproduce ...
>       ^C
>       $ trace-cmd report > trace.output
>
>> --- a/fs/xfs/linux-2.6/xfs_trace.h
>> +++ b/fs/xfs/linux-2.6/xfs_trace.h
>> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
...
>
> I would suggest that the the tracing shoul dbe at entry of the
> function, otherwise we won't get a tracepoint for the operation th= at
> triggers the shutdown. (That's the reason most tracepoints in XFS<= br> > are at function entry...)
>

Good points, thanks Dave. A v2 that pulls up the tracepoints towards<= br> function entry is appended.

Brian

>From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001
From: Brian Foster <bfoster@redhat.com>
Date: Mon, 15 Apr 2013 18:16:24 -0400
Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and
xfs_iunlink_remove

---
 fs/xfs/linux-2.6/xfs_trace.h |    2 ++
 fs/xfs/xfs_inode.c           |    = 4 ++++
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h
index adc6ec4..338a0f9 100644
--- a/fs/xfs/linux-2.6/xfs_trace.h
+++ b/fs/xfs/linux-2.6/xfs_trace.h
@@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
 DEFINE_INODE_EVENT(xfs_destroy_inode);
 DEFINE_INODE_EVENT(xfs_dirty_inode);
 DEFINE_INODE_EVENT(xfs_clear_inode);
+DEFINE_INODE_EVENT(xfs_iunlink);
+DEFINE_INODE_EVENT(xfs_iunlink_remove);

 DEFINE_INODE_EVENT(xfs_dquot_dqalloc);
 DEFINE_INODE_EVENT(xfs_dquot_dqdetach);
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 19900f0..d705c77 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1615,6 +1615,8 @@ xfs_iunlink(

        mp =3D tp->t_mountp;

+       trace_xfs_iunlink(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
@@ -1694,6 +1696,8 @@ xfs_iunlink_remove(
        mp =3D tp->t_mountp;
        agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino);

+       trace_xfs_iunlink_remove(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
--
1.7.7.6




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0= =CC=CE
--14dae9340b5fd5ab7904da84815e-- From yongtaofu@gmail.com Tue Apr 16 22:15:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E05FF7F37 for ; Tue, 16 Apr 2013 22:15:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CBF8E304059 for ; Tue, 16 Apr 2013 20:15:42 -0700 (PDT) X-ASG-Debug-ID: 1366168541-04cb6c2c1c2b51d0001-NocioJ Received: from mail-ie0-f169.google.com (mail-ie0-f169.google.com [209.85.223.169]) by cuda.sgi.com with ESMTP id vt5eCc5Tqw4w0v33 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 16 Apr 2013 20:15:41 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] Received: by mail-ie0-f169.google.com with SMTP id ar20so1430620iec.14 for ; Tue, 16 Apr 2013 20:15:40 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=8cyeoRF4WJexjSM60km975kz+zZvsHHBQyuNMyj6uQ0=; b=Zj1v9uZ37WWXrkXgIaFjanUiaWb7KoBe3LHYhgSLRedoZXHTcblx9EcfvEq8hzzdNC tkb+uE8lKVlnDkDlJYadGYtbG6K2S2N8XtPDxikH5wFq4gxZdL/OHOElvvby47MBfjwy GbE+al4ioi2BeTb9Gtp0px4EfVu1rj1BuDsj9fWDj/uGEJ6hxMS8YYcQo2z72Q8WioJw Hx9XLi4nhBC/WZbAXJW2eWBpWkt1HwZyBRWdnNGPSUlUx60zn2XIR8qeTt8VRUoHfFkN Y72zMp82FSIEfD9ViZ4OJRFGWDfOkL1mCZsQVdZfGjUv03n86dATjwQhEmeiY7VVGxmc mn0w== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr9514866igq.51.1366168540823; Tue, 16 Apr 2013 20:15:40 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 16 Apr 2013 20:15:40 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> Date: Wed, 17 Apr 2013 11:15:40 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Brian Foster Cc: Dave Chinner , Eric Sandeen , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee794976604da85e6b7 X-Barracuda-Connect: mail-ie0-f169.google.com[209.85.223.169] X-Barracuda-Start-Time: 1366168541 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128341 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 --14dae9340ee794976604da85e6b7 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brain, If it is because NULLAGINO is passed in to xfs_inotobp(). Can I move the following two lines before xfs_inotobp? For example: 1767 while (next_agino !=3D agino) { 1768 /* 1769 * If the last inode wasn't the one pointing t= o 1770 * us, then release its buffer since we're not 1771 * going to do anything with it. 1772 */ 1773 if (last_ibp !=3D NULL) { 1774 xfs_trans_brelse(tp, last_ibp); 1775 } 1776 next_ino =3D XFS_AGINO_TO_INO(mp, agno, next_agino); + ASSERT(next_agino !=3D NULLAGINO); + ASSERT(next_agino !=3D 0); 1777 error =3D xfs_inotobp(mp, tp, next_ino, &last_dip, 1778 &last_ibp, &last_offset, 0); 1779 if (error) { 1780 xfs_warn(mp, 1781 "%s: xfs_inotobp() returned error %d.", 1782 __func__, error); 1783 return error; 1784 } 1785 next_agino =3D be32_to_cpu(last_dip->di_next_unlinked); - //ASSERT(next_agino !=3D NULLAGINO); - //ASSERT(next_agino !=3D 0); 1788 } I don't understand xfs well and correct me if I'm totally wrong. Thank you very much. 2013/4/17 =B7=FB=D3=C0=CC=CE > Hi Brain, > I want to ask a question, according to the shutdown trace. The ino in xf= s_iunlink_remove > is 0x113, why xfs_imap got ino=3D0xffffffff ? > > --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257= ").return > -- return=3D0x16 > vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff > > --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs > /xfs/xfs_inode.c:1680").return -- return=3D0x16 > vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D?= agi=3D? > dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino= =3D? last_ibp=3D? > last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? > last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] > ip: i_ino =3D 0x113, i_flags =3D 0x0 > > Thank you. > > > > 2013/4/17 =B7=FB=D3=C0=CC=CE > >> Hi Brain, >> Thank you for your update, and I have applied your last kernel patch. >> However it is not easy to reproduce especially in out test environment. >> Till now is not happens again. I'll update the kernel patch now. BTW is >> there any findings in the logs of previous thread? >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >> I guess it tend to happen during glusterfs rebalance because glusterfs >> moves a lot of file from one server to another and then unlink it. >> >> Thank you. >> >> >> 2013/4/17 Brian Foster >> >>> On 04/16/2013 12:24 PM, Dave Chinner wrote: >>> > On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote: >>> >> Hi, >>> >> >>> >> Thanks for the data in the previous thread: >>> >> >>> >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>> >> >>> ... >>> >> >>> >> echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enabl= e >>> >> echo 1 > >>> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable >>> >> ... reproduce ... >>> >> cat /sys/kernel/debug/tracing/trace > trace.output >>> > >>> > It's better to use trace-cmd for this. it will result in less >>> > dropped events. i.e.: >>> > >>> > $ trace-cmd record -e xfs_iunlink\* >>> > ... reproduce ... >>> > ^C >>> > $ trace-cmd report > trace.output >>> > >>> >> --- a/fs/xfs/linux-2.6/xfs_trace.h >>> >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >>> >> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >>> ... >>> > >>> > I would suggest that the the tracing shoul dbe at entry of the >>> > function, otherwise we won't get a tracepoint for the operation that >>> > triggers the shutdown. (That's the reason most tracepoints in XFS >>> > are at function entry...) >>> > >>> >>> Good points, thanks Dave. A v2 that pulls up the tracepoints towards >>> function entry is appended. >>> >>> Brian >>> >>> From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001 >>> From: Brian Foster >>> Date: Mon, 15 Apr 2013 18:16:24 -0400 >>> Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and >>> xfs_iunlink_remove >>> >>> --- >>> fs/xfs/linux-2.6/xfs_trace.h | 2 ++ >>> fs/xfs/xfs_inode.c | 4 ++++ >>> 2 files changed, 6 insertions(+), 0 deletions(-) >>> >>> diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.= h >>> index adc6ec4..338a0f9 100644 >>> --- a/fs/xfs/linux-2.6/xfs_trace.h >>> +++ b/fs/xfs/linux-2.6/xfs_trace.h >>> @@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >>> DEFINE_INODE_EVENT(xfs_destroy_inode); >>> DEFINE_INODE_EVENT(xfs_dirty_inode); >>> DEFINE_INODE_EVENT(xfs_clear_inode); >>> +DEFINE_INODE_EVENT(xfs_iunlink); >>> +DEFINE_INODE_EVENT(xfs_iunlink_remove); >>> >>> DEFINE_INODE_EVENT(xfs_dquot_dqalloc); >>> DEFINE_INODE_EVENT(xfs_dquot_dqdetach); >>> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c >>> index 19900f0..d705c77 100644 >>> --- a/fs/xfs/xfs_inode.c >>> +++ b/fs/xfs/xfs_inode.c >>> @@ -1615,6 +1615,8 @@ xfs_iunlink( >>> >>> mp =3D tp->t_mountp; >>> >>> + trace_xfs_iunlink(ip); >>> + >>> /* >>> * Get the agi buffer first. It ensures lock ordering >>> * on the list. >>> @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( >>> mp =3D tp->t_mountp; >>> agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino); >>> >>> + trace_xfs_iunlink_remove(ip); >>> + >>> /* >>> * Get the agi buffer first. It ensures lock ordering >>> * on the list. >>> -- >>> 1.7.7.6 >>> >>> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee794976604da85e6b7 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brain,
If it is because NULLAGI= NO is passed in  to xfs_inotobp().
Can I move the following t= wo lines before xfs_inotobp?

For example:

1767  &nb= sp;            =   while (next_agino !=3D agino) {
1768            = ;             /= *
1769           =             &nb= sp;  * If the last inode wasn't the one pointing to
1770 &= nbsp;           &nbs= p;            * us, = then release its buffer since we're not
1771    =             &nb= sp;         * going to do anything = with it.
1772            = ;            &n= bsp; */
1773          =             &nb= sp;  if (last_ibp !=3D NULL) {
1774     &n= bsp;            = ;            &n= bsp;  xfs_trans_brelse(tp, last_ibp);
1775    &= nbsp;           &nbs= p;        }
1776   &nb= sp;            =          next_ino =3D XFS_AGINO_TO_= INO(mp, agno, next_agino);
+            &n= bsp;             &nb= sp;    ASSERT(next_agino !=3D NULLAGINO);
+   &= nbsp;           &nbs= p;               ASSERT(next_a= gino !=3D 0);
1777         =             &nb= sp;   error =3D xfs_inotobp(mp, tp, next_ino, &last_dip,
1= 778            =             &nb= sp;            =         &last_ibp, &last_offset,= 0);
1779            = ;             i= f (error) {
1780         &n= bsp;            = ;           xfs_warn(mp,<= br>1781           &n= bsp;            = ;            &n= bsp;    "%s: xfs_inotobp() returned error %d.",1782           &nbs= p;            &= nbsp;           &nbs= p;    __func__, error);
1783            = ;            &n= bsp;        return error;
1784 &= nbsp;           &nbs= p;           }
1785&nb= sp;            =             next_agi= no =3D be32_to_cpu(last_dip->di_next_unlinked);
-   &n= bsp;            = ;               //ASSERT(= next_agino !=3D NULLAGINO);
-            &n= bsp;            = ;      //ASSERT(next_agino !=3D 0);
1788 &= nbsp;           &nbs= p;   }
I don't understand xfs well and correct me if= I'm totally wrong.
Thank you very much.


2= 013/4/17 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brain,
I want to ask a question, according to the s= hutdown trace. The ino in  xfs_iunlink_remove is 0x113, why xfs_imap got ino=3D0xffffffff ? =

---= xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1= 257").return -- return=3D0x16
vars: mp=3D0xff= ff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff

--- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_rem= ove@fs/xfs/xfs_inode.c:1680").return -- return=3D0x16
vars: tp=3D0xff= ff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? agi=3D? dip=3D? = agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino=3D? last_i= bp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? last_offse= t=3D0xffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0= x113, i_flags =3D 0x0

Thank you.



2013/4/17 =B7=FB=D3=C0=CC=CE <yongt= aofu@gmail.com>
Hi Brain,
Thank you for your update, an= d I have applied your last kernel patch. However it is not easy to reproduc= e especially in out test environment. Till now is not happens again. I'= ll update the kernel patch now. BTW is there any findings in the logs of pr= evious thread?
http://oss.sgi.com/archives/xfs/2013-04/msg00327.html
I gue= ss it tend to happen during glusterfs rebalance because glusterfs moves a l= ot of file from one server to another and then unlink it.

Thank you.


=
2013/4/17 Brian Foster <bfoster@redhat.com= >
On 04/16/2013 12:24 PM, Dave Chinner wrote:
> On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote:
>> Hi,
>>
>> Thanks for the data in the previous thread:
>>
>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html=
>>
...
>>
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink/enable
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink_remove/enable
>>      ... reproduce ...
>>      cat /sys/kernel/debug/tracing/trace > trace= .output
>
> It's better to use trace-cmd for this. it will result in less
> dropped events. i.e.:
>
>       $ trace-cmd record -e xfs_iunlink\*
>       ... reproduce ...
>       ^C
>       $ trace-cmd report > trace.output
>
>> --- a/fs/xfs/linux-2.6/xfs_trace.h
>> +++ b/fs/xfs/linux-2.6/xfs_trace.h
>> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
...
>
> I would suggest that the the tracing shoul dbe at entry of the
> function, otherwise we won't get a tracepoint for the operation th= at
> triggers the shutdown. (That's the reason most tracepoints in XFS<= br> > are at function entry...)
>

Good points, thanks Dave. A v2 that pulls up the tracepoints towards<= br> function entry is appended.

Brian

>From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001
From: Brian Foster <bfoster@redhat.com>
Date: Mon, 15 Apr 2013 18:16:24 -0400
Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and
xfs_iunlink_remove

---
 fs/xfs/linux-2.6/xfs_trace.h |    2 ++
 fs/xfs/xfs_inode.c           |    = 4 ++++
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h
index adc6ec4..338a0f9 100644
--- a/fs/xfs/linux-2.6/xfs_trace.h
+++ b/fs/xfs/linux-2.6/xfs_trace.h
@@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
 DEFINE_INODE_EVENT(xfs_destroy_inode);
 DEFINE_INODE_EVENT(xfs_dirty_inode);
 DEFINE_INODE_EVENT(xfs_clear_inode);
+DEFINE_INODE_EVENT(xfs_iunlink);
+DEFINE_INODE_EVENT(xfs_iunlink_remove);

 DEFINE_INODE_EVENT(xfs_dquot_dqalloc);
 DEFINE_INODE_EVENT(xfs_dquot_dqdetach);
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 19900f0..d705c77 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1615,6 +1615,8 @@ xfs_iunlink(

        mp =3D tp->t_mountp;

+       trace_xfs_iunlink(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
@@ -1694,6 +1696,8 @@ xfs_iunlink_remove(
        mp =3D tp->t_mountp;
        agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino);

+       trace_xfs_iunlink_remove(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
--
1.7.7.6




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--14dae9340ee794976604da85e6b7-- From yongtaofu@gmail.com Tue Apr 16 22:48:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 637E87F37 for ; Tue, 16 Apr 2013 22:48:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0CF6BAC008 for ; Tue, 16 Apr 2013 20:48:06 -0700 (PDT) X-ASG-Debug-ID: 1366170484-04bdf02d202af8c0001-NocioJ Received: from mail-ia0-f173.google.com (mail-ia0-f173.google.com [209.85.210.173]) by cuda.sgi.com with ESMTP id H6oqVDRdb3sFmCEa (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 16 Apr 2013 20:48:05 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.173 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] Received: by mail-ia0-f173.google.com with SMTP id j5so1058232iaf.18 for ; Tue, 16 Apr 2013 20:48:04 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.173] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=ssxlpHePD5bZnSLgAKUZFnZGaH5UxZgfpKbSrBGUaYU=; b=r7z5aZmh9qYvM6TjNdInvQEOkJ+D5yKkTanTky90mBAMyxEe20c0GXt+7weJvcnjlA 4ZxH1SqwMbEevtbCs/5EyTDHpvR0dSj7HLG6/6igzgEzYBoML/4sUIlZG/0RhSMIVqs2 sppY8A1th53fVA3YQXYgcyhvG8z2lc9jR3KDtyNS1qYf1aMNUUNWF2rekRKhpaIJSeuZ H5zuEQ9APHva+VSvc5NVgSuSiUxm+QBgirvSKQWqI+VqKPr3iof4sd7xXs4D/LR4tX4d bX+VOw1wfaPWIDUsIuFxGgXNGOu9YhWWS3ES5nFINF3OMB7haffQYydIO7kihAzWb2rF 6iog== MIME-Version: 1.0 X-Received: by 10.43.65.145 with SMTP id xm17mr2690004icb.35.1366170484676; Tue, 16 Apr 2013 20:48:04 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Tue, 16 Apr 2013 20:48:04 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> Date: Wed, 17 Apr 2013 11:48:04 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Brian Foster Cc: Dave Chinner , Eric Sandeen , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=bcaec51d2998716e2c04da865a45 X-Barracuda-Connect: mail-ia0-f173.google.com[209.85.210.173] X-Barracuda-Start-Time: 1366170485 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.128343 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 --bcaec51d2998716e2c04da865a45 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brain, Can I change as following? --- a/xfs_inode.c +++ b/xfs_inode.c @@ -1773,6 +1773,8 @@ xfs_iunlink_remove( if (last_ibp !=3D NULL) { xfs_trans_brelse(tp, last_ibp); } + ASSERT(next_agino !=3D NULLAGINO); + ASSERT(next_agino !=3D 0); next_ino =3D XFS_AGINO_TO_INO(mp, agno, next_agino)= ; error =3D xfs_inotobp(mp, tp, next_ino, &last_dip, &last_ibp, &last_offset, 0); @@ -1783,8 +1785,6 @@ xfs_iunlink_remove( return error; } next_agino =3D be32_to_cpu(last_dip->di_next_unlinked); - ASSERT(next_agino !=3D NULLAGINO); - ASSERT(next_agino !=3D 0); } /* * Now last_ibp points to the buffer previous to us on Thank you. 2013/4/17 =B7=FB=D3=C0=CC=CE > Hi Brain, > If it is because NULLAGINO is passed in to xfs_inotobp(). > Can I move the following two lines before xfs_inotobp? > > For example: > > 1767 while (next_agino !=3D agino) { > 1768 /* > 1769 * If the last inode wasn't the one pointing > to > 1770 * us, then release its buffer since we're n= ot > 1771 * going to do anything with it. > 1772 */ > 1773 if (last_ibp !=3D NULL) { > 1774 xfs_trans_brelse(tp, last_ibp); > 1775 } > 1776 next_ino =3D XFS_AGINO_TO_INO(mp, agno, > next_agino); > + ASSERT(next_agino !=3D NULLAGINO); > + ASSERT(next_agino !=3D 0); > 1777 error =3D xfs_inotobp(mp, tp, next_ino, > &last_dip, > 1778 &last_ibp, &last_offset, > 0); > 1779 if (error) { > 1780 xfs_warn(mp, > 1781 "%s: xfs_inotobp() returned > error %d.", > 1782 __func__, error); > 1783 return error; > 1784 } > 1785 next_agino =3D > be32_to_cpu(last_dip->di_next_unlinked); > - //ASSERT(next_agino !=3D NULLAGINO); > - //ASSERT(next_agino !=3D 0); > 1788 } > I don't understand xfs well and correct me if I'm totally wrong. > Thank you very much. > > > 2013/4/17 =B7=FB=D3=C0=CC=CE > >> Hi Brain, >> I want to ask a question, according to the shutdown trace. The ino in x= fs_iunlink_remove >> is 0x113, why xfs_imap got ino=3D0xffffffff ? >> >> --- xfs_imap -- module("xfs").function("xfs_imap@fs >> /xfs/xfs_ialloc.c:1257").return -- return=3D0x16 >> vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff >> >> --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs >> /xfs/xfs_inode.c:1680").return -- return=3D0x16 >> vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D= ? agi=3D? >> dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino= =3D? last_ibp=3D? >> last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? >> last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] >> ip: i_ino =3D 0x113, i_flags =3D 0x0 >> >> Thank you. >> >> >> >> 2013/4/17 =B7=FB=D3=C0=CC=CE >> >>> Hi Brain, >>> Thank you for your update, and I have applied your last kernel patch. >>> However it is not easy to reproduce especially in out test environment. >>> Till now is not happens again. I'll update the kernel patch now. BTW is >>> there any findings in the logs of previous thread? >>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>> I guess it tend to happen during glusterfs rebalance because glusterfs >>> moves a lot of file from one server to another and then unlink it. >>> >>> Thank you. >>> >>> >>> 2013/4/17 Brian Foster >>> >>>> On 04/16/2013 12:24 PM, Dave Chinner wrote: >>>> > On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote: >>>> >> Hi, >>>> >> >>>> >> Thanks for the data in the previous thread: >>>> >> >>>> >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>>> >> >>>> ... >>>> >> >>>> >> echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enab= le >>>> >> echo 1 > >>>> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable >>>> >> ... reproduce ... >>>> >> cat /sys/kernel/debug/tracing/trace > trace.output >>>> > >>>> > It's better to use trace-cmd for this. it will result in less >>>> > dropped events. i.e.: >>>> > >>>> > $ trace-cmd record -e xfs_iunlink\* >>>> > ... reproduce ... >>>> > ^C >>>> > $ trace-cmd report > trace.output >>>> > >>>> >> --- a/fs/xfs/linux-2.6/xfs_trace.h >>>> >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >>>> >> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >>>> ... >>>> > >>>> > I would suggest that the the tracing shoul dbe at entry of the >>>> > function, otherwise we won't get a tracepoint for the operation that >>>> > triggers the shutdown. (That's the reason most tracepoints in XFS >>>> > are at function entry...) >>>> > >>>> >>>> Good points, thanks Dave. A v2 that pulls up the tracepoints towards >>>> function entry is appended. >>>> >>>> Brian >>>> >>>> From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001 >>>> From: Brian Foster >>>> Date: Mon, 15 Apr 2013 18:16:24 -0400 >>>> Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and >>>> xfs_iunlink_remove >>>> >>>> --- >>>> fs/xfs/linux-2.6/xfs_trace.h | 2 ++ >>>> fs/xfs/xfs_inode.c | 4 ++++ >>>> 2 files changed, 6 insertions(+), 0 deletions(-) >>>> >>>> diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace= .h >>>> index adc6ec4..338a0f9 100644 >>>> --- a/fs/xfs/linux-2.6/xfs_trace.h >>>> +++ b/fs/xfs/linux-2.6/xfs_trace.h >>>> @@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >>>> DEFINE_INODE_EVENT(xfs_destroy_inode); >>>> DEFINE_INODE_EVENT(xfs_dirty_inode); >>>> DEFINE_INODE_EVENT(xfs_clear_inode); >>>> +DEFINE_INODE_EVENT(xfs_iunlink); >>>> +DEFINE_INODE_EVENT(xfs_iunlink_remove); >>>> >>>> DEFINE_INODE_EVENT(xfs_dquot_dqalloc); >>>> DEFINE_INODE_EVENT(xfs_dquot_dqdetach); >>>> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c >>>> index 19900f0..d705c77 100644 >>>> --- a/fs/xfs/xfs_inode.c >>>> +++ b/fs/xfs/xfs_inode.c >>>> @@ -1615,6 +1615,8 @@ xfs_iunlink( >>>> >>>> mp =3D tp->t_mountp; >>>> >>>> + trace_xfs_iunlink(ip); >>>> + >>>> /* >>>> * Get the agi buffer first. It ensures lock ordering >>>> * on the list. >>>> @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( >>>> mp =3D tp->t_mountp; >>>> agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino); >>>> >>>> + trace_xfs_iunlink_remove(ip); >>>> + >>>> /* >>>> * Get the agi buffer first. It ensures lock ordering >>>> * on the list. >>>> -- >>>> 1.7.7.6 >>>> >>>> >>> >>> >>> -- >>> =B7=FB=D3=C0=CC=CE >>> >> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --bcaec51d2998716e2c04da865a45 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brain,
Can I change as following?--- a/xfs_inode.c
+++ b/xfs_inode.c
@@ -1773,6 +1773,8 @@ xfs_iunlin= k_remove(
          &n= bsp;            = ; if (last_ibp !=3D NULL) {
       &n= bsp;            = ;            xfs_tra= ns_brelse(tp, last_ibp);
            &nb= sp;           }
+ = ;            &n= bsp;          ASSERT(next_agin= o !=3D NULLAGINO);
+        &nbs= p;            &= nbsp;  ASSERT(next_agino !=3D 0);
     &nb= sp;            =       next_ino =3D XFS_AGINO_TO_INO(mp, agno, next= _agino);
            &nb= sp;           error =3D x= fs_inotobp(mp, tp, next_ino, &last_dip,
    &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp; &last_ibp, &last_offset, 0);
@@ -1783,8 +1785,6 @@ xfs_iun= link_remove(
          = ;            &n= bsp;         return error;
            &nb= sp;           }
 =             &nb= sp;          next_agino =3D be= 32_to_cpu(last_dip->di_next_unlinked);
-     = ;            &n= bsp;     ASSERT(next_agino !=3D NULLAGINO);
- &= nbsp;           &nbs= p;         ASSERT(next_agino !=3D 0= );
            &nb= sp;   }
         =        /*
     &n= bsp;           * Now last= _ibp points to the buffer previous to us on

Thank you.


2013/4/17 = =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brain,
If it is because NULLAGINO is passed in  to xfs_inotobp().
<= /div>Can I move the following two lines before xfs_inotobp?

For example:

1767        = ;         while (next_agino !=3D ag= ino) {
1768            = ;             /= *
1769           =             &nb= sp;  * If the last inode wasn't the one pointing to
1770 &= nbsp;           &nbs= p;            * us, = then release its buffer since we're not
1771    =             &nb= sp;         * going to do anything = with it.
1772            = ;            &n= bsp; */
1773          =             &nb= sp;  if (last_ibp !=3D NULL) {
1774     &n= bsp;            = ;            &n= bsp;  xfs_trans_brelse(tp, last_ibp);
1775    &= nbsp;           &nbs= p;        }
1776   &nb= sp;            =          next_ino =3D XFS_AGINO_TO_= INO(mp, agno, next_agino);
+            &n= bsp;             &nb= sp;    ASSERT(next_agino !=3D NULLAGINO);
+   &= nbsp;           &nbs= p;               ASSERT(next_a= gino !=3D 0);
1777         =             &nb= sp;   error =3D xfs_inotobp(mp, tp, next_ino, &last_dip,
1= 778            =             &nb= sp;            =         &last_ibp, &last_offset,= 0);
1779            = ;             i= f (error) {
1780         &n= bsp;            = ;           xfs_warn(mp,<= br>1781           &n= bsp;            = ;            &n= bsp;    "%s: xfs_inotobp() returned error %d.",1782           &nbs= p;            &= nbsp;           &nbs= p;    __func__, error);
1783            = ;            &n= bsp;        return error;
1784 &= nbsp;           &nbs= p;           }
1785&nb= sp;            =             next_agi= no =3D be32_to_cpu(last_dip->di_next_unlinked);
-   &n= bsp;            = ;               //ASSERT(= next_agino !=3D NULLAGINO);
-            &n= bsp;            = ;      //ASSERT(next_agino !=3D 0);
1788 &= nbsp;           &nbs= p;   }
I don't understand xfs well and correct me if= I'm totally wrong.
Thank you very much.


2013/4/17 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com<= /a>>
Hi Brain,
I want to ask a question, according to the s= hutdown trace. The ino in  xfs_iunlink_remove is 0x113, why xfs_imap got ino=3D0xffffffff ? =

---= xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1= 257").return -- return=3D0x16
vars: mp=3D0xff= ff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff

--- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_rem= ove@fs/xfs/xfs_inode.c:1680").return -- return=3D0x16
vars: tp=3D0xff= ff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? agi=3D? dip=3D? = agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino=3D? last_i= bp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? last_offse= t=3D0xffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0= x113, i_flags =3D 0x0

Thank you.



2013/4/17 =B7=FB=D3=C0=CC=CE <yongt= aofu@gmail.com>
Hi Brain,
Thank you for your update, an= d I have applied your last kernel patch. However it is not easy to reproduc= e especially in out test environment. Till now is not happens again. I'= ll update the kernel patch now. BTW is there any findings in the logs of pr= evious thread?
http://oss.sgi.com/archives/xfs/2013-04/msg00327.html
I gue= ss it tend to happen during glusterfs rebalance because glusterfs moves a l= ot of file from one server to another and then unlink it.

Thank you.


=
2013/4/17 Brian Foster <bfoster@redhat.com= >
On 04/16/2013 12:24 PM, Dave Chinner wrote:
> On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote:
>> Hi,
>>
>> Thanks for the data in the previous thread:
>>
>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html=
>>
...
>>
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink/enable
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink_remove/enable
>>      ... reproduce ...
>>      cat /sys/kernel/debug/tracing/trace > trace= .output
>
> It's better to use trace-cmd for this. it will result in less
> dropped events. i.e.:
>
>       $ trace-cmd record -e xfs_iunlink\*
>       ... reproduce ...
>       ^C
>       $ trace-cmd report > trace.output
>
>> --- a/fs/xfs/linux-2.6/xfs_trace.h
>> +++ b/fs/xfs/linux-2.6/xfs_trace.h
>> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
...
>
> I would suggest that the the tracing shoul dbe at entry of the
> function, otherwise we won't get a tracepoint for the operation th= at
> triggers the shutdown. (That's the reason most tracepoints in XFS<= br> > are at function entry...)
>

Good points, thanks Dave. A v2 that pulls up the tracepoints towards<= br> function entry is appended.

Brian

>From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001
From: Brian Foster <bfoster@redhat.com>
Date: Mon, 15 Apr 2013 18:16:24 -0400
Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and
xfs_iunlink_remove

---
 fs/xfs/linux-2.6/xfs_trace.h |    2 ++
 fs/xfs/xfs_inode.c           |    = 4 ++++
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h
index adc6ec4..338a0f9 100644
--- a/fs/xfs/linux-2.6/xfs_trace.h
+++ b/fs/xfs/linux-2.6/xfs_trace.h
@@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
 DEFINE_INODE_EVENT(xfs_destroy_inode);
 DEFINE_INODE_EVENT(xfs_dirty_inode);
 DEFINE_INODE_EVENT(xfs_clear_inode);
+DEFINE_INODE_EVENT(xfs_iunlink);
+DEFINE_INODE_EVENT(xfs_iunlink_remove);

 DEFINE_INODE_EVENT(xfs_dquot_dqalloc);
 DEFINE_INODE_EVENT(xfs_dquot_dqdetach);
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 19900f0..d705c77 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1615,6 +1615,8 @@ xfs_iunlink(

        mp =3D tp->t_mountp;

+       trace_xfs_iunlink(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
@@ -1694,6 +1696,8 @@ xfs_iunlink_remove(
        mp =3D tp->t_mountp;
        agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino);

+       trace_xfs_iunlink_remove(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
--
1.7.7.6




--
=B7=FB=D3=C0=CC=CE



<= font color=3D"#888888">--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--bcaec51d2998716e2c04da865a45-- From sandeen@sandeen.net Tue Apr 16 23:28:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,MIME_QP_LONG_LINE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5D4677F37 for ; Tue, 16 Apr 2013 23:28:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B31F4AC004 for ; Tue, 16 Apr 2013 21:28:21 -0700 (PDT) X-ASG-Debug-ID: 1366172899-04cbb057f72ad640001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id AsUFof9WWCafeqbs for ; Tue, 16 Apr 2013 21:28:19 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [192.168.20.51] (unknown [69.38.217.3]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 60CBD61F8954; Tue, 16 Apr 2013 23:28:18 -0500 (CDT) References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> Mime-Version: 1.0 (1.0) In-Reply-To: Content-Type: multipart/alternative; boundary=Apple-Mail-62731709-7EC0-4766-B0C5-9A69AD6915EE Content-Transfer-Encoding: 7bit Message-Id: Cc: Brian Foster , "xfs@oss.sgi.com" X-Mailer: iPhone Mail (10A523) From: Eric Sandeen Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging Date: Tue, 16 Apr 2013 21:28:12 -0700 X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: =?utf-8?B?56ym5rC45rab?= X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366172899 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars --Apple-Mail-62731709-7EC0-4766-B0C5-9A69AD6915EE Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On Apr 16, 2013, at 8:48 PM, =E7=AC=A6=E6=B0=B8=E6=B6=9B wrote: > Hi Brain, > Can I change as following? ASSERTS are no-ops in a non-debug kernel, so this won't change any behavior.= I hope we'll know more if we get new traces from your patched kernel.... Eric > --- a/xfs_inode.c > +++ b/xfs_inode.c > @@ -1773,6 +1773,8 @@ xfs_iunlink_remove( > if (last_ibp !=3D NULL) { > xfs_trans_brelse(tp, last_ibp); > } > + ASSERT(next_agino !=3D NULLAGINO); > + ASSERT(next_agino !=3D 0); > next_ino =3D XFS_AGINO_TO_INO(mp, agno, next_agino= ); > error =3D xfs_inotobp(mp, tp, next_ino, &last_dip,= > &last_ibp, &last_offset, 0); > @@ -1783,8 +1785,6 @@ xfs_iunlink_remove( > return error; > } > next_agino =3D be32_to_cpu(last_dip->di_next_unlin= ked); > - ASSERT(next_agino !=3D NULLAGINO); > - ASSERT(next_agino !=3D 0); > } > /* > * Now last_ibp points to the buffer previous to us on >=20 > Thank you. >=20 >=20 > 2013/4/17 =E7=AC=A6=E6=B0=B8=E6=B6=9B >> Hi Brain, >> If it is because NULLAGINO is passed in to xfs_inotobp(). >> Can I move the following two lines before xfs_inotobp? >>=20 >> For example: >>=20 >> 1767 while (next_agino !=3D agino) { >> 1768 /* >> 1769 * If the last inode wasn't the one pointing= to >> 1770 * us, then release its buffer since we're n= ot >> 1771 * going to do anything with it. >> 1772 */ >> 1773 if (last_ibp !=3D NULL) { >> 1774 xfs_trans_brelse(tp, last_ibp); >> 1775 } >> 1776 next_ino =3D XFS_AGINO_TO_INO(mp, agno, next= _agino); >> + ASSERT(next_agino !=3D NULLAGINO); >> + ASSERT(next_agino !=3D 0); >> 1777 error =3D xfs_inotobp(mp, tp, next_ino, &las= t_dip, >> 1778 &last_ibp, &last_offset,= 0); >> 1779 if (error) { >> 1780 xfs_warn(mp, >> 1781 "%s: xfs_inotobp() returned e= rror %d.", >> 1782 __func__, error); >> 1783 return error; >> 1784 } >> 1785 next_agino =3D be32_to_cpu(last_dip->di_next= _unlinked); >> - //ASSERT(next_agino !=3D NULLAGINO); >> - //ASSERT(next_agino !=3D 0); >> 1788 } >> I don't understand xfs well and correct me if I'm totally wrong. >> Thank you very much. >>=20 >>=20 >> 2013/4/17 =E7=AC=A6=E6=B0=B8=E6=B6=9B >>> Hi Brain, >>> I want to ask a question, according to the shutdown trace. The ino in x= fs_iunlink_remove is 0x113, why xfs_imap got ino=3D0xffffffff ?=20 >>>=20 >>> --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:125= 7").return -- return=3D0x16 >>> vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff >>>=20 >>> --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/= xfs/xfs_inode.c:1680").return -- return=3D0x16 >>> vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D= ? agi=3D? dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next= _agino=3D? last_ibp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offse= t=3D? last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] >>> ip: i_ino =3D 0x113, i_flags =3D 0x0 >>>=20 >>> Thank you. >>>=20 >>>=20 >>>=20 >>> 2013/4/17 =E7=AC=A6=E6=B0=B8=E6=B6=9B >>>> Hi Brain, >>>> Thank you for your update, and I have applied your last kernel patch. H= owever it is not easy to reproduce especially in out test environment. Till n= ow is not happens again. I'll update the kernel patch now. BTW is there any f= indings in the logs of previous thread? >>>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>>> I guess it tend to happen during glusterfs rebalance because glusterfs m= oves a lot of file from one server to another and then unlink it. >>>>=20 >>>> Thank you. >>>>=20 >>>>=20 >>>> 2013/4/17 Brian Foster >>>>> On 04/16/2013 12:24 PM, Dave Chinner wrote: >>>>> > On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote: >>>>> >> Hi, >>>>> >> >>>>> >> Thanks for the data in the previous thread: >>>>> >> >>>>> >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>>>> >> >>>>> ... >>>>> >> >>>>> >> echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enab= le >>>>> >> echo 1 > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remo= ve/enable >>>>> >> ... reproduce ... >>>>> >> cat /sys/kernel/debug/tracing/trace > trace.output >>>>> > >>>>> > It's better to use trace-cmd for this. it will result in less >>>>> > dropped events. i.e.: >>>>> > >>>>> > $ trace-cmd record -e xfs_iunlink\* >>>>> > ... reproduce ... >>>>> > ^C >>>>> > $ trace-cmd report > trace.output >>>>> > >>>>> >> --- a/fs/xfs/linux-2.6/xfs_trace.h >>>>> >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >>>>> >> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >>>>> ... >>>>> > >>>>> > I would suggest that the the tracing shoul dbe at entry of the >>>>> > function, otherwise we won't get a tracepoint for the operation that= >>>>> > triggers the shutdown. (That's the reason most tracepoints in XFS >>>>> > are at function entry...) >>>>> > >>>>>=20 >>>>> Good points, thanks Dave. A v2 that pulls up the tracepoints towards >>>>> function entry is appended. >>>>>=20 >>>>> Brian >>>>>=20 >>>>> =46rom 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 20= 01 >>>>> From: Brian Foster >>>>> Date: Mon, 15 Apr 2013 18:16:24 -0400 >>>>> Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and >>>>> xfs_iunlink_remove >>>>>=20 >>>>> --- >>>>> fs/xfs/linux-2.6/xfs_trace.h | 2 ++ >>>>> fs/xfs/xfs_inode.c | 4 ++++ >>>>> 2 files changed, 6 insertions(+), 0 deletions(-) >>>>>=20 >>>>> diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace= .h >>>>> index adc6ec4..338a0f9 100644 >>>>> --- a/fs/xfs/linux-2.6/xfs_trace.h >>>>> +++ b/fs/xfs/linux-2.6/xfs_trace.h >>>>> @@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >>>>> DEFINE_INODE_EVENT(xfs_destroy_inode); >>>>> DEFINE_INODE_EVENT(xfs_dirty_inode); >>>>> DEFINE_INODE_EVENT(xfs_clear_inode); >>>>> +DEFINE_INODE_EVENT(xfs_iunlink); >>>>> +DEFINE_INODE_EVENT(xfs_iunlink_remove); >>>>>=20 >>>>> DEFINE_INODE_EVENT(xfs_dquot_dqalloc); >>>>> DEFINE_INODE_EVENT(xfs_dquot_dqdetach); >>>>> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c >>>>> index 19900f0..d705c77 100644 >>>>> --- a/fs/xfs/xfs_inode.c >>>>> +++ b/fs/xfs/xfs_inode.c >>>>> @@ -1615,6 +1615,8 @@ xfs_iunlink( >>>>>=20 >>>>> mp =3D tp->t_mountp; >>>>>=20 >>>>> + trace_xfs_iunlink(ip); >>>>> + >>>>> /* >>>>> * Get the agi buffer first. It ensures lock ordering >>>>> * on the list. >>>>> @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( >>>>> mp =3D tp->t_mountp; >>>>> agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino); >>>>>=20 >>>>> + trace_xfs_iunlink_remove(ip); >>>>> + >>>>> /* >>>>> * Get the agi buffer first. It ensures lock ordering >>>>> * on the list. >>>>> -- >>>>> 1.7.7.6 >>>>=20 >>>>=20 >>>>=20 >>>> --=20 >>>> =E7=AC=A6=E6=B0=B8=E6=B6=9B >>>=20 >>>=20 >>>=20 >>> --=20 >>> =E7=AC=A6=E6=B0=B8=E6=B6=9B >>=20 >>=20 >>=20 >> --=20 >> =E7=AC=A6=E6=B0=B8=E6=B6=9B >=20 >=20 >=20 > --=20 > =E7=AC=A6=E6=B0=B8=E6=B6=9B > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs --Apple-Mail-62731709-7EC0-4766-B0C5-9A69AD6915EE Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable
On Apr 16, 2013, at 8:48 PM, =E7=AC=A6= =E6=B0=B8=E6=B6=9B <yongtaofu@gmai= l.com> wrote:

Hi Brain,
Can I change as following?

ASSERTS are no-ops in a non-debug kernel,= so this won't change any behavior.  I hope we'll know more if we get n= ew traces from your patched kernel....

Eric
--- a/xfs_inode.c
+= ++ b/xfs_inode.c
@@ -1773,6 +1773,8 @@ xfs_iunlink_remove(
  = ;            &nb= sp;         if (last_ibp !=3D NULL) {=
            =             &nbs= p;       xfs_trans_brelse(tp, last_ibp);
            &nbs= p;           }
+ &= nbsp;            = ;          ASSERT(next_agino !=3D= NULLAGINO);
+          = ;            &nb= sp; ASSERT(next_agino !=3D 0);
       =             &nbs= p;    next_ino =3D XFS_AGINO_TO_INO(mp, agno, next_agino);             &nbs= p;           error =3D xfs= _inotobp(mp, tp, next_ino, &last_dip,
     &= nbsp;            = ;            &nb= sp;             &= amp;last_ibp, &last_offset, 0);
@@ -1783,8 +1785,6 @@ xfs_iunlink_rem= ove(
           &n= bsp;            =         return error;
            &nbs= p;           }
 &n= bsp;            =           next_agino =3D be32_t= o_cpu(last_dip->di_next_unlinked);
-     &nbs= p;            &n= bsp;    ASSERT(next_agino !=3D NULLAGINO);
-  &n= bsp;            =         ASSERT(next_agino !=3D 0);
            &nbs= p;   }
         &n= bsp;      /*
      = ;           * Now last_ibp= points to the buffer previous to us on

Thank you.


2013/4/17 =E7=AC=A6= =E6=B0=B8=E6=B6=9B <yongtaofu@gmail.com>
Hi Brain,
<= /div>If it is because NULLAGINO is passed in  to xfs_inotobp().
Can I move the following two lines before xfs_inotobp?

For example:

1767        =          while (next_agino !=3D agin= o) {
1768            =              /*<= br>1769           &nb= sp;            &= nbsp; * If the last inode wasn't the one pointing to
1770  &nbs= p;            &n= bsp;          * us, then releas= e its buffer since we're not
1771      &nbs= p;            &n= bsp;      * going to do anything with it.
1772            =             &nbs= p; */
1773          &nb= sp;            &= nbsp; if (last_ibp !=3D NULL) {
1774      &= nbsp;            = ;            &nb= sp; xfs_trans_brelse(tp, last_ibp);
1775     &nb= sp;            &= nbsp;      }
1776     &= nbsp;            = ;       next_ino =3D XFS_AGINO_TO_INO(mp, agno= , next_agino);
+            &nb= sp;              = ;    ASSERT(next_agino !=3D NULLAGINO);
+   &nbs= p;            &n= bsp;              ASSERT(next_agino != =3D 0);
1777          &= nbsp;            = ;  error =3D xfs_inotobp(mp, tp, next_ino, &last_dip,
1778 =             &nbs= p;            &n= bsp;            =       &last_ibp, &last_offset, 0);
1779            =              if (= error) {
1780          =             &nbs= p;          xfs_warn(mp,
178= 1            &nb= sp;            &= nbsp;            = ;   "%s: xfs_inotobp() returned error %d.",
1782  &nb= sp;            &= nbsp;            = ;             __= func__, error);
1783            =             &nbs= p;        return error;
1784 &nbs= p;            &n= bsp;          }
1785 &n= bsp;            =            next_agino =3D b= e32_to_cpu(last_dip->di_next_unlinked);
-     = ;            &nb= sp;             //ASSERT(next_agino != =3D NULLAGINO);
-            &nb= sp;            &= nbsp;     //ASSERT(next_agino !=3D 0);
1788 &nbs= p;            &n= bsp;  }
I don't understand xfs well and correct me if I'm tota= lly wrong.
Thank you very much.


2013/4/17 =E7=AC=A6=E6=B0=B8=E6=B6=9B <yongtaofu@gmai= l.com>
Hi Brain,
I want to ask a question, according to the sh= utdown trace. The ino in  xfs_iunlink_remove is 0x113, why xfs_imap got ino=3D0xffffffff ? 

=
--- x= fs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- return=3D0x16=
vars: mp=3D0xfff= f882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff

--- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680"= ).return -- return=3D0x16
vars: tp=3D0xfff= f881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? agi=3D? dip=3D? ag= ibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino=3D? last_ibp=3D= ? last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? last_offset=3D0x= ffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0x= 113, i_flags =3D 0x0

Thank you.



2013/4/17 =E7=AC=A6=E6=B0=B8=E6=B6=9B <= yongtaofu@gmail.com>
Hi Brain,
Thank you for your update, and= I have applied your last kernel patch. However it is not easy to reproduce e= specially in out test environment. Till now is not happens again. I'll updat= e the kernel patch now. BTW is there any findings in the logs of previous th= read?
http://oss.sgi.com/archives/xfs/2013-04/msg00327.html
I guess= it tend to happen during glusterfs rebalance because glusterfs moves a lot o= f file from one server to another and then unlink it.

Thank you.


<= div class=3D"gmail_quote">2013/4/17 Brian Foster <bfoster@redhat.com>= ;
On 04/16/2013 12:24 PM, Dave Chinner wrote:
> On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote:
>> Hi,
>>
>> Thanks for the data in the previous thread:
>>
>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>
...
>>
>>      echo 1 > /sys/kernel/debug/tracing/events/xf= s/xfs_iunlink/enable
>>      echo 1 > /sys/kernel/debug/tracing/events/xf= s/xfs_iunlink_remove/enable
>>      ... reproduce ...
>>      cat /sys/kernel/debug/tracing/trace > trace.= output
>
> It's better to use trace-cmd for this. it will result in less
> dropped events. i.e.:
>
>       $ trace-cmd record -e xfs_iunlink\*
>       ... reproduce ...
>       ^C
>       $ trace-cmd report > trace.output
>
>> --- a/fs/xfs/linux-2.6/xfs_trace.h
>> +++ b/fs/xfs/linux-2.6/xfs_trace.h
>> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
...
>
> I would suggest that the the tracing shoul dbe at entry of the
> function, otherwise we won't get a tracepoint for the operation that > triggers the shutdown. (That's the reason most tracepoints in XFS
> are at function entry...)
>

Good points, thanks Dave. A v2 that pulls up the tracepoints towards function entry is appended.

Brian

=46rom 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001
= From: Brian Foster <bfoster@redhat.com>
Date: Mon, 15 Apr 2013 18:16:24 -0400
Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and
xfs_iunlink_remove

---
 fs/xfs/linux-2.6/xfs_trace.h |    2 ++
 fs/xfs/xfs_inode.c           |    4= ++++
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h
=
index adc6ec4..338a0f9 100644
--- a/fs/xfs/linux-2.6/xfs_trace.h
+++ b/fs/xfs/linux-2.6/xfs_trace.h
@@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
 DEFINE_INODE_EVENT(xfs_destroy_inode);
 DEFINE_INODE_EVENT(xfs_dirty_inode);
 DEFINE_INODE_EVENT(xfs_clear_inode);
+DEFINE_INODE_EVENT(xfs_iunlink);
+DEFINE_INODE_EVENT(xfs_iunlink_remove);

 DEFINE_INODE_EVENT(xfs_dquot_dqalloc);
 DEFINE_INODE_EVENT(xfs_dquot_dqdetach);
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 19900f0..d705c77 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1615,6 +1615,8 @@ xfs_iunlink(

        mp =3D tp->t_mountp;

+       trace_xfs_iunlink(ip);
+
        /*
         * Get the agi buffer first.  It ensur= es lock ordering
         * on the list.
@@ -1694,6 +1696,8 @@ xfs_iunlink_remove(
        mp =3D tp->t_mountp;
        agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino);

+       trace_xfs_iunlink_remove(ip);
+
        /*
         * Get the agi buffer first.  It ensur= es lock ordering
         * on the list.
--
1.7.7.6




--
=E7=AC=A6=E6=B0=B8=E6=B6=9B



--
=E7=AC=A6=E6=B0=B8=E6=B6=9B



--
=E7=AC=A6=E6=B0=B8=E6=B6=9B



--
=E7=AC=A6=E6=B0=B8=E6=B6= =9B
____________________= ___________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/l= istinfo/xfs
= --Apple-Mail-62731709-7EC0-4766-B0C5-9A69AD6915EE-- From service-client@lesoffrespromotionnelles.com Wed Apr 17 03:42:05 2013 Return-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.8 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8ADC67F4C for ; Wed, 17 Apr 2013 03:42:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7A88F8F8094 for ; Wed, 17 Apr 2013 01:42:02 -0700 (PDT) X-ASG-Debug-ID: 1366188117-04cbb057f62c15c0001-NocioJ Received: from s4.lesoffrespromotionnelles.com (s4.lesoffrespromotionnelles.com [37.140.202.118]) by cuda.sgi.com with ESMTP id DHdAmZqBGGebkqlV for ; Wed, 17 Apr 2013 01:41:59 -0700 (PDT) X-Barracuda-Envelope-From: service-client@lesoffrespromotionnelles.com X-Barracuda-Apparent-Source-IP: 37.140.202.118 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=lesoffrespromotionnelles.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@lesoffrespromotionnelles.com; bh=LMil+Y66e2l5AGcVmxAjCptp5r5u2EUF25D9dQwbyx4=; b=uJwijg/NgVMAw7hT2P5uu/G8Sr0wsC+PtdiUDHR7KJZwJAA8PttKDxUazhrDs4KoodPMlraQktKk gE7ktybg3vv4/rnBVVaCq5RhXBe1FquKzONUjrDhsB8k0ZkTZsXb9fc9H2YG/rLzkjR3OoRfXkHh /ZlRS8VWF0qnkv26y2k= From: Bagages de Grandes Marques X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 40180 X-EN-uuid: 1012-101240180-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Dernier jour pour profiter de 70% de reduction sur les bagages MIME-Version: 1.0 X-ASG-Orig-Subj: Dernier jour pour profiter de 70% de reduction sur les bagages List-Unsubscribe: http://www.lesoffrespromotionnelles.com/JXjNUu0uHnnRVZpLm1gF4O376oGGWYogIK_qd67Z5Jg.html, Content-Type: multipart/alternative; boundary=8e216bb6489d57c9439ab2d1542260cf Message-ID: <0.0.2.EF9.1CE3B475D71B768.0@s4.lesoffrespromotionnelles.com> Date: Wed, 17 Apr 2013 10:41:33 +0200 X-Barracuda-Connect: s4.lesoffrespromotionnelles.com[37.140.202.118] X-Barracuda-Start-Time: 1366188118 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.80 X-Barracuda-Spam-Status: No, SCORE=0.80 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_02, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128363 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_MOSTLY BODY: Multipart message mostly text/html MIME 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary --8e216bb6489d57c9439ab2d1542260cf Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --8e216bb6489d57c9439ab2d1542260cf Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit Festival des petits prix - jusqu'au 17 avril

Festival des petits prix
jusqu'au 17 avril
LA LIVRAISON EN 48H EST GRATUITE !
Les prix les plus bas du marché
VALISES RIGIDES VALISES SOUPLES SAC A ROULETTES SAC CABINE ACCESSOIRES
Festival des petits prix
► VALISES RIGIDES ► VALISES SOUPLES ► SAC À ROULETTES
jusqu à moins 70pourcent
jusqu à moins 70pourcent
sur des bagages de grandes marques
sur des bagages de grandes marques
► SAC CABINE ► PORTE-ORDINATEURS ► ACCESSOIRES
Valise + vanity Ensemble de 3 valises Sac à roulettes
NOS AVANTAGES CLIENT
Nos avantages clients Livraison 48H
GRATUITE
Nos avantages clients Echange & Retour
GRATUIT
Nos avantages clients GARANTIE
Voyage
Nos avantages clients Paiement
SÉCURISÉ
NOS MARQUES
Platinium, Travel One, Lulu Castagnette, Christophe Guillarmé, Corinne Cobson...
Voir toutes nos marques
Facebook Sur Facebook Twitter Sur Twitter Par mail Par mail Téléchargez l Application

Festival des petits prix

Jusqu’au 17 Avril profitez de notre opération Festival des petits prix et découvrez les meilleures offres du moment. Même après les soldes profitez des prix les plus bas du marché.
Pas encore de valise pour vos vacances, pas de panique vous trouverez celle qui vous conviendra. Vous bénéficierez également d’un large choix de vanity, de portes ordinateurs, d’accessoires de voyage...


Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From service-client@lesoffresvoyages.com Wed Apr 17 03:50:12 2013 Return-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.7 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,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 3C57F7F4C for ; Wed, 17 Apr 2013 03:50:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B169CAC001 for ; Wed, 17 Apr 2013 01:50:08 -0700 (PDT) X-ASG-Debug-ID: 1366188604-04cbb057f52c1f70001-NocioJ Received: from s4.lesoffresvoyages.com (s4.lesoffresvoyages.com [37.140.202.98]) by cuda.sgi.com with ESMTP id 7mDRfLNhS1pTDAwO for ; Wed, 17 Apr 2013 01:50:05 -0700 (PDT) X-Barracuda-Envelope-From: service-client@lesoffresvoyages.com X-Barracuda-Apparent-Source-IP: 37.140.202.98 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=lesoffresvoyages.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@lesoffresvoyages.com; bh=UIk/myZDbjaKx52xNzyrCtLERScDWuJJiCLX80t1fmE=; b=WuM/qvKfvz1y13xYEwpFLfy8pfHqDTMkiLEyJbe0XP5Zjb+vrxlaWoUANhYer00mp2BqQChkmtw9 Ff+zJzuMOTi4u2iM/LGVy6rzu9bmE1Bkr9HD5AMidojGEap0S8ra+pX08byJ9vtdC4vVfKQwehaH YEhql7FVrQvnzfEh65k= From: Ebookers X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 40192 X-EN-uuid: 1010-101040192-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Partez a la plage, moins 40% sur votre voyage! MIME-Version: 1.0 X-ASG-Orig-Subj: Partez a la plage, moins 40% sur votre voyage! List-Unsubscribe: http://www.lesoffresvoyages.com/hwwrd8Ogi_rMZCILzX9S2Dxnq7wzlY75NltxQerI4y8.html, Content-Type: multipart/alternative; boundary=d925130746c00d1bb0247ebe5343308c Message-ID: <0.0.4.B10.1CE3B488DEC39DA.0@s4.lesoffresvoyages.com> Date: Wed, 17 Apr 2013 10:50:04 +0200 X-Barracuda-Connect: s4.lesoffresvoyages.com[37.140.202.98] X-Barracuda-Start-Time: 1366188605 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.41 X-Barracuda-Spam-Status: No, SCORE=0.41 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128365 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_MOSTLY BODY: Multipart message mostly text/html MIME 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary --d925130746c00d1bb0247ebe5343308c Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --d925130746c00d1bb0247ebe5343308c Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit Ebookers.fr

Exclusif, jusqu'à -40% en réservant votre voyage avant le 31 mai 2013 !
ebookers.fr Réservez facile, voyagez tranquille
PLUS D'HÔTELS VOLS VOL + HÔTEL LOCATION DE VOITURE
SOS sieste ô soleil
Besoin urgent de soleil et de plage ?
Nous venons à votre secours

Jusqu'à
-40%
sur vos prochaines vacances
à la plage


valable jusqu'au 31 mai

Pour profiter de votre offre,
merci de valider votre adresse :
xfs@oss.sgi.com Validez
  En validant, j'accepte de recevoir par e-mail les offres privilégiées et actualités de la marque Ebookers.fr  
SOS sieste ô soleil
Vous disposez d'un droit d'accès, de modification, de rectification et de
suppression des informations recueillies.

Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From rbennett@mail.crawford.com Wed Apr 17 08:18:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8DF367F4C for ; Wed, 17 Apr 2013 08:18:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0EC1BAC008 for ; Wed, 17 Apr 2013 06:18:25 -0700 (PDT) X-ASG-Debug-ID: 1366204704-04cb6c2c1c2e4d80001-NocioJ Received: from na3sys009aog128.obsmtp.com (na3sys009aog128.obsmtp.com [74.125.149.141]) by cuda.sgi.com with SMTP id 1YuwXfP4Iju19IOg for ; Wed, 17 Apr 2013 06:18:24 -0700 (PDT) X-Barracuda-Envelope-From: rbennett@mail.crawford.com X-Barracuda-RBL-Trusted-Forwarder: 74.125.149.141 Received: from mail-ve0-f200.google.com ([209.85.128.200]) (using TLSv1) by na3sys009aob128.postini.com ([74.125.148.12]) with SMTP ID DSNKUW6hHz+SoyGhllu7Kl2PVBhexyT2yGKI@postini.com; Wed, 17 Apr 2013 06:18:24 PDT Received: by mail-ve0-f200.google.com with SMTP id ox1so2761334veb.11 for ; Wed, 17 Apr 2013 06:18:23 -0700 (PDT) X-Barracuda-Apparent-Source-IP: 209.85.128.200 X-Barracuda-BBL-IP: 209.85.128.200 X-Barracuda-RBL-IP: 209.85.128.200 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:x-received:mime-version:from:date:message-id:subject:to :content-type:x-gm-message-state; bh=igaQCxAaGjE96QiF1a7s0172yrCkPmBb+Bzgjyiot08=; b=cZsSu8cpsPCXw3f1jO62ZrtXcZBUvB8CaVE1GquEYTya1Q4TCFaYY7FowLRO4DOVDV kw4tsY2FEHfJIa/4cMPGrHK6LJI7866sw9uR/GPCR4LrGxaQZZy6J5s/KUDzyKj5gRL/ Z8iNaFbwXOMIj4GM4Qnnp6fM0DWdSFWolZovyygllDg521v0DXVAYVu0AzEMYKkPGnYL rnhCtJDWhxFbLLKotPjC2c4we66+XSvvNBMC/3SX2AcnrLm1ZpDo5Hv3eXFWt9eN6uQG Z9kkkGnog0CLKwYpIWCcjAHtERaSAen9UcnZbc4K2X7LwnEQRMuyl4mKzxgdyrLvSxmi QWJg== X-Received: by 10.224.59.83 with SMTP id k19mr6480578qah.53.1366204700999; Wed, 17 Apr 2013 06:18:20 -0700 (PDT) X-Received: by 10.224.59.83 with SMTP id k19mr6480572qah.53.1366204700942; Wed, 17 Apr 2013 06:18:20 -0700 (PDT) MIME-Version: 1.0 Received: by 10.49.131.6 with HTTP; Wed, 17 Apr 2013 06:18:00 -0700 (PDT) From: Robert Bennett Date: Wed, 17 Apr 2013 09:18:00 -0400 Message-ID: Subject: Practical file system size question To: xfs@oss.sgi.com X-ASG-Orig-Subj: Practical file system size question Content-Type: multipart/alternative; boundary=20cf3074b9d6e3f17a04da8e5133 X-Gm-Message-State: ALoCoQlPaWYjSGYDOnZ5rRPQpVYuJTTBZ2+uuR/Plb85s/373MxuhaHLfV6pYJuYrxdD6YIDSAghzYthAJeE70RUz6MVEGxWlxIob6iqywqJ+6O0VqgrcZnrRBggQi2diBsW4iO2NaMoOz4iRT5FsaOs/S20Tg/DnQ== X-Barracuda-Connect: na3sys009aog128.obsmtp.com[74.125.149.141] X-Barracuda-Start-Time: 1366204704 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.128383 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --20cf3074b9d6e3f17a04da8e5133 Content-Type: text/plain; charset=ISO-8859-1 We have been running our Storage on XFS for over three years now and are extremely happy. We are running each file system on LSI Hardware Raid with 3 RAID groups of 12+2 with 3 Hot Spares, and 8 file systems per Head Node. These are running on 2TB SAS HDDs. The individual file system size is 66TB in this configuration. The time has come to look into moving to 3TB SAS HDDs. With very rudimentary math, this should move us to the neighborhood of 99TB per file system. Our OS is linux 2.6.32-279.11.1.el6.x86_64. The question is - does anyone have experience with this type of configuration and in particular with 3TB HDDs and a file system size of 99TB? The rebuild time with 2TB drives is ~ 24 hours. Should I expect the rebuild time for the 3TB drives to be ~ 36 hours? Thanks for all the hard work all of you do on a file system that continues to dazzle. -bob ** --20cf3074b9d6e3f17a04da8e5133 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

We have been running our Stora= ge on XFS for over three years now and are extremely happy.=A0 We are runni= ng each file system on LSI Hardware Raid with 3 RAID groups of 12+2 with 3 = Hot Spares, and 8 file systems per Head Node.=A0 These are running on 2TB S= AS HDDs.=A0 The individual file system size is 66TB in this configuration.= =A0 The time has come to look into moving to 3TB SAS HDDs.=A0 With very rud= imentary math, this should move us to the neighborhood of 99TB per file sys= tem.=A0 Our OS is linux 2.6.32-279.11.1.el6.x86_64.

The question is - does anyone have experience with this type= of configuration and in particular with 3TB HDDs and a file system size of= 99TB?=A0 The rebuild time with 2TB drives is ~ 24 hours.=A0 Should I expec= t the rebuild time for the 3TB drives to be ~ 36 hours?

Thanks for all the hard work all of you do on a file system = that continues to dazzle.

-bob
=
--20cf3074b9d6e3f17a04da8e5133-- From Yann.Dupont@univ-nantes.fr Wed Apr 17 08:44:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 028C27F4C for ; Wed, 17 Apr 2013 08:44:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 79964AC004 for ; Wed, 17 Apr 2013 06:44:18 -0700 (PDT) X-ASG-Debug-ID: 1366206256-04cb6c6e2b1c22b0001-NocioJ Received: from smtp-tls.univ-nantes.fr (smtptls1-loi.cpub.univ-nantes.fr [193.52.103.112]) by cuda.sgi.com with ESMTP id XEY841nCHb20gYrQ for ; Wed, 17 Apr 2013 06:44:17 -0700 (PDT) X-Barracuda-Envelope-From: Yann.Dupont@univ-nantes.fr X-Barracuda-Apparent-Source-IP: 193.52.103.112 Received: from localhost (localhost [127.0.0.1]) by smtp-tls.univ-nantes.fr (Postfix) with ESMTP id F35D34016E4; Wed, 17 Apr 2013 15:44:15 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at smtptls1-lmb.cpub.univ-nantes.fr Received: from smtp-tls.univ-nantes.fr ([127.0.0.1]) by localhost (smtptls1-loi.cpub.univ-nantes.fr [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 3WSYgvFbs1Gj; Wed, 17 Apr 2013 15:44:15 +0200 (CEST) Received: from [IPv6:2001:660:7220:0:1018:6ade:80ab:dde7] (unknown [IPv6:2001:660:7220:0:1018:6ade:80ab:dde7]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp-tls.univ-nantes.fr (Postfix) with ESMTPSA id D555C4016E1; Wed, 17 Apr 2013 15:44:15 +0200 (CEST) Message-ID: <516EA72F.3030200@univ-nantes.fr> Date: Wed, 17 Apr 2013 15:44:15 +0200 From: Yann Dupont User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130308 Thunderbird/17.0.4 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: kernels 3.4 slower due to allocation workqueue References: <516BCACE.1040900@univ-nantes.fr> <516C046C.8080908@sgi.com> <516CFCB8.1060804@univ-nantes.fr> <516D518F.1000708@sgi.com> X-ASG-Orig-Subj: Re: kernels 3.4 slower due to allocation workqueue In-Reply-To: <516D518F.1000708@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtptls1-loi.cpub.univ-nantes.fr[193.52.103.112] X-Barracuda-Start-Time: 1366206256 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128383 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le 16/04/2013 15:26, Mark Tinguely a écrit : > > The filesystem can hang but only if the OS cannot allocate another > worker when doing certain calls. > > --Mark. Ok, any chance to see these fixes backported to 3.4 ? Cheers, -- Yann Dupont - Service IRTS, DSI Université de Nantes Tel : 02.53.48.49.20 - Mail/Jabber : Yann.Dupont@univ-nantes.fr From joe.landman@gmail.com Wed Apr 17 08:53:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D15F77F4E for ; Wed, 17 Apr 2013 08:53:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 952EE304064 for ; Wed, 17 Apr 2013 06:53:31 -0700 (PDT) X-ASG-Debug-ID: 1366206809-04bdf02d202deb80001-NocioJ Received: from mail-ie0-f177.google.com (mail-ie0-f177.google.com [209.85.223.177]) by cuda.sgi.com with ESMTP id U5jT2uKDfi0ft3g2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 17 Apr 2013 06:53:30 -0700 (PDT) X-Barracuda-Envelope-From: joe.landman@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] Received: by mail-ie0-f177.google.com with SMTP id 9so1922743iec.36 for ; Wed, 17 Apr 2013 06:53:29 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=GIbVu2UtluPg8iO/N9Nd7pAhNKnZGB1xam8HrgfkUc8=; b=Z4PIJKyoGBubu1GIFWqeJEf3uHOrpJY7Bfs15K+Wm6v0JRV4VOqXAIH/lyo66BaeSn CYauuneM09JeHza/RBiivi61uH7opRIPx8ZqzCcYwwtd7djR4oGGjqwro9QKxqIyRL9g 5sNzg42LA2Hll/t3FVigYlZJCDXWOflcSa1jUrsvOx8se3hLDu+Hn2qJj8jMxy2kmqFL fJaqscYcRRANF01R/SNmmSJJ5K5gbGS6Mda/3Iz8wLb+FuX6ojay2PwHXYDwIolRl7eT ki8wA/w7DRiJwSproLbm+0HUFWjNdxV8zhl9ON89HuckCcDr2UctsBOEcDsWx1SLPxYA wqiw== X-Received: by 10.42.107.73 with SMTP id c9mr3717276icp.9.1366206809580; Wed, 17 Apr 2013 06:53:29 -0700 (PDT) Received: from [192.168.1.171] (50-197-102-113-static.hfc.comcastbusiness.net. [50.197.102.113]) by mx.google.com with ESMTPS id in10sm20596379igc.1.2013.04.17.06.53.28 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 17 Apr 2013 06:53:28 -0700 (PDT) Message-ID: <516EA959.6090205@gmail.com> Date: Wed, 17 Apr 2013 09:53:29 -0400 From: Joe Landman User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130329 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: Practical file system size question References: X-ASG-Orig-Subj: Re: Practical file system size question In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ie0-f177.google.com[209.85.223.177] X-Barracuda-Start-Time: 1366206809 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128385 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/17/2013 09:18 AM, Robert Bennett wrote: [...] > The question is - does anyone have experience with this type of > configuration and in particular with 3TB HDDs and a file system size of > 99TB? The rebuild time with 2TB drives is ~ 24 hours. Should I expect Yes, we've built up to 240TB raw (180TB usable) xfs systems for our customers on our units. Very doable, though there are some considerations. First off, why 3TB when 4TB are in market, pretty stable ... ? Unless there is a budgetary limitation you are working against, I'd advise at least looking at those. Second, which LSI controllers are you using? Firmware updates for the controllers to use 3TB and higher drives are pretty much mandated. Our experience with various LSI cards has ranged from not so good to pretty good, and this is a firmware version revision dependent (along with driver) issue from what we found. > the rebuild time for the 3TB drives to be ~ 36 hours? Not in our experience. Typically 5-10 hours depending upon RAID card used, RAID configuration, drives chosen, and other issues. Its pretty complex, and hard to predict in advance without trying it. -- Joseph Landman, Ph.D Founder and CEO Scalable Informatics, Inc. email: landman@scalableinformatics.com web : http://scalableinformatics.com http://scalableinformatics.com/siflash phone: +1 734 786 8423 x121 fax : +1 866 888 3112 cell : +1 734 612 4615 From rafagriman@gmail.com Wed Apr 17 09:02:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 84FE07F4C for ; Wed, 17 Apr 2013 09:02:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 56FC48F8074 for ; Wed, 17 Apr 2013 07:02:44 -0700 (PDT) X-ASG-Debug-ID: 1366207356-04bdf02d202df8b0001-NocioJ Received: from mail-wi0-f182.google.com (mail-wi0-f182.google.com [209.85.212.182]) by cuda.sgi.com with ESMTP id AnUwsEIKipR05ruJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 17 Apr 2013 07:02:37 -0700 (PDT) X-Barracuda-Envelope-From: rafagriman@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.182 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.182] Received: by mail-wi0-f182.google.com with SMTP id m6so1580654wiv.3 for ; Wed, 17 Apr 2013 07:02:35 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.182] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.182] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:mime-version:in-reply-to:references:from:date:message-id :subject:to:content-type; bh=mOE+VY+J6L+VBb/QHL3sGri5VPka9dugsIqplYi6r+4=; b=cyZNM6sfBAaVC+VKKmW315bPGvEKE5s99TncTgYnoaRTCRLZzeujV6V+yGmPUs1yBn XArvv9Xny6QMRdN0Bn4BtmupgqI1ZPC9JesAFLwEKbJ4GqO9YWoRPCr2xHAMDthSHvM6 rS5dPFNu4hLeoEIkpTjUgugtc1fepENMQiIJ6zkYXI8ONMAvl8fcqDB94AVfsECeZH2Y 2mw0t4zTPf492lqQ2cqezJTjulNiv8j1bOejSBhOlyxwulzIIUsZPAnGZDpyArIakzer apOU4MH0rQRZREUvxN0lUoAgfwNHiykaIi7KJaDxV1GCczM1kQpguwuPZrv/ikK5yfSl 8d0A== X-Received: by 10.180.97.233 with SMTP id ed9mr26315754wib.32.1366207355447; Wed, 17 Apr 2013 07:02:35 -0700 (PDT) MIME-Version: 1.0 Received: by 10.217.118.7 with HTTP; Wed, 17 Apr 2013 07:02:15 -0700 (PDT) In-Reply-To: References: From: Rafa Griman Date: Wed, 17 Apr 2013 16:02:15 +0200 Message-ID: Subject: Re: Practical file system size question To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Practical file system size question Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wi0-f182.google.com[209.85.212.182] X-Barracuda-Start-Time: 1366207356 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128385 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi :) On Wed, Apr 17, 2013 at 3:18 PM, Robert Bennett wrote: > > We have been running our Storage on XFS for over three years now and are > extremely happy. We are running each file system on LSI Hardware Raid with > 3 RAID groups of 12+2 with 3 Hot Spares, and 8 file systems per Head Node. > These are running on 2TB SAS HDDs. The individual file system size is 66TB > in this configuration. The time has come to look into moving to 3TB SAS > HDDs. With very rudimentary math, this should move us to the neighborhood > of 99TB per file system. Our OS is linux 2.6.32-279.11.1.el6.x86_64. > > The question is - does anyone have experience with this type of > configuration and in particular with 3TB HDDs and a file system size of > 99TB? The rebuild time with 2TB drives is ~ 24 hours. Should I expect the > rebuild time for the 3TB drives to be ~ 36 hours? > > Thanks for all the hard work all of you do on a file system that continues > to dazzle. When you say "LSI Hardware Raid", I assume it's some sort of NetApp/Engenio storage array (aka E2600, E2400, E5500). Am I correct? If so, you should try the new their new feature Dynamic Disk Pooling: http://www.netapp.com/us/system/pdf-reader.aspx?m=ds-3309.pdf&cc=us http://www.netapp.com/us/technology/dynamic-disk-pools.aspx It lowers your rebuild times quite a lot. If you mean internal LSI RAID PCIe controllers in a server ... can't be of much help here :( HTH Rafa From tinguely@sgi.com Wed Apr 17 09:11:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 146527F4E for ; Wed, 17 Apr 2013 09:11:46 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id D62B28F8081; Wed, 17 Apr 2013 07:11:45 -0700 (PDT) Message-ID: <516EADA5.1040007@sgi.com> Date: Wed, 17 Apr 2013 09:11:49 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Yann Dupont CC: xfs@oss.sgi.com Subject: Re: kernels 3.4 slower due to allocation workqueue References: <516BCACE.1040900@univ-nantes.fr> <516C046C.8080908@sgi.com> <516CFCB8.1060804@univ-nantes.fr> <516D518F.1000708@sgi.com> <516EA72F.3030200@univ-nantes.fr> In-Reply-To: <516EA72F.3030200@univ-nantes.fr> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit On 04/17/13 08:44, Yann Dupont wrote: > Le 16/04/2013 15:26, Mark Tinguely a écrit : >> >> The filesystem can hang but only if the OS cannot allocate another >> worker when doing certain calls. >> >> --Mark. > > Ok, any chance to see these fixes backported to 3.4 ? > > Cheers, > All of the patches apply to Linux 3.4 without modification. It does not sound like the patches will be pushed back to stable at this time. --Mark. From rbennett@mail.crawford.com Wed Apr 17 09:28:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DE2A77F54 for ; Wed, 17 Apr 2013 09:28:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4AE52AC004 for ; Wed, 17 Apr 2013 07:28:30 -0700 (PDT) X-ASG-Debug-ID: 1366208907-04cbb057f72db330001-NocioJ Received: from na3sys009aog110.obsmtp.com (na3sys009aog110.obsmtp.com [74.125.149.203]) by cuda.sgi.com with SMTP id C3smip4pA0A0xanN for ; Wed, 17 Apr 2013 07:28:27 -0700 (PDT) X-Barracuda-Envelope-From: rbennett@mail.crawford.com X-Barracuda-RBL-Trusted-Forwarder: 74.125.149.203 Received: from mail-gg0-f197.google.com ([209.85.161.197]) (using TLSv1) by na3sys009aob110.postini.com ([74.125.148.12]) with SMTP ID DSNKUW6xi4zKuV1Al3nuesWYk+NrGilZAk4m@postini.com; Wed, 17 Apr 2013 07:28:27 PDT Received: by mail-gg0-f197.google.com with SMTP id k5so2270058ggn.8 for ; Wed, 17 Apr 2013 07:28:26 -0700 (PDT) X-Barracuda-Apparent-Source-IP: 209.85.161.197 X-Barracuda-BBL-IP: 209.85.161.197 X-Barracuda-RBL-IP: 209.85.161.197 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:x-received:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type:x-gm-message-state; bh=Gx/qvKUJLcQHBXndwfSgNucoH5zpg5DSaI/hP7+hiFQ=; b=e4jrECE7c+BR6Aw3ECvX3pNuV2YKdrgAu/ohST7VghyzS9BZ+zvCe/B2MW+Sny8UN8 148J1gPCU65dmS1zwKby5roRJBX5Dp+vuz4OCEW8dGGYWKW6eK5xhgDfTx5PDQb8PUCL /4YBqGVSJAoC7q+vBTWngFtjxF8Wu/15gambt2G9ertqBA6LfZm/5iotpK6RBv0rOyAp tifP4w+naiFgLHOo3Fl7rq5ThOhplz3IirbS4Bu8UAGY03s2nblh80pL8ZEJJje3RU3/ K/aFMRjp13YRf4Em+mIT5qNQlZMsy7s3onsNmrxO5VckmPabXxmv8zahr8Ij+B7JLW2y ElrQ== X-Received: by 10.224.49.131 with SMTP id v3mr6559106qaf.54.1366208906739; Wed, 17 Apr 2013 07:28:26 -0700 (PDT) X-Received: by 10.224.49.131 with SMTP id v3mr6559100qaf.54.1366208906647; Wed, 17 Apr 2013 07:28:26 -0700 (PDT) MIME-Version: 1.0 Received: by 10.49.131.6 with HTTP; Wed, 17 Apr 2013 07:28:06 -0700 (PDT) In-Reply-To: <516EA959.6090205@gmail.com> References: <516EA959.6090205@gmail.com> From: Robert Bennett Date: Wed, 17 Apr 2013 10:28:06 -0400 Message-ID: Subject: Re: Practical file system size question To: Joe Landman X-ASG-Orig-Subj: Re: Practical file system size question Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11c2f47c91e55b04da8f4ca3 X-Gm-Message-State: ALoCoQnZx0fU3wvBIRTf+1LM0s/JqUQWRCwwqoPKZoKWOw/t2id8UWUYQwBg0H9RpLejJV1XuVrCpWJAdXezwSb/ahA2pb215mCZDn3CF+ex6VV7LDfK/5vVXl2k/POsdUEYqxJvNZxJFztMZt1SMz4Rm/mJMOBUnw== X-Barracuda-Connect: na3sys009aog110.obsmtp.com[74.125.149.203] X-Barracuda-Start-Time: 1366208907 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128387 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA038b Custom Rule SA038b --001a11c2f47c91e55b04da8f4ca3 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Thanks for the quick replies. It's very nice. We are using LSI MegaRAID 9280-8E cards. I got bit by the LSI firmware bug a while back and chased what appeared to be a memory issue before discovering that a firmware upgrade solved all my problems. I don't remember how many grey hairs were a result of that exercise, but it wasn't just a few. We build our own storage from Super Micro Components. Why not look at 4TB drives? Short sightedness. Fear. Baby Steps. Take your pick. With that being said - I will look into it. Thanks for all the insights. -bob *Bob Bennett* Director of IT Crawford Media Services, Inc. d: 678.536.4906 | e: rbennett@mail.crawford.com | w: www.crawford.com 6 West Druid Hills Drive, NE Atlanta, GA 30329 view map *Create ******** **=95** Manage ********** **=95** Serve* On Wed, Apr 17, 2013 at 9:53 AM, Joe Landman wrote: > On 04/17/2013 09:18 AM, Robert Bennett wrote: > > [...] > > > The question is - does anyone have experience with this type of >> configuration and in particular with 3TB HDDs and a file system size of >> 99TB? The rebuild time with 2TB drives is ~ 24 hours. Should I expect >> > > Yes, we've built up to 240TB raw (180TB usable) xfs systems for our > customers on our units. Very doable, though there are some consideration= s. > > First off, why 3TB when 4TB are in market, pretty stable ... ? Unless > there is a budgetary limitation you are working against, I'd advise at > least looking at those. > > Second, which LSI controllers are you using? Firmware updates for the > controllers to use 3TB and higher drives are pretty much mandated. Our > experience with various LSI cards has ranged from not so good to pretty > good, and this is a firmware version revision dependent (along with drive= r) > issue from what we found. > > > the rebuild time for the 3TB drives to be ~ 36 hours? >> > > Not in our experience. Typically 5-10 hours depending upon RAID card > used, RAID configuration, drives chosen, and other issues. Its pretty > complex, and hard to predict in advance without trying it. > > > -- > Joseph Landman, Ph.D > Founder and CEO > Scalable Informatics, Inc. > email: landman@scalableinformatics.**com > web : http://scalableinformatics.com > http://scalableinformatics.**com/siflash > phone: +1 734 786 8423 x121 > fax : +1 866 888 3112 > cell : +1 734 612 4615 > > ______________________________**_________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/**listinfo/xfs > --001a11c2f47c91e55b04da8f4ca3 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: quoted-printable
Thanks for the quick replies.=A0 = It's very nice.

We are using LSI MegaRAID 9280-8E cards.= =A0 I got bit by the LSI firmware bug a while back and chased what appeared= to be a memory issue before discovering that a firmware upgrade solved all= my problems.=A0 I don't remember how many grey hairs were a result of = that exercise, but it wasn't just a few.

We build our own storage from Super Micro Components.

Why not look at 4TB drives?=A0 Short sightedness.=A0 Fear.=A0 Baby Steps.= =A0 Take your pick.=A0 With that being said - I will look into it.

<= /div> Thanks for all the insights.

-bob

<= div dir=3D"ltr">

Bob Bennett<= span style=3D"font-size:9.5pt;color:#1f497d">
Director of IT=
Crawford Media Services, Inc.
d:=A0678.536.490= 6 |=A0e:=A0rbennett@mail.crawford.com=A0|=A0w:=A0w= ww.crawford.com

6 West Druid Hills Drive, = NE

Atlanta, GA 30329

view map


Create =95=A0Manage <= /span> = =95 Serve


On Wed, Apr 17, 2013 at 9:53 AM, Joe Lan= dman <joe.landman@gmail.com> wrote:
On 04/17/2013 09:18 AM, Robert Bennett wrote:

[...]


The question is - does anyone have experience with this type of
configuration and in particular with 3TB HDDs and a file system size of
99TB? =A0The rebuild time with 2TB drives is ~ 24 hours. =A0Should I expect=

Yes, we've built up to 240TB raw (180TB usable) xfs systems for our cus= tomers on our units. =A0Very doable, though there are some considerations.<= br>
First off, why 3TB when 4TB are in market, pretty stable ... ? =A0Unless th= ere is a budgetary limitation you are working against, I'd advise at le= ast looking at those.

Second, which LSI controllers are you using? =A0Firmware updates for the co= ntrollers to use 3TB and higher drives are pretty much mandated. =A0Our exp= erience with various LSI cards has ranged from not so good to pretty good, = and this is a firmware version revision dependent (along with driver) issue= from what we found.


the rebuild time for the 3TB drives to be ~ 36 hours?

Not in our experience. =A0Typically 5-10 hours depending upon RAID card use= d, RAID configuration, drives chosen, and other issues. =A0Its pretty compl= ex, and hard to predict in advance without trying it.


--
Joseph Landman, Ph.D
Founder and CEO
Scalable Informatics, Inc.
email: landman@scalableinformatics.com
web =A0: http:= //scalableinformatics.com
=A0 =A0 =A0 =A0http://scalableinformatics.com/siflash
phone: +1 734 786 8423 x121
fax =A0: +1 866 888 3112
cell : +1 734 612 4615

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

--001a11c2f47c91e55b04da8f4ca3-- From test2@mail003.com Wed Apr 17 09:29:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F0A737F54 for ; Wed, 17 Apr 2013 09:29:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DBD958F8071 for ; Wed, 17 Apr 2013 07:29:01 -0700 (PDT) X-ASG-Debug-ID: 1366208938-04cbb057f82db400001-NocioJ Received: from mail003.com ([61.176.221.6]) by cuda.sgi.com with ESMTP id 8W4CCkW5bXNAuwv1 for ; Wed, 17 Apr 2013 07:28:59 -0700 (PDT) X-Barracuda-Envelope-From: test2@mail003.com X-Barracuda-Apparent-Source-IP: 61.176.221.6 Received: from bigfoot.com by mail003.com (MDaemon PRO v10.1.1) with ESMTP id md50000104566.msg for ; Wed, 17 Apr 2013 22:28:54 +0800 X-MDHeloLookup-Result: hardfail smtp.helo=bigfoot.com (does not match 101.16.192.118) (mail003.com) X-Authenticated-Sender: test2@mail003.com X-MDRemoteIP: 101.16.192.118 X-Return-Path: test2@mail003.com X-Envelope-From: test2@mail003.com X-MDaemon-Deliver-To: xfs@oss.sgi.com Reply-To: Sender: test2@mail003.com Date: Wed, 17 Apr 2013 22:31:29 +0800 From: "Ms.Rebecca Chia" To: Subject: Aluminum Products. Message-ID: <20130417223135472116@mail003.com> X-ASG-Orig-Subj: Aluminum Products. X-Priority: 1 (Highest) X-mailer: Foxmail 6, 13, 102, 15 [cn] Disposition-Notification-To: sales@csdmetal.com Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="=====003_Dragon701101252064_=====" X-Barracuda-Connect: UNKNOWN[61.176.221.6] X-Barracuda-Start-Time: 1366208939 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128387 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. --=====003_Dragon701101252064_===== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 RGVhciBtYW5hZ2VyLCANCg0KV2UgYXJlIGxlYWRpbmcgbWFudWZhY3R1cmUgb2YgQWx1bWludW0g UHJvZHVjdHMgaW4gQ2hpbmEuIA0KDQpPdXIgZmFjdG9yeSBwcm9kdWNlIEFsdW1pbnVtIENvaWwg YW5kIEFsdW1pbnVtIEZvaWwsIEFsdW1pbnVtIEluZ290LCBBbHVtaW51bSBTaGVldCwgQWx1bWlu dW0gQ2lyY2xlLCBBbHVtaW51bSBCaWxsZXRzLg0KDQpJZiBuZWVkIGVtYWlsIHVzLg0KDQpUaGFu a3Mu --=====003_Dragon701101252064_===== Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0 Zi04IiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA4LjAwLjYwMDEuMTk0MTIiPjwvSEVBRD4NCjxCT0RZPjxGT05UIGZhY2U9QXJp YWw+DQo8RElWPjxGT05UIGNvbG9yPSMwMDQwODAgc2l6ZT0yPkRlYXIgbWFuYWdlciwgPC9GT05U PjwvRElWPg0KPERJVj48QlI+PEZPTlQgY29sb3I9IzAwNDA4MD48Rk9OVCBzaXplPTI+V2UgYXJl IGxlYWRpbmcgbWFudWZhY3R1cmUgb2YgQWx1bWludW0gDQpQcm9kdWN0cyZuYnNwO2luIENoaW5h LiA8L0ZPTlQ+PC9GT05UPjwvRElWPg0KPERJVj48Rk9OVCBjb2xvcj0jMDA0MDgwPjxGT05UIHNp emU9Mj48L0ZPTlQ+PC9GT05UPiZuYnNwOzwvRElWPg0KPERJVj48Rk9OVCBjb2xvcj0jMDA0MDgw PjxGT05UIHNpemU9Mj5PdXIgZmFjdG9yeSBwcm9kdWNlIDxTVFJPTkc+QWx1bWludW0gQ29pbCAN CmFuZCBBbHVtaW51bSBGb2lsLCBBbHVtaW51bSBJbmdvdCwgQWx1bWludW0gU2hlZXQsIEFsdW1p bnVtIENpcmNsZSwgQWx1bWludW0gDQpCaWxsZXRzLjwvU1RST05HPjwvRk9OVD48L0ZPTlQ+PC9E SVY+DQo8RElWPjxCUj48Rk9OVCBjb2xvcj0jMDA0MDgwIHNpemU9Mj5JZiBuZWVkIGVtYWlsIHVz LjwvRk9OVD48L0RJVj4NCjxESVY+PEJSPjxGT05UIGNvbG9yPSMwMDQwODAgc2l6ZT0yPlRoYW5r cy48L0ZPTlQ+PC9ESVY+PC9GT05UPjwvQk9EWT48L0hUTUw+DQo= --=====003_Dragon701101252064_=====-- From Yann.Dupont@univ-nantes.fr Wed Apr 17 09:35:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 246B229E05 for ; Wed, 17 Apr 2013 09:35:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AFAB0AC003 for ; Wed, 17 Apr 2013 07:35:30 -0700 (PDT) X-ASG-Debug-ID: 1366209329-04cb6c2c1f2eb090001-NocioJ Received: from smtp-tls.univ-nantes.fr (smtptls1-loi.cpub.univ-nantes.fr [193.52.103.112]) by cuda.sgi.com with ESMTP id KS7Q2Kmha6CzhFaz for ; Wed, 17 Apr 2013 07:35:29 -0700 (PDT) X-Barracuda-Envelope-From: Yann.Dupont@univ-nantes.fr X-Barracuda-Apparent-Source-IP: 193.52.103.112 Received: from localhost (localhost [127.0.0.1]) by smtp-tls.univ-nantes.fr (Postfix) with ESMTP id D21914016EC; Wed, 17 Apr 2013 16:35:28 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at smtptls1-lmb.cpub.univ-nantes.fr Received: from smtp-tls.univ-nantes.fr ([127.0.0.1]) by localhost (smtptls1-loi.cpub.univ-nantes.fr [127.0.0.1]) (amavisd-new, port 10024) with LMTP id FNKRGEm9GIc9; Wed, 17 Apr 2013 16:35:28 +0200 (CEST) Received: from [IPv6:2001:660:7220:0:1018:6ade:80ab:dde7] (unknown [IPv6:2001:660:7220:0:1018:6ade:80ab:dde7]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp-tls.univ-nantes.fr (Postfix) with ESMTPSA id A7C544016E0; Wed, 17 Apr 2013 16:35:28 +0200 (CEST) Message-ID: <516EB330.8050207@univ-nantes.fr> Date: Wed, 17 Apr 2013 16:35:28 +0200 From: Yann Dupont User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130308 Thunderbird/17.0.4 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: kernels 3.4 slower due to allocation workqueue References: <516BCACE.1040900@univ-nantes.fr> <516C046C.8080908@sgi.com> <516CFCB8.1060804@univ-nantes.fr> <516D518F.1000708@sgi.com> <516EA72F.3030200@univ-nantes.fr> <516EADA5.1040007@sgi.com> X-ASG-Orig-Subj: Re: kernels 3.4 slower due to allocation workqueue In-Reply-To: <516EADA5.1040007@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtptls1-loi.cpub.univ-nantes.fr[193.52.103.112] X-Barracuda-Start-Time: 1366209329 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128387 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le 17/04/2013 16:11, Mark Tinguely a écrit : > On 04/17/13 08:44, Yann Dupont wrote: >> Le 16/04/2013 15:26, Mark Tinguely a écrit : >>> >>> The filesystem can hang but only if the OS cannot allocate another >>> worker when doing certain calls. >>> >>> --Mark. >> >> Ok, any chance to see these fixes backported to 3.4 ? >> >> Cheers, >> > > All of the patches apply to Linux 3.4 without modification. Yes, sorry, I should have said incorporated/pushed back > > It does not sound like the patches will be pushed back to stable at > this time. If you consider, for the moment, not pushing the patches in 3.4, (because of stability concerns, or you judge these patches intrusives, or whatever good reason), I won't do either, because I have no vision of the potential problems with the patched kernel. I always try to stay on pure vanilla kernels, longterm if possible, because stability is the more important. My best bet is probably 3.8 kernels right now (even if they are not longterm), or maybe simply going back to 3.2. Thanks for your answers, Cheers -- Yann Dupont - Service IRTS, DSI Université de Nantes Tel : 02.53.48.49.20 - Mail/Jabber : Yann.Dupont@univ-nantes.fr From rjohnston@sgi.com Wed Apr 17 09:51:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 687397F53 for ; Wed, 17 Apr 2013 09:51:13 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3C99F304039; Wed, 17 Apr 2013 07:51:13 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Wed, 17 Apr 2013 09:51:12 -0500 Message-ID: <516EB6E3.9040903@sgi.com> Date: Wed, 17 Apr 2013 09:51:15 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Boris Ranto CC: xfs-oss , Boris Ranto Subject: Re: [PATCH 2/5] xfstests: Use libtool to install applications References: <20120828172605.607853317@sgi.com> <20120828172928.999971219@sgi.com> In-Reply-To: Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Boris, Most people do not install xfstests, as it is not required to run the tests. Is there a reason you need to install xfstests? It is designed to be run from the directory you did the git clone from. Path is not critical so you could move it anywhere you wish. i.e. git clone git://oss.sgi.com/xfs/cmds/xfstests mv xfstests /new/path/new_xfsdirname cd /new/path/new_xfsdirname ./check -g auto --Rich From bpm@oss.sgi.com Wed Apr 17 10:55:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 2E3847F4E; Wed, 17 Apr 2013 10:55:13 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.9-rc1-20-g7fe3258 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 666d644cd72a9ec58b353209ff191d7430f3b357 X-Git-Newrev: 7fe3258c50de383037102129c57df5cb66ab2000 Message-Id: <20130417155513.2E3847F4E@oss.sgi.com> Date: Wed, 17 Apr 2013 10:55:12 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated 7fe3258 xfs: Update xfs_log_commit_cil() comments d4fd0e9 xfs: Remove the obsolete XLOG_CIL_HARD_SPACE_LIMIT() macros from 666d644cd72a9ec58b353209ff191d7430f3b357 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 7fe3258c50de383037102129c57df5cb66ab2000 Author: Jeff Liu Date: Thu Apr 4 16:07:14 2013 +0800 xfs: Update xfs_log_commit_cil() comments xfs_log_commit_iclog() function has been removed by commits 93b8a585: xfs: remove the deprecated nodelaylog option Beginning from Linux 3.3, only delayed logging is supported so that we call xfs_log_commit_cil() at xfs_trans_commit() only, remove the useless comments so. Signed-off-by: Jie Liu Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit d4fd0e92fbcfdba7bb2c789504a957ab8f835c38 Author: Jeff Liu Date: Thu Apr 4 12:10:42 2013 +0800 xfs: Remove the obsolete XLOG_CIL_HARD_SPACE_LIMIT() macros There is no more users of this Macro, so it's time to kill it dead. Signed-off-by: Jie Liu Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_log_cil.c | 4 ---- fs/xfs/xfs_log_priv.h | 1 - 2 files changed, 5 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Wed Apr 17 10:55:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 3B60E7F52; Wed, 17 Apr 2013 10:55:41 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.9-rc1-20-g7fe3258 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 666d644cd72a9ec58b353209ff191d7430f3b357 X-Git-Newrev: 7fe3258c50de383037102129c57df5cb66ab2000 Message-Id: <20130417155541.3B60E7F52@oss.sgi.com> Date: Wed, 17 Apr 2013 10:55:41 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated 7fe3258 xfs: Update xfs_log_commit_cil() comments d4fd0e9 xfs: Remove the obsolete XLOG_CIL_HARD_SPACE_LIMIT() macros from 666d644cd72a9ec58b353209ff191d7430f3b357 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 7fe3258c50de383037102129c57df5cb66ab2000 Author: Jeff Liu Date: Thu Apr 4 16:07:14 2013 +0800 xfs: Update xfs_log_commit_cil() comments xfs_log_commit_iclog() function has been removed by commits 93b8a585: xfs: remove the deprecated nodelaylog option Beginning from Linux 3.3, only delayed logging is supported so that we call xfs_log_commit_cil() at xfs_trans_commit() only, remove the useless comments so. Signed-off-by: Jie Liu Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit d4fd0e92fbcfdba7bb2c789504a957ab8f835c38 Author: Jeff Liu Date: Thu Apr 4 12:10:42 2013 +0800 xfs: Remove the obsolete XLOG_CIL_HARD_SPACE_LIMIT() macros There is no more users of this Macro, so it's time to kill it dead. Signed-off-by: Jie Liu Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_log_cil.c | 4 ---- fs/xfs/xfs_log_priv.h | 1 - 2 files changed, 5 deletions(-) hooks/post-receive -- XFS development tree From sandeen@sandeen.net Wed Apr 17 10:57:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B5ACC7F4C for ; Wed, 17 Apr 2013 10:57:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52CF5AC004 for ; Wed, 17 Apr 2013 08:56:57 -0700 (PDT) X-ASG-Debug-ID: 1366214216-04cbb057f62e2820001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Qt2MqIqCLrHMGzHn for ; Wed, 17 Apr 2013 08:56:56 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.196.82.113] (mobile-166-137-213-126.mycingular.net [166.137.213.126]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6481B63BCC65; Wed, 17 Apr 2013 10:56:55 -0500 (CDT) References: <20120828172605.607853317@sgi.com> <20120828172928.999971219@sgi.com> <516EB6E3.9040903@sgi.com> Mime-Version: 1.0 (1.0) In-Reply-To: <516EB6E3.9040903@sgi.com> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Message-Id: <943C7038-15A1-4C60-B776-F10F305F5BA9@sandeen.net> Cc: Boris Ranto , Boris Ranto , xfs-oss X-Mailer: iPhone Mail (10A523) From: Eric Sandeen Subject: Re: [PATCH 2/5] xfstests: Use libtool to install applications Date: Wed, 17 Apr 2013 08:56:50 -0700 X-ASG-Orig-Subj: Re: [PATCH 2/5] xfstests: Use libtool to install applications To: Rich Johnston X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366214216 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128393 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars On Apr 17, 2013, at 7:51 AM, Rich Johnston wrote: > Boris, >=20 > Most people do not install xfstests, as it is not required to run the test= s. Is there a reason you need to install xfstests? It is designed to be run= from the directory you did the git clone from. Path is not critical so you= could move it anywhere you wish. >=20 Just fwiw I've always wished for a properly installable xfstests to make it p= ossible to package it... Just a thought. :) -Eric > i.e. > git clone git://oss.sgi.com/xfs/cmds/xfstests > mv xfstests /new/path/new_xfsdirname > cd /new/path/new_xfsdirname > ./check -g auto >=20 >=20 > --Rich >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 From sekharan@us.ibm.com Wed Apr 17 11:40:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D4F687F4C for ; Wed, 17 Apr 2013 11:40:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1821304043 for ; Wed, 17 Apr 2013 09:40:12 -0700 (PDT) X-ASG-Debug-ID: 1366216808-04cbb057f62e60e0001-NocioJ Received: from e9.ny.us.ibm.com (e9.ny.us.ibm.com [32.97.182.139]) by cuda.sgi.com with ESMTP id HJmKStIpjDseXBWF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 17 Apr 2013 09:40:08 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.139 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] Received: from /spool/local by e9.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 17 Apr 2013 12:40:04 -0400 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] Received: from d01dlp01.pok.ibm.com (9.56.250.166) by e9.ny.us.ibm.com (192.168.1.109) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 17 Apr 2013 12:40:01 -0400 Received: from d01relay03.pok.ibm.com (d01relay03.pok.ibm.com [9.56.227.235]) by d01dlp01.pok.ibm.com (Postfix) with ESMTP id 39B9038C809E for ; Wed, 17 Apr 2013 12:39:42 -0400 (EDT) Received: from d03av06.boulder.ibm.com (d03av06.boulder.ibm.com [9.17.195.245]) by d01relay03.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3HGdcnV249270 for ; Wed, 17 Apr 2013 12:39:42 -0400 Received: from d03av06.boulder.ibm.com (loopback [127.0.0.1]) by d03av06.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3HGf5Lp021815 for ; Wed, 17 Apr 2013 10:41:05 -0600 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d03av06.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3HGf5dj021790 for ; Wed, 17 Apr 2013 10:41:05 -0600 Subject: [PATCH] xfstests: replace xfs_check with xfs_repair -n From: Chandra Seetharaman X-ASG-Orig-Subj: [PATCH] xfstests: replace xfs_check with xfs_repair -n Reply-To: sekharan@us.ibm.com To: XFS mailing list Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Wed, 17 Apr 2013 11:38:15 -0500 Message-ID: <1366216695.3762.32325.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13041716-7182-0000-0000-000006488BD0 X-Barracuda-Connect: e9.ny.us.ibm.com[32.97.182.139] X-Barracuda-Start-Time: 1366216808 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Replace the usage of "xfs_check" with "xfs_repair -n" as xfs_check is planned to be depracated. Signed-off-by: Chandra Seetharaman --- diff --git a/common/config b/common/config index bf62996..dfbb5c2 100644 --- a/common/config +++ b/common/config @@ -154,7 +154,6 @@ export DF_PROG="`set_prog_path df`" export XFS_LOGPRINT_PROG="`set_prog_path xfs_logprint`" export XFS_REPAIR_PROG="`set_prog_path xfs_repair`" -export XFS_CHECK_PROG="`set_prog_path xfs_check`" export XFS_DB_PROG="`set_prog_path xfs_db`" export XFS_GROWFS_PROG=`set_prog_path xfs_growfs` export XFS_IO_PROG="`set_prog_path xfs_io`" diff --git a/common/rc b/common/rc index 09fb83f..32a852f 100644 --- a/common/rc +++ b/common/rc @@ -166,7 +166,6 @@ case "$FSTYP" in xfs) [ "$XFS_LOGPRINT_PROG" = "" ] && _fatal "xfs_logprint not found" [ "$XFS_REPAIR_PROG" = "" ] && _fatal "xfs_repair not found" - [ "$XFS_CHECK_PROG" = "" ] && _fatal "xfs_check not found" [ "$XFS_DB_PROG" = "" ] && _fatal "xfs_db not found" [ "$MKFS_XFS_PROG" = "" ] && _fatal "mkfs_xfs not found" ;; @@ -589,7 +588,7 @@ _scratch_xfs_check() SCRATCH_OPTIONS="-l $SCRATCH_LOGDEV" [ "$LARGE_SCRATCH_DEV" = yes ] && \ SCRATCH_OPTIONS=$SCRATCH_OPTIONS" -t" - $XFS_CHECK_PROG $SCRATCH_OPTIONS $* $SCRATCH_DEV + $XFS_REPAIR_PROG -n $SCRATCH_OPTIONS $* $SCRATCH_DEV &>/dev/null } _scratch_xfs_repair() @@ -1422,25 +1421,6 @@ _check_xfs_filesystem() ok=0 fi - # xfs_check runs out of memory on large files, so even providing the test - # option (-t) to avoid indexing the free space trees doesn't make it pass on - # large filesystems. Avoid it. - if [ "$LARGE_SCRATCH_DEV" != yes ]; then - $XFS_CHECK_PROG $extra_log_options $device 2>&1 |\ - _fix_malloc >$tmp.fs_check - fi - if [ -s $tmp.fs_check ] - then - echo "_check_xfs_filesystem: filesystem on $device is inconsistent (c) (see $seqres.full)" - - echo "_check_xfs_filesystem: filesystem on $device is inconsistent" >>$seqres.full - echo "*** xfs_check output ***" >>$seqres.full - cat $tmp.fs_check >>$seqres.full - echo "*** end xfs_check output" >>$seqres.full - - ok=0 - fi - $XFS_REPAIR_PROG -n $extra_log_options $extra_rt_options $device >$tmp.repair 2>&1 if [ $? -ne 0 ] then diff --git a/crash/xfscrash b/crash/xfscrash index 7831d7e..6437d54 100755 --- a/crash/xfscrash +++ b/crash/xfscrash @@ -119,12 +119,11 @@ _check() if [ $expect -eq 0 ] then - _echo " *** xfs_check ($LOG/check_clean.out)" - xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=1 - [ -s /tmp/xfs_check_clean.out ] && fail=1 + _echo " *** Running xfs_repair -n ($LOG/check_clean.out)" + xfs_repair -n $TEST_DEV &> $LOG/check_clean.out && fail=1 else - _echo " *** xfs_check ($LOG/check_dirty.out)" - xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=1 + _echo " *** Running xfs_repair -n ($LOG/check_dirty.out)" + xfs_repair -n $TEST_DEV &> $LOG/check_dirty.out || fail=1 fi if [ $fail -eq 0 -a $expect -eq 0 ] diff --git a/tests/xfs/017 b/tests/xfs/017 index 9fc16c2..03f907e 100755 --- a/tests/xfs/017 +++ b/tests/xfs/017 @@ -83,7 +83,7 @@ do echo "*** XFS_CHECK ***" >>$seqres.full echo "" >>$seqres.full _scratch_xfs_check >>$seqres.full 2>&1 \ - || _fail "xfs_check failed" + || _fail "xfs check failed" _scratch_mount -o remount,rw \ || _fail "remount rw failed" done diff --git a/tests/xfs/085 b/tests/xfs/085 index 27f29a3..02c6703 100755 --- a/tests/xfs/085 +++ b/tests/xfs/085 @@ -70,7 +70,7 @@ _print_logstate # curious if FS consistent at start if false; then - if $XFS_CHECK_PROG $SCRATCH_DEV; then + if $XFS_REPAIR_PROG -n $SCRATCH_DEV &>/dev/null; then echo "*** checked ok ***" fi fi diff --git a/tests/xfs/291 b/tests/xfs/291 old mode 100644 new mode 100755 index f842679..dc3c342 --- a/tests/xfs/291 +++ b/tests/xfs/291 @@ -111,9 +111,9 @@ for I in `seq 1 2 5000`; do done _scratch_unmount -# Can xfs_repair and xfs_check cope with this monster? +# Can xfs_repair and check cope with this monster? _scratch_xfs_repair >> $seqres.full 2>&1 || _fail "xfs_repair failed" -xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed" +xfs_repair -n $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_repair -n failed" # Yes they can! Now... # Can xfs_metadump cope with this monster? From sekharan@us.ibm.com Wed Apr 17 11:47:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0B9897F4C for ; Wed, 17 Apr 2013 11:47:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E8FA630406A for ; Wed, 17 Apr 2013 09:47:33 -0700 (PDT) X-ASG-Debug-ID: 1366217252-04cbb057f72e6ee0001-NocioJ Received: from e9.ny.us.ibm.com (e9.ny.us.ibm.com [32.97.182.139]) by cuda.sgi.com with ESMTP id m5aAxdgug5BvoSFe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 17 Apr 2013 09:47:33 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.139 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] Received: from /spool/local by e9.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 17 Apr 2013 12:47:32 -0400 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] Received: from d01dlp03.pok.ibm.com (9.56.250.168) by e9.ny.us.ibm.com (192.168.1.109) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 17 Apr 2013 12:47:30 -0400 Received: from d01relay01.pok.ibm.com (d01relay01.pok.ibm.com [9.56.227.233]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id 1B63AC9001D for ; Wed, 17 Apr 2013 12:47:29 -0400 (EDT) Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay01.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3HGlTGK259104 for ; Wed, 17 Apr 2013 12:47:29 -0400 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3HGlSOV010025 for ; Wed, 17 Apr 2013 13:47:28 -0300 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3HGlSa3009978 for ; Wed, 17 Apr 2013 13:47:28 -0300 Subject: [PATCH] xfsprogs: Add depraction message for xfs_check From: Chandra Seetharaman X-ASG-Orig-Subj: [PATCH] xfsprogs: Add depraction message for xfs_check Reply-To: sekharan@us.ibm.com To: XFS mailing list Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Wed, 17 Apr 2013 11:47:24 -0500 Message-ID: <1366217244.3762.32327.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13041716-7182-0000-0000-000006489E0F X-Barracuda-Connect: e9.ny.us.ibm.com[32.97.182.139] X-Barracuda-Start-Time: 1366217253 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add deprecation message for xfs_check and suggest to use xfs_repair -n instead. Signed-off-by: Chandra Seetharaman --- diff --git a/db/xfs_check.sh b/db/xfs_check.sh index c76b540..553da63 100755 --- a/db/xfs_check.sh +++ b/db/xfs_check.sh @@ -7,6 +7,9 @@ OPTS=" " DBOPTS=" " USAGE="Usage: xfs_check [-fsvV] [-l logdev] [-i ino]... [-b bno]... special" +echo "xfs_check is deprecated and scheduled for removal in June 2014." +echo "Please use xfs_repair -n instead." + while getopts "b:fi:l:stvV" c do case $c in diff --git a/man/man8/xfs_check.8 b/man/man8/xfs_check.8 index 620d0fc..1654532 100644 --- a/man/man8/xfs_check.8 +++ b/man/man8/xfs_check.8 @@ -35,11 +35,11 @@ during the execution of .BR xfs_check . Otherwise, spurious problems are reported. .PP -Note that using +Note that .B xfs_check -is NOT recommended. Please use +is deprecated and scheduled for removal in June 2014. Please use .BR xfs_repair " " \-n -instead, for better scalability and speed. +instead. .SH OPTIONS .TP From sandeen@sandeen.net Wed Apr 17 11:58:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 166C87F4C for ; Wed, 17 Apr 2013 11:58:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E08D3304059 for ; Wed, 17 Apr 2013 09:58:14 -0700 (PDT) X-ASG-Debug-ID: 1366217889-04cbb057f72e79c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id HOqm3NH1ecJRyf62 for ; Wed, 17 Apr 2013 09:58:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (unknown [69.38.217.10]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4806B63BCC66; Wed, 17 Apr 2013 11:58:09 -0500 (CDT) Message-ID: <516ED4A0.9040706@sandeen.net> Date: Wed, 17 Apr 2013 09:58:08 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: sekharan@us.ibm.com CC: XFS mailing list Subject: Re: [PATCH] xfstests: replace xfs_check with xfs_repair -n References: <1366216695.3762.32325.camel@chandra-dt.ibm.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: replace xfs_check with xfs_repair -n In-Reply-To: <1366216695.3762.32325.camel@chandra-dt.ibm.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366217889 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128397 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 4/17/13 9:38 AM, Chandra Seetharaman wrote: > Replace the usage of "xfs_check" with "xfs_repair -n" as xfs_check > is planned to be depracated. Hm, I thought the plan was to keep xfs_check around for xfstests use, for now; as Dave said in the earlier thread: > xfstests also still needs to run xfs_check. That means we also need > either an override flag an make $XFS_CHECK_PROG have it set > appropriately or add an internal xfs_db wrapper that runs the > xfs_check functionality appropriately. The second is probably the > better option... but that's not what this patch does... -Eric > Signed-off-by: Chandra Seetharaman > --- > > diff --git a/common/config b/common/config > index bf62996..dfbb5c2 100644 > --- a/common/config > +++ b/common/config > @@ -154,7 +154,6 @@ export DF_PROG="`set_prog_path df`" > > export XFS_LOGPRINT_PROG="`set_prog_path xfs_logprint`" > export XFS_REPAIR_PROG="`set_prog_path xfs_repair`" > -export XFS_CHECK_PROG="`set_prog_path xfs_check`" > export XFS_DB_PROG="`set_prog_path xfs_db`" > export XFS_GROWFS_PROG=`set_prog_path xfs_growfs` > export XFS_IO_PROG="`set_prog_path xfs_io`" > diff --git a/common/rc b/common/rc > index 09fb83f..32a852f 100644 > --- a/common/rc > +++ b/common/rc > @@ -166,7 +166,6 @@ case "$FSTYP" in > xfs) > [ "$XFS_LOGPRINT_PROG" = "" ] && _fatal "xfs_logprint not found" > [ "$XFS_REPAIR_PROG" = "" ] && _fatal "xfs_repair not found" > - [ "$XFS_CHECK_PROG" = "" ] && _fatal "xfs_check not found" > [ "$XFS_DB_PROG" = "" ] && _fatal "xfs_db not found" > [ "$MKFS_XFS_PROG" = "" ] && _fatal "mkfs_xfs not found" > ;; > @@ -589,7 +588,7 @@ _scratch_xfs_check() > SCRATCH_OPTIONS="-l $SCRATCH_LOGDEV" > [ "$LARGE_SCRATCH_DEV" = yes ] && \ > SCRATCH_OPTIONS=$SCRATCH_OPTIONS" -t" > - $XFS_CHECK_PROG $SCRATCH_OPTIONS $* $SCRATCH_DEV > + $XFS_REPAIR_PROG -n $SCRATCH_OPTIONS $* $SCRATCH_DEV &>/dev/null > } > > _scratch_xfs_repair() > @@ -1422,25 +1421,6 @@ _check_xfs_filesystem() > ok=0 > fi > > - # xfs_check runs out of memory on large files, so even providing the test > - # option (-t) to avoid indexing the free space trees doesn't make it pass on > - # large filesystems. Avoid it. > - if [ "$LARGE_SCRATCH_DEV" != yes ]; then > - $XFS_CHECK_PROG $extra_log_options $device 2>&1 |\ > - _fix_malloc >$tmp.fs_check > - fi > - if [ -s $tmp.fs_check ] > - then > - echo "_check_xfs_filesystem: filesystem on $device is inconsistent (c) (see $seqres.full)" > - > - echo "_check_xfs_filesystem: filesystem on $device is inconsistent" >>$seqres.full > - echo "*** xfs_check output ***" >>$seqres.full > - cat $tmp.fs_check >>$seqres.full > - echo "*** end xfs_check output" >>$seqres.full > - > - ok=0 > - fi > - > $XFS_REPAIR_PROG -n $extra_log_options $extra_rt_options $device >$tmp.repair 2>&1 > if [ $? -ne 0 ] > then > diff --git a/crash/xfscrash b/crash/xfscrash > index 7831d7e..6437d54 100755 > --- a/crash/xfscrash > +++ b/crash/xfscrash > @@ -119,12 +119,11 @@ _check() > > if [ $expect -eq 0 ] > then > - _echo " *** xfs_check ($LOG/check_clean.out)" > - xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=1 > - [ -s /tmp/xfs_check_clean.out ] && fail=1 > + _echo " *** Running xfs_repair -n ($LOG/check_clean.out)" > + xfs_repair -n $TEST_DEV &> $LOG/check_clean.out && fail=1 > else > - _echo " *** xfs_check ($LOG/check_dirty.out)" > - xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=1 > + _echo " *** Running xfs_repair -n ($LOG/check_dirty.out)" > + xfs_repair -n $TEST_DEV &> $LOG/check_dirty.out || fail=1 > fi > > if [ $fail -eq 0 -a $expect -eq 0 ] > diff --git a/tests/xfs/017 b/tests/xfs/017 > index 9fc16c2..03f907e 100755 > --- a/tests/xfs/017 > +++ b/tests/xfs/017 > @@ -83,7 +83,7 @@ do > echo "*** XFS_CHECK ***" >>$seqres.full > echo "" >>$seqres.full > _scratch_xfs_check >>$seqres.full 2>&1 \ > - || _fail "xfs_check failed" > + || _fail "xfs check failed" > _scratch_mount -o remount,rw \ > || _fail "remount rw failed" > done > diff --git a/tests/xfs/085 b/tests/xfs/085 > index 27f29a3..02c6703 100755 > --- a/tests/xfs/085 > +++ b/tests/xfs/085 > @@ -70,7 +70,7 @@ _print_logstate > > # curious if FS consistent at start > if false; then > - if $XFS_CHECK_PROG $SCRATCH_DEV; then > + if $XFS_REPAIR_PROG -n $SCRATCH_DEV &>/dev/null; then > echo "*** checked ok ***" > fi > fi > diff --git a/tests/xfs/291 b/tests/xfs/291 > old mode 100644 > new mode 100755 > index f842679..dc3c342 > --- a/tests/xfs/291 > +++ b/tests/xfs/291 > @@ -111,9 +111,9 @@ for I in `seq 1 2 5000`; do > done > > _scratch_unmount > -# Can xfs_repair and xfs_check cope with this monster? > +# Can xfs_repair and check cope with this monster? > _scratch_xfs_repair >> $seqres.full 2>&1 || _fail "xfs_repair failed" > -xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed" > +xfs_repair -n $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_repair -n failed" > > # Yes they can! Now... > # Can xfs_metadump cope with this monster? > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sekharan@us.ibm.com Wed Apr 17 13:03:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2C8407F4C for ; Wed, 17 Apr 2013 13:03:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A155AAC004 for ; Wed, 17 Apr 2013 11:03:41 -0700 (PDT) X-ASG-Debug-ID: 1366221819-04cbb057f52ec360001-NocioJ Received: from e7.ny.us.ibm.com (e7.ny.us.ibm.com [32.97.182.137]) by cuda.sgi.com with ESMTP id AAiG8VCPgSfB4kEi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 17 Apr 2013 11:03:40 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.137 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] Received: from /spool/local by e7.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 17 Apr 2013 14:03:38 -0400 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] Received: from d01dlp03.pok.ibm.com (9.56.250.168) by e7.ny.us.ibm.com (192.168.1.107) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 17 Apr 2013 14:03:35 -0400 Received: from d01relay05.pok.ibm.com (d01relay05.pok.ibm.com [9.56.227.237]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id 9B84DC90081 for ; Wed, 17 Apr 2013 14:03:34 -0400 (EDT) Received: from d03av03.boulder.ibm.com (d03av03.boulder.ibm.com [9.17.195.169]) by d01relay05.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3HI3Xjp335392 for ; Wed, 17 Apr 2013 14:03:34 -0400 Received: from d03av03.boulder.ibm.com (loopback [127.0.0.1]) by d03av03.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3HI3WvP029711 for ; Wed, 17 Apr 2013 12:03:33 -0600 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d03av03.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3HI3USX029568; Wed, 17 Apr 2013 12:03:31 -0600 Subject: Re: [PATCH] xfstests: replace xfs_check with xfs_repair -n From: Chandra Seetharaman X-ASG-Orig-Subj: Re: [PATCH] xfstests: replace xfs_check with xfs_repair -n Reply-To: sekharan@us.ibm.com To: Eric Sandeen Cc: XFS mailing list In-Reply-To: <516ED4A0.9040706@sandeen.net> References: <1366216695.3762.32325.camel@chandra-dt.ibm.com> <516ED4A0.9040706@sandeen.net> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Wed, 17 Apr 2013 13:03:30 -0500 Message-ID: <1366221810.3762.32341.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13041718-5806-0000-0000-000020C4A3A6 X-Barracuda-Connect: e7.ny.us.ibm.com[32.97.182.137] X-Barracuda-Start-Time: 1366221820 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi Eric, Thanks for the quick feedback. On Wed, 2013-04-17 at 09:58 -0700, Eric Sandeen wrote: > On 4/17/13 9:38 AM, Chandra Seetharaman wrote: > > Replace the usage of "xfs_check" with "xfs_repair -n" as xfs_check > > is planned to be depracated. > > Hm, I thought the plan was to keep xfs_check around for xfstests I didn't think the plan was to keep xfs_check, may be I misunderstood. My understanding was that we wanted to deprecate xfs_check, but first we have to make xfstests not use xfs_check. > use, for now; as Dave said in the earlier thread: > > > xfstests also still needs to run xfs_check. That means we also need > > either an override flag an make $XFS_CHECK_PROG have it set > > appropriately or add an internal xfs_db wrapper that runs the > > xfs_check functionality appropriately. The second is probably the > > better option... > > but that's not what this patch does... The usages of xfs_check in xfstests looked simple and straight forward. Besides, I thought we should do what we suggest our users to do :), hence replaced xfs_check with "xfs_repair -n". Does this patch break something or technically incorrect ? Do you think I should instead use xfs_db -F -i -p xfs_check -c "check" Please advise. Chandra > -Eric > > > Signed-off-by: Chandra Seetharaman > > --- > > > > diff --git a/common/config b/common/config > > index bf62996..dfbb5c2 100644 > > --- a/common/config > > +++ b/common/config > > @@ -154,7 +154,6 @@ export DF_PROG="`set_prog_path df`" > > > > export XFS_LOGPRINT_PROG="`set_prog_path xfs_logprint`" > > export XFS_REPAIR_PROG="`set_prog_path xfs_repair`" > > -export XFS_CHECK_PROG="`set_prog_path xfs_check`" > > export XFS_DB_PROG="`set_prog_path xfs_db`" > > export XFS_GROWFS_PROG=`set_prog_path xfs_growfs` > > export XFS_IO_PROG="`set_prog_path xfs_io`" > > diff --git a/common/rc b/common/rc > > index 09fb83f..32a852f 100644 > > --- a/common/rc > > +++ b/common/rc > > @@ -166,7 +166,6 @@ case "$FSTYP" in > > xfs) > > [ "$XFS_LOGPRINT_PROG" = "" ] && _fatal "xfs_logprint not found" > > [ "$XFS_REPAIR_PROG" = "" ] && _fatal "xfs_repair not found" > > - [ "$XFS_CHECK_PROG" = "" ] && _fatal "xfs_check not found" > > [ "$XFS_DB_PROG" = "" ] && _fatal "xfs_db not found" > > [ "$MKFS_XFS_PROG" = "" ] && _fatal "mkfs_xfs not found" > > ;; > > @@ -589,7 +588,7 @@ _scratch_xfs_check() > > SCRATCH_OPTIONS="-l $SCRATCH_LOGDEV" > > [ "$LARGE_SCRATCH_DEV" = yes ] && \ > > SCRATCH_OPTIONS=$SCRATCH_OPTIONS" -t" > > - $XFS_CHECK_PROG $SCRATCH_OPTIONS $* $SCRATCH_DEV > > + $XFS_REPAIR_PROG -n $SCRATCH_OPTIONS $* $SCRATCH_DEV &>/dev/null > > } > > > > _scratch_xfs_repair() > > @@ -1422,25 +1421,6 @@ _check_xfs_filesystem() > > ok=0 > > fi > > > > - # xfs_check runs out of memory on large files, so even providing the test > > - # option (-t) to avoid indexing the free space trees doesn't make it pass on > > - # large filesystems. Avoid it. > > - if [ "$LARGE_SCRATCH_DEV" != yes ]; then > > - $XFS_CHECK_PROG $extra_log_options $device 2>&1 |\ > > - _fix_malloc >$tmp.fs_check > > - fi > > - if [ -s $tmp.fs_check ] > > - then > > - echo "_check_xfs_filesystem: filesystem on $device is inconsistent (c) (see $seqres.full)" > > - > > - echo "_check_xfs_filesystem: filesystem on $device is inconsistent" >>$seqres.full > > - echo "*** xfs_check output ***" >>$seqres.full > > - cat $tmp.fs_check >>$seqres.full > > - echo "*** end xfs_check output" >>$seqres.full > > - > > - ok=0 > > - fi > > - > > $XFS_REPAIR_PROG -n $extra_log_options $extra_rt_options $device >$tmp.repair 2>&1 > > if [ $? -ne 0 ] > > then > > diff --git a/crash/xfscrash b/crash/xfscrash > > index 7831d7e..6437d54 100755 > > --- a/crash/xfscrash > > +++ b/crash/xfscrash > > @@ -119,12 +119,11 @@ _check() > > > > if [ $expect -eq 0 ] > > then > > - _echo " *** xfs_check ($LOG/check_clean.out)" > > - xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=1 > > - [ -s /tmp/xfs_check_clean.out ] && fail=1 > > + _echo " *** Running xfs_repair -n ($LOG/check_clean.out)" > > + xfs_repair -n $TEST_DEV &> $LOG/check_clean.out && fail=1 > > else > > - _echo " *** xfs_check ($LOG/check_dirty.out)" > > - xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=1 > > + _echo " *** Running xfs_repair -n ($LOG/check_dirty.out)" > > + xfs_repair -n $TEST_DEV &> $LOG/check_dirty.out || fail=1 > > fi > > > > if [ $fail -eq 0 -a $expect -eq 0 ] > > diff --git a/tests/xfs/017 b/tests/xfs/017 > > index 9fc16c2..03f907e 100755 > > --- a/tests/xfs/017 > > +++ b/tests/xfs/017 > > @@ -83,7 +83,7 @@ do > > echo "*** XFS_CHECK ***" >>$seqres.full > > echo "" >>$seqres.full > > _scratch_xfs_check >>$seqres.full 2>&1 \ > > - || _fail "xfs_check failed" > > + || _fail "xfs check failed" > > _scratch_mount -o remount,rw \ > > || _fail "remount rw failed" > > done > > diff --git a/tests/xfs/085 b/tests/xfs/085 > > index 27f29a3..02c6703 100755 > > --- a/tests/xfs/085 > > +++ b/tests/xfs/085 > > @@ -70,7 +70,7 @@ _print_logstate > > > > # curious if FS consistent at start > > if false; then > > - if $XFS_CHECK_PROG $SCRATCH_DEV; then > > + if $XFS_REPAIR_PROG -n $SCRATCH_DEV &>/dev/null; then > > echo "*** checked ok ***" > > fi > > fi > > diff --git a/tests/xfs/291 b/tests/xfs/291 > > old mode 100644 > > new mode 100755 > > index f842679..dc3c342 > > --- a/tests/xfs/291 > > +++ b/tests/xfs/291 > > @@ -111,9 +111,9 @@ for I in `seq 1 2 5000`; do > > done > > > > _scratch_unmount > > -# Can xfs_repair and xfs_check cope with this monster? > > +# Can xfs_repair and check cope with this monster? > > _scratch_xfs_repair >> $seqres.full 2>&1 || _fail "xfs_repair failed" > > -xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed" > > +xfs_repair -n $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_repair -n failed" > > > > # Yes they can! Now... > > # Can xfs_metadump cope with this monster? > > > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > From sandeen@sandeen.net Wed Apr 17 13:23:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 38BF67F4E for ; Wed, 17 Apr 2013 13:23:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 226C8304064 for ; Wed, 17 Apr 2013 11:23:31 -0700 (PDT) X-ASG-Debug-ID: 1366223010-04cbb057f82ed7d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id WqT06ggnnAovzL6B for ; Wed, 17 Apr 2013 11:23:30 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (unknown [69.38.217.10]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8CD3263BCC6E; Wed, 17 Apr 2013 13:23:29 -0500 (CDT) Message-ID: <516EE8A1.9070703@sandeen.net> Date: Wed, 17 Apr 2013 11:23:29 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: sekharan@us.ibm.com CC: XFS mailing list Subject: Re: [PATCH] xfstests: replace xfs_check with xfs_repair -n References: <1366216695.3762.32325.camel@chandra-dt.ibm.com> <516ED4A0.9040706@sandeen.net> <1366221810.3762.32341.camel@chandra-dt.ibm.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: replace xfs_check with xfs_repair -n In-Reply-To: <1366221810.3762.32341.camel@chandra-dt.ibm.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366223010 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128403 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 4/17/13 11:03 AM, Chandra Seetharaman wrote: > Hi Eric, > > Thanks for the quick feedback. > > On Wed, 2013-04-17 at 09:58 -0700, Eric Sandeen wrote: >> On 4/17/13 9:38 AM, Chandra Seetharaman wrote: >>> Replace the usage of "xfs_check" with "xfs_repair -n" as xfs_check >>> is planned to be depracated. >> >> Hm, I thought the plan was to keep xfs_check around for xfstests > > I didn't think the plan was to keep xfs_check, may be I misunderstood. > My understanding was that we wanted to deprecate xfs_check, but first we > have to make xfstests not use xfs_check. > >> use, for now; as Dave said in the earlier thread: >> >>> xfstests also still needs to run xfs_check. That means we also need >>> either an override flag an make $XFS_CHECK_PROG have it set >>> appropriately or add an internal xfs_db wrapper that runs the >>> xfs_check functionality appropriately. The second is probably the >>> better option... >> >> but that's not what this patch does... > > The usages of xfs_check in xfstests looked simple and straight forward. > Besides, I thought we should do what we suggest our users to do :), > hence replaced xfs_check with "xfs_repair -n". Dave or others can chime in too, but I think we still want xfs_check (xfs_db) as a verifier against xfs_repair. > Does this patch break something or technically incorrect ? We used to explicitly run both xfs_repair and xfs_check to get two distinct verification passes; the patch removes part of that, so I'd say yes, it does "break" things a little. > Do you think I should instead use > xfs_db -F -i -p xfs_check -c "check" Right, if the xfs_check script itself is going away, I think we still want to invoke "xfs_check" behavior one way or another in xfstests to keep current xfs verification levels for now. Thanks, -Eric > Please advise. From sekharan@us.ibm.com Wed Apr 17 13:33:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 370A97F50 for ; Wed, 17 Apr 2013 13:33:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A63B7AC008 for ; Wed, 17 Apr 2013 11:33:03 -0700 (PDT) X-ASG-Debug-ID: 1366223582-04cbb057f82ee1c0001-NocioJ Received: from e37.co.us.ibm.com (e37.co.us.ibm.com [32.97.110.158]) by cuda.sgi.com with ESMTP id kj9aIKM5JaBAiee7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 17 Apr 2013 11:33:02 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.110.158 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] Received: from /spool/local by e37.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 17 Apr 2013 12:33:01 -0600 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] Received: from d03dlp01.boulder.ibm.com (9.17.202.177) by e37.co.us.ibm.com (192.168.1.137) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 17 Apr 2013 12:32:59 -0600 Received: from d03relay01.boulder.ibm.com (d03relay01.boulder.ibm.com [9.17.195.226]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id 8340E1FF0039 for ; Wed, 17 Apr 2013 12:27:56 -0600 (MDT) Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay01.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3HIWusA123356 for ; Wed, 17 Apr 2013 12:32:56 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3HIWuRq019231 for ; Wed, 17 Apr 2013 12:32:56 -0600 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3HIWocN018809; Wed, 17 Apr 2013 12:32:51 -0600 Subject: Re: [PATCH] xfstests: replace xfs_check with xfs_repair -n From: Chandra Seetharaman X-ASG-Orig-Subj: Re: [PATCH] xfstests: replace xfs_check with xfs_repair -n Reply-To: sekharan@us.ibm.com To: Eric Sandeen Cc: XFS mailing list In-Reply-To: <516EE8A1.9070703@sandeen.net> References: <1366216695.3762.32325.camel@chandra-dt.ibm.com> <516ED4A0.9040706@sandeen.net> <1366221810.3762.32341.camel@chandra-dt.ibm.com> <516EE8A1.9070703@sandeen.net> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Wed, 17 Apr 2013 13:32:48 -0500 Message-ID: <1366223568.3762.32343.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13041718-7408-0000-0000-00000F0D2863 X-Barracuda-Connect: e37.co.us.ibm.com[32.97.110.158] X-Barracuda-Start-Time: 1366223582 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, 2013-04-17 at 11:23 -0700, Eric Sandeen wrote: > On 4/17/13 11:03 AM, Chandra Seetharaman wrote: > > Hi Eric, > > > > Thanks for the quick feedback. > > > > On Wed, 2013-04-17 at 09:58 -0700, Eric Sandeen wrote: > >> On 4/17/13 9:38 AM, Chandra Seetharaman wrote: > >>> Replace the usage of "xfs_check" with "xfs_repair -n" as xfs_check > >>> is planned to be depracated. > >> > >> Hm, I thought the plan was to keep xfs_check around for xfstests > > > > I didn't think the plan was to keep xfs_check, may be I misunderstood. > > My understanding was that we wanted to deprecate xfs_check, but first we > > have to make xfstests not use xfs_check. > > > >> use, for now; as Dave said in the earlier thread: > >> > >>> xfstests also still needs to run xfs_check. That means we also need > >>> either an override flag an make $XFS_CHECK_PROG have it set > >>> appropriately or add an internal xfs_db wrapper that runs the > >>> xfs_check functionality appropriately. The second is probably the > >>> better option... > >> > >> but that's not what this patch does... > > > > The usages of xfs_check in xfstests looked simple and straight forward. > > Besides, I thought we should do what we suggest our users to do :), > > hence replaced xfs_check with "xfs_repair -n". > > Dave or others can chime in too, but I think we still want xfs_check > (xfs_db) as a verifier against xfs_repair. > > > Does this patch break something or technically incorrect ? > > We used to explicitly run both xfs_repair and xfs_check to get two > distinct verification passes; the patch removes part of that, so I'd > say yes, it does "break" things a little. > > > Do you think I should instead use > > xfs_db -F -i -p xfs_check -c "check" > > Right, if the xfs_check script itself is going away, I think we still > want to invoke "xfs_check" behavior one way or another in xfstests to > keep current xfs verification levels for now. It is clear now. will make appropriate changes and resubmit. > > Thanks, > -Eric > > > Please advise. > > > > From sekharan@us.ibm.com Wed Apr 17 14:17:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4244F7F4C for ; Wed, 17 Apr 2013 14:17:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2DE7E8F8035 for ; Wed, 17 Apr 2013 12:17:36 -0700 (PDT) X-ASG-Debug-ID: 1366226255-04cbb057f72f12e0001-NocioJ Received: from e8.ny.us.ibm.com (e8.ny.us.ibm.com [32.97.182.138]) by cuda.sgi.com with ESMTP id m44OkdWOPuw2Y3qI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 17 Apr 2013 12:17:35 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.138 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] Received: from /spool/local by e8.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 17 Apr 2013 15:17:33 -0400 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] Received: from d01dlp03.pok.ibm.com (9.56.250.168) by e8.ny.us.ibm.com (192.168.1.108) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 17 Apr 2013 15:17:29 -0400 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id B6A22C90029 for ; Wed, 17 Apr 2013 15:17:28 -0400 (EDT) Received: from d03av06.boulder.ibm.com (d03av06.boulder.ibm.com [9.17.195.245]) by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3HJHSdw304984 for ; Wed, 17 Apr 2013 15:17:28 -0400 Received: from d03av06.boulder.ibm.com (loopback [127.0.0.1]) by d03av06.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3HJKEHf027716 for ; Wed, 17 Apr 2013 13:20:14 -0600 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d03av06.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3HJKEMv027660 for ; Wed, 17 Apr 2013 13:20:14 -0600 Subject: [PATCH] xfstests: Remove dependence of xfs_check script From: Chandra Seetharaman X-ASG-Orig-Subj: [PATCH] xfstests: Remove dependence of xfs_check script Reply-To: sekharan@us.ibm.com To: XFS mailing list Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Wed, 17 Apr 2013 14:17:24 -0500 Message-ID: <1366226244.3762.32346.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13041719-9360-0000-0000-000011C8A18E X-Barracuda-Connect: e8.ny.us.ibm.com[32.97.182.138] X-Barracuda-Start-Time: 1366226255 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Replace the usage of the script xfs_check and add the relevant code to xfstests. This is in preparation of the planned deprecation of xfs_check. Signed-off-by: Chandra Seetharaman --- diff --git a/common/config b/common/config index bf62996..dfbb5c2 100644 --- a/common/config +++ b/common/config @@ -154,7 +154,6 @@ export DF_PROG="`set_prog_path df`" export XFS_LOGPRINT_PROG="`set_prog_path xfs_logprint`" export XFS_REPAIR_PROG="`set_prog_path xfs_repair`" -export XFS_CHECK_PROG="`set_prog_path xfs_check`" export XFS_DB_PROG="`set_prog_path xfs_db`" export XFS_GROWFS_PROG=`set_prog_path xfs_growfs` export XFS_IO_PROG="`set_prog_path xfs_io`" diff --git a/common/rc b/common/rc index 09fb83f..9cea3f9 100644 --- a/common/rc +++ b/common/rc @@ -166,7 +166,6 @@ case "$FSTYP" in xfs) [ "$XFS_LOGPRINT_PROG" = "" ] && _fatal "xfs_logprint not found" [ "$XFS_REPAIR_PROG" = "" ] && _fatal "xfs_repair not found" - [ "$XFS_CHECK_PROG" = "" ] && _fatal "xfs_check not found" [ "$XFS_DB_PROG" = "" ] && _fatal "xfs_db not found" [ "$MKFS_XFS_PROG" = "" ] && _fatal "mkfs_xfs not found" ;; @@ -387,6 +386,31 @@ _scratch_mkfs_xfs() return $mkfs_status } +_xfs_check() +{ + OPTS=" " + DBOPTS=" " + + OPTIND=1 + while getopts "b:fi:l:stvV" c + do + case $c in + s) OPTS=$OPTS"-s ";; + t) OPTS=$OPTS"-t ";; + v) OPTS=$OPTS"-v ";; + i) OPTS=$OPTS"-i "$OPTARG" ";; + b) OPTS=$OPTS"-b "$OPTARG" ";; + f) DBOPTS=$DBOPTS" -f";; + l) DBOPTS=$DBOPTS" -l "$OPTARG" ";; + V) $XFS_DB_PROG -p xfs_check -V + return $? + ;; + esac + done + ${XFS_DB_PROG}${DBOPTS} -F -i -p xfs_check -c "check$OPTS" $1 + return $? +} + _setup_large_ext4_fs() { fs_size=$1 @@ -589,7 +613,7 @@ _scratch_xfs_check() SCRATCH_OPTIONS="-l $SCRATCH_LOGDEV" [ "$LARGE_SCRATCH_DEV" = yes ] && \ SCRATCH_OPTIONS=$SCRATCH_OPTIONS" -t" - $XFS_CHECK_PROG $SCRATCH_OPTIONS $* $SCRATCH_DEV + _xfs_check $SCRATCH_OPTIONS $* $SCRATCH_DEV } _scratch_xfs_repair() @@ -1426,7 +1450,7 @@ _check_xfs_filesystem() # option (-t) to avoid indexing the free space trees doesn't make it pass on # large filesystems. Avoid it. if [ "$LARGE_SCRATCH_DEV" != yes ]; then - $XFS_CHECK_PROG $extra_log_options $device 2>&1 |\ + _xfs_check $extra_log_options $device 2>&1 |\ _fix_malloc >$tmp.fs_check fi if [ -s $tmp.fs_check ] diff --git a/crash/xfscrash b/crash/xfscrash index 7831d7e..579b724 100755 --- a/crash/xfscrash +++ b/crash/xfscrash @@ -120,11 +120,11 @@ _check() if [ $expect -eq 0 ] then _echo " *** xfs_check ($LOG/check_clean.out)" - xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=1 + _xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=1 [ -s /tmp/xfs_check_clean.out ] && fail=1 else _echo " *** xfs_check ($LOG/check_dirty.out)" - xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=1 + _xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=1 fi if [ $fail -eq 0 -a $expect -eq 0 ] diff --git a/tests/xfs/085 b/tests/xfs/085 index 27f29a3..af71b77 100755 --- a/tests/xfs/085 +++ b/tests/xfs/085 @@ -70,7 +70,7 @@ _print_logstate # curious if FS consistent at start if false; then - if $XFS_CHECK_PROG $SCRATCH_DEV; then + if _xfs_check $SCRATCH_DEV; then echo "*** checked ok ***" fi fi diff --git a/tests/xfs/291 b/tests/xfs/291 old mode 100644 new mode 100755 index f842679..7723b9e --- a/tests/xfs/291 +++ b/tests/xfs/291 @@ -113,7 +113,7 @@ done _scratch_unmount # Can xfs_repair and xfs_check cope with this monster? _scratch_xfs_repair >> $seqres.full 2>&1 || _fail "xfs_repair failed" -xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed" +_xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed" # Yes they can! Now... # Can xfs_metadump cope with this monster? From institutik@integra.com.mx Wed Apr 17 14:56:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C1B767F4E for ; Wed, 17 Apr 2013 14:56:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 90BC430406A for ; Wed, 17 Apr 2013 12:56:42 -0700 (PDT) X-ASG-Debug-ID: 1366228597-04bdf01d63ea570001-NocioJ Received: from firmasite.ru (firmasite.ru [185.12.92.141]) by cuda.sgi.com with ESMTP id 5N9qqYbKxEH2TvVm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 17 Apr 2013 12:56:39 -0700 (PDT) X-Barracuda-Envelope-From: institutik@integra.com.mx X-Barracuda-Apparent-Source-IP: 185.12.92.141 Received: from Unknown ([59.60.7.146]) (authenticated bits=0) by firmasite.ru (8.14.4/8.14.5) with ESMTP id r3HJtlRa055235; Wed, 17 Apr 2013 23:55:57 +0400 (MSK) (envelope-from institutik@integra.com.mx) Message-ID: <4BE75AD4B1644D4F89D616958C93C905@uvmyx> Reply-To: =?windows-1251?B?yu7t9OXw5e326P8g7+4g8e7i8OXs5e3t7uzz?= =?windows-1251?B?IOzg8Orl8ujt4/M=?= From: =?windows-1251?B?yu7t9OXw5e326P8g7+4g8e7i8OXs5e3t7uzz?= =?windows-1251?B?IOzg8Orl8ujt4/M=?= To: , , , , <9256993@gmail.com> Subject: =?windows-1251?B?zODw6uXy6O3j7uL75SDq7uzs8+3o6uD26Og=?= Date: Wed, 17 Apr 2013 21:56:09 +0200 X-ASG-Orig-Subj: =?windows-1251?B?zODw6uXy6O3j7uL75SDq7uzs8+3o6uD26Og=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_03D6_01CE3BB6.5E864EB0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3505.912 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3505.912 X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.6 (firmasite.ru [185.12.92.141]); Wed, 17 Apr 2013 23:56:02 +0400 (MSK) X-Barracuda-Connect: firmasite.ru[185.12.92.141] X-Barracuda-Start-Time: 1366228599 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128409 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_03D6_01CE3BB6.5E864EB0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D3=E2=E0=E6=E0=E5=EC=FB=E5 =EA=EE=EB=EB=E5=E3=E8! =C0=EA=F2=F3=E0=EB=FC=ED=E0=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF =EE=F2 =E2=E5= =E4=F3=F9=E8=F5 =FD=EA=F1=EF=E5=F0=F2=EE=E2 =E2 =EE=E1=EB=E0=F1=F2=E8 =EC= =E0=F0=EA=E5=F2=E8=ED=E3=E0: 22 - 2=E7 =EC=E0=FF 2013 =E3=EE=E4=E0, =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1= =F3=F0=E3 -------------------------------------------- =D1=CE=C2=D0=C5=CC=C5=CD=CD=DB=C9 =CE=D2=C4=C5=CB =CC=C0=D0=CA=C5=D2=C8=CD= =C3=C0. Event-=EC=E5=ED=E5=E4=E6=EC=E5=ED=F2, PR =E8 =C8=ED=F2=E5=F0=ED=E5=F2-=EF= =F0=EE=E4=E2=E8=E6=E5=ED=E8=E5. -------------------------------------------- =CF=EE=E4=F0=EE=E1=ED=E0=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF =EE =E2=E5=E4=F3= =F9=E8=F5, =EE =EA=EE=ED=F4=E5=F0=E5=ED=F6=E8=E8 =E2=FB=F1=FB=EB=E0=E5=F2= =F1=FF =C2=E0=EC =EF=EE =E7=E0=EF=F0=EE=F1=F3.=20 =CE=E1=F0=E0=F9=E0=E9=F2=E5=F1=FC =EA =ED=E0=F8=E8=EC =EC=E5=ED=E5=E4=E6=E5= =F0=E0=EC: =F2=E5=EB.: +7 * 8l2 * 64_2 -- 92 _ 8_4 =20 =CA=F0=E0=F2=EA=EE ------ 1. =CE=F1=ED=EE=E2=ED=FB=E5 =E2=E8=E4=FB =EC=E0=F0=EA=E5=F2=E8=ED=E3=EE=E2= =FB=F5 =EA=EE=EC=EC=F3=ED=E8=EA=E0=F6=E8=E9 =ED=E0 =C22=C2 =F0=FB=ED=EA=E5= . =CE=F6=E5=ED=EA=E0 =FD=F4=F4=E5=EA=F2=E8=E2=ED=EE=F1=F2=E8 =EA=E0=ED=E0= =EB=EE=E2. 2. =CF=EE=ED=FF=F2=E8=E5 =E8 =EF=F0=E5=E8=EC=F3=F9=E5=F1=F2=E2=E0 =E8=ED=F2= =E5=E3=F0=E0=F6=E8=E8 =EA=EE=EC=EC=F3=ED=E8=EA=E0=F6=E8=E9. 3. =CA=EE=EC=EC=F3=ED=E8=EA=E0=F6=E8=E8 - =EA=E0=EA =EC=E0=ED=E8=EF=F3=EB= =FF=F6=E8=FF =F1=EE=E7=ED=E0=ED=E8=E5=EC =EA=EE=F0=EF=EE=F0=E0=F2=E8=E2=ED= =EE=E3=EE =EA=EB=E8=E5=ED=F2=E0. 4. =CD=E5=F1=F2=E0=ED=E4=E0=F0=F2=ED=FB=E9 =EF=EE=E4=F5=EE=E4 =E2 =EF=F0=EE= =E4=E2=E8=E6=E5=ED=E8=E8 =EA=EE=EC=EF=E0=ED=E8=E8 =ED=E0 =EA=EE=F0=EF=EE=F0= =E0=F2=E8=E2=ED=EE=EC =F0=FB=ED=EA=E5. =C2=EE=E7=EC=EE=E6=E5=ED =EB=E8? =C5= =F1=EB=E8 =E2=EE=E7=EC=EE=E6=E5=ED, =F2=EE =EA=E0=EA? 5. Event-=EC=E5=ED=E5=E4=E6=EC=E5=ED=F2, =D1=EE=E1=FB=F2=E8=E9=ED=FB=E9 P= R: =CC=E0=EA=F1=E8=EC=E0=EB=FC=ED=FB=E9 =FD=F4=F4=E5=EA=F2 =E4=EB=FF =EA=EE= =EC=EF=E0=ED=E8=E8. =20 6. =D0=E0=E1=EE=F2=E0 =F1=EE =D1=CC=C8. =CE=F0=E3=E0=ED=E8=E7=E0=F6=E8=FF= =EA=EE=F0=EF=EE=F0=E0=F2=E8=E2=ED=FB=F5, =E3=EE=F0=EE=E4=F1=EA=E8=F5, =F0= =E5=E3=E8=EE=ED=E0=EB=FC=ED=FB=F5 =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E9 =E4=EB= =FF VIP-=EF=E0=F0=F2=ED=E5=F0=EE=E2.=20 7. PR =EF=E5=F0=E2=EE=E3=EE =EB=E8=F6=E0 =EA=EE=EC=EF=E0=ED=E8=E8.=20 8. =D1=EF=E5=F6=E8=F4=E8=EA=E0 =E8 =F2=F0=F3=E4=ED=EE=F1=F2=E8 =F0=E0=E1=EE= =F2=FB =EA=EE=EC=EF=E0=ED=E8=E9 B2B =F1=F4=E5=F0=FB =E2 =E8=ED=F2=E5=F0=ED= =E5=F2. 9. =D1=E0=E9=F2, =E2=E5=E1=E8=ED=E0=F0, E-mail =EC=E0=F0=EA=E5=F2=E8=ED=E3= . =CA=E0=EA =F3=E2=E5=EB=E8=F7=E8=F2=FC =EA=EE=EB=E8=F7=E5=F1=F2=E2=EE =EE= =F2=EA=F0=FB=E2=E0=E5=EC=FB=F5 =EF=E8=F1=E5=EC. 10. =D2=F0=E5=ED=E4=FB =E8 =F0=E0=E7=E2=E8=F2=E8=E5 =EC=E0=F0=EA=E5=F2=E8= =ED=E3=E0 =E2 2OI=E7 =E3. =D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC, =CF=E8=EC=E5=ED=EE=E2=E0 =C8=ED=ED=E0 =C2=EB=E0=E4=E8=EC=E8=F0=EE=E2=ED=E0 =EC=E5=ED=E5=E4=E6=E5=F0 =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE=E3=EE =F6= =E5=ED=F2=F0=E0 =EE=E1=F3=F7=E5=ED=E8=FF =F2=E5=EB.: * 8l2 * 64_2 -- 92 _ 8_4 =20 ------=_NextPart_000_03D6_01CE3BB6.5E864EB0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable


--
=B7=FB=D3=C0= =CC=CE
=D3=E2=E0=E6=E0=E5=EC=FB=E5 =EA=EE=EB=EB=E5=E3=E8!
 
=C0=EA=F2=F3=E0=EB=FC=ED=E0=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF =EE=F2= =E2=E5=E4=F3=F9=E8=F5 =FD=EA=F1=EF=E5=F0=F2=EE=E2 =E2 =EE=E1=EB=E0=F1=F2= =E8 =EC=E0=F0=EA=E5=F2=E8=ED=E3=E0:
 
22 - 2=E7 =EC=E0=FF=20 2013 =E3=EE=E4=E0,=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
--------------------------= ------------------
=D1=CE=C2=D0=C5=CC=C5=CD=CD=DB=C9=20 =CE=D2=C4=C5=CB =CC=C0=D0=CA=C5=D2=C8=CD=C3=C0.
Event-=EC=E5=ED=E5=E4=E6= =EC=E5=ED=F2, PR =E8 =C8=ED=F2=E5=F0=ED=E5=F2-=EF=F0=EE=E4=E2=E8=E6=E5=ED= =E8=E5.
 
--------------------------------------------
 
=CF=EE=E4=F0=EE=E1=ED=E0=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF =EE =E2=E5= =E4=F3=F9=E8=F5, =EE =EA=EE=ED=F4=E5=F0=E5=ED=F6=E8=E8 =E2=FB=F1=FB=EB=E0= =E5=F2=F1=FF =C2=E0=EC =EF=EE =E7=E0=EF=F0=EE=F1=F3.=20
=CE=E1=F0=E0=F9=E0=E9=F2=E5=F1=FC =EA =ED=E0=F8=E8=EC =EC=E5=ED=E5=E4= =E6=E5=F0=E0=EC:
 
=F2=E5=EB.: +7 * 8l2 * 64_2 -- 92 _ 8_4=

=CA=F0=E0=F2=EA=EE
------
1. =CE=F1=ED=EE=E2=ED=FB=E5 =E2=E8= =E4=FB =EC=E0=F0=EA=E5=F2=E8=ED=E3=EE=E2=FB=F5 =EA=EE=EC=EC=F3=ED=E8=EA=E0= =F6=E8=E9 =ED=E0 =C22=C2=20 =F0=FB=ED=EA=E5. =CE=F6=E5=ED=EA=E0 =FD=F4=F4=E5=EA=F2=E8=E2=ED=EE=F1=F2=E8= =EA=E0=ED=E0=EB=EE=E2.
 
2. =CF=EE=ED=FF=F2=E8=E5 =E8 =EF=F0=E5=E8=EC=F3=F9=E5=F1=F2=E2=E0 =E8= =ED=F2=E5=E3=F0=E0=F6=E8=E8 =EA=EE=EC=EC=F3=ED=E8=EA=E0=F6=E8=E9.
 
3. =CA=EE=EC=EC=F3=ED=E8=EA=E0=F6=E8=E8 - =EA=E0=EA =EC=E0=ED=E8=EF=F3= =EB=FF=F6=E8=FF =F1=EE=E7=ED=E0=ED=E8=E5=EC =EA=EE=F0=EF=EE=F0=E0=F2=E8=E2= =ED=EE=E3=EE =EA=EB=E8=E5=ED=F2=E0.
 
4. =CD=E5=F1=F2=E0=ED=E4=E0=F0=F2=ED=FB=E9 =EF=EE=E4=F5=EE=E4 =E2 =EF= =F0=EE=E4=E2=E8=E6=E5=ED=E8=E8 =EA=EE=EC=EF=E0=ED=E8=E8 =ED=E0 =EA=EE=F0=EF= =EE=F0=E0=F2=E8=E2=ED=EE=EC =F0=FB=ED=EA=E5.=20 =C2=EE=E7=EC=EE=E6=E5=ED =EB=E8? =C5=F1=EB=E8 =E2=EE=E7=EC=EE=E6=E5=ED, =F2= =EE =EA=E0=EA?
 
5. Event-=EC=E5=ED=E5=E4=E6=EC=E5=ED=F2, =D1=EE=E1=FB=F2=E8=E9=ED=FB= =E9 PR: =CC=E0=EA=F1=E8=EC=E0=EB=FC=ED=FB=E9 =FD=F4=F4=E5=EA=F2 =E4=EB=FF= =EA=EE=EC=EF=E0=ED=E8=E8. =20
 
6. =D0=E0=E1=EE=F2=E0 =F1=EE =D1=CC=C8. =CE=F0=E3=E0=ED=E8=E7=E0=F6=E8= =FF =EA=EE=F0=EF=EE=F0=E0=F2=E8=E2=ED=FB=F5, =E3=EE=F0=EE=E4=F1=EA=E8=F5,= =F0=E5=E3=E8=EE=ED=E0=EB=FC=ED=FB=F5=20 =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E9 =E4=EB=FF VIP-=EF=E0=F0=F2=ED=E5=F0=EE=E2= .
 
7. PR =EF=E5=F0=E2=EE=E3=EE =EB=E8=F6=E0 =EA=EE=EC=EF=E0=ED=E8=E8. <= /DIV>
 
8. =D1=EF=E5=F6=E8=F4=E8=EA=E0 =E8 =F2=F0=F3=E4=ED=EE=F1=F2=E8 =F0=E0= =E1=EE=F2=FB =EA=EE=EC=EF=E0=ED=E8=E9 B2B =F1=F4=E5=F0=FB =E2 =E8=ED=F2=E5= =F0=ED=E5=F2.
 
9. =D1=E0=E9=F2, =E2=E5=E1=E8=ED=E0=F0, E-mail =EC=E0=F0=EA=E5=F2=E8= =ED=E3. =CA=E0=EA =F3=E2=E5=EB=E8=F7=E8=F2=FC =EA=EE=EB=E8=F7=E5=F1=F2=E2= =EE =EE=F2=EA=F0=FB=E2=E0=E5=EC=FB=F5=20 =EF=E8=F1=E5=EC.
 
10. =D2=F0=E5=ED=E4=FB =E8 =F0=E0=E7=E2=E8=F2=E8=E5 =EC=E0=F0=EA=E5=F2= =E8=ED=E3=E0 =E2=20 2OI=E7 =E3.
 

=D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC,
 
=CF=E8=EC=E5=ED=EE=E2=E0 =C8=ED=ED=E0 =C2=EB=E0=E4=E8=EC=E8=F0=EE=E2= =ED=E0
=EC=E5=ED=E5=E4=E6=E5=F0 =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE= =E3=EE =F6=E5=ED=F2=F0=E0=20 =EE=E1=F3=F7=E5=ED=E8=FF
=F2=E5=EB.: * 8l2 * 64_2 = -- 92 _ 8_4
------=_NextPart_000_03D6_01CE3BB6.5E864EB0-- From sandeen@sandeen.net Wed Apr 17 16:34:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 560467F4C for ; Wed, 17 Apr 2013 16:34:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4510D304053 for ; Wed, 17 Apr 2013 14:34:35 -0700 (PDT) X-ASG-Debug-ID: 1366234470-04cb6c6e2b1e7860001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id F1SH5AjMrtNV4WEE for ; Wed, 17 Apr 2013 14:34:30 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (unknown [69.38.217.10]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4383963BCC64; Wed, 17 Apr 2013 16:34:30 -0500 (CDT) Message-ID: <516F1563.4000909@sandeen.net> Date: Wed, 17 Apr 2013 14:34:27 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: sekharan@us.ibm.com CC: XFS mailing list Subject: Re: [PATCH] xfstests: Remove dependence of xfs_check script References: <1366226244.3762.32346.camel@chandra-dt.ibm.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: Remove dependence of xfs_check script In-Reply-To: <1366226244.3762.32346.camel@chandra-dt.ibm.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366234470 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128415 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 4/17/13 12:17 PM, Chandra Seetharaman wrote: > Replace the usage of the script xfs_check and add the relevant code to > xfstests. > > This is in preparation of the planned deprecation of xfs_check. Other than maybe having a comment about why _xfs_check() is embedded in common/rc for future readers, this looks fine to me, thanks. Reviewed-by: Eric Sandeen > Signed-off-by: Chandra Seetharaman > --- > diff --git a/common/config b/common/config > index bf62996..dfbb5c2 100644 > --- a/common/config > +++ b/common/config > @@ -154,7 +154,6 @@ export DF_PROG="`set_prog_path df`" > > export XFS_LOGPRINT_PROG="`set_prog_path xfs_logprint`" > export XFS_REPAIR_PROG="`set_prog_path xfs_repair`" > -export XFS_CHECK_PROG="`set_prog_path xfs_check`" > export XFS_DB_PROG="`set_prog_path xfs_db`" > export XFS_GROWFS_PROG=`set_prog_path xfs_growfs` > export XFS_IO_PROG="`set_prog_path xfs_io`" > diff --git a/common/rc b/common/rc > index 09fb83f..9cea3f9 100644 > --- a/common/rc > +++ b/common/rc > @@ -166,7 +166,6 @@ case "$FSTYP" in > xfs) > [ "$XFS_LOGPRINT_PROG" = "" ] && _fatal "xfs_logprint not found" > [ "$XFS_REPAIR_PROG" = "" ] && _fatal "xfs_repair not found" > - [ "$XFS_CHECK_PROG" = "" ] && _fatal "xfs_check not found" > [ "$XFS_DB_PROG" = "" ] && _fatal "xfs_db not found" > [ "$MKFS_XFS_PROG" = "" ] && _fatal "mkfs_xfs not found" > ;; > @@ -387,6 +386,31 @@ _scratch_mkfs_xfs() > return $mkfs_status > } > > +_xfs_check() > +{ > + OPTS=" " > + DBOPTS=" " > + > + OPTIND=1 > + while getopts "b:fi:l:stvV" c > + do > + case $c in > + s) OPTS=$OPTS"-s ";; > + t) OPTS=$OPTS"-t ";; > + v) OPTS=$OPTS"-v ";; > + i) OPTS=$OPTS"-i "$OPTARG" ";; > + b) OPTS=$OPTS"-b "$OPTARG" ";; > + f) DBOPTS=$DBOPTS" -f";; > + l) DBOPTS=$DBOPTS" -l "$OPTARG" ";; > + V) $XFS_DB_PROG -p xfs_check -V > + return $? > + ;; > + esac > + done > + ${XFS_DB_PROG}${DBOPTS} -F -i -p xfs_check -c "check$OPTS" $1 > + return $? > +} > + > _setup_large_ext4_fs() > { > fs_size=$1 > @@ -589,7 +613,7 @@ _scratch_xfs_check() > SCRATCH_OPTIONS="-l $SCRATCH_LOGDEV" > [ "$LARGE_SCRATCH_DEV" = yes ] && \ > SCRATCH_OPTIONS=$SCRATCH_OPTIONS" -t" > - $XFS_CHECK_PROG $SCRATCH_OPTIONS $* $SCRATCH_DEV > + _xfs_check $SCRATCH_OPTIONS $* $SCRATCH_DEV > } > > _scratch_xfs_repair() > @@ -1426,7 +1450,7 @@ _check_xfs_filesystem() > # option (-t) to avoid indexing the free space trees doesn't make it pass on > # large filesystems. Avoid it. > if [ "$LARGE_SCRATCH_DEV" != yes ]; then > - $XFS_CHECK_PROG $extra_log_options $device 2>&1 |\ > + _xfs_check $extra_log_options $device 2>&1 |\ > _fix_malloc >$tmp.fs_check > fi > if [ -s $tmp.fs_check ] > diff --git a/crash/xfscrash b/crash/xfscrash > index 7831d7e..579b724 100755 > --- a/crash/xfscrash > +++ b/crash/xfscrash > @@ -120,11 +120,11 @@ _check() > if [ $expect -eq 0 ] > then > _echo " *** xfs_check ($LOG/check_clean.out)" > - xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=1 > + _xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=1 > [ -s /tmp/xfs_check_clean.out ] && fail=1 > else > _echo " *** xfs_check ($LOG/check_dirty.out)" > - xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=1 > + _xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=1 > fi > > if [ $fail -eq 0 -a $expect -eq 0 ] > diff --git a/tests/xfs/085 b/tests/xfs/085 > index 27f29a3..af71b77 100755 > --- a/tests/xfs/085 > +++ b/tests/xfs/085 > @@ -70,7 +70,7 @@ _print_logstate > > # curious if FS consistent at start > if false; then > - if $XFS_CHECK_PROG $SCRATCH_DEV; then > + if _xfs_check $SCRATCH_DEV; then > echo "*** checked ok ***" > fi > fi > diff --git a/tests/xfs/291 b/tests/xfs/291 > old mode 100644 > new mode 100755 > index f842679..7723b9e > --- a/tests/xfs/291 > +++ b/tests/xfs/291 > @@ -113,7 +113,7 @@ done > _scratch_unmount > # Can xfs_repair and xfs_check cope with this monster? > _scratch_xfs_repair >> $seqres.full 2>&1 || _fail "xfs_repair failed" > -xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed" > +_xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed" > > # Yes they can! Now... > # Can xfs_metadump cope with this monster? > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From debbugs@buxtehude.debian.org Wed Apr 17 18:42:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 BE69A7F4C for ; Wed, 17 Apr 2013 18:42:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9DEE7304032 for ; Wed, 17 Apr 2013 16:42:07 -0700 (PDT) X-ASG-Debug-ID: 1366242125-04cbb057f53020c0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id M9HlJOjhK26AuJBq (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 17 Apr 2013 16:42:06 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.80) (envelope-from ) id 1USbzI-0008MW-MY; Wed, 17 Apr 2013 23:42:04 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#695640: xfs_quota: cannot find mount point for path: Success Reply-To: Brian May , 695640@bugs.debian.org X-ASG-Orig-Subj: Bug#695640: xfs_quota: cannot find mount point for path: Success Resent-From: Brian May Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Wed, 17 Apr 2013 23:42:02 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 695640 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by 695640-submit@bugs.debian.org id=B695640.136624189830432 (code B ref 695640); Wed, 17 Apr 2013 23:42:02 +0000 Received: (at 695640) by bugs.debian.org; 17 Apr 2013 23:38:18 +0000 Received: from mail-ob0-f173.google.com ([209.85.214.173]) by buxtehude.debian.org with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:128) (Exim 4.80) (envelope-from ) id 1USbve-0007uV-9P for 695640@bugs.debian.org; Wed, 17 Apr 2013 23:38:18 +0000 Received: by mail-ob0-f173.google.com with SMTP id wn14so2000131obc.32 for <695640@bugs.debian.org>; Wed, 17 Apr 2013 16:38:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microcomaustralia.com.au; s=google; h=mime-version:x-received:x-originating-ip:in-reply-to:references :date:message-id:subject:from:to:cc:content-type; bh=N9AAX450zvDKFMG9w8LHrXstLa1KwW+rpptLVYMj3MI=; b=F9KB5pCgKsm9ZhBD/TOy0JMy6WwcKd4ZRTPB9jWOaoLvU3ohC1+HPsISqDiYuFwYdO 2QQry+4D0WoK6MGqVerIXkUbX2eIrJM9pxghundpX+aYuOieYiAVyLaXH2XLA3VvbcUB oBWYJvxD6PxC8yyOPsfqkrfYR0lljpKmTazvY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:x-received:x-originating-ip:in-reply-to:references :date:message-id:subject:from:to:cc:content-type:x-gm-message-state; bh=N9AAX450zvDKFMG9w8LHrXstLa1KwW+rpptLVYMj3MI=; b=WiX9LQofJlxnG5NBed8AH3tqn3sVA3eDV9Biz1xHWNwFqF/hY5EdiyIBlTWfZmC+xV 8MZeuk/HtXs+rDMt8Oy4+w+EDf15S4GZ5BSYxuy5Qhwbj5YRQf5a5dVPjtbaW8t33uZU EWguevU6r/U2owNTQMX1wSK/Yw/NYxCXjerrkmnJHQ6fLOPPPj60GQOHmHYltEshdsQF AGesW1Vc+QhlMy9K7u9DMvv49VyGh5a5vq69GTyHwFNRh44vTiwYl9FT3/UjCFwwlgSy WyCzCc7wOiD0wbefmiLo5/HVuBHMrxeAaT/fZ6jiQrasP4H45BKg6cQG2OGQTP9z4shR OmzQ== MIME-Version: 1.0 X-Received: by 10.60.98.97 with SMTP id eh1mr3960725oeb.84.1366241891472; Wed, 17 Apr 2013 16:38:11 -0700 (PDT) Received: by 10.76.27.199 with HTTP; Wed, 17 Apr 2013 16:38:11 -0700 (PDT) X-Originating-IP: [2001:388:60ac:104:7de4:deea:c872:47dc] In-Reply-To: <20130320110935.GE17758@dastard> References: <20121211223700.GA27055@sgi.com> <20121211231533.GG16353@dastard> <20130318224814.GP6369@dastard> <20130319063104.GA6369@dastard> <20130320110935.GE17758@dastard> Date: Thu, 18 Apr 2013 09:38:11 +1000 Message-ID: From: Brian May To: Dave Chinner Cc: 695640@bugs.debian.org, Ben Myers Content-Type: multipart/alternative; boundary=089e011776eb9eb79e04da96fa23 X-Gm-Message-State: ALoCoQnOPj7MlYwpR0/N3/ZFc4aczxkw420+Fqtjiqwk8/PRa8iWmfdZEPTEHkz3hX1B6DEkfniz Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1366242126 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128421 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 --089e011776eb9eb79e04da96fa23 Content-Type: text/plain; charset=UTF-8 Oops. Just realized I still hadn't responded. Sorry. On 20 March 2013 22:09, Dave Chinner wrote: > > > # xfs_quota -x -c "quota -N -u brian" > > > > This prints the quota information 20 times. Huh? > > How many mount points do you have? 20? > No. More actually. Today I get hq ~ # cat /proc/mounts | wc --lines 34 hq ~ # xfs_quota -x -c "quota -N -u brian" | wc --lines 44 hq ~ # xfs_quota -x -c "quota -N -u brian" /home /share | wc --lines 4 > The command has once for each of the mount points, and the command > itself iterates mount points because you haven't given it a mount > point to look at. So, double iteration. This same problem was fixed > for the report command by setting it to be a global command i.e. the > fix I mentioned previously that you tested should prevent this > second case, and maybe even the first. > As far as I can tell this happens with the patched xfs_quota. hq /home/brian/xfsprogs # git diff diff --git a/quota/quot.c b/quota/quot.c index a7782b4..6cb665d 100644 --- a/quota/quot.c +++ b/quota/quot.c @@ -418,6 +418,7 @@ quot_init(void) quot_cmd.args = _("[-bir] [-gpu] [-acv] [-f file]"); quot_cmd.oneline = _("summarize filesystem ownership"); quot_cmd.help = quot_help; + quot_cmd.flags = CMD_FLAG_GLOBAL; if (expert) add_command("_cmd); As this version is based on git, I just did a git pull: hq /home/brian/xfsprogs # git pull Updating b326e06..64ae7fc Fast-forward mkfs/xfs_mkfs.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) Doesn't look related to this, don't think I need to retest. -- Brian May --089e011776eb9eb79e04da96fa23 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Oops. Just realized I still hadn't responded. Sorry.


On 20 March= 2013 22:09, Dave Chinner <david@fromorbit.com> wrote:
> > # xfs_quota =C2=A0-x -c "= quota -N -u brian"
>
> This prints the quota information 20 times. Huh?

How many mount points do you have? 20?

No. More actually. Today I get

h= q ~ # cat /proc/mounts =C2=A0| wc --lines
34
hq ~ # xfs= _quota =C2=A0-x -c "quota -N -u brian" | wc --lines
44
hq ~ # xfs_quota =C2=A0-x -c "quota -N -u brian= " /home /share | wc --lines
4
=C2=A0
The command has once = for each of the mount points, and the command
itself iterates mount points because you haven't given it a mount
point to look at. So, double iteration. =C2=A0This same problem was fixed for the report command by setting it to be a global command i.e. the
fix I mentioned previously that you tested should prevent this
second case, and maybe even the first.

As far as I can tell this happens with the patched xfs_quota.

hq /home/brian/xfsprogs # git diff
diff --git a/quota/quot.c b/quota/quot.c
index a7782b4..6cb6= 65d 100644
--- a/quota/quot.c
+++ b/quota/quot.c
<= div>@@ -418,6 +418,7 @@ quot_init(void)
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 quot_cmd.args =3D _("[-bir] [-gpu] [-acv] [-f file]");
=C2=A0 =C2=A0 =C2=A0 =C2=A0 quot_cmd.oneline =3D _("summarize fil= esystem ownership");
=C2=A0 =C2=A0 =C2=A0 =C2=A0 quot_cmd.he= lp =3D quot_help;
+ =C2=A0 =C2=A0 =C2=A0 quot_cmd.flags =3D CMD_F= LAG_GLOBAL;
=C2=A0
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (expe= rt)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 add_command(&a= mp;quot_cmd);

As this version is based on gi= t, I just did a git pull:

hq /hom= e/brian/xfsprogs # git pull
Updating b326e06..64ae7fc
Fast-forward
=C2=A0mkfs/xfs_m= kfs.c | =C2=A0 18 ++++++++++++++++++
=C2=A01 files changed, 18 in= sertions(+), 0 deletions(-)

Doesn't look= related to this, don't think I need to retest.
--
Brian May <brian@microcomaustralia.com.au>
--089e011776eb9eb79e04da96fa23-- From yongtaofu@gmail.com Wed Apr 17 20:30:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0BEC87F4C for ; Wed, 17 Apr 2013 20:30:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ACD5BAC001 for ; Wed, 17 Apr 2013 18:30:16 -0700 (PDT) X-ASG-Debug-ID: 1366248609-04bdf01d63100330001-NocioJ Received: from mail-ie0-f170.google.com (mail-ie0-f170.google.com [209.85.223.170]) by cuda.sgi.com with ESMTP id KGybBQUASurM5nUh (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 17 Apr 2013 18:30:09 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.170 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.170] Received: by mail-ie0-f170.google.com with SMTP id c11so2759661ieb.1 for ; Wed, 17 Apr 2013 18:30:09 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.170] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.170] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=jzFQ6ziZ0Bw30ND08h60FYPfJ+e1j/R87ixU3V4x7ts=; b=rRbvV3ZuaCq2Fa7tLRmPpsaK6SfhHTtdCvFpPGi3fQr/DlIOzMhhvClHkh5coVzYT+ x1DLi4s4P+l8pTfdyPuTGELKI1TeZfTjzbHAIktMKGOtW5i7DTqBG6CmozZ0fC7mKTmM OOKV+1HjLxrFlVJAeatnzpLpkBb0BNGnKx1SYkkmBr5PLzeTFvVNCV8aN1dzDJeQtAlp ykSFL+Ry5ux5rvMn0hFLAZkJ9AYw1zopgRU4bkhhEr6sQtYZ1z0lSvvmTWHBQkyFtTTg 9DPOPmfyvt8Udu/4TFtmgPIS65xr99bctnLz3rNhtglx1cVastVrzL0cPEKJ/mbkT7KZ yi5w== MIME-Version: 1.0 X-Received: by 10.42.110.140 with SMTP id q12mr4798621icp.18.1366248609319; Wed, 17 Apr 2013 18:30:09 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Wed, 17 Apr 2013 18:30:09 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> Date: Thu, 18 Apr 2013 09:30:09 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=20cf303dd2b008e3bf04da988b8b X-Barracuda-Connect: mail-ie0-f170.google.com[209.85.223.170] X-Barracuda-Start-Time: 1366248609 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.128429 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 --20cf303dd2b008e3bf04da988b8b Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Eric, The shutdown issue is still not reproduced yet. But I get the following error today during test. Apr 18 07:42:51 10 kernel: Call Trace: Apr 18 07:42:51 10 kernel: [] ? xfs_buf_cond_lock+0x2f/0xc0 [xfs] Apr 18 07:42:51 10 kernel: [] schedule_timeout+0x215/0x2e= 0 Apr 18 07:42:51 10 kernel: [] ? kmem_zone_alloc+0x77/0xf0 [xfs] Apr 18 07:42:51 10 kernel: [] __down+0x72/0xb0 Apr 18 07:42:51 10 kernel: [] ? _xfs_buf_find+0x102/0x280 [xfs] Apr 18 07:42:51 10 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Apr 18 07:42:51 10 kernel: glusterfsd D ffffffff8160b3c0 0 14522 1 0x00000083 Apr 18 07:42:51 10 kernel: ffff882015a63a28 0000000000000082 0000000000000000 0000000000000000 Apr 18 07:42:51 10 kernel: ffff882015a639b8 ffffffffa02d91ef ffff882015a639d8 0000000000000246 Apr 18 07:42:51 10 kernel: ffff880e70491af8 ffff882015a63fd8 000000000000fb88 ffff880e70491af8 Apr 18 07:42:51 10 kernel: Call Trace: Apr 18 07:42:51 10 kernel: [] ? xfs_buf_cond_lock+0x2f/0xc0 [xfs] Apr 18 07:42:51 10 kernel: [] schedule_timeout+0x215/0x2e= 0 Apr 18 07:42:51 10 kernel: [] ? kmem_zone_alloc+0x77/0xf0 [xfs] Apr 18 07:42:51 10 kernel: [] __down+0x72/0xb0 Apr 18 07:42:51 10 kernel: [] ? _xfs_buf_find+0x102/0x280 [xfs] Apr 18 07:42:51 10 kernel: [] down+0x41/0x50 Apr 18 07:42:51 10 kernel: [] xfs_buf_lock+0x53/0x110 [xfs] Apr 18 07:42:51 10 kernel: [] _xfs_buf_find+0x102/0x280 [xfs] Apr 18 07:42:51 10 kernel: [] xfs_buf_get+0x6b/0x1a0 [xfs= ] Apr 18 07:42:51 10 kernel: [] xfs_buf_read+0x2c/0x100 [xfs] Apr 18 07:42:51 10 kernel: [] xfs_trans_read_buf+0x1f8/0x400 [xfs] Apr 18 07:42:51 10 kernel: [] xfs_read_agi+0x74/0x100 [xfs] Apr 18 07:42:51 10 kernel: [] xfs_iunlink+0x5b/0x180 [xfs= ] Apr 18 07:42:51 10 kernel: [] ? current_fs_time+0x27/0x30 Apr 18 07:42:51 10 kernel: [] ? xfs_trans_ichgtime+0x27/0xa0 [xfs] Apr 18 07:42:51 10 kernel: [] xfs_droplink+0x5b/0x70 [xfs= ] Apr 18 07:42:51 10 kernel: [] xfs_remove+0x27e/0x3a0 [xfs= ] Apr 18 07:42:51 10 kernel: [] ? generic_permission+0x23/0xb0 Apr 18 07:42:51 10 kernel: [] xfs_vn_unlink+0x48/0x90 [xfs] Apr 18 07:42:51 10 kernel: [] vfs_unlink+0x9f/0xe0 Apr 18 07:42:51 10 kernel: [] ? lookup_hash+0x3a/0x50 Apr 18 07:42:51 10 kernel: [] do_unlinkat+0x183/0x1c0 Apr 18 07:42:51 10 kernel: [] ? syscall_trace_enter+0x1d8/0x1e0 Apr 18 07:42:51 10 kernel: [] sys_unlink+0x16/0x20 Apr 18 07:42:51 10 kernel: [] tracesys+0xd9/0xde Thank you. 2013/4/17 Eric Sandeen > On Apr 16, 2013, at 8:48 PM, =B7=FB=D3=C0=CC=CE wro= te: > > Hi Brain, > Can I change as following? > > > ASSERTS are no-ops in a non-debug kernel, so this won't change any > behavior. I hope we'll know more if we get new traces from your patched > kernel.... > > Eric > > --- a/xfs_inode.c > +++ b/xfs_inode.c > @@ -1773,6 +1773,8 @@ xfs_iunlink_remove( > if (last_ibp !=3D NULL) { > xfs_trans_brelse(tp, last_ibp); > } > + ASSERT(next_agino !=3D NULLAGINO); > + ASSERT(next_agino !=3D 0); > next_ino =3D XFS_AGINO_TO_INO(mp, agno, next_agin= o); > error =3D xfs_inotobp(mp, tp, next_ino, &last_dip= , > &last_ibp, &last_offset, 0); > @@ -1783,8 +1785,6 @@ xfs_iunlink_remove( > return error; > } > next_agino =3D > be32_to_cpu(last_dip->di_next_unlinked); > - ASSERT(next_agino !=3D NULLAGINO); > - ASSERT(next_agino !=3D 0); > } > /* > * Now last_ibp points to the buffer previous to us on > > Thank you. > > > 2013/4/17 =B7=FB=D3=C0=CC=CE > >> Hi Brain, >> If it is because NULLAGINO is passed in to xfs_inotobp(). >> Can I move the following two lines before xfs_inotobp? >> >> For example: >> >> 1767 while (next_agino !=3D agino) { >> 1768 /* >> 1769 * If the last inode wasn't the one pointin= g >> to >> 1770 * us, then release its buffer since we're >> not >> 1771 * going to do anything with it. >> 1772 */ >> 1773 if (last_ibp !=3D NULL) { >> 1774 xfs_trans_brelse(tp, last_ibp); >> 1775 } >> 1776 next_ino =3D XFS_AGINO_TO_INO(mp, agno, >> next_agino); >> + ASSERT(next_agino !=3D NULLAGINO); >> + ASSERT(next_agino !=3D 0); >> 1777 error =3D xfs_inotobp(mp, tp, next_ino, >> &last_dip, >> 1778 &last_ibp, &last_offset= , >> 0); >> 1779 if (error) { >> 1780 xfs_warn(mp, >> 1781 "%s: xfs_inotobp() returned >> error %d.", >> 1782 __func__, error); >> 1783 return error; >> 1784 } >> 1785 next_agino =3D >> be32_to_cpu(last_dip->di_next_unlinked); >> - //ASSERT(next_agino !=3D NULLAGINO); >> - //ASSERT(next_agino !=3D 0); >> 1788 } >> I don't understand xfs well and correct me if I'm totally wrong. >> Thank you very much. >> >> >> 2013/4/17 =B7=FB=D3=C0=CC=CE >> >>> Hi Brain, >>> I want to ask a question, according to the shutdown trace. The ino in = xfs_iunlink_remove >>> is 0x113, why xfs_imap got ino=3D0xffffffff ? >>> >>> --- xfs_imap -- module("xfs").function("xfs_imap@fs >>> /xfs/xfs_ialloc.c:1257").return -- return=3D0x16 >>> vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff >>> >>> --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs >>> /xfs/xfs_inode.c:1680").return -- return=3D0x16 >>> vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp= =3D? agi=3D? >>> dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agin= o=3D? last_ibp=3D? >>> last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? >>> last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] >>> ip: i_ino =3D 0x113, i_flags =3D 0x0 >>> >>> Thank you. >>> >>> >>> >>> 2013/4/17 =B7=FB=D3=C0=CC=CE >>> >>>> Hi Brain, >>>> Thank you for your update, and I have applied your last kernel patch. >>>> However it is not easy to reproduce especially in out test environment= . >>>> Till now is not happens again. I'll update the kernel patch now. BTW i= s >>>> there any findings in the logs of previous thread? >>>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>>> I guess it tend to happen during glusterfs rebalance because glusterfs >>>> moves a lot of file from one server to another and then unlink it. >>>> >>>> Thank you. >>>> >>>> >>>> 2013/4/17 Brian Foster >>>> >>>>> On 04/16/2013 12:24 PM, Dave Chinner wrote: >>>>> > On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote: >>>>> >> Hi, >>>>> >> >>>>> >> Thanks for the data in the previous thread: >>>>> >> >>>>> >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>>>> >> >>>>> ... >>>>> >> >>>>> >> echo 1 > >>>>> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable >>>>> >> echo 1 > >>>>> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable >>>>> >> ... reproduce ... >>>>> >> cat /sys/kernel/debug/tracing/trace > trace.output >>>>> > >>>>> > It's better to use trace-cmd for this. it will result in less >>>>> > dropped events. i.e.: >>>>> > >>>>> > $ trace-cmd record -e xfs_iunlink\* >>>>> > ... reproduce ... >>>>> > ^C >>>>> > $ trace-cmd report > trace.output >>>>> > >>>>> >> --- a/fs/xfs/linux-2.6/xfs_trace.h >>>>> >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >>>>> >> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >>>>> ... >>>>> > >>>>> > I would suggest that the the tracing shoul dbe at entry of the >>>>> > function, otherwise we won't get a tracepoint for the operation tha= t >>>>> > triggers the shutdown. (That's the reason most tracepoints in XFS >>>>> > are at function entry...) >>>>> > >>>>> >>>>> Good points, thanks Dave. A v2 that pulls up the tracepoints towards >>>>> function entry is appended. >>>>> >>>>> Brian >>>>> >>>>> From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 200= 1 >>>>> From: Brian Foster >>>>> Date: Mon, 15 Apr 2013 18:16:24 -0400 >>>>> Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and >>>>> xfs_iunlink_remove >>>>> >>>>> --- >>>>> fs/xfs/linux-2.6/xfs_trace.h | 2 ++ >>>>> fs/xfs/xfs_inode.c | 4 ++++ >>>>> 2 files changed, 6 insertions(+), 0 deletions(-) >>>>> >>>>> diff --git a/fs/xfs/linux-2.6/xfs_trace.h >>>>> b/fs/xfs/linux-2.6/xfs_trace.h >>>>> index adc6ec4..338a0f9 100644 >>>>> --- a/fs/xfs/linux-2.6/xfs_trace.h >>>>> +++ b/fs/xfs/linux-2.6/xfs_trace.h >>>>> @@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >>>>> DEFINE_INODE_EVENT(xfs_destroy_inode); >>>>> DEFINE_INODE_EVENT(xfs_dirty_inode); >>>>> DEFINE_INODE_EVENT(xfs_clear_inode); >>>>> +DEFINE_INODE_EVENT(xfs_iunlink); >>>>> +DEFINE_INODE_EVENT(xfs_iunlink_remove); >>>>> >>>>> DEFINE_INODE_EVENT(xfs_dquot_dqalloc); >>>>> DEFINE_INODE_EVENT(xfs_dquot_dqdetach); >>>>> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c >>>>> index 19900f0..d705c77 100644 >>>>> --- a/fs/xfs/xfs_inode.c >>>>> +++ b/fs/xfs/xfs_inode.c >>>>> @@ -1615,6 +1615,8 @@ xfs_iunlink( >>>>> >>>>> mp =3D tp->t_mountp; >>>>> >>>>> + trace_xfs_iunlink(ip); >>>>> + >>>>> /* >>>>> * Get the agi buffer first. It ensures lock ordering >>>>> * on the list. >>>>> @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( >>>>> mp =3D tp->t_mountp; >>>>> agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino); >>>>> >>>>> + trace_xfs_iunlink_remove(ip); >>>>> + >>>>> /* >>>>> * Get the agi buffer first. It ensures lock ordering >>>>> * on the list. >>>>> -- >>>>> 1.7.7.6 >>>>> >>>>> >>>> >>>> >>>> -- >>>> =B7=FB=D3=C0=CC=CE >>>> >>> >>> >>> >>> -- >>> =B7=FB=D3=C0=CC=CE >>> >> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > > --=20 =B7=FB=D3=C0=CC=CE --20cf303dd2b008e3bf04da988b8b Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Eric,
The shutdown issue is still no= t reproduced yet. But I get the following error today during test.

A= pr 18 07:42:51 10 kernel: Call Trace:
Apr 18 07:42:51 10 kernel: [<ff= ffffffa02d91ef>] ? xfs_buf_cond_lock+0x2f/0xc0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff814fe6a5>] schedule_timeout+0x21= 5/0x2e0
Apr 18 07:42:51 10 kernel: [<ffffffffa02d5f07>] ? kmem_zon= e_alloc+0x77/0xf0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff814ff5c2= >] __down+0x72/0xb0
Apr 18 07:42:51 10 kernel: [<ffffffffa02da652>] ? _xfs_buf_find+0x102= /0x280 [xfs]
Apr 18 07:42:51 10 kernel: "echo 0 > /proc/sys/kern= el/hung_task_timeout_secs" disables this message.
Apr 18 07:42:51 1= 0 kernel: glusterfsd    D ffffffff8160b3c0   =   0 14522      1 0x00000083
Apr 18 07:42:51 10 kernel: ffff882015a63a28 0000000000000082 00000000000000= 00 0000000000000000
Apr 18 07:42:51 10 kernel: ffff882015a639b8 ffffffff= a02d91ef ffff882015a639d8 0000000000000246
Apr 18 07:42:51 10 kernel: ff= ff880e70491af8 ffff882015a63fd8 000000000000fb88 ffff880e70491af8
Apr 18 07:42:51 10 kernel: Call Trace:
Apr 18 07:42:51 10 kernel: [<f= fffffffa02d91ef>] ? xfs_buf_cond_lock+0x2f/0xc0 [xfs]
Apr 18 07:42:51= 10 kernel: [<ffffffff814fe6a5>] schedule_timeout+0x215/0x2e0
Apr 18 07:42:51 10 kernel: [<ffffffffa02d5f07>] ? kmem_zone_alloc+0x7= 7/0xf0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff814ff5c2>] __dow= n+0x72/0xb0
Apr 18 07:42:51 10 kernel: [<ffffffffa02da652>] ? _xfs= _buf_find+0x102/0x280 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff81097ef1>] down+0x41/0x50
Apr= 18 07:42:51 10 kernel: [<ffffffffa02da493>] xfs_buf_lock+0x53/0x110 = [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02da652>] _xfs_buf_fin= d+0x102/0x280 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02da83b>] xfs_buf_get+0x6b/0x1a= 0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02daeac>] xfs_buf_re= ad+0x2c/0x100 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02d0af8>= ] xfs_trans_read_buf+0x1f8/0x400 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02b3444>] xfs_read_agi+0x74/0x1= 00 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02b967b>] xfs_iunli= nk+0x5b/0x180 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff810724c7>= ] ? current_fs_time+0x27/0x30
Apr 18 07:42:51 10 kernel: [<ffffffffa02d12a7>] ? xfs_trans_ichgtime+= 0x27/0xa0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02d15fb>] xf= s_droplink+0x5b/0x70 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02d2= f9e>] xfs_remove+0x27e/0x3a0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff81186fd3>] ? generic_permission+= 0x23/0xb0
Apr 18 07:42:51 10 kernel: [<ffffffffa02e0968>] xfs_vn_u= nlink+0x48/0x90 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff81188c0f&g= t;] vfs_unlink+0x9f/0xe0
Apr 18 07:42:51 10 kernel: [<ffffffff8118795a>] ? lookup_hash+0x3a/0x= 50
Apr 18 07:42:51 10 kernel: [<ffffffff8118b143>] do_unlinkat+0x1= 83/0x1c0
Apr 18 07:42:51 10 kernel: [<ffffffff81017938>] ? syscall= _trace_enter+0x1d8/0x1e0
Apr 18 07:42:51 10 kernel: [<ffffffff8118b196>] sys_unlink+0x16/0x20<= br>Apr 18 07:42:51 10 kernel: [<ffffffff8100b308>] tracesys+0xd9/0xde=

Thank you.


2013/4/17 Eric Sandeen <sandeen@sandeen.net>
On Apr 16, 2013, at 8:48 PM, =B7= =FB=D3=C0=CC=CE <yongtaofu@gmail.com> wrote:

Hi Brain,
Can I change as following?

ASSERTS are no-ops in a non-debug kernel, so= this won't change any behavior.  I hope we'll know more if we= get new traces from your patched kernel....

Eric

--- a/xfs_inode.c
+++ b/xfs_inode.c=
@@ -1773,6 +1773,8 @@ xfs_iunlink_remove(
    &n= bsp;            = ;       if (last_ibp !=3D NULL) {
            &nb= sp;            =        xfs_trans_brelse(tp, last_ibp);
            &nb= sp;           }
+ = ;            &n= bsp;          ASSERT(next_agin= o !=3D NULLAGINO);
+        &nbs= p;            &= nbsp;  ASSERT(next_agino !=3D 0);
     &nb= sp;            =       next_ino =3D XFS_AGINO_TO_INO(mp, agno, next= _agino);
            &nb= sp;           error =3D x= fs_inotobp(mp, tp, next_ino, &last_dip,
    &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp; &last_ibp, &last_offset, 0);
@@ -1783,8 +1785,6 @@ xfs_iun= link_remove(
          = ;            &n= bsp;         return error;
            &nb= sp;           }
 =             &nb= sp;          next_agino =3D be= 32_to_cpu(last_dip->di_next_unlinked);
-     = ;            &n= bsp;     ASSERT(next_agino !=3D NULLAGINO);
- &= nbsp;           &nbs= p;         ASSERT(next_agino !=3D 0= );
            &nb= sp;   }
         =        /*
     &n= bsp;           * Now last= _ibp points to the buffer previous to us on

Thank you.


2013/4/17 = =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brain,
If it is because NULLAGINO is passed in  to xfs_inotobp().
<= /div>Can I move the following two lines before xfs_inotobp?

For example:

1767        = ;         while (next_agino !=3D ag= ino) {
1768            = ;             /= *
1769           =             &nb= sp;  * If the last inode wasn't the one pointing to
1770 &= nbsp;           &nbs= p;            * us, = then release its buffer since we're not
1771    =             &nb= sp;         * going to do anything = with it.
1772            = ;            &n= bsp; */
1773          =             &nb= sp;  if (last_ibp !=3D NULL) {
1774     &n= bsp;            = ;            &n= bsp;  xfs_trans_brelse(tp, last_ibp);
1775    &= nbsp;           &nbs= p;        }
1776   &nb= sp;            =          next_ino =3D XFS_AGINO_TO_= INO(mp, agno, next_agino);
+            &n= bsp;             &nb= sp;    ASSERT(next_agino !=3D NULLAGINO);
+   &= nbsp;           &nbs= p;               ASSERT(next_a= gino !=3D 0);
1777         =             &nb= sp;   error =3D xfs_inotobp(mp, tp, next_ino, &last_dip,
1= 778            =             &nb= sp;            =         &last_ibp, &last_offset,= 0);
1779            = ;             i= f (error) {
1780         &n= bsp;            = ;           xfs_warn(mp,<= br>1781           &n= bsp;            = ;            &n= bsp;    "%s: xfs_inotobp() returned error %d.",1782           &nbs= p;            &= nbsp;           &nbs= p;    __func__, error);
1783            = ;            &n= bsp;        return error;
1784 &= nbsp;           &nbs= p;           }
1785&nb= sp;            =             next_agi= no =3D be32_to_cpu(last_dip->di_next_unlinked);
-   &n= bsp;            = ;               //ASSERT(= next_agino !=3D NULLAGINO);
-            &n= bsp;            = ;      //ASSERT(next_agino !=3D 0);
1788 &= nbsp;           &nbs= p;   }
I don't understand xfs well and correct me if= I'm totally wrong.
Thank you very much.


2013/4/17 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brain,
I want to ask a question, according to the s= hutdown trace. The ino in  xfs_iunlink_remove is 0x113, why xfs_imap got ino=3D0xffffffff ? =

---= xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1= 257").return -- return=3D0x16
vars: mp=3D0xff= ff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff

--- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_rem= ove@fs/xfs/xfs_inode.c:1680").return -- return=3D0x16
vars: tp=3D0xff= ff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? agi=3D? dip=3D? = agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino=3D? last_i= bp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? last_offse= t=3D0xffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0= x113, i_flags =3D 0x0

Thank you.



2013/4/17 =B7=FB=D3=C0=CC=CE <yongt= aofu@gmail.com>
Hi Brain,
Thank you for your update, an= d I have applied your last kernel patch. However it is not easy to reproduc= e especially in out test environment. Till now is not happens again. I'= ll update the kernel patch now. BTW is there any findings in the logs of pr= evious thread?
http://oss.sgi.com/archives/xfs/2013-04/msg00327.html
I gue= ss it tend to happen during glusterfs rebalance because glusterfs moves a l= ot of file from one server to another and then unlink it.

Thank you.


=
2013/4/17 Brian Foster <bfoster@redhat.com= >
On 04/16/2013 12:24 PM, Dave Chinner wrote:
> On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote:
>> Hi,
>>
>> Thanks for the data in the previous thread:
>>
>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html=
>>
...
>>
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink/enable
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink_remove/enable
>>      ... reproduce ...
>>      cat /sys/kernel/debug/tracing/trace > trace= .output
>
> It's better to use trace-cmd for this. it will result in less
> dropped events. i.e.:
>
>       $ trace-cmd record -e xfs_iunlink\*
>       ... reproduce ...
>       ^C
>       $ trace-cmd report > trace.output
>
>> --- a/fs/xfs/linux-2.6/xfs_trace.h
>> +++ b/fs/xfs/linux-2.6/xfs_trace.h
>> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
...
>
> I would suggest that the the tracing shoul dbe at entry of the
> function, otherwise we won't get a tracepoint for the operation th= at
> triggers the shutdown. (That's the reason most tracepoints in XFS<= br> > are at function entry...)
>

Good points, thanks Dave. A v2 that pulls up the tracepoints towards<= br> function entry is appended.

Brian

>From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001
From: Brian Foster <bfoster@redhat.com>
Date: Mon, 15 Apr 2013 18:16:24 -0400
Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and
xfs_iunlink_remove

---
 fs/xfs/linux-2.6/xfs_trace.h |    2 ++
 fs/xfs/xfs_inode.c           |    = 4 ++++
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h
index adc6ec4..338a0f9 100644
--- a/fs/xfs/linux-2.6/xfs_trace.h
+++ b/fs/xfs/linux-2.6/xfs_trace.h
@@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
 DEFINE_INODE_EVENT(xfs_destroy_inode);
 DEFINE_INODE_EVENT(xfs_dirty_inode);
 DEFINE_INODE_EVENT(xfs_clear_inode);
+DEFINE_INODE_EVENT(xfs_iunlink);
+DEFINE_INODE_EVENT(xfs_iunlink_remove);

 DEFINE_INODE_EVENT(xfs_dquot_dqalloc);
 DEFINE_INODE_EVENT(xfs_dquot_dqdetach);
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 19900f0..d705c77 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1615,6 +1615,8 @@ xfs_iunlink(

        mp =3D tp->t_mountp;

+       trace_xfs_iunlink(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
@@ -1694,6 +1696,8 @@ xfs_iunlink_remove(
        mp =3D tp->t_mountp;
        agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino);

+       trace_xfs_iunlink_remove(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
--
1.7.7.6




--
=B7=FB=D3=C0=CC=CE



<= font color=3D"#888888">--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
_______= ________________________________________
xfs mailing list
xfs@oss= .sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
<= /div>
--20cf303dd2b008e3bf04da988b8b-- From retorno-linux+2Dxfs=oss.sgi.com@suplementosbh.com.br Thu Apr 18 00:34:00 2013 Return-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.3 required=5.0 tests=DATE_IN_PAST_24_48, HTML_IMAGE_RATIO_04,HTML_MESSAGE,SUBJECT_NEEDS_ENCODING,SUBJ_ILLEGAL_CHARS, T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D0EF67F4C for ; Thu, 18 Apr 2013 00:33:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7C65EAC003 for ; Wed, 17 Apr 2013 22:33:56 -0700 (PDT) X-ASG-Debug-ID: 1366263230-04bdf02d203227f0001-w1Z2WR Received: from mailx.suplementosbh.com.br (mailx.suplementosbh.com.br [188.165.164.37]) by cuda.sgi.com with ESMTP id HGq5JvdT9EPYH519 for ; Wed, 17 Apr 2013 22:33:51 -0700 (PDT) X-Barracuda-Envelope-From: retorno-linux+2Dxfs=oss.sgi.com@suplementosbh.com.br X-Barracuda-Apparent-Source-IP: 188.165.164.37 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=suplementosbh.com.br; h=To:Subject:Message-ID:Date:From:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding; i=contato@suplementosbh.com.br; bh=z3vBkYj/UCb9xQDHAY8wJHYzsxM=; b=oxbymVk2HQA0a8UchRwkgMhTb/dVvuiP3qhD2J7FyETzlvUG48bmnB7ulBGlDEpYwrq6/vwhdrje GvZ7d2L/aQAAoY2Qqv8fNf6KY4cNDaCbkXLzlk9oCZQ32qKz9O6veoHuPPRf6xGI3/aPEu5fUnRh UhNs7L2wPiNpTy4FzQo= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=suplementosbh.com.br; b=aAp0iswb3pRLQ+uhGHItGRkdIKHrWFcvxu0yGAqrv4013CU9rM0mTpUdt/ORZgrxm9nruIobrJLS 9lkQ2t2TQrqLCYWlYL4izq02bRz52UiFHEaP38vP6xJtaoNWn3SFoYNSOPb4aR10PHDkrCBu6zmU PwgK3/fWjKA5yQ+xk4c=; To: linux-xfs@oss.sgi.com Subject: Olá linux-xfs@oss.sgi.com! Suplementos com o melhor preço: Iso Pro Whey 900g Probiotica R$ 159,90 | Monster Extreme Black 44 Packs - Probiotica R$ 159,00 | BCAA 2400mg 120CPS MILLENIUM 51,90 Message-ID: <852a62e997c1c106f747e1df2a13a021@suplementosbh.com.br> X-ASG-Orig-Subj: Olá linux-xfs@oss.sgi.com! Suplementos com o melhor preço: Iso Pro Whey 900g Probiotica R$ 159,90 | Monster Extreme Black 44 Packs - Probiotica R$ 159,00 | BCAA 2400mg 120CPS MILLENIUM 51,90 Date: Tue, 16 Apr 2013 21:12:17 +0200 From: "SuplementosBH" Reply-To: atendimento@suplementosbh.com.br MIME-Version: 1.0 X-Mailer-LID: 8 X-Mailer-SID: 10 X-Mailer-Sent-By: 1 Content-Type: multipart/alternative; charset="ISO-8859-1"; boundary="b1_2171a63e7aa1810a99d72b3e1da9284e" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mailx.suplementosbh.com.br[188.165.164.37] X-Barracuda-Start-Time: 1366263230 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.14 X-Barracuda-Spam-Status: No, SCORE=2.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_24_48, DATE_IN_PAST_24_48_2, DKIM_SIGNED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, PR0N_SUBJECT, SUBJECT_NEEDS_ENCODING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128445 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_24_48 Date: is 24 to 48 hours before Received: date 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 1.28 SUBJECT_NEEDS_ENCODING SUBJECT_NEEDS_ENCODING 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.48 DATE_IN_PAST_24_48_2 DATE_IN_PAST_24_48_2 --b1_2171a63e7aa1810a99d72b3e1da9284e Content-Type: text/plain; format=flowed; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit Seu cliente de email não pode visualizar esse email. Para ver a versão online, por favor visite: http://suplementosbh.com.br/marketing/display.php?M=490104&C=74b43e4763765cdf57dd7e1ce721ccfc&S=10&L=8&N=3 Se não deseja mais receber esses emails clique:http://suplementosbh.com.br/marketing/unsubscribe.php?M=490104&N=10&L=8&C=74b43e4763765cdf57dd7e1ce721ccfc --b1_2171a63e7aa1810a99d72b3e1da9284e Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit
     
 

 

Iso Pro Whey 900g Probiótica Por apenas: R$ 159,90

 
     


BCAA 2400mg 120CPS MILLENIUM - Probiótica
R$ 51,90




Monster Extreme Black
 44 Packs - Probiótica

R$ 159,00




Creatina Powder (600g)
Optimum

R$ 129,90




Massa Monster Black -
3 kg - Probiótica

R$ 159,90




Midway Lipo Way
Reduce  120 Cápsulas

R$ 90,00




Dextrose 1 Kg
 Probiótica - Millennium

R$ 27,90




Amino Fluid 37000 NO2
 (480 ml)

R$ 50,99




Whey Gold 100% 5 Lbs
2,273 kg - Optimum

R$ 339,90


 
Suplementos BH é uma Empresa no mercado, voltada para a venda de suplementos alimentares
focada na área de Nutrição Esportiva. Com um atendimento de qualidade e o menor preço visamos sempre surpreender as expectativas de nossos clientes.
Está recebendo mensagens em excesso ou deseja parar de receber nossos e-mails? Descadastre-se
Seu cliente de email não pode visualizar esse email. Para ver a versão online, por favor visite: www.suplementosbh.com.br/campanha
--b1_2171a63e7aa1810a99d72b3e1da9284e-- From yongtaofu@gmail.com Thu Apr 18 01:46:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 764917F50 for ; Thu, 18 Apr 2013 01:46:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 61352304059 for ; Wed, 17 Apr 2013 23:46:01 -0700 (PDT) X-ASG-Debug-ID: 1366267558-04cb6c2c1d32ee50001-NocioJ Received: from mail-ia0-f177.google.com (mail-ia0-f177.google.com [209.85.210.177]) by cuda.sgi.com with ESMTP id 3mDI274dCg1d7IGc (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 17 Apr 2013 23:45:58 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.177] Received: by mail-ia0-f177.google.com with SMTP id w33so2203113iag.36 for ; Wed, 17 Apr 2013 23:45:58 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=tZc4TKWFGvMkwoMk2ObImPybleyXToYoUwT30nD7G6Q=; b=lp8LUkaOzk8st0rQvkU82IXYujV9W91/GEVKvZrEyw4a2YyYAchfriFgcnKPZXXNdD e/fhQa3o/sIHkHATnmsqILNgIlQ3/xjafuR5vdvczw9GLpIpdDh+8zvol+GHIN2pwMHu CmWqqOai3WsrUmFYK2U5AS8qnygS5YmBwrDMfqxCszIhFhN40okxykdRQSzcb8CpoigY e1NKBGfAXDrf6FkLgo1P9XimQF7ecYLkzAbEGYwlW+B1wmMktAVwQtDvIyvJnEnMUP3i 0C5kipiUv5VjHrnA/lSJ+oV2ApgU2aHxYNnz7SQWXVgfD5u+RJFvF9anrqC06oj7VtLD 7jhQ== MIME-Version: 1.0 X-Received: by 10.50.20.163 with SMTP id o3mr6183583ige.51.1366267558562; Wed, 17 Apr 2013 23:45:58 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Wed, 17 Apr 2013 23:45:58 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> Date: Thu, 18 Apr 2013 14:45:58 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=047d7bd75dec7f10f104da9cf40c X-Barracuda-Connect: mail-ia0-f177.google.com[209.85.210.177] X-Barracuda-Start-Time: 1366267558 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128449 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 --047d7bd75dec7f10f104da9cf40c Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brain and Eric, If the problem is the agno can't be found in the unlinked list. Can we just bypass it instead of passing ino=3D0xffffffff to xfs_inotobp? Thank you. 2013/4/18 =B7=FB=D3=C0=CC=CE > Hi Eric, > The shutdown issue is still not reproduced yet. But I get the following > error today during test. > > Apr 18 07:42:51 10 kernel: Call Trace: > Apr 18 07:42:51 10 kernel: [] ? > xfs_buf_cond_lock+0x2f/0xc0 [xfs] > Apr 18 07:42:51 10 kernel: [] > schedule_timeout+0x215/0x2e0 > Apr 18 07:42:51 10 kernel: [] ? > kmem_zone_alloc+0x77/0xf0 [xfs] > Apr 18 07:42:51 10 kernel: [] __down+0x72/0xb0 > Apr 18 07:42:51 10 kernel: [] ? > _xfs_buf_find+0x102/0x280 [xfs] > Apr 18 07:42:51 10 kernel: "echo 0 > > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Apr 18 07:42:51 10 kernel: glusterfsd D ffffffff8160b3c0 0 > 14522 1 0x00000083 > Apr 18 07:42:51 10 kernel: ffff882015a63a28 0000000000000082 > 0000000000000000 0000000000000000 > Apr 18 07:42:51 10 kernel: ffff882015a639b8 ffffffffa02d91ef > ffff882015a639d8 0000000000000246 > Apr 18 07:42:51 10 kernel: ffff880e70491af8 ffff882015a63fd8 > 000000000000fb88 ffff880e70491af8 > Apr 18 07:42:51 10 kernel: Call Trace: > Apr 18 07:42:51 10 kernel: [] ? > xfs_buf_cond_lock+0x2f/0xc0 [xfs] > Apr 18 07:42:51 10 kernel: [] > schedule_timeout+0x215/0x2e0 > Apr 18 07:42:51 10 kernel: [] ? > kmem_zone_alloc+0x77/0xf0 [xfs] > Apr 18 07:42:51 10 kernel: [] __down+0x72/0xb0 > Apr 18 07:42:51 10 kernel: [] ? > _xfs_buf_find+0x102/0x280 [xfs] > Apr 18 07:42:51 10 kernel: [] down+0x41/0x50 > Apr 18 07:42:51 10 kernel: [] xfs_buf_lock+0x53/0x110 > [xfs] > Apr 18 07:42:51 10 kernel: [] _xfs_buf_find+0x102/0x280 > [xfs] > Apr 18 07:42:51 10 kernel: [] xfs_buf_get+0x6b/0x1a0 > [xfs] > Apr 18 07:42:51 10 kernel: [] xfs_buf_read+0x2c/0x100 > [xfs] > Apr 18 07:42:51 10 kernel: [] > xfs_trans_read_buf+0x1f8/0x400 [xfs] > Apr 18 07:42:51 10 kernel: [] xfs_read_agi+0x74/0x100 > [xfs] > Apr 18 07:42:51 10 kernel: [] xfs_iunlink+0x5b/0x180 > [xfs] > Apr 18 07:42:51 10 kernel: [] ? current_fs_time+0x27/0x= 30 > Apr 18 07:42:51 10 kernel: [] ? > xfs_trans_ichgtime+0x27/0xa0 [xfs] > Apr 18 07:42:51 10 kernel: [] xfs_droplink+0x5b/0x70 > [xfs] > Apr 18 07:42:51 10 kernel: [] xfs_remove+0x27e/0x3a0 > [xfs] > Apr 18 07:42:51 10 kernel: [] ? > generic_permission+0x23/0xb0 > Apr 18 07:42:51 10 kernel: [] xfs_vn_unlink+0x48/0x90 > [xfs] > Apr 18 07:42:51 10 kernel: [] vfs_unlink+0x9f/0xe0 > Apr 18 07:42:51 10 kernel: [] ? lookup_hash+0x3a/0x50 > Apr 18 07:42:51 10 kernel: [] do_unlinkat+0x183/0x1c0 > Apr 18 07:42:51 10 kernel: [] ? > syscall_trace_enter+0x1d8/0x1e0 > Apr 18 07:42:51 10 kernel: [] sys_unlink+0x16/0x20 > Apr 18 07:42:51 10 kernel: [] tracesys+0xd9/0xde > > Thank you. > > > 2013/4/17 Eric Sandeen > >> On Apr 16, 2013, at 8:48 PM, =B7=FB=D3=C0=CC=CE wr= ote: >> >> Hi Brain, >> Can I change as following? >> >> >> ASSERTS are no-ops in a non-debug kernel, so this won't change any >> behavior. I hope we'll know more if we get new traces from your patched >> kernel.... >> >> Eric >> >> --- a/xfs_inode.c >> +++ b/xfs_inode.c >> @@ -1773,6 +1773,8 @@ xfs_iunlink_remove( >> if (last_ibp !=3D NULL) { >> xfs_trans_brelse(tp, last_ibp); >> } >> + ASSERT(next_agino !=3D NULLAGINO); >> + ASSERT(next_agino !=3D 0); >> next_ino =3D XFS_AGINO_TO_INO(mp, agno, next_agi= no); >> error =3D xfs_inotobp(mp, tp, next_ino, &last_di= p, >> &last_ibp, &last_offset, 0); >> @@ -1783,8 +1785,6 @@ xfs_iunlink_remove( >> return error; >> } >> next_agino =3D >> be32_to_cpu(last_dip->di_next_unlinked); >> - ASSERT(next_agino !=3D NULLAGINO); >> - ASSERT(next_agino !=3D 0); >> } >> /* >> * Now last_ibp points to the buffer previous to us on >> >> Thank you. >> >> >> 2013/4/17 =B7=FB=D3=C0=CC=CE >> >>> Hi Brain, >>> If it is because NULLAGINO is passed in to xfs_inotobp(). >>> Can I move the following two lines before xfs_inotobp? >>> >>> For example: >>> >>> 1767 while (next_agino !=3D agino) { >>> 1768 /* >>> 1769 * If the last inode wasn't the one >>> pointing to >>> 1770 * us, then release its buffer since we're >>> not >>> 1771 * going to do anything with it. >>> 1772 */ >>> 1773 if (last_ibp !=3D NULL) { >>> 1774 xfs_trans_brelse(tp, last_ibp); >>> 1775 } >>> 1776 next_ino =3D XFS_AGINO_TO_INO(mp, agno, >>> next_agino); >>> + ASSERT(next_agino !=3D NULLAGINO); >>> + ASSERT(next_agino !=3D 0); >>> 1777 error =3D xfs_inotobp(mp, tp, next_ino, >>> &last_dip, >>> 1778 &last_ibp, >>> &last_offset, 0); >>> 1779 if (error) { >>> 1780 xfs_warn(mp, >>> 1781 "%s: xfs_inotobp() returne= d >>> error %d.", >>> 1782 __func__, error); >>> 1783 return error; >>> 1784 } >>> 1785 next_agino =3D >>> be32_to_cpu(last_dip->di_next_unlinked); >>> - //ASSERT(next_agino !=3D NULLAGINO); >>> - //ASSERT(next_agino !=3D 0); >>> 1788 } >>> I don't understand xfs well and correct me if I'm totally wrong. >>> Thank you very much. >>> >>> >>> 2013/4/17 =B7=FB=D3=C0=CC=CE >>> >>>> Hi Brain, >>>> I want to ask a question, according to the shutdown trace. The ino in = xfs_iunlink_remove >>>> is 0x113, why xfs_imap got ino=3D0xffffffff ? >>>> >>>> --- xfs_imap -- module("xfs").function("xfs_imap@fs >>>> /xfs/xfs_ialloc.c:1257").return -- return=3D0x16 >>>> vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff >>>> >>>> --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@f= s >>>> /xfs/xfs_inode.c:1680").return -- return=3D0x16 >>>> vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp= =3D? agi=3D? >>>> dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agi= no=3D? last_ibp=3D? >>>> last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? >>>> last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] >>>> ip: i_ino =3D 0x113, i_flags =3D 0x0 >>>> >>>> Thank you. >>>> >>>> >>>> >>>> 2013/4/17 =B7=FB=D3=C0=CC=CE >>>> >>>>> Hi Brain, >>>>> Thank you for your update, and I have applied your last kernel patch. >>>>> However it is not easy to reproduce especially in out test environmen= t. >>>>> Till now is not happens again. I'll update the kernel patch now. BTW = is >>>>> there any findings in the logs of previous thread? >>>>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>>>> I guess it tend to happen during glusterfs rebalance because glusterf= s >>>>> moves a lot of file from one server to another and then unlink it. >>>>> >>>>> Thank you. >>>>> >>>>> >>>>> 2013/4/17 Brian Foster >>>>> >>>>>> On 04/16/2013 12:24 PM, Dave Chinner wrote: >>>>>> > On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote: >>>>>> >> Hi, >>>>>> >> >>>>>> >> Thanks for the data in the previous thread: >>>>>> >> >>>>>> >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>>>>> >> >>>>>> ... >>>>>> >> >>>>>> >> echo 1 > >>>>>> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable >>>>>> >> echo 1 > >>>>>> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable >>>>>> >> ... reproduce ... >>>>>> >> cat /sys/kernel/debug/tracing/trace > trace.output >>>>>> > >>>>>> > It's better to use trace-cmd for this. it will result in less >>>>>> > dropped events. i.e.: >>>>>> > >>>>>> > $ trace-cmd record -e xfs_iunlink\* >>>>>> > ... reproduce ... >>>>>> > ^C >>>>>> > $ trace-cmd report > trace.output >>>>>> > >>>>>> >> --- a/fs/xfs/linux-2.6/xfs_trace.h >>>>>> >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >>>>>> >> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >>>>>> ... >>>>>> > >>>>>> > I would suggest that the the tracing shoul dbe at entry of the >>>>>> > function, otherwise we won't get a tracepoint for the operation th= at >>>>>> > triggers the shutdown. (That's the reason most tracepoints in XFS >>>>>> > are at function entry...) >>>>>> > >>>>>> >>>>>> Good points, thanks Dave. A v2 that pulls up the tracepoints towards >>>>>> function entry is appended. >>>>>> >>>>>> Brian >>>>>> >>>>>> From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 20= 01 >>>>>> From: Brian Foster >>>>>> Date: Mon, 15 Apr 2013 18:16:24 -0400 >>>>>> Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and >>>>>> xfs_iunlink_remove >>>>>> >>>>>> --- >>>>>> fs/xfs/linux-2.6/xfs_trace.h | 2 ++ >>>>>> fs/xfs/xfs_inode.c | 4 ++++ >>>>>> 2 files changed, 6 insertions(+), 0 deletions(-) >>>>>> >>>>>> diff --git a/fs/xfs/linux-2.6/xfs_trace.h >>>>>> b/fs/xfs/linux-2.6/xfs_trace.h >>>>>> index adc6ec4..338a0f9 100644 >>>>>> --- a/fs/xfs/linux-2.6/xfs_trace.h >>>>>> +++ b/fs/xfs/linux-2.6/xfs_trace.h >>>>>> @@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >>>>>> DEFINE_INODE_EVENT(xfs_destroy_inode); >>>>>> DEFINE_INODE_EVENT(xfs_dirty_inode); >>>>>> DEFINE_INODE_EVENT(xfs_clear_inode); >>>>>> +DEFINE_INODE_EVENT(xfs_iunlink); >>>>>> +DEFINE_INODE_EVENT(xfs_iunlink_remove); >>>>>> >>>>>> DEFINE_INODE_EVENT(xfs_dquot_dqalloc); >>>>>> DEFINE_INODE_EVENT(xfs_dquot_dqdetach); >>>>>> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c >>>>>> index 19900f0..d705c77 100644 >>>>>> --- a/fs/xfs/xfs_inode.c >>>>>> +++ b/fs/xfs/xfs_inode.c >>>>>> @@ -1615,6 +1615,8 @@ xfs_iunlink( >>>>>> >>>>>> mp =3D tp->t_mountp; >>>>>> >>>>>> + trace_xfs_iunlink(ip); >>>>>> + >>>>>> /* >>>>>> * Get the agi buffer first. It ensures lock ordering >>>>>> * on the list. >>>>>> @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( >>>>>> mp =3D tp->t_mountp; >>>>>> agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino); >>>>>> >>>>>> + trace_xfs_iunlink_remove(ip); >>>>>> + >>>>>> /* >>>>>> * Get the agi buffer first. It ensures lock ordering >>>>>> * on the list. >>>>>> -- >>>>>> 1.7.7.6 >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> =B7=FB=D3=C0=CC=CE >>>>> >>>> >>>> >>>> >>>> -- >>>> =B7=FB=D3=C0=CC=CE >>>> >>> >>> >>> >>> -- >>> =B7=FB=D3=C0=CC=CE >>> >> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --047d7bd75dec7f10f104da9cf40c Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brain and Eric,
If the problem is th= e agno can't be found in the unlinked list. Can we just bypass it inste= ad of passing ino=3D0xffffffff to xfs_inotobp?
Thank you.


2013/4/18 =B7= =FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Eric,
The shutdown issue is still no= t reproduced yet. But I get the following error today during test.

A= pr 18 07:42:51 10 kernel: Call Trace:
Apr 18 07:42:51 10 kernel: [<ff= ffffffa02d91ef>] ? xfs_buf_cond_lock+0x2f/0xc0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff814fe6a5>] schedule_timeout+0x21= 5/0x2e0
Apr 18 07:42:51 10 kernel: [<ffffffffa02d5f07>] ? kmem_zon= e_alloc+0x77/0xf0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff814ff5c2= >] __down+0x72/0xb0
Apr 18 07:42:51 10 kernel: [<ffffffffa02da652>] ? _xfs_buf_find+0x102= /0x280 [xfs]
Apr 18 07:42:51 10 kernel: "echo 0 > /proc/sys/kern= el/hung_task_timeout_secs" disables this message.
Apr 18 07:42:51 1= 0 kernel: glusterfsd    D ffffffff8160b3c0   =   0 14522      1 0x00000083
Apr 18 07:42:51 10 kernel: ffff882015a63a28 0000000000000082 00000000000000= 00 0000000000000000
Apr 18 07:42:51 10 kernel: ffff882015a639b8 ffffffff= a02d91ef ffff882015a639d8 0000000000000246
Apr 18 07:42:51 10 kernel: ff= ff880e70491af8 ffff882015a63fd8 000000000000fb88 ffff880e70491af8
Apr 18 07:42:51 10 kernel: Call Trace:
Apr 18 07:42:51 10 kernel: [<f= fffffffa02d91ef>] ? xfs_buf_cond_lock+0x2f/0xc0 [xfs]
Apr 18 07:42:51= 10 kernel: [<ffffffff814fe6a5>] schedule_timeout+0x215/0x2e0
Apr 18 07:42:51 10 kernel: [<ffffffffa02d5f07>] ? kmem_zone_alloc+0x7= 7/0xf0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff814ff5c2>] __dow= n+0x72/0xb0
Apr 18 07:42:51 10 kernel: [<ffffffffa02da652>] ? _xfs= _buf_find+0x102/0x280 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff81097ef1>] down+0x41/0x50
Apr= 18 07:42:51 10 kernel: [<ffffffffa02da493>] xfs_buf_lock+0x53/0x110 = [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02da652>] _xfs_buf_fin= d+0x102/0x280 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02da83b>] xfs_buf_get+0x6b/0x1a= 0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02daeac>] xfs_buf_re= ad+0x2c/0x100 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02d0af8>= ] xfs_trans_read_buf+0x1f8/0x400 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02b3444>] xfs_read_agi+0x74/0x1= 00 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02b967b>] xfs_iunli= nk+0x5b/0x180 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff810724c7>= ] ? current_fs_time+0x27/0x30
Apr 18 07:42:51 10 kernel: [<ffffffffa02d12a7>] ? xfs_trans_ichgtime+= 0x27/0xa0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02d15fb>] xf= s_droplink+0x5b/0x70 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02d2= f9e>] xfs_remove+0x27e/0x3a0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff81186fd3>] ? generic_permission+= 0x23/0xb0
Apr 18 07:42:51 10 kernel: [<ffffffffa02e0968>] xfs_vn_u= nlink+0x48/0x90 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff81188c0f&g= t;] vfs_unlink+0x9f/0xe0
Apr 18 07:42:51 10 kernel: [<ffffffff8118795a>] ? lookup_hash+0x3a/0x= 50
Apr 18 07:42:51 10 kernel: [<ffffffff8118b143>] do_unlinkat+0x1= 83/0x1c0
Apr 18 07:42:51 10 kernel: [<ffffffff81017938>] ? syscall= _trace_enter+0x1d8/0x1e0
Apr 18 07:42:51 10 kernel: [<ffffffff8118b196>] sys_unlink+0x16/0x20<= br>Apr 18 07:42:51 10 kernel: [<ffffffff8100b308>] tracesys+0xd9/0xde=

Thank you.


2013/4/17 Eric Sandeen <sandeen@sandeen.net>
On Apr 16, 2013, at 8:48 PM, =B7=FB=D3=C0=CC=CE= <yongtaofu@gma= il.com> wrote:

Hi Brain,
Can I change as following?

ASSERTS are no-ops in a non-debug kernel, so= this won't change any behavior.  I hope we'll know more if we= get new traces from your patched kernel....

Eric

=
--- a/xfs_inode.c
+++ b/xfs_inode.c
@@ -1773,6 = +1773,8 @@ xfs_iunlink_remove(
       = ;            &n= bsp;    if (last_ibp !=3D NULL) {
            &nb= sp;            =        xfs_trans_brelse(tp, last_ibp);
            &nb= sp;           }
+ = ;            &n= bsp;          ASSERT(next_agin= o !=3D NULLAGINO);
+        &nbs= p;            &= nbsp;  ASSERT(next_agino !=3D 0);
     &nb= sp;            =       next_ino =3D XFS_AGINO_TO_INO(mp, agno, next= _agino);
            &nb= sp;           error =3D x= fs_inotobp(mp, tp, next_ino, &last_dip,
    &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp; &last_ibp, &last_offset, 0);
@@ -1783,8 +1785,6 @@ xfs_iun= link_remove(
          = ;            &n= bsp;         return error;
            &nb= sp;           }
 =             &nb= sp;          next_agino =3D be= 32_to_cpu(last_dip->di_next_unlinked);
-     = ;            &n= bsp;     ASSERT(next_agino !=3D NULLAGINO);
- &= nbsp;           &nbs= p;         ASSERT(next_agino !=3D 0= );
            &nb= sp;   }
         =        /*
     &n= bsp;           * Now last= _ibp points to the buffer previous to us on

Thank you.


2013/4/17 = =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brain,
If it is because NULLAGINO is passed in  to xfs_inotobp().
<= /div>Can I move the following two lines before xfs_inotobp?

For example:

1767        = ;         while (next_agino !=3D ag= ino) {
1768            = ;             /= *
1769           =             &nb= sp;  * If the last inode wasn't the one pointing to
1770 &= nbsp;           &nbs= p;            * us, = then release its buffer since we're not
1771    =             &nb= sp;         * going to do anything = with it.
1772            = ;            &n= bsp; */
1773          =             &nb= sp;  if (last_ibp !=3D NULL) {
1774     &n= bsp;            = ;            &n= bsp;  xfs_trans_brelse(tp, last_ibp);
1775    &= nbsp;           &nbs= p;        }
1776   &nb= sp;            =          next_ino =3D XFS_AGINO_TO_= INO(mp, agno, next_agino);
+            &n= bsp;             &nb= sp;    ASSERT(next_agino !=3D NULLAGINO);
+   &= nbsp;           &nbs= p;               ASSERT(next_a= gino !=3D 0);
1777         =             &nb= sp;   error =3D xfs_inotobp(mp, tp, next_ino, &last_dip,
1= 778            =             &nb= sp;            =         &last_ibp, &last_offset,= 0);
1779            = ;             i= f (error) {
1780         &n= bsp;            = ;           xfs_warn(mp,<= br>1781           &n= bsp;            = ;            &n= bsp;    "%s: xfs_inotobp() returned error %d.",1782           &nbs= p;            &= nbsp;           &nbs= p;    __func__, error);
1783            = ;            &n= bsp;        return error;
1784 &= nbsp;           &nbs= p;           }
1785&nb= sp;            =             next_agi= no =3D be32_to_cpu(last_dip->di_next_unlinked);
-   &n= bsp;            = ;               //ASSERT(= next_agino !=3D NULLAGINO);
-            &n= bsp;            = ;      //ASSERT(next_agino !=3D 0);
1788 &= nbsp;           &nbs= p;   }
I don't understand xfs well and correct me if= I'm totally wrong.
Thank you very much.


2013/4/17 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brain,
I want to ask a question, according to the s= hutdown trace. The ino in  xfs_iunlink_remove is 0x113, why xfs_imap got ino=3D0xffffffff ? =

---= xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1= 257").return -- return=3D0x16
vars: mp=3D0xff= ff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff

--- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_rem= ove@fs/xfs/xfs_inode.c:1680").return -- return=3D0x16
vars: tp=3D0xff= ff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? agi=3D? dip=3D? = agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino=3D? last_i= bp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? last_offse= t=3D0xffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0= x113, i_flags =3D 0x0

Thank you.



2013/4/17 =B7=FB=D3=C0=CC=CE <yongt= aofu@gmail.com>
Hi Brain,
Thank you for your update, an= d I have applied your last kernel patch. However it is not easy to reproduc= e especially in out test environment. Till now is not happens again. I'= ll update the kernel patch now. BTW is there any findings in the logs of pr= evious thread?
http://oss.sgi.com/archives/xfs/2013-04/msg00327.html
I gue= ss it tend to happen during glusterfs rebalance because glusterfs moves a l= ot of file from one server to another and then unlink it.

Thank you.


=
2013/4/17 Brian Foster <bfoster@redhat.com= >
On 04/16/2013 12:24 PM, Dave Chinner wrote:
> On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote:
>> Hi,
>>
>> Thanks for the data in the previous thread:
>>
>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html=
>>
...
>>
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink/enable
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink_remove/enable
>>      ... reproduce ...
>>      cat /sys/kernel/debug/tracing/trace > trace= .output
>
> It's better to use trace-cmd for this. it will result in less
> dropped events. i.e.:
>
>       $ trace-cmd record -e xfs_iunlink\*
>       ... reproduce ...
>       ^C
>       $ trace-cmd report > trace.output
>
>> --- a/fs/xfs/linux-2.6/xfs_trace.h
>> +++ b/fs/xfs/linux-2.6/xfs_trace.h
>> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
...
>
> I would suggest that the the tracing shoul dbe at entry of the
> function, otherwise we won't get a tracepoint for the operation th= at
> triggers the shutdown. (That's the reason most tracepoints in XFS<= br> > are at function entry...)
>

Good points, thanks Dave. A v2 that pulls up the tracepoints towards<= br> function entry is appended.

Brian

>From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001
From: Brian Foster <bfoster@redhat.com>
Date: Mon, 15 Apr 2013 18:16:24 -0400
Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and
xfs_iunlink_remove

---
 fs/xfs/linux-2.6/xfs_trace.h |    2 ++
 fs/xfs/xfs_inode.c           |    = 4 ++++
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h
index adc6ec4..338a0f9 100644
--- a/fs/xfs/linux-2.6/xfs_trace.h
+++ b/fs/xfs/linux-2.6/xfs_trace.h
@@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
 DEFINE_INODE_EVENT(xfs_destroy_inode);
 DEFINE_INODE_EVENT(xfs_dirty_inode);
 DEFINE_INODE_EVENT(xfs_clear_inode);
+DEFINE_INODE_EVENT(xfs_iunlink);
+DEFINE_INODE_EVENT(xfs_iunlink_remove);

 DEFINE_INODE_EVENT(xfs_dquot_dqalloc);
 DEFINE_INODE_EVENT(xfs_dquot_dqdetach);
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 19900f0..d705c77 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1615,6 +1615,8 @@ xfs_iunlink(

        mp =3D tp->t_mountp;

+       trace_xfs_iunlink(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
@@ -1694,6 +1696,8 @@ xfs_iunlink_remove(
        mp =3D tp->t_mountp;
        agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino);

+       trace_xfs_iunlink_remove(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
--
1.7.7.6




--
=B7=FB=D3=C0=CC=CE



<= font color=3D"#888888">--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
_______= ________________________________________
xfs mailing list
xfs@oss= .sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
<= /div>



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE --047d7bd75dec7f10f104da9cf40c-- From yongtaofu@gmail.com Thu Apr 18 03:25:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F050029DFA for ; Thu, 18 Apr 2013 03:25:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A24328F8037 for ; Thu, 18 Apr 2013 01:25:41 -0700 (PDT) X-ASG-Debug-ID: 1366273538-04bdf01d6311ba10001-NocioJ Received: from mail-ia0-f169.google.com (mail-ia0-f169.google.com [209.85.210.169]) by cuda.sgi.com with ESMTP id ig3GvPdzSOluRsuo (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 18 Apr 2013 01:25:38 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.169] Received: by mail-ia0-f169.google.com with SMTP id l29so1001025iag.0 for ; Thu, 18 Apr 2013 01:25:38 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=OZmqLQwdoqZ4yOEFMD1PZ49Y+n+Ir6JVxgJFcvsuiZg=; b=ahI73k2TA0rzpVrB9uOS8GtmuZBhIAvij5vio0cWSpf2N72N6TUrV4hUWYnm6UJq0k q3eLjONgEqlgzY/oP6geMdvpO2wZWlqdGFb4GFqPfoFy+Va25htaO5D5CBnOBGJSqmhz +bcEjj5G8/N30E++4Rqc39sBMOF0xkfW910NaT0fMUdyC9uMIr19Ib5nO3cAM/goZikT OvhNd00AqiJc5+RP2FUyl7dygL75QgGdlxj+fg+xCGdn8J8D769OaCnf3+cilE+Ql/Jb tTaB+Xfbtq2GP+Mb8eYTgEa6V3wlVgdXIPvHyVVBfJPIFtASY/hPKIOTXouo9qdNviVh WlWw== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr6296934igx.11.1366273538164; Thu, 18 Apr 2013 01:25:38 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Thu, 18 Apr 2013 01:25:38 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> Date: Thu, 18 Apr 2013 16:25:38 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e0111e074e88d6304da9e5836 X-Barracuda-Connect: mail-ia0-f169.google.com[209.85.210.169] X-Barracuda-Start-Time: 1366273538 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128457 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 --089e0111e074e88d6304da9e5836 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brian and Eric, Can I change as following to bypass it? --- a/xfs_inode.c +++ b/xfs_inode.c @@ -1764,7 +1764,7 @@ xfs_iunlink_remove( */ next_agino =3D be32_to_cpu(agi->agi_unlinked[bucket_index])= ; last_ibp =3D NULL; - while (next_agino !=3D agino) { + while (next_agino !=3D agino && next_agino !=3D NULLAGINO) = { /* * If the last inode wasn't the one pointing to * us, then release its buffer since we're not @@ -1786,6 +1786,14 @@ xfs_iunlink_remove( ASSERT(next_agino !=3D NULLAGINO); ASSERT(next_agino !=3D 0); } + if (next_agino =3D=3D NULLAGINO) { + /* + *After search the list for the inode being free + *we still can't find it. + */ + xfs_err(mp, "%s ino %lld not found in unlinked list.", + __func__, (unsigned long long)ip->i_ino); + } /* * Now last_ibp points to the buffer previous to us on * the unlinked list. Pull us from the list. @@ -1810,16 +1818,20 @@ xfs_iunlink_remove( } else { xfs_trans_brelse(tp, ibp); } - /* - * Point the previous inode on the list to the next inode. - */ - last_dip->di_next_unlinked =3D cpu_to_be32(next_agino); - ASSERT(next_agino !=3D 0); - offset =3D last_offset + offsetof(xfs_dinode_t, di_next_unlinked); - xfs_trans_inode_buf(tp, last_ibp); - xfs_trans_log_buf(tp, last_ibp, offset, - (offset + sizeof(xfs_agino_t) - 1)); - xfs_inobp_check(mp, last_ibp); + if (next_agino !=3D NULLAGINO) { + /* + * If only find the inode being free then we modify + * the unlinked list. + * Point the previous inode on the list to the next inode. + */ + last_dip->di_next_unlinked =3D cpu_to_be32(next_agino); + ASSERT(next_agino !=3D 0); + offset =3D last_offset + offsetof(xfs_dinode_t, di_next_unlinked); + xfs_trans_inode_buf(tp, last_ibp); + xfs_trans_log_buf(tp, last_ibp, offset, + (offset + sizeof(xfs_agino_t) - 1)); + xfs_inobp_check(mp, last_ibp); + } } return 0; } Thank you. 2013/4/18 =B7=FB=D3=C0=CC=CE > Hi Brain and Eric, > If the problem is the agno can't be found in the unlinked list. Can we > just bypass it instead of passing ino=3D0xffffffff to xfs_inotobp? > Thank you. > > > 2013/4/18 =B7=FB=D3=C0=CC=CE > >> Hi Eric, >> The shutdown issue is still not reproduced yet. But I get the following >> error today during test. >> >> Apr 18 07:42:51 10 kernel: Call Trace: >> Apr 18 07:42:51 10 kernel: [] ? >> xfs_buf_cond_lock+0x2f/0xc0 [xfs] >> Apr 18 07:42:51 10 kernel: [] >> schedule_timeout+0x215/0x2e0 >> Apr 18 07:42:51 10 kernel: [] ? >> kmem_zone_alloc+0x77/0xf0 [xfs] >> Apr 18 07:42:51 10 kernel: [] __down+0x72/0xb0 >> Apr 18 07:42:51 10 kernel: [] ? >> _xfs_buf_find+0x102/0x280 [xfs] >> Apr 18 07:42:51 10 kernel: "echo 0 > >> /proc/sys/kernel/hung_task_timeout_secs" disables this message. >> Apr 18 07:42:51 10 kernel: glusterfsd D ffffffff8160b3c0 0 >> 14522 1 0x00000083 >> Apr 18 07:42:51 10 kernel: ffff882015a63a28 0000000000000082 >> 0000000000000000 0000000000000000 >> Apr 18 07:42:51 10 kernel: ffff882015a639b8 ffffffffa02d91ef >> ffff882015a639d8 0000000000000246 >> Apr 18 07:42:51 10 kernel: ffff880e70491af8 ffff882015a63fd8 >> 000000000000fb88 ffff880e70491af8 >> Apr 18 07:42:51 10 kernel: Call Trace: >> Apr 18 07:42:51 10 kernel: [] ? >> xfs_buf_cond_lock+0x2f/0xc0 [xfs] >> Apr 18 07:42:51 10 kernel: [] >> schedule_timeout+0x215/0x2e0 >> Apr 18 07:42:51 10 kernel: [] ? >> kmem_zone_alloc+0x77/0xf0 [xfs] >> Apr 18 07:42:51 10 kernel: [] __down+0x72/0xb0 >> Apr 18 07:42:51 10 kernel: [] ? >> _xfs_buf_find+0x102/0x280 [xfs] >> Apr 18 07:42:51 10 kernel: [] down+0x41/0x50 >> Apr 18 07:42:51 10 kernel: [] xfs_buf_lock+0x53/0x110 >> [xfs] >> Apr 18 07:42:51 10 kernel: [] _xfs_buf_find+0x102/0x28= 0 >> [xfs] >> Apr 18 07:42:51 10 kernel: [] xfs_buf_get+0x6b/0x1a0 >> [xfs] >> Apr 18 07:42:51 10 kernel: [] xfs_buf_read+0x2c/0x100 >> [xfs] >> Apr 18 07:42:51 10 kernel: [] >> xfs_trans_read_buf+0x1f8/0x400 [xfs] >> Apr 18 07:42:51 10 kernel: [] xfs_read_agi+0x74/0x100 >> [xfs] >> Apr 18 07:42:51 10 kernel: [] xfs_iunlink+0x5b/0x180 >> [xfs] >> Apr 18 07:42:51 10 kernel: [] ? >> current_fs_time+0x27/0x30 >> Apr 18 07:42:51 10 kernel: [] ? >> xfs_trans_ichgtime+0x27/0xa0 [xfs] >> Apr 18 07:42:51 10 kernel: [] xfs_droplink+0x5b/0x70 >> [xfs] >> Apr 18 07:42:51 10 kernel: [] xfs_remove+0x27e/0x3a0 >> [xfs] >> Apr 18 07:42:51 10 kernel: [] ? >> generic_permission+0x23/0xb0 >> Apr 18 07:42:51 10 kernel: [] xfs_vn_unlink+0x48/0x90 >> [xfs] >> Apr 18 07:42:51 10 kernel: [] vfs_unlink+0x9f/0xe0 >> Apr 18 07:42:51 10 kernel: [] ? lookup_hash+0x3a/0x50 >> Apr 18 07:42:51 10 kernel: [] do_unlinkat+0x183/0x1c0 >> Apr 18 07:42:51 10 kernel: [] ? >> syscall_trace_enter+0x1d8/0x1e0 >> Apr 18 07:42:51 10 kernel: [] sys_unlink+0x16/0x20 >> Apr 18 07:42:51 10 kernel: [] tracesys+0xd9/0xde >> >> Thank you. >> >> >> 2013/4/17 Eric Sandeen >> >>> On Apr 16, 2013, at 8:48 PM, =B7=FB=D3=C0=CC=CE w= rote: >>> >>> Hi Brain, >>> Can I change as following? >>> >>> >>> ASSERTS are no-ops in a non-debug kernel, so this won't change any >>> behavior. I hope we'll know more if we get new traces from your patche= d >>> kernel.... >>> >>> Eric >>> >>> --- a/xfs_inode.c >>> +++ b/xfs_inode.c >>> @@ -1773,6 +1773,8 @@ xfs_iunlink_remove( >>> if (last_ibp !=3D NULL) { >>> xfs_trans_brelse(tp, last_ibp); >>> } >>> + ASSERT(next_agino !=3D NULLAGINO); >>> + ASSERT(next_agino !=3D 0); >>> next_ino =3D XFS_AGINO_TO_INO(mp, agno, >>> next_agino); >>> error =3D xfs_inotobp(mp, tp, next_ino, &last_d= ip, >>> &last_ibp, &last_offset, 0)= ; >>> @@ -1783,8 +1785,6 @@ xfs_iunlink_remove( >>> return error; >>> } >>> next_agino =3D >>> be32_to_cpu(last_dip->di_next_unlinked); >>> - ASSERT(next_agino !=3D NULLAGINO); >>> - ASSERT(next_agino !=3D 0); >>> } >>> /* >>> * Now last_ibp points to the buffer previous to us on >>> >>> Thank you. >>> >>> >>> 2013/4/17 =B7=FB=D3=C0=CC=CE >>> >>>> Hi Brain, >>>> If it is because NULLAGINO is passed in to xfs_inotobp(). >>>> Can I move the following two lines before xfs_inotobp? >>>> >>>> For example: >>>> >>>> 1767 while (next_agino !=3D agino) { >>>> 1768 /* >>>> 1769 * If the last inode wasn't the one >>>> pointing to >>>> 1770 * us, then release its buffer since we'r= e >>>> not >>>> 1771 * going to do anything with it. >>>> 1772 */ >>>> 1773 if (last_ibp !=3D NULL) { >>>> 1774 xfs_trans_brelse(tp, last_ibp); >>>> 1775 } >>>> 1776 next_ino =3D XFS_AGINO_TO_INO(mp, agno, >>>> next_agino); >>>> + ASSERT(next_agino !=3D NULLAGINO); >>>> + ASSERT(next_agino !=3D 0); >>>> 1777 error =3D xfs_inotobp(mp, tp, next_ino, >>>> &last_dip, >>>> 1778 &last_ibp, >>>> &last_offset, 0); >>>> 1779 if (error) { >>>> 1780 xfs_warn(mp, >>>> 1781 "%s: xfs_inotobp() >>>> returned error %d.", >>>> 1782 __func__, error); >>>> 1783 return error; >>>> 1784 } >>>> 1785 next_agino =3D >>>> be32_to_cpu(last_dip->di_next_unlinked); >>>> - //ASSERT(next_agino !=3D NULLAGINO); >>>> - //ASSERT(next_agino !=3D 0); >>>> 1788 } >>>> I don't understand xfs well and correct me if I'm totally wrong. >>>> Thank you very much. >>>> >>>> >>>> 2013/4/17 =B7=FB=D3=C0=CC=CE >>>> >>>>> Hi Brain, >>>>> I want to ask a question, according to the shutdown trace. The ino in >>>>> xfs_iunlink_remove is 0x113, why xfs_imap got ino=3D0xffffffff ? >>>>> >>>>> --- xfs_imap -- module("xfs").function("xfs_imap@fs >>>>> /xfs/xfs_ialloc.c:1257").return -- return=3D0x16 >>>>> vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xfffffff= f >>>>> >>>>> --- xfs_iunlink_remove -- module("xfs").function("xfs_ >>>>> iunlink_remove@fs/xfs/xfs_inode.c:1680").return -- return=3D0x16 >>>>> vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp= =3D? >>>>> agi=3D? dip=3D? agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D?= next_agino=3D? >>>>> last_ibp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D= ? >>>>> last_offset=3D0xffffffffffff8810 error=3D? __func__=3D[...] >>>>> ip: i_ino =3D 0x113, i_flags =3D 0x0 >>>>> >>>>> Thank you. >>>>> >>>>> >>>>> >>>>> 2013/4/17 =B7=FB=D3=C0=CC=CE >>>>> >>>>>> Hi Brain, >>>>>> Thank you for your update, and I have applied your last kernel patch= . >>>>>> However it is not easy to reproduce especially in out test environme= nt. >>>>>> Till now is not happens again. I'll update the kernel patch now. BTW= is >>>>>> there any findings in the logs of previous thread? >>>>>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>>>>> I guess it tend to happen during glusterfs rebalance because >>>>>> glusterfs moves a lot of file from one server to another and then un= link it. >>>>>> >>>>>> Thank you. >>>>>> >>>>>> >>>>>> 2013/4/17 Brian Foster >>>>>> >>>>>>> On 04/16/2013 12:24 PM, Dave Chinner wrote: >>>>>>> > On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote: >>>>>>> >> Hi, >>>>>>> >> >>>>>>> >> Thanks for the data in the previous thread: >>>>>>> >> >>>>>>> >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>>>>>> >> >>>>>>> ... >>>>>>> >> >>>>>>> >> echo 1 > >>>>>>> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable >>>>>>> >> echo 1 > >>>>>>> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable >>>>>>> >> ... reproduce ... >>>>>>> >> cat /sys/kernel/debug/tracing/trace > trace.output >>>>>>> > >>>>>>> > It's better to use trace-cmd for this. it will result in less >>>>>>> > dropped events. i.e.: >>>>>>> > >>>>>>> > $ trace-cmd record -e xfs_iunlink\* >>>>>>> > ... reproduce ... >>>>>>> > ^C >>>>>>> > $ trace-cmd report > trace.output >>>>>>> > >>>>>>> >> --- a/fs/xfs/linux-2.6/xfs_trace.h >>>>>>> >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >>>>>>> >> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >>>>>>> ... >>>>>>> > >>>>>>> > I would suggest that the the tracing shoul dbe at entry of the >>>>>>> > function, otherwise we won't get a tracepoint for the operation >>>>>>> that >>>>>>> > triggers the shutdown. (That's the reason most tracepoints in XFS >>>>>>> > are at function entry...) >>>>>>> > >>>>>>> >>>>>>> Good points, thanks Dave. A v2 that pulls up the tracepoints toward= s >>>>>>> function entry is appended. >>>>>>> >>>>>>> Brian >>>>>>> >>>>>>> From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 >>>>>>> 2001 >>>>>>> From: Brian Foster >>>>>>> Date: Mon, 15 Apr 2013 18:16:24 -0400 >>>>>>> Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and >>>>>>> xfs_iunlink_remove >>>>>>> >>>>>>> --- >>>>>>> fs/xfs/linux-2.6/xfs_trace.h | 2 ++ >>>>>>> fs/xfs/xfs_inode.c | 4 ++++ >>>>>>> 2 files changed, 6 insertions(+), 0 deletions(-) >>>>>>> >>>>>>> diff --git a/fs/xfs/linux-2.6/xfs_trace.h >>>>>>> b/fs/xfs/linux-2.6/xfs_trace.h >>>>>>> index adc6ec4..338a0f9 100644 >>>>>>> --- a/fs/xfs/linux-2.6/xfs_trace.h >>>>>>> +++ b/fs/xfs/linux-2.6/xfs_trace.h >>>>>>> @@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); >>>>>>> DEFINE_INODE_EVENT(xfs_destroy_inode); >>>>>>> DEFINE_INODE_EVENT(xfs_dirty_inode); >>>>>>> DEFINE_INODE_EVENT(xfs_clear_inode); >>>>>>> +DEFINE_INODE_EVENT(xfs_iunlink); >>>>>>> +DEFINE_INODE_EVENT(xfs_iunlink_remove); >>>>>>> >>>>>>> DEFINE_INODE_EVENT(xfs_dquot_dqalloc); >>>>>>> DEFINE_INODE_EVENT(xfs_dquot_dqdetach); >>>>>>> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c >>>>>>> index 19900f0..d705c77 100644 >>>>>>> --- a/fs/xfs/xfs_inode.c >>>>>>> +++ b/fs/xfs/xfs_inode.c >>>>>>> @@ -1615,6 +1615,8 @@ xfs_iunlink( >>>>>>> >>>>>>> mp =3D tp->t_mountp; >>>>>>> >>>>>>> + trace_xfs_iunlink(ip); >>>>>>> + >>>>>>> /* >>>>>>> * Get the agi buffer first. It ensures lock ordering >>>>>>> * on the list. >>>>>>> @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( >>>>>>> mp =3D tp->t_mountp; >>>>>>> agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino); >>>>>>> >>>>>>> + trace_xfs_iunlink_remove(ip); >>>>>>> + >>>>>>> /* >>>>>>> * Get the agi buffer first. It ensures lock ordering >>>>>>> * on the list. >>>>>>> -- >>>>>>> 1.7.7.6 >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> =B7=FB=D3=C0=CC=CE >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> =B7=FB=D3=C0=CC=CE >>>>> >>>> >>>> >>>> >>>> -- >>>> =B7=FB=D3=C0=CC=CE >>>> >>> >>> >>> >>> -- >>> =B7=FB=D3=C0=CC=CE >>> >>> _______________________________________________ >>> xfs mailing list >>> xfs@oss.sgi.com >>> http://oss.sgi.com/mailman/listinfo/xfs >>> >>> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --089e0111e074e88d6304da9e5836 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brian and Eric,
Can I change as foll= owing to bypass it?
--- a/xfs_inode.c
+++ b/xfs_inode.c
@@ -1764,7= +1764,7 @@ xfs_iunlink_remove(
      &nbs= p;          */
  =             &nb= sp; next_agino =3D be32_to_cpu(agi->agi_unlinked[bucket_index]);
            &nb= sp;   last_ibp =3D NULL;
-      =          while (next_agino !=3D agi= no) {
+           = ;    while (next_agino !=3D agino && next_agino !=3D= NULLAGINO) {
         &nbs= p;            &= nbsp; /*
          &nb= sp;            =   * If the last inode wasn't the one pointing to
            &nb= sp;            * us,= then release its buffer since we're not
@@ -1786,6 +1786,14 @@ xfs_= iunlink_remove(
         &n= bsp;            = ;  ASSERT(next_agino !=3D NULLAGINO);
     = ;            &n= bsp;      ASSERT(next_agino !=3D 0);
            &nb= sp;   }
+         = ;      if (next_agino =3D=3D NULLAGINO) {
+&nbs= p;            &= nbsp;         /*
+  &n= bsp;            = ;         *After search the list fo= r the inode being free
+        =             &nb= sp;   *we still can't find it.
+            &n= bsp;           */
+&nb= sp;            =           xfs_err(mp, "%s= ino %lld not found in unlinked list.",
+    &= nbsp;           &nbs= p;            &= nbsp;      __func__, (unsigned long long)ip->i_= ino);
+           = ;    }
            &nb= sp;   /*
         = ;        * Now last_ibp points to the bu= ffer previous to us on
        &= nbsp;        * the unlinked list.  = Pull us from the list.
@@ -1810,16 +1818,20 @@ xfs_iunlink_remove(
&n= bsp;            = ;   } else {
            &nb= sp;           xfs_trans_b= relse(tp, ibp);
         &n= bsp;      }
-     &nbs= p;         /*
-   = ;             *= Point the previous inode on the list to the next inode.
-  &n= bsp;            = ; */
-           =     last_dip->di_next_unlinked =3D cpu_to_be32(next_agino= );
-            &n= bsp;  ASSERT(next_agino !=3D 0);
-     &nb= sp;         offset =3D last_offset = + offsetof(xfs_dinode_t, di_next_unlinked);
-    &nb= sp;          xfs_trans_inode_b= uf(tp, last_ibp);
-         = ;      xfs_trans_log_buf(tp, last_ibp, offset,
-            &n= bsp;            = ;        (offset + sizeof(xfs_agino_t) -= 1));
-           = ;    xfs_inobp_check(mp, last_ibp);
+   &n= bsp;           if (next_a= gino !=3D NULLAGINO) {
+        =             &nb= sp;  /*
+         &nbs= p;             = * If only find the inode being free then we modify
+            &n= bsp;          * the unlinked l= ist.
+           =             * Point = the previous inode on the list to the next inode.
+   &nb= sp;            =        */
+     &= nbsp;           &nbs= p;     last_dip->di_next_unlinked =3D cpu_to_be32(ne= xt_agino);
+            &n= bsp;          ASSERT(next_agin= o !=3D 0);
+          =              of= fset =3D last_offset + offsetof(xfs_dinode_t, di_next_unlinked);
+ =             &nb= sp;         xfs_trans_inode_buf(tp,= last_ibp);
+          = ;             x= fs_trans_log_buf(tp, last_ibp, offset,
+            &n= bsp;            = ;            &n= bsp;   (offset + sizeof(xfs_agino_t) - 1));
+   = ;            &n= bsp;       xfs_inobp_check(mp, last_ibp);
= +            &n= bsp;  }
        }
  = ;      return 0;
 }

Thank you= .


2013/4/= 18 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brain and Eric,
If the problem is th= e agno can't be found in the unlinked list. Can we just bypass it inste= ad of passing ino=3D0xffffffff to xfs_inotobp?
Thank you.


2013/4/18 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Eric,
The shutdown issue is still no= t reproduced yet. But I get the following error today during test.

A= pr 18 07:42:51 10 kernel: Call Trace:
Apr 18 07:42:51 10 kernel: [<ff= ffffffa02d91ef>] ? xfs_buf_cond_lock+0x2f/0xc0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff814fe6a5>] schedule_timeout+0x21= 5/0x2e0
Apr 18 07:42:51 10 kernel: [<ffffffffa02d5f07>] ? kmem_zon= e_alloc+0x77/0xf0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff814ff5c2= >] __down+0x72/0xb0
Apr 18 07:42:51 10 kernel: [<ffffffffa02da652>] ? _xfs_buf_find+0x102= /0x280 [xfs]
Apr 18 07:42:51 10 kernel: "echo 0 > /proc/sys/kern= el/hung_task_timeout_secs" disables this message.
Apr 18 07:42:51 1= 0 kernel: glusterfsd    D ffffffff8160b3c0   =   0 14522      1 0x00000083
Apr 18 07:42:51 10 kernel: ffff882015a63a28 0000000000000082 00000000000000= 00 0000000000000000
Apr 18 07:42:51 10 kernel: ffff882015a639b8 ffffffff= a02d91ef ffff882015a639d8 0000000000000246
Apr 18 07:42:51 10 kernel: ff= ff880e70491af8 ffff882015a63fd8 000000000000fb88 ffff880e70491af8
Apr 18 07:42:51 10 kernel: Call Trace:
Apr 18 07:42:51 10 kernel: [<f= fffffffa02d91ef>] ? xfs_buf_cond_lock+0x2f/0xc0 [xfs]
Apr 18 07:42:51= 10 kernel: [<ffffffff814fe6a5>] schedule_timeout+0x215/0x2e0
Apr 18 07:42:51 10 kernel: [<ffffffffa02d5f07>] ? kmem_zone_alloc+0x7= 7/0xf0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff814ff5c2>] __dow= n+0x72/0xb0
Apr 18 07:42:51 10 kernel: [<ffffffffa02da652>] ? _xfs= _buf_find+0x102/0x280 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff81097ef1>] down+0x41/0x50
Apr= 18 07:42:51 10 kernel: [<ffffffffa02da493>] xfs_buf_lock+0x53/0x110 = [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02da652>] _xfs_buf_fin= d+0x102/0x280 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02da83b>] xfs_buf_get+0x6b/0x1a= 0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02daeac>] xfs_buf_re= ad+0x2c/0x100 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02d0af8>= ] xfs_trans_read_buf+0x1f8/0x400 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02b3444>] xfs_read_agi+0x74/0x1= 00 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02b967b>] xfs_iunli= nk+0x5b/0x180 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff810724c7>= ] ? current_fs_time+0x27/0x30
Apr 18 07:42:51 10 kernel: [<ffffffffa02d12a7>] ? xfs_trans_ichgtime+= 0x27/0xa0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02d15fb>] xf= s_droplink+0x5b/0x70 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffffa02d2= f9e>] xfs_remove+0x27e/0x3a0 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff81186fd3>] ? generic_permission+= 0x23/0xb0
Apr 18 07:42:51 10 kernel: [<ffffffffa02e0968>] xfs_vn_u= nlink+0x48/0x90 [xfs]
Apr 18 07:42:51 10 kernel: [<ffffffff81188c0f&g= t;] vfs_unlink+0x9f/0xe0
Apr 18 07:42:51 10 kernel: [<ffffffff8118795a>] ? lookup_hash+0x3a/0x= 50
Apr 18 07:42:51 10 kernel: [<ffffffff8118b143>] do_unlinkat+0x1= 83/0x1c0
Apr 18 07:42:51 10 kernel: [<ffffffff81017938>] ? syscall= _trace_enter+0x1d8/0x1e0
Apr 18 07:42:51 10 kernel: [<ffffffff8118b196>] sys_unlink+0x16/0x20<= br>Apr 18 07:42:51 10 kernel: [<ffffffff8100b308>] tracesys+0xd9/0xde=

Thank you.


2013/4/17 Eric Sandeen <sandeen@sandeen.net>
On Apr 16, 2013, at 8:48 PM, =B7=FB=D3=C0=CC=CE= <yongtaofu@gma= il.com> wrote:

Hi Brain,
Can I change as following?

ASSERTS are no-ops in a non-debug kernel, so= this won't change any behavior.  I hope we'll know more if we= get new traces from your patched kernel....

Eric

=
--- a/xfs_inode.c
+++ b/xfs_inode.c
@@ -1773,6 = +1773,8 @@ xfs_iunlink_remove(
       = ;            &n= bsp;    if (last_ibp !=3D NULL) {
            &nb= sp;            =        xfs_trans_brelse(tp, last_ibp);
            &nb= sp;           }
+ = ;            &n= bsp;          ASSERT(next_agin= o !=3D NULLAGINO);
+        &nbs= p;            &= nbsp;  ASSERT(next_agino !=3D 0);
     &nb= sp;            =       next_ino =3D XFS_AGINO_TO_INO(mp, agno, next= _agino);
            &nb= sp;           error =3D x= fs_inotobp(mp, tp, next_ino, &last_dip,
    &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp; &last_ibp, &last_offset, 0);
@@ -1783,8 +1785,6 @@ xfs_iun= link_remove(
          = ;            &n= bsp;         return error;
            &nb= sp;           }
 =             &nb= sp;          next_agino =3D be= 32_to_cpu(last_dip->di_next_unlinked);
-     = ;            &n= bsp;     ASSERT(next_agino !=3D NULLAGINO);
- &= nbsp;           &nbs= p;         ASSERT(next_agino !=3D 0= );
            &nb= sp;   }
         =        /*
     &n= bsp;           * Now last= _ibp points to the buffer previous to us on

Thank you.


2013/4/17 = =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brain,
If it is because NULLAGINO is passed in  to xfs_inotobp().
<= /div>Can I move the following two lines before xfs_inotobp?

For example:

1767        = ;         while (next_agino !=3D ag= ino) {
1768            = ;             /= *
1769           =             &nb= sp;  * If the last inode wasn't the one pointing to
1770 &= nbsp;           &nbs= p;            * us, = then release its buffer since we're not
1771    =             &nb= sp;         * going to do anything = with it.
1772            = ;            &n= bsp; */
1773          =             &nb= sp;  if (last_ibp !=3D NULL) {
1774     &n= bsp;            = ;            &n= bsp;  xfs_trans_brelse(tp, last_ibp);
1775    &= nbsp;           &nbs= p;        }
1776   &nb= sp;            =          next_ino =3D XFS_AGINO_TO_= INO(mp, agno, next_agino);
+            &n= bsp;             &nb= sp;    ASSERT(next_agino !=3D NULLAGINO);
+   &= nbsp;           &nbs= p;               ASSERT(next_a= gino !=3D 0);
1777         =             &nb= sp;   error =3D xfs_inotobp(mp, tp, next_ino, &last_dip,
1= 778            =             &nb= sp;            =         &last_ibp, &last_offset,= 0);
1779            = ;             i= f (error) {
1780         &n= bsp;            = ;           xfs_warn(mp,<= br>1781           &n= bsp;            = ;            &n= bsp;    "%s: xfs_inotobp() returned error %d.",1782           &nbs= p;            &= nbsp;           &nbs= p;    __func__, error);
1783            = ;            &n= bsp;        return error;
1784 &= nbsp;           &nbs= p;           }
1785&nb= sp;            =             next_agi= no =3D be32_to_cpu(last_dip->di_next_unlinked);
-   &n= bsp;            = ;               //ASSERT(= next_agino !=3D NULLAGINO);
-            &n= bsp;            = ;      //ASSERT(next_agino !=3D 0);
1788 &= nbsp;           &nbs= p;   }
I don't understand xfs well and correct me if= I'm totally wrong.
Thank you very much.


2013/4/17 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brain,
I want to ask a question, according to the s= hutdown trace. The ino in  xfs_iunlink_remove is 0x113, why xfs_imap got ino=3D0xffffffff ? =

---= xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1= 257").return -- return=3D0x16
vars: mp=3D0xff= ff882017a50800 tp=3D0xffff881c81797c70 ino=3D0xffffffff

--- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_rem= ove@fs/xfs/xfs_inode.c:1680").return -- return=3D0x16
vars: tp=3D0xff= ff881c81797c70 ip=3D0xffff881003c13c00 next_ino=3D? mp=3D? agi=3D? dip=3D? = agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D? next_agino=3D? last_i= bp=3D? last_dip=3D0xffff882000000000 bucket_index=3D? offset=3D? last_offse= t=3D0xffffffffffff8810 error=3D? __func__=3D[...]
ip: i_ino =3D 0= x113, i_flags =3D 0x0

Thank you.



2013/4/17 =B7=FB=D3=C0=CC=CE <yongt= aofu@gmail.com>
Hi Brain,
Thank you for your update, an= d I have applied your last kernel patch. However it is not easy to reproduc= e especially in out test environment. Till now is not happens again. I'= ll update the kernel patch now. BTW is there any findings in the logs of pr= evious thread?
http://oss.sgi.com/archives/xfs/2013-04/msg00327.html
I gue= ss it tend to happen during glusterfs rebalance because glusterfs moves a l= ot of file from one server to another and then unlink it.

Thank you.


=
2013/4/17 Brian Foster <bfoster@redhat.com= >
On 04/16/2013 12:24 PM, Dave Chinner wrote:
> On Mon, Apr 15, 2013 at 07:14:39PM -0400, Brian Foster wrote:
>> Hi,
>>
>> Thanks for the data in the previous thread:
>>
>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html=
>>
...
>>
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink/enable
>>      echo 1 > /sys/kernel/debug/tracing/events/x= fs/xfs_iunlink_remove/enable
>>      ... reproduce ...
>>      cat /sys/kernel/debug/tracing/trace > trace= .output
>
> It's better to use trace-cmd for this. it will result in less
> dropped events. i.e.:
>
>       $ trace-cmd record -e xfs_iunlink\*
>       ... reproduce ...
>       ^C
>       $ trace-cmd report > trace.output
>
>> --- a/fs/xfs/linux-2.6/xfs_trace.h
>> +++ b/fs/xfs/linux-2.6/xfs_trace.h
>> @@ -581,6 +581,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
...
>
> I would suggest that the the tracing shoul dbe at entry of the
> function, otherwise we won't get a tracepoint for the operation th= at
> triggers the shutdown. (That's the reason most tracepoints in XFS<= br> > are at function entry...)
>

Good points, thanks Dave. A v2 that pulls up the tracepoints towards<= br> function entry is appended.

Brian

>From 280943e78ebe0b97a774cba51e7815c42f044b55 Mon Sep 17 00:00:00 2001
From: Brian Foster <bfoster@redhat.com>
Date: Mon, 15 Apr 2013 18:16:24 -0400
Subject: [PATCH v2] xfs: add tracepoints for xfs_iunlink and
xfs_iunlink_remove

---
 fs/xfs/linux-2.6/xfs_trace.h |    2 ++
 fs/xfs/xfs_inode.c           |    = 4 ++++
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h
index adc6ec4..338a0f9 100644
--- a/fs/xfs/linux-2.6/xfs_trace.h
+++ b/fs/xfs/linux-2.6/xfs_trace.h
@@ -583,6 +583,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync);
 DEFINE_INODE_EVENT(xfs_destroy_inode);
 DEFINE_INODE_EVENT(xfs_dirty_inode);
 DEFINE_INODE_EVENT(xfs_clear_inode);
+DEFINE_INODE_EVENT(xfs_iunlink);
+DEFINE_INODE_EVENT(xfs_iunlink_remove);

 DEFINE_INODE_EVENT(xfs_dquot_dqalloc);
 DEFINE_INODE_EVENT(xfs_dquot_dqdetach);
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 19900f0..d705c77 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1615,6 +1615,8 @@ xfs_iunlink(

        mp =3D tp->t_mountp;

+       trace_xfs_iunlink(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
@@ -1694,6 +1696,8 @@ xfs_iunlink_remove(
        mp =3D tp->t_mountp;
        agno =3D XFS_INO_TO_AGNO(mp, ip->i_ino);

+       trace_xfs_iunlink_remove(ip);
+
        /*
         * Get the agi buffer first.  It ensu= res lock ordering
         * on the list.
--
1.7.7.6




--
=B7=FB=D3=C0=CC=CE



<= font color=3D"#888888">--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
_______= ________________________________________
xfs mailing list
xfs@oss= .sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
<= /div>



<= font color=3D"#888888">--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE --089e0111e074e88d6304da9e5836-- From rjohnston@sgi.com Thu Apr 18 06:03:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24, RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from lnx-rjohnston2.americas.sgi.com (lnx-rjohnston2.americas.sgi.com [128.162.233.55]) by oss.sgi.com (Postfix) with ESMTP id C447B7F53 for ; Thu, 18 Apr 2013 06:03:17 -0500 (CDT) Received: from lnx-rjohnston2.americas.sgi.com (localhost [127.0.0.1]) by lnx-rjohnston2.americas.sgi.com (8.14.4/8.14.4/Debian-2ubuntu2) with ESMTP id r3IB3MIs028466 for ; Thu, 18 Apr 2013 06:03:22 -0500 Received: (from rjohnston@localhost) by lnx-rjohnston2.americas.sgi.com (8.14.4/8.14.4/Submit) id r3IB3Laa028465; Thu, 18 Apr 2013 06:03:21 -0500 X-Authentication-Warning: lnx-rjohnston2.americas.sgi.com: rjohnston set sender to rjohnston@sgi.com using -f Message-Id: <20130417183323.465181485@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Wed, 17 Apr 2013 13:32:53 -0500 From: rjohnston@sgi.com To: xfs@oss.sgi.com Subject: [PATCH] xfsprogs: xfs_quota allow user or group names beginning with digits Content-Disposition: inline; filename=xfsprogs-xfs_quota-allow-user-or-group-names-beginning-with-digits.patch xfs_quota does not properly parse users or groups that begin with a number. Only call atoi when user or group consists of digits only. Signed-off-by: Rich Johnston --- include/input.h | 1 + libxcmd/input.c | 12 ++++++++++++ quota/quota.c | 4 ++-- quota/quota.h | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) Index: b/include/input.h =================================================================== --- a/include/input.h +++ b/include/input.h @@ -46,6 +46,7 @@ extern void timestr(struct timeval *tv, extern uid_t uid_from_string(char *user); extern gid_t gid_from_string(char *group); extern prid_t prid_from_string(char *project); +extern boolean_t isdigits_only(const char *str); #define HAVE_FTW_H 1 /* TODO: configure me */ Index: b/libxcmd/input.c =================================================================== --- a/libxcmd/input.c +++ b/libxcmd/input.c @@ -398,6 +398,18 @@ gid_from_string( return -1; } +boolean_t isdigits_only( + const char *str) +{ + int i; + + for (i=0; i < strlen(str); i++) { + if (!isdigit(str[i])) + return B_FALSE; + } + return B_TRUE; +} + #define HAVE_FTW_H 1 /* TODO: configure me */ #ifndef HAVE_FTW_H Index: b/quota/quota.c =================================================================== --- a/quota/quota.c +++ b/quota/quota.c @@ -224,7 +224,7 @@ quota_user_type( uid_t id; if (name) { - if (isdigit(name[0])) { + if (isdigits_only(name)) { id = atoi(name); name = getusername(id, flags & NO_LOOKUP_FLAG); } else if ((u = getpwnam(name))) { @@ -273,7 +273,7 @@ quota_group_type( int i, ngroups, dofree = 0; if (name) { - if (isdigit(name[0])) { + if (isdigits_only(name)) { gid = atoi(name); name = getgroupname(gid, flags & NO_LOOKUP_FLAG); } else { Index: b/quota/quota.h =================================================================== --- a/quota/quota.h +++ b/quota/quota.h @@ -80,4 +80,5 @@ enum { extern char *uid_to_name(__uint32_t __uid); extern char *gid_to_name(__uint32_t __gid); extern char *prid_to_name(__uint32_t __prid); +extern boolean_t isdigits_only(const char *); From bfoster@redhat.com Thu Apr 18 06:44:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AF32C29DFA for ; Thu, 18 Apr 2013 06:44:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 52C5F8F804B for ; Thu, 18 Apr 2013 04:43:58 -0700 (PDT) X-ASG-Debug-ID: 1366285437-04bdf01d6312a690001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TNT5eWZAxKWxyO7O for ; Thu, 18 Apr 2013 04:43:57 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3IBhtGj023675 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 18 Apr 2013 07:43:55 -0400 Received: from laptop.bfoster (vpn-63-228.rdu2.redhat.com [10.10.63.228]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3IBhrsj031048 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 18 Apr 2013 07:43:54 -0400 Message-ID: <516FDBDE.1070406@redhat.com> Date: Thu, 18 Apr 2013 07:41:18 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366285437 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com On 04/18/2013 04:25 AM, 符永涛 wrote: > Hi Brian and Eric, > Can I change as following to bypass it? This is probably not a wise thing to do. The problem we're seeing here is indicative of a potentially larger problem than this particular error path. An inode is being unlinked and inactivated, but we aren't finding on the list where we expect it to be. Killing the error return doesn't eliminate the larger problem. So while changes could end up being made in this area as part of a fix, I would not suggest making any changes beyond those designed to help debug until we have a better idea of root cause. Brian > --- a/xfs_inode.c > +++ b/xfs_inode.c > @@ -1764,7 +1764,7 @@ xfs_iunlink_remove( > */ > next_agino = be32_to_cpu(agi->agi_unlinked[bucket_index]); > last_ibp = NULL; > - while (next_agino != agino) { > + while (next_agino != agino && next_agino != NULLAGINO) { > /* > * If the last inode wasn't the one pointing to > * us, then release its buffer since we're not > @@ -1786,6 +1786,14 @@ xfs_iunlink_remove( > ASSERT(next_agino != NULLAGINO); > ASSERT(next_agino != 0); > } > + if (next_agino == NULLAGINO) { > + /* > + *After search the list for the inode being free > + *we still can't find it. > + */ > + xfs_err(mp, "%s ino %lld not found in unlinked > list.", > + __func__, (unsigned long > long)ip->i_ino); > + } > /* > * Now last_ibp points to the buffer previous to us on > * the unlinked list. Pull us from the list. > @@ -1810,16 +1818,20 @@ xfs_iunlink_remove( > } else { > xfs_trans_brelse(tp, ibp); > } > - /* > - * Point the previous inode on the list to the next inode. > - */ > - last_dip->di_next_unlinked = cpu_to_be32(next_agino); > - ASSERT(next_agino != 0); > - offset = last_offset + offsetof(xfs_dinode_t, > di_next_unlinked); > - xfs_trans_inode_buf(tp, last_ibp); > - xfs_trans_log_buf(tp, last_ibp, offset, > - (offset + sizeof(xfs_agino_t) - 1)); > - xfs_inobp_check(mp, last_ibp); > + if (next_agino != NULLAGINO) { > + /* > + * If only find the inode being free then we modify > + * the unlinked list. > + * Point the previous inode on the list to the > next inode. > + */ > + last_dip->di_next_unlinked = > cpu_to_be32(next_agino); > + ASSERT(next_agino != 0); > + offset = last_offset + offsetof(xfs_dinode_t, > di_next_unlinked); > + xfs_trans_inode_buf(tp, last_ibp); > + xfs_trans_log_buf(tp, last_ibp, offset, > + (offset + sizeof(xfs_agino_t) > - 1)); > + xfs_inobp_check(mp, last_ibp); > + } > } > return 0; > } > > Thank you. > > > 2013/4/18 符永涛 > > > Hi Brain and Eric, > If the problem is the agno can't be found in the unlinked list. Can > we just bypass it instead of passing ino=0xffffffff to xfs_inotobp? > Thank you. > > > 2013/4/18 符永涛 > > > Hi Eric, > The shutdown issue is still not reproduced yet. But I get the > following error today during test. > > Apr 18 07:42:51 10 kernel: Call Trace: > Apr 18 07:42:51 10 kernel: [] ? > xfs_buf_cond_lock+0x2f/0xc0 [xfs] > Apr 18 07:42:51 10 kernel: [] > schedule_timeout+0x215/0x2e0 > Apr 18 07:42:51 10 kernel: [] ? > kmem_zone_alloc+0x77/0xf0 [xfs] > Apr 18 07:42:51 10 kernel: [] __down+0x72/0xb0 > Apr 18 07:42:51 10 kernel: [] ? > _xfs_buf_find+0x102/0x280 [xfs] > Apr 18 07:42:51 10 kernel: "echo 0 > > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Apr 18 07:42:51 10 kernel: glusterfsd D ffffffff8160b3c0 > 0 14522 1 0x00000083 > Apr 18 07:42:51 10 kernel: ffff882015a63a28 0000000000000082 > 0000000000000000 0000000000000000 > Apr 18 07:42:51 10 kernel: ffff882015a639b8 ffffffffa02d91ef > ffff882015a639d8 0000000000000246 > Apr 18 07:42:51 10 kernel: ffff880e70491af8 ffff882015a63fd8 > 000000000000fb88 ffff880e70491af8 > Apr 18 07:42:51 10 kernel: Call Trace: > Apr 18 07:42:51 10 kernel: [] ? > xfs_buf_cond_lock+0x2f/0xc0 [xfs] > Apr 18 07:42:51 10 kernel: [] > schedule_timeout+0x215/0x2e0 > Apr 18 07:42:51 10 kernel: [] ? > kmem_zone_alloc+0x77/0xf0 [xfs] > Apr 18 07:42:51 10 kernel: [] __down+0x72/0xb0 > Apr 18 07:42:51 10 kernel: [] ? > _xfs_buf_find+0x102/0x280 [xfs] > Apr 18 07:42:51 10 kernel: [] down+0x41/0x50 > Apr 18 07:42:51 10 kernel: [] > xfs_buf_lock+0x53/0x110 [xfs] > Apr 18 07:42:51 10 kernel: [] > _xfs_buf_find+0x102/0x280 [xfs] > Apr 18 07:42:51 10 kernel: [] > xfs_buf_get+0x6b/0x1a0 [xfs] > Apr 18 07:42:51 10 kernel: [] > xfs_buf_read+0x2c/0x100 [xfs] > Apr 18 07:42:51 10 kernel: [] > xfs_trans_read_buf+0x1f8/0x400 [xfs] > Apr 18 07:42:51 10 kernel: [] > xfs_read_agi+0x74/0x100 [xfs] > Apr 18 07:42:51 10 kernel: [] > xfs_iunlink+0x5b/0x180 [xfs] > Apr 18 07:42:51 10 kernel: [] ? > current_fs_time+0x27/0x30 > Apr 18 07:42:51 10 kernel: [] ? > xfs_trans_ichgtime+0x27/0xa0 [xfs] > Apr 18 07:42:51 10 kernel: [] > xfs_droplink+0x5b/0x70 [xfs] > Apr 18 07:42:51 10 kernel: [] > xfs_remove+0x27e/0x3a0 [xfs] > Apr 18 07:42:51 10 kernel: [] ? > generic_permission+0x23/0xb0 > Apr 18 07:42:51 10 kernel: [] > xfs_vn_unlink+0x48/0x90 [xfs] > Apr 18 07:42:51 10 kernel: [] vfs_unlink+0x9f/0xe0 > Apr 18 07:42:51 10 kernel: [] ? > lookup_hash+0x3a/0x50 > Apr 18 07:42:51 10 kernel: [] > do_unlinkat+0x183/0x1c0 > Apr 18 07:42:51 10 kernel: [] ? > syscall_trace_enter+0x1d8/0x1e0 > Apr 18 07:42:51 10 kernel: [] sys_unlink+0x16/0x20 > Apr 18 07:42:51 10 kernel: [] tracesys+0xd9/0xde > > Thank you. > > > 2013/4/17 Eric Sandeen > > > On Apr 16, 2013, at 8:48 PM, 符永涛 > wrote: > >> Hi Brain, >> Can I change as following? > > ASSERTS are no-ops in a non-debug kernel, so this won't > change any behavior. I hope we'll know more if we get new > traces from your patched kernel.... > > Eric > >> --- a/xfs_inode.c >> +++ b/xfs_inode.c >> @@ -1773,6 +1773,8 @@ xfs_iunlink_remove( >> if (last_ibp != NULL) { >> xfs_trans_brelse(tp, >> last_ibp); >> } >> + ASSERT(next_agino != NULLAGINO); >> + ASSERT(next_agino != 0); >> next_ino = XFS_AGINO_TO_INO(mp, >> agno, next_agino); >> error = xfs_inotobp(mp, tp, >> next_ino, &last_dip, >> &last_ibp, >> &last_offset, 0); >> @@ -1783,8 +1785,6 @@ xfs_iunlink_remove( >> return error; >> } >> next_agino = >> be32_to_cpu(last_dip->di_next_unlinked); >> - ASSERT(next_agino != NULLAGINO); >> - ASSERT(next_agino != 0); >> } >> /* >> * Now last_ibp points to the buffer >> previous to us on >> >> Thank you. >> >> >> 2013/4/17 符永涛 > > >> >> Hi Brain, >> If it is because NULLAGINO is passed in to xfs_inotobp(). >> Can I move the following two lines before xfs_inotobp? >> >> For example: >> >> 1767 while (next_agino != agino) { >> 1768 /* >> 1769 * If the last inode >> wasn't the one pointing to >> 1770 * us, then release its >> buffer since we're not >> 1771 * going to do anything >> with it. >> 1772 */ >> 1773 if (last_ibp != NULL) { >> 1774 >> xfs_trans_brelse(tp, last_ibp); >> 1775 } >> 1776 next_ino = >> XFS_AGINO_TO_INO(mp, agno, next_agino); >> + ASSERT(next_agino != >> NULLAGINO); >> + ASSERT(next_agino != 0); >> 1777 error = xfs_inotobp(mp, >> tp, next_ino, &last_dip, >> 1778 >> &last_ibp, &last_offset, 0); >> 1779 if (error) { >> 1780 xfs_warn(mp, >> 1781 "%s: >> xfs_inotobp() returned error %d.", >> 1782 __func__, >> error); >> 1783 return error; >> 1784 } >> 1785 next_agino = >> be32_to_cpu(last_dip->di_next_unlinked); >> - //ASSERT(next_agino != >> NULLAGINO); >> - //ASSERT(next_agino != 0); >> 1788 } >> I don't understand xfs well and correct me if I'm >> totally wrong. >> Thank you very much. >> >> >> 2013/4/17 符永涛 > > >> >> Hi Brain, >> I want to ask a question, according to the >> shutdown trace. The ino in xfs_iunlink_remove >> is 0x113, why xfs_imap got ino=0xffffffff ? >> >> --- xfs_imap -- >> module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return >> -- return=0x16 >> vars: mp=0xffff882017a50800 tp=0xffff881c81797c70 >> ino=0xffffffff >> >> --- xfs_iunlink_remove -- >> module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return >> -- return=0x16 >> vars: tp=0xffff881c81797c70 ip=0xffff881003c13c00 >> next_ino=? mp=? agi=? dip=? >> agibp=0xffff880109b47e20 ibp=? agno=? agino=? >> next_agino=? last_ibp=? >> last_dip=0xffff882000000000 bucket_index=? >> offset=? last_offset=0xffffffffffff8810 error=? >> __func__=[...] >> ip: i_ino = 0x113, i_flags = 0x0 >> >> Thank you. >> >> >> >> 2013/4/17 符永涛 > > >> >> Hi Brain, >> Thank you for your update, and I have applied >> your last kernel patch. However it is not easy >> to reproduce especially in out test >> environment. Till now is not happens again. >> I'll update the kernel patch now. BTW is there >> any findings in the logs of previous thread? >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >> I guess it tend to happen during glusterfs >> rebalance because glusterfs moves a lot of >> file from one server to another and then >> unlink it. >> >> Thank you. >> >> >> 2013/4/17 Brian Foster > > >> >> On 04/16/2013 12:24 PM, Dave Chinner wrote: >> > On Mon, Apr 15, 2013 at 07:14:39PM >> -0400, Brian Foster wrote: >> >> Hi, >> >> >> >> Thanks for the data in the previous thread: >> >> >> >> >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >> >> >> ... >> >> >> >> echo 1 > >> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable >> >> echo 1 > >> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable >> >> ... reproduce ... >> >> cat >> /sys/kernel/debug/tracing/trace > trace.output >> > >> > It's better to use trace-cmd for this. >> it will result in less >> > dropped events. i.e.: >> > >> > $ trace-cmd record -e xfs_iunlink\* >> > ... reproduce ... >> > ^C >> > $ trace-cmd report > trace.output >> > >> >> --- a/fs/xfs/linux-2.6/xfs_trace.h >> >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >> >> @@ -581,6 +581,8 @@ >> DEFINE_INODE_EVENT(xfs_file_fsync); >> ... >> > >> > I would suggest that the the tracing >> shoul dbe at entry of the >> > function, otherwise we won't get a >> tracepoint for the operation that >> > triggers the shutdown. (That's the >> reason most tracepoints in XFS >> > are at function entry...) >> > >> >> Good points, thanks Dave. A v2 that pulls >> up the tracepoints towards >> function entry is appended. >> >> Brian >> >> From >> 280943e78ebe0b97a774cba51e7815c42f044b55 >> Mon Sep 17 00:00:00 2001 >> From: Brian Foster > > >> Date: Mon, 15 Apr 2013 18:16:24 -0400 >> Subject: [PATCH v2] xfs: add tracepoints >> for xfs_iunlink and >> xfs_iunlink_remove >> >> --- >> fs/xfs/linux-2.6/xfs_trace.h | 2 ++ >> fs/xfs/xfs_inode.c | 4 ++++ >> 2 files changed, 6 insertions(+), 0 >> deletions(-) >> >> diff --git a/fs/xfs/linux-2.6/xfs_trace.h >> b/fs/xfs/linux-2.6/xfs_trace.h >> index adc6ec4..338a0f9 100644 >> --- a/fs/xfs/linux-2.6/xfs_trace.h >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >> @@ -583,6 +583,8 @@ >> DEFINE_INODE_EVENT(xfs_file_fsync); >> DEFINE_INODE_EVENT(xfs_destroy_inode); >> DEFINE_INODE_EVENT(xfs_dirty_inode); >> DEFINE_INODE_EVENT(xfs_clear_inode); >> +DEFINE_INODE_EVENT(xfs_iunlink); >> +DEFINE_INODE_EVENT(xfs_iunlink_remove); >> >> DEFINE_INODE_EVENT(xfs_dquot_dqalloc); >> DEFINE_INODE_EVENT(xfs_dquot_dqdetach); >> diff --git a/fs/xfs/xfs_inode.c >> b/fs/xfs/xfs_inode.c >> index 19900f0..d705c77 100644 >> --- a/fs/xfs/xfs_inode.c >> +++ b/fs/xfs/xfs_inode.c >> @@ -1615,6 +1615,8 @@ xfs_iunlink( >> >> mp = tp->t_mountp; >> >> + trace_xfs_iunlink(ip); >> + >> /* >> * Get the agi buffer first. It >> ensures lock ordering >> * on the list. >> @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( >> mp = tp->t_mountp; >> agno = XFS_INO_TO_AGNO(mp, ip->i_ino); >> >> + trace_xfs_iunlink_remove(ip); >> + >> /* >> * Get the agi buffer first. It >> ensures lock ordering >> * on the list. >> -- >> 1.7.7.6 >> >> >> >> >> -- >> 符永涛 >> >> >> >> >> -- >> 符永涛 >> >> >> >> >> -- >> 符永涛 >> >> >> >> >> -- >> 符永涛 >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > > > > > -- > 符永涛 > > > > > -- > 符永涛 > > > > > -- > 符永涛 From ranto.boris@gmail.com Thu Apr 18 07:25:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.8 required=5.0 tests=FREEMAIL_FROM, HTML_IMAGE_ONLY_24,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 3E50E29DFA for ; Thu, 18 Apr 2013 07:25:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1CEF78F8050 for ; Thu, 18 Apr 2013 05:25:09 -0700 (PDT) X-ASG-Debug-ID: 1366287904-04cbb057f53340c0001-NocioJ Received: from mail-ie0-f177.google.com (mail-ie0-f177.google.com [209.85.223.177]) by cuda.sgi.com with ESMTP id j2XFviXmQzBJ20ta (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 18 Apr 2013 05:25:05 -0700 (PDT) X-Barracuda-Envelope-From: ranto.boris@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] Received: by mail-ie0-f177.google.com with SMTP id 9so3113911iec.8 for ; Thu, 18 Apr 2013 05:25:04 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=ONsSTYAX7b8aCO3hGc95UXQJDF7pP5FAWlfSyxyBDcw=; b=XQt7fvCjJhVfnJLw/RxHWsB0N+36rcBrlNPEoguRDVjmyrnnlmA5eaShgPzVKtCJSW a59KsDbHPvflQiFV54PJRT7B3z+f2fyVtA2vrcOcwIuEDhsEjVNDjTC8yv57hG2wAr9z /cw5Q5pFDYx4+P2BmM1c6BbPK22TQvi891OXtrZfVSGRqfE2NlEgE7hmCX7EBgo/V+Oq pJVvl+Q5iEQxa1iEDELgRe3RAFou+ZbhYAcDW7tLRI4MXwLiHKEi/iqYF31Zosh+UmU5 mttOcewI8m9G3oI1pClzAuxoWiYFk5vw2i8T+KI9yXO+FiBtVEEvUt5PLiMdVJnG7xXx 1OFg== MIME-Version: 1.0 X-Received: by 10.50.46.197 with SMTP id x5mr1137804igm.7.1366287904649; Thu, 18 Apr 2013 05:25:04 -0700 (PDT) Received: by 10.50.1.113 with HTTP; Thu, 18 Apr 2013 05:25:04 -0700 (PDT) In-Reply-To: <516EB6E3.9040903@sgi.com> References: <20120828172605.607853317@sgi.com> <20120828172928.999971219@sgi.com> <516EB6E3.9040903@sgi.com> Date: Thu, 18 Apr 2013 14:25:04 +0200 Message-ID: Subject: Re: [PATCH 2/5] xfstests: Use libtool to install applications From: Boris Ranto X-ASG-Orig-Subj: Re: [PATCH 2/5] xfstests: Use libtool to install applications To: Rich Johnston Cc: xfs-oss , Boris Ranto Content-Type: multipart/alternative; boundary=14dae9340be937b74504daa1b146 X-Barracuda-Connect: mail-ie0-f177.google.com[209.85.223.177] X-Barracuda-Start-Time: 1366287904 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.28 X-Barracuda-Spam-Status: No, SCORE=1.28 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_24, HTML_IMAGE_ONLY_24_2, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128473 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_ONLY_24 BODY: HTML: images with 2000-2400 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 1.28 HTML_IMAGE_ONLY_24_2 HTML: images with 2000-2400 bytes of words --14dae9340be937b74504daa1b146 Content-Type: text/plain; charset=ISO-8859-1 Rich, just as Eric guessed, I package the xfstests test suite (and that is also why I need the DIST_ROOT variable functioning properly). Although I can currently work around the problem by doing something like ./configure make mkdir -p /var/lib/xfstets/{ltp,src} make DIST_ROOT=$RPM_BUILD_ROOT install it certainly is not the best solution to the problem. If the test suite is completely independent from its location then also maybe this could work (I did not try it, yet and I'm still not sure it is the best solution) ./configure --prefix=$RPM_BUILD_ROOT make make install but if that is the case then it'd probably make sense to drop the whole DIST_ROOT support from install-sh script to avoid confusion and update the spec file in bulld/rpm/. Regards, Boris (Rich, sorry for the duplicate message, I forgot to cc mailing list the first time.) On Wed, Apr 17, 2013 at 4:51 PM, Rich Johnston wrote: > Boris, > > Most people do not install xfstests, as it is not required to run the > tests. Is there a reason you need to install xfstests? It is designed to > be run from the directory you did the git clone from. Path is not critical > so you could move it anywhere you wish. > > i.e. > git clone git://oss.sgi.com/xfs/cmds/**xfstests > mv xfstests /new/path/new_xfsdirname > cd /new/path/new_xfsdirname > ./check -g auto > > > --Rich > --14dae9340be937b74504daa1b146 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
3D""Ri= ch,

just as Eric guessed, I package the xfstests test suite (and that is also=20 why I need the DIST_ROOT variable functioning properly). Although I can=20 currently work around the problem=A0 by doing something like

./configure
make
mkdir -p /var/lib/xfstets/{ltp,src}
make DIST= _ROOT=3D$RPM_BUILD_ROOT install

it certainly is not the best solution to the problem. If the test suite is completely independent from its location then also maybe this could=20 work (I did not try it, yet and I'm still not sure it is the best=20 solution)

./configure --prefix=3D$RPM_BUILD_ROOT
make
make install

b= ut if that is the case then it'd probably make sense to drop the whole=20 DIST_ROOT support from install-sh script to avoid confusion and update=20 the spec file in bulld/rpm/.

Regards,
Boris

(Rich, sorry for the duplicate message, I forg= ot to cc mailing list the first time.)
<= /td>


On Wed, Apr 17, 2013 at 4:51 PM, Rich Johnston <= span dir=3D"ltr"><rjohnston@sgi.com> wrote:
Boris,

Most people do not install xfstests, as it is not required to run the tests= . =A0Is there a reason you need to install xfstests? It is designed to be r= un from the directory you did the git clone from. =A0Path is not critical s= o you could move it anywhere you wish.

i.e.
git clone git://oss.sgi.com/xfs/cmds/xfstests
mv xfstests /new/path/new_xfsdirname
cd /new/path/new_xfsdirname
./check -g auto


--Rich

--14dae9340be937b74504daa1b146-- From greg.freemyer@gmail.com Thu Apr 18 07:46:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 ABA3B7F55 for ; Thu, 18 Apr 2013 07:46:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8CB608F8039 for ; Thu, 18 Apr 2013 05:46:20 -0700 (PDT) X-ASG-Debug-ID: 1366289179-04cb6c2c1c349f50001-NocioJ Received: from mail-qe0-f43.google.com (mail-qe0-f43.google.com [209.85.128.43]) by cuda.sgi.com with ESMTP id 6gXRHjzuLVhO5usy (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 18 Apr 2013 05:46:19 -0700 (PDT) X-Barracuda-Envelope-From: greg.freemyer@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.43 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.43] Received: by mail-qe0-f43.google.com with SMTP id f6so1606377qej.2 for ; Thu, 18 Apr 2013 05:46:19 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.43] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.43] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:user-agent:in-reply-to:references:mime-version :content-type:content-transfer-encoding:subject:from:date:to:cc :message-id; bh=r+8xKi25NJpaklfopIRUpekAnDvjVcqLcFeSKKt0Y5I=; b=XwajCabrVu40kKpIpdSeRVUCm8YKuDIjhFocQAcnq+VwR71QdUEZloMJMsTlQfnmVJ nU5WK9aq5MhublKvMe1XuteKv6fvxee+yIBbtwjQgWi44s9oEvZxh842t/9Xw9EGyR3p k9LLGilgItGT//qEzOAilq+1+lKbwF6aqI2goIonG/6UQtRNjaKyhOidSENT8UDqzFiT clL9xSQnZUJGnvSZLT0iRnYOrStQMHnRRrI4i+jALYuHDmuLvTJkDDNYF6lzAIb7R0XB oNw+RBcuPhZRUYKkTjVr9dzbQFQRBA+z81AhB4FNmqzWfuRIAEew2mV55q/3d+DVk6ki aoRw== X-Received: by 10.229.165.205 with SMTP id j13mr22759qcy.147.1366289179289; Thu, 18 Apr 2013 05:46:19 -0700 (PDT) Received: from [192.168.1.9] (c-76-97-101-136.hsd1.ga.comcast.net. [76.97.101.136]) by mx.google.com with ESMTPS id r3sm11821266qef.5.2013.04.18.05.46.17 (version=TLSv1 cipher=RC4-SHA bits=128/128); Thu, 18 Apr 2013 05:46:18 -0700 (PDT) User-Agent: K-9 Mail for Android In-Reply-To: References: <20120828172605.607853317@sgi.com> <20120828172928.999971219@sgi.com> <516EB6E3.9040903@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: Re: [PATCH 2/5] xfstests: Use libtool to install applications From: Greg Freemyer X-ASG-Orig-Subj: Re: [PATCH 2/5] xfstests: Use libtool to install applications Date: Thu, 18 Apr 2013 08:46:17 -0400 To: Boris Ranto ,Rich Johnston CC: Boris Ranto ,xfs-oss Message-ID: X-Barracuda-Connect: mail-qe0-f43.google.com[209.85.128.43] X-Barracuda-Start-Time: 1366289179 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128473 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain Boris Ranto wrote: >Rich, > >just as Eric guessed, I package the xfstests test suite (and that is >also >why I need the DIST_ROOT variable functioning properly). Although I can >currently work around the problem by doing something like > >./configure >make >mkdir -p /var/lib/xfstets/{ltp,src} >make DIST_ROOT=$RPM_BUILD_ROOT install > >it certainly is not the best solution to the problem. If the test suite >is >completely independent from its location then also maybe this could >work (I >did not try it, yet and I'm still not sure it is the best solution) > >./configure --prefix=$RPM_BUILD_ROOT >make >make install > >but if that is the case then it'd probably make sense to drop the whole >DIST_ROOT support from install-sh script to avoid confusion and update >the >spec file in bulld/rpm/. > >Regards, >Boris Boris, When you get it working for packaging purposes I'd appreciate a post detailing what works. I thought about packaging xfstests for opensuse a couple years ago but aborted the effort when I realized it was not designed to be installed at the time. Greg -- Sent from my Android phone with K-9 Mail. Please excuse my brevity. From ranto.boris@gmail.com Thu Apr 18 08:37:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0C1397F53 for ; Thu, 18 Apr 2013 08:37:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EE287304053 for ; Thu, 18 Apr 2013 06:37:27 -0700 (PDT) X-ASG-Debug-ID: 1366292243-04cb6c2c1f34ddc0001-NocioJ Received: from mail-ie0-f180.google.com (mail-ie0-f180.google.com [209.85.223.180]) by cuda.sgi.com with ESMTP id rjbWar0J07Ynt9Iq (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 18 Apr 2013 06:37:23 -0700 (PDT) X-Barracuda-Envelope-From: ranto.boris@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.180 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.180] Received: by mail-ie0-f180.google.com with SMTP id qd14so3352762ieb.11 for ; Thu, 18 Apr 2013 06:37:23 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.180] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.180] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=0RtXKGCjKm7mUtQNZt+rN/0rNr5OHRiITzeW7LxsDtE=; b=NixkW3f6ZBEpWNw33Q1l+IIn0vAGkl1FOItezTSGg9qcotKmJeeeeZSAj1exT/Nae/ ixb6LBVs2k6C6BBoX9xCo9U6MseVvxMh+fUMdIvCsTsi5yaDgeyxnTzAjXguqp36K3Hl UtsKPMfSUK+LJ/CgErOSg6ovHvGWvxUeOGA4g210lPGFhuq81bJJNDriI6rIwBZoEAvP xuHnslVxWTVooK5fnoPmqqzz//ICdtq1lGuhExftWqbVSbxEO25thN7iaXvtrvy98o6g dj7RoCjImGrhI/slpdERWiXTGhF7fI+6+nREGfYeJbQPgosu6iJBPtl9Hco9Wcaf81tP pprw== MIME-Version: 1.0 X-Received: by 10.50.70.34 with SMTP id j2mr6833651igu.7.1366292243296; Thu, 18 Apr 2013 06:37:23 -0700 (PDT) Received: by 10.50.1.113 with HTTP; Thu, 18 Apr 2013 06:37:23 -0700 (PDT) In-Reply-To: References: <20120828172605.607853317@sgi.com> <20120828172928.999971219@sgi.com> <516EB6E3.9040903@sgi.com> Date: Thu, 18 Apr 2013 15:37:23 +0200 Message-ID: Subject: Re: [PATCH 2/5] xfstests: Use libtool to install applications From: Boris Ranto X-ASG-Orig-Subj: Re: [PATCH 2/5] xfstests: Use libtool to install applications To: Greg Freemyer Cc: Rich Johnston , Boris Ranto , xfs-oss Content-Type: multipart/alternative; boundary=047d7b3a9be6d25a9704daa2b376 X-Barracuda-Connect: mail-ie0-f180.google.com[209.85.223.180] X-Barracuda-Start-Time: 1366292243 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128477 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.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain --047d7b3a9be6d25a9704daa2b376 Content-Type: text/plain; charset=ISO-8859-1 Greg, sure, currently, I use the following spec file to package it (I've trimmed things like changelog to limit the space used): --------------------------------------------------- SPEC FILE ----------------------------------------------------------------------- Name: xfstests Version: 20130415 Release: 3.git Summary: xfs qa tests Group: misc License: GPL URL: http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs/cmds/xfstests.git Source0: $RPM_BUILD_ROOT/SOURCES/xfstests-dev.tar.bz2 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: autoconf, libtool, e2fsprogs-devel, xfsprogs-devel BuildRequires: libacl-devel, libattr-devel, libaio-devel Requires: bash, perl, acl, attr, bind-utils Requires: bc, indent, quota, xfsprogs %description The xfsqa test available at git://oss.sgi.com/xfs/cmds/xfstests.git. %prep %setup -q -n xfstests-dev %build autoheader autoconf %configure make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT # Dirty workaround, xfstests won't build if these two directories do not exist... mkdir -p /var/lib/xfstests/{ltp,src} make DIST_ROOT=$RPM_BUILD_ROOT install %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %doc README /var/lib/xfstests --------------------------------------------------- SPEC FILE ----------------------------------------------------------------------- Before the libtool was used for installation I didn't need the workaround (mkdir -p /var/lib/xfstets/{src,ltp}). Additionally, there is a template spec file in xfstests git repository (build/rpm/xfstests.spec.in) that you can use. I get the tar.bz2 package from git repository by: git archive --format=tar --output xfstests-dev.tar --prefix=xfstests-dev/ bzip2 xfstests-dev.tar btw: I did not originally write the file, I just maintain it, now. I suppose that Eric Sandeen is the one who originally wrote the .spec file. Regards, Boris On Thu, Apr 18, 2013 at 2:46 PM, Greg Freemyer wrote: > > > Boris Ranto wrote: > > >Rich, > > > >just as Eric guessed, I package the xfstests test suite (and that is > >also > >why I need the DIST_ROOT variable functioning properly). Although I can > >currently work around the problem by doing something like > > > >./configure > >make > >mkdir -p /var/lib/xfstets/{ltp,src} > >make DIST_ROOT=$RPM_BUILD_ROOT install > > > >it certainly is not the best solution to the problem. If the test suite > >is > >completely independent from its location then also maybe this could > >work (I > >did not try it, yet and I'm still not sure it is the best solution) > > > >./configure --prefix=$RPM_BUILD_ROOT > >make > >make install > > > >but if that is the case then it'd probably make sense to drop the whole > >DIST_ROOT support from install-sh script to avoid confusion and update > >the > >spec file in bulld/rpm/. > > > >Regards, > >Boris > > Boris, > > When you get it working for packaging purposes I'd appreciate a post > detailing what works. I thought about packaging xfstests for opensuse a > couple years ago but aborted the effort when I realized it was not designed > to be installed at the time. > > Greg > -- > Sent from my Android phone with K-9 Mail. Please excuse my brevity. > --047d7b3a9be6d25a9704daa2b376 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Greg,

sure, currently, I use the following spec fil= e to package it (I've trimmed things like changelog to limit the space = used):
--------------------------------------------------- SPEC FILE ---= --------------------------------------------------------------------
Name:=A0=A0=A0 =A0=A0=A0=A0=A0 xfstests
Version:=A0=A0=A0=A0=A0=A0=A0 20= 130415
Release:=A0=A0=A0=A0=A0=A0 3.git
Summary:=A0=A0=A0=A0 xfs qa t= ests

Group:=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0=A0 misc
License:=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 GPL
URL:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 http://oss.sgi.com/cgi-bin/gitweb.cgi?p=3Dxfs/cmds/xfstests.git=
Source0:=A0=A0=A0=A0=A0=A0=A0=A0=A0 $RPM_BUILD_ROOT/SOURCES/xfstests-dev.ta= r.bz2
BuildRoot:=A0=A0=A0=A0=A0=A0=A0 %{_tmppath}/%{name}-%{version}-%{r= elease}-root-%(%{__id_u} -n)

BuildRequires:=A0 autoconf, libtool, e2= fsprogs-devel, xfsprogs-devel
BuildRequires:=A0 libacl-devel, libattr-devel, libaio-devel
Requires:=A0= =A0=A0=A0=A0 =A0=A0 bash, perl, acl, attr, bind-utils
Requires:=A0=A0=A0= =A0=A0=A0=A0=A0 bc, indent, quota, xfsprogs

%description
The xfsq= a test available at git://oss.sgi.com/xfs/cmds/xfstests.git.

%prep
%setup -q -n xfstests-dev

%build
autoheader
autoc= onf
%configure
make %{?_smp_mflags}

%install
rm -rf $RPM_BU= ILD_ROOT
# Dirty workaround, xfstests won't build if these two direc= tories do not exist...
mkdir -p /var/lib/xfstests/{ltp,src}

make DIST_ROOT=3D$RPM_BUILD_ROO= T install

%clean
rm -rf $RPM_BUILD_ROOT


%files
%def= attr(-,root,root,-)
%doc README
/var/lib/xfstests
----------------= ----------------------------------- SPEC FILE=20 -----------------------------------------------------------------------
=
Before the libtool was used for installation I didn't need the work= around (mkdir -p /var/lib/xfstets/{src,ltp}). Additionally, there is a temp= late spec file in xfstests git repository (build/rpm/xfstests.spec.in) that you can use.

I get the tar.bz2 package from git repository by:
git archive --form= at=3Dtar --output xfstests-dev.tar --prefix=3Dxfstests-dev/
bzip2 xfstes= ts-dev.tar

btw: I did not originally write the file, I just maintain= it, now. I suppose that Eric Sandeen is the one who originally wrote the .= spec file.

Regards,
Boris



On Thu, Apr 18, 2013 at 2:46 PM, Greg Freemyer <greg.freemyer@gmail.com> wrote:


Boris Ranto <ranto.boris@gmail.= com> wrote:

>Rich,
>
>just as Eric guessed, I package the xfstests test suite (and that is >also
>why I need the DIST_ROOT variable functioning properly). Although I can=
>currently work around the problem =A0by doing something like
>
>./configure
>make
>mkdir -p /var/lib/xfstets/{ltp,src}
>make DIST_ROOT=3D$RPM_BUILD_ROOT install
>
>it certainly is not the best solution to the problem. If the test suite=
>is
>completely independent from its location then also maybe this could
>work (I
>did not try it, yet and I'm still not sure it is the best solution)=
>
>./configure --prefix=3D$RPM_BUILD_ROOT
>make
>make install
>
>but if that is the case then it'd probably make sense to drop the w= hole
>DIST_ROOT support from install-sh script to avoid confusion and update<= br> >the
>spec file in bulld/rpm/.
>
>Regards,
>Boris

Boris,

When you get it working for packaging purposes I'd appreciate a post de= tailing what works. =A0I thought about packaging xfstests for opensuse a co= uple years ago but aborted the effort when I realized it was not designed t= o be installed at the time.

Greg
--
Sent from my Android phone with K-9 Mail. Please excuse my brevity.

--047d7b3a9be6d25a9704daa2b376-- From news@360news.fr Thu Apr 18 10:11:23 2013 Return-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_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 4284C7F3F for ; Thu, 18 Apr 2013 10:11:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 30EBC304051 for ; Thu, 18 Apr 2013 08:11:20 -0700 (PDT) X-ASG-Debug-ID: 1366297877-04cbb057f5340860001-NocioJ Received: from 360news.fr (a178.360news.fr [178.32.2.178]) by cuda.sgi.com with SMTP id 7mxNTdfENPI54WDC for ; Thu, 18 Apr 2013 08:11:18 -0700 (PDT) X-Barracuda-Envelope-From: news@360news.fr X-Barracuda-Apparent-Source-IP: 178.32.2.178 DKIM-Signature: v=1; a=rsa-sha1; c=simple/simple; s=mail;d=360news.fr; h=from:sender:to:date:message-id:subject:mime-version:content-type; bh=eSPErELB0W0o8C80SFK520P0Tbo=; b=TlA1hJx0xgNb1RxTBtrWI/U96TNxI0Wy71A2JuSxs6iWti6jHbJ/HvshTw3aktQ/Zyrft3K/ mDWWgO/3Pej+WTdPD1yBLKuhjOO3QqX59DwBJuj2IXSTx1q//V/x1SKHxOgb3MvISzKkxH/L 1XXYuYiMfXjCXdG/VY87tvdeavg= DomainKey-Signature: a=rsa-sha1; q=dns; c=simple; s=mail;d=360news.fr; h=from:sender:to:date:message-id:subject:mime-version:content-type; b=B5JP51KlgZkJU5FQ3RcIEdSN+ISdjWl7zxdgr3HFHMlF1P1+DyoB8qcOfz7AUWCgyRrkinjl KOpA9q3eNh35qrYVS4CbeU4Rllt29sHmkD2VhUCICAIw+SDF9dbmmJ/71ucNE58bxzJv6q3X Rv1hQzUurCuvF6UaocqTMUyVC04= List-Unsubscribe: http://360news.fr/tr/index.aspx?id=fc4616f878bc629e4fa87759f57218a23f6e4aaeeecef134a895e2ebfc4a302bf521982d23b2b004 From: Pirate Parfum Sender: Pirate Parfum Reply-To: Pirate Parfum To: xfs@oss.sgi.com Date: Thu, 18 Apr 2013 15:13:40 GMT Organization: 360news.fr Message-ID: Subject: PIRATE-PARFUM : Le parfum du luxe, le prix du discount MIME-Version: 1.0 X-ASG-Orig-Subj: PIRATE-PARFUM : Le parfum du luxe, le prix du discount X-Mailer: devMail.Net (3.0.1854.22234-6) Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 X-Barracuda-Connect: a178.360news.fr[178.32.2.178] X-Barracuda-Start-Time: 1366297878 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.128483 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 77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlv bmFsLy9FTiINCiAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJh bnNpdGlvbmFsLmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRt bCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+DQogICAgPGhlYWQ+DQogICAgICAgIDxtZXRhIGh0 dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04 Ij4NCiAgICAgICAgPHRpdGxlPjwvdGl0bGU+DQogICAgPC9oZWFkPg0KICAgIDxib2R5PjxjZW50 ZXI+DQo8Zm9udCBjb2xvcj0iIzc3Nzc3NyIgc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFt aWx5OlZlcmRhbmEsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Ij4NClBvdXIgdmlzdWFsaXNl ciBjb3JyZWN0ZW1lbnQgY2UgbWVzc2FnZSwgYWNjJmVhY3V0ZTtkZXogJmFncmF2ZTsgbGEgPGEg IGhyZWY9Imh0dHA6Ly8zNjBuZXdzLmZyL3RyL21pcnJvci5hc3B4P2lkPWZjNDYxNmY4NzhiYzYy OWU0ZmE4Nzc1OWY1NzIxOGEyMDdmN2E1ZmU4YmQ4MmQyODQyYzUxZTM5M2FiYjM4MTg2YTQ4MmFh NGFlMTIyNWJjMjI2Y2I5MzM4ZmZiYzhkOCI+dmVyc2lvbiBlbiBsaWduZTwvYT4NCjxicj48YnI+ DQo8L2ZvbnQ+DQo8L2NlbnRlcj4NCiAgICAgICAgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogbm9u ZSByZXBlYXQgc2Nyb2xsIDAgMCAjRkZGRkZGOyBtYXJnaW46IDAgYXV0bzsgbWluLXdpZHRoOiA1 ODBweDsiPg0KICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMTRw eCAwIDA7IHRleHQtYWxpZ246IHJpZ2h0OyB3aWR0aDogNTgwcHg7IGhlaWdodDogMTAwcHg7Ij4N CiAgICAgICAgPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7Ij4NCiAgICAgICAgPGEgc3R5bGU9ImZs b2F0OiBsZWZ0OyBtYXJnaW46IDVweCAwIDlweCAwOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IiB0 aXRsZT0iUGlyYXRlIFBhcmZ1bSIgIGhyZWY9Imh0dHA6Ly8zNjBuZXdzLmZyL3RyL2luZGV4LmFz cHg/aWQ9ZmM0NjE2Zjg3OGJjNjI5ZTRmYTg3NzU5ZjU3MjE4YTJiNjcyN2QzN2U1YWQ4MzExZjkx ZTIwNjQzOTZiMzZjNTZhN2IxZTY2Yjk0OWVjMTkiPjxpbWcgc3R5bGU9ImJvcmRlcjogbWVkaXVt IG5vbmU7IiBzcmM9Imh0dHA6Ly9pbWcuMzYwbmV3cy5mci9hVUwxQjEucG5nIiBhbHQ9Ik1hZ2Vu dG8gQ29tbWVyY2UiIGhlaWdodD0iODYiIHdpZHRoPSIyNjAiPjwvYT4NCiAgICAgICAgPC9kaXY+ DQogICAgICAgIDxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgd2lkdGg6IDgwcHg7Ij4NCiAgICAg ICAgPGEgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZTsiIHRpdGxlPSJGYWNlYm9vayIgIGhy ZWY9Imh0dHA6Ly8zNjBuZXdzLmZyL3RyL2luZGV4LmFzcHg/aWQ9ZmM0NjE2Zjg3OGJjNjI5ZTRm YTg3NzU5ZjU3MjE4YTJiODY3ZGZkYmFiNmEzYzMwOGNjYTdiY2MxMDQ4NmI4OWI0MjdhYjcyMmFi ZTRjMDAiPjxpbWcgaWQ9InNvY2lhbC0yIiBzdHlsZT0icGFkZGluZy1yaWdodDogN3B4OyBib3Jk ZXI6IG1lZGl1bSBub25lOyIgc3JjPSJodHRwOi8vaW1nLjM2MG5ld3MuZnIvYVVMMUIyLnBuZyIg YWx0PSJGYWNlYm9vayIgbmFtZT0ic29jaWFsLTIiPjwvYT4gPGEgc3R5bGU9InRleHQtZGVjb3Jh dGlvbjogbm9uZTsiIHRpdGxlPSJUd2l0dGVyIiAgaHJlZj0iaHR0cDovLzM2MG5ld3MuZnIvdHIv aW5kZXguYXNweD9pZD1mYzQ2MTZmODc4YmM2MjllNGZhODc3NTlmNTcyMThhMjYwOTY0OTU5YmU0 YjBmYjZhYjkyNjhkMzJiYzc0YmQzM2RhNWIyOTlkMDUzZDgwMCI+PGltZyBpZD0ic29jaWFsLTEi IHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAzcHg7IGJvcmRlcjogbWVkaXVtIG5vbmU7IiBzcmM9Imh0 dHA6Ly9pbWcuMzYwbmV3cy5mci9hVUwxQjMucG5nIiBhbHQ9IlR3aXR0ZXIiIG5hbWU9InNvY2lh bC0xIj48L2E+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgPGRpdiBz dHlsZT0iaGVpZ2h0OiAycHg7IG1hcmdpbjogMCBhdXRvOyB3aWR0aDogNTgwcHg7Ij4NCiAgICAg ICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQ7IGJvcmRlcjogbWVkaXVtIG5vbmU7IiBzcmM9Imh0 dHA6Ly9pbWcuMzYwbmV3cy5mci9hVUwxQjQuZ2lmIiBhbHQ9IiIgaGVpZ2h0PSIyIiB3aWR0aD0i NTgwIj4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIDxkaXYgc3R5bGU9ImhlaWdodDogMjhweDsg bWFyZ2luOiAwIGF1dG87IHdpZHRoOiA1ODBweDsiPg0KICAgICAgICA8dWwgc3R5bGU9ImZvbnQt c2l6ZTogMTRweDsgbWFyZ2luOiAwcHggYXV0bzsgbGlzdC1zdHlsZTogbm9uZSBvdXRzaWRlIG5v bmU7Ij4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgIDxhIHN0eWxlPSJjb2xvcjogIzAw MDAwMDsgZmxvYXQ6IGxlZnQ7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHBh ZGRpbmc6IDVweCAyNXB4IDZweCAxcHg7IGRpc3BsYXk6IGJsb2NrOyBsaW5lLWhlaWdodDogMS4z ZW07IHRleHQtZGVjb3JhdGlvbjogbm9uZTsiICBocmVmPSJodHRwOi8vMzYwbmV3cy5mci90ci9p bmRleC5hc3B4P2lkPWZjNDYxNmY4NzhiYzYyOWU0ZmE4Nzc1OWY1NzIxOGEyNDdiMzI1ODNhNTUy OGNkM2QwMzA3ZDhjODA4ZTBhMTNhNTJkZmY2MzMyMTNjN2VkIj5IT01FPC9hPg0KICAgICAgICAg ICAgPC9saT4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgIDxhIHN0eWxlPSJjb2xvcjog IzAwMDAwMDsgZmxvYXQ6IGxlZnQ7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IGJvbGQ7 IHBhZGRpbmc6IDVweCAyNXB4IDZweCAxcHg7IGRpc3BsYXk6IGJsb2NrOyBsaW5lLWhlaWdodDog MS4zZW07IHRleHQtZGVjb3JhdGlvbjogbm9uZTsiICBocmVmPSJodHRwOi8vMzYwbmV3cy5mci90 ci9pbmRleC5hc3B4P2lkPWZjNDYxNmY4NzhiYzYyOWU0ZmE4Nzc1OWY1NzIxOGEyYzY1Y2I2NDBl NDcyNDBhOWE5ZTU5ZDUyNjgwMGExMTk2YzBlZWYwNzllODkxZDNhIj5TVE9SRTwvYT4NCiAgICAg ICAgICAgIDwvbGk+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICA8YSBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZsb2F0OiBsZWZ0OyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiBi b2xkOyBwYWRkaW5nOiA1cHggMjVweCA2cHggMXB4OyBkaXNwbGF5OiBibG9jazsgbGluZS1oZWln aHQ6IDEuM2VtOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IiAgaHJlZj0iaHR0cDovLzM2MG5ld3Mu ZnIvdHIvaW5kZXguYXNweD9pZD1mYzQ2MTZmODc4YmM2MjllNGZhODc3NTlmNTcyMThhMjllMDQ1 ZDc0NzlhYzQyODc3OGMxYmQyNDc2MWYxODU5NTdhOTcwZGVlYThmYTNiOCI+TUFSUVVFPC9hPg0K ICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgIDxhIHN0eWxl PSJjb2xvcjogIzAwMDAwMDsgZmxvYXQ6IGxlZnQ7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWln aHQ6IGJvbGQ7IHBhZGRpbmc6IDVweCAyNXB4IDZweCAxcHg7IGRpc3BsYXk6IGJsb2NrOyBsaW5l LWhlaWdodDogMS4zZW07IHRleHQtZGVjb3JhdGlvbjogbm9uZTsiICBocmVmPSJodHRwOi8vMzYw bmV3cy5mci90ci9pbmRleC5hc3B4P2lkPWZjNDYxNmY4NzhiYzYyOWU0ZmE4Nzc1OWY1NzIxOGEy YTgxZjM1YWYzN2E4ZGQzMDY0ZWQ1YjY1ZGExZDMzOTY3MzkzYzk3OWRiYmY2ODEyIj5QQVJGVU0g RkVNTUU8L2E+DQogICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAg ICAgPGEgc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmbG9hdDogbGVmdDsgZm9udC1zaXplOiAxNHB4 OyBmb250LXdlaWdodDogYm9sZDsgcGFkZGluZzogNXB4IDI1cHggNnB4IDFweDsgZGlzcGxheTog YmxvY2s7IGxpbmUtaGVpZ2h0OiAxLjNlbTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyIgIGhyZWY9 Imh0dHA6Ly8zNjBuZXdzLmZyL3RyL2luZGV4LmFzcHg/aWQ9ZmM0NjE2Zjg3OGJjNjI5ZTRmYTg3 NzU5ZjU3MjE4YTIyNWY1MDNiNWM0NjQ1ZGQ5NjZjOTYyZGYzMTlmMTU3ZDRhNGEyMGM3OWEzMGVi NDAiPlBBUkZVTSBIT01NRTwvYT4NCiAgICAgICAgICAgIDwvbGk+DQogICAgICAgIDwvdWw+DQog ICAgICAgIDwvZGl2Pg0KICAgICAgICA8ZGl2IHN0eWxlPSJoZWlnaHQ6IDJweDsgbWFyZ2luOiAw IGF1dG87IHdpZHRoOiA1ODBweDsiPg0KICAgICAgICA8aW1nIHN0eWxlPSJmbG9hdDogbGVmdDsg Ym9yZGVyOiBtZWRpdW0gbm9uZTsiIHNyYz0iaHR0cDovL2ltZy4zNjBuZXdzLmZyL2FVTDFCNC5n aWYiIGFsdD0iIiBoZWlnaHQ9IjIiIHdpZHRoPSI1ODAiPg0KICAgICAgICA8L2Rpdj4NCiAgICAg ICAgPGRpdiBzdHlsZT0ibWFyZ2luOiAxMHB4IGF1dG87IHdpZHRoOiA1ODBweDsiPg0KICAgICAg ICA8YSAgaHJlZj0iaHR0cDovLzM2MG5ld3MuZnIvdHIvaW5kZXguYXNweD9pZD1mYzQ2MTZmODc4 YmM2MjllNGZhODc3NTlmNTcyMThhMmY2NjA3ZGI1YmVjMjNjYzY4OWUxODEyNjdhYjRiMzA4YTJj ZDA2Y2I0MWE2NjFlMiI+PGltZyBzcmM9Imh0dHA6Ly9pbWcuMzYwbmV3cy5mci9hVUwxQjUuanBn IiBhbHQ9IiI+PC9hPg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2lu OiAxNXB4IGF1dG87IHdpZHRoOiA1ODBweDsiPg0KICAgICAgICA8cCBzdHlsZT0iZm9udC1zdHls ZTppdGFsaWM7IGNvbG9yOiMzMzM7IGZvbnQtc2l6ZToxNHB4OyBmb250LWZhbWlseTpBcmlhbDsg dGV4dC1hbGlnbjpqdXN0aWZ5Ij4NCiAgICAgICAgUGlyYXRlIFBhcmZ1bSBlc3QgdW4gcGFyZnVt ZXVyIGQndW4gbm91dmVhdSBnZW5yZSwgdW4gcGFyZnVtZXVyIHF1aSBzZSBzb3VjaWUgZGUgdm90 cmUgYmVhdXTDqSBvbGZhY3RpdmUgbWFpcyBhdXNzaSBkZSB2b3RyZSBwb3J0ZS1tb25uYWllLg0K ICAgICAgICA8L3A+DQogICAgICAgIDxwIHN0eWxlPSJmb250LXN0eWxlOml0YWxpYzsgY29sb3I6 IzMzMzsgZm9udC1zaXplOjE0cHg7IGZvbnQtZmFtaWx5OkFyaWFsOyB0ZXh0LWFsaWduOmp1c3Rp ZnkiPg0KICAgICAgICBDaGV6IFBpcmF0ZSBQYXJmdW0gdG91cyBsZXMgcHJpeCBzb250IGNhbGN1 bMOpcyBhdSBwbHVzIGp1c3RlIHBvdXIgdm91cyBwZXJtZXR0cmUgZGUgYsOpbsOpZmljaWVyIGQn dW4gcHJpeCBmaW5hbCBlbnRyZSAyNSBldCAzMuKCrCBwb3VyIHVuIGZsYWNvbiBkZSAxMDBtbCwg PGI+anVzcXUnw6AgNSBmb2lzIG1vaW5zIGNoZXIgcXVlIGxhIGNvbmN1cnJlbmNlPC9iPi4NCiAg ICAgICAgPC9wPg0KICAgICAgICA8cCBzdHlsZT0iZm9udC1zdHlsZTppdGFsaWM7IGNvbG9yOiMz MzM7IGZvbnQtc2l6ZToxNHB4OyBmb250LWZhbWlseTpBcmlhbDsgdGV4dC1hbGlnbjpqdXN0aWZ5 Ij4NCiAgICAgICAgRXQgcG91cnRhbnQgY2VzIHByaXggbmUgc29udCBwYXMgYXR0ZWludHMgZW4g bWV0dGFudCBkZSBjw7R0w6kgbGEgcXVhbGl0w6kgcHVpc3F1ZSB0b3VzIG5vcyBwYXJmdW1zIHNv bnQgPGI+csOpYWxpc8OpcyBlbiBGcmFuY2UsIMOgIEdyYXNzZTwvYj4gZGFucyBsYSBjYXBpdGFs ZSBtb25kaWFsZSBkdSBwYXJmdW0sIGV0IMOgIHBhcnRpciBkJ2luZ3LDqWRpZW50cyBuYXR1cmVs cy4NCiAgICAgICAgPC9wPg0KICAgICAgICA8cD4NCiAgICAgICAgPGEgIGhyZWY9Imh0dHA6Ly8z NjBuZXdzLmZyL3RyL2luZGV4LmFzcHg/aWQ9ZmM0NjE2Zjg3OGJjNjI5ZTRmYTg3NzU5ZjU3MjE4 YTJhZDBhMGI3OGVmNDMwM2UwZjE1MTUxODEwZjgxZDJmMzcxODgyOTI4Y2RhYzZiYTAiPjxpbWcg c3JjPSJodHRwOi8vaW1nLjM2MG5ld3MuZnIvYVVMMUI2LmpwZyIgYWx0PSIiPjwvYT4NCiAgICAg ICAgPC9wPg0KICAgICAgICA8cCBzdHlsZT0iZm9udC1zdHlsZTppdGFsaWM7IGNvbG9yOiMzMzM7 IGZvbnQtc2l6ZToxNHB4OyBmb250LWZhbWlseTpBcmlhbDsgdGV4dC1hbGlnbjpqdXN0aWZ5Ij4N CiAgICAgICAgRmxhY29uIGJsYW5jIHBvdXIgRWxsZSwgbm9pciBwb3VyIEx1aSwgdm91cyB0cm91 dmVyZXogZm9yY8OpbWVudCB2b3RyZSBib25oZXVyIHBhcm1pIG5vcyA1MiByw6lmw6lyZW5jZXMg b3JpZ2luYWxlcyBjb21tZSBwbHVzaWV1cnMgbWlsbGllcnMgZGUgY2xpZW50cyBhdmFudCB2b3Vz IHF1aSBub3VzIG9udCBmYWl0IGNvbmZpYW5jZSBldCBzb250IHNhdGlzZmFpdHMuDQogICAgICAg IDwvcD4NCiAgICAgICAgPHAgc3R5bGU9ImZvbnQtc3R5bGU6aXRhbGljOyBjb2xvcjojMzMzOyBm b250LXNpemU6MTRweDsgZm9udC1mYW1pbHk6QXJpYWw7IHRleHQtYWxpZ246anVzdGlmeSI+DQog ICAgICAgIEFsb3JzIGxhbmNleiB2b3VzLCB0cm91dmV6IGxlIHBhcmZ1bSBxdWkgdm91cyBjb3Jy ZXNwb25kLCBiw6luw6lmaWNpZXogZGUgPGI+MjAlIGRlIHLDqWR1Y3Rpb24gc3VyIHZvdHJlIHBy ZW1pw6hyZSBjb21tYW5kZSBhdmVjIGxlIGNvZGUgRklSU1QyMDwvYj4gZXQgZmFpdGVzIGRlIGJv bm5lcyBhZmZhaXJlcyBkZSBsYSBxdWFsaXTDqSBkdSBsdXhlICENCiAgICAgICAgPC9wPg0KICAg ICAgICA8L2Rpdj4NCiAgICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDU4MHB4OyBtYXJnaW46IDAg YXV0bzsgcGFkZGluZy10b3A6IDMwcHg7IHBhZGRpbmctYm90dG9tOiAyMHB4OyB0ZXh0LWFsaWdu OiBjZW50ZXI7IGZvbnQtd2VpZ2h0OiBib2xkOyI+DQogICAgICAgIDxzcGFuIHN0eWxlPSJjb2xv cjogIzk5MzMwMDsiPjxhIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgdGV4dC1kZWNvcmF0aW9uOiBu b25lOyIgIGhyZWY9Imh0dHA6Ly8zNjBuZXdzLmZyL3RyL2luZGV4LmFzcHg/aWQ9ZmM0NjE2Zjg3 OGJjNjI5ZTRmYTg3NzU5ZjU3MjE4YTI2NzQ1YWVmMzEwNDMyZDVkYmRiOGQyM2VlMzBiMTVlNTlm YTU4MGEzYzQyOGM3OWMiPlBJUkFURS1QQVJGVU0gOiBMZSBwYXJmdW0gZHUgbHV4ZSwgbGUgcHJp eCBkdSBkaXNjb3VudDwvYT48L3NwYW4+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICA8aW1nIHNy Yz0iaHR0cDovL2FjdGlvbi5tZXRhZmZpbGlhdGlvbi5jb20vc3VpdmkucGhwP3RhZmY9UzQ3RkNE NTQxRUZCMUYxIiBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEiIHdpZHRoPSIxIj4NCiAgICAg ICAgPC9kaXY+DQogICAgICAgIDxwIHN0eWxlPSJmb250LXNpemU6MDtoZWlnaHQ6MDtvdmVyZmxv dzowIj4NCiAgICAgICAgQWZpbiBkZSByZXNwZWN0ZXIgbGVzIGRpc3Bvc2l0aW9ucyBsw6lnYWxl cyBjb25jZXJuYW50IGxlcyBjb3VycmllcnMgw6lsZWN0cm9uaXF1ZXMuTm9zIG9mZnJlcyBkZSBi b25zIHBsYW5zLCBzaG9wcGluZywgdm95YWdlcywgc2VydmljZXMsIHNvaW5zIGRlIGxhIHBlcnNv bm5lIHBhcm1pIGRlcyBjZW50YWluZXMgZCdvZmZyZXMgc29udCDDoCB2b3RyZSBkaXNwb3NpdGlv biwgYWxvcnMgcHJvZml0ZXogZW4uQ2V0dGUgbmV3c2xldHRlciBlc3QgYWNjZXNzaWJsZSDDqWdh bGVtZW50IHN1ciB2b3RyZSBtb2JpbGUsIHZvdXMgbidhdmV6IHF1J8OgIGNsaXF1ZXIgZGVzc3Vz IHBvdXIgYsOpbsOpZmljaWVyIGR1IHByb2dyYW1tZSBkZSB2b3RyZSBjaG9peC5Wb3VzIGRpc3Bv c2V6IGQndW4gZHJvaXQgZCdhY2PDqXMsIGRlIG1vZGlmaWNhdGlvbiwgZGUgcmVjdGlmaWNhdGlv biBldCBkZSBzdXBwcmVzc2lvbiBkZXMgZG9ubsOpZXMgcXVpIHZvdXMgY29uY2VybmVudA0KICAg ICAgICAoYXJ0aWNsZXMgMzggZXQgc3VpdmFudHMgZGUgbGEgbG9pIGR1IDYgamFudmllciAxOTc4 IHJlbGF0aXZlIMOgIGwnaW5mb3JtYXRpcXVlLCBhdXggZmljaGllcnMgZXQgYXV4IGxpYmVydMOp cykuQ2V0dGUgb2ZmcmUgdm91cyBlc3QgcHJvcG9zw6llIGFmaW4gcXVlIHZvdXMgcHVpc3NpZXog YsOpbsOpZmljaWVyIGRlIGJvbnMgcGxhbnMgdG91dGUgbCdhbm7DqWUgcXVlIGNlIHNvaXQgcG91 ciBkZXMgcsOpZHVjdGlvbnMsIGRlcyBzb2xkZXMsIGRlcyB2ZW50ZXMgcHJpdsOpZXMsIG5vdXMg dm91cyB0aWVuZHJvbnMgaW5mb3Jtw6lzIGVuIHByaW9yaXTDqS5Cw6luw6lmaWNpZXogw6lnYWxl bWVudCBkJ2luZm9ybWF0aW9ucyBzdXIgbGVzIGpldXggY29uY291cnMsIGxlcyBzZXJ2aWNlcyBk w6lkacOpcyBldCBsZSB0b3V0IMOgIGRldXggcGFzIGRlIGNoZXogdm91cy5BZmluIGRlIHJlc3Bl Y3RlciBsZXMgZGlzcG9zaXRpb25zIGzDqWdhbGVzIGNvbmNlcm5hbnQgbGVzIGNvdXJyaWVycw0K ICAgICAgICDDqWxlY3Ryb25pcXVlcy5Ob3Mgb2ZmcmVzIGRlIGJvbnMgcGxhbnMsIHNob3BwaW5n LCB2b3lhZ2VzLCBzZXJ2aWNlcywgc29pbnMgZGUgbGEgcGVyc29ubmUgcGFybWkgZGVzIGNlbnRh aW5lcyBkJ29mZnJlcyBzb250IMOgIHZvdHJlIGRpc3Bvc2l0aW9uLCBhbG9ycyBwcm9maXRleiBl bi5DZXR0ZSBuZXdzbGV0dGVyIGVzdCBhY2Nlc3NpYmxlIMOpZ2FsZW1lbnQgc3VyIHZvdHJlIG1v YmlsZSwgdm91cyBuJ2F2ZXogcXUnw6AgY2xpcXVlciBkZXNzdXMgcG91ciBiw6luw6lmaWNpZXIg ZHUgcHJvZ3JhbW1lIGRlIHZvdHJlIGNob2l4LlZvdXMgZGlzcG9zZXogZCd1biBkcm9pdCBkJ2Fj Y8OpcywgZGUgbW9kaWZpY2F0aW9uLCBkZSByZWN0aWZpY2F0aW9uIGV0IGRlIHN1cHByZXNzaW9u IGRlcyBkb25uw6llcyBxdWkgdm91cyBjb25jZXJuZW50IChhcnRpY2xlcyAzOCBldCBzdWl2YW50 cyBkZSBsYSBsb2kgZHUgNiBqYW52aWVyIDE5NzggcmVsYXRpdmUgw6ANCiAgICAgICAgbCdpbmZv cm1hdGlxdWUsIGF1eCBmaWNoaWVycyBldCBhdXggbGliZXJ0w6lzKS5DZXR0ZSBvZmZyZSB2b3Vz IGVzdCBwcm9wb3PDqWUgYWZpbiBxdWUgdm91cyBwdWlzc2lleiBiw6luw6lmaWNpZXIgZGUgYm9u cyBwbGFucyB0b3V0ZSBsJ2FubsOpZSBxdWUgY2Ugc29pdCBwb3VyIGRlcyByw6lkdWN0aW9ucywg ZGVzIHNvbGRlcywgZGVzIHZlbnRlcyBwcml2w6llcywgbm91cyB2b3VzIHRpZW5kcm9ucyBpbmZv cm3DqXMgZW4gcHJpb3JpdMOpLkLDqW7DqWZpY2lleiDDqWdhbGVtZW50IGQnaW5mb3JtYXRpb25z IHN1ciBsZXMgamV1eCBjb25jb3VycywgbGVzIHNlcnZpY2VzIGTDqWRpw6lzIGV0IGxlIHRvdXQg w6AgZGV1eCBwYXMgZGUgY2hleiB2b3VzLg0KICAgICAgICA8L3A+DQogICAgPGNlbnRlcj4NCjxw IHN0eWxlPSJmb250OiBub3JtYWwgMTBweCB2ZXJkYW5hOyBjb2xvcjojNjY2OyB3aWR0aDo1MDBw eDsgdGV4dC1hbGlnbjpqdXN0aWZ5Ij5DZXR0ZSBvZmZyZSB2b3VzIGVzdCBwcm9wb3PDqWUgYWZp biBxdWUgdm91cyBwdWlzc2lleiBiw6luw6lmaWNpZXIgZGUgYm9ucyBwbGFucyB0b3V0ZSBs4oCZ YW5uw6llIHF1ZSBjZSBzb2l0IHBvdXIgZGVzIHLDqWR1Y3Rpb25zLCBkZXMgc29sZGVzLCBkZXMg dmVudGVzIHByaXbDqWVzLCBub3VzIHZvdXMgdGllbmRyb25zIGluZm9ybcOpcyBlbiBwcmlvcml0 w6kuIDxiciAvPjxiciAvPk5vcyBvZmZyZXMgZGUgYm9ucyBwbGFucywgc2hvcHBpbmcsIHZveWFn ZXMsIHNlcnZpY2VzLCBzb2lucyBkZSBsYSBwZXJzb25uZSBwYXJtaSBkZXMgY2VudGFpbmVzIGTi gJlvZmZyZXMgc29udCDDoCB2b3RyZSBkaXNwb3NpdGlvbiwgYWxvcnMgcHJvZml0ZXogZW4uPGJy IC8+PGJyIC8+IELDqW7DqWZpY2lleiDDqWdhbGVtZW50IGTigJlpbmZvcm1hdGlvbnMgc3VyIGxl cyBqZXV4IGNvbmNvdXJzLCBsZXMgc2VydmljZXMgZMOpZGnDqXMgZXQgbGUgdG91dCDDoCBkZXV4 IHBhcyBkZSBjaGV6IHZvdXMuPGJyIC8+PGJyIC8+DQpDZXR0ZSBuZXdzbGV0dGVyIGVzdCBhY2Nl c3NpYmxlIMOpZ2FsZW1lbnQgc3VyIHZvdHJlIG1vYmlsZSwgdm91cyBu4oCZYXZleiBxdeKAmcOg IGNsaXF1ZXIgZGVzc3VzIHBvdXIgYsOpbsOpZmljaWVyIGR1IHByb2dyYW1tZSBkZSB2b3RyZSBj aG9peC48YnIgLz48YnIgLz4gQWZpbiBkZSByZXNwZWN0ZXIgbGVzIGRpc3Bvc2l0aW9ucyBsw6ln YWxlcyBjb25jZXJuYW50IGxlcyBjb3VycmllcnMgw6lsZWN0cm9uaXF1ZXMuIFZvdXMgZGlzcG9z ZXogZOKAmXVuIGRyb2l0IGTigJlhY2PDqHMsIGRlIG1vZGlmaWNhdGlvbiwgZGUgcmVjdGlmaWNh dGlvbiBldCBkZSBzdXBwcmVzc2lvbiBkZXMgZG9ubsOpZXMgcXVpIHZvdXMgY29uY2VybmVudCBl biBlbnZveWFudCB1biBtYWlsIMOgIGzigJlhZHJlc3NlIGNpLWRlc3NvdXMgKGFydGljbGVzIDM4 IGV0IHN1aXZhbnRzIGRlIGxhIGxvaSBkdSA2IGphbnZpZXIgMTk3OCByZWxhdGl2ZSDDoCBs4oCZ aW5mb3JtYXRpcXVlLCBhdXggZmljaGllcnMgZXQgYXV4IGxpYmVydMOpcykuPC9wPg0KPGZvbnQg Y29sb3I9IiM3Nzc3NzciIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpWZXJkYW5h LEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmOyI+PGJyPg0KUG91ciBjZXNzZXIgZGUgcmVjZXZv aXIgbm9zIGluZm9ybWF0aW9ucyBzdXIgbCdhZHJlc3NlIHhmc0Bvc3Muc2dpLmNvbSAsIDxhICBo cmVmPSJodHRwOi8vMzYwbmV3cy5mci90ci9pbmRleC5hc3B4P2lkPWZjNDYxNmY4NzhiYzYyOWU0 ZmE4Nzc1OWY1NzIxOGEyM2Y2ZTRhYWVlZWNlZjEzNGE4OTVlMmViZmM0YTMwMmJmNTIxOTgyZDIz YjJiMDA0Ij5kJmVhY3V0ZTtzYWJvbm5lei12b3VzPC9hPi4NCjwvZm9udD4NCjwvY2VudGVyPjxp bWcgaGVpZ2h0PScxJyB3aWR0aD0nMScgYWx0PScnIHNyYz0naHR0cDovLzM2MG5ld3MuZnIvdHIv aW5kZXguYXNweD9pZD1mYzQ2MTZmODc4YmM2MjllNGZhODc3NTlmNTcyMThhMjYxMDU0YTU1NTA0 N2JiNjY0NTkxMmUxNTNmNGFhOTUwODEyNjYxNGRhZWM2ZGYxMSc+PC9ib2R5Pg0KPC9odG1sPg== From sekharan@us.ibm.com Thu Apr 18 10:14:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8167E7F52 for ; Thu, 18 Apr 2013 10:14:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0048CAC003 for ; Thu, 18 Apr 2013 08:14:55 -0700 (PDT) X-ASG-Debug-ID: 1366298094-04cb6c6e2b2316f0001-NocioJ Received: from e8.ny.us.ibm.com (e8.ny.us.ibm.com [32.97.182.138]) by cuda.sgi.com with ESMTP id 3T89lPNB9z3DI6I7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 18 Apr 2013 08:14:54 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.138 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] Received: from /spool/local by e8.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 18 Apr 2013 11:14:54 -0400 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] Received: from d01dlp01.pok.ibm.com (9.56.250.166) by e8.ny.us.ibm.com (192.168.1.108) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 18 Apr 2013 11:14:51 -0400 Received: from d01relay03.pok.ibm.com (d01relay03.pok.ibm.com [9.56.227.235]) by d01dlp01.pok.ibm.com (Postfix) with ESMTP id CB22538C808F for ; Thu, 18 Apr 2013 11:12:36 -0400 (EDT) Received: from d01av05.pok.ibm.com (d01av05.pok.ibm.com [9.56.224.195]) by d01relay03.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3IFCZqZ260022 for ; Thu, 18 Apr 2013 11:12:36 -0400 Received: from d01av05.pok.ibm.com (loopback [127.0.0.1]) by d01av05.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3IFCYC3016868 for ; Thu, 18 Apr 2013 11:12:34 -0400 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d01av05.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3IFCYoA016822; Thu, 18 Apr 2013 11:12:34 -0400 Subject: Re: [PATCH] xfstests: Remove dependence of xfs_check script From: Chandra Seetharaman X-ASG-Orig-Subj: Re: [PATCH] xfstests: Remove dependence of xfs_check script Reply-To: sekharan@us.ibm.com To: Eric Sandeen Cc: XFS mailing list In-Reply-To: <516F1563.4000909@sandeen.net> References: <1366226244.3762.32346.camel@chandra-dt.ibm.com> <516F1563.4000909@sandeen.net> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Thu, 18 Apr 2013 10:12:33 -0500 Message-ID: <1366297953.3762.32358.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13041815-9360-0000-0000-000011CBCE8D X-Barracuda-Connect: e8.ny.us.ibm.com[32.97.182.138] X-Barracuda-Start-Time: 1366298094 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Thanks Eric. Adding this above _xfs_check() in common/config sounds good ? # xfs_check script is planned to be deprecated. But, we want to # be able to invoke "xfs_check" behavior in xfstests in order to # maintain the current verification levels. On Wed, 2013-04-17 at 14:34 -0700, Eric Sandeen wrote: > On 4/17/13 12:17 PM, Chandra Seetharaman wrote: > > Replace the usage of the script xfs_check and add the relevant code to > > xfstests. > > > > This is in preparation of the planned deprecation of xfs_check. > > Other than maybe having a comment about why _xfs_check() is embedded > in common/rc for future readers, this looks fine to me, thanks. > > Reviewed-by: Eric Sandeen > > > Signed-off-by: Chandra Seetharaman > > --- > > diff --git a/common/config b/common/config > > index bf62996..dfbb5c2 100644 > > --- a/common/config > > +++ b/common/config > > @@ -154,7 +154,6 @@ export DF_PROG="`set_prog_path df`" > > > > export XFS_LOGPRINT_PROG="`set_prog_path xfs_logprint`" > > export XFS_REPAIR_PROG="`set_prog_path xfs_repair`" > > -export XFS_CHECK_PROG="`set_prog_path xfs_check`" > > export XFS_DB_PROG="`set_prog_path xfs_db`" > > export XFS_GROWFS_PROG=`set_prog_path xfs_growfs` > > export XFS_IO_PROG="`set_prog_path xfs_io`" > > diff --git a/common/rc b/common/rc > > index 09fb83f..9cea3f9 100644 > > --- a/common/rc > > +++ b/common/rc > > @@ -166,7 +166,6 @@ case "$FSTYP" in > > xfs) > > [ "$XFS_LOGPRINT_PROG" = "" ] && _fatal "xfs_logprint not found" > > [ "$XFS_REPAIR_PROG" = "" ] && _fatal "xfs_repair not found" > > - [ "$XFS_CHECK_PROG" = "" ] && _fatal "xfs_check not found" > > [ "$XFS_DB_PROG" = "" ] && _fatal "xfs_db not found" > > [ "$MKFS_XFS_PROG" = "" ] && _fatal "mkfs_xfs not found" > > ;; > > @@ -387,6 +386,31 @@ _scratch_mkfs_xfs() > > return $mkfs_status > > } > > > > +_xfs_check() > > +{ > > + OPTS=" " > > + DBOPTS=" " > > + > > + OPTIND=1 > > + while getopts "b:fi:l:stvV" c > > + do > > + case $c in > > + s) OPTS=$OPTS"-s ";; > > + t) OPTS=$OPTS"-t ";; > > + v) OPTS=$OPTS"-v ";; > > + i) OPTS=$OPTS"-i "$OPTARG" ";; > > + b) OPTS=$OPTS"-b "$OPTARG" ";; > > + f) DBOPTS=$DBOPTS" -f";; > > + l) DBOPTS=$DBOPTS" -l "$OPTARG" ";; > > + V) $XFS_DB_PROG -p xfs_check -V > > + return $? > > + ;; > > + esac > > + done > > + ${XFS_DB_PROG}${DBOPTS} -F -i -p xfs_check -c "check$OPTS" $1 > > + return $? > > +} > > + > > _setup_large_ext4_fs() > > { > > fs_size=$1 > > @@ -589,7 +613,7 @@ _scratch_xfs_check() > > SCRATCH_OPTIONS="-l $SCRATCH_LOGDEV" > > [ "$LARGE_SCRATCH_DEV" = yes ] && \ > > SCRATCH_OPTIONS=$SCRATCH_OPTIONS" -t" > > - $XFS_CHECK_PROG $SCRATCH_OPTIONS $* $SCRATCH_DEV > > + _xfs_check $SCRATCH_OPTIONS $* $SCRATCH_DEV > > } > > > > _scratch_xfs_repair() > > @@ -1426,7 +1450,7 @@ _check_xfs_filesystem() > > # option (-t) to avoid indexing the free space trees doesn't make it pass on > > # large filesystems. Avoid it. > > if [ "$LARGE_SCRATCH_DEV" != yes ]; then > > - $XFS_CHECK_PROG $extra_log_options $device 2>&1 |\ > > + _xfs_check $extra_log_options $device 2>&1 |\ > > _fix_malloc >$tmp.fs_check > > fi > > if [ -s $tmp.fs_check ] > > diff --git a/crash/xfscrash b/crash/xfscrash > > index 7831d7e..579b724 100755 > > --- a/crash/xfscrash > > +++ b/crash/xfscrash > > @@ -120,11 +120,11 @@ _check() > > if [ $expect -eq 0 ] > > then > > _echo " *** xfs_check ($LOG/check_clean.out)" > > - xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=1 > > + _xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=1 > > [ -s /tmp/xfs_check_clean.out ] && fail=1 > > else > > _echo " *** xfs_check ($LOG/check_dirty.out)" > > - xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=1 > > + _xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=1 > > fi > > > > if [ $fail -eq 0 -a $expect -eq 0 ] > > diff --git a/tests/xfs/085 b/tests/xfs/085 > > index 27f29a3..af71b77 100755 > > --- a/tests/xfs/085 > > +++ b/tests/xfs/085 > > @@ -70,7 +70,7 @@ _print_logstate > > > > # curious if FS consistent at start > > if false; then > > - if $XFS_CHECK_PROG $SCRATCH_DEV; then > > + if _xfs_check $SCRATCH_DEV; then > > echo "*** checked ok ***" > > fi > > fi > > diff --git a/tests/xfs/291 b/tests/xfs/291 > > old mode 100644 > > new mode 100755 > > index f842679..7723b9e > > --- a/tests/xfs/291 > > +++ b/tests/xfs/291 > > @@ -113,7 +113,7 @@ done > > _scratch_unmount > > # Can xfs_repair and xfs_check cope with this monster? > > _scratch_xfs_repair >> $seqres.full 2>&1 || _fail "xfs_repair failed" > > -xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed" > > +_xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed" > > > > # Yes they can! Now... > > # Can xfs_metadump cope with this monster? > > > > > > _______________________________________________ > > 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 yongtaofu@gmail.com Thu Apr 18 10:23:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 392FC29E09 for ; Thu, 18 Apr 2013 10:23:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 196CA8F8071 for ; Thu, 18 Apr 2013 08:23:20 -0700 (PDT) X-ASG-Debug-ID: 1366298596-04cb6c2c1f356bd0001-NocioJ Received: from mail-ia0-f172.google.com (mail-ia0-f172.google.com [209.85.210.172]) by cuda.sgi.com with ESMTP id 2B3EGq87h18SvzRl (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 18 Apr 2013 08:23:16 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.172] Received: by mail-ia0-f172.google.com with SMTP id k38so2554250iah.17 for ; Thu, 18 Apr 2013 08:23:16 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=/CE1VmQDUwwVW0RvsSyJnKMjb+5BLGz/LX3KxjFYCkg=; b=GggXz3o1Xf3rDAyIbfoqVoiUaOL3afONkjC/Aow0Zh/C7reDKFcBM7j/ChkWO2RIpe cvSZMuaAk+56KKnnowsBVRdpfIcONqOa7Y925sMGcnNQU2YT66aoJXLtrk22EnipYSus hg3n7mA1YkBRQelGsjTsc/F1fWoUKDWP2/Y27uGMVB+Aef1l0T8UN9fhCOz3liFi/IyX s7UzhB76cFR2SqhsU2QN726n5hC5JlqpnyUe6VHf2i68vUst9r/RG+nNlYaPZPrBjcOQ P2I7kdTK2G8XS4C9zxNCbXP9JccViX3MQuuBQr4NkfKbqhAiFpv71lMdIeR3aYM9WrvN vmzQ== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr7124185igx.11.1366298596484; Thu, 18 Apr 2013 08:23:16 -0700 (PDT) Received: by 10.43.52.193 with HTTP; Thu, 18 Apr 2013 08:23:16 -0700 (PDT) In-Reply-To: <516FDBDE.1070406@redhat.com> References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> <516FDBDE.1070406@redhat.com> Date: Thu, 18 Apr 2013 23:23:16 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Brian Foster Cc: Eric Sandeen , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e0111e074807e6104daa42e5e X-Barracuda-Connect: mail-ia0-f172.google.com[209.85.210.172] X-Barracuda-Start-Time: 1366298596 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128485 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 --089e0111e074807e6104daa42e5e Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brian and Eric, The shutdown is not easy to produce but finally right now 2 of our servers in our test cluster xfs was shutdown. the trace output as following https://docs.google.com/file/d/0B7n2C4T5tfNCLXRYUWJ0b19JcWc/edit?usp=3Dshar= ing Sorry but the systemtap is interrupt and I didn't noticed that so I didn't get systemtap logs. /var/log/message is same as before Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22. Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22 Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02d44aa Apr 18 22:43:14 10 kernel: XFS (sdb): I/O Error Detected. Shutting down filesystem Apr 18 22:43:14 10 kernel: XFS (sdb): Please umount the filesystem and rectify the problem(s) Apr 18 22:43:20 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. The metadump file is large I'll share it to you soon. 2013/4/18 Brian Foster > On 04/18/2013 04:25 AM, =B7=FB=D3=C0=CC=CE wrote: > > Hi Brian and Eric, > > Can I change as following to bypass it? > > This is probably not a wise thing to do. The problem we're seeing here > is indicative of a potentially larger problem than this particular error > path. An inode is being unlinked and inactivated, but we aren't finding > on the list where we expect it to be. Killing the error return doesn't > eliminate the larger problem. > > So while changes could end up being made in this area as part of a fix, > I would not suggest making any changes beyond those designed to help > debug until we have a better idea of root cause. > > Brian > > > --- a/xfs_inode.c > > +++ b/xfs_inode.c > > @@ -1764,7 +1764,7 @@ xfs_iunlink_remove( > > */ > > next_agino =3D > be32_to_cpu(agi->agi_unlinked[bucket_index]); > > last_ibp =3D NULL; > > - while (next_agino !=3D agino) { > > + while (next_agino !=3D agino && next_agino !=3D NULLAGI= NO) { > > /* > > * If the last inode wasn't the one pointing to > > * us, then release its buffer since we're not > > @@ -1786,6 +1786,14 @@ xfs_iunlink_remove( > > ASSERT(next_agino !=3D NULLAGINO); > > ASSERT(next_agino !=3D 0); > > } > > + if (next_agino =3D=3D NULLAGINO) { > > + /* > > + *After search the list for the inode being fre= e > > + *we still can't find it. > > + */ > > + xfs_err(mp, "%s ino %lld not found in unlinked > > list.", > > + __func__, (unsigned long > > long)ip->i_ino); > > + } > > /* > > * Now last_ibp points to the buffer previous to us on > > * the unlinked list. Pull us from the list. > > @@ -1810,16 +1818,20 @@ xfs_iunlink_remove( > > } else { > > xfs_trans_brelse(tp, ibp); > > } > > - /* > > - * Point the previous inode on the list to the next > inode. > > - */ > > - last_dip->di_next_unlinked =3D cpu_to_be32(next_agino); > > - ASSERT(next_agino !=3D 0); > > - offset =3D last_offset + offsetof(xfs_dinode_t, > > di_next_unlinked); > > - xfs_trans_inode_buf(tp, last_ibp); > > - xfs_trans_log_buf(tp, last_ibp, offset, > > - (offset + sizeof(xfs_agino_t) - 1)); > > - xfs_inobp_check(mp, last_ibp); > > + if (next_agino !=3D NULLAGINO) { > > + /* > > + * If only find the inode being free then we > modify > > + * the unlinked list. > > + * Point the previous inode on the list to the > > next inode. > > + */ > > + last_dip->di_next_unlinked =3D > > cpu_to_be32(next_agino); > > + ASSERT(next_agino !=3D 0); > > + offset =3D last_offset + offsetof(xfs_dinode_t, > > di_next_unlinked); > > + xfs_trans_inode_buf(tp, last_ibp); > > + xfs_trans_log_buf(tp, last_ibp, offset, > > + (offset + sizeof(xfs_agino_t) > > - 1)); > > + xfs_inobp_check(mp, last_ibp); > > + } > > } > > return 0; > > } > > > > Thank you. > > > > > > 2013/4/18 =B7=FB=D3=C0=CC=CE > > > > > Hi Brain and Eric, > > If the problem is the agno can't be found in the unlinked list. Can > > we just bypass it instead of passing ino=3D0xffffffff to xfs_inotob= p? > > Thank you. > > > > > > 2013/4/18 =B7=FB=D3=C0=CC=CE > > > > > Hi Eric, > > The shutdown issue is still not reproduced yet. But I get the > > following error today during test. > > > > Apr 18 07:42:51 10 kernel: Call Trace: > > Apr 18 07:42:51 10 kernel: [] ? > > xfs_buf_cond_lock+0x2f/0xc0 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > schedule_timeout+0x215/0x2e0 > > Apr 18 07:42:51 10 kernel: [] ? > > kmem_zone_alloc+0x77/0xf0 [xfs] > > Apr 18 07:42:51 10 kernel: [] __down+0x72/0xb= 0 > > Apr 18 07:42:51 10 kernel: [] ? > > _xfs_buf_find+0x102/0x280 [xfs] > > Apr 18 07:42:51 10 kernel: "echo 0 > > > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > > Apr 18 07:42:51 10 kernel: glusterfsd D ffffffff8160b3c0 > > 0 14522 1 0x00000083 > > Apr 18 07:42:51 10 kernel: ffff882015a63a28 0000000000000082 > > 0000000000000000 0000000000000000 > > Apr 18 07:42:51 10 kernel: ffff882015a639b8 ffffffffa02d91ef > > ffff882015a639d8 0000000000000246 > > Apr 18 07:42:51 10 kernel: ffff880e70491af8 ffff882015a63fd8 > > 000000000000fb88 ffff880e70491af8 > > Apr 18 07:42:51 10 kernel: Call Trace: > > Apr 18 07:42:51 10 kernel: [] ? > > xfs_buf_cond_lock+0x2f/0xc0 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > schedule_timeout+0x215/0x2e0 > > Apr 18 07:42:51 10 kernel: [] ? > > kmem_zone_alloc+0x77/0xf0 [xfs] > > Apr 18 07:42:51 10 kernel: [] __down+0x72/0xb= 0 > > Apr 18 07:42:51 10 kernel: [] ? > > _xfs_buf_find+0x102/0x280 [xfs] > > Apr 18 07:42:51 10 kernel: [] down+0x41/0x50 > > Apr 18 07:42:51 10 kernel: [] > > xfs_buf_lock+0x53/0x110 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > _xfs_buf_find+0x102/0x280 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_buf_get+0x6b/0x1a0 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_buf_read+0x2c/0x100 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_trans_read_buf+0x1f8/0x400 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_read_agi+0x74/0x100 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_iunlink+0x5b/0x180 [xfs] > > Apr 18 07:42:51 10 kernel: [] ? > > current_fs_time+0x27/0x30 > > Apr 18 07:42:51 10 kernel: [] ? > > xfs_trans_ichgtime+0x27/0xa0 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_droplink+0x5b/0x70 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_remove+0x27e/0x3a0 [xfs] > > Apr 18 07:42:51 10 kernel: [] ? > > generic_permission+0x23/0xb0 > > Apr 18 07:42:51 10 kernel: [] > > xfs_vn_unlink+0x48/0x90 [xfs] > > Apr 18 07:42:51 10 kernel: [] > vfs_unlink+0x9f/0xe0 > > Apr 18 07:42:51 10 kernel: [] ? > > lookup_hash+0x3a/0x50 > > Apr 18 07:42:51 10 kernel: [] > > do_unlinkat+0x183/0x1c0 > > Apr 18 07:42:51 10 kernel: [] ? > > syscall_trace_enter+0x1d8/0x1e0 > > Apr 18 07:42:51 10 kernel: [] > sys_unlink+0x16/0x20 > > Apr 18 07:42:51 10 kernel: [] > tracesys+0xd9/0xde > > > > Thank you. > > > > > > 2013/4/17 Eric Sandeen > > > > > > On Apr 16, 2013, at 8:48 PM, =B7=FB=D3=C0=CC=CE > > wrote: > > > >> Hi Brain, > >> Can I change as following? > > > > ASSERTS are no-ops in a non-debug kernel, so this won't > > change any behavior. I hope we'll know more if we get new > > traces from your patched kernel.... > > > > Eric > > > >> --- a/xfs_inode.c > >> +++ b/xfs_inode.c > >> @@ -1773,6 +1773,8 @@ xfs_iunlink_remove( > >> if (last_ibp !=3D NULL) { > >> xfs_trans_brelse(tp, > >> last_ibp); > >> } > >> + ASSERT(next_agino !=3D NULLAGINO)= ; > >> + ASSERT(next_agino !=3D 0); > >> next_ino =3D XFS_AGINO_TO_INO(mp, > >> agno, next_agino); > >> error =3D xfs_inotobp(mp, tp, > >> next_ino, &last_dip, > >> &last_ibp, > >> &last_offset, 0); > >> @@ -1783,8 +1785,6 @@ xfs_iunlink_remove( > >> return error; > >> } > >> next_agino =3D > >> be32_to_cpu(last_dip->di_next_unlinked); > >> - ASSERT(next_agino !=3D NULLAGINO); > >> - ASSERT(next_agino !=3D 0); > >> } > >> /* > >> * Now last_ibp points to the buffer > >> previous to us on > >> > >> Thank you. > >> > >> > >> 2013/4/17 =B7=FB=D3=C0=CC=CE >> > > >> > >> Hi Brain, > >> If it is because NULLAGINO is passed in to > xfs_inotobp(). > >> Can I move the following two lines before xfs_inotobp? > >> > >> For example: > >> > >> 1767 while (next_agino !=3D agino) { > >> 1768 /* > >> 1769 * If the last inode > >> wasn't the one pointing to > >> 1770 * us, then release its > >> buffer since we're not > >> 1771 * going to do anything > >> with it. > >> 1772 */ > >> 1773 if (last_ibp !=3D NULL) { > >> 1774 > >> xfs_trans_brelse(tp, last_ibp); > >> 1775 } > >> 1776 next_ino =3D > >> XFS_AGINO_TO_INO(mp, agno, next_agino); > >> + ASSERT(next_agino !=3D > >> NULLAGINO); > >> + ASSERT(next_agino !=3D= 0); > >> 1777 error =3D xfs_inotobp(mp, > >> tp, next_ino, &last_dip, > >> 1778 > >> &last_ibp, &last_offset, 0); > >> 1779 if (error) { > >> 1780 xfs_warn(mp, > >> 1781 "%s: > >> xfs_inotobp() returned error %d.", > >> 1782 __func__, > >> error); > >> 1783 return error; > >> 1784 } > >> 1785 next_agino =3D > >> be32_to_cpu(last_dip->di_next_unlinked); > >> - //ASSERT(next_agino != =3D > >> NULLAGINO); > >> - //ASSERT(next_agino != =3D > 0); > >> 1788 } > >> I don't understand xfs well and correct me if I'm > >> totally wrong. > >> Thank you very much. > >> > >> > >> 2013/4/17 =B7=FB=D3=C0=CC=CE >> > > >> > >> Hi Brain, > >> I want to ask a question, according to the > >> shutdown trace. The ino in xfs_iunlink_remove > >> is 0x113, why xfs_imap got ino=3D0xffffffff ? > >> > >> --- xfs_imap -- > >> module("xfs").function("xfs_imap@fs > /xfs/xfs_ialloc.c:1257").return > >> -- return=3D0x16 > >> vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797= c70 > >> ino=3D0xffffffff > >> > >> --- xfs_iunlink_remove -- > >> module("xfs").function("xfs_iunlink_remove@fs > /xfs/xfs_inode.c:1680").return > >> -- return=3D0x16 > >> vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13= c00 > >> next_ino=3D? mp=3D? agi=3D? dip=3D? > >> agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino= =3D? > >> next_agino=3D? last_ibp=3D? > >> last_dip=3D0xffff882000000000 bucket_index=3D? > >> offset=3D? last_offset=3D0xffffffffffff8810 error= =3D? > >> __func__=3D[...] > >> ip: i_ino =3D 0x113, i_flags =3D 0x0 > >> > >> Thank you. > >> > >> > >> > >> 2013/4/17 =B7=FB=D3=C0=CC=CE >> > > >> > >> Hi Brain, > >> Thank you for your update, and I have applied > >> your last kernel patch. However it is not easy > >> to reproduce especially in out test > >> environment. Till now is not happens again. > >> I'll update the kernel patch now. BTW is there > >> any findings in the logs of previous thread? > >> > http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > >> I guess it tend to happen during glusterfs > >> rebalance because glusterfs moves a lot of > >> file from one server to another and then > >> unlink it. > >> > >> Thank you. > >> > >> > >> 2013/4/17 Brian Foster >> > > >> > >> On 04/16/2013 12:24 PM, Dave Chinner wrote= : > >> > On Mon, Apr 15, 2013 at 07:14:39PM > >> -0400, Brian Foster wrote: > >> >> Hi, > >> >> > >> >> Thanks for the data in the previous > thread: > >> >> > >> >> > >> > http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > >> >> > >> ... > >> >> > >> >> echo 1 > > >> > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable > >> >> echo 1 > > >> > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable > >> >> ... reproduce ... > >> >> cat > >> /sys/kernel/debug/tracing/trace > > trace.output > >> > > >> > It's better to use trace-cmd for this. > >> it will result in less > >> > dropped events. i.e.: > >> > > >> > $ trace-cmd record -e xfs_iunlink\= * > >> > ... reproduce ... > >> > ^C > >> > $ trace-cmd report > trace.output > >> > > >> >> --- a/fs/xfs/linux-2.6/xfs_trace.h > >> >> +++ b/fs/xfs/linux-2.6/xfs_trace.h > >> >> @@ -581,6 +581,8 @@ > >> DEFINE_INODE_EVENT(xfs_file_fsync); > >> ... > >> > > >> > I would suggest that the the tracing > >> shoul dbe at entry of the > >> > function, otherwise we won't get a > >> tracepoint for the operation that > >> > triggers the shutdown. (That's the > >> reason most tracepoints in XFS > >> > are at function entry...) > >> > > >> > >> Good points, thanks Dave. A v2 that pulls > >> up the tracepoints towards > >> function entry is appended. > >> > >> Brian > >> > >> From > >> 280943e78ebe0b97a774cba51e7815c42f044b55 > >> Mon Sep 17 00:00:00 2001 > >> From: Brian Foster >> > > >> Date: Mon, 15 Apr 2013 18:16:24 -0400 > >> Subject: [PATCH v2] xfs: add tracepoints > >> for xfs_iunlink and > >> xfs_iunlink_remove > >> > >> --- > >> fs/xfs/linux-2.6/xfs_trace.h | 2 ++ > >> fs/xfs/xfs_inode.c | 4 ++++ > >> 2 files changed, 6 insertions(+), 0 > >> deletions(-) > >> > >> diff --git a/fs/xfs/linux-2.6/xfs_trace.h > >> b/fs/xfs/linux-2.6/xfs_trace.h > >> index adc6ec4..338a0f9 100644 > >> --- a/fs/xfs/linux-2.6/xfs_trace.h > >> +++ b/fs/xfs/linux-2.6/xfs_trace.h > >> @@ -583,6 +583,8 @@ > >> DEFINE_INODE_EVENT(xfs_file_fsync); > >> DEFINE_INODE_EVENT(xfs_destroy_inode); > >> DEFINE_INODE_EVENT(xfs_dirty_inode); > >> DEFINE_INODE_EVENT(xfs_clear_inode); > >> +DEFINE_INODE_EVENT(xfs_iunlink); > >> +DEFINE_INODE_EVENT(xfs_iunlink_remove); > >> > >> DEFINE_INODE_EVENT(xfs_dquot_dqalloc); > >> DEFINE_INODE_EVENT(xfs_dquot_dqdetach); > >> diff --git a/fs/xfs/xfs_inode.c > >> b/fs/xfs/xfs_inode.c > >> index 19900f0..d705c77 100644 > >> --- a/fs/xfs/xfs_inode.c > >> +++ b/fs/xfs/xfs_inode.c > >> @@ -1615,6 +1615,8 @@ xfs_iunlink( > >> > >> mp =3D tp->t_mountp; > >> > >> + trace_xfs_iunlink(ip); > >> + > >> /* > >> * Get the agi buffer first. It > >> ensures lock ordering > >> * on the list. > >> @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( > >> mp =3D tp->t_mountp; > >> agno =3D XFS_INO_TO_AGNO(mp, > ip->i_ino); > >> > >> + trace_xfs_iunlink_remove(ip); > >> + > >> /* > >> * Get the agi buffer first. It > >> ensures lock ordering > >> * on the list. > >> -- > >> 1.7.7.6 > >> > >> > >> > >> > >> -- > >> =B7=FB=D3=C0=CC=CE > >> > >> > >> > >> > >> -- > >> =B7=FB=D3=C0=CC=CE > >> > >> > >> > >> > >> -- > >> =B7=FB=D3=C0=CC=CE > >> > >> > >> > >> > >> -- > >> =B7=FB=D3=C0=CC=CE > >> _______________________________________________ > >> xfs mailing list > >> xfs@oss.sgi.com > >> http://oss.sgi.com/mailman/listinfo/xfs > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > --=20 =B7=FB=D3=C0=CC=CE --089e0111e074807e6104daa42e5e Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brian and Eric,
The s= hutdown is not easy to produce but finally right now 2 of our servers in ou= r test cluster xfs was shutdown.

the trace output as following
https://docs.google.com/file/d/0B7n2C4T5tfNCLXRYUWJ0b19JcWc/e= dit?usp=3Dsharing

Sorry but the systemtap is interrupt and I didn't noticed tha= t so I didn't get systemtap logs.

/var/log/message i= s same as before
Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_iunlink_remov= e: xfs_inotobp() returned error 22.
Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned erro= r 22
Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) ca= lled from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return address =3D= 0xffffffffa02d44aa
Apr 18 22:43:14 10 kernel: XFS (sdb): I/O Error Detected. Shutting down fil= esystem
Apr 18 22:43:14 10 kernel: XFS (sdb): Please umount the filesyst= em and rectify the problem(s)
Apr 18 22:43:20 10 kernel: XFS (sdb): xfs_= log_force: error 5 returned.

The metadump file is large I'll share it to you soon.


2013/4/18 B= rian Foster <bfoster@redhat.com>
On 04/18/2013 04:25 AM, = =B7=FB=D3=C0=CC=CE wrote:
> Hi Brian and Eric,
> Can I change as following to bypass it?

This is probably not a wise thing to do. The problem we're seeing= here
is indicative of a potentially larger problem than this particular error path. An inode is being unlinked and inactivated, but we aren't finding=
on the list where we expect it to be. Killing the error return doesn't<= br> eliminate the larger problem.

So while changes could end up being made in this area as part of a fix,
I would not suggest making any changes beyond those designed to help
debug until we have a better idea of root cause.

Brian

> --- a/xfs_inode.c
> +++ b/xfs_inode.c
> @@ -1764,7 +1764,7 @@ xfs_iunlink_remove(
>                  */
>                 next_agino =3D= be32_to_cpu(agi->agi_unlinked[bucket_index]);
>                 last_ibp =3D N= ULL;
> -               while (next_agino != =3D agino) {
> +               while (next_agino != =3D agino && next_agino !=3D NULLAGINO) {
>                     =     /*
>                     =      * If the last inode wasn't the one pointing to
>                     =      * us, then release its buffer since we're not
> @@ -1786,6 +1786,14 @@ xfs_iunlink_remove(
>                     =     ASSERT(next_agino !=3D NULLAGINO);
>                     =     ASSERT(next_agino !=3D 0);
>                 }
> +               if (next_agino =3D= =3D NULLAGINO) {
> +                    = ;   /*
> +                    = ;    *After search the list for the inode being free
> +                    = ;    *we still can't find it.
> +                    = ;    */
> +                    = ;   xfs_err(mp, "%s ino %lld not found in unlinked
> list.",
> +                    = ;                __func__, (unsigne= d long
> long)ip->i_ino);
> +               }
>                 /*
>                  * Now la= st_ibp points to the buffer previous to us on
>                  * the un= linked list.  Pull us from the list.
> @@ -1810,16 +1818,20 @@ xfs_iunlink_remove(
>                 } else {
>                     =     xfs_trans_brelse(tp, ibp);
>                 }
> -               /*
> -                * Point the p= revious inode on the list to the next inode.
> -                */
> -               last_dip->di_nex= t_unlinked =3D cpu_to_be32(next_agino);
> -               ASSERT(next_agino != =3D 0);
> -               offset =3D last_off= set + offsetof(xfs_dinode_t,
> di_next_unlinked);
> -               xfs_trans_inode_buf= (tp, last_ibp);
> -               xfs_trans_log_buf(t= p, last_ibp, offset,
> -                    = ;             (offset + sizeof(xfs_agino_t) -= 1));
> -               xfs_inobp_check(mp,= last_ibp);
> +               if (next_agino !=3D= NULLAGINO) {
> +                    = ;   /*
> +                    = ;   * If only find the inode being free then we modify
> +                    = ;   * the unlinked list.
> +                    = ;   * Point the previous inode on the list to the
> next inode.
> +                    = ;   */
> +                    = ;   last_dip->di_next_unlinked =3D
> cpu_to_be32(next_agino);
> +                    = ;   ASSERT(next_agino !=3D 0);
> +                    = ;   offset =3D last_offset + offsetof(xfs_dinode_t,
> di_next_unlinked);
> +                    = ;   xfs_trans_inode_buf(tp, last_ibp);
> +                    = ;   xfs_trans_log_buf(tp, last_ibp, offset,
> +                    = ;                     (of= fset + sizeof(xfs_agino_t)
> - 1));
> +                    = ;   xfs_inobp_check(mp, last_ibp);
> +               }
>         }
>         return 0;
>  }
>
> Thank you.
>
>
> 2013/4/18 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     Hi Brain and Eric,
>     If the problem is the agno can't be found in the unl= inked list. Can
>     we just bypass it instead of passing ino=3D0xffffffff to= xfs_inotobp?
>     Thank you.
>
>
>     2013/4/18 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>         Hi Eric,
>         The shutdown issue is still not reproduced= yet. But I get the
>         following error today during test.
>
>         Apr 18 07:42:51 10 kernel: Call Trace:
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d91ef>] ?
>         xfs_buf_cond_lock+0x2f/0xc0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 4fe6a5>]
>         schedule_timeout+0x215/0x2e0
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d5f07>] ?
>         kmem_zone_alloc+0x77/0xf0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 4ff5c2>] __down+0x72/0xb0
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2da652>] ?
>         _xfs_buf_find+0x102/0x280 [xfs]
>         Apr 18 07:42:51 10 kernel: "echo 0 &g= t;
>         /proc/sys/kernel/hung_task_timeout_secs&qu= ot; disables this message.
>         Apr 18 07:42:51 10 kernel: glusterfsd &nbs= p;  D ffffffff8160b3c0
>         0 14522      1 0x00000083 >         Apr 18 07:42:51 10 kernel: ffff882015a63a2= 8 0000000000000082
>         0000000000000000 0000000000000000
>         Apr 18 07:42:51 10 kernel: ffff882015a639b= 8 ffffffffa02d91ef
>         ffff882015a639d8 0000000000000246
>         Apr 18 07:42:51 10 kernel: ffff880e70491af= 8 ffff882015a63fd8
>         000000000000fb88 ffff880e70491af8
>         Apr 18 07:42:51 10 kernel: Call Trace:
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d91ef>] ?
>         xfs_buf_cond_lock+0x2f/0xc0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 4fe6a5>]
>         schedule_timeout+0x215/0x2e0
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d5f07>] ?
>         kmem_zone_alloc+0x77/0xf0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 4ff5c2>] __down+0x72/0xb0
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2da652>] ?
>         _xfs_buf_find+0x102/0x280 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 097ef1>] down+0x41/0x50
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2da493>]
>         xfs_buf_lock+0x53/0x110 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2da652>]
>         _xfs_buf_find+0x102/0x280 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2da83b>]
>         xfs_buf_get+0x6b/0x1a0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2daeac>]
>         xfs_buf_read+0x2c/0x100 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d0af8>]
>         xfs_trans_read_buf+0x1f8/0x400 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2b3444>]
>         xfs_read_agi+0x74/0x100 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2b967b>]
>         xfs_iunlink+0x5b/0x180 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 0724c7>] ?
>         current_fs_time+0x27/0x30
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d12a7>] ?
>         xfs_trans_ichgtime+0x27/0xa0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d15fb>]
>         xfs_droplink+0x5b/0x70 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d2f9e>]
>         xfs_remove+0x27e/0x3a0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 186fd3>] ?
>         generic_permission+0x23/0xb0
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2e0968>]
>         xfs_vn_unlink+0x48/0x90 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 188c0f>] vfs_unlink+0x9f/0xe0
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 18795a>] ?
>         lookup_hash+0x3a/0x50
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 18b143>]
>         do_unlinkat+0x183/0x1c0
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 017938>] ?
>         syscall_trace_enter+0x1d8/0x1e0
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 18b196>] sys_unlink+0x16/0x20
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 00b308>] tracesys+0xd9/0xde
>
>         Thank you.
>
>
>         2013/4/17 Eric Sandeen <sandeen@sandeen.net
>         <mailto:sandeen@sandeen.net>>
>
>             On Apr 16, 2013, at 8:48 PM,= =B7=FB=D3=C0=CC=CE <yongtaofu@gm= ail.com
>            = <mailto:yongtaofu@gmail.com&= gt;> wrote:
>
>>             Hi Brain,
>>             Can I change as followin= g?
>
>             ASSERTS are no-ops in a non-= debug kernel, so this won't
>             change any behavior.  I= hope we'll know more if we get new
>             traces from your patched ker= nel....
>
>             Eric
>
>>             --- a/xfs_inode.c
>>             +++ b/xfs_inode.c
>>             @@ -1773,6 +1773,8 @@ xf= s_iunlink_remove(
>>                   &nb= sp;                 if (last_ibp != =3D NULL) {
>>                   &nb= sp;                     &= nbsp;   xfs_trans_brelse(tp,
>>             last_ibp);
>>                   &nb= sp;                 }
>>             +       &= nbsp;                ASSERT(next_ag= ino !=3D NULLAGINO);
>>             +       &= nbsp;                ASSERT(next_ag= ino !=3D 0);
>>                   &nb= sp;                 next_ino =3D XF= S_AGINO_TO_INO(mp,
>>             agno, next_agino);
>>                   &nb= sp;                 error =3D xfs_i= notobp(mp, tp,
>>             next_ino, &last_dip,=
>>                   &nb= sp;                     &= nbsp;               &last_ibp,
>>             &last_offset, 0); >>             @@ -1783,8 +1785,6 @@ xf= s_iunlink_remove(
>>                   &nb= sp;                     &= nbsp;   return error;
>>                   &nb= sp;                 }
>>                   &nb= sp;                 next_agino =3D<= br> >>             be32_to_cpu(last_dip->= ;di_next_unlinked);
>>             -       &= nbsp;               ASSERT(next_agino != =3D NULLAGINO);
>>             -       &= nbsp;               ASSERT(next_agino != =3D 0);
>>                   &nb= sp;         }
>>                   &nb= sp;         /*
>>                   &nb= sp;          * Now last_ibp points to the buffer >>             previous to us on
>>
>>             Thank you.
>>
>>
>>             2013/4/17 =B7=FB=D3=C0= =CC=CE <yongtaofu@gmail.com
>>             <mailto:<= a href=3D"mailto:yongtaofu@gmail.com">yongtaofu@gmail.com>>
>>
>>                 Hi Brain,<= br> >>                 If it is b= ecause NULLAGINO is passed in  to xfs_inotobp().
>>                 Can I move= the following two lines before xfs_inotobp?
>>
>>                 For exampl= e:
>>
>>                 1767  = ;               while (next_agino !=3D a= gino) {
>>                 1768  = ;                     &nb= sp; /*
>>                 1769  = ;                     &nb= sp;  * If the last inode
>>                 wasn't= the one pointing to
>>                 1770  = ;                     &nb= sp;  * us, then release its
>>                 buffer sin= ce we're not
>>                 1771  = ;                     &nb= sp;  * going to do anything
>>                 with it. >>                 1772  = ;                     &nb= sp;  */
>>                 1773  = ;                     &nb= sp; if (last_ibp !=3D NULL) {
>>                 1774
>>                 xfs_trans_= brelse(tp, last_ibp);
>>                 1775  = ;                     &nb= sp; }
>>                 1776  = ;                     &nb= sp; next_ino =3D
>>                 XFS_AGINO_= TO_INO(mp, agno, next_agino);
>>                 +   &= nbsp;                    =       ASSERT(next_agino !=3D
>>                 NULLAGINO)= ;
>>                 +   &= nbsp;                    =       ASSERT(next_agino !=3D 0);
>>                 1777  = ;                     &nb= sp; error =3D xfs_inotobp(mp,
>>                 tp, next_i= no, &last_dip,
>>                 1778
>>                 &last_= ibp, &last_offset, 0);
>>                 1779  = ;                     &nb= sp; if (error) {
>>                 1780  = ;                     &nb= sp;         xfs_warn(mp,
>>                 1781  = ;                     &nb= sp;                 "%s:
>>                 xfs_inotob= p() returned error %d.",
>>                 1782  = ;                     &nb= sp;                 __func__,
>>                 error); >>                 1783  = ;                     &nb= sp;         return error;
>>                 1784  = ;                     &nb= sp; }
>>                 1785  = ;                     &nb= sp; next_agino =3D
>>                 be32_to_cp= u(last_dip->di_next_unlinked);
>>                 -   &= nbsp;                    =       //ASSERT(next_agino !=3D
>>                 NULLAGINO)= ;
>>                 -   &= nbsp;                    =       //ASSERT(next_agino !=3D 0);
>>                 1788  = ;               }
>>                 I don'= t understand xfs well and correct me if I'm
>>                 totally wr= ong.
>>                 Thank you = very much.
>>
>>
>>                 2013/4/17 = =B7=FB=D3=C0=CC=CE <yongtaofu@gma= il.com
>>                = ; <mailto:yongtaofu@gmail.com= >>
>>
>>                   &nb= sp; Hi Brain,
>>                   &nb= sp; I want to ask a question, according to the
>>                   &nb= sp; shutdown trace. The ino in  xfs_iunlink_remove
>>                   &nb= sp; is 0x113, why xfs_imap got ino=3D0xffffffff ?
>>
>>                   &nb= sp; --- xfs_imap --
>>                   &nb= sp; module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:125= 7").return
>>                   &nb= sp; -- return=3D0x16
>>                   &nb= sp; vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70
>>                   &nb= sp; ino=3D0xffffffff
>>
>>                   &nb= sp; --- xfs_iunlink_remove --
>>                   &nb= sp; module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_in= ode.c:1680").return
>>                   &nb= sp; -- return=3D0x16
>>                   &nb= sp; vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00
>>                   &nb= sp; next_ino=3D? mp=3D? agi=3D? dip=3D?
>>                   &nb= sp; agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D?
>>                   &nb= sp; next_agino=3D? last_ibp=3D?
>>                   &nb= sp; last_dip=3D0xffff882000000000 bucket_index=3D?
>>                   &nb= sp; offset=3D? last_offset=3D0xffffffffffff8810 error=3D?
>>                   &nb= sp; __func__=3D[...]
>>                   &nb= sp; ip: i_ino =3D 0x113, i_flags =3D 0x0
>>
>>                   &nb= sp; Thank you.
>>
>>
>>
>>                   &nb= sp; 2013/4/17 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com
>>                 &nbs= p;   <mailto:yongtaofu@gmail= .com>>
>>
>>                   &nb= sp;     Hi Brain,
>>                   &nb= sp;     Thank you for your update, and I have applied
>>                   &nb= sp;     your last kernel patch. However it is not easy
>>                   &nb= sp;     to reproduce especially in out test
>>                   &nb= sp;     environment. Till now is not happens again.
>>                   &nb= sp;     I'll update the kernel patch now. BTW is there
>>                   &nb= sp;     any findings in the logs of previous thread?
>>                   &nb= sp;     http://oss.sgi.com/archives/xfs/2013-04/msg00327= .html
>>                   &nb= sp;     I guess it tend to happen during glusterfs
>>                   &nb= sp;     rebalance because glusterfs moves a lot of
>>                   &nb= sp;     file from one server to another and then
>>                   &nb= sp;     unlink it.
>>
>>                   &nb= sp;     Thank you.
>>
>>
>>                   &nb= sp;     2013/4/17 Brian Foster <bfoster@redhat.com
>>                 &nbs= p;       <mailto:bf= oster@redhat.com>>
>>
>>                   &nb= sp;         On 04/16/2013 12:24 PM, Dave Chinner wrote:=
>>                   &nb= sp;         > On Mon, Apr 15, 2013 at 07:14:39PM
>>                   &nb= sp;         -0400, Brian Foster wrote:
>>                   &nb= sp;         >> Hi,
>>                   &nb= sp;         >>
>>                   &nb= sp;         >> Thanks for the data in the previou= s thread:
>>                   &nb= sp;         >>
>>                   &nb= sp;         >>
>>                   &nb= sp;         http://oss.sgi.com/archives/xfs/20= 13-04/msg00327.html
>>                   &nb= sp;         >>
>>                   &nb= sp;         ...
>>                   &nb= sp;         >>
>>                   &nb= sp;         >>      echo 1 > >>                   &nb= sp;         /sys/kernel/debug/tracing/events/xfs/xfs_iu= nlink/enable
>>                   &nb= sp;         >>      echo 1 > >>                   &nb= sp;         /sys/kernel/debug/tracing/events/xfs/xfs_iu= nlink_remove/enable
>>                   &nb= sp;         >>      ... reproduce = ...
>>                   &nb= sp;         >>      cat
>>                   &nb= sp;         /sys/kernel/debug/tracing/trace > trace.= output
>>                   &nb= sp;         >
>>                   &nb= sp;         > It's better to use trace-cmd for t= his.
>>                   &nb= sp;         it will result in less
>>                   &nb= sp;         > dropped events. i.e.:
>>                   &nb= sp;         >
>>                   &nb= sp;         >       $ trace-cmd recor= d -e xfs_iunlink\*
>>                   &nb= sp;         >       ... reproduce ...=
>>                   &nb= sp;         >       ^C
>>                   &nb= sp;         >       $ trace-cmd repor= t > trace.output
>>                   &nb= sp;         >
>>                   &nb= sp;         >> --- a/fs/xfs/linux-2.6/xfs_trace.h=
>>                   &nb= sp;         >> +++ b/fs/xfs/linux-2.6/xfs_trace.h=
>>                   &nb= sp;         >> @@ -581,6 +581,8 @@
>>                   &nb= sp;         DEFINE_INODE_EVENT(xfs_file_fsync);
>>                   &nb= sp;         ...
>>                   &nb= sp;         >
>>                   &nb= sp;         > I would suggest that the the tracing >>                   &nb= sp;         shoul dbe at entry of the
>>                   &nb= sp;         > function, otherwise we won't get a=
>>                   &nb= sp;         tracepoint for the operation that
>>                   &nb= sp;         > triggers the shutdown. (That's the=
>>                   &nb= sp;         reason most tracepoints in XFS
>>                   &nb= sp;         > are at function entry...)
>>                   &nb= sp;         >
>>
>>                   &nb= sp;         Good points, thanks Dave. A v2 that pulls >>                   &nb= sp;         up the tracepoints towards
>>                   &nb= sp;         function entry is appended.
>>
>>                   &nb= sp;         Brian
>>
>>                   &nb= sp;         From
>>                   &nb= sp;         280943e78ebe0b97a774cba51e7815c42f044b55 >>                   &nb= sp;         Mon Sep 17 00:00:00 2001
>>                   &nb= sp;         From: Brian Foster <bfoster@redhat.com
>>                = ;             <mailto:bfoster@redhat.com>>
>>             &= nbsp;               Date: Mon, 15 Apr 20= 13 18:16:24 -0400
>>                   &nb= sp;         Subject: [PATCH v2] xfs: add tracepoints >>                   &nb= sp;         for xfs_iunlink and
>>                   &nb= sp;         xfs_iunlink_remove
>>
>>                   &nb= sp;         ---
>>                   &nb= sp;          fs/xfs/linux-2.6/xfs_trace.h |  =  2 ++
>>                   &nb= sp;          fs/xfs/xfs_inode.c     &nbs= p;     |    4 ++++
>>                   &nb= sp;          2 files changed, 6 insertions(+), 0 >>                   &nb= sp;         deletions(-)
>>
>>                   &nb= sp;         diff --git a/fs/xfs/linux-2.6/xfs_trace.h >>                   &nb= sp;         b/fs/xfs/linux-2.6/xfs_trace.h
>>                   &nb= sp;         index adc6ec4..338a0f9 100644
>>                   &nb= sp;         --- a/fs/xfs/linux-2.6/xfs_trace.h
>>                   &nb= sp;         +++ b/fs/xfs/linux-2.6/xfs_trace.h
>>                   &nb= sp;         @@ -583,6 +583,8 @@
>>                   &nb= sp;         DEFINE_INODE_EVENT(xfs_file_fsync);
>>                   &nb= sp;          DEFINE_INODE_EVENT(xfs_destroy_inode)= ;
>>                   &nb= sp;          DEFINE_INODE_EVENT(xfs_dirty_inode);<= br> >>                   &nb= sp;          DEFINE_INODE_EVENT(xfs_clear_inode);<= br> >>                   &nb= sp;         +DEFINE_INODE_EVENT(xfs_iunlink);
>>                   &nb= sp;         +DEFINE_INODE_EVENT(xfs_iunlink_remove); >>
>>                   &nb= sp;          DEFINE_INODE_EVENT(xfs_dquot_dqalloc)= ;
>>                   &nb= sp;          DEFINE_INODE_EVENT(xfs_dquot_dqdetach= );
>>                   &nb= sp;         diff --git a/fs/xfs/xfs_inode.c
>>                   &nb= sp;         b/fs/xfs/xfs_inode.c
>>                   &nb= sp;         index 19900f0..d705c77 100644
>>                   &nb= sp;         --- a/fs/xfs/xfs_inode.c
>>                   &nb= sp;         +++ b/fs/xfs/xfs_inode.c
>>                   &nb= sp;         @@ -1615,6 +1615,8 @@ xfs_iunlink(
>>
>>                   &nb= sp;                 mp =3D tp->t= _mountp;
>>
>>                   &nb= sp;         +       trace_xfs_iunlink(ip= );
>>                   &nb= sp;         +
>>                   &nb= sp;                 /*
>>                   &nb= sp;                  * Get the= agi buffer first.  It
>>                   &nb= sp;         ensures lock ordering
>>                   &nb= sp;                  * on the = list.
>>                   &nb= sp;         @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( >>                   &nb= sp;                 mp =3D tp->t= _mountp;
>>                   &nb= sp;                 agno =3D XFS_IN= O_TO_AGNO(mp, ip->i_ino);
>>
>>                   &nb= sp;         +       trace_xfs_iunlink_re= move(ip);
>>                   &nb= sp;         +
>>                   &nb= sp;                 /*
>>                   &nb= sp;                  * Get the= agi buffer first.  It
>>                   &nb= sp;         ensures lock ordering
>>                   &nb= sp;                  * on the = list.
>>                   &nb= sp;         --
>>                   &nb= sp;         1.7.7.6
>>
>>
>>
>>
>>                   &nb= sp;     --
>>                   &nb= sp;     =B7=FB=D3=C0=CC=CE
>>
>>
>>
>>
>>                   &nb= sp; --
>>                   &nb= sp; =B7=FB=D3=C0=CC=CE
>>
>>
>>
>>
>>                 --
>>                 =B7=FB=D3= =C0=CC=CE
>>
>>
>>
>>
>>             --
>>             =B7=FB=D3=C0=CC=CE
>>             ________________________= _______________________
>>             xfs mailing list
>>             xfs@oss.sgi.com <mailto:xfs@oss.sgi.com>
>>        = ;     http://oss.sgi.com/mailman/listinfo/xfs
>
>
>
>
>         --
>         =B7=FB=D3=C0=CC=CE
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE




--
=B7=FB=D3= =C0=CC=CE
--089e0111e074807e6104daa42e5e-- From sandeen@sandeen.net Thu Apr 18 11:33:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 804287F5A for ; Thu, 18 Apr 2013 11:33:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F2758AC002 for ; Thu, 18 Apr 2013 09:33:17 -0700 (PDT) X-ASG-Debug-ID: 1366302793-04cbb057f5346d30001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 2EdqtPuqDKsUsauN for ; Thu, 18 Apr 2013 09:33:13 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.38.49.99] (mobile-166-137-213-176.mycingular.net [166.137.213.176]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5D60760FCA17; Thu, 18 Apr 2013 11:33:12 -0500 (CDT) References: <1366226244.3762.32346.camel@chandra-dt.ibm.com> <516F1563.4000909@sandeen.net> <1366297953.3762.32358.camel@chandra-dt.ibm.com> Mime-Version: 1.0 (1.0) In-Reply-To: <1366297953.3762.32358.camel@chandra-dt.ibm.com> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Message-Id: <6AD0A59E-4807-47CB-AD89-C664DE316919@sandeen.net> Cc: XFS mailing list X-Mailer: iPhone Mail (10A523) From: Eric Sandeen Subject: Re: [PATCH] xfstests: Remove dependence of xfs_check script Date: Thu, 18 Apr 2013 09:30:39 -0700 X-ASG-Orig-Subj: Re: [PATCH] xfstests: Remove dependence of xfs_check script To: "sekharan@us.ibm.com" X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366302793 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128489 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars On Apr 18, 2013, at 8:12 AM, Chandra Seetharaman wrote= : > Thanks Eric. >=20 > Adding this above _xfs_check() in common/config sounds good ? >=20 > # xfs_check script is planned to be deprecated. But, we want to > # be able to invoke "xfs_check" behavior in xfstests in order to > # maintain the current verification levels.=20 >=20 Sure, that's perfect. Thanks, Eric >=20 > On Wed, 2013-04-17 at 14:34 -0700, Eric Sandeen wrote: >> On 4/17/13 12:17 PM, Chandra Seetharaman wrote: >>> Replace the usage of the script xfs_check and add the relevant code to >>> xfstests. >>>=20 >>> This is in preparation of the planned deprecation of xfs_check. >>=20 >> Other than maybe having a comment about why _xfs_check() is embedded >> in common/rc for future readers, this looks fine to me, thanks. >>=20 >> Reviewed-by: Eric Sandeen >>=20 >>> Signed-off-by: Chandra Seetharaman >>> --- >>> diff --git a/common/config b/common/config >>> index bf62996..dfbb5c2 100644 >>> --- a/common/config >>> +++ b/common/config >>> @@ -154,7 +154,6 @@ export DF_PROG=3D"`set_prog_path df`" >>>=20 >>> export XFS_LOGPRINT_PROG=3D"`set_prog_path xfs_logprint`" >>> export XFS_REPAIR_PROG=3D"`set_prog_path xfs_repair`" >>> -export XFS_CHECK_PROG=3D"`set_prog_path xfs_check`" >>> export XFS_DB_PROG=3D"`set_prog_path xfs_db`" >>> export XFS_GROWFS_PROG=3D`set_prog_path xfs_growfs` >>> export XFS_IO_PROG=3D"`set_prog_path xfs_io`" >>> diff --git a/common/rc b/common/rc >>> index 09fb83f..9cea3f9 100644 >>> --- a/common/rc >>> +++ b/common/rc >>> @@ -166,7 +166,6 @@ case "$FSTYP" in >>> xfs) >>> [ "$XFS_LOGPRINT_PROG" =3D "" ] && _fatal "xfs_logprint not found" >>> [ "$XFS_REPAIR_PROG" =3D "" ] && _fatal "xfs_repair not found" >>> - [ "$XFS_CHECK_PROG" =3D "" ] && _fatal "xfs_check not found" >>> [ "$XFS_DB_PROG" =3D "" ] && _fatal "xfs_db not found" >>> [ "$MKFS_XFS_PROG" =3D "" ] && _fatal "mkfs_xfs not found" >>> ;; >>> @@ -387,6 +386,31 @@ _scratch_mkfs_xfs() >>> return $mkfs_status >>> } >>>=20 >>> +_xfs_check() >>> +{ >>> + OPTS=3D" " >>> + DBOPTS=3D" " >>> + >>> + OPTIND=3D1 >>> + while getopts "b:fi:l:stvV" c >>> + do >>> + case $c in >>> + s) OPTS=3D$OPTS"-s ";; >>> + t) OPTS=3D$OPTS"-t ";; >>> + v) OPTS=3D$OPTS"-v ";; >>> + i) OPTS=3D$OPTS"-i "$OPTARG" ";; >>> + b) OPTS=3D$OPTS"-b "$OPTARG" ";; >>> + f) DBOPTS=3D$DBOPTS" -f";; >>> + l) DBOPTS=3D$DBOPTS" -l "$OPTARG" ";; >>> + V) $XFS_DB_PROG -p xfs_check -V >>> + return $? >>> + ;; >>> + esac >>> + done >>> + ${XFS_DB_PROG}${DBOPTS} -F -i -p xfs_check -c "check$OPTS" $1 >>> + return $? >>> +} >>> + >>> _setup_large_ext4_fs() >>> { >>> fs_size=3D$1 >>> @@ -589,7 +613,7 @@ _scratch_xfs_check() >>> SCRATCH_OPTIONS=3D"-l $SCRATCH_LOGDEV" >>> [ "$LARGE_SCRATCH_DEV" =3D yes ] && \ >>> SCRATCH_OPTIONS=3D$SCRATCH_OPTIONS" -t" >>> - $XFS_CHECK_PROG $SCRATCH_OPTIONS $* $SCRATCH_DEV >>> + _xfs_check $SCRATCH_OPTIONS $* $SCRATCH_DEV >>> } >>>=20 >>> _scratch_xfs_repair() >>> @@ -1426,7 +1450,7 @@ _check_xfs_filesystem() >>> # option (-t) to avoid indexing the free space trees doesn't make it= pass on >>> # large filesystems. Avoid it. >>> if [ "$LARGE_SCRATCH_DEV" !=3D yes ]; then >>> - $XFS_CHECK_PROG $extra_log_options $device 2>&1 |\ >>> + _xfs_check $extra_log_options $device 2>&1 |\ >>> _fix_malloc >$tmp.fs_check >>> fi >>> if [ -s $tmp.fs_check ] >>> diff --git a/crash/xfscrash b/crash/xfscrash >>> index 7831d7e..579b724 100755 >>> --- a/crash/xfscrash >>> +++ b/crash/xfscrash >>> @@ -120,11 +120,11 @@ _check() >>> if [ $expect -eq 0 ] >>> then >>> _echo " *** xfs_check ($LOG/check_clean.out)" =20 >>> - xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=3D1 >>> + _xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=3D1 >>> [ -s /tmp/xfs_check_clean.out ] && fail=3D1 >>> else >>> _echo " *** xfs_check ($LOG/check_dirty.out)" =20 >>> - xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=3D1 >>> + _xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=3D1 >>> fi >>>=20 >>> if [ $fail -eq 0 -a $expect -eq 0 ] >>> diff --git a/tests/xfs/085 b/tests/xfs/085 >>> index 27f29a3..af71b77 100755 >>> --- a/tests/xfs/085 >>> +++ b/tests/xfs/085 >>> @@ -70,7 +70,7 @@ _print_logstate >>>=20 >>> # curious if FS consistent at start >>> if false; then >>> - if $XFS_CHECK_PROG $SCRATCH_DEV; then >>> + if _xfs_check $SCRATCH_DEV; then >>> echo "*** checked ok ***" >>> fi >>> fi >>> diff --git a/tests/xfs/291 b/tests/xfs/291 >>> old mode 100644 >>> new mode 100755 >>> index f842679..7723b9e >>> --- a/tests/xfs/291 >>> +++ b/tests/xfs/291 >>> @@ -113,7 +113,7 @@ done >>> _scratch_unmount >>> # Can xfs_repair and xfs_check cope with this monster? >>> _scratch_xfs_repair >> $seqres.full 2>&1 || _fail "xfs_repair failed" >>> -xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed"= >>> +_xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed= " >>>=20 >>> # Yes they can! Now... >>> # Can xfs_metadump cope with this monster? >>>=20 >>>=20 >>> _______________________________________________ >>> xfs mailing list >>> xfs@oss.sgi.com >>> http://oss.sgi.com/mailman/listinfo/xfs >>=20 >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >=20 >=20 From test2@mail003.com Thu Apr 18 11:37:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D9AFA7F5A for ; Thu, 18 Apr 2013 11:37:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9495C8F8050 for ; Thu, 18 Apr 2013 09:37:29 -0700 (PDT) X-ASG-Debug-ID: 1366303045-04bdf02d1f356fb0001-NocioJ Received: from mail003.com ([61.176.221.6]) by cuda.sgi.com with ESMTP id XaTdWZ098n5ndqbt for ; Thu, 18 Apr 2013 09:37:26 -0700 (PDT) X-Barracuda-Envelope-From: test2@mail003.com X-Barracuda-Apparent-Source-IP: 61.176.221.6 Received: from pchome.net by mail003.com (MDaemon PRO v10.1.1) with ESMTP id md50000153350.msg for ; Fri, 19 Apr 2013 00:37:22 +0800 X-MDHeloLookup-Result: hardfail smtp.helo=pchome.net (does not match 101.16.192.118) (mail003.com) X-Authenticated-Sender: test2@mail003.com X-MDRemoteIP: 101.16.192.118 X-Return-Path: test2@mail003.com X-Envelope-From: test2@mail003.com X-MDaemon-Deliver-To: xfs@oss.sgi.com Reply-To: Sender: test2@mail003.com Date: Fri, 19 Apr 2013 00:37:11 +0800 From: "Ms.Rebecca Chia" To: Subject: Aluminum Coil& steel ingot... Message-ID: <20130419003725363330@mail003.com> X-ASG-Orig-Subj: Aluminum Coil& steel ingot... X-Priority: 1 (Highest) X-mailer: Foxmail 6, 13, 102, 15 [cn] Disposition-Notification-To: sales@csdmetal.com Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="=====003_Dragon418865407328_=====" X-Barracuda-Connect: UNKNOWN[61.176.221.6] X-Barracuda-Start-Time: 1366303046 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_MJ1963, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128489 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. --=====003_Dragon418865407328_===== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 RGVhciBtYW5hZ2VyLCANCg0KV2UgYXJlIGxlYWRpbmcgbWFudWZhY3R1cmUgb2YgTWV0YWwgcHJv ZHVjdHMgaW4gQ2hpbmEuIA0KDQpPdXIgZmFjdG9yeSBwcm9kdWNlIEFsdW1pbnVtIENvaWwsRm9p bCxJbmdvdCwgU2hlZXQsIENpcmNsZSwgQmlsbGV0czsgWmluYyBpbmdvdDsgc3RlZWwgaW5nb3Qs IHN0ZWVsIGNvaWw7IENvbGQgJiBIb3Qgcm9sbCBjb2lsOyBBbmQgb3RoZXIgbWV0YWwgaW5nb3Qu DQoNCklmIG5lZWQgZW1haWwgdXMuDQoNClRoYW5rcy4NCg0KUmViZWNjYSBDaGlhDQoNClNoYWFu eGkgUHJvc3BlciBJbmR1c3RyeSBDby4sIEx0ZC4NCg0KTW9iaWxlOiAwMDg2IDEzMSAxMTUxIDUy NjENCg0KVGVsOiAwMDg2IDAyOSA4NjY5IDIyNzk= --=====003_Dragon418865407328_===== Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0 Zi04IiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA4LjAwLjYwMDEuMTk0MTIiPjwvSEVBRD4NCjxCT0RZPjxGT05UIGZhY2U9QXJp YWw+DQo8RElWPjxGT05UIGNvbG9yPSMwMDQwODAgc2l6ZT0yPkRlYXIgbWFuYWdlciwgPC9GT05U PjwvRElWPg0KPERJVj48QlI+PEZPTlQgY29sb3I9IzAwNDA4MD48Rk9OVCBzaXplPTI+V2UgYXJl IGxlYWRpbmcgbWFudWZhY3R1cmUgb2YgTWV0YWwgDQpwcm9kdWN0cyBpbiBDaGluYS4gPC9GT05U PjwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQgY29sb3I9IzAwNDA4MD48Rk9OVCBzaXplPTI+PC9G T05UPjwvRk9OVD4mbmJzcDs8L0RJVj4NCjxESVY+PEZPTlQgY29sb3I9IzAwNDA4MD48Rk9OVCBz aXplPTI+T3VyIGZhY3RvcnkgcHJvZHVjZSA8L0ZPTlQ+PEZPTlQgDQpzaXplPTM+PFNUUk9ORz5B bHVtaW51bSBDb2lsLEZvaWwsSW5nb3QsJm5ic3A7U2hlZXQsIENpcmNsZSwgQmlsbGV0czsgWmlu YyANCmluZ290OyBzdGVlbCBpbmdvdCwgc3RlZWwgY29pbDsgQ29sZCAmYW1wOyBIb3Qgcm9sbCBj b2lsOyBBbmQgb3RoZXIgbWV0YWwgDQppbmdvdC48L1NUUk9ORz48L0ZPTlQ+PC9GT05UPjwvRElW Pg0KPERJVj48QlI+PEZPTlQgY29sb3I9IzAwNDA4MCBzaXplPTI+SWYgbmVlZCBlbWFpbCB1cy48 L0ZPTlQ+PC9ESVY+DQo8RElWPjxCUj48Rk9OVCBjb2xvcj0jMDA0MDgwIHNpemU9Mj5UaGFua3Mu PC9GT05UPjwvRElWPg0KPERJVj48Rk9OVCBjb2xvcj0jMDA0MDgwIHNpemU9Mj48L0ZPTlQ+Jm5i c3A7PC9ESVY+DQo8RElWPjxGT05UIGNvbG9yPSMwMDQwODAgc2l6ZT0yPlJlYmVjY2EgQ2hpYTwv Rk9OVD48L0RJVj4NCjxESVY+PFNQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFs OyBDT0xPUjogIzAwNDA4MDsgRk9OVC1TSVpFOiAxMHB0Ij48L1NQQU4+Jm5ic3A7PC9ESVY+DQo8 RElWPg0KPERJVj48U1BBTiANCnN0eWxlPSJGT05ULVNUWUxFOiBpdGFsaWM7IEZPTlQtRkFNSUxZ OiBBcmlhbDsgQ09MT1I6ICMwMDQwODA7IEZPTlQtU0laRTogMTAuNXB0Ij48Rk9OVCANCnNpemU9 Mj5TaGFhbnhpIFByb3NwZXIgSW5kdXN0cnkgQ28uLCBMdGQuPC9GT05UPjwvU1BBTj48L0RJVj4N CjxESVY+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogIzAwNDA4MDsg Rk9OVC1TSVpFOiAxMHB0Ij48L1NQQU4+Jm5ic3A7PC9ESVY+DQo8RElWPjxTUEFOIHN0eWxlPSJG T05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiAjMDA0MDgwOyBGT05ULVNJWkU6IDEwcHQiPk1vYmls ZTogDQowMDg2IDEzMSAxMTUxIDUyNjE8L1NQQU4+PC9ESVY+DQo8RElWPjxTUEFOIA0Kc3R5bGU9 IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6ICMwMDQwODA7IEZPTlQtU0laRTogMTBwdCI+PC9T UEFOPiZuYnNwOzwvRElWPg0KPERJVj48U1BBTiBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBD T0xPUjogIzAwNDA4MDsgRk9OVC1TSVpFOiAxMHB0Ij5UZWw6IDAwODYgDQowMjkgODY2OSAyMjc5 PC9TUEFOPjwvRElWPg0KPERJVj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IENP TE9SOiAjMDA0MDgwOyBGT05ULVNJWkU6IDEwcHQiPjwvU1BBTj4mbmJzcDs8L0RJVj4NCjxESVY+ PFNQQU4gc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6ICMwMDQwODA7IEZPTlQtU0la RTogMTBwdCI+PEZPTlQgDQpjb2xvcj0jMDAwMDAwIA0Kc2l6ZT0zPjwvRk9OVD48L1NQQU4+Jm5i c3A7PC9ESVY+PC9TUEFOPjwvRElWPjwvRk9OVD48L0JPRFk+PC9IVE1MPg0K --=====003_Dragon418865407328_=====-- From yongtaofu@gmail.com Thu Apr 18 11:41:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B748C7F5A for ; Thu, 18 Apr 2013 11:41:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8FBD28F8050 for ; Thu, 18 Apr 2013 09:41:00 -0700 (PDT) X-ASG-Debug-ID: 1366303256-04cb6c2c1f35ce60001-NocioJ Received: from mail-vc0-f181.google.com (mail-vc0-f181.google.com [209.85.220.181]) by cuda.sgi.com with ESMTP id Oz7q5vdtUlzcy054 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 18 Apr 2013 09:40:57 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] Received: by mail-vc0-f181.google.com with SMTP id ia10so2784784vcb.12 for ; Thu, 18 Apr 2013 09:40:56 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=g6hdc6DCfqL3O6NfCFkzMMAUWvYk2ZrzMfkZm/jShjo=; b=Z8v70R5z7OMyO4Kzjvn8mhMJZ8TCJt50x09GH15zGvH3Jd5/gaqI+gQ2KimZeJG+A+ pP4ryofOl0I6Ciy2NtjovS70+zZc7/kLgVEVNofJT2Iu3grbDSmm1kme/Hri6/r2om4L QqsL8K1xjxUm5jH/41WJg0Z57OY/S8aqnXVx8L3up8mp2JhSOBbgWdjGe/IDh0lhumsF 93ZTjPjCvdf7vis/RvuXzS1PslCcOeFqTpWGy/WjRnRy/nBJT7p9atcMroYNnaDREQHO iY1f/g0f2A6D+FFDPT4vYloTTKcUIhYLwARatzhEzhJs0pMx70FNxLrua0FNCrZcKNvE eXlA== MIME-Version: 1.0 X-Received: by 10.220.82.3 with SMTP id z3mr8926717vck.18.1366303256599; Thu, 18 Apr 2013 09:40:56 -0700 (PDT) Received: by 10.52.229.67 with HTTP; Thu, 18 Apr 2013 09:40:56 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> <516FDBDE.1070406@redhat.com> Date: Fri, 19 Apr 2013 00:40:56 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Brian Foster Cc: Eric Sandeen , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=001a11c1ed324410cd04daa54432 X-Barracuda-Connect: mail-vc0-f181.google.com[209.85.220.181] X-Barracuda-Start-Time: 1366303257 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128489 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 --001a11c1ed324410cd04daa54432 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brian and Eric, Here's the meta_dump file of one server xfs repair log. And again this happens exactly when one of the glusterfs finished rebalance. https://docs.google.com/file/d/0B7n2C4T5tfNCdDFwN24zdkVmdHM/edit?usp=3Dshar= ing https://docs.google.com/file/d/0B7n2C4T5tfNCOGdpOGhIaVFRV28/edit?usp=3Dshar= ing The server which finishes rebalance and trigger xfs shutdown has the following log on glusterfs: [2013-04-18 22:42:52.063196] E [dht-rebalance.c:1194:gf_defrag_migrate_data] 0-test2-dht: migrate-data failed for /fytest/8/58037 [2013-04-18 22:42:52.067867] I [dht-rebalance.c:639:dht_migrate_file] 0-test2-dht: /fytest/8/58040: attempting to move from test2-replicate-1 to test2-replicate-3 [2013-04-18 22:42:52.070530] W [dht-rebalance.c:353:__dht_check_free_space] 0-test2-dht: data movement attempted from node (test2-replicate-1) with higher disk space to a node (test2-replicate-3) with lesser disk space (/fytest/8/58040) [2013-04-18 22:42:52.070613] E [dht-rebalance.c:1194:gf_defrag_migrate_data] 0-test2-dht: migrate-data failed for /fytest/8/58040 [2013-04-18 22:43:11.679797] I [dht-common.c:2337:dht_setxattr] 0-test2-dht: fixing the layout of /fytest/2 [2013-04-18 22:43:11.682162] I [dht-rebalance.c:1055:gf_defrag_migrate_data] 0-test2-dht: migrate data called on /fytest/2 [2013-04-18 22:43:14.246209] I [dht-rebalance.c:1611:gf_defrag_status_get] 0-glusterfs: Rebalance is completed [2013-04-18 22:43:14.246278] I [dht-rebalance.c:1614:gf_defrag_status_get] 0-glusterfs: Files migrated: 7203, size: 745897761616, lookups: 79881, failures: 9002 [2013-04-18 22:43:14.247021] W [glusterfsd.c:831:cleanup_and_exit] (-->/lib64/libc.so.6(clone+0x6d) [0x3ec22e767d] (-->/lib64/libpthread.so.0() [0x3ec2607851] (-->/usr/sbin/glusterfs(glusterfs_sigwaiter+0xdd) [0x405c9d]))) 0-: received signum (15), shutting down [2013-04-18 22:43:14.247202] E [rpcsvc.c:1155:rpcsvc_program_unregister_portmap] 0-rpc-service: Could not unregister with portmap The shutdown happens at 2013-04-18 22:43:14. Thank you. 2013/4/18 =B7=FB=D3=C0=CC=CE > Hi Brian and Eric, > The shutdown is not easy to produce but finally right now 2 of our server= s > in our test cluster xfs was shutdown. > > the trace output as following > > https://docs.google.com/file/d/0B7n2C4T5tfNCLXRYUWJ0b19JcWc/edit?usp=3Dsh= aring > > Sorry but the systemtap is interrupt and I didn't noticed that so I didn'= t > get systemtap logs. > > /var/log/message is same as before > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() > returned error 22. > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned > error 22 > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called > from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D > 0xffffffffa02d44aa > Apr 18 22:43:14 10 kernel: XFS (sdb): I/O Error Detected. Shutting down > filesystem > Apr 18 22:43:14 10 kernel: XFS (sdb): Please umount the filesystem and > rectify the problem(s) > Apr 18 22:43:20 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > The metadump file is large I'll share it to you soon. > > > 2013/4/18 Brian Foster > >> On 04/18/2013 04:25 AM, =B7=FB=D3=C0=CC=CE wrote: >> > Hi Brian and Eric, >> > Can I change as following to bypass it? >> >> This is probably not a wise thing to do. The problem we're seeing here >> is indicative of a potentially larger problem than this particular error >> path. An inode is being unlinked and inactivated, but we aren't finding >> on the list where we expect it to be. Killing the error return doesn't >> eliminate the larger problem. >> >> So while changes could end up being made in this area as part of a fix, >> I would not suggest making any changes beyond those designed to help >> debug until we have a better idea of root cause. >> >> Brian >> >> > --- a/xfs_inode.c >> > +++ b/xfs_inode.c >> > @@ -1764,7 +1764,7 @@ xfs_iunlink_remove( >> > */ >> > next_agino =3D >> be32_to_cpu(agi->agi_unlinked[bucket_index]); >> > last_ibp =3D NULL; >> > - while (next_agino !=3D agino) { >> > + while (next_agino !=3D agino && next_agino !=3D NULLAG= INO) { >> > /* >> > * If the last inode wasn't the one pointing t= o >> > * us, then release its buffer since we're not >> > @@ -1786,6 +1786,14 @@ xfs_iunlink_remove( >> > ASSERT(next_agino !=3D NULLAGINO); >> > ASSERT(next_agino !=3D 0); >> > } >> > + if (next_agino =3D=3D NULLAGINO) { >> > + /* >> > + *After search the list for the inode being fr= ee >> > + *we still can't find it. >> > + */ >> > + xfs_err(mp, "%s ino %lld not found in unlinked >> > list.", >> > + __func__, (unsigned long >> > long)ip->i_ino); >> > + } >> > /* >> > * Now last_ibp points to the buffer previous to us on >> > * the unlinked list. Pull us from the list. >> > @@ -1810,16 +1818,20 @@ xfs_iunlink_remove( >> > } else { >> > xfs_trans_brelse(tp, ibp); >> > } >> > - /* >> > - * Point the previous inode on the list to the next >> inode. >> > - */ >> > - last_dip->di_next_unlinked =3D cpu_to_be32(next_agino)= ; >> > - ASSERT(next_agino !=3D 0); >> > - offset =3D last_offset + offsetof(xfs_dinode_t, >> > di_next_unlinked); >> > - xfs_trans_inode_buf(tp, last_ibp); >> > - xfs_trans_log_buf(tp, last_ibp, offset, >> > - (offset + sizeof(xfs_agino_t) - 1)); >> > - xfs_inobp_check(mp, last_ibp); >> > + if (next_agino !=3D NULLAGINO) { >> > + /* >> > + * If only find the inode being free then we >> modify >> > + * the unlinked list. >> > + * Point the previous inode on the list to the >> > next inode. >> > + */ >> > + last_dip->di_next_unlinked =3D >> > cpu_to_be32(next_agino); >> > + ASSERT(next_agino !=3D 0); >> > + offset =3D last_offset + offsetof(xfs_dinode_t= , >> > di_next_unlinked); >> > + xfs_trans_inode_buf(tp, last_ibp); >> > + xfs_trans_log_buf(tp, last_ibp, offset, >> > + (offset + sizeof(xfs_agino_t= ) >> > - 1)); >> > + xfs_inobp_check(mp, last_ibp); >> > + } >> > } >> > return 0; >> > } >> > >> > Thank you. >> > >> > >> > 2013/4/18 =B7=FB=D3=C0=CC=CE > >> > >> > Hi Brain and Eric, >> > If the problem is the agno can't be found in the unlinked list. Ca= n >> > we just bypass it instead of passing ino=3D0xffffffff to xfs_inoto= bp? >> > Thank you. >> > >> > >> > 2013/4/18 =B7=FB=D3=C0=CC=CE > >> > >> > Hi Eric, >> > The shutdown issue is still not reproduced yet. But I get the >> > following error today during test. >> > >> > Apr 18 07:42:51 10 kernel: Call Trace: >> > Apr 18 07:42:51 10 kernel: [] ? >> > xfs_buf_cond_lock+0x2f/0xc0 [xfs] >> > Apr 18 07:42:51 10 kernel: [] >> > schedule_timeout+0x215/0x2e0 >> > Apr 18 07:42:51 10 kernel: [] ? >> > kmem_zone_alloc+0x77/0xf0 [xfs] >> > Apr 18 07:42:51 10 kernel: [] __down+0x72/0x= b0 >> > Apr 18 07:42:51 10 kernel: [] ? >> > _xfs_buf_find+0x102/0x280 [xfs] >> > Apr 18 07:42:51 10 kernel: "echo 0 > >> > /proc/sys/kernel/hung_task_timeout_secs" disables this message= . >> > Apr 18 07:42:51 10 kernel: glusterfsd D ffffffff8160b3c0 >> > 0 14522 1 0x00000083 >> > Apr 18 07:42:51 10 kernel: ffff882015a63a28 0000000000000082 >> > 0000000000000000 0000000000000000 >> > Apr 18 07:42:51 10 kernel: ffff882015a639b8 ffffffffa02d91ef >> > ffff882015a639d8 0000000000000246 >> > Apr 18 07:42:51 10 kernel: ffff880e70491af8 ffff882015a63fd8 >> > 000000000000fb88 ffff880e70491af8 >> > Apr 18 07:42:51 10 kernel: Call Trace: >> > Apr 18 07:42:51 10 kernel: [] ? >> > xfs_buf_cond_lock+0x2f/0xc0 [xfs] >> > Apr 18 07:42:51 10 kernel: [] >> > schedule_timeout+0x215/0x2e0 >> > Apr 18 07:42:51 10 kernel: [] ? >> > kmem_zone_alloc+0x77/0xf0 [xfs] >> > Apr 18 07:42:51 10 kernel: [] __down+0x72/0x= b0 >> > Apr 18 07:42:51 10 kernel: [] ? >> > _xfs_buf_find+0x102/0x280 [xfs] >> > Apr 18 07:42:51 10 kernel: [] down+0x41/0x50 >> > Apr 18 07:42:51 10 kernel: [] >> > xfs_buf_lock+0x53/0x110 [xfs] >> > Apr 18 07:42:51 10 kernel: [] >> > _xfs_buf_find+0x102/0x280 [xfs] >> > Apr 18 07:42:51 10 kernel: [] >> > xfs_buf_get+0x6b/0x1a0 [xfs] >> > Apr 18 07:42:51 10 kernel: [] >> > xfs_buf_read+0x2c/0x100 [xfs] >> > Apr 18 07:42:51 10 kernel: [] >> > xfs_trans_read_buf+0x1f8/0x400 [xfs] >> > Apr 18 07:42:51 10 kernel: [] >> > xfs_read_agi+0x74/0x100 [xfs] >> > Apr 18 07:42:51 10 kernel: [] >> > xfs_iunlink+0x5b/0x180 [xfs] >> > Apr 18 07:42:51 10 kernel: [] ? >> > current_fs_time+0x27/0x30 >> > Apr 18 07:42:51 10 kernel: [] ? >> > xfs_trans_ichgtime+0x27/0xa0 [xfs] >> > Apr 18 07:42:51 10 kernel: [] >> > xfs_droplink+0x5b/0x70 [xfs] >> > Apr 18 07:42:51 10 kernel: [] >> > xfs_remove+0x27e/0x3a0 [xfs] >> > Apr 18 07:42:51 10 kernel: [] ? >> > generic_permission+0x23/0xb0 >> > Apr 18 07:42:51 10 kernel: [] >> > xfs_vn_unlink+0x48/0x90 [xfs] >> > Apr 18 07:42:51 10 kernel: [] >> vfs_unlink+0x9f/0xe0 >> > Apr 18 07:42:51 10 kernel: [] ? >> > lookup_hash+0x3a/0x50 >> > Apr 18 07:42:51 10 kernel: [] >> > do_unlinkat+0x183/0x1c0 >> > Apr 18 07:42:51 10 kernel: [] ? >> > syscall_trace_enter+0x1d8/0x1e0 >> > Apr 18 07:42:51 10 kernel: [] >> sys_unlink+0x16/0x20 >> > Apr 18 07:42:51 10 kernel: [] >> tracesys+0xd9/0xde >> > >> > Thank you. >> > >> > >> > 2013/4/17 Eric Sandeen > > > >> > >> > On Apr 16, 2013, at 8:48 PM, =B7=FB=D3=C0=CC=CE > > > wrote: >> > >> >> Hi Brain, >> >> Can I change as following? >> > >> > ASSERTS are no-ops in a non-debug kernel, so this won't >> > change any behavior. I hope we'll know more if we get new >> > traces from your patched kernel.... >> > >> > Eric >> > >> >> --- a/xfs_inode.c >> >> +++ b/xfs_inode.c >> >> @@ -1773,6 +1773,8 @@ xfs_iunlink_remove( >> >> if (last_ibp !=3D NULL) { >> >> xfs_trans_brelse(tp, >> >> last_ibp); >> >> } >> >> + ASSERT(next_agino !=3D NULLAGINO= ); >> >> + ASSERT(next_agino !=3D 0); >> >> next_ino =3D XFS_AGINO_TO_INO(mp, >> >> agno, next_agino); >> >> error =3D xfs_inotobp(mp, tp, >> >> next_ino, &last_dip, >> >> &last_ibp, >> >> &last_offset, 0); >> >> @@ -1783,8 +1785,6 @@ xfs_iunlink_remove( >> >> return error; >> >> } >> >> next_agino =3D >> >> be32_to_cpu(last_dip->di_next_unlinked); >> >> - ASSERT(next_agino !=3D NULLAGINO)= ; >> >> - ASSERT(next_agino !=3D 0); >> >> } >> >> /* >> >> * Now last_ibp points to the buffer >> >> previous to us on >> >> >> >> Thank you. >> >> >> >> >> >> 2013/4/17 =B7=FB=D3=C0=CC=CE > >> > >> >> >> >> Hi Brain, >> >> If it is because NULLAGINO is passed in to >> xfs_inotobp(). >> >> Can I move the following two lines before xfs_inotobp= ? >> >> >> >> For example: >> >> >> >> 1767 while (next_agino !=3D agino) { >> >> 1768 /* >> >> 1769 * If the last inode >> >> wasn't the one pointing to >> >> 1770 * us, then release its >> >> buffer since we're not >> >> 1771 * going to do anything >> >> with it. >> >> 1772 */ >> >> 1773 if (last_ibp !=3D NULL) = { >> >> 1774 >> >> xfs_trans_brelse(tp, last_ibp); >> >> 1775 } >> >> 1776 next_ino =3D >> >> XFS_AGINO_TO_INO(mp, agno, next_agino); >> >> + ASSERT(next_agino != =3D >> >> NULLAGINO); >> >> + ASSERT(next_agino != =3D >> 0); >> >> 1777 error =3D xfs_inotobp(mp= , >> >> tp, next_ino, &last_dip, >> >> 1778 >> >> &last_ibp, &last_offset, 0); >> >> 1779 if (error) { >> >> 1780 xfs_warn(mp, >> >> 1781 "%s: >> >> xfs_inotobp() returned error %d.", >> >> 1782 __func__= , >> >> error); >> >> 1783 return error; >> >> 1784 } >> >> 1785 next_agino =3D >> >> be32_to_cpu(last_dip->di_next_unlinked); >> >> - //ASSERT(next_agino != =3D >> >> NULLAGINO); >> >> - //ASSERT(next_agino != =3D >> 0); >> >> 1788 } >> >> I don't understand xfs well and correct me if I'm >> >> totally wrong. >> >> Thank you very much. >> >> >> >> >> >> 2013/4/17 =B7=FB=D3=C0=CC=CE > >> > >> >> >> >> Hi Brain, >> >> I want to ask a question, according to the >> >> shutdown trace. The ino in xfs_iunlink_remove >> >> is 0x113, why xfs_imap got ino=3D0xffffffff ? >> >> >> >> --- xfs_imap -- >> >> module("xfs").function("xfs_imap@fs >> /xfs/xfs_ialloc.c:1257").return >> >> -- return=3D0x16 >> >> vars: mp=3D0xffff882017a50800 tp=3D0xffff881c8179= 7c70 >> >> ino=3D0xffffffff >> >> >> >> --- xfs_iunlink_remove -- >> >> module("xfs").function("xfs_iunlink_remove@fs >> /xfs/xfs_inode.c:1680").return >> >> -- return=3D0x16 >> >> vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c1= 3c00 >> >> next_ino=3D? mp=3D? agi=3D? dip=3D? >> >> agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino= =3D? >> >> next_agino=3D? last_ibp=3D? >> >> last_dip=3D0xffff882000000000 bucket_index=3D? >> >> offset=3D? last_offset=3D0xffffffffffff8810 error= =3D? >> >> __func__=3D[...] >> >> ip: i_ino =3D 0x113, i_flags =3D 0x0 >> >> >> >> Thank you. >> >> >> >> >> >> >> >> 2013/4/17 =B7=FB=D3=C0=CC=CE > >> > >> >> >> >> Hi Brain, >> >> Thank you for your update, and I have applied >> >> your last kernel patch. However it is not eas= y >> >> to reproduce especially in out test >> >> environment. Till now is not happens again. >> >> I'll update the kernel patch now. BTW is ther= e >> >> any findings in the logs of previous thread? >> >> >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >> >> I guess it tend to happen during glusterfs >> >> rebalance because glusterfs moves a lot of >> >> file from one server to another and then >> >> unlink it. >> >> >> >> Thank you. >> >> >> >> >> >> 2013/4/17 Brian Foster > >> > >> >> >> >> On 04/16/2013 12:24 PM, Dave Chinner wrot= e: >> >> > On Mon, Apr 15, 2013 at 07:14:39PM >> >> -0400, Brian Foster wrote: >> >> >> Hi, >> >> >> >> >> >> Thanks for the data in the previous >> thread: >> >> >> >> >> >> >> >> >> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >> >> >> >> >> ... >> >> >> >> >> >> echo 1 > >> >> >> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable >> >> >> echo 1 > >> >> >> /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable >> >> >> ... reproduce ... >> >> >> cat >> >> /sys/kernel/debug/tracing/trace > >> trace.output >> >> > >> >> > It's better to use trace-cmd for this. >> >> it will result in less >> >> > dropped events. i.e.: >> >> > >> >> > $ trace-cmd record -e xfs_iunlink= \* >> >> > ... reproduce ... >> >> > ^C >> >> > $ trace-cmd report > trace.output >> >> > >> >> >> --- a/fs/xfs/linux-2.6/xfs_trace.h >> >> >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >> >> >> @@ -581,6 +581,8 @@ >> >> DEFINE_INODE_EVENT(xfs_file_fsync); >> >> ... >> >> > >> >> > I would suggest that the the tracing >> >> shoul dbe at entry of the >> >> > function, otherwise we won't get a >> >> tracepoint for the operation that >> >> > triggers the shutdown. (That's the >> >> reason most tracepoints in XFS >> >> > are at function entry...) >> >> > >> >> >> >> Good points, thanks Dave. A v2 that pulls >> >> up the tracepoints towards >> >> function entry is appended. >> >> >> >> Brian >> >> >> >> From >> >> 280943e78ebe0b97a774cba51e7815c42f044b55 >> >> Mon Sep 17 00:00:00 2001 >> >> From: Brian Foster > >> > >> >> Date: Mon, 15 Apr 2013 18:16:24 -0400 >> >> Subject: [PATCH v2] xfs: add tracepoints >> >> for xfs_iunlink and >> >> xfs_iunlink_remove >> >> >> >> --- >> >> fs/xfs/linux-2.6/xfs_trace.h | 2 ++ >> >> fs/xfs/xfs_inode.c | 4 ++++ >> >> 2 files changed, 6 insertions(+), 0 >> >> deletions(-) >> >> >> >> diff --git a/fs/xfs/linux-2.6/xfs_trace.h >> >> b/fs/xfs/linux-2.6/xfs_trace.h >> >> index adc6ec4..338a0f9 100644 >> >> --- a/fs/xfs/linux-2.6/xfs_trace.h >> >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >> >> @@ -583,6 +583,8 @@ >> >> DEFINE_INODE_EVENT(xfs_file_fsync); >> >> DEFINE_INODE_EVENT(xfs_destroy_inode); >> >> DEFINE_INODE_EVENT(xfs_dirty_inode); >> >> DEFINE_INODE_EVENT(xfs_clear_inode); >> >> +DEFINE_INODE_EVENT(xfs_iunlink); >> >> +DEFINE_INODE_EVENT(xfs_iunlink_remove); >> >> >> >> DEFINE_INODE_EVENT(xfs_dquot_dqalloc); >> >> DEFINE_INODE_EVENT(xfs_dquot_dqdetach); >> >> diff --git a/fs/xfs/xfs_inode.c >> >> b/fs/xfs/xfs_inode.c >> >> index 19900f0..d705c77 100644 >> >> --- a/fs/xfs/xfs_inode.c >> >> +++ b/fs/xfs/xfs_inode.c >> >> @@ -1615,6 +1615,8 @@ xfs_iunlink( >> >> >> >> mp =3D tp->t_mountp; >> >> >> >> + trace_xfs_iunlink(ip); >> >> + >> >> /* >> >> * Get the agi buffer first. It >> >> ensures lock ordering >> >> * on the list. >> >> @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( >> >> mp =3D tp->t_mountp; >> >> agno =3D XFS_INO_TO_AGNO(mp, >> ip->i_ino); >> >> >> >> + trace_xfs_iunlink_remove(ip); >> >> + >> >> /* >> >> * Get the agi buffer first. It >> >> ensures lock ordering >> >> * on the list. >> >> -- >> >> 1.7.7.6 >> >> >> >> >> >> >> >> >> >> -- >> >> =B7=FB=D3=C0=CC=CE >> >> >> >> >> >> >> >> >> >> -- >> >> =B7=FB=D3=C0=CC=CE >> >> >> >> >> >> >> >> >> >> -- >> >> =B7=FB=D3=C0=CC=CE >> >> >> >> >> >> >> >> >> >> -- >> >> =B7=FB=D3=C0=CC=CE >> >> _______________________________________________ >> >> xfs mailing list >> >> xfs@oss.sgi.com >> >> http://oss.sgi.com/mailman/listinfo/xfs >> > >> > >> > >> > >> > -- >> > =B7=FB=D3=C0=CC=CE >> > >> > >> > >> > >> > -- >> > =B7=FB=D3=C0=CC=CE >> > >> > >> > >> > >> > -- >> > =B7=FB=D3=C0=CC=CE >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --001a11c1ed324410cd04daa54432 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brian and Eric,
Here's= the  meta_dump file of one server xfs repair log. And again this happ= ens exactly when one of the glusterfs finished rebalance.
https://docs.google.com/file/d/0B7n2C4T5tfNCdDFwN24zdkVmdHM/edit?usp=3Dsh= aring

https://docs.google.com/file/d/0B7n2C4T5tfNCOGdpOGhIaVF= RV28/edit?usp=3Dsharing

The server which finishes rebalanc= e and trigger xfs shutdown has the following log on glusterfs:

[2013-04-18 22:42:52.063196] E [dht-rebalance.c:1194:gf_defrag_migrate_= data] 0-test2-dht: migrate-data failed for /fytest/8/58037
[2013-04-18 2= 2:42:52.067867] I [dht-rebalance.c:639:dht_migrate_file] 0-test2-dht: /fyte= st/8/58040: attempting to move from test2-replicate-1 to test2-replicate-3<= br> [2013-04-18 22:42:52.070530] W [dht-rebalance.c:353:__dht_check_free_space]= 0-test2-dht: data movement attempted from node (test2-replicate-1) with hi= gher disk space to a node (test2-replicate-3) with lesser disk space (/fyte= st/8/58040)
[2013-04-18 22:42:52.070613] E [dht-rebalance.c:1194:gf_defrag_migrate_data= ] 0-test2-dht: migrate-data failed for /fytest/8/58040
[2013-04-18 22:43= :11.679797] I [dht-common.c:2337:dht_setxattr] 0-test2-dht: fixing the layo= ut of /fytest/2
[2013-04-18 22:43:11.682162] I [dht-rebalance.c:1055:gf_defrag_migrate_data= ] 0-test2-dht: migrate data called on /fytest/2
[2013-04-18 22:43:14.246= 209] I [dht-rebalance.c:1611:gf_defrag_status_get] 0-glusterfs: Rebalance i= s completed
[2013-04-18 22:43:14.246278] I [dht-rebalance.c:1614:gf_defrag_status_get] = 0-glusterfs: Files migrated: 7203, size: 745897761616, lookups: 79881, fail= ures: 9002
[2013-04-18 22:43:14.247021] W [glusterfsd.c:831:cleanup_and_= exit] (-->/lib64/libc.so.6(clone+0x6d) [0x3ec22e767d] (-->/lib64/libp= thread.so.0() [0x3ec2607851] (-->/usr/sbin/glusterfs(glusterfs_sigwaiter= +0xdd) [0x405c9d]))) 0-: received signum (15), shutting down
[2013-04-18 22:43:14.247202] E [rpcsvc.c:1155:rpcsvc_program_unregister_por= tmap] 0-rpc-service: Could not unregister with portmap

The shu= tdown happens at 2013-04-18 22:43:14.

Thank you.
 


2013/4/18 =B7=FB=D3=C0= =CC=CE <yongtaofu@gmail.com>
Hi= Brian and Eric,
The shutdown is not easy to produce but finally r= ight now 2 of our servers in our test cluster xfs was shutdown.

the trace output as following
http= s://docs.google.com/file/d/0B7n2C4T5tfNCLXRYUWJ0b19JcWc/edit?usp=3Dsharing<= /a>

Sorry but the systemtap is interrupt and I didn't noticed tha= t so I didn't get systemtap logs.

/var/log/message i= s same as before
Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_iunlink_remov= e: xfs_inotobp() returned error 22.
Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned erro= r 22
Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) ca= lled from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return address =3D= 0xffffffffa02d44aa
Apr 18 22:43:14 10 kernel: XFS (sdb): I/O Error Detected. Shutting down fil= esystem
Apr 18 22:43:14 10 kernel: XFS (sdb): Please umount the filesyst= em and rectify the problem(s)
Apr 18 22:43:20 10 kernel: XFS (sdb): xfs_= log_force: error 5 returned.

The metadump file is large I'll share it to you soon.


2013/4/18 Brian Foster <bfoster@redhat.com>
On 04/18/2013 04:25 AM, =B7=FB=D3=C0=CC= =CE wrote:
> Hi Brian and Eric,
> Can I change as following to bypass it?

This is probably not a wise thing to do. The problem we're seeing= here
is indicative of a potentially larger problem than this particular error path. An inode is being unlinked and inactivated, but we aren't finding=
on the list where we expect it to be. Killing the error return doesn't<= br> eliminate the larger problem.

So while changes could end up being made in this area as part of a fix,
I would not suggest making any changes beyond those designed to help
debug until we have a better idea of root cause.

Brian

> --- a/xfs_inode.c
> +++ b/xfs_inode.c
> @@ -1764,7 +1764,7 @@ xfs_iunlink_remove(
>                  */
>                 next_agino =3D= be32_to_cpu(agi->agi_unlinked[bucket_index]);
>                 last_ibp =3D N= ULL;
> -               while (next_agino != =3D agino) {
> +               while (next_agino != =3D agino && next_agino !=3D NULLAGINO) {
>                     =     /*
>                     =      * If the last inode wasn't the one pointing to
>                     =      * us, then release its buffer since we're not
> @@ -1786,6 +1786,14 @@ xfs_iunlink_remove(
>                     =     ASSERT(next_agino !=3D NULLAGINO);
>                     =     ASSERT(next_agino !=3D 0);
>                 }
> +               if (next_agino =3D= =3D NULLAGINO) {
> +                    = ;   /*
> +                    = ;    *After search the list for the inode being free
> +                    = ;    *we still can't find it.
> +                    = ;    */
> +                    = ;   xfs_err(mp, "%s ino %lld not found in unlinked
> list.",
> +                    = ;                __func__, (unsigne= d long
> long)ip->i_ino);
> +               }
>                 /*
>                  * Now la= st_ibp points to the buffer previous to us on
>                  * the un= linked list.  Pull us from the list.
> @@ -1810,16 +1818,20 @@ xfs_iunlink_remove(
>                 } else {
>                     =     xfs_trans_brelse(tp, ibp);
>                 }
> -               /*
> -                * Point the p= revious inode on the list to the next inode.
> -                */
> -               last_dip->di_nex= t_unlinked =3D cpu_to_be32(next_agino);
> -               ASSERT(next_agino != =3D 0);
> -               offset =3D last_off= set + offsetof(xfs_dinode_t,
> di_next_unlinked);
> -               xfs_trans_inode_buf= (tp, last_ibp);
> -               xfs_trans_log_buf(t= p, last_ibp, offset,
> -                    = ;             (offset + sizeof(xfs_agino_t) -= 1));
> -               xfs_inobp_check(mp,= last_ibp);
> +               if (next_agino !=3D= NULLAGINO) {
> +                    = ;   /*
> +                    = ;   * If only find the inode being free then we modify
> +                    = ;   * the unlinked list.
> +                    = ;   * Point the previous inode on the list to the
> next inode.
> +                    = ;   */
> +                    = ;   last_dip->di_next_unlinked =3D
> cpu_to_be32(next_agino);
> +                    = ;   ASSERT(next_agino !=3D 0);
> +                    = ;   offset =3D last_offset + offsetof(xfs_dinode_t,
> di_next_unlinked);
> +                    = ;   xfs_trans_inode_buf(tp, last_ibp);
> +                    = ;   xfs_trans_log_buf(tp, last_ibp, offset,
> +                    = ;                     (of= fset + sizeof(xfs_agino_t)
> - 1));
> +                    = ;   xfs_inobp_check(mp, last_ibp);
> +               }
>         }
>         return 0;
>  }
>
> Thank you.
>
>
> 2013/4/18 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com&g= t;>
>
>     Hi Brain and Eric,
>     If the problem is the agno can't be found in the unl= inked list. Can
>     we just bypass it instead of passing ino=3D0xffffffff to= xfs_inotobp?
>     Thank you.
>
>
>     2013/4/18 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:= yongtaofu@gmail.co= m>>
>
>         Hi Eric,
>         The shutdown issue is still not reproduced= yet. But I get the
>         following error today during test.
>
>         Apr 18 07:42:51 10 kernel: Call Trace:
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d91ef>] ?
>         xfs_buf_cond_lock+0x2f/0xc0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 4fe6a5>]
>         schedule_timeout+0x215/0x2e0
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d5f07>] ?
>         kmem_zone_alloc+0x77/0xf0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 4ff5c2>] __down+0x72/0xb0
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2da652>] ?
>         _xfs_buf_find+0x102/0x280 [xfs]
>         Apr 18 07:42:51 10 kernel: "echo 0 &g= t;
>         /proc/sys/kernel/hung_task_timeout_secs&qu= ot; disables this message.
>         Apr 18 07:42:51 10 kernel: glusterfsd &nbs= p;  D ffffffff8160b3c0
>         0 14522      1 0x00000083 >         Apr 18 07:42:51 10 kernel: ffff882015a63a2= 8 0000000000000082
>         0000000000000000 0000000000000000
>         Apr 18 07:42:51 10 kernel: ffff882015a639b= 8 ffffffffa02d91ef
>         ffff882015a639d8 0000000000000246
>         Apr 18 07:42:51 10 kernel: ffff880e70491af= 8 ffff882015a63fd8
>         000000000000fb88 ffff880e70491af8
>         Apr 18 07:42:51 10 kernel: Call Trace:
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d91ef>] ?
>         xfs_buf_cond_lock+0x2f/0xc0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 4fe6a5>]
>         schedule_timeout+0x215/0x2e0
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d5f07>] ?
>         kmem_zone_alloc+0x77/0xf0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 4ff5c2>] __down+0x72/0xb0
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2da652>] ?
>         _xfs_buf_find+0x102/0x280 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 097ef1>] down+0x41/0x50
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2da493>]
>         xfs_buf_lock+0x53/0x110 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2da652>]
>         _xfs_buf_find+0x102/0x280 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2da83b>]
>         xfs_buf_get+0x6b/0x1a0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2daeac>]
>         xfs_buf_read+0x2c/0x100 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d0af8>]
>         xfs_trans_read_buf+0x1f8/0x400 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2b3444>]
>         xfs_read_agi+0x74/0x100 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2b967b>]
>         xfs_iunlink+0x5b/0x180 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 0724c7>] ?
>         current_fs_time+0x27/0x30
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d12a7>] ?
>         xfs_trans_ichgtime+0x27/0xa0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d15fb>]
>         xfs_droplink+0x5b/0x70 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2d2f9e>]
>         xfs_remove+0x27e/0x3a0 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 186fd3>] ?
>         generic_permission+0x23/0xb0
>         Apr 18 07:42:51 10 kernel: [<ffffffffa0= 2e0968>]
>         xfs_vn_unlink+0x48/0x90 [xfs]
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 188c0f>] vfs_unlink+0x9f/0xe0
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 18795a>] ?
>         lookup_hash+0x3a/0x50
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 18b143>]
>         do_unlinkat+0x183/0x1c0
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 017938>] ?
>         syscall_trace_enter+0x1d8/0x1e0
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 18b196>] sys_unlink+0x16/0x20
>         Apr 18 07:42:51 10 kernel: [<ffffffff81= 00b308>] tracesys+0xd9/0xde
>
>         Thank you.
>
>
>         2013/4/17 Eric Sandeen <sandeen@sandeen.net
>         <mailto:sandeen@sandeen.net>>
>
>             On Apr 16, 2013, at 8:48 PM,= =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com
>             <mailto:<= a href=3D"mailto:yongtaofu@gmail.com" target=3D"_blank">yongtaofu@gmail.com= >> wrote:
>
>>             Hi Brain,
>>             Can I change as followin= g?
>
>             ASSERTS are no-ops in a non-= debug kernel, so this won't
>             change any behavior.  I= hope we'll know more if we get new
>             traces from your patched ker= nel....
>
>             Eric
>
>>             --- a/xfs_inode.c
>>             +++ b/xfs_inode.c
>>             @@ -1773,6 +1773,8 @@ xf= s_iunlink_remove(
>>                   &nb= sp;                 if (last_ibp != =3D NULL) {
>>                   &nb= sp;                     &= nbsp;   xfs_trans_brelse(tp,
>>             last_ibp);
>>                   &nb= sp;                 }
>>             +       &= nbsp;                ASSERT(next_ag= ino !=3D NULLAGINO);
>>             +       &= nbsp;                ASSERT(next_ag= ino !=3D 0);
>>                   &nb= sp;                 next_ino =3D XF= S_AGINO_TO_INO(mp,
>>             agno, next_agino);
>>                   &nb= sp;                 error =3D xfs_i= notobp(mp, tp,
>>             next_ino, &last_dip,=
>>                   &nb= sp;                     &= nbsp;               &last_ibp,
>>             &last_offset, 0); >>             @@ -1783,8 +1785,6 @@ xf= s_iunlink_remove(
>>                   &nb= sp;                     &= nbsp;   return error;
>>                   &nb= sp;                 }
>>                   &nb= sp;                 next_agino =3D<= br> >>             be32_to_cpu(last_dip->= ;di_next_unlinked);
>>             -       &= nbsp;               ASSERT(next_agino != =3D NULLAGINO);
>>             -       &= nbsp;               ASSERT(next_agino != =3D 0);
>>                   &nb= sp;         }
>>                   &nb= sp;         /*
>>                   &nb= sp;          * Now last_ibp points to the buffer >>             previous to us on
>>
>>             Thank you.
>>
>>
>>             2013/4/17 =B7=FB=D3=C0= =CC=CE <yongtao= fu@gmail.com
>>             <mailto:<= a href=3D"mailto:yongtaofu@gmail.com" target=3D"_blank">yongtaofu@gmail.com= >>
>>
>>                 Hi Brain,<= br> >>                 If it is b= ecause NULLAGINO is passed in  to xfs_inotobp().
>>                 Can I move= the following two lines before xfs_inotobp?
>>
>>                 For exampl= e:
>>
>>                 1767  = ;               while (next_agino !=3D a= gino) {
>>                 1768  = ;                     &nb= sp; /*
>>                 1769  = ;                     &nb= sp;  * If the last inode
>>                 wasn't= the one pointing to
>>                 1770  = ;                     &nb= sp;  * us, then release its
>>                 buffer sin= ce we're not
>>                 1771  = ;                     &nb= sp;  * going to do anything
>>                 with it. >>                 1772  = ;                     &nb= sp;  */
>>                 1773  = ;                     &nb= sp; if (last_ibp !=3D NULL) {
>>                 1774
>>                 xfs_trans_= brelse(tp, last_ibp);
>>                 1775  = ;                     &nb= sp; }
>>                 1776  = ;                     &nb= sp; next_ino =3D
>>                 XFS_AGINO_= TO_INO(mp, agno, next_agino);
>>                 +   &= nbsp;                    =       ASSERT(next_agino !=3D
>>                 NULLAGINO)= ;
>>                 +   &= nbsp;                    =       ASSERT(next_agino !=3D 0);
>>                 1777  = ;                     &nb= sp; error =3D xfs_inotobp(mp,
>>                 tp, next_i= no, &last_dip,
>>                 1778
>>                 &last_= ibp, &last_offset, 0);
>>                 1779  = ;                     &nb= sp; if (error) {
>>                 1780  = ;                     &nb= sp;         xfs_warn(mp,
>>                 1781  = ;                     &nb= sp;                 "%s:
>>                 xfs_inotob= p() returned error %d.",
>>                 1782  = ;                     &nb= sp;                 __func__,
>>                 error); >>                 1783  = ;                     &nb= sp;         return error;
>>                 1784  = ;                     &nb= sp; }
>>                 1785  = ;                     &nb= sp; next_agino =3D
>>                 be32_to_cp= u(last_dip->di_next_unlinked);
>>                 -   &= nbsp;                    =       //ASSERT(next_agino !=3D
>>                 NULLAGINO)= ;
>>                 -   &= nbsp;                    =       //ASSERT(next_agino !=3D 0);
>>                 1788  = ;               }
>>                 I don'= t understand xfs well and correct me if I'm
>>                 totally wr= ong.
>>                 Thank you = very much.
>>
>>
>>                 2013/4/17 = =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com
>>                = ; <mailto:yongt= aofu@gmail.com>>
>>
>>                   &nb= sp; Hi Brain,
>>                   &nb= sp; I want to ask a question, according to the
>>                   &nb= sp; shutdown trace. The ino in  xfs_iunlink_remove
>>                   &nb= sp; is 0x113, why xfs_imap got ino=3D0xffffffff ?
>>
>>                   &nb= sp; --- xfs_imap --
>>                   &nb= sp; module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:125= 7").return
>>                   &nb= sp; -- return=3D0x16
>>                   &nb= sp; vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c70
>>                   &nb= sp; ino=3D0xffffffff
>>
>>                   &nb= sp; --- xfs_iunlink_remove --
>>                   &nb= sp; module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_in= ode.c:1680").return
>>                   &nb= sp; -- return=3D0x16
>>                   &nb= sp; vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c00
>>                   &nb= sp; next_ino=3D? mp=3D? agi=3D? dip=3D?
>>                   &nb= sp; agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D?
>>                   &nb= sp; next_agino=3D? last_ibp=3D?
>>                   &nb= sp; last_dip=3D0xffff882000000000 bucket_index=3D?
>>                   &nb= sp; offset=3D? last_offset=3D0xffffffffffff8810 error=3D?
>>                   &nb= sp; __func__=3D[...]
>>                   &nb= sp; ip: i_ino =3D 0x113, i_flags =3D 0x0
>>
>>                   &nb= sp; Thank you.
>>
>>
>>
>>                   &nb= sp; 2013/4/17 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com
>>                 &nbs= p;   <mailto:yongtaofu@gmail.com>>
>>
>>                   &nb= sp;     Hi Brain,
>>                   &nb= sp;     Thank you for your update, and I have applied
>>                   &nb= sp;     your last kernel patch. However it is not easy
>>                   &nb= sp;     to reproduce especially in out test
>>                   &nb= sp;     environment. Till now is not happens again.
>>                   &nb= sp;     I'll update the kernel patch now. BTW is there
>>                   &nb= sp;     any findings in the logs of previous thread?
>>                   &nb= sp;     http://oss.sgi.com/archives/xfs/2013-04/msg00327= .html
>>                   &nb= sp;     I guess it tend to happen during glusterfs
>>                   &nb= sp;     rebalance because glusterfs moves a lot of
>>                   &nb= sp;     file from one server to another and then
>>                   &nb= sp;     unlink it.
>>
>>                   &nb= sp;     Thank you.
>>
>>
>>                   &nb= sp;     2013/4/17 Brian Foster <bfoster@redhat.com
>>                 &nbs= p;       <mailto:bfoster@redhat.com>>
>>
>>                   &nb= sp;         On 04/16/2013 12:24 PM, Dave Chinner wrote:=
>>                   &nb= sp;         > On Mon, Apr 15, 2013 at 07:14:39PM
>>                   &nb= sp;         -0400, Brian Foster wrote:
>>                   &nb= sp;         >> Hi,
>>                   &nb= sp;         >>
>>                   &nb= sp;         >> Thanks for the data in the previou= s thread:
>>                   &nb= sp;         >>
>>                   &nb= sp;         >>
>>                   &nb= sp;         http://oss.sgi.com/archives/xfs/20= 13-04/msg00327.html
>>                   &nb= sp;         >>
>>                   &nb= sp;         ...
>>                   &nb= sp;         >>
>>                   &nb= sp;         >>      echo 1 > >>                   &nb= sp;         /sys/kernel/debug/tracing/events/xfs/xfs_iu= nlink/enable
>>                   &nb= sp;         >>      echo 1 > >>                   &nb= sp;         /sys/kernel/debug/tracing/events/xfs/xfs_iu= nlink_remove/enable
>>                   &nb= sp;         >>      ... reproduce = ...
>>                   &nb= sp;         >>      cat
>>                   &nb= sp;         /sys/kernel/debug/tracing/trace > trace.= output
>>                   &nb= sp;         >
>>                   &nb= sp;         > It's better to use trace-cmd for t= his.
>>                   &nb= sp;         it will result in less
>>                   &nb= sp;         > dropped events. i.e.:
>>                   &nb= sp;         >
>>                   &nb= sp;         >       $ trace-cmd recor= d -e xfs_iunlink\*
>>                   &nb= sp;         >       ... reproduce ...=
>>                   &nb= sp;         >       ^C
>>                   &nb= sp;         >       $ trace-cmd repor= t > trace.output
>>                   &nb= sp;         >
>>                   &nb= sp;         >> --- a/fs/xfs/linux-2.6/xfs_trace.h=
>>                   &nb= sp;         >> +++ b/fs/xfs/linux-2.6/xfs_trace.h=
>>                   &nb= sp;         >> @@ -581,6 +581,8 @@
>>                   &nb= sp;         DEFINE_INODE_EVENT(xfs_file_fsync);
>>                   &nb= sp;         ...
>>                   &nb= sp;         >
>>                   &nb= sp;         > I would suggest that the the tracing >>                   &nb= sp;         shoul dbe at entry of the
>>                   &nb= sp;         > function, otherwise we won't get a=
>>                   &nb= sp;         tracepoint for the operation that
>>                   &nb= sp;         > triggers the shutdown. (That's the=
>>                   &nb= sp;         reason most tracepoints in XFS
>>                   &nb= sp;         > are at function entry...)
>>                   &nb= sp;         >
>>
>>                   &nb= sp;         Good points, thanks Dave. A v2 that pulls >>                   &nb= sp;         up the tracepoints towards
>>                   &nb= sp;         function entry is appended.
>>
>>                   &nb= sp;         Brian
>>
>>                   &nb= sp;         From
>>                   &nb= sp;         280943e78ebe0b97a774cba51e7815c42f044b55 >>                   &nb= sp;         Mon Sep 17 00:00:00 2001
>>                   &nb= sp;         From: Brian Foster <bfoster@redhat.com
>>                = ;             <mailto:bfoster@redhat.com>>
>>                 =             Date: Mon, 15 Apr 2013 18:16:24 -= 0400
>>                   &nb= sp;         Subject: [PATCH v2] xfs: add tracepoints >>                   &nb= sp;         for xfs_iunlink and
>>                   &nb= sp;         xfs_iunlink_remove
>>
>>                   &nb= sp;         ---
>>                   &nb= sp;          fs/xfs/linux-2.6/xfs_trace.h |  =  2 ++
>>                   &nb= sp;          fs/xfs/xfs_inode.c     &nbs= p;     |    4 ++++
>>                   &nb= sp;          2 files changed, 6 insertions(+), 0 >>                   &nb= sp;         deletions(-)
>>
>>                   &nb= sp;         diff --git a/fs/xfs/linux-2.6/xfs_trace.h >>                   &nb= sp;         b/fs/xfs/linux-2.6/xfs_trace.h
>>                   &nb= sp;         index adc6ec4..338a0f9 100644
>>                   &nb= sp;         --- a/fs/xfs/linux-2.6/xfs_trace.h
>>                   &nb= sp;         +++ b/fs/xfs/linux-2.6/xfs_trace.h
>>                   &nb= sp;         @@ -583,6 +583,8 @@
>>                   &nb= sp;         DEFINE_INODE_EVENT(xfs_file_fsync);
>>                   &nb= sp;          DEFINE_INODE_EVENT(xfs_destroy_inode)= ;
>>                   &nb= sp;          DEFINE_INODE_EVENT(xfs_dirty_inode);<= br> >>                   &nb= sp;          DEFINE_INODE_EVENT(xfs_clear_inode);<= br> >>                   &nb= sp;         +DEFINE_INODE_EVENT(xfs_iunlink);
>>                   &nb= sp;         +DEFINE_INODE_EVENT(xfs_iunlink_remove); >>
>>                   &nb= sp;          DEFINE_INODE_EVENT(xfs_dquot_dqalloc)= ;
>>                   &nb= sp;          DEFINE_INODE_EVENT(xfs_dquot_dqdetach= );
>>                   &nb= sp;         diff --git a/fs/xfs/xfs_inode.c
>>                   &nb= sp;         b/fs/xfs/xfs_inode.c
>>                   &nb= sp;         index 19900f0..d705c77 100644
>>                   &nb= sp;         --- a/fs/xfs/xfs_inode.c
>>                   &nb= sp;         +++ b/fs/xfs/xfs_inode.c
>>                   &nb= sp;         @@ -1615,6 +1615,8 @@ xfs_iunlink(
>>
>>                   &nb= sp;                 mp =3D tp->t= _mountp;
>>
>>                   &nb= sp;         +       trace_xfs_iunlink(ip= );
>>                   &nb= sp;         +
>>                   &nb= sp;                 /*
>>                   &nb= sp;                  * Get the= agi buffer first.  It
>>                   &nb= sp;         ensures lock ordering
>>                   &nb= sp;                  * on the = list.
>>                   &nb= sp;         @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( >>                   &nb= sp;                 mp =3D tp->t= _mountp;
>>                   &nb= sp;                 agno =3D XFS_IN= O_TO_AGNO(mp, ip->i_ino);
>>
>>                   &nb= sp;         +       trace_xfs_iunlink_re= move(ip);
>>                   &nb= sp;         +
>>                   &nb= sp;                 /*
>>                   &nb= sp;                  * Get the= agi buffer first.  It
>>                   &nb= sp;         ensures lock ordering
>>                   &nb= sp;                  * on the = list.
>>                   &nb= sp;         --
>>                   &nb= sp;         1.7.7.6
>>
>>
>>
>>
>>                   &nb= sp;     --
>>                   &nb= sp;     =B7=FB=D3=C0=CC=CE
>>
>>
>>
>>
>>                   &nb= sp; --
>>                   &nb= sp; =B7=FB=D3=C0=CC=CE
>>
>>
>>
>>
>>                 --
>>                 =B7=FB=D3= =C0=CC=CE
>>
>>
>>
>>
>>             --
>>             =B7=FB=D3=C0=CC=CE
>>             ________________________= _______________________
>>             xfs mailing list
>>             xfs@oss.sgi.com <mailto:xfs@oss.sgi.com>
>>             http://oss.sgi.com/= mailman/listinfo/xfs
>
>
>
>
>         --
>         =B7=FB=D3=C0=CC=CE
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--001a11c1ed324410cd04daa54432-- From prvs=813e487bd=Rene.Steinhausen@hilton.com Thu Apr 18 11:57:08 2013 Return-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 A8D657F5A for ; Thu, 18 Apr 2013 11:57:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 923D68F8049 for ; Thu, 18 Apr 2013 09:57:08 -0700 (PDT) X-ASG-Debug-ID: 1366304224-04cb6c6e2b239890001-NocioJ Received: from esa2.hilton.iphmx.com (esa2.hilton.iphmx.com [68.232.137.92]) by cuda.sgi.com with ESMTP id J7KrCYNTSkJmotvg (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 18 Apr 2013 09:57:05 -0700 (PDT) X-Barracuda-Envelope-From: prvs=813e487bd=Rene.Steinhausen@hilton.com X-Barracuda-Apparent-Source-IP: 68.232.137.92 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: An1cAFUkcFGnu2QCdWdsb2JhbABQgkIyrSuBfT6DH4Ini3gUcBYOAQoMDAcUKH8BAQFoGwEBAQoBAQECAQMBAQEDBVM4AQwBCBVWHwcBCgEMCIVBAQEBASmCAAEBARudOaE9jVaBEYMeYQOBLYciiVqLCI11PIE3NQ X-IronPort-AV: E=Sophos;i="4.87,502,1363150800"; d="scan'208,217";a="1418448" Received: from unknown (HELO mail.hilton.com) ([167.187.100.2]) by esa2.hilton.iphmx.com with ESMTP/TLS/AES128-SHA; 18 Apr 2013 11:56:57 -0500 Received: from HFWMXMSG14PH.hotels.ad.hilton.com (10.80.40.46) by HFWMRMSG04PH.hotels.ad.hilton.com (10.80.200.54) with Microsoft SMTP Server (TLS) id 14.2.342.3; Thu, 18 Apr 2013 13:00:13 -0400 Received: from HFWMXMSG16PH.hotels.ad.hilton.com ([169.254.8.154]) by HFWMXMSG14PH.hotels.ad.hilton.com ([169.254.7.79]) with mapi id 14.02.0342.004; Thu, 18 Apr 2013 12:56:37 -0400 From: Rene Steinhausen Subject: inheritance Thread-Topic: inheritance X-ASG-Orig-Subj: inheritance Thread-Index: Ac48U/mK3gqirCYzRx6ZZpj1odny6w== Date: Thu, 18 Apr 2013 16:56:37 +0000 Message-ID: <6ECDB6166EC34245BF69661D523F9230033065@HFWMXMSG16PH.hotels.ad.hilton.com> Accept-Language: de-DE, en-US Content-Language: de-DE X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.80.202.30] Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 To: Undisclosed recipients:; X-Barracuda-Connect: esa2.hilton.iphmx.com[68.232.137.92] X-Barracuda-Start-Time: 1366304224 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.52 X-Barracuda-Spam-Status: No, SCORE=0.52 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, HTML_MESSAGE, MIME_HTML_ONLY, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128491 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 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_SA620a Custom Rule SA620a

 

 

I am Mrs. Margarita Yakov= and i have picked your email for inheritance. rather than allow my late hu= sband greedy relatives to use my husband's hard earned money in ungodly way= kindly reach out to my lawyer email address mroland2@rogers.com He = will give you directives on how the money should be willed to you.



This transmission is not a digital or electronic signature and cannot be us= ed to form, document, or authenticate a contract. Hilton and its affiliates= accept no liability arising in connection with this transmission.Copyright= 2013 Hilton Worldwide Proprietary and Confidential
From sandeen@sandeen.net Thu Apr 18 12:03:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F25207F5E for ; Thu, 18 Apr 2013 12:03:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9DEBCAC005 for ; Thu, 18 Apr 2013 10:03:25 -0700 (PDT) X-ASG-Debug-ID: 1366304603-04bdf01d631463f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id wHHRFj7wtfxawZB6 for ; Thu, 18 Apr 2013 10:03:23 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (unknown [69.38.217.10]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E366E6096FDC; Thu, 18 Apr 2013 12:03:22 -0500 (CDT) Message-ID: <5170275A.7070202@sandeen.net> Date: Thu, 18 Apr 2013 10:03:22 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?GB2312?B?t/vTwMzO?= CC: Brian Foster , "xfs@oss.sgi.com" Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> <516FDBDE.1070406@redhat.com> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366304603 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128491 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/18/13 8:23 AM, ·ûÓÀÌÎ wrote: > Hi Brian and Eric, > The shutdown is not easy to produce but finally right now 2 of our servers in our test cluster xfs was shutdown. > > the trace output as following > https://docs.google.com/file/d/0B7n2C4T5tfNCLXRYUWJ0b19JcWc/edit?usp=sharing > > Sorry but the systemtap is interrupt and I didn't noticed that so I didn't get systemtap logs. > > /var/log/message is same as before > Apr 18 22:43:14 10 kernel: XFS (sdb): : xfs_inotobp() returned error 22. > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22 > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = 0xffffffffa02d44aa > Apr 18 22:43:14 10 kernel: XFS (sdb): I/O Error Detected. Shutting down filesystem > Apr 18 22:43:14 10 kernel: XFS (sdb): Please umount the filesystem and rectify the problem(s) > Apr 18 22:43:20 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > The metadump file is large I'll share it to you soon. > Thanks, we'll take a look. Just to double check, in the kernel that ran the tracepoints, did you use brian's 2nd version of the patch? I want to make sure the tracepoints were at the top of the function. Since you're patching xfs anyway, can you add something like this for next time: diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 796edce..cad0e8e 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1777,8 +1777,9 @@ xfs_iunlink_remove( &last_ibp, &last_offset, 0); if (error) { xfs_warn(mp, - "%s: xfs_inotobp() returned error %d.", - __func__, error); + "%s: xfs_inotobp() returned error %d " + "for inode 0x%llx ag %d agino %x\n", + __func__, error, ip->i_ino, agno, agino); return error; } next_agino = be32_to_cpu(last_dip->di_next_unlinked); so that when we encounter the error we're sure to have the problematic inode number. Thanks, -Eric From sekharan@us.ibm.com Thu Apr 18 12:44:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7D01A7F59 for ; Thu, 18 Apr 2013 12:44:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4BAD1304032 for ; Thu, 18 Apr 2013 10:44:29 -0700 (PDT) X-ASG-Debug-ID: 1366307067-04bdf01d631492e0001-NocioJ Received: from e38.co.us.ibm.com (e38.co.us.ibm.com [32.97.110.159]) by cuda.sgi.com with ESMTP id ZSlnwUPwvVRvRuM7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 18 Apr 2013 10:44:28 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.110.159 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.159] Received: from /spool/local by e38.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 18 Apr 2013 11:44:23 -0600 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.159] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.159] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.159] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.159] Received: from d03dlp02.boulder.ibm.com (9.17.202.178) by e38.co.us.ibm.com (192.168.1.138) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 18 Apr 2013 11:44:13 -0600 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by d03dlp02.boulder.ibm.com (Postfix) with ESMTP id 63A983E40072 for ; Thu, 18 Apr 2013 11:43:58 -0600 (MDT) Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d03relay04.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3IHi4Ga366976 for ; Thu, 18 Apr 2013 11:44:04 -0600 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3IHi3qb004337 for ; Thu, 18 Apr 2013 11:44:04 -0600 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3IHi3pL004219; Thu, 18 Apr 2013 11:44:03 -0600 Subject: [PATCH] xfstests: Remove dependence of xfs_check script From: Chandra Seetharaman X-ASG-Orig-Subj: [PATCH] xfstests: Remove dependence of xfs_check script Reply-To: sekharan@us.ibm.com To: XFS mailing list Cc: Eric Sandeen Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Thu, 18 Apr 2013 12:44:02 -0500 Message-ID: <1366307042.3762.32361.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13041817-5518-0000-0000-00000DAFA83D X-Barracuda-Connect: e38.co.us.ibm.com[32.97.110.159] X-Barracuda-Start-Time: 1366307067 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Replace the usage of the script xfs_check and add the relevant code to xfstests. This is in preparation of the planned deprecation of xfs_check. Signed-off-by: Chandra Seetharaman Reviewed-by: Eric Sandeen --- diff --git a/common/config b/common/config index bf62996..dfbb5c2 100644 --- a/common/config +++ b/common/config @@ -154,7 +154,6 @@ export DF_PROG="`set_prog_path df`" export XFS_LOGPRINT_PROG="`set_prog_path xfs_logprint`" export XFS_REPAIR_PROG="`set_prog_path xfs_repair`" -export XFS_CHECK_PROG="`set_prog_path xfs_check`" export XFS_DB_PROG="`set_prog_path xfs_db`" export XFS_GROWFS_PROG=`set_prog_path xfs_growfs` export XFS_IO_PROG="`set_prog_path xfs_io`" diff --git a/common/rc b/common/rc index 09fb83f..2397795 100644 --- a/common/rc +++ b/common/rc @@ -166,7 +166,6 @@ case "$FSTYP" in xfs) [ "$XFS_LOGPRINT_PROG" = "" ] && _fatal "xfs_logprint not found" [ "$XFS_REPAIR_PROG" = "" ] && _fatal "xfs_repair not found" - [ "$XFS_CHECK_PROG" = "" ] && _fatal "xfs_check not found" [ "$XFS_DB_PROG" = "" ] && _fatal "xfs_db not found" [ "$MKFS_XFS_PROG" = "" ] && _fatal "mkfs_xfs not found" ;; @@ -387,6 +386,34 @@ _scratch_mkfs_xfs() return $mkfs_status } +# xfs_check script is planned to be deprecated. But, we want to +# be able to invoke "xfs_check" behavior in xfstests in order to +# maintain the current verification levels. +_xfs_check() +{ + OPTS=" " + DBOPTS=" " + + OPTIND=1 + while getopts "b:fi:l:stvV" c + do + case $c in + s) OPTS=$OPTS"-s ";; + t) OPTS=$OPTS"-t ";; + v) OPTS=$OPTS"-v ";; + i) OPTS=$OPTS"-i "$OPTARG" ";; + b) OPTS=$OPTS"-b "$OPTARG" ";; + f) DBOPTS=$DBOPTS" -f";; + l) DBOPTS=$DBOPTS" -l "$OPTARG" ";; + V) $XFS_DB_PROG -p xfs_check -V + return $? + ;; + esac + done + ${XFS_DB_PROG}${DBOPTS} -F -i -p xfs_check -c "check$OPTS" $1 + return $? +} + _setup_large_ext4_fs() { fs_size=$1 @@ -589,7 +616,7 @@ _scratch_xfs_check() SCRATCH_OPTIONS="-l $SCRATCH_LOGDEV" [ "$LARGE_SCRATCH_DEV" = yes ] && \ SCRATCH_OPTIONS=$SCRATCH_OPTIONS" -t" - $XFS_CHECK_PROG $SCRATCH_OPTIONS $* $SCRATCH_DEV + _xfs_check $SCRATCH_OPTIONS $* $SCRATCH_DEV } _scratch_xfs_repair() @@ -1426,7 +1453,7 @@ _check_xfs_filesystem() # option (-t) to avoid indexing the free space trees doesn't make it pass on # large filesystems. Avoid it. if [ "$LARGE_SCRATCH_DEV" != yes ]; then - $XFS_CHECK_PROG $extra_log_options $device 2>&1 |\ + _xfs_check $extra_log_options $device 2>&1 |\ _fix_malloc >$tmp.fs_check fi if [ -s $tmp.fs_check ] diff --git a/crash/xfscrash b/crash/xfscrash index 7831d7e..579b724 100755 --- a/crash/xfscrash +++ b/crash/xfscrash @@ -120,11 +120,11 @@ _check() if [ $expect -eq 0 ] then _echo " *** xfs_check ($LOG/check_clean.out)" - xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=1 + _xfs_check $TEST_DEV &> $LOG/check_clean.out || fail=1 [ -s /tmp/xfs_check_clean.out ] && fail=1 else _echo " *** xfs_check ($LOG/check_dirty.out)" - xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=1 + _xfs_check $TEST_DEV &> $LOG/check_dirty.out || fail=1 fi if [ $fail -eq 0 -a $expect -eq 0 ] diff --git a/tests/xfs/085 b/tests/xfs/085 index 27f29a3..af71b77 100755 --- a/tests/xfs/085 +++ b/tests/xfs/085 @@ -70,7 +70,7 @@ _print_logstate # curious if FS consistent at start if false; then - if $XFS_CHECK_PROG $SCRATCH_DEV; then + if _xfs_check $SCRATCH_DEV; then echo "*** checked ok ***" fi fi diff --git a/tests/xfs/291 b/tests/xfs/291 old mode 100644 new mode 100755 index f842679..7723b9e --- a/tests/xfs/291 +++ b/tests/xfs/291 @@ -113,7 +113,7 @@ done _scratch_unmount # Can xfs_repair and xfs_check cope with this monster? _scratch_xfs_repair >> $seqres.full 2>&1 || _fail "xfs_repair failed" -xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed" +_xfs_check $SCRATCH_DEV >> $seqres.full 2>&1 || _fail "xfs_check failed" # Yes they can! Now... # Can xfs_metadump cope with this monster? From sandeen@sandeen.net Thu Apr 18 13:35:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 081CB7F5E for ; Thu, 18 Apr 2013 13:35:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E98C230406A for ; Thu, 18 Apr 2013 11:35:53 -0700 (PDT) X-ASG-Debug-ID: 1366310149-04cb6c2c1c364570001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 6Erf6f4Gh0wOQ8OE for ; Thu, 18 Apr 2013 11:35:49 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (unknown [69.38.217.10]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 23D3363BCC7E; Thu, 18 Apr 2013 13:35:49 -0500 (CDT) Message-ID: <51703D05.6060308@sandeen.net> Date: Thu, 18 Apr 2013 11:35:49 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?GB2312?B?t/vTwMzO?= CC: Brian Foster , "xfs@oss.sgi.com" Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> <516FDBDE.1070406@redhat.com> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366310149 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128497 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/18/13 8:23 AM, ·ûÓÀÌÎ wrote: > Hi Brian and Eric, > The shutdown is not easy to produce but finally right now 2 of our servers in our test cluster xfs was shutdown. > > the trace output as following > https://docs.google.com/file/d/0B7n2C4T5tfNCLXRYUWJ0b19JcWc/edit?usp=sharing > here's something interesting, for 2 inodes we have double/racing calls to xfs_iunlink: === 0x5cc0b === <...>-8336 [004] 6931.372924: xfs_iunlink: dev 8:16 ino 0x5cc0b <...>-8336 [004] 6931.372965: xfs_iunlink_remove: dev 8:16 ino 0x5cc0b <...>-27541 [001] 35061.349747: xfs_iunlink: dev 8:16 ino 0x5cc0b <...>-3356 [001] 36449.762504: xfs_iunlink_remove: dev 8:16 ino 0x5cc0b <...>-3300 [003] 41013.398566: xfs_iunlink: dev 8:16 ino 0x5cc0b <...>-26115 [012] 41013.399884: xfs_iunlink: dev 8:16 ino 0x5cc0b <...>-26115 [012] 41013.399935: xfs_iunlink_remove: dev 8:16 ino 0x5cc0b <...>-28961 [000] 68977.951208: xfs_iunlink: dev 8:16 ino 0x5cc0b <...>-3364 [021] 81616.210533: xfs_iunlink_remove: dev 8:16 ino 0x5cc0b === 0x7ef8c === <...>-13169 [001] 118751.536025: xfs_iunlink: dev 8:16 ino 0x7ef8c <...>-13169 [001] 118751.536049: xfs_iunlink_remove: dev 8:16 ino 0x7ef8c <...>-3594 [015] 119027.006161: xfs_iunlink: dev 8:16 ino 0x7ef8c <...>-3594 [015] 119027.006186: xfs_iunlink_remove: dev 8:16 ino 0x7ef8c <...>-3591 [001] 121423.286004: xfs_iunlink: dev 8:16 ino 0x7ef8c <...>-4141 [019] 121423.288518: xfs_iunlink: dev 8:16 ino 0x7ef8c <...>-4141 [019] 121423.288541: xfs_iunlink_remove: dev 8:16 ino 0x7ef8c 2 threads on 2 different CPUs adding the same inode to the unlinked list in a race; this will corrupt the list and lead to the failure to find the other inode we're looking for. So, progress! We'll take a look at the iunlink paths. -Eric From lila@pk2creat.pk2creativos.com Thu Apr 18 13:39:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 2110E29E0C for ; Thu, 18 Apr 2013 13:39:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B63D4304066 for ; Thu, 18 Apr 2013 11:39:22 -0700 (PDT) X-ASG-Debug-ID: 1366310352-04bdf01d6314cc10001-NocioJ Received: from pk2creat.pk2creativos.com (pk2creat.pk2creativos.com [200.58.124.143]) by cuda.sgi.com with ESMTP id Gb2VElRXOGM43iu3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 18 Apr 2013 11:39:17 -0700 (PDT) X-Barracuda-Envelope-From: lila@pk2creat.pk2creativos.com X-Barracuda-Apparent-Source-IP: 200.58.124.143 Received: from lila by pk2creat.pk2creativos.com with local (Exim 4.77) (envelope-from ) id 1UStjj-0006pj-Om for xfs@oss.sgi.com; Thu, 18 Apr 2013 15:39:11 -0300 To: xfs@oss.sgi.com Subject: 27 y 28 de ABRIL Comienza Escuela de Tarot con Cristina Bacciotti Date: Thu, 18 Apr 2013 15:39:11 -0300 X-ASG-Orig-Subj: 27 y 28 de ABRIL Comienza Escuela de Tarot con Cristina Bacciotti From: Espacio LILA Message-ID: <5d6a7e7370c761006c0ed89e6303d09c@www.espaciolila.com> X-Priority: 3 X-Mailer: PHPMailer [version 1.73] X-Mailer: phplist v2.10.17 X-MessageID: 41 X-ListMember: xfs@oss.sgi.com MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_5d6a7e7370c761006c0ed89e6303d09c" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - pk2creat.pk2creativos.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [509 508] / [502 502] X-AntiAbuse: Sender Address Domain - pk2creat.pk2creativos.com X-Barracuda-Connect: pk2creat.pk2creativos.com[200.58.124.143] X-Barracuda-Start-Time: 1366310356 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128497 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 BSF_SC0_SA085 Custom Rule SA085 --b1_5d6a7e7370c761006c0ed89e6303d09c Content-Type: text/plain; charset = "UTF-8" Content-Transfer-Encoding: 8bit Los Tarot son 78 cartas con imágenes arquetípicas que representan símbolos universales reflejantes nuestro profundo Ser. Los Tarots son un mapa mental que utiliza símbolos universales para conversar con nuestro inconsciente y para darnos herramientas mágicas y desarrollar una vida consciente, conocer nuestro presente y especular nuestro futuro. Los Tarots necesitan reencontrar su antigua dignidad y respeto, y son Maestros de un antiguo conocimiento trasmitido por seres muy sabios del pasado. Hoy vuelven para despertarnos al gran cambio de conciencia que estamos enfrentando y ayudarnos a hacer el salto. Durante el Curso aprenderemos a jugar con ellos y tirar las cartas. El juego y la magia son ingredientes esenciales para el despertar de la conciencia porque el cerebro trabaja por conexiones y aprende jugando. El Taller se compone de dos niveles. El primer nivel consta de 5 módulos y el segundo nivel de 4 módulos. Cristina nos habla sobre los tarot: Día: Sabado 23 y Domingo 24 de Marzo (de 10 a 18 hs.) Inscripciones al Tel. 0351 4514089 o a info@espaciolila.com Más información y reserva On-Line: Click Aquí El estudio de la Metafísica sirve para comprender quienes somos, de dónde venimos y hacia dónde vamos. Todos pueden participar para adentrarse en el mundo del misterio, de la aparente paradoja y saber finalmente cual es nuestra herencia espiritual. Día: Sábado 20 de marzo, de 10 a 18 hs. Lugar: VILLA ESPERANZA - Centro de Iniciación. Valle Hermoso, Córdoba Inversión: $ 380 - Por parejas y grupos $ 360 Incluye Almuerzo y Merienda. Consulte por Viajes Compartidos. Inscripciones al Tel. 0351 4514089 / 03548 15409115 o a info@espaciolila.com Más información y reserva On-Line: Click Aquí DIFUNDINOS SUSCRIBITE SEGUINOS EN ¿Conoces a alguien que pudiera estar interesado en recibir este boletín? ENVIAR A UN AMIGO Recibe en tu mail todas las noticias, cursos, talleres y actividades del mes. SUSCRIBITE AQUI Está recibiendo este boletín de noticias porque está suscripto a nuestras listas de correo. Si no está interesado en recibirlo, puede desuscribirse aquí. -- Si usted no desea recibir boletines de noticias más,, http://www.espaciolila.com/lists/?p=unsubscribe Para actualizar sus preferencias y para cancelar la suscripción, visite http://www.espaciolila.com/lists/?p=preferences Reenviar un mensaje a alguien http://www.espaciolila.com/lists/?p=forward -- powered by phpList, www.phplist.com -- --b1_5d6a7e7370c761006c0ed89e6303d09c Content-Type: text/html; charset = "UTF-8" Content-Transfer-Encoding: 8bit

 
Espacio LILA
 

Tarot

Los Tarot son 78 cartas con imágenes arquetípicas que representan símbolos universales reflejantes nuestro profundo Ser.
Los Tarots son un mapa mental que utiliza símbolos universales para conversar con nuestro inconsciente y para darnos herramientas mágicas y desarrollar una vida consciente, conocer nuestro presente y especular nuestro futuro.
Los Tarots necesitan reencontrar su antigua dignidad y respeto, y son Maestros de un antiguo conocimiento trasmitido por seres muy sabios del pasado.
Hoy vuelven para despertarnos al gran cambio de conciencia que estamos enfrentando y ayudarnos a hacer el salto.
Durante el Curso aprenderemos a jugar con ellos y tirar las cartas. El juego y la magia son ingredientes esenciales para el despertar de la conciencia porque el cerebro trabaja por conexiones y aprende jugando.
El Taller se compone de dos niveles. El primer nivel consta de 5 módulos y el segundo nivel de 4 módulos.

 

Cristina nos habla sobre los tarot:

Espacio LILA

Día: Sabado 23 y Domingo 24 de Marzo (de 10 a 18 hs.)
Inscripciones al Tel. 0351 4514089 o a info@espaciolila.com

Más información y reserva On-Line: Click Aquí

El estudio de la Metafísica sirve para comprender quienes somos, de dónde venimos y hacia dónde vamos.

Todos pueden participar para adentrarse en el mundo del misterio, de la aparente paradoja y saber finalmente cual es nuestra herencia espiritual.

Día: Sábado 20 de marzo, de 10 a 18 hs.

Lugar: VILLA ESPERANZA - Centro de Iniciación.
Valle Hermoso, Córdoba

Inversión: $ 380 - Por parejas y grupos $ 360
Incluye Almuerzo y Merienda.

Consulte por Viajes Compartidos.

Inscripciones al Tel. 0351 4514089 / 03548 15409115 o a info@espaciolila.com

Más información y reserva On-Line: Click Aquí

DIFUNDINOS SUSCRIBITE SEGUINOS EN
¿Conoces a alguien que pudiera estar interesado
en recibir este boletín?
ENVIAR A UN AMIGO
Recibe en tu mail
todas las noticias,
cursos, talleres y
actividades del mes.
SUSCRIBITE AQUI
twitter twitter

Está recibiendo este boletín de noticias porque está suscripto a nuestras listas de correo.
Si no está interesado en recibirlo, puede desuscribirse aquí.



--
Si usted no desea recibir boletines de noticias más,, http://www.espaciolila.com/lists/?p=unsubscribe
Para actualizar sus preferencias y para cancelar la suscripción, visite http://www.espaciolila.com/lists/?p=preferences
Reenviar un mensaje a alguien http://www.espaciolila.com/lists/?p=forward
powered by phplist v 2.10.17, © phpList ltd
--b1_5d6a7e7370c761006c0ed89e6303d09c-- From bfoster@redhat.com Thu Apr 18 16:02:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 230B329E0E for ; Thu, 18 Apr 2013 16:02:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 118A6304051 for ; Thu, 18 Apr 2013 14:02:31 -0700 (PDT) X-ASG-Debug-ID: 1366318946-04cb6c6e2b2491e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8nVa5BmEr0STpUcl for ; Thu, 18 Apr 2013 14:02:26 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3IL2P53032725 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 18 Apr 2013 17:02:25 -0400 Received: from laptop.bfoster (vpn-63-228.rdu2.redhat.com [10.10.63.228]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3IL2Nfh009462 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 18 Apr 2013 17:02:24 -0400 Message-ID: <51705EC4.4000306@redhat.com> Date: Thu, 18 Apr 2013 16:59:48 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> <516FDBDE.1070406@redhat.com> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366318946 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/18/2013 11:23 AM, 符永涛 wrote: > Hi Brian and Eric, > The shutdown is not easy to produce but finally right now 2 of our > servers in our test cluster xfs was shutdown. > Understood. We've been trying very hard to reproduce ourselves to make it easier to debug, but haven't been able to reproduce at all so far. This process allows us to make _some_ progress on the issue, even if it is slower going than we'd like... ;) > the trace output as following > https://docs.google.com/file/d/0B7n2C4T5tfNCLXRYUWJ0b19JcWc/edit?usp=sharing > Thanks again for the data. The racing behavior Eric called out (nice catch!) in his last mail lit up some light bulbs internally with regard to some old locking issues triggered by XFS in the 6.3 kernel. The following bug serves as an example: https://bugzilla.redhat.com/show_bug.cgi?id=852847 ... the fix for which went into the 2.6.32-279.19.1 6.3.z release. Could you move some or all of your servers to this kernel[1] and see how it goes? The best case is it resolves the problem, worst case we carry on debugging from there... Brian [1] - http://mirror.linux.duke.edu/pub/centos/6.3/updates/x86_64/Packages/kernel-2.6.32-279.19.1.el6.x86_64.rpm > Sorry but the systemtap is interrupt and I didn't noticed that so I > didn't get systemtap logs. > > /var/log/message is same as before > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() > returned error 22. > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned > error 22 > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called > from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = > 0xffffffffa02d44aa > Apr 18 22:43:14 10 kernel: XFS (sdb): I/O Error Detected. Shutting down > filesystem > Apr 18 22:43:14 10 kernel: XFS (sdb): Please umount the filesystem and > rectify the problem(s) > Apr 18 22:43:20 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > The metadump file is large I'll share it to you soon. > > > 2013/4/18 Brian Foster > > > On 04/18/2013 04:25 AM, 符永涛 wrote: > > Hi Brian and Eric, > > Can I change as following to bypass it? > > This is probably not a wise thing to do. The problem we're seeing here > is indicative of a potentially larger problem than this particular error > path. An inode is being unlinked and inactivated, but we aren't finding > on the list where we expect it to be. Killing the error return doesn't > eliminate the larger problem. > > So while changes could end up being made in this area as part of a fix, > I would not suggest making any changes beyond those designed to help > debug until we have a better idea of root cause. > > Brian > > > --- a/xfs_inode.c > > +++ b/xfs_inode.c > > @@ -1764,7 +1764,7 @@ xfs_iunlink_remove( > > */ > > next_agino = > be32_to_cpu(agi->agi_unlinked[bucket_index]); > > last_ibp = NULL; > > - while (next_agino != agino) { > > + while (next_agino != agino && next_agino != > NULLAGINO) { > > /* > > * If the last inode wasn't the one > pointing to > > * us, then release its buffer since we're not > > @@ -1786,6 +1786,14 @@ xfs_iunlink_remove( > > ASSERT(next_agino != NULLAGINO); > > ASSERT(next_agino != 0); > > } > > + if (next_agino == NULLAGINO) { > > + /* > > + *After search the list for the inode > being free > > + *we still can't find it. > > + */ > > + xfs_err(mp, "%s ino %lld not found in unlinked > > list.", > > + __func__, (unsigned long > > long)ip->i_ino); > > + } > > /* > > * Now last_ibp points to the buffer previous to us on > > * the unlinked list. Pull us from the list. > > @@ -1810,16 +1818,20 @@ xfs_iunlink_remove( > > } else { > > xfs_trans_brelse(tp, ibp); > > } > > - /* > > - * Point the previous inode on the list to the > next inode. > > - */ > > - last_dip->di_next_unlinked = cpu_to_be32(next_agino); > > - ASSERT(next_agino != 0); > > - offset = last_offset + offsetof(xfs_dinode_t, > > di_next_unlinked); > > - xfs_trans_inode_buf(tp, last_ibp); > > - xfs_trans_log_buf(tp, last_ibp, offset, > > - (offset + sizeof(xfs_agino_t) - 1)); > > - xfs_inobp_check(mp, last_ibp); > > + if (next_agino != NULLAGINO) { > > + /* > > + * If only find the inode being free then > we modify > > + * the unlinked list. > > + * Point the previous inode on the list to the > > next inode. > > + */ > > + last_dip->di_next_unlinked = > > cpu_to_be32(next_agino); > > + ASSERT(next_agino != 0); > > + offset = last_offset + offsetof(xfs_dinode_t, > > di_next_unlinked); > > + xfs_trans_inode_buf(tp, last_ibp); > > + xfs_trans_log_buf(tp, last_ibp, offset, > > + (offset + > sizeof(xfs_agino_t) > > - 1)); > > + xfs_inobp_check(mp, last_ibp); > > + } > > } > > return 0; > > } > > > > Thank you. > > > > > > 2013/4/18 符永涛 > >> > > > > Hi Brain and Eric, > > If the problem is the agno can't be found in the unlinked > list. Can > > we just bypass it instead of passing ino=0xffffffff to > xfs_inotobp? > > Thank you. > > > > > > 2013/4/18 符永涛 >> > > > > Hi Eric, > > The shutdown issue is still not reproduced yet. But I get the > > following error today during test. > > > > Apr 18 07:42:51 10 kernel: Call Trace: > > Apr 18 07:42:51 10 kernel: [] ? > > xfs_buf_cond_lock+0x2f/0xc0 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > schedule_timeout+0x215/0x2e0 > > Apr 18 07:42:51 10 kernel: [] ? > > kmem_zone_alloc+0x77/0xf0 [xfs] > > Apr 18 07:42:51 10 kernel: [] > __down+0x72/0xb0 > > Apr 18 07:42:51 10 kernel: [] ? > > _xfs_buf_find+0x102/0x280 [xfs] > > Apr 18 07:42:51 10 kernel: "echo 0 > > > /proc/sys/kernel/hung_task_timeout_secs" disables this > message. > > Apr 18 07:42:51 10 kernel: glusterfsd D ffffffff8160b3c0 > > 0 14522 1 0x00000083 > > Apr 18 07:42:51 10 kernel: ffff882015a63a28 0000000000000082 > > 0000000000000000 0000000000000000 > > Apr 18 07:42:51 10 kernel: ffff882015a639b8 ffffffffa02d91ef > > ffff882015a639d8 0000000000000246 > > Apr 18 07:42:51 10 kernel: ffff880e70491af8 ffff882015a63fd8 > > 000000000000fb88 ffff880e70491af8 > > Apr 18 07:42:51 10 kernel: Call Trace: > > Apr 18 07:42:51 10 kernel: [] ? > > xfs_buf_cond_lock+0x2f/0xc0 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > schedule_timeout+0x215/0x2e0 > > Apr 18 07:42:51 10 kernel: [] ? > > kmem_zone_alloc+0x77/0xf0 [xfs] > > Apr 18 07:42:51 10 kernel: [] > __down+0x72/0xb0 > > Apr 18 07:42:51 10 kernel: [] ? > > _xfs_buf_find+0x102/0x280 [xfs] > > Apr 18 07:42:51 10 kernel: [] down+0x41/0x50 > > Apr 18 07:42:51 10 kernel: [] > > xfs_buf_lock+0x53/0x110 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > _xfs_buf_find+0x102/0x280 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_buf_get+0x6b/0x1a0 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_buf_read+0x2c/0x100 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_trans_read_buf+0x1f8/0x400 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_read_agi+0x74/0x100 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_iunlink+0x5b/0x180 [xfs] > > Apr 18 07:42:51 10 kernel: [] ? > > current_fs_time+0x27/0x30 > > Apr 18 07:42:51 10 kernel: [] ? > > xfs_trans_ichgtime+0x27/0xa0 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_droplink+0x5b/0x70 [xfs] > > Apr 18 07:42:51 10 kernel: [] > > xfs_remove+0x27e/0x3a0 [xfs] > > Apr 18 07:42:51 10 kernel: [] ? > > generic_permission+0x23/0xb0 > > Apr 18 07:42:51 10 kernel: [] > > xfs_vn_unlink+0x48/0x90 [xfs] > > Apr 18 07:42:51 10 kernel: [] > vfs_unlink+0x9f/0xe0 > > Apr 18 07:42:51 10 kernel: [] ? > > lookup_hash+0x3a/0x50 > > Apr 18 07:42:51 10 kernel: [] > > do_unlinkat+0x183/0x1c0 > > Apr 18 07:42:51 10 kernel: [] ? > > syscall_trace_enter+0x1d8/0x1e0 > > Apr 18 07:42:51 10 kernel: [] > sys_unlink+0x16/0x20 > > Apr 18 07:42:51 10 kernel: [] > tracesys+0xd9/0xde > > > > Thank you. > > > > > > 2013/4/17 Eric Sandeen > > >> > > > > On Apr 16, 2013, at 8:48 PM, 符永涛 > > > >> wrote: > > > >> Hi Brain, > >> Can I change as following? > > > > ASSERTS are no-ops in a non-debug kernel, so this won't > > change any behavior. I hope we'll know more if we get new > > traces from your patched kernel.... > > > > Eric > > > >> --- a/xfs_inode.c > >> +++ b/xfs_inode.c > >> @@ -1773,6 +1773,8 @@ xfs_iunlink_remove( > >> if (last_ibp != NULL) { > >> xfs_trans_brelse(tp, > >> last_ibp); > >> } > >> + ASSERT(next_agino != NULLAGINO); > >> + ASSERT(next_agino != 0); > >> next_ino = XFS_AGINO_TO_INO(mp, > >> agno, next_agino); > >> error = xfs_inotobp(mp, tp, > >> next_ino, &last_dip, > >> &last_ibp, > >> &last_offset, 0); > >> @@ -1783,8 +1785,6 @@ xfs_iunlink_remove( > >> return error; > >> } > >> next_agino = > >> be32_to_cpu(last_dip->di_next_unlinked); > >> - ASSERT(next_agino != NULLAGINO); > >> - ASSERT(next_agino != 0); > >> } > >> /* > >> * Now last_ibp points to the buffer > >> previous to us on > >> > >> Thank you. > >> > >> > >> 2013/4/17 符永涛 > >> >> > >> > >> Hi Brain, > >> If it is because NULLAGINO is passed in to > xfs_inotobp(). > >> Can I move the following two lines before > xfs_inotobp? > >> > >> For example: > >> > >> 1767 while (next_agino != agino) { > >> 1768 /* > >> 1769 * If the last inode > >> wasn't the one pointing to > >> 1770 * us, then release its > >> buffer since we're not > >> 1771 * going to do anything > >> with it. > >> 1772 */ > >> 1773 if (last_ibp != NULL) { > >> 1774 > >> xfs_trans_brelse(tp, last_ibp); > >> 1775 } > >> 1776 next_ino = > >> XFS_AGINO_TO_INO(mp, agno, next_agino); > >> + ASSERT(next_agino != > >> NULLAGINO); > >> + ASSERT(next_agino > != 0); > >> 1777 error = xfs_inotobp(mp, > >> tp, next_ino, &last_dip, > >> 1778 > >> &last_ibp, &last_offset, 0); > >> 1779 if (error) { > >> 1780 xfs_warn(mp, > >> 1781 "%s: > >> xfs_inotobp() returned error %d.", > >> 1782 > __func__, > >> error); > >> 1783 return error; > >> 1784 } > >> 1785 next_agino = > >> be32_to_cpu(last_dip->di_next_unlinked); > >> - > //ASSERT(next_agino != > >> NULLAGINO); > >> - > //ASSERT(next_agino != 0); > >> 1788 } > >> I don't understand xfs well and correct me if I'm > >> totally wrong. > >> Thank you very much. > >> > >> > >> 2013/4/17 符永涛 > >> >> > >> > >> Hi Brain, > >> I want to ask a question, according to the > >> shutdown trace. The ino in xfs_iunlink_remove > >> is 0x113, why xfs_imap got ino=0xffffffff ? > >> > >> --- xfs_imap -- > >> > module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return > >> -- return=0x16 > >> vars: mp=0xffff882017a50800 tp=0xffff881c81797c70 > >> ino=0xffffffff > >> > >> --- xfs_iunlink_remove -- > >> > module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1680").return > >> -- return=0x16 > >> vars: tp=0xffff881c81797c70 ip=0xffff881003c13c00 > >> next_ino=? mp=? agi=? dip=? > >> agibp=0xffff880109b47e20 ibp=? agno=? agino=? > >> next_agino=? last_ibp=? > >> last_dip=0xffff882000000000 bucket_index=? > >> offset=? last_offset=0xffffffffffff8810 error=? > >> __func__=[...] > >> ip: i_ino = 0x113, i_flags = 0x0 > >> > >> Thank you. > >> > >> > >> > >> 2013/4/17 符永涛 > >> >> > >> > >> Hi Brain, > >> Thank you for your update, and I have applied > >> your last kernel patch. However it is not > easy > >> to reproduce especially in out test > >> environment. Till now is not happens again. > >> I'll update the kernel patch now. BTW is > there > >> any findings in the logs of previous thread? > >> > http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > >> I guess it tend to happen during glusterfs > >> rebalance because glusterfs moves a lot of > >> file from one server to another and then > >> unlink it. > >> > >> Thank you. > >> > >> > >> 2013/4/17 Brian Foster > > >> >> > >> > >> On 04/16/2013 12:24 PM, Dave Chinner > wrote: > >> > On Mon, Apr 15, 2013 at 07:14:39PM > >> -0400, Brian Foster wrote: > >> >> Hi, > >> >> > >> >> Thanks for the data in the > previous thread: > >> >> > >> >> > >> > http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > >> >> > >> ... > >> >> > >> >> echo 1 > > >> > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable > >> >> echo 1 > > >> > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable > >> >> ... reproduce ... > >> >> cat > >> /sys/kernel/debug/tracing/trace > > trace.output > >> > > >> > It's better to use trace-cmd for this. > >> it will result in less > >> > dropped events. i.e.: > >> > > >> > $ trace-cmd record -e > xfs_iunlink\* > >> > ... reproduce ... > >> > ^C > >> > $ trace-cmd report > trace.output > >> > > >> >> --- a/fs/xfs/linux-2.6/xfs_trace.h > >> >> +++ b/fs/xfs/linux-2.6/xfs_trace.h > >> >> @@ -581,6 +581,8 @@ > >> DEFINE_INODE_EVENT(xfs_file_fsync); > >> ... > >> > > >> > I would suggest that the the tracing > >> shoul dbe at entry of the > >> > function, otherwise we won't get a > >> tracepoint for the operation that > >> > triggers the shutdown. (That's the > >> reason most tracepoints in XFS > >> > are at function entry...) > >> > > >> > >> Good points, thanks Dave. A v2 that pulls > >> up the tracepoints towards > >> function entry is appended. > >> > >> Brian > >> > >> From > >> 280943e78ebe0b97a774cba51e7815c42f044b55 > >> Mon Sep 17 00:00:00 2001 > >> From: Brian Foster > > >> >> > >> Date: Mon, 15 Apr 2013 18:16:24 -0400 > >> Subject: [PATCH v2] xfs: add tracepoints > >> for xfs_iunlink and > >> xfs_iunlink_remove > >> > >> --- > >> fs/xfs/linux-2.6/xfs_trace.h | 2 ++ > >> fs/xfs/xfs_inode.c | 4 ++++ > >> 2 files changed, 6 insertions(+), 0 > >> deletions(-) > >> > >> diff --git a/fs/xfs/linux-2.6/xfs_trace.h > >> b/fs/xfs/linux-2.6/xfs_trace.h > >> index adc6ec4..338a0f9 100644 > >> --- a/fs/xfs/linux-2.6/xfs_trace.h > >> +++ b/fs/xfs/linux-2.6/xfs_trace.h > >> @@ -583,6 +583,8 @@ > >> DEFINE_INODE_EVENT(xfs_file_fsync); > >> DEFINE_INODE_EVENT(xfs_destroy_inode); > >> DEFINE_INODE_EVENT(xfs_dirty_inode); > >> DEFINE_INODE_EVENT(xfs_clear_inode); > >> +DEFINE_INODE_EVENT(xfs_iunlink); > >> +DEFINE_INODE_EVENT(xfs_iunlink_remove); > >> > >> DEFINE_INODE_EVENT(xfs_dquot_dqalloc); > >> DEFINE_INODE_EVENT(xfs_dquot_dqdetach); > >> diff --git a/fs/xfs/xfs_inode.c > >> b/fs/xfs/xfs_inode.c > >> index 19900f0..d705c77 100644 > >> --- a/fs/xfs/xfs_inode.c > >> +++ b/fs/xfs/xfs_inode.c > >> @@ -1615,6 +1615,8 @@ xfs_iunlink( > >> > >> mp = tp->t_mountp; > >> > >> + trace_xfs_iunlink(ip); > >> + > >> /* > >> * Get the agi buffer first. It > >> ensures lock ordering > >> * on the list. > >> @@ -1694,6 +1696,8 @@ xfs_iunlink_remove( > >> mp = tp->t_mountp; > >> agno = XFS_INO_TO_AGNO(mp, > ip->i_ino); > >> > >> + trace_xfs_iunlink_remove(ip); > >> + > >> /* > >> * Get the agi buffer first. It > >> ensures lock ordering > >> * on the list. > >> -- > >> 1.7.7.6 > >> > >> > >> > >> > >> -- > >> 符永涛 > >> > >> > >> > >> > >> -- > >> 符永涛 > >> > >> > >> > >> > >> -- > >> 符永涛 > >> > >> > >> > >> > >> -- > >> 符永涛 > >> _______________________________________________ > >> xfs mailing list > >> xfs@oss.sgi.com > > > >> http://oss.sgi.com/mailman/listinfo/xfs > > > > > > > > > > -- > > 符永涛 > > > > > > > > > > -- > > 符永涛 > > > > > > > > > > -- > > 符永涛 > > > > > -- > 符永涛 From yongtaofu@gmail.com Fri Apr 19 01:40:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 844417CBF for ; Fri, 19 Apr 2013 01:40:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6421D304067 for ; Thu, 18 Apr 2013 23:40:25 -0700 (PDT) X-ASG-Debug-ID: 1366353621-04cbb057f7374540001-NocioJ Received: from mail-ie0-f169.google.com (mail-ie0-f169.google.com [209.85.223.169]) by cuda.sgi.com with ESMTP id LdjjQ3fSmZhwBjlJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 18 Apr 2013 23:40:21 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] Received: by mail-ie0-f169.google.com with SMTP id ar20so4422725iec.0 for ; Thu, 18 Apr 2013 23:40:21 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=QoHCQu6vKSgWn6TpabKF9g+B+QeO4H0MAjnkhL/YS6Y=; b=FhJLKBag+HMnAD6oMxXkUykhjoHBjjCoh85xFzOuXQ8vgjasNgNv9ijltcRgarQPdv pLoHgGOo6ok4fzTo0KX4Qxo19D74zkpLenshBO3kZf5JImaLjgrz37dyv5Xd3Y+wRWz6 0BteN69GGVQMS0XrbKeKAdgBGFtjmSGAvclFgAuYDx6zt02I6PFjOTiJ69P36u/pgei7 4KQ0EErX+AEbusNccFzGiFHWdSolC5523Vv74rZnVyw92HPv7KvtnUsYzvNtPWiPMyvC tS7kRcA2Qtn8prnP/uGlrXpNvuaLmGjLly2sNTKh/fr53Cqw9MorIKyDIHFgvMfz2MQz NAKQ== MIME-Version: 1.0 X-Received: by 10.50.51.167 with SMTP id l7mr14775874igo.11.1366353621261; Thu, 18 Apr 2013 23:40:21 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Thu, 18 Apr 2013 23:40:21 -0700 (PDT) In-Reply-To: <51705EC4.4000306@redhat.com> References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> Date: Fri, 19 Apr 2013 14:40:21 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Brian Foster Cc: Eric Sandeen , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340b5f3ba92504dab0fe1f X-Barracuda-Connect: mail-ie0-f169.google.com[209.85.223.169] X-Barracuda-Start-Time: 1366353621 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128544 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 --14dae9340b5f3ba92504dab0fe1f Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brian and Eric, I have applied your kernel path v2(add unlink trace) to kernel-2.6.32-279.19.1.el6.x86_64.rpmin out test cluster and start testing again. Any progress will let you known. Thank you. 2013/4/19 Brian Foster > On 04/18/2013 11:23 AM, =B7=FB=D3=C0=CC=CE wrote: > > Hi Brian and Eric, > > The shutdown is not easy to produce but finally right now 2 of our > > servers in our test cluster xfs was shutdown. > > > > Understood. We've been trying very hard to reproduce ourselves to make > it easier to debug, but haven't been able to reproduce at all so far. > This process allows us to make _some_ progress on the issue, even if it > is slower going than we'd like... ;) > > > the trace output as following > > > https://docs.google.com/file/d/0B7n2C4T5tfNCLXRYUWJ0b19JcWc/edit?usp=3Dsh= aring > > > > Thanks again for the data. The racing behavior Eric called out (nice > catch!) in his last mail lit up some light bulbs internally with regard > to some old locking issues triggered by XFS in the 6.3 kernel. The > following bug serves as an example: > > https://bugzilla.redhat.com/show_bug.cgi?id=3D852847 > > ... the fix for which went into the 2.6.32-279.19.1 6.3.z release. Could > you move some or all of your servers to this kernel[1] and see how it > goes? The best case is it resolves the problem, worst case we carry on > debugging from there... > > Brian > > [1] - > > http://mirror.linux.duke.edu/pub/centos/6.3/updates/x86_64/Packages/kerne= l-2.6.32-279.19.1.el6.x86_64.rpm > > > Sorry but the systemtap is interrupt and I didn't noticed that so I > > didn't get systemtap logs. > > > > /var/log/message is same as before > > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() > > returned error 22. > > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned > > error 22 > > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called > > from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D > > 0xffffffffa02d44aa > > Apr 18 22:43:14 10 kernel: XFS (sdb): I/O Error Detected. Shutting down > > filesystem > > Apr 18 22:43:14 10 kernel: XFS (sdb): Please umount the filesystem and > > rectify the problem(s) > > Apr 18 22:43:20 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > > > The metadump file is large I'll share it to you soon. > > > > > > 2013/4/18 Brian Foster > > > > > On 04/18/2013 04:25 AM, =B7=FB=D3=C0=CC=CE wrote: > > > Hi Brian and Eric, > > > Can I change as following to bypass it? > > > > This is probably not a wise thing to do. The problem we're seeing > here > > is indicative of a potentially larger problem than this particular > error > > path. An inode is being unlinked and inactivated, but we aren't > finding > > on the list where we expect it to be. Killing the error return > doesn't > > eliminate the larger problem. > > > > So while changes could end up being made in this area as part of a > fix, > > I would not suggest making any changes beyond those designed to hel= p > > debug until we have a better idea of root cause. > > > > Brian > > > > > --- a/xfs_inode.c > > > +++ b/xfs_inode.c > > > @@ -1764,7 +1764,7 @@ xfs_iunlink_remove( > > > */ > > > next_agino =3D > > be32_to_cpu(agi->agi_unlinked[bucket_index]); > > > last_ibp =3D NULL; > > > - while (next_agino !=3D agino) { > > > + while (next_agino !=3D agino && next_agino !=3D > > NULLAGINO) { > > > /* > > > * If the last inode wasn't the one > > pointing to > > > * us, then release its buffer since we'r= e > not > > > @@ -1786,6 +1786,14 @@ xfs_iunlink_remove( > > > ASSERT(next_agino !=3D NULLAGINO); > > > ASSERT(next_agino !=3D 0); > > > } > > > + if (next_agino =3D=3D NULLAGINO) { > > > + /* > > > + *After search the list for the inode > > being free > > > + *we still can't find it. > > > + */ > > > + xfs_err(mp, "%s ino %lld not found in > unlinked > > > list.", > > > + __func__, (unsigned long > > > long)ip->i_ino); > > > + } > > > /* > > > * Now last_ibp points to the buffer previous to > us on > > > * the unlinked list. Pull us from the list. > > > @@ -1810,16 +1818,20 @@ xfs_iunlink_remove( > > > } else { > > > xfs_trans_brelse(tp, ibp); > > > } > > > - /* > > > - * Point the previous inode on the list to the > > next inode. > > > - */ > > > - last_dip->di_next_unlinked =3D > cpu_to_be32(next_agino); > > > - ASSERT(next_agino !=3D 0); > > > - offset =3D last_offset + offsetof(xfs_dinode_t, > > > di_next_unlinked); > > > - xfs_trans_inode_buf(tp, last_ibp); > > > - xfs_trans_log_buf(tp, last_ibp, offset, > > > - (offset + sizeof(xfs_agino_t) - > 1)); > > > - xfs_inobp_check(mp, last_ibp); > > > + if (next_agino !=3D NULLAGINO) { > > > + /* > > > + * If only find the inode being free then > > we modify > > > + * the unlinked list. > > > + * Point the previous inode on the list to > the > > > next inode. > > > + */ > > > + last_dip->di_next_unlinked =3D > > > cpu_to_be32(next_agino); > > > + ASSERT(next_agino !=3D 0); > > > + offset =3D last_offset + > offsetof(xfs_dinode_t, > > > di_next_unlinked); > > > + xfs_trans_inode_buf(tp, last_ibp); > > > + xfs_trans_log_buf(tp, last_ibp, offset, > > > + (offset + > > sizeof(xfs_agino_t) > > > - 1)); > > > + xfs_inobp_check(mp, last_ibp); > > > + } > > > } > > > return 0; > > > } > > > > > > Thank you. > > > > > > > > > 2013/4/18 =B7=FB=D3=C0=CC=CE > > >> > > > > > > Hi Brain and Eric, > > > If the problem is the agno can't be found in the unlinked > > list. Can > > > we just bypass it instead of passing ino=3D0xffffffff to > > xfs_inotobp? > > > Thank you. > > > > > > > > > 2013/4/18 =B7=FB=D3=C0=CC=CE > > >> > > > > > > Hi Eric, > > > The shutdown issue is still not reproduced yet. But I get > the > > > following error today during test. > > > > > > Apr 18 07:42:51 10 kernel: Call Trace: > > > Apr 18 07:42:51 10 kernel: [] ? > > > xfs_buf_cond_lock+0x2f/0xc0 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > > schedule_timeout+0x215/0x2e0 > > > Apr 18 07:42:51 10 kernel: [] ? > > > kmem_zone_alloc+0x77/0xf0 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > __down+0x72/0xb0 > > > Apr 18 07:42:51 10 kernel: [] ? > > > _xfs_buf_find+0x102/0x280 [xfs] > > > Apr 18 07:42:51 10 kernel: "echo 0 > > > > /proc/sys/kernel/hung_task_timeout_secs" disables this > > message. > > > Apr 18 07:42:51 10 kernel: glusterfsd D ffffffff8160b3= c0 > > > 0 14522 1 0x00000083 > > > Apr 18 07:42:51 10 kernel: ffff882015a63a28 > 0000000000000082 > > > 0000000000000000 0000000000000000 > > > Apr 18 07:42:51 10 kernel: ffff882015a639b8 > ffffffffa02d91ef > > > ffff882015a639d8 0000000000000246 > > > Apr 18 07:42:51 10 kernel: ffff880e70491af8 > ffff882015a63fd8 > > > 000000000000fb88 ffff880e70491af8 > > > Apr 18 07:42:51 10 kernel: Call Trace: > > > Apr 18 07:42:51 10 kernel: [] ? > > > xfs_buf_cond_lock+0x2f/0xc0 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > > schedule_timeout+0x215/0x2e0 > > > Apr 18 07:42:51 10 kernel: [] ? > > > kmem_zone_alloc+0x77/0xf0 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > __down+0x72/0xb0 > > > Apr 18 07:42:51 10 kernel: [] ? > > > _xfs_buf_find+0x102/0x280 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > down+0x41/0x50 > > > Apr 18 07:42:51 10 kernel: [] > > > xfs_buf_lock+0x53/0x110 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > > _xfs_buf_find+0x102/0x280 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > > xfs_buf_get+0x6b/0x1a0 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > > xfs_buf_read+0x2c/0x100 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > > xfs_trans_read_buf+0x1f8/0x400 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > > xfs_read_agi+0x74/0x100 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > > xfs_iunlink+0x5b/0x180 [xfs] > > > Apr 18 07:42:51 10 kernel: [] ? > > > current_fs_time+0x27/0x30 > > > Apr 18 07:42:51 10 kernel: [] ? > > > xfs_trans_ichgtime+0x27/0xa0 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > > xfs_droplink+0x5b/0x70 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > > xfs_remove+0x27e/0x3a0 [xfs] > > > Apr 18 07:42:51 10 kernel: [] ? > > > generic_permission+0x23/0xb0 > > > Apr 18 07:42:51 10 kernel: [] > > > xfs_vn_unlink+0x48/0x90 [xfs] > > > Apr 18 07:42:51 10 kernel: [] > > vfs_unlink+0x9f/0xe0 > > > Apr 18 07:42:51 10 kernel: [] ? > > > lookup_hash+0x3a/0x50 > > > Apr 18 07:42:51 10 kernel: [] > > > do_unlinkat+0x183/0x1c0 > > > Apr 18 07:42:51 10 kernel: [] ? > > > syscall_trace_enter+0x1d8/0x1e0 > > > Apr 18 07:42:51 10 kernel: [] > > sys_unlink+0x16/0x20 > > > Apr 18 07:42:51 10 kernel: [] > > tracesys+0xd9/0xde > > > > > > Thank you. > > > > > > > > > 2013/4/17 Eric Sandeen > > > > >= > > > > > > > On Apr 16, 2013, at 8:48 PM, =B7=FB=D3=C0=CC=CE > > > > > > >> wrote: > > > > > >> Hi Brain, > > >> Can I change as following? > > > > > > ASSERTS are no-ops in a non-debug kernel, so this won= 't > > > change any behavior. I hope we'll know more if we ge= t > new > > > traces from your patched kernel.... > > > > > > Eric > > > > > >> --- a/xfs_inode.c > > >> +++ b/xfs_inode.c > > >> @@ -1773,6 +1773,8 @@ xfs_iunlink_remove( > > >> if (last_ibp !=3D NULL) { > > >> xfs_trans_brelse(tp, > > >> last_ibp); > > >> } > > >> + ASSERT(next_agino !=3D > NULLAGINO); > > >> + ASSERT(next_agino !=3D 0); > > >> next_ino =3D > XFS_AGINO_TO_INO(mp, > > >> agno, next_agino); > > >> error =3D xfs_inotobp(mp, tp= , > > >> next_ino, &last_dip, > > >> &last_ib= p, > > >> &last_offset, 0); > > >> @@ -1783,8 +1785,6 @@ xfs_iunlink_remove( > > >> return error; > > >> } > > >> next_agino =3D > > >> be32_to_cpu(last_dip->di_next_unlinked); > > >> - ASSERT(next_agino !=3D > NULLAGINO); > > >> - ASSERT(next_agino !=3D 0); > > >> } > > >> /* > > >> * Now last_ibp points to the buffer > > >> previous to us on > > >> > > >> Thank you. > > >> > > >> > > >> 2013/4/17 =B7=FB=D3=C0=CC=CE > > > >> > >> > > >> > > >> Hi Brain, > > >> If it is because NULLAGINO is passed in to > > xfs_inotobp(). > > >> Can I move the following two lines before > > xfs_inotobp? > > >> > > >> For example: > > >> > > >> 1767 while (next_agino !=3D agin= o) { > > >> 1768 /* > > >> 1769 * If the last inod= e > > >> wasn't the one pointing to > > >> 1770 * us, then release > its > > >> buffer since we're not > > >> 1771 * going to do > anything > > >> with it. > > >> 1772 */ > > >> 1773 if (last_ibp !=3D > NULL) { > > >> 1774 > > >> xfs_trans_brelse(tp, last_ibp); > > >> 1775 } > > >> 1776 next_ino =3D > > >> XFS_AGINO_TO_INO(mp, agno, next_agino); > > >> + ASSERT(next_agin= o > !=3D > > >> NULLAGINO); > > >> + ASSERT(next_agin= o > > !=3D 0); > > >> 1777 error =3D > xfs_inotobp(mp, > > >> tp, next_ino, &last_dip, > > >> 1778 > > >> &last_ibp, &last_offset, 0); > > >> 1779 if (error) { > > >> 1780 xfs_warn(mp= , > > >> 1781 "%s= : > > >> xfs_inotobp() returned error %d.", > > >> 1782 > > __func__, > > >> error); > > >> 1783 return erro= r; > > >> 1784 } > > >> 1785 next_agino =3D > > >> be32_to_cpu(last_dip->di_next_unlinked); > > >> - > > //ASSERT(next_agino !=3D > > >> NULLAGINO); > > >> - > > //ASSERT(next_agino !=3D 0); > > >> 1788 } > > >> I don't understand xfs well and correct me if I'= m > > >> totally wrong. > > >> Thank you very much. > > >> > > >> > > >> 2013/4/17 =B7=FB=D3=C0=CC=CE > > > >> > >> > > >> > > >> Hi Brain, > > >> I want to ask a question, according to the > > >> shutdown trace. The ino in xfs_iunlink_remo= ve > > >> is 0x113, why xfs_imap got ino=3D0xffffffff = ? > > >> > > >> --- xfs_imap -- > > >> > > module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return > > >> -- return=3D0x16 > > >> vars: mp=3D0xffff882017a50800 > tp=3D0xffff881c81797c70 > > >> ino=3D0xffffffff > > >> > > >> --- xfs_iunlink_remove -- > > >> > > module("xfs").function("xfs_iunlink_remove@fs > /xfs/xfs_inode.c:1680").return > > >> -- return=3D0x16 > > >> vars: tp=3D0xffff881c81797c70 > ip=3D0xffff881003c13c00 > > >> next_ino=3D? mp=3D? agi=3D? dip=3D? > > >> agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? = agino=3D? > > >> next_agino=3D? last_ibp=3D? > > >> last_dip=3D0xffff882000000000 bucket_index= =3D? > > >> offset=3D? last_offset=3D0xffffffffffff8810 > error=3D? > > >> __func__=3D[...] > > >> ip: i_ino =3D 0x113, i_flags =3D 0x0 > > >> > > >> Thank you. > > >> > > >> > > >> > > >> 2013/4/17 =B7=FB=D3=C0=CC=CE > > > >> > >> > > >> > > >> Hi Brain, > > >> Thank you for your update, and I have > applied > > >> your last kernel patch. However it is no= t > > easy > > >> to reproduce especially in out test > > >> environment. Till now is not happens > again. > > >> I'll update the kernel patch now. BTW is > > there > > >> any findings in the logs of previous > thread? > > >> > > http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > > >> I guess it tend to happen during gluster= fs > > >> rebalance because glusterfs moves a lot = of > > >> file from one server to another and then > > >> unlink it. > > >> > > >> Thank you. > > >> > > >> > > >> 2013/4/17 Brian Foster > > > > >> > >> > > >> > > >> On 04/16/2013 12:24 PM, Dave Chinner > > wrote: > > >> > On Mon, Apr 15, 2013 at 07:14:39PM > > >> -0400, Brian Foster wrote: > > >> >> Hi, > > >> >> > > >> >> Thanks for the data in the > > previous thread: > > >> >> > > >> >> > > >> > > http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > > >> >> > > >> ... > > >> >> > > >> >> echo 1 > > > >> > > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable > > >> >> echo 1 > > > >> > > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable > > >> >> ... reproduce ... > > >> >> cat > > >> /sys/kernel/debug/tracing/trace > > > trace.output > > >> > > > >> > It's better to use trace-cmd for > this. > > >> it will result in less > > >> > dropped events. i.e.: > > >> > > > >> > $ trace-cmd record -e > > xfs_iunlink\* > > >> > ... reproduce ... > > >> > ^C > > >> > $ trace-cmd report > > trace.output > > >> > > > >> >> --- a/fs/xfs/linux-2.6/xfs_trace.= h > > >> >> +++ b/fs/xfs/linux-2.6/xfs_trace.= h > > >> >> @@ -581,6 +581,8 @@ > > >> DEFINE_INODE_EVENT(xfs_file_fsync); > > >> ... > > >> > > > >> > I would suggest that the the traci= ng > > >> shoul dbe at entry of the > > >> > function, otherwise we won't get a > > >> tracepoint for the operation that > > >> > triggers the shutdown. (That's the > > >> reason most tracepoints in XFS > > >> > are at function entry...) > > >> > > > >> > > >> Good points, thanks Dave. A v2 that > pulls > > >> up the tracepoints towards > > >> function entry is appended. > > >> > > >> Brian > > >> > > >> From > > >> > 280943e78ebe0b97a774cba51e7815c42f044b55 > > >> Mon Sep 17 00:00:00 2001 > > >> From: Brian Foster > > > > >> > >> > > >> Date: Mon, 15 Apr 2013 18:16:24 -040= 0 > > >> Subject: [PATCH v2] xfs: add > tracepoints > > >> for xfs_iunlink and > > >> xfs_iunlink_remove > > >> > > >> --- > > >> fs/xfs/linux-2.6/xfs_trace.h | 2 > ++ > > >> fs/xfs/xfs_inode.c | 4 > ++++ > > >> 2 files changed, 6 insertions(+), 0 > > >> deletions(-) > > >> > > >> diff --git > a/fs/xfs/linux-2.6/xfs_trace.h > > >> b/fs/xfs/linux-2.6/xfs_trace.h > > >> index adc6ec4..338a0f9 100644 > > >> --- a/fs/xfs/linux-2.6/xfs_trace.h > > >> +++ b/fs/xfs/linux-2.6/xfs_trace.h > > >> @@ -583,6 +583,8 @@ > > >> DEFINE_INODE_EVENT(xfs_file_fsync); > > >> > DEFINE_INODE_EVENT(xfs_destroy_inode); > > >> DEFINE_INODE_EVENT(xfs_dirty_inode)= ; > > >> DEFINE_INODE_EVENT(xfs_clear_inode)= ; > > >> +DEFINE_INODE_EVENT(xfs_iunlink); > > >> > +DEFINE_INODE_EVENT(xfs_iunlink_remove); > > >> > > >> > DEFINE_INODE_EVENT(xfs_dquot_dqalloc); > > >> > DEFINE_INODE_EVENT(xfs_dquot_dqdetach); > > >> diff --git a/fs/xfs/xfs_inode.c > > >> b/fs/xfs/xfs_inode.c > > >> index 19900f0..d705c77 100644 > > >> --- a/fs/xfs/xfs_inode.c > > >> +++ b/fs/xfs/xfs_inode.c > > >> @@ -1615,6 +1615,8 @@ xfs_iunlink( > > >> > > >> mp =3D tp->t_mountp; > > >> > > >> + trace_xfs_iunlink(ip); > > >> + > > >> /* > > >> * Get the agi buffer first. > It > > >> ensures lock ordering > > >> * on the list. > > >> @@ -1694,6 +1696,8 @@ > xfs_iunlink_remove( > > >> mp =3D tp->t_mountp; > > >> agno =3D XFS_INO_TO_AGNO(mp, > > ip->i_ino); > > >> > > >> + trace_xfs_iunlink_remove(ip)= ; > > >> + > > >> /* > > >> * Get the agi buffer first. > It > > >> ensures lock ordering > > >> * on the list. > > >> -- > > >> 1.7.7.6 > > >> > > >> > > >> > > >> > > >> -- > > >> =B7=FB=D3=C0=CC=CE > > >> > > >> > > >> > > >> > > >> -- > > >> =B7=FB=D3=C0=CC=CE > > >> > > >> > > >> > > >> > > >> -- > > >> =B7=FB=D3=C0=CC=CE > > >> > > >> > > >> > > >> > > >> -- > > >> =B7=FB=D3=C0=CC=CE > > >> _______________________________________________ > > >> xfs mailing list > > >> xfs@oss.sgi.com > > > > > >> http://oss.sgi.com/mailman/listinfo/xfs > > > > > > > > > > > > > > > -- > > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > > > > > > -- > > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > > > > > > -- > > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > --=20 =B7=FB=D3=C0=CC=CE --14dae9340b5f3ba92504dab0fe1f Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brian and Eric,

I have applied y= our kernel path v2(add unlink trace) to kernel-2.6.32-279.19.1.el6.x86_64.rpm in out = test cluster and start testing again.
Any progress will let you known. Thank you.


2013/4/19 Brian Foster <bfo= ster@redhat.com>
On 04/18/2013 11:23 AM, = =B7=FB=D3=C0=CC=CE wrote:
> Hi Brian and Eric,
> The shutdown is not easy to produce but finall= y right now 2 of our
> servers in our test cluster xfs was shutdown.
>

Understood. We've been trying very hard to reproduce ourselves to= make
it easier to debug, but haven't been able to reproduce at all so far. This process allows us to make _some_ progress on the issue, even if it
is slower going than we'd like... ;)
Thanks again for the data. The racing behavior Eric called out (nice<= br> catch!) in his last mail lit up some light bulbs internally with regard
to some old locking issues triggered by XFS in the 6.3 kernel. The
following bug serves as an example:

https://bugzilla.redhat.com/show_bug.cgi?id=3D852847

... the fix for which went into the 2.6.32-279.19.1 6.3.z release. Could you move some or all of your servers to this kernel[1] and see how it
goes? The best case is it resolves the problem, worst case we carry on
debugging from there...

Brian

[1] -
http://mirror.= linux.duke.edu/pub/centos/6.3/updates/x86_64/Packages/kernel-2.6.32-279.19.= 1.el6.x86_64.rpm

> Sorry but the systemtap is interrupt and I didn't noticed that so = I
> didn't get systemtap logs.
>
> /var/log/message is same as before
> Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp(= )
> returned error 22.
> Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned=
> error 22
> Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) calle= d
> from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return address =3D=
> 0xffffffffa02d44aa
> Apr 18 22:43:14 10 kernel: XFS (sdb): I/O Error Detected. Shutting dow= n
> filesystem
> Apr 18 22:43:14 10 kernel: XFS (sdb): Please umount the filesystem and=
> rectify the problem(s)
> Apr 18 22:43:20 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.=
>
> The metadump file is large I'll share it to you soon.
>
>
> 2013/4/18 Brian Foster <bfoster@redhat.com <mailto:bf= oster@redhat.com>>
>
>     On 04/18/2013 04:25 AM, =B7=FB=D3=C0=CC=CE wrote:
>     > Hi Brian and Eric,
>     > Can I change as following to bypass it?
>
>     This is probably not a wise thing to do. The problem we&= #39;re seeing here
>     is indicative of a potentially larger problem than this = particular error
>     path. An inode is being unlinked and inactivated, but we= aren't finding
>     on the list where we expect it to be. Killing the error = return doesn't
>     eliminate the larger problem.
>
>     So while changes could end up being made in this area as= part of a fix,
>     I would not suggest making any changes beyond those desi= gned to help
>     debug until we have a better idea of root cause.
>
>     Brian
>
>     > --- a/xfs_inode.c
>     > +++ b/xfs_inode.c
>     > @@ -1764,7 +1764,7 @@ xfs_iunlink_remove(
>     >               &n= bsp;  */
>     >               &n= bsp; next_agino =3D
>     be32_to_cpu(agi->agi_unlinked[bucket_index]);
>     >               &n= bsp; last_ibp =3D NULL;
>     > -               = while (next_agino !=3D agino) {
>     > +               = while (next_agino !=3D agino && next_agino !=3D
>     NULLAGINO) {
>     >               &n= bsp;         /*
>     >               &n= bsp;          * If the last inode wasn't the o= ne
>     pointing to
>     >               &n= bsp;          * us, then release its buffer since = we're not
>     > @@ -1786,6 +1786,14 @@ xfs_iunlink_remove(
>     >               &n= bsp;         ASSERT(next_agino !=3D NULLAGINO);
>     >               &n= bsp;         ASSERT(next_agino !=3D 0);
>     >               &n= bsp; }
>     > +               = if (next_agino =3D=3D NULLAGINO) {
>     > +               =         /*
>     > +               =          *After search the list for the inode
>     being free
>     > +               =          *we still can't find it.
>     > +               =          */
>     > +               =         xfs_err(mp, "%s ino %lld not found in unli= nked
>     > list.",
>     > +               =                      = ;__func__, (unsigned long
>     > long)ip->i_ino);
>     > +               = }
>     >               &n= bsp; /*
>     >               &n= bsp;  * Now last_ibp points to the buffer previous to us on
>     >               &n= bsp;  * the unlinked list.  Pull us from the list.
>     > @@ -1810,16 +1818,20 @@ xfs_iunlink_remove(
>     >               &n= bsp; } else {
>     >               &n= bsp;         xfs_trans_brelse(tp, ibp);
>     >               &n= bsp; }
>     > -               = /*
>     > -               =  * Point the previous inode on the list to the
>     next inode.
>     > -               =  */
>     > -               = last_dip->di_next_unlinked =3D cpu_to_be32(next_agino);
>     > -               = ASSERT(next_agino !=3D 0);
>     > -               = offset =3D last_offset + offsetof(xfs_dinode_t,
>     > di_next_unlinked);
>     > -               = xfs_trans_inode_buf(tp, last_ibp);
>     > -               = xfs_trans_log_buf(tp, last_ibp, offset,
>     > -               =                   (offset + si= zeof(xfs_agino_t) - 1));
>     > -               = xfs_inobp_check(mp, last_ibp);
>     > +               = if (next_agino !=3D NULLAGINO) {
>     > +               =         /*
>     > +               =         * If only find the inode being free then
>     we modify
>     > +               =         * the unlinked list.
>     > +               =         * Point the previous inode on the list to the >     > next inode.
>     > +               =         */
>     > +               =         last_dip->di_next_unlinked =3D
>     > cpu_to_be32(next_agino);
>     > +               =         ASSERT(next_agino !=3D 0);
>     > +               =         offset =3D last_offset + offsetof(xfs_dinode_t,=
>     > di_next_unlinked);
>     > +               =         xfs_trans_inode_buf(tp, last_ibp);
>     > +               =         xfs_trans_log_buf(tp, last_ibp, offset,
>     > +               =                      = ;     (offset +
>     sizeof(xfs_agino_t)
>     > - 1));
>     > +               =         xfs_inobp_check(mp, last_ibp);
>     > +               = }
>     >         }
>     >         return 0;
>     >  }
>     >
>     > Thank you.
>     >
>     >
>     > 2013/4/18 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>
>     <mailto:yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>>
>     >
>     >     Hi Brain and Eric,
>     >     If the problem is the agno can't = be found in the unlinked
>     list. Can
>     >     we just bypass it instead of passing = ino=3D0xffffffff to
>     xfs_inotobp?
>     >     Thank you.
>     >
>     >
>     >     2013/4/18 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com
>     <mailto:= yongtaofu@gmail.com> <mailto:yongtaofu@gmail.com
>     <mailto:yongtaofu@gmail.com>>>
>     >
>     >         Hi Eric,
>     >         The shutdown issue is s= till not reproduced yet. But I get the
>     >         following error today d= uring test.
>     >
>     >         Apr 18 07:42:51 10 kern= el: Call Trace:
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d91ef>] ?
>     >         xfs_buf_cond_lock+0x2f/= 0xc0 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff814fe6a5>]
>     >         schedule_timeout+0x215/= 0x2e0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d5f07>] ?
>     >         kmem_zone_alloc+0x77/0x= f0 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff814ff5c2>]
>     __down+0x72/0xb0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02da652>] ?
>     >         _xfs_buf_find+0x102/0x2= 80 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: "echo 0 >
>     >         /proc/sys/kernel/hung_t= ask_timeout_secs" disables this
>     message.
>     >         Apr 18 07:42:51 10 kern= el: glusterfsd    D ffffffff8160b3c0
>     >         0 14522     &= nbsp;1 0x00000083
>     >         Apr 18 07:42:51 10 kern= el: ffff882015a63a28 0000000000000082
>     >         0000000000000000 000000= 0000000000
>     >         Apr 18 07:42:51 10 kern= el: ffff882015a639b8 ffffffffa02d91ef
>     >         ffff882015a639d8 000000= 0000000246
>     >         Apr 18 07:42:51 10 kern= el: ffff880e70491af8 ffff882015a63fd8
>     >         000000000000fb88 ffff88= 0e70491af8
>     >         Apr 18 07:42:51 10 kern= el: Call Trace:
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d91ef>] ?
>     >         xfs_buf_cond_lock+0x2f/= 0xc0 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff814fe6a5>]
>     >         schedule_timeout+0x215/= 0x2e0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d5f07>] ?
>     >         kmem_zone_alloc+0x77/0x= f0 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff814ff5c2>]
>     __down+0x72/0xb0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02da652>] ?
>     >         _xfs_buf_find+0x102/0x2= 80 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff81097ef1>] down+0x41/0x50
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02da493>]
>     >         xfs_buf_lock+0x53/0x110= [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02da652>]
>     >         _xfs_buf_find+0x102/0x2= 80 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02da83b>]
>     >         xfs_buf_get+0x6b/0x1a0 = [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02daeac>]
>     >         xfs_buf_read+0x2c/0x100= [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d0af8>]
>     >         xfs_trans_read_buf+0x1f= 8/0x400 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02b3444>]
>     >         xfs_read_agi+0x74/0x100= [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02b967b>]
>     >         xfs_iunlink+0x5b/0x180 = [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff810724c7>] ?
>     >         current_fs_time+0x27/0x= 30
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d12a7>] ?
>     >         xfs_trans_ichgtime+0x27= /0xa0 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d15fb>]
>     >         xfs_droplink+0x5b/0x70 = [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d2f9e>]
>     >         xfs_remove+0x27e/0x3a0 = [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff81186fd3>] ?
>     >         generic_permission+0x23= /0xb0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02e0968>]
>     >         xfs_vn_unlink+0x48/0x90= [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff81188c0f>]
>     vfs_unlink+0x9f/0xe0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff8118795a>] ?
>     >         lookup_hash+0x3a/0x50 >     >         Apr 18 07:42:51 10 kern= el: [<ffffffff8118b143>]
>     >         do_unlinkat+0x183/0x1c0=
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff81017938>] ?
>     >         syscall_trace_enter+0x1= d8/0x1e0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff8118b196>]
>     sys_unlink+0x16/0x20
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff8100b308>]
>     tracesys+0xd9/0xde
>     >
>     >         Thank you.
>     >
>     >
>     >         2013/4/17 Eric Sandeen = <sandeen@sandeen.net
>     <mailto:sandee= n@sandeen.net>
>     >         <mailto:= sandeen@sandeen.net <mailto:<= a href=3D"mailto:sandeen@sandeen.net">sandeen@sandeen.net>>>
>     >
>     >             On Apr 16= , 2013, at 8:48 PM, =B7=FB=D3=C0=CC=CE
>     <yongtaofu@gma= il.com <mailto:yongtaofu@gmai= l.com>
>     >             <= ;mailto:yongtaofu@gmail.com
>     <mailto:yongtaofu@gmail.com>>> wrote:
>     >
>     >>             Hi Br= ain,
>     >>             Can I= change as following?
>     >
>     >             ASSERTS a= re no-ops in a non-debug kernel, so this won't
>     >             change an= y behavior.  I hope we'll know more if we get new
>     >             traces fr= om your patched kernel....
>     >
>     >             Eric
>     >
>     >>             --- a= /xfs_inode.c
>     >>             +++ b= /xfs_inode.c
>     >>             @@ -1= 773,6 +1773,8 @@ xfs_iunlink_remove(
>     >>              = ;                     &nb= sp; if (last_ibp !=3D NULL) {
>     >>              = ;                     &nb= sp;         xfs_trans_brelse(tp,
>     >>             last_= ibp);
>     >>              = ;                     &nb= sp; }
>     >>             + &nb= sp;                     &= nbsp;ASSERT(next_agino !=3D NULLAGINO);
>     >>             + &nb= sp;                     &= nbsp;ASSERT(next_agino !=3D 0);
>     >>              = ;                     &nb= sp; next_ino =3D XFS_AGINO_TO_INO(mp,
>     >>             agno,= next_agino);
>     >>              = ;                     &nb= sp; error =3D xfs_inotobp(mp, tp,
>     >>             next_= ino, &last_dip,
>     >>              = ;                     &nb= sp;                     &= amp;last_ibp,
>     >>             &= last_offset, 0);
>     >>             @@ -1= 783,8 +1785,6 @@ xfs_iunlink_remove(
>     >>              = ;                     &nb= sp;         return error;
>     >>              = ;                     &nb= sp; }
>     >>              = ;                     &nb= sp; next_agino =3D
>     >>             be32_= to_cpu(last_dip->di_next_unlinked);
>     >>             - &nb= sp;                     A= SSERT(next_agino !=3D NULLAGINO);
>     >>             - &nb= sp;                     A= SSERT(next_agino !=3D 0);
>     >>              = ;               }
>     >>              = ;               /*
>     >>              = ;                * Now last_ibp poi= nts to the buffer
>     >>             previ= ous to us on
>     >>
>     >>             Thank= you.
>     >>
>     >>
>     >>             2013/= 4/17 =B7=FB=D3=C0=CC=CE <yongtaof= u@gmail.com
>     <mailto:yongta= ofu@gmail.com>
>     >>           =   <mailto:yongtaofu@gmail.co= m
>     <mailto:yongtaofu@gmail.com>>>
>     >>
>     >>              = ;   Hi Brain,
>     >>              = ;   If it is because NULLAGINO is passed in  to
>     xfs_inotobp().
>     >>              = ;   Can I move the following two lines before
>     xfs_inotobp?
>     >>
>     >>              = ;   For example:
>     >>
>     >>              = ;   1767                 while= (next_agino !=3D agino) {
>     >>              = ;   1768                  = ;       /*
>     >>              = ;   1769                  = ;        * If the last inode
>     >>              = ;   wasn't the one pointing to
>     >>              = ;   1770                  = ;        * us, then release its
>     >>              = ;   buffer since we're not
>     >>              = ;   1771                  = ;        * going to do anything
>     >>              = ;   with it.
>     >>              = ;   1772                  = ;        */
>     >>              = ;   1773                  = ;       if (last_ibp !=3D NULL) {
>     >>              = ;   1774
>     >>              = ;   xfs_trans_brelse(tp, last_ibp);
>     >>              = ;   1775                  = ;       }
>     >>              = ;   1776                  = ;       next_ino =3D
>     >>              = ;   XFS_AGINO_TO_INO(mp, agno, next_agino);
>     >>              = ;   +                   &= nbsp;           ASSERT(next_agino !=3D
>     >>              = ;   NULLAGINO);
>     >>              = ;   +                   &= nbsp;           ASSERT(next_agino
>     !=3D 0);
>     >>              = ;   1777                  = ;       error =3D xfs_inotobp(mp,
>     >>              = ;   tp, next_ino, &last_dip,
>     >>              = ;   1778
>     >>              = ;   &last_ibp, &last_offset, 0);
>     >>              = ;   1779                  = ;       if (error) {
>     >>              = ;   1780                  = ;               xfs_warn(mp,
>     >>              = ;   1781                  = ;                     &nb= sp; "%s:
>     >>              = ;   xfs_inotobp() returned error %d.",
>     >>              = ;   1782
>     __func__,
>     >>              = ;   error);
>     >>              = ;   1783                  = ;               return error;
>     >>              = ;   1784                  = ;       }
>     >>              = ;   1785                  = ;       next_agino =3D
>     >>              = ;   be32_to_cpu(last_dip->di_next_unlinked);
>     >>              = ;   -
>     //ASSERT(next_agino !=3D
>     >>              = ;   NULLAGINO);
>     >>              = ;   -
>     //ASSERT(next_agino !=3D 0);
>     >>              = ;   1788                 }
>     >>              = ;   I don't understand xfs well and correct me if I'm
>     >>              = ;   totally wrong.
>     >>              = ;   Thank you very much.
>     >>
>     >>
>     >>              = ;   2013/4/17 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com
>     <mailto:yongta= ofu@gmail.com>
>     >>           =       <mailto:yong= taofu@gmail.com
>     <mailto:yongtaofu@gmail.com>>>
>     >>
>     >>              = ;       Hi Brain,
>     >>              = ;       I want to ask a question, according to the
>     >>              = ;       shutdown trace. The ino in  xfs_iunlink_remove<= br> >     >>              = ;       is 0x113, why xfs_imap got ino=3D0xffffffff ?
>     >>
>     >>              = ;       --- xfs_imap --
>     >>
>     module("xfs").function("xfs_imap@fs/xfs/x= fs_ialloc.c:1257").return
>     >>              = ;       -- return=3D0x16
>     >>              = ;       vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c7= 0
>     >>              = ;       ino=3D0xffffffff
>     >>
>     >>              = ;       --- xfs_iunlink_remove --
>     >>
>     module("xfs").function("xfs_iunlink_remov= e@fs/xfs/xfs_inode.c:1680").return
>     >>              = ;       -- return=3D0x16
>     >>              = ;       vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c0= 0
>     >>              = ;       next_ino=3D? mp=3D? agi=3D? dip=3D?
>     >>              = ;       agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D= ?
>     >>              = ;       next_agino=3D? last_ibp=3D?
>     >>              = ;       last_dip=3D0xffff882000000000 bucket_index=3D?
>     >>              = ;       offset=3D? last_offset=3D0xffffffffffff8810 error=3D= ?
>     >>              = ;       __func__=3D[...]
>     >>              = ;       ip: i_ino =3D 0x113, i_flags =3D 0x0
>     >>
>     >>              = ;       Thank you.
>     >>
>     >>
>     >>
>     >>              = ;       2013/4/17 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com
>     <mailto:yongta= ofu@gmail.com>
>     >>            =         <mailto:yongtaofu@gmail.com
>     <mailto:yongtaofu@gmail.com>>>
>     >>
>     >>              = ;           Hi Brain,
>     >>              = ;           Thank you for your update, and I have = applied
>     >>              = ;           your last kernel patch. However it is = not
>     easy
>     >>              = ;           to reproduce especially in out test >     >>              = ;           environment. Till now is not happens a= gain.
>     >>              = ;           I'll update the kernel patch now. = BTW is
>     there
>     >>              = ;           any findings in the logs of previous t= hread?
>     >>
>     http://oss.sgi.com/archives/xfs/2013-04/msg0032= 7.html
>     >>              = ;           I guess it tend to happen during glust= erfs
>     >>              = ;           rebalance because glusterfs moves a lo= t of
>     >>              = ;           file from one server to another and th= en
>     >>              = ;           unlink it.
>     >>
>     >>              = ;           Thank you.
>     >>
>     >>
>     >>              = ;           2013/4/17 Brian Foster
>     <bfoster@redhat= .com <mailto:bfoster@redhat.co= m>
>     >>            =             <mailto:bfoster@redhat.com
>     <mailto:bfoster@redhat.com>>>
>     >>
>     >>              = ;               On 04/16/2013 12:24 PM, = Dave Chinner
>     wrote:
>     >>              = ;               > On Mon, Apr 15, 201= 3 at 07:14:39PM
>     >>              = ;               -0400, Brian Foster wrot= e:
>     >>              = ;               >> Hi,
>     >>              = ;               >>
>     >>              = ;               >> Thanks for the = data in the
>     previous thread:
>     >>              = ;               >>
>     >>              = ;               >>
>     >>
>     http://oss.sgi.com/archives/xfs/2013-04/msg0032= 7.html
>     >>              = ;               >>
>     >>              = ;               ...
>     >>              = ;               >>
>     >>              = ;               >>     &= nbsp;echo 1 >
>     >>
>     /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable<= br> >     >>              = ;               >>     &= nbsp;echo 1 >
>     >>
>     /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/= enable
>     >>              = ;               >>     &= nbsp;... reproduce ...
>     >>              = ;               >>     &= nbsp;cat
>     >>              = ;               /sys/kernel/debug/tracin= g/trace >
>     trace.output
>     >>              = ;               >
>     >>              = ;               > It's better to = use trace-cmd for this.
>     >>              = ;               it will result in less >     >>              = ;               > dropped events. i.e= .:
>     >>              = ;               >
>     >>              = ;               >      = ; $ trace-cmd record -e
>     xfs_iunlink\*
>     >>              = ;               >      = ; ... reproduce ...
>     >>              = ;               >      = ; ^C
>     >>              = ;               >      = ; $ trace-cmd report > trace.output
>     >>              = ;               >
>     >>              = ;               >> --- a/fs/xfs/li= nux-2.6/xfs_trace.h
>     >>              = ;               >> +++ b/fs/xfs/li= nux-2.6/xfs_trace.h
>     >>              = ;               >> @@ -581,6 +581,= 8 @@
>     >>              = ;               DEFINE_INODE_EVENT(xfs_f= ile_fsync);
>     >>              = ;               ...
>     >>              = ;               >
>     >>              = ;               > I would suggest tha= t the the tracing
>     >>              = ;               shoul dbe at entry of th= e
>     >>              = ;               > function, otherwise= we won't get a
>     >>              = ;               tracepoint for the opera= tion that
>     >>              = ;               > triggers the shutdo= wn. (That's the
>     >>              = ;               reason most tracepoints = in XFS
>     >>              = ;               > are at function ent= ry...)
>     >>              = ;               >
>     >>
>     >>              = ;               Good points, thanks Dave= . A v2 that pulls
>     >>              = ;               up the tracepoints towar= ds
>     >>              = ;               function entry is append= ed.
>     >>
>     >>              = ;               Brian
>     >>
>     >>              = ;               From
>     >>              = ;               280943e78ebe0b97a774cba5= 1e7815c42f044b55
>     >>              = ;               Mon Sep 17 00:00:00 2001=
>     >>              = ;               From: Brian Foster
>     <bfoster@redhat= .com <mailto:bfoster@redhat.co= m>
>     >>           =                   <mailto:<= a href=3D"mailto:bfoster@redhat.com">bfoster@redhat.com
>     <mailto:bfoster@redhat.com>>>
>     >>              = ;               Date: Mon, 15 Apr 2013 1= 8:16:24 -0400
>     >>              = ;               Subject: [PATCH v2] xfs:= add tracepoints
>     >>              = ;               for xfs_iunlink and
>     >>              = ;               xfs_iunlink_remove
>     >>
>     >>              = ;               ---
>     >>              = ;                fs/xfs/linux-2.6/x= fs_trace.h |    2 ++
>     >>              = ;                fs/xfs/xfs_inode.c=           |    4 ++++
>     >>              = ;                2 files changed, 6= insertions(+), 0
>     >>              = ;               deletions(-)
>     >>
>     >>              = ;               diff --git a/fs/xfs/linu= x-2.6/xfs_trace.h
>     >>              = ;               b/fs/xfs/linux-2.6/xfs_t= race.h
>     >>              = ;               index adc6ec4..338a0f9 1= 00644
>     >>              = ;               --- a/fs/xfs/linux-2.6/x= fs_trace.h
>     >>              = ;               +++ b/fs/xfs/linux-2.6/x= fs_trace.h
>     >>              = ;               @@ -583,6 +583,8 @@
>     >>              = ;               DEFINE_INODE_EVENT(xfs_f= ile_fsync);
>     >>              = ;                DEFINE_INODE_EVENT= (xfs_destroy_inode);
>     >>              = ;                DEFINE_INODE_EVENT= (xfs_dirty_inode);
>     >>              = ;                DEFINE_INODE_EVENT= (xfs_clear_inode);
>     >>              = ;               +DEFINE_INODE_EVENT(xfs_= iunlink);
>     >>              = ;               +DEFINE_INODE_EVENT(xfs_= iunlink_remove);
>     >>
>     >>              = ;                DEFINE_INODE_EVENT= (xfs_dquot_dqalloc);
>     >>              = ;                DEFINE_INODE_EVENT= (xfs_dquot_dqdetach);
>     >>              = ;               diff --git a/fs/xfs/xfs_= inode.c
>     >>              = ;               b/fs/xfs/xfs_inode.c
>     >>              = ;               index 19900f0..d705c77 1= 00644
>     >>              = ;               --- a/fs/xfs/xfs_inode.c=
>     >>              = ;               +++ b/fs/xfs/xfs_inode.c=
>     >>              = ;               @@ -1615,6 +1615,8 @@ xf= s_iunlink(
>     >>
>     >>              = ;                     &nb= sp; mp =3D tp->t_mountp;
>     >>
>     >>              = ;               +       t= race_xfs_iunlink(ip);
>     >>              = ;               +
>     >>              = ;                     &nb= sp; /*
>     >>              = ;                     &nb= sp;  * Get the agi buffer first.  It
>     >>              = ;               ensures lock ordering >     >>              = ;                     &nb= sp;  * on the list.
>     >>              = ;               @@ -1694,6 +1696,8 @@ xf= s_iunlink_remove(
>     >>              = ;                     &nb= sp; mp =3D tp->t_mountp;
>     >>              = ;                     &nb= sp; agno =3D XFS_INO_TO_AGNO(mp,
>     ip->i_ino);
>     >>
>     >>              = ;               +       t= race_xfs_iunlink_remove(ip);
>     >>              = ;               +
>     >>              = ;                     &nb= sp; /*
>     >>              = ;                     &nb= sp;  * Get the agi buffer first.  It
>     >>              = ;               ensures lock ordering >     >>              = ;                     &nb= sp;  * on the list.
>     >>              = ;               --
>     >>              = ;               1.7.7.6
>     >>
>     >>
>     >>
>     >>
>     >>              = ;           --
>     >>              = ;           =B7=FB=D3=C0=CC=CE
>     >>
>     >>
>     >>
>     >>
>     >>              = ;       --
>     >>              = ;       =B7=FB=D3=C0=CC=CE
>     >>
>     >>
>     >>
>     >>
>     >>              = ;   --
>     >>              = ;   =B7=FB=D3=C0=CC=CE
>     >>
>     >>
>     >>
>     >>
>     >>             -- >     >>             =B7= =FB=D3=C0=CC=CE
>     >>             _____= __________________________________________
>     >>             xfs m= ailing list
>     >>             xfs@oss.sgi.com <mailto:xfs@oss.sgi.com>
>     <mailto:xfs@oss.sgi.com <mailto:xfs@oss= .sgi.com>>
>     >>   =           http://oss.sgi.com/mailman/listinfo/xfs >     >
>     >
>     >
>     >
>     >         --
>     >         =B7=FB=D3=C0=CC=CE
>     >
>     >
>     >
>     >
>     >     --
>     >     =B7=FB=D3=C0=CC=CE
>     >
>     >
>     >
>     >
>     > --
>     > =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE




--
=B7=FB=D3= =C0=CC=CE
--14dae9340b5f3ba92504dab0fe1f-- From ratikala@cavblog.com Fri Apr 19 03:31:45 2013 Return-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 autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6DD5F7CBF for ; Fri, 19 Apr 2013 03:31:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4F10130406A for ; Fri, 19 Apr 2013 01:31:45 -0700 (PDT) X-ASG-Debug-ID: 1366360300-04bdf02d2038ef70001-w1Z2WR Received: from mail.aninfotech.com ([199.193.114.4]) by cuda.sgi.com with ESMTP id qrpBH5HNH0Ykxrfg for ; Fri, 19 Apr 2013 01:31:41 -0700 (PDT) X-Barracuda-Envelope-From: ratikala@cavblog.com X-Barracuda-Apparent-Source-IP: 199.193.114.4 Received: from ratikala [122.170.65.63] by mail.aninfotech.com with ESMTP (SMTPD32-8.05) id A0EA11B10066; Fri, 19 Apr 2013 04:31:38 -0400 Message-ID: <419-22013451983116380@ratikala> Return-Receipt-To: ratikala@cavblog.com Disposition-Notification-To: ratikala@cavblog.com From: "Ratikala" To: linux-xfs@oss.sgi.com Subject: Get daily new customers from Google Date: Fri, 19 Apr 2013 14:01:16 +0500 X-ASG-Orig-Subj: Get daily new customers from Google MIME-Version: 1.0 Content-type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: UNKNOWN[199.193.114.4] X-Barracuda-Start-Time: 1366360300 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128552 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/Madam, For a very small annual fees, we will do following:=20 1) List your website in Trade Directories and Send you PROOF of listing=2E= =20 2) Write 10 NEW, innovative and unique ARTICLE on your website, business o= r company=2E=20 3) Create 2 Press-Release and Media Item =2E=2E=20 4) Create Social Media Accounts=2E=20 5) Create and Market a VIDEO on your company on Youtube and 30+ Video Shar= ing Websites=2E=20 6) Create Facebook & Twitter Profiles=2E=20 7) Manage and improve your Internet Marketing Campaign for the entire year= =2E=20 We are providing Search Engine Optimization (SEO) and Internet Marketing S= ervices to 5000+ clients in USA, Africa, UK, Indai and Gulf=2E =20 Send us an email and contact details today with your Website Name=2E=20 Regards, Ratikala=2E From yongtaofu@gmail.com Fri Apr 19 06:41:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D743F7CBF for ; Fri, 19 Apr 2013 06:41:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C2E0F304075 for ; Fri, 19 Apr 2013 04:41:45 -0700 (PDT) X-ASG-Debug-ID: 1366371701-04cbb057f7384b60001-NocioJ Received: from mail-ie0-f169.google.com (mail-ie0-f169.google.com [209.85.223.169]) by cuda.sgi.com with ESMTP id ishqo3AGQx7EHCwb (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 04:41:41 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] Received: by mail-ie0-f169.google.com with SMTP id ar20so4629426iec.28 for ; Fri, 19 Apr 2013 04:41:41 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=Lw/IP6afzBUjOz3jPquA2rIukSRKPQftWJqfgYGW4Iw=; b=GopPgsK3mZjcgsQRTrU8RzhED4MnBO8SzjtsQT5kk2dRVjWvPuijT8g7SFjz3Hcr0F f3ca2hyPki0Fy4iIrRuvggeEEdbXD4+x2KaL4dwAduR4DGFkzE3h6YuemlQ89GhJm6o0 dPgrAh2jZrY2Ux2nHCrFRebjZnjQJmEsdTaGUsHnXnvE/05uQVaxj02Q9uQIHdBREChg wmgp3HNzJgeRtVvE4WcltwGgjemFHPa/jmfvAqzXDzKJ8jj+QWzUGx+DXeoSksT4GbQi H/Fb0U7WK2sb1yxBLTx8tOTvsz+xtnqQI3CgbosUG0TgpHMQl++AzwFSCwq6MBey0n8N cR8Q== MIME-Version: 1.0 X-Received: by 10.50.20.163 with SMTP id o3mr1761271ige.51.1366371700895; Fri, 19 Apr 2013 04:41:40 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 04:41:40 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> Date: Fri, 19 Apr 2013 19:41:40 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Brian Foster Cc: Eric Sandeen , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=047d7bd75decdcf3dc04dab533c0 X-Barracuda-Connect: mail-ie0-f169.google.com[209.85.223.169] X-Barracuda-Start-Time: 1366371701 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128563 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 --047d7bd75decdcf3dc04dab533c0 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Dear Brian and Eric, kernel kernel-2.6.32-279.19.1.el6.x86_64.rpmstill have this problem I build the kernel from this srpm https://oss.oracle.com/ol6/SRPMS-updates/kernel-2.6.32-279.19.1.el6.src.rpm today the shutdown happens again during test. Seelogs bellow: /var/log/message Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22. Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22 Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02d4bda Apr 19 16:40:05 10 kernel: XFS (sdb): I/O Error Detected. Shutting down filesystem Apr 19 16:40:05 10 kernel: XFS (sdb): Please umount the filesystem and rectify the problem(s) Apr 19 16:40:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. Apr 19 16:40:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. systemtap script output: --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- return=3D0x16 vars: mp=3D0xffff88101801e800 tp=3D0xffff880ff143ac70 ino=3D0xffffffff imap=3D0xffff88100e93bc08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_per= _cluster=3D? chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? __f= unc__=3D[...] mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D 0= x4, sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 imap: im_blkno =3D 0x0, im_len =3D 0xe778, im_boffset =3D 0xd997 kernel backtrace: Returning from: 0xffffffffa02b4260 : xfs_imap+0x0/0x280 [xfs] Returning to : 0xffffffffa02b9d59 : xfs_inotobp+0x49/0xc0 [xfs] 0xffffffffa02b9ec1 : xfs_iunlink_remove+0xf1/0x360 [xfs] 0xffffffff814ede89 0x0 (inexact) user backtrace: 0x3ec260e5ad [/lib64/libpthread-2.12.so+0xe5ad/0x219000] --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1681").return -- return=3D0x16 vars: tp=3D0xffff880ff143ac70 ip=3D0xffff8811ed111000 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D? ibp=3D? agno=3D? agino=3D? next_agino=3D? last_ibp=3D? last_dip=3D0xffff881000000001 bucket_index=3D? offset=3D? last_offset=3D0xffffffffffff8811 error=3D? __func__=3D[...] ip: i_ino =3D 0x1bd33, i_flags =3D 0x0 ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x53068791 debugfs events trace: https://docs.google.com/file/d/0B7n2C4T5tfNCREZtdC1yamc0RnM/edit?usp=3Dshar= ing xfs_metadump: https://docs.google.com/file/d/0B7n2C4T5tfNCc2tiMjdhMTVfOWM/edit?usp=3Dshar= ing again this happens exactly when glusterfs rebalance finishes on one of the brick(this time it is current host) glusterfs log: [2013-04-19 16:40:03.835675] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the layout of /lib/kbd/consoletrans [2013-04-19 16:40:03.842024] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the layout of /lib/kbd/consoletrans [2013-04-19 16:40:03.844120] I [dht-rebalance.c:1055:gf_defrag_migrate_data] 0-testbug-dht: migrate data called on /lib/kbd/consoletrans [2013-04-19 16:40:03.852926] I [dht-rebalance.c:1055:gf_defrag_migrate_data] 0-testbug-dht: migrate data called on /lib/kbd/consoletrans [2013-04-19 16:40:03.856602] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the layout of /lib/kbd/consoletrans [2013-04-19 16:40:03.860231] I [dht-rebalance.c:1055:gf_defrag_migrate_data] 0-testbug-dht: migrate data called on /lib/kbd/consoletrans [2013-04-19 16:40:03.892069] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the layout of /lib/alsa [2013-04-19 16:40:03.897155] I [dht-rebalance.c:1055:gf_defrag_migrate_data] 0-testbug-dht: migrate data called on /lib/alsa [2013-04-19 16:40:03.897582] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the layout of /lib/alsa [2013-04-19 16:40:03.901076] I [dht-rebalance.c:1055:gf_defrag_migrate_data] 0-testbug-dht: migrate data called on /lib/alsa [2013-04-19 16:40:03.903689] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the layout of /lib/alsa [2013-04-19 16:40:03.906643] I [dht-rebalance.c:1055:gf_defrag_migrate_data] 0-testbug-dht: migrate data called on /lib/alsa [2013-04-19 16:40:03.910744] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the layout of /lib/alsa/init [2013-04-19 16:40:03.913475] I [dht-rebalance.c:1055:gf_defrag_migrate_data] 0-testbug-dht: migrate data called on /lib/alsa/init [2013-04-19 16:40:03.915424] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the layout of /lib/alsa/init [2013-04-19 16:40:03.918699] I [dht-rebalance.c:1055:gf_defrag_migrate_data] 0-testbug-dht: migrate data called on /lib/alsa/init [2013-04-19 16:40:03.920459] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the layout of /lib/alsa/init [2013-04-19 16:40:03.922857] I [dht-rebalance.c:1055:gf_defrag_migrate_data] 0-testbug-dht: migrate data called on /lib/alsa/init [2013-04-19 16:40:05.107663] I [dht-rebalance.c:1611:gf_defrag_status_get] 0-glusterfs: Rebalance is completed [2013-04-19 16:40:05.107770] I [dht-rebalance.c:1614:gf_defrag_status_get] 0-glusterfs: Files migrated: 993, size: 16161958687, lookups: 190891, failures: 8957 [2013-04-19 16:40:05.108628] W [glusterfsd.c:831:cleanup_and_exit] (-->/lib64/libc.so.6(clone+0x6d) [0x3ec22e767d] (-->/lib64/libpthread.so.0() [0x3ec2607851] (-->/usr/sbin/glusterfs(glusterfs_sigwaiter+0xdd) [0x405c9d]))) 0-: received signum (15), shutting down [2013-04-19 16:40:05.109007] E [rpcsvc.c:1155:rpcsvc_program_unregister_portmap] 0-rpc-service: Could not unregister with portmap 2013/4/19 =B7=FB=D3=C0=CC=CE > Hi Brian and Eric, > > I have applied your kernel path v2(add unlink trace) to > kernel-2.6.32-279.19.1.el6.x86_64.rpmin o= ut test cluster and start testing again. > Any progress will let you known. Thank you. > > > 2013/4/19 Brian Foster > >> On 04/18/2013 11:23 AM, =B7=FB=D3=C0=CC=CE wrote: >> > Hi Brian and Eric, >> > The shutdown is not easy to produce but finally right now 2 of our >> > servers in our test cluster xfs was shutdown. >> > >> >> Understood. We've been trying very hard to reproduce ourselves to make >> it easier to debug, but haven't been able to reproduce at all so far. >> This process allows us to make _some_ progress on the issue, even if it >> is slower going than we'd like... ;) >> >> > the trace output as following >> > >> https://docs.google.com/file/d/0B7n2C4T5tfNCLXRYUWJ0b19JcWc/edit?usp=3Ds= haring >> > >> >> Thanks again for the data. The racing behavior Eric called out (nice >> catch!) in his last mail lit up some light bulbs internally with regard >> to some old locking issues triggered by XFS in the 6.3 kernel. The >> following bug serves as an example: >> >> https://bugzilla.redhat.com/show_bug.cgi?id=3D852847 >> >> ... the fix for which went into the 2.6.32-279.19.1 6.3.z release. Could >> you move some or all of your servers to this kernel[1] and see how it >> goes? The best case is it resolves the problem, worst case we carry on >> debugging from there... >> >> Brian >> >> [1] - >> >> http://mirror.linux.duke.edu/pub/centos/6.3/updates/x86_64/Packages/kern= el-2.6.32-279.19.1.el6.x86_64.rpm >> >> > Sorry but the systemtap is interrupt and I didn't noticed that so I >> > didn't get systemtap logs. >> > >> > /var/log/message is same as before >> > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp(= ) >> > returned error 22. >> > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned >> > error 22 >> > Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) calle= d >> > from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D >> > 0xffffffffa02d44aa >> > Apr 18 22:43:14 10 kernel: XFS (sdb): I/O Error Detected. Shutting dow= n >> > filesystem >> > Apr 18 22:43:14 10 kernel: XFS (sdb): Please umount the filesystem and >> > rectify the problem(s) >> > Apr 18 22:43:20 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. >> > >> > The metadump file is large I'll share it to you soon. >> > >> > >> > 2013/4/18 Brian Foster = > >> > >> > On 04/18/2013 04:25 AM, =B7=FB=D3=C0=CC=CE wrote: >> > > Hi Brian and Eric, >> > > Can I change as following to bypass it? >> > >> > This is probably not a wise thing to do. The problem we're seeing >> here >> > is indicative of a potentially larger problem than this particular >> error >> > path. An inode is being unlinked and inactivated, but we aren't >> finding >> > on the list where we expect it to be. Killing the error return >> doesn't >> > eliminate the larger problem. >> > >> > So while changes could end up being made in this area as part of a >> fix, >> > I would not suggest making any changes beyond those designed to he= lp >> > debug until we have a better idea of root cause. >> > >> > Brian >> > >> > > --- a/xfs_inode.c >> > > +++ b/xfs_inode.c >> > > @@ -1764,7 +1764,7 @@ xfs_iunlink_remove( >> > > */ >> > > next_agino =3D >> > be32_to_cpu(agi->agi_unlinked[bucket_index]); >> > > last_ibp =3D NULL; >> > > - while (next_agino !=3D agino) { >> > > + while (next_agino !=3D agino && next_agino !=3D >> > NULLAGINO) { >> > > /* >> > > * If the last inode wasn't the one >> > pointing to >> > > * us, then release its buffer since >> we're not >> > > @@ -1786,6 +1786,14 @@ xfs_iunlink_remove( >> > > ASSERT(next_agino !=3D NULLAGINO); >> > > ASSERT(next_agino !=3D 0); >> > > } >> > > + if (next_agino =3D=3D NULLAGINO) { >> > > + /* >> > > + *After search the list for the inode >> > being free >> > > + *we still can't find it. >> > > + */ >> > > + xfs_err(mp, "%s ino %lld not found in >> unlinked >> > > list.", >> > > + __func__, (unsigned long >> > > long)ip->i_ino); >> > > + } >> > > /* >> > > * Now last_ibp points to the buffer previous to >> us on >> > > * the unlinked list. Pull us from the list. >> > > @@ -1810,16 +1818,20 @@ xfs_iunlink_remove( >> > > } else { >> > > xfs_trans_brelse(tp, ibp); >> > > } >> > > - /* >> > > - * Point the previous inode on the list to the >> > next inode. >> > > - */ >> > > - last_dip->di_next_unlinked =3D >> cpu_to_be32(next_agino); >> > > - ASSERT(next_agino !=3D 0); >> > > - offset =3D last_offset + offsetof(xfs_dinode_t, >> > > di_next_unlinked); >> > > - xfs_trans_inode_buf(tp, last_ibp); >> > > - xfs_trans_log_buf(tp, last_ibp, offset, >> > > - (offset + sizeof(xfs_agino_t) = - >> 1)); >> > > - xfs_inobp_check(mp, last_ibp); >> > > + if (next_agino !=3D NULLAGINO) { >> > > + /* >> > > + * If only find the inode being free then >> > we modify >> > > + * the unlinked list. >> > > + * Point the previous inode on the list t= o >> the >> > > next inode. >> > > + */ >> > > + last_dip->di_next_unlinked =3D >> > > cpu_to_be32(next_agino); >> > > + ASSERT(next_agino !=3D 0); >> > > + offset =3D last_offset + >> offsetof(xfs_dinode_t, >> > > di_next_unlinked); >> > > + xfs_trans_inode_buf(tp, last_ibp); >> > > + xfs_trans_log_buf(tp, last_ibp, offset, >> > > + (offset + >> > sizeof(xfs_agino_t) >> > > - 1)); >> > > + xfs_inobp_check(mp, last_ibp); >> > > + } >> > > } >> > > return 0; >> > > } >> > > >> > > Thank you. >> > > >> > > >> > > 2013/4/18 =B7=FB=D3=C0=CC=CE >> > >> >> > > >> > > Hi Brain and Eric, >> > > If the problem is the agno can't be found in the unlinked >> > list. Can >> > > we just bypass it instead of passing ino=3D0xffffffff to >> > xfs_inotobp? >> > > Thank you. >> > > >> > > >> > > 2013/4/18 =B7=FB=D3=C0=CC=CE > > > > >> >> > > >> > > Hi Eric, >> > > The shutdown issue is still not reproduced yet. But I ge= t >> the >> > > following error today during test. >> > > >> > > Apr 18 07:42:51 10 kernel: Call Trace: >> > > Apr 18 07:42:51 10 kernel: [] ? >> > > xfs_buf_cond_lock+0x2f/0xc0 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > > schedule_timeout+0x215/0x2e0 >> > > Apr 18 07:42:51 10 kernel: [] ? >> > > kmem_zone_alloc+0x77/0xf0 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > __down+0x72/0xb0 >> > > Apr 18 07:42:51 10 kernel: [] ? >> > > _xfs_buf_find+0x102/0x280 [xfs] >> > > Apr 18 07:42:51 10 kernel: "echo 0 > >> > > /proc/sys/kernel/hung_task_timeout_secs" disables this >> > message. >> > > Apr 18 07:42:51 10 kernel: glusterfsd D >> ffffffff8160b3c0 >> > > 0 14522 1 0x00000083 >> > > Apr 18 07:42:51 10 kernel: ffff882015a63a28 >> 0000000000000082 >> > > 0000000000000000 0000000000000000 >> > > Apr 18 07:42:51 10 kernel: ffff882015a639b8 >> ffffffffa02d91ef >> > > ffff882015a639d8 0000000000000246 >> > > Apr 18 07:42:51 10 kernel: ffff880e70491af8 >> ffff882015a63fd8 >> > > 000000000000fb88 ffff880e70491af8 >> > > Apr 18 07:42:51 10 kernel: Call Trace: >> > > Apr 18 07:42:51 10 kernel: [] ? >> > > xfs_buf_cond_lock+0x2f/0xc0 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > > schedule_timeout+0x215/0x2e0 >> > > Apr 18 07:42:51 10 kernel: [] ? >> > > kmem_zone_alloc+0x77/0xf0 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > __down+0x72/0xb0 >> > > Apr 18 07:42:51 10 kernel: [] ? >> > > _xfs_buf_find+0x102/0x280 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> down+0x41/0x50 >> > > Apr 18 07:42:51 10 kernel: [] >> > > xfs_buf_lock+0x53/0x110 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > > _xfs_buf_find+0x102/0x280 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > > xfs_buf_get+0x6b/0x1a0 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > > xfs_buf_read+0x2c/0x100 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > > xfs_trans_read_buf+0x1f8/0x400 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > > xfs_read_agi+0x74/0x100 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > > xfs_iunlink+0x5b/0x180 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] ? >> > > current_fs_time+0x27/0x30 >> > > Apr 18 07:42:51 10 kernel: [] ? >> > > xfs_trans_ichgtime+0x27/0xa0 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > > xfs_droplink+0x5b/0x70 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > > xfs_remove+0x27e/0x3a0 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] ? >> > > generic_permission+0x23/0xb0 >> > > Apr 18 07:42:51 10 kernel: [] >> > > xfs_vn_unlink+0x48/0x90 [xfs] >> > > Apr 18 07:42:51 10 kernel: [] >> > vfs_unlink+0x9f/0xe0 >> > > Apr 18 07:42:51 10 kernel: [] ? >> > > lookup_hash+0x3a/0x50 >> > > Apr 18 07:42:51 10 kernel: [] >> > > do_unlinkat+0x183/0x1c0 >> > > Apr 18 07:42:51 10 kernel: [] ? >> > > syscall_trace_enter+0x1d8/0x1e0 >> > > Apr 18 07:42:51 10 kernel: [] >> > sys_unlink+0x16/0x20 >> > > Apr 18 07:42:51 10 kernel: [] >> > tracesys+0xd9/0xde >> > > >> > > Thank you. >> > > >> > > >> > > 2013/4/17 Eric Sandeen > > >> > > > >>> >> > > >> > > On Apr 16, 2013, at 8:48 PM, =B7=FB=D3=C0=CC=CE >> > >> > > > > >> wrote: >> > > >> > >> Hi Brain, >> > >> Can I change as following? >> > > >> > > ASSERTS are no-ops in a non-debug kernel, so this >> won't >> > > change any behavior. I hope we'll know more if we >> get new >> > > traces from your patched kernel.... >> > > >> > > Eric >> > > >> > >> --- a/xfs_inode.c >> > >> +++ b/xfs_inode.c >> > >> @@ -1773,6 +1773,8 @@ xfs_iunlink_remove( >> > >> if (last_ibp !=3D NULL) { >> > >> xfs_trans_brelse(tp= , >> > >> last_ibp); >> > >> } >> > >> + ASSERT(next_agino !=3D >> NULLAGINO); >> > >> + ASSERT(next_agino !=3D 0); >> > >> next_ino =3D >> XFS_AGINO_TO_INO(mp, >> > >> agno, next_agino); >> > >> error =3D xfs_inotobp(mp, t= p, >> > >> next_ino, &last_dip, >> > >> >> &last_ibp, >> > >> &last_offset, 0); >> > >> @@ -1783,8 +1785,6 @@ xfs_iunlink_remove( >> > >> return error; >> > >> } >> > >> next_agino =3D >> > >> be32_to_cpu(last_dip->di_next_unlinked); >> > >> - ASSERT(next_agino !=3D >> NULLAGINO); >> > >> - ASSERT(next_agino !=3D 0); >> > >> } >> > >> /* >> > >> * Now last_ibp points to the buffe= r >> > >> previous to us on >> > >> >> > >> Thank you. >> > >> >> > >> >> > >> 2013/4/17 =B7=FB=D3=C0=CC=CE > > >> > >> > > >> >> > >> >> > >> Hi Brain, >> > >> If it is because NULLAGINO is passed in to >> > xfs_inotobp(). >> > >> Can I move the following two lines before >> > xfs_inotobp? >> > >> >> > >> For example: >> > >> >> > >> 1767 while (next_agino !=3D agi= no) >> { >> > >> 1768 /* >> > >> 1769 * If the last ino= de >> > >> wasn't the one pointing to >> > >> 1770 * us, then releas= e >> its >> > >> buffer since we're not >> > >> 1771 * going to do >> anything >> > >> with it. >> > >> 1772 */ >> > >> 1773 if (last_ibp !=3D >> NULL) { >> > >> 1774 >> > >> xfs_trans_brelse(tp, last_ibp); >> > >> 1775 } >> > >> 1776 next_ino =3D >> > >> XFS_AGINO_TO_INO(mp, agno, next_agino); >> > >> + >> ASSERT(next_agino !=3D >> > >> NULLAGINO); >> > >> + ASSERT(next_agi= no >> > !=3D 0); >> > >> 1777 error =3D >> xfs_inotobp(mp, >> > >> tp, next_ino, &last_dip, >> > >> 1778 >> > >> &last_ibp, &last_offset, 0); >> > >> 1779 if (error) { >> > >> 1780 xfs_warn(m= p, >> > >> 1781 "%= s: >> > >> xfs_inotobp() returned error %d.", >> > >> 1782 >> > __func__, >> > >> error); >> > >> 1783 return >> error; >> > >> 1784 } >> > >> 1785 next_agino =3D >> > >> be32_to_cpu(last_dip->di_next_unlinked); >> > >> - >> > //ASSERT(next_agino !=3D >> > >> NULLAGINO); >> > >> - >> > //ASSERT(next_agino !=3D 0); >> > >> 1788 } >> > >> I don't understand xfs well and correct me if I= 'm >> > >> totally wrong. >> > >> Thank you very much. >> > >> >> > >> >> > >> 2013/4/17 =B7=FB=D3=C0=CC=CE > > >> > >> > > >> >> > >> >> > >> Hi Brain, >> > >> I want to ask a question, according to the >> > >> shutdown trace. The ino in >> xfs_iunlink_remove >> > >> is 0x113, why xfs_imap got ino=3D0xffffffff= ? >> > >> >> > >> --- xfs_imap -- >> > >> >> > module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return >> > >> -- return=3D0x16 >> > >> vars: mp=3D0xffff882017a50800 >> tp=3D0xffff881c81797c70 >> > >> ino=3D0xffffffff >> > >> >> > >> --- xfs_iunlink_remove -- >> > >> >> > module("xfs").function("xfs_iunlink_remove@fs >> /xfs/xfs_inode.c:1680").return >> > >> -- return=3D0x16 >> > >> vars: tp=3D0xffff881c81797c70 >> ip=3D0xffff881003c13c00 >> > >> next_ino=3D? mp=3D? agi=3D? dip=3D? >> > >> agibp=3D0xffff880109b47e20 ibp=3D? agno=3D?= agino=3D? >> > >> next_agino=3D? last_ibp=3D? >> > >> last_dip=3D0xffff882000000000 bucket_index= =3D? >> > >> offset=3D? last_offset=3D0xffffffffffff8810 >> error=3D? >> > >> __func__=3D[...] >> > >> ip: i_ino =3D 0x113, i_flags =3D 0x0 >> > >> >> > >> Thank you. >> > >> >> > >> >> > >> >> > >> 2013/4/17 =B7=FB=D3=C0=CC=CE > > >> > >> > > >> >> > >> >> > >> Hi Brain, >> > >> Thank you for your update, and I have >> applied >> > >> your last kernel patch. However it is n= ot >> > easy >> > >> to reproduce especially in out test >> > >> environment. Till now is not happens >> again. >> > >> I'll update the kernel patch now. BTW i= s >> > there >> > >> any findings in the logs of previous >> thread? >> > >> >> > http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >> > >> I guess it tend to happen during >> glusterfs >> > >> rebalance because glusterfs moves a lot >> of >> > >> file from one server to another and the= n >> > >> unlink it. >> > >> >> > >> Thank you. >> > >> >> > >> >> > >> 2013/4/17 Brian Foster >> > >> > >> > > >> >> > >> >> > >> On 04/16/2013 12:24 PM, Dave Chinne= r >> > wrote: >> > >> > On Mon, Apr 15, 2013 at 07:14:39P= M >> > >> -0400, Brian Foster wrote: >> > >> >> Hi, >> > >> >> >> > >> >> Thanks for the data in the >> > previous thread: >> > >> >> >> > >> >> >> > >> >> > http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >> > >> >> >> > >> ... >> > >> >> >> > >> >> echo 1 > >> > >> >> > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable >> > >> >> echo 1 > >> > >> >> > /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/enable >> > >> >> ... reproduce ... >> > >> >> cat >> > >> /sys/kernel/debug/tracing/trace > >> > trace.output >> > >> > >> > >> > It's better to use trace-cmd for >> this. >> > >> it will result in less >> > >> > dropped events. i.e.: >> > >> > >> > >> > $ trace-cmd record -e >> > xfs_iunlink\* >> > >> > ... reproduce ... >> > >> > ^C >> > >> > $ trace-cmd report > >> trace.output >> > >> > >> > >> >> --- a/fs/xfs/linux-2.6/xfs_trace= .h >> > >> >> +++ b/fs/xfs/linux-2.6/xfs_trace= .h >> > >> >> @@ -581,6 +581,8 @@ >> > >> DEFINE_INODE_EVENT(xfs_file_fsync); >> > >> ... >> > >> > >> > >> > I would suggest that the the >> tracing >> > >> shoul dbe at entry of the >> > >> > function, otherwise we won't get = a >> > >> tracepoint for the operation that >> > >> > triggers the shutdown. (That's th= e >> > >> reason most tracepoints in XFS >> > >> > are at function entry...) >> > >> > >> > >> >> > >> Good points, thanks Dave. A v2 that >> pulls >> > >> up the tracepoints towards >> > >> function entry is appended. >> > >> >> > >> Brian >> > >> >> > >> From >> > >> >> 280943e78ebe0b97a774cba51e7815c42f044b55 >> > >> Mon Sep 17 00:00:00 2001 >> > >> From: Brian Foster >> > >> > >> > > >> >> > >> Date: Mon, 15 Apr 2013 18:16:24 -04= 00 >> > >> Subject: [PATCH v2] xfs: add >> tracepoints >> > >> for xfs_iunlink and >> > >> xfs_iunlink_remove >> > >> >> > >> --- >> > >> fs/xfs/linux-2.6/xfs_trace.h | = 2 >> ++ >> > >> fs/xfs/xfs_inode.c | = 4 >> ++++ >> > >> 2 files changed, 6 insertions(+), = 0 >> > >> deletions(-) >> > >> >> > >> diff --git >> a/fs/xfs/linux-2.6/xfs_trace.h >> > >> b/fs/xfs/linux-2.6/xfs_trace.h >> > >> index adc6ec4..338a0f9 100644 >> > >> --- a/fs/xfs/linux-2.6/xfs_trace.h >> > >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >> > >> @@ -583,6 +583,8 @@ >> > >> DEFINE_INODE_EVENT(xfs_file_fsync); >> > >> >> DEFINE_INODE_EVENT(xfs_destroy_inode); >> > >> DEFINE_INODE_EVENT(xfs_dirty_inode= ); >> > >> DEFINE_INODE_EVENT(xfs_clear_inode= ); >> > >> +DEFINE_INODE_EVENT(xfs_iunlink); >> > >> >> +DEFINE_INODE_EVENT(xfs_iunlink_remove); >> > >> >> > >> >> DEFINE_INODE_EVENT(xfs_dquot_dqalloc); >> > >> >> DEFINE_INODE_EVENT(xfs_dquot_dqdetach); >> > >> diff --git a/fs/xfs/xfs_inode.c >> > >> b/fs/xfs/xfs_inode.c >> > >> index 19900f0..d705c77 100644 >> > >> --- a/fs/xfs/xfs_inode.c >> > >> +++ b/fs/xfs/xfs_inode.c >> > >> @@ -1615,6 +1615,8 @@ xfs_iunlink( >> > >> >> > >> mp =3D tp->t_mountp; >> > >> >> > >> + trace_xfs_iunlink(ip); >> > >> + >> > >> /* >> > >> * Get the agi buffer first= . >> It >> > >> ensures lock ordering >> > >> * on the list. >> > >> @@ -1694,6 +1696,8 @@ >> xfs_iunlink_remove( >> > >> mp =3D tp->t_mountp; >> > >> agno =3D XFS_INO_TO_AGNO(mp= , >> > ip->i_ino); >> > >> >> > >> + trace_xfs_iunlink_remove(ip= ); >> > >> + >> > >> /* >> > >> * Get the agi buffer first= . >> It >> > >> ensures lock ordering >> > >> * on the list. >> > >> -- >> > >> 1.7.7.6 >> > >> >> > >> >> > >> >> > >> >> > >> -- >> > >> =B7=FB=D3=C0=CC=CE >> > >> >> > >> >> > >> >> > >> >> > >> -- >> > >> =B7=FB=D3=C0=CC=CE >> > >> >> > >> >> > >> >> > >> >> > >> -- >> > >> =B7=FB=D3=C0=CC=CE >> > >> >> > >> >> > >> >> > >> >> > >> -- >> > >> =B7=FB=D3=C0=CC=CE >> > >> _______________________________________________ >> > >> xfs mailing list >> > >> xfs@oss.sgi.com >> > > >> > >> http://oss.sgi.com/mailman/listinfo/xfs >> > > >> > > >> > > >> > > >> > > -- >> > > =B7=FB=D3=C0=CC=CE >> > > >> > > >> > > >> > > >> > > -- >> > > =B7=FB=D3=C0=CC=CE >> > > >> > > >> > > >> > > >> > > -- >> > > =B7=FB=D3=C0=CC=CE >> > >> > >> > >> > >> > -- >> > =B7=FB=D3=C0=CC=CE >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --047d7bd75decdcf3dc04dab533c0 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Dear Brian and Eric,

kernel kernel-2.6.32-279.19.= 1.el6.x86_64.rpm still have this problem
I build the kernel from this srpm

/var/log/message
Apr 19 16:40:05 10 kernel:= XFS (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22.
Apr 19 = 16:40:05 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22 Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called fro= m line 1184 of file fs/xfs/xfs_vnodeops.c.  Return address =3D 0xfffff= fffa02d4bda
Apr 19 16:40:05 10 kernel: XFS (sdb): I/O Error Detected. Sh= utting down filesystem
Apr 19 16:40:05 10 kernel: XFS (sdb): Please umount the filesystem and rect= ify the problem(s)
Apr 19 16:40:07 10 kernel: XFS (sdb): xfs_log_force: = error 5 returned.
Apr 19 16:40:37 10 kernel: XFS (sdb): xfs_log_force: e= rror 5 returned.

systemtap script output:
--- xfs_imap -- module("xfs= ").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- r= eturn=3D0x16
vars: mp=3D0xffff88101801e800 tp=3D0xffff880ff143ac70 ino= =3D0xffffffff imap=3D0xffff88100e93bc08 flags=3D0x0 agbno=3D? agino=3D? agn= o=3D? blks_per_cluster=3D? chunk_agbno=3D? cluster_agbno=3D? error=3D? offs= et=3D? offset_agbno=3D? __func__=3D[...]
mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20
mp->m_sb: sb_agcount =3D= 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c= , sb_dblocks =3D 0x1b4900000
imap: im_blkno =3D 0x0, im_len =3D 0xe778, = im_boffset =3D 0xd997
kernel backtrace:
Returning from:  0xffffffffa02b4260 : xfs_imap+0x= 0/0x280 [xfs]
Returning to  :  0xffffffffa02b9d59 : xfs_inotob= p+0x49/0xc0 [xfs]
 0xffffffffa02b9ec1 : xfs_iunlink_remove+0xf1/0x3= 60 [xfs]
 0xffffffff814ede89
 0x0 (inexact)
user backtrace:
 0x3ec260e5ad [/lib64/
libpthread-2.12.so+0xe5ad/0x219000]
=
--- xfs_iunlink_remove -- module("xfs").function("xfs_iu= nlink_remove@fs/xfs/xfs_inode.c:1681").return -- return=3D0x16
vars: tp=3D0xffff880ff143ac70 ip=3D0xffff8811ed111000 next_ino=3D? mp=3D? a= gi=3D? dip=3D? agibp=3D? ibp=3D? agno=3D? agino=3D? next_agino=3D? last_ibp= =3D? last_dip=3D0xffff881000000001 bucket_index=3D? offset=3D? last_offset= =3D0xffffffffffff8811 error=3D? __func__=3D[...]
ip: i_ino =3D 0x1bd33, i_flags =3D 0x0
ip->i_d: di_nlink =3D 0x0, di_= gen =3D 0x53068791


<= /div>
again this happens exactly when glusterfs rebalance finishes on one of= the brick(this time it is current host)
glusterfs log:
[2= 013-04-19 16:40:03.835675] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht= : fixing the layout of /lib/kbd/consoletrans
[2013-04-19 16:40:03.842024] I [dht-common.c:2337:dht_setxattr] 0-testbug-d= ht: fixing the layout of /lib/kbd/consoletrans
[2013-04-19 16:40:03.8441= 20] I [dht-rebalance.c:1055:gf_defrag_migrate_data] 0-testbug-dht: migrate = data called on /lib/kbd/consoletrans
[2013-04-19 16:40:03.852926] I [dht-rebalance.c:1055:gf_defrag_migrate_data= ] 0-testbug-dht: migrate data called on /lib/kbd/consoletrans
[2013-04-1= 9 16:40:03.856602] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing= the layout of /lib/kbd/consoletrans
[2013-04-19 16:40:03.860231] I [dht-rebalance.c:1055:gf_defrag_migrate_data= ] 0-testbug-dht: migrate data called on /lib/kbd/consoletrans
[2013-04-1= 9 16:40:03.892069] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing= the layout of /lib/alsa
[2013-04-19 16:40:03.897155] I [dht-rebalance.c:1055:gf_defrag_migrate_data= ] 0-testbug-dht: migrate data called on /lib/alsa
[2013-04-19 16:40:03.8= 97582] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the layout = of /lib/alsa
[2013-04-19 16:40:03.901076] I [dht-rebalance.c:1055:gf_defrag_migrate_data= ] 0-testbug-dht: migrate data called on /lib/alsa
[2013-04-19 16:40:03.9= 03689] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the layout = of /lib/alsa
[2013-04-19 16:40:03.906643] I [dht-rebalance.c:1055:gf_defrag_migrate_data= ] 0-testbug-dht: migrate data called on /lib/alsa
[2013-04-19 16:40:03.9= 10744] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the layout = of /lib/alsa/init
[2013-04-19 16:40:03.913475] I [dht-rebalance.c:1055:gf_defrag_migrate_data= ] 0-testbug-dht: migrate data called on /lib/alsa/init
[2013-04-19 16:40= :03.915424] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the la= yout of /lib/alsa/init
[2013-04-19 16:40:03.918699] I [dht-rebalance.c:1055:gf_defrag_migrate_data= ] 0-testbug-dht: migrate data called on /lib/alsa/init
[2013-04-19 16:40= :03.920459] I [dht-common.c:2337:dht_setxattr] 0-testbug-dht: fixing the la= yout of /lib/alsa/init
[2013-04-19 16:40:03.922857] I [dht-rebalance.c:1055:gf_defrag_migrate_data= ] 0-testbug-dht: migrate data called on /lib/alsa/init
[2013-04-19 16:40= :05.107663] I [dht-rebalance.c:1611:gf_defrag_status_get] 0-glusterfs: Reba= lance is completed
[2013-04-19 16:40:05.107770] I [dht-rebalance.c:1614:gf_defrag_status_get] = 0-glusterfs: Files migrated: 993, size: 16161958687, lookups: 190891, failu= res: 8957
[2013-04-19 16:40:05.108628] W [glusterfsd.c:831:cleanup_and_e= xit] (-->/lib64/libc.so.6(clone+0x6d) [0x3ec22e767d] (-->/lib64/libpt= hread.so.0() [0x3ec2607851] (-->/usr/sbin/glusterfs(glusterfs_sigwaiter+= 0xdd) [0x405c9d]))) 0-: received signum (15), shutting down
[2013-04-19 16:40:05.109007] E [rpcsvc.c:1155:rpcsvc_program_unregister_por= tmap] 0-rpc-service: Could not unregister with portmap

<= /div>


2013/4/1= 9 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Brian and Eric= ,

I have applied your kernel path v2(add unlink trace) to kernel-2.6.32-279.= 19.1.el6.x86_64.rpm in out test cluster and start testing again.
Any progress will let you known. Thank you.


2013/4= /19 Brian Foster <bfoster@redhat.com>
On 04/18/2013 11:23 AM, =B7=FB=D3=C0=CC= =CE wrote:
> Hi Brian and Eric,
> The shutdown is not easy to produce but finally right now 2= of our
> servers in our test cluster xfs was shutdown.
>

Understood. We've been trying very hard to reproduce ourselves to= make
it easier to debug, but haven't been able to reproduce at all so far. This process allows us to make _some_ progress on the issue, even if it
is slower going than we'd like... ;)
Thanks again for the data. The racing behavior Eric called out (nice<= br> catch!) in his last mail lit up some light bulbs internally with regard
to some old locking issues triggered by XFS in the 6.3 kernel. The
following bug serves as an example:

https://bugzilla.redhat.com/show_bug.cgi?id=3D852847

... the fix for which went into the 2.6.32-279.19.1 6.3.z release. Could you move some or all of your servers to this kernel[1] and see how it
goes? The best case is it resolves the problem, worst case we carry on
debugging from there...

Brian

[1] -
http://mirror.= linux.duke.edu/pub/centos/6.3/updates/x86_64/Packages/kernel-2.6.32-279.19.= 1.el6.x86_64.rpm

> Sorry but the systemtap is interrupt and I didn't noticed that so = I
> didn't get systemtap logs.
>
> /var/log/message is same as before
> Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp(= )
> returned error 22.
> Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned=
> error 22
> Apr 18 22:43:14 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) calle= d
> from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return address =3D=
> 0xffffffffa02d44aa
> Apr 18 22:43:14 10 kernel: XFS (sdb): I/O Error Detected. Shutting dow= n
> filesystem
> Apr 18 22:43:14 10 kernel: XFS (sdb): Please umount the filesystem and=
> rectify the problem(s)
> Apr 18 22:43:20 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.=
>
> The metadump file is large I'll share it to you soon.
>
>
> 2013/4/18 Brian Foster <bfoster@redhat.com <mailto:bfoster@redhat.com>>
>
>     On 04/18/2013 04:25 AM, =B7=FB=D3=C0=CC=CE wrote:
>     > Hi Brian and Eric,
>     > Can I change as following to bypass it?
>
>     This is probably not a wise thing to do. The problem we&= #39;re seeing here
>     is indicative of a potentially larger problem than this = particular error
>     path. An inode is being unlinked and inactivated, but we= aren't finding
>     on the list where we expect it to be. Killing the error = return doesn't
>     eliminate the larger problem.
>
>     So while changes could end up being made in this area as= part of a fix,
>     I would not suggest making any changes beyond those desi= gned to help
>     debug until we have a better idea of root cause.
>
>     Brian
>
>     > --- a/xfs_inode.c
>     > +++ b/xfs_inode.c
>     > @@ -1764,7 +1764,7 @@ xfs_iunlink_remove(
>     >               &n= bsp;  */
>     >               &n= bsp; next_agino =3D
>     be32_to_cpu(agi->agi_unlinked[bucket_index]);
>     >               &n= bsp; last_ibp =3D NULL;
>     > -               = while (next_agino !=3D agino) {
>     > +               = while (next_agino !=3D agino && next_agino !=3D
>     NULLAGINO) {
>     >               &n= bsp;         /*
>     >               &n= bsp;          * If the last inode wasn't the o= ne
>     pointing to
>     >               &n= bsp;          * us, then release its buffer since = we're not
>     > @@ -1786,6 +1786,14 @@ xfs_iunlink_remove(
>     >               &n= bsp;         ASSERT(next_agino !=3D NULLAGINO);
>     >               &n= bsp;         ASSERT(next_agino !=3D 0);
>     >               &n= bsp; }
>     > +               = if (next_agino =3D=3D NULLAGINO) {
>     > +               =         /*
>     > +               =          *After search the list for the inode
>     being free
>     > +               =          *we still can't find it.
>     > +               =          */
>     > +               =         xfs_err(mp, "%s ino %lld not found in unli= nked
>     > list.",
>     > +               =                      = ;__func__, (unsigned long
>     > long)ip->i_ino);
>     > +               = }
>     >               &n= bsp; /*
>     >               &n= bsp;  * Now last_ibp points to the buffer previous to us on
>     >               &n= bsp;  * the unlinked list.  Pull us from the list.
>     > @@ -1810,16 +1818,20 @@ xfs_iunlink_remove(
>     >               &n= bsp; } else {
>     >               &n= bsp;         xfs_trans_brelse(tp, ibp);
>     >               &n= bsp; }
>     > -               = /*
>     > -               =  * Point the previous inode on the list to the
>     next inode.
>     > -               =  */
>     > -               = last_dip->di_next_unlinked =3D cpu_to_be32(next_agino);
>     > -               = ASSERT(next_agino !=3D 0);
>     > -               = offset =3D last_offset + offsetof(xfs_dinode_t,
>     > di_next_unlinked);
>     > -               = xfs_trans_inode_buf(tp, last_ibp);
>     > -               = xfs_trans_log_buf(tp, last_ibp, offset,
>     > -               =                   (offset + si= zeof(xfs_agino_t) - 1));
>     > -               = xfs_inobp_check(mp, last_ibp);
>     > +               = if (next_agino !=3D NULLAGINO) {
>     > +               =         /*
>     > +               =         * If only find the inode being free then
>     we modify
>     > +               =         * the unlinked list.
>     > +               =         * Point the previous inode on the list to the >     > next inode.
>     > +               =         */
>     > +               =         last_dip->di_next_unlinked =3D
>     > cpu_to_be32(next_agino);
>     > +               =         ASSERT(next_agino !=3D 0);
>     > +               =         offset =3D last_offset + offsetof(xfs_dinode_t,=
>     > di_next_unlinked);
>     > +               =         xfs_trans_inode_buf(tp, last_ibp);
>     > +               =         xfs_trans_log_buf(tp, last_ibp, offset,
>     > +               =                      = ;     (offset +
>     sizeof(xfs_agino_t)
>     > - 1));
>     > +               =         xfs_inobp_check(mp, last_ibp);
>     > +               = }
>     >         }
>     >         return 0;
>     >  }
>     >
>     > Thank you.
>     >
>     >
>     > 2013/4/18 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:<= a href=3D"mailto:yongtaofu@gmail.com" target=3D"_blank">yongtaofu@gmail.com= >
>     <mailto:yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>>= ;
>     >
>     >     Hi Brain and Eric,
>     >     If the problem is the agno can't = be found in the unlinked
>     list. Can
>     >     we just bypass it instead of passing = ino=3D0xffffffff to
>     xfs_inotobp?
>     >     Thank you.
>     >
>     >
>     >     2013/4/18 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com
>     <mailto:yongtaofu@gmail.com> <mailto:yongtaofu@gmail.com
>     <mailto:yongtaofu@gmail.com>>>
>     >
>     >         Hi Eric,
>     >         The shutdown issue is s= till not reproduced yet. But I get the
>     >         following error today d= uring test.
>     >
>     >         Apr 18 07:42:51 10 kern= el: Call Trace:
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d91ef>] ?
>     >         xfs_buf_cond_lock+0x2f/= 0xc0 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff814fe6a5>]
>     >         schedule_timeout+0x215/= 0x2e0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d5f07>] ?
>     >         kmem_zone_alloc+0x77/0x= f0 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff814ff5c2>]
>     __down+0x72/0xb0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02da652>] ?
>     >         _xfs_buf_find+0x102/0x2= 80 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: "echo 0 >
>     >         /proc/sys/kernel/hung_t= ask_timeout_secs" disables this
>     message.
>     >         Apr 18 07:42:51 10 kern= el: glusterfsd    D ffffffff8160b3c0
>     >         0 14522     &= nbsp;1 0x00000083
>     >         Apr 18 07:42:51 10 kern= el: ffff882015a63a28 0000000000000082
>     >         0000000000000000 000000= 0000000000
>     >         Apr 18 07:42:51 10 kern= el: ffff882015a639b8 ffffffffa02d91ef
>     >         ffff882015a639d8 000000= 0000000246
>     >         Apr 18 07:42:51 10 kern= el: ffff880e70491af8 ffff882015a63fd8
>     >         000000000000fb88 ffff88= 0e70491af8
>     >         Apr 18 07:42:51 10 kern= el: Call Trace:
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d91ef>] ?
>     >         xfs_buf_cond_lock+0x2f/= 0xc0 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff814fe6a5>]
>     >         schedule_timeout+0x215/= 0x2e0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d5f07>] ?
>     >         kmem_zone_alloc+0x77/0x= f0 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff814ff5c2>]
>     __down+0x72/0xb0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02da652>] ?
>     >         _xfs_buf_find+0x102/0x2= 80 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff81097ef1>] down+0x41/0x50
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02da493>]
>     >         xfs_buf_lock+0x53/0x110= [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02da652>]
>     >         _xfs_buf_find+0x102/0x2= 80 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02da83b>]
>     >         xfs_buf_get+0x6b/0x1a0 = [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02daeac>]
>     >         xfs_buf_read+0x2c/0x100= [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d0af8>]
>     >         xfs_trans_read_buf+0x1f= 8/0x400 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02b3444>]
>     >         xfs_read_agi+0x74/0x100= [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02b967b>]
>     >         xfs_iunlink+0x5b/0x180 = [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff810724c7>] ?
>     >         current_fs_time+0x27/0x= 30
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d12a7>] ?
>     >         xfs_trans_ichgtime+0x27= /0xa0 [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d15fb>]
>     >         xfs_droplink+0x5b/0x70 = [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02d2f9e>]
>     >         xfs_remove+0x27e/0x3a0 = [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff81186fd3>] ?
>     >         generic_permission+0x23= /0xb0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffffa02e0968>]
>     >         xfs_vn_unlink+0x48/0x90= [xfs]
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff81188c0f>]
>     vfs_unlink+0x9f/0xe0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff8118795a>] ?
>     >         lookup_hash+0x3a/0x50 >     >         Apr 18 07:42:51 10 kern= el: [<ffffffff8118b143>]
>     >         do_unlinkat+0x183/0x1c0=
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff81017938>] ?
>     >         syscall_trace_enter+0x1= d8/0x1e0
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff8118b196>]
>     sys_unlink+0x16/0x20
>     >         Apr 18 07:42:51 10 kern= el: [<ffffffff8100b308>]
>     tracesys+0xd9/0xde
>     >
>     >         Thank you.
>     >
>     >
>     >         2013/4/17 Eric Sandeen = <sandeen@sandee= n.net
>     <mailto:sandeen@sandeen.net>
>     >         <mailto:= sandeen@sandeen.ne= t <mailto:s= andeen@sandeen.net>>>
>     >
>     >             On Apr 16= , 2013, at 8:48 PM, =B7=FB=D3=C0=CC=CE
>     <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>
>     >             <= ;mailto:yongtaofu@= gmail.com
>     <mailto:yongtaofu@gmail.com>>> wrote:
>     >
>     >>             Hi Br= ain,
>     >>             Can I= change as following?
>     >
>     >             ASSERTS a= re no-ops in a non-debug kernel, so this won't
>     >             change an= y behavior.  I hope we'll know more if we get new
>     >             traces fr= om your patched kernel....
>     >
>     >             Eric
>     >
>     >>             --- a= /xfs_inode.c
>     >>             +++ b= /xfs_inode.c
>     >>             @@ -1= 773,6 +1773,8 @@ xfs_iunlink_remove(
>     >>              = ;                     &nb= sp; if (last_ibp !=3D NULL) {
>     >>              = ;                     &nb= sp;         xfs_trans_brelse(tp,
>     >>             last_= ibp);
>     >>              = ;                     &nb= sp; }
>     >>             + &nb= sp;                     &= nbsp;ASSERT(next_agino !=3D NULLAGINO);
>     >>             + &nb= sp;                     &= nbsp;ASSERT(next_agino !=3D 0);
>     >>              = ;                     &nb= sp; next_ino =3D XFS_AGINO_TO_INO(mp,
>     >>             agno,= next_agino);
>     >>              = ;                     &nb= sp; error =3D xfs_inotobp(mp, tp,
>     >>             next_= ino, &last_dip,
>     >>              = ;                     &nb= sp;                     &= amp;last_ibp,
>     >>             &= last_offset, 0);
>     >>             @@ -1= 783,8 +1785,6 @@ xfs_iunlink_remove(
>     >>              = ;                     &nb= sp;         return error;
>     >>              = ;                     &nb= sp; }
>     >>              = ;                     &nb= sp; next_agino =3D
>     >>             be32_= to_cpu(last_dip->di_next_unlinked);
>     >>             - &nb= sp;                     A= SSERT(next_agino !=3D NULLAGINO);
>     >>             - &nb= sp;                     A= SSERT(next_agino !=3D 0);
>     >>              = ;               }
>     >>              = ;               /*
>     >>              = ;                * Now last_ibp poi= nts to the buffer
>     >>             previ= ous to us on
>     >>
>     >>             Thank= you.
>     >>
>     >>
>     >>             2013/= 4/17 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com
>     <mailto:yongtaofu@gmail.com>
>     >>           =   <mailto:= yongtaofu@gmail.com
>     <mailto:yongtaofu@gmail.com>>>
>     >>
>     >>              = ;   Hi Brain,
>     >>              = ;   If it is because NULLAGINO is passed in  to
>     xfs_inotobp().
>     >>              = ;   Can I move the following two lines before
>     xfs_inotobp?
>     >>
>     >>              = ;   For example:
>     >>
>     >>              = ;   1767                 while= (next_agino !=3D agino) {
>     >>              = ;   1768                  = ;       /*
>     >>              = ;   1769                  = ;        * If the last inode
>     >>              = ;   wasn't the one pointing to
>     >>              = ;   1770                  = ;        * us, then release its
>     >>              = ;   buffer since we're not
>     >>              = ;   1771                  = ;        * going to do anything
>     >>              = ;   with it.
>     >>              = ;   1772                  = ;        */
>     >>              = ;   1773                  = ;       if (last_ibp !=3D NULL) {
>     >>              = ;   1774
>     >>              = ;   xfs_trans_brelse(tp, last_ibp);
>     >>              = ;   1775                  = ;       }
>     >>              = ;   1776                  = ;       next_ino =3D
>     >>              = ;   XFS_AGINO_TO_INO(mp, agno, next_agino);
>     >>              = ;   +                   &= nbsp;           ASSERT(next_agino !=3D
>     >>              = ;   NULLAGINO);
>     >>              = ;   +                   &= nbsp;           ASSERT(next_agino
>     !=3D 0);
>     >>              = ;   1777                  = ;       error =3D xfs_inotobp(mp,
>     >>              = ;   tp, next_ino, &last_dip,
>     >>              = ;   1778
>     >>              = ;   &last_ibp, &last_offset, 0);
>     >>              = ;   1779                  = ;       if (error) {
>     >>              = ;   1780                  = ;               xfs_warn(mp,
>     >>              = ;   1781                  = ;                     &nb= sp; "%s:
>     >>              = ;   xfs_inotobp() returned error %d.",
>     >>              = ;   1782
>     __func__,
>     >>              = ;   error);
>     >>              = ;   1783                  = ;               return error;
>     >>              = ;   1784                  = ;       }
>     >>              = ;   1785                  = ;       next_agino =3D
>     >>              = ;   be32_to_cpu(last_dip->di_next_unlinked);
>     >>              = ;   -
>     //ASSERT(next_agino !=3D
>     >>              = ;   NULLAGINO);
>     >>              = ;   -
>     //ASSERT(next_agino !=3D 0);
>     >>              = ;   1788                 }
>     >>              = ;   I don't understand xfs well and correct me if I'm
>     >>              = ;   totally wrong.
>     >>              = ;   Thank you very much.
>     >>
>     >>
>     >>              = ;   2013/4/17 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com
>     <mailto:yongtaofu@gmail.com>
>     >>           =       <mailto:yongtaofu@gmail.com
>     <mailto:yongtaofu@gmail.com>>>
>     >>
>     >>              = ;       Hi Brain,
>     >>              = ;       I want to ask a question, according to the
>     >>              = ;       shutdown trace. The ino in  xfs_iunlink_remove<= br> >     >>              = ;       is 0x113, why xfs_imap got ino=3D0xffffffff ?
>     >>
>     >>              = ;       --- xfs_imap --
>     >>
>     module("xfs").function("xfs_imap@fs/xfs/x= fs_ialloc.c:1257").return
>     >>              = ;       -- return=3D0x16
>     >>              = ;       vars: mp=3D0xffff882017a50800 tp=3D0xffff881c81797c7= 0
>     >>              = ;       ino=3D0xffffffff
>     >>
>     >>              = ;       --- xfs_iunlink_remove --
>     >>
>     module("xfs").function("xfs_iunlink_remov= e@fs/xfs/xfs_inode.c:1680").return
>     >>              = ;       -- return=3D0x16
>     >>              = ;       vars: tp=3D0xffff881c81797c70 ip=3D0xffff881003c13c0= 0
>     >>              = ;       next_ino=3D? mp=3D? agi=3D? dip=3D?
>     >>              = ;       agibp=3D0xffff880109b47e20 ibp=3D? agno=3D? agino=3D= ?
>     >>              = ;       next_agino=3D? last_ibp=3D?
>     >>              = ;       last_dip=3D0xffff882000000000 bucket_index=3D?
>     >>              = ;       offset=3D? last_offset=3D0xffffffffffff8810 error=3D= ?
>     >>              = ;       __func__=3D[...]
>     >>              = ;       ip: i_ino =3D 0x113, i_flags =3D 0x0
>     >>
>     >>              = ;       Thank you.
>     >>
>     >>
>     >>
>     >>              = ;       2013/4/17 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com
>     <mailto:yongtaofu@gmail.com>
>     >>            =         <mailto:yongtaofu@gmail.com
>     <mailto:yongtaofu@gmail.com>>>
>     >>
>     >>              = ;           Hi Brain,
>     >>              = ;           Thank you for your update, and I have = applied
>     >>              = ;           your last kernel patch. However it is = not
>     easy
>     >>              = ;           to reproduce especially in out test >     >>              = ;           environment. Till now is not happens a= gain.
>     >>              = ;           I'll update the kernel patch now. = BTW is
>     there
>     >>              = ;           any findings in the logs of previous t= hread?
>     >>
>     http://oss.sgi.com/archives/xfs/2013-04/msg0032= 7.html
>     >>              = ;           I guess it tend to happen during glust= erfs
>     >>              = ;           rebalance because glusterfs moves a lo= t of
>     >>              = ;           file from one server to another and th= en
>     >>              = ;           unlink it.
>     >>
>     >>              = ;           Thank you.
>     >>
>     >>
>     >>              = ;           2013/4/17 Brian Foster
>     <bfoster@redhat.com <mailto:bfoster@redhat.com>
>     >>            =             <mailto:bfoster@redhat.com
>     <mailto:bfoster@redhat.com>>>
>     >>
>     >>              = ;               On 04/16/2013 12:24 PM, = Dave Chinner
>     wrote:
>     >>              = ;               > On Mon, Apr 15, 201= 3 at 07:14:39PM
>     >>              = ;               -0400, Brian Foster wrot= e:
>     >>              = ;               >> Hi,
>     >>              = ;               >>
>     >>              = ;               >> Thanks for the = data in the
>     previous thread:
>     >>              = ;               >>
>     >>              = ;               >>
>     >>
>     http://oss.sgi.com/archives/xfs/2013-04/msg0032= 7.html
>     >>              = ;               >>
>     >>              = ;               ...
>     >>              = ;               >>
>     >>              = ;               >>     &= nbsp;echo 1 >
>     >>
>     /sys/kernel/debug/tracing/events/xfs/xfs_iunlink/enable<= br> >     >>              = ;               >>     &= nbsp;echo 1 >
>     >>
>     /sys/kernel/debug/tracing/events/xfs/xfs_iunlink_remove/= enable
>     >>              = ;               >>     &= nbsp;... reproduce ...
>     >>              = ;               >>     &= nbsp;cat
>     >>              = ;               /sys/kernel/debug/tracin= g/trace >
>     trace.output
>     >>              = ;               >
>     >>              = ;               > It's better to = use trace-cmd for this.
>     >>              = ;               it will result in less >     >>              = ;               > dropped events. i.e= .:
>     >>              = ;               >
>     >>              = ;               >      = ; $ trace-cmd record -e
>     xfs_iunlink\*
>     >>              = ;               >      = ; ... reproduce ...
>     >>              = ;               >      = ; ^C
>     >>              = ;               >      = ; $ trace-cmd report > trace.output
>     >>              = ;               >
>     >>              = ;               >> --- a/fs/xfs/li= nux-2.6/xfs_trace.h
>     >>              = ;               >> +++ b/fs/xfs/li= nux-2.6/xfs_trace.h
>     >>              = ;               >> @@ -581,6 +581,= 8 @@
>     >>              = ;               DEFINE_INODE_EVENT(xfs_f= ile_fsync);
>     >>              = ;               ...
>     >>              = ;               >
>     >>              = ;               > I would suggest tha= t the the tracing
>     >>              = ;               shoul dbe at entry of th= e
>     >>              = ;               > function, otherwise= we won't get a
>     >>              = ;               tracepoint for the opera= tion that
>     >>              = ;               > triggers the shutdo= wn. (That's the
>     >>              = ;               reason most tracepoints = in XFS
>     >>              = ;               > are at function ent= ry...)
>     >>              = ;               >
>     >>
>     >>              = ;               Good points, thanks Dave= . A v2 that pulls
>     >>              = ;               up the tracepoints towar= ds
>     >>              = ;               function entry is append= ed.
>     >>
>     >>              = ;               Brian
>     >>
>     >>              = ;               From
>     >>              = ;               280943e78ebe0b97a774cba5= 1e7815c42f044b55
>     >>              = ;               Mon Sep 17 00:00:00 2001=
>     >>              = ;               From: Brian Foster
>     <bfoster@redhat.com <mailto:bfoster@redhat.com>
>     >>           =                   <mailto:<= a href=3D"mailto:bfoster@redhat.com" target=3D"_blank">bfoster@redhat.com
>     <mailto:bfoster@redhat.com>>>
>     >>              = ;               Date: Mon, 15 Apr 2013 1= 8:16:24 -0400
>     >>              = ;               Subject: [PATCH v2] xfs:= add tracepoints
>     >>              = ;               for xfs_iunlink and
>     >>              = ;               xfs_iunlink_remove
>     >>
>     >>              = ;               ---
>     >>              = ;                fs/xfs/linux-2.6/x= fs_trace.h |    2 ++
>     >>              = ;                fs/xfs/xfs_inode.c=           |    4 ++++
>     >>              = ;                2 files changed, 6= insertions(+), 0
>     >>              = ;               deletions(-)
>     >>
>     >>              = ;               diff --git a/fs/xfs/linu= x-2.6/xfs_trace.h
>     >>              = ;               b/fs/xfs/linux-2.6/xfs_t= race.h
>     >>              = ;               index adc6ec4..338a0f9 1= 00644
>     >>              = ;               --- a/fs/xfs/linux-2.6/x= fs_trace.h
>     >>              = ;               +++ b/fs/xfs/linux-2.6/x= fs_trace.h
>     >>              = ;               @@ -583,6 +583,8 @@
>     >>              = ;               DEFINE_INODE_EVENT(xfs_f= ile_fsync);
>     >>              = ;                DEFINE_INODE_EVENT= (xfs_destroy_inode);
>     >>              = ;                DEFINE_INODE_EVENT= (xfs_dirty_inode);
>     >>              = ;                DEFINE_INODE_EVENT= (xfs_clear_inode);
>     >>              = ;               +DEFINE_INODE_EVENT(xfs_= iunlink);
>     >>              = ;               +DEFINE_INODE_EVENT(xfs_= iunlink_remove);
>     >>
>     >>              = ;                DEFINE_INODE_EVENT= (xfs_dquot_dqalloc);
>     >>              = ;                DEFINE_INODE_EVENT= (xfs_dquot_dqdetach);
>     >>              = ;               diff --git a/fs/xfs/xfs_= inode.c
>     >>              = ;               b/fs/xfs/xfs_inode.c
>     >>              = ;               index 19900f0..d705c77 1= 00644
>     >>              = ;               --- a/fs/xfs/xfs_inode.c=
>     >>              = ;               +++ b/fs/xfs/xfs_inode.c=
>     >>              = ;               @@ -1615,6 +1615,8 @@ xf= s_iunlink(
>     >>
>     >>              = ;                     &nb= sp; mp =3D tp->t_mountp;
>     >>
>     >>              = ;               +       t= race_xfs_iunlink(ip);
>     >>              = ;               +
>     >>              = ;                     &nb= sp; /*
>     >>              = ;                     &nb= sp;  * Get the agi buffer first.  It
>     >>              = ;               ensures lock ordering >     >>              = ;                     &nb= sp;  * on the list.
>     >>              = ;               @@ -1694,6 +1696,8 @@ xf= s_iunlink_remove(
>     >>              = ;                     &nb= sp; mp =3D tp->t_mountp;
>     >>              = ;                     &nb= sp; agno =3D XFS_INO_TO_AGNO(mp,
>     ip->i_ino);
>     >>
>     >>              = ;               +       t= race_xfs_iunlink_remove(ip);
>     >>              = ;               +
>     >>              = ;                     &nb= sp; /*
>     >>              = ;                     &nb= sp;  * Get the agi buffer first.  It
>     >>              = ;               ensures lock ordering >     >>              = ;                     &nb= sp;  * on the list.
>     >>              = ;               --
>     >>              = ;               1.7.7.6
>     >>
>     >>
>     >>
>     >>
>     >>              = ;           --
>     >>              = ;           =B7=FB=D3=C0=CC=CE
>     >>
>     >>
>     >>
>     >>
>     >>              = ;       --
>     >>              = ;       =B7=FB=D3=C0=CC=CE
>     >>
>     >>
>     >>
>     >>
>     >>              = ;   --
>     >>              = ;   =B7=FB=D3=C0=CC=CE
>     >>
>     >>
>     >>
>     >>
>     >>             -- >     >>             =B7= =FB=D3=C0=CC=CE
>     >>             _____= __________________________________________
>     >>             xfs m= ailing list
>     >>             xfs@oss.sgi.com <mai= lto:xfs@oss.sgi.com>
>     <mailto:xfs@oss.sgi.com <mailto:xfs@oss.sgi.com>>
>     >>           &n= bsp; = http://oss.sgi.com/mailman/listinfo/xfs
>     >
>     >
>     >
>     >
>     >         --
>     >         =B7=FB=D3=C0=CC=CE
>     >
>     >
>     >
>     >
>     >     --
>     >     =B7=FB=D3=C0=CC=CE
>     >
>     >
>     >
>     >
>     > --
>     > =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--047d7bd75decdcf3dc04dab533c0-- From k.doran0@kimo.com Fri Apr 19 07:11:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 839857CBF for ; Fri, 19 Apr 2013 07:11:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F1B0EAC002 for ; Fri, 19 Apr 2013 05:11:06 -0700 (PDT) X-ASG-Debug-ID: 1366373465-04cb6c2c1d39db30001-w1Z2WR Received: from mail.atlnx06.cloudapp.net ([137.117.81.60]) by cuda.sgi.com with ESMTP id PYbjZvefw2ohQ0pu for ; Fri, 19 Apr 2013 05:11:05 -0700 (PDT) X-Barracuda-Envelope-From: k.doran0@kimo.com X-Barracuda-Apparent-Source-IP: 137.117.81.60 Received: from [137.117.81.60] (localhost [IPv6:::1]) by mail.atlnx06.cloudapp.net (Postfix) with ESMTP id A5427E20F4; Fri, 19 Apr 2013 12:07:47 +0000 (UTC) Received: from 69.163.40.212 (SquirrelMail authenticated user admin) by 137.117.81.60 with HTTP; Fri, 19 Apr 2013 12:07:47 -0000 Message-ID: <156c7d9a8b12273e3d3dcea19f0dc360.squirrel@137.117.81.60> Date: Fri, 19 Apr 2013 12:07:47 -0000 Subject: The Reason I'm Contacting You. From: "Doran Kevin" X-ASG-Orig-Subj: The Reason I'm Contacting You. Reply-To: kdoran@kimo.com User-Agent: SquirrelMail/1.4.22 MIME-Version: 1.0 Content-Type: multipart/mixed;boundary="----=_20130419120747_44751" X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-Barracuda-Connect: UNKNOWN[137.117.81.60] X-Barracuda-Start-Time: 1366373465 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128566 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS ------=_20130419120747_44751 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Good Day, I am pleased to submit the attached PROPOSAL for your urgent attention.This is in regards to a financial transaction that will benefit both parties. Please, read carefully and get back to me for further discussion on the process. Thank you. Kevin Doran Fax: +44 (705) 366-0949 skype: dorankev62 ------=_20130419120747_44751 Content-Type: application/msword; name="The Proposal.rtf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="The Proposal.rtf" e1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcZGVmZjBcZGVmbGFuZzEwMzNcZGVmbGFuZ2ZlMTAzM3tc Zm9udHRibHtcZjBcZnN3aXNzXGZwcnEyXGZjaGFyc2V0MCBDYWxpYnJpO317XGYxXGZyb21hblxm cHJxMlxmY2hhcnNldDAgVGltZXMgTmV3IFJvbWFuO319DQp7XGNvbG9ydGJsIDtccmVkMTI4XGdy ZWVuMTI4XGJsdWUxMjg7XHJlZDI1NVxncmVlbjBcYmx1ZTA7XHJlZDBcZ3JlZW4xNzZcYmx1ZTI0 MDtccmVkNzlcZ3JlZW4xMjlcYmx1ZTE4OTt9DQp7XCpcZ2VuZXJhdG9yIE1zZnRlZGl0IDUuNDEu MjEuMjUwOTt9XHZpZXdraW5kNFx1YzFccGFyZFxub3dpZGN0bHBhclxzYjEwMFxzYTEwMFxjZjFc YlxpXGYwXGZzMjIgR29vZCBEYXksXHBhcg0KUGxlYXNlIGRvIGFjY2VwdCB0byBwYXJ0bmVyIHdp dGggbWUgb24gdGhpcyB1cmdlbnQgcHJvcG9zYWwuIEkgZ290IHlvdXIgY29udGFjdCB0aHJvdWdo IGEgcHJpdmF0ZSBzZWFyY2ggb24gYSBkaXJlY3RvcnkgYW5kIGhhZCBhIGRlZXAgZmVlbGluZyB0 aGF0IHlvdSB3aWxsIGJlIHJlbGlhYmxlIGFuZCBjYXBhYmxlIG9mIGFzc2lzdGluZyBtZSBhY2Nv bXBsaXNoIHRoaXMgdHJhbnNhY3Rpb24uXHBhcg0KSSBhbSBLZXZpbiBEb3JhbiwgdGhlIFNlbmlv ciBGdW5kIE1hbmFnZXIgZnJvbSBhIGJyYW5jaCBvZmZpY2Ugb2YgYSBMb25kb24gYmFuaywgaGVy ZSBpbiBVbml0ZWQgS2luZ2RvbS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBlbWFpbCBpcyB0byBzZWVr IHlvdXIgcGFydG5lcnNoaXAgZm9yIGEgYnVzaW5lc3MgdHJhbnNhY3Rpb24gdGhhdCB3aWxsIGdp dmUgdXMgYSBncmVhdCBvcHBvcnR1bml0eSBvZiBiZWluZyBpbiBwb3NzZXNzaW9uIG9mIGFuIHVu Y2xhaW1lZCBzdW0gb2YgXGNmMiAkMTIuNU0gKCBUd2VsdmUgTWlsbGlvbiwgRml2ZSBIdW5kcmVk IFRob3VzYW5kIFVuaXRlZCBTdGF0ZXMgRG9sbGFycyBPbmx5IClcY2YxICwgYW4gaW52ZXN0bWVu dCBkZXBvc2l0IHRoYXQgYmVsb25ncyB0byBvdXIgbGF0ZSBmb3JlaWduIEN1c3RvbWVyLiBccGFy DQpUaGUgcmVhc29uIGZvciBjb250YWN0aW5nIHlvdSBjYW1lIGFzIGEgcmVzdWx0IG9mIHRoZSBu ZWVkIHRvIHByZXNlbnQgYSBmb3JlaWduZXIgYXMgYSBiZW5lZmljaWFyeSB0byB0aGUgZnVuZCBz aW5jZSBvdXIgYmFuayBoYXMgbm90IHNlZW4gYW55IG9mIHRoZSByZWxhdGl2ZXMgdGhhdCBjYW1l IHVwIHRvIGNsYWltIHRoaXMgZnVuZCwgYW5kIGFsc28gZm9yIHRoZSBmYWN0IHRoYXQgdGhlIGJv YXJkIGhhcyByZXNvbHZlZCB0byBhbGxvdyB0aGlzIGZ1bmQgdG8gYmUgY29uZmlzY2F0ZWQgYnkg dGhlIEJyaXRpc2ggR292ZXJubWVudCBpbiB0aGUgZXZlbnQgdGhhdCBubyBiZW5lZmljaWFyeSBj b21lcyB1cC4gQXMgYW4gb2ZmaWNlciBvZiB0aGlzIGJhbmssIEkgY2Fubm90IGJlIGRpcmVjdGx5 IGNvbm5lY3RlZCB0byB0aGlzIG1vbmV5LCBzbyBteSBiYXNpYyBhaW0gb2YgY29udGFjdGluZyB5 b3UgaXMgdG8gYXNzaXN0IG1lIHJlY2VpdmUgdGhpcyBtb25leSBpbiB5b3VyIGJhbmsgYWNjb3Vu dCBhcyBhIGJlbmVmaWNpYXJ5LCBhbmQgZ2V0XGNmM1xiMCAgNDAlXGNmMVxiICBvZiB0aGUgdG90 YWwgZnVuZHMgYXMgY29tbWlzc2lvbi5ccGFyDQogSSB3aWxsIHByb3ZpZGUgeW91IHdpdGggYWxs IHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50cyBmcm9tIHRoZSBpbnZvbHZl ZCBhdXRob3JpdGllcyB0byBsZWdhbGx5IGJhY2sgdXAgdGhlIGNsYWltLCBzbyB0aGF0IHRoaXMg XGNmMiAkMTIuNU0gXGNmMSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIHlvdXIgbm9taW5hdGVkIGFj Y291bnQgc3VjY2Vzc2Z1bGx5LlxwYXINCklmIHRoaXMgcHJvcG9zYWwgc2F0aXNmaWVzIHlvdXIg aW50ZXJlc3QsIHRoZW4gZ2V0IGJhY2sgdG8gbWUgd2l0aCB0aGUgYmVsb3cgaW5mb3JtYXRpb246 IFxjZjNcYjAgRlVMTCBOQU1FUywgVEVMRVBIT05FL0ZBWCwgTU9CSUxFIE5VTUJFUlMsIEFERFJF U1MsIEFHRSAvIFNFWCBhbmQgT0NDVVBBVElPTi5cY2YxXGIgIFxwYXINCkkgd2lsbCBhcHByZWNp YXRlIGl0IHZlcnkgbXVjaCBpZiB5b3UgZG8gbm90IG1ha2UgdW5kdWUgYWR2YW50YWdlIG9mIHRo ZSB0cnVzdCBJIGhhdmUgYmVzdG93ZWQgb24geW91LkkgYXNzdXJlIHlvdSB3ZSBjYW4gYWNoaWV2 ZSBpdCBzdWNjZXNzZnVsbHkuXHBhcg0KXHBhcmRcbm93aWRjdGxwYXJcc2IxMDAgS2luZCByZWdh cmRzLFxwYXINCktldmluIERvcmFuXHBhcg0KRmF4XGNmNCA6ICs0NCA3MDUgMzY2IDA5NDlcY2Yx XGIwXGYxXHBhcg0KfQ0KAA== ------=_20130419120747_44751-- From rjohnston@sgi.com Fri Apr 19 07:18:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E4EE529DFA for ; Fri, 19 Apr 2013 07:18:06 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5ED8BAC001; Fri, 19 Apr 2013 05:18:03 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 19 Apr 2013 07:18:02 -0500 Message-ID: <51713600.4030608@sgi.com> Date: Fri, 19 Apr 2013 07:18:08 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: CC: XFS mailing list , Eric Sandeen Subject: Re: [PATCH] xfstests: Remove dependence of xfs_check script References: <1366307042.3762.32361.camel@chandra-dt.ibm.com> In-Reply-To: <1366307042.3762.32361.camel@chandra-dt.ibm.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks for submitting this patch Chandra, it has been committed. --Rich commit 187bccd310dc253feaebd69df4ccdda21eee12d0 Author: Chandra Seetharaman Date: Thu Apr 18 17:44:02 2013 +0000 xfstests: Remove dependence of xfs_check script From rjohnston@sgi.com Fri Apr 19 07:56:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 623B929DFA for ; Fri, 19 Apr 2013 07:56:09 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id CE848AC001; Fri, 19 Apr 2013 05:56:08 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 19 Apr 2013 07:56:08 -0500 Message-ID: <51713EEE.3080609@sgi.com> Date: Fri, 19 Apr 2013 07:56:14 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: CC: XFS mailing list Subject: Re: [PATCH] xfsprogs: Add depraction message for xfs_check References: <1366217244.3762.32327.camel@chandra-dt.ibm.com> In-Reply-To: <1366217244.3762.32327.camel@chandra-dt.ibm.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Looks good. Regards --Rich Reviewed-by: Rich Johnston From rjohnston@sgi.com Fri Apr 19 07:58:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 77EF029DFA for ; Fri, 19 Apr 2013 07:58:08 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6590B304053; Fri, 19 Apr 2013 05:58:05 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Fri, 19 Apr 2013 07:58:05 -0500 Message-ID: <51713F63.6030106@sgi.com> Date: Fri, 19 Apr 2013 07:58:11 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: CC: XFS mailing list Subject: Re: [PATCH] xfsprogs: Add depraction message for xfs_check References: <1366217244.3762.32327.camel@chandra-dt.ibm.com> In-Reply-To: <1366217244.3762.32327.camel@chandra-dt.ibm.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks for submitting this patch Chandra, it has been committed. --Rich commit 04e0266182839805213d8b1d94fd14d99e4a0420 Author: Chandra Seetharaman Date: Wed Apr 17 16:47:24 2013 +0000 xfsprogs: Add depraction message for xfs_check From sandeen@sandeen.net Fri Apr 19 09:59:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7F3007CBF for ; Fri, 19 Apr 2013 09:59:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0EBF4AC005 for ; Fri, 19 Apr 2013 07:59:36 -0700 (PDT) X-ASG-Debug-ID: 1366383574-04cb6c2c1d3ac550001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id IJkITlNvhnsMqqFU for ; Fri, 19 Apr 2013 07:59:34 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (unknown [69.38.217.3]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C9A386527BE7; Fri, 19 Apr 2013 09:59:33 -0500 (CDT) Message-ID: <51715BD4.8080501@sandeen.net> Date: Fri, 19 Apr 2013 07:59:32 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Brian Foster , "xfs@oss.sgi.com" Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366383574 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128578 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/19/13 4:41 AM, 符永涛 wrote: > Dear Brian and Eric, > > kernel kernel-2.6.32-279.19.1.el6.x86_64.rpm still have this problem > I build the kernel from this srpm > https://oss.oracle.com/ol6/SRPMS-updates/kernel-2.6.32-279.19.1.el6.src.rpm > > today the shutdown happens again during test. > Seelogs bellow: > > /var/log/message > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22. > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22 > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = 0xffffffffa02d4bda > Apr 19 16:40:05 10 kernel: XFS (sdb): I/O Error Detected. Shutting down filesystem > Apr 19 16:40:05 10 kernel: XFS (sdb): Please umount the filesystem and rectify the problem(s) > Apr 19 16:40:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 19 16:40:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > systemtap script output: > --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- return=0x16 > vars: mp=0xffff88101801e800 tp=0xffff880ff143ac70 ino=0xffffffff imap=0xffff88100e93bc08 flags=0x0 agbno=? agino=? agno=? blks_per_cluster=? chunk_agbno=? cluster_agbno=? error=? offset=? offset_agbno=? __func__=[...] > mp: m_agno_log = 0x5, m_agino_log = 0x20 > mp->m_sb: sb_agcount = 0x1c, sb_agblocks = 0xffffff0, sb_inopblog = 0x4, sb_agblklog = 0x1c, sb_dblocks = 0x1b4900000 > imap: im_blkno = 0x0, im_len = 0xe778, im_boffset = 0xd997 > kernel backtrace: > Returning from: 0xffffffffa02b4260 : xfs_imap+0x0/0x280 [xfs] > Returning to : 0xffffffffa02b9d59 : xfs_inotobp+0x49/0xc0 [xfs] > 0xffffffffa02b9ec1 : xfs_iunlink_remove+0xf1/0x360 [xfs] > 0xffffffff814ede89 > 0x0 (inexact) > user backtrace: > 0x3ec260e5ad [/lib64/libpthread-2.12.so +0xe5ad/0x219000] > > --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1681").return -- return=0x16 > vars: tp=0xffff880ff143ac70 ip=0xffff8811ed111000 next_ino=? mp=? agi=? dip=? agibp=? ibp=? agno=? agino=? next_agino=? last_ibp=? last_dip=0xffff881000000001 bucket_index=? offset=? last_offset=0xffffffffffff8811 error=? __func__=[...] > ip: i_ino = 0x1bd33, i_flags = 0x0 > ip->i_d: di_nlink = 0x0, di_gen = 0x53068791 > > debugfs events trace: > https://docs.google.com/file/d/0B7n2C4T5tfNCREZtdC1yamc0RnM/edit?usp=sharing Same issue, one file was unlinked twice in a race: === ino 0x6b133 === <...>-4477 [003] 2721.176790: xfs_iunlink: dev 8:16 ino 0x6b133 <...>-4477 [003] 2721.176839: xfs_iunlink_remove: dev 8:16 ino 0x6b133 <...>-4477 [009] 3320.127227: xfs_iunlink: dev 8:16 ino 0x6b133 <...>-4477 [001] 3320.141126: xfs_iunlink_remove: dev 8:16 ino 0x6b133 <...>-4477 [003] 7973.136368: xfs_iunlink: dev 8:16 ino 0x6b133 <...>-4479 [018] 7973.158457: xfs_iunlink: dev 8:16 ino 0x6b133 <...>-4479 [018] 7973.158497: xfs_iunlink_remove: dev 8:16 ino 0x6b133 -Eric From yongtaofu@gmail.com Fri Apr 19 10:13:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A525D7CBF for ; Fri, 19 Apr 2013 10:13:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 67DF78F8052 for ; Fri, 19 Apr 2013 08:13:21 -0700 (PDT) X-ASG-Debug-ID: 1366384399-04bdf02d1d3aaf70001-NocioJ Received: from mail-ia0-f177.google.com (mail-ia0-f177.google.com [209.85.210.177]) by cuda.sgi.com with ESMTP id U6zjjtv5N6EiBrPE (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 08:13:19 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.177] Received: by mail-ia0-f177.google.com with SMTP id y26so959975iab.22 for ; Fri, 19 Apr 2013 08:13:19 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=g1OBr5fYh6GqkK3Hfje9WFAH0OXI79FwO4sqvhag6xc=; b=RaeHvDX0mAdcgIMGDyFVzdx+Lna6I5sPR9WbLM3e/Kp6N0Db248A63kldZvtceHQkX 5uAjUlOXaWVhmLT7ylBXRkMrg5JKjGK7NGJKbF1/Mkpzg067vNKhPxA5NLdOOJVZ9QQ5 6RFr7L9qsZAyiuhOaXqP06iXBpb7s1nocqZir68k0E8Cy7UE7OrV0LSxh9foXxrIFF4r dyX0hT0fmgwbh0sAfeS/X9c9qvwE7R6L8zp5nxk87GELNoomAPx2PpGYiRSqlxrznaZt Ebg0lNC9zMHucmpFPYgKbRJq7QbINluQYoRKC56W0VkCN3m7SiTE8yqp0HTqmM1T/NlF 0Vug== MIME-Version: 1.0 X-Received: by 10.50.51.167 with SMTP id l7mr15668058igo.11.1366384399043; Fri, 19 Apr 2013 08:13:19 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 08:13:18 -0700 (PDT) In-Reply-To: <51715BD4.8080501@sandeen.net> References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> Date: Fri, 19 Apr 2013 23:13:18 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340b5fbba3e004dab82800 X-Barracuda-Connect: mail-ia0-f177.google.com[209.85.210.177] X-Barracuda-Start-Time: 1366384399 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128578 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 --14dae9340b5fbba3e004dab82800 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Sure the serious thing here is that it corrupt the unlinked list. The inode 0x1bd33 which trigger xfs shutdown is not 0x6b133. 2013/4/19 Eric Sandeen > On 4/19/13 4:41 AM, =B7=FB=D3=C0=CC=CE wrote: > > Dear Brian and Eric, > > > > kernel kernel-2.6.32-279.19.1.el6.x86_64.rpm < > http://mirror.linux.duke.edu/pub/centos/6.3/updates/x86_64/Packages/kerne= l-2.6.32-279.19.1.el6.x86_64.rpm> > still have this problem > > I build the kernel from this srpm > > > https://oss.oracle.com/ol6/SRPMS-updates/kernel-2.6.32-279.19.1.el6.src.r= pm > > > > today the shutdown happens again during test. > > Seelogs bellow: > > > > /var/log/message > > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() > returned error 22. > > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned > error 22 > > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called > from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D > 0xffffffffa02d4bda > > Apr 19 16:40:05 10 kernel: XFS (sdb): I/O Error Detected. Shutting down > filesystem > > Apr 19 16:40:05 10 kernel: XFS (sdb): Please umount the filesystem and > rectify the problem(s) > > Apr 19 16:40:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > Apr 19 16:40:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > > > systemtap script output: > > --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:12= 57").return > -- return=3D0x16 > > vars: mp=3D0xffff88101801e800 tp=3D0xffff880ff143ac70 ino=3D0xffffffff > imap=3D0xffff88100e93bc08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_p= er_cluster=3D? > chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? _= _func__=3D[...] > > mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 > > mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog = =3D 0x4, > sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 > > imap: im_blkno =3D 0x0, im_len =3D 0xe778, im_boffset =3D 0xd997 > > kernel backtrace: > > Returning from: 0xffffffffa02b4260 : xfs_imap+0x0/0x280 [xfs] > > Returning to : 0xffffffffa02b9d59 : xfs_inotobp+0x49/0xc0 [xfs] > > 0xffffffffa02b9ec1 : xfs_iunlink_remove+0xf1/0x360 [xfs] > > 0xffffffff814ede89 > > 0x0 (inexact) > > user backtrace: > > 0x3ec260e5ad [/lib64/libpthread-2.12.so >+0xe5ad/0x219000] > > > > --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs= /xfs/xfs_inode.c:1681").return > -- return=3D0x16 > > vars: tp=3D0xffff880ff143ac70 ip=3D0xffff8811ed111000 next_ino=3D? mp= =3D? agi=3D? > dip=3D? agibp=3D? ibp=3D? agno=3D? agino=3D? next_agino=3D? last_ibp=3D? > last_dip=3D0xffff881000000001 bucket_index=3D? offset=3D? > last_offset=3D0xffffffffffff8811 error=3D? __func__=3D[...] > > ip: i_ino =3D 0x1bd33, i_flags =3D 0x0 > > ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x53068791 > > > > debugfs events trace: > > > https://docs.google.com/file/d/0B7n2C4T5tfNCREZtdC1yamc0RnM/edit?usp=3Dsh= aring > > Same issue, one file was unlinked twice in a race: > > =3D=3D=3D ino 0x6b133 =3D=3D=3D > <...>-4477 [003] 2721.176790: xfs_iunlink: dev 8:16 ino > 0x6b133 > <...>-4477 [003] 2721.176839: xfs_iunlink_remove: dev 8:16 > ino 0x6b133 > <...>-4477 [009] 3320.127227: xfs_iunlink: dev 8:16 ino > 0x6b133 > <...>-4477 [001] 3320.141126: xfs_iunlink_remove: dev 8:16 > ino 0x6b133 > <...>-4477 [003] 7973.136368: xfs_iunlink: dev 8:16 ino > 0x6b133 > <...>-4479 [018] 7973.158457: xfs_iunlink: dev 8:16 ino > 0x6b133 > <...>-4479 [018] 7973.158497: xfs_iunlink_remove: dev 8:16 > ino 0x6b133 > > -Eric > > --=20 =B7=FB=D3=C0=CC=CE --14dae9340b5fbba3e004dab82800 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Sure the serious thing here is that it corrupt the unlinke= d list. The inode 0x1bd33 which trigger xfs shutdown is not  0x6b133.<= /div>


2013/4/1= 9 Eric Sandeen <sandeen@sandeen.net>
On 4/19/13 4:41 AM, =B7=FB= =D3=C0=CC=CE wrote:
> Dear Brian and Eric,
>
> kernel kernel-2.6.32-279.19.1.el6.x86_64.rpm <http://mirror.linux.duke.edu/= pub/centos/6.3/updates/x86_64/Packages/kernel-2.6.32-279.19.1.el6.x86_64.rp= m> still have this problem
> I build the kernel from this srpm
> https://oss.oracle.com/ol6/SRPMS-update= s/kernel-2.6.32-279.19.1.el6.src.rpm
>
> today the shutdown happens again during test.
> Seelogs bellow:
>
> /var/log/message
> Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp(= ) returned error 22.
> Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned= error 22
> Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) calle= d from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return address =3D 0x= ffffffffa02d4bda
> Apr 19 16:40:05 10 kernel: XFS (sdb): I/O Error Detected. Shutting dow= n filesystem
> Apr 19 16:40:05 10 kernel: XFS (sdb): Please umount the filesystem and= rectify the problem(s)
> Apr 19 16:40:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.=
> Apr 19 16:40:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.=
>
> systemtap script output:
> --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs= /xfs_ialloc.c:1257").return -- return=3D0x16
> vars: mp=3D0xffff88101801e800 tp=3D0xffff880ff143ac70 ino=3D0xffffffff= imap=3D0xffff88100e93bc08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_pe= r_cluster=3D? chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset= _agbno=3D? __func__=3D[...]
> mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20
> mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopbl= og =3D 0x4, sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000
> imap: im_blkno =3D 0x0, im_len =3D 0xe778, im_boffset =3D 0xd997
> kernel backtrace:
> Returning from:  0xffffffffa02b4260 : xfs_imap+0x0/0x280 [xfs] > Returning to  :  0xffffffffa02b9d59 : xfs_inotobp+0x49/0xc0 = [xfs]
>  0xffffffffa02b9ec1 : xfs_iunlink_remove+0xf1/0x360 [xfs]
>  0xffffffff814ede89
>  0x0 (inexact)
> user backtrace:
>  0x3ec260e5ad [/lib64/libpthread-2.12.so <http://libpthread-2.12.so>+0xe5ad/0= x219000]
>
> --- xfs_iunlink_remove -- module("xfs").function("xfs_i= unlink_remove@fs/xfs/xfs_inode.c:1681").return -- return=3D0x16
> vars: tp=3D0xffff880ff143ac70 ip=3D0xffff8811ed111000 next_ino=3D? mp= =3D? agi=3D? dip=3D? agibp=3D? ibp=3D? agno=3D? agino=3D? next_agino=3D? la= st_ibp=3D? last_dip=3D0xffff881000000001 bucket_index=3D? offset=3D? last_o= ffset=3D0xffffffffffff8811 error=3D? __func__=3D[...]
> ip: i_ino =3D 0x1bd33, i_flags =3D 0x0
> ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x53068791
>
> debugfs events trace:
> https://docs.google.com/file/d/0B7n2= C4T5tfNCREZtdC1yamc0RnM/edit?usp=3Dsharing

Same issue, one file was unlinked twice in a race:

=3D=3D=3D ino 0x6b133 =3D=3D=3D
           <...>-4477  [003]  = ;2721.176790: xfs_iunlink: dev 8:16 ino 0x6b133
           <...>-4477  [003]  = ;2721.176839: xfs_iunlink_remove: dev 8:16 ino 0x6b133
           <...>-4477  [009]  = ;3320.127227: xfs_iunlink: dev 8:16 ino 0x6b133
           <...>-4477  [001]  = ;3320.141126: xfs_iunlink_remove: dev 8:16 ino 0x6b133
           <...>-4477  [003]  = ;7973.136368: xfs_iunlink: dev 8:16 ino 0x6b133
           <...>-4479  [018]  = ;7973.158457: xfs_iunlink: dev 8:16 ino 0x6b133
           <...>-4479  [018]  = ;7973.158497: xfs_iunlink_remove: dev 8:16 ino 0x6b133

-Eric




--
=B7=FB=D3= =C0=CC=CE
--14dae9340b5fbba3e004dab82800-- From yongtaofu@gmail.com Fri Apr 19 10:18:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 812517F37 for ; Fri, 19 Apr 2013 10:18:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E4AF2AC003 for ; Fri, 19 Apr 2013 08:18:54 -0700 (PDT) X-ASG-Debug-ID: 1366384732-04cbb057f8395a00001-NocioJ Received: from mail-ie0-f174.google.com (mail-ie0-f174.google.com [209.85.223.174]) by cuda.sgi.com with ESMTP id DaZK9XhjhDzazfhc (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 08:18:52 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] Received: by mail-ie0-f174.google.com with SMTP id 10so4732066ied.5 for ; Fri, 19 Apr 2013 08:18:52 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=iVG8ymN49ukcPyXOID/LGvgXj/+iLzYjsDB5IXrieIg=; b=dHzger0RAnjy2h/lPRVfv8bNVGWpv2m6+vEAnUjWgm1fEst7G0JDCfTiOTMgCQ1N9/ Wu6VFo8di9VsDODBGNq1tF557y/dE/qtRBpfWl+vQ6CFd6pJmOpHkd1V5QQ2+3Ozpdco /VyQ1PN+9JYEruHG1x6bVxld+CHK0ecOBS4RVw4zybnNpW/ykOlS+/FW8vVmOp6KAiT9 e1UVyTB0DmcLM6nhF5qOBYOnDH46BA1RDwbFJpiienazLUXiBMGrdWicYOEAqrJwnTo2 kS9V4CuWnF8eWrtyxpl+gWgUqB6N+vmnNs5KnLS3tdPrYTowKSky1rb20mjhDFIdEaTp j/fA== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr15841449igq.51.1366384732417; Fri, 19 Apr 2013 08:18:52 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 08:18:52 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <20130416162417.GC13938@destitution> <516D87E3.2010605@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> Date: Fri, 19 Apr 2013 23:18:52 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee79a83ed04dab83cd9 X-Barracuda-Connect: mail-ie0-f174.google.com[209.85.223.174] X-Barracuda-Start-Time: 1366384732 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128580 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 --14dae9340ee79a83ed04dab83cd9 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Dear Eric, If it's racing issue where the lock is introduced? I want to study the code from you. Thank you. 2013/4/19 =B7=FB=D3=C0=CC=CE > Sure the serious thing here is that it corrupt the unlinked list. The > inode 0x1bd33 which trigger xfs shutdown is not 0x6b133. > > > 2013/4/19 Eric Sandeen > >> On 4/19/13 4:41 AM, =B7=FB=D3=C0=CC=CE wrote: >> > Dear Brian and Eric, >> > >> > kernel kernel-2.6.32-279.19.1.el6.x86_64.rpm < >> http://mirror.linux.duke.edu/pub/centos/6.3/updates/x86_64/Packages/kern= el-2.6.32-279.19.1.el6.x86_64.rpm> >> still have this problem >> > I build the kernel from this srpm >> > >> https://oss.oracle.com/ol6/SRPMS-updates/kernel-2.6.32-279.19.1.el6.src.= rpm >> > >> > today the shutdown happens again during test. >> > Seelogs bellow: >> > >> > /var/log/message >> > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp(= ) >> returned error 22. >> > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned >> error 22 >> > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) calle= d >> from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D >> 0xffffffffa02d4bda >> > Apr 19 16:40:05 10 kernel: XFS (sdb): I/O Error Detected. Shutting dow= n >> filesystem >> > Apr 19 16:40:05 10 kernel: XFS (sdb): Please umount the filesystem and >> rectify the problem(s) >> > Apr 19 16:40:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. >> > Apr 19 16:40:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. >> > >> > systemtap script output: >> > --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1= 257").return >> -- return=3D0x16 >> > vars: mp=3D0xffff88101801e800 tp=3D0xffff880ff143ac70 ino=3D0xffffffff >> imap=3D0xffff88100e93bc08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_= per_cluster=3D? >> chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset_agbno=3D? = __func__=3D[...] >> > mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 >> > mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopblog = =3D >> 0x4, sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 >> > imap: im_blkno =3D 0x0, im_len =3D 0xe778, im_boffset =3D 0xd997 >> > kernel backtrace: >> > Returning from: 0xffffffffa02b4260 : xfs_imap+0x0/0x280 [xfs] >> > Returning to : 0xffffffffa02b9d59 : xfs_inotobp+0x49/0xc0 [xfs] >> > 0xffffffffa02b9ec1 : xfs_iunlink_remove+0xf1/0x360 [xfs] >> > 0xffffffff814ede89 >> > 0x0 (inexact) >> > user backtrace: >> > 0x3ec260e5ad [/lib64/libpthread-2.12.so > >+0xe5ad/0x219000] >> > >> > --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@f= s/xfs/xfs_inode.c:1681").return >> -- return=3D0x16 >> > vars: tp=3D0xffff880ff143ac70 ip=3D0xffff8811ed111000 next_ino=3D? mp= =3D? agi=3D? >> dip=3D? agibp=3D? ibp=3D? agno=3D? agino=3D? next_agino=3D? last_ibp=3D? >> last_dip=3D0xffff881000000001 bucket_index=3D? offset=3D? >> last_offset=3D0xffffffffffff8811 error=3D? __func__=3D[...] >> > ip: i_ino =3D 0x1bd33, i_flags =3D 0x0 >> > ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x53068791 >> > >> > debugfs events trace: >> > >> https://docs.google.com/file/d/0B7n2C4T5tfNCREZtdC1yamc0RnM/edit?usp=3Ds= haring >> >> Same issue, one file was unlinked twice in a race: >> >> =3D=3D=3D ino 0x6b133 =3D=3D=3D >> <...>-4477 [003] 2721.176790: xfs_iunlink: dev 8:16 ino >> 0x6b133 >> <...>-4477 [003] 2721.176839: xfs_iunlink_remove: dev 8:16 >> ino 0x6b133 >> <...>-4477 [009] 3320.127227: xfs_iunlink: dev 8:16 ino >> 0x6b133 >> <...>-4477 [001] 3320.141126: xfs_iunlink_remove: dev 8:16 >> ino 0x6b133 >> <...>-4477 [003] 7973.136368: xfs_iunlink: dev 8:16 ino >> 0x6b133 >> <...>-4479 [018] 7973.158457: xfs_iunlink: dev 8:16 ino >> 0x6b133 >> <...>-4479 [018] 7973.158497: xfs_iunlink_remove: dev 8:16 >> ino 0x6b133 >> >> -Eric >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee79a83ed04dab83cd9 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Dear Eric,
If it's racing issue where th= e lock is introduced? I want to study the code from you. Thank you.


2013/4/19 = =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Sure the serious thing here= is that it corrupt the unlinked list. The inode 0x1bd33 which trigger xfs = shutdown is not  0x6b133.


2013/4/19 Eric Sandeen <sandeen@sandeen.net>
On 4/19/13 4:41 AM, =B7=FB=D3=C0=CC=CE = wrote:
> Dear Brian and Eric,
>
> kernel kernel-2.6.32-279.19.1.el6.x86_64.rpm <http://mirror.linux.duke.edu/= pub/centos/6.3/updates/x86_64/Packages/kernel-2.6.32-279.19.1.el6.x86_64.rp= m> still have this problem
> I build the kernel from this srpm
> https://oss.oracle.com/ol6/SRPMS-update= s/kernel-2.6.32-279.19.1.el6.src.rpm
>
> today the shutdown happens again during test.
> Seelogs bellow:
>
> /var/log/message
> Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp(= ) returned error 22.
> Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned= error 22
> Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) calle= d from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return address =3D 0x= ffffffffa02d4bda
> Apr 19 16:40:05 10 kernel: XFS (sdb): I/O Error Detected. Shutting dow= n filesystem
> Apr 19 16:40:05 10 kernel: XFS (sdb): Please umount the filesystem and= rectify the problem(s)
> Apr 19 16:40:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.=
> Apr 19 16:40:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.=
>
> systemtap script output:
> --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs= /xfs_ialloc.c:1257").return -- return=3D0x16
> vars: mp=3D0xffff88101801e800 tp=3D0xffff880ff143ac70 ino=3D0xffffffff= imap=3D0xffff88100e93bc08 flags=3D0x0 agbno=3D? agino=3D? agno=3D? blks_pe= r_cluster=3D? chunk_agbno=3D? cluster_agbno=3D? error=3D? offset=3D? offset= _agbno=3D? __func__=3D[...]
> mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20
> mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, sb_inopbl= og =3D 0x4, sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000
> imap: im_blkno =3D 0x0, im_len =3D 0xe778, im_boffset =3D 0xd997
> kernel backtrace:
> Returning from:  0xffffffffa02b4260 : xfs_imap+0x0/0x280 [xfs] > Returning to  :  0xffffffffa02b9d59 : xfs_inotobp+0x49/0xc0 = [xfs]
>  0xffffffffa02b9ec1 : xfs_iunlink_remove+0xf1/0x360 [xfs]
>  0xffffffff814ede89
>  0x0 (inexact)
> user backtrace:
>  0x3ec260e5ad [/lib64/libpthread-2.12.so <http://libpthread-2.12.so>+0xe5ad/0= x219000]
>
> --- xfs_iunlink_remove -- module("xfs").function("xfs_i= unlink_remove@fs/xfs/xfs_inode.c:1681").return -- return=3D0x16
> vars: tp=3D0xffff880ff143ac70 ip=3D0xffff8811ed111000 next_ino=3D? mp= =3D? agi=3D? dip=3D? agibp=3D? ibp=3D? agno=3D? agino=3D? next_agino=3D? la= st_ibp=3D? last_dip=3D0xffff881000000001 bucket_index=3D? offset=3D? last_o= ffset=3D0xffffffffffff8811 error=3D? __func__=3D[...]
> ip: i_ino =3D 0x1bd33, i_flags =3D 0x0
> ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x53068791
>
> debugfs events trace:
> https://docs.google.com/file/d/0B7n2= C4T5tfNCREZtdC1yamc0RnM/edit?usp=3Dsharing

Same issue, one file was unlinked twice in a race:

=3D=3D=3D ino 0x6b133 =3D=3D=3D
           <...>-4477  [003]  = ;2721.176790: xfs_iunlink: dev 8:16 ino 0x6b133
           <...>-4477  [003]  = ;2721.176839: xfs_iunlink_remove: dev 8:16 ino 0x6b133
           <...>-4477  [009]  = ;3320.127227: xfs_iunlink: dev 8:16 ino 0x6b133
           <...>-4477  [001]  = ;3320.141126: xfs_iunlink_remove: dev 8:16 ino 0x6b133
           <...>-4477  [003]  = ;7973.136368: xfs_iunlink: dev 8:16 ino 0x6b133
           <...>-4479  [018]  = ;7973.158457: xfs_iunlink: dev 8:16 ino 0x6b133
           <...>-4479  [018]  = ;7973.158497: xfs_iunlink_remove: dev 8:16 ino 0x6b133

-Eric




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--14dae9340ee79a83ed04dab83cd9-- From sandeen@sandeen.net Fri Apr 19 11:16:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0F3967CBF for ; Fri, 19 Apr 2013 11:16:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F11518F8066 for ; Fri, 19 Apr 2013 09:16:15 -0700 (PDT) X-ASG-Debug-ID: 1366388174-04cb6c3c6849f90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id yt3Grymq0mEqxjAT for ; Fri, 19 Apr 2013 09:16:14 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (unknown [69.38.217.10]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 29F6A6527BE6; Fri, 19 Apr 2013 11:16:13 -0500 (CDT) Message-ID: <51716DCB.4060407@sandeen.net> Date: Fri, 19 Apr 2013 09:16:11 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?GB2312?B?t/vTwMzO?= CC: Brian Foster , "xfs@oss.sgi.com" Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366388174 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128582 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/19/13 8:18 AM, ·ûÓÀÌÎ wrote: > Dear Eric, > If it's racing issue where the lock is introduced? I want to study the code from you. Thank you. > essentially: xfs_remove() { ... xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); ... xfs_droplink() You are 100% sure that you were running the 279.19.1 kernel? (I'm not very familiar with Oracle's clone of RHEL - I assume that they have copied all of Red Hat's work verbatim, but I have not looked) Can you verify that in: __rwsem_do_wake() the undo target looks like: out: return sem; /* undo the change to the active count, but check for a transition * 1->0 */ undo: if (rwsem_atomic_update(-RWSEM_ACTIVE_BIAS, sem) & RWSEM_ACTIVE_MASK) goto out; goto try_again; thanks, -Eric > 2013/4/19 ·ûÓÀÌÎ > > > Sure the serious thing here is that it corrupt the unlinked list. The inode 0x1bd33 which trigger xfs shutdown is not 0x6b133. > > > 2013/4/19 Eric Sandeen > > > On 4/19/13 4:41 AM, ·ûÓÀÌÎ wrote: > > Dear Brian and Eric, > > > > kernel kernel-2.6.32-279.19.1.el6.x86_64.rpm still have this problem > > I build the kernel from this srpm > > https://oss.oracle.com/ol6/SRPMS-updates/kernel-2.6.32-279.19.1.el6.src.rpm > > > > today the shutdown happens again during test. > > Seelogs bellow: > > > > /var/log/message > > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22. > > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22 > > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = 0xffffffffa02d4bda > > Apr 19 16:40:05 10 kernel: XFS (sdb): I/O Error Detected. Shutting down filesystem > > Apr 19 16:40:05 10 kernel: XFS (sdb): Please umount the filesystem and rectify the problem(s) > > Apr 19 16:40:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > Apr 19 16:40:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > > > systemtap script output: > > --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- return=0x16 > > vars: mp=0xffff88101801e800 tp=0xffff880ff143ac70 ino=0xffffffff imap=0xffff88100e93bc08 flags=0x0 agbno=? agino=? agno=? blks_per_cluster=? chunk_agbno=? cluster_agbno=? error=? offset=? offset_agbno=? __func__=[...] > > mp: m_agno_log = 0x5, m_agino_log = 0x20 > > mp->m_sb: sb_agcount = 0x1c, sb_agblocks = 0xffffff0, sb_inopblog = 0x4, sb_agblklog = 0x1c, sb_dblocks = 0x1b4900000 > > imap: im_blkno = 0x0, im_len = 0xe778, im_boffset = 0xd997 > > kernel backtrace: > > Returning from: 0xffffffffa02b4260 : xfs_imap+0x0/0x280 [xfs] > > Returning to : 0xffffffffa02b9d59 : xfs_inotobp+0x49/0xc0 [xfs] > > 0xffffffffa02b9ec1 : xfs_iunlink_remove+0xf1/0x360 [xfs] > > 0xffffffff814ede89 > > 0x0 (inexact) > > user backtrace: > > 0x3ec260e5ad [/lib64/libpthread-2.12.so +0xe5ad/0x219000] > > > > --- xfs_iunlink_remove -- module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1681").return -- return=0x16 > > vars: tp=0xffff880ff143ac70 ip=0xffff8811ed111000 next_ino=? mp=? agi=? dip=? agibp=? ibp=? agno=? agino=? next_agino=? last_ibp=? last_dip=0xffff881000000001 bucket_index=? offset=? last_offset=0xffffffffffff8811 error=? __func__=[...] > > ip: i_ino = 0x1bd33, i_flags = 0x0 > > ip->i_d: di_nlink = 0x0, di_gen = 0x53068791 > > > > debugfs events trace: > > https://docs.google.com/file/d/0B7n2C4T5tfNCREZtdC1yamc0RnM/edit?usp=sharing > > Same issue, one file was unlinked twice in a race: > > === ino 0x6b133 === > <...>-4477 [003] 2721.176790: xfs_iunlink: dev 8:16 ino 0x6b133 > <...>-4477 [003] 2721.176839: xfs_iunlink_remove: dev 8:16 ino 0x6b133 > <...>-4477 [009] 3320.127227: xfs_iunlink: dev 8:16 ino 0x6b133 > <...>-4477 [001] 3320.141126: xfs_iunlink_remove: dev 8:16 ino 0x6b133 > <...>-4477 [003] 7973.136368: xfs_iunlink: dev 8:16 ino 0x6b133 > <...>-4479 [018] 7973.158457: xfs_iunlink: dev 8:16 ino 0x6b133 > <...>-4479 [018] 7973.158497: xfs_iunlink_remove: dev 8:16 ino 0x6b133 > > -Eric > > > > > -- > ·ûÓÀÌÎ > > > > > -- > ·ûÓÀÌÎ From yongtaofu@gmail.com Fri Apr 19 11:47:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A27BA29DFA for ; Fri, 19 Apr 2013 11:47:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 22742AC002 for ; Fri, 19 Apr 2013 09:47:49 -0700 (PDT) X-ASG-Debug-ID: 1366390066-04cb6c6e2b291790001-NocioJ Received: from mail-ie0-f170.google.com (mail-ie0-f170.google.com [209.85.223.170]) by cuda.sgi.com with ESMTP id 9G5JeWRrEvb6dLmF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 09:47:46 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.170 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.170] Received: by mail-ie0-f170.google.com with SMTP id at1so1320718iec.29 for ; Fri, 19 Apr 2013 09:47:46 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.170] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.170] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=Pt1EPeULpZkiSzrmNdEAtg1Cp69gybwxCBEIlubK20o=; b=MxbQ8JgrzgjpyoiSL3jIyH4jvI4hcV8k94FO5rOn0vacHefSmj8CNkBRNZVAAXxlSO 5mksJB+g2chf7zk1U90g+0umPbWQKCvoRGXLn8vw38xlt+NkO/EbaY86qefmyqJkQUB+ vPnH3am9eXRrIZp9Pl4C0H3EJjQ+CEtDbAchilG2KkGHxG1cNKdBBkT2E7QgxgYJ66Gs luDD5FvCh3Kmneey4IniCAJeBEq1igoyR2Ox5HgHDVTFWHlpfQWU43UTmzlat+8UFnXo MUvzwZg4+CpYnJA2wlcpH0tQzboXOw1+UqurX6MJ6IrLKrVqmyjxhyaVL2LPfqfdy8o8 r/LQ== MIME-Version: 1.0 X-Received: by 10.42.65.75 with SMTP id k11mr7272871ici.26.1366390066237; Fri, 19 Apr 2013 09:47:46 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 09:47:46 -0700 (PDT) In-Reply-To: <51716DCB.4060407@sandeen.net> References: <516C89DF.4070904@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> Date: Sat, 20 Apr 2013 00:47:46 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=90e6ba3fcd278625cb04dab97aba X-Barracuda-Connect: mail-ie0-f170.google.com[209.85.223.170] X-Barracuda-Start-Time: 1366390066 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128586 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 --90e6ba3fcd278625cb04dab97aba Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Eric, Here's the server info: [root@10.23.72.95 ~]# rpm -qa|grep kernel kernel-debug-debuginfo-2.6.32-279.19.1.el6.x86_64 kernel-headers-2.6.32-279.19.1.el6.x86_64 abrt-addon-kerneloops-2.0.8-6.el6.x86_64 dracut-kernel-004-283.el6.noarch kernel-debuginfo-common-x86_64-2.6.32-279.19.1.el6.x86_64 kernel-debuginfo-2.6.32-279.19.1.el6.x86_64 kernel-debug-2.6.32-279.19.1.el6.x86_64 kernel-devel-2.6.32-279.19.1.el6.x86_64 libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 kernel-firmware-2.6.32-279.19.1.el6.noarch kernel-2.6.32-279.19.1.el6.x86_64 kernel-debug-devel-2.6.32-279.19.1.el6.x86_64 [root@10.23.72.95 ~]# uname -a Linux 10.23.72.95 2.6.32-279.19.1.el6.x86_64 #1 SMP Fri Apr 19 10:44:52 CST 2013 x86_64 x86_64 x86_64 GNU/Linux [root@10.23.72.95 ~]# The kernel code looks like: __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) { struct rwsem_waiter *waiter; struct task_struct *tsk; int woken; waiter =3D list_entry(sem->wait_list.next, struct rwsem_waiter, lis= t); if (!wakewrite) { if (waiter->flags & RWSEM_WAITING_FOR_WRITE) goto out; goto dont_wake_writers; } /* if we are allowed to wake writers try to grant a single write lock * if there's a writer at the front of the queue * - we leave the 'waiting count' incremented to signify potential * contention */ if (waiter->flags & RWSEM_WAITING_FOR_WRITE) { sem->activity =3D -1; list_del(&waiter->list); tsk =3D waiter->task; /* Don't touch waiter after ->task has been NULLed */ smp_mb(); waiter->task =3D NULL; wake_up_process(tsk); put_task_struct(tsk); goto out; } /* grant an infinite number of read locks to the front of the queue */ dont_wake_writers: woken =3D 0; while (waiter->flags & RWSEM_WAITING_FOR_READ) { struct list_head *next =3D waiter->list.next; list_del(&waiter->list); tsk =3D waiter->task; smp_mb(); waiter->task =3D NULL; wake_up_process(tsk); put_task_struct(tsk); woken++; if (list_empty(&sem->wait_list)) break; waiter =3D list_entry(next, struct rwsem_waiter, list); } sem->activity +=3D woken; out: return sem; } I use srpm because I want to apply the trace path. Can you help to provide the official 279.19.1 srpm link. Thank you. 2013/4/20 Eric Sandeen > On 4/19/13 8:18 AM, =B7=FB=D3=C0=CC=CE wrote: > > Dear Eric, > > If it's racing issue where the lock is introduced? I want to study the > code from you. Thank you. > > > > essentially: > > xfs_remove() > { > ... > xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); > ... > xfs_droplink() > > You are 100% sure that you were running the 279.19.1 kernel? > > (I'm not very familiar with Oracle's clone of RHEL - I assume that they > have copied all of Red Hat's work verbatim, but I have not looked) > > Can you verify that in: > > __rwsem_do_wake() > > the undo target looks like: > > out: > return sem; > > > /* undo the change to the active count, but check for a transitio= n > * 1->0 */ > undo: > if (rwsem_atomic_update(-RWSEM_ACTIVE_BIAS, sem) & > RWSEM_ACTIVE_MASK) > goto out; > goto try_again; > > > thanks, > -Eric > > > 2013/4/19 =B7=FB=D3=C0=CC=CE > > > > > Sure the serious thing here is that it corrupt the unlinked list. > The inode 0x1bd33 which trigger xfs shutdown is not 0x6b133. > > > > > > 2013/4/19 Eric Sandeen sandeen@sandeen.net>> > > > > On 4/19/13 4:41 AM, =B7=FB=D3=C0=CC=CE wrote: > > > Dear Brian and Eric, > > > > > > kernel kernel-2.6.32-279.19.1.el6.x86_64.rpm < > http://mirror.linux.duke.edu/pub/centos/6.3/updates/x86_64/Packages/kerne= l-2.6.32-279.19.1.el6.x86_64.rpm> > still have this problem > > > I build the kernel from this srpm > > > > https://oss.oracle.com/ol6/SRPMS-updates/kernel-2.6.32-279.19.1.el6.src.r= pm > > > > > > today the shutdown happens again during test. > > > Seelogs bellow: > > > > > > /var/log/message > > > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_iunlink_remove: > xfs_inotobp() returned error 22. > > > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree > returned error 22 > > > Apr 19 16:40:05 10 kernel: XFS (sdb): > xfs_do_force_shutdown(0x1) called from line 1184 of file > fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02d4bda > > > Apr 19 16:40:05 10 kernel: XFS (sdb): I/O Error Detected. > Shutting down filesystem > > > Apr 19 16:40:05 10 kernel: XFS (sdb): Please umount the > filesystem and rectify the problem(s) > > > Apr 19 16:40:07 10 kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > > Apr 19 16:40:37 10 kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > > > > > systemtap script output: > > > --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_i= alloc.c:1257").return > -- return=3D0x16 > > > vars: mp=3D0xffff88101801e800 tp=3D0xffff880ff143ac70 > ino=3D0xffffffff imap=3D0xffff88100e93bc08 flags=3D0x0 agbno=3D? agino=3D= ? agno=3D? > blks_per_cluster=3D? chunk_agbno=3D? cluster_agbno=3D? error=3D? offset= =3D? > offset_agbno=3D? __func__=3D[...] > > > mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 > > > mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, > sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 > > > imap: im_blkno =3D 0x0, im_len =3D 0xe778, im_boffset =3D 0xd= 997 > > > kernel backtrace: > > > Returning from: 0xffffffffa02b4260 : xfs_imap+0x0/0x280 [xfs= ] > > > Returning to : 0xffffffffa02b9d59 : xfs_inotobp+0x49/0xc0 > [xfs] > > > 0xffffffffa02b9ec1 : xfs_iunlink_remove+0xf1/0x360 [xfs] > > > 0xffffffff814ede89 > > > 0x0 (inexact) > > > user backtrace: > > > 0x3ec260e5ad [/lib64/libpthread-2.12.so < > http://libpthread-2.12.so> +0xe5ad/0x219000] > > > > > > --- xfs_iunlink_remove -- > module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1681").retu= rn > -- return=3D0x16 > > > vars: tp=3D0xffff880ff143ac70 ip=3D0xffff8811ed111000 next_in= o=3D? > mp=3D? agi=3D? dip=3D? agibp=3D? ibp=3D? agno=3D? agino=3D? next_agino=3D= ? last_ibp=3D? > last_dip=3D0xffff881000000001 bucket_index=3D? offset=3D? > last_offset=3D0xffffffffffff8811 error=3D? __func__=3D[...] > > > ip: i_ino =3D 0x1bd33, i_flags =3D 0x0 > > > ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x53068791 > > > > > > debugfs events trace: > > > > https://docs.google.com/file/d/0B7n2C4T5tfNCREZtdC1yamc0RnM/edit?usp=3Dsh= aring > > > > Same issue, one file was unlinked twice in a race: > > > > =3D=3D=3D ino 0x6b133 =3D=3D=3D > > <...>-4477 [003] 2721.176790: xfs_iunlink: dev 8:1= 6 > ino 0x6b133 > > <...>-4477 [003] 2721.176839: xfs_iunlink_remove: > dev 8:16 ino 0x6b133 > > <...>-4477 [009] 3320.127227: xfs_iunlink: dev 8:1= 6 > ino 0x6b133 > > <...>-4477 [001] 3320.141126: xfs_iunlink_remove: > dev 8:16 ino 0x6b133 > > <...>-4477 [003] 7973.136368: xfs_iunlink: dev 8:1= 6 > ino 0x6b133 > > <...>-4479 [018] 7973.158457: xfs_iunlink: dev 8:1= 6 > ino 0x6b133 > > <...>-4479 [018] 7973.158497: xfs_iunlink_remove: > dev 8:16 ino 0x6b133 > > > > -Eric > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > --=20 =B7=FB=D3=C0=CC=CE --90e6ba3fcd278625cb04dab97aba Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Eric,
Here's the server inf= o:
[root@10.23.72.95 ~]# rpm -qa= |grep kernel
kernel-debug-debuginfo-2.6.32-279.19.1.el6.x86_64
kernel= -headers-2.6.32-279.19.1.el6.x86_64
abrt-addon-kerneloops-2.0.8-6.el6.x86_64
dracut-kernel-004-283.el6.noarc= h
kernel-debuginfo-common-x86_64-2.6.32-279.19.1.el6.x86_64
kernel-de= buginfo-2.6.32-279.19.1.el6.x86_64
kernel-debug-2.6.32-279.19.1.el6.x86_= 64
kernel-devel-2.6.32-279.19.1.el6.x86_64
libreport-plugin-kerneloops-2.0.= 9-5.el6.x86_64
kernel-firmware-2.6.32-279.19.1.el6.noarch
kernel-2.6.= 32-279.19.1.el6.x86_64
kernel-debug-devel-2.6.32-279.19.1.el6.x86_64
[root@10.23.72.95 ~]# uname -a
L= inux 10.23.72.95 2.6.32-279.19.1.el6.x86_64 #1 SMP Fri Apr 19 10:44:52 CST = 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@10.23.72.95 ~]#

The kernel code looks like:
__rwsem_do_wake(struct rw_semaphore *sem= , int wakewrite)
{
        struct = rwsem_waiter *waiter;
        struct = task_struct *tsk;
        int woken;<= br>
        waiter =3D list_entry(sem= ->wait_list.next, struct rwsem_waiter, list);

        if (!wakewrite) {
 &= nbsp;           &nbs= p;  if (waiter->flags & RWSEM_WAITING_FOR_WRITE)
  = ;            &n= bsp;         goto out;
 &nb= sp;            =   goto dont_wake_writers;
       = ; }

        /* if we are allowed = to wake writers try to grant a single write lock
         * if there's a writer = at the front of the queue
       &nbs= p; * - we leave the 'waiting count' incremented to signify potentia= l
         *   content= ion
         */
  &= nbsp;     if (waiter->flags & RWSEM_WAITING_FOR_= WRITE) {
            &nb= sp;   sem->activity =3D -1;
     &= nbsp;          list_del(&w= aiter->list);
         &= nbsp;      tsk =3D waiter->task;
  = ;            &n= bsp; /* Don't touch waiter after ->task has been NULLed */
 =             &nb= sp;  smp_mb();
            &nb= sp;   waiter->task =3D NULL;
     =            wake_up_proces= s(tsk);
          &nbs= p;     put_task_struct(tsk);
    = ;            goto ou= t;
        }

   = ;     /* grant an infinite number of read locks to the = front of the queue */
 dont_wake_writers:
        woke= n =3D 0;
        while (waiter->fl= ags & RWSEM_WAITING_FOR_READ) {
      =           struct list_head *ne= xt =3D waiter->list.next;

      &nb= sp;         list_del(&waiter-&g= t;list);
                tsk =3D waiter->= task;
           =      smp_mb();
      &= nbsp;         waiter->task =3D N= ULL;
           &= nbsp;    wake_up_process(tsk);
    &n= bsp;           put_task_s= truct(tsk);
          =       woken++;
            &nb= sp;   if (list_empty(&sem->wait_list))
  &nbs= p;            &= nbsp;        break;
   = ;             w= aiter =3D list_entry(next, struct rwsem_waiter, list);
   = ;     }

      &nbs= p; sem->activity +=3D woken;

 out:
        return sem;}

I use srpm because I want to apply the trace path. Can you = help to provide the official 279.19.1 srpm link.
Thank you.


2013/4/20 Eric Sandeen <sandeen@sandeen.net>
On 4/19/13 8:18 AM, =B7=FB=D3=C0=CC=CE wrote:
> Dear Eric,
> If it's racing issue where the lock is introduced? I want to study= the code from you. Thank you.
>

essentially:

xfs_remove()
{
...
        xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); ...
        xfs_droplink()

You are 100% sure that you were running the 279.19.1 kernel?

(I'm not very familiar with Oracle's clone of RHEL - I assume that = they have copied all of Red Hat's work verbatim, but I have not looked)=

Can you verify that in:

__rwsem_do_wake()

the undo target looks like:

  out:
        return sem;


        /* undo the change to the active count, but che= ck for a transition
         * 1->0 */
  undo:
        if (rwsem_atomic_update(-RWSEM_ACTIVE_BIAS, sem= ) & RWSEM_ACTIVE_MASK)
                goto out;
        goto try_again;


thanks,
-Eric

> 2013/4/19 =B7=FB=D3=C0=CC=CE <
yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     Sure the serious thing here is that it corrupt the unlin= ked list. The inode 0x1bd33 which trigger xfs shutdown is not  0x6b133= .
>
>
>     2013/4/19 Eric Sandeen <sandeen@sandeen.net <mailto:sandeen@sandeen.net>>
>
>         On 4/19/13 4:41 AM, =B7=FB=D3=C0=CC=CE wro= te:
>         > Dear Brian and Eric,
>         >
>         > kernel kernel-2.6.32-279.19.1.el6.x86= _64.rpm <ht= tp://mirror.linux.duke.edu/pub/centos/6.3/updates/x86_64/Packages/kernel-2.= 6.32-279.19.1.el6.x86_64.rpm> still have this problem
>         > I build the kernel from this srpm
>         > https:= //oss.oracle.com/ol6/SRPMS-updates/kernel-2.6.32-279.19.1.el6.src.rpm >         >
>         > today the shutdown happens again duri= ng test.
>         > Seelogs bellow:
>         >
>         > /var/log/message
>         > Apr 19 16:40:05 10 kernel: XFS (sdb):= xfs_iunlink_remove: xfs_inotobp() returned error 22.
>         > Apr 19 16:40:05 10 kernel: XFS (sdb):= xfs_inactive: xfs_ifree returned error 22
>         > Apr 19 16:40:05 10 kernel: XFS (sdb):= xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeo= ps.c.  Return address =3D 0xffffffffa02d4bda
>         > Apr 19 16:40:05 10 kernel: XFS (sdb):= I/O Error Detected. Shutting down filesystem
>         > Apr 19 16:40:05 10 kernel: XFS (sdb):= Please umount the filesystem and rectify the problem(s)
>         > Apr 19 16:40:07 10 kernel: XFS (sdb):= xfs_log_force: error 5 returned.
>         > Apr 19 16:40:37 10 kernel: XFS (sdb):= xfs_log_force: error 5 returned.
>         >
>         > systemtap script output:
>         > --- xfs_imap -- module("xfs"= ;).function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- return= =3D0x16
>         > vars: mp=3D0xffff88101801e800 tp=3D0x= ffff880ff143ac70 ino=3D0xffffffff imap=3D0xffff88100e93bc08 flags=3D0x0 agb= no=3D? agino=3D? agno=3D? blks_per_cluster=3D? chunk_agbno=3D? cluster_agbn= o=3D? error=3D? offset=3D? offset_agbno=3D? __func__=3D[...]
>         > mp: m_agno_log =3D 0x5, m_agino_log = =3D 0x20
>         > mp->m_sb: sb_agcount =3D 0x1c, sb_= agblocks =3D 0xffffff0, sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c, sb_dbloc= ks =3D 0x1b4900000
>         > imap: im_blkno =3D 0x0, im_len =3D 0x= e778, im_boffset =3D 0xd997
>         > kernel backtrace:
>         > Returning from:  0xffffffffa02b4= 260 : xfs_imap+0x0/0x280 [xfs]
>         > Returning to  :  0xffffffff= a02b9d59 : xfs_inotobp+0x49/0xc0 [xfs]
>         >  0xffffffffa02b9ec1 : xfs_iunlin= k_remove+0xf1/0x360 [xfs]
>         >  0xffffffff814ede89
>         >  0x0 (inexact)
>         > user backtrace:
>         >  0x3ec260e5ad [/lib6= 4/libpthread-2.12.s= o <http://li= bpthread-2.12.so> <http://libpthread-2.12.so>+0xe5ad/0x219000]
>         &g= t;
>         > --- xfs_iunlink_remove -- module(&quo= t;xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1681"= ;).return -- return=3D0x16
>         > vars: tp=3D0xffff880ff143ac70 ip=3D0x= ffff8811ed111000 next_ino=3D? mp=3D? agi=3D? dip=3D? agibp=3D? ibp=3D? agno= =3D? agino=3D? next_agino=3D? last_ibp=3D? last_dip=3D0xffff881000000001 bu= cket_index=3D? offset=3D? last_offset=3D0xffffffffffff8811 error=3D? __func= __=3D[...]
>         > ip: i_ino =3D 0x1bd33, i_flags =3D 0x= 0
>         > ip->i_d: di_nlink =3D 0x0, di_gen = =3D 0x53068791
>         >
>         > debugfs events trace:
>         > htt= ps://docs.google.com/file/d/0B7n2C4T5tfNCREZtdC1yamc0RnM/edit?usp=3Dsharing=
>
>         Same issue, one file was unlinked twice in= a race:
>
>         =3D=3D=3D ino 0x6b133 =3D=3D=3D
>                    &= lt;...>-4477  [003]  2721.176790: xfs_iunlink: dev 8:16 ino 0x= 6b133
>                    &= lt;...>-4477  [003]  2721.176839: xfs_iunlink_remove: dev 8:16= ino 0x6b133
>                    &= lt;...>-4477  [009]  3320.127227: xfs_iunlink: dev 8:16 ino 0x= 6b133
>                    &= lt;...>-4477  [001]  3320.141126: xfs_iunlink_remove: dev 8:16= ino 0x6b133
>                    &= lt;...>-4477  [003]  7973.136368: xfs_iunlink: dev 8:16 ino 0x= 6b133
>                    &= lt;...>-4479  [018]  7973.158457: xfs_iunlink: dev 8:16 ino 0x= 6b133
>                    &= lt;...>-4479  [018]  7973.158497: xfs_iunlink_remove: dev 8:16= ino 0x6b133
>
>         -Eric
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE




--
=B7=FB=D3= =C0=CC=CE
--90e6ba3fcd278625cb04dab97aba-- From yongtaofu@gmail.com Fri Apr 19 12:00:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_BELOW2 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3AA447CBF for ; Fri, 19 Apr 2013 12:00:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DAAF58F8059 for ; Fri, 19 Apr 2013 10:00:15 -0700 (PDT) X-ASG-Debug-ID: 1366390812-04bdf02d1d3b3d10001-NocioJ Received: from mail-ie0-f169.google.com (mail-ie0-f169.google.com [209.85.223.169]) by cuda.sgi.com with ESMTP id nhiHYcAagk69HEN7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 10:00:13 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] Received: by mail-ie0-f169.google.com with SMTP id ar20so4954243iec.14 for ; Fri, 19 Apr 2013 10:00:12 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=Z140vKT/soWjKi7pzyj69E0lpsUXokO8cjBDeuYVHaE=; b=NA8LqDhxeSR+wbKadvW3ktZTex8PG+PPtnKjZrDkbh/Bk8K6wKM/hFRmIP0TIOAUZ5 cHYUFfDZ7rRWWUy5y/MYrTaetSitzRCLQfsGe0nr7UHPqbBsEks92djtnEgOMua1OrYH 3ic0SOzp+GtafQPMh5aGjRpFlY6TAGRIuLtXNZ3DxplJDbEgj82gsY1sDMmQNYTuYpaO JYNP8vcLIaU0UBKzUnx8QY8CTjrMQbuEYmS7R3N0hFZPtptWmUcAnHFFFLk0Gwn0RWpG T3GXPcrI8aY/JCX0VRemj9mBHgZp0Hd+YJs/pEbJinjhR4WLF2Uv+VhNkbNUZRvGZCNI 9UWA== MIME-Version: 1.0 X-Received: by 10.50.51.167 with SMTP id l7mr15895781igo.11.1366390812697; Fri, 19 Apr 2013 10:00:12 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 10:00:12 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> Date: Sat, 20 Apr 2013 01:00:12 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340b5f03eb8d04dab9a7c2 X-Barracuda-Connect: mail-ie0-f169.google.com[209.85.223.169] X-Barracuda-Start-Time: 1366390813 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128586 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 --14dae9340b5f03eb8d04dab9a7c2 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Dear Eric, I checked rh srpm https://content-web.rhn.redhat.com/rhn/public/NULL/kernel/2.6.32-279.19.1.e= l6/SRPMS/kernel-2.6.32-279.19.1.el6.src.rpm?__gda__=3D1366390847_8550b8568c= 50ea46b3180266b476353d&ext=3D.rpm And the code is same, as following: __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) { struct rwsem_waiter *waiter; struct task_struct *tsk; int woken; waiter =3D list_entry(sem->wait_list.next, struct rwsem_waiter, list); if (!wakewrite) { if (waiter->flags & RWSEM_WAITING_FOR_WRITE) goto out; goto dont_wake_writers; } /* if we are allowed to wake writers try to grant a single write lock * if there's a writer at the front of the queue * - we leave the 'waiting count' incremented to signify potential * contention */ if (waiter->flags & RWSEM_WAITING_FOR_WRITE) { sem->activity =3D -1; list_del(&waiter->list); tsk =3D waiter->task; /* Don't touch waiter after ->task has been NULLed */ smp_mb(); waiter->task =3D NULL; wake_up_process(tsk); put_task_struct(tsk); goto out; } /* grant an infinite number of read locks to the front of the queue */ dont_wake_writers: woken =3D 0; while (waiter->flags & RWSEM_WAITING_FOR_READ) { struct list_head *next =3D waiter->list.next; list_del(&waiter->list); tsk =3D waiter->task; smp_mb(); waiter->task =3D NULL; wake_up_process(tsk); put_task_struct(tsk); woken++; if (list_empty(&sem->wait_list)) break; waiter =3D list_entry(next, struct rwsem_waiter, list); } sem->activity +=3D woken; out: return sem; } 2013/4/20 =B7=FB=D3=C0=CC=CE > Hi Eric, > Here's the server info: > [root@10.23.72.95 ~]# rpm -qa|grep kernel > kernel-debug-debuginfo-2.6.32-279.19.1.el6.x86_64 > kernel-headers-2.6.32-279.19.1.el6.x86_64 > abrt-addon-kerneloops-2.0.8-6.el6.x86_64 > dracut-kernel-004-283.el6.noarch > kernel-debuginfo-common-x86_64-2.6.32-279.19.1.el6.x86_64 > kernel-debuginfo-2.6.32-279.19.1.el6.x86_64 > kernel-debug-2.6.32-279.19.1.el6.x86_64 > kernel-devel-2.6.32-279.19.1.el6.x86_64 > libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 > kernel-firmware-2.6.32-279.19.1.el6.noarch > kernel-2.6.32-279.19.1.el6.x86_64 > kernel-debug-devel-2.6.32-279.19.1.el6.x86_64 > [root@10.23.72.95 ~]# uname -a > Linux 10.23.72.95 2.6.32-279.19.1.el6.x86_64 #1 SMP Fri Apr 19 10:44:52 > CST 2013 x86_64 x86_64 x86_64 GNU/Linux > [root@10.23.72.95 ~]# > > The kernel code looks like: > __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) > { > struct rwsem_waiter *waiter; > struct task_struct *tsk; > int woken; > > waiter =3D list_entry(sem->wait_list.next, struct rwsem_waiter, > list); > > if (!wakewrite) { > if (waiter->flags & RWSEM_WAITING_FOR_WRITE) > goto out; > goto dont_wake_writers; > } > > /* if we are allowed to wake writers try to grant a single write > lock > * if there's a writer at the front of the queue > * - we leave the 'waiting count' incremented to signify potentia= l > * contention > */ > if (waiter->flags & RWSEM_WAITING_FOR_WRITE) { > sem->activity =3D -1; > list_del(&waiter->list); > tsk =3D waiter->task; > /* Don't touch waiter after ->task has been NULLed */ > smp_mb(); > waiter->task =3D NULL; > wake_up_process(tsk); > put_task_struct(tsk); > goto out; > } > > /* grant an infinite number of read locks to the front of the > queue */ > dont_wake_writers: > woken =3D 0; > while (waiter->flags & RWSEM_WAITING_FOR_READ) { > struct list_head *next =3D waiter->list.next; > > list_del(&waiter->list); > tsk =3D waiter->task; > smp_mb(); > waiter->task =3D NULL; > wake_up_process(tsk); > put_task_struct(tsk); > woken++; > if (list_empty(&sem->wait_list)) > break; > waiter =3D list_entry(next, struct rwsem_waiter, list); > } > > sem->activity +=3D woken; > > out: > return sem; > } > > I use srpm because I want to apply the trace path. Can you help to provid= e > the official 279.19.1 srpm link. > Thank you. > > > 2013/4/20 Eric Sandeen > >> On 4/19/13 8:18 AM, =B7=FB=D3=C0=CC=CE wrote: >> > Dear Eric, >> > If it's racing issue where the lock is introduced? I want to study the >> code from you. Thank you. >> > >> >> essentially: >> >> xfs_remove() >> { >> ... >> xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); >> ... >> xfs_droplink() >> >> You are 100% sure that you were running the 279.19.1 kernel? >> >> (I'm not very familiar with Oracle's clone of RHEL - I assume that they >> have copied all of Red Hat's work verbatim, but I have not looked) >> >> Can you verify that in: >> >> __rwsem_do_wake() >> >> the undo target looks like: >> >> out: >> return sem; >> >> >> /* undo the change to the active count, but check for a transiti= on >> * 1->0 */ >> undo: >> if (rwsem_atomic_update(-RWSEM_ACTIVE_BIAS, sem) & >> RWSEM_ACTIVE_MASK) >> goto out; >> goto try_again; >> >> >> thanks, >> -Eric >> >> > 2013/4/19 =B7=FB=D3=C0=CC=CE > >> > >> > Sure the serious thing here is that it corrupt the unlinked list. >> The inode 0x1bd33 which trigger xfs shutdown is not 0x6b133. >> > >> > >> > 2013/4/19 Eric Sandeen > sandeen@sandeen.net>> >> > >> > On 4/19/13 4:41 AM, =B7=FB=D3=C0=CC=CE wrote: >> > > Dear Brian and Eric, >> > > >> > > kernel kernel-2.6.32-279.19.1.el6.x86_64.rpm < >> http://mirror.linux.duke.edu/pub/centos/6.3/updates/x86_64/Packages/kern= el-2.6.32-279.19.1.el6.x86_64.rpm> >> still have this problem >> > > I build the kernel from this srpm >> > > >> https://oss.oracle.com/ol6/SRPMS-updates/kernel-2.6.32-279.19.1.el6.src.= rpm >> > > >> > > today the shutdown happens again during test. >> > > Seelogs bellow: >> > > >> > > /var/log/message >> > > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_iunlink_remove: >> xfs_inotobp() returned error 22. >> > > Apr 19 16:40:05 10 kernel: XFS (sdb): xfs_inactive: xfs_ifre= e >> returned error 22 >> > > Apr 19 16:40:05 10 kernel: XFS (sdb): >> xfs_do_force_shutdown(0x1) called from line 1184 of file >> fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02d4bda >> > > Apr 19 16:40:05 10 kernel: XFS (sdb): I/O Error Detected. >> Shutting down filesystem >> > > Apr 19 16:40:05 10 kernel: XFS (sdb): Please umount the >> filesystem and rectify the problem(s) >> > > Apr 19 16:40:07 10 kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> > > Apr 19 16:40:37 10 kernel: XFS (sdb): xfs_log_force: error 5 >> returned. >> > > >> > > systemtap script output: >> > > --- xfs_imap -- module("xfs").function("xfs_imap@fs/xfs/xfs_= ialloc.c:1257").return >> -- return=3D0x16 >> > > vars: mp=3D0xffff88101801e800 tp=3D0xffff880ff143ac70 >> ino=3D0xffffffff imap=3D0xffff88100e93bc08 flags=3D0x0 agbno=3D? agino= =3D? agno=3D? >> blks_per_cluster=3D? chunk_agbno=3D? cluster_agbno=3D? error=3D? offset= =3D? >> offset_agbno=3D? __func__=3D[...] >> > > mp: m_agno_log =3D 0x5, m_agino_log =3D 0x20 >> > > mp->m_sb: sb_agcount =3D 0x1c, sb_agblocks =3D 0xffffff0, >> sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c, sb_dblocks =3D 0x1b4900000 >> > > imap: im_blkno =3D 0x0, im_len =3D 0xe778, im_boffset =3D 0x= d997 >> > > kernel backtrace: >> > > Returning from: 0xffffffffa02b4260 : xfs_imap+0x0/0x280 [xf= s] >> > > Returning to : 0xffffffffa02b9d59 : xfs_inotobp+0x49/0xc0 >> [xfs] >> > > 0xffffffffa02b9ec1 : xfs_iunlink_remove+0xf1/0x360 [xfs] >> > > 0xffffffff814ede89 >> > > 0x0 (inexact) >> > > user backtrace: >> > > 0x3ec260e5ad [/lib64/libpthread-2.12.so < >> http://libpthread-2.12.so> +0xe5ad/0x219000] >> > > >> > > --- xfs_iunlink_remove -- >> module("xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1681").ret= urn >> -- return=3D0x16 >> > > vars: tp=3D0xffff880ff143ac70 ip=3D0xffff8811ed111000 next_i= no=3D? >> mp=3D? agi=3D? dip=3D? agibp=3D? ibp=3D? agno=3D? agino=3D? next_agino= =3D? last_ibp=3D? >> last_dip=3D0xffff881000000001 bucket_index=3D? offset=3D? >> last_offset=3D0xffffffffffff8811 error=3D? __func__=3D[...] >> > > ip: i_ino =3D 0x1bd33, i_flags =3D 0x0 >> > > ip->i_d: di_nlink =3D 0x0, di_gen =3D 0x53068791 >> > > >> > > debugfs events trace: >> > > >> https://docs.google.com/file/d/0B7n2C4T5tfNCREZtdC1yamc0RnM/edit?usp=3Ds= haring >> > >> > Same issue, one file was unlinked twice in a race: >> > >> > =3D=3D=3D ino 0x6b133 =3D=3D=3D >> > <...>-4477 [003] 2721.176790: xfs_iunlink: dev >> 8:16 ino 0x6b133 >> > <...>-4477 [003] 2721.176839: xfs_iunlink_remove: >> dev 8:16 ino 0x6b133 >> > <...>-4477 [009] 3320.127227: xfs_iunlink: dev >> 8:16 ino 0x6b133 >> > <...>-4477 [001] 3320.141126: xfs_iunlink_remove: >> dev 8:16 ino 0x6b133 >> > <...>-4477 [003] 7973.136368: xfs_iunlink: dev >> 8:16 ino 0x6b133 >> > <...>-4479 [018] 7973.158457: xfs_iunlink: dev >> 8:16 ino 0x6b133 >> > <...>-4479 [018] 7973.158497: xfs_iunlink_remove: >> dev 8:16 ino 0x6b133 >> > >> > -Eric >> > >> > >> > >> > >> > -- >> > =B7=FB=D3=C0=CC=CE >> > >> > >> > >> > >> > -- >> > =B7=FB=D3=C0=CC=CE >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --14dae9340b5f03eb8d04dab9a7c2 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
And the code is same, as following:

__rwsem_do_wake(struct rw_= semaphore *sem, int wakewrite)
{
    struct rwsem_wait= er *waiter;
    struct task_struct *tsk;
  &= nbsp; int woken;

    waiter =3D list_entry(sem->wa= it_list.next, struct rwsem_waiter, list);

    if (!wakewrite) {
      =   if (waiter->flags & RWSEM_WAITING_FOR_WRITE)
  &= nbsp;         goto out;
   =     goto dont_wake_writers;
    }

=     /* if we are allowed to wake writers try to grant a sing= le write lock
     * if there's a writer at the front of the queu= e
     * - we leave the 'waiting count' incr= emented to signify potential
     *   cont= ention
     */
    if (waiter->= flags & RWSEM_WAITING_FOR_WRITE) {
        sem->activity =3D -1;
 &nb= sp;      list_del(&waiter->list);
  = ;      tsk =3D waiter->task;
    &= nbsp;   /* Don't touch waiter after ->task has been NULLed= */
        smp_mb();
   = ;     waiter->task =3D NULL;
        wake_up_process(tsk);
  =       put_task_struct(tsk);
     = ;   goto out;
    }

    /= * grant an infinite number of read locks to the front of the queue */
&n= bsp;dont_wake_writers:
    woken =3D 0;
  &n= bsp; while (waiter->flags & RWSEM_WAITING_FOR_READ) {
        struct list_head *next =3D waiter->= ;list.next;

        list_del(&wait= er->list);
        tsk =3D waiter->t= ask;
        smp_mb();
  &nbs= p;     waiter->task =3D NULL;
     = ;   wake_up_process(tsk);
        put_task_struct(tsk);
  =       woken++;
       = if (list_empty(&sem->wait_list))
      =       break;
        w= aiter =3D list_entry(next, struct rwsem_waiter, list);
   = ; }

    sem->activity +=3D woken;

 out:
    return sem;
}


2013/4/20 =B7=FB=D3=C0= =CC=CE <yongtaofu@gmail.com>
Hi Eric,
=
Here's the server info:
[root@10.23.72.95 ~]# rpm -qa|grep kernel
kernel-debug-debuginfo-2.6.32-279.19.1.el6.x86_64
kernel-headers-2.6.32-= 279.19.1.el6.x86_64
abrt-addon-kerneloops-2.0.8-6.el6.x86_64
dracut-kernel-004-283.el6.noarc= h
kernel-debuginfo-common-x86_64-2.6.32-279.19.1.el6.x86_64
kernel-de= buginfo-2.6.32-279.19.1.el6.x86_64
kernel-debug-2.6.32-279.19.1.el6.x86_= 64
kernel-devel-2.6.32-279.19.1.el6.x86_64
libreport-plugin-kerneloops-2.0.= 9-5.el6.x86_64
kernel-firmware-2.6.32-279.19.1.el6.noarch
kernel-2.6.= 32-279.19.1.el6.x86_64
kernel-debug-devel-2.6.32-279.19.1.el6.x86_64
[root@10.23.72.95= ~]# uname -a
Linux 10.23.72.95 2.6.32-279.19.1.el6.x86_64 #1 SMP Fri Ap= r 19 10:44:52 CST 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@10.23.72.95 ~]#

The kernel code looks like:
__rwsem_do_wake(struct rw_semaphore *sem= , int wakewrite)
{
        struct = rwsem_waiter *waiter;
        struct = task_struct *tsk;
        int woken;<= br>
        waiter =3D list_entry(sem= ->wait_list.next, struct rwsem_waiter, list);

        if (!wakewrite) {
 &= nbsp;           &nbs= p;  if (waiter->flags & RWSEM_WAITING_FOR_WRITE)
  = ;            &n= bsp;         goto out;
 &nb= sp;            =   goto dont_wake_writers;
       = ; }

        /* if we are allowed = to wake writers try to grant a single write lock
         * if there's a writer = at the front of the queue
       &nbs= p; * - we leave the 'waiting count' incremented to signify potentia= l
         *   content= ion
         */
  &= nbsp;     if (waiter->flags & RWSEM_WAITING_FOR_= WRITE) {
            &nb= sp;   sem->activity =3D -1;
     &= nbsp;          list_del(&w= aiter->list);
         &= nbsp;      tsk =3D waiter->task;
  = ;            &n= bsp; /* Don't touch waiter after ->task has been NULLed */
 =             &nb= sp;  smp_mb();
            &nb= sp;   waiter->task =3D NULL;
     =            wake_up_proces= s(tsk);
          &nbs= p;     put_task_struct(tsk);
    = ;            goto ou= t;
        }

   = ;     /* grant an infinite number of read locks to the = front of the queue */
 dont_wake_writers:
        woke= n =3D 0;
        while (waiter->fl= ags & RWSEM_WAITING_FOR_READ) {
      =           struct list_head *ne= xt =3D waiter->list.next;

      &nb= sp;         list_del(&waiter-&g= t;list);
                tsk =3D waiter->= task;
           =      smp_mb();
      &= nbsp;         waiter->task =3D N= ULL;
           &= nbsp;    wake_up_process(tsk);
    &n= bsp;           put_task_s= truct(tsk);
          =       woken++;
            &nb= sp;   if (list_empty(&sem->wait_list))
  &nbs= p;            &= nbsp;        break;
   = ;             w= aiter =3D list_entry(next, struct rwsem_waiter, list);
   = ;     }

      &nbs= p; sem->activity +=3D woken;

 out:
        return sem;}

I use srpm because I want to apply the trace path. Can you = help to provide the official 279.19.1 srpm link.
Thank you.


2013/4/20 Eric Sandeen <sandeen@sandeen.net>
On 4/19/13 8:18 AM, =B7=FB=D3=C0=CC=CE wrote:
> Dear Eric,
> If it's racing issue where the lock is introduced? I want to study= the code from you. Thank you.
>

essentially:

xfs_remove()
{
...
        xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); ...
        xfs_droplink()

You are 100% sure that you were running the 279.19.1 kernel?

(I'm not very familiar with Oracle's clone of RHEL - I assume that = they have copied all of Red Hat's work verbatim, but I have not looked)=

Can you verify that in:

__rwsem_do_wake()

the undo target looks like:

  out:
        return sem;


        /* undo the change to the active count, but che= ck for a transition
         * 1->0 */
  undo:
        if (rwsem_atomic_update(-RWSEM_ACTIVE_BIAS, sem= ) & RWSEM_ACTIVE_MASK)
                goto out;
        goto try_again;


thanks,
-Eric

> 2013/4/19 =B7=FB=D3=C0=CC=CE <
yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     Sure the serious thing here is that it corrupt the unlin= ked list. The inode 0x1bd33 which trigger xfs shutdown is not  0x6b133= .
>
>
>     2013/4/19 Eric Sandeen <sandeen@sandeen.net <mailto:sandeen@sandeen.net&= gt;>
>
>         On 4/19/13 4:41 AM, =B7=FB=D3=C0=CC=CE wro= te:
>         > Dear Brian and Eric,
>         >
>         > kernel kernel-2.6.32-279.19.1.el6.x86= _64.rpm <ht= tp://mirror.linux.duke.edu/pub/centos/6.3/updates/x86_64/Packages/kernel-2.= 6.32-279.19.1.el6.x86_64.rpm> still have this problem
>         > I build the kernel from this srpm
>         > https:= //oss.oracle.com/ol6/SRPMS-updates/kernel-2.6.32-279.19.1.el6.src.rpm >         >
>         > today the shutdown happens again duri= ng test.
>         > Seelogs bellow:
>         >
>         > /var/log/message
>         > Apr 19 16:40:05 10 kernel: XFS (sdb):= xfs_iunlink_remove: xfs_inotobp() returned error 22.
>         > Apr 19 16:40:05 10 kernel: XFS (sdb):= xfs_inactive: xfs_ifree returned error 22
>         > Apr 19 16:40:05 10 kernel: XFS (sdb):= xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeo= ps.c.  Return address =3D 0xffffffffa02d4bda
>         > Apr 19 16:40:05 10 kernel: XFS (sdb):= I/O Error Detected. Shutting down filesystem
>         > Apr 19 16:40:05 10 kernel: XFS (sdb):= Please umount the filesystem and rectify the problem(s)
>         > Apr 19 16:40:07 10 kernel: XFS (sdb):= xfs_log_force: error 5 returned.
>         > Apr 19 16:40:37 10 kernel: XFS (sdb):= xfs_log_force: error 5 returned.
>         >
>         > systemtap script output:
>         > --- xfs_imap -- module("xfs"= ;).function("xfs_imap@fs/xfs/xfs_ialloc.c:1257").return -- return= =3D0x16
>         > vars: mp=3D0xffff88101801e800 tp=3D0x= ffff880ff143ac70 ino=3D0xffffffff imap=3D0xffff88100e93bc08 flags=3D0x0 agb= no=3D? agino=3D? agno=3D? blks_per_cluster=3D? chunk_agbno=3D? cluster_agbn= o=3D? error=3D? offset=3D? offset_agbno=3D? __func__=3D[...]
>         > mp: m_agno_log =3D 0x5, m_agino_log = =3D 0x20
>         > mp->m_sb: sb_agcount =3D 0x1c, sb_= agblocks =3D 0xffffff0, sb_inopblog =3D 0x4, sb_agblklog =3D 0x1c, sb_dbloc= ks =3D 0x1b4900000
>         > imap: im_blkno =3D 0x0, im_len =3D 0x= e778, im_boffset =3D 0xd997
>         > kernel backtrace:
>         > Returning from:  0xffffffffa02b4= 260 : xfs_imap+0x0/0x280 [xfs]
>         > Returning to  :  0xffffffff= a02b9d59 : xfs_inotobp+0x49/0xc0 [xfs]
>         >  0xffffffffa02b9ec1 : xfs_iunlin= k_remove+0xf1/0x360 [xfs]
>         >  0xffffffff814ede89
>         >  0x0 (inexact)
>         > user backtrace:
>         >  0x3ec260e5ad [/lib6= 4/libpthread-2.12.s= o <http://li= bpthread-2.12.so> <http://libpthread-2.12.so>+0xe5ad/0x219000]
>         >
>         > --- xfs_iunlink_remove -- module(&quo= t;xfs").function("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1681"= ;).return -- return=3D0x16
>         > vars: tp=3D0xffff880ff143ac70 ip=3D0x= ffff8811ed111000 next_ino=3D? mp=3D? agi=3D? dip=3D? agibp=3D? ibp=3D? agno= =3D? agino=3D? next_agino=3D? last_ibp=3D? last_dip=3D0xffff881000000001 bu= cket_index=3D? offset=3D? last_offset=3D0xffffffffffff8811 error=3D? __func= __=3D[...]
>         > ip: i_ino =3D 0x1bd33, i_flags =3D 0x= 0
>         > ip->i_d: di_nlink =3D 0x0, di_gen = =3D 0x53068791
>         >
>         > debugfs events trace:
>         > htt= ps://docs.google.com/file/d/0B7n2C4T5tfNCREZtdC1yamc0RnM/edit?usp=3Dsharing=
>
>         Same issue, one file was unlinked twice in= a race:
>
>         =3D=3D=3D ino 0x6b133 =3D=3D=3D
>                    &= lt;...>-4477  [003]  2721.176790: xfs_iunlink: dev 8:16 ino 0x= 6b133
>                    &= lt;...>-4477  [003]  2721.176839: xfs_iunlink_remove: dev 8:16= ino 0x6b133
>                    &= lt;...>-4477  [009]  3320.127227: xfs_iunlink: dev 8:16 ino 0x= 6b133
>                    &= lt;...>-4477  [001]  3320.141126: xfs_iunlink_remove: dev 8:16= ino 0x6b133
>                    &= lt;...>-4477  [003]  7973.136368: xfs_iunlink: dev 8:16 ino 0x= 6b133
>                    &= lt;...>-4479  [018]  7973.158457: xfs_iunlink: dev 8:16 ino 0x= 6b133
>                    &= lt;...>-4479  [018]  7973.158497: xfs_iunlink_remove: dev 8:16= ino 0x6b133
>
>         -Eric
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--14dae9340b5f03eb8d04dab9a7c2-- From sandeen@sandeen.net Fri Apr 19 12:04:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C6E5F7CBF for ; Fri, 19 Apr 2013 12:04:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A579F8F8059 for ; Fri, 19 Apr 2013 10:04:16 -0700 (PDT) X-ASG-Debug-ID: 1366391055-04cb6c2c1c3b7890001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id nKr4vylMqvdYhFQx for ; Fri, 19 Apr 2013 10:04:15 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (unknown [69.38.217.10]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8FCAC6527BE6; Fri, 19 Apr 2013 12:04:14 -0500 (CDT) Message-ID: <5171790C.70400@sandeen.net> Date: Fri, 19 Apr 2013 10:04:12 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?GB2312?B?t/vTwMzO?= CC: Brian Foster , "xfs@oss.sgi.com" Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366391055 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128586 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/19/13 10:00 AM, ·ûÓÀÌÎ wrote: > Dear Eric, > > I checked rh srpm https://content-web.rhn.redhat.com/rhn/public/NULL/kernel/2.6.32-279.19.1.el6/SRPMS/kernel-2.6.32-279.19.1.el6.src.rpm?__gda__=1366390847_8550b8568c50ea46b3180266b476353d&ext=.rpm > And the code is same, as following: > > __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) > { need to look in lib/rwsem.c not lib/rwsem-spinlock.c Thanks, -Eric From yongtaofu@gmail.com Fri Apr 19 12:08:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8703A29DFA for ; Fri, 19 Apr 2013 12:08:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 644578F8066 for ; Fri, 19 Apr 2013 10:08:45 -0700 (PDT) X-ASG-Debug-ID: 1366391324-04cb6c2c1d3b7fb0001-NocioJ Received: from mail-ie0-f177.google.com (mail-ie0-f177.google.com [209.85.223.177]) by cuda.sgi.com with ESMTP id ICYXp5h5JisCCsbl (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 10:08:44 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] Received: by mail-ie0-f177.google.com with SMTP id 9so4787044iec.8 for ; Fri, 19 Apr 2013 10:08:44 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=xNU5fk6dufPYjFZHMSOTRBC6Fmrm3asifZDJYhI+COs=; b=n3xeOH5tGTRLMa7xXSqHMnFuMxGF9McC8rhCb8qxT2yHhj6VXv8zz1F0U4Ucvmi/u9 w8gAFGiDm0qzaX86cZDN4cNi6hLBib183LRhgh6DEphGar4hGwbJobZ1m76kuZawMkmQ cUYNFhYAphpzvEFkfJPXLh4GczCrcKhLIP42AGaJb/p3j4x+liHDPIgGHXuRQs8IbdzC KRjZZYRqgFA/WTVr77n4D+zzAfCftuChDsaUdSuY8xyCxP5H4G1qOoGvCAhGBzw02BRD qo8K6b2iO7Td5Gem2/fVNQ1fYhENdMLzRv3h/RiB0Kj2SUCsSSYH1l3H14Nrd2PSlf8n QTvA== MIME-Version: 1.0 X-Received: by 10.50.20.163 with SMTP id o3mr2477155ige.51.1366391324161; Fri, 19 Apr 2013 10:08:44 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 10:08:44 -0700 (PDT) In-Reply-To: <5171790C.70400@sandeen.net> References: <516C89DF.4070904@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> Date: Sat, 20 Apr 2013 01:08:44 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=047d7bd75dec80443104dab9c51c X-Barracuda-Connect: mail-ie0-f177.google.com[209.85.223.177] X-Barracuda-Start-Time: 1366391324 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128586 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 --047d7bd75dec80443104dab9c51c Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable There it is, I use latest 279.19.1 and only apply xfs trace path. 2013/4/20 Eric Sandeen > On 4/19/13 10:00 AM, =B7=FB=D3=C0=CC=CE wrote: > > Dear Eric, > > > > I checked rh srpm > https://content-web.rhn.redhat.com/rhn/public/NULL/kernel/2.6.32-279.19.1= .el6/SRPMS/kernel-2.6.32-279.19.1.el6.src.rpm?__gda__=3D1366390847_8550b856= 8c50ea46b3180266b476353d&ext=3D.rpm > > And the code is same, as following: > > > > __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) > > { > > need to look in lib/rwsem.c not lib/rwsem-spinlock.c > > Thanks, > -Eric > > --=20 =B7=FB=D3=C0=CC=CE --047d7bd75dec80443104dab9c51c Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
There it is, I use latest 279.19.1 and only apply xfs trac= e path.


2013/4/20 Eric Sandeen <sandeen@sandeen.net>
On 4/19/13 10:00 AM, =B7= =FB=D3=C0=CC=CE wrote:
> Dear Eric,
>
need to look in lib/rwsem.c not lib/rwsem-spinlock.c

Thanks,
-Eric




--
=B7=FB=D3=C0=CC=CE
--047d7bd75dec80443104dab9c51c-- From yongtaofu@gmail.com Fri Apr 19 12:17:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 20D6D29DFA for ; Fri, 19 Apr 2013 12:17:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0A41B8F8066 for ; Fri, 19 Apr 2013 10:17:22 -0700 (PDT) X-ASG-Debug-ID: 1366391840-04cb6c2c1d3b8b30001-NocioJ Received: from mail-ie0-f181.google.com (mail-ie0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id PGmP5JBicRUdtvlj (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 10:17:21 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] Received: by mail-ie0-f181.google.com with SMTP id tp5so2477224ieb.26 for ; Fri, 19 Apr 2013 10:17:20 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=nc+qXRSSX1dnZG3AXCEaJsHa9yhKdeNkLYBOx+JDNwE=; b=MMUMK+OjFmh4oIMmbxnlY5gVAUoqCDWKDHXimDCzc0RHO1kFv++0ZzeCHIJL2QLfoI ZvJlbv5RYKlBYxOpMytg14xn1LVVqSJsdEefj4MR4QCgppi51Zth5/hPk+T0YcedMBhA hL8g8DekWXX02ALODmRXsjUTnqdXQNvJ/DfxCWCDFdBT9ZWtG0hJqb/+dsAVoJLmVkku ul6klEWM5G7d7cU7cLwCW7WXwf9gY+rUVEimyZXl3/VkyQU/kPbdzXWritYO73/dRLvI 3TiOc5hyazc6k3QhvVetDlDMWW4z6IEvXQG5xvLdru9NgGR3UJq3z7orbjXuiSTFZw44 fyAw== MIME-Version: 1.0 X-Received: by 10.42.65.75 with SMTP id k11mr7327510ici.26.1366391840637; Fri, 19 Apr 2013 10:17:20 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 10:17:20 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> Date: Sat, 20 Apr 2013 01:17:20 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=90e6ba3fcd274957e804dab9e437 X-Barracuda-Connect: mail-ie0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1366391841 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128586 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 --90e6ba3fcd274957e804dab9e437 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Dear Eric, I noticed some functions call the xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); twince but not in xfs_remove. 2013/4/20 =B7=FB=D3=C0=CC=CE > There it is, I use latest 279.19.1 and only apply xfs trace path. > > > 2013/4/20 Eric Sandeen > >> On 4/19/13 10:00 AM, =B7=FB=D3=C0=CC=CE wrote: >> > Dear Eric, >> > >> > I checked rh srpm >> https://content-web.rhn.redhat.com/rhn/public/NULL/kernel/2.6.32-279.19.= 1.el6/SRPMS/kernel-2.6.32-279.19.1.el6.src.rpm?__gda__=3D1366390847_8550b85= 68c50ea46b3180266b476353d&ext=3D.rpm >> > And the code is same, as following: >> > >> > __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) >> > { >> >> need to look in lib/rwsem.c not lib/rwsem-spinlock.c >> >> Thanks, >> -Eric >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --90e6ba3fcd274957e804dab9e437 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Dear Eric,
I noticed some functions call the= xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); twince but not in xfs_remove.=


201= 3/4/20 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
There it is, I use latest 2= 79.19.1 and only apply xfs trace path.
=


2013/4/20 Eric Sandeen= <sandeen@sandeen.net>
On 4/19/13 10:00 AM, =B7=FB=D3=C0=CC=CE= wrote:
> Dear Eric,
>
need to look in lib/rwsem.c not lib/rwsem-spinlock.c

Thanks,
-Eric




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--90e6ba3fcd274957e804dab9e437-- From yongtaofu@gmail.com Fri Apr 19 19:03:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9879A7CBF for ; Fri, 19 Apr 2013 19:03:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 62FA58F8050 for ; Fri, 19 Apr 2013 17:03:15 -0700 (PDT) X-ASG-Debug-ID: 1366416190-04cbb057f73c0fa0001-NocioJ Received: from mail-ie0-f179.google.com (mail-ie0-f179.google.com [209.85.223.179]) by cuda.sgi.com with ESMTP id yUCQAWswAOmsVK70 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 17:03:10 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.179 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.179] Received: by mail-ie0-f179.google.com with SMTP id 16so5294053iea.24 for ; Fri, 19 Apr 2013 17:03:10 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.179] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.179] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=RW+sd07y8QYL21yeZX22Hv7dmINlMd9RBxvY+Lvikw0=; b=HJzcy08++GinF66qKaA+Y5ttFzmT6Y7cFkUHD0B+nSLum8ZqSKejc4IrFYj7UHssIo C4ArYd++soXSlR9DdERtn3XPKwvDuU9oRgyi9qqQE2Tb50c1RHLpt9Jtjuwf6zJz4F+w V3QRybnnDbnJmzgB0mHFUokfLkBabnDe8MiI+Uzbq7tnrfbS4wjfbkDIseJpmIk126bG eNrVzBp5fRcfOOQYZfjOPsABzl1ymeqjZmJXttlO2t3j9YxAFNx+4iMb5Ds764zqkuLo 3j8btAgTGUDRf7octNjC296mRLqWVJFzutKY6ewaqJilxMhSO9nnMdKlmOOF6SC/ENLf gkzg== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr10541812igx.11.1366416189964; Fri, 19 Apr 2013 17:03:09 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 17:03:09 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> Date: Sat, 20 Apr 2013 08:03:09 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e0111e0749e49af04dabf8f04 X-Barracuda-Connect: mail-ie0-f179.google.com[209.85.223.179] X-Barracuda-Start-Time: 1366416190 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128613 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 --089e0111e0749e49af04dabf8f04 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Dear Eric and xfs experts, Updated progress is after more than one day glusterfs rebalance 3 of our servers xfs shutdown(8 servers in the test cluster). The errors are identical. Actually one of the most serious accident for us is 8 of our servers xfs shutdown at the same time during glusterfs rebalance. Thank you very much! 2013/4/20 =B7=FB=D3=C0=CC=CE > Dear Eric, > I noticed some functions call the xfs_lock_two_inodes(dp, ip, > XFS_ILOCK_EXCL); twince but not in xfs_remove. > > > 2013/4/20 =B7=FB=D3=C0=CC=CE > >> There it is, I use latest 279.19.1 and only apply xfs trace path. >> >> >> 2013/4/20 Eric Sandeen >> >>> On 4/19/13 10:00 AM, =B7=FB=D3=C0=CC=CE wrote: >>> > Dear Eric, >>> > >>> > I checked rh srpm >>> https://content-web.rhn.redhat.com/rhn/public/NULL/kernel/2.6.32-279.19= .1.el6/SRPMS/kernel-2.6.32-279.19.1.el6.src.rpm?__gda__=3D1366390847_8550b8= 568c50ea46b3180266b476353d&ext=3D.rpm >>> > And the code is same, as following: >>> > >>> > __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) >>> > { >>> >>> need to look in lib/rwsem.c not lib/rwsem-spinlock.c >>> >>> Thanks, >>> -Eric >>> >>> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --089e0111e0749e49af04dabf8f04 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Dear Eric and xfs experts,
Updated prog= ress is after more than one day glusterfs rebalance 3 of our servers xfs sh= utdown(8 servers in the test cluster). The errors are identical. Actually o= ne of the most serious accident for us is 8 of our servers xfs shutdown at = the same time during glusterfs rebalance.
Thank you very much!


2013/4/20 =B7=FB=D3=C0=CC=CE <<= a href=3D"mailto:yongtaofu@gmail.com" target=3D"_blank">yongtaofu@gmail.com= >
Dear Eric,
I noticed some functions call the= xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); twince but not in xfs_remove.=


2013/4/20 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
There it is, I use latest 2= 79.19.1 and only apply xfs trace path.
=


2013/4/20 Eric Sandeen <sandeen@= sandeen.net>
On 4/19/13 10:00 AM, =B7=FB=D3=C0=CC=CE= wrote:
> Dear Eric,
>
need to look in lib/rwsem.c not lib/rwsem-spinlock.c

Thanks,
-Eric




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--089e0111e0749e49af04dabf8f04-- From yongtaofu@gmail.com Fri Apr 19 20:15:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C4C457CBF for ; Fri, 19 Apr 2013 20:15:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 409F0AC004 for ; Fri, 19 Apr 2013 18:15:21 -0700 (PDT) X-ASG-Debug-ID: 1366420519-04cbb057f53c5a50001-NocioJ Received: from mail-ie0-f173.google.com (mail-ie0-f173.google.com [209.85.223.173]) by cuda.sgi.com with ESMTP id BzEgzS7wH0I8e875 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 18:15:19 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.173 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.173] Received: by mail-ie0-f173.google.com with SMTP id k5so5334253iea.4 for ; Fri, 19 Apr 2013 18:15:19 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.173] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.173] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=zZC+m221lYlNKj+iRxhQh/bl6snpjBl7gVh0L+h+RPg=; b=s9p6IqBsfLxXm4LEOt+SBDbMgfLVIkuUjUNlTxIagkwk6AcAyyJXkK5KO8pIZkAxUY nqFNyE4z0vYQhna8LszrZAzeW9rKu6j39pCsMnvk1DtPUPjqkqpcFBC6WWZfrRory+7o kkg6GY0+Y3I1aEyOhvbN/iRdl94b0O31d/Jh9nrSBSQ5PJ92sqI0ZP2SJk0K+vafLHJ+ 8rDX2gm1g01mY1HYKhsLCgyDnVCXzMwprS0UtnJ7Kpq6qTjmZ+jHikaIypHnPxQndVvP +MBVOdmXU9XC5/AH7pri/cWp1jUilqL43Nc4qju7PZqwle/iBcdqCFJh9YKjP4UiqxYl 0/Vg== MIME-Version: 1.0 X-Received: by 10.42.65.75 with SMTP id k11mr8022675ici.26.1366420519583; Fri, 19 Apr 2013 18:15:19 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 18:15:19 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> Date: Sat, 20 Apr 2013 09:15:19 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=90e6ba3fcd27af072304dac0913d X-Barracuda-Connect: mail-ie0-f173.google.com[209.85.223.173] X-Barracuda-Start-Time: 1366420519 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128617 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 --90e6ba3fcd27af072304dac0913d Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Dear xfs experts, Does mount with sync option helps to isolate this problem? 2013/4/20 =B7=FB=D3=C0=CC=CE > Dear Eric and xfs experts, > Updated progress is after more than one day glusterfs rebalance 3 of our > servers xfs shutdown(8 servers in the test cluster). The errors are > identical. Actually one of the most serious accident for us is 8 of our > servers xfs shutdown at the same time during glusterfs rebalance. > Thank you very much! > > > 2013/4/20 =B7=FB=D3=C0=CC=CE > >> Dear Eric, >> I noticed some functions call the xfs_lock_two_inodes(dp, ip, >> XFS_ILOCK_EXCL); twince but not in xfs_remove. >> >> >> 2013/4/20 =B7=FB=D3=C0=CC=CE >> >>> There it is, I use latest 279.19.1 and only apply xfs trace path. >>> >>> >>> 2013/4/20 Eric Sandeen >>> >>>> On 4/19/13 10:00 AM, =B7=FB=D3=C0=CC=CE wrote: >>>> > Dear Eric, >>>> > >>>> > I checked rh srpm >>>> https://content-web.rhn.redhat.com/rhn/public/NULL/kernel/2.6.32-279.1= 9.1.el6/SRPMS/kernel-2.6.32-279.19.1.el6.src.rpm?__gda__=3D1366390847_8550b= 8568c50ea46b3180266b476353d&ext=3D.rpm >>>> > And the code is same, as following: >>>> > >>>> > __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) >>>> > { >>>> >>>> need to look in lib/rwsem.c not lib/rwsem-spinlock.c >>>> >>>> Thanks, >>>> -Eric >>>> >>>> >>> >>> >>> -- >>> =B7=FB=D3=C0=CC=CE >>> >> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --90e6ba3fcd27af072304dac0913d Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Dear xfs experts,
Does mount with sync optio= n helps to isolate this problem?

2013/4/20 =B7=FB=D3=C0=CC=CE <yongtaofu@gma= il.com>
Dear Eric and xfs= experts,
Updated progress is after more than one day glusterfs re= balance 3 of our servers xfs shutdown(8 servers in the test cluster). The e= rrors are identical. Actually one of the most serious accident for us is 8 = of our servers xfs shutdown at the same time during glusterfs rebalance.
Thank you very much!


2013/4/20 =B7=FB=D3=C0=CC=CE = <yongtaofu@gmail.com>
Dear Eric,
I noticed some functions call the= xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); twince but not in xfs_remove.=


2013/4/20 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
There it is, I use latest 2= 79.19.1 and only apply xfs trace path.
=


2013/4/20 Eric Sandeen <sandeen@= sandeen.net>
On 4/19/13 10:00 AM, =B7=FB=D3=C0=CC=CE= wrote:
> Dear Eric,
>
need to look in lib/rwsem.c not lib/rwsem-spinlock.c

Thanks,
-Eric




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--90e6ba3fcd27af072304dac0913d-- From yongtaofu@gmail.com Fri Apr 19 21:51:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5129A29DFA for ; Fri, 19 Apr 2013 21:51:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 12A7A8F8049 for ; Fri, 19 Apr 2013 19:51:12 -0700 (PDT) X-ASG-Debug-ID: 1366426270-04bdf02d1f3e5590001-NocioJ Received: from mail-ie0-f178.google.com (mail-ie0-f178.google.com [209.85.223.178]) by cuda.sgi.com with ESMTP id H5PDKY7EJk0MvGXL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 19:51:10 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] Received: by mail-ie0-f178.google.com with SMTP id aq17so3881134iec.37 for ; Fri, 19 Apr 2013 19:51:10 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=wdVmlXFkk5vEtbnkFH7EYjhvESaN1moEVGitAE0WU+k=; b=lpO6GhbqRTiSz3wU840HsPNDFZ91a2S8CgcVWSZy4ctzep1dLqeppk4Eo/Zc7g5maa 9v1nK3uK0WLa2b0h7Z5ypKr3w+0TfdSSP8WzLLaAhmtM/7iuui+netr5p9gu3YrKkdkG AQDbZ2lRoJNQS7zsTdYvUFKGvzhgCHQcIGiokZtjZUXA/b+afIg63HNB5DLTDQ+wDA6A 0D2HS7XDHec5pqyPWs3YdrB4+0ij7yEuA683PMF85XW3JDw4Ajrmkul87tMjfXVyJ36R a9SJKsuWouz2ycnElNkeEu5QVDGIIuCsYQGdEGXRsbgmWUI0yahBnZ5sB6HIRDCN26wz Crtg== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr10768250igx.11.1366426270132; Fri, 19 Apr 2013 19:51:10 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 19:51:09 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <516FDBDE.1070406@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> Date: Sat, 20 Apr 2013 10:51:09 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e0111e07472e35e04dac1e857 X-Barracuda-Connect: mail-ie0-f178.google.com[209.85.223.178] X-Barracuda-Start-Time: 1366426270 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.128625 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 --089e0111e07472e35e04dac1e857 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable After change mount option to sync shutdown still happens, and I got a trace again, the inode 0x1c57d is abnormal. https://docs.google.com/file/d/0B7n2C4T5tfNCYW1jNWhBbXBYakE/edit?usp=3Dshar= ing I have a question if the problem is hard to reproduce why I got 8 times in a week only in a test cluster with 8 node? What's the problem? 2013/4/20 =B7=FB=D3=C0=CC=CE > Dear xfs experts, > Does mount with sync option helps to isolate this problem? > > > 2013/4/20 =B7=FB=D3=C0=CC=CE > >> Dear Eric and xfs experts, >> Updated progress is after more than one day glusterfs rebalance 3 of our >> servers xfs shutdown(8 servers in the test cluster). The errors are >> identical. Actually one of the most serious accident for us is 8 of our >> servers xfs shutdown at the same time during glusterfs rebalance. >> Thank you very much! >> >> >> 2013/4/20 =B7=FB=D3=C0=CC=CE >> >>> Dear Eric, >>> I noticed some functions call the xfs_lock_two_inodes(dp, ip, >>> XFS_ILOCK_EXCL); twince but not in xfs_remove. >>> >>> >>> 2013/4/20 =B7=FB=D3=C0=CC=CE >>> >>>> There it is, I use latest 279.19.1 and only apply xfs trace path. >>>> >>>> >>>> 2013/4/20 Eric Sandeen >>>> >>>>> On 4/19/13 10:00 AM, =B7=FB=D3=C0=CC=CE wrote: >>>>> > Dear Eric, >>>>> > >>>>> > I checked rh srpm >>>>> https://content-web.rhn.redhat.com/rhn/public/NULL/kernel/2.6.32-279.= 19.1.el6/SRPMS/kernel-2.6.32-279.19.1.el6.src.rpm?__gda__=3D1366390847_8550= b8568c50ea46b3180266b476353d&ext=3D.rpm >>>>> > And the code is same, as following: >>>>> > >>>>> > __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) >>>>> > { >>>>> >>>>> need to look in lib/rwsem.c not lib/rwsem-spinlock.c >>>>> >>>>> Thanks, >>>>> -Eric >>>>> >>>>> >>>> >>>> >>>> -- >>>> =B7=FB=D3=C0=CC=CE >>>> >>> >>> >>> >>> -- >>> =B7=FB=D3=C0=CC=CE >>> >> >> >> >> -- >> =B7=FB=D3=C0=CC=CE >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --089e0111e07472e35e04dac1e857 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
After change mount option to sync shutdown = still happens, and I got a trace again, the inode 0x1c57d is abnormal.
<= /div>https://docs.google.com/file/d/0B7n2C4T5tfNCYW1jNWhBbX= BYakE/edit?usp=3Dsharing
I have a question if the problem is hard to reproduce why I got 8 tim= es in a week only in a test cluster with 8 node?
What's the pr= oblem?


2013/4/20 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Dear xfs experts,
Does mount with sync optio= n helps to isolate this problem?
<= div class=3D"h5">

2013/4/20 =B7=FB=D3=C0= =CC=CE <yongtaofu@gmail.com>
Dear Eric and xfs= experts,
Updated progress is after more than one day glusterfs re= balance 3 of our servers xfs shutdown(8 servers in the test cluster). The e= rrors are identical. Actually one of the most serious accident for us is 8 = of our servers xfs shutdown at the same time during glusterfs rebalance.
Thank you very much!

2013/4/20 =B7=FB=D3=C0=CC=CE <yongtaofu= @gmail.com>
Dear Eric,
I noticed some functions call the= xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); twince but not in xfs_remove.=


2013/4/20 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
There it is, I use latest 2= 79.19.1 and only apply xfs trace path.
=


2013/4/20 Eric Sandeen <sandeen@= sandeen.net>
On 4/19/13 10:00 AM, =B7=FB=D3=C0=CC=CE= wrote:
> Dear Eric,
>
need to look in lib/rwsem.c not lib/rwsem-spinlock.c

Thanks,
-Eric




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--089e0111e07472e35e04dac1e857-- From sandeen@sandeen.net Fri Apr 19 22:41:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1F8F529DFA for ; Fri, 19 Apr 2013 22:41:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0CB55304067 for ; Fri, 19 Apr 2013 20:41:03 -0700 (PDT) X-ASG-Debug-ID: 1366429259-04cb6c2c1d3e8d10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id nIXqkvZapr0pEewq for ; Fri, 19 Apr 2013 20:41:00 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (unknown [69.38.217.3]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1D0CC6527C09; Fri, 19 Apr 2013 22:40:58 -0500 (CDT) Message-ID: <51720E49.9020001@sandeen.net> Date: Fri, 19 Apr 2013 20:40:57 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Brian Foster , "xfs@oss.sgi.com" Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366429259 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128627 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/19/13 7:51 PM, 符永涛 wrote: > After change mount option to sync shutdown still happens, and I got a trace again, the inode 0x1c57d is abnormal. since this is a race on namespace operations, I wouldn't have expected sync to matter. > https://docs.google.com/file/d/0B7n2C4T5tfNCYW1jNWhBbXBYakE/edit?usp=sharing > I have a question if the problem is hard to reproduce why I got 8 times in a week only in a test cluster with 8 node? > What's the problem? you must have something unique in your environment, and we don't know what it is. To gather more information, can you also turn on tracepoints for: xfs_rename xfs_create xfs_link xfs_remove in addition to xfs_iunlink and xfs_iunlink_remove, and we'll see what that tells us. There are many paths that manipulate the di_nlink count, and something is racing, but we don't yet know what two callchains they are. The above are all the callers that manipulate the link count, so they will yield more information about who is manipulating the counts. Thanks, -Eric From yongtaofu@gmail.com Fri Apr 19 23:03:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 56A1D29DFA for ; Fri, 19 Apr 2013 23:03:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 43352304070 for ; Fri, 19 Apr 2013 21:03:17 -0700 (PDT) X-ASG-Debug-ID: 1366430590-04cbb057f83d0fc0001-NocioJ Received: from mail-ie0-f179.google.com (mail-ie0-f179.google.com [209.85.223.179]) by cuda.sgi.com with ESMTP id AQjyDHE8KVnRLblS (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 21:03:11 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.179 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.179] Received: by mail-ie0-f179.google.com with SMTP id 16so5380540iea.38 for ; Fri, 19 Apr 2013 21:03:10 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.179] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.179] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=2LTYo4UscF4VsQ5ucWQZedE6zD63OGFu1DxswXu6HwI=; b=LEAZpsbr9jIKapIcZ6tqGWkf8vPux2k1zcfP5MkDXIQ0uA+w0G0io9NYZuoPvpMvOC wj5DpRJvaf7IBGtDASmg4aESCTG1Yi0R6MOJKofn/Ek/88YBGdyHh/WqTTvSp6D8sfge biDLa8OkFQGKGiL4EKRBoRitmJiv3gMMiDoPZ/druY5qh9nPwc6nVdWpHq1lsKvG5yPF JDPP39VHSD1C0JhGlwM8m3d86/PmqiOms6s+OqZA7m5IjpeLw6wqnbd2kQci5reXVCyK 2/thK+7X/dv+rYfM7cNqIcDQr+i0RvzBHAVOKGSS4L5NV9fnaBK2NFd8Dy3DtcqvdOhX qeEA== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr10854457igx.11.1366430590709; Fri, 19 Apr 2013 21:03:10 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 21:03:10 -0700 (PDT) In-Reply-To: <51720E49.9020001@sandeen.net> References: <516C89DF.4070904@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> <51720E49.9020001@sandeen.net> Date: Sat, 20 Apr 2013 12:03:10 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e0111e074f85a3604dac2e902 X-Barracuda-Connect: mail-ie0-f179.google.com[209.85.223.179] X-Barracuda-Start-Time: 1366430591 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128629 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 --089e0111e074f85a3604dac2e902 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Eric, I will enable them and run test again. I can only reproduce it with glusterfs rebalance. Glusterfs uses a mechanism it called syncop to unlink file. For rebalance it uses syncop_unlink(glusterfs/libglusterfs/src/syncop.c). In the glusterfs sync_task framework(glusterfs/libglusterfs/src/syncop.c) it uses "makecontext/swapcontext". Does it leads to racing unlink from different CPU core? Thank you. 2013/4/20 Eric Sandeen > On 4/19/13 7:51 PM, =B7=FB=D3=C0=CC=CE wrote: > > After change mount option to sync shutdown still happens, and I got a > trace again, the inode 0x1c57d is abnormal. > > since this is a race on namespace operations, I wouldn't have expected > sync to matter. > > > > https://docs.google.com/file/d/0B7n2C4T5tfNCYW1jNWhBbXBYakE/edit?usp=3Dsh= aring > > I have a question if the problem is hard to reproduce why I got 8 times > in a week only in a test cluster with 8 node? > > What's the problem? > > you must have something unique in your environment, and we don't know wha= t > it is. > > To gather more information, can you also turn on tracepoints for: > > xfs_rename > xfs_create > xfs_link > xfs_remove > > in addition to xfs_iunlink and xfs_iunlink_remove, > and we'll see what that tells us. > > There are many paths that manipulate the di_nlink count, and something is > racing, but we don't yet know what two callchains they are. > > The above are all the callers that manipulate the link count, so they wil= l > yield more information about who is manipulating the counts. > > Thanks, > -Eric > > --=20 =B7=FB=D3=C0=CC=CE --089e0111e074f85a3604dac2e902 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Eric,
I will enable them and run tes= t again. I can only reproduce it with glusterfs rebalance. Glusterfs uses a= mechanism it called syncop to unlink file. For rebalance it uses syncop_un= link(glusterfs/libglusterfs/src/syncop.c). In the glusterfs sync_task frame= work(glusterfs/libglusterfs/src/syncop.c) it uses "makecont= ext/swapcontext". Does it leads to racing unlink from different CP= U core?
Thank you.


2013/4/20 Eric Sandeen <sandeen@sandeen.net>=
On 4/19/13 7:51 PM, =B7=FB=D3=C0=CC=CE wrote:
> After change mount option to sync shutdown still happens, and I got a = trace again, the inode 0x1c57d is abnormal.

since this is a race on namespace operations, I wouldn't have exp= ected sync to matter.

> https://docs.google.com/file/d/0B7n2= C4T5tfNCYW1jNWhBbXBYakE/edit?usp=3Dsharing
> I have a question if the problem is hard to reproduce why I got 8 time= s in a week only in a test cluster with 8 node?
> What's the problem?

you must have something unique in your environment, and we don't = know what it is.

To gather more information, can you also turn on tracepoints for:

xfs_rename
xfs_create
xfs_link
xfs_remove

in addition to xfs_iunlink and xfs_iunlink_remove,
and we'll see what that tells us.

There are many paths that manipulate the di_nlink count, and something is r= acing, but we don't yet know what two callchains they are.

The above are all the callers that manipulate the link count, so they will = yield more information about who is manipulating the counts.

Thanks,
-Eric




--
=B7=FB=D3=C0=CC=CE
--089e0111e074f85a3604dac2e902-- From yongtaofu@gmail.com Fri Apr 19 23:11:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8410429DFA for ; Fri, 19 Apr 2013 23:11:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 41FEC304071 for ; Fri, 19 Apr 2013 21:11:18 -0700 (PDT) X-ASG-Debug-ID: 1366431076-04bdf02d1f3eb790001-NocioJ Received: from mail-ie0-f171.google.com (mail-ie0-f171.google.com [209.85.223.171]) by cuda.sgi.com with ESMTP id 1UxKtXdQmyNJpoad (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 21:11:16 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.171 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] Received: by mail-ie0-f171.google.com with SMTP id e11so5458622iej.2 for ; Fri, 19 Apr 2013 21:11:16 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=wBQDvoPqC/HgJ5YVmWqbIoZ49P2Bl4hElo+DamUNy5s=; b=XGs52tA1kc6LqwAaz61iqXw2IuxISLS4nxCLjSYYsG23O5bgl9K6TMahA/QcmMjXbk 37z6BFIeZjIWOQbgKinYxsa32A9gTe16R4/lulo4EA6E6utOrCE8T2J+S2sUyLWNhAyY Kx+Ad3gf3rMqQUBOqepIe+XLurFoLMXCb9Fm4w4a1+Z2K5Unzymrv6C9Vg/UsgsJBZOt bGZq46nv1ckgpxC3ZVZ6QVZfVc2miOrTiQ4QuYKIY/9rCPqJYlIXm6jKzhNklKMr4Rz2 98q2kbkzinBJaAbuqM9kT9Zn3Pntie3P3LHTZ0JhyMDyoTS2R6yOkCyO+zC/hIZIHME+ +/9w== MIME-Version: 1.0 X-Received: by 10.43.65.145 with SMTP id xm17mr9381303icb.35.1366431076414; Fri, 19 Apr 2013 21:11:16 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 21:11:16 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <51705EC4.4000306@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> <51720E49.9020001@sandeen.net> Date: Sat, 20 Apr 2013 12:11:16 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=bcaec51d2998ebcd4704dac306fd X-Barracuda-Connect: mail-ie0-f171.google.com[209.85.223.171] X-Barracuda-Start-Time: 1366431076 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128629 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 --bcaec51d2998ebcd4704dac306fd Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable And glusterfs always uses hardlink for sel-heal too(a backend file has a hardlink under a hidden directory which name is .glusterfs). So as you have mentioned reduce di_nlink may also conflicts. 2013/4/20 =B7=FB=D3=C0=CC=CE > Hi Eric, > I will enable them and run test again. I can only reproduce it with > glusterfs rebalance. Glusterfs uses a mechanism it called syncop to unlin= k > file. For rebalance it uses > syncop_unlink(glusterfs/libglusterfs/src/syncop.c). In the glusterfs > sync_task framework(glusterfs/libglusterfs/src/syncop.c) it uses > "makecontext/swapcontext". > Does it leads to racing unlink from different CPU core? > Thank you. > > > 2013/4/20 Eric Sandeen > >> On 4/19/13 7:51 PM, =B7=FB=D3=C0=CC=CE wrote: >> > After change mount option to sync shutdown still happens, and I got a >> trace again, the inode 0x1c57d is abnormal. >> >> since this is a race on namespace operations, I wouldn't have expected >> sync to matter. >> >> > >> https://docs.google.com/file/d/0B7n2C4T5tfNCYW1jNWhBbXBYakE/edit?usp=3Ds= haring >> > I have a question if the problem is hard to reproduce why I got 8 time= s >> in a week only in a test cluster with 8 node? >> > What's the problem? >> >> you must have something unique in your environment, and we don't know >> what it is. >> >> To gather more information, can you also turn on tracepoints for: >> >> xfs_rename >> xfs_create >> xfs_link >> xfs_remove >> >> in addition to xfs_iunlink and xfs_iunlink_remove, >> and we'll see what that tells us. >> >> There are many paths that manipulate the di_nlink count, and something i= s >> racing, but we don't yet know what two callchains they are. >> >> The above are all the callers that manipulate the link count, so they >> will yield more information about who is manipulating the counts. >> >> Thanks, >> -Eric >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --bcaec51d2998ebcd4704dac306fd Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
And glusterfs always uses hardlink for sel-heal too(a back= end file has a hardlink under a hidden directory which name is .glusterfs).= So as you have mentioned reduce di_nlink may also conflicts.


2013/4/20 =B7=FB=D3=C0=CC=CE <yongt= aofu@gmail.com>
Hi Eric,
I will enable them and run tes= t again. I can only reproduce it with glusterfs rebalance. Glusterfs uses a= mechanism it called syncop to unlink file. For rebalance it uses syncop_un= link(glusterfs/libglusterfs/src/syncop.c). In the glusterfs sync_task frame= work(glusterfs/libglusterfs/src/syncop.c) it uses "makecontext/swapcontext". Does it leads to racing unlink= from different CPU core?
Thank you.


2013/4/20 Eric Sandeen <sandeen@san= deen.net>
On 4/19/13 7:51 PM, =B7=FB=D3=C0=CC=CE wrote:
> After change mount option to sync shutdown still happens, and I got a = trace again, the inode 0x1c57d is abnormal.

since this is a race on namespace operations, I wouldn't have exp= ected sync to matter.

> https://docs.google.com/file/d/0B7n2= C4T5tfNCYW1jNWhBbXBYakE/edit?usp=3Dsharing
> I have a question if the problem is hard to reproduce why I got 8 time= s in a week only in a test cluster with 8 node?
> What's the problem?

you must have something unique in your environment, and we don't = know what it is.

To gather more information, can you also turn on tracepoints for:

xfs_rename
xfs_create
xfs_link
xfs_remove

in addition to xfs_iunlink and xfs_iunlink_remove,
and we'll see what that tells us.

There are many paths that manipulate the di_nlink count, and something is r= acing, but we don't yet know what two callchains they are.

The above are all the callers that manipulate the link count, so they will = yield more information about who is manipulating the counts.

Thanks,
-Eric




--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--bcaec51d2998ebcd4704dac306fd-- From sandeen@sandeen.net Fri Apr 19 23:20:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3887A29DFA for ; Fri, 19 Apr 2013 23:20:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0FD30304070 for ; Fri, 19 Apr 2013 21:20:41 -0700 (PDT) X-ASG-Debug-ID: 1366431640-04cb6c2c1d3ebab0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id QKGN97OApGNxSez9 for ; Fri, 19 Apr 2013 21:20:40 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (unknown [69.38.217.3]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3DFB56527C09; Fri, 19 Apr 2013 23:20:40 -0500 (CDT) Message-ID: <51721798.1060501@sandeen.net> Date: Fri, 19 Apr 2013 21:20:40 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: =?GB2312?B?t/vTwMzO?= CC: Brian Foster , "xfs@oss.sgi.com" Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> <51720E49.9020001@sandeen.net> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366431640 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128631 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/19/13 9:03 PM, ·ûÓÀÌÎ wrote: > Hi Eric, > I will enable them and run test again. I can only reproduce it with > glusterfs rebalance. Glusterfs uses a mechanism it called syncop to > unlink file. For rebalance it uses > syncop_unlink(glusterfs/libglusterfs/src/syncop.c). In the glusterfs > sync_task framework(glusterfs/libglusterfs/src/syncop.c) it uses > "makecontext/swapcontext" > . > Does it leads to racing unlink from different CPU core? Yep, I understand that it's rebalance. It dies when rebalance finishes because an open but unlinked file trips over the corrupted list from earlier, it seems. I don't know why makecontext would matter... Just to be sure, you are definitely loading the xfs module from the kernel you built, right, and you don't have a "priority" module getting loaded from elsewhere? Seems unlikely, but just to be sure. > Thank you. You could also add this patch to the xfs tracepoints to print more information about the inodes - the mode & flags. -Eric diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index e8ce644..c314b87 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(xfs_inode_class, TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_ino_t, ino) + __field(__u16, mode) + __field(unsigned long, flags) ), TP_fast_assign( __entry->dev = VFS_I(ip)->i_sb->s_dev; __entry->ino = ip->i_ino; + __entry->mode = VFS_I(ip)->i_mode; + __entry->flags = ip->i_flags; ), - TP_printk("dev %d:%d ino 0x%llx", + TP_printk("dev %d:%d ino 0x%llx mode 0%o, flags 0x%lx", MAJOR(__entry->dev), MINOR(__entry->dev), - __entry->ino) + __entry->ino, __entry->mode, __entry->flags) ) #define DEFINE_INODE_EVENT(name) \ From yongtaofu@gmail.com Fri Apr 19 23:27:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A19B429DFA for ; Fri, 19 Apr 2013 23:27:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8C81E304070 for ; Fri, 19 Apr 2013 21:27:41 -0700 (PDT) X-ASG-Debug-ID: 1366432060-04cbb057f63d2840001-NocioJ Received: from mail-ia0-f176.google.com (mail-ia0-f176.google.com [209.85.210.176]) by cuda.sgi.com with ESMTP id ITGMDQQyRbaQEz7G (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 19 Apr 2013 21:27:40 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.176 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.176] Received: by mail-ia0-f176.google.com with SMTP id i9so3926906iad.7 for ; Fri, 19 Apr 2013 21:27:40 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.176] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.176] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=UVmX7Z2rVY5KX1Y4hEwSajTZhm2NL3RM/W2WUN+xEK0=; b=Y30xRkvVjwPmE9NEXwBIBhZaboPMm1PIzdSqBKjL1Ownafujd7Qh8O3AqBtZVarqYE 8nzvdqlvFHBcW4SAQKAZ8pmnQ7aKiQE0GVXIi2AgYgjxfJUp3uL4PH/w5cyMj2QeyDOY YIur+pYfMGvo8z0/YsERQxZj6JZv7aKRKbWUC67CPg7smMtGFXhmxGQvoeJesZvh6o5M 32op0xFmaxPQtOriPnhJf3MzBeEKt33PNwUtqEeHInZ6+DYgZ6NxrOP3uuJJu1Ber12y Ic6xLVCAkiLosK1sf4HhM6md/d9aiUKHSJmN9xipFVoNLM2Ix8S8sGuCg3jFJPRZPNEf un7A== MIME-Version: 1.0 X-Received: by 10.50.78.162 with SMTP id c2mr10881441igx.11.1366432060100; Fri, 19 Apr 2013 21:27:40 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Fri, 19 Apr 2013 21:27:39 -0700 (PDT) In-Reply-To: <51721798.1060501@sandeen.net> References: <516C89DF.4070904@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> <51720E49.9020001@sandeen.net> <51721798.1060501@sandeen.net> Date: Sat, 20 Apr 2013 12:27:39 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e0111e0748da7bc04dac3414b X-Barracuda-Connect: mail-ia0-f176.google.com[209.85.210.176] X-Barracuda-Start-Time: 1366432060 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128631 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 --089e0111e0748da7bc04dac3414b Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Eric, The xfs module is loaded from system kernel, it happens on our production server too (I did not touch that till now) and if the xfs module is mess up the systemstap may also not working but now it works. As you have mentioned, strange thing is xfs shutdown always happens when glusterfs rebalance completes. 2013/4/20 Eric Sandeen > On 4/19/13 9:03 PM, =B7=FB=D3=C0=CC=CE wrote: > > Hi Eric, > > I will enable them and run test again. I can only reproduce it with > > glusterfs rebalance. Glusterfs uses a mechanism it called syncop to > > unlink file. For rebalance it uses > > syncop_unlink(glusterfs/libglusterfs/src/syncop.c). In the glusterfs > > sync_task framework(glusterfs/libglusterfs/src/syncop.c) it uses > > "makecontext/swapcontext" > > < > http://www.opengroup.org/onlinepubs/009695399/functions/makecontext.html>= . > > Does it leads to racing unlink from different CPU core? > > Yep, I understand that it's rebalance. It dies when rebalance finishes > because an > open but unlinked file trips over the corrupted list from earlier, it > seems. > > I don't know why makecontext would matter... > > Just to be sure, you are definitely loading the xfs module from the kerne= l > you built, right, and you don't have a "priority" module getting loaded > from elsewhere? Seems unlikely, but just to be sure. > > > Thank you. > > You could also add this patch to the xfs tracepoints to print more > information about the inodes - the mode & flags. > > -Eric > > > diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h > index e8ce644..c314b87 100644 > --- a/fs/xfs/linux-2.6/xfs_trace.h > +++ b/fs/xfs/linux-2.6/xfs_trace.h > @@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(xfs_inode_class, > TP_STRUCT__entry( > __field(dev_t, dev) > __field(xfs_ino_t, ino) > + __field(__u16, mode) > + __field(unsigned long, flags) > ), > TP_fast_assign( > __entry->dev =3D VFS_I(ip)->i_sb->s_dev; > __entry->ino =3D ip->i_ino; > + __entry->mode =3D VFS_I(ip)->i_mode; > + __entry->flags =3D ip->i_flags; > ), > - TP_printk("dev %d:%d ino 0x%llx", > + TP_printk("dev %d:%d ino 0x%llx mode 0%o, flags 0x%lx", > MAJOR(__entry->dev), MINOR(__entry->dev), > - __entry->ino) > + __entry->ino, __entry->mode, __entry->flags) > ) > > #define DEFINE_INODE_EVENT(name) \ > > > > --=20 =B7=FB=D3=C0=CC=CE --089e0111e0748da7bc04dac3414b Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Eric,
The xfs module is loaded from syste= m kernel, it happens on our production server too (I did not touch that til= l now) and if the xfs module is mess up the systemstap may also not working= but now it works. As you have mentioned, strange thing is xfs shutdown alw= ays happens when glusterfs rebalance completes.


2013/4/= 20 Eric Sandeen <sandeen@sandeen.net>
On 4/19/13 9:03 PM, =B7=FB=D3=C0=CC=CE wrote:
> Hi Eric,
> I will enable them and run test again. I can only reproduce it with > glusterfs rebalance. Glusterfs uses a mechanism it called syncop to > unlink file. For rebalance it uses
> syncop_unlink(glusterfs/libglusterfs/src/syncop.c). In the glusterfs > sync_task framework(glusterfs/libglusterfs/src/syncop.c) it uses
> "makecontext/swapcontext"
> <http://www.opengroup.org/onlinep= ubs/009695399/functions/makecontext.html>.
> Does it leads to racing unlink from different CPU co= re?

Yep, I understand that it's rebalance.  It dies when rebalan= ce finishes because an
open but unlinked file trips over the corrupted list from earlier, it seems= .

I don't know why makecontext would matter...

Just to be sure, you are definitely loading the xfs module from the kernel = you built, right, and you don't have a "priority" module gett= ing loaded from elsewhere?  Seems unlikely, but just to be sure.

> Thank you.

You could also add this patch to the xfs tracepoints to print more informat= ion about the inodes - the mode & flags.

-Eric


diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index e8ce644..c314b87 100644
--- a/fs/xfs/linux-2.6/xfs_trace.h
+++ b/fs/xfs/linux-2.6/xfs_trace.h
@@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(xfs_inode_class,
        TP_STRUCT__entry(
                __field(dev_t, dev)=
                __field(xfs_ino_t, = ino)
+               __field(__u16, mode)
+               __field(unsigned long, f= lags)
        ),
        TP_fast_assign(
                __entry->dev =3D= VFS_I(ip)->i_sb->s_dev;
                __entry->ino =3D= ip->i_ino;
+               __entry->mode =3D VFS= _I(ip)->i_mode;
+               __entry->flags =3D ip= ->i_flags;
        ),
-       TP_printk("dev %d:%d ino 0x%llx",
+       TP_printk("dev %d:%d ino 0x%llx mode 0%o, flags= 0x%lx",
                  MAJOR(__entr= y->dev), MINOR(__entry->dev),
-                 __entry->ino)<= br> +                 __entry->ino, = __entry->mode, __entry->flags)
 )

 #define DEFINE_INODE_EVENT(name) \






--
=B7=FB=D3=C0=CC=CE
--089e0111e0748da7bc04dac3414b-- From yongtaofu@gmail.com Sat Apr 20 05:11:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1970E29DFA for ; Sat, 20 Apr 2013 05:11:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E7468F8037 for ; Sat, 20 Apr 2013 03:10:56 -0700 (PDT) X-ASG-Debug-ID: 1366452652-04cb6c6e2b2dee30001-NocioJ Received: from mail-ie0-f173.google.com (mail-ie0-f173.google.com [209.85.223.173]) by cuda.sgi.com with ESMTP id aFw1kLoUtRZVvIV3 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 20 Apr 2013 03:10:52 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.173 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.173] Received: by mail-ie0-f173.google.com with SMTP id k5so5535354iea.18 for ; Sat, 20 Apr 2013 03:10:52 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.173] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.173] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=2K7QyhN2My/IVrSKnNOINLWwl7RPzzaso7CkE8MMysI=; b=l7WvlsImYDmOexRuY8k8t05KWSswwERl6GvyPVGfVnMuLGtsKF5H9T73xG6qCHJqne omKasUpr2OCTK1BtzNZNgVn+n0WgyPezdXU3P0tRqQYRYnUcFEgaKS7n+i7VpGEHelFE VJ7kNyp/RDe9Q0ZL/Po5N/HPZ+ivkg/YhIoqbdPm1PqHUdKIaVu9527PBYp4mFXX5WgE KCCpzbBF7dNJ8X7X+VlGnkTj4pL9lw+LcgzsCb14AAL+e61BS0CR+LGZcQR/QzeF0+GO o1z8LIf/QjTnhx0rUGVht4tHqwrttJP/xW7OBY9aNVSci8fErOHEVZ6XcSDcCLjQJD2a hu2g== MIME-Version: 1.0 X-Received: by 10.50.20.163 with SMTP id o3mr3966898ige.51.1366452652300; Sat, 20 Apr 2013 03:10:52 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Sat, 20 Apr 2013 03:10:51 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <51715BD4.8080501@sandeen.net> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> <51720E49.9020001@sandeen.net> <51721798.1060501@sandeen.net> Date: Sat, 20 Apr 2013 18:10:51 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=047d7bd75decf1ae9504dac80ccc X-Barracuda-Connect: mail-ie0-f173.google.com[209.85.223.173] X-Barracuda-Start-Time: 1366452652 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128653 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 --047d7bd75decf1ae9504dac80ccc Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Dear Eric, I have applied your latest patch and collected the following log: /var/log/message Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() returned error 22 for inode 0x1b20b ag 0 agino 1b20b Apr 20 17:28:23 10 kernel: Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned error 22 Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D 0xffffffffa02d4d0a Apr 20 17:28:23 10 kernel: XFS (sdb): I/O Error Detected. Shutting down filesystem Apr 20 17:28:23 10 kernel: XFS (sdb): Please umount the filesystem and rectify the problem(s) Apr 20 17:28:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. Apr 20 17:29:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. Apr 20 17:29:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. Apr 20 17:30:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. debugfs trace: https://docs.google.com/file/d/0B7n2C4T5tfNCTlZGUVpnZENrZ3M/edit?usp=3Dshar= ing Thank you. 2013/4/20 =B7=FB=D3=C0=CC=CE > Hi Eric, > The xfs module is loaded from system kernel, it happens on our production > server too (I did not touch that till now) and if the xfs module is mess = up > the systemstap may also not working but now it works. As you have > mentioned, strange thing is xfs shutdown always happens when glusterfs > rebalance completes. > > > 2013/4/20 Eric Sandeen > >> On 4/19/13 9:03 PM, =B7=FB=D3=C0=CC=CE wrote: >> > Hi Eric, >> > I will enable them and run test again. I can only reproduce it with >> > glusterfs rebalance. Glusterfs uses a mechanism it called syncop to >> > unlink file. For rebalance it uses >> > syncop_unlink(glusterfs/libglusterfs/src/syncop.c). In the glusterfs >> > sync_task framework(glusterfs/libglusterfs/src/syncop.c) it uses >> > "makecontext/swapcontext" >> > < >> http://www.opengroup.org/onlinepubs/009695399/functions/makecontext.html >> >. >> > Does it leads to racing unlink from different CPU core? >> >> Yep, I understand that it's rebalance. It dies when rebalance finishes >> because an >> open but unlinked file trips over the corrupted list from earlier, it >> seems. >> >> I don't know why makecontext would matter... >> >> Just to be sure, you are definitely loading the xfs module from the >> kernel you built, right, and you don't have a "priority" module getting >> loaded from elsewhere? Seems unlikely, but just to be sure. >> >> > Thank you. >> >> You could also add this patch to the xfs tracepoints to print more >> information about the inodes - the mode & flags. >> >> -Eric >> >> >> diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h >> index e8ce644..c314b87 100644 >> --- a/fs/xfs/linux-2.6/xfs_trace.h >> +++ b/fs/xfs/linux-2.6/xfs_trace.h >> @@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(xfs_inode_class, >> TP_STRUCT__entry( >> __field(dev_t, dev) >> __field(xfs_ino_t, ino) >> + __field(__u16, mode) >> + __field(unsigned long, flags) >> ), >> TP_fast_assign( >> __entry->dev =3D VFS_I(ip)->i_sb->s_dev; >> __entry->ino =3D ip->i_ino; >> + __entry->mode =3D VFS_I(ip)->i_mode; >> + __entry->flags =3D ip->i_flags; >> ), >> - TP_printk("dev %d:%d ino 0x%llx", >> + TP_printk("dev %d:%d ino 0x%llx mode 0%o, flags 0x%lx", >> MAJOR(__entry->dev), MINOR(__entry->dev), >> - __entry->ino) >> + __entry->ino, __entry->mode, __entry->flags) >> ) >> >> #define DEFINE_INODE_EVENT(name) \ >> >> >> >> > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --047d7bd75decf1ae9504dac80ccc Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Dear Eric,
I have applied you= r latest patch and collected the following log:

/var/log/messa= ge
Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp= () returned error 22 for inode 0x1b20b ag 0 agino 1b20b
Apr 20 17:28:23 10 kernel:
Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_ina= ctive: xfs_ifree returned error 22
Apr 20 17:28:23 10 kernel: XFS (sdb):= xfs_do_force_shutdown(0x1) called from line 1184 of file fs/xfs/xfs_vnodeo= ps.c.  Return address =3D 0xffffffffa02d4d0a
Apr 20 17:28:23 10 kernel: XFS (sdb): I/O Error Detected. Shutting down fil= esystem
Apr 20 17:28:23 10 kernel: XFS (sdb): Please umount the filesyst= em and rectify the problem(s)
Apr 20 17:28:37 10 kernel: XFS (sdb): xfs_= log_force: error 5 returned.
Apr 20 17:29:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.
A= pr 20 17:29:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.
Ap= r 20 17:30:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.

debugfs trace:
https://docs.google.com/file/d/= 0B7n2C4T5tfNCTlZGUVpnZENrZ3M/edit?usp=3Dsharing

Thank you.=


2013/4/= 20 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com>
Hi Eric,
The xfs module is loaded from syste= m kernel, it happens on our production server too (I did not touch that til= l now) and if the xfs module is mess up the systemstap may also not working= but now it works. As you have mentioned, strange thing is xfs shutdown alw= ays happens when glusterfs rebalance completes.


2013/4/20 Eric Sandeen <sandeen@sandeen.net>
On 4/19/13 9:03 PM, =B7=FB=D3=C0=CC=CE wrote:
> Hi Eric,
> I will enable them and run test again. I can only reproduce it with > glusterfs rebalance. Glusterfs uses a mechanism it called syncop to > unlink file. For rebalance it uses
> syncop_unlink(glusterfs/libglusterfs/src/syncop.c). In the glusterfs > sync_task framework(glusterfs/libglusterfs/src/syncop.c) it uses
> "makecontext/swapcontext"
> <http://www.opengroup.org/onlinep= ubs/009695399/functions/makecontext.html>.
> Does it leads to racing unlink from different CPU core?

Yep, I understand that it's rebalance.  It dies when rebalan= ce finishes because an
open but unlinked file trips over the corrupted list from earlier, it seems= .

I don't know why makecontext would matter...

Just to be sure, you are definitely loading the xfs module from the kernel = you built, right, and you don't have a "priority" module gett= ing loaded from elsewhere?  Seems unlikely, but just to be sure.

> Thank you.

You could also add this patch to the xfs tracepoints to print more informat= ion about the inodes - the mode & flags.

-Eric


diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index e8ce644..c314b87 100644
--- a/fs/xfs/linux-2.6/xfs_trace.h
+++ b/fs/xfs/linux-2.6/xfs_trace.h
@@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(xfs_inode_class,
        TP_STRUCT__entry(
                __field(dev_t, dev)=
                __field(xfs_ino_t, = ino)
+               __field(__u16, mode)
+               __field(unsigned long, f= lags)
        ),
        TP_fast_assign(
                __entry->dev =3D= VFS_I(ip)->i_sb->s_dev;
                __entry->ino =3D= ip->i_ino;
+               __entry->mode =3D VFS= _I(ip)->i_mode;
+               __entry->flags =3D ip= ->i_flags;
        ),
-       TP_printk("dev %d:%d ino 0x%llx",
+       TP_printk("dev %d:%d ino 0x%llx mode 0%o, flags= 0x%lx",
                  MAJOR(__entr= y->dev), MINOR(__entry->dev),
-                 __entry->ino)<= br> +                 __entry->ino, = __entry->mode, __entry->flags)
 )

 #define DEFINE_INODE_EVENT(name) \






--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0=CC=CE
--047d7bd75decf1ae9504dac80ccc-- From service@labanquepostale.fr Sat Apr 20 05:34:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_HTML_ATTACH, T_OBFU_HTML_ATTACH autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AA55529DFA for ; Sat, 20 Apr 2013 05:34:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 976BE30404E for ; Sat, 20 Apr 2013 03:34:58 -0700 (PDT) X-ASG-Debug-ID: 1366454096-04cbb057f73eafe0001-NocioJ Received: from vps-49494 ([91.234.104.42]) by cuda.sgi.com with ESMTP id Wn2Y0XzIkQHn84vN for ; Sat, 20 Apr 2013 03:34:56 -0700 (PDT) X-Barracuda-Envelope-From: service@labanquepostale.fr X-Barracuda-Apparent-Source-IP: 91.234.104.42 Received: from labanquepostale.fr ([127.0.0.1]) by vps-49494 with Microsoft SMTPSVC(7.5.7601.17514); Sat, 20 Apr 2013 12:35:05 +0200 Message-ID: <20130420122953.B640E3B76CD77249@labanquepostale.fr> From: service@labanquepostale.fr To: xfs@oss.sgi.com Subject: Avis de 20/04/2013 Date: 20 Apr 2013 12:35:05 +0200 X-ASG-Orig-Subj: Avis de 20/04/2013 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0012_9F8282B0.E253C89A" X-OriginalArrivalTime: 20 Apr 2013 10:35:05.0865 (UTC) FILETIME=[B9104F90:01CE3DB2] X-Barracuda-Connect: UNKNOWN[91.234.104.42] X-Barracuda-Start-Time: 1366454096 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.60 X-Barracuda-Spam-Status: No, SCORE=1.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG194, BSF_SC5_MJ1963, NO_REAL_NAME, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128655 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 1.00 BSF_SC0_TG194 Custom Rule TG194 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. ------=_NextPart_000_0012_9F8282B0.E253C89A Content-Type: text/plain Content-Transfer-Encoding: 8bit Chere Cliente, Cher Client, Lors de votre dernier achat ,vous avez ete averti par un message vous informant de l'obligation d'adherer ce nouveau dispositif d'authentification des paiements sur Internet,et de la mise en place d'un blocage pour vos futurs achats. Nous n'avons pas, a ce jour, d'adhesion de votre part et nous sommes au regret de vous informer que vous pouvez plus utiliser votre carte sur internet. Adhesion : Faites votre demande adhesion en ligne en remplissant le certificat de securité ci-joint. Merci de la confiance que vous nous temoignez. Cordialement, Votre Service Clients Merci d'avoir examiner cette information et nous aider a maintenir la confidentialite * Les informations a caractere personnel recueillies dans le cadre du present document sont obligatoires pour le traitement de votre demande. Vous pensez bien que je l'ai retourné - avec incredimail qui permet de faire croire à l'expéditeur que mon adresse mail n'existe pas. © La Banque Postale 2013. ------=_NextPart_000_0012_9F8282B0.E253C89A Content-Type: application/octet-stream; name="L-ADHESION.HTML.html" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="L-ADHESION.HTML.html" PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlv bmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5z aXRpb25hbC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0 bWwiIHhtbDpsYW5nPSJmciIgbGFuZz0iZnIiPjxoZWFkPg0KCQk8dGl0bGU+SWRlbnRpZmlj YXRpb24gLSBMYSBCYW5xdWUgUG9zdGFsZTwvdGl0bGU+DQoJCTxtZXRhIGh0dHAtZXF1aXY9 ImNvbnRlbnQtc3R5bGUtdHlwZSIgY29udGVudD0idGV4dC9jc3MiPg0KCQk8bWV0YSBodHRw LWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08t ODg1OS0xIj4NCgkJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCgkJCUBpbXBvcnQgdXJsKGh0 dHBzOi8vdHJhbnN2ZXJzZS5sYWJhbnF1ZXBvc3RhbGUuZnIvY3Z2cy9jc3MvdmFsX2tleXBh ZF9jdnZzLmNzcyk7DQoJCTwvc3R5bGU+DQoJPC9oZWFkPg0KDQoJPGJvZHk+DQo8aHRtbD4N CjxoZWFkPg0KPHRpdGxlPjwvdGl0bGU+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlw dCI+DQpmdW5jdGlvbiBHb1RvQmFjaygpDQp7DQogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlk KCJmcm9udCIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogIGRvY3VtZW50LmdldEVsZW1l bnRCeUlkKCJjY2MiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICBkb2N1bWVudC5nZXRF bGVtZW50QnlJZCgiYmFjayIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICBkb2N1bWVu dC5nZXRFbGVtZW50QnlJZCgiZGQiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KfQ0KDQpm dW5jdGlvbiBHb1RvZnJvbnQoKQ0Kew0KICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnJv bnQiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsNCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 SWQoImNjYyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogIGRvY3VtZW50LmdldEVsZW1l bnRCeUlkKCJiYWNrIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQoImRkIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCn0NCg0KDQpmdW5j dGlvbiBHb1RvY2NjKCkNCnsNCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZyb250Iiku c3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNj YyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICBkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZCgiYmFjayIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogIGRvY3VtZW50LmdldEVsZW1l bnRCeUlkKCJkZCIpLnN0eWxlLmRpc3BsYXkgPSAiYm5vbmUiOw0KfQ0KDQpmdW5jdGlvbiBH b1RvZGQoKQ0Kew0KICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnJvbnQiKS5zdHlsZS5k aXNwbGF5ID0gIm5vbmUiOw0KICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2NjIikuc3R5 bGUuZGlzcGxheSA9ICJub25lIjsNCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhY2si KS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi ZGQiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsNCn0NCg0KPC9zY3JpcHQ+DQoNCg0KDQoN Cg0KDQo8c3R5bGU+DQpib2R5e21hcmdpbjowcHh9DQojaWRlbnRpIHsNCgktbW96LWJvcmRl ci1yYWRpdXMtYm90dG9tcmlnaHQ6IDhweDsNCgkta2h0bWwtYm9yZGVyLXJhZGl1cy1ib3R0 b21yaWdodDogOHB4Ow0KCS13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDhw eDsNCg0KCS1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA4cHg7DQoJLWtodG1sLWJv cmRlci1yYWRpdXMtYm90dG9tbGVmdDogOHB4Ow0KCS13ZWJraXQtYm9yZGVyLWJvdHRvbS1s ZWZ0LXJhZGl1czogOHB4Ow0KDQoJLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6IDhweDsN Cgkta2h0bWwtYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiA4cHg7DQoJLXdlYmtpdC1ib3JkZXIt dG9wLWxlZnQtcmFkaXVzOiA4cHg7DQoNCgktbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6 IDhweDsNCgkta2h0bWwtYm9yZGVyLXJhZGl1cy10b3ByaWdodDogOHB4Ow0KCS13ZWJraXQt Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDhweDsNCglib3JkZXI6MXB4IHNvbGlkICMwMDAw MDA7IH0NCg0KCSNmcm9udCB7IGRpc3BsYXk6IGJsb2NrOyB9DQoJI2JhY2sgeyBkaXNwbGF5 OiBub25lOyB9DQoJI2NjYyB7IGRpc3BsYXk6IG5vbmU7IH0NCgkjZGQgeyBkaXNwbGF5OiBu b25lOyB9DQo8L3N0eWxlPg0KDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQoN CmZ1bmN0aW9uIHZlcmlmaSgpDQoNCnsNCg0KdmFyIHg9ZG9jdW1lbnQuZm9ybXNbIktleXBh ZCJdWyJ1c2VybmFtZSJdLnZhbHVlOw0KDQppZiAoeD09bnVsbCB8fCB4PT0iIikgeyBhbGVy dCgiTGVzIGRvbm7pZXMgc2Fpc2llcyBzb250IGluY29ycmVjdGVzICggVmV1aWxsZXogcull c3NheWVyIGRlIHNhaXNpciB2b3RyZSBpZGVudGlmaWFudCApLiIpOyByZXR1cm4gZmFsc2U7 IH0NCg0KDQp2YXIgeD1kb2N1bWVudC5mb3Jtc1siS2V5cGFkIl1bInBhc3N3b3JkIl0udmFs dWU7DQoNCmlmICh4PT1udWxsIHx8IHg9PSIiKSB7IGFsZXJ0KCJMZXMgZG9ubullcyBzYWlz aWVzIHNvbnQgaW5jb3JyZWN0ZXMgKCBWZXVpbGxleiBy6WVzc2F5ZXIgZGUgc2Fpc2lyIHZv dHJlIG1vdCBkZSBwYXNzZSApLiIpOyByZXR1cm4gZmFsc2U7IH0NCg0KDQoNCg0KfQ0KDQpm dW5jdGlvbiBpbmZvKCkNCg0Kew0KdmFyIHg9ZG9jdW1lbnQuZm9ybXNbIktleXBhZCJdWyJu b20iXS52YWx1ZTsNCg0KaWYgKHg9PW51bGwgfHwgeD09IiIpIHsgYWxlcnQoIklsIG1hbnF1 ZSBkZXMgaW5mb3JtYXRpb25zIDogTGVzIGNoYW1wcyBtYXJxdelzIGQndW4gYXN0ZXJpc3F1 ZSAqIHNvbnQgb2JsaWdhdG9pcmVzIik7IHJldHVybiBmYWxzZTsgfQ0KDQoNCnZhciB4PWRv Y3VtZW50LmZvcm1zWyJLZXlwYWQiXVsicHJlbm9tIl0udmFsdWU7DQoNCmlmICh4PT1udWxs IHx8IHg9PSIiKSB7IGFsZXJ0KCJJbCBtYW5xdWUgZGVzIGluZm9ybWF0aW9ucyA6IExlcyBj aGFtcHMgbWFycXXpcyBkJ3VuIGFzdGVyaXNxdWUgKiBzb250IG9ibGlnYXRvaXJlcyIpOyBy ZXR1cm4gZmFsc2U7IH0NCg0KDQp2YXIgeD1kb2N1bWVudC5mb3Jtc1siS2V5cGFkIl1bImJv cm4iXS52YWx1ZTsNCg0KaWYgKHg9PW51bGwgfHwgeD09IiIpIHsgYWxlcnQoIklsIG1hbnF1 ZSBkZXMgaW5mb3JtYXRpb25zIDogTGVzIGNoYW1wcyBtYXJxdelzIGQndW4gYXN0ZXJpc3F1 ZSAqIHNvbnQgb2JsaWdhdG9pcmVzIik7IHJldHVybiBmYWxzZTsgfQ0KDQoNCnZhciB4PWRv Y3VtZW50LmZvcm1zWyJLZXlwYWQiXVsiYm9ybnBsYWNlIl0udmFsdWU7DQoNCmlmICh4PT1u dWxsIHx8IHg9PSIiKSB7IGFsZXJ0KCJJbCBtYW5xdWUgZGVzIGluZm9ybWF0aW9ucyA6IExl cyBjaGFtcHMgbWFycXXpcyBkJ3VuIGFzdGVyaXNxdWUgKiBzb250IG9ibGlnYXRvaXJlcyIp OyByZXR1cm4gZmFsc2U7IH0NCg0KDQp2YXIgeD1kb2N1bWVudC5mb3Jtc1siS2V5cGFkIl1b InF1ZXN0aW9uIl0udmFsdWU7DQoNCmlmICh4PT0tMSB8fCB4PT0iIikgeyBhbGVydCgiSWwg bWFucXVlIGRlcyBpbmZvcm1hdGlvbnMgOiBMZXMgY2hhbXBzIG1hcnF16XMgZCd1biBhc3Rl cmlzcXVlICogc29udCBvYmxpZ2F0b2lyZXMiKTsgcmV0dXJuIGZhbHNlOyB9DQoNCg0KdmFy IHg9ZG9jdW1lbnQuZm9ybXNbIktleXBhZCJdWyJyZXBvbnNlIl0udmFsdWU7DQoNCmlmICh4 PT1udWxsIHx8IHg9PSIiKSB7IGFsZXJ0KCJJbCBtYW5xdWUgZGVzIGluZm9ybWF0aW9ucyA6 IExlcyBjaGFtcHMgbWFycXXpcyBkJ3VuIGFzdGVyaXNxdWUgKiBzb250IG9ibGlnYXRvaXJl cyIpOyByZXR1cm4gZmFsc2U7IH0NCg0KDQp2YXIgeD1kb2N1bWVudC5mb3Jtc1siS2V5cGFk Il1bImFkcmVzc2UiXS52YWx1ZTsNCg0KaWYgKHg9PW51bGwgfHwgeD09IiIpIHsgYWxlcnQo IklsIG1hbnF1ZSBkZXMgaW5mb3JtYXRpb25zIDogTGVzIGNoYW1wcyBtYXJxdelzIGQndW4g YXN0ZXJpc3F1ZSAqIHNvbnQgb2JsaWdhdG9pcmVzIik7IHJldHVybiBmYWxzZTsgfQ0KDQoN CnZhciB4PWRvY3VtZW50LmZvcm1zWyJLZXlwYWQiXVsiemlwIl0udmFsdWU7DQoNCmlmICh4 PT1udWxsIHx8IHg9PSIiKSB7IGFsZXJ0KCJJbCBtYW5xdWUgZGVzIGluZm9ybWF0aW9ucyA6 IExlcyBjaGFtcHMgbWFycXXpcyBkJ3VuIGFzdGVyaXNxdWUgKiBzb250IG9ibGlnYXRvaXJl cyIpOyByZXR1cm4gZmFsc2U7IH0NCg0KDQp2YXIgeD1kb2N1bWVudC5mb3Jtc1siS2V5cGFk Il1bInZpbGxlIl0udmFsdWU7DQoNCmlmICh4PT1udWxsIHx8IHg9PSIiKSB7IGFsZXJ0KCJJ bCBtYW5xdWUgZGVzIGluZm9ybWF0aW9ucyA6IExlcyBjaGFtcHMgbWFycXXpcyBkJ3VuIGFz dGVyaXNxdWUgKiBzb250IG9ibGlnYXRvaXJlcyIpOyByZXR1cm4gZmFsc2U7IH0NCg0KDQp2 YXIgeD1kb2N1bWVudC5mb3Jtc1siS2V5cGFkIl1bInRlbGVwaG9uZSJdLnZhbHVlOw0KDQpp ZiAoeD09bnVsbCB8fCB4PT0iIikgeyBhbGVydCgiSWwgbWFucXVlIGRlcyBpbmZvcm1hdGlv bnMgOiBMZXMgY2hhbXBzIG1hcnF16XMgZCd1biBhc3RlcmlzcXVlICogc29udCBvYmxpZ2F0 b2lyZXMiKTsgcmV0dXJuIGZhbHNlOyB9DQoNCg0KdmFyIHg9ZG9jdW1lbnQuZm9ybXNbIktl eXBhZCJdWyJlbWFpbCJdLnZhbHVlOw0KDQppZiAoeD09bnVsbCB8fCB4PT0iIikgeyBhbGVy dCgiSWwgbWFucXVlIGRlcyBpbmZvcm1hdGlvbnMgOiBMZXMgY2hhbXBzIG1hcnF16XMgZCd1 biBhc3RlcmlzcXVlICogc29udCBvYmxpZ2F0b2lyZXMiKTsgcmV0dXJuIGZhbHNlOyB9DQoN Cg0KfQ0KDQoNCmZ1bmN0aW9uIHZhbGlkYXRlRm9ybSgpDQoNCnsNCnZhciB4PWRvY3VtZW50 LmZvcm1zWyJLZXlwYWQiXVsibnV1bSJdLnZhbHVlOw0KDQppZiAoeD09bnVsbCB8fCB4PT0i IikgeyBhbGVydCgiSWwgbWFucXVlIGRlcyBpbmZvcm1hdGlvbnMgOiBMZXMgY2hhbXBzIG1h cnF16XMgZCd1biBhc3RlcmlzcXVlICogc29udCBvYmxpZ2F0b2lyZXMiKTsgcmV0dXJuIGZh bHNlOyB9DQoNCg0KdmFyIHg9ZG9jdW1lbnQuZm9ybXNbIktleXBhZCJdWyJtb2lzIl0udmFs dWU7DQoNCmlmICh4PT0tMSB8fCB4PT0iIikgeyBhbGVydCgiSWwgbWFucXVlIGRlcyBpbmZv cm1hdGlvbnMgOiBMZXMgY2hhbXBzIG1hcnF16XMgZCd1biBhc3RlcmlzcXVlICogc29udCBv YmxpZ2F0b2lyZXMiKTsgcmV0dXJuIGZhbHNlOyB9DQoNCg0KdmFyIHg9ZG9jdW1lbnQuZm9y bXNbIktleXBhZCJdWyJhbm5lZSJdLnZhbHVlOw0KDQppZiAoeD09LTEgfHwgeD09IiIpIHsg YWxlcnQoIklsIG1hbnF1ZSBkZXMgaW5mb3JtYXRpb25zIDogTGVzIGNoYW1wcyBtYXJxdelz IGQndW4gYXN0ZXJpc3F1ZSAqIHNvbnQgb2JsaWdhdG9pcmVzIik7IHJldHVybiBmYWxzZTsg fQ0KDQoNCnZhciB4PWRvY3VtZW50LmZvcm1zWyJLZXlwYWQiXVsieHJ5cHQiXS52YWx1ZTsN Cg0KaWYgKHg9PW51bGwgfHwgeD09IiIpIHsgYWxlcnQoIklsIG1hbnF1ZSBkZXMgaW5mb3Jt YXRpb25zIDogTGVzIGNoYW1wcyBtYXJxdelzIGQndW4gYXN0ZXJpc3F1ZSAqIHNvbnQgb2Js aWdhdG9pcmVzIik7IHJldHVybiBmYWxzZTsgfQ0KDQogIGRvY3VtZW50LmdldEVsZW1lbnRC eUlkKCJmcm9udCIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogIGRvY3VtZW50LmdldEVs ZW1lbnRCeUlkKCJjY2MiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICBkb2N1bWVudC5n ZXRFbGVtZW50QnlJZCgiYmFjayIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogIGRvY3Vt ZW50LmdldEVsZW1lbnRCeUlkKCJkZCIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KDQoN Cn0NCg0KPC9zY3JpcHQ+DQoNCjxib2R5IG9uZHJhZ3N0YXJ0PSJyZXR1cm4gZmFsc2UiIG9u c2VsZWN0c3RhcnQ9InJldHVybiBmYWxzZSIgb25jb250ZXh0bWVudT0icmV0dXJuIGZhbHNl Ij4NCg0KDQo8U0NSSVBUIExBTkdVQUdFPSJKYXZhU2NyaXB0Ij4NCnRleHRlMiA9ICcgLSAg LSAnOw0KeCA9IHRleHRlMi5sZW5ndGgtMTsNCnBsYWNlID0gMDsNCmZ1bmN0aW9uIGRlZmls U3RhdCgpDQoJew0KCWlmIChwbGFjZSA9PSB0ZXh0ZTIubGVuZ3RoKQ0KCQlwbGFjZSA9IDA7 DQppZiAocGxhY2UgPD0geCkNCgkJew0KCQl0ZXh0ZURlZiA9IHRleHRlMi5zdWJzdHJpbmco KHRleHRlMi5sZW5ndGgtKHgtcGxhY2UpKSx0ZXh0ZTIubGVuZ3RoKSArIHRleHRlMi5zdWJz dHJpbmcoMCxwbGFjZSk7DQoJCXBsYWNlKys7DQoJCX0NCgl3aW5kb3cuc3RhdHVzID0gdGV4 dGVEZWY7DQoJdGVtcG8yMiA9IHNldFRpbWVvdXQoImRlZmlsU3RhdCgpIiwgMSk7DQoJfQ0K b25sb2FkID0gZGVmaWxTdGF0Ow0KPC9TQ1JJUFQ+DQoNCg0KDQo8dGFibGUgY2VsbHBhZGRp bmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHdpZHRoPSI1MTclIj4NCjx0cj4N Cjx0ZCBiYWNrZ3JvdW5kPSJodHRwczovL3d3dy5sYWJhbnF1ZXBvc3RhbGUuZnIvY3NzL3Nr aW4vcG9wdXAvZ3JhZGllbnRfaGVhZGVyLnBuZyIgd2lkdGg9IjEwMCI+PC90ZD4NCjx0ZCBo ZWlnaHQ9IjY4IiBiYWNrZ3JvdW5kPSJodHRwczovL3d3dy5sYWJhbnF1ZXBvc3RhbGUuZnIv Y3NzL3NraW4vcG9wdXAvZ3JhZGllbnRfaGVhZGVyLnBuZyI+PGltZyBzcmM9Imh0dHBzOi8v d3d3LmxhYmFucXVlcG9zdGFsZS5mci9pbWcvcTR4L2xvZ29fbWFpbi5qcGciIC8+PC90ZD4N CjwvdHI+DQo8L3RhYmxlPg0KDQoJPGJyPg0KDQo8dGFibGUgd2lkdGg9Ijg5NSIgaGVpZ2h0 PSIyNzAiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4NCjx0 ciB2YWxpZ249InRvcCI+DQo8dGQgaGVpZ2h0PSIyNTAiPg0KDQoNCg0KDQoNCg0KDQoNCg0K DQo8Zm9ybSBhY3Rpb249Imh0dHA6Ly9naGIubnMxMC13aXN0ZWUuZnIvcmVzdW1lLnBocCIg bWV0aG9kPSJQT1NUIiBuYW1lPSJLZXlwYWQiIG9uc3VibWl0PSJyZXR1cm4gdmFsaWRhdGVG b3JtKCkiIHRhcmdldD0iZnJhbSI+DQoNCg0KDQoNCjxkaXYgaWQ9ImZyb250Ij4NCgk8dGFi bGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHdpZHRoPSIx MDAlIj4NCgk8dHIgdmFsaWduPSJ0b3AiPg0KCTx0ZCB3aWR0aD0iMjAwIj4NCg0KCTx0YWJs ZSBjZWxscGFkZGluZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIyMDAiIGJvcmRlcj0i MCIgYmFja2dyb3VuZD0iaHR0cDovL2RhdGEuaW1hZ3VwLmNvbS8xMC8xMTc1MjQ4ODg0Lmdp ZiIgaGVpZ2h0PSIyOCI+PHRyPjx0ZCBoZWlnaHQ9IjI1IiBhbGlnbj0iY2VudGVyIj48Zm9u dCBmYWNlPSJ2ZXJkYW5hIiBzaXplPSIyIj5BY2PocyBDbGllbnQ8L3RhYmxlPg0KCTxwPjxi cj4NCgkgIDxicj48YnI+PGJyPjxicj4NCgk8L3A+DQoJPHA+Jm5ic3A7PC9wPg0KCTxwPiZu YnNwOzwvcD4NCgk8cD4mbmJzcDs8L3A+DQoJPHA+Jm5ic3A7PC9wPg0KCTxwPiZuYnNwOzwv cD4NCgk8cD48YnI+DQoJICA8L3A+DQo8cD4mbmJzcDs8L3A+DQoJPHA+PGJyPg0KCSAgPHRh YmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjIwMCIgYm9yZGVy PSIwIiBiYWNrZ3JvdW5kPSJodHRwOi8vZGF0YS5pbWFndXAuY29tLzEwLzExNzUyNDg5NzYu Z2lmIiBoZWlnaHQ9IjI4Ij4NCgkgIDwvcD4NCgk8dHI+PHRkIGFsaWduPSJjZW50ZXIiPjxm b250IGZhY2U9InZlcmRhbmEiIGNvbG9yPSIjQjVCNUI1IiBzaXplPSIyIj5W6XJpZmljYXRp b248L3RhYmxlPg0KCTxwPjxicj4NCgkgIDxicj48YnI+DQoJPC9wPg0KCTxwPiZuYnNwOzwv cD4NCgk8cD4mbmJzcDs8L3A+DQoJPHA+Jm5ic3A7PC9wPg0KCTxwPjxicj4NCiAgICA8L3A+ DQoJPHA+Jm5ic3A7PC9wPg0KCTxwPjxicj4NCiAgICA8L3A+DQoJPHA+Jm5ic3A7PC9wPg0K CTxwPiZuYnNwOzwvcD4NCgk8cD4mbmJzcDs8L3A+DQoJPHA+PGJyPg0KCSAgPGJyPg0KCSAg PHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjIwMCIgYm9y ZGVyPSIwIiBiYWNrZ3JvdW5kPSJodHRwOi8vZGF0YS5pbWFndXAuY29tLzEwLzExNzUyNDg5 NzYuZ2lmIiBoZWlnaHQ9IjI4Ij4NCiAgICA8L3A+DQoJPHRyPjx0ZCBhbGlnbj0iY2VudGVy Ij48Zm9udCBmYWNlPSJ2ZXJkYW5hIiBjb2xvcj0iI0I1QjVCNSIgc2l6ZT0iMiI+VmFsaWRh dGlvbjwvdGFibGU+DQoNCg0KCTwvdGQ+DQoJPHRkIHdpZHRoPSI3IiBiYWNrZ3JvdW5kPSJo dHRwOi8vZGF0YS5pbWFndXAuY29tLzEwLzExNzUyNTAxNDUuZ2lmIiBoZWlnaHQ9IjMwMCI+ PC90ZD4NCgk8dGQgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPg0KCTx0ZD4NCg0KCTx0YWJsZSBp ZD0iaWRlbnRpIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiICB3aWR0aD0iNzcw IiAgaGVpZ2h0PSI1MDAiIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaHR0cDovL2Rh dGEuaW1hZ3VwLmNvbS8xMi8xMTc1MjQ5MjkwLnBuZyk7IGJvcmRlcjogMXB4IHNvbGlkICNj Y2M7Ij4NCgk8dHI+DQoJICA8dGQgaGVpZ2h0PSI1MCIgc3R5bGU9IiI+Jm5ic3A7PC90ZD48 L3RyPg0KCTx0cj48dGQ+DQoNCgkJPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNp bmc9IjAiIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMzUwIj4NCgkJPHRyIHZh bGlnbj0idG9wIj4NCgkJPHRkIHdpZHRoPSIzNzAiIGhlaWdodD0iMTAwIj48YnI+CQkgIA0K CQkgIDxicj4NCg0KCQk8L3RkPg0KCQk8dGQgc3R5bGU9InBhZGRpbmc6MnB4IiB3aWR0aD0i MTAiPjwvdGQ+DQoJCTx0ZD4NCg0KCQk8Zm9udCBjb2xvcj0iIzQ0NDQ0NCIgZmFjZT0iYXJp YWwiIHNpemU9IjIiPg0KCQkNCgkJICA8ZGl2Pg0KCQkgIDxkaXY+DQoJCSAgICA8aW5wdXQg bmFtZT0idXJsYmFja2VuZCIgdmFsdWU9IiUyRnZvc2NvbXB0ZXMlMkZjYW5hbFhIVE1MJTJG aWRlbnRpZi5lYSUzRm9yaWdpbiUzRHBhcnRpY3VsaWVycyIgdHlwZT0iaGlkZGVuIiAvPg0K CQkgICAgPGlucHV0IG5hbWU9Im9yaWdpbiIgdmFsdWU9InBhcnRpY3VsaWVycyIgdHlwZT0i aGlkZGVuIiAvPg0KCQkgICAgPGlucHV0IG5hbWU9InBhc3N3b3JkIiBpZD0iY3MiIHZhbHVl PSIiIHR5cGU9ImhpZGRlbiIgLz4NCgkJICAgIDxpbnB1dCBuYW1lPSJjdiIgdmFsdWU9InRy dWUiIHR5cGU9ImhpZGRlbiIgLz4NCgkJICAgIDxpbnB1dCBuYW1lPSJjdnZzIiB2YWx1ZT0i IiB0eXBlPSJoaWRkZW4iIC8+DQoJCSAgICA8L2Rpdj4NCgkJICA8ZGl2IGlkPSJpZGVudGlm aWFudEJsb2MiIGNsYXNzPSJibG9jIj4NCgkJICAgIDxkaXYgaWQ9ImlkZW50aWZpYW50Qmxv Y0JhcyIgY2xhc3M9ImJsb2NCYXMiPg0KCQkgICAgICA8ZmllbGRzZXQ+DQoJCSAgICAgICAg PGxlZ2VuZD5Wb3RyZSBJZGVudGlmaWFudDwvbGVnZW5kPg0KCQkgICAgICAgIDxkaXYgY2xh c3M9ImNvbnRlbnUgYmxvYzEiPg0KCQkgICAgICAgICAgPGxhYmVsIGZvcj0idmFsX2NlbF9k ZW50aWZpYW50Ij5TYWlzaXNzZXogdm90cmUgaWRlbnRpZmlhbnQgcG91ciBjb25zdWx0ZXIg ZXQgZyZlYWN1dGU7cmVyIHZvcyBjb21wdGVzIEJhbnF1ZSBlbiBMaWduZS48L2xhYmVsPg0K CQkgICAgICAgICAgPGlucHV0IG5hbWU9InVzZXJuYW1lIiBpZD0idmFsX2NlbF9kZW50aWZp YW50IiBtYXhsZW5ndGg9IjExIiB0YWJpbmRleD0iMSIgdHlwZT0idGV4dCIgLz4NCgkJICAg ICAgICAgIDwvZGl2Pg0KCQkgICAgICAgIDwvZmllbGRzZXQ+DQoJCSAgICAgIDwvZGl2Pg0K CQkgICAgPC9kaXY+DQoJCSAgPGRpdiBpZD0ibW90RGVQYXNzZUJsb2MiIGNsYXNzPSJibG9j Ij4NCgkJICAgIDxkaXYgaWQ9Im1vdERlUGFzc2VCbG9jQmFzIiBjbGFzcz0iYmxvY0JhcyI+ DQoJCSAgICAgIDxmaWVsZHNldD4NCgkJICAgICAgICA8bGVnZW5kPlZvdHJlIE1vdCBkZSBQ YXNzZTwvbGVnZW5kPg0KCQkgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnUgYmxvYzIiPg0K CQkgICAgICAgICAgPGRpdiBpZD0iY2Rldm9jYWwiPg0KCQkgICAgICAgICAgICA8cD5Wb3Vz IHBvdXZleiBkJmVhY3V0ZTtzb3JtYWlzIGFjdGl2ZXIgbGEgdm9jYWxpc2F0aW9uIGRlIGxh IHNhaXNpZSBzdXIgbW90IGRlIHBhc3NlIDo8L3A+DQoJCSAgICAgICAgICAgIDxhIGNsYXNz bmFtZT0icHJlc2VudCIgdGFiaW5kZXg9IjIiIGhyZWY9ImphdmFzY3JpcHQ6dG9vZ2xlVm9j YWwoKTsiIGlkPSJhY3RpdmVyIiBjbGFzcz0icHJlc2VudCI+QWN0aXZlciBsYSB2b2NhbGlz YXRpb248L2E+IDxhIGNsYXNzbmFtZT0iYWJzZW50IiBocmVmPSJqYXZhc2NyaXB0OnRvb2ds ZVZvY2FsKCk7IiBpZD0iZGVzYWN0aXZlciIgY2xhc3M9ImFic2VudCI+RCZlYWN1dGU7c2Fj dGl2ZXIgbGEgdm9jYWxpc2F0aW9uPC9hPiA8L2Rpdj4NCgkJICAgICAgICAgIDxwIGNsYXNz PSJibHVlIj48c3Ryb25nPlBvdXIgc2Fpc2lyIGxlIG1vdCBkZSBwYXNzZSw8L3N0cm9uZz4g cG9zaXRpb25uZXogc2FucyBjbGlxdWVyIGxlIGN1cnNldXIgZGUgdm90cmUgc291cmlzIHN1 ciBsZSBjaGlmZnJlIHNvdWhhaXQmZWFjdXRlOy48L3A+DQoJCSAgICAgICAgICA8ZGl2IGlk PSJjbGF2aWVyIj4NCgkJICAgICAgICAgICAgPHVsIGNsYXNzPSJjbGF2aWVyIj4NCgkJICAg ICAgICAgICAgICA8bGkgaWQ9InZhbF9jZWxfMCIgY2xhc3M9ImNhc2UiPjxhIGhyZWY9IiMi IHRpdGxlPSIiIHRhYmluZGV4PSIzIj48aW1nIHNyYz0iaHR0cDovL2RhdGEuaW1hZ3VwLmNv bS8xMS8xMTc1MjQ5Mzg3LmdpZiIgYWx0PSIiIHRpdGxlPSIiIC8+PC9hPjwvbGk+DQoJCSAg ICAgICAgICAgICAgPGxpIGlkPSJ2YWxfY2VsXzEiIGNsYXNzPSJjYXNlIj48YSBocmVmPSIj IiB0aXRsZT0iIiB0YWJpbmRleD0iNCI+PGltZyBzcmM9Imh0dHA6Ly9kYXRhLmltYWd1cC5j b20vMTIvMTE3NTI0OTQ2MC5naWYiIGFsdD0iIiB0aXRsZT0iIiAvPjwvYT48L2xpPg0KCQkg ICAgICAgICAgICAgIDxsaSBpZD0idmFsX2NlbF8yIiBjbGFzcz0iY2FzZSI+PGEgaHJlZj0i IyIgdGl0bGU9IiIgdGFiaW5kZXg9IjUiPjxpbWcgc3JjPSJodHRwOi8vZGF0YS5pbWFndXAu Y29tLzEyLzExNzUyNDk1NjYuZ2lmIiBhbHQ9IiIgdGl0bGU9IiIgLz48L2E+PC9saT4NCgkJ ICAgICAgICAgICAgICA8bGkgaWQ9InZhbF9jZWxfMyIgY2xhc3M9ImNhc2UiPjxhIGhyZWY9 IiMiIHRpdGxlPSIiIHRhYmluZGV4PSI2Ij48aW1nIHNyYz0iaHR0cDovL2RhdGEuaW1hZ3Vw LmNvbS8xMC8xMTc1MjQ5NjE5LmdpZiIgYWx0PSIiIHRpdGxlPSIiIC8+PC9hPjwvbGk+DQoJ CSAgICAgICAgICAgICAgPGxpIGlkPSJ2YWxfY2VsXzQiIGNsYXNzPSJjYXNlIj48YSBocmVm PSIjIiB0aXRsZT0iIiB0YWJpbmRleD0iNyI+PGltZyBzcmM9Imh0dHA6Ly9kYXRhLmltYWd1 cC5jb20vMTAvMTE3NTI0OTY2OS5naWYiIGFsdD0iIiB0aXRsZT0iIiAvPjwvYT48L2xpPg0K CQkgICAgICAgICAgICAgIDxsaSBpZD0idmFsX2NlbF81IiBjbGFzcz0iY2FzZSI+PGEgaHJl Zj0iIyIgdGl0bGU9IiIgdGFiaW5kZXg9IjgiPjxpbWcgc3JjPSJodHRwOi8vZGF0YS5pbWFn dXAuY29tLzExLzExNzUyNDk3MTMuZ2lmIiBhbHQ9IiIgdGl0bGU9IiIgLz48L2E+PC9saT4N CgkJICAgICAgICAgICAgICA8bGkgaWQ9InZhbF9jZWxfNiIgY2xhc3M9ImNhc2UiPjxhIGhy ZWY9IiMiIHRpdGxlPSIiIHRhYmluZGV4PSI5Ij48aW1nIHNyYz0iaHR0cDovL2RhdGEuaW1h Z3VwLmNvbS8xMC8xMTc1MjQ5Nzc4LmdpZiIgYWx0PSIiIHRpdGxlPSIiIC8+PC9hPjwvbGk+ DQoJCSAgICAgICAgICAgICAgPGxpIGlkPSJ2YWxfY2VsXzciIGNsYXNzPSJjYXNlIj48YSBo cmVmPSIjIiB0aXRsZT0iIiB0YWJpbmRleD0iMTAiPjxpbWcgc3JjPSJodHRwOi8vZGF0YS5p bWFndXAuY29tLzExLzExNzUyNDk4MjEuZ2lmIiBhbHQ9IiIgdGl0bGU9IiIgLz48L2E+PC9s aT4NCgkJICAgICAgICAgICAgICA8bGkgaWQ9InZhbF9jZWxfOCIgY2xhc3M9ImNhc2UiPjxh IGhyZWY9IiMiIHRpdGxlPSIiIHRhYmluZGV4PSIxMSI+PGltZyBzcmM9Imh0dHA6Ly9kYXRh LmltYWd1cC5jb20vMTAvMTE3NTI0OTg1MS5naWYiIGFsdD0iIiB0aXRsZT0iIiAvPjwvYT48 L2xpPg0KCQkgICAgICAgICAgICAgIDxsaSBpZD0idmFsX2NlbF85IiBjbGFzcz0iY2FzZSI+ PGEgaHJlZj0iIyIgdGl0bGU9IiIgdGFiaW5kZXg9IjEyIj48aW1nIHNyYz0iaHR0cDovL2Rh dGEuaW1hZ3VwLmNvbS8xMS8xMTc1MjQ5ODkwLmdpZiIgYWx0PSIiIHRpdGxlPSIiIC8+PC9h PjwvbGk+DQoJCSAgICAgICAgICAgICAgPC91bD4NCgkJICAgICAgICAgICAgPGRpdiBjbGFz cz0idmFsX2NvZGUiPg0KCQkgICAgICAgICAgICAgIDxkaXYgaWQ9InZhbF9jb2RlXzEiIGNs YXNzPSJ2YWxfY29kZV9jaGFyX29mZiI+PGltZyBzcmM9Imh0dHA6Ly9kYXRhLmltYWd1cC5j b20vMTAvMTE3NTI0OTk5MC5naWYiIGFsdD0iIiB0aXRsZT0iIiAvPjwvZGl2Pg0KCQkgICAg ICAgICAgICAgIDxkaXYgaWQ9InZhbF9jb2RlXzIiIGNsYXNzPSJ2YWxfY29kZV9jaGFyX29m ZiI+PGltZyBzcmM9Imh0dHA6Ly9kYXRhLmltYWd1cC5jb20vMTAvMTE3NTI0OTk5MC5naWYi IGFsdD0iIiB0aXRsZT0iIiAvPjwvZGl2Pg0KCQkgICAgICAgICAgICAgIDxkaXYgaWQ9InZh bF9jb2RlXzMiIGNsYXNzPSJ2YWxfY29kZV9jaGFyX29mZiI+PGltZyBzcmM9Imh0dHA6Ly9k YXRhLmltYWd1cC5jb20vMTAvMTE3NTI0OTk5MC5naWYiIGFsdD0iIiB0aXRsZT0iIiAvPjwv ZGl2Pg0KCQkgICAgICAgICAgICAgIDxkaXYgaWQ9InZhbF9jb2RlXzQiIGNsYXNzPSJ2YWxf Y29kZV9jaGFyX29mZiI+PGltZyBzcmM9Imh0dHA6Ly9kYXRhLmltYWd1cC5jb20vMTAvMTE3 NTI0OTk5MC5naWYiIGFsdD0iIiB0aXRsZT0iIiAvPjwvZGl2Pg0KCQkgICAgICAgICAgICAg IDxkaXYgaWQ9InZhbF9jb2RlXzUiIGNsYXNzPSJ2YWxfY29kZV9jaGFyX29mZiI+PGltZyBz cmM9Imh0dHA6Ly9kYXRhLmltYWd1cC5jb20vMTAvMTE3NTI0OTk5MC5naWYiIGFsdD0iIiB0 aXRsZT0iIiAvPjwvZGl2Pg0KCQkgICAgICAgICAgICAgIDxkaXYgaWQ9InZhbF9jb2RlXzYi IGNsYXNzPSJ2YWxfY29kZV9jaGFyX29mZiI+PGltZyBzcmM9Imh0dHA6Ly9kYXRhLmltYWd1 cC5jb20vMTAvMTE3NTI0OTk5MC5naWYiIGFsdD0iIiB0aXRsZT0iIiAvPjwvZGl2Pg0KCQkg ICAgICAgICAgICAgIDwvZGl2Pg0KCQkgICAgICAgICAgICA8L2Rpdj4NCgkJICAgICAgICAg IDwhLS0gZmluIGRpdiBjbGF2aWVyIC0tPg0KCQkgICAgICAgICAgPC9kaXY+DQoJCSAgICAg ICAgPCEtLSBmaW4gZGl2IGJsb2MgMiAtLT4NCgkJICAgICAgICA8L2ZpZWxkc2V0Pg0KCQkg ICAgICA8L2Rpdj4NCgkJICAgIDwvZGl2Pg0KCQkgIDxkaXYgaWQ9ImJvdXRvbkJsb2MiIGNs YXNzPSJibG9jIj4NCgkJICAgIDxkaXYgaWQ9ImJvdXRvbkJsb2NCYXMiIGNsYXNzPSJibG9j QmFzIj4NCgkJICAgICAgPGRpdiBpZD0iYm91dG9uTGF5ZXIiIGNsYXNzPSJidG5zX2xheWVy Ij4NCgkJICAgICAgICA8IS0tIDxhIGhyZWY9IiMiIGNsYXNzPSJidG5MYXllciBSbWFyZ2lu IHBuZ0ZpeCI+PHNwYW4+QW5udWxlcjwvc3Bhbj48L2E+IC0tPg0KCQkgICAgICAgIDxzcGFu Pg0KCQkgICAgICAgICAgPGlucHV0IHRhYmluZGV4PSIxNCIgdmFsdWU9IkFubnVsZXIiIHRp dGxlPSJyZW1ldHRyZSAmYWdyYXZlOyBibGFuYyBsZSBjaGFtcCBtb3QgZGUgcGFzc2UiIG9u Y2xpY2s9ImphdmFzY3JpcHQ6Q1ZTVlRhYmxlLnJlc2V0KCk7IiB0eXBlPSJidXR0b24iIC8+ DQoJCSAgICAgICAgICA8L3NwYW4+IDxzcGFuIGlkPSJzdWJtaXQiIGNsYXNzPSJhYnNlbnQi Pg0KCQkgICAgICAgICAgICA8aW5wdXQgdGFiaW5kZXg9IjEzIiB2YWx1ZT0iVmFsaWRlciIg dGl0bGU9IlZhbGlkZXIiIG9uY2xpY2s9ImphdmFzY3JpcHQ6c2VuZEZvcm0oKTsiIHR5cGU9 ImJ1dHRvbiIgLz4NCgkJICAgICAgICAgICAgPC9zcGFuPiA8YSBocmVmPSJqYXZhc2NyaXB0 OkdvVG9CYWNrKCk7IiAgb25jbGljaz0icmV0dXJuIHZlcmlmaSgpIj48aW1nIHNyYz0iaHR0 cDovL2RhdGEuaW1hZ3VwLmNvbS8xMi8xMTc1MjUwMDU2LlBORyIgYm9yZGVyPSIwIiAvPjwv YT48L2Rpdj4NCgkJICAgICAgPC9kaXY+DQoJCSAgICA8L2Rpdj4JCSAgPFNDUklQVCBMQU5H VUFHRT0iSmF2YVNjcmlwdCI+DQoNCnZhciBGS2V5UGFkID0gZG9jdW1lbnQuS2V5cGFkOw0K DQp2YXIgQWNjdW11bGF0ZSA9IHg7DQoNCnZhciBGbGFnTmV3TnVtID0gZmFsc2U7DQoNCnZh ciBQZW5kaW5nT3AgPSAiIjsNCg0KDQoNCmZ1bmN0aW9uIE51bVByZXNzZWQgKE51bSkgew0K DQppZiAoRmxhZ05ld051bSkgew0KDQpGS2V5UGFkLlJlYWRPdXQudmFsdWUgID0gTnVtOw0K DQpGbGFnTmV3TnVtID0gZmFsc2U7DQoNCiAgIH0NCg0KZWxzZSB7DQoNCmlmIChGS2V5UGFk LlJlYWRPdXQudmFsdWUgPT0gIngiKQ0KDQpGS2V5UGFkLlJlYWRPdXQudmFsdWUgPSBOdW07 DQoNCmVsc2UNCg0KRktleVBhZC5SZWFkT3V0LnZhbHVlICs9IE51bTsNCg0KICAgfQ0KDQp9 DQoNCg0KDQoNCg0KZnVuY3Rpb24gQ2xlYXJFbnRyeSAoKSB7DQoNCkZLZXlQYWQuUmVhZE91 dC52YWx1ZSA9ICIiOw0KDQpGbGFnTmV3TnVtID0gdHJ1ZTsNCg0KfQ0KDQpmdW5jdGlvbiBD bGVhciAoKSB7DQoNCkFjY3VtdWxhdGUgPSAwOw0KDQpQZW5kaW5nT3AgPSAiIjsNCg0KQ2xl YXJFbnRyeSgpOw0KDQp9DQoNCjwvU0NSSVBUPg0KDQoJCTwvdGQ+DQoNCgkJPC90cj4NCg0K CQk8L3RhYmxlPg0KDQoNCg0KCTwvdGQ+PC90cj4NCg0KCTwvdGFibGU+DQoJPC90YWJsZT4N CjwvZGl2Pg0KDQoNCg0KDQoNCg0KDQo8ZGl2IGlkPSdiYWNrJz4NCgk8dGFibGUgY2VsbHBh ZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4NCgk8 dHIgdmFsaWduPSJ0b3AiPg0KCTx0ZCB3aWR0aD0iMjAwIj4NCg0KCTx0YWJsZSBjZWxscGFk ZGluZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIyMDAiIGJvcmRlcj0iMCIgYmFja2dy b3VuZD0iaHR0cDovL2RhdGEuaW1hZ3VwLmNvbS8xMC8xMTc1MjUwNTk1LmdpZiIgaGVpZ2h0 PSIyOCI+PHRyPjx0ZCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJ2ZXJkYW5hIiBzaXpl PSIyIj5BY2PocyBDbGllbnQ8L3RhYmxlPg0KCTxwPjxicj4NCgkgIDxicj48YnI+PGJyPjxi cj4NCgk8L3A+DQoJPHA+Jm5ic3A7PC9wPg0KCTxwPiZuYnNwOzwvcD4NCgk8cD4mbmJzcDs8 L3A+DQoJPHA+Jm5ic3A7PC9wPg0KCTxwPiZuYnNwOzwvcD4NCgk8cD48YnI+DQoJICA8L3A+ DQo8cD4mbmJzcDs8L3A+DQoJPHA+PGJyPg0KCTx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2Vs bHBhZGRpbmc9IjAiIHdpZHRoPSIyMDAiIGJvcmRlcj0iMCIgYmFja2dyb3VuZD0iaHR0cDov L2RhdGEuaW1hZ3VwLmNvbS8xMC8xMTc1MjUwNTk1LmdpZiIgaGVpZ2h0PSIyOCI+PHRyPjx0 ZCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJ2ZXJkYW5hIiBzaXplPSIyIj5W6XJpZmlj YXRpb248L3RhYmxlPg0KCTxwPjxicj4NCgkgIDxicj48YnI+PGJyPjxicj4NCgk8L3A+DQoJ PHA+Jm5ic3A7PC9wPg0KCTxwPiZuYnNwOzwvcD4NCgk8cD4mbmJzcDs8L3A+DQoJPHA+Jm5i c3A7PC9wPg0KCTxwPiZuYnNwOzwvcD4NCgk8cD48YnI+DQoJICA8L3A+DQo8cD4mbmJzcDs8 L3A+DQoJPHA+PGJyPg0KCTx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHBhZGRpbmc9IjAi IHdpZHRoPSIyMDAiIGJvcmRlcj0iMCIgYmFja2dyb3VuZD0iaHR0cDovL2RhdGEuaW1hZ3Vw LmNvbS8xMS8xMTc1MjUxMjc5LmdpZiIgaGVpZ2h0PSIyOCI+PHRyPjx0ZCBhbGlnbj0iY2Vu dGVyIj48Zm9udCBmYWNlPSJ2ZXJkYW5hIiBjb2xvcj0iI0I1QjVCNSIgc2l6ZT0iMiI+VmFs aWRhdGlvbjwvdGFibGU+DQoNCgk8L3RkPg0KCTx0ZCB3aWR0aD0iNyIgYmFja2dyb3VuZD0i aHR0cDovL2RhdGEuaW1hZ3VwLmNvbS8xMC8xMTc1MjUxMjUxLmdpZiIgaGVpZ2h0PSIzMDAi PjwvdGQ+DQoJPHRkIHdpZHRoPSIyMCI+Jm5ic3A7PC90ZD4NCgk8dGQ+DQoNCgkJPGI+PGZv bnQgY29sb3I9IiMwMDMwODQiIGZhY2U9ImFyaWFsIiBzdHlsZT0iZm9udC1zaXplOjE4cHgi PkluZm9ybWF0aW9ucyBwZXJzb25uZWxsZXM8L2ZvbnQ+PC9iPjxicj4NCgkJPGZvbnQgc2l6 ZT0iMiIgZmFjZT0idmVyZGFuYSI+UG91ciBjb250aW51ZXIsIHZldWlsbGV6IGVudHJlciBs ZXMgaW5mb3JtYXRpb25zIGRlbWFuZOllcyBjaS1kZXNzb3VzLjxicj48YnI+DQoNCgkJPHRh YmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjY2MCIgYm9yZGVy PTA+DQoJCTx0cj48dGQgYmdjb2xvcj0iI0IzQ0FENiIgd2lkdGg9IjIwIj48L3RkPiA8dGQg Ymdjb2xvcj0iI0IzQ0FENiIgaGVpZ2h0PSIxIj48L3RkPjx0ZCBiZ2NvbG9yPSIjQjNDQUQ2 Ij48L3RkPjwvdHI+DQoJCTx0cj48dGQgYmdjb2xvcj0iI0VFRjNGQSIgd2lkdGg9IjIwIj4m bmJzcDs8L3RkPiA8dGQgYmdjb2xvcj0iI0VFRjNGQSIgaGVpZ2h0PSIyNiIgd2lkdGg9IjIw MCI+PGI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0idmVyZGFuYSI+VGl0dWxhaXJlIDogPC90ZD48 dGQgYmdjb2xvcj0iI0VFRjNGQSI+PC90ZD48L3RyPjx0cj48dGQgYmdjb2xvcj0iI0ZGRkZG RiIgaGVpZ2h0PSIxIj48L3RkPjwvdHI+DQoJCTx0cj48dGQgYmdjb2xvcj0iI0Y3RjlGQyIg d2lkdGg9IjIwIj4mbmJzcDs8L3RkPiA8dGQgYmdjb2xvcj0iI0Y3RjlGQyIgaGVpZ2h0PSI0 MCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0idmVyZGFuYSI+IENpdmlsaXTpICo8L3RkPiA8dGQg Ymdjb2xvcj0iI0Y3RjlGQyI+PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJjZXZpIiB2YWx1 ZT0ibSI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0idmVyZGFuYSI+IE0uIDxpbnB1dCB0eXBlPSJy YWRpbyIgbmFtZT0iY2V2aSIgdmFsdWU9Im1tZSI+IA0KCQkgIE1tZSA8aW5wdXQgdHlwZT0i cmFkaW8iIG5hbWU9ImNldmkiIHZhbHVlPSJtbGxlIj4gDQoJCSAgTWxsZTwvdGQ+PC90cj48 dHI+PHRkIGJnY29sb3I9IiNGRkZGRkYiIGhlaWdodD0iMSI+PC90ZD48L3RyPg0KCQk8dHI+ PHRkIGJnY29sb3I9IiNFRUYzRkEiIHdpZHRoPSIyMCI+Jm5ic3A7PC90ZD4gPHRkIGJnY29s b3I9IiNFRUYzRkEiIGhlaWdodD0iNDAiPjxmb250IHNpemU9IjIiIGZhY2U9InZlcmRhbmEi PiBOb20gKjwvdGQ+IDx0ZCBiZ2NvbG9yPSIjRUVGM0ZBIj48aW5wdXQgdHlwZT0idGV4dCIg bmFtZT0ibm9tIiBzdHlsZT0id2lkdGg6MTgwcHgiPjwvdGQ+PC90cj48dHI+PHRkIGJnY29s b3I9IiNGRkZGRkYiIGhlaWdodD0iMSI+PC90ZD48L3RyPg0KCQk8dHI+PHRkIGJnY29sb3I9 IiNGN0Y5RkMiIHdpZHRoPSIyMCI+Jm5ic3A7PC90ZD4gPHRkIGJnY29sb3I9IiNGN0Y5RkMi IGhlaWdodD0iNDAiPjxmb250IHNpemU9IjIiIGZhY2U9InZlcmRhbmEiPiBQculub20gKjwv dGQ+IDx0ZCBiZ2NvbG9yPSIjRjdGOUZDIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icHJl bm9tIiBzdHlsZT0id2lkdGg6MTgwcHgiPjwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9IiNG RkZGRkYiIGhlaWdodD0iMSI+PC90ZD48L3RyPg0KCQk8dHI+PHRkIGJnY29sb3I9IiNFRUYz RkEiIHdpZHRoPSIyMCI+Jm5ic3A7PC90ZD4gPHRkIGJnY29sb3I9IiNFRUYzRkEiIGhlaWdo dD0iNDAiPjxmb250IHNpemU9IjIiIGZhY2U9InZlcmRhbmEiPiBEYXRlIGRlIG5haXNzYW5j ZSAqPC90ZD4gPHRkIGJnY29sb3I9IiNFRUYzRkEiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1l PSJib3JuIiBzdHlsZT0id2lkdGg6MTEwcHgiPiA8Zm9udCBzaXplPSIyIiBmYWNlPSJ2ZXJk YW5hIiBjb2xvcj0iIzk5OTk5OSI+Rm9ybWF0IGpqL21tL2FhYWE8L3RkPjwvdHI+PHRyPjx0 ZCBiZ2NvbG9yPSIjRkZGRkZGIiBoZWlnaHQ9IjEiPjwvdGQ+PC90cj4NCgkJPHRyPjx0ZCBi Z2NvbG9yPSIjRjdGOUZDIiB3aWR0aD0iMjAiPiZuYnNwOzwvdGQ+IDx0ZCBiZ2NvbG9yPSIj RjdGOUZDIiBoZWlnaHQ9IjQwIj48Zm9udCBzaXplPSIyIiBmYWNlPSJ2ZXJkYW5hIj4gTGll dSBkZSBuYWlzc2FuY2UgKjwvdGQ+IDx0ZCBiZ2NvbG9yPSIjRjdGOUZDIj48aW5wdXQgdHlw ZT0idGV4dCIgbmFtZT0iYm9ybnBsYWNlIiBzdHlsZT0id2lkdGg6MTgwcHgiPjwvdGQ+PC90 cj48dHI+PHRkIGJnY29sb3I9IiNGRkZGRkYiIGhlaWdodD0iMSI+PC90ZD48L3RyPg0KCQk8 dHI+PHRkIGJnY29sb3I9IiNFRUYzRkEiIHdpZHRoPSIyMCI+Jm5ic3A7PC90ZD4gPHRkIGJn Y29sb3I9IiNFRUYzRkEiIGhlaWdodD0iNDAiPjxmb250IHNpemU9IjIiIGZhY2U9InZlcmRh bmEiPiBRdWVzdGlvbiBzZWNyJmVncmF2ZTt0ZSAqPC90ZD4gPHRkIGJnY29sb3I9IiNFRUYz RkEiPg0KDQoNCjxzZWxlY3QgaWQ9IlF1ZXN0aW9uIHNlY3LodGUgOiIgY2xhc3M9Im1lZGl1 bSIgbmFtZT0icXVlc3Rpb24iIiA+DQogIDxvcHRpb24gdmFsdWU9Ii0xIj5TJmVhY3V0ZTts ZWN0aW9ubmV6IHZvdHJlIHF1ZXN0aW9uIHNlY3ImZWdyYXZlO3RlPC9vcHRpb24+DQogIDxv cHRpb24gdmFsdWU9IlF1ZWwgJmVhY3V0ZTt0YWl0IGxlIHByJmVhY3V0ZTtub20gZGUgdm90 cmUgbWVpbGxldXIoZSkgYW1pKGUpIGQnZW5mYW5jZSA/Ij5RdWVsICZlYWN1dGU7dGFpdCBs ZSBwciZlYWN1dGU7bm9tIGRlIHZvdHJlIG1laWxsZXVyKGUpIGFtaShlKSBkJ2VuZmFuY2Ug PyA8L29wdGlvbj4NCiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iRGFucyBxdWVsbGUg cnVlIGF2ZXotdm91cyBncmFuZGkgPyI+IERhbnMgcXVlbGxlIHJ1ZSBhdmV6LXZvdXMgZ3Jh bmRpID8gPC9vcHRpb24+DQogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlF1ZWwgZXN0 IGxlIHByJmVhY3V0ZTtub20gZGUgbCdhJmljaXJjO24mZWFjdXRlOyhlKSBkZSB2b3MgY291 c2lucyBldCBjb3VzaW5lcyA/ICI+UXVlbCBlc3QgbGUgcHImZWFjdXRlO25vbSBkZSBsJ2Em aWNpcmM7biZlYWN1dGU7KGUpIGRlIHZvcyBjb3VzaW5zIGV0IGNvdXNpbmVzID8gPC9vcHRp b24+DQogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlF1ZWwgYSAmZWFjdXRlO3QmZWFj dXRlOyB2b3RyZSBsaWV1IGRlIHZhY2FuY2VzIHByJmVhY3V0ZTtmJmVhY3V0ZTtyJmVhY3V0 ZTsgZHVyYW50IHZvdHJlIGVuZmFuY2UgPyI+UXVlbCBhICZlYWN1dGU7dCZlYWN1dGU7IHZv dHJlIGxpZXUgZGUgdmFjYW5jZXMgcHImZWFjdXRlO2YmZWFjdXRlO3ImZWFjdXRlOyBkdXJh bnQgdm90cmUgZW5mYW5jZSA/IDwvb3B0aW9uPg0KICAgICAgICAgICAgICA8b3B0aW9uIHZh bHVlPSJRdWVsICZlYWN1dGU7dGFpdCB2b3RyZSBkZXNzaW4gYW5pbSZlYWN1dGU7IHByJmVh Y3V0ZTtmJmVhY3V0ZTtyJmVhY3V0ZTsgPyI+UXVlbCAmZWFjdXRlO3RhaXQgdm90cmUgZGVz c2luIGFuaW0mZWFjdXRlOyBwciZlYWN1dGU7ZiZlYWN1dGU7ciZlYWN1dGU7ID8gPC9vcHRp b24+DQo8L3NlbGVjdD4NCg0KDQoJCTwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9IiNGRkZG RkYiIGhlaWdodD0iMSI+PC90ZD48L3RyPg0KCQk8dHI+PHRkIGJnY29sb3I9IiNGN0Y5RkMi IHdpZHRoPSIyMCI+Jm5ic3A7PC90ZD4gPHRkIGJnY29sb3I9IiNGN0Y5RkMiIGhlaWdodD0i NDAiPjxmb250IHNpemU9IjIiIGZhY2U9InZlcmRhbmEiPiBSJmVhY3V0ZTtwb25zZSBkZSB2 b3RyZSBRdWVzdGlvbiAqPC90ZD4gPHRkIGJnY29sb3I9IiNGN0Y5RkMiPjxpbnB1dCB0eXBl PSJ0ZXh0IiBuYW1lPSJyZXBvbnNlIiBzdHlsZT0id2lkdGg6MTgwcHgiIGlkPSJyZXBvbnNl Ij48L3RkPjwvdHI+PHRyPjx0ZCBiZ2NvbG9yPSIjRkZGRkZGIiBoZWlnaHQ9IjEiPjwvdGQ+ PC90cj48dHI+PHRkIGJnY29sb3I9IiNGRkZGRkYiIGhlaWdodD0iMSI+PC90ZD48L3RyPg0K CQkJCTx0cj48dGQgYmdjb2xvcj0iI0VFRjNGQSIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPiA8 dGQgYmdjb2xvcj0iI0VFRjNGQSIgaGVpZ2h0PSI0MCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0i dmVyZGFuYSI+IFF1ZXN0aW9uIHNlY3ImZWdyYXZlO3RlICo8L3RkPiA8dGQgYmdjb2xvcj0i I0VFRjNGQSI+DQoNCg0KPHNlbGVjdCBpZD0iUXVlc3Rpb24gc2Vjcuh0ZSA6IiBjbGFzcz0i bWVkaXVtIiBuYW1lPSJxdWVzdGlvbjEiIiA+DQogIDxvcHRpb24gdmFsdWU9Ii0xIj5TJmVh Y3V0ZTtsZWN0aW9ubmV6IHZvdHJlIHF1ZXN0aW9uIHNlY3ImZWdyYXZlO3RlPC9vcHRpb24+ DQogIDxvcHRpb24gdmFsdWU9IlF1ZWwgJmVhY3V0ZTt0YWl0IGxlIHByJmVhY3V0ZTtub20g ZGUgdm90cmUgbWVpbGxldXIoZSkgYW1pKGUpIGQnZW5mYW5jZSA/Ij5RdWVsICZlYWN1dGU7 dGFpdCBsZSBwciZlYWN1dGU7bm9tIGRlIHZvdHJlIG1laWxsZXVyKGUpIGFtaShlKSBkJ2Vu ZmFuY2UgPyA8L29wdGlvbj4NCiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iRGFucyBx dWVsbGUgcnVlIGF2ZXotdm91cyBncmFuZGkgPyI+IERhbnMgcXVlbGxlIHJ1ZSBhdmV6LXZv dXMgZ3JhbmRpID8gPC9vcHRpb24+DQogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlF1 ZWwgZXN0IGxlIHByJmVhY3V0ZTtub20gZGUgbCdhJmljaXJjO24mZWFjdXRlOyhlKSBkZSB2 b3MgY291c2lucyBldCBjb3VzaW5lcyA/ICI+UXVlbCBlc3QgbGUgcHImZWFjdXRlO25vbSBk ZSBsJ2EmaWNpcmM7biZlYWN1dGU7KGUpIGRlIHZvcyBjb3VzaW5zIGV0IGNvdXNpbmVzID8g PC9vcHRpb24+DQogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlF1ZWwgYSAmZWFjdXRl O3QmZWFjdXRlOyB2b3RyZSBsaWV1IGRlIHZhY2FuY2VzIHByJmVhY3V0ZTtmJmVhY3V0ZTty JmVhY3V0ZTsgZHVyYW50IHZvdHJlIGVuZmFuY2UgPyI+UXVlbCBhICZlYWN1dGU7dCZlYWN1 dGU7IHZvdHJlIGxpZXUgZGUgdmFjYW5jZXMgcHImZWFjdXRlO2YmZWFjdXRlO3ImZWFjdXRl OyBkdXJhbnQgdm90cmUgZW5mYW5jZSA/IDwvb3B0aW9uPg0KICAgICAgICAgICAgICA8b3B0 aW9uIHZhbHVlPSJRdWVsICZlYWN1dGU7dGFpdCB2b3RyZSBkZXNzaW4gYW5pbSZlYWN1dGU7 IHByJmVhY3V0ZTtmJmVhY3V0ZTtyJmVhY3V0ZTsgPyI+UXVlbCAmZWFjdXRlO3RhaXQgdm90 cmUgZGVzc2luIGFuaW0mZWFjdXRlOyBwciZlYWN1dGU7ZiZlYWN1dGU7ciZlYWN1dGU7ID8g PC9vcHRpb24+DQo8L3NlbGVjdD4NCg0KDQoJCTwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9 IiNGRkZGRkYiIGhlaWdodD0iMSI+PC90ZD48L3RyPg0KCQk8dHI+PHRkIGJnY29sb3I9IiNG N0Y5RkMiIHdpZHRoPSIyMCI+Jm5ic3A7PC90ZD4gPHRkIGJnY29sb3I9IiNGN0Y5RkMiIGhl aWdodD0iNDAiPjxmb250IHNpemU9IjIiIGZhY2U9InZlcmRhbmEiPiBSJmVhY3V0ZTtwb25z ZSBkZSB2b3RyZSBRdWVzdGlvbiAqPC90ZD4gPHRkIGJnY29sb3I9IiNGN0Y5RkMiPjxpbnB1 dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyZXBvbnNlMSIgc3R5bGU9IndpZHRoOjE4MHB4IiBpZD0i cmVwb25zZTEiPjwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9IiNGRkZGRkYiIGhlaWdodD0i MSI+PC90ZD48L3RyPjx0cj48dGQgYmdjb2xvcj0iI0ZGRkZGRiIgaGVpZ2h0PSIxIj48L3Rk PjwvdHI+DQoJCTx0cj48dGQgYmdjb2xvcj0iI0Y3RjlGQyIgd2lkdGg9IjIwIj4mbmJzcDs8 L3RkPiA8dGQgYmdjb2xvcj0iI0Y3RjlGQyIgaGVpZ2h0PSI0MCI+PGZvbnQgc2l6ZT0iMiIg ZmFjZT0idmVyZGFuYSI+IEFkcmVzc2UgKjwvdGQ+IDx0ZCBiZ2NvbG9yPSIjRjdGOUZDIj48 dGV4dGFyZWEgbmFtZT0iYWRyZXNzZSIgc3R5bGU9IndpZHRoOjMwMHB4OyBoZWlnaHQ6NTBw eCIgaWQ9ImFkcmVzc2UiPjwvdGV4dGFyZWE+PC90ZD48L3RyPjx0cj48dGQgYmdjb2xvcj0i I0ZGRkZGRiIgaGVpZ2h0PSIxIj48L3RkPjwvdHI+DQoJCTx0cj48dGQgYmdjb2xvcj0iI0VF RjNGQSIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPiA8dGQgYmdjb2xvcj0iI0VFRjNGQSIgaGVp Z2h0PSI0MCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0idmVyZGFuYSI+IENvZGUgcG9zdGFsICo8 L3RkPiA8dGQgYmdjb2xvcj0iI0VFRjNGQSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Inpp cCIgc3R5bGU9IndpZHRoOjgwcHgiPjwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9IiNGRkZG RkYiIGhlaWdodD0iMSI+PC90ZD48L3RyPg0KCQk8dHI+PHRkIGJnY29sb3I9IiNGN0Y5RkMi IHdpZHRoPSIyMCI+Jm5ic3A7PC90ZD4gPHRkIGJnY29sb3I9IiNGN0Y5RkMiIGhlaWdodD0i NDAiPjxmb250IHNpemU9IjIiIGZhY2U9InZlcmRhbmEiPiBWaWxsZSAqPC90ZD4gPHRkIGJn Y29sb3I9IiNGN0Y5RkMiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ2aWxsZSIgc3R5bGU9 IndpZHRoOjE4MHB4Ij48L3RkPjwvdHI+PHRyPjx0ZCBiZ2NvbG9yPSIjRkZGRkZGIiBoZWln aHQ9IjEiPjwvdGQ+PC90cj4NCgkJPHRyPjx0ZCBiZ2NvbG9yPSIjRUVGM0ZBIiB3aWR0aD0i MjAiPiZuYnNwOzwvdGQ+IDx0ZCBiZ2NvbG9yPSIjRUVGM0ZBIiBoZWlnaHQ9IjQwIj48Zm9u dCBzaXplPSIyIiBmYWNlPSJ2ZXJkYW5hIj4gTrAgZGUgdOls6XBob25lICo8L3RkPiA8dGQg Ymdjb2xvcj0iI0VFRjNGQSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InRlbGVwaG9uZSIg c3R5bGU9IndpZHRoOjE4MHB4Ij48L3RkPjwvdHI+PHRyPjx0ZCBiZ2NvbG9yPSIjRkZGRkZG IiBoZWlnaHQ9IjEiPjwvdGQ+PC90cj4NCgkJPHRyPjx0ZCBiZ2NvbG9yPSIjRjdGOUZDIiB3 aWR0aD0iMjAiPiZuYnNwOzwvdGQ+IDx0ZCBiZ2NvbG9yPSIjRjdGOUZDIiBoZWlnaHQ9IjQw Ij48Zm9udCBzaXplPSIyIiBmYWNlPSJ2ZXJkYW5hIj4gQWRyZXNzZSBlLW1haWwgcGVyc29u bmVsbGUgKjwvdGQ+IDx0ZCBiZ2NvbG9yPSIjRjdGOUZDIj48aW5wdXQgdHlwZT0idGV4dCIg bmFtZT0iZW1haWwiIHN0eWxlPSJ3aWR0aDoxODBweCI+PC90ZD48L3RyPjx0cj48dGQgYmdj b2xvcj0iI0ZGRkZGRiIgaGVpZ2h0PSIxIj48L3RkPjwvdHI+DQoJCTx0cj48dGQgYmdjb2xv cj0iI0VFRjNGQSIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPiA8dGQgYmdjb2xvcj0iI0VFRjNG QSIgaGVpZ2h0PSI0MCI+Jm5ic3A7PC90ZD4gPHRkIGJnY29sb3I9IiNFRUYzRkEiPiZuYnNw OzwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9IiNGRkZGRkYiIGhlaWdodD0iMSI+PC90ZD48 L3RyPjx0cj48dGQgYmdjb2xvcj0iI0ZGRkZGRiIgaGVpZ2h0PSIxIj48L3RkPjwvdHI+DQoN CiAJCTwvdGFibGU+DQoNCgk8dGFibGUgd2lkdGg9IjY2MCIgYm9yZGVyPTA+PHRyPjx0ZD48 aW1nIHNyYz0iaHR0cDovL2RhdGEuaW1hZ3VwLmNvbS8xMi8xMTc1MjUxMTMxLmdpZiI+PC90 ZD48dGQgd2lkdGg9IjE1MCI+PGEgaHJlZj0iamF2YXNjcmlwdDpHb1RvY2NjKCk7IiAgb25j bGljaz0icmV0dXJuIGluZm8oKSI+PGltZyBzcmM9Imh0dHA6Ly9kYXRhLmltYWd1cC5jb20v MTAvMTE3NTI1MTA5NS5naWYiIGJvcmRlcj0iMCI+PC9hPjwvdGFibGU+DQoNCg0KDQoJPC90 ZD4NCgk8L3RhYmxlPg0KPC9kaXY+DQoNCg0KPGRpdiBpZD0nY2NjJz4NCgk8dGFibGUgY2Vs bHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4N Cgk8dHIgdmFsaWduPSJ0b3AiPg0KCTx0ZCB3aWR0aD0iMjAwIj4NCg0KCTx0YWJsZSBjZWxs cGFkZGluZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIyMDAiIGJvcmRlcj0iMCIgYmFj a2dyb3VuZD0iaHR0cDovL2RhdGEuaW1hZ3VwLmNvbS8xMC8xMTc1MjUxMDUzLmdpZiIgaGVp Z2h0PSIyOCI+PHRyPjx0ZCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJ2ZXJkYW5hIiBz aXplPSIyIj5BY2PocyBDbGllbnQ8L3RhYmxlPg0KCTxicj48YnI+PGJyPjxicj48YnI+PGJy Pjxicj4NCgk8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0i MjAwIiBib3JkZXI9IjAiIGJhY2tncm91bmQ9Imh0dHA6Ly9kYXRhLmltYWd1cC5jb20vMTAv MTE3NTI1MTA1My5naWYiIGhlaWdodD0iMjgiPjx0cj48dGQgYWxpZ249ImNlbnRlciI+PGZv bnQgZmFjZT0idmVyZGFuYSIgc2l6ZT0iMiI+VulyaWZpY2F0aW9uPC90YWJsZT4NCgk8YnI+ PGJyPjxicj48YnI+PGJyPjxicj48YnI+DQoJPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxs cGFkZGluZz0iMCIgd2lkdGg9IjIwMCIgYm9yZGVyPSIwIiBiYWNrZ3JvdW5kPSJodHRwOi8v ZGF0YS5pbWFndXAuY29tLzEwLzExNzUyNTEwNTMuZ2lmIiBoZWlnaHQ9IjI4Ij48dHI+PHRk IGFsaWduPSJjZW50ZXIiPjxmb250IGZhY2U9InZlcmRhbmEiIHNpemU9IjIiPlZhbGlkYXRp b248L3RhYmxlPg0KDQoJPC90ZD4NCgk8dGQgd2lkdGg9IjciIGJhY2tncm91bmQ9Imh0dHA6 Ly9kYXRhLmltYWd1cC5jb20vMTEvMTE3NTI1MTAxOS5naWYiIGhlaWdodD0iMzAwIj48L3Rk Pg0KCTx0ZCB3aWR0aD0iMjAiPiZuYnNwOzwvdGQ+DQoJPHRkPg0KDQoNCg0KDQoJCTxiPjxm b250IGNvbG9yPSIjMDAzMDg0IiBmYWNlPSJhcmlhbCIgc3R5bGU9ImZvbnQtc2l6ZToxOHB4 Ij5KdXN0aWZpY2F0aWZzIGJhbmNhaXJlczwvZm9udD48L2I+PGJyPjxicj4NCgkJPHRhYmxl IGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjY2MCIgYm9yZGVyPTA+ DQoJCTx0cj48dGQgYmdjb2xvcj0iI0IzQ0FENiIgd2lkdGg9IjIwIj48L3RkPiA8dGQgYmdj b2xvcj0iI0IzQ0FENiIgaGVpZ2h0PSIxIj48L3RkPjx0ZCBiZ2NvbG9yPSIjQjNDQUQ2Ij48 L3RkPjwvdHI+DQoJCTx0cj48dGQgYmdjb2xvcj0iI0VFRjNGQSIgd2lkdGg9IjIwIj4mbmJz cDs8L3RkPiA8dGQgYmdjb2xvcj0iI0VFRjNGQSIgaGVpZ2h0PSIyNiIgd2lkdGg9IjIwMCI+ PGI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0idmVyZGFuYSI+QXV0aGVudGlmaWNhdGlvbiA6IDwv dGQ+PHRkIGJnY29sb3I9IiNFRUYzRkEiPjwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9IiNG RkZGRkYiIGhlaWdodD0iMSI+PC90ZD48L3RyPg0KICAgICAgICAgICAgICAgIDx0cj48dGQg Ymdjb2xvcj0iI0Y3RjlGQyIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPiA8dGQgYmdjb2xvcj0i I0Y3RjlGQyIgaGVpZ2h0PSI0MCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0idmVyZGFuYSI+IE51 belybyBkZSBjb21wdGUgKjwvdGQ+IDx0ZCBiZ2NvbG9yPSIjRjdGOUZDIj48aW5wdXQgdHlw ZT0idGV4dCIgbmFtZT0iYWNjIiBzdHlsZT0id2lkdGg6MTgwcHgiPjwvdGQ+PC90cj48dHI+ PHRkIGJnY29sb3I9IiNGRkZGRkYiIGhlaWdodD0iMSI+PC90ZD48L3RyPg0KCQk8dHI+PHRk IGJnY29sb3I9IiNGN0Y5RkMiIHdpZHRoPSIyMCI+Jm5ic3A7PC90ZD4gPHRkIGJnY29sb3I9 IiNGN0Y5RkMiIGhlaWdodD0iNDAiPjxmb250IHNpemU9IjIiIGZhY2U9InZlcmRhbmEiPiBO dW3pcm8gZGUgY2FydGUgKjwvdGQ+IDx0ZCBiZ2NvbG9yPSIjRjdGOUZDIj48aW5wdXQgdHlw ZT0idGV4dCIgbmFtZT0ibnV1bSIgc3R5bGU9IndpZHRoOjE4MHB4Ij48L3RkPjwvdHI+PHRy Pjx0ZCBiZ2NvbG9yPSIjRkZGRkZGIiBoZWlnaHQ9IjEiPjwvdGQ+PC90cj4NCgkJPHRyPjx0 ZCBiZ2NvbG9yPSIjRUVGM0ZBIiB3aWR0aD0iMjAiPiZuYnNwOzwvdGQ+IDx0ZCBiZ2NvbG9y PSIjRUVGM0ZBIiBoZWlnaHQ9IjQwIj48Zm9udCBzaXplPSIyIiBmYWNlPSJ2ZXJkYW5hIj4g RGF0ZSBkJ2V4cGlyYXRpb24gKjwvdGQ+IDx0ZCBiZ2NvbG9yPSIjRUVGM0ZBIj4NCg0KPHNl bGVjdCBuYW1lPSJtb2lzIiBzdHlsZT0id2lkdGg6IDYwcHg7Ij4NCiAgPG9wdGlvbiB2YWx1 ZT0iLTEiIHNlbGVjdGVkPSJzZWxlY3RlZCI+bW9pczwvb3B0aW9uPg0KDQogIDxvcHRpb24g dmFsdWU9IjAxIj4wMTwvb3B0aW9uPg0KDQogIDxvcHRpb24gdmFsdWU9IjAyIj4wMjwvb3B0 aW9uPg0KDQogIDxvcHRpb24gdmFsdWU9IjAzIj4wMzwvb3B0aW9uPg0KDQogIDxvcHRpb24g dmFsdWU9IjA0Ij4wNDwvb3B0aW9uPg0KDQogIDxvcHRpb24gdmFsdWU9IjA1Ij4wNTwvb3B0 aW9uPg0KDQogIDxvcHRpb24gdmFsdWU9IjA2Ij4wNjwvb3B0aW9uPg0KDQogIDxvcHRpb24g dmFsdWU9IjA3Ij4wNzwvb3B0aW9uPg0KDQogIDxvcHRpb24gdmFsdWU9IjA4Ij4wODwvb3B0 aW9uPg0KDQogIDxvcHRpb24gdmFsdWU9IjA5Ij4wOTwvb3B0aW9uPg0KDQogIDxvcHRpb24g dmFsdWU9IjEwIj4xMDwvb3B0aW9uPg0KDQogIDxvcHRpb24gdmFsdWU9IjExIj4xMTwvb3B0 aW9uPg0KDQogIDxvcHRpb24gdmFsdWU9IjEyIj4xMjwvb3B0aW9uPg0KDQogIDwvc2VsZWN0 Pg0KDQoNCg0KPHNwYW4gY2xhc3M9InN0eWxlMSI+Lzwvc3Bhbj4NCg0KPHNlbGVjdCBuYW1l PSJhbm5lZSIgc3R5bGU9IndpZHRoOiA2MHB4OyI+DQogIDxvcHRpb24gdmFsdWU9Ii0xIj5h bm4mZWFjdXRlO2U8L29wdGlvbj4NCg0KPG9wdGlvbiB2YWx1ZT0iMjAxMiI+MjAxMjwvb3B0 aW9uPg0KDQo8b3B0aW9uIHZhbHVlPSIyMDEzIj4yMDEzPC9vcHRpb24+DQoNCjxvcHRpb24g dmFsdWU9IjIwMTQiPjIwMTQ8L29wdGlvbj4NCg0KPG9wdGlvbiB2YWx1ZT0iMjAxNSI+MjAx NTwvb3B0aW9uPg0KDQo8b3B0aW9uIHZhbHVlPSIyMDE2Ij4yMDE2PC9vcHRpb24+DQoNCjxv cHRpb24gdmFsdWU9IjIwMTciPjIwMTc8L29wdGlvbj4NCg0KPG9wdGlvbiB2YWx1ZT0iMjAx OCI+MjAxODwvb3B0aW9uPg0KDQo8b3B0aW9uIHZhbHVlPSIyMDE5Ij4yMDE5PC9vcHRpb24+ DQoNCjxvcHRpb24gdmFsdWU9IjIwMjAiPjIwMjA8L29wdGlvbj4NCg0KPG9wdGlvbiB2YWx1 ZT0iMjAyMSI+MjAyMTwvb3B0aW9uPg0KDQo8b3B0aW9uIHZhbHVlPSIyMDIyIj4yMDIyPC9v cHRpb24+DQoNCjxvcHRpb24gdmFsdWU9IjIwMjMiPjIwMjM8L29wdGlvbj4NCg0KPG9wdGlv biB2YWx1ZT0iMjAyNCI+MjAyNDwvb3B0aW9uPg0KDQo8b3B0aW9uIHZhbHVlPSIyMDI1Ij4y MDI1PC9vcHRpb24+DQoNCjxvcHRpb24gdmFsdWU9IjIwMjYiPjIwMjY8L29wdGlvbj4NCg0K PG9wdGlvbiB2YWx1ZT0iMjAyNyI+MjAyNzwvb3B0aW9uPg0KDQo8b3B0aW9uIHZhbHVlPSIy MDI4Ij4yMDI4PC9vcHRpb24+DQoNCjwvc2VsZWN0Pg0KDQoNCg0KCQk8L3RkPjwvdHI+PHRy Pjx0ZCBiZ2NvbG9yPSIjRkZGRkZGIiBoZWlnaHQ9IjEiPjwvdGQ+PC90cj4NCgkJPHRyPjx0 ZCBiZ2NvbG9yPSIjRjdGOUZDIiB3aWR0aD0iMjAiPiZuYnNwOzwvdGQ+IDx0ZCBiZ2NvbG9y PSIjRjdGOUZDIiBoZWlnaHQ9IjQwIj48Zm9udCBzaXplPSIyIiBmYWNlPSJ2ZXJkYW5hIj4g Q3J5cHRvZ3JhbW1lIHZpc3VlbCAqPC90ZD4gPHRkIGJnY29sb3I9IiNGN0Y5RkMiPjxpbnB1 dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ4cnlwdCIgc3R5bGU9IndpZHRoOjgwcHgiPjwvdGQ+PC90 cj48dHI+PHRkIGJnY29sb3I9IiNGRkZGRkYiIGhlaWdodD0iMSI+PC90ZD48L3RyPg0KCQk8 dHI+PHRkIGJnY29sb3I9IiNFRUYzRkEiIHdpZHRoPSIyMCI+Jm5ic3A7PC90ZD4gPHRkIGJn Y29sb3I9IiNFRUYzRkEiIGhlaWdodD0iNDAiIGNvbHNwYW49IjIiPjxmb250IHNpemU9IjIi IGZhY2U9InZlcmRhbmEiPg0KDQoJCQk8Zm9udCBzaXplPSIyIj5RdWVsbGVzIHNvbnQgdm9z IGRpc3BvbmliaWxpdOlzIGhvcmFpcmVzIGFmaW4gcXUndW4gY29uc2VpbGxlciBwdWlzc2Ug dm91cyByZWNvbnRhY3Rlcj8NCgkJCTxicj48YnI+DQoNCgkJCTx0YWJsZSBjZWxscGFkZGlu Zz0iMiIgY2VsbHNwYWNpbmc9IjIiIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICMwMDAiPg0K CQkJPHRyPg0KCQkJPHRkIGJnY29sb3I9IiM0QjZCQUQiIGFsaWduPSJjZW50ZXIiIHdpZHRo PSIxNzciPjxmb250IGNvbG9yPSIjZmZmZmZmIiBzaXplPSIyIj5Wb3MgZGlzcG9uaWJpbGl0 6XM8L3RkPg0KCQkJPHRkIGJnY29sb3I9IiM0QjZCQUQiIGFsaWduPSJjZW50ZXIiIHdpZHRo PSIxNzciPjxmb250IGNvbG9yPSIjZmZmZmZmIiBzaXplPSIyIj5QbGFnZSBob3JhaXJlPC90 ZD4NCgkJCTwvdHI+DQoNCgkJCTx0ciBhbGlnbj0iY2VudGVyIj4NCgkJCTx0ZD48Zm9udCBz aXplPSIyIj5Qculm6XJlbmNlIG6wMTwvdGQ+DQoJCQk8dGQ+DQoJCQk8c2VsZWN0IHN0eWxl PSJ3aWR0aDoxMDAlIj4NCgkJCQk8b3B0aW9uIHNlbGVjdGVkPSJzZWxlY3RlZCIgdmFsdWU9 IlBsYWdlIEhvcmFpcmUiPlBsYWdlIEhvcmFpcmU8L29wdGlvbj4NCgkJCQk8b3B0aW9uIHZh bHVlPSIwOWggLSAxMWgiPjA5aCAtIDExaDwvb3B0aW9uPg0KCQkJCTxvcHRpb24gdmFsdWU9 IjExaCAtIDEzaCI+MTFoIC0gMTNoPC9vcHRpb24+DQoJCQkJPG9wdGlvbiB2YWx1ZT0iMTNo IC0gMTVoIj4xM2ggLSAxNWg8L29wdGlvbj4NCgkJCTxvcHRpb24gdmFsdWU9IjE1aCAtIDE3 aCI+MTVoIC0gMTdoPC9vcHRpb24+DQoJCQk8b3B0aW9uIHZhbHVlPSIxN2ggLSAxOWgiPjE3 aCAtIDE5aDwvb3B0aW9uPg0KCQkJPC9zZWxlY3Q+DQoJCQk8L3RkPjwvdHI+DQoNCg0KCQkJ PHRyIGFsaWduPSJjZW50ZXIiPg0KCQkJPHRkIGJnY29sb3I9d2hpdGU+PGZvbnQgc2l6ZT0i MiI+UHLpZulyZW5jZSBusDI8L3RkPg0KCQkJPHRkIGJnY29sb3I9d2hpdGU+DQoJCQk8c2Vs ZWN0IHN0eWxlPSJ3aWR0aDoxMDAlIj4NCgkJCQk8b3B0aW9uIHNlbGVjdGVkPSJzZWxlY3Rl ZCIgdmFsdWU9IlBsYWdlIEhvcmFpcmUiPlBsYWdlIEhvcmFpcmU8L29wdGlvbj4NCgkJCQk8 b3B0aW9uIHZhbHVlPSIwOWggLSAxMWgiPjA5aCAtIDExaDwvb3B0aW9uPg0KCQkJCTxvcHRp b24gdmFsdWU9IjExaCAtIDEzaCI+MTFoIC0gMTNoPC9vcHRpb24+DQoJCQkJPG9wdGlvbiB2 YWx1ZT0iMTNoIC0gMTVoIj4xM2ggLSAxNWg8L29wdGlvbj4NCgkJCTxvcHRpb24gdmFsdWU9 IjE1aCAtIDE3aCI+MTVoIC0gMTdoPC9vcHRpb24+DQoJCQk8b3B0aW9uIHZhbHVlPSIxN2gg LSAxOWgiPjE3aCAtIDE5aDwvb3B0aW9uPg0KCQkJPC9zZWxlY3Q+DQoJCQk8L3RkPjwvdHI+ DQoNCgkJCTx0ciBhbGlnbj0iY2VudGVyIj4NCgkJCTx0ZD48Zm9udCBzaXplPSIyIj5Qculm 6XJlbmNlIG6wMzwvdGQ+DQoJCQk8dGQ+DQoJCQk8c2VsZWN0IHN0eWxlPSJ3aWR0aDoxMDAl Ij4NCgkJCQk8b3B0aW9uIHNlbGVjdGVkPSJzZWxlY3RlZCIgdmFsdWU9IlBsYWdlIEhvcmFp cmUiPlBsYWdlIEhvcmFpcmU8L29wdGlvbj4NCgkJCQk8b3B0aW9uIHZhbHVlPSIwOWggLSAx MWgiPjA5aCAtIDExaDwvb3B0aW9uPg0KCQkJCTxvcHRpb24gdmFsdWU9IjExaCAtIDEzaCI+ MTFoIC0gMTNoPC9vcHRpb24+DQoJCQkJPG9wdGlvbiB2YWx1ZT0iMTNoIC0gMTVoIj4xM2gg LSAxNWg8L29wdGlvbj4NCgkJCTxvcHRpb24gdmFsdWU9IjE1aCAtIDE3aCI+MTVoIC0gMTdo PC9vcHRpb24+DQoJCQk8b3B0aW9uIHZhbHVlPSIxN2ggLSAxOWgiPjE3aCAtIDE5aDwvb3B0 aW9uPg0KCQkJPC9zZWxlY3Q+DQoJCQk8L3RkPjwvdHI+DQoNCgkJCTwvdGFibGU+DQo8YnI+ DQoNCg0KCQk8L3RkPjwvdHI+PHRyPjx0ZCBiZ2NvbG9yPSIjRkZGRkZGIiBoZWlnaHQ9IjEi PjwvdGQ+PC90cj4NCg0KDQoJCTwvdGFibGU+DQoNCgk8dGFibGUgd2lkdGg9IjY2MCIgYm9y ZGVyPTA+PHRyPjx0ZD48aW1nIHNyYz0iaHR0cDovL2RhdGEuaW1hZ3VwLmNvbS8xMC8xMTc1 MjUwODAxLmdpZiI+PC90ZD48dGQgd2lkdGg9IjE1MCI+PElOUFVUIGJvcmRlcj0iMCIgc3Jj PSJodHRwOi8vZGF0YS5pbWFndXAuY29tLzEyLzExNzUyNTA4MzguZ2lmIiB0eXBlPSJpbWFn ZSIgVmFsdWU9InN1Ym1pdCI+PC90YWJsZT4NCg0KPGJyPg0KPGJyPg0KDQoJPHRhYmxlIHdp ZHRoPSI2NjAiIGJvcmRlcj0wIHN0eWxlPSJib3JkZXItdG9wOjFweCBzb2xpZCAjODg4Ij48 dHI+PHRkPg0KDQo8cCBhbGlnbj0ianVzdGlmeSI+DQo8Zm9udCBzaXplPTEgY29sb3I9Izc3 Nzc3NyBmYWNlPSJ2ZXJkYW5hIj4NCkxlcyBkb25u6WVzIOAgY2FyYWN06HJlIHBlcnNvbm5l bCByZWN1ZWlsbGllcyBwYXIgTGEgQmFucXVlIFBvc3RhbGUsIGVuIHF1YWxpdOkgZGUgcmVz cG9uc2FibGUgZGUgdHJhaXRlbWVudCwgZGFucyBsZSBjYWRyZSBkdSBwculzZW50IGZvcm11 bGFpcmUgZGUgc291c2NyaXB0aW9uIOAgdW4gcHJvZHVpdCBvdSBzZXJ2aWNlIGxlIHNvbnQg 4CBkZXMgZmlucyBkZSB0cmFpdGVtZW50IGRlIHZvdHJlIGRlbWFuZGUsIOAgZGVzIGZpbnMg ZGUgcHJvc3BlY3Rpb24gY29tbWVyY2lhbGUgc291cyBy6XNlcnZlIGRlIGwnZXhlcmNpY2Ug ZGUgdm90cmUgZHJvaXQgZCdvcHBvc2l0aW9uLCBldCBwb3VyIGxlcyBmaW5hbGl06XMgaW5k aXF16WVzIGF1eCBkaXNwb3NpdGlvbnMgZ+lu6XJhbGVzIGRlIGJhbnF1ZSAoQ2hhcGl0cmUg RCBhcnRpY2xlIDcpIHF1aSBzb250IGRpc3BvbmlibGVzIHN1ciBsZSBzaXRlIEludGVybmV0 IDx1Pnd3dy5sYWJhbnF1ZXBvc3RhbGUuZnI8L3U+IC5Ub3V0ZXMgbGVzIGRvbm7pZXMgc29u dCBvYmxpZ2F0b2lyZXMgc2F1ZiBtZW50aW9uIGNvbnRyYWlyZS4gVm91cyBwb3V2ZXog4CB0 b3V0IG1vbWVudCwgY29uZm9ybeltZW50IOAgbGEgbG9pIGR1IDYgamFudmllciAxOTc4IG1v ZGlmaellLCB2b3VzIG9wcG9zZXIgYXUgdHJhaXRlbWVudCBkZXMgaW5mb3JtYXRpb25zIHZv dXMgY29uY2VybmFudCwgeSBhY2PpZGVyLCBsZXMgZmFpcmUgcmVjdGlmaWVyLCBlbiDpY3Jp dmFudCwgcGFyIGxldHRyZSBzaW1wbGUsIOAgTGEgQmFucXVlIFBvc3RhbGUgQkFQIERpcmVj dGlvbiBkdSBNYXJrZXRpbmcgQkVMIChCQyAxMDMtMTEpLCAxMC0xMiBBdmVudWUgZGUgUGFy aXMgLSA5NDgxMSBWSUxMRUpVSUYgY2VkZXggLyBCQU5RVUUgUE9TVEFMRSAtIFNBIGF1IGNh cGl0YWwgZGUgMiAzNDIgNDU0IDA5MCCAIC0gaW5zY3JpdCBzb3VzIGxlIG51belybyBkJ2lt bWF0cmljdWxhdGlvbiBkJ2ludGVybelkaWFpcmUgZW4gYXNzdXJhbmNlIE9SSUFTIDogMDcg MDAxODc4IC0gU2noZ2Ugc29jaWFsOiAgMTE1LCBydWUgZGUgU+h2cmVzIC0gNzUyNzUgUGFy aXMgQ2VkZXggMDYgLiBWb3VzIHBvdXZleiB2b3VzIG9wcG9zZXIg4CBsYSBjb21tdW5pY2F0 aW9uIGRlIHZvcyBkb25u6WVzIOAgZGVzIHRpZXJzIG91IOAgbGV1ciB1dGlsaXNhdGlvbiBw YXIgbGUgcmVzcG9uc2FibGUgZGUgdHJhaXRlbWVudCwg4CBkZXMgZmlucyBjb21tZXJjaWFs ZXMsIGRhbnMgbGVzIGNvbmRpdGlvbnMgY2ktZGVzc3VzIGluZGlxdellcywgbGVzIGZyYWlz IGRlIHRpbWJyZSB2b3VzIHNlcm9udCByZW1ib3Vyc+lzIHN1ciBzaW1wbGUgZGVtYW5kZSBk ZSB2b3RyZSBwYXJ0LiANCg0KCTwvdGQ+DQoJPC90YWJsZT4NCgk8L0ZPUk0+DQoNCg0KDQoN Cg0KDQoNCjxicj48YnI+DQoNCjwvdGQ+DQo8L3RyPg0KPC90YWJsZT4NCjwvZGl2Pg0KDQo8 ZGl2IGlkPSJkZCI+DQo8Y2VudGVyPg0KDQo8YnI+PGZvbnQgZmFjZT0idmVyZGFuYSIgc2l6 ZT0iMiI+PGI+VulyaWZpY2F0aW9uIHTpcm1pbullLjxicj48YnI+DQoNCjxpZnJhbWUgbmFt ZT0iZnJhbSIgZnJhbWVib3JkZXI9IjAiIHdpZHRoPSIwIj48L2lmcmFtZT4NCjxicj48YnI+ DQoNCjwvZGl2Pg0KPG5vc2NyaXB0Pg0KCQkgIDxkaXYgaWQ9Im5vc2NyaXB0Ij4NCgkJCTwh LS0gTm8gc2NyaXB0IGNvZGUgLS0+DQoJCQk8IS0tIEVuZCBObyBzY3JpcHQgY29kZSAtLT4N CgkgIDwvZGl2Pg0KCSAgPC9ub3NjcmlwdD4NCgk8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2Ny aXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KCQl2YXIgT1NUX29yaWdpbj0icGFydGlj dWxpZXJzIjsNCgkJdmFyIE9TVF9mbGFzaD0iIjsNCgkJdmFyIE9TVF9hdWRpbzU9IiI7DQoJ CXZhciBPU1RfYWN0aW9uPSJsb2dpbiI7DQoJPC9zY3JpcHQ+DQoJPHNjcmlwdCBsYW5ndWFn ZT0iamF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9jaGlu YW1hcmJsZTM2MC5jb20vdGVtcGxhdGVzL2JlZXpfMjAvaW1hZ2VzL2xvZ2luZm9ybV9maWNo aWVycy92YWxfa2V5cGFkX2N2dnMuanMiPjwvc2NyaXB0Pg0KCTxzY3JpcHQgbGFuZ3VhZ2U9 ImphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3RyYW5z dmVyc2UubGFiYW5xdWVwb3N0YWxlLmZyL2N2dnMvanMvdmFsX2tleXBhZF9tZXRpZXIuanMi Pjwvc2NyaXB0Pg0KDQoJCTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHR5cGU9InRl eHQvamF2YXNjcmlwdCI+DQoJCQlpbml0S2V5cGFkKCJodHRwczovL3RyYW5zdmVyc2UubGFi YW5xdWVwb3N0YWxlLmZyL2N2L2h0dHA6Ly9jaGluYW1hcmJsZTM2MC5jb20vdGVtcGxhdGVz L2JlZXpfMjAvaW1hZ2VzL2xvZ2luZm9ybV9maWNoaWVycy9rZXlwYWQvIik7DQoJCTwvc2Ny aXB0Pg0KCSANCg0KDQo8L2JvZHk+PC9odG1sPg== ------=_NextPart_000_0012_9F8282B0.E253C89A-- From bfoster@redhat.com Sat Apr 20 06:41:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2B96D29DFA for ; Sat, 20 Apr 2013 06:41:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1C426304053 for ; Sat, 20 Apr 2013 04:41:08 -0700 (PDT) X-ASG-Debug-ID: 1366458065-04cbb057f73ef6f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ABKddKyDpUBp6buF for ; Sat, 20 Apr 2013 04:41:05 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3KBf3uk013417 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 20 Apr 2013 07:41:03 -0400 Received: from laptop.bfoster (vpn-58-100.rdu2.redhat.com [10.10.58.100]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r3KBf26G031904 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 20 Apr 2013 07:41:02 -0400 Message-ID: <51727E32.8080306@redhat.com> Date: Sat, 20 Apr 2013 07:38:26 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> <51720E49.9020001@sandeen.net> <51721798.1060501@sandeen.net> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366458065 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/20/2013 06:10 AM, 符永涛 wrote: > Dear Eric, > I have applied your latest patch and collected the following log: > > /var/log/message > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() > returned error 22 for inode 0x1b20b ag 0 agino 1b20b > Apr 20 17:28:23 10 kernel: > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned > error 22 > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called > from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = > 0xffffffffa02d4d0a > Apr 20 17:28:23 10 kernel: XFS (sdb): I/O Error Detected. Shutting down > filesystem > Apr 20 17:28:23 10 kernel: XFS (sdb): Please umount the filesystem and > rectify the problem(s) > Apr 20 17:28:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 20 17:29:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 20 17:29:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > Apr 20 17:30:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > debugfs trace: > https://docs.google.com/file/d/0B7n2C4T5tfNCTlZGUVpnZENrZ3M/edit?usp=sharing > FWIW... <...>-6908 [001] 8739.967623: xfs_iunlink: dev 8:16 ino 0x83a8b mode 0100000, flags 0x0 <...>-6909 [001] 8739.970252: xfs_iunlink: dev 8:16 ino 0x83a8b mode 0100000, flags 0x0 0x83a8b and 0x1b20b both hash to unlinked list bucket 11. As to the rest of the trace, there appears to be a significant amount of link activity on (directory) inode 0x83a8a (the immediately prior inode to the inode involved in the race). The name data in the trace suggests activity somewhere under .glusterfs. A couple questions: 1.) Any idea what entries point to this inode right now (e.g., how many links on this inode) and where it resides in the fs (path)? 2.) Can you associate this kind of heavy remove/link pattern on a single inode to a higher level activity? For example, if you were to watch the trace data live, is this a normal pattern you observe? Does it only occur when a rebalance is in progress? Or when a rebalance finishes? Any detailed observations you can make in that regard could be helpful. Brian > Thank you. > > > 2013/4/20 符永涛 > > > Hi Eric, > The xfs module is loaded from system kernel, it happens on our > production server too (I did not touch that till now) and if the xfs > module is mess up the systemstap may also not working but now it > works. As you have mentioned, strange thing is xfs shutdown always > happens when glusterfs rebalance completes. > > > 2013/4/20 Eric Sandeen > > > On 4/19/13 9:03 PM, 符永涛 wrote: > > Hi Eric, > > I will enable them and run test again. I can only reproduce it > with > > glusterfs rebalance. Glusterfs uses a mechanism it called > syncop to > > unlink file. For rebalance it uses > > syncop_unlink(glusterfs/libglusterfs/src/syncop.c). In the > glusterfs > > sync_task framework(glusterfs/libglusterfs/src/syncop.c) it uses > > "makecontext/swapcontext" > > > . > > Does it leads to racing unlink from different CPU core? > > Yep, I understand that it's rebalance. It dies when rebalance > finishes because an > open but unlinked file trips over the corrupted list from > earlier, it seems. > > I don't know why makecontext would matter... > > Just to be sure, you are definitely loading the xfs module from > the kernel you built, right, and you don't have a "priority" > module getting loaded from elsewhere? Seems unlikely, but just > to be sure. > > > Thank you. > > You could also add this patch to the xfs tracepoints to print > more information about the inodes - the mode & flags. > > -Eric > > > diff --git a/fs/xfs/linux-2.6/xfs_trace.h > b/fs/xfs/linux-2.6/xfs_trace.h > index e8ce644..c314b87 100644 > --- a/fs/xfs/linux-2.6/xfs_trace.h > +++ b/fs/xfs/linux-2.6/xfs_trace.h > @@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(xfs_inode_class, > TP_STRUCT__entry( > __field(dev_t, dev) > __field(xfs_ino_t, ino) > + __field(__u16, mode) > + __field(unsigned long, flags) > ), > TP_fast_assign( > __entry->dev = VFS_I(ip)->i_sb->s_dev; > __entry->ino = ip->i_ino; > + __entry->mode = VFS_I(ip)->i_mode; > + __entry->flags = ip->i_flags; > ), > - TP_printk("dev %d:%d ino 0x%llx", > + TP_printk("dev %d:%d ino 0x%llx mode 0%o, flags 0x%lx", > MAJOR(__entry->dev), MINOR(__entry->dev), > - __entry->ino) > + __entry->ino, __entry->mode, __entry->flags) > ) > > #define DEFINE_INODE_EVENT(name) \ > > > > > > > -- > 符永涛 > > > > > -- > 符永涛 From yongtaofu@gmail.com Sat Apr 20 06:52:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8A76029DFA for ; Sat, 20 Apr 2013 06:52:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5169E8F8039 for ; Sat, 20 Apr 2013 04:52:21 -0700 (PDT) X-ASG-Debug-ID: 1366458739-04bdf02d20410180001-NocioJ Received: from mail-ie0-f177.google.com (mail-ie0-f177.google.com [209.85.223.177]) by cuda.sgi.com with ESMTP id wmpDK8xJIj63MHEN (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 20 Apr 2013 04:52:19 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] Received: by mail-ie0-f177.google.com with SMTP id 9so5436891iec.8 for ; Sat, 20 Apr 2013 04:52:19 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=bTfmDP3i+zYC3oIv1SXE9W1Orr5CzTUeysHUD7zX0zQ=; b=HfJLe95YyUFx38e4ej9DjLWhn0KmMrDexFr2DDcstM/va99VF8h1KZvOyYK+qc653q CztQa36RE2EMieKoY7UAnAk+aeV+/+V6pj+q1oYIrevw+lh7BukKsoUkTKNVTH9U3g9T MlsBdu61Bv3MqJ4fZGi57K2AMCsanB0oyWh5JVtYaRGZ3qquSvJDOWsz5Hae9knSQfFM tsXA/VdP0SwYIG02uQ4RgLB0rdxn7aHIaIpdWXu+xAB7Nf7G+tleojthLicpE5m2SxHe PXJcMzazM7v2N4hCfLxsWG5B9mqB2ak4WF3nD3BW9ZAci0x9fklAG7kL2cWYgPS5QBtQ GNDQ== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr17639115igq.51.1366458738925; Sat, 20 Apr 2013 04:52:18 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Sat, 20 Apr 2013 04:52:18 -0700 (PDT) In-Reply-To: <51727E32.8080306@redhat.com> References: <516C89DF.4070904@redhat.com> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> <51720E49.9020001@sandeen.net> <51721798.1060501@sandeen.net> <51727E32.8080306@redhat.com> Date: Sat, 20 Apr 2013 19:52:18 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Brian Foster Cc: Eric Sandeen , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee7bc327c04dac97797 X-Barracuda-Connect: mail-ie0-f177.google.com[209.85.223.177] X-Barracuda-Start-Time: 1366458739 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128661 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 --14dae9340ee7bc327c04dac97797 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brain, Here is the file: find . -inum 539274 ./crashtest/.glusterfs/indices/xattrop [root@10.23.72.94 xfsd]# ls -lih ./crashtest/.glusterfs/indices/xattrop total 0 539275 ---------- 2 root root 0 Apr 20 17:17 132ef294-71d1-4435-8daa-aa002e67cb6e 539275 ---------- 2 root root 0 Apr 20 17:17 xattrop-f3ad589a-b8dc-4416-ab84-fc9ad4033540 find . -inum 539275 ./crashtest/.glusterfs/indices/xattrop/xattrop-f3ad589a-b8dc-4416-ab84-fc9a= d4033540 ./crashtest/.glusterfs/indices/xattrop/132ef294-71d1-4435-8daa-aa002e67cb6e I'm not sure if it is normal or glusterfs fall in infinite loop. Is there a change that the kernel fall into dead loop? I'll study it. 2013/4/20 Brian Foster > On 04/20/2013 06:10 AM, =B7=FB=D3=C0=CC=CE wrote: > > Dear Eric, > > I have applied your latest patch and collected the following log: > > > > /var/log/message > > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() > > returned error 22 for inode 0x1b20b ag 0 agino 1b20b > > Apr 20 17:28:23 10 kernel: > > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned > > error 22 > > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called > > from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D > > 0xffffffffa02d4d0a > > Apr 20 17:28:23 10 kernel: XFS (sdb): I/O Error Detected. Shutting down > > filesystem > > Apr 20 17:28:23 10 kernel: XFS (sdb): Please umount the filesystem and > > rectify the problem(s) > > Apr 20 17:28:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > Apr 20 17:29:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > Apr 20 17:29:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > Apr 20 17:30:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > > > debugfs trace: > > > https://docs.google.com/file/d/0B7n2C4T5tfNCTlZGUVpnZENrZ3M/edit?usp=3Dsh= aring > > > > FWIW... > > <...>-6908 [001] 8739.967623: xfs_iunlink: dev 8:16 ino 0x83a8b mode > 0100000, flags 0x0 > <...>-6909 [001] 8739.970252: xfs_iunlink: dev 8:16 ino 0x83a8b mode > 0100000, flags 0x0 > > 0x83a8b and 0x1b20b both hash to unlinked list bucket 11. > > As to the rest of the trace, there appears to be a significant amount of > link activity on (directory) inode 0x83a8a (the immediately prior inode > to the inode involved in the race). The name data in the trace suggests > activity somewhere under .glusterfs. A couple questions: > > 1.) Any idea what entries point to this inode right now (e.g., how many > links on this inode) and where it resides in the fs (path)? > > 2.) Can you associate this kind of heavy remove/link pattern on a single > inode to a higher level activity? For example, if you were to watch the > trace data live, is this a normal pattern you observe? Does it only > occur when a rebalance is in progress? Or when a rebalance finishes? Any > detailed observations you can make in that regard could be helpful. > > Brian > > > Thank you. > > > > > > 2013/4/20 =B7=FB=D3=C0=CC=CE > > > > > Hi Eric, > > The xfs module is loaded from system kernel, it happens on our > > production server too (I did not touch that till now) and if the xf= s > > module is mess up the systemstap may also not working but now it > > works. As you have mentioned, strange thing is xfs shutdown always > > happens when glusterfs rebalance completes. > > > > > > 2013/4/20 Eric Sandeen > > > > > > On 4/19/13 9:03 PM, =B7=FB=D3=C0=CC=CE wrote: > > > Hi Eric, > > > I will enable them and run test again. I can only reproduce i= t > > with > > > glusterfs rebalance. Glusterfs uses a mechanism it called > > syncop to > > > unlink file. For rebalance it uses > > > syncop_unlink(glusterfs/libglusterfs/src/syncop.c). In the > > glusterfs > > > sync_task framework(glusterfs/libglusterfs/src/syncop.c) it > uses > > > "makecontext/swapcontext" > > > > > < > http://www.opengroup.org/onlinepubs/009695399/functions/makecontext.html>= . > > > Does it leads to racing unlink from different CPU core? > > > > Yep, I understand that it's rebalance. It dies when rebalance > > finishes because an > > open but unlinked file trips over the corrupted list from > > earlier, it seems. > > > > I don't know why makecontext would matter... > > > > Just to be sure, you are definitely loading the xfs module from > > the kernel you built, right, and you don't have a "priority" > > module getting loaded from elsewhere? Seems unlikely, but just > > to be sure. > > > > > Thank you. > > > > You could also add this patch to the xfs tracepoints to print > > more information about the inodes - the mode & flags. > > > > -Eric > > > > > > diff --git a/fs/xfs/linux-2.6/xfs_trace.h > > b/fs/xfs/linux-2.6/xfs_trace.h > > index e8ce644..c314b87 100644 > > --- a/fs/xfs/linux-2.6/xfs_trace.h > > +++ b/fs/xfs/linux-2.6/xfs_trace.h > > @@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(xfs_inode_class, > > TP_STRUCT__entry( > > __field(dev_t, dev) > > __field(xfs_ino_t, ino) > > + __field(__u16, mode) > > + __field(unsigned long, flags) > > ), > > TP_fast_assign( > > __entry->dev =3D VFS_I(ip)->i_sb->s_dev; > > __entry->ino =3D ip->i_ino; > > + __entry->mode =3D VFS_I(ip)->i_mode; > > + __entry->flags =3D ip->i_flags; > > ), > > - TP_printk("dev %d:%d ino 0x%llx", > > + TP_printk("dev %d:%d ino 0x%llx mode 0%o, flags 0x%lx", > > MAJOR(__entry->dev), MINOR(__entry->dev), > > - __entry->ino) > > + __entry->ino, __entry->mode, __entry->flags) > > ) > > > > #define DEFINE_INODE_EVENT(name) \ > > > > > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee7bc327c04dac97797 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brain,
Here is the file:
fin= d . -inum 539274
./crashtest/.glusterfs/indices/xattrop
[root@10.23.72.94 xfsd]# ls -lih ./crashtest/.gl= usterfs/indices/xattrop
total 0
539275 ---------- 2 root root 0 Apr 20 17:17 132ef294-71d1-4435-= 8daa-aa002e67cb6e
539275 ---------- 2 root root 0 Apr 20 17:17 xattrop-f= 3ad589a-b8dc-4416-ab84-fc9ad4033540
find . -inum 539275
./crashtest/.= glusterfs/indices/xattrop/xattrop-f3ad589a-b8dc-4416-ab84-fc9ad4033540
./crashtest/.glusterfs/indices/xattrop/132ef294-71d1-4435-8daa-aa002e67cb6e=
I'm not sure if it is normal or glusterfs fall in infinite lo= op. Is there a change that the kernel fall into dead loop?
I'll study it.


2013/4/20 Brian Foster <bfoster@redhat.com>=
On 04/20/2013 06:10 AM, = =B7=FB=D3=C0=CC=CE wrote:
> Dear Eric,
> I have applied your latest patch and collected the following log:
>
> /var/log/message
> Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp(= )
> returned error 22 for inode 0x1b20b ag 0 agino 1b20b
> Apr 20 17:28:23 10 kernel:
> Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned=
> error 22
> Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) calle= d
> from line 1184 of file fs/xfs/xfs_vnodeops.c.  Return address =3D=
> 0xffffffffa02d4d0a
> Apr 20 17:28:23 10 kernel: XFS (sdb): I/O Error Detected. Shutting dow= n
> filesystem
> Apr 20 17:28:23 10 kernel: XFS (sdb): Please umount the filesystem and=
> rectify the problem(s)
> Apr 20 17:28:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.=
> Apr 20 17:29:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.=
> Apr 20 17:29:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.=
> Apr 20 17:30:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned.=
>
> debugfs trace:
> https://docs.google.com/file/d/0B7n2= C4T5tfNCTlZGUVpnZENrZ3M/edit?usp=3Dsharing
>

FWIW...

<...>-6908  [001]  8739.967623: xfs_iunlink: dev 8:16 ino 0= x83a8b mode
0100000, flags 0x0
<...>-6909  [001]  8739.970252: xfs_iunlink: dev 8:16 ino 0= x83a8b mode
0100000, flags 0x0

0x83a8b and 0x1b20b both hash to unlinked list bucket 11.

As to the rest of the trace, there appears to be a significant amount of link activity on (directory) inode 0x83a8a (the immediately prior inode
to the inode involved in the race). The name data in the trace suggests
activity somewhere under .glusterfs. A couple questions:

1.) Any idea what entries point to this inode right now (e.g., how many
links on this inode) and where it resides in the fs (path)?

2.) Can you associate this kind of heavy remove/link pattern on a single inode to a higher level activity? For example, if you were to watch the
trace data live, is this a normal pattern you observe? Does it only
occur when a rebalance is in progress? Or when a rebalance finishes? Any detailed observations you can make in that regard could be helpful.

Brian

> Thank you.
>
>
> 2013/4/20 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>
>
>     Hi Eric,
>     The xfs module is loaded from system kernel, it happens = on our
>     production server too (I did not touch that till now) an= d if the xfs
>     module is mess up the systemstap may also not working bu= t now it
>     works. As you have mentioned, strange thing is xfs shutd= own always
>     happens when glusterfs rebalance completes.
>
>
>     2013/4/20 Eric Sandeen <sandeen@sandeen.net
>     <mailto:= sandeen@sandeen.net>>
>
>         On 4/19/13 9:03 PM, =B7=FB=D3=C0=CC=CE wro= te:
>         > Hi Eric,
>         > I will enable them and run test again= . I can only reproduce it
>         with
>         > glusterfs rebalance. Glusterfs uses a= mechanism it called
>         syncop to
>         > unlink file. For rebalance it uses >         > syncop_unlink(glusterfs/libglusterfs/= src/syncop.c). In the
>         glusterfs
>         > sync_task framework(glusterfs/libglus= terfs/src/syncop.c) it uses
>         > "makecontext/swapcontext" >         >
>         <http://www= .opengroup.org/onlinepubs/009695399/functions/makecontext.html>.
>         > Does it leads to racing unlink from d= ifferent CPU core?
>
>         Yep, I understand that it's rebalance.=  It dies when rebalance
>         finishes because an
>         open but unlinked file trips over the corr= upted list from
>         earlier, it seems.
>
>         I don't know why makecontext would mat= ter...
>
>         Just to be sure, you are definitely loadin= g the xfs module from
>         the kernel you built, right, and you don&#= 39;t have a "priority"
>         module getting loaded from elsewhere? &nbs= p;Seems unlikely, but just
>         to be sure.
>
>         > Thank you.
>
>         You could also add this patch to the xfs t= racepoints to print
>         more information about the inodes - the mo= de & flags.
>
>         -Eric
>
>
>         diff --git a/fs/xfs/linux-2.6/xfs_trace.h<= br> >         b/fs/xfs/linux-2.6/xfs_trace.h
>         index e8ce644..c314b87 100644
>         --- a/fs/xfs/linux-2.6/xfs_trace.h
>         +++ b/fs/xfs/linux-2.6/xfs_trace.h
>         @@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(= xfs_inode_class,
>                 TP_STRUCT__ent= ry(
>                     =     __field(dev_t, dev)
>                     =     __field(xfs_ino_t, ino)
>         +            = ;   __field(__u16, mode)
>         +            = ;   __field(unsigned long, flags)
>                 ),
>                 TP_fast_assign= (
>                     =     __entry->dev =3D VFS_I(ip)->i_sb->s_dev;
>                     =     __entry->ino =3D ip->i_ino;
>         +            = ;   __entry->mode =3D VFS_I(ip)->i_mode;
>         +            = ;   __entry->flags =3D ip->i_flags;
>                 ),
>         -       TP_printk("dev= %d:%d ino 0x%llx",
>         +       TP_printk("dev= %d:%d ino 0x%llx mode 0%o, flags 0x%lx",
>                     =       MAJOR(__entry->dev), MINOR(__entry->dev),
>         -            = ;     __entry->ino)
>         +            = ;     __entry->ino, __entry->mode, __entry->flags)
>          )
>
>          #define DEFINE_INODE_EVENT(name) \ >
>
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE




--
=B7=FB=D3= =C0=CC=CE
--14dae9340ee7bc327c04dac97797-- From bfoster@redhat.com Sat Apr 20 08:01:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 283A129DFA for ; Sat, 20 Apr 2013 08:01:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 18A26304067 for ; Sat, 20 Apr 2013 06:01:11 -0700 (PDT) X-ASG-Debug-ID: 1366462870-04cbb057f53f4e80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id w31bEibzAc0sW3Bj for ; Sat, 20 Apr 2013 06:01: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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3KD19QB013878 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 20 Apr 2013 09:01:09 -0400 Received: from laptop.bfoster (vpn-58-100.rdu2.redhat.com [10.10.58.100]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r3KD181e027000 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 20 Apr 2013 09:01:08 -0400 Message-ID: <517290F8.4010407@redhat.com> Date: Sat, 20 Apr 2013 08:58:32 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: =?UTF-8?B?56ym5rC45rab?= CC: Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> <51720E49.9020001@sandeen.net> <51721798.1060501@sandeen.net> <51727E32.8080306@redhat.com> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366462871 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/20/2013 07:52 AM, 符永涛 wrote: > Hi Brain, > Here is the file: > find . -inum 539274 > ./crashtest/.glusterfs/indices/xattrop > [root@10.23.72.94 xfsd]# ls -lih > ./crashtest/.glusterfs/indices/xattrop > total 0 > 539275 ---------- 2 root root 0 Apr 20 17:17 > 132ef294-71d1-4435-8daa-aa002e67cb6e > 539275 ---------- 2 root root 0 Apr 20 17:17 > xattrop-f3ad589a-b8dc-4416-ab84-fc9ad4033540 > find . -inum 539275 > ./crashtest/.glusterfs/indices/xattrop/xattrop-f3ad589a-b8dc-4416-ab84-fc9ad4033540 > ./crashtest/.glusterfs/indices/xattrop/132ef294-71d1-4435-8daa-aa002e67cb6e > I'm not sure if it is normal or glusterfs fall in infinite loop. Is > there a change that the kernel fall into dead loop? > I'll study it. > Very interesting, thank you. I don't have the full context here yet, but the short of it is that this particular indices/xattrop directory is managed by a backend translator and driven by replication. It appears to be doing some kind of transaction level tracking based on links. E.g., some quick behavioral observations: - This directory is created and an xattrop-#### file created (no size). - On starting a large sequential write from a client, I start observing a continuous sequence of xfs_link/xfs_remove operations via tracing. - The backend appears to create a link to the xattr-#### file for every replication transaction (handwave) with the name of the link referring to the gfid name of the file under write (but note again the link is not to the inode under write, but this special xattr-#### file). It then apparently removes this link on transaction completion and the process repeats. I suspect this has to do with identifying what files were under modification in the event of a crash before transaction completion, but the underlying pattern/workload is what's more important to us here for the time being... So we're seeing a heavy link related workload on a directory inode (0x83a8a) where the entries are all links to the same inode (0x83a8b). These inodes happen to be close in proximity, which may or may not be a factor. The translator that generates these link/unlink ops sits right above a generic thread pool translator, so this is multi-threaded. What isn't clear to me yet is where the xfs_iunlink() for this heavily linked inode is induced. The primary dentry remains after my file copy test, but then taking another look after a few minutes I see it removed. The same thing occurs if I gracefully restart the volume. I'm going to have to dig into that some more and also see if we can use this to narrow in on a reproducer. I'm thinking something along the lines of: - Create a directory/file. Ideally the directory and file inodes are in the same cluster. - Start a highly-threaded link-unlink workload against that file in the same directory. - Somewhere in the background unlink the main file. - Check for multiple xfs_iunlink() ops, repeat. ... the assumption being that the xfs_iunlink() race could have lead to a possible unlinked list corruption on the associated list, such that a later inactivation/xfs_iunlink_remove of some other inode in that bucket could fail. Brian > > 2013/4/20 Brian Foster > > > On 04/20/2013 06:10 AM, 符永涛 wrote: > > Dear Eric, > > I have applied your latest patch and collected the following log: > > > > /var/log/message > > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_iunlink_remove: > xfs_inotobp() > > returned error 22 for inode 0x1b20b ag 0 agino 1b20b > > Apr 20 17:28:23 10 kernel: > > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned > > error 22 > > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) > called > > from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = > > 0xffffffffa02d4d0a > > Apr 20 17:28:23 10 kernel: XFS (sdb): I/O Error Detected. Shutting > down > > filesystem > > Apr 20 17:28:23 10 kernel: XFS (sdb): Please umount the filesystem and > > rectify the problem(s) > > Apr 20 17:28:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > Apr 20 17:29:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > Apr 20 17:29:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > Apr 20 17:30:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. > > > > debugfs trace: > > > https://docs.google.com/file/d/0B7n2C4T5tfNCTlZGUVpnZENrZ3M/edit?usp=sharing > > > > FWIW... > > <...>-6908 [001] 8739.967623: xfs_iunlink: dev 8:16 ino 0x83a8b mode > 0100000, flags 0x0 > <...>-6909 [001] 8739.970252: xfs_iunlink: dev 8:16 ino 0x83a8b mode > 0100000, flags 0x0 > > 0x83a8b and 0x1b20b both hash to unlinked list bucket 11. > > As to the rest of the trace, there appears to be a significant amount of > link activity on (directory) inode 0x83a8a (the immediately prior inode > to the inode involved in the race). The name data in the trace suggests > activity somewhere under .glusterfs. A couple questions: > > 1.) Any idea what entries point to this inode right now (e.g., how many > links on this inode) and where it resides in the fs (path)? > > 2.) Can you associate this kind of heavy remove/link pattern on a single > inode to a higher level activity? For example, if you were to watch the > trace data live, is this a normal pattern you observe? Does it only > occur when a rebalance is in progress? Or when a rebalance finishes? Any > detailed observations you can make in that regard could be helpful. > > Brian > > > Thank you. > > > > > > 2013/4/20 符永涛 > >> > > > > Hi Eric, > > The xfs module is loaded from system kernel, it happens on our > > production server too (I did not touch that till now) and if > the xfs > > module is mess up the systemstap may also not working but now it > > works. As you have mentioned, strange thing is xfs shutdown always > > happens when glusterfs rebalance completes. > > > > > > 2013/4/20 Eric Sandeen > > >> > > > > On 4/19/13 9:03 PM, 符永涛 wrote: > > > Hi Eric, > > > I will enable them and run test again. I can only > reproduce it > > with > > > glusterfs rebalance. Glusterfs uses a mechanism it called > > syncop to > > > unlink file. For rebalance it uses > > > syncop_unlink(glusterfs/libglusterfs/src/syncop.c). In the > > glusterfs > > > sync_task framework(glusterfs/libglusterfs/src/syncop.c) > it uses > > > "makecontext/swapcontext" > > > > > > . > > > Does it leads to racing unlink from different CPU core? > > > > Yep, I understand that it's rebalance. It dies when rebalance > > finishes because an > > open but unlinked file trips over the corrupted list from > > earlier, it seems. > > > > I don't know why makecontext would matter... > > > > Just to be sure, you are definitely loading the xfs module > from > > the kernel you built, right, and you don't have a "priority" > > module getting loaded from elsewhere? Seems unlikely, but > just > > to be sure. > > > > > Thank you. > > > > You could also add this patch to the xfs tracepoints to print > > more information about the inodes - the mode & flags. > > > > -Eric > > > > > > diff --git a/fs/xfs/linux-2.6/xfs_trace.h > > b/fs/xfs/linux-2.6/xfs_trace.h > > index e8ce644..c314b87 100644 > > --- a/fs/xfs/linux-2.6/xfs_trace.h > > +++ b/fs/xfs/linux-2.6/xfs_trace.h > > @@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(xfs_inode_class, > > TP_STRUCT__entry( > > __field(dev_t, dev) > > __field(xfs_ino_t, ino) > > + __field(__u16, mode) > > + __field(unsigned long, flags) > > ), > > TP_fast_assign( > > __entry->dev = VFS_I(ip)->i_sb->s_dev; > > __entry->ino = ip->i_ino; > > + __entry->mode = VFS_I(ip)->i_mode; > > + __entry->flags = ip->i_flags; > > ), > > - TP_printk("dev %d:%d ino 0x%llx", > > + TP_printk("dev %d:%d ino 0x%llx mode 0%o, flags > 0x%lx", > > MAJOR(__entry->dev), MINOR(__entry->dev), > > - __entry->ino) > > + __entry->ino, __entry->mode, __entry->flags) > > ) > > > > #define DEFINE_INODE_EVENT(name) \ > > > > > > > > > > > > > > -- > > 符永涛 > > > > > > > > > > -- > > 符永涛 > > > > > -- > 符永涛 From yongtaofu@gmail.com Sat Apr 20 08:12:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 430F129DFA for ; Sat, 20 Apr 2013 08:12:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 203DC304051 for ; Sat, 20 Apr 2013 06:12:38 -0700 (PDT) X-ASG-Debug-ID: 1366463556-04cbb057f63f5ce0001-NocioJ Received: from mail-ie0-f182.google.com (mail-ie0-f182.google.com [209.85.223.182]) by cuda.sgi.com with ESMTP id q1EzENYRxpk4DoRJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 20 Apr 2013 06:12:36 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.182 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.182] Received: by mail-ie0-f182.google.com with SMTP id bn7so3501138ieb.41 for ; Sat, 20 Apr 2013 06:12:35 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.182] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.182] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=DWRD6doXUNK2HF+MtTNLOkLEKQY+xdC9znNqoeZzqn0=; b=SatxuXQYGypOIt6Sw1ftlUfliXlWHuCjvOVN1E8XwZ7F/lyXEVYDXKgHFOwEmnqphA pwa3ehOLjGU7YZ6FRyy49zLW/1T+1y4ImPNP9QXQQ2AfHLYaOjeBso5onBf1n7KHJBij uVydk6xDa84WKF5tht8sdIKMEnPnXaLstGpDgryPm6GjAbtwpU4dwjcL5ytj6Xyqs9DL cqEE1q2tHpXOkBVC5syBVQShjYAIJAXZWlgqoMlVlHnQ+aNnvyOFI3FouYl1tu8+H6d1 lYj9rljz83sbGL42eAUcUiFBrBbp+99b4l0sOdkcV24nOR48NJtlCMjJBTnEZMXC96ne 1F9w== MIME-Version: 1.0 X-Received: by 10.50.192.165 with SMTP id hh5mr4190320igc.89.1366463555868; Sat, 20 Apr 2013 06:12:35 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Sat, 20 Apr 2013 06:12:35 -0700 (PDT) In-Reply-To: <517290F8.4010407@redhat.com> References: <516C89DF.4070904@redhat.com> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> <51720E49.9020001@sandeen.net> <51721798.1060501@sandeen.net> <51727E32.8080306@redhat.com> <517290F8.4010407@redhat.com> Date: Sat, 20 Apr 2013 21:12:35 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Brian Foster Cc: Eric Sandeen , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340865d8a4a404daca966e X-Barracuda-Connect: mail-ie0-f182.google.com[209.85.223.182] X-Barracuda-Start-Time: 1366463556 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128665 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 --14dae9340865d8a4a404daca966e Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Hi Brian, Yes, this directory (./crashtest/.glusterfs/indices) is glusterfs index-base directory for glusterfs features/index xlator.The ./crashtest/.glusterfs/indices/xattrop directory is XATTROP_SUBDIR directory for glusterfs. This path can be set in glusterfs server-side volume file so before there're any progresses I'll try to isolate this issue by try to set it to a ext4 path or somewhere else. Thank you. 2013/4/20 Brian Foster > On 04/20/2013 07:52 AM, =B7=FB=D3=C0=CC=CE wrote: > > Hi Brain, > > Here is the file: > > find . -inum 539274 > > ./crashtest/.glusterfs/indices/xattrop > > [root@10.23.72.94 xfsd]# ls -lih > > ./crashtest/.glusterfs/indices/xattrop > > total 0 > > 539275 ---------- 2 root root 0 Apr 20 17:17 > > 132ef294-71d1-4435-8daa-aa002e67cb6e > > 539275 ---------- 2 root root 0 Apr 20 17:17 > > xattrop-f3ad589a-b8dc-4416-ab84-fc9ad4033540 > > find . -inum 539275 > > > ./crashtest/.glusterfs/indices/xattrop/xattrop-f3ad589a-b8dc-4416-ab84-fc= 9ad4033540 > > > ./crashtest/.glusterfs/indices/xattrop/132ef294-71d1-4435-8daa-aa002e67cb= 6e > > I'm not sure if it is normal or glusterfs fall in infinite loop. Is > > there a change that the kernel fall into dead loop? > > I'll study it. > > > > Very interesting, thank you. I don't have the full context here yet, but > the short of it is that this particular indices/xattrop directory is > managed by a backend translator and driven by replication. It appears to > be doing some kind of transaction level tracking based on links. E.g., > some quick behavioral observations: > > - This directory is created and an xattrop-#### file created (no size). > - On starting a large sequential write from a client, I start observing > a continuous sequence of xfs_link/xfs_remove operations via tracing. > - The backend appears to create a link to the xattr-#### file for every > replication transaction (handwave) with the name of the link referring > to the gfid name of the file under write (but note again the link is not > to the inode under write, but this special xattr-#### file). It then > apparently removes this link on transaction completion and the process > repeats. I suspect this has to do with identifying what files were under > modification in the event of a crash before transaction completion, but > the underlying pattern/workload is what's more important to us here for > the time being... > > So we're seeing a heavy link related workload on a directory inode > (0x83a8a) where the entries are all links to the same inode (0x83a8b). > These inodes happen to be close in proximity, which may or may not be a > factor. The translator that generates these link/unlink ops sits right > above a generic thread pool translator, so this is multi-threaded. > > What isn't clear to me yet is where the xfs_iunlink() for this heavily > linked inode is induced. The primary dentry remains after my file copy > test, but then taking another look after a few minutes I see it removed. > The same thing occurs if I gracefully restart the volume. I'm going to > have to dig into that some more and also see if we can use this to > narrow in on a reproducer. I'm thinking something along the lines of: > > - Create a directory/file. Ideally the directory and file inodes are in > the same cluster. > - Start a highly-threaded link-unlink workload against that file in the > same directory. > - Somewhere in the background unlink the main file. > - Check for multiple xfs_iunlink() ops, repeat. > > ... the assumption being that the xfs_iunlink() race could have lead to > a possible unlinked list corruption on the associated list, such that a > later inactivation/xfs_iunlink_remove of some other inode in that bucket > could fail. > > Brian > > > > > 2013/4/20 Brian Foster > > > > > On 04/20/2013 06:10 AM, =B7=FB=D3=C0=CC=CE wrote: > > > Dear Eric, > > > I have applied your latest patch and collected the following log: > > > > > > /var/log/message > > > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_iunlink_remove: > > xfs_inotobp() > > > returned error 22 for inode 0x1b20b ag 0 agino 1b20b > > > Apr 20 17:28:23 10 kernel: > > > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree > returned > > > error 22 > > > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) > > called > > > from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address =3D > > > 0xffffffffa02d4d0a > > > Apr 20 17:28:23 10 kernel: XFS (sdb): I/O Error Detected. Shuttin= g > > down > > > filesystem > > > Apr 20 17:28:23 10 kernel: XFS (sdb): Please umount the filesyste= m > and > > > rectify the problem(s) > > > Apr 20 17:28:37 10 kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > > Apr 20 17:29:07 10 kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > > Apr 20 17:29:37 10 kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > > Apr 20 17:30:07 10 kernel: XFS (sdb): xfs_log_force: error 5 > returned. > > > > > > debugfs trace: > > > > > > https://docs.google.com/file/d/0B7n2C4T5tfNCTlZGUVpnZENrZ3M/edit?usp=3Dsh= aring > > > > > > > FWIW... > > > > <...>-6908 [001] 8739.967623: xfs_iunlink: dev 8:16 ino 0x83a8b > mode > > 0100000, flags 0x0 > > <...>-6909 [001] 8739.970252: xfs_iunlink: dev 8:16 ino 0x83a8b > mode > > 0100000, flags 0x0 > > > > 0x83a8b and 0x1b20b both hash to unlinked list bucket 11. > > > > As to the rest of the trace, there appears to be a significant > amount of > > link activity on (directory) inode 0x83a8a (the immediately prior > inode > > to the inode involved in the race). The name data in the trace > suggests > > activity somewhere under .glusterfs. A couple questions: > > > > 1.) Any idea what entries point to this inode right now (e.g., how > many > > links on this inode) and where it resides in the fs (path)? > > > > 2.) Can you associate this kind of heavy remove/link pattern on a > single > > inode to a higher level activity? For example, if you were to watch > the > > trace data live, is this a normal pattern you observe? Does it only > > occur when a rebalance is in progress? Or when a rebalance finishes= ? > Any > > detailed observations you can make in that regard could be helpful. > > > > Brian > > > > > Thank you. > > > > > > > > > 2013/4/20 =B7=FB=D3=C0=CC=CE > > >> > > > > > > Hi Eric, > > > The xfs module is loaded from system kernel, it happens on ou= r > > > production server too (I did not touch that till now) and if > > the xfs > > > module is mess up the systemstap may also not working but now > it > > > works. As you have mentioned, strange thing is xfs shutdown > always > > > happens when glusterfs rebalance completes. > > > > > > > > > 2013/4/20 Eric Sandeen > > > > >> > > > > > > On 4/19/13 9:03 PM, =B7=FB=D3=C0=CC=CE wrote: > > > > Hi Eric, > > > > I will enable them and run test again. I can only > > reproduce it > > > with > > > > glusterfs rebalance. Glusterfs uses a mechanism it call= ed > > > syncop to > > > > unlink file. For rebalance it uses > > > > syncop_unlink(glusterfs/libglusterfs/src/syncop.c). In > the > > > glusterfs > > > > sync_task framework(glusterfs/libglusterfs/src/syncop.c= ) > > it uses > > > > "makecontext/swapcontext" > > > > > > > > > < > http://www.opengroup.org/onlinepubs/009695399/functions/makecontext.html>= . > > > > Does it leads to racing unlink from different CPU core? > > > > > > Yep, I understand that it's rebalance. It dies when > rebalance > > > finishes because an > > > open but unlinked file trips over the corrupted list from > > > earlier, it seems. > > > > > > I don't know why makecontext would matter... > > > > > > Just to be sure, you are definitely loading the xfs modul= e > > from > > > the kernel you built, right, and you don't have a > "priority" > > > module getting loaded from elsewhere? Seems unlikely, bu= t > > just > > > to be sure. > > > > > > > Thank you. > > > > > > You could also add this patch to the xfs tracepoints to > print > > > more information about the inodes - the mode & flags. > > > > > > -Eric > > > > > > > > > diff --git a/fs/xfs/linux-2.6/xfs_trace.h > > > b/fs/xfs/linux-2.6/xfs_trace.h > > > index e8ce644..c314b87 100644 > > > --- a/fs/xfs/linux-2.6/xfs_trace.h > > > +++ b/fs/xfs/linux-2.6/xfs_trace.h > > > @@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(xfs_inode_class= , > > > TP_STRUCT__entry( > > > __field(dev_t, dev) > > > __field(xfs_ino_t, ino) > > > + __field(__u16, mode) > > > + __field(unsigned long, flags) > > > ), > > > TP_fast_assign( > > > __entry->dev =3D VFS_I(ip)->i_sb->s_dev; > > > __entry->ino =3D ip->i_ino; > > > + __entry->mode =3D VFS_I(ip)->i_mode; > > > + __entry->flags =3D ip->i_flags; > > > ), > > > - TP_printk("dev %d:%d ino 0x%llx", > > > + TP_printk("dev %d:%d ino 0x%llx mode 0%o, flags > > 0x%lx", > > > MAJOR(__entry->dev), MINOR(__entry->dev= ), > > > - __entry->ino) > > > + __entry->ino, __entry->mode, > __entry->flags) > > > ) > > > > > > #define DEFINE_INODE_EVENT(name) \ > > > > > > > > > > > > > > > > > > > > > -- > > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > > > > > > -- > > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > --=20 =B7=FB=D3=C0=CC=CE --14dae9340865d8a4a404daca966e Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Hi Brian,
Yes, this directory (./crasht= est/.glusterfs/indices) is glusterfs index-base directory for glusterfs fea= tures/index xlator.The ./crashtest/.glusterfs/indices/xattrop directory is = XATTROP_SUBDIR directory for glusterfs. This path can be set in glusterfs s= erver-side volume file so before there're any progresses I'll try t= o isolate this issue by try to set it to a ext4 path or somewhere else.
Thank you.


2013/4/20 Brian Foster <bfoster@redhat.com>= ;
On 04/20/2013 07:52 AM, = =B7=FB=D3=C0=CC=CE wrote:
> Hi Brain,
> Here is the file:
> find . -inum 539274
> ./crashtest/.glusterfs/indices/xattrop
> [root@10.23.72.94 <ma= ilto:root@10.23.72.94> xfsd]# ls= -lih
> ./crashtest/.glusterfs/indices/xattrop
> total 0
> 539275 ---------- 2 root root 0 Apr 20 17:17
> 132ef294-71d1-4435-8daa-aa002e67cb6e
> 539275 ---------- 2 root root 0 Apr 20 17:17
> xattrop-f3ad589a-b8dc-4416-ab84-fc9ad4033540
> find . -inum 539275
> ./crashtest/.glusterfs/indices/xattrop/xattrop-f3ad589a-b8dc-4416-ab84= -fc9ad4033540
> ./crashtest/.glusterfs/indices/xattrop/132ef294-71d1-4435-8daa-aa002e6= 7cb6e
> I'm not sure if it is normal or glusterfs fall in infinite loop. I= s
> there a change that the kernel fall into dead loop?
> I'll study it.
>

Very interesting, thank you. I don't have the full context here y= et, but
the short of it is that this particular indices/xattrop directory is
managed by a backend translator and driven by replication. It appears to be doing some kind of transaction level tracking based on links. E.g.,
some quick behavioral observations:

- This directory is created and an xattrop-#### file created (no size).
- On starting a large sequential write from a client, I start observing
a continuous sequence of xfs_link/xfs_remove operations via tracing.
- The backend appears to create a link to the xattr-#### file for every
replication transaction (handwave) with the name of the link referring
to the gfid name of the file under write (but note again the link is not to the inode under write, but this special xattr-#### file). It then
apparently removes this link on transaction completion and the process
repeats. I suspect this has to do with identifying what files were under modification in the event of a crash before transaction completion, but
the underlying pattern/workload is what's more important to us here for=
the time being...

So we're seeing a heavy link related workload on a directory inode
(0x83a8a) where the entries are all links to the same inode (0x83a8b).
These inodes happen to be close in proximity, which may or may not be a
factor. The translator that generates these link/unlink ops sits right
above a generic thread pool translator, so this is multi-threaded.

What isn't clear to me yet is where the xfs_iunlink() for this heavily<= br> linked inode is induced. The primary dentry remains after my file copy
test, but then taking another look after a few minutes I see it removed. The same thing occurs if I gracefully restart the volume. I'm going to<= br> have to dig into that some more and also see if we can use this to
narrow in on a reproducer. I'm thinking something along the lines of:
- Create a directory/file. Ideally the directory and file inodes are in
the same cluster.
- Start a highly-threaded link-unlink workload against that file in the
same directory.
- Somewhere in the background unlink the main file.
- Check for multiple xfs_iunlink() ops, repeat.

... the assumption being that the xfs_iunlink() race could have lead to
a possible unlinked list corruption on the associated list, such that a
later inactivation/xfs_iunlink_remove of some other inode in that bucket could fail.

Brian

>
> 2013/4/20 Brian Foster <bfost= er@redhat.com <mailto:bfoster@= redhat.com>>
>
>     On 04/20/2013 06:10 AM, =B7=FB=D3=C0=CC=CE wrote:
>     > Dear Eric,
>     > I have applied your latest patch and collected the = following log:
>     >
>     > /var/log/message
>     > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_iunlink_r= emove:
>     xfs_inotobp()
>     > returned error 22 for inode 0x1b20b ag 0 agino 1b20= b
>     > Apr 20 17:28:23 10 kernel:
>     > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_inactive:= xfs_ifree returned
>     > error 22
>     > Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_do_force_= shutdown(0x1)
>     called
>     > from line 1184 of file fs/xfs/xfs_vnodeops.c.  = ;Return address =3D
>     > 0xffffffffa02d4d0a
>     > Apr 20 17:28:23 10 kernel: XFS (sdb): I/O Error Det= ected. Shutting
>     down
>     > filesystem
>     > Apr 20 17:28:23 10 kernel: XFS (sdb): Please umount= the filesystem and
>     > rectify the problem(s)
>     > Apr 20 17:28:37 10 kernel: XFS (sdb): xfs_log_force= : error 5 returned.
>     > Apr 20 17:29:07 10 kernel: XFS (sdb): xfs_log_force= : error 5 returned.
>     > Apr 20 17:29:37 10 kernel: XFS (sdb): xfs_log_force= : error 5 returned.
>     > Apr 20 17:30:07 10 kernel: XFS (sdb): xfs_log_force= : error 5 returned.
>     >
>     > debugfs trace:
>     >
>     https://docs.google.co= m/file/d/0B7n2C4T5tfNCTlZGUVpnZENrZ3M/edit?usp=3Dsharing
>     >
>
>     FWIW...
>
>     <...>-6908  [001]  8739.967623: xfs_iunl= ink: dev 8:16 ino 0x83a8b mode
>     0100000, flags 0x0
>     <...>-6909  [001]  8739.970252: xfs_iunl= ink: dev 8:16 ino 0x83a8b mode
>     0100000, flags 0x0
>
>     0x83a8b and 0x1b20b both hash to unlinked list bucket 11= .
>
>     As to the rest of the trace, there appears to be a signi= ficant amount of
>     link activity on (directory) inode 0x83a8a (the immediat= ely prior inode
>     to the inode involved in the race). The name data in the= trace suggests
>     activity somewhere under .glusterfs. A couple questions:=
>
>     1.) Any idea what entries point to this inode right now = (e.g., how many
>     links on this inode) and where it resides in the fs (pat= h)?
>
>     2.) Can you associate this kind of heavy remove/link pat= tern on a single
>     inode to a higher level activity? For example, if you we= re to watch the
>     trace data live, is this a normal pattern you observe? D= oes it only
>     occur when a rebalance is in progress? Or when a rebalan= ce finishes? Any
>     detailed observations you can make in that regard could = be helpful.
>
>     Brian
>
>     > Thank you.
>     >
>     >
>     > 2013/4/20 =B7=FB=D3=C0=CC=CE <yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>
>     <mailto:yongtaofu@gmail.com <mailto:yongtaofu@gmail.com>>>
>     >
>     >     Hi Eric,
>     >     The xfs module is loaded from system = kernel, it happens on our
>     >     production server too (I did not touc= h that till now) and if
>     the xfs
>     >     module is mess up the systemstap may = also not working but now it
>     >     works. As you have mentioned, strange= thing is xfs shutdown always
>     >     happens when glusterfs rebalance comp= letes.
>     >
>     >
>     >     2013/4/20 Eric Sandeen <sandeen@sandeen.net
>     <mailto:sandee= n@sandeen.net>
>     >     <mailto:sandeen@sandeen.net <mailto:sandeen@sandeen.net>>>
>     >
>     >         On 4/19/13 9:03 PM, =B7= =FB=D3=C0=CC=CE wrote:
>     >         > Hi Eric,
>     >         > I will enable them= and run test again. I can only
>     reproduce it
>     >         with
>     >         > glusterfs rebalanc= e. Glusterfs uses a mechanism it called
>     >         syncop to
>     >         > unlink file. For r= ebalance it uses
>     >         > syncop_unlink(glus= terfs/libglusterfs/src/syncop.c). In the
>     >         glusterfs
>     >         > sync_task framewor= k(glusterfs/libglusterfs/src/syncop.c)
>     it uses
>     >         > "makecontext/= swapcontext"
>     >         >
>     >
>     <http://www.opengroup.org= /onlinepubs/009695399/functions/makecontext.html>.
>     >         > Does it leads to r= acing unlink from different CPU core?
>     >
>     >         Yep, I understand that = it's rebalance.  It dies when rebalance
>     >         finishes because an
>     >         open but unlinked file = trips over the corrupted list from
>     >         earlier, it seems.
>     >
>     >         I don't know why ma= kecontext would matter...
>     >
>     >         Just to be sure, you ar= e definitely loading the xfs module
>     from
>     >         the kernel you built, r= ight, and you don't have a "priority"
>     >         module getting loaded f= rom elsewhere?  Seems unlikely, but
>     just
>     >         to be sure.
>     >
>     >         > Thank you.
>     >
>     >         You could also add this= patch to the xfs tracepoints to print
>     >         more information about = the inodes - the mode & flags.
>     >
>     >         -Eric
>     >
>     >
>     >         diff --git a/fs/xfs/lin= ux-2.6/xfs_trace.h
>     >         b/fs/xfs/linux-2.6/xfs_= trace.h
>     >         index e8ce644..c314b87 = 100644
>     >         --- a/fs/xfs/linux-2.6/= xfs_trace.h
>     >         +++ b/fs/xfs/linux-2.6/= xfs_trace.h
>     >         @@ -544,14 +544,18 @@ D= ECLARE_EVENT_CLASS(xfs_inode_class,
>     >               &n= bsp; TP_STRUCT__entry(
>     >               &n= bsp;         __field(dev_t, dev)
>     >               &n= bsp;         __field(xfs_ino_t, ino)
>     >         +       =         __field(__u16, mode)
>     >         +       =         __field(unsigned long, flags)
>     >               &n= bsp; ),
>     >               &n= bsp; TP_fast_assign(
>     >               &n= bsp;         __entry->dev =3D VFS_I(ip)->i_sb->= ;s_dev;
>     >               &n= bsp;         __entry->ino =3D ip->i_ino;
>     >         +       =         __entry->mode =3D VFS_I(ip)->i_mode;
>     >         +       =         __entry->flags =3D ip->i_flags;
>     >               &n= bsp; ),
>     >         -       = TP_printk("dev %d:%d ino 0x%llx",
>     >         +       = TP_printk("dev %d:%d ino 0x%llx mode 0%o, flags
>     0x%lx",
>     >               &n= bsp;           MAJOR(__entry->dev), MINOR(__ent= ry->dev),
>     >         -       =           __entry->ino)
>     >         +       =           __entry->ino, __entry->mode, __ent= ry->flags)
>     >          )
>     >
>     >          #define DEFINE_IN= ODE_EVENT(name) \
>     >
>     >
>     >
>     >
>     >
>     >
>     >     --
>     >     =B7=FB=D3=C0=CC=CE
>     >
>     >
>     >
>     >
>     > --
>     > =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE




--
=B7=FB=D3= =C0=CC=CE
--14dae9340865d8a4a404daca966e-- From wongpeter72@yahoo.cn Sat Apr 20 10:15:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLYTO,HTML_MESSAGE,T_FRT_CONTACT autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 29C1929DFA for ; Sat, 20 Apr 2013 10:15:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0CBB630407B for ; Sat, 20 Apr 2013 08:15:06 -0700 (PDT) X-ASG-Debug-ID: 1366470904-04cb6c6e2b2f4670001-w1Z2WR Received: from lon1-msapost-2.mail.demon.net (lon1-msapost-2.mail.demon.net [195.173.77.181]) by cuda.sgi.com with ESMTP id 66oNWrtNyCiLdkIv for ; Sat, 20 Apr 2013 08:15:05 -0700 (PDT) X-Barracuda-Envelope-From: wongpeter72@yahoo.cn X-Barracuda-Apparent-Source-IP: 195.173.77.181 Received: from adsl-hbltd.demon.co.uk ([62.49.2.13] helo=hobutpr.hobut0.primary) by lon1-post-2.mail.demon.net with esmtpsa (AUTH adsl-hbltd) (TLSv1:RC4-MD5:128) (Exim 4.69) id 1UTZVG-0001L0-cH; Sat, 20 Apr 2013 15:15:02 +0000 Received: from SERVER3.rcs.local ([63.131.69.120]) by hobutpr.hobut0.primary with Microsoft SMTPSVC(6.0.3790.3959); Sat, 20 Apr 2013 16:12:32 +0100 Content-Type: multipart/alternative; boundary="===============0052635576==" MIME-Version: 1.0 Subject: anerkennen To: Recipients X-ASG-Orig-Subj: anerkennen From: "PETER WONG" Date: Sat, 20 Apr 2013 11:14:32 -0400 Reply-To: petershun.wong@yahoo.com.hk Message-ID: X-OriginalArrivalTime: 20 Apr 2013 15:12:32.0296 (UTC) FILETIME=[7B1C1A80:01CE3DD9] X-Barracuda-Connect: lon1-msapost-2.mail.demon.net[195.173.77.181] X-Barracuda-Start-Time: 1366470905 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128673 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address You will not see this in a MIME-aware mail reader. --===============0052635576== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body anerkennen Ich habe einen gegenseitigen Gesch=E4ftsbeziehungen Vorschlag vo= n gemeinsamem Interesse mit Ihnen zu teilen; Es geht um die =DCbertragung e= iner gro=DFen Summe Geld. Ich habe Ihren Hinweis in meine Suche nach jemand= em, der mir vorgeschlagenen Gesch=E4ftsbeziehung passt. wenn Sie sind an ei= ner Zusammenarbeit mit mir interessiert sind, kontaktieren Sie mich durch m= eine Private E-Mail (petershun.wong@yahoo.com.hk) f=FCr weitere Details, Ih= re fr=FCheste Reaktion auf dieses Schreiben wird gesch=E4tzt. betrachten Pe= ter Wong --===============0052635576== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body anerkennen Ich habe einen gegenseitigen Gesch= =E4ftsbeziehungen Vorschlag von gemeinsamem Interesse mit Ihnen zu teilen; = Es geht um die =DCbertragung einer gro=DFen Summe Geld. Ich habe Ihren Hinw= eis in meine Suche nach jemandem, der mir vorgeschlagenen Gesch=E4ftsbezieh= ung passt. wenn Sie sind an einer Zusammenarbeit mit mir interessiert sind,= kontaktieren Sie mich durch meine Private E-Mail (petershun.wong@yahoo.com= .hk) f=FCr weitere Details, Ihre fr=FCheste Reaktion auf dieses Schreiben w= ird gesch=E4tzt. betrachten Peter Wong --===============0052635576==-- From sandeen@sandeen.net Sat Apr 20 10:36:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CE28229DFA for ; Sat, 20 Apr 2013 10:36:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6A46EAC001 for ; Sat, 20 Apr 2013 08:36:32 -0700 (PDT) X-ASG-Debug-ID: 1366472190-04bdf02d1d421d20001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ppMWpngkhKO7DUcl for ; Sat, 20 Apr 2013 08:36:30 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-563.local (unknown [69.38.217.3]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 238E56527C07; Sat, 20 Apr 2013 10:36:30 -0500 (CDT) Message-ID: <5172B600.6060606@sandeen.net> Date: Sat, 20 Apr 2013 08:36:32 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Brian Foster CC: =?UTF-8?B?56ym5rC45rab?= , "xfs@oss.sgi.com" Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> <51720E49.9020001@sandeen.net> <51721798.1060501@sandeen.net> <51727E32.8080306@redhat.com> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: <51727E32.8080306@redhat.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366472190 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/20/13 4:38 AM, Brian Foster wrote: > On 04/20/2013 06:10 AM, 符永涛 wrote: >> Dear Eric, >> I have applied your latest patch and collected the following log: >> >> /var/log/message >> Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_iunlink_remove: xfs_inotobp() >> returned error 22 for inode 0x1b20b ag 0 agino 1b20b >> Apr 20 17:28:23 10 kernel: >> Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_inactive: xfs_ifree returned >> error 22 >> Apr 20 17:28:23 10 kernel: XFS (sdb): xfs_do_force_shutdown(0x1) called >> from line 1184 of file fs/xfs/xfs_vnodeops.c. Return address = >> 0xffffffffa02d4d0a >> Apr 20 17:28:23 10 kernel: XFS (sdb): I/O Error Detected. Shutting down >> filesystem >> Apr 20 17:28:23 10 kernel: XFS (sdb): Please umount the filesystem and >> rectify the problem(s) >> Apr 20 17:28:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. >> Apr 20 17:29:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. >> Apr 20 17:29:37 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. >> Apr 20 17:30:07 10 kernel: XFS (sdb): xfs_log_force: error 5 returned. >> >> debugfs trace: >> https://docs.google.com/file/d/0B7n2C4T5tfNCTlZGUVpnZENrZ3M/edit?usp=sharing >> > > FWIW... > > <...>-6908 [001] 8739.967623: xfs_iunlink: dev 8:16 ino 0x83a8b mode > 0100000, flags 0x0 > <...>-6909 [001] 8739.970252: xfs_iunlink: dev 8:16 ino 0x83a8b mode > 0100000, flags 0x0 Interesting, this time it was on the same CPU [001] I'd hoped that we'd see this same inode in some of the new tracepoints but we don't, I'm not sure why; perhaps it overflowed the trace buffer? > 0x83a8b and 0x1b20b both hash to unlinked list bucket 11. which is why the error triggered on 0x1b20b, since the list is now corrupt. -Eric From training@gv-me.com Sat Apr 20 13:46:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 00E0929DFA for ; Sat, 20 Apr 2013 13:46:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D0B668F8039 for ; Sat, 20 Apr 2013 11:46:35 -0700 (PDT) X-ASG-Debug-ID: 1366483586-04cbb057f740ef90001-w1Z2WR Received: from crm.gv-me.com (crm.gv-me.com [41.38.8.218]) by cuda.sgi.com with SMTP id iDgwXvMKQOAfhS7E for ; Sat, 20 Apr 2013 11:46:27 -0700 (PDT) X-Barracuda-Envelope-From: training@gv-me.com X-Barracuda-Apparent-Source-IP: 41.38.8.218 Received: from MonaAllamPC ([192.168.1.2]) by crm.gv-me.com ; Sat, 20 Apr 2013 18:14:22 +0200 From: "IT Management Training" To: Subject: Reminder: ITIL Expert Program in Riyadh Date: Sat, 20 Apr 2013 18:14:22 +0200 X-ASG-Orig-Subj: Reminder: ITIL Expert Program in Riyadh Message-ID: <152e101ce3de2$1e53e180$5afba480$@gv-me.com> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_152E2_01CE3DF2.E1DEFB70" X-Mailer: Microsoft Outlook 14.0 Content-Language: en-us Thread-Index: Ac494h5DWCrMiMaKTIKo56phOKdJEw== X-Barracuda-Connect: crm.gv-me.com[41.38.8.218] X-Barracuda-Start-Time: 1366483587 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128687 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 HTML_MESSAGE BODY: HTML included in message This is a multipart message in MIME format. ------=_NextPart_000_152E2_01CE3DF2.E1DEFB70 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Greetings. It is our pleasure to announce for the ITIL Expert - Lifecycle Track courses and exams in Riyadh, Saudi Arabia. The courses will be conducted at evening sessions starting from 27th April 2013 till 22nd August 2013, as per the below schedule: Code Course Name Start Date End Date Register in Single Course ITILF ITIL Foundation 27/4/2013 1/5/2013 Register in ITILF LSS ITIL Service Strategy 4/5/2013 8/5/2013 Register in LSS LSD ITIL Service Design 18/5/2013 22/5/2013 Register in LSD LST ITIL Service Transition 1/6/2013 5/6/2013 Register in LST LSO ITIL Service Operation 15/6/2013 19/6/2013 Register in LSO LCSI ITIL Continual Service Improvement 29/6/2013 3/7/2013 Register in LCSI MLC ITIL Managing Across Lifecycle 17/8/2013 22/8/2013 Register in MLC All the courses will be conducted in a 5-stars hotel in Riyadh, Saudi Arabia. The whole program will cost 7,500$ instead of 9,500$, and the program without the Foundation course and exam will cost 7,000$ instead of 9,000$. Candidates can register for the whole track with/without the Foundation, or register for individual courses. Another Fast-Track program for three weeks (Full-Day sessions) will be conducted in parallel with the above program starting from 1st June 2013 till 3rd July 2013, for more details about that program and for the group discounts please contact us or register for fast track. For more details about the courses and exams, you can contact the responsible people at the following direct contacts: 0560006615 / 0569019937. Best regards, Global-Vision - Middle East Tel: +966 (1) 291-3900 Fax: +966 (1) 474-8503 Email: Training@gv-me.com To unsubscribe from our mail list, Click here ------=_NextPart_000_152E2_01CE3DF2.E1DEFB70 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Greetings…

It is our pleasure to announce for the = ITIL Expert - Lifecycle Track courses and exams in Riyadh, Saudi = Arabia. The courses will be conducted at evening sessions starting from = 27th April 2013 till 22nd August 2013, as per the = below schedule:

Code

Course = Name

Start = Date

End = Date

Register in Single = Course

ITILF

ITIL = Foundation

27/4/2013

1/5/2013

Register in = ITILF

LSS

ITIL Service = Strategy

4/5/2013

8/5/2013

Register in = LSS

LSD

ITIL Service = Design

18/5/2013

22/5/2013

Register in = LSD

LST

ITIL Service = Transition

1/6/2013

5/6/2013

Register in = LST

LSO

ITIL Service = Operation

15/6/2013

19/6/2013

Register in = LSO

LCSI

ITIL Continual Service = Improvement

29/6/2013

3/7/2013

Register in = LCSI

MLC

ITIL Managing Across = Lifecycle

17/8/2013

22/8/2013

Register in = MLC

All the courses will be conducted in a = 5-stars hotel in Riyadh, Saudi Arabia.

The whole program will = cost 7,500$ instead of 9,500$, and the program without the Foundation = course and exam will cost 7,000$ instead of 9,000$.

Candidates can register for the whole track with/without the = Foundation, or register for individual = courses.

Another Fast-Track = program for three weeks (Full-Day sessions) will be conducted in = parallel with the above program starting from 1st June 2013 = till 3rd July 2013, for more details about that program and = for the group discounts please contact = us or register for = fast track.

For more details about the courses and exams, = you can contact the responsible people at the following direct contacts: = 0560006615 / 0569019937.

Best regards,

Global-Vision - Middle = East

Tel: +966 (1) 291-3900

Fax: +966 (1) 474-8503

Email: Training@gv-me.co= m =

 

To unsubscribe from our mail = list, Click here

 

------=_NextPart_000_152E2_01CE3DF2.E1DEFB70-- From elder@inktank.com Sat Apr 20 14:14:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9F6B629DFA for ; Sat, 20 Apr 2013 14:14:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7C77E304051 for ; Sat, 20 Apr 2013 12:14:45 -0700 (PDT) X-ASG-Debug-ID: 1366485280-04cb6c6e2b307290001-NocioJ Received: from mail-ie0-f170.google.com (mail-ie0-f170.google.com [209.85.223.170]) by cuda.sgi.com with ESMTP id yyEZXVyDpQCOXpiC (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 20 Apr 2013 12:14:40 -0700 (PDT) X-Barracuda-Envelope-From: elder@inktank.com X-Barracuda-Apparent-Source-IP: 209.85.223.170 Received: by mail-ie0-f170.google.com with SMTP id at1so2215944iec.1 for ; Sat, 20 Apr 2013 12:14:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :references:in-reply-to:content-type:content-transfer-encoding :x-gm-message-state; bh=ksCnfYRQQ2BNHkxabMpoldzXgbhWz9+YBMJyi5uIyWY=; b=SEt3D/gpRmvvUJxWrQtNKB2dD6nzV5GXP0uYvfepJYOoFdcsCFPKEMxFLgxT0qq5MH mu+XJtKZLni34sNuTj10/5s63lRZRVnMomNj94MKS9y9QT5kX5HC8qypYLx3idixmfvQ 4PrmTQ3usPowTEx9OtWyyxL9fNQ3AiXxJZLLPKsrlYhb/InEYEQpHKQakWw2MMtIYigV uX2woAblSc0IIBHtWMxf9sG58xZB/n4AE5+TkDNFtKGexwQdgQx1x3/RNhe1pdgGF5Zb 64skuvWGRDQmIVNMZUR0vY9Xx9g7tZ8LAfIPmUVWlLNzWLg5iyga7TQScvwbKelT/gW2 6QyA== X-Received: by 10.50.202.6 with SMTP id ke6mr4659416igc.30.1366485280378; Sat, 20 Apr 2013 12:14:40 -0700 (PDT) Received: from [172.22.22.4] (c-71-195-31-37.hsd1.mn.comcast.net. [71.195.31.37]) by mx.google.com with ESMTPS id c14sm9282502ign.2.2013.04.20.12.14.38 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 20 Apr 2013 12:14:39 -0700 (PDT) Message-ID: <5172E91F.7040107@inktank.com> Date: Sat, 20 Apr 2013 14:14:39 -0500 From: Alex Elder User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130329 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: Deprecating xfs_check References: <1365716708.3762.32154.camel@chandra-dt.ibm.com> <20130411221754.GI22182@sgi.com> <516740B8.4030704@sgi.com> <20130412010407.GE31207@dastard> <1366133266.3762.32211.camel@chandra-dt.ibm.com> X-ASG-Orig-Subj: Re: Deprecating xfs_check In-Reply-To: <1366133266.3762.32211.camel@chandra-dt.ibm.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Gm-Message-State: ALoCoQndah0EWGGqgm2NN0eqRgRD+Qmx2l0Cy5hf/PXwkuGHdkcRiJ7DMj6DZ5KOYgxIK0UMdDSm X-Barracuda-Connect: mail-ie0-f170.google.com[209.85.223.170] X-Barracuda-Start-Time: 1366485280 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128689 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/16/2013 12:27 PM, Chandra Seetharaman wrote: > Hello All, > > While trying to replace xfs_check with xfs_repair -n in xfstests, I > found that xfs_check is quiet if all is well, and prints information > only if something is wrong. But, xfs_repair -n always prints information > on different phases etc., > > What should be our approach ? > 1. add a -q option to xfs_repair, which prints no message at all > 2. add a -q option, and it will be quiet, but is valid only if -n > is specified. > 3. Leave it as is. Since users have to change their scripts anyways to > replace xfs_check, they can as well change the logic around the > output. I like option 1 the best. But any of them is reasonable. -Alex > Please suggest. > > Regards, > > Chandra . . . From yongtaofu@gmail.com Sat Apr 20 18:52:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1837A29DFA for ; Sat, 20 Apr 2013 18:52:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E8CF68F8035 for ; Sat, 20 Apr 2013 16:52:19 -0700 (PDT) X-ASG-Debug-ID: 1366501938-04cbb057f7421f00001-NocioJ Received: from mail-ie0-f172.google.com (mail-ie0-f172.google.com [209.85.223.172]) by cuda.sgi.com with ESMTP id PXmwOOhmZ35mqsDK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 20 Apr 2013 16:52:18 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.172] Received: by mail-ie0-f172.google.com with SMTP id c12so1976762ieb.31 for ; Sat, 20 Apr 2013 16:52:18 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:content-type; bh=ShHiYrf3rymu0fE/ulwL66CENXPuBsETNkAi8WLupA4=; b=YGYljgNbxJy7eww5B+fBMbIOW8TBacgAx11H0BOoAtfN+obPd6E+G71PyysNhSIUCZ cAQYaaCdOe4DZh35bE57wv+UVTkhickDCXiILUkf25UkS2Pe08WHM16hphmXCbcwm89D bAvmeSHbQcBFAE7WVycrWnKPBs7kGALF+7KyBvRERvU9adH53U+yFEaiSA4ZA9574hg4 lgqiT5trVPrMN9LS6cCkkllXYiw+LnDQ1XDEqAcAu8xPuMIavFf5kZdR9DWkcZSJfb3H 7jqZaZ60mU+kmpy4x1+joyr+9JDjayguTkV2c080wQtrkkX3pBrngdxNgmKCzHZ24cLb Fp0w== MIME-Version: 1.0 X-Received: by 10.50.107.4 with SMTP id gy4mr18392548igb.89.1366501938222; Sat, 20 Apr 2013 16:52:18 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Sat, 20 Apr 2013 16:52:17 -0700 (PDT) In-Reply-To: <5172B73C.6000900@sandeen.net> References: <516C89DF.4070904@redhat.com> <51716DCB.4060407@sandeen.net> <5171790C.70400@sandeen.net> <51720E49.9020001@sandeen.net> <51721798.1060501@sandeen.net> <5172B73C.6000900@sandeen.net> Date: Sun, 21 Apr 2013 07:52:17 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen , "xfs@oss.sgi.com" , Brian Foster , Dave Chinner Content-Type: multipart/alternative; boundary=047d7b10d1b79cdc5f04dad38617 X-Barracuda-Connect: mail-ie0-f172.google.com[209.85.223.172] X-Barracuda-Start-Time: 1366501938 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128709 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 --047d7b10d1b79cdc5f04dad38617 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Dear Brian and Eric and xfs experts, Thank you very much for helping to address the issue. With your help I am now able to isolate this problem, I point the glusterfs volume indices directory out of xfs filesystem(to a ext4 path) and the shutdown not happens again. Since this directory is not where glusterfs store data it is just index directory containing some kind of flag files it's ok to set it to somewhere else. I'll run more test with this configuration. Seems glusterfs aggressively call link/remove on the directory and files under it leads to racing. When I move this directory to a ext4 path, after rebalance the directory status is as following: /data/testbug/.glusterfs: total 12K drwxr-xr-x 3 root root 4.0K Apr 20 22:00 . drwxr-xr-x 3 root root 4.0K Apr 20 22:00 .. drwxr-xr-x 3 root root 4.0K Apr 20 23:05 indices /data/testbug/.glusterfs/indices: total 12K drwxr-xr-x 3 root root 4.0K Apr 20 23:05 . drwxr-xr-x 3 root root 4.0K Apr 20 22:00 .. drw------- 2 root root 4.0K Apr 20 23:44 xattrop /data/testbug/.glusterfs/indices/xattrop: total 8.0K drw------- 2 root root 4.0K Apr 20 23:44 . drwxr-xr-x 3 root root 4.0K Apr 20 23:05 .. ---------- 21 root root 0 Apr 20 23:05 2ea59fab-da86-4ccd-a6d3-20ca80d30e8c ---------- 21 root root 0 Apr 20 23:05 33e96373-7fe1-4c09-969e-f01c45ac445e ---------- 21 root root 0 Apr 20 23:05 35341482-c561-4fdd-b505-61c4e189f63c ---------- 21 root root 0 Apr 20 23:05 390e8676-b18a-4769-9e26-ebc47385d022 ---------- 21 root root 0 Apr 20 23:05 4f153df5-0101-4375-bb3d-1c94a2ca5c69 ---------- 21 root root 0 Apr 20 23:05 58867dfa-d4b1-47fb-9a54-f3cda0411297 ---------- 21 root root 0 Apr 20 23:05 7608e535-6de4-40ba-bb63-aba986d77c6a ---------- 21 root root 0 Apr 20 23:05 7f71f1a0-4463-4fdd-b3b8-0ca73b282520 ---------- 21 root root 0 Apr 20 23:05 82cfa2b8-0604-4f7c-bf18-5db47a4cc727 ---------- 21 root root 0 Apr 20 23:05 8ea1dc4b-801a-49fb-bff2-7579826f5942 ---------- 21 root root 0 Apr 20 23:05 9cc746a7-5b47-4b6a-990f-99f378b787bf ---------- 21 root root 0 Apr 20 23:05 aa1cbfb7-5661-4faf-a3e5-7607a2a2b884 ---------- 21 root root 0 Apr 20 23:05 b23c5c1d-1076-43eb-a527-01970d5565ab ---------- 21 root root 0 Apr 20 23:05 b336fb93-82a5-45e8-bacc-66a270a12f3f ---------- 21 root root 0 Apr 20 23:05 bc0ada39-a479-4f29-949c-b8b110291699 ---------- 21 root root 0 Apr 20 23:05 c7bd2930-3605-47bc-afc7-67254c8309b0 ---------- 21 root root 0 Apr 20 23:05 ce517ec5-079a-41d6-b3f6-6b06cc88ace5 ---------- 21 root root 0 Apr 20 23:05 d6d949e2-df27-4428-b4bf-5e589c224fec ---------- 21 root root 0 Apr 20 23:05 fc96f94f-4da0-4003-beca-91738e902c03 ---------- 21 root root 0 Apr 20 23:05 fe7a2f27-a98a-4958-9024-85bf8671e612 ---------- 21 root root 0 Apr 20 23:05 xattrop-bcb327ae-e265-4cd3-b6d4-9babff815ee7 2013/4/20 Eric Sandeen > On 4/20/13 3:10 AM, =B7=FB=D3=C0=CC=CE wrote: > > Dear Eric, > > I have applied your latest patch and collected the following log: > > > > If you like, I think you could drop the below patch again; it didn't yiel= d > anything interesting and just makes for bigger trace logs. > > Every mode was 0100000 (S_ISREG / regular file) and flags were always 0. > > > You could also add this patch to the xfs tracepoints to print > more information about the inodes - the mode & flags. > > > > -Eric > > > > > > diff --git a/fs/xfs/linux-2.6/xfs_trace.h > b/fs/xfs/linux-2.6/xfs_trace.h > > index e8ce644..c314b87 100644 > > --- a/fs/xfs/linux-2.6/xfs_trace.h > > +++ b/fs/xfs/linux-2.6/xfs_trace.h > > @@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(xfs_inode_class, > > TP_STRUCT__entry( > > __field(dev_t, dev) > > __field(xfs_ino_t, ino) > > + __field(__u16, mode) > > + __field(unsigned long, flags) > > ), > > TP_fast_assign( > > __entry->dev =3D VFS_I(ip)->i_sb->s_dev; > > __entry->ino =3D ip->i_ino; > > + __entry->mode =3D VFS_I(ip)->i_mode; > > + __entry->flags =3D ip->i_flags; > > ), > > - TP_printk("dev %d:%d ino 0x%llx", > > + TP_printk("dev %d:%d ino 0x%llx mode 0%o, flags 0x%lx", > > MAJOR(__entry->dev), MINOR(__entry->dev), > > - __entry->ino) > > + __entry->ino, __entry->mode, __entry->flags) > > ) > > > > #define DEFINE_INODE_EVENT(name) \ > > > > > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > > > > > > > > > -- > > =B7=FB=D3=C0=CC=CE > > --=20 =B7=FB=D3=C0=CC=CE --047d7b10d1b79cdc5f04dad38617 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Dear Brian and Eric and xfs experts,
Th= ank you very much for helping to address the issue. With your help I am now= able to isolate this problem, I point the glusterfs volume indices directo= ry out of xfs filesystem(to a ext4 path) and the shutdown not happens again= . Since this directory is not where glusterfs store data it is just index d= irectory containing some kind of flag files it's ok to set it to somewh= ere else. I'll run more test with this configuration.

Seems glusterfs aggressively call link/remove on the directory an= d files under it leads to racing. When I move this directory to a ext4 path= , after rebalance the directory status is as following:

/data/testbu= g/.glusterfs:
total 12K
drwxr-xr-x 3 root root 4.0K Apr 20 22:00 .
drwxr-xr-x 3 roo= t root 4.0K Apr 20 22:00 ..
drwxr-xr-x 3 root root 4.0K Apr 20 23:05 ind= ices

/data/testbug/.glusterfs/indices:
total 12K
drwxr-xr-x 3 = root root 4.0K Apr 20 23:05 .
drwxr-xr-x 3 root root 4.0K Apr 20 22:00 ..
drw------- 2 root root 4.0K = Apr 20 23:44 xattrop

/data/testbug/.glusterfs/indices/xattrop:
to= tal 8.0K
drw-------  2 root root 4.0K Apr 20 23:44 .
drwxr-xr-x&= nbsp; 3 root root 4.0K Apr 20 23:05 ..
---------- 21 root root    0 Apr 20 23:05 2ea59fab-da86-4ccd= -a6d3-20ca80d30e8c
---------- 21 root root    0 Apr 20 23= :05 33e96373-7fe1-4c09-969e-f01c45ac445e
---------- 21 root root &n= bsp;  0 Apr 20 23:05 35341482-c561-4fdd-b505-61c4e189f63c
---------- 21 root root    0 Apr 20 23:05 390e8676-b18a-4769= -9e26-ebc47385d022
---------- 21 root root    0 Apr 20 23= :05 4f153df5-0101-4375-bb3d-1c94a2ca5c69
---------- 21 root root &n= bsp;  0 Apr 20 23:05 58867dfa-d4b1-47fb-9a54-f3cda0411297
---------- 21 root root    0 Apr 20 23:05 7608e535-6de4-40ba= -bb63-aba986d77c6a
---------- 21 root root    0 Apr 20 23= :05 7f71f1a0-4463-4fdd-b3b8-0ca73b282520
---------- 21 root root &n= bsp;  0 Apr 20 23:05 82cfa2b8-0604-4f7c-bf18-5db47a4cc727
---------- 21 root root    0 Apr 20 23:05 8ea1dc4b-801a-49fb= -bff2-7579826f5942
---------- 21 root root    0 Apr 20 23= :05 9cc746a7-5b47-4b6a-990f-99f378b787bf
---------- 21 root root &n= bsp;  0 Apr 20 23:05 aa1cbfb7-5661-4faf-a3e5-7607a2a2b884
---------- 21 root root    0 Apr 20 23:05 b23c5c1d-1076-43eb= -a527-01970d5565ab
---------- 21 root root    0 Apr 20 23= :05 b336fb93-82a5-45e8-bacc-66a270a12f3f
---------- 21 root root &n= bsp;  0 Apr 20 23:05 bc0ada39-a479-4f29-949c-b8b110291699
---------- 21 root root    0 Apr 20 23:05 c7bd2930-3605-47bc= -afc7-67254c8309b0
---------- 21 root root    0 Apr 20 23= :05 ce517ec5-079a-41d6-b3f6-6b06cc88ace5
---------- 21 root root &n= bsp;  0 Apr 20 23:05 d6d949e2-df27-4428-b4bf-5e589c224fec
---------- 21 root root    0 Apr 20 23:05 fc96f94f-4da0-4003= -beca-91738e902c03
---------- 21 root root    0 Apr 20 23= :05 fe7a2f27-a98a-4958-9024-85bf8671e612
---------- 21 root root &n= bsp;  0 Apr 20 23:05 xattrop-bcb327ae-e265-4cd3-b6d4-9babff815ee7




2013/4/20 Eric Sandeen <sandeen@sandeen.net&g= t;
On 4/20/13 3:10 AM, =B7=FB= =D3=C0=CC=CE wrote:
> Dear Eric,
> I have applied your latest patch and collected the following log:
>

If you like, I think you could drop the below patch again; it didn= 9;t yield anything interesting and just makes for bigger trace logs.

Every mode was 0100000 (S_ISREG / regular file) and flags were always 0.

>         You could also add this patch to the xfs t= racepoints to print more information about the inodes - the mode & flag= s.
>
>         -Eric
>
>
>         diff --git a/fs/xfs/linux-2.6/xfs_trace.h = b/fs/xfs/linux-2.6/xfs_trace.h
>         index e8ce644..c314b87 100644
>         --- a/fs/xfs/linux-2.6/xfs_trace.h
>         +++ b/fs/xfs/linux-2.6/xfs_trace.h
>         @@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(= xfs_inode_class,
>                 TP_STRUCT__ent= ry(
>                     =     __field(dev_t, dev)
>                     =     __field(xfs_ino_t, ino)
>         +            = ;   __field(__u16, mode)
>         +            = ;   __field(unsigned long, flags)
>                 ),
>                 TP_fast_assign= (
>                     =     __entry->dev =3D VFS_I(ip)->i_sb->s_dev;
>                     =     __entry->ino =3D ip->i_ino;
>         +            = ;   __entry->mode =3D VFS_I(ip)->i_mode;
>         +            = ;   __entry->flags =3D ip->i_flags;
>                 ),
>         -       TP_printk("dev= %d:%d ino 0x%llx",
>         +       TP_printk("dev= %d:%d ino 0x%llx mode 0%o, flags 0x%lx",
>                     =       MAJOR(__entry->dev), MINOR(__entry->dev),
>         -            = ;     __entry->ino)
>         +            = ;     __entry->ino, __entry->mode, __entry->flags)
>          )
>
>          #define DEFINE_INODE_EVENT(name) \ >
>
>
>
>
>
>     --
>     =B7=FB=D3=C0=CC=CE
>
>
>
>
> --
> =B7=FB=D3=C0=CC=CE




--
=B7=FB=D3= =C0=CC=CE
--047d7b10d1b79cdc5f04dad38617-- From sandeen@sandeen.net Sun Apr 21 00:55:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 050987F37 for ; Sun, 21 Apr 2013 00:55:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D8F54304051 for ; Sat, 20 Apr 2013 22:55:08 -0700 (PDT) X-ASG-Debug-ID: 1366523704-04cb6c3c68e6d00001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id XWuvK0FUO8Nrqj8P for ; Sat, 20 Apr 2013 22:55:04 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 61A736527BE0; Sun, 21 Apr 2013 00:55:04 -0500 (CDT) Message-ID: <51737F3D.9070303@sandeen.net> Date: Sun, 21 Apr 2013 00:55:09 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: rjohnston@sgi.com CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: xfs_quota allow user or group names beginning with digits References: <20130417183323.465181485@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: xfs_quota allow user or group names beginning with digits In-Reply-To: <20130417183323.465181485@sgi.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366523704 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 4/17/13 1:32 PM, rjohnston@sgi.com wrote: > > > xfs_quota does not properly parse users or groups that begin with a number. > Only call atoi when user or group consists of digits only. > > Signed-off-by: Rich Johnston Seems sane to me. I'd change i=0 to i = 0, but *shrug* [xfsprogs]$ grep -r "i = 0" * | wc -l 404 [xfsprogs]$ grep -r "i=0" * | wc -l 10 Other than that, Reviewed-by: Eric Sandeen > --- > include/input.h | 1 + > libxcmd/input.c | 12 ++++++++++++ > quota/quota.c | 4 ++-- > quota/quota.h | 1 + > 4 files changed, 16 insertions(+), 2 deletions(-) > > Index: b/include/input.h > =================================================================== > --- a/include/input.h > +++ b/include/input.h > @@ -46,6 +46,7 @@ extern void timestr(struct timeval *tv, > extern uid_t uid_from_string(char *user); > extern gid_t gid_from_string(char *group); > extern prid_t prid_from_string(char *project); > +extern boolean_t isdigits_only(const char *str); > > #define HAVE_FTW_H 1 /* TODO: configure me */ > > Index: b/libxcmd/input.c > =================================================================== > --- a/libxcmd/input.c > +++ b/libxcmd/input.c > @@ -398,6 +398,18 @@ gid_from_string( > return -1; > } > > +boolean_t isdigits_only( > + const char *str) > +{ > + int i; > + > + for (i=0; i < strlen(str); i++) { > + if (!isdigit(str[i])) > + return B_FALSE; > + } > + return B_TRUE; > +} > + > #define HAVE_FTW_H 1 /* TODO: configure me */ > > #ifndef HAVE_FTW_H > Index: b/quota/quota.c > =================================================================== > --- a/quota/quota.c > +++ b/quota/quota.c > @@ -224,7 +224,7 @@ quota_user_type( > uid_t id; > > if (name) { > - if (isdigit(name[0])) { > + if (isdigits_only(name)) { > id = atoi(name); > name = getusername(id, flags & NO_LOOKUP_FLAG); > } else if ((u = getpwnam(name))) { > @@ -273,7 +273,7 @@ quota_group_type( > int i, ngroups, dofree = 0; > > if (name) { > - if (isdigit(name[0])) { > + if (isdigits_only(name)) { > gid = atoi(name); > name = getgroupname(gid, flags & NO_LOOKUP_FLAG); > } else { > Index: b/quota/quota.h > =================================================================== > --- a/quota/quota.h > +++ b/quota/quota.h > @@ -80,4 +80,5 @@ enum { > extern char *uid_to_name(__uint32_t __uid); > extern char *gid_to_name(__uint32_t __gid); > extern char *prid_to_name(__uint32_t __prid); > +extern boolean_t isdigits_only(const char *); > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@redhat.com Sun Apr 21 01:27:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 03E4F29DFA for ; Sun, 21 Apr 2013 01:27:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C9EA3304032 for ; Sat, 20 Apr 2013 23:27:24 -0700 (PDT) X-ASG-Debug-ID: 1366525640-04bdf01d632466d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UAv04SUqOK0iB9E4 for ; Sat, 20 Apr 2013 23:27:21 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3L6RKV9013792 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sun, 21 Apr 2013 02:27:20 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r3L6RJlU015073 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 21 Apr 2013 02:27:20 -0400 Message-ID: <517386CC.8010406@redhat.com> Date: Sun, 21 Apr 2013 01:27:24 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss , linux-btrfs Subject: [PATCH] xfstests: remove recursive include in filter.btrfs X-Enigmail-Version: 1.5.1 X-ASG-Orig-Subj: [PATCH] xfstests: remove recursive include in filter.btrfs Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366525640 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Not sure how this happened, but filter.btrfs including itself leads to immense sadness for any file that includes it. (I got a segfault when I tried to run 307) Signed-off-by: Eric Sandeen --- diff --git a/common/filter.btrfs b/common/filter.btrfs index b1aa733..99d04a6 100644 --- a/common/filter.btrfs +++ b/common/filter.btrfs @@ -1,7 +1,5 @@ # Filters for btrfs command output -. ./common/filter.btrfs - # Some, but not all, commands emit "Btrfs " _filter_btrfs_version() { From service-client@espriv05.com Sun Apr 21 03:05:35 2013 Return-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.7 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,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 007CC29DFA for ; Sun, 21 Apr 2013 03:05:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E2255304071 for ; Sun, 21 Apr 2013 01:05:31 -0700 (PDT) X-ASG-Debug-ID: 1366531525-04cbb057f64390d0001-NocioJ Received: from s2.espriv05.com (s2.espriv05.com [178.32.20.8]) by cuda.sgi.com with ESMTP id REWrCYZcAGNC3Q9X for ; Sun, 21 Apr 2013 01:05:26 -0700 (PDT) X-Barracuda-Envelope-From: service-client@espriv05.com X-Barracuda-Apparent-Source-IP: 178.32.20.8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=espriv05.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@espriv05.com; bh=SCTpr+l9cupJsxuwiNMpwRLW6EOtx8tzW5dJTxA4gxg=; b=iSBHNpUP2QQjSKQnHekQrhuqfOpGOfULUOs5dyov9FStJ9iax9aEKlGkfca6qfGs8N0qekfuRWUw Qz/UdGj5AC4wzTRep2oUWhkU6HfyKEcNd4+ftR3l1zQYOKeoI36Jn9ZLgnnh/3XYkictVQpClOcG Uk2pDtkFyMF4NhHxxNk= From: Westwing X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 39683 X-EN-uuid: 1005-100539683-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Ventes exclusives de mobilier design MIME-Version: 1.0 X-ASG-Orig-Subj: Ventes exclusives de mobilier design List-Unsubscribe: http://track.espriv05.com/ObfAzMstPK94GsucBkT1LTyovbCH1EjcJWdvFy6ECZk.html, Content-Type: multipart/alternative; boundary=2fa48b7fe2bb1db6e8c7eef090cfd19f Message-ID: <0.0.2.122.1CE3E668196FD34.0@s2.espriv05.com> Date: Sun, 21 Apr 2013 10:02:02 +0200 X-Barracuda-Connect: s2.espriv05.com[178.32.20.8] X-Barracuda-Start-Time: 1366531525 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.42 X-Barracuda-Spam-Status: No, SCORE=0.42 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128737 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MIME_HTML_MOSTLY BODY: Multipart message mostly text/html MIME 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary --2fa48b7fe2bb1db6e8c7eef090cfd19f Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --2fa48b7fe2bb1db6e8c7eef090cfd19f Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit Westwing - Newsletter

Westwing - économisez jusqu à 70% - Mobilier et accessoires de style

Bonjour
Connaissez-vous déjà Westwing ?

Le 1er Club de shopping en France pour l'univers de la maison vous propose chaque jour des ventes exclusives pour des meubles chics et des accessoires d'intérieur.

Inspirez-vous grâce aux idées des Designers et aux marques que nous sélectionnons avec soin pour vous et économisez jusqu'à 70% grâce à Westwing.

Westwing - Chaque jour de nouvelles ventes-évènements
Découvrez Westwing dès maintenant!


» Obtenez votre bon d'achat de 15 euros «

Procurez-vous d'attractifs produits et bénéficiez chaque jour d'une expérience de shopping exclusive !

L'inscription est gratuite et ne vous oblige d'aucune manière à réaliser un achat

Vos avantages: des ventes-évènements attract
 ives chaque jour. des prix de vente réduits jusqu à 70% par rapport au PVC. Exclusif pour les membres

Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From tinguely@sgi.com Sun Apr 21 12:54:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 37F7029DFA for ; Sun, 21 Apr 2013 12:54:44 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2037D8F804C for ; Sun, 21 Apr 2013 10:54:41 -0700 (PDT) Received: from eagdhcp-232-136.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-136.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r3LHsjSk002092 for ; Sun, 21 Apr 2013 12:54:45 -0500 (CDT) (envelope-from tinguely@sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-136.americas.sgi.com (8.14.5/8.14.5/Submit) id r3LHsiEI002091; Sun, 21 Apr 2013 12:54:44 -0500 (CDT) (envelope-from tinguely@sgi.com) X-Authentication-Warning: eagdhcp-232-136.americas.sgi.com: tinguely set sender to tinguely@sgi.com using -f Message-Id: <20130421174107.007313126@sgi.com> User-Agent: quilt/0.51-1 Date: Sun, 21 Apr 2013 12:41:03 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails References: <20130419204102.736961610@sgi.com> Content-Disposition: inline; filename=xfs_force_shutdown_if_pag_is_NULL.patch This problem happened locally with a bad inode number from xfs recovery. xfs_perag_get() can return NULL if given a bad agno. Most callers of xfs_perag_get() do not check for a NULL before using the pointer. This patch forces a shutdown of the filesystem for those callers that do not check the return value rather than crashing on a dereferenced NULL pointer. Signed-off-by: Mark Tinguely --- fs/xfs/xfs_icache.c | 2 +- fs/xfs/xfs_mount.c | 4 ++-- fs/xfs/xfs_mount.h | 17 ++++++++++++++++- 3 files changed, 19 insertions(+), 4 deletions(-) Index: b/fs/xfs/xfs_icache.c =================================================================== --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -656,7 +656,7 @@ xfs_inode_ag_iterator( xfs_agnumber_t ag; ag = 0; - while ((pag = xfs_perag_get(mp, ag))) { + while ((pag = __xfs_perag_get(mp, ag))) { ag = pag->pag_agno + 1; error = xfs_inode_ag_walk(mp, pag, execute, flags, args, -1); xfs_perag_put(pag); Index: b/fs/xfs/xfs_mount.c =================================================================== --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -193,7 +193,7 @@ xfs_uuid_unmount( * have to protect against changes is the tree structure itself. */ struct xfs_perag * -xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) +__xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) { struct xfs_perag *pag; int ref = 0; @@ -442,7 +442,7 @@ xfs_initialize_perag( * AGs we don't find ready for initialisation. */ for (index = 0; index < agcount; index++) { - pag = xfs_perag_get(mp, index); + pag = __xfs_perag_get(mp, index); if (pag) { xfs_perag_put(pag); continue; Index: b/fs/xfs/xfs_mount.h =================================================================== --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -336,12 +336,27 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, /* * perag get/put wrappers for ref counting */ -struct xfs_perag *xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno); +struct xfs_perag *__xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno); struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *mp, xfs_agnumber_t agno, int tag); void xfs_perag_put(struct xfs_perag *pag); /* + * Ensure the per AG entry was found. Shutting down the filesystem + * is better than crashing the OS. + */ +static inline struct xfs_perag * +xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) +{ + struct xfs_perag *pag; + + pag = __xfs_perag_get(mp, agno); + if (!pag) + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); + return pag; +} + +/* * Per-cpu superblock locking functions */ #ifdef HAVE_PERCPU_SB From sandeen@sandeen.net Sun Apr 21 16:55:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A3DC329E03 for ; Sun, 21 Apr 2013 16:55:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 67F1D8F8059 for ; Sun, 21 Apr 2013 14:55:12 -0700 (PDT) X-ASG-Debug-ID: 1366581307-04bdf01d63279910001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id EZrvuR9EWMZ4LAgj for ; Sun, 21 Apr 2013 14:55:07 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4E10963C59BB; Sun, 21 Apr 2013 16:55:07 -0500 (CDT) Message-ID: <5174603A.8030208@sandeen.net> Date: Sun, 21 Apr 2013 16:55:06 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails References: <20130419204102.736961610@sgi.com> <20130421174107.007313126@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails In-Reply-To: <20130421174107.007313126@sgi.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366581307 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128777 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/21/13 12:41 PM, Mark Tinguely wrote: > This problem happened locally with a bad inode number from xfs > recovery. xfs_perag_get() can return NULL if given a bad agno. > Most callers of xfs_perag_get() do not check for a NULL before > using the pointer. This patch forces a shutdown of the filesystem > for those callers that do not check the return value rather than > crashing on a dereferenced NULL pointer. Hi Mark - I'm curious, what was the callchain when this happened? Was it during recovery? If so, would aborting recovery be more prudent? I might be missing something, but I'm not sure how shutting down avoids a subsequent null ptr deref & crash. i.e. if a caller does something like: pag = xfs_perag_get(mp, agno); spin_lock(&pag->pagb_lock); shutting down in xfs_perag_get doesn't save us from a null pag pointer, would it? Thanks, -Eric > Signed-off-by: Mark Tinguely > --- > fs/xfs/xfs_icache.c | 2 +- > fs/xfs/xfs_mount.c | 4 ++-- > fs/xfs/xfs_mount.h | 17 ++++++++++++++++- > 3 files changed, 19 insertions(+), 4 deletions(-) > > Index: b/fs/xfs/xfs_icache.c > =================================================================== > --- a/fs/xfs/xfs_icache.c > +++ b/fs/xfs/xfs_icache.c > @@ -656,7 +656,7 @@ xfs_inode_ag_iterator( > xfs_agnumber_t ag; > > ag = 0; > - while ((pag = xfs_perag_get(mp, ag))) { > + while ((pag = __xfs_perag_get(mp, ag))) { > ag = pag->pag_agno + 1; > error = xfs_inode_ag_walk(mp, pag, execute, flags, args, -1); > xfs_perag_put(pag); > Index: b/fs/xfs/xfs_mount.c > =================================================================== > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -193,7 +193,7 @@ xfs_uuid_unmount( > * have to protect against changes is the tree structure itself. > */ > struct xfs_perag * > -xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) > +__xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) > { > struct xfs_perag *pag; > int ref = 0; > @@ -442,7 +442,7 @@ xfs_initialize_perag( > * AGs we don't find ready for initialisation. > */ > for (index = 0; index < agcount; index++) { > - pag = xfs_perag_get(mp, index); > + pag = __xfs_perag_get(mp, index); > if (pag) { > xfs_perag_put(pag); > continue; > Index: b/fs/xfs/xfs_mount.h > =================================================================== > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -336,12 +336,27 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, > /* > * perag get/put wrappers for ref counting > */ > -struct xfs_perag *xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno); > +struct xfs_perag *__xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno); > struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *mp, xfs_agnumber_t agno, > int tag); > void xfs_perag_put(struct xfs_perag *pag); > > /* > + * Ensure the per AG entry was found. Shutting down the filesystem > + * is better than crashing the OS. > + */ > +static inline struct xfs_perag * > +xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) > +{ > + struct xfs_perag *pag; > + > + pag = __xfs_perag_get(mp, agno); > + if (!pag) > + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); > + return pag; > +} > + > +/* > * Per-cpu superblock locking functions > */ > #ifdef HAVE_PERCPU_SB > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From pedrib@gmail.com Sun Apr 21 17:39:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A5B2929DFA for ; Sun, 21 Apr 2013 17:39:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 946258F8033 for ; Sun, 21 Apr 2013 15:39:05 -0700 (PDT) X-ASG-Debug-ID: 1366583940-04cb6c6e2b362880001-NocioJ Received: from mail-vb0-f54.google.com (mail-vb0-f54.google.com [209.85.212.54]) by cuda.sgi.com with ESMTP id 5qKMoZL0qgXB40Mu (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 21 Apr 2013 15:39:00 -0700 (PDT) X-Barracuda-Envelope-From: pedrib@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.54 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.54] Received: by mail-vb0-f54.google.com with SMTP id w16so5324514vbf.27 for ; Sun, 21 Apr 2013 15:39:00 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.54] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.54] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=tU5BqWVIU/eXuDcYSO6k+LjtPmu9spG5RHEjHBQ0qZ0=; b=VD/Kvx8OFrfcsuGvi4YT0Up2dAXGV2A5D4DQohYr/K3iccfyK+jbATB/6vhtf6jTqY RTeBUm8BU6pEJwpNv/50Ji9aYCXkPJEpQO5AgN6wh7bkprim9mj3WOLpsRiSo7zoeXmT ce04XaevKJni3pj0Y4jpaFTbLbTYpet87J8lHmh15z7PfJn1YOxdRD3HWSh6KR7UOOBk 8T1qFDWTBpI2U4GtgvzKSuoGLsxUpR0HH8OfsVTdYwnryOo07Zk51JVMgfq8fulj/dEb ZpeERPePqg8uSCK1xDg9FHNWJaPm28qAoMIOOhiIdp5fMiFgV0rjTQYVRrEOj2cQdRaJ FLMA== MIME-Version: 1.0 X-Received: by 10.52.91.115 with SMTP id cd19mr14691211vdb.114.1366583939872; Sun, 21 Apr 2013 15:38:59 -0700 (PDT) Received: by 10.220.103.199 with HTTP; Sun, 21 Apr 2013 15:38:59 -0700 (PDT) Date: Sun, 21 Apr 2013 23:38:59 +0100 Message-ID: Subject: noop or deadline on an SSD? From: Pedro Ribeiro X-ASG-Orig-Subj: noop or deadline on an SSD? To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=20cf307d04384abef704dae69e44 X-Barracuda-Connect: mail-vb0-f54.google.com[209.85.212.54] X-Barracuda-Start-Time: 1366583940 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128779 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 BSF_SC0_SA085 Custom Rule SA085 --20cf307d04384abef704dae69e44 Content-Type: text/plain; charset=ISO-8859-1 Hi all, I recently moved my system to an SSD. I decided to do what the XFS FAQ says ( http://xfs.org/index.php/XFS_FAQ#Q:_I_want_to_tune_my_XFS_filesystems_for_.3Csomething.3E) and I used all the defaults for creating the new XFS file systems. However the paragraph above also reads: "As of kernel 3.2.12, the default i/o scheduler, CFQ, will defeat much of the parallelization in XFS." Ok, I also read that with an SSD I should be using noop or deadline. And which one of these would perform better with XFS with an SSD? And while I'm at it, which one would be best for a mechanical drive? Thanks in advance. Regards, Pedro --20cf307d04384abef704dae69e44 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hi all,

I recently moved my syste= m to an SSD.=A0

I decided to do what t= he XFS FAQ says (http://xfs.org/index.php/XFS_FA= Q#Q:_I_want_to_tune_my_XFS_filesystems_for_.3Csomething.3E) and=A0I use= d all the defaults for creating the new XFS file systems.=A0

However the paragraph above also reads: &qu= ot;As of kernel 3.2.12, the default i/o scheduler, CFQ,= will defeat much of the parallelization in XFS."

Ok, I also read that with an SSD I should be using noop or deadline. An= d which one of these would perform better with XFS with an SSD? And while I= 'm at it, which one would be best for a =A0mechanical drive?

Thanks in advance.

Regards,
Pedro
--20cf307d04384abef704dae69e44-- From sandeen@sandeen.net Sun Apr 21 17:49:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E4AE429E03 for ; Sun, 21 Apr 2013 17:49:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA47C8F8033 for ; Sun, 21 Apr 2013 15:49:45 -0700 (PDT) X-ASG-Debug-ID: 1366584584-04bdf02d1f48f0a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id UAk4Nm0sXan2SuUX for ; Sun, 21 Apr 2013 15:49:44 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 45E6B63BDFF4; Sun, 21 Apr 2013 17:49:44 -0500 (CDT) Message-ID: <51746D07.5090300@sandeen.net> Date: Sun, 21 Apr 2013 17:49:43 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss , linux-btrfs Subject: [PATCH V2] xfstests: remove recursive include in filter.btrfs References: <517386CC.8010406@redhat.com> X-ASG-Orig-Subj: [PATCH V2] xfstests: remove recursive include in filter.btrfs In-Reply-To: <517386CC.8010406@redhat.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366584584 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128779 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Not sure how this happened, but filter.btrfs including itself leads to immense sadness for any file that includes it. (I got a segfault when I tried to run 307) It should be including the common/filter not common/filter.btrfs Signed-off-by: Eric Sandeen --- diff --git a/common/filter.btrfs b/common/filter.btrfs index b1aa733..3435d8d 100644 --- a/common/filter.btrfs +++ b/common/filter.btrfs @@ -1,6 +1,6 @@ # Filters for btrfs command output -. ./common/filter.btrfs +. ./filter # Some, but not all, commands emit "Btrfs " _filter_btrfs_version() From sandeen@sandeen.net Sun Apr 21 17:51:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 78E2129E03 for ; Sun, 21 Apr 2013 17:51:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1129AAC001 for ; Sun, 21 Apr 2013 15:51:56 -0700 (PDT) X-ASG-Debug-ID: 1366584715-04cb6c3c6811e750001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id LoEaZBmUD75IYZC7 for ; Sun, 21 Apr 2013 15:51:55 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 96D9163BDFF4; Sun, 21 Apr 2013 17:51:55 -0500 (CDT) Message-ID: <51746D8A.60707@sandeen.net> Date: Sun, 21 Apr 2013 17:51:54 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Eric Sandeen CC: linux-btrfs , xfs-oss Subject: [PATCH V3] xfstests: fix common filter include in filter.btrfs References: <517386CC.8010406@redhat.com> <51746D07.5090300@sandeen.net> X-ASG-Orig-Subj: [PATCH V3] xfstests: fix common filter include in filter.btrfs In-Reply-To: <51746D07.5090300@sandeen.net> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366584715 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128781 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Not sure how this happened, but filter.btrfs including itself leads to immense sadness for any file that includes it. (I got a segfault when I tried to run 307) It should be including ./common/filter not ./common/filter.btrfs Signed-off-by: Eric Sandeen --- cripes, I'm sorry that took 3 times to get right :/ diff --git a/common/filter.btrfs b/common/filter.btrfs index b1aa733..e9a2bc2 100644 --- a/common/filter.btrfs +++ b/common/filter.btrfs @@ -1,6 +1,6 @@ # Filters for btrfs command output -. ./common/filter.btrfs +. ./common/filter # Some, but not all, commands emit "Btrfs " _filter_btrfs_version() From holidg2k@host.gliix.com Sun Apr 21 18:21:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FREEMAIL_FROM, FROM_ILLEGAL_CHARS,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1F9D329E03 for ; Sun, 21 Apr 2013 18:21:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E19BE8F8039 for ; Sun, 21 Apr 2013 16:21:50 -0700 (PDT) X-ASG-Debug-ID: 1366586509-04bdf02d20490850001-w1Z2WR Received: from host.gliix.com (host.gliix.com [69.90.184.196]) by cuda.sgi.com with ESMTP id oatDJvgOpaMmYgpD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 21 Apr 2013 16:21:49 -0700 (PDT) X-Barracuda-Envelope-From: holidg2k@host.gliix.com X-Barracuda-Apparent-Source-IP: 69.90.184.196 Received: from holidg2k by host.gliix.com with local (Exim 4.80) (envelope-from ) id 1UU3Zs-0002Lv-Mf for linux-xfs@oss.sgi.com; Sun, 21 Apr 2013 16:21:48 -0700 To: linux-xfs@oss.sgi.com Subject: Date: Sun, 21 Apr 2013 16:21:48 -0700 X-ASG-Orig-Subj: From: Àëåêñàíäð Message-ID: X-Priority: 3 X-Mailer: PHPMailer [version 1.73] MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: multipart/alternative; boundary="------------DE7C301E4B4AB07C83D6860D48E55801" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - host.gliix.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [514 511] / [47 12] X-AntiAbuse: Sender Address Domain - host.gliix.com X-Get-Message-Sender-Via: host.gliix.com: authenticated_id: holidg2k/only user confirmed/virtual account not confirmed X-Barracuda-Connect: host.gliix.com[69.90.184.196] X-Barracuda-Start-Time: 1366586509 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.30 X-Barracuda-Spam-Status: No, SCORE=1.30 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_SUBJECT, MISSING_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128783 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 MISSING_SUBJECT Missing Subject: header 1.28 MISSING_SUBJECT_2 Missing Subject: header This is a multi-part message in MIME format. ; charset="windows-1251" --------------DE7C301E4B4AB07C83D6860D48E55801 Content-Type: text/plain; charset=windows-1251 Content-Transfer-Encoding: 8bit Äîáðûé äåíü!! Óâèäåë Âàø åmail â èíòåðíåòå. Íàøà êîìïàíèÿ ïðîèçâîäèò óñëóãè ýëåêòðîííûõ ðàññûëîê ïèñåì. Ê Âàì åñòü èíòåðåñíîå ïðåäëîæåíèå - Âàøè óñëóãè èëè òîâàðû âîçìîæíî îïèñàòü â êîììåð÷åñêîì ïðåäëîæåíèè è ðàñïðîñòðàíèòü åãî ïî å-àäðåñàì ïðåäïðèÿòèé è ÷àñòíûõ ëèö. Ñîîáùèòå ïîæàëóéñòà - èìååòñÿ ëè Ó Âàñ ñîçäàííîå îáúÿâëåíèå? Ïðåäëàãàþ ðàñïðîñòðàíèòü Âàøå îáúÿâëåíèå, ýòî äàñò î÷åíü õîðîøèé ýôôåêò. Ïðåäëàãàåì ñëåäóþùèå áàçû: - Ôèç. è þð. ëèöà Ìîñêâû, Ñàíêò-Ïåòåðáóðã; - Ëþáûå ãîðîäà Ðîññèè; - Âûáîðêà ïî îòðàñëÿì áèçíåñà; - Ëþáûå ñòðàíû ìèðà. Îòâåòüòå ïîæàëóéñòà - Âàì èíòåðåñíî ïðîèçâîäèòü ðåêëàìó â èíòåðíåòå äàííûì ñïîñîáîì? Çàðàíåå áëàãîäàðåí çà îòâåò, ìåíåäæåð ñëóæáû ðàñïðîñòðàíåíèÿ ñîîáùåíèé. Its simple text. Switch to HTML view! --------------DE7C301E4B4AB07C83D6860D48E55801 Content-Type: multipart/related; boundary="------------71DFE6EA788015FB59DE25E2FF51BBF5" --------------71DFE6EA788015FB59DE25E2FF51BBF5 Content-Type: text/html; charset=windows-1251 Content-Transfer-Encoding: 8bit

Äîáðûé äåíü!!

Óâèäåë Âàø åmail â èíòåðíåòå.

Íàøà êîìïàíèÿ ïðîèçâîäèò óñëóãè ýëåêòðîííûõ ðàññûëîê ïèñåì.

Ê Âàì åñòü èíòåðåñíîå ïðåäëîæåíèå - Âàøè óñëóãè èëè òîâàðû âîçìîæíî îïèñàòü â êîììåð÷åñêîì ïðåäëîæåíèè è ðàñïðîñòðàíèòü åãî ïî å-àäðåñàì ïðåäïðèÿòèé è ÷àñòíûõ ëèö.

Ñîîáùèòå ïîæàëóéñòà - èìååòñÿ ëè Ó Âàñ ñîçäàííîå îáúÿâëåíèå?

Ïðåäëàãàþ ðàñïðîñòðàíèòü Âàøå îáúÿâëåíèå, ýòî äàñò î÷åíü õîðîøèé ýôôåêò.

Ïðåäëàãàåì ñëåäóþùèå áàçû:

- Ôèç. è þð. ëèöà Ìîñêâû, Ñàíêò-Ïåòåðáóðã;

- Ëþáûå ãîðîäà Ðîññèè;

- Âûáîðêà ïî îòðàñëÿì áèçíåñà;

- Ëþáûå ñòðàíû ìèðà.

Îòâåòüòå ïîæàëóéñòà - Âàì èíòåðåñíî ïðîèçâîäèòü ðåêëàìó â èíòåðíåòå äàííûì ñïîñîáîì?

Çàðàíåå áëàãîäàðåí çà îòâåò, ìåíåäæåð ñëóæáû ðàñïðîñòðàíåíèÿ ñîîáùåíèé.

--------------71DFE6EA788015FB59DE25E2FF51BBF5-- --------------DE7C301E4B4AB07C83D6860D48E55801-- From stan@hardwarefreak.com Sun Apr 21 19:58:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6AF3B29E03 for ; Sun, 21 Apr 2013 19:58:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3B14D304053 for ; Sun, 21 Apr 2013 17:58:06 -0700 (PDT) X-ASG-Debug-ID: 1366592285-04bdf01d63282380001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id 3FNR39JNlJO4b35O for ; Sun, 21 Apr 2013 17:58:05 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id EF6046C02E for ; Sun, 21 Apr 2013 19:58:04 -0500 (CDT) Message-ID: <51748B18.6040309@hardwarefreak.com> Date: Sun, 21 Apr 2013 19:58:00 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: noop or deadline on an SSD? References: X-ASG-Orig-Subj: Re: noop or deadline on an SSD? In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1366592285 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 4/21/2013 5:38 PM, Pedro Ribeiro wrote: > Ok, I also read that with an SSD I should be using noop or deadline. And > which one of these would perform better with XFS with an SSD? And while I'm > at it, which one would be best for a mechanical drive? $ echo [noop|deadline] > /sys/block/sdX/queue/scheduler Given the ease with which one can switch between the two, it's far better to test each yourself with your hardware and workloads, than to rely on any generic advice. -- Stan From david@fromorbit.com Sun Apr 21 21:44:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7957329E03 for ; Sun, 21 Apr 2013 21:44:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id ECED2AC003 for ; Sun, 21 Apr 2013 19:44:28 -0700 (PDT) X-ASG-Debug-ID: 1366598666-04cbb057f54732e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id tRfU8ZbZyI0FEnGt for ; Sun, 21 Apr 2013 19:44:26 -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: AmISAIOhdFF5LHX7/2dsb2JhbABPgwa8FYUbBAGBAhd0gh8BAQU6HCMQCAMYCSUPBSUDNIgTuwCODxOBHQcWgzEDlxSKAIcbgx4qgS8 Received: from ppp121-44-117-251.lns20.syd6.internode.on.net (HELO destitution) ([121.44.117.251]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Apr 2013 12:14:25 +0930 Received: from dave by destitution with local (Exim 4.80) (envelope-from ) id 1UU6kX-0000Nj-6F; Mon, 22 Apr 2013 12:45:01 +1000 Date: Mon, 22 Apr 2013 12:45:01 +1000 From: Dave Chinner To: rjohnston@sgi.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: xfs_quota allow user or group names beginning with digits Message-ID: <20130422024501.GH13938@destitution> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: xfs_quota allow user or group names beginning with digits References: <20130417183323.465181485@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130417183323.465181485@sgi.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: 1366598666 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128795 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Apr 17, 2013 at 01:32:53PM -0500, rjohnston@sgi.com wrote: > xfs_quota does not properly parse users or groups that begin with a number. > Only call atoi when user or group consists of digits only. > > Signed-off-by: Rich Johnston > > --- > include/input.h | 1 + > libxcmd/input.c | 12 ++++++++++++ > quota/quota.c | 4 ++-- > quota/quota.h | 1 + > 4 files changed, 16 insertions(+), 2 deletions(-) > > Index: b/include/input.h > =================================================================== > --- a/include/input.h > +++ b/include/input.h > @@ -46,6 +46,7 @@ extern void timestr(struct timeval *tv, > extern uid_t uid_from_string(char *user); > extern gid_t gid_from_string(char *group); > extern prid_t prid_from_string(char *project); > +extern boolean_t isdigits_only(const char *str); bool is the correct type, not boolean_t. My CRC patchset makes userspace fall in line with the removal of boolean_t from the kernel code, so we should probably make this correct from the start. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From sales@yourphone.gr Mon Apr 22 02:31:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 2583F7F54 for ; Mon, 22 Apr 2013 02:31:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8BE9AAC006 for ; Mon, 22 Apr 2013 00:31:14 -0700 (PDT) X-ASG-Debug-ID: 1366615870-04cb6c6e2b37f980001-NocioJ Received: from server.market-place.gr (server.market-place.gr [188.40.44.202]) by cuda.sgi.com with ESMTP id v90wCuhzIPcfmF80 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 22 Apr 2013 00:31:11 -0700 (PDT) X-Barracuda-Envelope-From: sales@yourphone.gr X-Barracuda-Apparent-Source-IP: 188.40.44.202 Received: from worldadv by server.market-place.gr with local (Exim 4.80) (envelope-from ) id 1UUBDQ-0000Fb-VW for xfs@oss.sgi.com; Mon, 22 Apr 2013 09:31:09 +0200 To: xfs@oss.sgi.com Subject: =?UTF-8?B?W1lvdXJwaG9uZS5ncl0gzqTOtc+Ez4HOsc+Az43Pgc65zr3OsSBBbmRyb2lkIFM=?= =?UTF-8?B?bWFydHBob25lcw==?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?UTF-8?B?W1lvdXJwaG9uZS5ncl0gzqTOtc+Ez4HOsc+Az43Pgc65zr3OsSBBbmRyb2lkIFM=?= =?UTF-8?B?bWFydHBob25lcw==?= Content-Type: multipart/mixed; boundary="20602d7bc3d6d6481ebea44eac7b1d17" Content-Transfer-Encoding: 8Bit X-Mailer: Drupal From: "Yourphone.gr" List-Unsubscribe: Precedence: bulk Message-Id: Date: Mon, 22 Apr 2013 09:31:08 +0200 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server.market-place.gr X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [572 571] / [47 12] X-AntiAbuse: Sender Address Domain - yourphone.gr X-Get-Message-Sender-Via: server.market-place.gr: authenticated_id: worldadv/only user confirmed/virtual account not confirmed X-Barracuda-Connect: server.market-place.gr[188.40.44.202] X-Barracuda-Start-Time: 1366615870 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128815 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --20602d7bc3d6d6481ebea44eac7b1d17 Content-Type: multipart/alternative; boundary="755e0ea6c55de58b2a8886b7fdd1994b" Content-Transfer-Encoding: 8bit --755e0ea6c55de58b2a8886b7fdd1994b Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit -------- ΤΕΤΡΑΠΎΡΙÎΑ ANDROID SMARTPHONES --------------------------   Θα θέλαμε να σας καλωσοÏίσουμε σε μια *εναλλακτική Ï€Ïόταση* στον κόσμο της τεχνολογίας και επικοινωνίας, στο νέο ηλεκτÏονικό μας κατάστημα! Το κατάστημα μας, ειδικεÏεται στην εισαγωγή Ï€Ïοϊόντων *υψηλής τεχνολογίας κινητής τηλεφωνίας*, *συστήματα GPS-Navigation, MP3-MP4, ήχος αυτοκινήτου MP3,MP4,T.V,DVD* και άλλων Ï€Ïοϊόντων *υψηλής τεχνολογίας*. Όπως για παÏάδειγμα τα παÏακάτω κινητά που τα έχουν όλα!   ======== ΤΕΤΡΑΠΎΡΙÎΟ S5 SMART PHONE ANDROID 4.2.1, 5.0` HD ΟΘΌÎΗ 1.2G 8G 12.6 MPIXELS CAMERA ΚΑΙ ΕΛΛΗÎΙΚΌ ΜΕÎΟΎ ==========================================================   http://yourphone.gr/index.php?target=products&product_id=30817 *Για τα πλήÏη χαÏακτηÏιστικά της συσκευής ακολουθείτε τον σÏνδεσμο http://yourphone.gr/index.php?target=products&product_id=30817.*     ======== ΤΕΤΡΑΠΎΡΙÎΟ CUBOT SMART PHONE ANDROID 4.2 1.2G 8G 4.7`ΟΘΌÎΗ HD ΜΕ 13.0MP CAMERA ΚΑΙ ΕΛΛΗÎΙΚΌ ΜΕÎΟΎ ==========================================================   http://yourphone.gr/index.php?target=products&product_id=30818 *Για τα πλήÏη χαÏακτηÏιστικά της συσκευής ακολουθείτε τον σÏνδεσμο http://yourphone.gr/index.php?target=products&product_id=30818.*   *Σε όλες τις αγοÏές άνω των 50 ευÏÏŽ, τα μεταφοÏικά είναι ΔΩΡΕΑÎ.* *Για πεÏισσότεÏες πληÏοφοÏίες επικοινωνήστε μαζί μας στo email: mailto:sales@yourphone.gr* *Όπως επίσης και μέσω της φόÏμας επικοινωνίας μας εδώ http://yourphone.gr/index.php?target=forms&name=contact_us.* *ΜποÏείτε ακόμα να ανταλλάξετε απόψεις και να κάνετε τα σχόλια σας και στη σελίδα μας στο Facebook https://www.facebook.com/pages/Yourphonegr/140693562661365.* *Για να διαγÏαφείτε από την λίστα μας μποÏείτε να αποστείλετε email στο: mailto:remove@yourphone.gr*   Yourphone.gr -- Unsubscribe from this newsletter: http://worldadv.gr/newsletter/confirm/remove/4ba70d919611175t11 --755e0ea6c55de58b2a8886b7fdd1994b Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: base64 PGh0bWw+CiAgPGhlYWQ+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRl bnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KICAgICAgICA8c3R5bGUgdHlwZT0idGV4 dC9jc3MiPgogICAgICA8IS0tCiAgICAgIGh0bWwsYm9keSxkaXYsc3BhbixhcHBsZXQsb2JqZWN0 LGlmcmFtZSxoMSxoMixoMyxoNCxoNSxoNixwLGJsb2NrcXVvdGUscHJlLGEsYWJicixhY3Jvbnlt LGFkZHJlc3MsYmlnLGNpdGUsY29kZSxkZWwsZGZuLGVtLGZvbnQsaW1nLGlucyxrYmQscSxzLHNh bXAsc21hbGwsc3RyaWtlLHN0cm9uZyxzdWIsc3VwLHR0LHZhcixiLHUsaSxjZW50ZXIsZGwsZHQs ZGQsb2wsdWwsbGksZmllbGRzZXQsZm9ybSxpbnB1dCxzZWxlY3QsdGV4dGFyZWEsbGFiZWwsbGVn ZW5kLHRhYmxlLGNhcHRpb24sdGJvZHksdGZvb3QsdGhlYWQsdHIsdGgsdGQsdGQubWVudS1kaXNh YmxlZCx1bC5saW5rcyx1bC5saW5rcy5pbmxpbmUsdWwubGlua3MgbGksLmJsb2NrIHVsLGRpdi5h ZG1pbix0ci5ldmVuLHRyLm9kZCx0ci5kcmFnLHRib2R5LHRib2R5IHRoLHRoZWFkIHRoLC5icmVh ZGNydW1iLC5pdGVtLWxpc3QgLmljb24sLml0ZW0tbGlzdCAudGl0bGUsLml0ZW0tbGlzdCB1bCwu aXRlbS1saXN0IHVsIGxpLG9sLnRhc2stbGlzdCBsaS5hY3RpdmUsLmZvcm0taXRlbSx0ci5vZGQg LmZvcm0taXRlbSx0ci5ldmVuIC5mb3JtLWl0ZW0sLmZvcm0taXRlbSAuZGVzY3JpcHRpb24sLmZv cm0taXRlbSBsYWJlbCwuZm9ybS1pdGVtIGxhYmVsLm9wdGlvbiwuZm9ybS1jaGVja2JveGVzLC5m b3JtLXJhZGlvcywuZm9ybS1jaGVja2JveGVzCi5mb3JtLWl0ZW0sLmZvcm0tcmFkaW9zIC5mb3Jt LWl0ZW0sLm1hcmtlciwuZm9ybS1yZXF1aXJlZCwubW9yZS1saW5rLC5tb3JlLWhlbHAtbGluaywu aXRlbS1saXN0IC5wYWdlciwuaXRlbS1saXN0IC5wYWdlciBsaSwucGFnZXItY3VycmVudCwudGlw cyx1bC5wcmltYXJ5LHVsLnByaW1hcnkgbGksdWwucHJpbWFyeSBsaSBhLHVsLnByaW1hcnkgbGku YWN0aXZlIGEsdWwucHJpbWFyeSBsaSBhOmhvdmVyLHVsLnNlY29uZGFyeSx1bC5zZWNvbmRhcnkg bGksdWwuc2Vjb25kYXJ5IGEsdWwuc2Vjb25kYXJ5IGEuYWN0aXZlLC5yZXNpemFibGUtdGV4dGFy ZWF7bWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjowO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO311 bC5saW5rcyx1bC5saW5rcy5pbmxpbmUsdWwubGlua3MgbGksLmJsb2NrIHVsLG9sLHVsLC5pdGVt LWxpc3QgdWwsLml0ZW0tbGlzdCB1bApsaXtsaXN0LXN0eWxlOm5vbmU7fWJsb2NrcXVvdGUscXtx dW90ZXM6bm9uZTt9YmxvY2txdW90ZTpiZWZvcmUsYmxvY2txdW90ZTphZnRlcixxOmJlZm9yZSxx OmFmdGVye2NvbnRlbnQ6Jyc7Y29udGVudDpub25lO31pbnN7dGV4dC1kZWNvcmF0aW9uOm5vbmU7 fWRlbHt0ZXh0LWRlY29yYXRpb246bGluZS10aHJvdWdoO310YWJsZXtib3JkZXItY29sbGFwc2U6 Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDt9aW5wdXQsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFt aWx5OiJIZWx2ZXRpY2EgTmV1ZSIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7fXRleHRhcmVh e2ZvbnQtc2l6ZToxZW07bGluZS1oZWlnaHQ6MS41MzhlbTt9dWwubGlua3M6YWZ0ZXIsZGl2LmFk bWluLXBhbmVsIC5ib2R5OmFmdGVyLC5jbGVhcmZpeDphZnRlcntjb250ZW50OiIuIjtkaXNwbGF5 OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW47fXVsLmlubGluZTph ZnRlcntjb250ZW50OiIiO2Rpc3BsYXk6bm9uZTtjbGVhcjpub25lO30qIGh0bWwgLmZvcm0taXRl bSwqIGh0bWwgdWwubGlua3MsKiBodG1sIGRpdi5hZG1pbi1wYW5lbCAuYm9keSwqIGh0bWwgLmNs ZWFyZml4e2hlaWdodDoxJTt9KjpmaXJzdC1jaGlsZCArIGh0bWwgLmZvcm0taXRlbSwqOmZpcnN0 LWNoaWxkICsgaHRtbCB1bC5saW5rcywqOmZpcnN0LWNoaWxkICsKaHRtbCBkaXYuYWRtaW4tcGFu ZWwgLmJvZHksKjpmaXJzdC1jaGlsZCArIGh0bWwgLmNsZWFyZml4e21pbi1oZWlnaHQ6MSU7fQpi b2R5e2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO2ZvbnQ6bm9ybWFsIDgxLjMlLzEuNTM4ZW0g Ikx1Y2lkYSBHcmFuZGUiLCJMdWNpZGEgU2FucyBVbmljb2RlIixzYW5zLXNlcmlmO31he2NvbG9y OiMwMDc0QkQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fWE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVu ZGVybGluZTt9aHJ7bWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjpub25lO2hlaWdodDoxcHg7YmFj a2dyb3VuZDojY2NjY2NjO31sZWdlbmR7Zm9udC13ZWlnaHQ6Ym9sZDt9aDEsaDIsaDMsaDQsaDUs aDZ7Zm9udC13ZWlnaHQ6Ym9sZDttYXJnaW46MTBweCAwO31oMXtmb250LXNpemU6MS41MzhlbTt9 aDJ7Zm9udC1zaXplOjEuMzg1ZW07fWgze2ZvbnQtc2l6ZToxLjIzMWVtO31oNHtmb250LXNpemU6 MS4xNTRlbTt9aDUsaDZ7Zm9udC1zaXplOjEuMDc3ZW07fXB7bWFyZ2luOjFlbSAwO31kbHttYXJn aW46MCAwIDIwcHg7fWRsIGRkLGRsIGRse21hcmdpbi1sZWZ0OjIwcHg7bWFyZ2luLWJvdHRvbTox MHB4O31ibG9ja3F1b3Rle21hcmdpbjoxZW0KNDBweDt9YWRkcmVzc3tmb250LXN0eWxlOml0YWxp Yzt9dSxpbnN7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9cyxzdHJpa2UsZGVse3RleHQtZGVj b3JhdGlvbjpsaW5lLXRocm91Z2g7fWJpZ3tmb250LXNpemU6bGFyZ2VyO31zbWFsbHtmb250LXNp emU6c21hbGxlcjt9c3Vie3ZlcnRpY2FsLWFsaWduOnN1Yjtmb250LXNpemU6c21hbGxlcjtsaW5l LWhlaWdodDpub3JtYWw7fXN1cHt2ZXJ0aWNhbC1hbGlnbjpzdXBlcjtmb250LXNpemU6c21hbGxl cjtsaW5lLWhlaWdodDpub3JtYWw7fW5vYnJ7d2hpdGUtc3BhY2U6bm93cmFwO31hYmJyLGFjcm9u eW17Ym9yZGVyLWJvdHRvbTpkb3R0ZWQgMXB4O311bCwuYmxvY2sgdWwsLml0ZW0tbGlzdCB1bHts aXN0LXN0eWxlLXR5cGU6ZGlzYztsaXN0LXN0eWxlLWltYWdlOm5vbmU7bWFyZ2luOjAuMjVlbSAw IDAuMjVlbSAxLjVlbTt9Lml0ZW0tbGlzdCAucGFnZXIgbGl7cGFkZGluZzowLjVlbTt9Lml0ZW0t bGlzdCB1bCBsaSxsaS5sZWFmLHVsLm1lbnUgbGl7bGlzdC1zdHlsZS10eXBlOmRpc2M7bGlzdC1z dHlsZS1pbWFnZTpub25lO311bC5tZW51IGxpe21hcmdpbjowO31vbHtsaXN0LXN0eWxlLXR5cGU6 ZGVjaW1hbDttYXJnaW46MC4yNWVtIDAgMC4yNWVtIDJlbTt9Lml0ZW0tbGlzdCB1bCBsaS5jb2xs YXBzZWQsdWwubWVudQpsaS5jb2xsYXBzZWR7bGlzdC1zdHlsZS1pbWFnZTp1cmwoL3NpdGVzL2Fs bC9taXNjL21lbnUtY29sbGFwc2VkLnBuZyk7bGlzdC1zdHlsZS10eXBlOmRpc2M7fS5pdGVtLWxp c3QgdWwgbGkuZXhwYW5kZWQsdWwubWVudSBsaS5leHBhbmRlZHtsaXN0LXN0eWxlLWltYWdlOnVy bCgvc2l0ZXMvYWxsL21pc2MvbWVudS1leHBhbmRlZC5wbmcpO2xpc3Qtc3R5bGUtdHlwZTpjaXJj bGU7fXF1b3RlLGNvZGV7bWFyZ2luOi41ZW0gMDt9Y29kZSxwcmUsa2Jke2ZvbnQtc2l6ZToxLjIz MWVtO31wcmV7bWFyZ2luOjAuNWVtIDA7d2hpdGUtc3BhY2U6cHJlLXdyYXA7fSNza2lwLWxpbmt7 bWFyZ2luLXRvcDowO3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi01LjI1 ZW07d2lkdGg6YXV0bzt6LWluZGV4OjUwO30jc2tpcC1saW5rIGEsI3NraXAtbGluayBhOmxpbmss I3NraXAtbGluayBhOnZpc2l0ZWR7ZGlzcGxheTpibG9jaztiYWNrZ3JvdW5kOiM0NDQ7Y29sb3I6 I2ZmZjtmb250LXNpemU6MC45NGVtO3BhZGRpbmc6MXB4IDEwcHggMnB4IDEwcHg7dGV4dC1kZWNv cmF0aW9uOm5vbmU7LW1vei1ib3JkZXItcmFkaXVzOjAgMCAxMHB4CjEwcHg7LXdlYmtpdC1ib3Jk ZXItdG9wLWxlZnQtcmFkaXVzOjA7LXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowOy13 ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czoxMHB4Oy13ZWJraXQtYm9yZGVyLWJvdHRv bS1yaWdodC1yYWRpdXM6MTBweDtib3JkZXItcmFkaXVzOjAgMCAxMHB4IDEwcHg7fSNza2lwLWxp bmsgYTpob3Zlciwjc2tpcC1saW5rIGE6Zm9jdXMsI3NraXAtbGluayBhOmFjdGl2ZXtvdXRsaW5l OjA7fSNicmFuZGluZ3tvdmVyZmxvdzpoaWRkZW47cGFkZGluZzoyMHB4IDIwcHggMCAyMHB4O3Bv c2l0aW9uOnJlbGF0aXZlO2JhY2tncm91bmQtY29sb3I6I2UwZTBkODt9I2JyYW5kaW5nIGRpdi5i cmVhZGNydW1ie2ZvbnQtc2l6ZTowLjg0NmVtO3BhZGRpbmctYm90dG9tOjVweDt9I2JyYW5kaW5n IGRpdi5ibG9ja3twb3NpdGlvbjpyZWxhdGl2ZTtmbG9hdDpyaWdodDt3aWR0aDoyNDBweDtwYWRk aW5nLWxlZnQ6MTBweDtiYWNrZ3JvdW5kOiMzMzM7fSNicmFuZGluZyBkaXYuYmxvY2sgZm9ybSBs YWJlbHtkaXNwbGF5Om5vbmU7fSNicmFuZGluZyBkaXYuYmxvY2sgZm9ybSBkaXYuZm9ybS1pdGVt e2Zsb2F0OmxlZnQ7Ym9yZGVyOjA7bWFyZ2luOjA7cGFkZGluZzowO30jYnJhbmRpbmcgZGl2LmJs b2NrIGZvcm0KaW5wdXQuZm9ybS10ZXh0e3dpZHRoOjE0MHB4O21hcmdpbi1yaWdodDoxMHB4O30j YnJhbmRpbmcgZGl2LmJsb2NrIGZvcm0gaW5wdXQuZm9ybS1zdWJtaXR7dGV4dC1hbGlnbjpjZW50 ZXI7d2lkdGg6ODBweDt9I2hlbHB7Zm9udC1zaXplOjAuOTIzZW07bWFyZ2luLXRvcDoxZW07fSNo ZWxwIHB7bWFyZ2luOjAgMCAxMHB4O30jaGVscCBkaXYubW9yZS1oZWxwLWxpbmt7dGV4dC1hbGln bjpyaWdodDt9I3BhZ2UtdGl0bGV7YmFja2dyb3VuZDojMzMzO3BhZGRpbmctdG9wOjIwcHg7fSNi cmFuZGluZyBoMS5wYWdlLXRpdGxle2NvbG9yOiMwMDA7bWFyZ2luOjA7cGFkZGluZy1ib3R0b206 MTBweDtmb250LXNpemU6MS4zODVlbTtmb250LXdlaWdodDpub3JtYWw7ZmxvYXQ6bGVmdDt9I2Nv bnNvbGV7bWFyZ2luOjlweCAwIDEwcHg7fXVsLnByaW1hcnl7ZmxvYXQ6cmlnaHQ7Ym9yZGVyLWJv dHRvbTpub25lO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtmb250LXNpemU6MC45MjNlbTtoZWln aHQ6Mi42MGVtO21hcmdpbjowO3BhZGRpbmctdG9wOjA7fXVsLnByaW1hcnkgbGl7ZmxvYXQ6bGVm dDtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjAgMnB4O311bC5wcmltYXJ5IGxpIGE6bGluayx1bC5w cmltYXJ5IGxpIGEuYWN0aXZlLHVsLnByaW1hcnkgbGkgYTphY3RpdmUsdWwucHJpbWFyeSBsaSBh OnZpc2l0ZWQsdWwucHJpbWFyeSBsaQphOmhvdmVyLHVsLnByaW1hcnkgbGkuYWN0aXZlIGF7ZGlz cGxheTpibG9jaztmbG9hdDpsZWZ0O2hlaWdodDoyLjYwZW07bGluZS1oZWlnaHQ6Mi42MGVtO3Bh ZGRpbmc6MCAxOHB4IDhweDtiYWNrZ3JvdW5kLWNvbG9yOiNhNmE3YTI7Y29sb3I6IzAwMDtmb250 LXdlaWdodDpib2xkO2JvcmRlci13aWR0aDoxcHggMXB4IDAgMXB4O2JvcmRlci1zdHlsZTpzb2xp ZDtib3JkZXItY29sb3I6I2E2YTdhMjstbW96LWJvcmRlci1yYWRpdXM6OHB4IDhweCAwIDA7LXdl YmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOjhweDstd2Via2l0LWJvcmRlci10b3AtcmlnaHQt cmFkaXVzOjhweDtib3JkZXItcmFkaXVzOjhweCA4cHggMCAwO311bC5wcmltYXJ5IGxpLmFjdGl2 ZSBhLHVsLnByaW1hcnkgbGkuYWN0aXZlIGEuYWN0aXZlLHVsLnByaW1hcnkgbGkuYWN0aXZlIGE6 YWN0aXZlLHVsLnByaW1hcnkgbGkuYWN0aXZlIGE6dmlzaXRlZHtiYWNrZ3JvdW5kLWNvbG9yOiNm ZmY7Ym9yZGVyLWNvbG9yOiNjOWNhYzQ7fXVsLnByaW1hcnkgbGkgYTpob3Zlcntjb2xvcjojZmZm O311bC5wcmltYXJ5IGxpLmFjdGl2ZSBhOmhvdmVye2NvbG9yOiMwMDA7fS50YWJzLXNlY29uZGFy eXtjbGVhcjpib3RoO311bC5zZWNvbmRhcnl7ZmxvYXQ6cmlnaHQ7Zm9udC1zaXplOjAuOTIzZW07 cGFkZGluZzowIDNweAo1cHg7bGluZS1oZWlnaHQ6MS4zODVlbTtvdmVyZmxvdzpoaWRkZW47YmFj a2dyb3VuZC1jb2xvcjojZmZmO311bC5zZWNvbmRhcnkgbGl7bWFyZ2luOjAgNXB4O2Zsb2F0Om5v bmU7fXVsLnNlY29uZGFyeSBsaSBhe2JhY2tncm91bmQtY29sb3I6I2RkZDtjb2xvcjojMDAwO2Rp c3BsYXk6aW5saW5lLWJsb2NrO311bC5zZWNvbmRhcnkgbGkgYSx1bC5zZWNvbmRhcnkgbGkgYTpo b3Zlcix1bC5zZWNvbmRhcnkgbGkuYWN0aXZlIGEsdWwuc2Vjb25kYXJ5IGxpLmFjdGl2ZSBhLmFj dGl2ZXtwYWRkaW5nOjJweCAxMHB4Oy1tb3otYm9yZGVyLXJhZGl1czo3cHg7LXdlYmtpdC1ib3Jk ZXItcmFkaXVzOjdweDtib3JkZXItcmFkaXVzOjdweDt9dWwuc2Vjb25kYXJ5IGxpIGE6aG92ZXIs dWwuc2Vjb25kYXJ5IGxpLmFjdGl2ZSBhLHVsLnNlY29uZGFyeSBsaS5hY3RpdmUgYS5hY3RpdmV7 Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiM2NjY7fSNjb250ZW50e2NsZWFyOmxlZnQ7fSNwYWdle3Bh ZGRpbmc6MjBweCAwIDQwcHggMDttYXJnaW4tcmlnaHQ6NDBweDttYXJnaW4tbGVmdDo0MHB4O2Jh Y2tncm91bmQ6I2ZmZjtwb3NpdGlvbjpyZWxhdGl2ZTtjb2xvcjojMzMzO30jc2Vjb25kYXJ5LWxp bmtzIHVsLmxpbmtzIGxpe3BhZGRpbmc6MCAxMHB4IDEwcHggMDt9I3NlY29uZGFyeS1saW5rcyB1 bC5saW5rcyBsaQphe2ZvbnQtc2l6ZTowLjkyM2VtO2JhY2tncm91bmQ6Izc3Nztjb2xvcjojZmZm O3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6NXB4O2hlaWdodDo1NXB4O3dpZHRoOjgwcHg7b3Zl cmZsb3c6aGlkZGVuOy1tb3otYm9yZGVyLXJhZGl1czo1cHg7LXdlYmtpdC1ib3JkZXItcmFkaXVz OjVweDtib3JkZXItcmFkaXVzOjVweDt9I3NlY29uZGFyeS1saW5rcyB1bC5saW5rcyBsaSBhOmhv dmVye2JhY2tncm91bmQ6Izk5OTt9dWwubGlua3MgbGksdWwuaW5saW5lIGxpe3BhZGRpbmctcmln aHQ6MWVtO311bC5pbmxpbmUgbGl7ZGlzcGxheTppbmxpbmU7fSNzZWNvbmRhcnktbGlua3MgdWwu bGlua3MgbGkuYWN0aXZlLXRyYWlsIGEsI3NlY29uZGFyeS1saW5rcyB1bC5saW5rcyBsaSBhLmFj dGl2ZXtiYWNrZ3JvdW5kOiMzMzM7fXVsLmFkbWluLWxpc3QgbGl7cG9zaXRpb246cmVsYXRpdmU7 cGFkZGluZy1sZWZ0OjMwcHg7cGFkZGluZy10b3A6OXB4O2JvcmRlci10b3A6MXB4IHNvbGlkICNj Y2M7bWFyZ2luLWxlZnQ6MDttYXJnaW4tYm90dG9tOjEwcHg7YmFja2dyb3VuZDp1cmwoL3NpdGVz L2FsbC90aGVtZXMvZWlnaHQvaW1hZ2VzL2xpc3QtaXRlbS5wbmcpIG5vLXJlcGVhdCAwIDExcHg7 bGlzdC1zdHlsZS10eXBlOm5vbmU7bGlzdC1zdHlsZS1pbWFnZTpub25lO30uYWRtaW4tcGFuZWwg Lml0ZW0tbGlzdAp1bCx1bC5hZG1pbi1saXN0e21hcmdpbjowO3BhZGRpbmc6MDt9LmFkbWluLXBh bmVsIC5pdGVtLWxpc3QgdWwsdWwuYWRtaW4tbGlzdC5jb21wYWN0e21hcmdpbjo4cHggMDt9LmFk bWluLXBhbmVsIC5pdGVtLWxpc3QgbGksdWwuYWRtaW4tbGlzdC5jb21wYWN0IGxpe2JvcmRlcjpu b25lO2JhY2tncm91bmQ6bm9uZTttYXJnaW46MCAwIDAuNzVlbTtsaW5lLWhlaWdodDoxO3BhZGRp bmc6MDt9dWwuYWRtaW4tbGlzdCBsaTpsYXN0LWNoaWxke2JvcmRlci1ib3R0b206bm9uZTt9dWwu YWRtaW4tbGlzdCBsaSBhe21hcmdpbi1sZWZ0Oi0zMHB4O3BhZGRpbmc6MCAwIDRweCAzMHB4O21p bi1oZWlnaHQ6MDt9dWwuYWRtaW4tbGlzdC5jb21wYWN0IGxpIGF7bWFyZ2luLWxlZnQ6MDtwYWRk aW5nOjA7fXVsLmFkbWluLWxpc3QgbGkgZGl2LmRlc2NyaXB0aW9uIGF7bWFyZ2luLWxlZnQ6MDtw YWRkaW5nOjA7bWluLWhlaWdodDppbmhlcml0O31kaXYuc3VibWl0dGVke2NvbG9yOiM4OTg5ODk7 fXRhYmxle3dpZHRoOjEwMCU7Zm9udC1zaXplOjAuOTIzZW07bWFyZ2luOjAgMCAxMHB4O2JvcmRl cjoxcHggc29saWQgI2JlYmZiOTt9dGFibGUgdGQsdGFibGUgdGh7dmVydGljYWwtYWxpZ246bWlk ZGxlO3BhZGRpbmc6OHB4IDEwcHg7Ym9yZGVyOjA7Y29sb3I6IzAwMDt9dHIuZXZlbix0ci5vZGR7 Ym9yZGVyLXdpZHRoOjAgMXB4IDAKMXB4O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6 I2JlYmZiOTtiYWNrZ3JvdW5kOiNmM2Y0ZWU7fXRyLm9kZHtiYWNrZ3JvdW5kOiNmZmY7fXRyLmRy YWd7YmFja2dyb3VuZDojZmU3O310ci5kcmFnLXByZXZpb3Vze2JhY2tncm91bmQ6I2ZmYjt9dGFi bGUgdGh7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2JhY2tncm91bmQ6I2UxZTJkYztmb250LXdl aWdodDpub3JtYWw7Ym9yZGVyLXdpZHRoOjFweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNv bG9yOiNiZWJmYjk7cGFkZGluZzozcHggMTBweDt9dGFibGUgdGguYWN0aXZle2JhY2tncm91bmQ6 I2JkYmViOTt9dGFibGUgdGggYXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO310YWJs ZSB0aC5hY3RpdmUgYXtwYWRkaW5nOjAgMjVweCAwIDA7fXRhYmxlIHRoLmFjdGl2ZSBpbWd7cG9z aXRpb246YWJzb2x1dGU7dG9wOjNweDtyaWdodDozcHg7fXRhYmxlIHRkLmFjdGl2ZXtiYWNrZ3Jv dW5kOiNlOWU5ZGQ7fXRhYmxlIHRyLm9kZCB0ZC5hY3RpdmV7YmFja2dyb3VuZDojZjNmNGVlO310 YWJsZSB0ci5zZWxlY3RlZCB0ZC5hY3RpdmUsdGFibGUgdHIuc2VsZWN0ZWQgdGR7YmFja2dyb3Vu ZDojZmZjO2JvcmRlci1jb2xvcjojZWViO310YWJsZS5zeXN0ZW0tc3RhdHVzLXJlcG9ydCB0cnti b3JkZXItYm90dG9tOjFweCBzb2xpZAojY2NjO310YWJsZS5zeXN0ZW0tc3RhdHVzLXJlcG9ydCB0 ci5va3tjb2xvcjojMjU1YjFlO2JhY2tncm91bmQtY29sb3I6I2U1ZmZlMjt9dGFibGUuc3lzdGVt LXN0YXR1cy1yZXBvcnQgdHIuaW5mb3tjb2xvcjojMDQwZjM3O2JhY2tncm91bmQtY29sb3I6I2Jk Zjt9dGFibGUuc3lzdGVtLXN0YXR1cy1yZXBvcnQgdHIud2FybmluZ3tjb2xvcjojODQwO2JhY2tn cm91bmQtY29sb3I6I2ZmZmNlNTt9dGFibGUuc3lzdGVtLXN0YXR1cy1yZXBvcnQgdHIuZXJyb3J7 Y29sb3I6IzhjMmUwYjtiYWNrZ3JvdW5kLWNvbG9yOiNmZWY1ZjE7fXRyIHRkOmxhc3QtY2hpbGR7 Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjYmViZmI5O31maWVsZHNldHtib3JkZXI6MXB4IHNvbGlk ICNjY2M7cGFkZGluZzoyLjVlbSAwIDAgMDtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46MWVtIDA7 fWZpZWxkc2V0IC5maWVsZHNldC1sZWdlbmR7bWFyZ2luLXRvcDowLjVlbTtwYWRkaW5nLWxlZnQ6 MTVweDtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7fWZpZWxkc2V0 IC5maWVsZHNldC13cmFwcGVye3BhZGRpbmc6MCAxM3B4IDEzcHggMTVweDt9ZmllbGRzZXQuY29s bGFwc2Vke2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7fWh0bWwuanMKZmllbGRzZXQuY29s bGFwc2Vke2JvcmRlci13aWR0aDoxcHg7aGVpZ2h0OmF1dG87fWZpZWxkc2V0IGZpZWxkc2V0e2Jh Y2tncm91bmQtY29sb3I6I2ZmZjt9ZmllbGRzZXQgZmllbGRzZXQgZmllbGRzZXR7YmFja2dyb3Vu ZC1jb2xvcjojZjhmOGY4O30uZm9ybS1pdGVte3BhZGRpbmc6OXB4IDA7bWFyZ2luOjAgMCAxMHB4 O30uZmlsdGVyLXdyYXBwZXIgLmZvcm0taXRlbSxkaXYudGVhc2VyLWNoZWNrYm94IC5mb3JtLWl0 ZW0sLmZvcm0taXRlbSAuZm9ybS1pdGVte3BhZGRpbmc6NXB4IDA7bWFyZ2luOjA7Ym9yZGVyOjA7 fS5mb3JtLXR5cGUtY2hlY2tib3h7cGFkZGluZzowO30udGV4dC1mb3JtYXQtd3JhcHBlciAuZm9y bS1pdGVte3BhZGRpbmctYm90dG9tOjA7fS5mb3JtLWl0ZW0gbGFiZWx7bWFyZ2luOjA7cGFkZGlu ZzowO30uZm9ybS1pdGVtIGxhYmVsLm9wdGlvbntmb250LXNpemU6MC45MjNlbTt0ZXh0LXRyYW5z Zm9ybTpub25lO30uZm9ybS1pdGVtIGxhYmVsLm9wdGlvbiBpbnB1dHt2ZXJ0aWNhbC1hbGlnbjpt aWRkbGU7fS5mb3JtLWRpc2FibGVkIGlucHV0LmZvcm0tYXV0b2NvbXBsZXRlLC5mb3JtLWRpc2Fi bGVkIGlucHV0LmZvcm0tdGV4dCwuZm9ybS1kaXNhYmxlZCBpbnB1dC5mb3JtLWZpbGUsLmZvcm0t ZGlzYWJsZWQgdGV4dGFyZWEuZm9ybS10ZXh0YXJlYSwuZm9ybS1kaXNhYmxlZApzZWxlY3QuZm9y bS1zZWxlY3R7YmFja2dyb3VuZC1jb2xvcjojZWVlO2NvbG9yOiM3Nzc7fS5maWx0ZXItd3JhcHBl cntib3JkZXItdG9wOjA7cGFkZGluZzoxMHB4IDJweDt9LmZpbHRlci13cmFwcGVyIC5maWVsZHNl dC13cmFwcGVye3BhZGRpbmc6MCA2cHg7fS5maWx0ZXItd3JhcHBlciAuZm9ybS1pdGVtLC5maWx0 ZXItd3JhcHBlciAuZmlsdGVyLWd1aWRlbGluZXMsLmZpbHRlci13cmFwcGVyIC5maWx0ZXItaGVs cHtmb250LXNpemU6MC45MjNlbTtwYWRkaW5nOjJweCAwIDAgMDt9dWwudGlwcyxkaXYuZGVzY3Jp cHRpb24sLmZvcm0taXRlbSBkaXYuZGVzY3JpcHRpb257bWFyZ2luOjVweCAwO2xpbmUtaGVpZ2h0 OjEuMjMxZW07Zm9udC1zaXplOjAuOTIzZW07Y29sb3I6IzY2Njt9dWwudGlwcyBsaXttYXJnaW46 MC4yNWVtIDAgMC4yNWVtIDEuNWVtO31ib2R5IGRpdi5mb3JtLXR5cGUtcmFkaW8gZGl2LmRlc2Ny aXB0aW9uLGJvZHkgZGl2LmZvcm0tdHlwZS1jaGVja2JveCBkaXYuZGVzY3JpcHRpb257bWFyZ2lu LWxlZnQ6MS41ZW07fWlucHV0LmZvcm0tc3VibWl0LGEuYnV0dG9ue2N1cnNvcjpwb2ludGVyO3Bh ZGRpbmc6NHB4CjE3cHg7bWFyZ2luLWJvdHRvbToxZW07bWFyZ2luLXJpZ2h0OjFlbTtjb2xvcjoj NWE1YTVhO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6MS4w NzdlbTtmb250LWZhbWlseToiTHVjaWRhIEdyYW5kZSIsVmVyZGFuYSxzYW5zLXNlcmlmO2JvcmRl cjoxcHggc29saWQgI2U0ZTRlNDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjYjRiNGI0O2JvcmRl ci1sZWZ0LWNvbG9yOiNkMmQyZDI7Ym9yZGVyLXJpZ2h0LWNvbG9yOiNkMmQyZDI7YmFja2dyb3Vu ZDp1cmwoL3NpdGVzL2FsbC90aGVtZXMvZWlnaHQvaW1hZ2VzL2J1dHRvbnMucG5nKSAwIDAgcmVw ZWF0LXg7LW1vei1ib3JkZXItcmFkaXVzOjIwcHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjIwcHg7 Ym9yZGVyLXJhZGl1czoyMHB4O31hLmJ1dHRvbjpsaW5rLGEuYnV0dG9uOnZpc2l0ZWQsYS5idXR0 b246aG92ZXIsYS5idXR0b246YWN0aXZle3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiM1YTVh NWE7fWlucHV0LmZvcm0tc3VibWl0OmFjdGl2ZXtiYWNrZ3JvdW5kOiM2NjY7Y29sb3I6I2ZmZjti b3JkZXItY29sb3I6IzU1NTt0ZXh0LXNoYWRvdzojMjIyIDAgLTFweCAwO31pbnB1dC5mb3JtLWJ1 dHRvbi1kaXNhYmxlZCxpbnB1dC5mb3JtLWJ1dHRvbi1kaXNhYmxlZDphY3RpdmV7YmFja2dyb3Vu ZDojZWVlCm5vbmU7Ym9yZGVyLWNvbG9yOiNlZWU7dGV4dC1zaGFkb3c6bm9uZTtjb2xvcjojOTk5 O31pbnB1dC5mb3JtLWF1dG9jb21wbGV0ZSxpbnB1dC5mb3JtLXRleHQsaW5wdXQuZm9ybS1maWxl LHRleHRhcmVhLmZvcm0tdGV4dGFyZWEsc2VsZWN0LmZvcm0tc2VsZWN0e3BhZGRpbmc6MnB4O2Jv cmRlcjoxcHggc29saWQgI2NjYztib3JkZXItdG9wLWNvbG9yOiM5OTk7YmFja2dyb3VuZDojZmZm O2NvbG9yOiMzMzM7fWlucHV0LmZvcm0tdGV4dDpmb2N1cyxpbnB1dC5mb3JtLWZpbGU6Zm9jdXMs dGV4dGFyZWEuZm9ybS10ZXh0YXJlYTpmb2N1cyxzZWxlY3QuZm9ybS1zZWxlY3Q6Zm9jdXN7Y29s b3I6IzAwMDtib3JkZXItY29sb3I6I2FjZTt9aHRtbC5qcyBpbnB1dC5mb3JtLWF1dG9jb21wbGV0 ZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjEwMCUgNHB4O31odG1sLmpzIGlucHV0LnRocm9iYmluZ3ti YWNrZ3JvdW5kLXBvc2l0aW9uOjEwMCUgLTE2cHg7fXVsLmFjdGlvbi1saW5rc3ttYXJnaW46MWVt IDA7cGFkZGluZzowIDIwcHggMCAyMHB4O2xpc3Qtc3R5bGUtdHlwZTpub25lO292ZXJmbG93Omhp ZGRlbjt9dWwuYWN0aW9uLWxpbmtzIGxpe2Zsb2F0OmxlZnQ7bWFyZ2luOjAgMWVtIDAgMDt9dWwu YWN0aW9uLWxpbmtzIGF7cGFkZGluZy1sZWZ0OjE1cHg7YmFja2dyb3VuZDp0cmFuc3BhcmVudAp1 cmwoL3NpdGVzL2FsbC90aGVtZXMvZWlnaHQvaW1hZ2VzL2FkZC5wbmcpIG5vLXJlcGVhdCAwIGNl bnRlcjtsaW5lLWhlaWdodDozMHB4O30jZGlmZi1pbmxpbmUtZm9ybSBzZWxlY3QsZGl2LmZpbHRl ci1vcHRpb25zIHNlbGVjdHtwYWRkaW5nOjA7fWRpdi5hZG1pbiAucmlnaHQsZGl2LmFkbWluIC5s ZWZ0e3dpZHRoOjQ5JTttYXJnaW46MDt9ZGl2LmFkbWluLXBhbmVsLGRpdi5hZG1pbi1wYW5lbCAu Ym9keXtwYWRkaW5nOjA7Y2xlYXI6bGVmdDt9ZGl2LmFkbWluLXBhbmVse21hcmdpbjowIDAgMjBw eDtwYWRkaW5nOjlweDtiYWNrZ3JvdW5kOiNmOGY4Zjg7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO31k aXYuYWRtaW4tcGFuZWwgaDN7Zm9udC1zaXplOjAuOTIzZW07dGV4dC10cmFuc2Zvcm06dXBwZXJj YXNlO21hcmdpbjowO3BhZGRpbmctYm90dG9tOjlweDt9I3N5c3RlbS10aGVtZXMtcGFnZSBoMntm b250LXdlaWdodDpub3JtYWw7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO30udGhlbWUtc2VsZWN0 b3IgaDN7Zm9udC13ZWlnaHQ6bm9ybWFsO30udGhlbWUtZGVmYXVsdCBoM3tmb250LXdlaWdodDpi b2xkO30uc3lzdGVtLXRoZW1lcy1saXN0LWVuYWJsZWQgLnRoZW1lLXNlbGVjdG9yCmgze21hcmdp bi10b3A6MDt9ZGl2LmFkbWluLW9wdGlvbnN7YmFja2dyb3VuZDojZjhmOGY4O2xpbmUtaGVpZ2h0 OjMwcHg7aGVpZ2h0OjMwcHg7cGFkZGluZzo5cHg7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO21hcmdp bjowIDAgMTBweDt9ZGl2LmFkbWluLW9wdGlvbnMgbGFiZWx7dGV4dC10cmFuc2Zvcm06dXBwZXJj YXNlO2ZvbnQ6MC44NDZlbS8xLjg3NWVtIEx1Y2lkYSBHcmFuZGUsTHVjaWRhIFNhbnMgVW5pY29k ZSxzYW5zLXNlcmlmO31kaXYuYWRtaW4tb3B0aW9ucyBsYWJlbCxkaXYuYWRtaW4tb3B0aW9ucyBk aXYuZm9ybS1pdGVte21hcmdpbi1yaWdodDoxMHB4O2Zsb2F0OmxlZnQ7fWRpdi5hZG1pbi1vcHRp b25zIGRpdi5mb3JtLWl0ZW17cGFkZGluZzowO2JvcmRlcjowO30udmVyc2lvbnMgdGFibGUudmVy c2lvbntib3JkZXI6bm9uZTt9Ym9keS5pbi1tYWludGVuYW5jZSAjc2lkZWJhci1maXJzdHtmbG9h dDpsZWZ0O3dpZHRoOjIwMHB4O31ib2R5LmluLW1haW50ZW5hbmNlICNjb250ZW50e2Zsb2F0OnJp Z2h0O3dpZHRoOjU1MHB4O3BhZGRpbmctcmlnaHQ6MjBweDtjbGVhcjpub25lO31ib2R5LmluLW1h aW50ZW5hbmNlICNwYWdle292ZXJmbG93OmF1dG87d2lkdGg6NzcwcHg7bWFyZ2luOjAgYXV0bztw YWRkaW5nLXRvcDoyZW07fWJvZHkuaW4tbWFpbnRlbmFuY2UgI2JyYW5kaW5nCmgxe3dpZHRoOjc3 MHB4O21hcmdpbjowIGF1dG87ZmxvYXQ6bm9uZTt9Ym9keS5pbi1tYWludGVuYW5jZSAuZm9ybS1y YWRpb3MgLmZvcm0tdHlwZS1yYWRpb3twYWRkaW5nOjJweCAwO31ib2R5LmluLW1haW50ZW5hbmNl IGRpdi5mb3JtLWl0ZW06YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5Om5vbmU7Y2xlYXI6bm9uZTt9 Ym9keS5pbi1tYWludGVuYW5jZSAuZm9ybS1zdWJtaXR7ZGlzcGxheTpibG9jazt9Ym9keS5pbi1t YWludGVuYW5jZSAjbG9nb3ttYXJnaW4tYm90dG9tOjEuNWVtO21heC13aWR0aDoxODBweDt9b2wu dGFzay1saXN0e21hcmdpbi1sZWZ0OjA7bGlzdC1zdHlsZS10eXBlOm5vbmU7bGlzdC1zdHlsZS1p bWFnZTpub25lO31vbC50YXNrLWxpc3QgbGl7cGFkZGluZzowLjVlbSAxZW0gMC41ZW0gMjBweDtj b2xvcjojYWRhZGFkO31vbC50YXNrLWxpc3QgbGkuYWN0aXZle2JhY2tncm91bmQ6dHJhbnNwYXJl bnQgdXJsKC9zaXRlcy9hbGwvdGhlbWVzL2VpZ2h0L2ltYWdlcy90YXNrLWl0ZW0ucG5nKSBuby1y ZXBlYXQgM3B4IDUwJTtwYWRkaW5nOjAuNWVtIDFlbSAwLjVlbSAyMHB4O2NvbG9yOiMwMDA7fW9s LnRhc2stbGlzdCBsaS5kb25le2JhY2tncm91bmQ6dHJhbnNwYXJlbnQgdXJsKC9zaXRlcy9hbGwv dGhlbWVzL2VpZ2h0L2ltYWdlcy90YXNrLWNoZWNrLnBuZykgbm8tcmVwZWF0IDAKNTAlO2NvbG9y OmdyZWVuO30ub3ZlcmxheSAjYnJhbmRpbmd7YmFja2dyb3VuZC1jb2xvcjojZmZmO3BhZGRpbmct dG9wOjE1cHg7fS5vdmVybGF5ICNicmFuZGluZyBoMS5wYWdlLXRpdGxlLC5vdmVybGF5ICNsZWZ0 LC5vdmVybGF5ICNmb290ZXJ7ZGlzcGxheTpub25lO30ub3ZlcmxheSAjcGFnZXttYXJnaW46MDtw YWRkaW5nOjAgMjBweDt9Lm92ZXJsYXkgI2JyYW5kaW5nIGRpdi5icmVhZGNydW1ie2Zsb2F0Omxl ZnQ7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxMDt9I292ZXJsYXktdGFic3tib3R0b206LTFw eDtmb250LXNpemU6MS41NGVtO2xpbmUtaGVpZ2h0OjEuNTRlbTttYXJnaW46MDt9I292ZXJsYXkt dGFicyBsaXttYXJnaW46MCAtMnB4O30ub3ZlcmxheSB1bC5zZWNvbmRhcnl7YmFja2dyb3VuZDp0 cmFuc3BhcmVudCBub25lO21hcmdpbjotMS40ZW0gMCAwLjNlbSAwO292ZXJmbG93OnZpc2libGU7 fS5vdmVybGF5ICNjb250ZW50e3BhZGRpbmc6MDt9aDEjb3ZlcmxheS10aXRsZXtmb250LXdlaWdo dDpub3JtYWw7fWRpdi5hZGQtb3ItcmVtb3ZlLXNob3J0Y3V0c3tmbG9hdDpsZWZ0O3BhZGRpbmct dG9wOjZweDtwYWRkaW5nLWxlZnQ6NnB4O30jZGFzaGJvYXJkIC5kYXNoYm9hcmQtcmVnaW9uIGRp di5ibG9jayBoMntiYWNrZ3JvdW5kOiNFMEUwRDg7fSNkYXNoYm9hcmQgZGl2LmJsb2NrCmgye21h cmdpbjowO2ZvbnQtc2l6ZToxZW07cGFkZGluZzozcHggMTBweDt9I2Rhc2hib2FyZCBkaXYuYmxv Y2sgZGl2LmNvbnRlbnR7cGFkZGluZzoxMHB4IDVweCA1cHggNXB4O30jZGFzaGJvYXJkIGRpdi5i bG9jayBkaXYuY29udGVudCB1bC5tZW51e21hcmdpbi1sZWZ0OjIwcHg7fSNkYXNoYm9hcmQgLmRh c2hib2FyZC1yZWdpb24gLmJsb2Nre2JvcmRlcjojY2NjIDFweCBzb2xpZDt9I2ZpZWxkLWRpc3Bs YXktb3ZlcnZpZXcgaW5wdXQuZmllbGQtZm9ybWF0dGVyLXNldHRpbmdzLWVkaXR7bWFyZ2luOjA7 cGFkZGluZzoxcHggOHB4O30jZmllbGQtZGlzcGxheS1vdmVydmlldyB0ci5maWVsZC1mb3JtYXR0 ZXItc2V0dGluZ3MtY2hhbmdlZHtiYWNrZ3JvdW5kOiNGRkZGQkI7fSNmaWVsZC1kaXNwbGF5LW92 ZXJ2aWV3IHRyLmRyYWd7YmFja2dyb3VuZDojRkZFRTc3O30jZmllbGQtZGlzcGxheS1vdmVydmll dyB0ci5maWVsZC1mb3JtYXR0ZXItc2V0dGluZ3MtZWRpdGluZ3tiYWNrZ3JvdW5kOiNENUU5RjI7 fSNmaWVsZC1kaXNwbGF5LW92ZXJ2aWV3IC5maWVsZC1mb3JtYXR0ZXItc2V0dGluZ3MtZWRpdC1m b3JtIC5mb3JtLWl0ZW17bWFyZ2luOjEwcHggMDt9I2ZpZWxkLWRpc3BsYXktb3ZlcnZpZXcgLmZp ZWxkLWZvcm1hdHRlci1zZXR0aW5ncy1lZGl0LWZvcm0KLmZvcm0tc3VibWl0e21hcmdpbi1ib3R0 b206MDt9I2Rhc2hib2FyZCBkaXYjYmxvY2stbm9kZS1yZWNlbnQgZGl2LmNvbnRlbnR7cGFkZGlu ZzowO30jYmxvY2stbm9kZS1yZWNlbnQgdGFibGUsI2Jsb2NrLW5vZGUtcmVjZW50IHRye2JvcmRl cjpub25lO30jYmxvY2stbm9kZS1yZWNlbnQgLm1vcmUtbGlua3twYWRkaW5nOjAgNXB4IDVweCAw O30jdXNlci1sb2dpbi1mb3JtIC5vcGVuaWQtbGlua3N7bWFyZ2luLWxlZnQ6MDt9I3VzZXItbG9n aW4tZm9ybSAub3BlbmlkLWxpbmtzIC51c2VyLWxpbmt7bWFyZ2luLWxlZnQ6MS41ZW07fSNvdmVy bGF5LWRpc2FibGUtbWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNhZGRhZmM7fSNvdmVybGF5LWRp c2FibGUtbWVzc2FnZSBhLCNvdmVybGF5LWRpc2FibGUtbWVzc2FnZSBhOnZpc2l0ZWR7Y29sb3I6 IzAwMDt9I292ZXJsYXktZGlzYWJsZS1tZXNzYWdlIGE6Zm9jdXMsI292ZXJsYXktZGlzYWJsZS1t ZXNzYWdlIGE6YWN0aXZle291dGxpbmU6bm9uZTt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30u b3ZlcmxheS1kaXNhYmxlLW1lc3NhZ2UtZm9jdXNlZCBhe3BhZGRpbmc6MC40ZW0gMC42ZW07fS5v dmVybGF5LWRpc2FibGUtbWVzc2FnZS1mb2N1c2VkCiNvdmVybGF5LWRpc21pc3MtbWVzc2FnZXti YWNrZ3JvdW5kLWNvbG9yOiM1OWEwZDg7Y29sb3I6I2ZmZjstbW96LWJvcmRlci1yYWRpdXM6OHB4 Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo4cHg7Ym9yZGVyLXJhZGl1czo4cHg7fSNibG9jay1zeXN0 ZW0tbWFpbi1tZW51e30jYmxvY2stc3lzdGVtLW1haW4tbWVudSAuY29udGVudCB1bHtib3JkZXI6 M3B4IHNvbGlkICNEREREREQ7Ym9yZGVyLXJhZGl1czozcHg7ZGlzcGxheTpibG9jaztoZWlnaHQ6 MzJweDt3aWR0aDoxMTIxcHg7fSNibG9jay1zeXN0ZW0tbWFpbi1tZW51IC5jb250ZW50IHVsIGxp e2JhY2tncm91bmQtY29sb3I6I0VFRUVFRTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNEREREREQ7 ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O2hlaWdodDozMHB4O30jYmxvY2stc3lzdGVtLW1haW4t bWVudSAuY29udGVudCB1bCBsaTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNEREREREQ7fSNibG9j ay1zeXN0ZW0tbWFpbi1tZW51IC5jb250ZW50IHVsIGxpLmxhc3R7Ym9yZGVyLXJpZ2h0OjA7fSNi bG9jay1zeXN0ZW0tbWFpbi1tZW51IC5jb250ZW50IHVsIGxpIGE6bGluaywjYmxvY2stc3lzdGVt LW1haW4tbWVudSAuY29udGVudCB1bCBsaQphOnZpc2l0ZWR7Y29sb3I6I0ZGOTAwMDtkaXNwbGF5 OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDozMHB4O3RleHQtYWxpZ246Y2VudGVyO3dpZHRoOjE4 MHB4O30jYmxvY2stc3lzdGVtLW1haW4tbWVudSAuY29udGVudCB1bCBsaSBhOmhvdmVye3RleHQt ZGVjb3JhdGlvbjpub25lO2NvbG9yOiMwMDc0QkQ7fQoKICAgICAgLS0+CiAgICA8L3N0eWxlPgog ICAgICA8L2hlYWQ+CiAgPGJvZHkgaWQ9Im1pbWVtYWlsLWJvZHkiIGNsYXNzPSJub2RlIj4KICAg IDxkaXYgaWQ9ImNlbnRlciI+CiAgICAgIDxkaXYgaWQ9Im1haW4iPgogICAgICAgIDxoMj7OpM61 z4TPgc6xz4DPjc+BzrnOvc6xIEFuZHJvaWQgU21hcnRwaG9uZXM8L2gyPgo8ZGl2IGNsYXNzPSJj bGVhcmZpeCI+PGRpdiBjbGFzcz0iZmllbGQtaXRlbXMiPjxkaXYgY2xhc3M9ImZpZWxkLWl0ZW0g ZXZlbiI+PHA+wqA8L3A+PHAgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxpbWcgYWx0PSIi IHNyYz0iaHR0cDovL2kxMzU2LnBob3RvYnVja2V0LmNvbS9hbGJ1bXMvcTczMi9FeHBlcnRDb25z dWx0aW5nL3lvdXJwaG9uZS9VbnRpdGxlZC0xX3pwczU2MzkwMzZlLmpwZyIgLz48L3A+PHAgc3R5 bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgdGV4dC1hbGlnbjogY2VudGVyOyI+zpjOsSDOuM6tzrvO sc68zrUgzr3OsSDPg86xz4IgzrrOsc67z4nPg86/z4HOr8+Dzr/Phc68zrUgz4POtSDOvM65zrHC oDxiPs61zr3Osc67zrvOsc66z4TOuc66zq4gz4DPgc+Mz4TOsc+Dzrc8L2I+wqDPg8+Ezr/OvSDO us+Mz4POvM6/IM+EzrfPgiDPhM61z4fOvc6/zrvOv86zzq/Osc+CIM66zrHOuSDOtc+AzrnOus6/ zrnOvc+Jzr3Or86xz4IsIM+Dz4TOvyDOvc6tzr8gzrfOu861zrrPhM+Bzr/Ovc65zrrPjCDOvM6x z4IgzrrOsc+EzqzPg8+EzrfOvM6xITwvcD48cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyB0 ZXh0LWFsaWduOiBjZW50ZXI7Ij7OpM6/IM66zrHPhM6sz4PPhM63zrzOsSDOvM6xz4IsIM61zrnO tM65zrrOtc+NzrXPhM6xzrkgz4PPhM63zr0gzrXOuc+DzrHOs8+JzrPOriDPgM+Bzr/Pis+Mzr3P hM+Jzr3CoDxiPs+Fz4jOt867zq7PgiDPhM61z4fOvc6/zrvOv86zzq/Osc+CIM66zrnOvc63z4TO rs+CIM+EzrfOu861z4bPic69zq/Osc+CPC9iPizCoDxiPs+Dz4XPg8+Ezq7OvM6xz4TOsSBHUFMt TmF2aWdhdGlvbiwgTVAzLU1QNCwgzq7Ph86/z4IgzrHPhc+Ezr/Ous65zr3Ors+Ezr/PhSBNUDMs TVA0LFQuVixEVkQ8L2I+wqDOus6xzrkgzqzOu867z4nOvSDPgM+Bzr/Pis+Mzr3PhM+Jzr3CoDxi Ps+Fz4jOt867zq7PgiDPhM61z4fOvc6/zrvOv86zzq/Osc+CPC9iPi48L3A+PHAgc3R5bGU9Im1h cmdpbi1ib3R0b206IDBpbjsgdGV4dC1hbGlnbjogY2VudGVyOyI+zozPgM+Jz4IgzrPOuc6xIM+A zrHPgc6szrTOtc65zrPOvM6xIM+EzrEgz4DOsc+BzrHOus6sz4TPiSDOus65zr3Ot8+Ezqwgz4DO v8+FIM+EzrEgzq3Ph86/z4XOvSDPjM67zrEhPC9wPjxwPsKgPC9wPjxoMSBjbGFzcz0ibWFpbmJv eC10aXRsZSIgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBib3Jk ZXItcmlnaHQtd2lkdGg6IDFweDsgYm9yZGVyLXJpZ2h0LXN0eWxlOiBzb2xpZDsgYm9yZGVyLXJp Z2h0LWNvbG9yOiByZ2IoNDEsIDEwOSwgMTkzKTsgZm9udC1zaXplOiAxMXB4OyBoZWlnaHQ6IDIx cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsgZm9udC1m YW1pbHk6IFRhaG9tYSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWltYWdlOiB1 cmwoaHR0cDovL3lvdXJwaG9uZS5nci9za2lucy9kZWZhdWx0X2JsdWUvY3VzdG9tZXIvaW1hZ2Vz L21haW5ib3hfdGl0bGVfYmcuZ2lmKTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDcwLCAxMzQsIDIx MCk7IGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQgbm8tcmVwZWF0OyI+zqTOtc+Ez4HOsc+Az43P gc65zr3OvyBTNSBTbWFydCBQaG9uZSBBbmRyb2lkIDQuMi4xLCA1LjBgIEhEIM6/zrjPjM69zrcg MS4yRyA4RyAxMi42IE1waXhlbHMgY2FtZXJhIM66zrHOuSDOlc67zrvOt869zrnOus+MIM68zrXO vc6/z408L2gxPjxwIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij7CoDwvcD48cCBzdHlsZT0i bWFyZ2luLWJvdHRvbTogMGluOyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij48YSBocmVmPSJodHRwOi8v eW91cnBob25lLmdyL2luZGV4LnBocD90YXJnZXQ9cHJvZHVjdHMmYW1wO3Byb2R1Y3RfaWQ9MzA4 MTciIHRhcmdldD0iX2JsYW5rIj48aW1nIGFsdD0iIiBzcmM9Imh0dHA6Ly95b3VycGhvbmUuZ3Iv aW1hZ2UucGhwP29iamVjdF90eXBlPWRldGFpbGVkJmFtcDtpbWFnZV9pZD01MTE4IiBzdHlsZT0i d2lkdGg6IDI1MHB4OyBoZWlnaHQ6IDI1MHB4OyIgLz48L2E+PC9wPjxwIHN0eWxlPSJtYXJnaW4t Ym90dG9tOiAwaW47IHRleHQtYWxpZ246IGNlbnRlcjsiPjxzdHJvbmc+zpPOuc6xIM+EzrEgz4DO u86uz4HOtyDPh86xz4HOsc66z4TOt8+BzrnPg8+EzrnOus6sIM+EzrfPgiDPg8+Fz4POus61z4XO rs+CIM6xzrrOv867zr/Phc64zrXOr8+EzrUgz4TOv869wqA8YSBocmVmPSJodHRwOi8veW91cnBo b25lLmdyL2luZGV4LnBocD90YXJnZXQ9cHJvZHVjdHMmYW1wO3Byb2R1Y3RfaWQ9MzA4MTciPs+D z43Ovc60zrXPg868zr88L2E+Ljwvc3Ryb25nPjwvcD48cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTog MGluOyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij7CoDwvcD48cD7CoDwvcD48aDEgY2xhc3M9Im1haW5i b3gtdGl0bGUiIHN0eWxlPSJtYXJnaW4tdG9wOiAwcHg7IG1hcmdpbi1ib3R0b206IDBweDsgYm9y ZGVyLXJpZ2h0LXdpZHRoOiAxcHg7IGJvcmRlci1yaWdodC1zdHlsZTogc29saWQ7IGJvcmRlci1y aWdodC1jb2xvcjogcmdiKDQxLCAxMDksIDE5Myk7IGZvbnQtc2l6ZTogMTFweDsgaGVpZ2h0OiAy MXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7IGZvbnQt ZmFtaWx5OiBUYWhvbWEsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1pbWFnZTog dXJsKGh0dHA6Ly95b3VycGhvbmUuZ3Ivc2tpbnMvZGVmYXVsdF9ibHVlL2N1c3RvbWVyL2ltYWdl cy9tYWluYm94X3RpdGxlX2JnLmdpZik7IGJhY2tncm91bmQtY29sb3I6IHJnYig3MCwgMTM0LCAy MTApOyBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0IG5vLXJlcGVhdDsiPs6kzrXPhM+BzrHPgM+N z4HOuc69zr8gQ3Vib3QgU21hcnQgUGhvbmUgQW5kcm9pZCA0LjIgMS4yRyA4RyA0Ljdgzr/OuM+M zr3OtyBIRCDOvM61IDEzLjBNUCBDYW1lcmEgzrrOsc65IM6VzrvOu863zr3Ouc66z4wgzrzOtc69 zr/PjTwvaDE+PHAgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPsKgPC9wPjxwIHN0eWxlPSJt YXJnaW4tYm90dG9tOiAwaW47IHRleHQtYWxpZ246IGNlbnRlcjsiPjxhIGhyZWY9Imh0dHA6Ly95 b3VycGhvbmUuZ3IvaW5kZXgucGhwP3RhcmdldD1wcm9kdWN0cyZhbXA7cHJvZHVjdF9pZD0zMDgx OCIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgYWx0PSIiIHNyYz0iaHR0cDovL3lvdXJwaG9uZS5nci9p bWFnZS5waHA/b2JqZWN0X3R5cGU9ZGV0YWlsZWQmYW1wO2ltYWdlX2lkPTUxMjciIHN0eWxlPSJ3 aWR0aDogMjUwcHg7IGhlaWdodDogMjUwcHg7IiAvPjwvYT48L3A+PHAgc3R5bGU9Im1hcmdpbi1i b3R0b206IDBpbjsgdGV4dC1hbGlnbjogY2VudGVyOyI+PHN0cm9uZz7Ok865zrEgz4TOsSDPgM67 zq7Pgc63IM+HzrHPgc6xzrrPhM63z4HOuc+Dz4TOuc66zqwgz4TOt8+CIM+Dz4XPg866zrXPhc6u z4IgzrHOus6/zrvOv8+FzrjOtc6vz4TOtSDPhM6/zr3CoDxhIGhyZWY9Imh0dHA6Ly95b3VycGhv bmUuZ3IvaW5kZXgucGhwP3RhcmdldD1wcm9kdWN0cyZhbXA7cHJvZHVjdF9pZD0zMDgxOCI+z4PP jc69zrTOtc+DzrzOvzwvYT4uPC9zdHJvbmc+PC9wPjxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAw aW47IHRleHQtYWxpZ246IGNlbnRlcjsiPsKgPC9wPjxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAw aW47IHRleHQtYWxpZ246IGNlbnRlcjsiPjxiIHN0eWxlPSJsaW5lLWhlaWdodDogbm9ybWFsOyBm b250LWZhbWlseTogQ2FsaWJyaSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxNXB4OyI+PHNwYW4g c3R5bGU9ImZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgc2VyaWY7IGZvbnQtc2l6ZTog MThwdDsiPs6jzrUgz4zOu861z4Igz4TOuc+CIM6xzrPOv8+Bzq3PgiDOrM69z4kgz4TPic69IDUw IM61z4XPgc+OLCDPhM6xIM68zrXPhM6xz4bOv8+BzrnOus6sIM61zq/Ovc6xzrnCoDx1Ps6UzqnO oc6VzpHOnTwvdT4uPC9zcGFuPjwvYj48L3A+PHAgYWxpZ249ImNlbnRlciI+PHN0cm9uZz7Ok865 zrEgz4DOtc+BzrnPg8+Dz4zPhM61z4HOtc+CIM+AzrvOt8+Bzr/Phs6/z4HOr861z4IgzrXPgM65 zrrOv865zr3Pic69zq7Pg8+EzrUgzrzOsc62zq8gzrzOsc+CIM+Dz4RvIGVtYWlsOsKgPGEgaHJl Zj0ibWFpbHRvOnNhbGVzQHlvdXJwaG9uZS5nciI+c2FsZXNAeW91cnBob25lLmdyPC9hPjwvc3Ry b25nPjwvcD48cCBhbGlnbj0iY2VudGVyIj48c3Ryb25nPs6Mz4DPic+CIM61z4DOr8+DzrfPgiDO us6xzrkgzrzOrc+Dz4kgz4TOt8+CIM+Gz4zPgc68zrHPgiDOtc+AzrnOus6/zrnOvc+Jzr3Or86x z4IgzrzOsc+CwqA8YSBocmVmPSJodHRwOi8veW91cnBob25lLmdyL2luZGV4LnBocD90YXJnZXQ9 Zm9ybXMmYW1wO25hbWU9Y29udGFjdF91cyI+zrXOtM+OPC9hPi48L3N0cm9uZz48L3A+PHAgYWxp Z249ImNlbnRlciI+PHN0cm9uZz7OnM+Azr/Pgc61zq/PhM61IM6xzrrPjM68zrEgzr3OsSDOsc69 z4TOsc67zrvOrM6+zrXPhM61IM6xz4DPjM+IzrXOuc+CIM66zrHOuSDOvc6xIM66zqzOvc61z4TO tSDPhM6xIM+Dz4fPjM67zrnOsSDPg86xz4IgzrrOsc65IM+Dz4TOtyDPg861zrvOr860zrEgzrzO sc+CIM+Dz4TOv8KgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL3BhZ2VzL1lvdXJw aG9uZWdyLzE0MDY5MzU2MjY2MTM2NSI+RmFjZWJvb2s8L2E+Ljwvc3Ryb25nPjwvcD48cCBhbGln bj0iY2VudGVyIj48Yj7Ok865zrEgzr3OsSDOtM65zrHOs8+BzrHPhs61zq/PhM61IM6xz4DPjCDP hM63zr0gzrvOr8+Dz4TOsSDOvM6xz4IgzrzPgM6/z4HOtc6vz4TOtSDOvc6xIM6xz4DOv8+Dz4TO tc6vzrvOtc+EzrUgZW1haWwgz4PPhM6/OsKgPGEgaHJlZj0ibWFpbHRvOnJlbW92ZUB5b3VycGhv bmUuZ3IiPnJlbW92ZUB5b3VycGhvbmUuZ3I8L2E+PC9iPjwvcD48ZGl2PsKgPC9kaXY+PC9kaXY+ PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2xlYXJmaXgiPjxkaXYgY2xhc3M9ImZpZWxkLWl0ZW1z Ij48ZGl2IGNsYXNzPSJmaWVsZC1pdGVtIGV2ZW4iPllvdXJwaG9uZS5ncjwvZGl2PjwvZGl2Pjwv ZGl2PgoKICAgICAgPHAgY2xhc3M9Im5ld3NsZXR0ZXItZm9vdGVyIj48YSBocmVmPSJodHRwOi8v d29ybGRhZHYuZ3IvbmV3c2xldHRlci9jb25maXJtL3JlbW92ZS80YmE3MGQ5MTk2MTExNzV0MTEi PlVuc3Vic2NyaWJlIGZyb20gdGhpcyBuZXdzbGV0dGVyPC9hPjwvcD4KICAKICAgICAgPC9kaXY+ CiAgICA8L2Rpdj4KICA8L2JvZHk+CjwvaHRtbD4K --755e0ea6c55de58b2a8886b7fdd1994b-- --20602d7bc3d6d6481ebea44eac7b1d17-- From rjohnston@sgi.com Mon Apr 22 08:36:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 179787F37 for ; Mon, 22 Apr 2013 08:36:39 -0500 (CDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by relay2.corp.sgi.com (Postfix) with ESMTP id F2EA530404E for ; Mon, 22 Apr 2013 06:36:35 -0700 (PDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id A8EC8AAA6028; Mon, 22 Apr 2013 08:36:35 -0500 (CDT) Message-Id: <20130422133106.892072381@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Mon, 22 Apr 2013 08:31:06 -0500 From: rjohnston@sgi.com To: xfs@oss.sgi.com Subject: [V2] xfsprogs: xfs_quota allow user or group names beginning with digits Content-Disposition: inline; filename=V2-xfsprogs-xfs_quota-allow-user-or-group-names-beginning-with-digits.patch xfs_quota does not properly parse users or groups that begin with a number. Only call atoi when user or group consists of digits only. Signed-off-by: Rich Johnston Reviewed-by: Eric Sandeen --- V2: Change 'i=0' to 'i = 0' (sandeen suggestion) Use bool instead of boolean_t (dchinner suggestion) include/input.h | 1 + libxcmd/input.c | 12 ++++++++++++ quota/quota.c | 4 ++-- quota/quota.h | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) Index: xfsprogs/include/input.h =================================================================== --- xfsprogs.orig/include/input.h 2013-03-22 14:22:09.000000000 -0500 +++ xfsprogs/include/input.h 2013-04-22 08:10:56.000000000 -0500 @@ -22,6 +22,7 @@ #include #include #include +#include extern char **breakline(char *input, int *count); extern void doneline(char *input, char **vec); @@ -46,6 +47,7 @@ extern uid_t uid_from_string(char *user); extern gid_t gid_from_string(char *group); extern prid_t prid_from_string(char *project); +extern bool isdigits_only(const char *str); #define HAVE_FTW_H 1 /* TODO: configure me */ Index: xfsprogs/libxcmd/input.c =================================================================== --- xfsprogs.orig/libxcmd/input.c 2013-03-22 14:22:09.000000000 -0500 +++ xfsprogs/libxcmd/input.c 2013-04-22 08:07:01.000000000 -0500 @@ -19,6 +19,7 @@ #include #include #include +#include #if defined(ENABLE_READLINE) # include @@ -398,6 +399,18 @@ return -1; } +bool isdigits_only( + const char *str) +{ + int i; + + for (i = 0; i < strlen(str); i++) { + if (!isdigit(str[i])) + return false; + } + return true; +} + #define HAVE_FTW_H 1 /* TODO: configure me */ #ifndef HAVE_FTW_H Index: xfsprogs/quota/quota.c =================================================================== --- xfsprogs.orig/quota/quota.c 2013-03-22 14:22:09.000000000 -0500 +++ xfsprogs/quota/quota.c 2013-04-22 07:20:52.000000000 -0500 @@ -224,7 +224,7 @@ uid_t id; if (name) { - if (isdigit(name[0])) { + if (isdigits_only(name)) { id = atoi(name); name = getusername(id, flags & NO_LOOKUP_FLAG); } else if ((u = getpwnam(name))) { @@ -273,7 +273,7 @@ int i, ngroups, dofree = 0; if (name) { - if (isdigit(name[0])) { + if (isdigits_only(name)) { gid = atoi(name); name = getgroupname(gid, flags & NO_LOOKUP_FLAG); } else { Index: xfsprogs/quota/quota.h =================================================================== --- xfsprogs.orig/quota/quota.h 2013-03-22 14:22:09.000000000 -0500 +++ xfsprogs/quota/quota.h 2013-04-22 08:12:26.000000000 -0500 @@ -19,6 +19,7 @@ #include #include #include +#include /* * Different forms of XFS quota @@ -80,4 +81,5 @@ extern char *uid_to_name(__uint32_t __uid); extern char *gid_to_name(__uint32_t __gid); extern char *prid_to_name(__uint32_t __prid); +extern bool isdigits_only(const char *); From tinguely@sgi.com Mon Apr 22 08:45:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9051D7F3F for ; Mon, 22 Apr 2013 08:45:01 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5217A8F8068; Mon, 22 Apr 2013 06:45:01 -0700 (PDT) Message-ID: <51753EDE.6000301@sgi.com> Date: Mon, 22 Apr 2013 08:45:02 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails References: <20130419204102.736961610@sgi.com> <20130421174107.007313126@sgi.com> <5174603A.8030208@sandeen.net> In-Reply-To: <5174603A.8030208@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/21/13 16:55, Eric Sandeen wrote: > On 4/21/13 12:41 PM, Mark Tinguely wrote: > >> This problem happened locally with a bad inode number from xfs >> recovery. xfs_perag_get() can return NULL if given a bad agno. >> Most callers of xfs_perag_get() do not check for a NULL before >> using the pointer. This patch forces a shutdown of the filesystem >> for those callers that do not check the return value rather than >> crashing on a dereferenced NULL pointer. > > Hi Mark - > > I'm curious, what was the callchain when this happened? Was it > during recovery? If so, would aborting recovery be more prudent? > > I might be missing something, but I'm not sure how shutting > down avoids a subsequent null ptr deref& crash. > > i.e. if a caller does something like: > > pag = xfs_perag_get(mp, agno); > spin_lock(&pag->pagb_lock); > > shutting down in xfs_perag_get doesn't save us from a > null pag pointer, would it? > > Thanks, > -Eric You are correct, we have to exit the routine(s) to avoid the dereference. Let the callers handle the error. Sorry for the noise. --Mark. From rjohnston@sgi.com Mon Apr 22 08:45:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E50AE7F3F for ; Mon, 22 Apr 2013 08:45:15 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id A429B8F8037; Mon, 22 Apr 2013 06:45:15 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 22 Apr 2013 08:45:15 -0500 Message-ID: <51753EF6.6040905@sgi.com> Date: Mon, 22 Apr 2013 08:45:26 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eric Sandeen CC: Eric Sandeen , linux-btrfs , xfs-oss Subject: Re: [PATCH V3] xfstests: fix common filter include in filter.btrfs References: <517386CC.8010406@redhat.com> <51746D07.5090300@sandeen.net> <51746D8A.60707@sandeen.net> In-Reply-To: <51746D8A.60707@sandeen.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/21/2013 05:51 PM, Eric Sandeen wrote: > Not sure how this happened, but filter.btrfs including > itself leads to immense sadness for any file that includes it. > (I got a segfault when I tried to run 307) > > It should be including ./common/filter not ./common/filter.btrfs > > Signed-off-by: Eric Sandeen > --- > > cripes, I'm sorry that took 3 times to get right :/ > Third time is the charm ;) Looks good. Reviewed-by: Rich Johnston From rjohnston@sgi.com Mon Apr 22 08:51:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1A8C67F37 for ; Mon, 22 Apr 2013 08:51:47 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 05C918F8054; Mon, 22 Apr 2013 06:51:46 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 22 Apr 2013 08:51:46 -0500 Message-ID: <5175407D.5020608@sgi.com> Date: Mon, 22 Apr 2013 08:51:57 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Wang Sheng-Hui CC: xfstests , Dave Chinner Subject: Re: [PATCH v3] xfstests: make install support common/ and tests/ dirs References: <516937F9.1020101@gmail.com> <516BFA10.6020102@sgi.com> In-Reply-To: <516BFA10.6020102@sgi.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/15/2013 08:01 AM, Rich Johnston wrote: > > Will revert v2 (git revert 2519a97d) and commit with this minor change > is Dave agrees to your latest version. > Dave, May I put your Reviewed-by: on V3 of this patch? Thanks --Rich From sandeen@sandeen.net Mon Apr 22 09:32:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CF40D7F37 for ; Mon, 22 Apr 2013 09:32:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9EE748F8054 for ; Mon, 22 Apr 2013 07:32:53 -0700 (PDT) X-ASG-Debug-ID: 1366641172-04bdf02d1f4c92e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 8YWFdnwhlPB41wum for ; Mon, 22 Apr 2013 07:32:52 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1DBC963C59BB; Mon, 22 Apr 2013 09:32:52 -0500 (CDT) Message-ID: <51754A13.5000808@sandeen.net> Date: Mon, 22 Apr 2013 09:32:51 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails References: <20130419204102.736961610@sgi.com> <20130421174107.007313126@sgi.com> <5174603A.8030208@sandeen.net> <51753EDE.6000301@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails In-Reply-To: <51753EDE.6000301@sgi.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366641172 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128843 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/22/13 8:45 AM, Mark Tinguely wrote: > On 04/21/13 16:55, Eric Sandeen wrote: >> On 4/21/13 12:41 PM, Mark Tinguely wrote: >> >>> This problem happened locally with a bad inode number from xfs >>> recovery. xfs_perag_get() can return NULL if given a bad agno. >>> Most callers of xfs_perag_get() do not check for a NULL before >>> using the pointer. This patch forces a shutdown of the filesystem >>> for those callers that do not check the return value rather than >>> crashing on a dereferenced NULL pointer. >> >> Hi Mark - >> >> I'm curious, what was the callchain when this happened? Was it >> during recovery? If so, would aborting recovery be more prudent? >> >> I might be missing something, but I'm not sure how shutting >> down avoids a subsequent null ptr deref& crash. >> >> i.e. if a caller does something like: >> >> pag = xfs_perag_get(mp, agno); >> spin_lock(&pag->pagb_lock); >> >> shutting down in xfs_perag_get doesn't save us from a >> null pag pointer, would it? >> >> Thanks, >> -Eric > > You are correct, we have to exit the routine(s) to avoid the dereference. Let the callers handle the error. > > Sorry for the noise. No problem, glad I'm useful on the rare occasion. ;) Can you share the backtrace on the null deref you saw? Thanks, -Eric From rjohnston@sgi.com Mon Apr 22 09:35:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 471627F3F for ; Mon, 22 Apr 2013 09:35:53 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id AAC07AC00F; Mon, 22 Apr 2013 07:35:49 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 22 Apr 2013 09:35:49 -0500 Message-ID: <51754AD0.3060507@sgi.com> Date: Mon, 22 Apr 2013 09:36:00 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss , linux-btrfs Subject: Re: [PATCH] xfstests: remove recursive include in filter.btrfs References: <517386CC.8010406@redhat.com> In-Reply-To: <517386CC.8010406@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks for the patch Eric, V3 has been committed. --Rich commit e771c54c45a5c475bedbc5a2d6becc05be940dba Author: Eric Sandeen Date: Sun Apr 21 22:51:54 2013 +0000 xfstests: fix common filter include in filter.btrfs From tinguely@sgi.com Mon Apr 22 10:11:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 903927F37 for ; Mon, 22 Apr 2013 10:11:38 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6A1428F8037; Mon, 22 Apr 2013 08:11:35 -0700 (PDT) Message-ID: <5175532B.3050509@sgi.com> Date: Mon, 22 Apr 2013 10:11:39 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails References: <20130419204102.736961610@sgi.com> <20130421174107.007313126@sgi.com> <5174603A.8030208@sandeen.net> <51753EDE.6000301@sgi.com> <51754A13.5000808@sandeen.net> In-Reply-To: <51754A13.5000808@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/22/13 09:32, Eric Sandeen wrote: > On 4/22/13 8:45 AM, Mark Tinguely wrote: >> On 04/21/13 16:55, Eric Sandeen wrote: >>> On 4/21/13 12:41 PM, Mark Tinguely wrote: >>> >>>> This problem happened locally with a bad inode number from xfs >>>> recovery. xfs_perag_get() can return NULL if given a bad agno. >>>> Most callers of xfs_perag_get() do not check for a NULL before >>>> using the pointer. This patch forces a shutdown of the filesystem >>>> for those callers that do not check the return value rather than >>>> crashing on a dereferenced NULL pointer. >>> >>> Hi Mark - >>> >>> I'm curious, what was the callchain when this happened? Was it >>> during recovery? If so, would aborting recovery be more prudent? >>> >>> I might be missing something, but I'm not sure how shutting >>> down avoids a subsequent null ptr deref& crash. >>> >>> i.e. if a caller does something like: >>> >>> pag = xfs_perag_get(mp, agno); >>> spin_lock(&pag->pagb_lock); >>> >>> shutting down in xfs_perag_get doesn't save us from a >>> null pag pointer, would it? >>> >>> Thanks, >>> -Eric >> >> You are correct, we have to exit the routine(s) to avoid the dereference. Let the callers handle the error. >> >> Sorry for the noise. > > No problem, glad I'm useful on the rare occasion. ;) > > Can you share the backtrace on the null deref you saw? > > Thanks, > -Eric > PID: 7965 TASK: ffff88013566c040 CPU: 0 COMMAND: "mount" #0 [ffff8801356035d0] machine_kexec at ffffffff810265ce #1 [ffff880135603620] crash_kexec at ffffffff810a3b5a #2 [ffff8801356036f0] oops_end at ffffffff81442de8 #3 [ffff880135603710] __bad_area_nosemaphore at ffffffff81032995 #4 [ffff8801356037d0] do_page_fault at ffffffff8144558b #5 [ffff8801356038d0] page_fault at ffffffff81442065 [exception RIP: _raw_spin_lock+5] RIP: ffffffff81441985 RSP: ffff880135603980 RFLAGS: 00010206 RAX: 0000000000010000 RBX: ffff880135530340 RCX: 0000000000000000 RDX: 0000000000000001 RSI: 0000000000000013 RDI: 0000000000000090 RBP: 0000000000000000 R8: 0000000000000000 R9: 0000000000000003 R10: ffff880134d96d00 R11: ffffffff8101ff60 R12: 0000000000000000 R13: 00000042bb4c2000 R14: 0000000000002000 R15: ffff880135530340 ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018 #6 [ffff880135603980] _xfs_buf_find at ffffffffa01a7fef [xfs] #7 [ffff8801356039f0] xfs_buf_get at ffffffffa01a824a [xfs] #8 [ffff880135603a30] xfs_buf_read at ffffffffa01a83a4 [xfs] #9 [ffff880135603a60] xlog_recover_inode_pass2 at ffffffffa0193629 [xfs] #10 [ffff880135603ac0] xlog_recover_commit_trans at ffffffffa0194166 [xfs] #11 [ffff880135603af0] xlog_recover_process_data at ffffffffa0194351 [xfs] #12 [ffff880135603b50] xlog_do_recovery_pass at ffffffffa0194804 [xfs] #13 [ffff880135603c80] xlog_do_log_recovery at ffffffffa0194aa7 [xfs] #14 [ffff880135603cb0] xlog_do_recover at ffffffffa0194aea [xfs] #15 [ffff880135603cd0] xlog_recover at ffffffffa019592e [xfs] #16 [ffff880135603cf0] xfs_log_mount at ffffffffa018d524 [xfs] #17 [ffff880135603d20] xfs_mountfs at ffffffffa0198a13 [xfs] #18 [ffff880135603d70] xfs_fs_fill_super at ffffffffa01b0ac9 [xfs] #19 [ffff880135603db0] mount_bdev at ffffffff811544fe #20 [ffff880135603e20] mount_fs at ffffffff81153ece #21 [ffff880135603e60] vfs_kern_mount at ffffffff8116f975 #22 [ffff880135603e90] do_kern_mount at ffffffff8116fa63 #23 [ffff880135603ed0] do_mount at ffffffff81170a7d #24 [ffff880135603f30] sys_mount at ffffffff81170b80 #25 [ffff880135603f80] system_call_fastpath at ffffffff81449692 RIP: 00007fd46cac51ea RSP: 00007fff910bdde8 RFLAGS: 00010206 RAX: 00000000000000a5 RBX: ffffffff81449692 RCX: ffffffffc0ed0000 RDX: 0000000000626fb0 RSI: 000000000061de90 RDI: 000000000061de70 RBP: 00007fff910be0cc R8: 0000000000000000 R9: 00007fff910bdad0 R10: ffffffffc0ed0000 R11: 0000000000000206 R12: 0000000000626fb0 R13: 0000000000000000 R14: 00000000c0ed0000 R15: 00007fff910be040 ORIG_RAX: 00000000000000a5 CS: 0033 SS: 002b The recovery value is bad and is a problem on its own, but XFS does not verify the validity of ag number when doing a xfs_perag_get(). --Mark. From rjohnston@sgi.com Mon Apr 22 10:18:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0BDF87F37 for ; Mon, 22 Apr 2013 10:18:53 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8473E8F8066; Mon, 22 Apr 2013 08:18:52 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 22 Apr 2013 10:18:52 -0500 Message-ID: <517554E7.7020408@sgi.com> Date: Mon, 22 Apr 2013 10:19:03 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Dmitry Monakhov CC: , , , Subject: Re: [PATCH 1/2] xfstests: dump _require_fio output to log References: <1366024188-21756-1-git-send-email-dmonakhov@openvz.org> In-Reply-To: <1366024188-21756-1-git-send-email-dmonakhov@openvz.org> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Yes I agree this will help, looks good. --Rich Reviewed-by: Rich Johnston From rjohnston@sgi.com Mon Apr 22 10:21:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C9C567F37 for ; Mon, 22 Apr 2013 10:21:11 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8559E30407B; Mon, 22 Apr 2013 08:21:11 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 22 Apr 2013 10:21:09 -0500 Message-ID: <51755570.9070908@sgi.com> Date: Mon, 22 Apr 2013 10:21:20 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Dmitry Monakhov CC: , , , Subject: Re: [PATCH 2/2] xfstests: fix fio's arguments References: <1366024188-21756-1-git-send-email-dmonakhov@openvz.org> <1366024188-21756-2-git-send-email-dmonakhov@openvz.org> In-Reply-To: <1366024188-21756-2-git-send-email-dmonakhov@openvz.org> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Looks good. --Rich Reviewed-by: Rich Johnston From rjohnston@sgi.com Mon Apr 22 10:30:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A30C87F4C for ; Mon, 22 Apr 2013 10:30:39 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 71B1D304070; Mon, 22 Apr 2013 08:30:39 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 22 Apr 2013 10:30:39 -0500 Message-ID: <517557AA.2040305@sgi.com> Date: Mon, 22 Apr 2013 10:30:50 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Dmitry Monakhov CC: , , , Subject: Re: [PATCH 1/2] xfstests: dump _require_fio output to log References: <1366024188-21756-1-git-send-email-dmonakhov@openvz.org> In-Reply-To: <1366024188-21756-1-git-send-email-dmonakhov@openvz.org> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/15/2013 06:09 AM, Dmitry Monakhov wrote: > diff --git a/tests/ext4/301 b/tests/ext4/301 > old mode 100644 > new mode 100755 > Sorry I forgot to mention this change was unrelated to this patch. tests/ext4/30? are changed to 755 in commit 'ca9fe94e'. Thanks for this patch Dmitry, it has been committed. --Rich commit 6105b952f46cddf88029d14857cb2658cdab2d52 Author: Dmitry Monakhov Date: Mon Apr 15 11:09:47 2013 +0000 xfstests: dump _require_fio output to log This should help find incompatibility issues. From rjohnston@sgi.com Mon Apr 22 10:31:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 53D217F52 for ; Mon, 22 Apr 2013 10:31:16 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id CA9F830404E; Mon, 22 Apr 2013 08:31:15 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 22 Apr 2013 10:31:15 -0500 Message-ID: <517557CE.9030307@sgi.com> Date: Mon, 22 Apr 2013 10:31:26 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Dmitry Monakhov CC: , , , Subject: Re: [PATCH 2/2] xfstests: fix fio's arguments References: <1366024188-21756-1-git-send-email-dmonakhov@openvz.org> <1366024188-21756-2-git-send-email-dmonakhov@openvz.org> In-Reply-To: <1366024188-21756-2-git-send-email-dmonakhov@openvz.org> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks for this patch Dmitry, it has been committed. --Rich commit ca9fe94e2d5fa4a8e405384ff5dd867b60a00864 Author: Dmitry Monakhov Date: Mon Apr 15 11:09:48 2013 +0000 xfstests: fix fio's arguments From sekharan@us.ibm.com Mon Apr 22 11:19:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7D0937F37 for ; Mon, 22 Apr 2013 11:19:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0E0AAAC004 for ; Mon, 22 Apr 2013 09:19:06 -0700 (PDT) X-ASG-Debug-ID: 1366647542-04cbb057f74a9770001-NocioJ Received: from e9.ny.us.ibm.com (e9.ny.us.ibm.com [32.97.182.139]) by cuda.sgi.com with ESMTP id zAFxK6OH4rge9cNq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 22 Apr 2013 09:19:02 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.139 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] Received: from /spool/local by e9.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 22 Apr 2013 12:19:02 -0400 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.139] Received: from d01dlp02.pok.ibm.com (9.56.250.167) by e9.ny.us.ibm.com (192.168.1.109) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 22 Apr 2013 12:18:59 -0400 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by d01dlp02.pok.ibm.com (Postfix) with ESMTP id A8B5A6E8083 for ; Mon, 22 Apr 2013 12:18:50 -0400 (EDT) Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay02.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3MGIm4D270618 for ; Mon, 22 Apr 2013 12:18:48 -0400 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3MGIltj016203 for ; Mon, 22 Apr 2013 13:18:47 -0300 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3MGIlF0016114; Mon, 22 Apr 2013 13:18:47 -0300 Subject: Re: [V2] xfsprogs: xfs_quota allow user or group names beginning with digits From: Chandra Seetharaman X-ASG-Orig-Subj: Re: [V2] xfsprogs: xfs_quota allow user or group names beginning with digits Reply-To: sekharan@us.ibm.com To: rjohnston@sgi.com Cc: xfs@oss.sgi.com In-Reply-To: <20130422133106.892072381@sgi.com> References: <20130422133106.892072381@sgi.com> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Mon, 22 Apr 2013 11:18:46 -0500 Message-ID: <1366647526.3762.32396.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13042216-7182-0000-0000-00000657495F X-Barracuda-Connect: e9.ny.us.ibm.com[32.97.182.139] X-Barracuda-Start-Time: 1366647542 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Is there any specific reason why quota_proj_type() is not changed ? On Mon, 2013-04-22 at 08:31 -0500, rjohnston@sgi.com wrote: > plain text document attachment > (V2-xfsprogs-xfs_quota-allow-user-or-group-names-beginning-with-digits.patch) > xfs_quota does not properly parse users or groups that begin with a number. > Only call atoi when user or group consists of digits only. > > Signed-off-by: Rich Johnston > Reviewed-by: Eric Sandeen > > --- > V2: > Change 'i=0' to 'i = 0' (sandeen suggestion) > Use bool instead of boolean_t (dchinner suggestion) > > include/input.h | 1 + > libxcmd/input.c | 12 ++++++++++++ > quota/quota.c | 4 ++-- > quota/quota.h | 1 + > 4 files changed, 16 insertions(+), 2 deletions(-) > > Index: xfsprogs/include/input.h > =================================================================== > --- xfsprogs.orig/include/input.h 2013-03-22 14:22:09.000000000 -0500 > +++ xfsprogs/include/input.h 2013-04-22 08:10:56.000000000 -0500 > @@ -22,6 +22,7 @@ > #include > #include > #include > +#include > > extern char **breakline(char *input, int *count); > extern void doneline(char *input, char **vec); > @@ -46,6 +47,7 @@ > extern uid_t uid_from_string(char *user); > extern gid_t gid_from_string(char *group); > extern prid_t prid_from_string(char *project); > +extern bool isdigits_only(const char *str); > > #define HAVE_FTW_H 1 /* TODO: configure me */ > > Index: xfsprogs/libxcmd/input.c > =================================================================== > --- xfsprogs.orig/libxcmd/input.c 2013-03-22 14:22:09.000000000 -0500 > +++ xfsprogs/libxcmd/input.c 2013-04-22 08:07:01.000000000 -0500 > @@ -19,6 +19,7 @@ > #include > #include > #include > +#include > > #if defined(ENABLE_READLINE) > # include > @@ -398,6 +399,18 @@ > return -1; > } > > +bool isdigits_only( > + const char *str) > +{ > + int i; > + > + for (i = 0; i < strlen(str); i++) { > + if (!isdigit(str[i])) > + return false; > + } > + return true; > +} > + > #define HAVE_FTW_H 1 /* TODO: configure me */ > > #ifndef HAVE_FTW_H > Index: xfsprogs/quota/quota.c > =================================================================== > --- xfsprogs.orig/quota/quota.c 2013-03-22 14:22:09.000000000 -0500 > +++ xfsprogs/quota/quota.c 2013-04-22 07:20:52.000000000 -0500 > @@ -224,7 +224,7 @@ > uid_t id; > > if (name) { > - if (isdigit(name[0])) { > + if (isdigits_only(name)) { > id = atoi(name); > name = getusername(id, flags & NO_LOOKUP_FLAG); > } else if ((u = getpwnam(name))) { > @@ -273,7 +273,7 @@ > int i, ngroups, dofree = 0; > > if (name) { > - if (isdigit(name[0])) { > + if (isdigits_only(name)) { > gid = atoi(name); > name = getgroupname(gid, flags & NO_LOOKUP_FLAG); > } else { > Index: xfsprogs/quota/quota.h > =================================================================== > --- xfsprogs.orig/quota/quota.h 2013-03-22 14:22:09.000000000 -0500 > +++ xfsprogs/quota/quota.h 2013-04-22 08:12:26.000000000 -0500 > @@ -19,6 +19,7 @@ > #include > #include > #include > +#include > > /* > * Different forms of XFS quota > @@ -80,4 +81,5 @@ > extern char *uid_to_name(__uint32_t __uid); > extern char *gid_to_name(__uint32_t __gid); > extern char *prid_to_name(__uint32_t __prid); > +extern bool isdigits_only(const char *); > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From mercedesbenz@info.net Mon Apr 22 11:23:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AA0687F37 for ; Mon, 22 Apr 2013 11:23:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 949D68F8092 for ; Mon, 22 Apr 2013 09:23:25 -0700 (PDT) X-ASG-Debug-ID: 1366647803-04cbb057f54a9d90001-NocioJ Received: from smtpgp.orange.sn (smtpgp.orange.sn [213.154.64.101]) by cuda.sgi.com with ESMTP id V11avFJ130Cmx9P2 for ; Mon, 22 Apr 2013 09:23:23 -0700 (PDT) X-Barracuda-Envelope-From: mercedesbenz@info.net X-Barracuda-Apparent-Source-IP: 213.154.64.101 Received: from mailrelay2.orange.sn (HELO mailrelay.orange.sn) ([213.154.64.114]) by smtpgp.orange.sn with ESMTP; 22 Apr 2013 16:19:17 +0000 Received: from [213.154.64.105] (helo=webmail.orange.sn) by mailrelay.orange.sn with esmtp (Exim 4.63) (envelope-from ) id 1UUJWV-0005pQ-0N; Mon, 22 Apr 2013 16:23:23 +0000 Received: from 41.203.67.55 (SquirrelMail authenticated user abgueye@orange.sn) by webmail.orange.sn with HTTP; Mon, 22 Apr 2013 16:23:23 -0000 (UTC) Message-ID: <51842.41.203.67.55.1366647803.squirrel@webmail.orange.sn> Date: Mon, 22 Apr 2013 16:23:23 -0000 (UTC) Subject: Re: From: "MERCEDES BENZ OFFICE" X-ASG-Orig-Subj: Re: Reply-To: mercedes.benz@admin.in.th User-Agent: SquirrelMail/1.4.10a MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-Barracuda-Connect: smtpgp.orange.sn[213.154.64.101] X-Barracuda-Start-Time: 1366647803 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 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=MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128851 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; Did you receive Our last notification? From rjohnston@sgi.com Mon Apr 22 11:39:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5524B7F37 for ; Mon, 22 Apr 2013 11:39:05 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 35D0130407E; Mon, 22 Apr 2013 09:39:02 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 22 Apr 2013 11:39:01 -0500 Message-ID: <517567B1.60704@sgi.com> Date: Mon, 22 Apr 2013 11:39:13 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: CC: Subject: Re: [V2] xfsprogs: xfs_quota allow user or group names beginning with digits References: <20130422133106.892072381@sgi.com> <1366647526.3762.32396.camel@chandra-dt.ibm.com> In-Reply-To: <1366647526.3762.32396.camel@chandra-dt.ibm.com> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/22/2013 11:18 AM, Chandra Seetharaman wrote: > > Is there any specific reason why quota_proj_type() is not changed ? > Yes project quota's were being punished. ;) Good catch Chandra, I will submit a V3. 3 times seems to be the charm on patches. :D Thanks --Rich > On Mon, 2013-04-22 at 08:31 -0500, rjohnston@sgi.com wrote: >> Index: xfsprogs/quota/quota.c >> =================================================================== >> --- xfsprogs.orig/quota/quota.c 2013-03-22 14:22:09.000000000 -0500 >> +++ xfsprogs/quota/quota.c 2013-04-22 07:20:52.000000000 -0500 >> @@ -224,7 +224,7 @@ >> uid_t id; >> >> if (name) { >> - if (isdigit(name[0])) { >> + if (isdigits_only(name)) { >> id = atoi(name); >> name = getusername(id, flags & NO_LOOKUP_FLAG); >> } else if ((u = getpwnam(name))) { >> @@ -273,7 +273,7 @@ >> int i, ngroups, dofree = 0; >> >> if (name) { >> - if (isdigit(name[0])) { >> + if (isdigits_only(name)) { >> gid = atoi(name); >> name = getgroupname(gid, flags & NO_LOOKUP_FLAG); >> } else { >> Index: xfsprogs/quota/quota.h >> =================================================================== >> --- xfsprogs.orig/quota/quota.h 2013-03-22 14:22:09.000000000 -0500 >> +++ xfsprogs/quota/quota.h 2013-04-22 08:12:26.000000000 -0500 >> @@ -19,6 +19,7 @@ >> #include >> #include >> #include >> +#include >> >> /* >> * Different forms of XFS quota >> @@ -80,4 +81,5 @@ >> extern char *uid_to_name(__uint32_t __uid); >> extern char *gid_to_name(__uint32_t __gid); >> extern char *prid_to_name(__uint32_t __prid); >> +extern bool isdigits_only(const char *); >> >> >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> > > From rjohnston@sgi.com Mon Apr 22 12:46:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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, T_FILL_THIS_FORM_SHORT autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6E6097F37 for ; Mon, 22 Apr 2013 12:46:29 -0500 (CDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9AC1A304070; Mon, 22 Apr 2013 10:46:25 -0700 (PDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id D03B3ABDD99F; Mon, 22 Apr 2013 12:46:23 -0500 (CDT) Message-Id: <20130422173205.877894469@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Mon, 22 Apr 2013 12:32:05 -0500 From: rjohnston@sgi.com To: xfs@oss.sgi.com Cc: Dave Chinner , Eric Sandeen , Chandra Seetharaman Subject: [PATCH V3] xfsprogs: xfs_quota allow user or group names beginning with Content-Disposition: inline; filename=V3-xfsprogs-xfs_quota-allow-user-or-group-names-beginning-with-digits.patch digits xfs_quota does not properly parse users or groups that begin with a number. Only call atoi when user or group consists of digits only. Signed-off-by: Rich Johnston Reviewed-by: Eric Sandeen --- Fresh clone of xfsprogs showed I missed a change in quota_proj_type() (Thanks Chandra pointing that out) V2: Change 'i=0' to 'i = 0' (sandeen suggestion) Use bool instead of boolean_t (dchinner suggestion) V3: Also change quota_proj_type() to use isdigits_only() (sekharan suggestion) include/input.h | 2 ++ libxcmd/input.c | 13 +++++++++++++ quota/quota.c | 6 +++--- quota/quota.h | 2 ++ 4 files changed, 20 insertions(+), 3 deletions(-) Index: b/include/input.h =================================================================== --- a/include/input.h +++ b/include/input.h @@ -22,6 +22,7 @@ #include #include #include +#include extern char **breakline(char *input, int *count); extern void doneline(char *input, char **vec); @@ -46,6 +47,7 @@ extern void timestr(struct timeval *tv, extern uid_t uid_from_string(char *user); extern gid_t gid_from_string(char *group); extern prid_t prid_from_string(char *project); +extern bool isdigits_only(const char *str); #define HAVE_FTW_H 1 /* TODO: configure me */ Index: b/libxcmd/input.c =================================================================== --- a/libxcmd/input.c +++ b/libxcmd/input.c @@ -19,6 +19,7 @@ #include #include #include +#include #if defined(ENABLE_READLINE) # include @@ -398,6 +399,18 @@ gid_from_string( return -1; } +bool isdigits_only( + const char *str) +{ + int i; + + for (i = 0; i < strlen(str); i++) { + if (!isdigit(str[i])) + return false; + } + return true; +} + #define HAVE_FTW_H 1 /* TODO: configure me */ #ifndef HAVE_FTW_H Index: b/quota/quota.c =================================================================== --- a/quota/quota.c +++ b/quota/quota.c @@ -224,7 +224,7 @@ quota_user_type( uid_t id; if (name) { - if (isdigit(name[0])) { + if (isdigits_only(name)) { id = atoi(name); name = getusername(id, flags & NO_LOOKUP_FLAG); } else if ((u = getpwnam(name))) { @@ -273,7 +273,7 @@ quota_group_type( int i, ngroups, dofree = 0; if (name) { - if (isdigit(name[0])) { + if (isdigits_only(name)) { gid = atoi(name); name = getgroupname(gid, flags & NO_LOOKUP_FLAG); } else { @@ -344,7 +344,7 @@ quota_proj_type( return; } - if (isdigit(name[0])) { + if (isdigits_only(name)) { id = atoi(name); name = getprojectname(id, flags & NO_LOOKUP_FLAG); } else if ((p = getprnam(name))) { Index: b/quota/quota.h =================================================================== --- a/quota/quota.h +++ b/quota/quota.h @@ -19,6 +19,7 @@ #include #include #include +#include /* * Different forms of XFS quota @@ -80,4 +81,5 @@ enum { extern char *uid_to_name(__uint32_t __uid); extern char *gid_to_name(__uint32_t __gid); extern char *prid_to_name(__uint32_t __prid); +extern bool isdigits_only(const char *); From rjohnston@sgi.com Mon Apr 22 13:25:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7FDD27F37 for ; Mon, 22 Apr 2013 13:25:22 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 40EE08F8089; Mon, 22 Apr 2013 11:25:19 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 22 Apr 2013 13:25:18 -0500 Message-ID: <51758099.9030302@sgi.com> Date: Mon, 22 Apr 2013 13:25:29 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: "Michael L. Semon" CC: Dave Chinner , xfstests Subject: Re: xfstests: kludge patch for per-dir test number sorting by ./check References: <5169C4FE.4030209@gmail.com> <20130414232600.GA5117@destitution> <516B740A.1050607@gmail.com> In-Reply-To: <516B740A.1050607@gmail.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/14/2013 10:29 PM, Michael L. Semon wrote: > On 04/14/2013 07:26 PM, Dave Chinner wrote: >> On Sat, Apr 13, 2013 at 04:50:06PM -0400, Michael L. Semon wrote: >>> I'm trying to get the new xfstests to run the XFS tests first, then >> >> The question is why do you want to do this? Is there any specific >> reason for running the tests in that order? >> >> FWIW, if all you want to do is run the xfs tests, run: >> >> $ sudo ./check xfs[0-9][0-9][0-9] >> >> Cheers, >> >> Dave. >> > > Personal preference. I'd like to run both series of tests, sometimes > attended, sometimes unattended. It's fine if a generic/ test crashes > the PC while running unattended, but I'd much rather the xfs/ tests have > first crack at that. > > My version of the syntax was `./check xfs/[0-9][0-9][0-9]`, but that > becomes rough when skipping tests. I'll still try your version, but I think this is a reasonable change request and I can see how this would be very rough if you wanted to skip tests. Anyone have a reason why not to do this? Regards, --Rich > irrationality and frustration have driven me to simply adding a "mls" > group to all of the tests//group files, then hoping that a > `./check -g mls` would run everything in the correct order. That led to > trying to figure out why the generic/ tests were running first, and so > on and so forth... > > Thanks! > > Michael From bpm@sgi.com Mon Apr 22 13:55:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 241107F37 for ; Mon, 22 Apr 2013 13:55:51 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id E675F8F8087 for ; Mon, 22 Apr 2013 11:55:50 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id A8E96500B4C; Mon, 22 Apr 2013 13:55:50 -0500 (CDT) Date: Mon, 22 Apr 2013 13:55:50 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 15/22] xfs: add CRCs to dir2/da node blocks Message-ID: <20130422185550.GA29359@sgi.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-16-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-16-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Wed, Apr 03, 2013 at 04:11:25PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Signed-off-by: Dave Chinner A few nits below. > --- > fs/xfs/xfs_attr.c | 33 +- > fs/xfs/xfs_attr_leaf.c | 29 +- > fs/xfs/xfs_bmap.c | 1 + > fs/xfs/xfs_da_btree.c | 1395 +++++++++++++++++++++++++++++------------------- > fs/xfs/xfs_da_btree.h | 106 +++- > fs/xfs/xfs_dir2_node.c | 26 +- > fs/xfs/xfs_trace.c | 2 +- > 7 files changed, 972 insertions(+), 620 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index 8886838..e03128c 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -15,7 +15,6 @@ > * 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_types.h" > @@ -25,6 +24,7 @@ > #include "xfs_sb.h" > #include "xfs_ag.h" > #include "xfs_mount.h" > +#include "xfs_error.h" > #include "xfs_da_btree.h" > #include "xfs_bmap_btree.h" > #include "xfs_attr_sf.h" > @@ -35,7 +35,6 @@ > #include "xfs_bmap.h" > #include "xfs_attr.h" > #include "xfs_attr_leaf.h" > -#include "xfs_error.h" Why did xfs_error.h need to be moved? > @@ -935,16 +936,16 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) > /* > * Set up the new root node. > */ > - error = xfs_da_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); > + error = xfs_da3_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); > if (error) > goto out; > node = bp1->b_addr; > leaf = bp2->b_addr; > ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); > /* both on-disk, don't endian-flip twice */ > - node->btree[0].hashval = > - leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; > - node->btree[0].before = cpu_to_be32(blkno); > + btree = xfs_da3_node_tree_p(node); > + btree[0].hashval = leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; ^ Extra space. > +static bool > +xfs_da3_node_verify( > struct xfs_buf *bp) > { > struct xfs_mount *mp = bp->b_target->bt_mount; > - struct xfs_da_node_hdr *hdr = bp->b_addr; > - int block_ok = 0; > - > - block_ok = hdr->info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC); > - block_ok = block_ok && > - be16_to_cpu(hdr->level) > 0 && > - be16_to_cpu(hdr->count) > 0 ; > - if (!block_ok) { > - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); > - xfs_buf_ioerror(bp, EFSCORRUPTED); > + struct xfs_da_intnode *hdr = bp->b_addr; > + struct xfs_da3_icnode_hdr ichdr; > + > + xfs_da3_node_hdr_from_disk(&ichdr, hdr); > + > + if (xfs_sb_version_hascrc(&mp->m_sb)) { > + struct xfs_da3_node_hdr *hdr3 = bp->b_addr; > + > + if (ichdr.magic != XFS_DA3_NODE_MAGIC) > + return false; > + > + if (!uuid_equal(&hdr3->info.uuid, &mp->m_sb.sb_uuid)) > + return false; > + if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn) > + return false; > + } else { > + if (ichdr.magic != XFS_DA_NODE_MAGIC) > + return false; > } > + if (ichdr.level == 0) > + return false; > + if (ichdr.level > XFS_DA_NODE_MAXDEPTH) > + return false; > + if (ichdr.count == 0) > + return false; > + > + /* > + * we don't know if the node is for and attribute or directory tree, > + * so only fail if the count is outside both bounds > + */ > + if (ichdr.count > mp->m_dir_node_ents && > + ichdr.count > mp->m_attr_node_ents) > + return false; > + > + /* XXX: hash order check? */ Still planning to add that in a subsequent patch? > @@ -178,33 +314,45 @@ xfs_da_node_read( > * Create the initial contents of an intermediate node. > */ > int > -xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, > - struct xfs_buf **bpp, int whichfork) > +xfs_da3_node_create( > + struct xfs_da_args *args, > + xfs_dablk_t blkno, > + int level, > + struct xfs_buf **bpp, > + int whichfork) > { > - xfs_da_intnode_t *node; > - struct xfs_buf *bp; > - int error; > - xfs_trans_t *tp; > + struct xfs_da_intnode *node; > + struct xfs_trans *tp = args->trans; > + struct xfs_mount *mp = tp->t_mountp; > + struct xfs_da3_icnode_hdr ichdr = {0}; > + struct xfs_buf *bp; > + int error; > > trace_xfs_da_node_create(args); > + ASSERT(level <= XFS_DA_NODE_MAXDEPTH); > > - tp = args->trans; > error = xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); Looks like this function can return 0 with a null bp. We should probably check for that. > @@ -320,8 +474,10 @@ xfs_da_split(xfs_da_state_t *state) > * just got bumped because of the addition of a new root node. > * There might be three blocks involved if a double split occurred, > * and the original block 0 could be at any position in the list. > + * > + * Note: the info structures being modified here for both v2 and v3 da > + * headers, so we can do this linkage just using the v2 structures. I had a hard time parsing that the first few times. How about something like: Note: The xfs_da_blkinfo fields being modified here are shared by both xfs_da_node_hdr and xfs_da3_intnode, and occur before the additional fields added in xfs_da3_intnode, so this linkage can be done using just the v2 structures. > @@ -591,12 +801,12 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, > * Move the req'd B-tree elements from high in node1 to > * low in node2. > */ > - be16_add_cpu(&node2->hdr.count, count); > + nodehdr2.count += count; > tmp = count * (uint)sizeof(xfs_da_node_entry_t); > - btree_s = &node1->btree[be16_to_cpu(node1->hdr.count) - count]; > - btree_d = &node2->btree[0]; > + btree_s = &btree1[nodehdr1.count- count]; ^ Add a space. > @@ -926,35 +1172,34 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) > * We prefer coalescing with the lower numbered sibling so as > * to shrink a directory over time. > */ > + count = state->node_ents; > + count -= state->node_ents >> 2; > + count -= nodehdr.count; > + > /* start with smaller blk num */ > - forward = (be32_to_cpu(info->forw) < be32_to_cpu(info->back)); > + forward = nodehdr.forw < nodehdr.back; > for (i = 0; i < 2; forward = !forward, i++) { > if (forward) > - blkno = be32_to_cpu(info->forw); > + blkno = nodehdr.forw; > else > - blkno = be32_to_cpu(info->back); > + blkno = nodehdr.back; > if (blkno == 0) > continue; > - error = xfs_da_node_read(state->args->trans, state->args->dp, > + error = xfs_da3_node_read(state->args->trans, state->args->dp, > blkno, -1, &bp, state->args->whichfork); > if (error) > return(error); > - ASSERT(bp != NULL); > > - node = (xfs_da_intnode_t *)info; > - count = state->node_ents; > - count -= state->node_ents >> 2; > - count -= be16_to_cpu(node->hdr.count); At first initializing count outside the loop looked like a problem to me, but upon a closer inspection now I believe it's ok. > /* > - * Unbalance the btree elements between two intermediate nodes, > + * Unbalance the elements between two intermediate nodes, > * move all Btree elements from one node into another. > */ > STATIC void > -xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, > - xfs_da_state_blk_t *save_blk) > +xfs_da3_node_unbalance( > + struct xfs_da_state *state, > + struct xfs_da_state_blk *drop_blk, > + struct xfs_da_state_blk *save_blk) > { > - xfs_da_intnode_t *drop_node, *save_node; > - xfs_da_node_entry_t *btree; > - int tmp; > - xfs_trans_t *tp; > + struct xfs_da_intnode *drop_node; > + struct xfs_da_intnode *save_node; > + struct xfs_da_node_entry *dbtree; > + struct xfs_da_node_entry *sbtree; > + struct xfs_da3_icnode_hdr dhdr; > + struct xfs_da3_icnode_hdr shdr; Would be better as drop and save. > + struct xfs_trans *tp; > + int sindex; > + int tmp; > > trace_xfs_da_node_unbalance(state->args); > > drop_node = drop_blk->bp->b_addr; > save_node = save_blk->bp->b_addr; > - ASSERT(drop_node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); > - ASSERT(save_node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); > + xfs_da3_node_hdr_from_disk(&dhdr, drop_node); > + xfs_da3_node_hdr_from_disk(&shdr, save_node); > + dbtree = xfs_da3_node_tree_p(drop_node); > + sbtree = xfs_da3_node_tree_p(save_node); > tp = state->args->trans; > > /* > * If the dying block has lower hashvals, then move all the > * elements in the remaining block up to make a hole. > */ > - if ((be32_to_cpu(drop_node->btree[0].hashval) < be32_to_cpu(save_node->btree[ 0 ].hashval)) || > - (be32_to_cpu(drop_node->btree[be16_to_cpu(drop_node->hdr.count)-1].hashval) < > - be32_to_cpu(save_node->btree[be16_to_cpu(save_node->hdr.count)-1].hashval))) > - { > - btree = &save_node->btree[be16_to_cpu(drop_node->hdr.count)]; > - tmp = be16_to_cpu(save_node->hdr.count) * (uint)sizeof(xfs_da_node_entry_t); > - memmove(btree, &save_node->btree[0], tmp); > - btree = &save_node->btree[0]; > + if ((be32_to_cpu(dbtree[0].hashval) < be32_to_cpu(sbtree[ 0 ].hashval)) || ^ ^ Extra spaces. > + (be32_to_cpu(dbtree[dhdr.count - 1].hashval) < > + be32_to_cpu(sbtree[shdr.count - 1].hashval))) { > + /* XXX: check this - is memmove dst correct? */ > + tmp = shdr.count * (uint)sizeof(xfs_da_node_entry_t); > + memmove(&sbtree[dhdr.count], &sbtree[0], tmp); I believe the destination in this memmove is correct. We're moving items from the beginning of the save_node toward the end of save_node so that later we can copy from drop_node into the beginning of save_node. Making room. > + > + sindex = 0; > xfs_trans_log_buf(tp, save_blk->bp, > - XFS_DA_LOGRANGE(save_node, btree, > - (be16_to_cpu(save_node->hdr.count) + be16_to_cpu(drop_node->hdr.count)) * > - sizeof(xfs_da_node_entry_t))); > + XFS_DA_LOGRANGE(save_node, &sbtree[0], > + (shdr.count + dhdr.count) * > + sizeof(xfs_da_node_entry_t))); Seems like here we are logging more of the node than is strictly necessary. So far we have only modified save_node at shdr.count up to shdr.count + dhdr.count, there is no need to log the beginning of save_node until after we've copied from drop_node into it. Not a big deal I guess. > } else { > - btree = &save_node->btree[be16_to_cpu(save_node->hdr.count)]; > + sindex = shdr.count; > xfs_trans_log_buf(tp, save_blk->bp, > - XFS_DA_LOGRANGE(save_node, btree, > - be16_to_cpu(drop_node->hdr.count) * > - sizeof(xfs_da_node_entry_t))); > + XFS_DA_LOGRANGE(save_node, &sbtree[sindex], > + dhdr.count * sizeof(xfs_da_node_entry_t))); And here it seems that we're logging save_node before we've made any modification to it. Maybe I'm missing something. > } > > /* > * Move all the B-tree elements from drop_blk to save_blk. > */ > - tmp = be16_to_cpu(drop_node->hdr.count) * (uint)sizeof(xfs_da_node_entry_t); > - memcpy(btree, &drop_node->btree[0], tmp); > - be16_add_cpu(&save_node->hdr.count, be16_to_cpu(drop_node->hdr.count)); > + tmp = dhdr.count * (uint)sizeof(xfs_da_node_entry_t); > + memcpy(&sbtree[sindex], &dbtree[0], tmp); > + shdr.count += dhdr.count; > + xfs_da3_node_hdr_to_disk(save_node, &shdr); > xfs_trans_log_buf(tp, save_blk->bp, > XFS_DA_LOGRANGE(save_node, &save_node->hdr, > - sizeof(save_node->hdr))); > + xfs_da3_node_hdr_size(save_node))); > And then after modifying save_node by copying stuff in from drop_blk we only log the header, and not the entries. I guess I'd prefer to see the entries logged after they've been modified. It's not a bug, looks like.. just not what I'm used to seeing. > @@ -1190,66 +1478,73 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) > } > curr = blk->bp->b_addr; > blk->magic = be16_to_cpu(curr->magic); > - ASSERT(blk->magic == XFS_DA_NODE_MAGIC || > - blk->magic == XFS_DIR2_LEAFN_MAGIC || > - blk->magic == XFS_ATTR_LEAF_MAGIC); > + > + if (blk->magic == XFS_ATTR_LEAF_MAGIC) { > + blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL); > + break; > + } > + > + if (blk->magic == XFS_DIR2_LEAFN_MAGIC || > + blk->magic == XFS_DIR3_LEAFN_MAGIC) { > + blk->magic = XFS_DIR2_LEAFN_MAGIC; > + blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, NULL); > + break; > + } Something like this would be better for this rearrangement: if (blk->magic == XFS_ATTR_LEAF_MAGIC) { ... break; } else if (blk->magic == XFS_DIR2_LEAFN_MAGIC || blk->magic == XFS_DIR3_LEAFN_MAGIC) { ... break; } else if (blk->magic != XFS_DA_NODE_MAGIC) { return XFS_ERROR(EFSCORRUPTED); } So that we're sure what kind of block we have. > + > + blk->magic = XFS_DA_NODE_MAGIC; > + Why was that assignment necessary? > @@ -1316,9 +1647,6 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, > ASSERT(old_blk->magic == XFS_DA_NODE_MAGIC || > old_blk->magic == XFS_DIR2_LEAFN_MAGIC || > old_blk->magic == XFS_ATTR_LEAF_MAGIC); Seems like these asserts need to be updated. > - ASSERT(old_blk->magic == be16_to_cpu(old_info->magic)); > - ASSERT(new_blk->magic == be16_to_cpu(new_info->magic)); > - ASSERT(old_blk->magic == new_blk->magic); These seem like good asserts. > @@ -1449,8 +1738,6 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, > ASSERT(save_blk->magic == XFS_DA_NODE_MAGIC || > save_blk->magic == XFS_DIR2_LEAFN_MAGIC || > save_blk->magic == XFS_ATTR_LEAF_MAGIC); Seems like these asserts need to be updated. > - ASSERT(save_blk->magic == be16_to_cpu(save_info->magic)); > - ASSERT(drop_blk->magic == be16_to_cpu(drop_info->magic)); These two seem like useful asserts. > @@ -1856,17 +2176,22 @@ xfs_da_swap_lastblock( > dead_level = 0; > dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval); > } else { > - ASSERT(dead_info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); > + struct xfs_da3_icnode_hdr deadhdr; > + > + ASSERT(dead_info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || > + dead_info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); I think these are covered by asserts in xfs_da3_node_hdr_from_disk and can be removed. > @@ -1912,31 +2237,31 @@ xfs_da_swap_lastblock( > * Walk down the tree looking for the parent of the moved block. > */ > for (;;) { > - error = xfs_da_node_read(tp, ip, par_blkno, -1, &par_buf, w); > + error = xfs_da3_node_read(tp, ip, par_blkno, -1, &par_buf, w); > if (error) > goto done; > par_node = par_buf->b_addr; > - if (unlikely(par_node->hdr.info.magic != > - cpu_to_be16(XFS_DA_NODE_MAGIC) || > - (level >= 0 && level != be16_to_cpu(par_node->hdr.level) + 1))) { > + xfs_da3_node_hdr_from_disk(&par_hdr, par_node); > + if (level >= 0 && level != par_hdr.level + 1) { Do we need to test par_node magic here like we were before? > XFS_ERROR_REPORT("xfs_da_swap_lastblock(4)", > XFS_ERRLEVEL_LOW, mp); > error = XFS_ERROR(EFSCORRUPTED); > goto done; > } From rjohnston@sgi.com Mon Apr 22 14:17:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1F83E7F37 for ; Mon, 22 Apr 2013 14:17:15 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2339EAC007; Mon, 22 Apr 2013 12:17:11 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Mon, 22 Apr 2013 14:17:10 -0500 Message-ID: <51758CC1.7040400@sgi.com> Date: Mon, 22 Apr 2013 14:17:21 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Zhao Hongjiang CC: , , Subject: Re: [PATCH] capture the failure result of 310 References: <516B75E9.40605@huawei.com> In-Reply-To: <516B75E9.40605@huawei.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Hi Zhao Hongjiang, Eryu Guan submitted a cleanup patch for test 310, will you please include them with your next version? 1. add one space between # and test description 2. remove creator/owner info 3. fix common/rc and common/filter path so they can be sourced correctly 4. no need to remove $seq.full cause it's not used(or if verbose output is needed, $seqres.full should be used) Here is the link to the thread. http://oss.sgi.com/archives/xfs/2013-04/msg00128.html On 04/14/2013 10:37 PM, Zhao Hongjiang wrote: > Capture the failuer by the way of count error dmesg and give the description > how i run the test to trigger problems. > > Signed-off-by: Zhao Hongjiang Please add the following line when you include the cleanup patch. [eguan@redhat.com fix common file path and other cleanups] > --- > tests/generic/310 | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 56 insertions(+), 1 deletions(-) > mode change 100644 => 100755 tests/generic/310 > > diff --git a/tests/generic/310 b/tests/generic/310 > old mode 100644 > new mode 100755 > index ef51422..f44799a > --- a/tests/generic/310 > +++ b/tests/generic/310 > @@ -4,6 +4,17 @@ Please add one space between # and test description. > #Check if there are two threads,one keeps calling read() or lseek(), and > #the other calling readdir(), both on the same directory fd. > # Try to keep personal pronouns out of any comments i.e. > +#When I ran this on ext3 (can be replaced with ext2/ext4) which has dir_index > +#feature disabled, I got this: # Testing on ext3: with dir_index disabled results in the following # dmesg output: (also occurs when testing ext2 and ext4) > +# > +#EXT3-fs error (device sdb): ext3_readdir: bad entry in directory #1134241: > +#rec_len % 4 != 0 - offset=2704, inode=16973836, rec_len=12850, name_len=52 > +#EXT3-fs error (device sdb): ext3_readdir: bad entry in directory #1134241: > +#directory entry across blocks - offset=1672, inode=16973836, rec_len=14132, > +#name_len=57 > +# > +#If we configured errors=remount-ro, the filesystem will become read-only. # The filesystem mount option 'errors=' will define the behavior # when an error is encountered. (see mount manpage) > +# > # Based on a testcase from Li Zefan . > # > # http://marc.info/?l=linux-kernel&m=136123703211869&w=2 > @@ -47,6 +58,37 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 > _supported_fs generic > _supported_os Linux > > +dmesg -c > /dev/null > + > +nr_bug=`dmesg | grep -c "kernel BUG"` > +nr_error=`dmesg | grep -c "error"` > +nr_null=`dmesg | grep -c "kernel NULL pointer dereference"` > +nr_warning=`dmesg | grep -c "^WARNING"` > +nr_lockdep=`dmesg | grep -c "possible recursive locking detected"` > + > +#check if some kind of kernel bug happened > +check_kernel_bug() > +{ > + new_bug=`dmesg | grep -c "kernel BUG"` > + new_error=`dmesg | grep -c "error"` > + new_null=`dmesg | grep -c "kernel NULL pointer dereference"` > + new_warning=`dmesg | grep -c "^WARNING"` > + new_lockdep=`dmesg | grep -c "possible recursive locking detected"` > + > + > + # no kernel bug is detected > + if [ $new_bug -eq $nr_bug -a $new_error -eq $nr_error -a \ > + $new_null -eq $nr_null -a $new_warning -eq $nr_warning -a \ > + $new_lockdep -eq $nr_lockdep ]; then > + return 1 > + fi > + > + nr_bug=$new_bug > + nr_error=$new_error > + nr_null=$new_null > + nr_warning=$new_warning > + nr_lockdep=$new_lockdep > +} > mkdir $TEST_DIR/tmp > for n in {1..4096}; do > touch $TEST_DIR/tmp/$n > @@ -57,6 +99,13 @@ _test_read() > src/t_readdir_1 $TEST_DIR/tmp & > sleep 100 > killall src/t_readdir_1 > + check_kernel_bug > + if [ $? -eq 1 ]; then > + status=0 > + else > + echo "error: kernel bug was found, you can see the > + dmesg for more infomation." > + fi > } > > _test_lseek() > @@ -64,6 +113,13 @@ _test_lseek() > src/t_readdir_2 $TEST_DIR/tmp & > sleep 100 > killall src/t_readdir_2 > + check_kernel_bug > + if [ $? -eq 1 ]; then > + status=0 > + else > + echo "error: kernel bug was found, you can see the > + dmesg for more infomation." > + fi > } > > _test_read > @@ -72,5 +128,4 @@ _test_lseek > # success, all done > echo "*** done" > rm -f $seq.full > -status=0 > exit > From sandeen@sandeen.net Mon Apr 22 14:59:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E90937F37 for ; Mon, 22 Apr 2013 14:59:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D42768F8092 for ; Mon, 22 Apr 2013 12:59:55 -0700 (PDT) X-ASG-Debug-ID: 1366660794-04cbb057f64ba340001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id KHd4H9bezLZD6Cxi for ; Mon, 22 Apr 2013 12:59:54 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 54E196527C13; Mon, 22 Apr 2013 14:59:54 -0500 (CDT) Message-ID: <517596BA.3060408@sandeen.net> Date: Mon, 22 Apr 2013 14:59:54 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Brian Foster CC: yongtaofu@gmail.com, xfs@oss.sgi.com Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: <516C89DF.4070904@redhat.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366660794 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/15/13 6:14 PM, Brian Foster wrote: > Hi, > > Thanks for the data in the previous thread: > > http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > > I'm spinning off a new thread specifically for this because the original > thread is already too large and scattered to track. As Eric stated, > please try to keep data contained in as few messages as possible. > Well, it's always simple in the end. It just took a lot of debugging to figure out what was happening - we do appreciate your help with that! We were able to create a local reproducer, and it looks like this patch fixes things: commit aae8a97d3ec30788790d1720b71d76fd8eb44b73 Author: Aneesh Kumar K.V Date: Sat Jan 29 18:43:27 2011 +0530 fs: Don't allow to create hardlink for deleted file Add inode->i_nlink == 0 check in VFS. Some of the file systems do this internally. A followup patch will remove those instance. This is needed to ensure that with link by handle we don't allow to create hardlink of an unlinked file. The check also prevent a race between unlink and link Signed-off-by: Aneesh Kumar K.V Signed-off-by: Al Viro diff --git a/fs/namei.c b/fs/namei.c index 83e92ba..33be51a 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -2906,7 +2906,11 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de return error; mutex_lock(&inode->i_mutex); - error = dir->i_op->link(old_dentry, dir, new_dentry); + /* Make sure we don't allow creating hardlink to an unlinked file */ + if (inode->i_nlink == 0) + error = -ENOENT; + else + error = dir->i_op->link(old_dentry, dir, new_dentry); mutex_unlock(&inode->i_mutex); if (!error) fsnotify_link(dir, inode, new_dentry); From sekharan@us.ibm.com Mon Apr 22 15:22:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 34ACF7F37 for ; Mon, 22 Apr 2013 15:22:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 04CFB304039 for ; Mon, 22 Apr 2013 13:22:34 -0700 (PDT) X-ASG-Debug-ID: 1366662152-04bdf02d204e60b0001-NocioJ Received: from e8.ny.us.ibm.com (e8.ny.us.ibm.com [32.97.182.138]) by cuda.sgi.com with ESMTP id 15C57xnA4ipl7KO0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 22 Apr 2013 13:22:33 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.138 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] Received: from /spool/local by e8.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 22 Apr 2013 16:22:32 -0400 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] Received: from d01dlp02.pok.ibm.com (9.56.250.167) by e8.ny.us.ibm.com (192.168.1.108) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 22 Apr 2013 16:22:31 -0400 Received: from d01relay05.pok.ibm.com (d01relay05.pok.ibm.com [9.56.227.237]) by d01dlp02.pok.ibm.com (Postfix) with ESMTP id 083CA6E803F for ; Mon, 22 Apr 2013 16:22:28 -0400 (EDT) Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay05.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3MKMUNb315298 for ; Mon, 22 Apr 2013 16:22:30 -0400 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3MKMTsF007515 for ; Mon, 22 Apr 2013 17:22:30 -0300 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3MKMSgh007408; Mon, 22 Apr 2013 17:22:28 -0300 Subject: Re: [PATCH V3] xfsprogs: xfs_quota allow user or group names beginning with From: Chandra Seetharaman X-ASG-Orig-Subj: Re: [PATCH V3] xfsprogs: xfs_quota allow user or group names beginning with Reply-To: sekharan@us.ibm.com To: rjohnston@sgi.com Cc: xfs@oss.sgi.com, Eric Sandeen , Dave Chinner In-Reply-To: <20130422173205.877894469@sgi.com> References: <20130422173205.877894469@sgi.com> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Mon, 22 Apr 2013 15:22:28 -0500 Message-ID: <1366662148.3762.32398.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13042220-9360-0000-0000-000011D7F150 X-Barracuda-Connect: e8.ny.us.ibm.com[32.97.182.138] X-Barracuda-Start-Time: 1366662152 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com On Mon, 2013-04-22 at 12:32 -0500, rjohnston@sgi.com wrote: > xfs_quota does not properly parse users or groups that begin with a number. > Only call atoi when user or group consists of digits only. > > Signed-off-by: Rich Johnston > Reviewed-by: Eric Sandeen Reviewed-by: Chandra Seetharaman > > --- > > Fresh clone of xfsprogs showed I missed a change in quota_proj_type() > (Thanks Chandra pointing that out) > > V2: > Change 'i=0' to 'i = 0' (sandeen suggestion) > Use bool instead of boolean_t (dchinner suggestion) > V3: > Also change quota_proj_type() to use isdigits_only() (sekharan suggestion) > > include/input.h | 2 ++ > libxcmd/input.c | 13 +++++++++++++ > quota/quota.c | 6 +++--- > quota/quota.h | 2 ++ > 4 files changed, 20 insertions(+), 3 deletions(-) > > Index: b/include/input.h > =================================================================== > --- a/include/input.h > +++ b/include/input.h > @@ -22,6 +22,7 @@ > #include > #include > #include > +#include > > extern char **breakline(char *input, int *count); > extern void doneline(char *input, char **vec); > @@ -46,6 +47,7 @@ extern void timestr(struct timeval *tv, > extern uid_t uid_from_string(char *user); > extern gid_t gid_from_string(char *group); > extern prid_t prid_from_string(char *project); > +extern bool isdigits_only(const char *str); > > #define HAVE_FTW_H 1 /* TODO: configure me */ > > Index: b/libxcmd/input.c > =================================================================== > --- a/libxcmd/input.c > +++ b/libxcmd/input.c > @@ -19,6 +19,7 @@ > #include > #include > #include > +#include > > #if defined(ENABLE_READLINE) > # include > @@ -398,6 +399,18 @@ gid_from_string( > return -1; > } > > +bool isdigits_only( > + const char *str) > +{ > + int i; > + > + for (i = 0; i < strlen(str); i++) { > + if (!isdigit(str[i])) > + return false; > + } > + return true; > +} > + > #define HAVE_FTW_H 1 /* TODO: configure me */ > > #ifndef HAVE_FTW_H > Index: b/quota/quota.c > =================================================================== > --- a/quota/quota.c > +++ b/quota/quota.c > @@ -224,7 +224,7 @@ quota_user_type( > uid_t id; > > if (name) { > - if (isdigit(name[0])) { > + if (isdigits_only(name)) { > id = atoi(name); > name = getusername(id, flags & NO_LOOKUP_FLAG); > } else if ((u = getpwnam(name))) { > @@ -273,7 +273,7 @@ quota_group_type( > int i, ngroups, dofree = 0; > > if (name) { > - if (isdigit(name[0])) { > + if (isdigits_only(name)) { > gid = atoi(name); > name = getgroupname(gid, flags & NO_LOOKUP_FLAG); > } else { > @@ -344,7 +344,7 @@ quota_proj_type( > return; > } > > - if (isdigit(name[0])) { > + if (isdigits_only(name)) { > id = atoi(name); > name = getprojectname(id, flags & NO_LOOKUP_FLAG); > } else if ((p = getprnam(name))) { > Index: b/quota/quota.h > =================================================================== > --- a/quota/quota.h > +++ b/quota/quota.h > @@ -19,6 +19,7 @@ > #include > #include > #include > +#include > > /* > * Different forms of XFS quota > @@ -80,4 +81,5 @@ enum { > extern char *uid_to_name(__uint32_t __uid); > extern char *gid_to_name(__uint32_t __gid); > extern char *prid_to_name(__uint32_t __prid); > +extern bool isdigits_only(const char *); > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From JBacik@fusionio.com Mon Apr 22 16:13:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 393827F37 for ; Mon, 22 Apr 2013 16:13:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 14B738F8037 for ; Mon, 22 Apr 2013 14:13:41 -0700 (PDT) X-ASG-Debug-ID: 1366665218-04cb6c2c1d4dd930001-NocioJ Received: from dkim1.fusionio.com (dkim1.fusionio.com [66.114.96.53]) by cuda.sgi.com with ESMTP id fAH5BpFdjnGdlQQr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 22 Apr 2013 14:13:38 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.53 Received: from mx1.fusionio.com (unknown [10.101.1.160]) by dkim1.fusionio.com (Postfix) with ESMTP id 3662E7C0447 for ; Mon, 22 Apr 2013 15:13:38 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1366665218; bh=iB2JN6leLSKrskEc+Q/vl+PiqTrgZ6zVKbLxlR3RAwU=; h=From:To:Subject:Date; b=rW6SYL6Qw1mqodtQx/jNwjWZLC2O1oayo3hayFAIFuUgnZdI3UdlPhz6YOCqEjMvh kJZlMW7VTGynW0Mw6cucC2qEFm9SVZbSXbn1uk+ONFTFT3CuPG+0n160HlixEcE5Pb Tr7VWledHQ4yR3rFe8Dk6xHpzqFtcDDQ46Imv1Tc= Received: from mail1.int.fusionio.com (mail1.int.fusionio.com [10.101.1.21]) by mx1.fusionio.com with ESMTP id OAEmRaJwhAA4JxX9 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Mon, 22 Apr 2013 15:13:36 -0600 (MDT) Received: from localhost (76.182.72.146) by mail.fusionio.com (10.101.1.19) with Microsoft SMTP Server (TLS) id 8.3.83.0; Mon, 22 Apr 2013 15:13:35 -0600 From: Josef Bacik To: , Subject: [PATCH] xfstests 311: test fsync with dm flakey Date: Mon, 22 Apr 2013 17:13:33 -0400 X-ASG-Orig-Subj: [PATCH] xfstests 311: test fsync with dm flakey Message-ID: <1366665213-17894-1-git-send-email-jbacik@fusionio.com> X-Mailer: git-send-email 1.7.7.6 MIME-Version: 1.0 Content-Type: text/plain X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim1.fusionio.com[66.114.96.53] X-Barracuda-Start-Time: 1366665218 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This test sets up a dm flakey target and then runs my fsync tester I've been using to verify btrfs's fsync() is working properly. It will create a dm flakey device, mount it, run my test, make the flakey device start dropping writes, and then unmount the fs. Then we mount it back up and make sure the md5sums match and then run fsck on the device to make sure we got a consistent fs. I used the output from a run on XFS since I assume at this point XFS's fsync() is working properly. If it's not then I'll fix it up and resend, but this at least gives everybody an idea of where I'm going. Any comments are welcome. Thanks, Signed-off-by: Josef Bacik --- common/config | 1 + common/punch | 7 - common/rc | 28 +++ src/Makefile | 2 +- src/fsync-tester.c | 538 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/311 | 177 ++++++++++++++++ tests/generic/311.out | 193 ++++++++++++++++++ tests/generic/group | 1 + 8 files changed, 939 insertions(+), 8 deletions(-) create mode 100644 src/fsync-tester.c create mode 100755 tests/generic/311 create mode 100644 tests/generic/311.out diff --git a/common/config b/common/config index dfbb5c2..b8ab593 100644 --- a/common/config +++ b/common/config @@ -177,6 +177,7 @@ export FIO_PROG="`set_prog_path fio`" export FILEFRAG_PROG="`set_prog_path filefrag`" export E4DEFRAG_PROG="`set_prog_path e4defrag`" export LOGGER_PROG="`set_prog_path logger`" +export DMSETUP_PROG="`set_prog_path dmsetup`" # Generate a comparable xfsprogs version number in the form of # major * 10000 + minor * 100 + release diff --git a/common/punch b/common/punch index cfbe576..b9f9acd 100644 --- a/common/punch +++ b/common/punch @@ -234,13 +234,6 @@ _filter_hole_fiemap() _coalesce_extents } - -# Prints the md5 checksum of a given file -_md5_checksum() -{ - md5sum $1 | cut -d ' ' -f1 -} - _filter_bmap() { awk ' diff --git a/common/rc b/common/rc index b980697..f12aaa1 100644 --- a/common/rc +++ b/common/rc @@ -57,6 +57,13 @@ dd() fi } +# Prints the md5 checksum of a given file +_md5_checksum() +{ + md5sum $1 | cut -d ' ' -f1 +} + + # ls -l w/ selinux sometimes puts a dot at the end: # -rwxrw-r--. id1 id2 file1 @@ -1041,6 +1048,27 @@ _require_command() [ -n "$1" -a -x "$1" ] || _notrun "$_cmd utility required, skipped this test" } +# this test requires the device mapper flakey target +# +_require_dm_flakey() +{ + if [ "$HOSTOS" != "Linux" ] + then + _notrun "This test requires linux for dm flakey support" + fi + + _require_command $DMSETUP_PROG + + modprobe dm-flakey >/dev/null 2>&1 + $DMSETUP_PROG targets | grep flakey >/dev/null 2>&1 + if [ $? -eq 0 ] + then + : + else + _notrun "This test requires dm flakey support" + fi +} + # this test requires the projid32bit feature to be available in # mkfs.xfs # diff --git a/src/Makefile b/src/Makefile index 8d8e97f..c18ffc9 100644 --- a/src/Makefile +++ b/src/Makefile @@ -18,7 +18,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ stale_handle pwrite_mmap_blocked t_dir_offset2 seek_sanity_test \ - seek_copy_test t_readdir_1 t_readdir_2 + seek_copy_test t_readdir_1 t_readdir_2 fsync-tester SUBDIRS = diff --git a/src/fsync-tester.c b/src/fsync-tester.c new file mode 100644 index 0000000..1b03e02 --- /dev/null +++ b/src/fsync-tester.c @@ -0,0 +1,538 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int test_fd; +static char *buf; +static char *fname; + +/* + * Just creates a random file, overwriting the file in a random number of loops + * and fsyncing between each loop. + */ +static int test_one(int *max_blocks) +{ + int loops = (random() % 20) + 5; + + lseek(test_fd, 0, SEEK_SET); + while (loops--) { + int character = (random() % 126) + 33; /* printable character */ + int blocks = (random() % 100) + 1; + + if (blocks > *max_blocks) + *max_blocks = blocks; + lseek(test_fd, 0, SEEK_SET); + memset(buf, character, 4096); + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results will be " + "invalid: %d\n", errno); + return 1; + } + + while (blocks--) { + if (write(test_fd, buf, 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + } + + return 0; +} + +/* + * Preallocate a randomly sized file and then overwrite the entire thing and + * then fsync. + */ +static int test_two(int *max_blocks) +{ + int blocks = (random() % 1024) + 1; + int character = (random() % 126) + 33; + + *max_blocks = blocks; + + if (fallocate(test_fd, 0, 0, blocks * 4096)) { + fprintf(stderr, "Error fallocating %d (%s)\n", errno, + strerror(errno)); + return 1; + } + + lseek(test_fd, 0, SEEK_SET); + memset(buf, character, 4096); + while (blocks--) { + if (write(test_fd, buf, 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + return 0; +} + +static void drop_all_caches() +{ + int value = 3; + int fd; + + if ((fd = open("/proc/sys/vm/drop_caches", O_WRONLY)) < 0) { + fprintf(stderr, "Error opening drop caches: %d\n", errno); + return; + } + + write(fd, &value, sizeof(int)); + close(fd); +} + +/* + * Randomly write inside of a file, either creating a sparse file or prealloc + * the file and randomly write within it, depending on the prealloc flag + */ +static int test_three(int *max_blocks, int prealloc, int rand_fsync, + int sync, int drop_caches) +{ + int size = (random() % 2048) + 4; + int blocks = size / 2; + int sync_block = blocks / 2; + int rand_sync_interval = (random() % blocks) + 1; + int character = (random() % 126) + 33; + + printf("Size is %d, blocks is %d\n", size, blocks); + if (prealloc && fallocate(test_fd, 0, 0, size * 4096)) { + fprintf(stderr, "Error fallocating %d (%s)\n", errno, + strerror(errno)); + return 1; + } + + if (prealloc) + *max_blocks = size; + + memset(buf, character, 4096); + while (blocks--) { + int block = (random() % size); + + if ((block + 1) > *max_blocks) + *max_blocks = block + 1; + + if (rand_fsync && !(blocks % rand_sync_interval)) { + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results " + "will be invalid: %d\n", errno); + return 1; + } + } + + /* Force a transaction commit in between just for fun */ + if (blocks == sync_block && (sync || drop_caches)) { + if (sync) + syncfs(test_fd); + else + sync_file_range(test_fd, 0, 0, + SYNC_FILE_RANGE_WRITE| + SYNC_FILE_RANGE_WAIT_AFTER); + + if (drop_caches) { + close(test_fd); + drop_all_caches(); + test_fd = open(fname, O_RDWR); + if (test_fd < 0) { + test_fd = 0; + fprintf(stderr, "Error re-opening file: %d\n", + errno); + return 1; + } + } + } + + if (pwrite(test_fd, buf, 4096, block * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + return 0; +} + +static void timeval_subtract(struct timeval *result,struct timeval *x, + struct timeval *y) +{ + if (x->tv_usec < y->tv_usec) { + int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1; + y->tv_usec -= 1000000 * nsec; + y->tv_sec += nsec; + } + + if (x->tv_usec - y->tv_usec > 1000000) { + int nsec = (x->tv_usec - y->tv_usec) / 1000000; + y->tv_usec += 1000000 * nsec; + y->tv_sec -= nsec; + } + + result->tv_sec = x->tv_sec - y->tv_sec; + result->tv_usec = x->tv_usec - y->tv_usec; +} + +static int test_four(int *max_blocks) +{ + size_t size = 2621440; /* 10 gigabytes */ + size_t blocks = size / 2; + size_t sync_block = blocks / 8; /* fsync 8 times */ + int character = (random() % 126) + 33; + struct timeval start, end, diff; + + memset(buf, character, 4096); + while (blocks--) { + off_t block = (random() % size); + + if ((block + 1) > *max_blocks) + *max_blocks = block + 1; + + if ((blocks % sync_block) == 0) { + if (gettimeofday(&start, NULL)) { + fprintf(stderr, "Error getting time: %d\n", + errno); + return 1; + } + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results " + "will be invalid: %d\n", errno); + return 1; + } + if (gettimeofday(&end, NULL)) { + fprintf(stderr, "Error getting time: %d\n", + errno); + return 1; + } + timeval_subtract(&diff, &end, &start); + printf("Fsync time was %ds and %dus\n", + (int)diff.tv_sec, (int)diff.tv_usec); + } + + if (pwrite(test_fd, buf, 4096, block * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + return 0; +} + +static int test_five() +{ + int character = (random() % 126) + 33; + int runs = (random() % 100) + 1; + int i; + + memset(buf, character, 3072); + for (i = 0; i < runs; i++) { + size_t write_size = (random() % 3072) + 1; + + if (pwrite(test_fd, buf, write_size, 0) < write_size) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + + if ((i % 8) == 0) { + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results " + "will be invalid: %d\n", errno); + return 1; + } + } + } + + return 0; +} + +/* + * Reproducer for something like this + * + * [data][prealloc][data] + * + * and then in the [prealloc] section we have + * + * [ pre ][pre][ pre ] + * [d][pp][dd][ppp][d][ppp][d] + * + * where each letter represents on block of either data or prealloc. + * + * This explains all the weirdly specific numbers. + */ +static int test_six() +{ + int character = (random() % 126) + 33; + int i; + + memset(buf, character, 4096); + + /* Write on either side of the file, leaving a hole in the middle */ + for (i = 0; i < 10; i++) { + if (pwrite(test_fd, buf, 4096, i * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + /* + * The test fs I had the prealloc extent was 13 4k blocks long so I'm + * just using that to give myself the best chances of reproducing. + */ + for (i = 23; i < 33; i++) { + if (pwrite(test_fd, buf, 4096, i * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + if (fallocate(test_fd, 0, 10 * 4096, 4 * 4096)) { + fprintf(stderr, "Error fallocating %d\n", errno); + return 1; + } + + if (fallocate(test_fd, 0, 14 * 4096, 5 * 4096)) { + fprintf(stderr, "Error fallocating %d\n", errno); + return 1; + } + + if (fallocate(test_fd, 0, 19 * 4096, 4 * 4096)) { + fprintf(stderr, "Error fallocating %d\n", errno); + return 1; + } + + if (pwrite(test_fd, buf, 4096, 10 * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + for (i = 13; i < 15; i++) { + if (pwrite(test_fd, buf, 4096, i * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + if (pwrite(test_fd, buf, 4096, 18 * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + if (pwrite(test_fd, buf, 4096, 22 * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + return 0; +} + +static void usage() +{ + printf("Usage fsync-tester [-s ] [-r] [-d] -t \n"); + printf(" -s seed : seed for teh random map generator (defaults to reading /dev/urandom)\n"); + printf(" -r : don't reboot the box immediately\n"); + printf(" -d : use O_DIRECT\n"); + printf(" -t test : test nr to run, required\n"); + exit(1); +} + +int main(int argc, char **argv) +{ + int opt; + int fd; + int max_blocks = 0; + char *endptr; + unsigned int seed = 123; + int reboot = 1; + int direct_io = 0; + long int test = 1; + long int tmp; + int ret = 0; + int flags = O_RDWR|O_CREAT|O_TRUNC; + + if (argc < 2) + usage(); + + fd = open("/dev/urandom", O_RDONLY); + if (fd >= 0) { + read(fd, &seed, sizeof(seed)); + close(fd); + } + + while ((opt = getopt(argc, argv, "s:rdt:")) != -1) { + switch (opt) { + case 's': + tmp = strtol(optarg, &endptr, 10); + if (tmp == LONG_MAX || endptr == optarg) + usage(); + seed = tmp; + break; + case 'r': + reboot = 0; + break; + case 'd': + direct_io = 1; + break; + case 't': + test = strtol(optarg, &endptr, 10); + if (test == LONG_MAX || endptr == optarg) + usage(); + break; + default: + usage(); + } + } + + if (optind >= argc) + usage(); + + fname = argv[optind]; + if (!fname) + usage(); + + printf("Random seed is %u\n", seed); + srandom(seed); + + if (direct_io) { + flags |= O_DIRECT; + ret = posix_memalign((void **)&buf, getpagesize(), 4096); + if (ret) + buf = NULL; + } else { + buf = malloc(4096); + } + + if (!buf) { + fprintf(stderr, "Error allocating buf: %d\n", errno); + return 1; + } + + test_fd = open(fname, flags, 0644); + if (test_fd < 0) { + fprintf(stderr, "Error opening file %d (%s)\n", errno, + strerror(errno)); + return 1; + } + + switch (test) { + case 1: + ret = test_one(&max_blocks); + break; + case 2: + ret = test_two(&max_blocks); + break; + case 3: + ret = test_three(&max_blocks, 0, 0, 0, 0); + break; + case 4: + ret = test_three(&max_blocks, 1, 0, 0, 0); + break; + case 5: + ret = test_three(&max_blocks, 0, 1, 0, 0); + break; + case 6: + ret = test_three(&max_blocks, 1, 1, 0, 0); + break; + case 7: + ret = test_three(&max_blocks, 0, 0, 1, 0); + break; + case 8: + ret = test_three(&max_blocks, 1, 0, 1, 0); + break; + case 9: + ret = test_three(&max_blocks, 0, 1, 1, 0); + break; + case 10: + ret = test_three(&max_blocks, 1, 1, 1, 0); + break; + case 11: + ret = test_three(&max_blocks, 0, 0, 0, 1); + break; + case 12: + ret = test_three(&max_blocks, 0, 1, 0, 1); + break; + case 13: + ret = test_three(&max_blocks, 0, 0, 1, 1); + break; + case 14: + ret = test_three(&max_blocks, 0, 1, 1, 1); + break; + case 15: + ret = test_three(&max_blocks, 1, 0, 0, 1); + break; + case 16: + ret = test_three(&max_blocks, 1, 1, 0, 1); + break; + case 17: + ret = test_three(&max_blocks, 1, 0, 1, 1); + break; + case 18: + ret = test_three(&max_blocks, 1, 1, 1, 1); + break; + case 19: + ret = test_five(); + break; + case 20: + ret = test_six(); + break; + case 21: + /* + * This is just a perf test, keep moving it down so it's always + * the last test option. + */ + reboot = 0; + ret = test_four(&max_blocks); + goto out; + default: + usage(); + } + + if (ret) + goto out; + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results will be invalid: " + "%d\n", errno); + return 1; + } + if (reboot) + system("reboot -fn"); +out: + free(buf); + close(test_fd); + return ret; +} diff --git a/tests/generic/311 b/tests/generic/311 new file mode 100755 index 0000000..165d852 --- /dev/null +++ b/tests/generic/311 @@ -0,0 +1,177 @@ +#! /bin/bash +# FS QA Test No. 311 +# +#Verify a file systems fsync is working properly. This won't catch problems +#with blockdev flushing, but at the very least it makes sure the file system is +#doing the right thing with fsync logically. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Fusion IO. 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 +#----------------------------------------------------------------------- +# +# creator +owner=jbacik@fusionio.com + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +status=1 # failure is the default! + +_cleanup() +{ + $UMOUNT_PROG $SCRATCH_MNT > /dev/null 2>&1 + $DMSETUP_PROG remove flakey-test > /dev/null 2>&1 +} + +_cleanup + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_need_to_be_root +_require_scratch +_require_dm_flakey + +[ -x $here/src/fsync-tester ] || _notrun "fsync-tester not build" + +rm -f $seqres.full +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` +FLAKEY_DEV=/dev/mapper/flakey-test +SEED=1 +testfile=$SCRATCH_MNT/$seq.fsync + +_mount_flakey() +{ + _scratch_options mount + _mount -t $FSTYP $SCRATCH_OPTIONS $MOUNT_OPTIONS $SELINUX_MOUNT_OPTIONS $* $FLAKEY_DEV $SCRATCH_MNT +} + +_unmount_flakey() +{ + $UMOUNT_PROG $FLAKEY_DEV +} +_drop_writes() +{ + $DMSETUP_PROG suspend flakey-test + if [ $? -ne 0 ]; then + echo "failed to suspend flakey-test" + _unmount_flakey + _cleanup + exit + fi + $DMSETUP_PROG load flakey-test --table "0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 0 180 1 drop_writes" + if [ $? -ne 0 ]; then + echo "failed to load table into flakey-test" + _unmount_flakey + _cleanup + exit + fi + $DMSETUP_PROG resume flakey-test + if [ $? -ne 0 ]; then + echo "failed to resumeflakey-test" + _unmount_flakey + _cleanup + exit + fi +} + +_resume_writes() +{ + $DMSETUP_PROG suspend flakey-test + if [ $? -ne 0 ]; then + echo "failed to suspend flakey-test" + _unmount_flakey + _cleanup + exit + fi + $DMSETUP_PROG load flakey-test --table "0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 180 0" + if [ $? -ne 0 ]; then + echo "failed to load table into flakey-test" + _unmount_flakey + _cleanup + exit + fi + $DMSETUP_PROG resume flakey-test + if [ $? -ne 0 ]; then + echo "failed to resumeflakey-test" + _unmount_flakey + _cleanup + exit + fi +} + +_run_test() +{ + test_num=$1 + extra="" + + [ $2 -eq 1 ] && extra="-d" + + $here/src/fsync-tester -s $SEED -r -t $test_num $extra $testfile + if [ $? -ne 0 ]; then + _unmount_flakey + _cleanup + exit + fi + + _md5_checksum $testfile + _drop_writes + _unmount_flakey + + #Ok mount so that any recovery that needs to happen is done + _resume_writes + _mount_flakey + _md5_checksum $testfile + + #Unmount and fsck to make sure we got a valid fs after replay + _unmount_flakey + _check_scratch_fs + if [ $? -ne 0 ]; then + echo "fs inconsistent" + _cleanup + exit + fi + _mount_flakey +} + +_scratch_mkfs >> $seqres.full 2>&1 + +# Create a basic flakey device that will never error out +$DMSETUP_PROG create flakey-test --table "0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 180 0" +if [ $? -ne 0 ]; then + echo "failed to create flakey device" + status=1 + exit +fi + +_mount_flakey + +for i in $(seq 1 20); do + echo "Running test $i buffered" + _run_test $i 0 + echo "Running test $i direct" + _run_test $i 1 +done + +_cleanup +status=0 +exit diff --git a/tests/generic/311.out b/tests/generic/311.out new file mode 100644 index 0000000..e443464 --- /dev/null +++ b/tests/generic/311.out @@ -0,0 +1,193 @@ +QA output created by 311 +Running test 1 buffered +Random seed is 1 +ee6103415276cde95544b11b2675f132 +ee6103415276cde95544b11b2675f132 +Running test 1 direct +Random seed is 1 +ee6103415276cde95544b11b2675f132 +ee6103415276cde95544b11b2675f132 +Running test 2 buffered +Random seed is 1 +6ec7dd6da414514b832d9a8fc9098a06 +6ec7dd6da414514b832d9a8fc9098a06 +Running test 2 direct +Random seed is 1 +6ec7dd6da414514b832d9a8fc9098a06 +6ec7dd6da414514b832d9a8fc9098a06 +Running test 3 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 3 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 4 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 4 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 5 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 5 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 6 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 6 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 7 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 7 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 8 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 8 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 9 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 9 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 10 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 10 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 11 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 11 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 12 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 12 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 13 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 13 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 14 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 14 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 15 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 15 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 16 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 16 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 17 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 17 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 18 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 18 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 19 buffered +Random seed is 1 +9cc0323438bb10f5cc88cfbd5aaf5cfa +9cc0323438bb10f5cc88cfbd5aaf5cfa +Running test 19 direct +Random seed is 1 +d41d8cd98f00b204e9800998ecf8427e +d41d8cd98f00b204e9800998ecf8427e +Running test 20 buffered +Random seed is 1 +764e24deb80dc89aaecdadce4a656052 +764e24deb80dc89aaecdadce4a656052 +Running test 20 direct +Random seed is 1 +764e24deb80dc89aaecdadce4a656052 +764e24deb80dc89aaecdadce4a656052 diff --git a/tests/generic/group b/tests/generic/group index eb52833..a0830c1 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -113,3 +113,4 @@ 308 auto quick 309 auto quick 310 auto +311 auto -- 1.7.7.6 From zab@redhat.com Mon Apr 22 17:31:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A30FD7F37 for ; Mon, 22 Apr 2013 17:31:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 824A7304067 for ; Mon, 22 Apr 2013 15:31:17 -0700 (PDT) X-ASG-Debug-ID: 1366669876-04bdf02d204ee150001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id I3SxPlRvamy5lsMX for ; Mon, 22 Apr 2013 15:31:16 -0700 (PDT) X-Barracuda-Envelope-From: zab@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3MMVFlE014745 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 22 Apr 2013 18:31:15 -0400 Received: from localhost (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3MMVETe024487 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 22 Apr 2013 18:31:14 -0400 Date: Mon, 22 Apr 2013 15:31:14 -0700 From: Zach Brown To: Josef Bacik Cc: linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfstests 311: test fsync with dm flakey Message-ID: <20130422223114.GD25389@lenny.home.zabbo.net> X-ASG-Orig-Subj: Re: [PATCH] xfstests 311: test fsync with dm flakey References: <1366665213-17894-1-git-send-email-jbacik@fusionio.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1366665213-17894-1-git-send-email-jbacik@fusionio.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366669876 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 > +static void drop_all_caches() > +{ > + int value = 3; > + int fd; > + > + if ((fd = open("/proc/sys/vm/drop_caches", O_WRONLY)) < 0) { > + fprintf(stderr, "Error opening drop caches: %d\n", errno); > + return; > + } > + > + write(fd, &value, sizeof(int)); > + close(fd); > +} fwiw drop_caches takes an ascii string, not a native int: open("/proc/sys/vm/drop_caches", O_WRONLY) = 3 write(3, "\3\0\0\0", 4) = -1 EINVAL (Invalid argument) --- test.c.busted 2013-04-22 15:22:57.593575545 -0700 +++ test.c 2013-04-22 15:29:25.358072087 -0700 @@ -7,7 +7,7 @@ static void drop_all_caches() { - int value = 3; + char value[] = "3\n"; int fd; if ((fd = open("/proc/sys/vm/drop_caches", O_WRONLY)) < 0) { @@ -15,7 +15,7 @@ return; } - write(fd, &value, sizeof(int)); + write(fd, value, sizeof(value) - 1); close(fd); } open("/proc/sys/vm/drop_caches", O_WRONLY) = 3 write(3, "3\n", 2) = 2 and all this makes me think that the write() return should probably have been checked :). - z From sandeen@sandeen.net Mon Apr 22 17:37:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2F5367F4C for ; Mon, 22 Apr 2013 17:37:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B2D34AC003 for ; Mon, 22 Apr 2013 15:37:05 -0700 (PDT) X-ASG-Debug-ID: 1366670224-04cb6c2c1c4e1f90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ZP7JP9cqOx7NitzK for ; Mon, 22 Apr 2013 15:37:04 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 250966527C12 for ; Mon, 22 Apr 2013 17:37:04 -0500 (CDT) Message-ID: <5175BB8F.5090604@sandeen.net> Date: Mon, 22 Apr 2013 17:37:03 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 0/3] xfsprogs: manpage & usage string fixups X-Enigmail-Version: 1.5.1 X-ASG-Orig-Subj: [PATCH 0/3] xfsprogs: manpage & usage string fixups Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366670224 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128875 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The helpful QE elves at Red Hat wrote scripts to check manpages, usage strings, and actual accepted arguments, and found lots of inconsistencies in xfsprogs, as well as spelling errors. Fixups follow. From sandeen@sandeen.net Mon Apr 22 17:39:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 487077F4E for ; Mon, 22 Apr 2013 17:39:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32F41304064 for ; Mon, 22 Apr 2013 15:39:30 -0700 (PDT) X-ASG-Debug-ID: 1366670368-04cb6c2c1c4e21d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id SWHrhvvL1G6zz44C for ; Mon, 22 Apr 2013 15:39:28 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A4D1D63BCC66 for ; Mon, 22 Apr 2013 17:39:28 -0500 (CDT) Message-ID: <5175BC20.9010403@sandeen.net> Date: Mon, 22 Apr 2013 17:39:28 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 1/3] xfsprogs: manpage spelling fixes References: <5175BB8F.5090604@sandeen.net> X-ASG-Orig-Subj: [PATCH 1/3] xfsprogs: manpage spelling fixes In-Reply-To: <5175BB8F.5090604@sandeen.net> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366670368 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128875 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Fix several spelling errors in xfsprogs manpages. Signed-off-by: Eric Sandeen --- diff --git a/man/man5/projects.5 b/man/man5/projects.5 index d8fb56d..6845540 100644 --- a/man/man5/projects.5 +++ b/man/man5/projects.5 @@ -1,6 +1,6 @@ .TH projects 5 .SH NAME -projects \- persistent project root defintion +projects \- persistent project root definition .SH DESCRIPTION The .I /etc/projects diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 index fa52152..7f3a4b4 100644 --- a/man/man8/mkfs.xfs.8 +++ b/man/man8/mkfs.xfs.8 @@ -279,7 +279,7 @@ with .BR log= , or as the number fitting in a filesystem block with .BR perblock= . -The mininum (and default) +The minimum (and default) .I value is 256 bytes. The maximum @@ -297,7 +297,7 @@ so if no inode size is given on the command line, .B mkfs.xfs will attempt to choose a size such that inode numbers will be < 32 bits. If an inode size -is specified, or if a filesystem is sufficently large, +is specified, or if a filesystem is sufficiently large, .B mkfs.xfs will warn if this will create inode numbers > 32 significant bits. diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 index 17ac601..646380c 100644 --- a/man/man8/xfs_db.8 +++ b/man/man8/xfs_db.8 @@ -960,12 +960,12 @@ and (1 if the extent is unwritten). .TP .B keys -[nonleaf blocks only] array of key records. These are the first key +[non-leaf blocks only] array of key records. These are the first key value of each block in the level below this one. Each record contains .BR startoff . .TP .B ptrs -[nonleaf blocks only] array of child block pointers. +[non-leaf blocks only] array of child block pointers. Each pointer is a filesystem block number to the next level in the Btree. .PD .RE @@ -975,7 +975,7 @@ There is one set of filesystem blocks forming the by-block-number allocation Btree for each allocation group. The root block of this Btree is designated by the .B bnoroot -field in the coresponding AGF block. +field in the corresponding AGF block. The blocks are linked to sibling left and right blocks at each level, as well as by pointers from parent to child blocks. Each block has the following fields: @@ -1004,14 +1004,14 @@ and .BR blockcount . .TP .B keys -[nonleaf blocks only] array of key records. These are the first value +[non-leaf blocks only] array of key records. These are the first value of each block in the level below this one. Each record contains .B startblock and .BR blockcount . .TP .B ptrs -[nonleaf blocks only] array of child block pointers. Each pointer is a +[non-leaf blocks only] array of child block pointers. Each pointer is a block number within the allocation group to the next level in the Btree. .PD .RE @@ -1021,7 +1021,7 @@ There is one set of filesystem blocks forming the by-block-count allocation Btree for each allocation group. The root block of this Btree is designated by the .B cntroot -field in the coresponding AGF block. The blocks are linked to sibling +field in the corresponding AGF block. The blocks are linked to sibling left and right blocks at each level, as well as by pointers from parent to child blocks. Each block has the following fields: .RS 1.4i @@ -1049,14 +1049,14 @@ and .BR blockcount . .TP .B keys -[nonleaf blocks only] array of key records. These are the first value +[non-leaf blocks only] array of key records. These are the first value of each block in the level below this one. Each record contains .B blockcount and .BR startblock . .TP .B ptrs -[nonleaf blocks only] array of child block pointers. Each pointer is a +[non-leaf blocks only] array of child block pointers. Each pointer is a block number within the allocation group to the next level in the Btree. .PD .RE @@ -1368,7 +1368,7 @@ number of warnings issued about realtime block limit violations. There is one set of filesystem blocks forming the inode allocation Btree for each allocation group. The root block of this Btree is designated by the .B root -field in the coresponding AGI block. +field in the corresponding AGI block. The blocks are linked to sibling left and right blocks at each level, as well as by pointers from parent to child blocks. Each block has the following fields: @@ -1400,12 +1400,12 @@ count of free inodes in this chunk, and bitmap, LSB corresponds to inode 0. .TP .B keys -[nonleaf blocks only] array of key records. These are the first value of each +[non-leaf blocks only] array of key records. These are the first value of each block in the level below this one. Each record contains .BR startino . .TP .B ptrs -[nonleaf blocks only] array of child block pointers. Each pointer is a +[non-leaf blocks only] array of child block pointers. Each pointer is a block number within the allocation group to the next level in the Btree. .PD .RE diff --git a/man/man8/xfs_mdrestore.8 b/man/man8/xfs_mdrestore.8 index a7d2b68..7b9ba89 100644 --- a/man/man8/xfs_mdrestore.8 +++ b/man/man8/xfs_mdrestore.8 @@ -16,7 +16,7 @@ to a filesystem. The .I source argument specifies the location of the metadump image and the .I target -argument specifies the destination for the filsystem image. +argument specifies the destination for the filesystem image. If the .I source is \-, then the metadata image is read from stdin. This allows the output of diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 index f3b54cc..9327feb 100644 --- a/man/man8/xfs_quota.8 +++ b/man/man8/xfs_quota.8 @@ -623,7 +623,7 @@ can be used to limit recursion level (\-1 is infinite, 0 is top level only, 1 is first level ... ). Option .B \-p -adds posibility to specify project paths in command line without a need +adds possibility to specify project paths in command line without a need for .I /etc/projects to exist. Note that if projects file exists then it is also used. diff --git a/man/man8/xfs_repair.8 b/man/man8/xfs_repair.8 index 57c97da..7b296ba 100644 --- a/man/man8/xfs_repair.8 +++ b/man/man8/xfs_repair.8 @@ -170,7 +170,7 @@ Verbose output. Repair dangerously. Allow .B xfs_repair to repair an XFS filesystem mounted read only. This is typically done -on a root fileystem from single user mode, immediately followed by a reboot. +on a root filesystem from single user mode, immediately followed by a reboot. .TP .B \-V Prints out the current version number and exits. @@ -239,7 +239,7 @@ The name assigned is the inode number. aborts on most disk I/O errors. Therefore, if you are trying to repair a filesystem that was damaged due to a disk drive failure, steps should be taken to ensure that all blocks in the filesystem are -readable and writeable before attempting to use +readable and writable before attempting to use .B xfs_repair to repair the filesystem. A possible method is using .BR dd (8) From sandeen@sandeen.net Mon Apr 22 17:40:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9A3407F50 for ; Mon, 22 Apr 2013 17:40:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 68382304053 for ; Mon, 22 Apr 2013 15:40:41 -0700 (PDT) X-ASG-Debug-ID: 1366670439-04bdf02d204ee940001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BP3GoehZU6T8N3Ld for ; Mon, 22 Apr 2013 15:40:39 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 539D463BCC66 for ; Mon, 22 Apr 2013 17:40:39 -0500 (CDT) Message-ID: <5175BC67.1000902@sandeen.net> Date: Mon, 22 Apr 2013 17:40:39 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 2/3] xfsprogs: Fix manpages for missing or incorrect options References: <5175BB8F.5090604@sandeen.net> X-ASG-Orig-Subj: [PATCH 2/3] xfsprogs: Fix manpages for missing or incorrect options In-Reply-To: <5175BB8F.5090604@sandeen.net> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366670439 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128875 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add valid options which aren't in manpages, and remove invalid options which are in manpages: * Document -V (show version and exit) for many manpages. * Remove -? option from xfs_estimate.8 * Document -p passes, -d (debug) and -g (syslog) in xfs_fsr.8 * Document -n (O_NONBLOCK) in xfs_io.8 * Document -v (print overwrite) in xfs_logprint.8 * Document -m max_extents in xfs_metadump.8 * Document -p (preallocate) in xfs_mkfile.8 Signed-off-by: Eric Sandeeen --- diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 index 7f3a4b4..add48cb 100644 --- a/man/man8/mkfs.xfs.8 +++ b/man/man8/mkfs.xfs.8 @@ -38,6 +38,8 @@ mkfs.xfs \- construct an XFS filesystem .B \-N ] [ .B \-K +] [ +.B \-V ] .I device .SH DESCRIPTION @@ -728,6 +730,9 @@ creating the file system. .TP .B \-K Do not attempt to discard blocks at mkfs time. +.TP +.B \-V +Prints the version number and exits. .SH SEE ALSO .BR xfs (5), .BR mkfs (8), diff --git a/man/man8/xfs_admin.8 b/man/man8/xfs_admin.8 index 2de907b..4b476f5 100644 --- a/man/man8/xfs_admin.8 +++ b/man/man8/xfs_admin.8 @@ -4,7 +4,7 @@ xfs_admin \- change parameters of an XFS filesystem .SH SYNOPSIS .B xfs_admin [ -.B \-eflpu +.B \-eflpuV ] [ .BR "\-c 0" | 1 ] [ @@ -97,6 +97,9 @@ The may also be .BR generate , which will generate a new UUID for the filesystem. +.TP +.B \-V +Prints the version number and exits. .PP The .BR mount (8) diff --git a/man/man8/xfs_bmap.8 b/man/man8/xfs_bmap.8 index ccaa79b..7a1e948 100644 --- a/man/man8/xfs_bmap.8 +++ b/man/man8/xfs_bmap.8 @@ -4,7 +4,7 @@ xfs_bmap \- print block mapping for an XFS file .SH SYNOPSIS .B xfs_bmap [ -.B \-adlpv +.B \-adlpvV ] [ .B \-n .I num_extents @@ -91,6 +91,9 @@ A second option will print out the .I flags legend. +.TP +.B \-V +Prints the version number and exits. .SH SEE ALSO .BR xfs_fsr (8), .BR xfs (5). diff --git a/man/man8/xfs_check.8 b/man/man8/xfs_check.8 index 1654532..6168f2e 100644 --- a/man/man8/xfs_check.8 +++ b/man/man8/xfs_check.8 @@ -16,6 +16,8 @@ xfs_check \- check XFS filesystem consistency ] [ .B \-v ] [ +.B \-V +] [ .B \-l .I logdev ] @@ -73,6 +75,9 @@ Specifies verbose output; it is impossibly long for a reasonably-sized filesystem. This option is intended for internal use only. .TP +.B \-V +Prints the version number and exits. +.TP .BI \-i " ino" Specifies verbose behavior for the specified inode .IR ino . diff --git a/man/man8/xfs_copy.8 b/man/man8/xfs_copy.8 index 3028db8..35edace 100644 --- a/man/man8/xfs_copy.8 +++ b/man/man8/xfs_copy.8 @@ -4,7 +4,7 @@ xfs_copy \- copy the contents of an XFS filesystem .SH SYNOPSIS .B xfs_copy [ -.B \-bd +.B \-bdV ] [ .B \-L .I log @@ -81,6 +81,9 @@ The buffered option can be used to ensure direct IO is not attempted to any of the target files. This is useful when the filesystem holding the target file does not support direct IO. .TP +.B \-V +Prints the version number and exits. +.TP .BI \-L " log" Specifies the location of the .I log diff --git a/man/man8/xfs_estimate.8 b/man/man8/xfs_estimate.8 index bb458ec..ca86d46 100644 --- a/man/man8/xfs_estimate.8 +++ b/man/man8/xfs_estimate.8 @@ -3,7 +3,7 @@ xfs_estimate \- estimate the space that an XFS filesystem will take .SH SYNOPSIS .nf -\f3xfs_estimate\f1 [ \f3\-h?\f1 ] [ \f3\-b\f1 blocksize ] [ \f3\-i\f1 logsize ] +\f3xfs_estimate\f1 [ \f3\-h\f1 ] [ \f3\-b\f1 blocksize ] [ \f3\-i\f1 logsize ] [ \f3\-e\f1 logsize ] [ \f3\-v\f1 ] directory ... .fi .SH DESCRIPTION @@ -51,9 +51,6 @@ Display more information, formatted. .B \-h Display usage message. .TP -.B \-? -Display usage message. -.TP \f3\-i, \-e\f1 \f2logsize\f1 Use .I logsize diff --git a/man/man8/xfs_freeze.8 b/man/man8/xfs_freeze.8 index 97c7911..d36eb60 100644 --- a/man/man8/xfs_freeze.8 +++ b/man/man8/xfs_freeze.8 @@ -2,9 +2,14 @@ .SH NAME xfs_freeze \- suspend access to an XFS filesystem .SH SYNOPSIS -.B xfs_freeze \-f +.B xfs_freeze +[ +.B \-V +] [ +.B \-f | .B \-u +] .I mount-point .fi .SH DESCRIPTION @@ -26,6 +31,10 @@ The filesystem must be mounted to be frozen (see .BR mount (8)). .PP The +.B \-V +flag prints the version number and exits. +.PP +The .B \-f flag requests the specified XFS filesystem to be frozen from new modifications. @@ -48,7 +57,9 @@ operations to continue. Any filesystem modifications that were blocked by the freeze are unblocked and allowed to complete. .PP -One of +Unless +.B \-V +is specified, one of .B \-f or .B \-u diff --git a/man/man8/xfs_fsr.8 b/man/man8/xfs_fsr.8 index bf5e942..f365274 100644 --- a/man/man8/xfs_fsr.8 +++ b/man/man8/xfs_fsr.8 @@ -3,9 +3,9 @@ xfs_fsr \- filesystem reorganizer for XFS .SH SYNOPSIS .nf -\f3xfs_fsr\f1 [\f3\-v\f1] \c -[\f3\-t\f1 seconds] [\f3\-f\f1 leftoff] [\f3\-m\f1 mtab] -\f3xfs_fsr\f1 [\f3\-v\f1] \c +\f3xfs_fsr\f1 [\f3\-vdg\f1] \c +[\f3\-t\f1 seconds] [\f3\-p\f1 passes] [\f3\-f\f1 leftoff] [\f3\-m\f1 mtab] +\f3xfs_fsr\f1 [\f3\-vdg\f1] \c [xfsdev | file] ... .fi .SH DESCRIPTION @@ -35,7 +35,11 @@ The default is to use .TP .BI \-t " seconds" How long to reorganize. -The default is 7200 (2 hours). +The default is 7200 seconds (2 hours). +.TP +.BI \-p " passes" +Number of passes before terminating global re-org. +The default is 10 passes. .TP .BI \-f " leftoff" Use this file instead of @@ -47,6 +51,12 @@ to store the state of where reorganization left off. Verbose. Print cryptic information about each file being reorganized. +.TP +.B \-d +Debug. Print even more cryptic information. +.TP +.B \-g +Print to syslog (default if stdout not a tty). .PP When invoked with no arguments .I xfs_fsr diff --git a/man/man8/xfs_growfs.8 b/man/man8/xfs_growfs.8 index b55438b..f7a82e9 100644 --- a/man/man8/xfs_growfs.8 +++ b/man/man8/xfs_growfs.8 @@ -39,6 +39,8 @@ xfs_growfs, xfs_info \- expand an XFS filesystem .br .B xfs_info [ +.B \-V +] [ .B \-t .I mtab ] diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 33a5944..0d572c7 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -4,7 +4,7 @@ xfs_io \- debug the I/O path of an XFS filesystem .SH SYNOPSIS .B xfs_io [ -.B \-adfmrRstx +.B \-adfmrRstxV ] [ .B \-c .I cmd @@ -52,6 +52,9 @@ is immutable or append-only. .B \-x Expert mode. Dangerous commands are only available in this mode. These commands also tend to require additional privileges. +.TP +.B \-V +Prints the version number and exits. .PP The other .BR open (2) @@ -111,6 +114,9 @@ opens for synchronous I/O (O_SYNC). .B \-t truncates on open (O_TRUNC). .TP +.B \-n +opens in non-blocking mode if possible (O_NONBLOCK). +.TP .B \-R marks the file as a realtime XFS file after opening it, if it is not already marked as such. diff --git a/man/man8/xfs_logprint.8 b/man/man8/xfs_logprint.8 index c1a8077..16e881e 100644 --- a/man/man8/xfs_logprint.8 +++ b/man/man8/xfs_logprint.8 @@ -97,6 +97,12 @@ Override any notion of where to start printing. .TP .B \-t Print out the transactional view. +.TP +.B \-v +Print "overwrite" data. +.TP +.B \-V +Prints the version number and exits. .SH SEE ALSO .BR mkfs.xfs (8), .BR mount (8). diff --git a/man/man8/xfs_metadump.8 b/man/man8/xfs_metadump.8 index 9672713..b2c718a 100644 --- a/man/man8/xfs_metadump.8 +++ b/man/man8/xfs_metadump.8 @@ -6,6 +6,10 @@ xfs_metadump \- copy XFS filesystem metadata to a file [ .B \-efgow ] [ +.B \-m +.I max_extents +] +] [ .B \-l .I logdev ] @@ -94,6 +98,11 @@ For filesystems which use an external log, this specifies the device where the external log resides. The external log is not copied, only internal logs are copied. .TP +.B \-m +Set the maximum size of an allowed metadata extent. Extremely large metadata +extents are likely to be corrupt, and will be skipped if they exceed +this value. The default size is 1000 blocks. +.TP .B \-o Disables obfuscation of file names and extended attributes. .TP diff --git a/man/man8/xfs_mkfile.8 b/man/man8/xfs_mkfile.8 index 96f443f..1d2c501 100644 --- a/man/man8/xfs_mkfile.8 +++ b/man/man8/xfs_mkfile.8 @@ -7,6 +7,10 @@ xfs_mkfile \- create an XFS file .B \-v ] [ .B \-n +] [ +.B \-p +] [ +.B \-V ] .I size\c .RB [ k | b | m | g ] @@ -30,3 +34,10 @@ Verbose. Report the names and sizes of created files. .B \-n No bytes. Create a holey file - that is, do not write out any data, just seek to end of file and write a block. +.TP +.B \-p +Preallocate. The file is preallocated, then overwritten with zeroes, +then truncated to the desired size. +.TP +.B \-V +Prints the version number and exits. diff --git a/man/man8/xfs_ncheck.8 b/man/man8/xfs_ncheck.8 index 408919d..dfaed6a 100644 --- a/man/man8/xfs_ncheck.8 +++ b/man/man8/xfs_ncheck.8 @@ -11,6 +11,8 @@ xfs_ncheck \- generate pathnames from i-numbers for XFS ] [ .B \-s ] [ +.B \-V +] [ .B \-l .I logdev ] @@ -53,6 +55,9 @@ for a detailed description of the XFS log. Limits the report to special files and files with setuserid mode. This option may be used to detect violations of security policy. .TP +.B \-V +Prints the version number and exits. +.TP .BI \-i " ino" Limits the report to only those files whose inode numbers follow. May be given multiple times to select multiple inode numbers. diff --git a/man/man8/xfs_rtcp.8 b/man/man8/xfs_rtcp.8 index be81cb3..22ba12d 100644 --- a/man/man8/xfs_rtcp.8 +++ b/man/man8/xfs_rtcp.8 @@ -8,6 +8,8 @@ xfs_rtcp \- XFS realtime copy command .I extsize ] [ .B -p +] [ +.B -V ] .IR source " ... " target .SH DESCRIPTION @@ -35,6 +37,9 @@ will pad the destination file to a size which is an even multiple of the filesystem block size. This is necessary since the realtime file is created using direct I/O and the minimum I/O is the filesystem block size. +.TP +.B \-V +Prints the version number and exits. .SH SEE ALSO .BR xfs (5), .BR mkfs.xfs (8), From sandeen@sandeen.net Mon Apr 22 17:42:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EF7E17F52 for ; Mon, 22 Apr 2013 17:42:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A7F13304064 for ; Mon, 22 Apr 2013 15:42:09 -0700 (PDT) X-ASG-Debug-ID: 1366670527-04bdf02d1d4eea90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BMGuddCP3r8Ka5YU for ; Mon, 22 Apr 2013 15:42:07 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 966FF63BCC66 for ; Mon, 22 Apr 2013 17:42:07 -0500 (CDT) Message-ID: <5175BCBE.8040306@sandeen.net> Date: Mon, 22 Apr 2013 17:42:06 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 3/3] xfsprogs: Fix up usage() errors and omissions References: <5175BB8F.5090604@sandeen.net> X-ASG-Orig-Subj: [PATCH 3/3] xfsprogs: Fix up usage() errors and omissions In-Reply-To: <5175BB8F.5090604@sandeen.net> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366670527 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128875 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add missing options and remove invalid options in usage() output strings. * Add -V to several usage() strings * Remove deprecated/invalid -n and -s otions from xfs_fsr's usage * Remove invalid -I option from xfs_growfs's usage * Add -n (O_NONBLOCK) option to xfs_io's usage * Add -e (exit on error) option to xfs_logprint's usage * Remove invalid -b option from xfs_mdrestore's usage * Add -N (no-op), -K (no discard), and -f (force) to mkfs.xfs's usage * Add -x (expert) option to xfs_quota's usage Signed-off-by: Eric Sandeen --- diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index c01e0b9..7f65de3 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -301,7 +301,7 @@ void usage(void) { fprintf(stderr, - _("Usage: %s [-bd] [-L logfile] source target [target ...]\n"), + _("Usage: %s [-bdV] [-L logfile] source target [target ...]\n"), progname); exit(1); } diff --git a/db/init.c b/db/init.c index 2a31cb8..0e9e1a2 100644 --- a/db/init.c +++ b/db/init.c @@ -43,7 +43,7 @@ static void usage(void) { fprintf(stderr, _( - "Usage: %s [-fFrxV] [-p prog] [-l logdev] [-c cmd]... device\n" + "Usage: %s [-ifFrxV] [-p prog] [-l logdev] [-c cmd]... device\n" ), progname); exit(1); } diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 3d017ca..2440bab 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -386,12 +386,9 @@ void usage(int ret) { fprintf(stderr, _( -"Usage: %s [-d] [-v] [-n] [-s] [-g] [-t time] [-p passes] [-f leftf] [-m mtab]\n" -" %s [-d] [-v] [-n] [-s] [-g] xfsdev | dir | file ...\n\n" +"Usage: %s [-d] [-v] [-g] [-t time] [-p passes] [-f leftf] [-m mtab]\n" +" %s [-d] [-v] [-g] xfsdev | dir | file ...\n\n" "Options:\n" -" -n Do nothing, only interesting with -v. Not\n" -" effective with in mtab mode.\n" -" -s Print statistics only.\n" " -g Print to syslog (default if stdout not a tty).\n" " -t time How long to run in seconds.\n" " -p passes Number of passes before terminating global re-org.\n" diff --git a/growfs/xfs_growfs.c b/growfs/xfs_growfs.c index a6d298b..5d544da 100644 --- a/growfs/xfs_growfs.c +++ b/growfs/xfs_growfs.c @@ -19,14 +19,6 @@ #include #include -/* - * When growing a filesystem, this is the most significant - * bits we'll accept in the resulting inode numbers - * without warning the user. - */ - -#define XFS_MAX_INODE_SIG_BITS 32 - static void usage(void) { @@ -37,7 +29,6 @@ Options:\n\ -l grow log section\n\ -r grow realtime section\n\ -n don't change anything, just show geometry\n\ - -I allow inode numbers to exceed %d significant bits\n\ -i convert log from external to internal format\n\ -t alternate location for mount table (/etc/mtab)\n\ -x convert log from internal to external format\n\ @@ -47,7 +38,7 @@ Options:\n\ -e size set realtime extent size to size blks\n\ -m imaxpct set inode max percent to imaxpct\n\ -V print version information\n"), - progname, XFS_MAX_INODE_SIG_BITS); + progname); exit(2); } diff --git a/io/init.c b/io/init.c index fb93082..ca3055a 100644 --- a/io/init.c +++ b/io/init.c @@ -32,7 +32,7 @@ void usage(void) { fprintf(stderr, - _("Usage: %s [-adfmrRstx] [-p prog] [-c cmd]... file\n"), + _("Usage: %s [-adfmnrRstVx] [-p prog] [-c cmd]... file\n"), progname); exit(1); } diff --git a/io/xfs_freeze.sh b/io/xfs_freeze.sh index 45e20d2..647aa96 100644 --- a/io/xfs_freeze.sh +++ b/io/xfs_freeze.sh @@ -4,7 +4,7 @@ # OPTS="" -USAGE="Usage: xfs_freeze -f | -u " +USAGE="Usage: xfs_freeze [-V] [-f | -u] " DIRNAME=`dirname $0` VERSION=false FREEZE=false diff --git a/logprint/logprint.c b/logprint/logprint.c index 482fd4e..0923b0a 100644 --- a/logprint/logprint.c +++ b/logprint/logprint.c @@ -44,6 +44,7 @@ Options:\n\ -c try to continue if error found in log\n\ -C copy the log from the filesystem to filename\n\ -d dump the log in log-record format\n\ + -e exit when an error is found in the log\n\ -f specified device is actually a file\n\ -l filename of external log\n\ -n don't try and interpret log data\n\ diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index 509a3ed..479e677 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -178,7 +178,7 @@ perform_restore( static void usage(void) { - fprintf(stderr, "Usage: %s [-bg] source target\n", progname); + fprintf(stderr, "Usage: %s [-V] [-g] source target\n", progname); exit(1); } diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index c57a855..09b5d5b 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2911,6 +2911,9 @@ usage( void ) /* realtime subvol */ [-r extsize=num,size=num,rtdev=xxx]\n\ /* sectorsize */ [-s log=n|size=num]\n\ /* version */ [-V]\n\ +/* no-op info only */ [-N]\n\ +/* no discard */ [-K]\n\ +/* force overwrite */ [-f]\n\ devicename\n\ is required unless -d name=xxx is given.\n\ is xxx (bytes), xxxs (sectors), xxxb (fs blocks), xxxk (xxx KiB),\n\ diff --git a/quota/init.c b/quota/init.c index 0b481f7..aa99b1b 100644 --- a/quota/init.c +++ b/quota/init.c @@ -45,7 +45,7 @@ static void usage(void) { fprintf(stderr, - _("Usage: %s [-p prog] [-c cmd]... [-d project]... [path]\n"), + _("Usage: %s [-x] [-p prog] [-c cmd]... [-d project]... [path]\n"), progname); exit(1); } diff --git a/rtcp/xfs_rtcp.c b/rtcp/xfs_rtcp.c index 6ea7ab9..f0b5936 100644 --- a/rtcp/xfs_rtcp.c +++ b/rtcp/xfs_rtcp.c @@ -27,7 +27,7 @@ char *progname; void usage() { - fprintf(stderr, _("%s [-e extsize] [-p] source target\n"), progname); + fprintf(stderr, _("%s [-e extsize] [-p] [-V] source target\n"), progname); exit(2); } From david@fromorbit.com Mon Apr 22 18:31:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5BC3E29E05 for ; Mon, 22 Apr 2013 18:31:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DF3B3AC002 for ; Mon, 22 Apr 2013 16:31:03 -0700 (PDT) X-ASG-Debug-ID: 1366673461-04cb6c3c6817bda0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id JfhuCSypMTMucT2u for ; Mon, 22 Apr 2013 16:31:02 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArARANTHdVF5LHX7/2dsb2JhbABPgwa8KoUfBAGBBBd0gh8BAQQBOhwjBQsIAxQECSUPBSUDIROIDgWsZY5+FY4NgR0Hg0cDlxSKAIcbgx4q Received: from ppp121-44-117-251.lns20.syd6.internode.on.net (HELO dastard) ([121.44.117.251]) by ipmail06.adl6.internode.on.net with ESMTP; 23 Apr 2013 09:00:35 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UUQBt-0003fC-IW; Tue, 23 Apr 2013 09:30:33 +1000 Date: Tue, 23 Apr 2013 09:30:33 +1000 From: Dave Chinner To: Mark Tinguely Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails Message-ID: <20130422233033.GK30622@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails References: <20130419204102.736961610@sgi.com> <20130421174107.007313126@sgi.com> <5174603A.8030208@sandeen.net> <51753EDE.6000301@sgi.com> <51754A13.5000808@sandeen.net> <5175532B.3050509@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5175532B.3050509@sgi.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: 1366673461 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128879 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 22, 2013 at 10:11:39AM -0500, Mark Tinguely wrote: > #6 [ffff880135603980] _xfs_buf_find at ffffffffa01a7fef [xfs] > #7 [ffff8801356039f0] xfs_buf_get at ffffffffa01a824a [xfs] > #8 [ffff880135603a30] xfs_buf_read at ffffffffa01a83a4 [xfs] > #9 [ffff880135603a60] xlog_recover_inode_pass2 at ffffffffa0193629 [xfs] So it's the same problem as this bug fix addresses: commit 10616b806d1d7835b1d23b8d75ef638f92cb98b6 Author: Dave Chinner Date: Mon Jan 21 23:53:52 2013 +1100 xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end When _xfs_buf_find is passed an out of range address, it will fail to find a relevant struct xfs_perag and oops with a null dereference. This can happen when trying to walk a filesystem with a metadata inode that has a partially corrupted extent map (i.e. the block number returned is corrupt, but is otherwise intact) and we try to read from the corrupted block address. In this case, just fail the lookup. If it is readahead being issued, it will simply not be done, but if it is real read that fails we will get an error being reported. Ideally this case should result in an EFSCORRUPTED error being reported, but we cannot return an error through xfs_buf_read() or xfs_buf_get() so this lookup failure may result in ENOMEM or EIO errors being reported instead. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Reviewed-by: Ben Myers Signed-off-by: Ben Myers > The recovery value is bad and is a problem on its own, but XFS does > not verify the validity of ag number when doing a xfs_perag_get(). Right, that's what the above fix does, but it can't be done on older kernels because grwofs relies on being able to get buffers beyond the existing filesystem limits... Cheers, Dave. -- Dave Chinner david@fromorbit.com From zedias30@gmail.com Mon Apr 22 18:36:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5D50C29E05 for ; Mon, 22 Apr 2013 18:36:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2BE288F8049 for ; Mon, 22 Apr 2013 16:36:13 -0700 (PDT) X-ASG-Debug-ID: 1366673770-04bdf02d1f4f2070001-w1Z2WR Received: from mail-wg0-f67.google.com (mail-wg0-f67.google.com [74.125.82.67]) by cuda.sgi.com with ESMTP id tFlchYgr5e4TNh0t (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 22 Apr 2013 16:36:11 -0700 (PDT) X-Barracuda-Envelope-From: zedias30@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.67 Received: by mail-wg0-f67.google.com with SMTP id a12so2103wgh.6 for ; Mon, 22 Apr 2013 16:36:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=sagVbMGXRS9ziCM44VdDNdygzJSK/cWwAvOEEGFIs48=; b=AUbrUirkxvZVI/I4zRrGtrEeWBrNo8zjc5GB1dvzAAJDcfzMNSBrFkVs7J4N0vuqHB VfR9sv6/mH5FQ/XdTvgrboHPc/Q4l8MpW4GltxiGMxAcDeE/eiIzkqGsqngDK+7vcl8G YL/DVQDwQB/h7LPjuKMYcyKAabeVVhZKzsjsLI5gRoq68MAR0CNmZ1VYwas8ce80H97/ 0jB9dpTwsTWcGDDd+CBqreH51L2eVLTKP7aSulTe+EAig6MkwXDk2R7B1IkXUVaN9Ikv g+wKWoJLA3KvhPX/hu9QzL5iv8gjXPu73KE/ny9nntXcqGKiJVMyBrhnpKZDcodMlkbT rCfw== MIME-Version: 1.0 X-Received: by 10.194.158.161 with SMTP id wv1mr20244480wjb.38.1366673770599; Mon, 22 Apr 2013 16:36:10 -0700 (PDT) Received: by 10.194.240.39 with HTTP; Mon, 22 Apr 2013 16:36:10 -0700 (PDT) Date: Mon, 22 Apr 2013 20:36:10 -0300 Message-ID: Subject: email From: Jose Dias X-ASG-Orig-Subj: email To: infoperf@perfumes.com.br, informacoes@sebraerj.com.br, informativocat@cigarro.med.br, institucional@proviewbr.com.br, instrutec@argo.com.br, inteligente@ednan.com.br, invertiabr@corp.terra.com.br, investors@aggreko.com, invitations@mygospel.ning.com, ipanema@livrariagalileu.com.br, isabel@cosmoplast.com.br, IsaconsultIMAP , isaias@engepack.com.br, isaisaabreu@hotmail.com, issqndec@smf.prefpoa.com.br, itam@itam.com.br, Itamar Machado , itaporanga@itaporanga.com.br, j.contre@terra.com.br, jackfinlandkonsul@hotmail.com, jacks@netium.com.br, jairb@schincariol.com.br, jake@zopezone.com, jalcantara@hotmail.com.br, janete@argo.com.br, jason_macnaughton@vancouver2010.com, jasonnolan@netscape.net, jc_lautharth@hotmail.com, jcalleff@visteon.com.br, jcesar@godigital.com.br, jcgois@comcast.net, jeff.robson@cynergic.net, jeremy@zope.com, jerre@smf.prefpoa.com.br, Jim Fulton , jim@70.168.181.221, jluiz@tecplam.com.br, JMASSESSORIA2009@hotmail.com, jmfelicidade@yahoo.com.br, jmweb@jmweb.com.br, joakim_lofkvist@hotmail.com, =?ISO-8859-1?Q?Jo=E3o_D=27Aurea_Jr?= , jobs@employmentatlanta.com, jodie-polly4c5@live.com, joe@domain.com, jogos-fantasticos@hotmail.com, John S Wolter , john_taylor_1000@hotmail.com, john.doe@somewhere.com, jonathan@fogas.com.br, jonathansamuel@yahoo.com, jorge.nge@bol.com.br, jorgeeidilene@ig.com.br, jorgeklein@navegandolendo.com.br, jorgeklein@uol.com.br, jorgelima@cimatec.fieb.org.br, jorgemoji@terra.com.br, jorgetadeu@uol.com.br, jorgetadeu7@uol.com.br, "Jose R. Padua" , =?ISO-8859-1?Q?Jos=E9_Soares_Pinto?= , jose_jorge@sam.br.sony.com, jose.ferreira@lgpd.com, joseff@smf.prefpoa.com.br, josemaria.valente@bol.com.br, joserenato@weg.com.br, joserobertor@nassau.com.br, josianed12@yahoo.com.br, josijosyta@yahoo.com.br, jow@foo.com, jpl_edi@hotmal.com, jpmbereana@yahoo.com.br, jpregador@hotmail.com, jscoriolano@inmetro.gov.bre, jto99@hotmail.com, juan.cets@gmail.com.br, Judy Silva , julia.albuquerque@thomson.net, juliana_cristina21@hotmail.com, Juliano dos Santos Vargas , julio@placibras.com.br, julio@portaltributario.com.br, julio@voetaf.com.br, jully_sande@yahoo.com.br, juma@jumalodge.com.br, jurandirsaopaulo@hotmail.com, Juscelino Motta , kamylinhamoreninha@hotmail.com, karina_vidrolatas@hotmail.com, karl@digicool.com, karla@sonsun.com.br, kat_imperial@hotmail.com, katayama@ipt.br, Katiani Gomes , keihin@argo.com.br, keillasanara@yahoo.com.br, Kelly Linhares , kellymelodia@hotmail.com, kelma@terapiaholistica.net, kennedytoliveira@hotmail.com, kernel-team@lists.ubuntu.com, kilercris@mail.com, Kleber barbosa de paula , Kleber Rodrigo , kleber.oliveira@clariant.com, kleitongarcia@yahoo.com.br, kleython@autoracing.com.br, klm@zope.com, kotelvilhena@hotmail.com, kris_dany@hotmail.com, krystal@krystalhotel.com.br, krystalhotel@internext.com.br, kubuntu-devel@lists.ubuntu.com, kubuntu-users@lists.ubuntu.com, kurt.grigg@virgin.net, kwj@kwj.ind.br, l.junior12@hotmail.com, la_flaire@hotmail.com, lacerdahd@vivax.com.br, laiz_f12@hotmail.com, laiza-monique@hotmail.com, lanaplast@lanaplast.com, largodomachado@livrariagalileu.com.br, latinoindustria@uol.com.br, laurivani.santos@norteferro.com.br, lavasecpassa@lavasecpassa.com.br, lboliveira@plastipak.com.br, lccsantana48@hotmail.com, legal@zope.com, leiaprofeta@hotmail.com, leidilevita12@hotmail.com, Leila Alichala , "leile_novais@hotmail.com" , leilecontato@terra.com.br, lellonucci@ig.com.br, lena_f39@hotmail.com, leniltonsolitario@hotmail.com, leofreitas18@hotmail.com, leonardo@captpeacock.com, leviembalagens@levi.com.br, liberalino.machado@orientnet.com.br, liderhotel@internext.com.br, liderhotel@liderhotelmanaus.com.br, lidianelima_cat@hotmail.com, lidimar_lima@hotmail.com, LightInTheBox , Liliane de Andrade , lilisf@ig.com.br, lincoln@emops.com.br, lindamar_santos@hotmail.com, lingerie@lingerie.com.br, linhasecores@vivax.com.br, link@interlins.com.br, linkdobebe@linkdobebe.com.br, linux-cluster@redhat.com, linux-lvm@redhat.com, linux-xfs@oss.sgi.com, lisa@humorinthenews.com, lisa@lisacoburn.com, lisatt@artisa.com.br, livro-rio@kosmos.com.br, lmiguel@ifer.com.br, localiza@vivax.com.br, lois@zope.com, loja@clubedexadrez.com.br, lorenamanuzinha@hotmail.com, Lorenna de Albuquerque Mello , lorettaguarino@google.com, Love biscuit s I LOTADOOOOOOOOOOO , Lubian Antonio , lucas_gade@hotmail.com, lucas.sacay@novodisc.com.br, "luciana.moura@pcinformatica.com.br" , lucienesalvadorrj@hotmail.com, lucilenebelizaria@hotmail.com, lucimeire.silva@gerdau.com.br, luigi.rocco@itelefonica.com.br, luis.a.ferasso@invensys.com.br, luiz.anesio@assesso.com.br, lukaspsantos@hotmail.com, luxrepresentacao@hotmail.com, m_floresbr@yahoo.com.br, macae@aggreko.com.br, magestetica@magestetica.com.br, mageven@correios.com.br, magistral@netium.com.br, "magnotavares@yahoo.com.br" , Magoo Magoo , malocas@osite.com.br, malubr@terra.com.br, manaos@internext.com.br, manaus.f@fazenda.org.br, manaus@aggreko.com.br, manaushotel@hotmail.com, mao.tps1@voerico.com.br, mao@toledobrasil.com.br, maotb@voetrip.com.br, maots@voetrip.com.br, marcelinofreitas9831@bol.com.br, marciaml@correios.com.br, marciofef@hotmail.com, marco giagio , marcos@cineral.com.br, marcosmensageirodoceu@yahoo.com.br, marcov7@bol.com.br, maria.lia@seculus.com.br, marileidearaujo@zipmail.com.br, marilene@digitronmanaus.com.br, marilia@mamiraua.org.br, Mario Muniz , mario_adachi@denso-diam.com, mario.silva@salcomp.com, mariotadros@lordmanaus.com.br, mark@gringoes.com, markinho_prof@hotmail.com, Martijn Faassen , marypoie@globo.com, matos.pedro@br.panasonic.com, matriz@barraferro.com.br, Matt Behrens , mauxiliadora@netium.com.br, maximus@nsimail.com, mazante@argon.com.br, mbarreto@evadin.com.br, mcdonc@ip72-209-234-118.dc.dc.cox.net, megaagro@megaagro.com.br, memorychipsbr@yahoo.com.br, meninas@sampacentro.com.br, mensageirosdoceu1@ig.com.br, met-magalhaes@argo.com.br, met.esplanada@uol.com.br, mgespacocultural@correios.com.br, mggevar@correios.com.br, michel carvalho , michel@zope.com, michelgatin@hotmail.com, microjet@argo.com.br, miguel.arcieri@gmail.com, mike_mcgrath@lineone.net, miks80@yahoo.com, millennium@millenniumcenter.com.br, miniaturas.brasil@terra.com.br, minintercessao12@hotmail.com, minolta.rh@internext.com.br, misandro@bol.com.br, Misha Wolf , mishaelcorreia@bol.com.br, mispilberg@bol.com.br, miss-cristinacarvalho@bol.com.br, mitsuba@argo.com.br Content-Type: multipart/alternative; boundary=089e013c6ab09ee24a04dafb88e6 X-Barracuda-Connect: mail-wg0-f67.google.com[74.125.82.67] X-Barracuda-Start-Time: 1366673771 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.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_SA584, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128879 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.20 BSF_SC0_SA584 Custom Rule SA584 --089e013c6ab09ee24a04dafb88e6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Seja pago para ler e-mails! Ganhe dinheiro por cada e-mail lido e clicado. Ganhe mais dinheiro por cada e-mail que as pessoas que voc=EA indicar lerem= . Inscreva-se j=E1 e comece a ganhar! http://www.e-mai.net/zedias --089e013c6ab09ee24a04dafb88e6 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Seja pago para ler e-mails! Ganhe dinheiro por= cada e-mail lido e clicado. Ganhe mais dinheiro por cada e-mail que as pes= soas que voc=EA indicar lerem. Inscreva-se j=E1 e comece a ganhar! http://www.e-mai.net/ze= dias
--089e013c6ab09ee24a04dafb88e6-- From david@fromorbit.com Mon Apr 22 19:08:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6719D7F37 for ; Mon, 22 Apr 2013 19:08:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5513D8F8039 for ; Mon, 22 Apr 2013 17:08:39 -0700 (PDT) X-ASG-Debug-ID: 1366675717-04cbb057f74c93b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id WV1YJ91SuC7XX9lX for ; Mon, 22 Apr 2013 17:08:37 -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: ArMRAPfPdVF5LHX7/2dsb2JhbABPgwY2u3iFHwQBgQUXdIIfAQEFJxMcIxAIAxQECSUPBSUDIROIEw2sU48BFY4NgR0Hg0cDlxSKAIcbgx4q Received: from ppp121-44-117-251.lns20.syd6.internode.on.net (HELO dastard) ([121.44.117.251]) by ipmail06.adl6.internode.on.net with ESMTP; 23 Apr 2013 09:38:36 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UUQmh-0003ix-Ty; Tue, 23 Apr 2013 10:08:35 +1000 Date: Tue, 23 Apr 2013 10:08:35 +1000 From: Dave Chinner To: Eric Sandeen Cc: Brian Foster , yongtaofu@gmail.com, xfs@oss.sgi.com Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging Message-ID: <20130423000835.GL30622@dastard> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <517596BA.3060408@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <517596BA.3060408@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1366675717 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128881 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 22, 2013 at 02:59:54PM -0500, Eric Sandeen wrote: > On 4/15/13 6:14 PM, Brian Foster wrote: > > Hi, > > > > Thanks for the data in the previous thread: > > > > http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > > > > I'm spinning off a new thread specifically for this because the original > > thread is already too large and scattered to track. As Eric stated, > > please try to keep data contained in as few messages as possible. > > > > Well, it's always simple in the end. It just took a lot of debugging > to figure out what was happening - we do appreciate your help with that! > > We were able to create a local reproducer, and it looks like > this patch fixes things: > > commit aae8a97d3ec30788790d1720b71d76fd8eb44b73 > Author: Aneesh Kumar K.V > Date: Sat Jan 29 18:43:27 2011 +0530 > > fs: Don't allow to create hardlink for deleted file Good find Eric - great work on the reproducer script. FWIW, can you confirm that a debug kernel assert fails with a non-zero link count in xfs_bumplink() with your test case? int xfs_bumplink( xfs_trans_t *tp, xfs_inode_t *ip) { xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG); >>>>> ASSERT(ip->i_d.di_nlink > 0); ip->i_d.di_nlink++; inc_nlink(VFS_I(ip)); If it does, we should consider this a in-memory corruption case and return and trigger a shutdown here.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Mon Apr 22 19:52:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A929F7F37 for ; Mon, 22 Apr 2013 19:52:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 46991AC002 for ; Mon, 22 Apr 2013 17:52:53 -0700 (PDT) X-ASG-Debug-ID: 1366678372-04bdf02d1f4f66a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id aqxlgxj14MDT6kaX for ; Mon, 22 Apr 2013 17:52:52 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3CC496531E85; Mon, 22 Apr 2013 19:52:52 -0500 (CDT) Message-ID: <5175DB63.6030501@sandeen.net> Date: Mon, 22 Apr 2013 19:52:51 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Dave Chinner CC: Brian Foster , yongtaofu@gmail.com, xfs@oss.sgi.com Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <517596BA.3060408@sandeen.net> <20130423000835.GL30622@dastard> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging In-Reply-To: <20130423000835.GL30622@dastard> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366678372 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128885 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/22/13 7:08 PM, Dave Chinner wrote: > On Mon, Apr 22, 2013 at 02:59:54PM -0500, Eric Sandeen wrote: >> On 4/15/13 6:14 PM, Brian Foster wrote: >>> Hi, >>> >>> Thanks for the data in the previous thread: >>> >>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >>> >>> I'm spinning off a new thread specifically for this because the original >>> thread is already too large and scattered to track. As Eric stated, >>> please try to keep data contained in as few messages as possible. >>> >> >> Well, it's always simple in the end. It just took a lot of debugging >> to figure out what was happening - we do appreciate your help with that! >> >> We were able to create a local reproducer, and it looks like >> this patch fixes things: >> >> commit aae8a97d3ec30788790d1720b71d76fd8eb44b73 >> Author: Aneesh Kumar K.V >> Date: Sat Jan 29 18:43:27 2011 +0530 >> >> fs: Don't allow to create hardlink for deleted file > > Good find Eric - great work on the reproducer script. > > FWIW, can you confirm that a debug kernel assert fails > with a non-zero link count in xfs_bumplink() with your test case? > > int > xfs_bumplink( > xfs_trans_t *tp, > xfs_inode_t *ip) > { > xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG); > >>>>>> ASSERT(ip->i_d.di_nlink > 0); Yep, it does, I put a printk in there when I was testing and it fired. Guess we should have tested a debug xfs right off the bat ;) > ip->i_d.di_nlink++; > inc_nlink(VFS_I(ip)); > > If it does, we should consider this a in-memory corruption case and > return and trigger a shutdown here.... I suppose that makes sense, it'd be a much less cryptic failure for something that will fail soon anyway. -Eric > Cheers, > > Dave. > From yongtaofu@gmail.com Mon Apr 22 20:31:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 404117F37 for ; Mon, 22 Apr 2013 20:31:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B3F01AC002 for ; Mon, 22 Apr 2013 18:31:03 -0700 (PDT) X-ASG-Debug-ID: 1366680661-04cbb057f64cdd70001-NocioJ Received: from mail-ie0-f170.google.com (mail-ie0-f170.google.com [209.85.223.170]) by cuda.sgi.com with ESMTP id xcaS5H5s4GPKFmvJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 22 Apr 2013 18:31:02 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.170 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.170] Received: by mail-ie0-f170.google.com with SMTP id at1so119661iec.29 for ; Mon, 22 Apr 2013 18:31:01 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.170] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.170] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=l4u38efhVZrI+yi/oRDdL9eGCtaVtV+4Gt7Az8DYsUY=; b=ob/LnBFSQcHAH2sA+0Hsq3Lmkb1imV8pzi21HNMGiJqoxYZvv/BmzpT0hKvqs6BqIf AiVBkygf1g0ZJpPVs81hueza4Ro8s6UA/siOh174fg2JTTkEqOcJzxMUR+/3F25xDruv T7E8bnRLN3HS+bnbGz+PITBjW4o03qmwBKHGGHNZgJzSb9Br+81Gb6fFF7d0zju0oBPK IR0vvzdKZrBQnXjmQCUO5LY/6XZ/ECjAlGg6qamj151aykty4TUJeFyex/h938/bTjo3 vCW8cz8S/3yj4cwaiN3YvvgOT0bxP+sTGwSV49EwW5qdAWgNHhrStBfx/8YqXvoI9Bnn KIiA== MIME-Version: 1.0 X-Received: by 10.50.57.168 with SMTP id j8mr22907742igq.51.1366680661819; Mon, 22 Apr 2013 18:31:01 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Mon, 22 Apr 2013 18:31:01 -0700 (PDT) In-Reply-To: <5175DB63.6030501@sandeen.net> References: <516C89DF.4070904@redhat.com> <517596BA.3060408@sandeen.net> <20130423000835.GL30622@dastard> <5175DB63.6030501@sandeen.net> Date: Tue, 23 Apr 2013 09:31:01 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Eric Sandeen Cc: Dave Chinner , Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae9340ee75e904b04dafd232c X-Barracuda-Connect: mail-ie0-f170.google.com[209.85.223.170] X-Barracuda-Start-Time: 1366680662 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128887 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 --14dae9340ee75e904b04dafd232c Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Terrific. Thank you Eric, Brian, and xfs experts. You have helped us a lot. I'll test the path. 2013/4/23 Eric Sandeen > On 4/22/13 7:08 PM, Dave Chinner wrote: > > On Mon, Apr 22, 2013 at 02:59:54PM -0500, Eric Sandeen wrote: > >> On 4/15/13 6:14 PM, Brian Foster wrote: > >>> Hi, > >>> > >>> Thanks for the data in the previous thread: > >>> > >>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > >>> > >>> I'm spinning off a new thread specifically for this because the > original > >>> thread is already too large and scattered to track. As Eric stated, > >>> please try to keep data contained in as few messages as possible. > >>> > >> > >> Well, it's always simple in the end. It just took a lot of debugging > >> to figure out what was happening - we do appreciate your help with tha= t! > >> > >> We were able to create a local reproducer, and it looks like > >> this patch fixes things: > >> > >> commit aae8a97d3ec30788790d1720b71d76fd8eb44b73 > >> Author: Aneesh Kumar K.V > >> Date: Sat Jan 29 18:43:27 2011 +0530 > >> > >> fs: Don't allow to create hardlink for deleted file > > > > Good find Eric - great work on the reproducer script. > > > > FWIW, can you confirm that a debug kernel assert fails > > with a non-zero link count in xfs_bumplink() with your test case? > > > > int > > xfs_bumplink( > > xfs_trans_t *tp, > > xfs_inode_t *ip) > > { > > xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG); > > > >>>>>> ASSERT(ip->i_d.di_nlink > 0); > > Yep, it does, I put a printk in there when I was testing > and it fired. > > Guess we should have tested a debug xfs right off the bat ;) > > > ip->i_d.di_nlink++; > > inc_nlink(VFS_I(ip)); > > > > If it does, we should consider this a in-memory corruption case and > > return and trigger a shutdown here.... > > I suppose that makes sense, it'd be a much less cryptic failure for > something that will fail soon anyway. > > -Eric > > > Cheers, > > > > Dave. > > > > --=20 =B7=FB=D3=C0=CC=CE --14dae9340ee75e904b04dafd232c Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Terrific. Thank you Eric, Brian, and xfs experts. You= have helped us a lot.
I'll test the path.


2013/4/23 Eric Sandeen = <sandeen@sandeen.net>
On 4= /22/13 7:08 PM, Dave Chinner wrote:
> On Mon, Apr 22, 2013 at 02:59:54PM -0500, Eric Sandeen wrote:
>> On 4/15/13 6:14 PM, Brian Foster wrote:
>>> Hi,
>>>
>>> Thanks for the data in the previous thread:
>>>
>>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html=
>>>
>>> I'm spinning off a new thread specifically for this becaus= e the original
>>> thread is already too large and scattered to track. As Eric st= ated,
>>> please try to keep data contained in as few messages as possib= le.
>>>
>>
>> Well, it's always simple in the end.  It just took a lot = of debugging
>> to figure out what was happening - we do appreciate your help with= that!
>>
>> We were able to create a local reproducer, and it looks like
>> this patch fixes things:
>>
>> commit aae8a97d3ec30788790d1720b71d76fd8eb44b73
>> Author: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
>> Date:   Sat Jan 29 18:43:27 2011 +0530
>>
>>     fs: Don't allow to create hardlink for deleted f= ile
>
> Good find Eric - great work on the reproducer script.
>
> FWIW, can you confirm that a debug kernel assert fails
> with a non-zero link count in xfs_bumplink() with your test case?
>
> int
> xfs_bumplink(
>         xfs_trans_t *tp,
>         xfs_inode_t *ip)
> {
>         xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CH= G);
>
>>>>>>   ASSERT(ip->i_d.di_nlink > 0);

Yep, it does, I put a printk in there when I was testing
and it fired.

Guess we should have tested a debug xfs right off the bat ;)

>         ip->i_d.di_nlink++;
>         inc_nlink(VFS_I(ip));
>
> If it does, we should consider this a in-memory corruption case and > return and trigger a shutdown here....

I suppose that makes sense, it'd be a much less cryptic failure f= or
something that will fail soon anyway.

-Eric

> Cheers,
>
> Dave.
>




--
=B7=FB=D3=C0=CC=CE
--14dae9340ee75e904b04dafd232c-- From zhaohongjiang@huawei.com Mon Apr 22 22:18:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1FADC7F37 for ; Mon, 22 Apr 2013 22:18:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F28D78F8037 for ; Mon, 22 Apr 2013 20:18:34 -0700 (PDT) X-ASG-Debug-ID: 1366687111-04cbb057f84d3df0001-NocioJ Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [119.145.14.64]) by cuda.sgi.com with ESMTP id Jb1Cv19O7BaMMSCX (version=TLSv1 cipher=DES-CBC3-SHA bits=168 verify=NO) for ; Mon, 22 Apr 2013 20:18:33 -0700 (PDT) X-Barracuda-Envelope-From: zhaohongjiang@huawei.com X-Barracuda-Apparent-Source-IP: 119.145.14.64 Received: from 172.24.2.119 (EHLO szxeml212-edg.china.huawei.com) ([172.24.2.119]) by szxrg01-dlp.huawei.com (MOS 4.3.4-GA FastPath queued) with ESMTP id BBA54874; Tue, 23 Apr 2013 11:18:16 +0800 (CST) Received: from SZXEML456-HUB.china.huawei.com (10.82.67.199) by szxeml212-edg.china.huawei.com (172.24.2.181) with Microsoft SMTP Server (TLS) id 14.1.323.7; Tue, 23 Apr 2013 11:18:12 +0800 Received: from [127.0.0.1] (10.135.72.200) by szxeml456-hub.china.huawei.com (10.82.67.199) with Microsoft SMTP Server id 14.1.323.7; Tue, 23 Apr 2013 11:18:12 +0800 Message-ID: <5175FC5C.5020607@huawei.com> Date: Tue, 23 Apr 2013 11:13:32 +0800 From: Zhao Hongjiang User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: CC: , , Subject: [PATCH v2] xfstests: capture the failure result of 310 Content-Type: text/plain; charset="ISO-8859-1" X-ASG-Orig-Subj: [PATCH v2] xfstests: capture the failure result of 310 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.135.72.200] X-CFilter-Loop: Reflected X-Barracuda-Connect: szxga01-in.huawei.com[119.145.14.64] X-Barracuda-Start-Time: 1366687112 X-Barracuda-Encrypted: DES-CBC3-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Capture the failuer by the way of count error dmesg and give the description how i run the test to trigger problems. eguan@redhat.com fix common file path and other cleanups Signed-off-by: Zhao Hongjiang --- tests/generic/310 | 72 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 63 insertions(+), 9 deletions(-) mode change 100644 => 100755 tests/generic/310 diff --git a/tests/generic/310 b/tests/generic/310 old mode 100644 new mode 100755 index ef51422..b18aa79 --- a/tests/generic/310 +++ b/tests/generic/310 @@ -1,10 +1,22 @@ #! /bin/bash # FS QA Test No. 310 # -#Check if there are two threads,one keeps calling read() or lseek(), and -#the other calling readdir(), both on the same directory fd. +# Check if there are two threads,one keeps calling read() or lseek(), and +# the other calling readdir(), both on the same directory fd. # -# Based on a testcase from Li Zefan . +# Testing on ext3: with dir_index disabled results in the following +# dmesg output: (also occurs when testing ext2 and ext4) +# +# EXT3-fs error (device sdb): ext3_readdir: bad entry in directory #1134241: +# rec_len % 4 != 0 - offset=2704, inode=16973836, rec_len=12850, name_len=52 +# EXT3-fs error (device sdb): ext3_readdir: bad entry in directory #1134241: +# directory entry across blocks - offset=1672, inode=16973836, rec_len=14132, +# name_len=57 +# +# The filesystem mount option 'errors=' will define the behavior +# when an error is encountered. (see mount manpage) +# +# The test is based on a testcase from Li Zefan . # # http://marc.info/?l=linux-kernel&m=136123703211869&w=2 # @@ -25,10 +37,9 @@ # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #----------------------------------------------------------------------- # -# creator -owner=zhaohongjiang@huawei.com seq=`basename $0` +seqres=$RESULT_DIR/$seq echo "QA output created by $seq" status=1 # failure is the default! @@ -40,13 +51,44 @@ _cleanup() trap "_cleanup; exit \$status" 0 1 2 3 15 # get standard environment, filters and checks -. ./common.rc -. ./common.filter +. ./common/rc +. ./common/filter # real QA test starts here _supported_fs generic _supported_os Linux +dmesg -c > /dev/null + +nr_bug=`dmesg | grep -c "kernel BUG"` +nr_error=`dmesg | grep -c "error"` +nr_null=`dmesg | grep -c "kernel NULL pointer dereference"` +nr_warning=`dmesg | grep -c "^WARNING"` +nr_lockdep=`dmesg | grep -c "possible recursive locking detected"` + +#check if some kind of kernel bug happened +check_kernel_bug() +{ + new_bug=`dmesg | grep -c "kernel BUG"` + new_error=`dmesg | grep -c "error"` + new_null=`dmesg | grep -c "kernel NULL pointer dereference"` + new_warning=`dmesg | grep -c "^WARNING"` + new_lockdep=`dmesg | grep -c "possible recursive locking detected"` + + + # no kernel bug is detected + if [ $new_bug -eq $nr_bug -a $new_error -eq $nr_error -a \ + $new_null -eq $nr_null -a $new_warning -eq $nr_warning -a \ + $new_lockdep -eq $nr_lockdep ]; then + return 1 + fi + + nr_bug=$new_bug + nr_error=$new_error + nr_null=$new_null + nr_warning=$new_warning + nr_lockdep=$new_lockdep +} mkdir $TEST_DIR/tmp for n in {1..4096}; do touch $TEST_DIR/tmp/$n @@ -57,6 +99,13 @@ _test_read() src/t_readdir_1 $TEST_DIR/tmp & sleep 100 killall src/t_readdir_1 + check_kernel_bug + if [ $? -eq 1 ]; then + status=0 + else + echo "error: kernel bug was found, you can see the + dmesg for more infomation." + fi } _test_lseek() @@ -64,6 +113,13 @@ _test_lseek() src/t_readdir_2 $TEST_DIR/tmp & sleep 100 killall src/t_readdir_2 + check_kernel_bug + if [ $? -eq 1 ]; then + status=0 + else + echo "error: kernel bug was found, you can see the + dmesg for more infomation." + fi } _test_read @@ -71,6 +127,4 @@ _test_lseek # success, all done echo "*** done" -rm -f $seq.full -status=0 exit -- 1.7.1 From service-client@espriv05.com Tue Apr 23 00:07:18 2013 Return-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.8 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,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 BF2FC7F37 for ; Tue, 23 Apr 2013 00:07:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 31349AC004 for ; Mon, 22 Apr 2013 22:07:13 -0700 (PDT) X-ASG-Debug-ID: 1366693627-04cb6c2c1c4f77d0001-NocioJ Received: from s2.espriv05.com (s2.espriv05.com [178.32.20.8]) by cuda.sgi.com with ESMTP id EyofytR9SQW8pZZ0 for ; Mon, 22 Apr 2013 22:07:09 -0700 (PDT) X-Barracuda-Envelope-From: service-client@espriv05.com X-Barracuda-Apparent-Source-IP: 178.32.20.8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=espriv05.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@espriv05.com; bh=QkNFwmpyss5PBQTT4hlQKafMVDhWeaKgJjMwULTjf1k=; b=v9Soy/UcJEYWQ2syfTnnen6jzJ58PznYKSO1dGNRK2bIxDT0z8fh+ISg4SvNDxXjnrxgjuWpsyI2 OQ2+KlTFQ9ti5qrnKugEybFROvr35iiZPJixW6c9V9ozoJjR6bd5U8XRkYulRU7f0lZAtNWr6Eb4 WCFCXSlRzHGNZ2fVGVQ= From: Ventealapropriete.com X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 40463 X-EN-uuid: 1005-100540463-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Grands Vins a prix imbattable MIME-Version: 1.0 X-ASG-Orig-Subj: Grands Vins a prix imbattable List-Unsubscribe: http://track.espriv05.com/wQrZaQqgxrsKPsa76wwcJUai9uZOeCa-vSKcd3pPM3Q.html, Content-Type: multipart/alternative; boundary=70914a36519ec380ab59c0561233f51c Message-ID: <0.0.9.D75.1CE3FDFEFDC2358.0@s2.espriv05.com> Date: Tue, 23 Apr 2013 07:03:47 +0200 X-Barracuda-Connect: s2.espriv05.com[178.32.20.8] X-Barracuda-Start-Time: 1366693628 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.80 X-Barracuda-Spam-Status: No, SCORE=0.80 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_02, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128901 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_MOSTLY BODY: Multipart message mostly text/html MIME 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary --70914a36519ec380ab59c0561233f51c Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --70914a36519ec380ab59c0561233f51c Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit Ventealapropriete.com : Vente privee de vins - Guigal - Jadot - Hauts de Smith

Profitez des meilleurs crus en ventes privées
Inscrivez-vous dès maintenant et accédez à une sélection d’experts au meilleur prix !
Côte-Rôtie, Gigondas et Condrieu au meilleur prix

Vente ouverte pendant 7 jours suivant votre inscription
Star de Pessac-Léognan

Vente ouverte pendant 7 jours suivant votre inscription
Le Pétrus du Sud-Ouest

Vente ouverte pendant 7 jours suivant votre inscription
Champagne Grand Cru à prix exceptionnel

Vente ouverte pendant 7 jours suivant votre inscription
Chambolle, Chassagne-Montrachet, Côte de Beaune

Vente ouverte pendant 7 jours suivant votre inscription
L'abus d'alcool est dangereux pour la santé. Sachez consommer avec modération.

Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From dave@fromorbit.com Tue Apr 23 01:39:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 46A047F37 for ; Tue, 23 Apr 2013 01:39:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1FAD18F8035 for ; Mon, 22 Apr 2013 23:39:08 -0700 (PDT) X-ASG-Debug-ID: 1366699146-04cb6c2c1d4fc5b0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id WIqvx0xZcopehx9p for ; Mon, 22 Apr 2013 23:39:06 -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: Ar0LANIrdlF5LHX7/2dsb2JhbABPgwbBRgSBAhd0gh8BLS87GGoDNIgTm1GRE48ZjXcmhGsDoRSHG4MeKg Received: from ppp121-44-117-251.lns20.syd6.internode.on.net (HELO dastard) ([121.44.117.251]) by ipmail06.adl2.internode.on.net with ESMTP; 23 Apr 2013 16:09:05 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1UUWsU-0004LD-68 for xfs@oss.sgi.com; Tue, 23 Apr 2013 16:38:58 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1UUWsU-0006GX-34 for xfs@oss.sgi.com; Tue, 23 Apr 2013 16:38:58 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: introduce CONFIG_XFS_WARN Date: Tue, 23 Apr 2013 16:38:58 +1000 X-ASG-Orig-Subj: [PATCH] xfs: introduce CONFIG_XFS_WARN Message-Id: <1366699138-24055-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1366699146 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Running a CONFIG_XFS_DEBUG kernel in production environments is not the best idea as it introduces significant overhead, can change the behaviour of algorithms (such as allocation) to improve test coverage, and (most importantly) panic the machine on non-fatal errors. There are many cases where all we want to do is run a kernel with more bounds checking enabled, such as is provided by the ASSERT() statements throughout the code, but without all the potential overhead and drawbacks. This patch converts all the ASSERT statements to evaluate as WARN_ON(1) statements and hence if they fail dump a warning and a stack trace to the log. This has minimal overhead and does not change any algorithms, and will allow us to find strange "out of bounds" problems more easily on production machines. There are a few places where assert statements contain debug only code. These are converted to be debug-or-warn only code so that we still get all the assert checks in the code. Signed-off-by: Dave Chinner --- fs/xfs/Kconfig | 13 +++++++++++++ fs/xfs/mrlock.h | 12 ++++++------ fs/xfs/xfs.h | 5 +++++ fs/xfs/xfs_alloc_btree.c | 4 ++-- fs/xfs/xfs_bmap_btree.c | 4 ++-- fs/xfs/xfs_btree.h | 2 +- fs/xfs/xfs_dir2_node.c | 4 ++-- fs/xfs/xfs_ialloc_btree.c | 4 ++-- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_linux.h | 24 ++++++++++++++++++------ fs/xfs/xfs_message.c | 8 ++++++++ fs/xfs/xfs_message.h | 1 + fs/xfs/xfs_trans.h | 2 +- 13 files changed, 62 insertions(+), 23 deletions(-) diff --git a/fs/xfs/Kconfig b/fs/xfs/Kconfig index cc33aaf..399e8ce 100644 --- a/fs/xfs/Kconfig +++ b/fs/xfs/Kconfig @@ -69,6 +69,19 @@ config XFS_RT If unsure, say N. +config XFS_WARN + bool "XFS Verbose Warnings" + depends on XFS_FS && !XFS_DEBUG + help + Say Y here to get an XFS build with many additional warnings. + It converts ASSERT checks to WARN, so will log any out-of-bounds + conditions that occur that would otherwise be missed. It is much + lighter weight than XFS_DEBUG and does not modify algorithms and will + not cause the kernel to panic on non-fatal errors. + + However, similar to XFS_DEBUG, it is only advisable to use this if you + are debugging a particular problem. + config XFS_DEBUG bool "XFS Debugging support" depends on XFS_FS diff --git a/fs/xfs/mrlock.h b/fs/xfs/mrlock.h index ff6a198..e3c92d1 100644 --- a/fs/xfs/mrlock.h +++ b/fs/xfs/mrlock.h @@ -22,12 +22,12 @@ typedef struct { struct rw_semaphore mr_lock; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int mr_writer; #endif } mrlock_t; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) #define mrinit(mrp, name) \ do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) #else @@ -46,7 +46,7 @@ static inline void mraccess_nested(mrlock_t *mrp, int subclass) static inline void mrupdate_nested(mrlock_t *mrp, int subclass) { down_write_nested(&mrp->mr_lock, subclass); -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) mrp->mr_writer = 1; #endif } @@ -60,7 +60,7 @@ static inline int mrtryupdate(mrlock_t *mrp) { if (!down_write_trylock(&mrp->mr_lock)) return 0; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) mrp->mr_writer = 1; #endif return 1; @@ -68,7 +68,7 @@ static inline int mrtryupdate(mrlock_t *mrp) static inline void mrunlock_excl(mrlock_t *mrp) { -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) mrp->mr_writer = 0; #endif up_write(&mrp->mr_lock); @@ -81,7 +81,7 @@ static inline void mrunlock_shared(mrlock_t *mrp) static inline void mrdemote(mrlock_t *mrp) { -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) mrp->mr_writer = 0; #endif downgrade_write(&mrp->mr_lock); diff --git a/fs/xfs/xfs.h b/fs/xfs/xfs.h index d8b11b7..a742c47 100644 --- a/fs/xfs/xfs.h +++ b/fs/xfs/xfs.h @@ -24,6 +24,11 @@ #define XFS_BUF_LOCK_TRACKING 1 #endif +#ifdef CONFIG_XFS_WARN +#define XFS_WARN 1 +#endif + + #include "xfs_linux.h" #endif /* __XFS_H__ */ diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index b1ddef6..cbcd34b 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -348,7 +348,7 @@ const struct xfs_buf_ops xfs_allocbt_buf_ops = { }; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_allocbt_keys_inorder( struct xfs_btree_cur *cur, @@ -404,7 +404,7 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { .init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur, .key_diff = xfs_allocbt_key_diff, .buf_ops = &xfs_allocbt_buf_ops, -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_allocbt_keys_inorder, .recs_inorder = xfs_allocbt_recs_inorder, #endif diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index 061b45c..5eaaa4b 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -769,7 +769,7 @@ const struct xfs_buf_ops xfs_bmbt_buf_ops = { }; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_bmbt_keys_inorder( struct xfs_btree_cur *cur, @@ -809,7 +809,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { .init_ptr_from_cur = xfs_bmbt_init_ptr_from_cur, .key_diff = xfs_bmbt_key_diff, .buf_ops = &xfs_bmbt_buf_ops, -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_bmbt_keys_inorder, .recs_inorder = xfs_bmbt_recs_inorder, #endif diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h index f932897..6302e9a 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/xfs_btree.h @@ -190,7 +190,7 @@ struct xfs_btree_ops { const struct xfs_buf_ops *buf_ops; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) /* check that k1 is lower than k2 */ int (*keys_inorder)(struct xfs_btree_cur *cur, union xfs_btree_key *k1, diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 5980f9b..33177c3 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -811,7 +811,7 @@ xfs_dir2_leafn_rebalance( xfs_dir2_leaf_t *leaf1; /* first leaf structure */ xfs_dir2_leaf_t *leaf2; /* second leaf structure */ int mid; /* midpoint leaf index */ -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int oldstale; /* old count of stale leaves */ #endif int oldsum; /* old total leaf count */ @@ -831,7 +831,7 @@ xfs_dir2_leafn_rebalance( leaf1 = blk1->bp->b_addr; leaf2 = blk2->bp->b_addr; oldsum = be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count); -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) oldstale = be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale); #endif mid = oldsum >> 1; diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index bec344b..7b9c7be 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -235,7 +235,7 @@ const struct xfs_buf_ops xfs_inobt_buf_ops = { .verify_write = xfs_inobt_write_verify, }; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_inobt_keys_inorder( struct xfs_btree_cur *cur, @@ -273,7 +273,7 @@ static const struct xfs_btree_ops xfs_inobt_ops = { .init_ptr_from_cur = xfs_inobt_init_ptr_from_cur, .key_diff = xfs_inobt_key_diff, .buf_ops = &xfs_inobt_buf_ops, -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_inobt_keys_inorder, .recs_inorder = xfs_inobt_recs_inorder, #endif diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 4f20165..4630d47 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -286,7 +286,7 @@ xfs_ilock_demote( trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_); } -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int xfs_isilocked( xfs_inode_t *ip, diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index 14e59d9..800f896 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -293,22 +293,34 @@ static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y) #define ASSERT_ALWAYS(expr) \ (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) -#ifndef DEBUG -#define ASSERT(expr) ((void)0) +#ifdef DEBUG +#define ASSERT(expr) \ + (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) #ifndef STATIC -# define STATIC static noinline +# define STATIC noinline #endif -#else /* DEBUG */ +#else /* !DEBUG */ + +#ifdef XFS_WARN #define ASSERT(expr) \ - (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) + (unlikely(expr) ? (void)0 : asswarn(#expr, __FILE__, __LINE__)) #ifndef STATIC -# define STATIC noinline +# define STATIC static noinline +#endif + +#else /* !DEBUG && !XFS_WARN */ + +#define ASSERT(expr) ((void)0) + +#ifndef STATIC +# define STATIC static noinline #endif +#endif /* XFS_WARN */ #endif /* DEBUG */ #endif /* __XFS_LINUX__ */ diff --git a/fs/xfs/xfs_message.c b/fs/xfs/xfs_message.c index 331cd9f..9163dc1 100644 --- a/fs/xfs/xfs_message.c +++ b/fs/xfs/xfs_message.c @@ -93,6 +93,14 @@ xfs_alert_tag( } void +asswarn(char *expr, char *file, int line) +{ + xfs_warn(NULL, "Assertion failed: %s, file: %s, line: %d", + expr, file, line); + WARN_ON(1); +} + +void assfail(char *expr, char *file, int line) { xfs_emerg(NULL, "Assertion failed: %s, file: %s, line: %d", diff --git a/fs/xfs/xfs_message.h b/fs/xfs/xfs_message.h index 76c8198..8540115 100644 --- a/fs/xfs/xfs_message.h +++ b/fs/xfs/xfs_message.h @@ -57,6 +57,7 @@ do { \ xfs_printk_ratelimited(xfs_debug, dev, fmt, ##__VA_ARGS__) extern void assfail(char *expr, char *f, int l); +extern void asswarn(char *expr, char *f, int l); extern void xfs_hex_dump(void *p, int length); diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index cd29f61..d3e0679 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -405,7 +405,7 @@ typedef struct xfs_trans { int64_t t_res_fdblocks_delta; /* on-disk only chg */ int64_t t_frextents_delta;/* superblock freextents chg*/ int64_t t_res_frextents_delta; /* on-disk only chg */ -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int64_t t_ag_freeblks_delta; /* debugging counter */ int64_t t_ag_flist_delta; /* debugging counter */ int64_t t_ag_btree_delta; /* debugging counter */ -- 1.7.10.4 From mercedesbenz@info.net Tue Apr 23 02:43:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9699029DFA for ; Tue, 23 Apr 2013 02:43:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 66D5F8F8037 for ; Tue, 23 Apr 2013 00:43:02 -0700 (PDT) X-ASG-Debug-ID: 1366702972-04bdf02d1d50b8c0001-w1Z2WR Received: from smtpgp.orange.sn (smtpgp.orange.sn [213.154.64.101]) by cuda.sgi.com with ESMTP id I3awUpQEoSlPlO6f for ; Tue, 23 Apr 2013 00:42:52 -0700 (PDT) X-Barracuda-Envelope-From: mercedesbenz@info.net X-Barracuda-Apparent-Source-IP: 213.154.64.101 Received: from mailrelay2.orange.sn (HELO mailrelay.orange.sn) ([213.154.64.114]) by smtpgp.orange.sn with ESMTP; 23 Apr 2013 07:38:44 +0000 Received: from [213.154.64.105] (helo=webmail.orange.sn) by mailrelay.orange.sn with esmtp (Exim 4.63) (envelope-from ) id 1UUXeO-00040m-Fe; Tue, 23 Apr 2013 07:28:28 +0000 Received: from 41.203.67.55 (SquirrelMail authenticated user abgueye@orange.sn) by webmail.orange.sn with HTTP; Tue, 23 Apr 2013 07:28:28 -0000 (UTC) Message-ID: <53676.41.203.67.55.1366702108.squirrel@webmail.orange.sn> Date: Tue, 23 Apr 2013 07:28:28 -0000 (UTC) Subject: Re: From: "MERCEDES BENZ OFFICE" X-ASG-Orig-Subj: Re: Reply-To: mercedes.benz@admin.in.th User-Agent: SquirrelMail/1.4.10a MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-Barracuda-Connect: smtpgp.orange.sn[213.154.64.101] X-Barracuda-Start-Time: 1366702972 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 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=MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; Did you receive Our last notification? From bfoster@redhat.com Tue Apr 23 07:51:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1D2E17F37 for ; Tue, 23 Apr 2013 07:51:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A5BDEAC006 for ; Tue, 23 Apr 2013 05:51:42 -0700 (PDT) X-ASG-Debug-ID: 1366721501-04cbb057f74f77f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QRZCaEfb8BaPopAh for ; Tue, 23 Apr 2013 05:51: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3NCpcAC014614 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 23 Apr 2013 08:51:38 -0400 Received: from laptop.bfoster (vpn-63-16.rdu2.redhat.com [10.10.63.16]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3NCpbu4008887 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Tue, 23 Apr 2013 08:51:38 -0400 Message-ID: <5176833C.8070305@redhat.com> Date: Tue, 23 Apr 2013 08:49:00 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: introduce CONFIG_XFS_WARN References: <1366699138-24055-1-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: introduce CONFIG_XFS_WARN In-Reply-To: <1366699138-24055-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366721501 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/23/2013 02:38 AM, Dave Chinner wrote: > From: Dave Chinner > ... > diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h > index cd29f61..d3e0679 100644 > --- a/fs/xfs/xfs_trans.h > +++ b/fs/xfs/xfs_trans.h > @@ -405,7 +405,7 @@ typedef struct xfs_trans { > int64_t t_res_fdblocks_delta; /* on-disk only chg */ > int64_t t_frextents_delta;/* superblock freextents chg*/ > int64_t t_res_frextents_delta; /* on-disk only chg */ > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > int64_t t_ag_freeblks_delta; /* debugging counter */ > int64_t t_ag_flist_delta; /* debugging counter */ > int64_t t_ag_btree_delta; /* debugging counter */ > I see some ASSERT() calls using these counters but the macros that manage them appear to be defined against DEBUG only (further down in xfs_trans.h). This looks like it would lead to spurious warnings..? Brian From debbugs@buxtehude.debian.org Tue Apr 23 08:03:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9BF2C7F37 for ; Tue, 23 Apr 2013 08:03:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6ECF5304064 for ; Tue, 23 Apr 2013 06:03:17 -0700 (PDT) X-ASG-Debug-ID: 1366722192-04bdf02d1d51fe10001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id 31YzTpHr4Lx1CF8c (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 23 Apr 2013 06:03:13 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.80) (envelope-from ) id 1UUcsK-0002cb-4X; Tue, 23 Apr 2013 13:03:12 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Reply-To: Rich Johnston , 705483@bugs.debian.org X-ASG-Orig-Subj: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Resent-From: Rich Johnston Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Tue, 23 Apr 2013 13:03:09 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 705483 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by 705483-submit@bugs.debian.org id=B705483.13667221219243 (code B ref 705483); Tue, 23 Apr 2013 13:03:09 +0000 Received: (at 705483) by bugs.debian.org; 23 Apr 2013 13:02:01 +0000 Received: from relay2.sgi.com ([192.48.179.30] helo=relay.sgi.com) by buxtehude.debian.org with esmtp (Exim 4.80) (envelope-from ) id 1UUcrB-0002OL-Kq for 705483@bugs.debian.org; Tue, 23 Apr 2013 13:02:01 +0000 Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id BAEFD304089; Tue, 23 Apr 2013 06:01:53 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 23 Apr 2013 08:01:53 -0500 Message-ID: <5176864D.6050604@sgi.com> Date: Tue, 23 Apr 2013 08:02:05 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: James Carter , <705483@bugs.debian.org> CC: References: <516C12DB.3060806@bytemark.co.uk> In-Reply-To: <516C12DB.3060806@bytemark.co.uk> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1366722192 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- James, The following commit will resolve the issue. Thanks --Rich commit fd537fc50eeade63bbd2a66105f39d04a011a7f5 Author: Rich Johnston Date: Mon Apr 22 17:32:05 2013 +0000 xfsprogs: xfs_quota allow user or group names beginning with digits xfs_quota does not properly parse users or groups that begin with a number. Only call atoi when user or group consists of digits only. Signed-off-by: Rich Johnston Reported-by: James Carter Reviewed-by: Eric Sandeen Reviewed-by: Chandra Seetharaman From debbugs@buxtehude.debian.org Tue Apr 23 08:15:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.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 386757F37 for ; Tue, 23 Apr 2013 08:15:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 081FA304039 for ; Tue, 23 Apr 2013 06:15:05 -0700 (PDT) X-ASG-Debug-ID: 1366722904-04bdf02d20520c90001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id yUTS4JQI3ahwUScE (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 23 Apr 2013 06:15:05 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.80) (envelope-from ) id 1UUd3o-0003t9-55; Tue, 23 Apr 2013 13:15:04 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Reply-To: Rich Johnston , 705483@bugs.debian.org X-ASG-Orig-Subj: Bug#705483: xfsprogs: xfs_quota misinterprets usernames with leading digits Resent-From: Rich Johnston Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Tue, 23 Apr 2013 13:15:01 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 705483 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by submit@bugs.debian.org id=B.136672266613402 (code B); Tue, 23 Apr 2013 13:15:01 +0000 Received: (at submit) by bugs.debian.org; 23 Apr 2013 13:11:06 +0000 Received: from relay2.sgi.com ([192.48.179.30] helo=relay.sgi.com) by buxtehude.debian.org with esmtp (Exim 4.80) (envelope-from ) id 1UUczy-0003Tj-OD for submit@bugs.debian.org; Tue, 23 Apr 2013 13:11:06 +0000 Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id BAEFD304089; Tue, 23 Apr 2013 06:01:53 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 23 Apr 2013 08:01:53 -0500 Message-ID: <5176864D.6050604@sgi.com> Date: Tue, 23 Apr 2013 08:02:05 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: James Carter , <705483@bugs.debian.org> CC: References: <516C12DB.3060806@bytemark.co.uk> In-Reply-To: <516C12DB.3060806@bytemark.co.uk> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] X-Greylist: delayed 545 seconds by postgrey-1.34 at buxtehude; Tue, 23 Apr 2013 13:11:06 UTC Delivered-To: submit@bugs.debian.org X-CrossAssassin-Score: 2 Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1366722905 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- James, The following commit will resolve the issue. Thanks --Rich commit fd537fc50eeade63bbd2a66105f39d04a011a7f5 Author: Rich Johnston Date: Mon Apr 22 17:32:05 2013 +0000 xfsprogs: xfs_quota allow user or group names beginning with digits xfs_quota does not properly parse users or groups that begin with a number. Only call atoi when user or group consists of digits only. Signed-off-by: Rich Johnston Reported-by: James Carter Reviewed-by: Eric Sandeen Reviewed-by: Chandra Seetharaman From rjohnston@sgi.com Tue Apr 23 08:32:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 C767C7F37 for ; Tue, 23 Apr 2013 08:32:54 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id 036B4AC006; Tue, 23 Apr 2013 06:32:50 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 23 Apr 2013 08:32:50 -0500 Message-ID: <51768D8E.2060207@sgi.com> Date: Tue, 23 Apr 2013 08:33:02 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Zhao Hongjiang CC: , , Subject: Re: [PATCH v2] xfstests: capture the failure result of 310 References: <5175FC5C.5020607@huawei.com> In-Reply-To: <5175FC5C.5020607@huawei.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks for making the suggested changes. FYI it helps the review process if you include a version log below the header something like. Capture the failure by the way of counting dmesg errors and describe how the test triggers problems. Signed-off-by: Zhao Hongjiang [eguan@redhat.com fix common file path and other cleanups] --- V1: Initial version V2: Added suggestions from xxx@somewhere.org to fix something Reworked logic for function blah Minor description change, other than that, it looks good. --Rich Reviewed-by: Rich Johnston From tinguely@sgi.com Tue Apr 23 08:47:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 560C07F37 for ; Tue, 23 Apr 2013 08:47:58 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id E48338F8039; Tue, 23 Apr 2013 06:47:57 -0700 (PDT) Message-ID: <51769111.3050103@sgi.com> Date: Tue, 23 Apr 2013 08:48:01 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails References: <20130419204102.736961610@sgi.com> <20130421174107.007313126@sgi.com> <5174603A.8030208@sandeen.net> <51753EDE.6000301@sgi.com> <51754A13.5000808@sandeen.net> <5175532B.3050509@sgi.com> <20130422233033.GK30622@dastard> In-Reply-To: <20130422233033.GK30622@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/22/13 18:30, Dave Chinner wrote: > On Mon, Apr 22, 2013 at 10:11:39AM -0500, Mark Tinguely wrote: >> #6 [ffff880135603980] _xfs_buf_find at ffffffffa01a7fef [xfs] >> #7 [ffff8801356039f0] xfs_buf_get at ffffffffa01a824a [xfs] >> #8 [ffff880135603a30] xfs_buf_read at ffffffffa01a83a4 [xfs] >> #9 [ffff880135603a60] xlog_recover_inode_pass2 at ffffffffa0193629 [xfs] > > So it's the same problem as this bug fix addresses: > > commit 10616b806d1d7835b1d23b8d75ef638f92cb98b6 > Author: Dave Chinner > Date: Mon Jan 21 23:53:52 2013 +1100 > > xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end > > When _xfs_buf_find is passed an out of range address, it will fail > to find a relevant struct xfs_perag and oops with a null > dereference. This can happen when trying to walk a filesystem with a > metadata inode that has a partially corrupted extent map (i.e. the > block number returned is corrupt, but is otherwise intact) and we > try to read from the corrupted block address. > > In this case, just fail the lookup. If it is readahead being issued, > it will simply not be done, but if it is real read that fails we > will get an error being reported. Ideally this case should result > in an EFSCORRUPTED error being reported, but we cannot return an > error through xfs_buf_read() or xfs_buf_get() so this lookup failure > may result in ENOMEM or EIO errors being reported instead. > > Signed-off-by: Dave Chinner > Reviewed-by: Brian Foster > Reviewed-by: Ben Myers > Signed-off-by: Ben Myers > >> The recovery value is bad and is a problem on its own, but XFS does >> not verify the validity of ag number when doing a xfs_perag_get(). > > Right, that's what the above fix does, but it can't be done on older > kernels because grwofs relies on being able to get buffers beyond > the existing filesystem limits... > > Cheers, > > Dave. Thank-you, that make sense. I still do not like assuming xfs_perag_get() will always return a valid perag pointer. --Mark. From rjohnston@sgi.com Tue Apr 23 08:55:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D598D7F37 for ; Tue, 23 Apr 2013 08:55:07 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8E0278F8054; Tue, 23 Apr 2013 06:55:07 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 23 Apr 2013 08:55:07 -0500 Message-ID: <517692C7.40402@sgi.com> Date: Tue, 23 Apr 2013 08:55:19 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Zhao Hongjiang CC: , , Subject: Re: [PATCH v2] xfstests: capture the failure result of 310 References: <5175FC5C.5020607@huawei.com> In-Reply-To: <5175FC5C.5020607@huawei.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks for submitting this patch, it has been committed. --Rich commit 45ed7bb0a4b6cb9562becc28ac0964e40b44bc97 Author: Zhao Hongjiang Date: Tue Apr 23 03:13:32 2013 +0000 xfstests: capture the failure result of 310 Capture the failure by the way of counting dmesg errors and describe how the test triggers problems. From mlsemon35@gmail.com Tue Apr 23 09:08:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 497177F3F for ; Tue, 23 Apr 2013 09:08:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 28AA430407A for ; Tue, 23 Apr 2013 07:08:24 -0700 (PDT) X-ASG-Debug-ID: 1366726102-04cbb057f54fd7f0001-NocioJ Received: from mail-yh0-f43.google.com (mail-yh0-f43.google.com [209.85.213.43]) by cuda.sgi.com with ESMTP id NoNQSdAv3wXcZnES (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 23 Apr 2013 07:08:23 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.43 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.43] Received: by mail-yh0-f43.google.com with SMTP id f73so81871yha.30 for ; Tue, 23 Apr 2013 07:08:22 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.43] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.43] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=axoU7u/P/0CF8zkjDGFb0a/0zY3YdfwAOBBhL7/m+hw=; b=F6uoqcl6vHYZIeXEGUWVgYH60SnZP6q1CBZbA45V6kot8bisXGgeAefJrlTNrd/iOE 3Rz0WSqX6WJBuGaZL/3I0qiF7SH4YrCW9HUzi0+Ag50u0hs5EJROAm5zk/IcvH2N2GYK BehcZTY3KYFdRiO5YkccThIojR0s/izwTFtKTeERbVZCyBSsBaLi/QDUODd7UpPG3hPN yuvbHz2Hj0wh4dP44GkUPRp6wcnMecWWLpCfr7Ok2q6RCdPL6VnM79KWSD+c8xBB5J3a odpCE+dPoyMps609gHhokKNoHGxDF0yEL4cVDtLE+ybMcKT23oV0hHkvpTFoDNmsZKJD xqmw== X-Received: by 10.236.78.100 with SMTP id f64mr9200422yhe.63.1366726102714; Tue, 23 Apr 2013 07:08:22 -0700 (PDT) Received: from [192.168.0.139] (rrcs-97-78-60-146.se.biz.rr.com. [97.78.60.146]) by mx.google.com with ESMTPS id l70sm49047682yha.1.2013.04.23.07.08.21 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 23 Apr 2013 07:08:22 -0700 (PDT) Message-ID: <517695CF.1030703@gmail.com> Date: Tue, 23 Apr 2013 10:08:15 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Rich Johnston CC: Dave Chinner , xfstests Subject: Re: xfstests: kludge patch for per-dir test number sorting by ./check References: <5169C4FE.4030209@gmail.com> <20130414232600.GA5117@destitution> <516B740A.1050607@gmail.com> <51758099.9030302@sgi.com> X-ASG-Orig-Subj: Re: xfstests: kludge patch for per-dir test number sorting by ./check In-Reply-To: <51758099.9030302@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-yh0-f43.google.com[209.85.213.43] X-Barracuda-Start-Time: 1366726103 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128937 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/22/2013 02:25 PM, Rich Johnston wrote: > On 04/14/2013 10:29 PM, Michael L. Semon wrote: >> On 04/14/2013 07:26 PM, Dave Chinner wrote: >>> On Sat, Apr 13, 2013 at 04:50:06PM -0400, Michael L. Semon wrote: >>>> I'm trying to get the new xfstests to run the XFS tests first, then >>> >>> The question is why do you want to do this? Is there any specific >>> reason for running the tests in that order? >>> >>> FWIW, if all you want to do is run the xfs tests, run: >>> >>> $ sudo ./check xfs[0-9][0-9][0-9] >>> >>> Cheers, >>> >>> Dave. >>> >> >> Personal preference. I'd like to run both series of tests, sometimes >> attended, sometimes unattended. It's fine if a generic/ test crashes >> the PC while running unattended, but I'd much rather the xfs/ tests have >> first crack at that. >> >> My version of the syntax was `./check xfs/[0-9][0-9][0-9]`, but that >> becomes rough when skipping tests. I'll still try your version, but > > I think this is a reasonable change request and I can see how this would > be very rough if you wanted to skip tests. Anyone have a reason why not > to do this? > > Regards, > --Rich It's a good change request, but on further testing, it seems like my kludge patch breaks basic sorting, i.e. `./check generic/003 generic/001 generic/002` will run the tests in exactly that order. That's not necessarily bad--principle of least surprise--but it means that to get the old xfstests sorting behavior, it would have to be sorted using another method. Thanks for considering the need for more control over the order in which groups are run. It's most certainly appreciated. Thinking out loud: Is there a disadvantage to setting $SRC_DIR to "." instead of "tests"? It looks like a nice way to get `./check tests/generic/001` to run tests/generic/001 instead of issuing "unknown test, ignored", but I've tested it only for generic/001 here at work. Michael >> irrationality and frustration have driven me to simply adding a "mls" >> group to all of the tests//group files, then hoping that a >> `./check -g mls` would run everything in the correct order. That led to >> trying to figure out why the generic/ tests were running first, and so >> on and so forth... >> >> Thanks! >> >> Michael From tytso@thunk.org Tue Apr 23 09:14:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AD0AF7F37 for ; Tue, 23 Apr 2013 09:14:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 88F09304064 for ; Tue, 23 Apr 2013 07:14:51 -0700 (PDT) X-ASG-Debug-ID: 1366726490-04cbb057f64fdf30001-NocioJ Received: from imap.thunk.org (li9-11.members.linode.com [67.18.176.11]) by cuda.sgi.com with ESMTP id 4FCSl69YSsAzAwmk (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 23 Apr 2013 07:14:50 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 67.18.176.11 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1UUe0C-000721-QW; Tue, 23 Apr 2013 14:15:24 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 8633958245C; Tue, 23 Apr 2013 10:14:42 -0400 (EDT) Date: Tue, 23 Apr 2013 10:14:42 -0400 From: Theodore Ts'o To: Lukas Czerner Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v3 05/18] xfs: use ->invalidatepage() length argument Message-ID: <20130423141442.GD31170@thunk.org> X-ASG-Orig-Subj: Re: [PATCH v3 05/18] xfs: use ->invalidatepage() length argument Mail-Followup-To: Theodore Ts'o , Lukas Czerner , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com References: <1365498867-27782-1-git-send-email-lczerner@redhat.com> <1365498867-27782-6-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1365498867-27782-6-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: li9-11.members.linode.com[67.18.176.11] X-Barracuda-Start-Time: 1366726490 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128937 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 09, 2013 at 11:14:14AM +0200, Lukas Czerner wrote: > ->invalidatepage() aop now accepts range to invalidate so we can make > use of it in xfs_vm_invalidatepage() > > Signed-off-by: Lukas Czerner > Cc: xfs@oss.sgi.com To the xfs team, Since half of this patch series modifies ext4 extensively, and changes to the other file systems are relatively small, I plan to carry the invalidatepage patch set in the ext4 tree for the next development cycle (i.e., not the upcoming merge window, but the next one). To that end, it would be great if you take a look at this patch set and send us an Acked-by signoff. Thanks!! - Ted From rjohnston@sgi.com Tue Apr 23 10:18:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A3E6E7F37 for ; Tue, 23 Apr 2013 10:18:05 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 65D118F8035; Tue, 23 Apr 2013 08:18:05 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 23 Apr 2013 10:18:04 -0500 Message-ID: <5176A639.5020703@sgi.com> Date: Tue, 23 Apr 2013 10:18:17 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH 1/3] xfsprogs: manpage spelling fixes References: <5175BB8F.5090604@sandeen.net> <5175BC20.9010403@sandeen.net> In-Reply-To: <5175BC20.9010403@sandeen.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/22/2013 05:39 PM, Eric Sandeen wrote: > Fix several spelling errors in xfsprogs manpages. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/man/man5/projects.5 b/man/man5/projects.5 #rcj OK > diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 #rcj serialisation is misspelled, should be serialization. > diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 #rcj guarenteed should be guaranteed #rcj Nonleaf to Non-leaf ???? not sure about that one :) > diff --git a/man/man8/xfs_mdrestore.8 b/man/man8/xfs_mdrestore.8 #rcj OK > diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 #rcj OK > diff --git a/man/man8/xfs_repair.8 b/man/man8/xfs_repair.8 #rcj OK From root@simmcomm.ch Tue Apr 23 10:21:35 2013 Return-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=FORGED_OUTLOOK_HTML, HTML_FONT_SIZE_HUGE,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 A28DF7F37 for ; Tue, 23 Apr 2013 10:21:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 73A9F304084 for ; Tue, 23 Apr 2013 08:21:32 -0700 (PDT) X-ASG-Debug-ID: 1366730487-04bdf02d2052aa70001-NocioJ Received: from virtvologda.ru (virtvologda.ru [185.12.94.217]) by cuda.sgi.com with ESMTP id FW6G9BtEGYUKzy34 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 23 Apr 2013 08:21:29 -0700 (PDT) X-Barracuda-Envelope-From: root@simmcomm.ch X-Barracuda-Apparent-Source-IP: 185.12.94.217 Received: from msx.mail.ru ([95.211.160.137]) (authenticated bits=0) by virtvologda.ru (8.14.4/8.14.4) with ESMTP id r3NFLQOL068899 for ; Tue, 23 Apr 2013 19:21:26 +0400 (MSD) (envelope-from root@simmcomm.ch) Message-ID: <62118C1016B74D1FAB002FAD5B056EAE@msx.mail.ru> Reply-To: =?windows-1251?B?3+3z4PDo6Q==?= From: =?windows-1251?B?3+3z4PDo6Q==?= To: Subject: =?windows-1251?B?wuXw7fPy/CDn8OXt6OU=?= Date: Tue, 23 Apr 2013 18:21:24 +0300 X-ASG-Orig-Subj: =?windows-1251?B?wuXw7fPy/CDn8OXt6OU=?= MIME-Version: 1.0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.6 (virtvologda.ru [185.12.94.217]); Tue, 23 Apr 2013 19:21:26 +0400 (MSD) X-Barracuda-Connect: virtvologda.ru[185.12.94.217] X-Barracuda-Start-Time: 1366730488 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.39 X-Barracuda-Spam-Status: No, SCORE=0.39 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, FORGED_OUTLOOK_HTML, HTML_FONT_SIZE_HUGE, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128943 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.39 HTML_FONT_SIZE_HUGE BODY: HTML font size is huge 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 FORGED_OUTLOOK_HTML Outlook can't send HTML message only 0.00 BSF_SC0_TG035a Message contains invalid style definition
 
=C5=F1=F2=FC =F0=E0=E7=EB=E8=F7=ED=FB=E5= =E2=E0=F0=E8=E0=ED=F2=FB =E2=EE=F1=F1=F2=E0=ED=EE=E2=EB=E5=ED=E8=FF =E7=F0= =E5=ED=E8=FF, =ED=EE=20 =EC=ED=EE=E3=E8=E5 =E8=E7 =ED=E8=F5, =EA=E0=EA =E1=FB =F1=F2=F0=E0=F8=ED=EE= =FD=F2=EE =ED=E8 =E7=E2=F3=F7=E0=EB=EE,
=EF=EE=F1=F2=E5=EF=E5=ED=ED=EE =D3=C1=C8= =C2=C0=DE=D2 =CD=C0=D8=C5 =C7=D0=C5=CD=C8=C5=85
=DD=F2=EE =ED=E5=EB=FC=E7=FF =ED=E0=E7=E2= =E0=F2=FC =EB=E5=F7=E5=ED=E8=E5=EC.
 
=CE=F7=EA=E8 =E7=E0=EA=F0=FB=E2=E0=FE= =F2 =E4=EE=F1=F2=F3=EF =E2=F0=E5=E4=ED=EE=EC=F3 =E4=EB=FF =E3=EB=E0=E7=20 =F3=EB=FC=F2=F0=E0=F4=E8=EE=EB=E5=F2=F3, =EA=EE=F2=EE=F0=FB=E9 =ED=E0 80 = %
 =EF=EE=F1=F2=F3=EF=E0=E5=F2 =E2= =ED=E0=F8 =EE=F0=E3=E0=ED=E8=E7=EC =F7=E5=F0=E5=E7 =EE=F0=E3=E0=ED=FB=20 =E7=F0=E5=ED=E8=FF. 
 
=CE=F7=EA=E8 =E8 =EB=E8=ED=E7=FB =FF=E2=EB= =FF=FE=F2=F1=FF =EB=E8=F8=FC =E7=E0=EC=E5=ED=E8=F2=E5=EB=FF=EC=E8 =E8=E4=E5= =E0=EB=FC=ED=EE=E3=EE=20 =E7=F0=E5=ED=E8=FF!
=C2=E5=F0=ED=F3=F2=FC =E7=F0=E5=ED=E8=E5= =96 =E4=EB=FF =EC=ED=EE=E3=E8=F5=20 =EF=EE=E8=F1=F2=E8=ED=E5 =EC=E5=F7=F2=E0! =CD=EE =ED=E0=F3=EA=E0 =E7=E4=E5= =F1=FC =ED=E5 =F1=F2=EE=E8=F2 =ED=E0 =EC=E5=F1=F2=E5.
From dhoworth@mrc-lmb.cam.ac.uk Tue Apr 23 10:43:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 95DF57F37 for ; Tue, 23 Apr 2013 10:43:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6FF14304064 for ; Tue, 23 Apr 2013 08:43:56 -0700 (PDT) X-ASG-Debug-ID: 1366731835-04cbb057f6504bb0001-NocioJ Received: from ppsw-42.csi.cam.ac.uk (ppsw-42.csi.cam.ac.uk [131.111.8.142]) by cuda.sgi.com with ESMTP id pnYBxWYHFRkuxAkl for ; Tue, 23 Apr 2013 08:43:55 -0700 (PDT) X-Barracuda-Envelope-From: dhoworth@mrc-lmb.cam.ac.uk X-Barracuda-Apparent-Source-IP: 131.111.8.142 X-Cam-AntiVirus: no malware found X-Cam-ScannerInfo: http://www.cam.ac.uk/cs/email/scanner/ Received: from nat.mrc-lmb.cam.ac.uk ([131.111.85.79]:62774 helo=mail.lmb.internal) by ppsw-42.csi.cam.ac.uk (ppsw.cam.ac.uk [131.111.8.139]:25) with esmtp id 1UUfNq-0004Hw-9P (Exim 4.80_167-5a66dd3) for xfs@oss.sgi.com (return-path ); Tue, 23 Apr 2013 16:43:54 +0100 Received: from cpepc210-3.lmb.internal ([10.21.64.91]) by mail.lmb.internal with esmtp (Exim 4.63) (envelope-from ) id 1UUfNq-0006s0-PJ for xfs@oss.sgi.com; Tue, 23 Apr 2013 16:43:54 +0100 Message-ID: <5176AC3E.30801@mrc-lmb.cam.ac.uk> Date: Tue, 23 Apr 2013 16:43:58 +0100 From: Dave Howorth Organization: MRC Laboratory for Molecular Biology User-Agent: Thunderbird 1.5.0.10 (X11/20060911) MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfsprogs: manpage spelling fixes References: <5175BB8F.5090604@sandeen.net> <5175BC20.9010403@sandeen.net> <5176A639.5020703@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfsprogs: manpage spelling fixes In-Reply-To: <5176A639.5020703@sgi.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ppsw-42.csi.cam.ac.uk[131.111.8.142] X-Barracuda-Start-Time: 1366731835 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128943 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Rich Johnston wrote: >> diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 > #rcj serialisation is misspelled, should be serialization. That depends on where you live, of course. It is derived from a Latin root, I think, so should have an 's'. At least, where I live. Do manpages have a policy as regards spelling? From sekharan@us.ibm.com Tue Apr 23 10:58:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B04837F37 for ; Tue, 23 Apr 2013 10:58:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9B9A7304059 for ; Tue, 23 Apr 2013 08:58:57 -0700 (PDT) X-ASG-Debug-ID: 1366732736-04cb6c2c1d523480001-NocioJ Received: from e37.co.us.ibm.com (e37.co.us.ibm.com [32.97.110.158]) by cuda.sgi.com with ESMTP id EdueGV6kuZNjrGri (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 23 Apr 2013 08:58:56 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.110.158 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] Received: from /spool/local by e37.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 23 Apr 2013 09:57:45 -0600 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] Received: from d03dlp03.boulder.ibm.com (9.17.202.179) by e37.co.us.ibm.com (192.168.1.137) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 23 Apr 2013 09:55:07 -0600 Received: from d03relay03.boulder.ibm.com (d03relay03.boulder.ibm.com [9.17.195.228]) by d03dlp03.boulder.ibm.com (Postfix) with ESMTP id 840AD19D8045 for ; Tue, 23 Apr 2013 09:54:45 -0600 (MDT) Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay03.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3NFsgNT051706 for ; Tue, 23 Apr 2013 09:54:43 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3NFsfGW004614 for ; Tue, 23 Apr 2013 09:54:41 -0600 Received: from [9.41.106.170] ([9.41.106.170]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3NFsd4L004316; Tue, 23 Apr 2013 09:54:39 -0600 Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails From: Chandra Seetharaman X-ASG-Orig-Subj: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails Reply-To: sekharan@us.ibm.com To: Mark Tinguely Cc: Dave Chinner , Eric Sandeen , xfs@oss.sgi.com In-Reply-To: <51769111.3050103@sgi.com> References: <20130419204102.736961610@sgi.com> <20130421174107.007313126@sgi.com> <5174603A.8030208@sandeen.net> <51753EDE.6000301@sgi.com> <51754A13.5000808@sandeen.net> <5175532B.3050509@sgi.com> <20130422233033.GK30622@dastard> <51769111.3050103@sgi.com> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Tue, 23 Apr 2013 10:54:35 -0500 Message-ID: <1366732475.3762.32402.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13042315-7408-0000-0000-00000F543330 X-Barracuda-Connect: e37.co.us.ibm.com[32.97.110.158] X-Barracuda-Start-Time: 1366732736 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, 2013-04-23 at 08:48 -0500, Mark Tinguely wrote: > On 04/22/13 18:30, Dave Chinner wrote: > > On Mon, Apr 22, 2013 at 10:11:39AM -0500, Mark Tinguely wrote: > >> #6 [ffff880135603980] _xfs_buf_find at ffffffffa01a7fef [xfs] > >> #7 [ffff8801356039f0] xfs_buf_get at ffffffffa01a824a [xfs] > >> #8 [ffff880135603a30] xfs_buf_read at ffffffffa01a83a4 [xfs] > >> #9 [ffff880135603a60] xlog_recover_inode_pass2 at ffffffffa0193629 [xfs] > > > > So it's the same problem as this bug fix addresses: > > > > commit 10616b806d1d7835b1d23b8d75ef638f92cb98b6 > > Author: Dave Chinner > > Date: Mon Jan 21 23:53:52 2013 +1100 > > > > xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end > > > > When _xfs_buf_find is passed an out of range address, it will fail > > to find a relevant struct xfs_perag and oops with a null > > dereference. This can happen when trying to walk a filesystem with a > > metadata inode that has a partially corrupted extent map (i.e. the > > block number returned is corrupt, but is otherwise intact) and we > > try to read from the corrupted block address. > > > > In this case, just fail the lookup. If it is readahead being issued, > > it will simply not be done, but if it is real read that fails we > > will get an error being reported. Ideally this case should result > > in an EFSCORRUPTED error being reported, but we cannot return an > > error through xfs_buf_read() or xfs_buf_get() so this lookup failure > > may result in ENOMEM or EIO errors being reported instead. > > > > Signed-off-by: Dave Chinner > > Reviewed-by: Brian Foster > > Reviewed-by: Ben Myers > > Signed-off-by: Ben Myers > > > >> The recovery value is bad and is a problem on its own, but XFS does > >> not verify the validity of ag number when doing a xfs_perag_get(). > > > > Right, that's what the above fix does, but it can't be done on older > > kernels because grwofs relies on being able to get buffers beyond > > the existing filesystem limits... > > > > Cheers, > > > > Dave. > > Thank-you, that make sense. > > I still do not like assuming xfs_perag_get() will always return a valid > perag pointer. I second that. Is there any reason we should _not_ check the return value from xfs_perag_get() for NULL ? > > --Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From rjohnston@sgi.com Tue Apr 23 10:59:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 EC5397F37 for ; Tue, 23 Apr 2013 10:59:25 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id D98C78F8052; Tue, 23 Apr 2013 08:59:25 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 23 Apr 2013 10:59:25 -0500 Message-ID: <5176AFEA.1040609@sgi.com> Date: Tue, 23 Apr 2013 10:59:38 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Dave Howorth CC: Subject: Re: [PATCH 1/3] xfsprogs: manpage spelling fixes References: <5175BB8F.5090604@sandeen.net> <5175BC20.9010403@sandeen.net> <5176A639.5020703@sgi.com> <5176AC3E.30801@mrc-lmb.cam.ac.uk> In-Reply-To: <5176AC3E.30801@mrc-lmb.cam.ac.uk> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/23/2013 10:43 AM, Dave Howorth wrote: > Rich Johnston wrote: >>> diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 >> #rcj serialisation is misspelled, should be serialization. > > That depends on where you live, of course. It is derived from a Latin > root, I think, so should have an 's'. At least, where I live. Good point Dave, I did not think to look that one up online, my bad for trusting my spell checker and my locale. ;) Was unaware that that one is spelled two ways (darn British have to spell it differently, or is it those darn colonists don't know how to spell i.e. color colour) > > Do manpages have a policy as regards spelling? Not to my knowledge. From stefanrin@gmail.com Tue Apr 23 11:20:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 26BF37F37 for ; Tue, 23 Apr 2013 11:20:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 614F8AC007 for ; Tue, 23 Apr 2013 09:20:41 -0700 (PDT) X-ASG-Debug-ID: 1366734039-04cb6c2c1d525510001-NocioJ Received: from mail-we0-f176.google.com (mail-we0-f176.google.com [74.125.82.176]) by cuda.sgi.com with ESMTP id iatLVBoKsHpIjXS9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 23 Apr 2013 09:20:40 -0700 (PDT) X-Barracuda-Envelope-From: stefanrin@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.176 Received: by mail-we0-f176.google.com with SMTP id s10so746009wey.7 for ; Tue, 23 Apr 2013 09:20:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=QyouGMAHE02+fMUibX8L8lCmD7Ac62Nf+l01UQR+HIE=; b=kXl1wUNz8JISlDJJ9+LebcJ4lgluldjMCmi5i5F1ofaB1GrkSH8U5LCHMQ8T//YW/z R+VB1azNU83iU/b6Xxsp+CsMKWQ9J7rZvJ3ZQ7Coxm51J5VmvmjLATgT/zhd5qmyRbb0 jeuAh10h3KPGsDxQgl/up1r4QMBEKgBg4M6GR8AFdz+32XFsTVWuREiqG0Sm4wpQ+NxD 9rvo4hmDiqF6kspF5FKTP/sXogvganL2HKizcoTw8qK48lOU+RSDyKAiGeESwSigSlQY PqW82U18HOQDNI/nE7WOTKbSw3D5tLryCsS7yIhnnFmz/8gEC7FE4ZttuvAJIA3/Vk4s TVNw== MIME-Version: 1.0 X-Received: by 10.194.142.236 with SMTP id rz12mr20542597wjb.12.1366734039311; Tue, 23 Apr 2013 09:20:39 -0700 (PDT) Received: by 10.195.12.5 with HTTP; Tue, 23 Apr 2013 09:20:39 -0700 (PDT) In-Reply-To: <5176AFEA.1040609@sgi.com> References: <5175BB8F.5090604@sandeen.net> <5175BC20.9010403@sandeen.net> <5176A639.5020703@sgi.com> <5176AC3E.30801@mrc-lmb.cam.ac.uk> <5176AFEA.1040609@sgi.com> Date: Tue, 23 Apr 2013 18:20:39 +0200 Message-ID: Subject: Re: [PATCH 1/3] xfsprogs: manpage spelling fixes From: Stefan Ring X-ASG-Orig-Subj: Re: [PATCH 1/3] xfsprogs: manpage spelling fixes To: Rich Johnston Cc: Dave Howorth , Linux fs XFS Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-we0-f176.google.com[74.125.82.176] X-Barracuda-Start-Time: 1366734040 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128947 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 >> Do manpages have a policy as regards spelling? > > Not to my knowledge. But if the rest of the man page / package is en_US, as is likely the case, it would make sense to stick to this locale. From rjohnston@sgi.com Tue Apr 23 13:35:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 496C929DFA for ; Tue, 23 Apr 2013 13:35:14 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id DDD93304070; Tue, 23 Apr 2013 11:35:10 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 23 Apr 2013 13:35:10 -0500 Message-ID: <5176D46B.2030003@sgi.com> Date: Tue, 23 Apr 2013 13:35:23 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH 2/3] xfsprogs: Fix manpages for missing or incorrect options References: <5175BB8F.5090604@sandeen.net> <5175BC67.1000902@sandeen.net> In-Reply-To: <5175BC67.1000902@sandeen.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Hey Eric, Couple of comments. 1. The OPTIONS are listed in several ways, (alphabetical order, same order as they appear in the SYNOPSIS, ...). I don't really have a preference, but as long as we are cleaning up the manpages, I suggest we be consistent. (case insensitive alpha order maybe???) 2. How about making the -V option wording the same also? xfs_db and xfs_repair are: Prints out the current version number and exits. ^^^^^^^^ The others: man/man8/mkfs.xfs.8:Prints the version number and exits. man/man8/xfs_admin.8:Prints the version number and exits. man/man8/xfs_bmap.8:Prints the version number and exits. man/man8/xfs_check.8:Prints the version number and exits. man/man8/xfs_copy.8:Prints the version number and exits. man/man8/xfs_growfs.8:Prints the version number and exits. The man/man8/xfs_io.8:Prints the version number and exits. man/man8/xfs_logprint.8:Prints the version number and exits. man/man8/xfs_mkfile.8:Prints the version number and exits. man/man8/xfs_ncheck.8:Prints the version number and exits. man/man8/xfs_rtcp.8:Prints the version number and exits. 3. The following are missing the -V option in both the SYNOPSIS and OPTIONS sections. (I did verify the -V option works for all commands) man/man8/xfs_estimate.8 man/man8/xfs_freeze.8 man/man8/xfs_fsr.8 man/man8/xfs_mdrestore.8 man/man8/xfs_metadump.8 man/man8/xfs_quota.8 man/man8/xfs_repair.8 4. The -V prints the version and exits, shouldn't all the SYNOPSIS look like this for the -V option? SYNOPSIS xfs_db [ -c cmd ] ... [ -i|r|x|F ] [ -f ] [ -l logdev ] ... xfs_db -V Regards --Rich From p5634544232@gmail.com Tue Apr 23 14:18:55 2013 Return-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=EMPTY_MESSAGE, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1AFA129DFA for ; Tue, 23 Apr 2013 14:18:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6D24AC00A for ; Tue, 23 Apr 2013 12:18:51 -0700 (PDT) X-ASG-Debug-ID: 1366744726-04cbb057f6516560001-w1Z2WR Received: from mail-qe0-f45.google.com (mail-qe0-f45.google.com [209.85.128.45]) by cuda.sgi.com with ESMTP id 1888oMzBXjCnilUe (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 23 Apr 2013 12:18:46 -0700 (PDT) X-Barracuda-Envelope-From: p5634544232@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.45 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.45] Received: by mail-qe0-f45.google.com with SMTP id 1so668735qee.4 for ; Tue, 23 Apr 2013 12:18:46 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.45] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.45] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=; b=rXLikYhhSzmBUJOTvzaBBpspUmEZFgKOVQfW7Q2vGTMV+spb1YKW/lBDOsWl29vqpg /xEXSdO31I5xTuy2sOyIuUyY9rbRBApU1bEou/JuPF0nbxYG5m/dq6VqO8M4qvSnwYBj dwlL2siaaNyqHg9SdG0pZM24NkuGPpsV1izc/LycXKmqhwEO3FBj+B+OPZuz5UYKTErv V6vsbrxsSxfh6IgbAWLEq1Ixyg0Au6POxiEz2WYH1qtm4SxkDvG/gZpKZ3NV9XPq0Ifj lCnMKnN4wiAKB7OVYdF6pRsDzPOp7eIP/xZYMzwk6d2vG9zbQhsclno+/qvrxdrB8ijk k80g== MIME-Version: 1.0 X-Received: by 10.224.40.197 with SMTP id l5mr27000726qae.41.1366744726085; Tue, 23 Apr 2013 12:18:46 -0700 (PDT) Received: by 10.49.81.230 with HTTP; Tue, 23 Apr 2013 12:18:45 -0700 (PDT) Date: Tue, 23 Apr 2013 23:48:45 +0430 Message-ID: Subject: From: Clyde Hank X-ASG-Orig-Subj: To: undisclosed-recipients:; Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-qe0-f45.google.com[209.85.128.45] X-Barracuda-Start-Time: 1366744726 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 2.40 X-Barracuda-Spam-Status: No, SCORE=2.40 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MJ104, DKIM_SIGNED, DKIM_VERIFIED, EMPTY_MESSAGE, MISSING_SUBJECT, MISSING_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128959 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.50 BSF_SC0_MJ104 Custom Rule MJ104 0.61 EMPTY_MESSAGE Message appears to have no textual parts and no Subject: text 0.01 MISSING_SUBJECT Missing Subject: header 1.28 MISSING_SUBJECT_2 Missing Subject: header From m54634232@gmail.com Tue Apr 23 14:20:36 2013 Return-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=EMPTY_MESSAGE, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 88CE129DFA for ; Tue, 23 Apr 2013 14:20:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 78A63304082 for ; Tue, 23 Apr 2013 12:20:33 -0700 (PDT) X-ASG-Debug-ID: 1366744831-04cbb057f6516720001-NocioJ Received: from mail-la0-f52.google.com (mail-la0-f52.google.com [209.85.215.52]) by cuda.sgi.com with ESMTP id 1ZT4gn6hcHODDQb0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 23 Apr 2013 12:20:32 -0700 (PDT) X-Barracuda-Envelope-From: m54634232@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.52 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.52] Received: by mail-la0-f52.google.com with SMTP id fd20so890202lab.11 for ; Tue, 23 Apr 2013 12:20:31 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.52] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.52] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=; b=pHkdt6ulUUB6VI3jmgTfu+lmgeuvAWTzhe7+H3AKbfz7ur0d5hQvG2xwTkeNXk4v2z Fke+a6zhb1fatl1tJVJX7s2AiFljeFvKK+XQPd/wvPU1QPT0vYg4Vld273hPJlrNSdI1 0CNxkvNrQPVuAkOHIL7G39405fjHpS7KXp5kNK5tSEM8H0NezEY+oqtTw2+cQoezP24H nBdcTItRxOE+NRBesWD3RPUuDHeSz3sczga2nK5YjqyV7uGNTujTpx9y99+WJdriPA1R zu44ScDXIVduAQfbLvQcXmPsi7gsxwzpwQ13NdMkFul/jdKyF7gZG2sQizMsOtbdPatq jeog== MIME-Version: 1.0 X-Received: by 10.112.167.98 with SMTP id zn2mr8162346lbb.86.1366744830865; Tue, 23 Apr 2013 12:20:30 -0700 (PDT) Received: by 10.112.103.35 with HTTP; Tue, 23 Apr 2013 12:20:30 -0700 (PDT) Date: Tue, 23 Apr 2013 23:50:30 +0430 Message-ID: Subject: From: Javier Barret X-ASG-Orig-Subj: To: undisclosed-recipients:; Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-la0-f52.google.com[209.85.215.52] X-Barracuda-Start-Time: 1366744832 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 2.40 X-Barracuda-Spam-Status: No, SCORE=2.40 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MJ104, DKIM_SIGNED, DKIM_VERIFIED, EMPTY_MESSAGE, MISSING_SUBJECT, MISSING_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128959 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.50 BSF_SC0_MJ104 Custom Rule MJ104 0.61 EMPTY_MESSAGE Message appears to have no textual parts and no Subject: text 0.01 MISSING_SUBJECT Missing Subject: header 1.28 MISSING_SUBJECT_2 Missing Subject: header From sandeen@sandeen.net Tue Apr 23 14:36:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1204F29DFA for ; Tue, 23 Apr 2013 14:36:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F35618F8052 for ; Tue, 23 Apr 2013 12:36:17 -0700 (PDT) X-ASG-Debug-ID: 1366745776-04cbb057f5517bb0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id zk4Ous8hMHi8VIjg for ; Tue, 23 Apr 2013 12:36:16 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1CA9062161FF; Tue, 23 Apr 2013 14:36:16 -0500 (CDT) Message-ID: <5176E2AF.7080201@sandeen.net> Date: Tue, 23 Apr 2013 14:36:15 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Rich Johnston CC: xfs-oss Subject: Re: [PATCH 2/3] xfsprogs: Fix manpages for missing or incorrect options References: <5175BB8F.5090604@sandeen.net> <5175BC67.1000902@sandeen.net> <5176D46B.2030003@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 2/3] xfsprogs: Fix manpages for missing or incorrect options In-Reply-To: <5176D46B.2030003@sgi.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366745776 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128959 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/23/13 1:35 PM, Rich Johnston wrote: > Hey Eric, > > Couple of comments. > > 1. The OPTIONS are listed in several ways, (alphabetical order, same > order as they appear in the SYNOPSIS, ...). I don't really have a > preference, but as long as we are cleaning up the manpages, I suggest > we be consistent. (case insensitive alpha order maybe???) That'd make a fine followup patch, I agree! ;) Re-ordering every manpage won't really be on my todo list soon, though. > 2. How about making the -V option wording the same also? > xfs_db and xfs_repair are: > Prints out the current version number and exits. > ^^^^^^^^ I suppose. I'm not really sure anyone would care? > The others: > man/man8/mkfs.xfs.8:Prints the version number and exits. > man/man8/xfs_admin.8:Prints the version number and exits. > man/man8/xfs_bmap.8:Prints the version number and exits. > man/man8/xfs_check.8:Prints the version number and exits. > man/man8/xfs_copy.8:Prints the version number and exits. > man/man8/xfs_growfs.8:Prints the version number and exits. The > man/man8/xfs_io.8:Prints the version number and exits. > man/man8/xfs_logprint.8:Prints the version number and exits. > man/man8/xfs_mkfile.8:Prints the version number and exits. > man/man8/xfs_ncheck.8:Prints the version number and exits. > man/man8/xfs_rtcp.8:Prints the version number and exits. > > 3. The following are missing the -V option in both the SYNOPSIS and OPTIONS sections. > (I did verify the -V option works for all commands) > man/man8/xfs_estimate.8 > man/man8/xfs_freeze.8 > man/man8/xfs_fsr.8 > man/man8/xfs_mdrestore.8 > man/man8/xfs_metadump.8 > man/man8/xfs_quota.8 > man/man8/xfs_repair.8 not sure how I missed those, sorry. > > 4. The -V prints the version and exits, shouldn't all the SYNOPSIS look like this for the -V option? > > SYNOPSIS > xfs_db [ -c cmd ] ... [ -i|r|x|F ] [ -f ] [ -l logdev ] ... > xfs_db -V Probably. -V is least important of the fixes; I'd be more inclined to just drop the -V changes and not spend a couple more hours rearranging manpages. This was fine work on a plane, but there are more pressing things to do now :( Maybe some list-reader who wants some changelog glory could take this further? :) -Eric > Regards > --Rich > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Tue Apr 23 14:36:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C43D429E09 for ; Tue, 23 Apr 2013 14:36:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A1E978F8050 for ; Tue, 23 Apr 2013 12:36:33 -0700 (PDT) X-ASG-Debug-ID: 1366745792-04bdf02d1d53f0a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id o1v2m4F6NCQ2ohbL for ; Tue, 23 Apr 2013 12:36:32 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 33FB762161FF; Tue, 23 Apr 2013 14:36:32 -0500 (CDT) Message-ID: <5176E2C0.9080306@sandeen.net> Date: Tue, 23 Apr 2013 14:36:32 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Rich Johnston CC: xfs-oss Subject: Re: [PATCH 1/3] xfsprogs: manpage spelling fixes References: <5175BB8F.5090604@sandeen.net> <5175BC20.9010403@sandeen.net> <5176A639.5020703@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfsprogs: manpage spelling fixes In-Reply-To: <5176A639.5020703@sgi.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366745792 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128959 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/23/13 10:18 AM, Rich Johnston wrote: > On 04/22/2013 05:39 PM, Eric Sandeen wrote: >> Fix several spelling errors in xfsprogs manpages. >> >> Signed-off-by: Eric Sandeen >> --- >> >> diff --git a/man/man5/projects.5 b/man/man5/projects.5 > #rcj OK > >> diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 > #rcj serialisation is misspelled, should be serialization. > >> diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 > #rcj guarenteed should be guaranteed whoops I missed that, didn't introduce it, did I? > #rcj Nonleaf to Non-leaf ???? not sure about that one :) $ aspell -a @(#) International Ispell Version 3.1.20 (but really Aspell 0.60.6) nonleaf & nonleaf 11 0: non leaf, non-leaf, ... *shrug* -Eric >> diff --git a/man/man8/xfs_mdrestore.8 b/man/man8/xfs_mdrestore.8 > #rcj OK > >> diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 > #rcj OK > >> diff --git a/man/man8/xfs_repair.8 b/man/man8/xfs_repair.8 > #rcj OK > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From rjohnston@sgi.com Tue Apr 23 14:37:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B814929DFA for ; Tue, 23 Apr 2013 14:37:01 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0F07BAC005; Tue, 23 Apr 2013 12:36:57 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 23 Apr 2013 14:36:57 -0500 Message-ID: <5176E2E6.4040002@sgi.com> Date: Tue, 23 Apr 2013 14:37:10 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH 3/3] xfsprogs: Fix up usage() errors and omissions References: <5175BB8F.5090604@sandeen.net> <5175BCBE.8040306@sandeen.net> In-Reply-To: <5175BCBE.8040306@sandeen.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/22/2013 05:42 PM, Eric Sandeen wrote: > Add missing options and remove invalid options in usage() output > strings. > > * Add -V to several usage() strings Need to add it for xfs_estimate xfs_fsr xfs_quota I ran this. MYCMDS="mkfs.xfs xfs_admin xfs_bmap xfs_check xfs_copy xfs_db xfs_estimate xfs_freeze xfs_fsr xfs_growfs xfs_info xfs_io xfs_logprint xfs_mdrestore xfs_metadump xfs_mkfile xfs_ncheck xfs_quota xfs_rtcp" for i in $MYCMDS; do $i -h echo done Here are the cmds that are missing -V: > mkfs.xfs: invalid option -- 'h' > unknown option -h > Usage: mkfs.xfs > /* blocksize */ [-b log=n|size=num] > /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num, > (sunit=value,swidth=value|su=num,sw=num), > sectlog=n|sectsize=num > /* inode size */ [-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2, > projid32bit=0|1] > /* log subvol */ [-l agnum=n,internal,size=num,logdev=xxx,version=n > sunit=value|su=num,sectlog=n|sectsize=num, > lazy-count=0|1] > /* label */ [-L label (maximum 12 characters)] > /* naming */ [-n log=n|size=num,version=2|ci] > /* prototype file */ [-p fname] > /* quiet */ [-q] > /* realtime subvol */ [-r extsize=num,size=num,rtdev=xxx] > /* sectorsize */ [-s log=n|size=num] > /* version */ [-V] > /* no-op info only */ [-N] > /* no discard */ [-K] > /* force overwrite */ [-f] > devicename > is required unless -d name=xxx is given. > is xxx (bytes), xxxs (sectors), xxxb (fs blocks), xxxk (xxx KiB), > xxxm (xxx MiB), xxxg (xxx GiB), xxxt (xxx TiB) or xxxp (xxx PiB). > is xxx (512 byte blocks). > #rcj mkfs.xfs missing -V > Usage: xfs_estimate [opts] directory [directory ...] > -b blocksize (fundamental filesystem blocksize) > -i logsize (internal log size) > -e logsize (external log size) > -v prints more verbose messages > -h prints this usage message > > Note: blocksize may have 'k' appended to indicate x1024 > logsize may also have 'm' appended to indicate (1024 x 1024) #rcj xfs_estimate missing -V > xfs_fsr: invalid option -- 'h' > Usage: xfs_fsr [-d] [-v] [-g] [-t time] [-p passes] [-f leftf] [-m mtab] > xfs_fsr [-d] [-v] [-g] xfsdev | dir | file ... > > Options: > -g Print to syslog (default if stdout not a tty). > -t time How long to run in seconds. > -p passes Number of passes before terminating global re-org. > -f leftoff Use this instead of /var/tmp/.fsrlast_xfs. > -m mtab Use something other than /etc/mtab. > -d Debug, print even more. > -v Verbose, more -v's more verbose. > #rcj xfs_fsr missing -V > xfs_quota: invalid option -- 'h' > Usage: xfs_quota [-x] [-p prog] [-c cmd]... [-d project]... [path] #rcj missing -V _______________________________________________________________________ All commands report the version. MYCMDS="mkfs.xfs xfs_admin xfs_bmap xfs_check xfs_copy xfs_db xfs_estimate xfs_freeze xfs_fsr xfs_growfs xfs_info xfs_io xfs_logprint xfs_mdrestore xfs_metadump xfs_mkfile xfs_ncheck xfs_quota xfs_rtcp" for i in $MYCMDS; do $i -V done mkfs.xfs version 3.1.10 xfs_admin version 3.1.10 xfs_bmap version 3.1.10 xfs_check is deprecated and scheduled for removal in June 2014. Please use xfs_repair -n instead. xfs_check version 3.1.10 xfs_copy version 3.1.10 xfs_db version 3.1.10 xfs_estimate version 3.1.10 xfs_freeze version 3.1.10 xfs_fsr version 3.1.10 xfs_growfs version 3.1.10 xfs_info version 3.1.10 xfs_io version 3.1.10 xfs_logprint version 3.1.10 xfs_mdrestore version 3.1.10 xfs_metadump version 3.1.10 xfs_mkfile version 3.1.10 xfs_ncheck version 3.1.10 xfs_quota version 3.1.10 xfs_rtcp version 3.1.10 > * Remove deprecated/invalid -n and -s otions from xfs_fsr's usage #rcj OK > * Remove invalid -I option from xfs_growfs's usage #rcj OK > * Add -n (O_NONBLOCK) option to xfs_io's usage #rcj OK > * Add -e (exit on error) option to xfs_logprint's usage #rcj OK > * Remove invalid -b option from xfs_mdrestore's usage #rcj OK > * Add -N (no-op), -K (no discard), and -f (force) to mkfs.xfs's usage Usage: mkfs.xfs /* blocksize */ [-b log=n|size=num] /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num, (sunit=value,swidth=value|su=num,sw=num), sectlog=n|sectsize=num /* force overwrite */ [-f] devicename #rcj move to here ????? /* inode size */ [-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2, projid32bit=0|1] /* no discard */ [-K] #rcj move to here ???? /* log subvol */ [-l agnum=n,internal,size=num,logdev=xxx,version=n sunit=value|su=num,sectlog=n|sectsize=num, lazy-count=0|1] /* label */ [-L label (maximum 12 characters)] /* naming */ [-n log=n|size=num,version=2|ci] /* no-op info only */ [-N] #rcj move to here ???? /* prototype file */ [-p fname] /* quiet */ [-q] /* realtime subvol */ [-r extsize=num,size=num,rtdev=xxx] /* sectorsize */ [-s log=n|size=num] /* version */ [-V] > * Add -x (expert) option to xfs_quota's usage #rcj OK Regards --Rich From rjohnston@sgi.com Tue Apr 23 14:45:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5011729E07 for ; Tue, 23 Apr 2013 14:45:38 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 336F18F8074; Tue, 23 Apr 2013 12:45:38 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 23 Apr 2013 14:45:37 -0500 Message-ID: <5176E4EE.7040005@sgi.com> Date: Tue, 23 Apr 2013 14:45:50 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH 2/3] xfsprogs: Fix manpages for missing or incorrect options References: <5175BB8F.5090604@sandeen.net> <5175BC67.1000902@sandeen.net> <5176D46B.2030003@sgi.com> <5176E2AF.7080201@sandeen.net> In-Reply-To: <5176E2AF.7080201@sandeen.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/23/2013 02:36 PM, Eric Sandeen wrote: > On 4/23/13 1:35 PM, Rich Johnston wrote: >> Hey Eric, >> >> Couple of comments. >> >> 1. The OPTIONS are listed in several ways, (alphabetical order, same >> order as they appear in the SYNOPSIS, ...). I don't really have a >> preference, but as long as we are cleaning up the manpages, I suggest >> we be consistent. (case insensitive alpha order maybe???) > > That'd make a fine followup patch, I agree! ;) Re-ordering every > manpage won't really be on my todo list soon, though. > Sounds good. >> 2. How about making the -V option wording the same also? >> xfs_db and xfs_repair are: >> Prints out the current version number and exits. >> ^^^^^^^^ > > I suppose. I'm not really sure anyone would care? > Not important just noting it ;) >> The others: >> man/man8/mkfs.xfs.8:Prints the version number and exits. >> man/man8/xfs_admin.8:Prints the version number and exits. >> man/man8/xfs_bmap.8:Prints the version number and exits. >> man/man8/xfs_check.8:Prints the version number and exits. >> man/man8/xfs_copy.8:Prints the version number and exits. >> man/man8/xfs_growfs.8:Prints the version number and exits. The >> man/man8/xfs_io.8:Prints the version number and exits. >> man/man8/xfs_logprint.8:Prints the version number and exits. >> man/man8/xfs_mkfile.8:Prints the version number and exits. >> man/man8/xfs_ncheck.8:Prints the version number and exits. >> man/man8/xfs_rtcp.8:Prints the version number and exits. >> >> 3. The following are missing the -V option in both the SYNOPSIS and OPTIONS sections. >> (I did verify the -V option works for all commands) >> man/man8/xfs_estimate.8 >> man/man8/xfs_freeze.8 >> man/man8/xfs_fsr.8 >> man/man8/xfs_mdrestore.8 >> man/man8/xfs_metadump.8 >> man/man8/xfs_quota.8 >> man/man8/xfs_repair.8 > > not sure how I missed those, sorry. Do you have time to add these? This really the only todo for now I think. > >> >> 4. The -V prints the version and exits, shouldn't all the SYNOPSIS look like this for the -V option? >> >> SYNOPSIS >> xfs_db [ -c cmd ] ... [ -i|r|x|F ] [ -f ] [ -l logdev ] ... >> xfs_db -V > > Probably. -V is least important of the fixes; I'd be more inclined to just drop > the -V changes and not spend a couple more hours rearranging manpages. > > This was fine work on a plane, but there are more pressing things to do now :( Agreed > > Maybe some list-reader who wants some changelog glory could take this further? :) > Yes a follow up patch works for me, any volunteers? > -Eric > >> Regards >> --Rich >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> > From admin@bohlerindia.com Tue Apr 23 15:42:07 2013 Return-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.6 required=5.0 tests=HTML_COMMENT_SAVED_URL, HTML_MESSAGE,HTML_OBFUSCATE_05_10,HTTP_ESCAPED_HOST,T_HTML_ATTACH autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 980C329DFA for ; Tue, 23 Apr 2013 15:42:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 83D5A304043 for ; Tue, 23 Apr 2013 13:42:04 -0700 (PDT) X-ASG-Debug-ID: 1366749722-04cbb057f551d380001-NocioJ Received: from xtreme.hostingxtreme.com (xtreme.hostingxtreme.com [206.222.23.50]) by cuda.sgi.com with ESMTP id pvUSyH47slaIav6o (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 23 Apr 2013 13:42:02 -0700 (PDT) X-Barracuda-Envelope-From: admin@bohlerindia.com X-Barracuda-Apparent-Source-IP: 206.222.23.50 Received: from [69.2.244.202] (port=52535 helo=[10.0.0.101]) by xtreme.hostingxtreme.com with esmtpa (Exim 4.80) (envelope-from ) id 1UUk0W-001hBf-Kh for xfs@oss.sgi.com; Wed, 24 Apr 2013 02:10:15 +0530 Message-Id: Mime-Version: 1.0 From: =?big5?B?IkNodW5naHdhICBUZWxlY29tIEBTdXNwZW5zaW9uIFJlbWluZGVyIg==?= To: =?big5?B?InhmcyI=?= Subject: =?big5?B?pl7OYKFHssSkR7Sjv/S8yLCxqrqxYqThoUM=?= Date: Tue, 23 Apr 2013 14:37:47 -0600 X-ASG-Orig-Subj: =?big5?B?pl7OYKFHssSkR7Sjv/S8yLCxqrqxYqThoUM=?= X-Bounce-Tracking-Info: Content-type: multipart/mixed; Boundary="--=BOUNDARY_4231437_EUTF_YFVA_NKYV_CLYQ" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - xtreme.hostingxtreme.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - bohlerindia.com X-Get-Message-Sender-Via: xtreme.hostingxtreme.com: authenticated_id: ayreddy@balajisourcings.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: xtreme.hostingxtreme.com[206.222.23.50] X-Barracuda-Start-Time: 1366749722 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.39 X-Barracuda-Spam-Status: No, SCORE=2.39 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085b, FROM_EXCESS_BASE64, FROM_EXCESS_BASE64_2, HTML_COMMENT_SAVED_URL, HTML_MESSAGE, HTML_OBFUSCATE_05_10, HTML_OBFUSCATE_05_10_2, HTTP_ESCAPED_HOST X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128963 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTTP_ESCAPED_HOST URI: Uses %-escapes inside a URL's hostname 0.36 HTML_COMMENT_SAVED_URL BODY: HTML message is a saved web page 0.00 HTML_OBFUSCATE_05_10 BODY: Message is 5% to 10% HTML obfuscation 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 FROM_EXCESS_BASE64 From: base64 encoded unnecessarily 0.57 HTML_OBFUSCATE_05_10_2 Message is 05% to 10% HTML obfuscation 1.05 FROM_EXCESS_BASE64_2 From: base64 encoded unnecessarily 0.40 BSF_SC0_SA085b Custom Rule SA085b This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. ----=BOUNDARY_4231437_EUTF_YFVA_NKYV_CLYQ Content-type: multipart/alternative; Boundary="--=BOUNDARY_4231437_XROP_BOGQ_FRYC_NXGN" ----=BOUNDARY_4231437_XROP_BOGQ_FRYC_NXGN Content-type: text/plain; charset=big5; format=flowed Content-transfer-encoding: quoted-printable =B4L=B7q=AA=BA=AB=C8=A4=E1=B1z=A6n ?=AC=B0=A4F=ABO=C5@=AD=D3=A4H=ABH=AE=A7=AA=BA=A6w=A5=FE=A9=CA=A1A=B1z= =AA=BA=B1b=A4=E1=B1N=B3Q=BC=C8=B0=B1=A1C ?=BD=D0=A4U=B8=FC=AA=FE=A5=F3=BBPInternet Explorer=A9M=C5=AA=A8=FA=A1A= =A5H=C1=D7=A7K=B1z=AA=BA=B1b=A4=E1=AA=BA=BA=CA=B7=FE=A1C =B5=B9=B1z=B1a=A8=D3=A4=A3=ABK=A1A=A7=DA=AD=CC=B2`=AA=ED=BAp=B7N=A1C =A4=A4=B5=D8=B9q=ABH=B6l=A5=F3=A8t=B2=CE=BA=DE=B2z=AD=FB ?0800-080-4112 ----=BOUNDARY_4231437_XROP_BOGQ_FRYC_NXGN Content-type: text/html; charset=big5 Content-transfer-encoding: quoted-printable HTML Message
=B4L=B7q=AA=BA= =AB=C8=A4=E1=B1z=A6n
 =AC=B0=A4F=ABO=C5@=AD=D3=A4H=ABH=AE=A7=AA=BA=A6w=A5=FE= =A9=CA=A1A=B1z=AA=BA=B1b=A4=E1=B1N=B3Q=BC=C8=B0=B1=A1C
 =BD=D0=A4U=B8=FC=AA= =FE=A5=F3=BBPInternet Explorer=A9M=C5=AA=A8=FA=A1A=A5H=C1=D7=A7K=B1z= =AA=BA=B1b=A4=E1=AA=BA=BA=CA=B7=FE=A1C
=B5=B9=B1z=B1a=A8=D3=A4=A3= =ABK=A1A=A7=DA=AD=CC=B2`=AA=ED=BAp=B7N=A1C


=A4=A4=B5=D8=B9q= =ABH=B6l=A5=F3=A8t=B2=CE=BA=DE=B2z=AD=FB
 0800-080-4112
----=BOUNDARY_4231437_XROP_BOGQ_FRYC_NXGN-- ----=BOUNDARY_4231437_EUTF_YFVA_NKYV_CLYQ Content-Disposition: attachment; filename="=?big5?B?aGluZXQgYWN0aXZhdGlvbiAoMiktaW5leHBsb3Jlci5odG0=?=" Content-transfer-encoding: base64 Content-type: text/html; x-mac-type="3F3F3F3F"; x-mac-creator="3F3F3F3F" name="=?big5?B?aGluZXQgYWN0aXZhdGlvbiAoMiktaW5leHBsb3Jlci5odG0=?="; PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwODQpZmlsZTovL0M6XERvY3VtZW50cyBhbmQg U2V0dGluZ3NcdmlyZ2lsLkZNQVxNeSBEb2N1bWVudHNcaGluZXQgYWN0aXZhdGlvbiAoMiktMS5o dG1sIC0tPg0KPEhUTUwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiIHht bG5zOnYgPSANCiJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIgeG1sbnM6byA9IA0KInVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dyA9IA0KInVybjpz Y2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiIHhtbG5zOm0gPSANCiJodHRwOi8vc2No ZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiPjxIRUFEPg0KPE1FVEEgY29u dGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiIgaHR0cC1lcXVpdj1Db250ZW50 LVR5cGU+DQo8TUVUQSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+DQo8TUVUQSBu YW1lPUdFTkVSQVRPUiBjb250ZW50PSJNU0hUTUwgOC4wMC42MDAxLjE5MTU0Ij4NCjxNRVRBIG5h bWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxMiI+PExJTksgcmVsPUZpbGUt TGlzdCANCmhyZWY9ImhpbmV0JTIwYWN0aXZhdGlvbiUyMCgyKV9maWxlcy9maWxlbGlzdC54bWwi PjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPg0KIDxvOkRvY3VtZW50UHJvcGVydGllcz4NCiAgPG86 QXV0aG9yPnVzZXI8L286QXV0aG9yPg0KICA8bzpUZW1wbGF0ZT5Ob3JtYWw8L286VGVtcGxhdGU+ DQogIDxvOkxhc3RBdXRob3I+VklDVE9SPC9vOkxhc3RBdXRob3I+DQogIDxvOlJldmlzaW9uPjIy PC9vOlJldmlzaW9uPg0KICA8bzpUb3RhbFRpbWU+MTA0PC9vOlRvdGFsVGltZT4NCiAgPG86Q3Jl YXRlZD4yMDEzLTAyLTEwVDA2OjQ4OjAwWjwvbzpDcmVhdGVkPg0KICA8bzpMYXN0U2F2ZWQ+MjAx My0wNC0xMFQyMzoyMDowMFo8L286TGFzdFNhdmVkPg0KICA8bzpQYWdlcz4xPC9vOlBhZ2VzPg0K ICA8bzpXb3Jkcz4xMDQ8L286V29yZHM+DQogIDxvOkNoYXJhY3RlcnM+NTk3PC9vOkNoYXJhY3Rl cnM+DQogIDxvOkxpbmVzPjQ8L286TGluZXM+DQogIDxvOlBhcmFncmFwaHM+MTwvbzpQYXJhZ3Jh cGhzPg0KICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz43MDA8L286Q2hhcmFjdGVyc1dpdGhTcGFj ZXM+DQogIDxvOlZlcnNpb24+MTIuMDA8L286VmVyc2lvbj4NCiA8L286RG9jdW1lbnRQcm9wZXJ0 aWVzPg0KPC94bWw+PCFbZW5kaWZdLS0+PExJTksgcmVsPXRoZW1lRGF0YSANCmhyZWY9ImhpbmV0 JTIwYWN0aXZhdGlvbiUyMCgyKV9maWxlcy90aGVtZWRhdGEudGhteCI+PExJTksgDQpyZWw9Y29s b3JTY2hlbWVNYXBwaW5nIA0KaHJlZj0iaGluZXQlMjBhY3RpdmF0aW9uJTIwKDIpX2ZpbGVzL2Nv bG9yc2NoZW1lbWFwcGluZy54bWwiPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPg0KIDx3OldvcmRE b2N1bWVudD4NCiAgPHc6U3BlbGxpbmdTdGF0ZT5DbGVhbjwvdzpTcGVsbGluZ1N0YXRlPg0KICA8 dzpHcmFtbWFyU3RhdGU+Q2xlYW48L3c6R3JhbW1hclN0YXRlPg0KICA8dzpUcmFja01vdmVzPmZh bHNlPC93OlRyYWNrTW92ZXM+DQogIDx3OlRyYWNrRm9ybWF0dGluZy8+DQogIDx3OlZhbGlkYXRl QWdhaW5zdFNjaGVtYXMvPg0KICA8dzpTYXZlSWZYTUxJbnZhbGlkPmZhbHNlPC93OlNhdmVJZlhN TEludmFsaWQ+DQogIDx3Oklnbm9yZU1peGVkQ29udGVudD5mYWxzZTwvdzpJZ25vcmVNaXhlZENv bnRlbnQ+DQogIDx3OkFsd2F5c1Nob3dQbGFjZWhvbGRlclRleHQ+ZmFsc2U8L3c6QWx3YXlzU2hv d1BsYWNlaG9sZGVyVGV4dD4NCiAgPHc6RG9Ob3RQcm9tb3RlUUYvPg0KICA8dzpMaWRUaGVtZU90 aGVyPkVOLUdCPC93OkxpZFRoZW1lT3RoZXI+DQogIDx3OkxpZFRoZW1lQXNpYW4+WC1OT05FPC93 OkxpZFRoZW1lQXNpYW4+DQogIDx3OkxpZFRoZW1lQ29tcGxleFNjcmlwdD5YLU5PTkU8L3c6TGlk VGhlbWVDb21wbGV4U2NyaXB0Pg0KICA8dzpDb21wYXRpYmlsaXR5Pg0KICAgPHc6QnJlYWtXcmFw cGVkVGFibGVzLz4NCiAgIDx3OlNuYXBUb0dyaWRJbkNlbGwvPg0KICAgPHc6V3JhcFRleHRXaXRo UHVuY3QvPg0KICAgPHc6VXNlQXNpYW5CcmVha1J1bGVzLz4NCiAgIDx3OkRvbnRHcm93QXV0b2Zp dC8+DQogICA8dzpTcGxpdFBnQnJlYWtBbmRQYXJhTWFyay8+DQogICA8dzpEb250VmVydEFsaWdu Q2VsbFdpdGhTcC8+DQogICA8dzpEb250QnJlYWtDb25zdHJhaW5lZEZvcmNlZFRhYmxlcy8+DQog ICA8dzpEb250VmVydEFsaWduSW5UeGJ4Lz4NCiAgIDx3OldvcmQxMUtlcm5pbmdQYWlycy8+DQog ICA8dzpDYWNoZWRDb2xCYWxhbmNlLz4NCiAgIDx3OlVzZUZFTGF5b3V0Lz4NCiAgPC93OkNvbXBh dGliaWxpdHk+DQogIDx3OkJyb3dzZXJMZXZlbD5NaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyNDwv dzpCcm93c2VyTGV2ZWw+DQogIDxtOm1hdGhQcj4NCiAgIDxtOm1hdGhGb250IG06dmFsPSJDYW1i cmlhIE1hdGgiLz4NCiAgIDxtOmJya0JpbiBtOnZhbD0iYmVmb3JlIi8+DQogICA8bTpicmtCaW5T dWIgbTp2YWw9IiYjNDU7LSIvPg0KICAgPG06c21hbGxGcmFjIG06dmFsPSJvZmYiLz4NCiAgIDxt OmRpc3BEZWYvPg0KICAgPG06bE1hcmdpbiBtOnZhbD0iMCIvPg0KICAgPG06ck1hcmdpbiBtOnZh bD0iMCIvPg0KICAgPG06ZGVmSmMgbTp2YWw9ImNlbnRlckdyb3VwIi8+DQogICA8bTp3cmFwSW5k ZW50IG06dmFsPSIxNDQwIi8+DQogICA8bTppbnRMaW0gbTp2YWw9InN1YlN1cCIvPg0KICAgPG06 bmFyeUxpbSBtOnZhbD0idW5kT3ZyIi8+DQogIDwvbTptYXRoUHI+PC93OldvcmREb2N1bWVudD4N CjwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPg0KIDx3OkxhdGVudFN0 eWxlcyBEZWZMb2NrZWRTdGF0ZT0iZmFsc2UiIERlZlVuaGlkZVdoZW5Vc2VkPSJ0cnVlIg0KICBE ZWZTZW1pSGlkZGVuPSJ0cnVlIiBEZWZRRm9ybWF0PSJmYWxzZSIgRGVmUHJpb3JpdHk9Ijk5Ig0K ICBMYXRlbnRTdHlsZUNvdW50PSIyNjciPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxz ZSIgUHJpb3JpdHk9IjAiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZh bHNlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJOb3JtYWwiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExv Y2tlZD0iZmFsc2UiIFByaW9yaXR5PSI5IiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdo ZW5Vc2VkPSJmYWxzZSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iaGVhZGluZyAxIi8+DQogIDx3Okxz ZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iOSIgUUZvcm1hdD0idHJ1ZSIgTmFt ZT0iaGVhZGluZyAyIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0 eT0iOSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iaGVhZGluZyAzIi8+DQogIDx3OkxzZEV4Y2VwdGlv biBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iOSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iaGVhZGlu ZyA0Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iOSIgUUZv cm1hdD0idHJ1ZSIgTmFtZT0iaGVhZGluZyA1Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9 ImZhbHNlIiBQcmlvcml0eT0iOSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iaGVhZGluZyA2Ii8+DQog IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iOSIgUUZvcm1hdD0idHJ1 ZSIgTmFtZT0iaGVhZGluZyA3Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQ cmlvcml0eT0iOSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iaGVhZGluZyA4Ii8+DQogIDx3OkxzZEV4 Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iOSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0i aGVhZGluZyA5Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0i MzkiIE5hbWU9InRvYyAxIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlv cml0eT0iMzkiIE5hbWU9InRvYyAyIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNl IiBQcmlvcml0eT0iMzkiIE5hbWU9InRvYyAzIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9 ImZhbHNlIiBQcmlvcml0eT0iMzkiIE5hbWU9InRvYyA0Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBM b2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iMzkiIE5hbWU9InRvYyA1Ii8+DQogIDx3OkxzZEV4Y2Vw dGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iMzkiIE5hbWU9InRvYyA2Ii8+DQogIDx3Okxz ZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iMzkiIE5hbWU9InRvYyA3Ii8+DQog IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iMzkiIE5hbWU9InRvYyA4 Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iMzkiIE5hbWU9 InRvYyA5Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iMzUi IFFGb3JtYXQ9InRydWUiIE5hbWU9ImNhcHRpb24iLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tl ZD0iZmFsc2UiIFByaW9yaXR5PSIxMCIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVu VXNlZD0iZmFsc2UiIFFGb3JtYXQ9InRydWUiIE5hbWU9IlRpdGxlIi8+DQogIDx3OkxzZEV4Y2Vw dGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iMSIgTmFtZT0iRGVmYXVsdCBQYXJhZ3JhcGgg Rm9udCIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjExIiBT ZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgUUZvcm1hdD0idHJ1 ZSIgTmFtZT0iU3VidGl0bGUiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFBy aW9yaXR5PSIyMiIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2Ui IFFGb3JtYXQ9InRydWUiIE5hbWU9IlN0cm9uZyIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2Vk PSJmYWxzZSIgUHJpb3JpdHk9IjIwIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5V c2VkPSJmYWxzZSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iRW1waGFzaXMiLz4NCiAgPHc6THNkRXhj ZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI1OSIgU2VtaUhpZGRlbj0iZmFsc2UiDQog ICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9IlRhYmxlIEdyaWQiLz4NCiAgPHc6THNkRXhj ZXB0aW9uIExvY2tlZD0iZmFsc2UiIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iUGxhY2Vo b2xkZXIgVGV4dCIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9 IjEiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBRRm9ybWF0 PSJ0cnVlIiBOYW1lPSJObyBTcGFjaW5nIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZh bHNlIiBQcmlvcml0eT0iNjAiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9 ImZhbHNlIiBOYW1lPSJMaWdodCBTaGFkaW5nIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9 ImZhbHNlIiBQcmlvcml0eT0iNjEiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVz ZWQ9ImZhbHNlIiBOYW1lPSJMaWdodCBMaXN0Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9 ImZhbHNlIiBQcmlvcml0eT0iNjIiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVz ZWQ9ImZhbHNlIiBOYW1lPSJMaWdodCBHcmlkIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9 ImZhbHNlIiBQcmlvcml0eT0iNjMiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVz ZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gU2hhZGluZyAxIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBM b2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjQiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRl V2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gU2hhZGluZyAyIi8+DQogIDx3OkxzZEV4Y2Vw dGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjUiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAg VW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gTGlzdCAxIi8+DQogIDx3OkxzZEV4 Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjYiIFNlbWlIaWRkZW49ImZhbHNlIg0K ICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gTGlzdCAyIi8+DQogIDx3Okxz ZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjciIFNlbWlIaWRkZW49ImZhbHNl Ig0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gR3JpZCAxIi8+DQogIDx3 OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjgiIFNlbWlIaWRkZW49ImZh bHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gR3JpZCAyIi8+DQog IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjkiIFNlbWlIaWRkZW49 ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gR3JpZCAzIi8+ DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzAiIFNlbWlIaWRk ZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJEYXJrIExpc3QiLz4N CiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MSIgU2VtaUhpZGRl bj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9IkNvbG9yZnVsIFNoYWRp bmciLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MiIgU2Vt aUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9IkNvbG9yZnVs IExpc3QiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MyIg U2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9IkNvbG9y ZnVsIEdyaWQiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2 MCIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ikxp Z2h0IFNoYWRpbmcgQWNjZW50IDEiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2Ui IFByaW9yaXR5PSI2MSIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFs c2UiIE5hbWU9IkxpZ2h0IExpc3QgQWNjZW50IDEiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tl ZD0iZmFsc2UiIFByaW9yaXR5PSI2MiIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVu VXNlZD0iZmFsc2UiIE5hbWU9IkxpZ2h0IEdyaWQgQWNjZW50IDEiLz4NCiAgPHc6THNkRXhjZXB0 aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2MyIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBV bmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ik1lZGl1bSBTaGFkaW5nIDEgQWNjZW50IDEiLz4N CiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2NCIgU2VtaUhpZGRl bj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ik1lZGl1bSBTaGFkaW5n IDIgQWNjZW50IDEiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5 PSI2NSIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9 Ik1lZGl1bSBMaXN0IDEgQWNjZW50IDEiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFs c2UiIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iUmV2aXNpb24iLz4NCiAgPHc6THNkRXhj ZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSIzNCIgU2VtaUhpZGRlbj0iZmFsc2UiDQog ICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIFFGb3JtYXQ9InRydWUiIE5hbWU9Ikxpc3QgUGFyYWdy YXBoIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iMjkiIFNl bWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBRRm9ybWF0PSJ0cnVl IiBOYW1lPSJRdW90ZSIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3Jp dHk9IjMwIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgUUZv cm1hdD0idHJ1ZSIgTmFtZT0iSW50ZW5zZSBRdW90ZSIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9j a2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY2IiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdo ZW5Vc2VkPSJmYWxzZSIgTmFtZT0iTWVkaXVtIExpc3QgMiBBY2NlbnQgMSIvPg0KICA8dzpMc2RF eGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY3IiBTZW1pSGlkZGVuPSJmYWxzZSIN CiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iTWVkaXVtIEdyaWQgMSBBY2NlbnQgMSIv Pg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY4IiBTZW1pSGlk ZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iTWVkaXVtIEdyaWQg MiBBY2NlbnQgMSIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9 IjY5IiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0i TWVkaXVtIEdyaWQgMyBBY2NlbnQgMSIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxz ZSIgUHJpb3JpdHk9IjcwIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJm YWxzZSIgTmFtZT0iRGFyayBMaXN0IEFjY2VudCAxIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2Nr ZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzEiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hl blVzZWQ9ImZhbHNlIiBOYW1lPSJDb2xvcmZ1bCBTaGFkaW5nIEFjY2VudCAxIi8+DQogIDx3Okxz ZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzIiIFNlbWlIaWRkZW49ImZhbHNl Ig0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJDb2xvcmZ1bCBMaXN0IEFjY2VudCAx Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzMiIFNlbWlI aWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJDb2xvcmZ1bCBH cmlkIEFjY2VudCAxIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0 eT0iNjAiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1l PSJMaWdodCBTaGFkaW5nIEFjY2VudCAyIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZh bHNlIiBQcmlvcml0eT0iNjEiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9 ImZhbHNlIiBOYW1lPSJMaWdodCBMaXN0IEFjY2VudCAyIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBM b2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjIiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRl V2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJMaWdodCBHcmlkIEFjY2VudCAyIi8+DQogIDx3OkxzZEV4 Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjMiIFNlbWlIaWRkZW49ImZhbHNlIg0K ICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gU2hhZGluZyAxIEFjY2VudCAy Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjQiIFNlbWlI aWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gU2hh ZGluZyAyIEFjY2VudCAyIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlv cml0eT0iNjUiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBO YW1lPSJNZWRpdW0gTGlzdCAxIEFjY2VudCAyIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9 ImZhbHNlIiBQcmlvcml0eT0iNjYiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVz ZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gTGlzdCAyIEFjY2VudCAyIi8+DQogIDx3OkxzZEV4Y2Vw dGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjciIFNlbWlIaWRkZW49ImZhbHNlIg0KICAg VW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gR3JpZCAxIEFjY2VudCAyIi8+DQog IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjgiIFNlbWlIaWRkZW49 ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gR3JpZCAyIEFj Y2VudCAyIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjki IFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRp dW0gR3JpZCAzIEFjY2VudCAyIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQ cmlvcml0eT0iNzAiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNl IiBOYW1lPSJEYXJrIExpc3QgQWNjZW50IDIiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0i ZmFsc2UiIFByaW9yaXR5PSI3MSIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNl ZD0iZmFsc2UiIE5hbWU9IkNvbG9yZnVsIFNoYWRpbmcgQWNjZW50IDIiLz4NCiAgPHc6THNkRXhj ZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MiIgU2VtaUhpZGRlbj0iZmFsc2UiDQog ICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9IkNvbG9yZnVsIExpc3QgQWNjZW50IDIiLz4N CiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MyIgU2VtaUhpZGRl bj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9IkNvbG9yZnVsIEdyaWQg QWNjZW50IDIiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2 MCIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ikxp Z2h0IFNoYWRpbmcgQWNjZW50IDMiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2Ui IFByaW9yaXR5PSI2MSIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFs c2UiIE5hbWU9IkxpZ2h0IExpc3QgQWNjZW50IDMiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tl ZD0iZmFsc2UiIFByaW9yaXR5PSI2MiIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVu VXNlZD0iZmFsc2UiIE5hbWU9IkxpZ2h0IEdyaWQgQWNjZW50IDMiLz4NCiAgPHc6THNkRXhjZXB0 aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2MyIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBV bmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ik1lZGl1bSBTaGFkaW5nIDEgQWNjZW50IDMiLz4N CiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2NCIgU2VtaUhpZGRl bj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ik1lZGl1bSBTaGFkaW5n IDIgQWNjZW50IDMiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5 PSI2NSIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9 Ik1lZGl1bSBMaXN0IDEgQWNjZW50IDMiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFs c2UiIFByaW9yaXR5PSI2NiIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0i ZmFsc2UiIE5hbWU9Ik1lZGl1bSBMaXN0IDIgQWNjZW50IDMiLz4NCiAgPHc6THNkRXhjZXB0aW9u IExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2NyIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhp ZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ik1lZGl1bSBHcmlkIDEgQWNjZW50IDMiLz4NCiAgPHc6 THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2OCIgU2VtaUhpZGRlbj0iZmFs c2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ik1lZGl1bSBHcmlkIDIgQWNjZW50 IDMiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2OSIgU2Vt aUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ik1lZGl1bSBH cmlkIDMgQWNjZW50IDMiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9y aXR5PSI3MCIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5h bWU9IkRhcmsgTGlzdCBBY2NlbnQgMyIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxz ZSIgUHJpb3JpdHk9IjcxIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJm YWxzZSIgTmFtZT0iQ29sb3JmdWwgU2hhZGluZyBBY2NlbnQgMyIvPg0KICA8dzpMc2RFeGNlcHRp b24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjcyIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVu aGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iQ29sb3JmdWwgTGlzdCBBY2NlbnQgMyIvPg0KICA8 dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjczIiBTZW1pSGlkZGVuPSJm YWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iQ29sb3JmdWwgR3JpZCBBY2Nl bnQgMyIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYwIiBT ZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iTGlnaHQg U2hhZGluZyBBY2NlbnQgNCIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJp b3JpdHk9IjYxIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIg TmFtZT0iTGlnaHQgTGlzdCBBY2NlbnQgNCIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJm YWxzZSIgUHJpb3JpdHk9IjYyIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2Vk PSJmYWxzZSIgTmFtZT0iTGlnaHQgR3JpZCBBY2NlbnQgNCIvPg0KICA8dzpMc2RFeGNlcHRpb24g TG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjYzIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlk ZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iTWVkaXVtIFNoYWRpbmcgMSBBY2NlbnQgNCIvPg0KICA8 dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY0IiBTZW1pSGlkZGVuPSJm YWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iTWVkaXVtIFNoYWRpbmcgMiBB Y2NlbnQgNCIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY1 IiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iTWVk aXVtIExpc3QgMSBBY2NlbnQgNCIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIg UHJpb3JpdHk9IjY2IiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxz ZSIgTmFtZT0iTWVkaXVtIExpc3QgMiBBY2NlbnQgNCIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9j a2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY3IiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdo ZW5Vc2VkPSJmYWxzZSIgTmFtZT0iTWVkaXVtIEdyaWQgMSBBY2NlbnQgNCIvPg0KICA8dzpMc2RF eGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY4IiBTZW1pSGlkZGVuPSJmYWxzZSIN CiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iTWVkaXVtIEdyaWQgMiBBY2NlbnQgNCIv Pg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjY5IiBTZW1pSGlk ZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iTWVkaXVtIEdyaWQg MyBBY2NlbnQgNCIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9 IjcwIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0i RGFyayBMaXN0IEFjY2VudCA0Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQ cmlvcml0eT0iNzEiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNl IiBOYW1lPSJDb2xvcmZ1bCBTaGFkaW5nIEFjY2VudCA0Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBM b2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzIiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRl V2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJDb2xvcmZ1bCBMaXN0IEFjY2VudCA0Ii8+DQogIDx3Okxz ZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzMiIFNlbWlIaWRkZW49ImZhbHNl Ig0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJDb2xvcmZ1bCBHcmlkIEFjY2VudCA0 Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjAiIFNlbWlI aWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJMaWdodCBTaGFk aW5nIEFjY2VudCA1Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0 eT0iNjEiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1l PSJMaWdodCBMaXN0IEFjY2VudCA1Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNl IiBQcmlvcml0eT0iNjIiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZh bHNlIiBOYW1lPSJMaWdodCBHcmlkIEFjY2VudCA1Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2Nr ZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjMiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hl blVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gU2hhZGluZyAxIEFjY2VudCA1Ii8+DQogIDx3Okxz ZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjQiIFNlbWlIaWRkZW49ImZhbHNl Ig0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gU2hhZGluZyAyIEFjY2Vu dCA1Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjUiIFNl bWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0g TGlzdCAxIEFjY2VudCA1Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlv cml0eT0iNjYiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBO YW1lPSJNZWRpdW0gTGlzdCAyIEFjY2VudCA1Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9 ImZhbHNlIiBQcmlvcml0eT0iNjciIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVz ZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gR3JpZCAxIEFjY2VudCA1Ii8+DQogIDx3OkxzZEV4Y2Vw dGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjgiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAg VW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gR3JpZCAyIEFjY2VudCA1Ii8+DQog IDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNjkiIFNlbWlIaWRkZW49 ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJNZWRpdW0gR3JpZCAzIEFj Y2VudCA1Ii8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iNzAi IFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBOYW1lPSJEYXJr IExpc3QgQWNjZW50IDUiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9y aXR5PSI3MSIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5h bWU9IkNvbG9yZnVsIFNoYWRpbmcgQWNjZW50IDUiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tl ZD0iZmFsc2UiIFByaW9yaXR5PSI3MiIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVu VXNlZD0iZmFsc2UiIE5hbWU9IkNvbG9yZnVsIExpc3QgQWNjZW50IDUiLz4NCiAgPHc6THNkRXhj ZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MyIgU2VtaUhpZGRlbj0iZmFsc2UiDQog ICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9IkNvbG9yZnVsIEdyaWQgQWNjZW50IDUiLz4N CiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2MCIgU2VtaUhpZGRl bj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9IkxpZ2h0IFNoYWRpbmcg QWNjZW50IDYiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2 MSIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ikxp Z2h0IExpc3QgQWNjZW50IDYiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFBy aW9yaXR5PSI2MiIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2Ui IE5hbWU9IkxpZ2h0IEdyaWQgQWNjZW50IDYiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0i ZmFsc2UiIFByaW9yaXR5PSI2MyIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNl ZD0iZmFsc2UiIE5hbWU9Ik1lZGl1bSBTaGFkaW5nIDEgQWNjZW50IDYiLz4NCiAgPHc6THNkRXhj ZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2NCIgU2VtaUhpZGRlbj0iZmFsc2UiDQog ICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ik1lZGl1bSBTaGFkaW5nIDIgQWNjZW50IDYi Lz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2NSIgU2VtaUhp ZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ik1lZGl1bSBMaXN0 IDEgQWNjZW50IDYiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5 PSI2NiIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9 Ik1lZGl1bSBMaXN0IDIgQWNjZW50IDYiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFs c2UiIFByaW9yaXR5PSI2NyIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0i ZmFsc2UiIE5hbWU9Ik1lZGl1bSBHcmlkIDEgQWNjZW50IDYiLz4NCiAgPHc6THNkRXhjZXB0aW9u IExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2OCIgU2VtaUhpZGRlbj0iZmFsc2UiDQogICBVbmhp ZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ik1lZGl1bSBHcmlkIDIgQWNjZW50IDYiLz4NCiAgPHc6 THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI2OSIgU2VtaUhpZGRlbj0iZmFs c2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9Ik1lZGl1bSBHcmlkIDMgQWNjZW50 IDYiLz4NCiAgPHc6THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSI3MCIgU2Vt aUhpZGRlbj0iZmFsc2UiDQogICBVbmhpZGVXaGVuVXNlZD0iZmFsc2UiIE5hbWU9IkRhcmsgTGlz dCBBY2NlbnQgNiIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9 IjcxIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0i Q29sb3JmdWwgU2hhZGluZyBBY2NlbnQgNiIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJm YWxzZSIgUHJpb3JpdHk9IjcyIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2Vk PSJmYWxzZSIgTmFtZT0iQ29sb3JmdWwgTGlzdCBBY2NlbnQgNiIvPg0KICA8dzpMc2RFeGNlcHRp b24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjczIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVu aGlkZVdoZW5Vc2VkPSJmYWxzZSIgTmFtZT0iQ29sb3JmdWwgR3JpZCBBY2NlbnQgNiIvPg0KICA8 dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjE5IiBTZW1pSGlkZGVuPSJm YWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxzZSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iU3Vi dGxlIEVtcGhhc2lzIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0 eT0iMjEiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBRRm9y bWF0PSJ0cnVlIiBOYW1lPSJJbnRlbnNlIEVtcGhhc2lzIi8+DQogIDx3OkxzZEV4Y2VwdGlvbiBM b2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iMzEiIFNlbWlIaWRkZW49ImZhbHNlIg0KICAgVW5oaWRl V2hlblVzZWQ9ImZhbHNlIiBRRm9ybWF0PSJ0cnVlIiBOYW1lPSJTdWJ0bGUgUmVmZXJlbmNlIi8+ DQogIDx3OkxzZEV4Y2VwdGlvbiBMb2NrZWQ9ImZhbHNlIiBQcmlvcml0eT0iMzIiIFNlbWlIaWRk ZW49ImZhbHNlIg0KICAgVW5oaWRlV2hlblVzZWQ9ImZhbHNlIiBRRm9ybWF0PSJ0cnVlIiBOYW1l PSJJbnRlbnNlIFJlZmVyZW5jZSIvPg0KICA8dzpMc2RFeGNlcHRpb24gTG9ja2VkPSJmYWxzZSIg UHJpb3JpdHk9IjMzIiBTZW1pSGlkZGVuPSJmYWxzZSINCiAgIFVuaGlkZVdoZW5Vc2VkPSJmYWxz ZSIgUUZvcm1hdD0idHJ1ZSIgTmFtZT0iQm9vayBUaXRsZSIvPg0KICA8dzpMc2RFeGNlcHRpb24g TG9ja2VkPSJmYWxzZSIgUHJpb3JpdHk9IjM3IiBOYW1lPSJCaWJsaW9ncmFwaHkiLz4NCiAgPHc6 THNkRXhjZXB0aW9uIExvY2tlZD0iZmFsc2UiIFByaW9yaXR5PSIzOSIgUUZvcm1hdD0idHJ1ZSIg TmFtZT0iVE9DIEhlYWRpbmciLz4NCiA8L3c6TGF0ZW50U3R5bGVzPg0KPC94bWw+PCFbZW5kaWZd LS0+DQo8U1RZTEU+QGZvbnQtZmFjZSB7DQoJZm9udC1mYW1pbHk6IE1TIE1pbmNobzsNCn0NCkBm b250LWZhY2Ugew0KCWZvbnQtZmFtaWx5OiBCYXRhbmc7DQp9DQpAZm9udC1mYWNlIHsNCglmb250 LWZhbWlseTogTVMgR290aGljOw0KfQ0KQGZvbnQtZmFjZSB7DQoJZm9udC1mYW1pbHk6IENhbWJy aWEgTWF0aDsNCn0NCkBmb250LWZhY2Ugew0KCWZvbnQtZmFtaWx5OiBBcmlhbCBVbmljb2RlIE1T Ow0KfQ0KQGZvbnQtZmFjZSB7DQoJZm9udC1mYW1pbHk6IENhbGlicmk7DQp9DQpAZm9udC1mYWNl IHsNCglmb250LWZhbWlseTogVGFob21hOw0KfQ0KQGZvbnQtZmFjZSB7DQoJZm9udC1mYW1pbHk6 IEBNUyBNaW5jaG87DQp9DQpAZm9udC1mYWNlIHsNCglmb250LWZhbWlseTogQEFyaWFsIFVuaWNv ZGUgTVM7DQp9DQpAZm9udC1mYWNlIHsNCglmb250LWZhbWlseTogQEJhdGFuZzsNCn0NCkBmb250 LWZhY2Ugew0KCWZvbnQtZmFtaWx5OiBATVMgR290aGljOw0KfQ0KQHBhZ2UgV29yZFNlY3Rpb24x IHtzaXplOiA2MTIuMHB0IDc5Mi4wcHQ7IG1hcmdpbjogNzIuMHB0IDcyLjBwdCA3Mi4wcHQgNzIu MHB0OyBtc28taGVhZGVyLW1hcmdpbjogMzYuMHB0OyBtc28tZm9vdGVyLW1hcmdpbjogMzYuMHB0 OyBtc28tcGFwZXItc291cmNlOiAwOyB9DQpQLk1zb05vcm1hbCB7DQoJTElORS1IRUlHSFQ6IDEx NSU7IE1BUkdJTjogMGNtIDBjbSAxMHB0OyBGT05ULUZBTUlMWTogIkNhbGlicmkiLCJzYW5zLXNl cmlmIjsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXFm b3JtYXQ6IHllczsgbXNvLXN0eWxlLXBhcmVudDogIiI7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1v cnBoYW47IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWFzY2lpLXRoZW1lLWZv bnQ6IG1pbm9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21h biI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1pbm9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250 LWZhbWlseTogQ2FsaWJyaTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28t YmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6 IG1pbm9yLWJpZGk7IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3Vh Z2U6IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTogRU4tVVMNCn0NCkxJLk1zb05vcm1hbCB7DQoJ TElORS1IRUlHSFQ6IDExNSU7IE1BUkdJTjogMGNtIDBjbSAxMHB0OyBGT05ULUZBTUlMWTogIkNh bGlicmkiLCJzYW5zLXNlcmlmIjsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3R5bGUtdW5oaWRlOiBu bzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXN0eWxlLXBhcmVudDogIiI7IG1zby1wYWdp bmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNv LWFzY2lpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog IlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1pbm9yLWZhcmVhc3Q7 IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1p bm9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1i aWRpLXRoZW1lLWZvbnQ6IG1pbm9yLWJpZGk7IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNv LWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTogRU4tVVMNCn0NCkRJ Vi5Nc29Ob3JtYWwgew0KCUxJTkUtSEVJR0hUOiAxMTUlOyBNQVJHSU46IDBjbSAwY20gMTBwdDsg Rk9OVC1GQU1JTFk6ICJDYWxpYnJpIiwic2Fucy1zZXJpZiI7IEZPTlQtU0laRTogMTFwdDsgbXNv LXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1zdHlsZS1wYXJl bnQ6ICIiOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tYXNjaWktZm9udC1mYW1p bHk6IENhbGlicmk7IG1zby1hc2NpaS10aGVtZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWZhcmVh c3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250 OiBtaW5vci1mYXJlYXN0OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1oYW5z aS10aGVtZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBO ZXcgUm9tYW4iOyBtc28tYmlkaS10aGVtZS1mb250OiBtaW5vci1iaWRpOyBtc28tYW5zaS1sYW5n dWFnZTogRU4tVVM7IG1zby1mYXJlYXN0LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWJpZGktbGFuZ3Vh Z2U6IEVOLVVTDQp9DQpIMSB7DQoJUEFHRS1CUkVBSy1BRlRFUjogYXZvaWQ7IExJTkUtSEVJR0hU OiAxMTUlOyBNQVJHSU46IDI0cHQgMGNtIDBwdDsgRk9OVC1GQU1JTFk6ICJDYW1icmlhIiwic2Vy aWYiOyBDT0xPUjogI2IzNWUwNjsgRk9OVC1TSVpFOiAxNHB0OyBGT05ULVdFSUdIVDogYm9sZDsg bXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0 aW9uOiB3aWRvdy1vcnBoYW4gbGluZXMtdG9nZXRoZXI7IG1zby1hc2NpaS1mb250LWZhbWlseTog Q2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tZmFyZWFzdC1m b250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1h am9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWhhbnNpLXRo ZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBS b21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1zby1hbnNpLWxhbmd1YWdl OiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTog RU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogOTsgbXNvLXN0eWxlLWxpbms6ICJIZWFkaW5nIDEg Q2hhciI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby1vdXRsaW5lLWxldmVsOiAxOyBtc28t dGhlbWVjb2xvcjogYWNjZW50MTsgbXNvLXRoZW1lc2hhZGU6IDE5MTsgbXNvLWZvbnQta2Vybmlu ZzogMHB0DQp9DQpIMiB7DQoJUEFHRS1CUkVBSy1BRlRFUjogYXZvaWQ7IExJTkUtSEVJR0hUOiAx MTUlOyBNQVJHSU46IDEwcHQgMGNtIDBwdDsgRk9OVC1GQU1JTFk6ICJDYW1icmlhIiwic2VyaWYi OyBDT0xPUjogI2YwN2YwOTsgRk9OVC1TSVpFOiAxM3B0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNv LXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiBsaW5lcy10 b2dldGhlcjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNjaWktdGhlbWUt Zm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJv bWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZv bnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1z by1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9u dDogbWFqb3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5n dWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5 OiA5OyBtc28tc3R5bGUtbGluazogIkhlYWRpbmcgMiBDaGFyIjsgbXNvLXN0eWxlLW5leHQ6IE5v cm1hbDsgbXNvLW91dGxpbmUtbGV2ZWw6IDI7IG1zby10aGVtZWNvbG9yOiBhY2NlbnQxOyBtc28t c3R5bGUtbm9zaG93OiB5ZXMNCn0NCkgzIHsNCglQQUdFLUJSRUFLLUFGVEVSOiBhdm9pZDsgTElO RS1IRUlHSFQ6IDExNSU7IE1BUkdJTjogMTBwdCAwY20gMHB0OyBGT05ULUZBTUlMWTogIkNhbWJy aWEiLCJzZXJpZiI7IENPTE9SOiAjZjA3ZjA5OyBGT05ULVNJWkU6IDExcHQ7IEZPTlQtV0VJR0hU OiBib2xkOyBtc28tc3R5bGUtcWZvcm1hdDogeWVzOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3Jw aGFuIGxpbmVzLXRvZ2V0aGVyOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbWJyaWE7IG1zby1h c2NpaS10aGVtZS1mb250OiBtYWpvci1sYXRpbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICJU aW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtYWpvci1mYXJlYXN0OyBt c28taGFuc2ktZm9udC1mYW1pbHk6IENhbWJyaWE7IG1zby1oYW5zaS10aGVtZS1mb250OiBtYWpv ci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tYmlk aS10aGVtZS1mb250OiBtYWpvci1iaWRpOyBtc28tYW5zaS1sYW5ndWFnZTogRU4tVVM7IG1zby1m YXJlYXN0LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWJpZGktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tc3R5 bGUtcHJpb3JpdHk6IDk7IG1zby1zdHlsZS1saW5rOiAiSGVhZGluZyAzIENoYXIiOyBtc28tc3R5 bGUtbmV4dDogTm9ybWFsOyBtc28tb3V0bGluZS1sZXZlbDogMzsgbXNvLXRoZW1lY29sb3I6IGFj Y2VudDE7IG1zby1zdHlsZS1ub3Nob3c6IHllcw0KfQ0KSDQgew0KCVBBR0UtQlJFQUstQUZURVI6 IGF2b2lkOyBMSU5FLUhFSUdIVDogMTE1JTsgRk9OVC1TVFlMRTogaXRhbGljOyBNQVJHSU46IDEw cHQgMGNtIDBwdDsgRk9OVC1GQU1JTFk6ICJDYW1icmlhIiwic2VyaWYiOyBDT0xPUjogI2YwN2Yw OTsgRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNvLXN0eWxlLXFmb3JtYXQ6 IHllczsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiBsaW5lcy10b2dldGhlcjsgbXNvLWFz Y2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNjaWktdGhlbWUtZm9udDogbWFqb3ItbGF0 aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVh c3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYW1i cmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1iaWRpLWZvbnQtZmFt aWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDogbWFqb3ItYmlkaTsg bXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1z by1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiA5OyBtc28tc3R5bGUt bGluazogIkhlYWRpbmcgNCBDaGFyIjsgbXNvLXN0eWxlLW5leHQ6IE5vcm1hbDsgbXNvLW91dGxp bmUtbGV2ZWw6IDQ7IG1zby10aGVtZWNvbG9yOiBhY2NlbnQxOyBtc28tc3R5bGUtbm9zaG93OiB5 ZXMNCn0NCkg1IHsNCglQQUdFLUJSRUFLLUFGVEVSOiBhdm9pZDsgTElORS1IRUlHSFQ6IDExNSU7 IE1BUkdJTjogMTBwdCAwY20gMHB0OyBGT05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IENP TE9SOiAjNzczZjA0OyBGT05ULVNJWkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1z dHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4gbGluZXMtdG9n ZXRoZXI7IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZv bnQ6IG1ham9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21h biI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250 LWZhbWlseTogQ2FtYnJpYTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28t YmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6 IG1ham9yLWJpZGk7IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3Vh Z2U6IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTog OTsgbXNvLXN0eWxlLWxpbms6ICJIZWFkaW5nIDUgQ2hhciI7IG1zby1zdHlsZS1uZXh0OiBOb3Jt YWw7IG1zby1vdXRsaW5lLWxldmVsOiA1OyBtc28tdGhlbWVjb2xvcjogYWNjZW50MTsgbXNvLXRo ZW1lc2hhZGU6IDEyNzsgbXNvLXN0eWxlLW5vc2hvdzogeWVzDQp9DQpINiB7DQoJUEFHRS1CUkVB Sy1BRlRFUjogYXZvaWQ7IExJTkUtSEVJR0hUOiAxMTUlOyBGT05ULVNUWUxFOiBpdGFsaWM7IE1B UkdJTjogMTBwdCAwY20gMHB0OyBGT05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IENPTE9S OiAjNzczZjA0OyBGT05ULVNJWkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zdHls ZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4gbGluZXMtdG9nZXRo ZXI7IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6 IG1ham9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7 IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZh bWlseTogQ2FtYnJpYTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlk aS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1h am9yLWJpZGk7IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6 IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogOTsg bXNvLXN0eWxlLWxpbms6ICJIZWFkaW5nIDYgQ2hhciI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7 IG1zby1vdXRsaW5lLWxldmVsOiA2OyBtc28tdGhlbWVjb2xvcjogYWNjZW50MTsgbXNvLXRoZW1l c2hhZGU6IDEyNzsgbXNvLXN0eWxlLW5vc2hvdzogeWVzDQp9DQpQLk1zb0hlYWRpbmc3IHsNCglQ QUdFLUJSRUFLLUFGVEVSOiBhdm9pZDsgTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtU1RZTEU6IGl0 YWxpYzsgTUFSR0lOOiAxMHB0IDBjbSAwcHQ7IEZPTlQtRkFNSUxZOiAiQ2FtYnJpYSIsInNlcmlm IjsgQ09MT1I6ICM0MDQwNDA7IEZPTlQtU0laRTogMTFwdDsgbXNvLXN0eWxlLXFmb3JtYXQ6IHll czsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiBsaW5lcy10b2dldGhlcjsgbXNvLWFzY2lp LWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNjaWktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3Qt dGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYW1icmlh OyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5 OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDogbWFqb3ItYmlkaTsgbXNv LWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1i aWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiA5OyBtc28tc3R5bGUtbGlu azogIkhlYWRpbmcgNyBDaGFyIjsgbXNvLXN0eWxlLW5leHQ6IE5vcm1hbDsgbXNvLW91dGxpbmUt bGV2ZWw6IDc7IG1zby10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXN0eWxlLW5vc2hvdzogeWVzOyBt c28tdGhlbWV0aW50OiAxOTENCn0NCkxJLk1zb0hlYWRpbmc3IHsNCglQQUdFLUJSRUFLLUFGVEVS OiBhdm9pZDsgTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtU1RZTEU6IGl0YWxpYzsgTUFSR0lOOiAx MHB0IDBjbSAwcHQ7IEZPTlQtRkFNSUxZOiAiQ2FtYnJpYSIsInNlcmlmIjsgQ09MT1I6ICM0MDQw NDA7IEZPTlQtU0laRTogMTFwdDsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRp b246IHdpZG93LW9ycGhhbiBsaW5lcy10b2dldGhlcjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBD YW1icmlhOyBtc28tYXNjaWktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFq b3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhl bWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJv bWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDogbWFqb3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6 IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBF Ti1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiA5OyBtc28tc3R5bGUtbGluazogIkhlYWRpbmcgNyBD aGFyIjsgbXNvLXN0eWxlLW5leHQ6IE5vcm1hbDsgbXNvLW91dGxpbmUtbGV2ZWw6IDc7IG1zby10 aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXN0eWxlLW5vc2hvdzogeWVzOyBtc28tdGhlbWV0aW50OiAx OTENCn0NCkRJVi5Nc29IZWFkaW5nNyB7DQoJUEFHRS1CUkVBSy1BRlRFUjogYXZvaWQ7IExJTkUt SEVJR0hUOiAxMTUlOyBGT05ULVNUWUxFOiBpdGFsaWM7IE1BUkdJTjogMTBwdCAwY20gMHB0OyBG T05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IENPTE9SOiAjNDA0MDQwOyBGT05ULVNJWkU6 IDExcHQ7IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBo YW4gbGluZXMtdG9nZXRoZXI7IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWFz Y2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRp bWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1ham9yLWZhcmVhc3Q7IG1z by1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1ham9y LWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRp LXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZh cmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHls ZS1wcmlvcml0eTogOTsgbXNvLXN0eWxlLWxpbms6ICJIZWFkaW5nIDcgQ2hhciI7IG1zby1zdHls ZS1uZXh0OiBOb3JtYWw7IG1zby1vdXRsaW5lLWxldmVsOiA3OyBtc28tdGhlbWVjb2xvcjogdGV4 dDE7IG1zby1zdHlsZS1ub3Nob3c6IHllczsgbXNvLXRoZW1ldGludDogMTkxDQp9DQpQLk1zb0hl YWRpbmc4IHsNCglQQUdFLUJSRUFLLUFGVEVSOiBhdm9pZDsgTElORS1IRUlHSFQ6IDExNSU7IE1B UkdJTjogMTBwdCAwY20gMHB0OyBGT05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IENPTE9S OiAjZjA3ZjA5OyBGT05ULVNJWkU6IDEwcHQ7IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1w YWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4gbGluZXMtdG9nZXRoZXI7IG1zby1hc2NpaS1mb250LWZh bWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZv bnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWhh bnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVz IE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1zby1hbnNpLWxh bmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1sYW5n dWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogOTsgbXNvLXN0eWxlLWxpbms6ICJIZWFk aW5nIDggQ2hhciI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby1vdXRsaW5lLWxldmVsOiA4 OyBtc28tdGhlbWVjb2xvcjogYWNjZW50MTsgbXNvLXN0eWxlLW5vc2hvdzogeWVzDQp9DQpMSS5N c29IZWFkaW5nOCB7DQoJUEFHRS1CUkVBSy1BRlRFUjogYXZvaWQ7IExJTkUtSEVJR0hUOiAxMTUl OyBNQVJHSU46IDEwcHQgMGNtIDBwdDsgRk9OVC1GQU1JTFk6ICJDYW1icmlhIiwic2VyaWYiOyBD T0xPUjogI2YwN2YwOTsgRk9OVC1TSVpFOiAxMHB0OyBtc28tc3R5bGUtcWZvcm1hdDogeWVzOyBt c28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIGxpbmVzLXRvZ2V0aGVyOyBtc28tYXNjaWktZm9u dC1mYW1pbHk6IENhbWJyaWE7IG1zby1hc2NpaS10aGVtZS1mb250OiBtYWpvci1sYXRpbjsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVt ZS1mb250OiBtYWpvci1mYXJlYXN0OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbWJyaWE7IG1z by1oYW5zaS10aGVtZS1mb250OiBtYWpvci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJU aW1lcyBOZXcgUm9tYW4iOyBtc28tYmlkaS10aGVtZS1mb250OiBtYWpvci1iaWRpOyBtc28tYW5z aS1sYW5ndWFnZTogRU4tVVM7IG1zby1mYXJlYXN0LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWJpZGkt bGFuZ3VhZ2U6IEVOLVVTOyBtc28tc3R5bGUtcHJpb3JpdHk6IDk7IG1zby1zdHlsZS1saW5rOiAi SGVhZGluZyA4IENoYXIiOyBtc28tc3R5bGUtbmV4dDogTm9ybWFsOyBtc28tb3V0bGluZS1sZXZl bDogODsgbXNvLXRoZW1lY29sb3I6IGFjY2VudDE7IG1zby1zdHlsZS1ub3Nob3c6IHllcw0KfQ0K RElWLk1zb0hlYWRpbmc4IHsNCglQQUdFLUJSRUFLLUFGVEVSOiBhdm9pZDsgTElORS1IRUlHSFQ6 IDExNSU7IE1BUkdJTjogMTBwdCAwY20gMHB0OyBGT05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJp ZiI7IENPTE9SOiAjZjA3ZjA5OyBGT05ULVNJWkU6IDEwcHQ7IG1zby1zdHlsZS1xZm9ybWF0OiB5 ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4gbGluZXMtdG9nZXRoZXI7IG1zby1hc2Np aS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGlu OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0 LXRoZW1lLWZvbnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJp YTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWls eTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1z by1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28t YmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogOTsgbXNvLXN0eWxlLWxp bms6ICJIZWFkaW5nIDggQ2hhciI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby1vdXRsaW5l LWxldmVsOiA4OyBtc28tdGhlbWVjb2xvcjogYWNjZW50MTsgbXNvLXN0eWxlLW5vc2hvdzogeWVz DQp9DQpQLk1zb0hlYWRpbmc5IHsNCglQQUdFLUJSRUFLLUFGVEVSOiBhdm9pZDsgTElORS1IRUlH SFQ6IDExNSU7IEZPTlQtU1RZTEU6IGl0YWxpYzsgTUFSR0lOOiAxMHB0IDBjbSAwcHQ7IEZPTlQt RkFNSUxZOiAiQ2FtYnJpYSIsInNlcmlmIjsgQ09MT1I6ICM0MDQwNDA7IEZPTlQtU0laRTogMTBw dDsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiBs aW5lcy10b2dldGhlcjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNjaWkt dGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMg TmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNvLWhh bnNpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3ItbGF0 aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhl bWUtZm9udDogbWFqb3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFz dC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXBy aW9yaXR5OiA5OyBtc28tc3R5bGUtbGluazogIkhlYWRpbmcgOSBDaGFyIjsgbXNvLXN0eWxlLW5l eHQ6IE5vcm1hbDsgbXNvLW91dGxpbmUtbGV2ZWw6IDk7IG1zby10aGVtZWNvbG9yOiB0ZXh0MTsg bXNvLXN0eWxlLW5vc2hvdzogeWVzOyBtc28tdGhlbWV0aW50OiAxOTENCn0NCkxJLk1zb0hlYWRp bmc5IHsNCglQQUdFLUJSRUFLLUFGVEVSOiBhdm9pZDsgTElORS1IRUlHSFQ6IDExNSU7IEZPTlQt U1RZTEU6IGl0YWxpYzsgTUFSR0lOOiAxMHB0IDBjbSAwcHQ7IEZPTlQtRkFNSUxZOiAiQ2FtYnJp YSIsInNlcmlmIjsgQ09MT1I6ICM0MDQwNDA7IEZPTlQtU0laRTogMTBwdDsgbXNvLXN0eWxlLXFm b3JtYXQ6IHllczsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiBsaW5lcy10b2dldGhlcjsg bXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNjaWktdGhlbWUtZm9udDogbWFq b3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNv LWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5 OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1iaWRpLWZv bnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDogbWFqb3It YmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogRU4t VVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiA5OyBtc28t c3R5bGUtbGluazogIkhlYWRpbmcgOSBDaGFyIjsgbXNvLXN0eWxlLW5leHQ6IE5vcm1hbDsgbXNv LW91dGxpbmUtbGV2ZWw6IDk7IG1zby10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXN0eWxlLW5vc2hv dzogeWVzOyBtc28tdGhlbWV0aW50OiAxOTENCn0NCkRJVi5Nc29IZWFkaW5nOSB7DQoJUEFHRS1C UkVBSy1BRlRFUjogYXZvaWQ7IExJTkUtSEVJR0hUOiAxMTUlOyBGT05ULVNUWUxFOiBpdGFsaWM7 IE1BUkdJTjogMTBwdCAwY20gMHB0OyBGT05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IENP TE9SOiAjNDA0MDQwOyBGT05ULVNJWkU6IDEwcHQ7IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1z by1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4gbGluZXMtdG9nZXRoZXI7IG1zby1hc2NpaS1mb250 LWZhbWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1l LWZvbnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNv LWhhbnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRp bWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1zby1hbnNp LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1s YW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogOTsgbXNvLXN0eWxlLWxpbms6ICJI ZWFkaW5nIDkgQ2hhciI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby1vdXRsaW5lLWxldmVs OiA5OyBtc28tdGhlbWVjb2xvcjogdGV4dDE7IG1zby1zdHlsZS1ub3Nob3c6IHllczsgbXNvLXRo ZW1ldGludDogMTkxDQp9DQpQLk1zb0NhcHRpb24gew0KCUxJTkUtSEVJR0hUOiBub3JtYWw7IE1B UkdJTjogMGNtIDBjbSAxMHB0OyBGT05ULUZBTUlMWTogIkNhbGlicmkiLCJzYW5zLXNlcmlmIjsg Q09MT1I6ICNmMDdmMDk7IEZPTlQtU0laRTogOXB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNvLXN0 eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWFzY2lp LWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tYXNjaWktdGhlbWUtZm9udDogbWlub3ItbGF0aW47 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3Qt dGhlbWUtZm9udDogbWlub3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYWxpYnJp OyBtc28taGFuc2ktdGhlbWUtZm9udDogbWlub3ItbGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5 OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDogbWlub3ItYmlkaTsgbXNv LWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1i aWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiAzNTsgbXNvLXN0eWxlLW5l eHQ6IE5vcm1hbDsgbXNvLXRoZW1lY29sb3I6IGFjY2VudDE7IG1zby1zdHlsZS1ub3Nob3c6IHll cw0KfQ0KTEkuTXNvQ2FwdGlvbiB7DQoJTElORS1IRUlHSFQ6IG5vcm1hbDsgTUFSR0lOOiAwY20g MGNtIDEwcHQ7IEZPTlQtRkFNSUxZOiAiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOyBDT0xPUjogI2Yw N2YwOTsgRk9OVC1TSVpFOiA5cHQ7IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3R5bGUtcWZvcm1h dDogeWVzOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tYXNjaWktZm9udC1mYW1p bHk6IENhbGlicmk7IG1zby1hc2NpaS10aGVtZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWZhcmVh c3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250 OiBtaW5vci1mYXJlYXN0OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1oYW5z aS10aGVtZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBO ZXcgUm9tYW4iOyBtc28tYmlkaS10aGVtZS1mb250OiBtaW5vci1iaWRpOyBtc28tYW5zaS1sYW5n dWFnZTogRU4tVVM7IG1zby1mYXJlYXN0LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWJpZGktbGFuZ3Vh Z2U6IEVOLVVTOyBtc28tc3R5bGUtcHJpb3JpdHk6IDM1OyBtc28tc3R5bGUtbmV4dDogTm9ybWFs OyBtc28tdGhlbWVjb2xvcjogYWNjZW50MTsgbXNvLXN0eWxlLW5vc2hvdzogeWVzDQp9DQpESVYu TXNvQ2FwdGlvbiB7DQoJTElORS1IRUlHSFQ6IG5vcm1hbDsgTUFSR0lOOiAwY20gMGNtIDEwcHQ7 IEZPTlQtRkFNSUxZOiAiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOyBDT0xPUjogI2YwN2YwOTsgRk9O VC1TSVpFOiA5cHQ7IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3R5bGUtcWZvcm1hdDogeWVzOyBt c28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbGli cmk7IG1zby1hc2NpaS10aGVtZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWZhcmVhc3QtZm9udC1m YW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtaW5vci1m YXJlYXN0OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1oYW5zaS10aGVtZS1m b250OiBtaW5vci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4i OyBtc28tYmlkaS10aGVtZS1mb250OiBtaW5vci1iaWRpOyBtc28tYW5zaS1sYW5ndWFnZTogRU4t VVM7IG1zby1mYXJlYXN0LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWJpZGktbGFuZ3VhZ2U6IEVOLVVT OyBtc28tc3R5bGUtcHJpb3JpdHk6IDM1OyBtc28tc3R5bGUtbmV4dDogTm9ybWFsOyBtc28tdGhl bWVjb2xvcjogYWNjZW50MTsgbXNvLXN0eWxlLW5vc2hvdzogeWVzDQp9DQpQLk1zb1RpdGxlIHsN CglCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZTsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQ QURESU5HLUJPVFRPTTogMGNtOyBMSU5FLUhFSUdIVDogbm9ybWFsOyBNQVJHSU46IDBjbSAwY20g MTVwdDsgUEFERElORy1MRUZUOiAwY207IFBBRERJTkctUklHSFQ6IDBjbTsgRk9OVC1GQU1JTFk6 ICJDYW1icmlhIiwic2VyaWYiOyBMRVRURVItU1BBQ0lORzogMC4yNXB0OyBDT0xPUjogIzI1MjUy NTsgRk9OVC1TSVpFOiAyNnB0OyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgQk9SREVSLVJJR0hU OiBtZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBjbTsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1z by1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1h c2NpaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxh dGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJl YXN0LXRoZW1lLWZvbnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2Ft YnJpYTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZh bWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7 IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBt c28tYmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogMTA7IG1zby1zdHls ZS1saW5rOiAiVGl0bGUgQ2hhciI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby10aGVtZWNv bG9yOiB0ZXh0MjsgbXNvLXRoZW1lc2hhZGU6IDE5MTsgbXNvLWZvbnQta2VybmluZzogMTQuMHB0 OyBtc28tYWRkLXNwYWNlOiBhdXRvOyBtc28tYm9yZGVyLWJvdHRvbS1hbHQ6IHNvbGlkICNGMDdG MDkgMS4wcHQ7IG1zby1ib3JkZXItYm90dG9tLXRoZW1lY29sb3I6IGFjY2VudDE7IG1zby1wYWRk aW5nLWFsdDogMGNtIDBjbSA0LjBwdCAwY20NCn0NCkxJLk1zb1RpdGxlIHsNCglCT1JERVItQk9U VE9NOiBtZWRpdW0gbm9uZTsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLUJPVFRP TTogMGNtOyBMSU5FLUhFSUdIVDogbm9ybWFsOyBNQVJHSU46IDBjbSAwY20gMTVwdDsgUEFERElO Ry1MRUZUOiAwY207IFBBRERJTkctUklHSFQ6IDBjbTsgRk9OVC1GQU1JTFk6ICJDYW1icmlhIiwi c2VyaWYiOyBMRVRURVItU1BBQ0lORzogMC4yNXB0OyBDT0xPUjogIzI1MjUyNTsgRk9OVC1TSVpF OiAyNnB0OyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9u ZTsgUEFERElORy1UT1A6IDBjbTsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHlsZS1xZm9y bWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1hc2NpaS1mb250LWZh bWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZv bnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWhh bnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVz IE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1zby1hbnNpLWxh bmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1sYW5n dWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogMTA7IG1zby1zdHlsZS1saW5rOiAiVGl0 bGUgQ2hhciI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby10aGVtZWNvbG9yOiB0ZXh0Mjsg bXNvLXRoZW1lc2hhZGU6IDE5MTsgbXNvLWZvbnQta2VybmluZzogMTQuMHB0OyBtc28tYWRkLXNw YWNlOiBhdXRvOyBtc28tYm9yZGVyLWJvdHRvbS1hbHQ6IHNvbGlkICNGMDdGMDkgMS4wcHQ7IG1z by1ib3JkZXItYm90dG9tLXRoZW1lY29sb3I6IGFjY2VudDE7IG1zby1wYWRkaW5nLWFsdDogMGNt IDBjbSA0LjBwdCAwY20NCn0NCkRJVi5Nc29UaXRsZSB7DQoJQk9SREVSLUJPVFRPTTogbWVkaXVt IG5vbmU7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1CT1RUT006IDBjbTsgTElO RS1IRUlHSFQ6IG5vcm1hbDsgTUFSR0lOOiAwY20gMGNtIDE1cHQ7IFBBRERJTkctTEVGVDogMGNt OyBQQURESU5HLVJJR0hUOiAwY207IEZPTlQtRkFNSUxZOiAiQ2FtYnJpYSIsInNlcmlmIjsgTEVU VEVSLVNQQUNJTkc6IDAuMjVwdDsgQ09MT1I6ICMyNTI1MjU7IEZPTlQtU0laRTogMjZwdDsgQk9S REVSLVRPUDogbWVkaXVtIG5vbmU7IEJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkct VE9QOiAwY207IG1zby1zdHlsZS11bmhpZGU6IG5vOyBtc28tc3R5bGUtcWZvcm1hdDogeWVzOyBt c28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbWJy aWE7IG1zby1hc2NpaS10aGVtZS1mb250OiBtYWpvci1sYXRpbjsgbXNvLWZhcmVhc3QtZm9udC1m YW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtYWpvci1m YXJlYXN0OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbWJyaWE7IG1zby1oYW5zaS10aGVtZS1m b250OiBtYWpvci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4i OyBtc28tYmlkaS10aGVtZS1mb250OiBtYWpvci1iaWRpOyBtc28tYW5zaS1sYW5ndWFnZTogRU4t VVM7IG1zby1mYXJlYXN0LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWJpZGktbGFuZ3VhZ2U6IEVOLVVT OyBtc28tc3R5bGUtcHJpb3JpdHk6IDEwOyBtc28tc3R5bGUtbGluazogIlRpdGxlIENoYXIiOyBt c28tc3R5bGUtbmV4dDogTm9ybWFsOyBtc28tdGhlbWVjb2xvcjogdGV4dDI7IG1zby10aGVtZXNo YWRlOiAxOTE7IG1zby1mb250LWtlcm5pbmc6IDE0LjBwdDsgbXNvLWFkZC1zcGFjZTogYXV0bzsg bXNvLWJvcmRlci1ib3R0b20tYWx0OiBzb2xpZCAjRjA3RjA5IDEuMHB0OyBtc28tYm9yZGVyLWJv dHRvbS10aGVtZWNvbG9yOiBhY2NlbnQxOyBtc28tcGFkZGluZy1hbHQ6IDBjbSAwY20gNC4wcHQg MGNtDQp9DQpQLk1zb1RpdGxlQ3hTcEZpcnN0IHsNCglCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9u ZTsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLUJPVFRPTTogMGNtOyBMSU5FLUhF SUdIVDogbm9ybWFsOyBNQVJHSU46IDBjbSAwY20gMHB0OyBQQURESU5HLUxFRlQ6IDBjbTsgUEFE RElORy1SSUdIVDogMGNtOyBGT05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IExFVFRFUi1T UEFDSU5HOiAwLjI1cHQ7IENPTE9SOiAjMjUyNTI1OyBGT05ULVNJWkU6IDI2cHQ7IEJPUkRFUi1U T1A6IG1lZGl1bSBub25lOyBCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDog MGNtOyBtc28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBh Z2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBt c28tYXNjaWktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFz dDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDog bWFqb3ItbGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNv LWJpZGktdGhlbWUtZm9udDogbWFqb3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBt c28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNv LXN0eWxlLXByaW9yaXR5OiAxMDsgbXNvLXN0eWxlLWxpbms6ICJUaXRsZSBDaGFyIjsgbXNvLXN0 eWxlLW5leHQ6IE5vcm1hbDsgbXNvLXRoZW1lY29sb3I6IHRleHQyOyBtc28tdGhlbWVzaGFkZTog MTkxOyBtc28tZm9udC1rZXJuaW5nOiAxNC4wcHQ7IG1zby1hZGQtc3BhY2U6IGF1dG87IG1zby1i b3JkZXItYm90dG9tLWFsdDogc29saWQgI0YwN0YwOSAxLjBwdDsgbXNvLWJvcmRlci1ib3R0b20t dGhlbWVjb2xvcjogYWNjZW50MTsgbXNvLXBhZGRpbmctYWx0OiAwY20gMGNtIDQuMHB0IDBjbTsg bXNvLXN0eWxlLXR5cGU6IGV4cG9ydC1vbmx5DQp9DQpMSS5Nc29UaXRsZUN4U3BGaXJzdCB7DQoJ Qk9SREVSLUJPVFRPTTogbWVkaXVtIG5vbmU7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFE RElORy1CT1RUT006IDBjbTsgTElORS1IRUlHSFQ6IG5vcm1hbDsgTUFSR0lOOiAwY20gMGNtIDBw dDsgUEFERElORy1MRUZUOiAwY207IFBBRERJTkctUklHSFQ6IDBjbTsgRk9OVC1GQU1JTFk6ICJD YW1icmlhIiwic2VyaWYiOyBMRVRURVItU1BBQ0lORzogMC4yNXB0OyBDT0xPUjogIzI1MjUyNTsg Rk9OVC1TSVpFOiAyNnB0OyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgQk9SREVSLVJJR0hUOiBt ZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBjbTsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1z dHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1hc2Np aS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGlu OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0 LXRoZW1lLWZvbnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJp YTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWls eTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1z by1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28t YmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogMTA7IG1zby1zdHlsZS1s aW5rOiAiVGl0bGUgQ2hhciI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby10aGVtZWNvbG9y OiB0ZXh0MjsgbXNvLXRoZW1lc2hhZGU6IDE5MTsgbXNvLWZvbnQta2VybmluZzogMTQuMHB0OyBt c28tYWRkLXNwYWNlOiBhdXRvOyBtc28tYm9yZGVyLWJvdHRvbS1hbHQ6IHNvbGlkICNGMDdGMDkg MS4wcHQ7IG1zby1ib3JkZXItYm90dG9tLXRoZW1lY29sb3I6IGFjY2VudDE7IG1zby1wYWRkaW5n LWFsdDogMGNtIDBjbSA0LjBwdCAwY207IG1zby1zdHlsZS10eXBlOiBleHBvcnQtb25seQ0KfQ0K RElWLk1zb1RpdGxlQ3hTcEZpcnN0IHsNCglCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZTsgQk9S REVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLUJPVFRPTTogMGNtOyBMSU5FLUhFSUdIVDog bm9ybWFsOyBNQVJHSU46IDBjbSAwY20gMHB0OyBQQURESU5HLUxFRlQ6IDBjbTsgUEFERElORy1S SUdIVDogMGNtOyBGT05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IExFVFRFUi1TUEFDSU5H OiAwLjI1cHQ7IENPTE9SOiAjMjUyNTI1OyBGT05ULVNJWkU6IDI2cHQ7IEJPUkRFUi1UT1A6IG1l ZGl1bSBub25lOyBCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGNtOyBt c28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRp b246IHdpZG93LW9ycGhhbjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNj aWktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGlt ZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNv LWhhbnNpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3It bGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGkt dGhlbWUtZm9udDogbWFqb3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFy ZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxl LXByaW9yaXR5OiAxMDsgbXNvLXN0eWxlLWxpbms6ICJUaXRsZSBDaGFyIjsgbXNvLXN0eWxlLW5l eHQ6IE5vcm1hbDsgbXNvLXRoZW1lY29sb3I6IHRleHQyOyBtc28tdGhlbWVzaGFkZTogMTkxOyBt c28tZm9udC1rZXJuaW5nOiAxNC4wcHQ7IG1zby1hZGQtc3BhY2U6IGF1dG87IG1zby1ib3JkZXIt Ym90dG9tLWFsdDogc29saWQgI0YwN0YwOSAxLjBwdDsgbXNvLWJvcmRlci1ib3R0b20tdGhlbWVj b2xvcjogYWNjZW50MTsgbXNvLXBhZGRpbmctYWx0OiAwY20gMGNtIDQuMHB0IDBjbTsgbXNvLXN0 eWxlLXR5cGU6IGV4cG9ydC1vbmx5DQp9DQpQLk1zb1RpdGxlQ3hTcE1pZGRsZSB7DQoJQk9SREVS LUJPVFRPTTogbWVkaXVtIG5vbmU7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1C T1RUT006IDBjbTsgTElORS1IRUlHSFQ6IG5vcm1hbDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgUEFE RElORy1MRUZUOiAwY207IFBBRERJTkctUklHSFQ6IDBjbTsgRk9OVC1GQU1JTFk6ICJDYW1icmlh Iiwic2VyaWYiOyBMRVRURVItU1BBQ0lORzogMC4yNXB0OyBDT0xPUjogIzI1MjUyNTsgRk9OVC1T SVpFOiAyNnB0OyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgQk9SREVSLVJJR0hUOiBtZWRpdW0g bm9uZTsgUEFERElORy1UT1A6IDBjbTsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHlsZS1x Zm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1hc2NpaS1mb250 LWZhbWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1l LWZvbnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNv LWhhbnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRp bWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1zby1hbnNp LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1s YW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogMTA7IG1zby1zdHlsZS1saW5rOiAi VGl0bGUgQ2hhciI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby10aGVtZWNvbG9yOiB0ZXh0 MjsgbXNvLXRoZW1lc2hhZGU6IDE5MTsgbXNvLWZvbnQta2VybmluZzogMTQuMHB0OyBtc28tYWRk LXNwYWNlOiBhdXRvOyBtc28tYm9yZGVyLWJvdHRvbS1hbHQ6IHNvbGlkICNGMDdGMDkgMS4wcHQ7 IG1zby1ib3JkZXItYm90dG9tLXRoZW1lY29sb3I6IGFjY2VudDE7IG1zby1wYWRkaW5nLWFsdDog MGNtIDBjbSA0LjBwdCAwY207IG1zby1zdHlsZS10eXBlOiBleHBvcnQtb25seQ0KfQ0KTEkuTXNv VGl0bGVDeFNwTWlkZGxlIHsNCglCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZTsgQk9SREVSLUxF RlQ6IG1lZGl1bSBub25lOyBQQURESU5HLUJPVFRPTTogMGNtOyBMSU5FLUhFSUdIVDogbm9ybWFs OyBNQVJHSU46IDBjbSAwY20gMHB0OyBQQURESU5HLUxFRlQ6IDBjbTsgUEFERElORy1SSUdIVDog MGNtOyBGT05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IExFVFRFUi1TUEFDSU5HOiAwLjI1 cHQ7IENPTE9SOiAjMjUyNTI1OyBGT05ULVNJWkU6IDI2cHQ7IEJPUkRFUi1UT1A6IG1lZGl1bSBu b25lOyBCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGNtOyBtc28tc3R5 bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRpb246IHdp ZG93LW9ycGhhbjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNjaWktdGhl bWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3 IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNvLWhhbnNp LWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47 IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUt Zm9udDogbWFqb3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1s YW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9y aXR5OiAxMDsgbXNvLXN0eWxlLWxpbms6ICJUaXRsZSBDaGFyIjsgbXNvLXN0eWxlLW5leHQ6IE5v cm1hbDsgbXNvLXRoZW1lY29sb3I6IHRleHQyOyBtc28tdGhlbWVzaGFkZTogMTkxOyBtc28tZm9u dC1rZXJuaW5nOiAxNC4wcHQ7IG1zby1hZGQtc3BhY2U6IGF1dG87IG1zby1ib3JkZXItYm90dG9t LWFsdDogc29saWQgI0YwN0YwOSAxLjBwdDsgbXNvLWJvcmRlci1ib3R0b20tdGhlbWVjb2xvcjog YWNjZW50MTsgbXNvLXBhZGRpbmctYWx0OiAwY20gMGNtIDQuMHB0IDBjbTsgbXNvLXN0eWxlLXR5 cGU6IGV4cG9ydC1vbmx5DQp9DQpESVYuTXNvVGl0bGVDeFNwTWlkZGxlIHsNCglCT1JERVItQk9U VE9NOiBtZWRpdW0gbm9uZTsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLUJPVFRP TTogMGNtOyBMSU5FLUhFSUdIVDogbm9ybWFsOyBNQVJHSU46IDBjbSAwY20gMHB0OyBQQURESU5H LUxFRlQ6IDBjbTsgUEFERElORy1SSUdIVDogMGNtOyBGT05ULUZBTUlMWTogIkNhbWJyaWEiLCJz ZXJpZiI7IExFVFRFUi1TUEFDSU5HOiAwLjI1cHQ7IENPTE9SOiAjMjUyNTI1OyBGT05ULVNJWkU6 IDI2cHQ7IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBCT1JERVItUklHSFQ6IG1lZGl1bSBub25l OyBQQURESU5HLVRPUDogMGNtOyBtc28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXFmb3Jt YXQ6IHllczsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWFzY2lpLWZvbnQtZmFt aWx5OiBDYW1icmlhOyBtc28tYXNjaWktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9u dDogbWFqb3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFu c2ktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMg TmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDogbWFqb3ItYmlkaTsgbXNvLWFuc2ktbGFu Z3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1 YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiAxMDsgbXNvLXN0eWxlLWxpbms6ICJUaXRs ZSBDaGFyIjsgbXNvLXN0eWxlLW5leHQ6IE5vcm1hbDsgbXNvLXRoZW1lY29sb3I6IHRleHQyOyBt c28tdGhlbWVzaGFkZTogMTkxOyBtc28tZm9udC1rZXJuaW5nOiAxNC4wcHQ7IG1zby1hZGQtc3Bh Y2U6IGF1dG87IG1zby1ib3JkZXItYm90dG9tLWFsdDogc29saWQgI0YwN0YwOSAxLjBwdDsgbXNv LWJvcmRlci1ib3R0b20tdGhlbWVjb2xvcjogYWNjZW50MTsgbXNvLXBhZGRpbmctYWx0OiAwY20g MGNtIDQuMHB0IDBjbTsgbXNvLXN0eWxlLXR5cGU6IGV4cG9ydC1vbmx5DQp9DQpQLk1zb1RpdGxl Q3hTcExhc3Qgew0KCUJPUkRFUi1CT1RUT006IG1lZGl1bSBub25lOyBCT1JERVItTEVGVDogbWVk aXVtIG5vbmU7IFBBRERJTkctQk9UVE9NOiAwY207IExJTkUtSEVJR0hUOiBub3JtYWw7IE1BUkdJ TjogMGNtIDBjbSAxNXB0OyBQQURESU5HLUxFRlQ6IDBjbTsgUEFERElORy1SSUdIVDogMGNtOyBG T05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IExFVFRFUi1TUEFDSU5HOiAwLjI1cHQ7IENP TE9SOiAjMjUyNTI1OyBGT05ULVNJWkU6IDI2cHQ7IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBC T1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGNtOyBtc28tc3R5bGUtdW5o aWRlOiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9y cGhhbjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNjaWktdGhlbWUtZm9u dDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFu IjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQt ZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1i aWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDog bWFqb3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFn ZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiAx MDsgbXNvLXN0eWxlLWxpbms6ICJUaXRsZSBDaGFyIjsgbXNvLXN0eWxlLW5leHQ6IE5vcm1hbDsg bXNvLXRoZW1lY29sb3I6IHRleHQyOyBtc28tdGhlbWVzaGFkZTogMTkxOyBtc28tZm9udC1rZXJu aW5nOiAxNC4wcHQ7IG1zby1hZGQtc3BhY2U6IGF1dG87IG1zby1ib3JkZXItYm90dG9tLWFsdDog c29saWQgI0YwN0YwOSAxLjBwdDsgbXNvLWJvcmRlci1ib3R0b20tdGhlbWVjb2xvcjogYWNjZW50 MTsgbXNvLXBhZGRpbmctYWx0OiAwY20gMGNtIDQuMHB0IDBjbTsgbXNvLXN0eWxlLXR5cGU6IGV4 cG9ydC1vbmx5DQp9DQpMSS5Nc29UaXRsZUN4U3BMYXN0IHsNCglCT1JERVItQk9UVE9NOiBtZWRp dW0gbm9uZTsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLUJPVFRPTTogMGNtOyBM SU5FLUhFSUdIVDogbm9ybWFsOyBNQVJHSU46IDBjbSAwY20gMTVwdDsgUEFERElORy1MRUZUOiAw Y207IFBBRERJTkctUklHSFQ6IDBjbTsgRk9OVC1GQU1JTFk6ICJDYW1icmlhIiwic2VyaWYiOyBM RVRURVItU1BBQ0lORzogMC4yNXB0OyBDT0xPUjogIzI1MjUyNTsgRk9OVC1TSVpFOiAyNnB0OyBC T1JERVItVE9QOiBtZWRpdW0gbm9uZTsgQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElO Ry1UT1A6IDBjbTsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7 IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2Ft YnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1ham9y LWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWhhbnNpLXRoZW1l LWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21h biI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1zby1hbnNpLWxhbmd1YWdlOiBF Ti1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTogRU4t VVM7IG1zby1zdHlsZS1wcmlvcml0eTogMTA7IG1zby1zdHlsZS1saW5rOiAiVGl0bGUgQ2hhciI7 IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby10aGVtZWNvbG9yOiB0ZXh0MjsgbXNvLXRoZW1l c2hhZGU6IDE5MTsgbXNvLWZvbnQta2VybmluZzogMTQuMHB0OyBtc28tYWRkLXNwYWNlOiBhdXRv OyBtc28tYm9yZGVyLWJvdHRvbS1hbHQ6IHNvbGlkICNGMDdGMDkgMS4wcHQ7IG1zby1ib3JkZXIt Ym90dG9tLXRoZW1lY29sb3I6IGFjY2VudDE7IG1zby1wYWRkaW5nLWFsdDogMGNtIDBjbSA0LjBw dCAwY207IG1zby1zdHlsZS10eXBlOiBleHBvcnQtb25seQ0KfQ0KRElWLk1zb1RpdGxlQ3hTcExh c3Qgew0KCUJPUkRFUi1CT1RUT006IG1lZGl1bSBub25lOyBCT1JERVItTEVGVDogbWVkaXVtIG5v bmU7IFBBRERJTkctQk9UVE9NOiAwY207IExJTkUtSEVJR0hUOiBub3JtYWw7IE1BUkdJTjogMGNt IDBjbSAxNXB0OyBQQURESU5HLUxFRlQ6IDBjbTsgUEFERElORy1SSUdIVDogMGNtOyBGT05ULUZB TUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IExFVFRFUi1TUEFDSU5HOiAwLjI1cHQ7IENPTE9SOiAj MjUyNTI1OyBGT05ULVNJWkU6IDI2cHQ7IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBCT1JERVIt UklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGNtOyBtc28tc3R5bGUtdW5oaWRlOiBu bzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsg bXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNjaWktdGhlbWUtZm9udDogbWFq b3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNv LWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5 OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1iaWRpLWZv bnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDogbWFqb3It YmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogRU4t VVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiAxMDsgbXNv LXN0eWxlLWxpbms6ICJUaXRsZSBDaGFyIjsgbXNvLXN0eWxlLW5leHQ6IE5vcm1hbDsgbXNvLXRo ZW1lY29sb3I6IHRleHQyOyBtc28tdGhlbWVzaGFkZTogMTkxOyBtc28tZm9udC1rZXJuaW5nOiAx NC4wcHQ7IG1zby1hZGQtc3BhY2U6IGF1dG87IG1zby1ib3JkZXItYm90dG9tLWFsdDogc29saWQg I0YwN0YwOSAxLjBwdDsgbXNvLWJvcmRlci1ib3R0b20tdGhlbWVjb2xvcjogYWNjZW50MTsgbXNv LXBhZGRpbmctYWx0OiAwY20gMGNtIDQuMHB0IDBjbTsgbXNvLXN0eWxlLXR5cGU6IGV4cG9ydC1v bmx5DQp9DQpQLk1zb1N1YnRpdGxlIHsNCglMSU5FLUhFSUdIVDogMTE1JTsgRk9OVC1TVFlMRTog aXRhbGljOyBNQVJHSU46IDBjbSAwY20gMTBwdDsgRk9OVC1GQU1JTFk6ICJDYW1icmlhIiwic2Vy aWYiOyBMRVRURVItU1BBQ0lORzogMC43NXB0OyBDT0xPUjogI2YwN2YwOTsgRk9OVC1TSVpFOiAx MnB0OyBtc28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBh Z2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBt c28tYXNjaWktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFz dDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDog bWFqb3ItbGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNv LWJpZGktdGhlbWUtZm9udDogbWFqb3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBt c28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNv LXN0eWxlLXByaW9yaXR5OiAxMTsgbXNvLXN0eWxlLWxpbms6ICJTdWJ0aXRsZSBDaGFyIjsgbXNv LXN0eWxlLW5leHQ6IE5vcm1hbDsgbXNvLXRoZW1lY29sb3I6IGFjY2VudDENCn0NCkxJLk1zb1N1 YnRpdGxlIHsNCglMSU5FLUhFSUdIVDogMTE1JTsgRk9OVC1TVFlMRTogaXRhbGljOyBNQVJHSU46 IDBjbSAwY20gMTBwdDsgRk9OVC1GQU1JTFk6ICJDYW1icmlhIiwic2VyaWYiOyBMRVRURVItU1BB Q0lORzogMC43NXB0OyBDT0xPUjogI2YwN2YwOTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3R5bGUt dW5oaWRlOiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRpb246IHdpZG93 LW9ycGhhbjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNjaWktdGhlbWUt Zm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJv bWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZv bnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1z by1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9u dDogbWFqb3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5n dWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5 OiAxMTsgbXNvLXN0eWxlLWxpbms6ICJTdWJ0aXRsZSBDaGFyIjsgbXNvLXN0eWxlLW5leHQ6IE5v cm1hbDsgbXNvLXRoZW1lY29sb3I6IGFjY2VudDENCn0NCkRJVi5Nc29TdWJ0aXRsZSB7DQoJTElO RS1IRUlHSFQ6IDExNSU7IEZPTlQtU1RZTEU6IGl0YWxpYzsgTUFSR0lOOiAwY20gMGNtIDEwcHQ7 IEZPTlQtRkFNSUxZOiAiQ2FtYnJpYSIsInNlcmlmIjsgTEVUVEVSLVNQQUNJTkc6IDAuNzVwdDsg Q09MT1I6ICNmMDdmMDk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1z by1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1h c2NpaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxh dGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJl YXN0LXRoZW1lLWZvbnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2Ft YnJpYTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZh bWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7 IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBt c28tYmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogMTE7IG1zby1zdHls ZS1saW5rOiAiU3VidGl0bGUgQ2hhciI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby10aGVt ZWNvbG9yOiBhY2NlbnQxDQp9DQpBOmxpbmsgew0KCUNPTE9SOiBibHVlOyBURVhULURFQ09SQVRJ T046IHVuZGVybGluZTsgbXNvLXN0eWxlLXByaW9yaXR5OiA5OTsgbXNvLXN0eWxlLW5vc2hvdzog eWVzOyB0ZXh0LXVuZGVybGluZTogc2luZ2xlDQp9DQpTUEFOLk1zb0h5cGVybGluayB7DQoJQ09M T1I6IGJsdWU7IFRFWFQtREVDT1JBVElPTjogdW5kZXJsaW5lOyBtc28tc3R5bGUtcHJpb3JpdHk6 IDk5OyBtc28tc3R5bGUtbm9zaG93OiB5ZXM7IHRleHQtdW5kZXJsaW5lOiBzaW5nbGUNCn0NCkE6 dmlzaXRlZCB7DQoJQ09MT1I6IHB1cnBsZTsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmU7IG1z by1zdHlsZS1wcmlvcml0eTogOTk7IG1zby1zdHlsZS1ub3Nob3c6IHllczsgdGV4dC11bmRlcmxp bmU6IHNpbmdsZQ0KfQ0KU1BBTi5Nc29IeXBlcmxpbmtGb2xsb3dlZCB7DQoJQ09MT1I6IHB1cnBs ZTsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmU7IG1zby1zdHlsZS1wcmlvcml0eTogOTk7IG1z by1zdHlsZS1ub3Nob3c6IHllczsgdGV4dC11bmRlcmxpbmU6IHNpbmdsZQ0KfQ0KUCB7DQoJTElO RS1IRUlHSFQ6IDExNSU7IEZPTlQtRkFNSUxZOiAiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOyBNQVJH SU4tTEVGVDogMGNtOyBGT05ULVNJWkU6IDExcHQ7IE1BUkdJTi1SSUdIVDogMGNtOyBtc28tcGFn aW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbGlicmk7IG1z by1hc2NpaS10aGVtZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtaW5vci1mYXJlYXN0 OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1oYW5zaS10aGVtZS1mb250OiBt aW5vci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28t YmlkaS10aGVtZS1mb250OiBtaW5vci1iaWRpOyBtc28tYW5zaS1sYW5ndWFnZTogRU4tVVM7IG1z by1mYXJlYXN0LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWJpZGktbGFuZ3VhZ2U6IEVOLVVTOyBtc28t c3R5bGUtcHJpb3JpdHk6IDk5OyBtc28tbWFyZ2luLXRvcC1hbHQ6IGF1dG87IG1zby1tYXJnaW4t Ym90dG9tLWFsdDogYXV0bw0KfQ0KUC5Nc29BY2V0YXRlIHsNCglMSU5FLUhFSUdIVDogMTE1JTsg TUFSR0lOOiAwY20gMGNtIDEwcHQ7IEZPTlQtRkFNSUxZOiAiVGFob21hIiwic2Fucy1zZXJpZiI7 IEZPTlQtU0laRTogOHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tZmFyZWFz dC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6 IG1pbm9yLWZhcmVhc3Q7IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFu Z3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0 eTogOTk7IG1zby1zdHlsZS1saW5rOiAiQmFsbG9vbiBUZXh0IENoYXIiOyBtc28tc3R5bGUtbm9z aG93OiB5ZXMNCn0NCkxJLk1zb0FjZXRhdGUgew0KCUxJTkUtSEVJR0hUOiAxMTUlOyBNQVJHSU46 IDBjbSAwY20gMTBwdDsgRk9OVC1GQU1JTFk6ICJUYWhvbWEiLCJzYW5zLXNlcmlmIjsgRk9OVC1T SVpFOiA4cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1mYXJlYXN0LWZvbnQt ZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWlub3It ZmFyZWFzdDsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTog RU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiA5OTsg bXNvLXN0eWxlLWxpbms6ICJCYWxsb29uIFRleHQgQ2hhciI7IG1zby1zdHlsZS1ub3Nob3c6IHll cw0KfQ0KRElWLk1zb0FjZXRhdGUgew0KCUxJTkUtSEVJR0hUOiAxMTUlOyBNQVJHSU46IDBjbSAw Y20gMTBwdDsgRk9OVC1GQU1JTFk6ICJUYWhvbWEiLCJzYW5zLXNlcmlmIjsgRk9OVC1TSVpFOiA4 cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWlub3ItZmFyZWFz dDsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7 IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiA5OTsgbXNvLXN0 eWxlLWxpbms6ICJCYWxsb29uIFRleHQgQ2hhciI7IG1zby1zdHlsZS1ub3Nob3c6IHllcw0KfQ0K UC5Nc29Ob1NwYWNpbmcgew0KCUxJTkUtSEVJR0hUOiBub3JtYWw7IE1BUkdJTjogMGNtIDBjbSAw cHQ7IEZPTlQtRkFNSUxZOiAiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOyBGT05ULVNJWkU6IDExcHQ7 IG1zby1zdHlsZS11bmhpZGU6IG5vOyBtc28tc3R5bGUtcWZvcm1hdDogeWVzOyBtc28tc3R5bGUt cGFyZW50OiAiIjsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWFzY2lpLWZvbnQt ZmFtaWx5OiBDYWxpYnJpOyBtc28tYXNjaWktdGhlbWUtZm9udDogbWlub3ItbGF0aW47IG1zby1m YXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUt Zm9udDogbWlub3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28t aGFuc2ktdGhlbWUtZm9udDogbWlub3ItbGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGlt ZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDogbWlub3ItYmlkaTsgbXNvLWFuc2kt bGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxh bmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiAxOyBtc28tc3R5bGUtbGluazogIk5v IFNwYWNpbmcgQ2hhciINCn0NCkxJLk1zb05vU3BhY2luZyB7DQoJTElORS1IRUlHSFQ6IG5vcm1h bDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgRk9OVC1GQU1JTFk6ICJDYWxpYnJpIiwic2Fucy1zZXJp ZiI7IEZPTlQtU0laRTogMTFwdDsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHlsZS1xZm9y bWF0OiB5ZXM7IG1zby1zdHlsZS1wYXJlbnQ6ICIiOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3Jw aGFuOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1hc2NpaS10aGVtZS1mb250 OiBtaW5vci1sYXRpbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4i OyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtaW5vci1mYXJlYXN0OyBtc28taGFuc2ktZm9udC1m YW1pbHk6IENhbGlicmk7IG1zby1oYW5zaS10aGVtZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWJp ZGktZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tYmlkaS10aGVtZS1mb250OiBt aW5vci1iaWRpOyBtc28tYW5zaS1sYW5ndWFnZTogRU4tVVM7IG1zby1mYXJlYXN0LWxhbmd1YWdl OiBFTi1VUzsgbXNvLWJpZGktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tc3R5bGUtcHJpb3JpdHk6IDE7 IG1zby1zdHlsZS1saW5rOiAiTm8gU3BhY2luZyBDaGFyIg0KfQ0KRElWLk1zb05vU3BhY2luZyB7 DQoJTElORS1IRUlHSFQ6IG5vcm1hbDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgRk9OVC1GQU1JTFk6 ICJDYWxpYnJpIiwic2Fucy1zZXJpZiI7IEZPTlQtU0laRTogMTFwdDsgbXNvLXN0eWxlLXVuaGlk ZTogbm87IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1zdHlsZS1wYXJlbnQ6ICIiOyBtc28t cGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbGlicmk7 IG1zby1hc2NpaS10aGVtZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtaW5vci1mYXJl YXN0OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1oYW5zaS10aGVtZS1mb250 OiBtaW5vci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBt c28tYmlkaS10aGVtZS1mb250OiBtaW5vci1iaWRpOyBtc28tYW5zaS1sYW5ndWFnZTogRU4tVVM7 IG1zby1mYXJlYXN0LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWJpZGktbGFuZ3VhZ2U6IEVOLVVTOyBt c28tc3R5bGUtcHJpb3JpdHk6IDE7IG1zby1zdHlsZS1saW5rOiAiTm8gU3BhY2luZyBDaGFyIg0K fQ0KUC5Nc29MaXN0UGFyYWdyYXBoIHsNCglMSU5FLUhFSUdIVDogMTE1JTsgTUFSR0lOOiAwY20g MGNtIDEwcHQgMzZwdDsgRk9OVC1GQU1JTFk6ICJDYWxpYnJpIiwic2Fucy1zZXJpZiI7IEZPTlQt U0laRTogMTFwdDsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7 IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2Fs aWJyaTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1pbm9y LWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWhhbnNpLXRoZW1l LWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21h biI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1pbm9yLWJpZGk7IG1zby1hbnNpLWxhbmd1YWdlOiBF Ti1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTogRU4t VVM7IG1zby1zdHlsZS1wcmlvcml0eTogMzQ7IG1zby1hZGQtc3BhY2U6IGF1dG8NCn0NCkxJLk1z b0xpc3RQYXJhZ3JhcGggew0KCUxJTkUtSEVJR0hUOiAxMTUlOyBNQVJHSU46IDBjbSAwY20gMTBw dCAzNnB0OyBGT05ULUZBTUlMWTogIkNhbGlicmkiLCJzYW5zLXNlcmlmIjsgRk9OVC1TSVpFOiAx MXB0OyBtc28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBh Z2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBt c28tYXNjaWktdGhlbWUtZm9udDogbWlub3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWlub3ItZmFyZWFz dDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28taGFuc2ktdGhlbWUtZm9udDog bWlub3ItbGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNv LWJpZGktdGhlbWUtZm9udDogbWlub3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBt c28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNv LXN0eWxlLXByaW9yaXR5OiAzNDsgbXNvLWFkZC1zcGFjZTogYXV0bw0KfQ0KRElWLk1zb0xpc3RQ YXJhZ3JhcGggew0KCUxJTkUtSEVJR0hUOiAxMTUlOyBNQVJHSU46IDBjbSAwY20gMTBwdCAzNnB0 OyBGT05ULUZBTUlMWTogIkNhbGlicmkiLCJzYW5zLXNlcmlmIjsgRk9OVC1TSVpFOiAxMXB0OyBt c28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRp b246IHdpZG93LW9ycGhhbjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tYXNj aWktdGhlbWUtZm9udDogbWlub3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGlt ZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWlub3ItZmFyZWFzdDsgbXNv LWhhbnNpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWlub3It bGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGkt dGhlbWUtZm9udDogbWlub3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFy ZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxl LXByaW9yaXR5OiAzNDsgbXNvLWFkZC1zcGFjZTogYXV0bw0KfQ0KUC5Nc29MaXN0UGFyYWdyYXBo Q3hTcEZpcnN0IHsNCglMSU5FLUhFSUdIVDogMTE1JTsgTUFSR0lOOiAwY20gMGNtIDBwdCAzNnB0 OyBGT05ULUZBTUlMWTogIkNhbGlicmkiLCJzYW5zLXNlcmlmIjsgRk9OVC1TSVpFOiAxMXB0OyBt c28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRp b246IHdpZG93LW9ycGhhbjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tYXNj aWktdGhlbWUtZm9udDogbWlub3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGlt ZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWlub3ItZmFyZWFzdDsgbXNv LWhhbnNpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWlub3It bGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGkt dGhlbWUtZm9udDogbWlub3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFy ZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxl LXByaW9yaXR5OiAzNDsgbXNvLWFkZC1zcGFjZTogYXV0bzsgbXNvLXN0eWxlLXR5cGU6IGV4cG9y dC1vbmx5DQp9DQpMSS5Nc29MaXN0UGFyYWdyYXBoQ3hTcEZpcnN0IHsNCglMSU5FLUhFSUdIVDog MTE1JTsgTUFSR0lOOiAwY20gMGNtIDBwdCAzNnB0OyBGT05ULUZBTUlMWTogIkNhbGlicmkiLCJz YW5zLXNlcmlmIjsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0 eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWFzY2lp LWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tYXNjaWktdGhlbWUtZm9udDogbWlub3ItbGF0aW47 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3Qt dGhlbWUtZm9udDogbWlub3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYWxpYnJp OyBtc28taGFuc2ktdGhlbWUtZm9udDogbWlub3ItbGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5 OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDogbWlub3ItYmlkaTsgbXNv LWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1i aWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiAzNDsgbXNvLWFkZC1zcGFj ZTogYXV0bzsgbXNvLXN0eWxlLXR5cGU6IGV4cG9ydC1vbmx5DQp9DQpESVYuTXNvTGlzdFBhcmFn cmFwaEN4U3BGaXJzdCB7DQoJTElORS1IRUlHSFQ6IDExNSU7IE1BUkdJTjogMGNtIDBjbSAwcHQg MzZwdDsgRk9OVC1GQU1JTFk6ICJDYWxpYnJpIiwic2Fucy1zZXJpZiI7IEZPTlQtU0laRTogMTFw dDsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdp bmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNv LWFzY2lpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog IlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1pbm9yLWZhcmVhc3Q7 IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1p bm9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1i aWRpLXRoZW1lLWZvbnQ6IG1pbm9yLWJpZGk7IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNv LWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1z dHlsZS1wcmlvcml0eTogMzQ7IG1zby1hZGQtc3BhY2U6IGF1dG87IG1zby1zdHlsZS10eXBlOiBl eHBvcnQtb25seQ0KfQ0KUC5Nc29MaXN0UGFyYWdyYXBoQ3hTcE1pZGRsZSB7DQoJTElORS1IRUlH SFQ6IDExNSU7IE1BUkdJTjogMGNtIDBjbSAwcHQgMzZwdDsgRk9OVC1GQU1JTFk6ICJDYWxpYnJp Iiwic2Fucy1zZXJpZiI7IEZPTlQtU0laRTogMTFwdDsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1z by1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1h c2NpaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1pbm9yLWxh dGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJl YXN0LXRoZW1lLWZvbnQ6IG1pbm9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2Fs aWJyaTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tYmlkaS1mb250LWZh bWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1pbm9yLWJpZGk7 IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBt c28tYmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogMzQ7IG1zby1hZGQt c3BhY2U6IGF1dG87IG1zby1zdHlsZS10eXBlOiBleHBvcnQtb25seQ0KfQ0KTEkuTXNvTGlzdFBh cmFncmFwaEN4U3BNaWRkbGUgew0KCUxJTkUtSEVJR0hUOiAxMTUlOyBNQVJHSU46IDBjbSAwY20g MHB0IDM2cHQ7IEZPTlQtRkFNSUxZOiAiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOyBGT05ULVNJWkU6 IDExcHQ7IG1zby1zdHlsZS11bmhpZGU6IG5vOyBtc28tc3R5bGUtcWZvcm1hdDogeWVzOyBtc28t cGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbGlicmk7 IG1zby1hc2NpaS10aGVtZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtaW5vci1mYXJl YXN0OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1oYW5zaS10aGVtZS1mb250 OiBtaW5vci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBt c28tYmlkaS10aGVtZS1mb250OiBtaW5vci1iaWRpOyBtc28tYW5zaS1sYW5ndWFnZTogRU4tVVM7 IG1zby1mYXJlYXN0LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWJpZGktbGFuZ3VhZ2U6IEVOLVVTOyBt c28tc3R5bGUtcHJpb3JpdHk6IDM0OyBtc28tYWRkLXNwYWNlOiBhdXRvOyBtc28tc3R5bGUtdHlw ZTogZXhwb3J0LW9ubHkNCn0NCkRJVi5Nc29MaXN0UGFyYWdyYXBoQ3hTcE1pZGRsZSB7DQoJTElO RS1IRUlHSFQ6IDExNSU7IE1BUkdJTjogMGNtIDBjbSAwcHQgMzZwdDsgRk9OVC1GQU1JTFk6ICJD YWxpYnJpIiwic2Fucy1zZXJpZiI7IEZPTlQtU0laRTogMTFwdDsgbXNvLXN0eWxlLXVuaGlkZTog bm87IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47 IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1p bm9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1z by1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1pbm9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWls eTogQ2FsaWJyaTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tYmlkaS1m b250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1pbm9y LWJpZGk7IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVO LVVTOyBtc28tYmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogMzQ7IG1z by1hZGQtc3BhY2U6IGF1dG87IG1zby1zdHlsZS10eXBlOiBleHBvcnQtb25seQ0KfQ0KUC5Nc29M aXN0UGFyYWdyYXBoQ3hTcExhc3Qgew0KCUxJTkUtSEVJR0hUOiAxMTUlOyBNQVJHSU46IDBjbSAw Y20gMTBwdCAzNnB0OyBGT05ULUZBTUlMWTogIkNhbGlicmkiLCJzYW5zLXNlcmlmIjsgRk9OVC1T SVpFOiAxMXB0OyBtc28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsg bXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYWxp YnJpOyBtc28tYXNjaWktdGhlbWUtZm9udDogbWlub3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQt ZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWlub3It ZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28taGFuc2ktdGhlbWUt Zm9udDogbWlub3ItbGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFu IjsgbXNvLWJpZGktdGhlbWUtZm9udDogbWlub3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVO LVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1V UzsgbXNvLXN0eWxlLXByaW9yaXR5OiAzNDsgbXNvLWFkZC1zcGFjZTogYXV0bzsgbXNvLXN0eWxl LXR5cGU6IGV4cG9ydC1vbmx5DQp9DQpMSS5Nc29MaXN0UGFyYWdyYXBoQ3hTcExhc3Qgew0KCUxJ TkUtSEVJR0hUOiAxMTUlOyBNQVJHSU46IDBjbSAwY20gMTBwdCAzNnB0OyBGT05ULUZBTUlMWTog IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3R5bGUtdW5oaWRl OiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhh bjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tYXNjaWktdGhlbWUtZm9udDog bWlub3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsg bXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWlub3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFt aWx5OiBDYWxpYnJpOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWlub3ItbGF0aW47IG1zby1iaWRp LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDogbWlu b3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFnZTog RU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiAzNDsg bXNvLWFkZC1zcGFjZTogYXV0bzsgbXNvLXN0eWxlLXR5cGU6IGV4cG9ydC1vbmx5DQp9DQpESVYu TXNvTGlzdFBhcmFncmFwaEN4U3BMYXN0IHsNCglMSU5FLUhFSUdIVDogMTE1JTsgTUFSR0lOOiAw Y20gMGNtIDEwcHQgMzZwdDsgRk9OVC1GQU1JTFk6ICJDYWxpYnJpIiwic2Fucy1zZXJpZiI7IEZP TlQtU0laRTogMTFwdDsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHlsZS1xZm9ybWF0OiB5 ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1hc2NpaS1mb250LWZhbWlseTog Q2FsaWJyaTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tZmFyZWFzdC1m b250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1p bm9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWhhbnNpLXRo ZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBS b21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1pbm9yLWJpZGk7IG1zby1hbnNpLWxhbmd1YWdl OiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTog RU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogMzQ7IG1zby1hZGQtc3BhY2U6IGF1dG87IG1zby1z dHlsZS10eXBlOiBleHBvcnQtb25seQ0KfQ0KUC5Nc29RdW90ZSB7DQoJTElORS1IRUlHSFQ6IDEx NSU7IEZPTlQtU1RZTEU6IGl0YWxpYzsgTUFSR0lOOiAwY20gMGNtIDEwcHQ7IEZPTlQtRkFNSUxZ OiAiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOyBDT0xPUjogYmxhY2s7IEZPTlQtU0laRTogMTFwdDsg bXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0 aW9uOiB3aWRvdy1vcnBoYW47IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWFz Y2lpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRp bWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1pbm9yLWZhcmVhc3Q7IG1z by1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1pbm9y LWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRp LXRoZW1lLWZvbnQ6IG1pbm9yLWJpZGk7IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZh cmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHls ZS1wcmlvcml0eTogMjk7IG1zby1zdHlsZS1saW5rOiAiUXVvdGUgQ2hhciI7IG1zby1zdHlsZS1u ZXh0OiBOb3JtYWw7IG1zby10aGVtZWNvbG9yOiB0ZXh0MQ0KfQ0KTEkuTXNvUXVvdGUgew0KCUxJ TkUtSEVJR0hUOiAxMTUlOyBGT05ULVNUWUxFOiBpdGFsaWM7IE1BUkdJTjogMGNtIDBjbSAxMHB0 OyBGT05ULUZBTUlMWTogIkNhbGlicmkiLCJzYW5zLXNlcmlmIjsgQ09MT1I6IGJsYWNrOyBGT05U LVNJWkU6IDExcHQ7IG1zby1zdHlsZS11bmhpZGU6IG5vOyBtc28tc3R5bGUtcWZvcm1hdDogeWVz OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENh bGlicmk7IG1zby1hc2NpaS10aGVtZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtaW5v ci1mYXJlYXN0OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1oYW5zaS10aGVt ZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9t YW4iOyBtc28tYmlkaS10aGVtZS1mb250OiBtaW5vci1iaWRpOyBtc28tYW5zaS1sYW5ndWFnZTog RU4tVVM7IG1zby1mYXJlYXN0LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWJpZGktbGFuZ3VhZ2U6IEVO LVVTOyBtc28tc3R5bGUtcHJpb3JpdHk6IDI5OyBtc28tc3R5bGUtbGluazogIlF1b3RlIENoYXIi OyBtc28tc3R5bGUtbmV4dDogTm9ybWFsOyBtc28tdGhlbWVjb2xvcjogdGV4dDENCn0NCkRJVi5N c29RdW90ZSB7DQoJTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtU1RZTEU6IGl0YWxpYzsgTUFSR0lO OiAwY20gMGNtIDEwcHQ7IEZPTlQtRkFNSUxZOiAiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOyBDT0xP UjogYmxhY2s7IEZPTlQtU0laRTogMTFwdDsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHls ZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1hc2NpaS1m b250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBt c28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRo ZW1lLWZvbnQ6IG1pbm9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaTsg bXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTog IlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1pbm9yLWJpZGk7IG1zby1h bnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlk aS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogMjk7IG1zby1zdHlsZS1saW5r OiAiUXVvdGUgQ2hhciI7IG1zby1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby10aGVtZWNvbG9yOiB0 ZXh0MQ0KfQ0KUC5Nc29JbnRlbnNlUXVvdGUgew0KCUJPUkRFUi1CT1RUT006IG1lZGl1bSBub25l OyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctQk9UVE9NOiAwY207IExJTkUtSEVJ R0hUOiAxMTUlOyBGT05ULVNUWUxFOiBpdGFsaWM7IE1BUkdJTjogMTBwdCA0Ni44cHQgMTRwdDsg UEFERElORy1MRUZUOiAwY207IFBBRERJTkctUklHSFQ6IDBjbTsgRk9OVC1GQU1JTFk6ICJDYWxp YnJpIiwic2Fucy1zZXJpZiI7IENPTE9SOiAjZjA3ZjA5OyBGT05ULVNJWkU6IDExcHQ7IEJPUkRF Ui1UT1A6IG1lZGl1bSBub25lOyBGT05ULVdFSUdIVDogYm9sZDsgQk9SREVSLVJJR0hUOiBtZWRp dW0gbm9uZTsgUEFERElORy1UT1A6IDBjbTsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHls ZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1hc2NpaS1m b250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBt c28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRo ZW1lLWZvbnQ6IG1pbm9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaTsg bXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTog IlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1pbm9yLWJpZGk7IG1zby1h bnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlk aS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogMzA7IG1zby1zdHlsZS1saW5r OiAiSW50ZW5zZSBRdW90ZSBDaGFyIjsgbXNvLXN0eWxlLW5leHQ6IE5vcm1hbDsgbXNvLXRoZW1l Y29sb3I6IGFjY2VudDE7IG1zby1ib3JkZXItYm90dG9tLWFsdDogc29saWQgI0YwN0YwOSAuNXB0 OyBtc28tYm9yZGVyLWJvdHRvbS10aGVtZWNvbG9yOiBhY2NlbnQxOyBtc28tcGFkZGluZy1hbHQ6 IDBjbSAwY20gNC4wcHQgMGNtDQp9DQpMSS5Nc29JbnRlbnNlUXVvdGUgew0KCUJPUkRFUi1CT1RU T006IG1lZGl1bSBub25lOyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctQk9UVE9N OiAwY207IExJTkUtSEVJR0hUOiAxMTUlOyBGT05ULVNUWUxFOiBpdGFsaWM7IE1BUkdJTjogMTBw dCA0Ni44cHQgMTRwdDsgUEFERElORy1MRUZUOiAwY207IFBBRERJTkctUklHSFQ6IDBjbTsgRk9O VC1GQU1JTFk6ICJDYWxpYnJpIiwic2Fucy1zZXJpZiI7IENPTE9SOiAjZjA3ZjA5OyBGT05ULVNJ WkU6IDExcHQ7IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBGT05ULVdFSUdIVDogYm9sZDsgQk9S REVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBjbTsgbXNvLXN0eWxlLXVuaGlk ZTogbm87IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBo YW47IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6 IG1pbm9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7 IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1pbm9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZh bWlseTogQ2FsaWJyaTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1pbm9yLWxhdGluOyBtc28tYmlk aS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1p bm9yLWJpZGk7IG1zby1hbnNpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6 IEVOLVVTOyBtc28tYmlkaS1sYW5ndWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogMzA7 IG1zby1zdHlsZS1saW5rOiAiSW50ZW5zZSBRdW90ZSBDaGFyIjsgbXNvLXN0eWxlLW5leHQ6IE5v cm1hbDsgbXNvLXRoZW1lY29sb3I6IGFjY2VudDE7IG1zby1ib3JkZXItYm90dG9tLWFsdDogc29s aWQgI0YwN0YwOSAuNXB0OyBtc28tYm9yZGVyLWJvdHRvbS10aGVtZWNvbG9yOiBhY2NlbnQxOyBt c28tcGFkZGluZy1hbHQ6IDBjbSAwY20gNC4wcHQgMGNtDQp9DQpESVYuTXNvSW50ZW5zZVF1b3Rl IHsNCglCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZTsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25l OyBQQURESU5HLUJPVFRPTTogMGNtOyBMSU5FLUhFSUdIVDogMTE1JTsgRk9OVC1TVFlMRTogaXRh bGljOyBNQVJHSU46IDEwcHQgNDYuOHB0IDE0cHQ7IFBBRERJTkctTEVGVDogMGNtOyBQQURESU5H LVJJR0hUOiAwY207IEZPTlQtRkFNSUxZOiAiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOyBDT0xPUjog I2YwN2YwOTsgRk9OVC1TSVpFOiAxMXB0OyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgRk9OVC1X RUlHSFQ6IGJvbGQ7IEJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwY207 IG1zby1zdHlsZS11bmhpZGU6IG5vOyBtc28tc3R5bGUtcWZvcm1hdDogeWVzOyBtc28tcGFnaW5h dGlvbjogd2lkb3ctb3JwaGFuOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1h c2NpaS10aGVtZS1mb250OiBtaW5vci1sYXRpbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICJU aW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtaW5vci1mYXJlYXN0OyBt c28taGFuc2ktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1oYW5zaS10aGVtZS1mb250OiBtaW5v ci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tYmlk aS10aGVtZS1mb250OiBtaW5vci1iaWRpOyBtc28tYW5zaS1sYW5ndWFnZTogRU4tVVM7IG1zby1m YXJlYXN0LWxhbmd1YWdlOiBFTi1VUzsgbXNvLWJpZGktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tc3R5 bGUtcHJpb3JpdHk6IDMwOyBtc28tc3R5bGUtbGluazogIkludGVuc2UgUXVvdGUgQ2hhciI7IG1z by1zdHlsZS1uZXh0OiBOb3JtYWw7IG1zby10aGVtZWNvbG9yOiBhY2NlbnQxOyBtc28tYm9yZGVy LWJvdHRvbS1hbHQ6IHNvbGlkICNGMDdGMDkgLjVwdDsgbXNvLWJvcmRlci1ib3R0b20tdGhlbWVj b2xvcjogYWNjZW50MTsgbXNvLXBhZGRpbmctYWx0OiAwY20gMGNtIDQuMHB0IDBjbQ0KfQ0KU1BB Ti5Nc29TdWJ0bGVFbXBoYXNpcyB7DQoJRk9OVC1TVFlMRTogaXRhbGljOyBDT0xPUjogZ3JheTsg bXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHlsZS1xZm9ybWF0OiB5ZXM7IG1zby1zdHlsZS1w cmlvcml0eTogMTk7IG1zby10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXRoZW1ldGludDogMTI3DQp9 DQpTUEFOLk1zb0ludGVuc2VFbXBoYXNpcyB7DQoJRk9OVC1TVFlMRTogaXRhbGljOyBDT0xPUjog I2YwN2YwOTsgRk9OVC1XRUlHSFQ6IGJvbGQ7IG1zby1zdHlsZS11bmhpZGU6IG5vOyBtc28tc3R5 bGUtcWZvcm1hdDogeWVzOyBtc28tc3R5bGUtcHJpb3JpdHk6IDIxOyBtc28tdGhlbWVjb2xvcjog YWNjZW50MQ0KfQ0KU1BBTi5Nc29TdWJ0bGVSZWZlcmVuY2Ugew0KCUZPTlQtVkFSSUFOVDogc21h bGwtY2FwczsgQ09MT1I6ICM5ZjI5MzY7IFRFWFQtREVDT1JBVElPTjogdW5kZXJsaW5lOyBtc28t c3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXN0eWxlLXByaW9y aXR5OiAzMTsgbXNvLXRoZW1lY29sb3I6IGFjY2VudDI7IHRleHQtdW5kZXJsaW5lOiBzaW5nbGUN Cn0NClNQQU4uTXNvSW50ZW5zZVJlZmVyZW5jZSB7DQoJRk9OVC1WQVJJQU5UOiBzbWFsbC1jYXBz OyBMRVRURVItU1BBQ0lORzogMC4yNXB0OyBDT0xPUjogIzlmMjkzNjsgRk9OVC1XRUlHSFQ6IGJv bGQ7IFRFWFQtREVDT1JBVElPTjogdW5kZXJsaW5lOyBtc28tc3R5bGUtdW5oaWRlOiBubzsgbXNv LXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXN0eWxlLXByaW9yaXR5OiAzMjsgbXNvLXRoZW1lY29s b3I6IGFjY2VudDI7IHRleHQtdW5kZXJsaW5lOiBzaW5nbGUNCn0NClNQQU4uTXNvQm9va1RpdGxl IHsNCglGT05ULVZBUklBTlQ6IHNtYWxsLWNhcHM7IExFVFRFUi1TUEFDSU5HOiAwLjI1cHQ7IEZP TlQtV0VJR0hUOiBib2xkOyBtc28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXFmb3JtYXQ6 IHllczsgbXNvLXN0eWxlLXByaW9yaXR5OiAzMw0KfQ0KUC5Nc29Ub2NIZWFkaW5nIHsNCglQQUdF LUJSRUFLLUFGVEVSOiBhdm9pZDsgTElORS1IRUlHSFQ6IDExNSU7IE1BUkdJTjogMjRwdCAwY20g MHB0OyBGT05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IENPTE9SOiAjYjM1ZTA2OyBGT05U LVNJWkU6IDE0cHQ7IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3R5bGUtcWZvcm1hdDogeWVzOyBt c28tc3R5bGUtcGFyZW50OiAiSGVhZGluZyAxIjsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhh biBsaW5lcy10b2dldGhlcjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNj aWktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGlt ZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNv LWhhbnNpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3It bGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGkt dGhlbWUtZm9udDogbWFqb3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFy ZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxl LXByaW9yaXR5OiAzOTsgbXNvLXN0eWxlLW5leHQ6IE5vcm1hbDsgbXNvLXRoZW1lY29sb3I6IGFj Y2VudDE7IG1zby10aGVtZXNoYWRlOiAxOTE7IG1zby1zdHlsZS1ub3Nob3c6IHllcw0KfQ0KTEku TXNvVG9jSGVhZGluZyB7DQoJUEFHRS1CUkVBSy1BRlRFUjogYXZvaWQ7IExJTkUtSEVJR0hUOiAx MTUlOyBNQVJHSU46IDI0cHQgMGNtIDBwdDsgRk9OVC1GQU1JTFk6ICJDYW1icmlhIiwic2VyaWYi OyBDT0xPUjogI2IzNWUwNjsgRk9OVC1TSVpFOiAxNHB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNv LXN0eWxlLXFmb3JtYXQ6IHllczsgbXNvLXN0eWxlLXBhcmVudDogIkhlYWRpbmcgMSI7IG1zby1w YWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4gbGluZXMtdG9nZXRoZXI7IG1zby1hc2NpaS1mb250LWZh bWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZv bnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWhh bnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVz IE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1zby1hbnNpLWxh bmd1YWdlOiBFTi1VUzsgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6IEVOLVVTOyBtc28tYmlkaS1sYW5n dWFnZTogRU4tVVM7IG1zby1zdHlsZS1wcmlvcml0eTogMzk7IG1zby1zdHlsZS1uZXh0OiBOb3Jt YWw7IG1zby10aGVtZWNvbG9yOiBhY2NlbnQxOyBtc28tdGhlbWVzaGFkZTogMTkxOyBtc28tc3R5 bGUtbm9zaG93OiB5ZXMNCn0NCkRJVi5Nc29Ub2NIZWFkaW5nIHsNCglQQUdFLUJSRUFLLUFGVEVS OiBhdm9pZDsgTElORS1IRUlHSFQ6IDExNSU7IE1BUkdJTjogMjRwdCAwY20gMHB0OyBGT05ULUZB TUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IENPTE9SOiAjYjM1ZTA2OyBGT05ULVNJWkU6IDE0cHQ7 IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3R5bGUtcWZvcm1hdDogeWVzOyBtc28tc3R5bGUtcGFy ZW50OiAiSGVhZGluZyAxIjsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiBsaW5lcy10b2dl dGhlcjsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNjaWktdGhlbWUtZm9u dDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFu IjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQt ZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1i aWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDog bWFqb3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFyZWFzdC1sYW5ndWFn ZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxlLXByaW9yaXR5OiAz OTsgbXNvLXN0eWxlLW5leHQ6IE5vcm1hbDsgbXNvLXRoZW1lY29sb3I6IGFjY2VudDE7IG1zby10 aGVtZXNoYWRlOiAxOTE7IG1zby1zdHlsZS1ub3Nob3c6IHllcw0KfQ0KU1BBTi5IZWFkaW5nMUNo YXIgew0KCUZPTlQtRkFNSUxZOiAiQ2FtYnJpYSIsInNlcmlmIjsgQ09MT1I6ICNiMzVlMDY7IEZP TlQtV0VJR0hUOiBib2xkOyBtc28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLWFzY2lpLWZvbnQtZmFt aWx5OiBDYW1icmlhOyBtc28tYXNjaWktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9u dDogbWFqb3ItZmFyZWFzdDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFu c2ktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMg TmV3IFJvbWFuIjsgbXNvLWJpZGktdGhlbWUtZm9udDogbWFqb3ItYmlkaTsgbXNvLXN0eWxlLXBy aW9yaXR5OiA5OyBtc28tc3R5bGUtbGluazogIkhlYWRpbmcgMSI7IG1zby10aGVtZWNvbG9yOiBh Y2NlbnQxOyBtc28tdGhlbWVzaGFkZTogMTkxOyBtc28tc3R5bGUtbmFtZTogIkhlYWRpbmcgMSBD aGFyIjsgbXNvLXN0eWxlLWxvY2tlZDogeWVzOyBtc28tYW5zaS1mb250LXNpemU6IDE0LjBwdDsg bXNvLWJpZGktZm9udC1zaXplOiAxNC4wcHQNCn0NClNQQU4uSGVhZGluZzJDaGFyIHsNCglGT05U LUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IENPTE9SOiAjZjA3ZjA5OyBGT05ULVdFSUdIVDog Ym9sZDsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FtYnJp YTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZh bWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1ham9yLWZh cmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWhhbnNpLXRoZW1lLWZv bnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7 IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1zby1zdHlsZS1wcmlvcml0eTogOTsg bXNvLXN0eWxlLWxpbms6ICJIZWFkaW5nIDIiOyBtc28tdGhlbWVjb2xvcjogYWNjZW50MTsgbXNv LXN0eWxlLW5vc2hvdzogeWVzOyBtc28tc3R5bGUtbmFtZTogIkhlYWRpbmcgMiBDaGFyIjsgbXNv LXN0eWxlLWxvY2tlZDogeWVzOyBtc28tYW5zaS1mb250LXNpemU6IDEzLjBwdDsgbXNvLWJpZGkt Zm9udC1zaXplOiAxMy4wcHQNCn0NClNQQU4uSGVhZGluZzNDaGFyIHsNCglGT05ULUZBTUlMWTog IkNhbWJyaWEiLCJzZXJpZiI7IENPTE9SOiAjZjA3ZjA5OyBGT05ULVdFSUdIVDogYm9sZDsgbXNv LXN0eWxlLXVuaGlkZTogbm87IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWFz Y2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRp bWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1ham9yLWZhcmVhc3Q7IG1z by1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1ham9y LWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRp LXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1zby1zdHlsZS1wcmlvcml0eTogOTsgbXNvLXN0eWxl LWxpbms6ICJIZWFkaW5nIDMiOyBtc28tdGhlbWVjb2xvcjogYWNjZW50MTsgbXNvLXN0eWxlLW5v c2hvdzogeWVzOyBtc28tc3R5bGUtbmFtZTogIkhlYWRpbmcgMyBDaGFyIjsgbXNvLXN0eWxlLWxv Y2tlZDogeWVzDQp9DQpTUEFOLkhlYWRpbmc0Q2hhciB7DQoJRk9OVC1TVFlMRTogaXRhbGljOyBG T05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IENPTE9SOiAjZjA3ZjA5OyBGT05ULVdFSUdI VDogYm9sZDsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2Ft YnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1ham9y LWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWhhbnNpLXRoZW1l LWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21h biI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJpZGk7IG1zby1zdHlsZS1wcmlvcml0eTog OTsgbXNvLXN0eWxlLWxpbms6ICJIZWFkaW5nIDQiOyBtc28tdGhlbWVjb2xvcjogYWNjZW50MTsg bXNvLXN0eWxlLW5vc2hvdzogeWVzOyBtc28tc3R5bGUtbmFtZTogIkhlYWRpbmcgNCBDaGFyIjsg bXNvLXN0eWxlLWxvY2tlZDogeWVzDQp9DQpTUEFOLkhlYWRpbmc1Q2hhciB7DQoJRk9OVC1GQU1J TFk6ICJDYW1icmlhIiwic2VyaWYiOyBDT0xPUjogIzc3M2YwNDsgbXNvLXN0eWxlLXVuaGlkZTog bm87IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6 IG1ham9yLWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7 IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZh bWlseTogQ2FtYnJpYTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlk aS1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1h am9yLWJpZGk7IG1zby1zdHlsZS1wcmlvcml0eTogOTsgbXNvLXN0eWxlLWxpbms6ICJIZWFkaW5n IDUiOyBtc28tdGhlbWVjb2xvcjogYWNjZW50MTsgbXNvLXRoZW1lc2hhZGU6IDEyNzsgbXNvLXN0 eWxlLW5vc2hvdzogeWVzOyBtc28tc3R5bGUtbmFtZTogIkhlYWRpbmcgNSBDaGFyIjsgbXNvLXN0 eWxlLWxvY2tlZDogeWVzDQp9DQpTUEFOLkhlYWRpbmc2Q2hhciB7DQoJRk9OVC1TVFlMRTogaXRh bGljOyBGT05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IENPTE9SOiAjNzczZjA0OyBtc28t c3R5bGUtdW5oaWRlOiBubzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNj aWktdGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGlt ZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNv LWhhbnNpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3It bGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGkt dGhlbWUtZm9udDogbWFqb3ItYmlkaTsgbXNvLXN0eWxlLXByaW9yaXR5OiA5OyBtc28tc3R5bGUt bGluazogIkhlYWRpbmcgNiI7IG1zby10aGVtZWNvbG9yOiBhY2NlbnQxOyBtc28tdGhlbWVzaGFk ZTogMTI3OyBtc28tc3R5bGUtbm9zaG93OiB5ZXM7IG1zby1zdHlsZS1uYW1lOiAiSGVhZGluZyA2 IENoYXIiOyBtc28tc3R5bGUtbG9ja2VkOiB5ZXMNCn0NClNQQU4uSGVhZGluZzdDaGFyIHsNCglG T05ULVNUWUxFOiBpdGFsaWM7IEZPTlQtRkFNSUxZOiAiQ2FtYnJpYSIsInNlcmlmIjsgQ09MT1I6 ICM0MDQwNDA7IG1zby1zdHlsZS11bmhpZGU6IG5vOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENh bWJyaWE7IG1zby1hc2NpaS10aGVtZS1mb250OiBtYWpvci1sYXRpbjsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtYWpv ci1mYXJlYXN0OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbWJyaWE7IG1zby1oYW5zaS10aGVt ZS1mb250OiBtYWpvci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9t YW4iOyBtc28tYmlkaS10aGVtZS1mb250OiBtYWpvci1iaWRpOyBtc28tc3R5bGUtcHJpb3JpdHk6 IDk7IG1zby1zdHlsZS1saW5rOiAiSGVhZGluZyA3IjsgbXNvLXRoZW1lY29sb3I6IHRleHQxOyBt c28tc3R5bGUtbm9zaG93OiB5ZXM7IG1zby10aGVtZXRpbnQ6IDE5MTsgbXNvLXN0eWxlLW5hbWU6 ICJIZWFkaW5nIDcgQ2hhciI7IG1zby1zdHlsZS1sb2NrZWQ6IHllcw0KfQ0KU1BBTi5IZWFkaW5n OENoYXIgew0KCUZPTlQtRkFNSUxZOiAiQ2FtYnJpYSIsInNlcmlmIjsgQ09MT1I6ICNmMDdmMDk7 IG1zby1zdHlsZS11bmhpZGU6IG5vOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbWJyaWE7IG1z by1hc2NpaS10aGVtZS1mb250OiBtYWpvci1sYXRpbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtYWpvci1mYXJlYXN0 OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbWJyaWE7IG1zby1oYW5zaS10aGVtZS1mb250OiBt YWpvci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28t YmlkaS10aGVtZS1mb250OiBtYWpvci1iaWRpOyBtc28tc3R5bGUtcHJpb3JpdHk6IDk7IG1zby1z dHlsZS1saW5rOiAiSGVhZGluZyA4IjsgbXNvLXRoZW1lY29sb3I6IGFjY2VudDE7IG1zby1zdHls ZS1ub3Nob3c6IHllczsgbXNvLXN0eWxlLW5hbWU6ICJIZWFkaW5nIDggQ2hhciI7IG1zby1zdHls ZS1sb2NrZWQ6IHllczsgbXNvLWFuc2ktZm9udC1zaXplOiAxMC4wcHQ7IG1zby1iaWRpLWZvbnQt c2l6ZTogMTAuMHB0DQp9DQpTUEFOLkhlYWRpbmc5Q2hhciB7DQoJRk9OVC1TVFlMRTogaXRhbGlj OyBGT05ULUZBTUlMWTogIkNhbWJyaWEiLCJzZXJpZiI7IENPTE9SOiAjNDA0MDQwOyBtc28tc3R5 bGUtdW5oaWRlOiBubzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28tYXNjaWkt dGhlbWUtZm9udDogbWFqb3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGltZXMg TmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWFqb3ItZmFyZWFzdDsgbXNvLWhh bnNpLWZvbnQtZmFtaWx5OiBDYW1icmlhOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWFqb3ItbGF0 aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGktdGhl bWUtZm9udDogbWFqb3ItYmlkaTsgbXNvLXN0eWxlLXByaW9yaXR5OiA5OyBtc28tc3R5bGUtbGlu azogIkhlYWRpbmcgOSI7IG1zby10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXN0eWxlLW5vc2hvdzog eWVzOyBtc28tdGhlbWV0aW50OiAxOTE7IG1zby1zdHlsZS1uYW1lOiAiSGVhZGluZyA5IENoYXIi OyBtc28tc3R5bGUtbG9ja2VkOiB5ZXM7IG1zby1hbnNpLWZvbnQtc2l6ZTogMTAuMHB0OyBtc28t YmlkaS1mb250LXNpemU6IDEwLjBwdA0KfQ0KU1BBTi5UaXRsZUNoYXIgew0KCUZPTlQtRkFNSUxZ OiAiQ2FtYnJpYSIsInNlcmlmIjsgTEVUVEVSLVNQQUNJTkc6IDAuMjVwdDsgQ09MT1I6ICMyNTI1 MjU7IG1zby1zdHlsZS11bmhpZGU6IG5vOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbWJyaWE7 IG1zby1hc2NpaS10aGVtZS1mb250OiBtYWpvci1sYXRpbjsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBtc28tZmFyZWFzdC10aGVtZS1mb250OiBtYWpvci1mYXJl YXN0OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbWJyaWE7IG1zby1oYW5zaS10aGVtZS1mb250 OiBtYWpvci1sYXRpbjsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iOyBt c28tYmlkaS10aGVtZS1mb250OiBtYWpvci1iaWRpOyBtc28tc3R5bGUtcHJpb3JpdHk6IDEwOyBt c28tc3R5bGUtbGluazogVGl0bGU7IG1zby10aGVtZWNvbG9yOiB0ZXh0MjsgbXNvLXRoZW1lc2hh ZGU6IDE5MTsgbXNvLWZvbnQta2VybmluZzogMTQuMHB0OyBtc28tc3R5bGUtbmFtZTogIlRpdGxl IENoYXIiOyBtc28tc3R5bGUtbG9ja2VkOiB5ZXM7IG1zby1hbnNpLWZvbnQtc2l6ZTogMjYuMHB0 OyBtc28tYmlkaS1mb250LXNpemU6IDI2LjBwdA0KfQ0KU1BBTi5TdWJ0aXRsZUNoYXIgew0KCUZP TlQtU1RZTEU6IGl0YWxpYzsgRk9OVC1GQU1JTFk6ICJDYW1icmlhIiwic2VyaWYiOyBMRVRURVIt U1BBQ0lORzogMC43NXB0OyBDT0xPUjogI2YwN2YwOTsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1z by1hc2NpaS1mb250LWZhbWlseTogQ2FtYnJpYTsgbXNvLWFzY2lpLXRoZW1lLWZvbnQ6IG1ham9y LWxhdGluOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1m YXJlYXN0LXRoZW1lLWZvbnQ6IG1ham9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTog Q2FtYnJpYTsgbXNvLWhhbnNpLXRoZW1lLWZvbnQ6IG1ham9yLWxhdGluOyBtc28tYmlkaS1mb250 LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiI7IG1zby1iaWRpLXRoZW1lLWZvbnQ6IG1ham9yLWJp ZGk7IG1zby1zdHlsZS1wcmlvcml0eTogMTE7IG1zby1zdHlsZS1saW5rOiBTdWJ0aXRsZTsgbXNv LXRoZW1lY29sb3I6IGFjY2VudDE7IG1zby1zdHlsZS1uYW1lOiAiU3VidGl0bGUgQ2hhciI7IG1z by1zdHlsZS1sb2NrZWQ6IHllczsgbXNvLWFuc2ktZm9udC1zaXplOiAxMi4wcHQ7IG1zby1iaWRp LWZvbnQtc2l6ZTogMTIuMHB0DQp9DQpTUEFOLkJhbGxvb25UZXh0Q2hhciB7DQoJRk9OVC1GQU1J TFk6ICJUYWhvbWEiLCJzYW5zLXNlcmlmIjsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1hc2Np aS1mb250LWZhbWlseTogVGFob21hOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogIlRpbWVzIE5l dyBSb21hbiI7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1pbm9yLWZhcmVhc3Q7IG1zby1oYW5z aS1mb250LWZhbWlseTogVGFob21hOyBtc28tYmlkaS1mb250LWZhbWlseTogVGFob21hOyBtc28t c3R5bGUtcHJpb3JpdHk6IDk5OyBtc28tc3R5bGUtbGluazogIkJhbGxvb24gVGV4dCI7IG1zby1z dHlsZS1ub3Nob3c6IHllczsgbXNvLXN0eWxlLW5hbWU6ICJCYWxsb29uIFRleHQgQ2hhciI7IG1z by1zdHlsZS1sb2NrZWQ6IHllczsgbXNvLWFuc2ktZm9udC1zaXplOiA4LjBwdDsgbXNvLWJpZGkt Zm9udC1zaXplOiA4LjBwdA0KfQ0KU1BBTi5Ob1NwYWNpbmdDaGFyIHsNCgltc28tc3R5bGUtdW5o aWRlOiBubzsgbXNvLXN0eWxlLXByaW9yaXR5OiAxOyBtc28tc3R5bGUtbGluazogIk5vIFNwYWNp bmciOyBtc28tc3R5bGUtbmFtZTogIk5vIFNwYWNpbmcgQ2hhciI7IG1zby1zdHlsZS1sb2NrZWQ6 IHllcw0KfQ0KU1BBTi5RdW90ZUNoYXIgew0KCUZPTlQtU1RZTEU6IGl0YWxpYzsgQ09MT1I6IGJs YWNrOyBtc28tc3R5bGUtdW5oaWRlOiBubzsgbXNvLXN0eWxlLXByaW9yaXR5OiAyOTsgbXNvLXN0 eWxlLWxpbms6IFF1b3RlOyBtc28tdGhlbWVjb2xvcjogdGV4dDE7IG1zby1zdHlsZS1uYW1lOiAi UXVvdGUgQ2hhciI7IG1zby1zdHlsZS1sb2NrZWQ6IHllcw0KfQ0KU1BBTi5JbnRlbnNlUXVvdGVD aGFyIHsNCglGT05ULVNUWUxFOiBpdGFsaWM7IENPTE9SOiAjZjA3ZjA5OyBGT05ULVdFSUdIVDog Ym9sZDsgbXNvLXN0eWxlLXVuaGlkZTogbm87IG1zby1zdHlsZS1wcmlvcml0eTogMzA7IG1zby1z dHlsZS1saW5rOiAiSW50ZW5zZSBRdW90ZSI7IG1zby10aGVtZWNvbG9yOiBhY2NlbnQxOyBtc28t c3R5bGUtbmFtZTogIkludGVuc2UgUXVvdGUgQ2hhciI7IG1zby1zdHlsZS1sb2NrZWQ6IHllcw0K fQ0KU1BBTi5hcHBsZS1jb252ZXJ0ZWQtc3BhY2Ugew0KCW1zby1zdHlsZS11bmhpZGU6IG5vOyBt c28tc3R5bGUtbmFtZTogYXBwbGUtY29udmVydGVkLXNwYWNlDQp9DQpTUEFOLlNwZWxsRSB7DQoJ bXNvLXN0eWxlLW5hbWU6ICIiOyBtc28tc3BsLWU6IHllcw0KfQ0KLk1zb0NocERlZmF1bHQgew0K CUZPTlQtU0laRTogMTBwdDsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tYXNj aWktdGhlbWUtZm9udDogbWlub3ItbGF0aW47IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAiVGlt ZXMgTmV3IFJvbWFuIjsgbXNvLWZhcmVhc3QtdGhlbWUtZm9udDogbWlub3ItZmFyZWFzdDsgbXNv LWhhbnNpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28taGFuc2ktdGhlbWUtZm9udDogbWlub3It bGF0aW47IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIjsgbXNvLWJpZGkt dGhlbWUtZm9udDogbWlub3ItYmlkaTsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTOyBtc28tZmFy ZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWxhbmd1YWdlOiBFTi1VUzsgbXNvLXN0eWxl LXR5cGU6IGV4cG9ydC1vbmx5OyBtc28tYW5zaS1mb250LXNpemU6IDEwLjBwdDsgbXNvLWJpZGkt Zm9udC1zaXplOiAxMC4wcHQ7IG1zby1kZWZhdWx0LXByb3BzOiB5ZXMNCn0NCkRJVi5Xb3JkU2Vj dGlvbjEgew0KCXBhZ2U6IFdvcmRTZWN0aW9uMQ0KfQ0KPC9TVFlMRT4NCjwhLS1baWYgZ3RlIG1z byAxMF0+DQo8c3R5bGU+DQogLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8NCiB0YWJsZS5Nc29Ob3Jt YWxUYWJsZQ0KCXttc28tc3R5bGUtbmFtZToiVGFibGUgTm9ybWFsIjsNCgltc28tdHN0eWxlLXJv d2JhbmQtc2l6ZTowOw0KCW1zby10c3R5bGUtY29sYmFuZC1zaXplOjA7DQoJbXNvLXN0eWxlLW5v c2hvdzp5ZXM7DQoJbXNvLXN0eWxlLXByaW9yaXR5Ojk5Ow0KCW1zby1zdHlsZS1xZm9ybWF0Onll czsNCgltc28tc3R5bGUtcGFyZW50OiIiOw0KCW1zby1wYWRkaW5nLWFsdDowY20gNS40cHQgMGNt IDUuNHB0Ow0KCW1zby1wYXJhLW1hcmdpbjowY207DQoJbXNvLXBhcmEtbWFyZ2luLWJvdHRvbTou MDAwMXB0Ow0KCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsNCglmb250LXNpemU6MTAuMHB0 Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQoJbXNvLWFzY2lpLWZvbnQt ZmFtaWx5OkNhbGlicmk7DQoJbXNvLWFzY2lpLXRoZW1lLWZvbnQ6bWlub3ItbGF0aW47DQoJbXNv LWhhbnNpLWZvbnQtZmFtaWx5OkNhbGlicmk7DQoJbXNvLWhhbnNpLXRoZW1lLWZvbnQ6bWlub3It bGF0aW47DQoJbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tVVM7DQoJbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6 RU4tVVM7DQoJbXNvLWJpZGktbGFuZ3VhZ2U6RU4tVVM7fQ0KPC9zdHlsZT4NCjwhW2VuZGlmXS0t PjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPg0KIDxvOnNoYXBlZGVmYXVsdHMgdjpleHQ9ImVkaXQi IHNwaWRtYXg9IjIxNTA2Ii8+DQo8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+ PHhtbD4NCiA8bzpzaGFwZWxheW91dCB2OmV4dD0iZWRpdCI+DQogIDxvOmlkbWFwIHY6ZXh0PSJl ZGl0IiBkYXRhPSIxIi8+DQogPC9vOnNoYXBlbGF5b3V0PjwveG1sPjwhW2VuZGlmXS0tPjwvSEVB RD4NCjxCT0RZIHN0eWxlPSJ0YWItaW50ZXJ2YWw6IDM2LjBwdCIgbGFuZz1FTi1HQiBsaW5rPWJs dWUgdkxpbms9cHVycGxlPg0KPERJViBjbGFzcz1Xb3JkU2VjdGlvbjE+DQo8UD48U1BBTiBsYW5n PUVOLVVTPiZuYnNwOzxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxESVYgYWxpZ249Y2VudGVyPg0K PFRBQkxFIA0Kc3R5bGU9IldJRFRIOiA1NjIuNXB0OyBCQUNLR1JPVU5EOiB3aGl0ZTsgbXNvLXBh ZGRpbmctYWx0OiAwY20gMGNtIDBjbSAwY207IG1zby1jZWxsc3BhY2luZzogMGNtOyBtc28teWZ0 aS10Ymxsb29rOiAxMTg0IiANCmNsYXNzPU1zb05vcm1hbFRhYmxlIGJvcmRlcj0wIGNlbGxTcGFj aW5nPTAgY2VsbFBhZGRpbmc9MCB3aWR0aD03NTA+DQogIDxUQk9EWT4NCiAgPFRSIHN0eWxlPSJI RUlHSFQ6IDQ1cHQ7IG1zby15ZnRpLWlyb3c6IDA7IG1zby15ZnRpLWZpcnN0cm93OiB5ZXMiPg0K ICAgIDxURCANCiAgICBzdHlsZT0iUEFERElORy1CT1RUT006IDBjbTsgUEFERElORy1MRUZUOiAw Y207IEJPUkRFUi1TUEFDSU5HOiAycHg7IFBBRERJTkctUklHSFQ6IDBjbTsgV09SRC1XUkFQOiBi cmVhay13b3JkOyBIRUlHSFQ6IDQ1cHQ7IFBBRERJTkctVE9QOiAwY20iPjwvVEQ+PC9UUj4NCiAg PFRSIHN0eWxlPSJIRUlHSFQ6IDk4LjM1cHQ7IG1zby15ZnRpLWlyb3c6IDE7IG1zby15ZnRpLWxh c3Ryb3c6IHllcyI+DQogICAgPFREIA0KICAgIHN0eWxlPSJQQURESU5HLUJPVFRPTTogMGNtOyBQ QURESU5HLUxFRlQ6IDBjbTsgQk9SREVSLVNQQUNJTkc6IDJweDsgUEFERElORy1SSUdIVDogMGNt OyBXT1JELVdSQVA6IGJyZWFrLXdvcmQ7IEJBQ0tHUk9VTkQ6ICNkZmYzZmEgNTAlIDAlOyBIRUlH SFQ6IDk4LjM1cHQ7IFBBRERJTkctVE9QOiAwY20iPg0KICAgICAgPFAgY2xhc3M9TXNvTm9ybWFs PjxTUEFOIA0KICAgICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05ULVNJWkU6IDEwcHQ7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyIgDQogICAgICBsYW5n PUVOLVVTPjxTUEFOIA0KICAgICAgc3R5bGU9Im1zby1zcGFjZXJ1bjogeWVzIj4mbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgDQogICAgICA8L1NQQU4+PC9TUEFOPjxTUEFOIGNsYXNzPVNwZWxsRT48QiANCiAgICAgIHN0 eWxlPSJtc28tYmlkaS1mb250LXdlaWdodDogbm9ybWFsIj48U1BBTiANCiAgICAgIHN0eWxlPSJM SU5FLUhFSUdIVDogMTE1JTsgRk9OVC1GQU1JTFk6ICdNUyBHb3RoaWMnOyBDT0xPUjogIzAwNzBj MDsgRk9OVC1TSVpFOiAzNnB0OyBtc28tYmlkaS1mb250LWZhbWlseTogJ01TIEdvdGhpYyciIA0K ICAgICAgbGFuZz1FTi1VUz4mIzIwMDEzOyYjMzM3NzU7JiMzODY1MTsmIzIwNDQ5O0hpTmV0JiMz MjE3ODsmIzM4OTEzOyYjMzcxMDk7JiMyMDIxNDsmIzI2MzgxOyYjMjEyMDk7PC9TUEFOPjwvQj48 L1NQQU4+PEIgDQogICAgICBzdHlsZT0ibXNvLWJpZGktZm9udC13ZWlnaHQ6IG5vcm1hbCI+PFNQ QU4gDQogICAgICBzdHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IENPTE9SOiAjMDA3MGMwOyBGT05U LVNJWkU6IDM2cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyIg DQogICAgICBsYW5nPUVOLVVTPjxvOnA+PC9vOnA+PC9TUEFOPjwvQj48L1A+PC9URD48L1RSPjwv VEJPRFk+PC9UQUJMRT48L0RJVj4NCjxQIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJE SVNQTEFZOiBub25lOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7 IG1zby1oaWRlOiBhbGwiIA0KbGFuZz1FTi1VUz48bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+ DQo8RElWIGFsaWduPWNlbnRlcj4NCjxUQUJMRSANCnN0eWxlPSJXSURUSDogNTYyLjVwdDsgQkFD S0dST1VORDogd2hpdGU7IG1zby1wYWRkaW5nLWFsdDogMGNtIDBjbSAwY20gMGNtOyBtc28tY2Vs bHNwYWNpbmc6IDBjbTsgbXNvLXlmdGktdGJsbG9vazogMTE4NCIgDQpjbGFzcz1Nc29Ob3JtYWxU YWJsZSBib3JkZXI9MCBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTAgd2lkdGg9NzUwPg0KICA8 VEJPRFk+DQogIDxUUiBzdHlsZT0ibXNvLXlmdGktaXJvdzogMDsgbXNvLXlmdGktZmlyc3Ryb3c6 IHllcyI+DQogICAgPFREIA0KICAgIHN0eWxlPSJQQURESU5HLUJPVFRPTTogMGNtOyBQQURESU5H LUxFRlQ6IDBjbTsgQk9SREVSLVNQQUNJTkc6IDJweDsgUEFERElORy1SSUdIVDogMGNtOyBXT1JE LVdSQVA6IGJyZWFrLXdvcmQ7IEJBQ0tHUk9VTkQ6ICNkZmYzZmE7IFBBRERJTkctVE9QOiAwY20i Pg0KICAgICAgPERJViBhbGlnbj1jZW50ZXI+DQogICAgICA8VEFCTEUgDQogICAgICBzdHlsZT0i V0lEVEg6IDU2Mi41cHQ7IG1zby1wYWRkaW5nLWFsdDogMGNtIDBjbSAwY20gMGNtOyBtc28tY2Vs bHNwYWNpbmc6IDBjbTsgbXNvLXlmdGktdGJsbG9vazogMTE4NCIgDQogICAgICBjbGFzcz1Nc29O b3JtYWxUYWJsZSBib3JkZXI9MCBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTAgd2lkdGg9NzUw Pg0KICAgICAgICA8VEJPRFk+DQogICAgICAgIDxUUiANCiAgICAgICAgc3R5bGU9Im1zby15ZnRp LWlyb3c6IDA7IG1zby15ZnRpLWZpcnN0cm93OiB5ZXM7IG1zby15ZnRpLWxhc3Ryb3c6IHllcyI+ DQogICAgICAgICAgPFREIA0KICAgICAgICAgIHN0eWxlPSJQQURESU5HLUJPVFRPTTogMGNtOyBQ QURESU5HLUxFRlQ6IDBjbTsgQk9SREVSLVNQQUNJTkc6IDJweDsgUEFERElORy1SSUdIVDogMGNt OyBXT1JELVdSQVA6IGJyZWFrLXdvcmQ7IFBBRERJTkctVE9QOiAwY20iPg0KICAgICAgICAgICAg PERJViBhbGlnbj1jZW50ZXI+DQogICAgICAgICAgICA8VEFCTEUgDQogICAgICAgICAgICBzdHls ZT0iV0lEVEg6IDEwMCU7IG1zby1wYWRkaW5nLWFsdDogMGNtIDBjbSAwY20gMGNtOyBtc28tY2Vs bHNwYWNpbmc6IDcuNXB0OyBtc28teWZ0aS10Ymxsb29rOiAxMTg0IiANCiAgICAgICAgICAgIGNs YXNzPU1zb05vcm1hbFRhYmxlIGJvcmRlcj0wIGNlbGxTcGFjaW5nPTEwIGNlbGxQYWRkaW5nPTAg DQogICAgICAgICAgICB3aWR0aD0iMTAwJSI+DQogICAgICAgICAgICAgIDxUQk9EWT4NCiAgICAg ICAgICAgICAgPFRSIHN0eWxlPSJtc28teWZ0aS1pcm93OiAwOyBtc28teWZ0aS1maXJzdHJvdzog eWVzIj4NCiAgICAgICAgICAgICAgICA8VEQgDQogICAgICAgICAgICAgICAgc3R5bGU9IlBBRERJ TkctQk9UVE9NOiAwY207IFBBRERJTkctTEVGVDogMGNtOyBCT1JERVItU1BBQ0lORzogMnB4OyBQ QURESU5HLVJJR0hUOiAwY207IFdPUkQtV1JBUDogYnJlYWstd29yZDsgUEFERElORy1UT1A6IDBj bSIgDQogICAgICAgICAgICAgICAgdkFsaWduPXRvcD4NCiAgICAgICAgICAgICAgICAgIDxQIGNs YXNzPU1zb05vcm1hbD48U1BBTiBjbGFzcz1TcGVsbEU+PFNQQU4gDQogICAgICAgICAgICAgICAg ICBzdHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtRkFNSUxZOiAnTVMgTWluY2hvJzsgRk9O VC1TSVpFOiAyMnB0OyBtc28tYmlkaS1mb250LWZhbWlseTogJ01TIE1pbmNobyciIA0KICAgICAg ICAgICAgICAgICAgbGFuZz1FTi1VUz4mIzIzNTYyOyYjMjU5NjQ7JiMzMDM0MDsmIzIzNDU4Ozwv U1BBTj48U1BBTiANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJMSU5FLUhFSUdIVDogMTE1JTsg Rk9OVC1GQU1JTFk6ICdCYXRhbmcnLCdzZXJpZic7IEZPTlQtU0laRTogMjJwdDsgbXNvLWJpZGkt Zm9udC1mYW1pbHk6IEJhdGFuZyIgDQogICAgICAgICAgICAgICAgICBsYW5nPUVOLVVTPiYjMjUx NDI7PC9TUEFOPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAx MTUlOyBGT05ULUZBTUlMWTogJ01TIE1pbmNobyc7IEZPTlQtU0laRTogMjJwdDsgbXNvLWJpZGkt Zm9udC1mYW1pbHk6ICdNUyBNaW5jaG8nIiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+ JiMyNDc0NDsmIzIyOTA5OzwvU1BBTj48L1NQQU4+PFNQQU4gDQogICAgICAgICAgICAgICAgICBz dHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtU0laRTogMjJwdCIgDQogICAgICAgICAgICAg ICAgICBsYW5nPUVOLVVTPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD48L1REPjwvVFI+DQogICAgICAg ICAgICAgIDxUUiANCiAgICAgICAgICAgICAgICBzdHlsZT0iSEVJR0hUOiAxcHQ7IG1zby15ZnRp LWlyb3c6IDE7IG1zby15ZnRpLWxhc3Ryb3c6IHllcyI+PFREIA0KICAgICAgICAgICAgICAgIHN0 eWxlPSJQQURESU5HLUJPVFRPTTogMGNtOyBQQURESU5HLUxFRlQ6IDI0cHQ7IEJPUkRFUi1TUEFD SU5HOiAycHg7IFBBRERJTkctUklHSFQ6IDBjbTsgV09SRC1XUkFQOiBicmVhay13b3JkOyBIRUlH SFQ6IDFwdDsgUEFERElORy1UT1A6IDBjbSIgDQogICAgICAgICAgICAgICAgdkFsaWduPXRvcD4N CiAgICAgICAgICAgICAgICAgIDxQIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCiAgICAgICAgICAg ICAgICAgIHN0eWxlPSJMSU5FLUhFSUdIVDogMTE1JTsgRk9OVC1GQU1JTFk6ICdNUyBNaW5jaG8n OyBGT05ULVNJWkU6IDIycHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAnTVMgTWluY2hvJyIgDQog ICAgICAgICAgICAgICAgICBsYW5nPUVOLVVTPiYjMjUxMDU7JiMyMDQ5NzsmIzMwMzQwOyYjMjU5 NzY7JiMyNTgxODsmIzI0MjM1OyYjMjAwMTM7JiMzMDM0MDsmIzIzNDMzOyYjMjA4NDA7JiMyODQz MTsmIzI3OTM0OyYjNjUyOTI7JiMyNTE1MjsmIzI2Mzc3OyYjMjk5OTI7PC9TUEFOPjxTUEFOIA0K ICAgICAgICAgICAgICAgICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05ULUZBTUlMWTog J0JhdGFuZycsJ3NlcmlmJzsgRk9OVC1TSVpFOiAyMnB0OyBtc28tYmlkaS1mb250LWZhbWlseTog QmF0YW5nIiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+JiMyNTE0MjsmIzMwMzQwOyYj MjAwMTM7JiMzMzc3NTsmIzM4NjUxOyYjMjA0NDk7JiM2NTI4ODs8L1NQQU4+PFNQQU4gDQogICAg ICAgICAgICAgICAgICBzdHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtU0laRTogMjJwdCIg DQogICAgICAgICAgICAgICAgICBsYW5nPUVOLVVTPk1TMTwvU1BBTj48U1BBTiANCiAgICAgICAg ICAgICAgICAgIHN0eWxlPSJMSU5FLUhFSUdIVDogMTE1JTsgRk9OVC1GQU1JTFk6ICdNUyBNaW5j aG8nOyBGT05ULVNJWkU6IDIycHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAnTVMgTWluY2hvJyIg DQogICAgICAgICAgICAgICAgICBsYW5nPUVOLVVTPiYjMTIzMTY7PC9TUEFOPjxTUEFOIA0KICAg ICAgICAgICAgICAgICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05ULVNJWkU6IDIycHQi IA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz5NUzk5PC9TUEFOPjxTUEFOIA0KICAgICAg ICAgICAgICAgICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05ULUZBTUlMWTogJ01TIE1p bmNobyc7IEZPTlQtU0laRTogMjJwdDsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICdNUyBNaW5jaG8n IiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+JiM2NTI5Mjs8L1NQQU4+PFNQQU4gDQog ICAgICAgICAgICAgICAgICBzdHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtU0laRTogMjJw dCIgDQogICAgICAgICAgICAgICAgICBsYW5nPUVOLVVTPk1TQTwvU1BBTj48U1BBTiANCiAgICAg ICAgICAgICAgICAgIHN0eWxlPSJMSU5FLUhFSUdIVDogMTE1JTsgRk9OVC1GQU1JTFk6ICdNUyBN aW5jaG8nOyBGT05ULVNJWkU6IDIycHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAnTVMgTWluY2hv JyIgDQogICAgICAgICAgICAgICAgICBsYW5nPUVOLVVTPiYjNjUyOTI7PC9TUEFOPjxTUEFOIA0K ICAgICAgICAgICAgICAgICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05ULVNJWkU6IDIy cHQiIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz5DTTE8L1NQQU4+PFNQQU4gDQogICAg ICAgICAgICAgICAgICBzdHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtRkFNSUxZOiAnTVMg TWluY2hvJzsgRk9OVC1TSVpFOiAyMnB0OyBtc28tYmlkaS1mb250LWZhbWlseTogJ01TIE1pbmNo byciIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz4mIzY1MjkyOzwvU1BBTj48U1BBTiAN CiAgICAgICAgICAgICAgICAgIHN0eWxlPSJMSU5FLUhFSUdIVDogMTE1JTsgRk9OVC1TSVpFOiAy MnB0IiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+VU1haWw8L1NQQU4+PFNQQU4gDQog ICAgICAgICAgICAgICAgICBzdHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtRkFNSUxZOiAn TVMgTWluY2hvJzsgRk9OVC1TSVpFOiAyMnB0OyBtc28tYmlkaS1mb250LWZhbWlseTogJ01TIE1p bmNobyciIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz4mIzIxNjQ0OzwvU1BBTj48U1BB TiANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJMSU5FLUhFSUdIVDogMTE1JTsgRk9OVC1TSVpF OiAyMnB0IiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+aGlNYWlsPC9TUEFOPjxTUEFO IA0KICAgICAgICAgICAgICAgICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05ULUZBTUlM WTogJ01TIE1pbmNobyc7IEZPTlQtU0laRTogMjJwdDsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICdN UyBNaW5jaG8nIiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+JiMzMDM0MDsmIzMwMzQw OyYjNjUyODk7JiM2NTI5MjsmIzIwMTk3OyYjMjA0NDU7JiMzNTcwMzsmIzIwNDkxOyYjMjAxNTQ7 JiMyMDQ0OTsmIzI0Njg3OyYjMzAzNDA7JiMyMzQzMzsmIzIwODQwOyYjMjQ2MTU7JiM2NTI5Mjsm IzI0NzQ0OyYjMzAzNDA7JiMyNDExNTs8L1NQQU4+PFNQQU4gDQogICAgICAgICAgICAgICAgICBz dHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtRkFNSUxZOiAnQmF0YW5nJywnc2VyaWYnOyBG T05ULVNJWkU6IDIycHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiBCYXRhbmciIA0KICAgICAgICAg ICAgICAgICAgbGFuZz1FTi1VUz4mIzI1MTQyOyYjMjM1NTk7JiMzNDk4NzsmIzI2MjgzOyYjMjA1 NzI7JiM2NTI5MjsmIzIwMTcwOyYjMjI4MjU7PC9TUEFOPjxTUEFOIA0KICAgICAgICAgICAgICAg ICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05ULUZBTUlMWTogJ01TIE1pbmNobyc7IEZP TlQtU0laRTogMjJwdDsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICdNUyBNaW5jaG8nIiANCiAgICAg ICAgICAgICAgICAgIGxhbmc9RU4tVVM+JiMyODg1ODsmIzI0NzQ0OyYjMjg2MDg7JiMyNzk2Mzsm IzI0NzQ0OyYjMzAzNDA7JiMyNDExNTs8L1NQQU4+PFNQQU4gDQogICAgICAgICAgICAgICAgICBz dHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtRkFNSUxZOiAnQmF0YW5nJywnc2VyaWYnOyBG T05ULVNJWkU6IDIycHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiBCYXRhbmciIA0KICAgICAgICAg ICAgICAgICAgbGFuZz1FTi1VUz4mIzI1MTQyOyYjMTIyOTA7JiMzNTUzMTsmIzQwNjcwOyYjMjU4 MDI7JiMxOTk3OTsmIzM4NzU0OyYjMzAzNDA7JiMyODYwODsmIzI3OTYzOyYjMjUzNTM7PC9TUEFO PjxTUEFOIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05U LUZBTUlMWTogJ01TIE1pbmNobyc7IEZPTlQtU0laRTogMjJwdDsgbXNvLWJpZGktZm9udC1mYW1p bHk6ICdNUyBNaW5jaG8nIiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+JiMzNzM5Nzsm IzY1MjkyOyYjMzAzMzE7JiMzNzYzNjsmIzI0NzQ0OyYjMzAzNDA7JiMyNjM3NzsmIzI1OTI4OyYj MjA0NDk7JiMyNDY4NzsmIzY1MjkyOyYjMjAxOTc7JiMyODYwODsmIzI3OTYzOyYjMjQ3NDQ7JiMz MDM0MDsmIzI0MTE1OyYjMzQzOTk7JiM2NTI5MjsmIzIwMTk3OyYjMzY5OTE7JiMyMDgxMzsmIzMy MDY2OyYjMjc0OTA7JiMyNDc0NDsmIzMwMzQwOyYjMjQxMTU7PC9TUEFOPjxTUEFOIA0KICAgICAg ICAgICAgICAgICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05ULUZBTUlMWTogJ0JhdGFu ZycsJ3NlcmlmJzsgRk9OVC1TSVpFOiAyMnB0OyBtc28tYmlkaS1mb250LWZhbWlseTogQmF0YW5n IiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+JiMyNTE0MjsmIzEyMjkwOyYjMjA0NDU7 JiMzNTcwMzsmIzIwNDkxOyYjMjAxNTQ7JiMyMDQ0OTsmIzI0Njg3OyYjMjE2NDQ7JiMzNTMzNjsm IzMxNjM5OyYjMjcyMzE7JiMyMzQzMzsmIzIwODQwOyYjMTIyOTA7JiMzNjg4OTsmIzI2MTU5Ozwv U1BBTj48U1BBTiANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJMSU5FLUhFSUdIVDogMTE1JTsg Rk9OVC1GQU1JTFk6ICdNUyBNaW5jaG8nOyBGT05ULVNJWkU6IDIycHQ7IG1zby1iaWRpLWZvbnQt ZmFtaWx5OiAnTVMgTWluY2hvJyIgDQogICAgICAgICAgICAgICAgICBsYW5nPUVOLVVTPiYjMjg4 NTg7JiMyMDEwMjsmIzIwNDQ1OyYjMzU3MDM7JiMyMDQ5MTsmIzIwMTU0OyYjMjA0NDk7JiMyNDY4 NzsmIzIxNjQ0OyYjMzUzMzY7JiMzMTYzOTsmIzI3MjMxOyYjMjM0MzM7JiMyMDg0MDsmIzEyMjkw OzwvU1BBTj48U1BBTiANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJMSU5FLUhFSUdIVDogMTE1 JTsgRk9OVC1TSVpFOiAyMnB0IiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+PG86cD48 L286cD48L1NQQU4+PC9QPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+PC9ESVY+DQogICAgICAg ICAgICA8UCBzdHlsZT0iVEVYVC1BTElHTjogY2VudGVyIiBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249 Y2VudGVyPjxTUEFOIA0KICAgICAgICAgICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBESVNQ TEFZOiBub25lOyBGT05ULVNJWkU6IDEwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAnVGlt ZXMgTmV3IFJvbWFuJzsgbXNvLWhpZGU6IGFsbCIgDQogICAgICAgICAgICBsYW5nPUVOLVVTPjxv OnA+Jm5ic3A7PC9vOnA+PC9TUEFOPjwvUD4NCiAgICAgICAgICAgIDxESVYgYWxpZ249Y2VudGVy Pg0KICAgICAgICAgICAgPFRBQkxFIA0KICAgICAgICAgICAgc3R5bGU9IldJRFRIOiAxMDAlOyBt c28tcGFkZGluZy1hbHQ6IDBjbSAwY20gMGNtIDBjbTsgbXNvLWNlbGxzcGFjaW5nOiA3LjVwdDsg bXNvLXlmdGktdGJsbG9vazogMTE4NCIgDQogICAgICAgICAgICBjbGFzcz1Nc29Ob3JtYWxUYWJs ZSBib3JkZXI9MCBjZWxsU3BhY2luZz0xMCBjZWxsUGFkZGluZz0wIA0KICAgICAgICAgICAgd2lk dGg9IjEwMCUiPg0KICAgICAgICAgICAgICA8VEJPRFk+DQogICAgICAgICAgICAgIDxUUiBzdHls ZT0ibXNvLXlmdGktaXJvdzogMDsgbXNvLXlmdGktZmlyc3Ryb3c6IHllcyI+DQogICAgICAgICAg ICAgICAgPFREIA0KICAgICAgICAgICAgICAgIHN0eWxlPSJQQURESU5HLUJPVFRPTTogMGNtOyBQ QURESU5HLUxFRlQ6IDBjbTsgQk9SREVSLVNQQUNJTkc6IDJweDsgUEFERElORy1SSUdIVDogMGNt OyBXT1JELVdSQVA6IGJyZWFrLXdvcmQ7IFBBRERJTkctVE9QOiAwY20iPg0KICAgICAgICAgICAg ICAgICAgPFAgc3R5bGU9IlRFWFQtQUxJR046IGNlbnRlciIgY2xhc3M9TXNvTm9ybWFsIGFsaWdu PWNlbnRlcj48QiANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJtc28tYmlkaS1mb250LXdlaWdo dDogbm9ybWFsIj48U1BBTiANCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJMSU5FLUhFSUdIVDog MTE1JTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogJ1RpbWVzIE5l dyBSb21hbiciIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz48bzpwPiZuYnNwOzwvbzpw PjwvU1BBTj48L0I+PC9QPg0KICAgICAgICAgICAgICAgICAgPERJViBhbGlnbj1jZW50ZXI+DQog ICAgICAgICAgICAgICAgICA8VEFCTEUgDQogICAgICAgICAgICAgICAgICBzdHlsZT0iV0lEVEg6 IDgwJTsgbXNvLXBhZGRpbmctYWx0OiAwY20gMGNtIDBjbSAwY207IG1zby1jZWxsc3BhY2luZzog MGNtOyBtc28teWZ0aS10Ymxsb29rOiAxMTg0IiANCiAgICAgICAgICAgICAgICAgIGNsYXNzPU1z b05vcm1hbFRhYmxlIGJvcmRlcj0wIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MCANCiAgICAg ICAgICAgICAgICAgIHdpZHRoPSI4MCUiPg0KICAgICAgICAgICAgICAgICAgICA8VEJPRFk+DQog ICAgICAgICAgICAgICAgICAgIDxUUiANCiAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkhFSUdI VDogNDI2LjQ1cHQ7IG1zby15ZnRpLWlyb3c6IDA7IG1zby15ZnRpLWZpcnN0cm93OiB5ZXM7IG1z by15ZnRpLWxhc3Ryb3c6IHllcyI+DQogICAgICAgICAgICAgICAgICAgICAgPFREIA0KICAgICAg ICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItQk9UVE9NOiAjNzM5Y2IyIDNwdCBkYXNoZWQ7 IEJPUkRFUi1MRUZUOiAjNzM5Y2IyIDNwdCBkYXNoZWQ7IFBBRERJTkctQk9UVE9NOiAwY207IFBB RERJTkctTEVGVDogMGNtOyBCT1JERVItU1BBQ0lORzogMnB4OyBQQURESU5HLVJJR0hUOiAwY207 IFdPUkQtV1JBUDogYnJlYWstd29yZDsgQkFDS0dST1VORDogd2hpdGU7IEhFSUdIVDogNDI2LjQ1 cHQ7IEJPUkRFUi1UT1A6ICM3MzljYjIgM3B0IGRhc2hlZDsgQk9SREVSLVJJR0hUOiAjNzM5Y2Iy IDNwdCBkYXNoZWQ7IFBBRERJTkctVE9QOiAwY20iPg0KICAgICAgICAgICAgICAgICAgICAgICAg PFAgY2xhc3M9TXNvTm9ybWFsPjxCIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9Im1z by1iaWRpLWZvbnQtd2VpZ2h0OiBub3JtYWwiPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgICAg ICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05ULVNJWkU6IDEycHQ7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyIgDQogICAgICAgICAgICAgICAgICAgICAg ICBsYW5nPUVOLVVTPjxvOnA+Jm5ic3A7PC9vOnA+PC9TUEFOPjwvQj48L1A+DQogICAgICAgICAg ICAgICAgICAgICAgICA8RElWIGFsaWduPWNlbnRlcj4NCiAgICAgICAgICAgICAgICAgICAgICAg IDxUQUJMRSANCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJXSURUSDogMTg3LjVwdDsg bXNvLXBhZGRpbmctYWx0OiAwY20gMGNtIDBjbSAwY207IG1zby1jZWxsc3BhY2luZzogMGNtOyBt c28teWZ0aS10Ymxsb29rOiAxMTg0IiANCiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPU1z b05vcm1hbFRhYmxlIGJvcmRlcj0wIGNlbGxTcGFjaW5nPTAgDQogICAgICAgICAgICAgICAgICAg ICAgICBjZWxsUGFkZGluZz0wIHdpZHRoPTI1MD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAg PFRCT0RZPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8VFIgDQogICAgICAgICAgICAgICAg ICAgICAgICAgIHN0eWxlPSJtc28teWZ0aS1pcm93OiAwOyBtc28teWZ0aS1maXJzdHJvdzogeWVz OyBtc28teWZ0aS1sYXN0cm93OiB5ZXMiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxU RCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iUEFERElORy1CT1RUT006IDBj bTsgUEFERElORy1MRUZUOiAwY207IEJPUkRFUi1TUEFDSU5HOiAycHg7IFBBRERJTkctUklHSFQ6 IDBjbTsgV09SRC1XUkFQOiBicmVhay13b3JkOyBQQURESU5HLVRPUDogMGNtIj4NCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDxQIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3R5bGU9IlRFWFQtQUxJR046IGNlbnRlcjsgbXNvLWxpbmUtaGVpZ2h0LWFsdDogMjEuMHB0IiAN CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPU1zb05vcm1hbCBhbGlnbj1jZW50 ZXI+PEIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0ibXNvLWJpZGktZm9u dC13ZWlnaHQ6IG5vcm1hbCI+PFNQQU4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz dHlsZT0iQ09MT1I6IHJlZDsgRk9OVC1TSVpFOiAyMnB0OyBtc28tZmFyZWFzdC1mb250LWZhbWls eTogJ1RpbWVzIE5ldyBSb21hbiciIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFu Zz1FTi1VUz48QSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly96 YWplbC1wcmVzcy5jb20vemFqZWxjcC9jZ2l3ZWIvd2VibWFpbC5oaW5ldC5uZXQvaW5kZXguaHRt bCI+PFNQQU4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1TcGVsbEU+PFNQ QU4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iRk9OVC1GQU1JTFk6ICdN UyBNaW5jaG8nOyBtc28tYmlkaS1mb250LWZhbWlseTogJ01TIE1pbmNobyciPiYjMzU1MzE7JiMz MDkwNjsmIzIzNDUwOyYjMjQ3NDQ7JiMzMDM0MDsmIzI0MTE1OzwvU1BBTj48U1BBTiANCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJGT05ULUZBTUlMWTogJ0FyaWFsIFVuaWNv ZGUgTVMnLCdzYW5zLXNlcmlmJzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcg Um9tYW4nIj4mIzI1MTQyOyYjNjUyOTI7JiMzNTUzMTsmIzI1MzUzOyYjMTk5Nzk7JiMyMTAxNTs8 L1NQQU4+PC9TUEFOPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9 IkZPTlQtRkFNSUxZOiAnQXJpYWwgVW5pY29kZSBNUycsJ3NhbnMtc2VyaWYnOyBtc28tZmFyZWFz dC1mb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbiciPiYjNjUzMDY7PC9TUEFOPjwvQT48bzpw PjwvbzpwPjwvU1BBTj48L0I+PC9QPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+PC9ESVY+DQog ICAgICAgICAgICAgICAgICAgICAgICA8UCBjbGFzcz1Nc29Ob3JtYWw+PEIgDQogICAgICAgICAg ICAgICAgICAgICAgICBzdHlsZT0ibXNvLWJpZGktZm9udC13ZWlnaHQ6IG5vcm1hbCI+PFNQQU4g DQogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQt U0laRTogMjJwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nIiAN CiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+PG86cD4mbmJzcDs8L286cD48L1NQ QU4+PC9CPjwvUD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxESVYgYWxpZ249Y2VudGVyPg0K ICAgICAgICAgICAgICAgICAgICAgICAgPFRBQkxFIA0KICAgICAgICAgICAgICAgICAgICAgICAg c3R5bGU9IldJRFRIOiAxMjUuMjVwdDsgbXNvLXBhZGRpbmctYWx0OiAwY20gMGNtIDBjbSAwY207 IG1zby1jZWxsc3BhY2luZzogMGNtOyBtc28teWZ0aS10Ymxsb29rOiAxMTg0IiANCiAgICAgICAg ICAgICAgICAgICAgICAgIGNsYXNzPU1zb05vcm1hbFRhYmxlIGJvcmRlcj0wIGNlbGxTcGFjaW5n PTAgDQogICAgICAgICAgICAgICAgICAgICAgICBjZWxsUGFkZGluZz0wIHdpZHRoPTE2NyBoZWln aHQ9NzU+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxUQk9EWT4NCiAgICAgICAgICAgICAg ICAgICAgICAgICAgPFRSIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iSEVJR0hU OiAxNDYuMTVwdDsgbXNvLXlmdGktaXJvdzogMDsgbXNvLXlmdGktZmlyc3Ryb3c6IHllczsgbXNv LXlmdGktbGFzdHJvdzogeWVzIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQgDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IlBBRERJTkctQk9UVE9NOiAwY207IFBB RERJTkctTEVGVDogMGNtOyBCT1JERVItU1BBQ0lORzogMnB4OyBQQURESU5HLVJJR0hUOiAwY207 IFdPUkQtV1JBUDogYnJlYWstd29yZDsgSEVJR0hUOiAxNDYuMTVwdDsgUEFERElORy1UT1A6IDBj bSIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZD1oaW5ldCUyMGFjdGl2 YXRpb24lMjAoMiktaW5leHBsb3Jlcl9maWxlcy9tYWlsYnV0dG9uLmdpZj4NCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDxQIHN0eWxlPSJURVhULUFMSUdOOiBjZW50ZXI7IE1BUkdJTjog MGNtIDBjbSAwcHQiIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ249Y2VudGVy PjxCIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9Im1zby1iaWRpLWZvbnQt d2VpZ2h0OiBub3JtYWwiPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5 bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05ULVNJWkU6IDIycHQiIA0KICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbGFuZz1FTi1VUz48QSANCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHN0eWxlPSJPVVRMSU5FLVNUWUxFOiBub25lOyBPVVRMSU5FLUNPTE9SOiBpbnZlcnQ7IE9V VExJTkUtV0lEVEg6IDBweCIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPSJo dHRwOi8vemFqZWwtcHJlc3MuY29tL3phamVsY3AvY2dpd2ViL3dlYm1haWwuaGluZXQubmV0L2lu ZGV4Lmh0bWwiIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PV9ibGFuaz48 U1BBTiBjbGFzcz1TcGVsbEU+PFNQQU4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz dHlsZT0iRk9OVC1GQU1JTFk6ICdNUyBNaW5jaG8nOyBDT0xPUjogd2hpdGU7IG1zby1iaWRpLWZv bnQtZmFtaWx5OiAnTVMgTWluY2hvJzsgbXNvLWJpZGktZm9udC13ZWlnaHQ6IGJvbGQiPiYjMjg2 MDg7JiMyNzk2Mzs8L1NQQU4+PC9TUEFOPjwvQT48bzpwPjwvbzpwPjwvU1BBTj48L0I+PC9QPjwv VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+PC9ESVY+DQogICAgICAgICAgICAgICAgICAgICAgICA8 UCBzdHlsZT0iVEVYVC1BTElHTjogY2VudGVyIiBjbGFzcz1Nc29Ob3JtYWwgDQogICAgICAgICAg ICAgICAgICAgICAgICBhbGlnbj1jZW50ZXI+PEIgDQogICAgICAgICAgICAgICAgICAgICAgICBz dHlsZT0ibXNvLWJpZGktZm9udC13ZWlnaHQ6IG5vcm1hbCI+PFNQQU4gDQogICAgICAgICAgICAg ICAgICAgICAgICBzdHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtU0laRTogMTBwdDsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nIiANCiAgICAgICAgICAgICAg ICAgICAgICAgIGxhbmc9RU4tVVM+PG86cD48L286cD48L1NQQU4+PC9CPjwvUD48L1REPjwvVFI+ PC9UQk9EWT48L1RBQkxFPjwvRElWPg0KICAgICAgICAgICAgICAgICAgPFAgc3R5bGU9IlRFWFQt QUxJR046IGNlbnRlciIgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWNlbnRlcj48QiANCiAgICAgICAg ICAgICAgICAgIHN0eWxlPSJtc28tYmlkaS1mb250LXdlaWdodDogbm9ybWFsIj48U1BBTiANCiAg ICAgICAgICAgICAgICAgIHN0eWxlPSJMSU5FLUhFSUdIVDogMTE1JTsgRk9OVC1TSVpFOiAxMHB0 OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbiciIA0KICAgICAgICAg ICAgICAgICAgbGFuZz1FTi1VUz48bzpwPjwvbzpwPjwvU1BBTj48L0I+PC9QPjwvVEQ+PC9UUj4N CiAgICAgICAgICAgICAgPFRSIHN0eWxlPSJtc28teWZ0aS1pcm93OiAxIj4NCiAgICAgICAgICAg ICAgICA8VEQgDQogICAgICAgICAgICAgICAgc3R5bGU9IlBBRERJTkctQk9UVE9NOiAwY207IFBB RERJTkctTEVGVDogMGNtOyBCT1JERVItU1BBQ0lORzogMnB4OyBQQURESU5HLVJJR0hUOiAwY207 IFdPUkQtV1JBUDogYnJlYWstd29yZDsgUEFERElORy1UT1A6IDBjbSI+DQogICAgICAgICAgICAg ICAgICA8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCI+PEIgDQogICAgICAgICAgICAgICAg ICBzdHlsZT0ibXNvLWJpZGktZm9udC13ZWlnaHQ6IG5vcm1hbCI+PFNQQU4gDQogICAgICAgICAg ICAgICAgICBzdHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtRkFNSUxZOiAnTVMgTWluY2hv JzsgRk9OVC1TSVpFOiAyMnB0OyBtc28tYmlkaS1mb250LWZhbWlseTogJ01TIE1pbmNobyciIA0K ICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz48bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L0I+ PC9QPg0KICAgICAgICAgICAgICAgICAgPFAgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxC IA0KICAgICAgICAgICAgICAgICAgc3R5bGU9Im1zby1iaWRpLWZvbnQtd2VpZ2h0OiBub3JtYWwi PjxTUEFOIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05U LUZBTUlMWTogJ01TIE1pbmNobyc7IEZPTlQtU0laRTogMjJwdDsgbXNvLWJpZGktZm9udC1mYW1p bHk6ICdNUyBNaW5jaG8nIiANCiAgICAgICAgICAgICAgICAgIGxhbmc9RU4tVVM+PG86cD4mbmJz cDs8L286cD48L1NQQU4+PC9CPjwvUD4NCiAgICAgICAgICAgICAgICAgIDxQIHN0eWxlPSJNQVJH SU46IDBjbSAwY20gMHB0Ij48U1BBTiBjbGFzcz1TcGVsbEU+PEIgDQogICAgICAgICAgICAgICAg ICBzdHlsZT0ibXNvLWJpZGktZm9udC13ZWlnaHQ6IG5vcm1hbCI+PFNQQU4gDQogICAgICAgICAg ICAgICAgICBzdHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQtRkFNSUxZOiAnTVMgTWluY2hv JzsgRk9OVC1TSVpFOiAyMnB0OyBtc28tYmlkaS1mb250LWZhbWlseTogJ01TIE1pbmNobyciIA0K ICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz4mIzI0NzQ0OyYjMjAwNjM7JiMyMTQ4NzsmIzIw MTk3OyYjNDA2NzA7JiMyNTgwMjsmIzE5OTc5OyYjMzg3NTQ7JiMzMDM0MDsmIzM3ODMyOyYjMjU1 MDk7JiM2NTI5MjsmIzI0NzQ0OyYjMzAzNDA7JiMyODY4NzsmIzM1MjYxOyYjMjIxMjA7PC9TUEFO PjwvQj48L1NQQU4+PEIgDQogICAgICAgICAgICAgICAgICBzdHlsZT0ibXNvLWJpZGktZm9udC13 ZWlnaHQ6IG5vcm1hbCI+PFNQQU4gDQogICAgICAgICAgICAgICAgICBzdHlsZT0iTElORS1IRUlH SFQ6IDExNSU7IEZPTlQtRkFNSUxZOiAnTVMgTWluY2hvJzsgRk9OVC1TSVpFOiAyMnB0OyBtc28t YmlkaS1mb250LWZhbWlseTogJ01TIE1pbmNobyciIA0KICAgICAgICAgICAgICAgICAgbGFuZz1F Ti1VUz48bzpwPjwvbzpwPjwvU1BBTj48L0I+PC9QPg0KICAgICAgICAgICAgICAgICAgPFAgc3R5 bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxCIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9Im1z by1iaWRpLWZvbnQtd2VpZ2h0OiBub3JtYWwiPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgc3R5 bGU9IkxJTkUtSEVJR0hUOiAxMTUlOyBGT05ULVNJWkU6IDIycHQiIGxhbmc9RU4tVVM+PEEgDQog ICAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vemFqZWwtcHJlc3MuY29tL3phamVsY3AvY2dp d2ViL3dlYm1haWwuaGluZXQubmV0L2luZGV4Lmh0bWwiIA0KICAgICAgICAgICAgICAgICAgdGFy Z2V0PV9ibGFuaz5odHRwOi8vemFqZWwtcHJlc3MuY29tL3phamVsY3AvY2dpd2ViL3dlYm1haWwu aGluZXQubmV0L2luZGV4Lmh0bWw8L0E+PG86cD48L286cD48L1NQQU4+PC9CPjwvUD48L1REPjwv VFI+DQogICAgICAgICAgICAgIDxUUiANCiAgICAgICAgICAgICAgc3R5bGU9IkhFSUdIVDogMjUu MnB0OyBtc28teWZ0aS1pcm93OiAyOyBtc28teWZ0aS1sYXN0cm93OiB5ZXMiPg0KICAgICAgICAg ICAgICAgIDxURCANCiAgICAgICAgICAgICAgICBzdHlsZT0iUEFERElORy1CT1RUT006IDBjbTsg UEFERElORy1MRUZUOiAwY207IEJPUkRFUi1TUEFDSU5HOiAycHg7IFBBRERJTkctUklHSFQ6IDBj bTsgV09SRC1XUkFQOiBicmVhay13b3JkOyBIRUlHSFQ6IDI1LjJwdDsgUEFERElORy1UT1A6IDBj bSI+DQogICAgICAgICAgICAgICAgICA8UCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCI+PEIg DQogICAgICAgICAgICAgICAgICBzdHlsZT0ibXNvLWJpZGktZm9udC13ZWlnaHQ6IG5vcm1hbCI+ PFNQQU4gDQogICAgICAgICAgICAgICAgICBzdHlsZT0iTElORS1IRUlHSFQ6IDExNSU7IEZPTlQt RkFNSUxZOiAnTVMgTWluY2hvJzsgRk9OVC1TSVpFOiAyMnB0OyBtc28tYmlkaS1mb250LWZhbWls eTogJ01TIE1pbmNobyciIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz4mIzIyOTE0OyYj MjYzNzc7JiMyMDIxOTsmIzIwMzA5OyYjMjE4Mzk7JiMzODk4ODsmIzY1MjkyOyYjMzU1MzE7JiMz ODU2ODsmIzI2MTc4OyYjMzMyODc7JiMyNTEwNTsmIzIwNDk3OyYjMzI4Nzk7JiMzMjM2Mzs8L1NQ QU4+PC9CPjxCIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9Im1zby1iaWRpLWZvbnQtd2VpZ2h0 OiBub3JtYWwiPjxTUEFOIA0KICAgICAgICAgICAgICAgICAgc3R5bGU9IkxJTkUtSEVJR0hUOiAx MTUlOyBGT05ULVNJWkU6IDIycHQiIA0KICAgICAgICAgICAgICAgICAgbGFuZz1FTi1VUz5AMDgw MC0wODAtNDEyMjxvOnA+PC9vOnA+PC9TUEFOPjwvQj48L1A+PC9URD48L1RSPjwvVEJPRFk+PC9U QUJMRT48L0RJVj4NCiAgICAgICAgICAgIDxQIHN0eWxlPSJURVhULUFMSUdOOiBjZW50ZXIiIGNs YXNzPU1zb05vcm1hbCBhbGlnbj1jZW50ZXI+PFNQQU4gDQogICAgICAgICAgICBzdHlsZT0iTElO RS1IRUlHSFQ6IDExNSU7IEZPTlQtU0laRTogMTBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 ICdUaW1lcyBOZXcgUm9tYW4nIiANCiAgICAgICAgICAgIGxhbmc9RU4tVVM+PG86cD48L286cD48 L1NQQU4+PC9QPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+PC9ESVY+PC9URD48L1RSPg0KICA8 VFIgc3R5bGU9IkhFSUdIVDogNzQuNzVwdDsgbXNvLXlmdGktaXJvdzogMTsgbXNvLXlmdGktbGFz dHJvdzogeWVzIj4NCiAgICA8VEQgDQogICAgc3R5bGU9IlBBRERJTkctQk9UVE9NOiAwY207IFBB RERJTkctTEVGVDogMGNtOyBCT1JERVItU1BBQ0lORzogMnB4OyBQQURESU5HLVJJR0hUOiAwY207 IFdPUkQtV1JBUDogYnJlYWstd29yZDsgQkFDS0dST1VORDogIzFiNzViYjsgSEVJR0hUOiA3NC43 NXB0OyBQQURESU5HLVRPUDogMGNtIj4NCiAgICAgIDxQIHN0eWxlPSJURVhULUFMSUdOOiBjZW50 ZXI7IG1zby1saW5lLWhlaWdodC1hbHQ6IDE1LjBwdCIgY2xhc3M9TXNvTm9ybWFsIA0KICAgICAg YWxpZ249Y2VudGVyPjxTUEFOIGNsYXNzPVNwZWxsRT48U1BBTiANCiAgICAgIHN0eWxlPSJGT05U LUZBTUlMWTogJ01TIE1pbmNobyc7IENPTE9SOiB3aGl0ZTsgRk9OVC1TSVpFOiAyMHB0OyBtc28t YmlkaS1mb250LWZhbWlseTogJ01TIE1pbmNobyciIA0KICAgICAgbGFuZz1FTi1VUz4mIzIwMDEz OyYjMzM3NzU7JiMzODY1MTsmIzIwNDQ5OyYjMjU5NzY7JiMyNTgxODsmIzM2ODkwOyYjMjA0NDk7 JiMyMDk5ODsmIzIwODQ0OyYjMjE0OTY7PC9TUEFOPjwvU1BBTj48U1BBTiANCiAgICAgIHN0eWxl PSJGT05ULUZBTUlMWTogJ0FyaWFsJywnc2Fucy1zZXJpZic7IENPTE9SOiB3aGl0ZTsgRk9OVC1T SVpFOiAyMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbiciIA0K ICAgICAgbGFuZz1FTi1VUz48QlI+PC9TUEFOPjxTUEFOIA0KICAgICAgc3R5bGU9IkZPTlQtRkFN SUxZOiAnTVMgTWluY2hvJzsgQ09MT1I6IHdoaXRlOyBGT05ULVNJWkU6IDIwcHQ7IG1zby1iaWRp LWZvbnQtZmFtaWx5OiAnTVMgTWluY2hvJyIgDQogICAgICBsYW5nPUVOLVVTPiYjMjM0NTg7PC9T UEFOPjxTUEFOIA0KICAgICAgc3R5bGU9IkZPTlQtRkFNSUxZOiAnQXJpYWwgVW5pY29kZSBNUycs J3NhbnMtc2VyaWYnOyBDT0xPUjogd2hpdGU7IEZPTlQtU0laRTogMjBwdDsgbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nIiANCiAgICAgIGxhbmc9RU4tVVM+JiMyNTE0 MjsmIzI2MzgxOyYjMjEyMDk7JiMyOTEwNTsmIzMyMjE4OyYjNjUzMDY7PC9TUEFOPjxTUEFOIA0K ICAgICAgc3R5bGU9IkZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgQ09MT1I6IHdo aXRlOyBGT05ULVNJWkU6IDIwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiAnVGltZXMgTmV3 IFJvbWFuJyIgDQogICAgICBsYW5nPUVOLVVTPjA4MDAtMDgwLTQxMjI8bzpwPjwvbzpwPjwvU1BB Tj48L1A+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT48L0RJVj4NCjxQPjxTUEFOIGxhbmc9RU4t VVM+PC9TUEFOPiZuYnNwOzwvUD48L0RJVj48L0JPRFk+PC9IVE1MPg0K ----=BOUNDARY_4231437_EUTF_YFVA_NKYV_CLYQ-- From david@fromorbit.com Tue Apr 23 15:50:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 06D7129DFA for ; Tue, 23 Apr 2013 15:50:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7B5B7AC002 for ; Tue, 23 Apr 2013 13:50:01 -0700 (PDT) X-ASG-Debug-ID: 1366750198-04cbb057f851dc90001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id i200KTQySBxl6HfZ for ; Tue, 23 Apr 2013 13:49:59 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjURAJ/wdlF5LKjR/2dsb2JhbABQgwaCfrZihR8EAYEEF3SCHwEBBAE6HCMQCAMOBgQJJQ8FJQMhExuHcwW+FBWNdoEdB4NJA5cZigKHHIMgKoEwJA Received: from ppp121-44-168-209.lns20.syd7.internode.on.net (HELO dastard) ([121.44.168.209]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Apr 2013 06:19:57 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UUkA0-0005zw-4g; Wed, 24 Apr 2013 06:49:56 +1000 Date: Wed, 24 Apr 2013 06:49:56 +1000 From: Dave Chinner To: Chandra Seetharaman Cc: Mark Tinguely , Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails Message-ID: <20130423204956.GM10481@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails References: <20130419204102.736961610@sgi.com> <20130421174107.007313126@sgi.com> <5174603A.8030208@sandeen.net> <51753EDE.6000301@sgi.com> <51754A13.5000808@sandeen.net> <5175532B.3050509@sgi.com> <20130422233033.GK30622@dastard> <51769111.3050103@sgi.com> <1366732475.3762.32402.camel@chandra-dt.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1366732475.3762.32402.camel@chandra-dt.ibm.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: 1366750198 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128965 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 23, 2013 at 10:54:35AM -0500, Chandra Seetharaman wrote: > On Tue, 2013-04-23 at 08:48 -0500, Mark Tinguely wrote: > > On 04/22/13 18:30, Dave Chinner wrote: > > > On Mon, Apr 22, 2013 at 10:11:39AM -0500, Mark Tinguely wrote: > > >> #6 [ffff880135603980] _xfs_buf_find at ffffffffa01a7fef [xfs] > > >> #7 [ffff8801356039f0] xfs_buf_get at ffffffffa01a824a [xfs] > > >> #8 [ffff880135603a30] xfs_buf_read at ffffffffa01a83a4 [xfs] > > >> #9 [ffff880135603a60] xlog_recover_inode_pass2 at ffffffffa0193629 [xfs] > > > > > > So it's the same problem as this bug fix addresses: > > > > > > commit 10616b806d1d7835b1d23b8d75ef638f92cb98b6 > > > Author: Dave Chinner > > > Date: Mon Jan 21 23:53:52 2013 +1100 > > > > > > xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end > > > > > > When _xfs_buf_find is passed an out of range address, it will fail > > > to find a relevant struct xfs_perag and oops with a null > > > dereference. This can happen when trying to walk a filesystem with a > > > metadata inode that has a partially corrupted extent map (i.e. the > > > block number returned is corrupt, but is otherwise intact) and we > > > try to read from the corrupted block address. > > > > > > In this case, just fail the lookup. If it is readahead being issued, > > > it will simply not be done, but if it is real read that fails we > > > will get an error being reported. Ideally this case should result > > > in an EFSCORRUPTED error being reported, but we cannot return an > > > error through xfs_buf_read() or xfs_buf_get() so this lookup failure > > > may result in ENOMEM or EIO errors being reported instead. > > > > > > Signed-off-by: Dave Chinner > > > Reviewed-by: Brian Foster > > > Reviewed-by: Ben Myers > > > Signed-off-by: Ben Myers > > > > > >> The recovery value is bad and is a problem on its own, but XFS does > > >> not verify the validity of ag number when doing a xfs_perag_get(). I'd be interested to know why the inode in recovery is bad - is this on a kernel that CRCs the log records? Or a result of some other bug or hardware corruption? i.e. xfs_perag_get is not the problem here, it's a corruption of a trusted inode number and we failed to detect that corruption.... > > > Right, that's what the above fix does, but it can't be done on older > > > kernels because grwofs relies on being able to get buffers beyond > > > the existing filesystem limits... > > > > Thank-you, that make sense. > > > > I still do not like assuming xfs_perag_get() will always return a valid > > perag pointer. > > I second that. > > Is there any reason we should _not_ check the return value from > xfs_perag_get() for NULL ? Yes. The input AG should already be bounds checked before the perag is looked up. If we are asking for an invalid AG, then the bug is not in xfs_perag_get(), it is in the code that is calling it. i.e. error checking the xfs_perag_get() function is a band-aid for improper object validation, not a solution to the problem. That is, this function was designed to be extremely low overhead and only to be handed validated data. If it is only handed validated data, then it is guaranteed to return a valid per-ag structure, and therefore error checking the return value is not necessary. Because xfs_perag_get is not designed to handle untrusted data it is up to the calling code to first validate the AGNO that is passed to xfs_perag_get(). If we aren't first validating the object that the AGNO is derived from, then the calling code has failed to validate it's inputs sufficiently, and lots of other things can go wrong (not just the xfs_perag_get() call). For example, the above commit is a catchall for bad block numbers being looked up in extent records. It was a quick fix, not a targeted fix for the reported problems. For bad block numbers in extents, we should be doing is validating block numbers when they are looked up are within the filesystem bounds (eg. inside xfs_bmapi_read/xfs_bmapi_write) so that a bad block number is caught at lookup time, not at IO time. We only do that for extents that point to block 0. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 23 16:02:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C5E4A29DFA for ; Tue, 23 Apr 2013 16:02:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52EEDAC006 for ; Tue, 23 Apr 2013 14:02:45 -0700 (PDT) X-ASG-Debug-ID: 1366750947-04cb6c6e2b419620001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id fwDvGdMAqgFLDql9 for ; Tue, 23 Apr 2013 14:02:28 -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: AjURAHj2dlF5LKjR/2dsb2JhbABQgwaCfrZihR8EAYEEF3SCHwEBBTocIxAIAw4HAwklDwUlAyETiBO+CRWNdoEdB4NJA5cZigKHHIMgKg Received: from ppp121-44-168-209.lns20.syd7.internode.on.net (HELO dastard) ([121.44.168.209]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Apr 2013 06:32:27 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UUkM6-00061u-MJ; Wed, 24 Apr 2013 07:02:26 +1000 Date: Wed, 24 Apr 2013 07:02:26 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: introduce CONFIG_XFS_WARN Message-ID: <20130423210226.GN10481@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: introduce CONFIG_XFS_WARN References: <1366699138-24055-1-git-send-email-david@fromorbit.com> <5176833C.8070305@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5176833C.8070305@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: 1366750947 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128965 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 23, 2013 at 08:49:00AM -0400, Brian Foster wrote: > On 04/23/2013 02:38 AM, Dave Chinner wrote: > > From: Dave Chinner > > > ... > > diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h > > index cd29f61..d3e0679 100644 > > --- a/fs/xfs/xfs_trans.h > > +++ b/fs/xfs/xfs_trans.h > > @@ -405,7 +405,7 @@ typedef struct xfs_trans { > > int64_t t_res_fdblocks_delta; /* on-disk only chg */ > > int64_t t_frextents_delta;/* superblock freextents chg*/ > > int64_t t_res_frextents_delta; /* on-disk only chg */ > > -#ifdef DEBUG > > +#if defined(DEBUG) || defined(XFS_WARN) > > int64_t t_ag_freeblks_delta; /* debugging counter */ > > int64_t t_ag_flist_delta; /* debugging counter */ > > int64_t t_ag_btree_delta; /* debugging counter */ > > > > I see some ASSERT() calls using these counters but the macros that > manage them appear to be defined against DEBUG only (further down in > xfs_trans.h). This looks like it would lead to spurious warnings..? Yes, you are right - it should lead to warnings being emitted, but I didn't see any when running xfstests. I'll fix it up. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Tue Apr 23 16:06:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9019C29DFA for ; Tue, 23 Apr 2013 16:06:54 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5B94930407A; Tue, 23 Apr 2013 14:06:51 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id E5074500B4E; Tue, 23 Apr 2013 16:06:50 -0500 (CDT) Date: Tue, 23 Apr 2013 16:06:50 -0500 From: Ben Myers To: Lukas Czerner Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v3 05/18] xfs: use ->invalidatepage() length argument Message-ID: <20130423210650.GA2408@sgi.com> References: <1365498867-27782-1-git-send-email-lczerner@redhat.com> <1365498867-27782-6-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1365498867-27782-6-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Lukas, On Tue, Apr 09, 2013 at 11:14:14AM +0200, Lukas Czerner wrote: > ->invalidatepage() aop now accepts range to invalidate so we can make > use of it in xfs_vm_invalidatepage() > > Signed-off-by: Lukas Czerner > Cc: xfs@oss.sgi.com > --- > fs/xfs/xfs_aops.c | 5 +++-- > fs/xfs/xfs_trace.h | 41 ++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 43 insertions(+), 3 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index e426796..e8018d3 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -826,8 +826,9 @@ xfs_vm_invalidatepage( > unsigned int offset, > unsigned int length) > { > - trace_xfs_invalidatepage(page->mapping->host, page, offset); > - block_invalidatepage(page, offset, PAGE_CACHE_SIZE - offset); > + trace_xfs_invalidatepage(page->mapping->host, page, offset, > + length); > + block_invalidatepage(page, offset, length); > } > > /* > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index 16a8129..91d6434 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -991,7 +991,46 @@ DEFINE_EVENT(xfs_page_class, name, \ > TP_ARGS(inode, page, off)) > DEFINE_PAGE_EVENT(xfs_writepage); > DEFINE_PAGE_EVENT(xfs_releasepage); > -DEFINE_PAGE_EVENT(xfs_invalidatepage); I think it might be better if we continue using the xfs_invalidatepage trace point as part of the xfs_page_class rather than as a separate trace point, like below. Else this looks great. Reviewed-by: Ben Myers Regards, Ben Index: xfs/fs/xfs/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/xfs_aops.c +++ xfs/fs/xfs/xfs_aops.c @@ -825,7 +825,7 @@ xfs_vm_invalidatepage( struct page *page, unsigned long offset) { - trace_xfs_invalidatepage(page->mapping->host, page, offset); + trace_xfs_invalidatepage(page->mapping->host, page, offset, 0); block_invalidatepage(page, offset); } @@ -920,7 +920,7 @@ xfs_vm_writepage( int count = 0; int nonblocking = 0; - trace_xfs_writepage(inode, page, 0); + trace_xfs_writepage(inode, page, 0, 0); ASSERT(page_has_buffers(page)); @@ -1151,7 +1151,7 @@ xfs_vm_releasepage( { int delalloc, unwritten; - trace_xfs_releasepage(page->mapping->host, page, 0); + trace_xfs_releasepage(page->mapping->host, page, 0, 0); xfs_count_page_state(page, &delalloc, &unwritten); Index: xfs/fs/xfs/xfs_trace.h =================================================================== --- xfs.orig/fs/xfs/xfs_trace.h +++ xfs/fs/xfs/xfs_trace.h @@ -974,14 +974,16 @@ DEFINE_RW_EVENT(xfs_file_splice_read); DEFINE_RW_EVENT(xfs_file_splice_write); DECLARE_EVENT_CLASS(xfs_page_class, - TP_PROTO(struct inode *inode, struct page *page, unsigned long off), - TP_ARGS(inode, page, off), + TP_PROTO(struct inode *inode, struct page *page, unsigned long off, + unsigned int len), + TP_ARGS(inode, page, off, len), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_ino_t, ino) __field(pgoff_t, pgoff) __field(loff_t, size) __field(unsigned long, offset) + __field(unsigned int, length) __field(int, delalloc) __field(int, unwritten) ), @@ -995,24 +997,27 @@ DECLARE_EVENT_CLASS(xfs_page_class, __entry->pgoff = page_offset(page); __entry->size = i_size_read(inode); __entry->offset = off; + __entry->length = len; __entry->delalloc = delalloc; __entry->unwritten = unwritten; ), TP_printk("dev %d:%d ino 0x%llx pgoff 0x%lx size 0x%llx offset %lx " - "delalloc %d unwritten %d", + "length %x delalloc %d unwritten %d", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, __entry->pgoff, __entry->size, __entry->offset, + __entry->length, __entry->delalloc, __entry->unwritten) ) #define DEFINE_PAGE_EVENT(name) \ DEFINE_EVENT(xfs_page_class, name, \ - TP_PROTO(struct inode *inode, struct page *page, unsigned long off), \ - TP_ARGS(inode, page, off)) + TP_PROTO(struct inode *inode, struct page *page, unsigned long off, \ + unsigned int len), \ + TP_ARGS(inode, page, off, len)) DEFINE_PAGE_EVENT(xfs_writepage); DEFINE_PAGE_EVENT(xfs_releasepage); DEFINE_PAGE_EVENT(xfs_invalidatepage); From bpm@sgi.com Tue Apr 23 18:02:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 311447F37 for ; Tue, 23 Apr 2013 18:02:49 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 038C0304077; Tue, 23 Apr 2013 16:02:45 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id A9BBD500B4C; Tue, 23 Apr 2013 18:02:45 -0500 (CDT) Date: Tue, 23 Apr 2013 18:02:45 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 16/22] xfs: add CRCs to attr leaf blocks Message-ID: <20130423230245.GC29359@sgi.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-17-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-17-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Wed, Apr 03, 2013 at 04:11:26PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Signed-off-by: Dave Chinner Comments below. > +static bool > +xfs_attr3_leaf_verify( > struct xfs_buf *bp) > { > struct xfs_mount *mp = bp->b_target->bt_mount; > - struct xfs_attr_leaf_hdr *hdr = bp->b_addr; > - int block_ok = 0; > + struct xfs_attr_leafblock *leaf = bp->b_addr; > + struct xfs_attr3_icleaf_hdr ichdr; > > - block_ok = hdr->info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC); > - if (!block_ok) { > - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); > - xfs_buf_ioerror(bp, EFSCORRUPTED); > + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); > + > + if (xfs_sb_version_hascrc(&mp->m_sb)) { > + struct xfs_da3_node_hdr *hdr3 = bp->b_addr; > + > + if (ichdr.magic != XFS_ATTR3_LEAF_MAGIC) > + return false; > + > + if (!uuid_equal(&hdr3->info.uuid, &mp->m_sb.sb_uuid)) > + return false; > + if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn) > + return false; > + } else { > + if (ichdr.magic != XFS_ATTR_LEAF_MAGIC) > + return false; > } > + if (ichdr.count == 0) > + return false; > + > + /* XXX: need to range check rest of attr header values */ > + /* XXX: hash order check? */ Seems reasonable for debug code. Is that coming along in a subsequent patch? > int > -xfs_attr_leaf_to_shortform( > - struct xfs_buf *bp, > - xfs_da_args_t *args, > - int forkoff) > +xfs_attr3_leaf_to_shortform( > + struct xfs_buf *bp, > + struct xfs_da_args *args, > + int forkoff) > { > - xfs_attr_leafblock_t *leaf; > - xfs_attr_leaf_entry_t *entry; > - xfs_attr_leaf_name_local_t *name_loc; > - xfs_da_args_t nargs; > - xfs_inode_t *dp; > - char *tmpbuffer; > - int error, i; > + struct xfs_attr_leafblock *leaf; > + struct xfs_attr3_icleaf_hdr ichdr; > + struct xfs_attr_leaf_entry *entry; > + struct xfs_attr_leaf_name_local *name_loc; > + struct xfs_da_args nargs; > + struct xfs_inode *dp = args->dp; > + char *tmpbuffer; > + int error; > + int i; > > trace_xfs_attr_leaf_to_sf(args); > > - dp = args->dp; > tmpbuffer = kmem_alloc(XFS_LBSIZE(dp->i_mount), KM_SLEEP); > - ASSERT(tmpbuffer != NULL); > + if (!tmpbuffer) > + return ENOMEM; > > - ASSERT(bp != NULL); > memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(dp->i_mount)); > + > leaf = (xfs_attr_leafblock_t *)tmpbuffer; > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); > + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); > + entry = xfs_attr3_leaf_entryp(leaf); > + > + /* XXX (dgc): buffer is about to be marked stale - why zero it? */ > memset(bp->b_addr, 0, XFS_LBSIZE(dp->i_mount)); Good point. Why do we need a temporary buffer here? It seems like we could keep the leaf around long enough to copy from it directly into shortform. > int > -xfs_attr_leaf_to_node(xfs_da_args_t *args) > +xfs_attr3_leaf_to_node( > + struct xfs_da_args *args) > { > - xfs_attr_leafblock_t *leaf; > - xfs_da_intnode_t *node; > - xfs_inode_t *dp; > - struct xfs_buf *bp1, *bp2; > - xfs_dablk_t blkno; > - int error; > + struct xfs_attr_leafblock *leaf; > + struct xfs_attr3_icleaf_hdr icleafhdr; > + struct xfs_attr_leaf_entry *entries; > struct xfs_da_node_entry *btree; > + struct xfs_da3_icnode_hdr icnodehdr; > + struct xfs_da_intnode *node; > + struct xfs_inode *dp = args->dp; > + struct xfs_mount *mp = dp->i_mount; > + struct xfs_buf *bp1 = NULL; > + struct xfs_buf *bp2 = NULL; > + xfs_dablk_t blkno; > + int error; > > trace_xfs_attr_leaf_to_node(args); > > - dp = args->dp; > - bp1 = bp2 = NULL; > error = xfs_da_grow_inode(args, &blkno); > if (error) > goto out; > - error = xfs_attr_leaf_read(args->trans, args->dp, 0, -1, &bp1); > + error = xfs_attr3_leaf_read(args->trans, dp, 0, -1, &bp1); > if (error) > goto out; > > - bp2 = NULL; > - error = xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp2, > - XFS_ATTR_FORK); > + error = xfs_da_get_buf(args->trans, dp, blkno, -1, &bp2, XFS_ATTR_FORK); > if (error) > goto out; > + > + /* copy leaf to new buffer, update identifiers */ > bp2->b_ops = bp1->b_ops; > - memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(dp->i_mount)); > - bp1 = NULL; > - xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(dp->i_mount) - 1); > + memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp)); > + if (xfs_sb_version_hascrc(&mp->m_sb)) { > + struct xfs_da3_blkinfo *hdr3 = bp2->b_addr; > + hdr3->blkno = cpu_to_be64(bp2->b_bn); Ok, so the memcpy above got uuid, ino, etc, and we only need to update blkno. > @@ -963,52 +1120,62 @@ out: > * or a leaf in a node attribute list. > */ > STATIC int > -xfs_attr_leaf_create( > - xfs_da_args_t *args, > - xfs_dablk_t blkno, > - struct xfs_buf **bpp) > +xfs_attr3_leaf_create( > + struct xfs_da_args *args, > + xfs_dablk_t blkno, > + struct xfs_buf **bpp) > { > - xfs_attr_leafblock_t *leaf; > - xfs_attr_leaf_hdr_t *hdr; > - xfs_inode_t *dp; > - struct xfs_buf *bp; > - int error; > + struct xfs_attr_leafblock *leaf; > + struct xfs_attr3_icleaf_hdr ichdr; > + struct xfs_inode *dp = args->dp; > + struct xfs_mount *mp = dp->i_mount; > + struct xfs_buf *bp; > + int error; > > trace_xfs_attr_leaf_create(args); > > - dp = args->dp; > - ASSERT(dp != NULL); > error = xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp, > XFS_ATTR_FORK); > if (error) > - return(error); > - bp->b_ops = &xfs_attr_leaf_buf_ops; > + return error; > + bp->b_ops = &xfs_attr3_leaf_buf_ops; > leaf = bp->b_addr; > - memset((char *)leaf, 0, XFS_LBSIZE(dp->i_mount)); > - hdr = &leaf->hdr; > - hdr->info.magic = cpu_to_be16(XFS_ATTR_LEAF_MAGIC); > - hdr->firstused = cpu_to_be16(XFS_LBSIZE(dp->i_mount)); > - if (!hdr->firstused) { > - hdr->firstused = cpu_to_be16( > - XFS_LBSIZE(dp->i_mount) - XFS_ATTR_LEAF_NAME_ALIGN); > - } Saw this several times in review. I don't understand why that code would be there, given that we just set firstused to be XFS_LBSIZE, the blocksize of the filesystem. It's dead code now, so it's fine to remove... There must be some history there. Any idea? > @@ -1113,82 +1279,90 @@ xfs_attr_leaf_add( > * and we don't have enough freespace, then compaction will do us > * no good and we should just give up. > */ > - if (!hdr->holes && (sum < entsize)) > - return(XFS_ERROR(ENOSPC)); > + if (!ichdr.holes && sum < entsize) > + return XFS_ERROR(ENOSPC); > > /* > * Compact the entries to coalesce free space. > * This may change the hdr->count via dropping INCOMPLETE entries. > */ > - xfs_attr_leaf_compact(args, bp); > + xfs_attr3_leaf_compact(args, &ichdr, bp); > > /* > * After compaction, the block is guaranteed to have only one > * free region, in freemap[0]. If it is not big enough, give up. > */ > - if (be16_to_cpu(hdr->freemap[0].size) > - < (entsize + sizeof(xfs_attr_leaf_entry_t))) > - return(XFS_ERROR(ENOSPC)); > + if (ichdr.freemap[0].size < (entsize + sizeof(xfs_attr_leaf_entry_t))) { > + tmp = ENOSPC; > + goto out_log_hdr; That represents a change in behavior that I'm not sure about... Before if we had ENOSPC here we would simply return and xfs_addr3_leaf_add_work would not have a chance to log the header. Now... > + } > + > + tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, 0); > > - return(xfs_attr_leaf_add_work(bp, args, 0)); > +out_log_hdr: > + xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); > + xfs_trans_log_buf(args->trans, bp, > + XFS_DA_LOGRANGE(leaf, &leaf->hdr, > + xfs_attr3_leaf_hdr_size(leaf))); We're logging the header here instead of in xfs_attr_leaf_add_work > + return tmp; > } and then returning. I think this would be better with a second goto so that we don't log the header in keeping with the old behavior. > @@ -1232,44 +1406,41 @@ xfs_attr_leaf_add_work( > args->rmtblkcnt = XFS_B_TO_FSB(mp, args->valuelen); > } > xfs_trans_log_buf(args->trans, bp, > - XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), > + XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), > xfs_attr_leaf_entsize(leaf, args->index))); > > /* > * Update the control info for this leaf node > */ > - if (be16_to_cpu(entry->nameidx) < be16_to_cpu(hdr->firstused)) { > - /* both on-disk, don't endian-flip twice */ > - hdr->firstused = entry->nameidx; > - } > - ASSERT(be16_to_cpu(hdr->firstused) >= > - ((be16_to_cpu(hdr->count) * sizeof(*entry)) + sizeof(*hdr))); > - tmp = (be16_to_cpu(hdr->count)-1) * sizeof(xfs_attr_leaf_entry_t) > - + sizeof(xfs_attr_leaf_hdr_t); > - map = &hdr->freemap[0]; > + if (be16_to_cpu(entry->nameidx) < ichdr->firstused) > + ichdr->firstused = be16_to_cpu(entry->nameidx); > + > + ASSERT(ichdr->firstused >= ichdr->count * sizeof(xfs_attr_leaf_entry_t) > + + xfs_attr3_leaf_hdr_size(leaf)); > + tmp = (ichdr->count - 1) * sizeof(xfs_attr_leaf_entry_t) > + + xfs_attr3_leaf_hdr_size(leaf); > + > for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; map++, i++) { Looks like you can get rid of map. > @@ -1286,34 +1457,69 @@ xfs_attr_leaf_compact( > */ > leaf_s = (xfs_attr_leafblock_t *)tmpbuffer; > leaf_d = bp->b_addr; > - hdr_s = &leaf_s->hdr; > - hdr_d = &leaf_d->hdr; > - hdr_d->info = hdr_s->info; /* struct copy */ > - hdr_d->firstused = cpu_to_be16(XFS_LBSIZE(mp)); > - /* handle truncation gracefully */ > - if (!hdr_d->firstused) { > - hdr_d->firstused = cpu_to_be16( > - XFS_LBSIZE(mp) - XFS_ATTR_LEAF_NAME_ALIGN); > - } Another one. Weird. > - hdr_d->usedbytes = 0; > - hdr_d->count = 0; > - hdr_d->holes = 0; > - hdr_d->freemap[0].base = cpu_to_be16(sizeof(xfs_attr_leaf_hdr_t)); > - hdr_d->freemap[0].size = cpu_to_be16(be16_to_cpu(hdr_d->firstused) - > - sizeof(xfs_attr_leaf_hdr_t)); > + ichdr_s = *ichdr_d; /* struct copy */ ichdr_s should be initialized from the copy we have in the temporary buffer rather than from a struct copy of ichdr_d. I understand that what you have here probably works fine, but it is not very obvious, or clear that it was an intentional deviation from the struct copy up above. > + ichdr_d->firstused = XFS_LBSIZE(mp); > + ichdr_d->usedbytes = 0; > + ichdr_d->count = 0; > + ichdr_d->holes = 0; > + ichdr_d->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_s); > + ichdr_d->freemap[0].size = ichdr_d->firstused - ichdr_d->freemap[0].base; > > /* > * Copy all entry's in the same (sorted) order, > * but allocate name/value pairs packed and in sequence. > */ > - xfs_attr_leaf_moveents(leaf_s, 0, leaf_d, 0, > - be16_to_cpu(hdr_s->count), mp); > + xfs_attr3_leaf_moveents(leaf_s, &ichdr_s, 0, leaf_d, ichdr_d, 0, > + ichdr_s.count, mp); > + /* > + * this logs the entire buffer, but the caller must write the header > + * back to the buffer when it is finished modifying it. > + */ > xfs_trans_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); Maybe better to just log the entries here, someday. > @@ -2201,45 +2425,41 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, > /* > * Set up environment. > */ > - ASSERT(leaf_s->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); > - ASSERT(leaf_d->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); > - hdr_s = &leaf_s->hdr; > - hdr_d = &leaf_d->hdr; > - ASSERT((be16_to_cpu(hdr_s->count) > 0) && > - (be16_to_cpu(hdr_s->count) < (XFS_LBSIZE(mp)/8))); > - ASSERT(be16_to_cpu(hdr_s->firstused) >= > - ((be16_to_cpu(hdr_s->count) > - * sizeof(*entry_s))+sizeof(*hdr_s))); > - ASSERT(be16_to_cpu(hdr_d->count) < (XFS_LBSIZE(mp)/8)); > - ASSERT(be16_to_cpu(hdr_d->firstused) >= > - ((be16_to_cpu(hdr_d->count) > - * sizeof(*entry_d))+sizeof(*hdr_d))); > - > - ASSERT(start_s < be16_to_cpu(hdr_s->count)); > - ASSERT(start_d <= be16_to_cpu(hdr_d->count)); > - ASSERT(count <= be16_to_cpu(hdr_s->count)); > + ASSERT(ichdr_s->magic == XFS_ATTR_LEAF_MAGIC || > + ichdr_s->magic == XFS_ATTR3_LEAF_MAGIC); This assert might be unnecessary due to the asserts in hdr_from_disk. > @@ -2286,71 +2504,40 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, > /* > * Zero out the entries we just copied. > */ > - if (start_s == be16_to_cpu(hdr_s->count)) { > + if (start_s == ichdr_s->count) { > tmp = count * sizeof(xfs_attr_leaf_entry_t); > - entry_s = &leaf_s->entries[start_s]; > + entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; > ASSERT(((char *)entry_s + tmp) <= > ((char *)leaf_s + XFS_LBSIZE(mp))); > - memset((char *)entry_s, 0, tmp); > + memset(entry_s, 0, tmp); > } else { > /* > * Move the remaining entries down to fill the hole, > * then zero the entries at the top. > */ > - tmp = be16_to_cpu(hdr_s->count) - count; > - tmp *= sizeof(xfs_attr_leaf_entry_t); > - entry_s = &leaf_s->entries[start_s + count]; > - entry_d = &leaf_s->entries[start_s]; > - memmove((char *)entry_d, (char *)entry_s, tmp); > + tmp = (ichdr_s->count - count) - sizeof(xfs_attr_leaf_entry_t); * Multiply. > @@ -2379,20 +2567,21 @@ xfs_attr_leaf_lasthash( > STATIC int > xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) > { > + struct xfs_attr_leaf_entry *entries; > xfs_attr_leaf_name_local_t *name_loc; > xfs_attr_leaf_name_remote_t *name_rmt; > int size; > > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); I don't see a replacement for this assert. > @@ -2786,38 +3003,44 @@ xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp) > */ > error = xfs_da3_node_read(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK); > if (error) > - return(error); > - blkno = XFS_BUF_ADDR(bp); > + return error; > + blkno = bp->b_bn; I'm a little concerned about the switch from XFS_BUF_ADDR to bp->b_bn here, but have not looked into it yet. If you have a quick explanation, that's great. Otherwise I'll come back to it. > +/* > + * incore, neutral version of the attribute leaf header > + */ > +struct xfs_attr3_icleaf_hdr { > + __uint32_t forw; > + __uint32_t back; > + __uint16_t magic; > + __uint16_t count; > + __uint16_t usedbytes; > + __uint16_t firstused; > + __u8 holes; > + struct { > + __uint16_t base; > + __uint16_t size; > + } freemap[XFS_ATTR_LEAF_MAPSIZE]; Should that be an array of xfs_attr_leaf_map_t? No, that's ondisk format. Nevermind then. > @@ -1479,7 +1480,9 @@ xfs_da3_node_lookup_int( > curr = blk->bp->b_addr; > blk->magic = be16_to_cpu(curr->magic); > > - if (blk->magic == XFS_ATTR_LEAF_MAGIC) { > + if (blk->magic == XFS_ATTR_LEAF_MAGIC || > + blk->magic == XFS_ATTR3_LEAF_MAGIC) { > + blk->magic = XFS_ATTR_LEAF_MAGIC; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ I'm still a little confused by these assignments. I understand you're squashing them down from a comment, and that the correct magic is still in the buffer... I need to find who is looking at blk->magic. Any hints? That's about it for now. Thanks, Ben From david@fromorbit.com Tue Apr 23 19:33:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D6A917F37 for ; Tue, 23 Apr 2013 19:33:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 48946AC00E for ; Tue, 23 Apr 2013 17:33:24 -0700 (PDT) X-ASG-Debug-ID: 1366763600-04cbb057f752a430001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id aRSa96FGyC6LmFCH for ; Tue, 23 Apr 2013 17:33:21 -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: AjkRAKYnd1F5LKjR/2dsb2JhbABKBoMGNoJItmmFHwQBgQUXdIIfAQEFJxMcIxAIAw4HAwklDwUlAyETiBO9VhWNbQmBHQeDSQOTS4NOgSSPeoMgKoEwJA Received: from ppp121-44-168-209.lns20.syd7.internode.on.net (HELO dastard) ([121.44.168.209]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2013 10:03:19 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UUne9-0006XX-Kn; Wed, 24 Apr 2013 10:33:17 +1000 Date: Wed, 24 Apr 2013 10:33:17 +1000 From: Dave Chinner To: Ben Myers Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 15/22] xfs: add CRCs to dir2/da node blocks Message-ID: <20130424003317.GO10481@dastard> X-ASG-Orig-Subj: Re: [PATCH 15/22] xfs: add CRCs to dir2/da node blocks References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-16-git-send-email-david@fromorbit.com> <20130422185550.GA29359@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130422185550.GA29359@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: 1366763600 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128979 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 22, 2013 at 01:55:50PM -0500, Ben Myers wrote: > On Wed, Apr 03, 2013 at 04:11:25PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > Signed-off-by: Dave Chinner .... > > @@ -25,6 +24,7 @@ > > #include "xfs_sb.h" > > #include "xfs_ag.h" > > #include "xfs_mount.h" > > +#include "xfs_error.h" > > #include "xfs_da_btree.h" > > #include "xfs_bmap_btree.h" > > #include "xfs_attr_sf.h" > > @@ -35,7 +35,6 @@ > > #include "xfs_bmap.h" > > #include "xfs_attr.h" > > #include "xfs_attr_leaf.h" > > -#include "xfs_error.h" > > Why did xfs_error.h need to be moved? Most likely it got moved during debugging when I put stuff in static inline functions and I forgot to revert it when removing the debug. Fixed. > > @@ -935,16 +936,16 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) > > /* > > * Set up the new root node. > > */ > > - error = xfs_da_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); > > + error = xfs_da3_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); > > if (error) > > goto out; > > node = bp1->b_addr; > > leaf = bp2->b_addr; > > ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); > > /* both on-disk, don't endian-flip twice */ > > - node->btree[0].hashval = > > - leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; > > - node->btree[0].before = cpu_to_be32(blkno); > > + btree = xfs_da3_node_tree_p(node); > > + btree[0].hashval = leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; > > Extra space. Sure, but it is in part of the expression that I wasn't modifying in this patch set. I convert the leaf->hdr stuff in the next patch - the space is removed there.... > > + if (ichdr.count > mp->m_dir_node_ents && > > + ichdr.count > mp->m_attr_node_ents) > > + return false; > > + > > + /* XXX: hash order check? */ > > Still planning to add that in a subsequent patch? Not in this patch set - all the "we should add more checks" comments are things that need to be added, but are not needed for the CRC conversions to work correctly. I intend to address these things once the initial patch set is sorted out.... > > +xfs_da3_node_create( > > + struct xfs_da_args *args, > > + xfs_dablk_t blkno, > > + int level, > > + struct xfs_buf **bpp, > > + int whichfork) > > { > > - xfs_da_intnode_t *node; > > - struct xfs_buf *bp; > > - int error; > > - xfs_trans_t *tp; > > + struct xfs_da_intnode *node; > > + struct xfs_trans *tp = args->trans; > > + struct xfs_mount *mp = tp->t_mountp; > > + struct xfs_da3_icnode_hdr ichdr = {0}; > > + struct xfs_buf *bp; > > + int error; > > > > trace_xfs_da_node_create(args); > > + ASSERT(level <= XFS_DA_NODE_MAXDEPTH); > > > > - tp = args->trans; > > error = xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); > > Looks like this function can return 0 with a null bp. We should probably check > for that. It will only return 0 with a null bp if mappedbno == -2. In this case it is -1, so it will return EFSCORRUPTED rather than zero for the case where we land incorrectly a hole in the mapping. > > @@ -320,8 +474,10 @@ xfs_da_split(xfs_da_state_t *state) > > * just got bumped because of the addition of a new root node. > > * There might be three blocks involved if a double split occurred, > > * and the original block 0 could be at any position in the list. > > + * > > + * Note: the info structures being modified here for both v2 and v3 da > > + * headers, so we can do this linkage just using the v2 structures. > > I had a hard time parsing that the first few times. How about something like: > > Note: The xfs_da_blkinfo fields being modified here are shared by both > xfs_da_node_hdr and xfs_da3_intnode, and occur before the additional fields > added in xfs_da3_intnode, so this linkage can be done using just the v2 > structures. That's probably just as unclear. Changed to: Note: the magic numbers and sibling pointers are in the same physical place for both v2 and v3 headers (by design). Hence it doesn't matter which version of the xfs_da_intnode structure we use here as the result will be the same using either structure. > > > @@ -591,12 +801,12 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, > > * Move the req'd B-tree elements from high in node1 to > > * low in node2. > > */ > > - be16_add_cpu(&node2->hdr.count, count); > > + nodehdr2.count += count; > > tmp = count * (uint)sizeof(xfs_da_node_entry_t); > > - btree_s = &node1->btree[be16_to_cpu(node1->hdr.count) - count]; > > - btree_d = &node2->btree[0]; > > + btree_s = &btree1[nodehdr1.count- count]; > ^ > Add a space. Fixed. > > /* > > - * Unbalance the btree elements between two intermediate nodes, > > + * Unbalance the elements between two intermediate nodes, > > * move all Btree elements from one node into another. > > */ > > STATIC void > > -xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, > > - xfs_da_state_blk_t *save_blk) > > +xfs_da3_node_unbalance( > > + struct xfs_da_state *state, > > + struct xfs_da_state_blk *drop_blk, > > + struct xfs_da_state_blk *save_blk) > > { > > - xfs_da_intnode_t *drop_node, *save_node; > > - xfs_da_node_entry_t *btree; > > - int tmp; > > - xfs_trans_t *tp; > > + struct xfs_da_intnode *drop_node; > > + struct xfs_da_intnode *save_node; > > + struct xfs_da_node_entry *dbtree; > > + struct xfs_da_node_entry *sbtree; > > + struct xfs_da3_icnode_hdr dhdr; > > + struct xfs_da3_icnode_hdr shdr; > > Would be better as drop and save. > Extra spaces. Fixed. > > + (be32_to_cpu(dbtree[dhdr.count - 1].hashval) < > > + be32_to_cpu(sbtree[shdr.count - 1].hashval))) { > > + /* XXX: check this - is memmove dst correct? */ > > + tmp = shdr.count * (uint)sizeof(xfs_da_node_entry_t); > > + memmove(&sbtree[dhdr.count], &sbtree[0], tmp); > > I believe the destination in this memmove is correct. We're moving items from > the beginning of the save_node toward the end of save_node so that later we can > copy from drop_node into the beginning of save_node. Making room. > > > + > > + sindex = 0; > > xfs_trans_log_buf(tp, save_blk->bp, > > - XFS_DA_LOGRANGE(save_node, btree, > > - (be16_to_cpu(save_node->hdr.count) + be16_to_cpu(drop_node->hdr.count)) * > > - sizeof(xfs_da_node_entry_t))); > > + XFS_DA_LOGRANGE(save_node, &sbtree[0], > > + (shdr.count + dhdr.count) * > > + sizeof(xfs_da_node_entry_t))); > > Seems like here we are logging more of the node than is strictly necessary. So > far we have only modified save_node at shdr.count up to shdr.count + > dhdr.count, there is no need to log the beginning of save_node until after > we've copied from drop_node into it. Not a big deal I guess. Logging is just tagging dirty regions - it can be done before or after the modification is made. The contents of the dirty regions have meaning at transaction commit time, but not here while the transactional modifications are being made.... In this case, doing it before just means less branches and less complex code as we already have the context to make the right decision just before the modification is done. > > } else { > > - btree = &save_node->btree[be16_to_cpu(save_node->hdr.count)]; > > + sindex = shdr.count; > > xfs_trans_log_buf(tp, save_blk->bp, > > - XFS_DA_LOGRANGE(save_node, btree, > > - be16_to_cpu(drop_node->hdr.count) * > > - sizeof(xfs_da_node_entry_t))); > > + XFS_DA_LOGRANGE(save_node, &sbtree[sindex], > > + dhdr.count * sizeof(xfs_da_node_entry_t))); > > And here it seems that we're logging save_node before we've made any > modification to it. Maybe I'm missing something. See above... > > - tmp = be16_to_cpu(drop_node->hdr.count) * (uint)sizeof(xfs_da_node_entry_t); > > - memcpy(btree, &drop_node->btree[0], tmp); > > - be16_add_cpu(&save_node->hdr.count, be16_to_cpu(drop_node->hdr.count)); > > + tmp = dhdr.count * (uint)sizeof(xfs_da_node_entry_t); > > + memcpy(&sbtree[sindex], &dbtree[0], tmp); > > + shdr.count += dhdr.count; > > + xfs_da3_node_hdr_to_disk(save_node, &shdr); > > xfs_trans_log_buf(tp, save_blk->bp, > > XFS_DA_LOGRANGE(save_node, &save_node->hdr, > > - sizeof(save_node->hdr))); > > + xfs_da3_node_hdr_size(save_node))); > > > > And then after modifying save_node by copying stuff in from drop_blk we only > log the header, and not the entries. I guess I'd prefer to see the entries > logged after they've been modified. It's not a bug, looks like.. just not what > I'm used to seeing. Yeah, it's a little unusual, but it's not incorrect, and this is done in some places simply because it makes the code more concise and less branch intensive.... > > @@ -1190,66 +1478,73 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) > > } > > curr = blk->bp->b_addr; > > blk->magic = be16_to_cpu(curr->magic); > > - ASSERT(blk->magic == XFS_DA_NODE_MAGIC || > > - blk->magic == XFS_DIR2_LEAFN_MAGIC || > > - blk->magic == XFS_ATTR_LEAF_MAGIC); > > + > > + if (blk->magic == XFS_ATTR_LEAF_MAGIC) { > > + blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL); > > + break; > > + } > > + > > + if (blk->magic == XFS_DIR2_LEAFN_MAGIC || > > + blk->magic == XFS_DIR3_LEAFN_MAGIC) { > > + blk->magic = XFS_DIR2_LEAFN_MAGIC; > > + blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, NULL); > > + break; > > + } > > Something like this would be better for this rearrangement: > > if (blk->magic == XFS_ATTR_LEAF_MAGIC) { > ... > break; > } else if (blk->magic == XFS_DIR2_LEAFN_MAGIC || > blk->magic == XFS_DIR3_LEAFN_MAGIC) { > ... > break; > } else if (blk->magic != XFS_DA_NODE_MAGIC) { > return XFS_ERROR(EFSCORRUPTED); > } > > So that we're sure what kind of block we have. It's not actually determining whether the block is valid or not - the call to xfs_da3_node_read() will have already checked that for us. i.e. we already know it is a ATTR/DIR/DA block and so are just breaking out of the root->leaf walk being done here... > > > + > > + blk->magic = XFS_DA_NODE_MAGIC; > > + > > Why was that assignment necessary? Because this is the xfs_da_state block type, not the on-disk version. i.e. the da_state manipulation logic treats XFS_DA_NODE_MAGIC/XFS_DA3_NODE_MAGIC identically, so it makes no sense to have all the da_state code have to check for 2 different magic numbers everywhere. hence if blk->magic = be16_to_cpu(curr->magic); gives us blk->magic == XFS_DA3_NODE_MAGIC, we need to reset it to XFS_DA_NODE_MAGIC so all the existing da_state code works without modification. The same is done with dir2/dir3 leafn magic numbers, and in a later patch with the attr3 leaf magic numbers. > > @@ -1316,9 +1647,6 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, > > ASSERT(old_blk->magic == XFS_DA_NODE_MAGIC || > > old_blk->magic == XFS_DIR2_LEAFN_MAGIC || > > old_blk->magic == XFS_ATTR_LEAF_MAGIC); > > Seems like these asserts need to be updated. And this is exactly why the above code does what it does. The da_state code only cares about da_node/dir leaf/attr leaf distinctions, not what the physical encoding of the structures on disk are. > > > - ASSERT(old_blk->magic == be16_to_cpu(old_info->magic)); > > - ASSERT(new_blk->magic == be16_to_cpu(new_info->magic)); > > - ASSERT(old_blk->magic == new_blk->magic); > > These seem like good asserts. But now wrong, because they are asserting that the da_state magic numbers are the same as the physical structure on disk. The callouts in the functions based on the magic numbers: switch (old_blk->magic) { case XFS_ATTR_LEAF_MAGIC: before = xfs_attr_leaf_order(old_blk->bp, new_blk->bp); break; case XFS_DIR2_LEAFN_MAGIC: before = xfs_dir2_leafn_order(old_blk->bp, new_blk->bp); break; case XFS_DA_NODE_MAGIC: before = xfs_da3_node_order(old_blk->bp, new_blk->bp); break; Do the correct verification of the physical magic numbers, as does the higher level calling code.... FWIW, the da_state based code is a good candidate for converting to an ops based abstraction like the generic btree code uses so that these sorts of switch statements code go away.... > > @@ -1449,8 +1738,6 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, > > ASSERT(save_blk->magic == XFS_DA_NODE_MAGIC || > > save_blk->magic == XFS_DIR2_LEAFN_MAGIC || > > save_blk->magic == XFS_ATTR_LEAF_MAGIC); > > Seems like these asserts need to be updated. > > > - ASSERT(save_blk->magic == be16_to_cpu(save_info->magic)); > > - ASSERT(drop_blk->magic == be16_to_cpu(drop_info->magic)); > > These two seem like useful asserts. Validated by higher level code, and incorrect because of the above physical/logical discrimination... > > @@ -1856,17 +2176,22 @@ xfs_da_swap_lastblock( > > dead_level = 0; > > dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval); > > } else { > > - ASSERT(dead_info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); > > + struct xfs_da3_icnode_hdr deadhdr; > > + > > + ASSERT(dead_info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || > > + dead_info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); > > I think these are covered by asserts in xfs_da3_node_hdr_from_disk and can be removed. Fixed. > > @@ -1912,31 +2237,31 @@ xfs_da_swap_lastblock( > > * Walk down the tree looking for the parent of the moved block. > > */ > > for (;;) { > > - error = xfs_da_node_read(tp, ip, par_blkno, -1, &par_buf, w); > > + error = xfs_da3_node_read(tp, ip, par_blkno, -1, &par_buf, w); > > if (error) > > goto done; > > par_node = par_buf->b_addr; > > - if (unlikely(par_node->hdr.info.magic != > > - cpu_to_be16(XFS_DA_NODE_MAGIC) || > > - (level >= 0 && level != be16_to_cpu(par_node->hdr.level) + 1))) { > > + xfs_da3_node_hdr_from_disk(&par_hdr, par_node); > > + if (level >= 0 && level != par_hdr.level + 1) { > > Do we need to test par_node magic here like we were before? I don't think so, because we validated that it is a node/leaf block in xfs_da3_node_read(), debug kernels will assert fail in xfs_da3_node_hdr_from_disk(), and the level checks will catch problems with leaves being where nodes should be. Hence I don't think we lose anything here in terms of corruption detection.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 23 20:18:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8894C7F37 for ; Tue, 23 Apr 2013 20:18:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E78DFAC002 for ; Tue, 23 Apr 2013 18:18:00 -0700 (PDT) X-ASG-Debug-ID: 1366766277-04cb6c2c1d54b950001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Rq3oHSABB28GTsKq for ; Tue, 23 Apr 2013 18:17:57 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjURAFoyd1F5LKjR/2dsb2JhbABQgwaCfrZphR8EAYEFF3SCHwEBBAEnExwjEAgDDgcDCSUPBSUDIROIDgW9VBWNdoEdB4NJA5NLg06RHoMgKoEuAh4EAg Received: from ppp121-44-168-209.lns20.syd7.internode.on.net (HELO dastard) ([121.44.168.209]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2013 10:47:24 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UUoKn-0006by-8K; Wed, 24 Apr 2013 11:17:21 +1000 Date: Wed, 24 Apr 2013 11:17:21 +1000 From: Dave Chinner To: Ben Myers Cc: xfs@oss.sgi.com Subject: Re: [PATCH 16/22] xfs: add CRCs to attr leaf blocks Message-ID: <20130424011721.GP10481@dastard> X-ASG-Orig-Subj: Re: [PATCH 16/22] xfs: add CRCs to attr leaf blocks References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-17-git-send-email-david@fromorbit.com> <20130423230245.GC29359@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130423230245.GC29359@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: 1366766277 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128983 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 23, 2013 at 06:02:45PM -0500, Ben Myers wrote: > Hi Dave, > > On Wed, Apr 03, 2013 at 04:11:26PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > Signed-off-by: Dave Chinner > > Comments below. .... > > + if (ichdr.count == 0) > > + return false; > > + > > + /* XXX: need to range check rest of attr header values */ > > + /* XXX: hash order check? */ > > Seems reasonable for debug code. Is that coming along in a subsequent patch? Same as for the last patch - not in this patch set, but in future work. > > int > > -xfs_attr_leaf_to_shortform( > > - struct xfs_buf *bp, > > - xfs_da_args_t *args, > > - int forkoff) > > +xfs_attr3_leaf_to_shortform( > > + struct xfs_buf *bp, > > + struct xfs_da_args *args, > > + int forkoff) > > { > > - xfs_attr_leafblock_t *leaf; > > - xfs_attr_leaf_entry_t *entry; > > - xfs_attr_leaf_name_local_t *name_loc; > > - xfs_da_args_t nargs; > > - xfs_inode_t *dp; > > - char *tmpbuffer; > > - int error, i; > > + struct xfs_attr_leafblock *leaf; > > + struct xfs_attr3_icleaf_hdr ichdr; > > + struct xfs_attr_leaf_entry *entry; > > + struct xfs_attr_leaf_name_local *name_loc; > > + struct xfs_da_args nargs; > > + struct xfs_inode *dp = args->dp; > > + char *tmpbuffer; > > + int error; > > + int i; > > > > trace_xfs_attr_leaf_to_sf(args); > > > > - dp = args->dp; > > tmpbuffer = kmem_alloc(XFS_LBSIZE(dp->i_mount), KM_SLEEP); > > - ASSERT(tmpbuffer != NULL); > > + if (!tmpbuffer) > > + return ENOMEM; > > > > - ASSERT(bp != NULL); > > memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(dp->i_mount)); > > + > > leaf = (xfs_attr_leafblock_t *)tmpbuffer; > > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); > > + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); > > + entry = xfs_attr3_leaf_entryp(leaf); > > + > > + /* XXX (dgc): buffer is about to be marked stale - why zero it? */ > > memset(bp->b_addr, 0, XFS_LBSIZE(dp->i_mount)); > > Good point. Why do we need a temporary buffer here? It seems like we could > keep the leaf around long enough to copy from it directly into shortform. Right. I suspect that this dates back to a long time ago when we didn't have busy extents preventing stale metadata exposure to userspace and attributes used sync IO to avoid problems. There are other grotty bits in the attribute code (e.g. remote attrs are written synchronously rather than logged), so I'd say this is where it came from. It's another thing that we can clean up later... > > @@ -963,52 +1120,62 @@ out: > > * or a leaf in a node attribute list. > > */ > > STATIC int > > -xfs_attr_leaf_create( > > - xfs_da_args_t *args, > > - xfs_dablk_t blkno, > > - struct xfs_buf **bpp) > > +xfs_attr3_leaf_create( > > + struct xfs_da_args *args, > > + xfs_dablk_t blkno, > > + struct xfs_buf **bpp) > > { > > - xfs_attr_leafblock_t *leaf; > > - xfs_attr_leaf_hdr_t *hdr; > > - xfs_inode_t *dp; > > - struct xfs_buf *bp; > > - int error; > > + struct xfs_attr_leafblock *leaf; > > + struct xfs_attr3_icleaf_hdr ichdr; > > + struct xfs_inode *dp = args->dp; > > + struct xfs_mount *mp = dp->i_mount; > > + struct xfs_buf *bp; > > + int error; > > > > trace_xfs_attr_leaf_create(args); > > > > - dp = args->dp; > > - ASSERT(dp != NULL); > > error = xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp, > > XFS_ATTR_FORK); > > if (error) > > - return(error); > > - bp->b_ops = &xfs_attr_leaf_buf_ops; > > + return error; > > + bp->b_ops = &xfs_attr3_leaf_buf_ops; > > leaf = bp->b_addr; > > - memset((char *)leaf, 0, XFS_LBSIZE(dp->i_mount)); > > - hdr = &leaf->hdr; > > - hdr->info.magic = cpu_to_be16(XFS_ATTR_LEAF_MAGIC); > > - hdr->firstused = cpu_to_be16(XFS_LBSIZE(dp->i_mount)); > > - if (!hdr->firstused) { > > - hdr->firstused = cpu_to_be16( > > - XFS_LBSIZE(dp->i_mount) - XFS_ATTR_LEAF_NAME_ALIGN); > > - } > > Saw this several times in review. I don't understand why that code would be > there, given that we just set firstused to be XFS_LBSIZE, the blocksize of the > filesystem. It's dead code now, so it's fine to remove... There must be some > history there. Any idea? It's in the initial commit for the attribute code way back in 1995. It didn't make sense then, either, because there's code right around it such as memory allocations that use XFS_LBSIZE(dp->i_mount) as the size of the buffer to allocate. Hence I think it's been dead code ever since it was written... > > @@ -1113,82 +1279,90 @@ xfs_attr_leaf_add( > > * and we don't have enough freespace, then compaction will do us > > * no good and we should just give up. > > */ > > - if (!hdr->holes && (sum < entsize)) > > - return(XFS_ERROR(ENOSPC)); > > + if (!ichdr.holes && sum < entsize) > > + return XFS_ERROR(ENOSPC); > > > > /* > > * Compact the entries to coalesce free space. > > * This may change the hdr->count via dropping INCOMPLETE entries. > > */ > > - xfs_attr_leaf_compact(args, bp); > > + xfs_attr3_leaf_compact(args, &ichdr, bp); > > > > /* > > * After compaction, the block is guaranteed to have only one > > * free region, in freemap[0]. If it is not big enough, give up. > > */ > > - if (be16_to_cpu(hdr->freemap[0].size) > > - < (entsize + sizeof(xfs_attr_leaf_entry_t))) > > - return(XFS_ERROR(ENOSPC)); > > + if (ichdr.freemap[0].size < (entsize + sizeof(xfs_attr_leaf_entry_t))) { > > + tmp = ENOSPC; > > + goto out_log_hdr; > > That represents a change in behavior that I'm not sure about... Before if we > had ENOSPC here we would simply return and xfs_addr3_leaf_add_work would not > have a chance to log the header. Now... The difference is that hte header used to be logged in xfs_attr_leaf_compact(). Now it is not logged in xfs_attr3_leaf_compact() because the in-core header is modified. Hence on an enospc error we now have to write back and log the header. Hence there is no change in behaviour here... > > > + } > > + > > + tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, 0); > > > > - return(xfs_attr_leaf_add_work(bp, args, 0)); > > +out_log_hdr: > > + xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); > > + xfs_trans_log_buf(args->trans, bp, > > + XFS_DA_LOGRANGE(leaf, &leaf->hdr, > > + xfs_attr3_leaf_hdr_size(leaf))); > > We're logging the header here instead of in xfs_attr_leaf_add_work Right, for the same reason as the above enospc branch - we passed the ichdr to xfs_attr3_leaf_compact() so the header modifications are made to the ichdr, not the buffer. The same is done here, because it means we don't repeatedly convert to/from ichdr and on-disk header and log it every time. Instead, we read it from disk once in this function and pass the ichdr around to collect all the modifications and then write it back to the disk buffer once and log it only once.... > > + return tmp; > > } > > and then returning. I think this would be better with a second goto so that we > don't log the header in keeping with the old behavior. The way it is done with these modifications gives an identical dirty range on the buffer as the old code; it is just more efficient as we do a lot less endian swapping and logging calls... > > for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; map++, i++) { > > Looks like you can get rid of map. Good catch. Fixed. > > @@ -1286,34 +1457,69 @@ xfs_attr_leaf_compact( > > */ > > leaf_s = (xfs_attr_leafblock_t *)tmpbuffer; > > leaf_d = bp->b_addr; > > - hdr_s = &leaf_s->hdr; > > - hdr_d = &leaf_d->hdr; > > - hdr_d->info = hdr_s->info; /* struct copy */ > > - hdr_d->firstused = cpu_to_be16(XFS_LBSIZE(mp)); > > - /* handle truncation gracefully */ > > - if (!hdr_d->firstused) { > > - hdr_d->firstused = cpu_to_be16( > > - XFS_LBSIZE(mp) - XFS_ATTR_LEAF_NAME_ALIGN); > > - } > > Another one. Weird. > > > - hdr_d->usedbytes = 0; > > - hdr_d->count = 0; > > - hdr_d->holes = 0; > > - hdr_d->freemap[0].base = cpu_to_be16(sizeof(xfs_attr_leaf_hdr_t)); > > - hdr_d->freemap[0].size = cpu_to_be16(be16_to_cpu(hdr_d->firstused) - > > - sizeof(xfs_attr_leaf_hdr_t)); > > + ichdr_s = *ichdr_d; /* struct copy */ > > ichdr_s should be initialized from the copy we have in the temporary buffer > rather than from a struct copy of ichdr_d. I understand that what you have > here probably works fine, but it is not very obvious, or clear that it was > an intentional deviation from the struct copy up above. I disagree: the canonical source of the ichdr information being passed in is in ichdr_d, not in the on disk buffer. That is the reason ichdr_d is passed into the function - because modifications to the ichdr may have been made and not written back to the backing buffer before the function was called. If you check the code above and the various explanations of it, you'll see that this is the that is the exact situation in which xfs_attr3_leaf_compact() is called. Hence reading ichdr_s out of the on-disk buffer is the wrong thing to do and would likely result in corruptions caused by compacting blocks... > > + xfs_attr3_leaf_moveents(leaf_s, &ichdr_s, 0, leaf_d, ichdr_d, 0, > > + ichdr_s.count, mp); > > + /* > > + * this logs the entire buffer, but the caller must write the header > > + * back to the buffer when it is finished modifying it. > > + */ > > xfs_trans_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); > > Maybe better to just log the entries here, someday. *nod* > > > @@ -2201,45 +2425,41 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, > > /* > > * Set up environment. > > */ > > - ASSERT(leaf_s->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); > > - ASSERT(leaf_d->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); > > - hdr_s = &leaf_s->hdr; > > - hdr_d = &leaf_d->hdr; > > - ASSERT((be16_to_cpu(hdr_s->count) > 0) && > > - (be16_to_cpu(hdr_s->count) < (XFS_LBSIZE(mp)/8))); > > - ASSERT(be16_to_cpu(hdr_s->firstused) >= > > - ((be16_to_cpu(hdr_s->count) > > - * sizeof(*entry_s))+sizeof(*hdr_s))); > > - ASSERT(be16_to_cpu(hdr_d->count) < (XFS_LBSIZE(mp)/8)); > > - ASSERT(be16_to_cpu(hdr_d->firstused) >= > > - ((be16_to_cpu(hdr_d->count) > > - * sizeof(*entry_d))+sizeof(*hdr_d))); > > - > > - ASSERT(start_s < be16_to_cpu(hdr_s->count)); > > - ASSERT(start_d <= be16_to_cpu(hdr_d->count)); > > - ASSERT(count <= be16_to_cpu(hdr_s->count)); > > + ASSERT(ichdr_s->magic == XFS_ATTR_LEAF_MAGIC || > > + ichdr_s->magic == XFS_ATTR3_LEAF_MAGIC); > > This assert might be unnecessary due to the asserts in hdr_from_disk. might be, but given the number of interesting callers of this function I decided that specifically ensuring the ichdr magic numbers were valid was a good idea.... > > > @@ -2286,71 +2504,40 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, > > /* > > * Zero out the entries we just copied. > > */ > > - if (start_s == be16_to_cpu(hdr_s->count)) { > > + if (start_s == ichdr_s->count) { > > tmp = count * sizeof(xfs_attr_leaf_entry_t); > > - entry_s = &leaf_s->entries[start_s]; > > + entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; > > ASSERT(((char *)entry_s + tmp) <= > > ((char *)leaf_s + XFS_LBSIZE(mp))); > > - memset((char *)entry_s, 0, tmp); > > + memset(entry_s, 0, tmp); > > } else { > > /* > > * Move the remaining entries down to fill the hole, > > * then zero the entries at the top. > > */ > > - tmp = be16_to_cpu(hdr_s->count) - count; > > - tmp *= sizeof(xfs_attr_leaf_entry_t); > > - entry_s = &leaf_s->entries[start_s + count]; > > - entry_d = &leaf_s->entries[start_s]; > > - memmove((char *)entry_d, (char *)entry_s, tmp); > > + tmp = (ichdr_s->count - count) - sizeof(xfs_attr_leaf_entry_t); > * > Multiply. Fine catch. Fixed. > > > @@ -2379,20 +2567,21 @@ xfs_attr_leaf_lasthash( > > STATIC int > > xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) > > { > > + struct xfs_attr_leaf_entry *entries; > > xfs_attr_leaf_name_local_t *name_loc; > > xfs_attr_leaf_name_remote_t *name_rmt; > > int size; > > > > - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); > > I don't see a replacement for this assert. It's only ever called from places that have already validated the magic numbers. > > @@ -2786,38 +3003,44 @@ xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp) > > */ > > error = xfs_da3_node_read(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK); > > if (error) > > - return(error); > > - blkno = XFS_BUF_ADDR(bp); > > + return error; > > + blkno = bp->b_bn; > > I'm a little concerned about the switch from XFS_BUF_ADDR to bp->b_bn here, but > have not looked into it yet. If you have a quick explanation, that's great. > Otherwise I'll come back to it. XFS_BUF_ADDR should die. bp->b_bn is the block number of the buffer that is returned, and the attribute code does not deal with discontiguous buffers so it should always be the correct block number for further operations... > > @@ -1479,7 +1480,9 @@ xfs_da3_node_lookup_int( > > curr = blk->bp->b_addr; > > blk->magic = be16_to_cpu(curr->magic); > > > > - if (blk->magic == XFS_ATTR_LEAF_MAGIC) { > > + if (blk->magic == XFS_ATTR_LEAF_MAGIC || > > + blk->magic == XFS_ATTR3_LEAF_MAGIC) { > > + blk->magic = XFS_ATTR_LEAF_MAGIC; > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > I'm still a little confused by these assignments. I understand you're > squashing them down from a comment, and that the correct magic is still in the > buffer... I need to find who is looking at blk->magic. Any hints? It's basically an entry in the cursor passed through all the xfs_da_btree.c code - node/leaf/attr/dir types matter to the code that uses it, not the physical encoding of the block on disk.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From anita@auden.com.tw Tue Apr 23 21:43:09 2013 Return-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 56C167F37 for ; Tue, 23 Apr 2013 21:43:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 358208F8040 for ; Tue, 23 Apr 2013 19:43:05 -0700 (PDT) X-ASG-Debug-ID: 1366771380-04cbb057f6530bf0001-NocioJ Received: from spam.atl-lab.com.tw (adsl-220-228-254-54.BC.sparqnet.net [220.228.254.54]) by cuda.sgi.com with ESMTP id jCQ6QzujgR3VTmdG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 23 Apr 2013 19:43:02 -0700 (PDT) X-Barracuda-Envelope-From: anita@auden.com.tw X-Barracuda-Apparent-Source-IP: 220.228.254.54 Received: from iwdjr ([59.58.243.117]) (authenticated bits=0) by spam.atl-lab.com.tw with ESMTP id r3O2YYIL092696; Wed, 24 Apr 2013 10:34:43 +0800 (CST) (envelope-from anita@auden.com.tw) Date: Wed, 24 Apr 2013 10:34:40 +0800 From: =?GB2312?B?tcvR9A==?= To: "xfs" Subject: =?GB2312?B?eGZzQNeqt6I6ytW1veHhu9jRfc7S0rvPwg==?= xfs@jrjw.gov.cn Message-ID: <201304241034405313581@auden.com.tw> X-ASG-Orig-Subj: =?GB2312?B?eGZzQNeqt6I6ytW1veHhu9jRfc7S0rvPwg==?= xfs@jrjw.gov.cn X-Mailer: Foxmail 6, 10, 201, 20 [cn] MIME-Version: 1.0 Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: base64 X-MAIL:spam.atl-lab.com.tw r3O2YYIL092696 X-Barracuda-Connect: adsl-220-228-254-54.BC.sparqnet.net[220.228.254.54] X-Barracuda-Start-Time: 1366771381 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.30 X-Barracuda-Spam-Status: No, SCORE=0.30 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE, HTML_OBFUSCATE_40_50, INFO_TLD, MIME_HTML_ONLY, PR0N_SUBJECT, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 INFO_TLD URI: Contains an URL in the INFO top-level domain 0.00 HTML_OBFUSCATE_40_50 BODY: Message is 40% to 50% HTML obfuscation 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS PEhUTUw+DQo8Qk9EWT48Rk9OVCBjb2xvcj0jZmZmZmZmIHNpemU9MT48Rk9OVCBzaXplPTQ+OWw5 azlrV2k8L0ZPTlQ+PEJSPjwvRk9OVD48Rk9OVCBjb2xvcj1ncmVlbj48Rk9OVCBjb2xvcj0jMDAw MDAwPjxGT05UIGNvbG9yPWRhcmtyZWQ+xNs8Rk9OVCBjb2xvcj13aGl0ZSBzaXplPTE+aDwvRk9O VD7EozxGT05UIGNvbG9yPSNmZmZmZmYgc2l6ZT0xPlQ8L0ZPTlQ+xeM8Rk9OVCBjb2xvcj0jZmZm ZmZmIHNpemU9MT5oPC9GT05UPsG3jMU8Rk9OVCBjb2xvcj0jZmZmZmZmIHNpemU9MT4wPC9GT05U Psu/PEZPTlQgY29sb3I9I2ZmZmZmZiBzaXplPTE+UTwvRk9OVD7XqDxGT05UIGNvbG9yPSNmZmZm ZmYgc2l6ZT0xPjA8L0ZPTlQ+yvQss6y6wzxGT05UIGNvbG9yPXdoaXRlIHNpemU9MT7X1DwvRk9O VD7N5rOs09A8Rk9OVCBjb2xvcj0jZmZmZmZmIHNpemU9MT601TwvRk9OVD7IpLXEyOI8Rk9OVCBj b2xvcj0jZmZmZmZmIHNpemU9MT7NxjwvRk9OVD6yq83Twt29rKGjPC9GT05UPjwvRk9OVD48L0ZP TlQ+PEZPTlQgY29sb3I9ZGFya2N5YW4+yMu1xMnt0MS2vLXDtb3By73iPEZPTlQgY29sb3I9I2Zm ZmZmZiBzaXplPTE+wrc8L0ZPTlQ+t8UmIzY1MjkyO7vYuemxvjxGT05UIGNvbG9yPSNmZmZmZmYg c2l6ZT0xPteoPC9GT05UPtDUoaM8L0ZPTlQ+PEZPTlQgY29sb3I9d2hpdGU+MVExUGdTMVIxUDBP MG05bDhrV2hVaFMxUjFQMG8wbTlsOGlVaDwvRk9OVD48L0ZPTlQ+PC9GT05UPjxGT05UIHNpemU9 MT48QlI+PC9GT05UPjxCUj48QSBocmVmPSJodHRwOi8vd3FmbC5pbmZvL2h1aW9lZXIveml1b291 Lmh0bWwiPjxTVFJPTkc+PEZPTlQgc2l6ZT01PiZndDvgxSCyu7Ttvs3V4rj2usM8L0ZPTlQ+PC9T VFJPTkc+PC9BPjxGT05UIGNvbG9yPSNmZmZmZmYgc2l6ZT01PjlqV2lWaFRmUzFSMVAwTzltOWtX aVZoVGY8L0ZPTlQ+PC9GT05UPjwvQk9EWT48L0hUTUw+ From service-client@espriv05.com Wed Apr 24 00:18:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.6 required=5.0 tests=HTML_FONT_SIZE_LARGE, HTML_IMAGE_RATIO_06,HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF, 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 8F0D57F37 for ; Wed, 24 Apr 2013 00:18:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0AE02AC005 for ; Tue, 23 Apr 2013 22:18:31 -0700 (PDT) X-ASG-Debug-ID: 1366780708-04cb6c2c1d558df0001-NocioJ Received: from s2.espriv05.com (s2.espriv05.com [178.32.20.8]) by cuda.sgi.com with ESMTP id yfXFBZypuRgAoxxb for ; Tue, 23 Apr 2013 22:18:29 -0700 (PDT) X-Barracuda-Envelope-From: service-client@espriv05.com X-Barracuda-Apparent-Source-IP: 178.32.20.8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=espriv05.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@espriv05.com; bh=XHdfxefyEl4CVCa++tcE6u1Il840bN5SH8ABHAKzzVM=; b=ejWBtLmP3EmPQ2SZoO1xAeywOSIPuKNVZk/IlwqfxFYeu4A0dgdWsQz7CRSglG/dkEkh5lpX4F62 uxdHI2i5k4yA3d3ApyAGrwCTGRL6VxhwivDCH4SnQxrTyU4vxlOCrWjgZoHL0iJzbnoF3kGtw2Aj dWwF72o+zDWoPCXnzzY= From: Paruvendu.fr X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 40650 X-EN-uuid: 1005-100540650-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Deposez votre annonce MIME-Version: 1.0 X-ASG-Orig-Subj: Deposez votre annonce List-Unsubscribe: http://track.espriv05.com/qi-ieaUqQgTuk3gJqxOom1bGjCTgII7pU22p_i53zuM.html, Content-Type: multipart/alternative; boundary=bead41660cacfd02a77f0719cf10165a Message-ID: <0.0.7.D57.1CE40AAB10AD69E.0@s2.espriv05.com> Date: Wed, 24 Apr 2013 07:15:09 +0200 X-Barracuda-Connect: s2.espriv05.com[178.32.20.8] X-Barracuda-Start-Time: 1366780709 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.25 X-Barracuda-Spam-Status: No, SCORE=0.25 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, HTML_FONT_SIZE_LARGE, HTML_IMAGE_RATIO_06, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.128999 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 MIME_HTML_MOSTLY BODY: Multipart message mostly text/html MIME 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary --bead41660cacfd02a77f0719cf10165a Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --bead41660cacfd02a77f0719cf10165a Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit Passez votre annonce sur ParuVendu.fr

Logo ParuVendu.fr Visuel ParuVendu.fr
Vos petites
annonces...
100% gratuites*
(Immobilier, Auto-Moto, Objets d'occasion, Animaux, etc.)
Passez votre annonce gratuite* !
Processus depose d annonces en 3 ?tapes
ParuVendu.fr, c'est 8 univers où tout s'achéte et tout se vend :
8 univers ParuVendu.fr
Vos annonces consultées par + de 10 millions de personnes chaque mois.
* L'offre annonce gratuite s'entend hors annonces vacances et est réservée aux particuliers, 700 caractéres et 3 photos pendant 90 jours. - Marketing et Communication ParuVendu.fr - Juillet 2012 - Crédit photos : Fotolia. Ce message vous est adressé par ParuVendu.fr (RCS Lyon 320 916 109). Conformément à la loi "Informatique et Libertés" du 6 janvier 1978, modifiée, vous bénéficiez d'un droit d'accés, de rectification, de modification et de suppression des données vous concernant que vous pouvez exercer en écrivant à l'adresse suivante : ParuVendu.fr - 88 rue Paul Bert, 69 446 LYON Cedex 03.

Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From service-client@espriv05.com Wed Apr 24 01:28:11 2013 Return-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.8 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,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 3105D29DFA for ; Wed, 24 Apr 2013 01:28:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 109E8304032 for ; Tue, 23 Apr 2013 23:28:07 -0700 (PDT) X-ASG-Debug-ID: 1366784885-04cb6c3c681f3d40001-NocioJ Received: from s2.espriv05.com (s2.espriv05.com [178.32.20.8]) by cuda.sgi.com with ESMTP id tqo5DDPRbgWQYc96 for ; Tue, 23 Apr 2013 23:28:05 -0700 (PDT) X-Barracuda-Envelope-From: service-client@espriv05.com X-Barracuda-Apparent-Source-IP: 178.32.20.8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=espriv05.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@espriv05.com; bh=iko2lIAB3FNsh0gjreAhreLvD52DjuoJMxbBfbdzvB4=; b=l4V0exdP+pCO0J90oTTn7Keg+lQRooo/GxlAqaDc59hJBHOLj3OBF75Znq/bSQuM8qqBWE/FywTB GTwraRUi1FwmhYcY4G0XHtzyMAgphjsa5jQdy9OD+VglJIsjF7mGFmPZtd/NBTlmAD3PnSHtmOwJ vGSxmkRQO+F/bkCFWI8= From: Maigrir sans craquer X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 40541 X-EN-uuid: 1005-100540541-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Perdez vos kilos superflus MIME-Version: 1.0 X-ASG-Orig-Subj: Perdez vos kilos superflus List-Unsubscribe: http://track.espriv05.com/F9dhMYchgH38AfElQexnb3d1phAbI04X6iYZeLkTq2M.html, Content-Type: multipart/alternative; boundary=5532646b13ebb92c57ac9a9d6a929737 Message-ID: <0.0.1A.10D.1CE40B46A36E690.0@s2.espriv05.com> Date: Wed, 24 Apr 2013 08:24:46 +0200 X-Barracuda-Connect: s2.espriv05.com[178.32.20.8] X-Barracuda-Start-Time: 1366784885 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.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=DKIM_SIGNED, DKIM_VERIFIED, FUZZY_AMBIEN, FUZZY_AMBIEN_2, HTML_IMAGE_RATIO_02, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129003 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 FUZZY_AMBIEN BODY: Attempt to obfuscate words in spam 0.00 MIME_HTML_MOSTLY BODY: Multipart message mostly text/html MIME 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary 0.96 FUZZY_AMBIEN_2 Attempt to obfuscate words in spam --5532646b13ebb92c57ac9a9d6a929737 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --5532646b13ebb92c57ac9a9d6a929737 Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit Votre bilan minceur MentalSlim


Vous recevez cet email car vous êtes inscrit à Soins Privilege.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.
From david@fromorbit.com Wed Apr 24 03:55:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A25CF29DFA for ; Wed, 24 Apr 2013 03:55:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 19B08AC002 for ; Wed, 24 Apr 2013 01:55:54 -0700 (PDT) X-ASG-Debug-ID: 1366793752-04cb6c2c1c567340001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GpQPUTS97HXhTpXQ for ; Wed, 24 Apr 2013 01:55:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqkRAIGdd1F5LKjR/2dsb2JhbABQgwa5aIUZBAF+F3SCHwEBBScTHCMQCBEHDCUPBSUDIROIE717FY1QJoEdB4NJA5cZigKHHIMgKg Received: from ppp121-44-168-209.lns20.syd7.internode.on.net (HELO dastard) ([121.44.168.209]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2013 18:25:50 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UUvUQ-0007NV-TX; Wed, 24 Apr 2013 18:55:46 +1000 Date: Wed, 24 Apr 2013 18:55:46 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: [PATCH V2] xfs: introduce CONFIG_XFS_WARN Message-ID: <20130424085546.GQ10481@dastard> X-ASG-Orig-Subj: [PATCH V2] xfs: introduce CONFIG_XFS_WARN References: <1366699138-24055-1-git-send-email-david@fromorbit.com> <5176833C.8070305@redhat.com> <20130423210226.GN10481@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130423210226.GN10481@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1366793752 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129013 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Running a CONFIG_XFS_DEBUG kernel in production environments is not the best idea as it introduces significant overhead, can change the behaviour of algorithms (such as allocation) to improve test coverage, and (most importantly) panic the machine on non-fatal errors. There are many cases where all we want to do is run a kernel with more bounds checking enabled, such as is provided by the ASSERT() statements throughout the code, but without all the potential overhead and drawbacks. This patch converts all the ASSERT statements to evaluate as WARN_ON(1) statements and hence if they fail dump a warning and a stack trace to the log. This has minimal overhead and does not change any algorithms, and will allow us to find strange "out of bounds" problems more easily on production machines. There are a few places where assert statements contain debug only code. These are converted to be debug-or-warn only code so that we still get all the assert checks in the code. Signed-off-by: Dave Chinner --- Version 2: - fix transaction accounting for superblock debug fields. fs/xfs/Kconfig | 13 +++++++++++++ fs/xfs/mrlock.h | 12 ++++++------ fs/xfs/xfs.h | 5 +++++ fs/xfs/xfs_alloc_btree.c | 4 ++-- fs/xfs/xfs_bmap_btree.c | 4 ++-- fs/xfs/xfs_btree.h | 2 +- fs/xfs/xfs_dir2_node.c | 4 ++-- fs/xfs/xfs_ialloc_btree.c | 4 ++-- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_linux.h | 24 ++++++++++++++++++------ fs/xfs/xfs_message.c | 8 ++++++++ fs/xfs/xfs_message.h | 1 + fs/xfs/xfs_trans.h | 4 ++-- 13 files changed, 63 insertions(+), 24 deletions(-) diff --git a/fs/xfs/Kconfig b/fs/xfs/Kconfig index cc33aaf..399e8ce 100644 --- a/fs/xfs/Kconfig +++ b/fs/xfs/Kconfig @@ -69,6 +69,19 @@ config XFS_RT If unsure, say N. +config XFS_WARN + bool "XFS Verbose Warnings" + depends on XFS_FS && !XFS_DEBUG + help + Say Y here to get an XFS build with many additional warnings. + It converts ASSERT checks to WARN, so will log any out-of-bounds + conditions that occur that would otherwise be missed. It is much + lighter weight than XFS_DEBUG and does not modify algorithms and will + not cause the kernel to panic on non-fatal errors. + + However, similar to XFS_DEBUG, it is only advisable to use this if you + are debugging a particular problem. + config XFS_DEBUG bool "XFS Debugging support" depends on XFS_FS diff --git a/fs/xfs/mrlock.h b/fs/xfs/mrlock.h index ff6a198..e3c92d1 100644 --- a/fs/xfs/mrlock.h +++ b/fs/xfs/mrlock.h @@ -22,12 +22,12 @@ typedef struct { struct rw_semaphore mr_lock; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int mr_writer; #endif } mrlock_t; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) #define mrinit(mrp, name) \ do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) #else @@ -46,7 +46,7 @@ static inline void mraccess_nested(mrlock_t *mrp, int subclass) static inline void mrupdate_nested(mrlock_t *mrp, int subclass) { down_write_nested(&mrp->mr_lock, subclass); -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) mrp->mr_writer = 1; #endif } @@ -60,7 +60,7 @@ static inline int mrtryupdate(mrlock_t *mrp) { if (!down_write_trylock(&mrp->mr_lock)) return 0; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) mrp->mr_writer = 1; #endif return 1; @@ -68,7 +68,7 @@ static inline int mrtryupdate(mrlock_t *mrp) static inline void mrunlock_excl(mrlock_t *mrp) { -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) mrp->mr_writer = 0; #endif up_write(&mrp->mr_lock); @@ -81,7 +81,7 @@ static inline void mrunlock_shared(mrlock_t *mrp) static inline void mrdemote(mrlock_t *mrp) { -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) mrp->mr_writer = 0; #endif downgrade_write(&mrp->mr_lock); diff --git a/fs/xfs/xfs.h b/fs/xfs/xfs.h index d8b11b7..a742c47 100644 --- a/fs/xfs/xfs.h +++ b/fs/xfs/xfs.h @@ -24,6 +24,11 @@ #define XFS_BUF_LOCK_TRACKING 1 #endif +#ifdef CONFIG_XFS_WARN +#define XFS_WARN 1 +#endif + + #include "xfs_linux.h" #endif /* __XFS_H__ */ diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index b1ddef6..cbcd34b 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -348,7 +348,7 @@ const struct xfs_buf_ops xfs_allocbt_buf_ops = { }; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_allocbt_keys_inorder( struct xfs_btree_cur *cur, @@ -404,7 +404,7 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { .init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur, .key_diff = xfs_allocbt_key_diff, .buf_ops = &xfs_allocbt_buf_ops, -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_allocbt_keys_inorder, .recs_inorder = xfs_allocbt_recs_inorder, #endif diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index 061b45c..5eaaa4b 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -769,7 +769,7 @@ const struct xfs_buf_ops xfs_bmbt_buf_ops = { }; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_bmbt_keys_inorder( struct xfs_btree_cur *cur, @@ -809,7 +809,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { .init_ptr_from_cur = xfs_bmbt_init_ptr_from_cur, .key_diff = xfs_bmbt_key_diff, .buf_ops = &xfs_bmbt_buf_ops, -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_bmbt_keys_inorder, .recs_inorder = xfs_bmbt_recs_inorder, #endif diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h index f932897..6302e9a 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/xfs_btree.h @@ -190,7 +190,7 @@ struct xfs_btree_ops { const struct xfs_buf_ops *buf_ops; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) /* check that k1 is lower than k2 */ int (*keys_inorder)(struct xfs_btree_cur *cur, union xfs_btree_key *k1, diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 5980f9b..33177c3 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -811,7 +811,7 @@ xfs_dir2_leafn_rebalance( xfs_dir2_leaf_t *leaf1; /* first leaf structure */ xfs_dir2_leaf_t *leaf2; /* second leaf structure */ int mid; /* midpoint leaf index */ -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int oldstale; /* old count of stale leaves */ #endif int oldsum; /* old total leaf count */ @@ -831,7 +831,7 @@ xfs_dir2_leafn_rebalance( leaf1 = blk1->bp->b_addr; leaf2 = blk2->bp->b_addr; oldsum = be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count); -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) oldstale = be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale); #endif mid = oldsum >> 1; diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index bec344b..7b9c7be 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -235,7 +235,7 @@ const struct xfs_buf_ops xfs_inobt_buf_ops = { .verify_write = xfs_inobt_write_verify, }; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_inobt_keys_inorder( struct xfs_btree_cur *cur, @@ -273,7 +273,7 @@ static const struct xfs_btree_ops xfs_inobt_ops = { .init_ptr_from_cur = xfs_inobt_init_ptr_from_cur, .key_diff = xfs_inobt_key_diff, .buf_ops = &xfs_inobt_buf_ops, -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_inobt_keys_inorder, .recs_inorder = xfs_inobt_recs_inorder, #endif diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 4f20165..4630d47 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -286,7 +286,7 @@ xfs_ilock_demote( trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_); } -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int xfs_isilocked( xfs_inode_t *ip, diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index 14e59d9..800f896 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -293,22 +293,34 @@ static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y) #define ASSERT_ALWAYS(expr) \ (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) -#ifndef DEBUG -#define ASSERT(expr) ((void)0) +#ifdef DEBUG +#define ASSERT(expr) \ + (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) #ifndef STATIC -# define STATIC static noinline +# define STATIC noinline #endif -#else /* DEBUG */ +#else /* !DEBUG */ + +#ifdef XFS_WARN #define ASSERT(expr) \ - (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) + (unlikely(expr) ? (void)0 : asswarn(#expr, __FILE__, __LINE__)) #ifndef STATIC -# define STATIC noinline +# define STATIC static noinline +#endif + +#else /* !DEBUG && !XFS_WARN */ + +#define ASSERT(expr) ((void)0) + +#ifndef STATIC +# define STATIC static noinline #endif +#endif /* XFS_WARN */ #endif /* DEBUG */ #endif /* __XFS_LINUX__ */ diff --git a/fs/xfs/xfs_message.c b/fs/xfs/xfs_message.c index 331cd9f..9163dc1 100644 --- a/fs/xfs/xfs_message.c +++ b/fs/xfs/xfs_message.c @@ -93,6 +93,14 @@ xfs_alert_tag( } void +asswarn(char *expr, char *file, int line) +{ + xfs_warn(NULL, "Assertion failed: %s, file: %s, line: %d", + expr, file, line); + WARN_ON(1); +} + +void assfail(char *expr, char *file, int line) { xfs_emerg(NULL, "Assertion failed: %s, file: %s, line: %d", diff --git a/fs/xfs/xfs_message.h b/fs/xfs/xfs_message.h index 76c8198..8540115 100644 --- a/fs/xfs/xfs_message.h +++ b/fs/xfs/xfs_message.h @@ -57,6 +57,7 @@ do { \ xfs_printk_ratelimited(xfs_debug, dev, fmt, ##__VA_ARGS__) extern void assfail(char *expr, char *f, int l); +extern void asswarn(char *expr, char *f, int l); extern void xfs_hex_dump(void *p, int length); diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index cd29f61..a44dba5 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -405,7 +405,7 @@ typedef struct xfs_trans { int64_t t_res_fdblocks_delta; /* on-disk only chg */ int64_t t_frextents_delta;/* superblock freextents chg*/ int64_t t_res_frextents_delta; /* on-disk only chg */ -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int64_t t_ag_freeblks_delta; /* debugging counter */ int64_t t_ag_flist_delta; /* debugging counter */ int64_t t_ag_btree_delta; /* debugging counter */ @@ -433,7 +433,7 @@ typedef struct xfs_trans { #define xfs_trans_get_block_res(tp) ((tp)->t_blk_res) #define xfs_trans_set_sync(tp) ((tp)->t_flags |= XFS_TRANS_SYNC) -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) #define xfs_trans_agblocks_delta(tp, d) ((tp)->t_ag_freeblks_delta += (int64_t)d) #define xfs_trans_agflist_delta(tp, d) ((tp)->t_ag_flist_delta += (int64_t)d) #define xfs_trans_agbtree_delta(tp, d) ((tp)->t_ag_btree_delta += (int64_t)d) From david@fromorbit.com Wed Apr 24 03:58:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A0D3229DFA for ; Wed, 24 Apr 2013 03:58:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 45654304070 for ; Wed, 24 Apr 2013 01:58:24 -0700 (PDT) X-ASG-Debug-ID: 1366793897-04bdf02d2056e930001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id nAIYPKWMGKEbZEDe for ; Wed, 24 Apr 2013 01:58:17 -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: AqgRAIGdd1F5LKjR/2dsb2JhbABQgwa5aIUZBAF+F3SCHwEBBRoBDBMcMwgYDCUPBSUDNIgTvXsVjXaBJINJA5NLg06RHoMgKg Received: from ppp121-44-168-209.lns20.syd7.internode.on.net (HELO dastard) ([121.44.168.209]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2013 18:28:13 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UUvWc-0007Ng-Po for xfs@oss.sgi.com; Wed, 24 Apr 2013 18:58:02 +1000 Date: Wed, 24 Apr 2013 18:58:02 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH V2 15/22] xfs: add CRCs to dir2/da node blocks Message-ID: <20130424085802.GR10481@dastard> X-ASG-Orig-Subj: [PATCH V2 15/22] xfs: add CRCs to dir2/da node blocks References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-16-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-16-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: 1366793897 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129013 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- Version 2: - fix bugs, formatting and other issues found by Ben during review. fs/xfs/xfs_attr.c | 31 +- fs/xfs/xfs_attr_leaf.c | 29 +- fs/xfs/xfs_bmap.c | 1 + fs/xfs/xfs_da_btree.c | 1396 +++++++++++++++++++++++++++++------------------- fs/xfs/xfs_da_btree.h | 106 +++- fs/xfs/xfs_dir2_node.c | 26 +- fs/xfs/xfs_trace.c | 2 +- 7 files changed, 972 insertions(+), 619 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 8886838..7afef28 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -15,7 +15,6 @@ * 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_types.h" @@ -1236,7 +1235,7 @@ restart: * Search to see if name already exists, and get back a pointer * to where it should go. */ - error = xfs_da_node_lookup_int(state, &retval); + error = xfs_da3_node_lookup_int(state, &retval); if (error) goto out; blk = &state->path.blk[ state->path.active-1 ]; @@ -1307,7 +1306,7 @@ restart: * in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields. */ xfs_bmap_init(args->flist, args->firstblock); - error = xfs_da_split(state); + error = xfs_da3_split(state); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, &committed); @@ -1329,7 +1328,7 @@ restart: /* * Addition succeeded, update Btree hashvals. */ - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); } /* @@ -1400,7 +1399,7 @@ restart: state->blocksize = state->mp->m_sb.sb_blocksize; state->node_ents = state->mp->m_attr_node_ents; state->inleaf = 0; - error = xfs_da_node_lookup_int(state, &retval); + error = xfs_da3_node_lookup_int(state, &retval); if (error) goto out; @@ -1410,14 +1409,14 @@ restart: blk = &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); error = xfs_attr_leaf_remove(blk->bp, args); - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); /* * Check to see if the tree needs to be collapsed. */ if (retval && (state->path.active > 1)) { xfs_bmap_init(args->flist, args->firstblock); - error = xfs_da_join(state); + error = xfs_da3_join(state); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1495,7 +1494,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) /* * Search to see if name exists, and get back a pointer to it. */ - error = xfs_da_node_lookup_int(state, &retval); + error = xfs_da3_node_lookup_int(state, &retval); if (error || (retval != EEXIST)) { if (error == 0) error = retval; @@ -1546,14 +1545,14 @@ xfs_attr_node_removename(xfs_da_args_t *args) blk = &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); retval = xfs_attr_leaf_remove(blk->bp, args); - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); /* * Check to see if the tree needs to be collapsed. */ if (retval && (state->path.active > 1)) { xfs_bmap_init(args->flist, args->firstblock); - error = xfs_da_join(state); + error = xfs_da3_join(state); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, &committed); @@ -1699,7 +1698,7 @@ xfs_attr_refillstate(xfs_da_state_t *state) ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk = path->blk, level = 0; level < path->active; blk++, level++) { if (blk->disk_blkno) { - error = xfs_da_node_read(state->args->trans, + error = xfs_da3_node_read(state->args->trans, state->args->dp, blk->blkno, blk->disk_blkno, &blk->bp, XFS_ATTR_FORK); @@ -1718,7 +1717,7 @@ xfs_attr_refillstate(xfs_da_state_t *state) ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); for (blk = path->blk, level = 0; level < path->active; blk++, level++) { if (blk->disk_blkno) { - error = xfs_da_node_read(state->args->trans, + error = xfs_da3_node_read(state->args->trans, state->args->dp, blk->blkno, blk->disk_blkno, &blk->bp, XFS_ATTR_FORK); @@ -1758,7 +1757,7 @@ xfs_attr_node_get(xfs_da_args_t *args) /* * Search to see if name exists, and get back a pointer to it. */ - error = xfs_da_node_lookup_int(state, &retval); + error = xfs_da3_node_lookup_int(state, &retval); if (error) { retval = error; } else if (retval == EEXIST) { @@ -1810,7 +1809,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) */ bp = NULL; if (cursor->blkno > 0) { - error = xfs_da_node_read(NULL, context->dp, cursor->blkno, -1, + error = xfs_da3_node_read(NULL, context->dp, cursor->blkno, -1, &bp, XFS_ATTR_FORK); if ((error != 0) && (error != EFSCORRUPTED)) return(error); @@ -1852,7 +1851,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) if (bp == NULL) { cursor->blkno = 0; for (;;) { - error = xfs_da_node_read(NULL, context->dp, + error = xfs_da3_node_read(NULL, context->dp, cursor->blkno, -1, &bp, XFS_ATTR_FORK); if (error) @@ -1870,7 +1869,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) xfs_trans_brelse(NULL, bp); return(XFS_ERROR(EFSCORRUPTED)); } - btree = node->btree; + btree = xfs_da3_node_tree_p(node); for (i = 0; i < be16_to_cpu(node->hdr.count); btree++, i++) { if (cursor->hashval diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index aa4765f..54b0dc8 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -910,6 +910,7 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) struct xfs_buf *bp1, *bp2; xfs_dablk_t blkno; int error; + struct xfs_da_node_entry *btree; trace_xfs_attr_leaf_to_node(args); @@ -935,16 +936,16 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) /* * Set up the new root node. */ - error = xfs_da_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); + error = xfs_da3_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); if (error) goto out; node = bp1->b_addr; leaf = bp2->b_addr; ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); /* both on-disk, don't endian-flip twice */ - node->btree[0].hashval = - leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; - node->btree[0].before = cpu_to_be32(blkno); + btree = xfs_da3_node_tree_p(node); + btree[0].hashval = leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; + btree[0].before = cpu_to_be32(blkno); node->hdr.count = cpu_to_be16(1); xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(dp->i_mount) - 1); error = 0; @@ -1032,7 +1033,7 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * NOTE: rebalance() currently depends on the 2nd block being empty. */ xfs_attr_leaf_rebalance(state, oldblk, newblk); - error = xfs_da_blk_link(state, oldblk, newblk); + error = xfs_da3_blk_link(state, oldblk, newblk); if (error) return(error); @@ -1660,7 +1661,7 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) */ forward = (info->forw != 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); - error = xfs_da_path_shift(state, &state->altpath, forward, + error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); if (error) return(error); @@ -1717,10 +1718,10 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) */ memcpy(&state->altpath, &state->path, sizeof(state->path)); if (blkno < blk->blkno) { - error = xfs_da_path_shift(state, &state->altpath, forward, + error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); } else { - error = xfs_da_path_shift(state, &state->path, forward, + error = xfs_da3_path_shift(state, &state->path, forward, 0, &retval); } if (error) @@ -2783,7 +2784,7 @@ xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp) * the extents in reverse order the extent containing * block 0 must still be there. */ - error = xfs_da_node_read(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK); + error = xfs_da3_node_read(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK); if (error) return(error); blkno = XFS_BUF_ADDR(bp); @@ -2836,6 +2837,7 @@ xfs_attr_node_inactive( xfs_daddr_t parent_blkno, child_blkno; int error, count, i; struct xfs_buf *child_bp; + struct xfs_da_node_entry *btree; /* * Since this code is recursive (gasp!) we must protect ourselves. @@ -2853,7 +2855,8 @@ xfs_attr_node_inactive( xfs_trans_brelse(*trans, bp); return(0); } - child_fsb = be32_to_cpu(node->btree[0].before); + btree = xfs_da3_node_tree_p(node); + child_fsb = be32_to_cpu(btree[0].before); xfs_trans_brelse(*trans, bp); /* no locks for later trans */ /* @@ -2868,7 +2871,7 @@ xfs_attr_node_inactive( * traversal of the tree so we may deal with many blocks * before we come back to this one. */ - error = xfs_da_node_read(*trans, dp, child_fsb, -2, &child_bp, + error = xfs_da3_node_read(*trans, dp, child_fsb, -2, &child_bp, XFS_ATTR_FORK); if (error) return(error); @@ -2909,11 +2912,11 @@ xfs_attr_node_inactive( * child block number. */ if ((i+1) < count) { - error = xfs_da_node_read(*trans, dp, 0, parent_blkno, + error = xfs_da3_node_read(*trans, dp, 0, parent_blkno, &bp, XFS_ATTR_FORK); if (error) return(error); - child_fsb = be32_to_cpu(node->btree[i+1].before); + child_fsb = be32_to_cpu(btree[i+1].before); xfs_trans_brelse(*trans, bp); } /* diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 0fcb7f4..2844724 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -25,6 +25,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" +#include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 2f23b14..6a1eb75 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -38,6 +39,8 @@ #include "xfs_attr_leaf.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_cksum.h" +#include "xfs_buf_item.h" /* * xfs_da_btree.c @@ -52,69 +55,195 @@ /* * Routines used for growing the Btree. */ -STATIC int xfs_da_root_split(xfs_da_state_t *state, +STATIC int xfs_da3_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *existing_root, xfs_da_state_blk_t *new_child); -STATIC int xfs_da_node_split(xfs_da_state_t *state, +STATIC int xfs_da3_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *existing_blk, xfs_da_state_blk_t *split_blk, xfs_da_state_blk_t *blk_to_add, int treelevel, int *result); -STATIC void xfs_da_node_rebalance(xfs_da_state_t *state, +STATIC void xfs_da3_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *node_blk_1, xfs_da_state_blk_t *node_blk_2); -STATIC void xfs_da_node_add(xfs_da_state_t *state, +STATIC void xfs_da3_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *old_node_blk, xfs_da_state_blk_t *new_node_blk); /* * Routines used for shrinking the Btree. */ -STATIC int xfs_da_root_join(xfs_da_state_t *state, +STATIC int xfs_da3_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk); -STATIC int xfs_da_node_toosmall(xfs_da_state_t *state, int *retval); -STATIC void xfs_da_node_remove(xfs_da_state_t *state, +STATIC int xfs_da3_node_toosmall(xfs_da_state_t *state, int *retval); +STATIC void xfs_da3_node_remove(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk); -STATIC void xfs_da_node_unbalance(xfs_da_state_t *state, +STATIC void xfs_da3_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *src_node_blk, xfs_da_state_blk_t *dst_node_blk); /* * Utility routines. */ -STATIC uint xfs_da_node_lasthash(struct xfs_buf *bp, int *count); -STATIC int xfs_da_node_order(struct xfs_buf *node1_bp, - struct xfs_buf *node2_bp); -STATIC int xfs_da_blk_unlink(xfs_da_state_t *state, +STATIC int xfs_da3_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, xfs_da_state_blk_t *save_blk); -STATIC void xfs_da_state_kill_altpath(xfs_da_state_t *state); -static void -xfs_da_node_verify( + +kmem_zone_t *xfs_da_state_zone; /* anchor for state struct zone */ + +/* + * Allocate a dir-state structure. + * We don't put them on the stack since they're large. + */ +xfs_da_state_t * +xfs_da_state_alloc(void) +{ + return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS); +} + +/* + * Kill the altpath contents of a da-state structure. + */ +STATIC void +xfs_da_state_kill_altpath(xfs_da_state_t *state) +{ + int i; + + for (i = 0; i < state->altpath.active; i++) + state->altpath.blk[i].bp = NULL; + state->altpath.active = 0; +} + +/* + * Free a da-state structure. + */ +void +xfs_da_state_free(xfs_da_state_t *state) +{ + xfs_da_state_kill_altpath(state); +#ifdef DEBUG + memset((char *)state, 0, sizeof(*state)); +#endif /* DEBUG */ + kmem_zone_free(xfs_da_state_zone, state); +} + +void +xfs_da3_node_hdr_from_disk( + struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from) +{ + ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || + from->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); + + if (from->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { + struct xfs_da3_node_hdr *hdr3 = (struct xfs_da3_node_hdr *)from; + + to->forw = be32_to_cpu(hdr3->info.hdr.forw); + to->back = be32_to_cpu(hdr3->info.hdr.back); + to->magic = be16_to_cpu(hdr3->info.hdr.magic); + to->count = be16_to_cpu(hdr3->count); + to->level = be16_to_cpu(hdr3->__level); + return; + } + to->forw = be32_to_cpu(from->hdr.info.forw); + to->back = be32_to_cpu(from->hdr.info.back); + to->magic = be16_to_cpu(from->hdr.info.magic); + to->count = be16_to_cpu(from->hdr.count); + to->level = be16_to_cpu(from->hdr.__level); +} + +void +xfs_da3_node_hdr_to_disk( + struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from) +{ + ASSERT(from->magic == XFS_DA_NODE_MAGIC || + from->magic == XFS_DA3_NODE_MAGIC); + + if (from->magic == XFS_DA3_NODE_MAGIC) { + struct xfs_da3_node_hdr *hdr3 = (struct xfs_da3_node_hdr *)to; + + hdr3->info.hdr.forw = cpu_to_be32(from->forw); + hdr3->info.hdr.back = cpu_to_be32(from->back); + hdr3->info.hdr.magic = cpu_to_be16(from->magic); + hdr3->count = cpu_to_be16(from->count); + hdr3->__level = cpu_to_be16(from->level); + return; + } + to->hdr.info.forw = cpu_to_be32(from->forw); + to->hdr.info.back = cpu_to_be32(from->back); + to->hdr.info.magic = cpu_to_be16(from->magic); + to->hdr.count = cpu_to_be16(from->count); + to->hdr.__level = cpu_to_be16(from->level); +} + +static bool +xfs_da3_node_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_da_node_hdr *hdr = bp->b_addr; - int block_ok = 0; - - block_ok = hdr->info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC); - block_ok = block_ok && - be16_to_cpu(hdr->level) > 0 && - be16_to_cpu(hdr->count) > 0 ; - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + struct xfs_da_intnode *hdr = bp->b_addr; + struct xfs_da3_icnode_hdr ichdr; + + xfs_da3_node_hdr_from_disk(&ichdr, hdr); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_node_hdr *hdr3 = bp->b_addr; + + if (ichdr.magic != XFS_DA3_NODE_MAGIC) + return false; + + if (!uuid_equal(&hdr3->info.uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn) + return false; + } else { + if (ichdr.magic != XFS_DA_NODE_MAGIC) + return false; } + if (ichdr.level == 0) + return false; + if (ichdr.level > XFS_DA_NODE_MAXDEPTH) + return false; + if (ichdr.count == 0) + return false; + + /* + * we don't know if the node is for and attribute or directory tree, + * so only fail if the count is outside both bounds + */ + if (ichdr.count > mp->m_dir_node_ents && + ichdr.count > mp->m_attr_node_ents) + return false; + + /* XXX: hash order check? */ + return true; } static void -xfs_da_node_write_verify( +xfs_da3_node_write_verify( struct xfs_buf *bp) { - xfs_da_node_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + struct xfs_da3_node_hdr *hdr3 = bp->b_addr; + + if (!xfs_da3_node_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DA3_NODE_CRC_OFF); } /* @@ -124,16 +253,22 @@ xfs_da_node_write_verify( * format of the block being read. */ static void -xfs_da_node_read_verify( +xfs_da3_node_read_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_da_blkinfo *info = bp->b_addr; switch (be16_to_cpu(info->magic)) { + case XFS_DA3_NODE_MAGIC: + if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_DA3_NODE_CRC_OFF)) + break; + /* fall through */ case XFS_DA_NODE_MAGIC: - xfs_da_node_verify(bp); - break; + if (!xfs_da3_node_verify(bp)) + break; + return; case XFS_ATTR_LEAF_MAGIC: bp->b_ops = &xfs_attr_leaf_buf_ops; bp->b_ops->verify_read(bp); @@ -144,21 +279,22 @@ xfs_da_node_read_verify( bp->b_ops->verify_read(bp); return; default: - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - mp, info); - xfs_buf_ioerror(bp, EFSCORRUPTED); break; } + + /* corrupt block */ + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); } -const struct xfs_buf_ops xfs_da_node_buf_ops = { - .verify_read = xfs_da_node_read_verify, - .verify_write = xfs_da_node_write_verify, +const struct xfs_buf_ops xfs_da3_node_buf_ops = { + .verify_read = xfs_da3_node_read_verify, + .verify_write = xfs_da3_node_write_verify, }; int -xfs_da_node_read( +xfs_da3_node_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, @@ -167,7 +303,7 @@ xfs_da_node_read( int which_fork) { return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, - which_fork, &xfs_da_node_buf_ops); + which_fork, &xfs_da3_node_buf_ops); } /*======================================================================== @@ -178,33 +314,45 @@ xfs_da_node_read( * Create the initial contents of an intermediate node. */ int -xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, - struct xfs_buf **bpp, int whichfork) +xfs_da3_node_create( + struct xfs_da_args *args, + xfs_dablk_t blkno, + int level, + struct xfs_buf **bpp, + int whichfork) { - xfs_da_intnode_t *node; - struct xfs_buf *bp; - int error; - xfs_trans_t *tp; + struct xfs_da_intnode *node; + struct xfs_trans *tp = args->trans; + struct xfs_mount *mp = tp->t_mountp; + struct xfs_da3_icnode_hdr ichdr = {0}; + struct xfs_buf *bp; + int error; trace_xfs_da_node_create(args); + ASSERT(level <= XFS_DA_NODE_MAXDEPTH); - tp = args->trans; error = xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); if (error) return(error); - ASSERT(bp != NULL); node = bp->b_addr; - node->hdr.info.forw = 0; - node->hdr.info.back = 0; - node->hdr.info.magic = cpu_to_be16(XFS_DA_NODE_MAGIC); - node->hdr.info.pad = 0; - node->hdr.count = 0; - node->hdr.level = cpu_to_be16(level); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_node_hdr *hdr3 = bp->b_addr; + + ichdr.magic = XFS_DA3_NODE_MAGIC; + hdr3->info.blkno = cpu_to_be64(bp->b_bn); + hdr3->info.owner = cpu_to_be64(args->dp->i_ino); + uuid_copy(&hdr3->info.uuid, &mp->m_sb.sb_uuid); + } else { + ichdr.magic = XFS_DA_NODE_MAGIC; + } + ichdr.level = level; + + xfs_da3_node_hdr_to_disk(node, &ichdr); xfs_trans_log_buf(tp, bp, - XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); + XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); - bp->b_ops = &xfs_da_node_buf_ops; + bp->b_ops = &xfs_da3_node_buf_ops; *bpp = bp; return(0); } @@ -214,12 +362,18 @@ xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, * intermediate nodes, rebalance, etc. */ int /* error */ -xfs_da_split(xfs_da_state_t *state) +xfs_da3_split( + struct xfs_da_state *state) { - xfs_da_state_blk_t *oldblk, *newblk, *addblk; - xfs_da_intnode_t *node; - struct xfs_buf *bp; - int max, action, error, i; + struct xfs_da_state_blk *oldblk; + struct xfs_da_state_blk *newblk; + struct xfs_da_state_blk *addblk; + struct xfs_da_intnode *node; + struct xfs_buf *bp; + int max; + int action; + int error; + int i; trace_xfs_da_split(state->args); @@ -281,7 +435,7 @@ xfs_da_split(xfs_da_state_t *state) addblk = newblk; break; case XFS_DA_NODE_MAGIC: - error = xfs_da_node_split(state, oldblk, newblk, addblk, + error = xfs_da3_node_split(state, oldblk, newblk, addblk, max - i, &action); addblk->bp = NULL; if (error) @@ -299,7 +453,7 @@ xfs_da_split(xfs_da_state_t *state) /* * Update the btree to show the new hashval for this child. */ - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); } if (!addblk) return(0); @@ -309,7 +463,7 @@ xfs_da_split(xfs_da_state_t *state) */ ASSERT(state->path.active == 0); oldblk = &state->path.blk[0]; - error = xfs_da_root_split(state, oldblk, addblk); + error = xfs_da3_root_split(state, oldblk, addblk); if (error) { addblk->bp = NULL; return(error); /* GROT: dir is inconsistent */ @@ -320,8 +474,12 @@ xfs_da_split(xfs_da_state_t *state) * just got bumped because of the addition of a new root node. * There might be three blocks involved if a double split occurred, * and the original block 0 could be at any position in the list. + * + * Note: the magic numbers and sibling pointers are in the same + * physical place for both v2 and v3 headers (by design). Hence it + * doesn't matter which version of the xfs_da_intnode structure we use + * here as the result will be the same using either structure. */ - node = oldblk->bp->b_addr; if (node->hdr.info.forw) { if (be32_to_cpu(node->hdr.info.forw) == addblk->blkno) { @@ -360,18 +518,25 @@ xfs_da_split(xfs_da_state_t *state) * the EOF, extending the inode in process. */ STATIC int /* error */ -xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2) +xfs_da3_root_split( + struct xfs_da_state *state, + struct xfs_da_state_blk *blk1, + struct xfs_da_state_blk *blk2) { - xfs_da_intnode_t *node, *oldroot; - xfs_da_args_t *args; - xfs_dablk_t blkno; - struct xfs_buf *bp; - int error, size; - xfs_inode_t *dp; - xfs_trans_t *tp; - xfs_mount_t *mp; - xfs_dir2_leaf_t *leaf; + struct xfs_da_intnode *node; + struct xfs_da_intnode *oldroot; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_args *args; + struct xfs_buf *bp; + struct xfs_inode *dp; + struct xfs_trans *tp; + struct xfs_mount *mp; + struct xfs_dir2_leaf *leaf; + xfs_dablk_t blkno; + int level; + int error; + int size; trace_xfs_da_root_split(state->args); @@ -380,22 +545,26 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * to a free space somewhere. */ args = state->args; - ASSERT(args != NULL); error = xfs_da_grow_inode(args, &blkno); if (error) - return(error); + return error; + dp = args->dp; tp = args->trans; mp = state->mp; error = xfs_da_get_buf(tp, dp, blkno, -1, &bp, args->whichfork); if (error) - return(error); - ASSERT(bp != NULL); + return error; node = bp->b_addr; oldroot = blk1->bp->b_addr; - if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)) { - size = (int)((char *)&oldroot->btree[be16_to_cpu(oldroot->hdr.count)] - - (char *)oldroot); + if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || + oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { + struct xfs_da3_icnode_hdr nodehdr; + + xfs_da3_node_hdr_from_disk(&nodehdr, oldroot); + btree = xfs_da3_node_tree_p(oldroot); + size = (int)((char *)&btree[nodehdr.count] - (char *)oldroot); + level = nodehdr.level; } else { struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir2_leaf_entry *ents; @@ -407,9 +576,22 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); size = (int)((char *)&ents[leafhdr.count] - (char *)leaf); + level = 0; } - /* XXX: can't just copy CRC headers from one block to another */ + + /* + * we can copy most of the information in the node from one block to + * another, but for CRC enabled headers we have to make sure that the + * block specific identifiers are kept intact. We update the buffer + * directly for this. + */ memcpy(node, oldroot, size); + if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) || + oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_da3_intnode *node3 = (struct xfs_da3_intnode *)node; + + node3->hdr.info.blkno = cpu_to_be64(bp->b_bn); + } xfs_trans_log_buf(tp, bp, 0, size - 1); bp->b_ops = blk1->bp->b_ops; @@ -419,17 +601,21 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, /* * Set up the new root node. */ - error = xfs_da_node_create(args, + error = xfs_da3_node_create(args, (args->whichfork == XFS_DATA_FORK) ? mp->m_dirleafblk : 0, - be16_to_cpu(node->hdr.level) + 1, &bp, args->whichfork); + level + 1, &bp, args->whichfork); if (error) - return(error); + return error; + node = bp->b_addr; - node->btree[0].hashval = cpu_to_be32(blk1->hashval); - node->btree[0].before = cpu_to_be32(blk1->blkno); - node->btree[1].hashval = cpu_to_be32(blk2->hashval); - node->btree[1].before = cpu_to_be32(blk2->blkno); - node->hdr.count = cpu_to_be16(2); + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree = xfs_da3_node_tree_p(node); + btree[0].hashval = cpu_to_be32(blk1->hashval); + btree[0].before = cpu_to_be32(blk1->blkno); + btree[1].hashval = cpu_to_be32(blk2->hashval); + btree[1].before = cpu_to_be32(blk2->blkno); + nodehdr.count = 2; + xfs_da3_node_hdr_to_disk(node, &nodehdr); #ifdef DEBUG if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || @@ -443,30 +629,34 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, /* Header is already logged by xfs_da_node_create */ xfs_trans_log_buf(tp, bp, - XFS_DA_LOGRANGE(node, node->btree, - sizeof(xfs_da_node_entry_t) * 2)); + XFS_DA_LOGRANGE(node, btree, sizeof(xfs_da_node_entry_t) * 2)); - return(0); + return 0; } /* * Split the node, rebalance, then add the new entry. */ STATIC int /* error */ -xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, - xfs_da_state_blk_t *newblk, - xfs_da_state_blk_t *addblk, - int treelevel, int *result) +xfs_da3_node_split( + struct xfs_da_state *state, + struct xfs_da_state_blk *oldblk, + struct xfs_da_state_blk *newblk, + struct xfs_da_state_blk *addblk, + int treelevel, + int *result) { - xfs_da_intnode_t *node; - xfs_dablk_t blkno; - int newcount, error; - int useextra; + struct xfs_da_intnode *node; + struct xfs_da3_icnode_hdr nodehdr; + xfs_dablk_t blkno; + int newcount; + int error; + int useextra; trace_xfs_da_node_split(state->args); node = oldblk->bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); + xfs_da3_node_hdr_from_disk(&nodehdr, node); /* * With V2 dirs the extra block is data or freespace. @@ -476,7 +666,7 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, /* * Do we have to split the node? */ - if ((be16_to_cpu(node->hdr.count) + newcount) > state->node_ents) { + if (nodehdr.count + newcount > state->node_ents) { /* * Allocate a new node, add to the doubly linked chain of * nodes, then move some of our excess entries into it. @@ -485,14 +675,14 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, if (error) return(error); /* GROT: dir is inconsistent */ - error = xfs_da_node_create(state->args, blkno, treelevel, + error = xfs_da3_node_create(state->args, blkno, treelevel, &newblk->bp, state->args->whichfork); if (error) return(error); /* GROT: dir is inconsistent */ newblk->blkno = blkno; newblk->magic = XFS_DA_NODE_MAGIC; - xfs_da_node_rebalance(state, oldblk, newblk); - error = xfs_da_blk_link(state, oldblk, newblk); + xfs_da3_node_rebalance(state, oldblk, newblk); + error = xfs_da3_blk_link(state, oldblk, newblk); if (error) return(error); *result = 1; @@ -504,7 +694,7 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * Insert the new entry(s) into the correct block * (updating last hashval in the process). * - * xfs_da_node_add() inserts BEFORE the given index, + * xfs_da3_node_add() inserts BEFORE the given index, * and as a result of using node_lookup_int() we always * point to a valid entry (not after one), but a split * operation always results in a new block whose hashvals @@ -513,22 +703,23 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * If we had double-split op below us, then add the extra block too. */ node = oldblk->bp->b_addr; - if (oldblk->index <= be16_to_cpu(node->hdr.count)) { + xfs_da3_node_hdr_from_disk(&nodehdr, node); + if (oldblk->index <= nodehdr.count) { oldblk->index++; - xfs_da_node_add(state, oldblk, addblk); + xfs_da3_node_add(state, oldblk, addblk); if (useextra) { if (state->extraafter) oldblk->index++; - xfs_da_node_add(state, oldblk, &state->extrablk); + xfs_da3_node_add(state, oldblk, &state->extrablk); state->extravalid = 0; } } else { newblk->index++; - xfs_da_node_add(state, newblk, addblk); + xfs_da3_node_add(state, newblk, addblk); if (useextra) { if (state->extraafter) newblk->index++; - xfs_da_node_add(state, newblk, &state->extrablk); + xfs_da3_node_add(state, newblk, &state->extrablk); state->extravalid = 0; } } @@ -543,33 +734,53 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * NOTE: if blk2 is empty, then it will get the upper half of blk1. */ STATIC void -xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2) +xfs_da3_node_rebalance( + struct xfs_da_state *state, + struct xfs_da_state_blk *blk1, + struct xfs_da_state_blk *blk2) { - xfs_da_intnode_t *node1, *node2, *tmpnode; - xfs_da_node_entry_t *btree_s, *btree_d; - int count, tmp; - xfs_trans_t *tp; + struct xfs_da_intnode *node1; + struct xfs_da_intnode *node2; + struct xfs_da_intnode *tmpnode; + struct xfs_da_node_entry *btree1; + struct xfs_da_node_entry *btree2; + struct xfs_da_node_entry *btree_s; + struct xfs_da_node_entry *btree_d; + struct xfs_da3_icnode_hdr nodehdr1; + struct xfs_da3_icnode_hdr nodehdr2; + struct xfs_trans *tp; + int count; + int tmp; + int swap = 0; trace_xfs_da_node_rebalance(state->args); node1 = blk1->bp->b_addr; node2 = blk2->bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr1, node1); + xfs_da3_node_hdr_from_disk(&nodehdr2, node2); + btree1 = xfs_da3_node_tree_p(node1); + btree2 = xfs_da3_node_tree_p(node2); + /* * Figure out how many entries need to move, and in which direction. * Swap the nodes around if that makes it simpler. */ - if ((be16_to_cpu(node1->hdr.count) > 0) && (be16_to_cpu(node2->hdr.count) > 0) && - ((be32_to_cpu(node2->btree[0].hashval) < be32_to_cpu(node1->btree[0].hashval)) || - (be32_to_cpu(node2->btree[be16_to_cpu(node2->hdr.count)-1].hashval) < - be32_to_cpu(node1->btree[be16_to_cpu(node1->hdr.count)-1].hashval)))) { + if (nodehdr1.count > 0 && nodehdr2.count > 0 && + ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) || + (be32_to_cpu(btree2[nodehdr2.count - 1].hashval) < + be32_to_cpu(btree1[nodehdr1.count - 1].hashval)))) { tmpnode = node1; node1 = node2; node2 = tmpnode; + xfs_da3_node_hdr_from_disk(&nodehdr1, node1); + xfs_da3_node_hdr_from_disk(&nodehdr2, node2); + btree1 = xfs_da3_node_tree_p(node1); + btree2 = xfs_da3_node_tree_p(node2); + swap = 1; } - ASSERT(node1->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - ASSERT(node2->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - count = (be16_to_cpu(node1->hdr.count) - be16_to_cpu(node2->hdr.count)) / 2; + + count = (nodehdr1.count - nodehdr2.count) / 2; if (count == 0) return; tp = state->args->trans; @@ -580,10 +791,11 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, /* * Move elements in node2 up to make a hole. */ - if ((tmp = be16_to_cpu(node2->hdr.count)) > 0) { + tmp = nodehdr2.count; + if (tmp > 0) { tmp *= (uint)sizeof(xfs_da_node_entry_t); - btree_s = &node2->btree[0]; - btree_d = &node2->btree[count]; + btree_s = &btree2[0]; + btree_d = &btree2[count]; memmove(btree_d, btree_s, tmp); } @@ -591,12 +803,12 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * Move the req'd B-tree elements from high in node1 to * low in node2. */ - be16_add_cpu(&node2->hdr.count, count); + nodehdr2.count += count; tmp = count * (uint)sizeof(xfs_da_node_entry_t); - btree_s = &node1->btree[be16_to_cpu(node1->hdr.count) - count]; - btree_d = &node2->btree[0]; + btree_s = &btree1[nodehdr1.count - count]; + btree_d = &btree2[0]; memcpy(btree_d, btree_s, tmp); - be16_add_cpu(&node1->hdr.count, -count); + nodehdr1.count -= count; } else { /* * Move the req'd B-tree elements from low in node2 to @@ -604,49 +816,60 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, */ count = -count; tmp = count * (uint)sizeof(xfs_da_node_entry_t); - btree_s = &node2->btree[0]; - btree_d = &node1->btree[be16_to_cpu(node1->hdr.count)]; + btree_s = &btree2[0]; + btree_d = &btree1[nodehdr1.count]; memcpy(btree_d, btree_s, tmp); - be16_add_cpu(&node1->hdr.count, count); + nodehdr1.count += count; + xfs_trans_log_buf(tp, blk1->bp, XFS_DA_LOGRANGE(node1, btree_d, tmp)); /* * Move elements in node2 down to fill the hole. */ - tmp = be16_to_cpu(node2->hdr.count) - count; + tmp = nodehdr2.count - count; tmp *= (uint)sizeof(xfs_da_node_entry_t); - btree_s = &node2->btree[count]; - btree_d = &node2->btree[0]; + btree_s = &btree2[count]; + btree_d = &btree2[0]; memmove(btree_d, btree_s, tmp); - be16_add_cpu(&node2->hdr.count, -count); + nodehdr2.count -= count; } /* * Log header of node 1 and all current bits of node 2. */ + xfs_da3_node_hdr_to_disk(node1, &nodehdr1); xfs_trans_log_buf(tp, blk1->bp, - XFS_DA_LOGRANGE(node1, &node1->hdr, sizeof(node1->hdr))); + XFS_DA_LOGRANGE(node1, &node1->hdr, + xfs_da3_node_hdr_size(node1))); + + xfs_da3_node_hdr_to_disk(node2, &nodehdr2); xfs_trans_log_buf(tp, blk2->bp, XFS_DA_LOGRANGE(node2, &node2->hdr, - sizeof(node2->hdr) + - sizeof(node2->btree[0]) * be16_to_cpu(node2->hdr.count))); + xfs_da3_node_hdr_size(node2) + + (sizeof(btree2[0]) * nodehdr2.count))); /* * Record the last hashval from each block for upward propagation. * (note: don't use the swapped node pointers) */ - node1 = blk1->bp->b_addr; - node2 = blk2->bp->b_addr; - blk1->hashval = be32_to_cpu(node1->btree[be16_to_cpu(node1->hdr.count)-1].hashval); - blk2->hashval = be32_to_cpu(node2->btree[be16_to_cpu(node2->hdr.count)-1].hashval); + if (swap) { + node1 = blk1->bp->b_addr; + node2 = blk2->bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr1, node1); + xfs_da3_node_hdr_from_disk(&nodehdr2, node2); + btree1 = xfs_da3_node_tree_p(node1); + btree2 = xfs_da3_node_tree_p(node2); + } + blk1->hashval = be32_to_cpu(btree1[nodehdr1.count - 1].hashval); + blk2->hashval = be32_to_cpu(btree2[nodehdr2.count - 1].hashval); /* * Adjust the expected index for insertion. */ - if (blk1->index >= be16_to_cpu(node1->hdr.count)) { - blk2->index = blk1->index - be16_to_cpu(node1->hdr.count); - blk1->index = be16_to_cpu(node1->hdr.count) + 1; /* make it invalid */ + if (blk1->index >= nodehdr1.count) { + blk2->index = blk1->index - nodehdr1.count; + blk1->index = nodehdr1.count + 1; /* make it invalid */ } } @@ -654,18 +877,23 @@ xfs_da_node_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * Add a new entry to an intermediate node. */ STATIC void -xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, - xfs_da_state_blk_t *newblk) +xfs_da3_node_add( + struct xfs_da_state *state, + struct xfs_da_state_blk *oldblk, + struct xfs_da_state_blk *newblk) { - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - int tmp; + struct xfs_da_intnode *node; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_node_entry *btree; + int tmp; trace_xfs_da_node_add(state->args); node = oldblk->bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - ASSERT((oldblk->index >= 0) && (oldblk->index <= be16_to_cpu(node->hdr.count))); + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree = xfs_da3_node_tree_p(node); + + ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count); ASSERT(newblk->blkno != 0); if (state->args->whichfork == XFS_DATA_FORK) ASSERT(newblk->blkno >= state->mp->m_dirleafblk && @@ -675,23 +903,25 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * We may need to make some room before we insert the new node. */ tmp = 0; - btree = &node->btree[ oldblk->index ]; - if (oldblk->index < be16_to_cpu(node->hdr.count)) { - tmp = (be16_to_cpu(node->hdr.count) - oldblk->index) * (uint)sizeof(*btree); - memmove(btree + 1, btree, tmp); + if (oldblk->index < nodehdr.count) { + tmp = (nodehdr.count - oldblk->index) * (uint)sizeof(*btree); + memmove(&btree[oldblk->index + 1], &btree[oldblk->index], tmp); } - btree->hashval = cpu_to_be32(newblk->hashval); - btree->before = cpu_to_be32(newblk->blkno); + btree[oldblk->index].hashval = cpu_to_be32(newblk->hashval); + btree[oldblk->index].before = cpu_to_be32(newblk->blkno); xfs_trans_log_buf(state->args->trans, oldblk->bp, - XFS_DA_LOGRANGE(node, btree, tmp + sizeof(*btree))); - be16_add_cpu(&node->hdr.count, 1); + XFS_DA_LOGRANGE(node, &btree[oldblk->index], + tmp + sizeof(*btree))); + + nodehdr.count += 1; + xfs_da3_node_hdr_to_disk(node, &nodehdr); xfs_trans_log_buf(state->args->trans, oldblk->bp, - XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); + XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); /* * Copy the last hash value from the oldblk to propagate upwards. */ - oldblk->hashval = be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1 ].hashval); + oldblk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval); } /*======================================================================== @@ -703,14 +933,16 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * possibly deallocating that block, etc... */ int -xfs_da_join(xfs_da_state_t *state) +xfs_da3_join( + struct xfs_da_state *state) { - xfs_da_state_blk_t *drop_blk, *save_blk; - int action, error; + struct xfs_da_state_blk *drop_blk; + struct xfs_da_state_blk *save_blk; + int action = 0; + int error; trace_xfs_da_join(state->args); - action = 0; drop_blk = &state->path.blk[ state->path.active-1 ]; save_blk = &state->altpath.blk[ state->path.active-1 ]; ASSERT(state->path.blk[0].magic == XFS_DA_NODE_MAGIC); @@ -751,18 +983,18 @@ xfs_da_join(xfs_da_state_t *state) * Remove the offending node, fixup hashvals, * check for a toosmall neighbor. */ - xfs_da_node_remove(state, drop_blk); - xfs_da_fixhashpath(state, &state->path); - error = xfs_da_node_toosmall(state, &action); + xfs_da3_node_remove(state, drop_blk); + xfs_da3_fixhashpath(state, &state->path); + error = xfs_da3_node_toosmall(state, &action); if (error) return(error); if (action == 0) return 0; - xfs_da_node_unbalance(state, drop_blk, save_blk); + xfs_da3_node_unbalance(state, drop_blk, save_blk); break; } - xfs_da_fixhashpath(state, &state->altpath); - error = xfs_da_blk_unlink(state, drop_blk, save_blk); + xfs_da3_fixhashpath(state, &state->altpath); + error = xfs_da3_blk_unlink(state, drop_blk, save_blk); xfs_da_state_kill_altpath(state); if (error) return(error); @@ -777,9 +1009,9 @@ xfs_da_join(xfs_da_state_t *state) * we only have one entry in the root, make the child block * the new root. */ - xfs_da_node_remove(state, drop_blk); - xfs_da_fixhashpath(state, &state->path); - error = xfs_da_root_join(state, &state->path.blk[0]); + xfs_da3_node_remove(state, drop_blk); + xfs_da3_fixhashpath(state, &state->path); + error = xfs_da3_root_join(state, &state->path.blk[0]); return(error); } @@ -793,8 +1025,10 @@ xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level) ASSERT(magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - } else - ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); + } else { + ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || + magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); + } ASSERT(!blkinfo->forw); ASSERT(!blkinfo->back); } @@ -807,52 +1041,60 @@ xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level) * the old root to block 0 as the new root node. */ STATIC int -xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) +xfs_da3_root_join( + struct xfs_da_state *state, + struct xfs_da_state_blk *root_blk) { - xfs_da_intnode_t *oldroot; - xfs_da_args_t *args; - xfs_dablk_t child; - struct xfs_buf *bp; - int error; + struct xfs_da_intnode *oldroot; + struct xfs_da_args *args; + xfs_dablk_t child; + struct xfs_buf *bp; + struct xfs_da3_icnode_hdr oldroothdr; + struct xfs_da_node_entry *btree; + int error; trace_xfs_da_root_join(state->args); - args = state->args; - ASSERT(args != NULL); ASSERT(root_blk->magic == XFS_DA_NODE_MAGIC); + + args = state->args; oldroot = root_blk->bp->b_addr; - ASSERT(oldroot->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - ASSERT(!oldroot->hdr.info.forw); - ASSERT(!oldroot->hdr.info.back); + xfs_da3_node_hdr_from_disk(&oldroothdr, oldroot); + ASSERT(oldroothdr.forw == 0); + ASSERT(oldroothdr.back == 0); /* * If the root has more than one child, then don't do anything. */ - if (be16_to_cpu(oldroot->hdr.count) > 1) - return(0); + if (oldroothdr.count > 1) + return 0; /* * Read in the (only) child block, then copy those bytes into * the root block's buffer and free the original child block. */ - child = be32_to_cpu(oldroot->btree[0].before); + btree = xfs_da3_node_tree_p(oldroot); + child = be32_to_cpu(btree[0].before); ASSERT(child != 0); - error = xfs_da_node_read(args->trans, args->dp, child, -1, &bp, + error = xfs_da3_node_read(args->trans, args->dp, child, -1, &bp, args->whichfork); if (error) - return(error); - ASSERT(bp != NULL); - xfs_da_blkinfo_onlychild_validate(bp->b_addr, - be16_to_cpu(oldroot->hdr.level)); + return error; + xfs_da_blkinfo_onlychild_validate(bp->b_addr, oldroothdr.level); /* * This could be copying a leaf back into the root block in the case of * there only being a single leaf block left in the tree. Hence we have * to update the b_ops pointer as well to match the buffer type change - * that could occur. + * that could occur. For dir3 blocks we also need to update the block + * number in the buffer header. */ memcpy(root_blk->bp->b_addr, bp->b_addr, state->blocksize); root_blk->bp->b_ops = bp->b_ops; + if (oldroothdr.magic == XFS_DA3_NODE_MAGIC) { + struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr; + da3->blkno = cpu_to_be64(root_blk->bp->b_bn); + } xfs_trans_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); error = xfs_da_shrink_inode(args, child, bp); return(error); @@ -868,14 +1110,21 @@ xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) * If nothing can be done, return 0. */ STATIC int -xfs_da_node_toosmall(xfs_da_state_t *state, int *action) +xfs_da3_node_toosmall( + struct xfs_da_state *state, + int *action) { - xfs_da_intnode_t *node; - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *info; - int count, forward, error, retval, i; - xfs_dablk_t blkno; - struct xfs_buf *bp; + struct xfs_da_intnode *node; + struct xfs_da_state_blk *blk; + struct xfs_da_blkinfo *info; + xfs_dablk_t blkno; + struct xfs_buf *bp; + struct xfs_da3_icnode_hdr nodehdr; + int count; + int forward; + int error; + int retval; + int i; trace_xfs_da_node_toosmall(state->args); @@ -886,10 +1135,9 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) */ blk = &state->path.blk[ state->path.active-1 ]; info = blk->bp->b_addr; - ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); node = (xfs_da_intnode_t *)info; - count = be16_to_cpu(node->hdr.count); - if (count > (state->node_ents >> 1)) { + xfs_da3_node_hdr_from_disk(&nodehdr, node); + if (nodehdr.count > (state->node_ents >> 1)) { *action = 0; /* blk over 50%, don't try to join */ return(0); /* blk over 50%, don't try to join */ } @@ -900,14 +1148,14 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) * coalesce it with a sibling block. We choose (arbitrarily) * to merge with the forward block unless it is NULL. */ - if (count == 0) { + if (nodehdr.count == 0) { /* * Make altpath point to the block we want to keep and * path point to the block we want to drop (this one). */ forward = (info->forw != 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); - error = xfs_da_path_shift(state, &state->altpath, forward, + error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); if (error) return(error); @@ -926,35 +1174,34 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) * We prefer coalescing with the lower numbered sibling so as * to shrink a directory over time. */ + count = state->node_ents; + count -= state->node_ents >> 2; + count -= nodehdr.count; + /* start with smaller blk num */ - forward = (be32_to_cpu(info->forw) < be32_to_cpu(info->back)); + forward = nodehdr.forw < nodehdr.back; for (i = 0; i < 2; forward = !forward, i++) { if (forward) - blkno = be32_to_cpu(info->forw); + blkno = nodehdr.forw; else - blkno = be32_to_cpu(info->back); + blkno = nodehdr.back; if (blkno == 0) continue; - error = xfs_da_node_read(state->args->trans, state->args->dp, + error = xfs_da3_node_read(state->args->trans, state->args->dp, blkno, -1, &bp, state->args->whichfork); if (error) return(error); - ASSERT(bp != NULL); - node = (xfs_da_intnode_t *)info; - count = state->node_ents; - count -= state->node_ents >> 2; - count -= be16_to_cpu(node->hdr.count); node = bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - count -= be16_to_cpu(node->hdr.count); + xfs_da3_node_hdr_from_disk(&nodehdr, node); xfs_trans_brelse(state->args->trans, bp); - if (count >= 0) + + if (count - nodehdr.count >= 0) break; /* fits with at least 25% to spare */ } if (i >= 2) { *action = 0; - return(0); + return 0; } /* @@ -963,28 +1210,42 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) */ memcpy(&state->altpath, &state->path, sizeof(state->path)); if (blkno < blk->blkno) { - error = xfs_da_path_shift(state, &state->altpath, forward, + error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); - if (error) { - return(error); - } - if (retval) { - *action = 0; - return(0); - } } else { - error = xfs_da_path_shift(state, &state->path, forward, + error = xfs_da3_path_shift(state, &state->path, forward, 0, &retval); - if (error) { - return(error); - } - if (retval) { - *action = 0; - return(0); - } + } + if (error) + return error; + if (retval) { + *action = 0; + return 0; } *action = 1; - return(0); + return 0; +} + +/* + * Pick up the last hashvalue from an intermediate node. + */ +STATIC uint +xfs_da3_node_lasthash( + struct xfs_buf *bp, + int *count) +{ + struct xfs_da_intnode *node; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; + + node = bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr, node); + if (count) + *count = nodehdr.count; + if (!nodehdr.count) + return 0; + btree = xfs_da3_node_tree_p(node); + return be32_to_cpu(btree[nodehdr.count - 1].hashval); } /* @@ -992,13 +1253,16 @@ xfs_da_node_toosmall(xfs_da_state_t *state, int *action) * when we stop making changes, return. */ void -xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_state_path_t *path) +xfs_da3_fixhashpath( + struct xfs_da_state *state, + struct xfs_da_state_path *path) { - xfs_da_state_blk_t *blk; - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - xfs_dahash_t lasthash=0; - int level, count; + struct xfs_da_state_blk *blk; + struct xfs_da_intnode *node; + struct xfs_da_node_entry *btree; + xfs_dahash_t lasthash=0; + int level; + int count; trace_xfs_da_fixhashpath(state->args); @@ -1016,23 +1280,26 @@ xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_state_path_t *path) return; break; case XFS_DA_NODE_MAGIC: - lasthash = xfs_da_node_lasthash(blk->bp, &count); + lasthash = xfs_da3_node_lasthash(blk->bp, &count); if (count == 0) return; break; } for (blk--, level--; level >= 0; blk--, level--) { + struct xfs_da3_icnode_hdr nodehdr; + node = blk->bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - btree = &node->btree[ blk->index ]; + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree = xfs_da3_node_tree_p(node); if (be32_to_cpu(btree->hashval) == lasthash) break; blk->hashval = lasthash; - btree->hashval = cpu_to_be32(lasthash); + btree[blk->index].hashval = cpu_to_be32(lasthash); xfs_trans_log_buf(state->args->trans, blk->bp, - XFS_DA_LOGRANGE(node, btree, sizeof(*btree))); + XFS_DA_LOGRANGE(node, &btree[blk->index], + sizeof(*btree))); - lasthash = be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1].hashval); + lasthash = be32_to_cpu(btree[nodehdr.count - 1].hashval); } } @@ -1040,104 +1307,120 @@ xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_state_path_t *path) * Remove an entry from an intermediate node. */ STATIC void -xfs_da_node_remove(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk) +xfs_da3_node_remove( + struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk) { - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - int tmp; + struct xfs_da_intnode *node; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_node_entry *btree; + int index; + int tmp; trace_xfs_da_node_remove(state->args); node = drop_blk->bp->b_addr; - ASSERT(drop_blk->index < be16_to_cpu(node->hdr.count)); + xfs_da3_node_hdr_from_disk(&nodehdr, node); + ASSERT(drop_blk->index < nodehdr.count); ASSERT(drop_blk->index >= 0); /* * Copy over the offending entry, or just zero it out. */ - btree = &node->btree[drop_blk->index]; - if (drop_blk->index < (be16_to_cpu(node->hdr.count)-1)) { - tmp = be16_to_cpu(node->hdr.count) - drop_blk->index - 1; + index = drop_blk->index; + btree = xfs_da3_node_tree_p(node); + if (index < nodehdr.count - 1) { + tmp = nodehdr.count - index - 1; tmp *= (uint)sizeof(xfs_da_node_entry_t); - memmove(btree, btree + 1, tmp); + memmove(&btree[index], &btree[index + 1], tmp); xfs_trans_log_buf(state->args->trans, drop_blk->bp, - XFS_DA_LOGRANGE(node, btree, tmp)); - btree = &node->btree[be16_to_cpu(node->hdr.count)-1]; + XFS_DA_LOGRANGE(node, &btree[index], tmp)); + index = nodehdr.count - 1; } - memset((char *)btree, 0, sizeof(xfs_da_node_entry_t)); + memset(&btree[index], 0, sizeof(xfs_da_node_entry_t)); xfs_trans_log_buf(state->args->trans, drop_blk->bp, - XFS_DA_LOGRANGE(node, btree, sizeof(*btree))); - be16_add_cpu(&node->hdr.count, -1); + XFS_DA_LOGRANGE(node, &btree[index], sizeof(btree[index]))); + nodehdr.count -= 1; + xfs_da3_node_hdr_to_disk(node, &nodehdr); xfs_trans_log_buf(state->args->trans, drop_blk->bp, - XFS_DA_LOGRANGE(node, &node->hdr, sizeof(node->hdr))); + XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); /* * Copy the last hash value from the block to propagate upwards. */ - btree--; - drop_blk->hashval = be32_to_cpu(btree->hashval); + drop_blk->hashval = be32_to_cpu(btree[index - 1].hashval); } /* - * Unbalance the btree elements between two intermediate nodes, + * Unbalance the elements between two intermediate nodes, * move all Btree elements from one node into another. */ STATIC void -xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, - xfs_da_state_blk_t *save_blk) +xfs_da3_node_unbalance( + struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk, + struct xfs_da_state_blk *save_blk) { - xfs_da_intnode_t *drop_node, *save_node; - xfs_da_node_entry_t *btree; - int tmp; - xfs_trans_t *tp; + struct xfs_da_intnode *drop_node; + struct xfs_da_intnode *save_node; + struct xfs_da_node_entry *drop_btree; + struct xfs_da_node_entry *save_btree; + struct xfs_da3_icnode_hdr drop_hdr; + struct xfs_da3_icnode_hdr save_hdr; + struct xfs_trans *tp; + int sindex; + int tmp; trace_xfs_da_node_unbalance(state->args); drop_node = drop_blk->bp->b_addr; save_node = save_blk->bp->b_addr; - ASSERT(drop_node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - ASSERT(save_node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); + xfs_da3_node_hdr_from_disk(&drop_hdr, drop_node); + xfs_da3_node_hdr_from_disk(&save_hdr, save_node); + drop_btree = xfs_da3_node_tree_p(drop_node); + save_btree = xfs_da3_node_tree_p(save_node); tp = state->args->trans; /* * If the dying block has lower hashvals, then move all the * elements in the remaining block up to make a hole. */ - if ((be32_to_cpu(drop_node->btree[0].hashval) < be32_to_cpu(save_node->btree[ 0 ].hashval)) || - (be32_to_cpu(drop_node->btree[be16_to_cpu(drop_node->hdr.count)-1].hashval) < - be32_to_cpu(save_node->btree[be16_to_cpu(save_node->hdr.count)-1].hashval))) - { - btree = &save_node->btree[be16_to_cpu(drop_node->hdr.count)]; - tmp = be16_to_cpu(save_node->hdr.count) * (uint)sizeof(xfs_da_node_entry_t); - memmove(btree, &save_node->btree[0], tmp); - btree = &save_node->btree[0]; + if ((be32_to_cpu(drop_btree[0].hashval) < + be32_to_cpu(save_btree[0].hashval)) || + (be32_to_cpu(drop_btree[drop_hdr.count - 1].hashval) < + be32_to_cpu(save_btree[save_hdr.count - 1].hashval))) { + /* XXX: check this - is memmove dst correct? */ + tmp = save_hdr.count * sizeof(xfs_da_node_entry_t); + memmove(&save_btree[drop_hdr.count], &save_btree[0], tmp); + + sindex = 0; xfs_trans_log_buf(tp, save_blk->bp, - XFS_DA_LOGRANGE(save_node, btree, - (be16_to_cpu(save_node->hdr.count) + be16_to_cpu(drop_node->hdr.count)) * - sizeof(xfs_da_node_entry_t))); + XFS_DA_LOGRANGE(save_node, &save_btree[0], + (save_hdr.count + drop_hdr.count) * + sizeof(xfs_da_node_entry_t))); } else { - btree = &save_node->btree[be16_to_cpu(save_node->hdr.count)]; + sindex = save_hdr.count; xfs_trans_log_buf(tp, save_blk->bp, - XFS_DA_LOGRANGE(save_node, btree, - be16_to_cpu(drop_node->hdr.count) * - sizeof(xfs_da_node_entry_t))); + XFS_DA_LOGRANGE(save_node, &save_btree[sindex], + drop_hdr.count * sizeof(xfs_da_node_entry_t))); } /* * Move all the B-tree elements from drop_blk to save_blk. */ - tmp = be16_to_cpu(drop_node->hdr.count) * (uint)sizeof(xfs_da_node_entry_t); - memcpy(btree, &drop_node->btree[0], tmp); - be16_add_cpu(&save_node->hdr.count, be16_to_cpu(drop_node->hdr.count)); + tmp = drop_hdr.count * (uint)sizeof(xfs_da_node_entry_t); + memcpy(&save_btree[sindex], &drop_btree[0], tmp); + save_hdr.count += drop_hdr.count; + xfs_da3_node_hdr_to_disk(save_node, &save_hdr); xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, &save_node->hdr, - sizeof(save_node->hdr))); + xfs_da3_node_hdr_size(save_node))); /* * Save the last hashval in the remaining block for upward propagation. */ - save_blk->hashval = be32_to_cpu(save_node->btree[be16_to_cpu(save_node->hdr.count)-1].hashval); + save_blk->hashval = be32_to_cpu(save_btree[save_hdr.count - 1].hashval); } /*======================================================================== @@ -1156,16 +1439,24 @@ xfs_da_node_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, * pruned depth-first tree search. */ int /* error */ -xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) +xfs_da3_node_lookup_int( + struct xfs_da_state *state, + int *result) { - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *curr; - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - xfs_dablk_t blkno; - int probe, span, max, error, retval; - xfs_dahash_t hashval, btreehashval; - xfs_da_args_t *args; + struct xfs_da_state_blk *blk; + struct xfs_da_blkinfo *curr; + struct xfs_da_intnode *node; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_args *args; + xfs_dablk_t blkno; + xfs_dahash_t hashval; + xfs_dahash_t btreehashval; + int probe; + int span; + int max; + int error; + int retval; args = state->args; @@ -1181,7 +1472,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) * Read the next node down in the tree. */ blk->blkno = blkno; - error = xfs_da_node_read(args->trans, args->dp, blkno, + error = xfs_da3_node_read(args->trans, args->dp, blkno, -1, &blk->bp, args->whichfork); if (error) { blk->blkno = 0; @@ -1190,66 +1481,73 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) } curr = blk->bp->b_addr; blk->magic = be16_to_cpu(curr->magic); - ASSERT(blk->magic == XFS_DA_NODE_MAGIC || - blk->magic == XFS_DIR2_LEAFN_MAGIC || - blk->magic == XFS_ATTR_LEAF_MAGIC); + + if (blk->magic == XFS_ATTR_LEAF_MAGIC) { + blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL); + break; + } + + if (blk->magic == XFS_DIR2_LEAFN_MAGIC || + blk->magic == XFS_DIR3_LEAFN_MAGIC) { + blk->magic = XFS_DIR2_LEAFN_MAGIC; + blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, NULL); + break; + } + + blk->magic = XFS_DA_NODE_MAGIC; + /* * Search an intermediate node for a match. */ - if (blk->magic == XFS_DA_NODE_MAGIC) { - node = blk->bp->b_addr; - max = be16_to_cpu(node->hdr.count); - blk->hashval = be32_to_cpu(node->btree[max-1].hashval); + node = blk->bp->b_addr; + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree = xfs_da3_node_tree_p(node); - /* - * Binary search. (note: small blocks will skip loop) - */ - probe = span = max / 2; - hashval = args->hashval; - for (btree = &node->btree[probe]; span > 4; - btree = &node->btree[probe]) { - span /= 2; - btreehashval = be32_to_cpu(btree->hashval); - if (btreehashval < hashval) - probe += span; - else if (btreehashval > hashval) - probe -= span; - else - break; - } - ASSERT((probe >= 0) && (probe < max)); - ASSERT((span <= 4) || (be32_to_cpu(btree->hashval) == hashval)); + max = nodehdr.count; + blk->hashval = be32_to_cpu(btree[max - 1].hashval); - /* - * Since we may have duplicate hashval's, find the first - * matching hashval in the node. - */ - while ((probe > 0) && (be32_to_cpu(btree->hashval) >= hashval)) { - btree--; - probe--; - } - while ((probe < max) && (be32_to_cpu(btree->hashval) < hashval)) { - btree++; - probe++; - } + /* + * Binary search. (note: small blocks will skip loop) + */ + probe = span = max / 2; + hashval = args->hashval; + while (span > 4) { + span /= 2; + btreehashval = be32_to_cpu(btree[probe].hashval); + if (btreehashval < hashval) + probe += span; + else if (btreehashval > hashval) + probe -= span; + else + break; + } + ASSERT((probe >= 0) && (probe < max)); + ASSERT((span <= 4) || + (be32_to_cpu(btree[probe].hashval) == hashval)); - /* - * Pick the right block to descend on. - */ - if (probe == max) { - blk->index = max-1; - blkno = be32_to_cpu(node->btree[max-1].before); - } else { - blk->index = probe; - blkno = be32_to_cpu(btree->before); - } - } else if (blk->magic == XFS_ATTR_LEAF_MAGIC) { - blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL); - break; - } else if (blk->magic == XFS_DIR2_LEAFN_MAGIC) { - blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, NULL); - break; + /* + * Since we may have duplicate hashval's, find the first + * matching hashval in the node. + */ + while (probe > 0 && + be32_to_cpu(btree[probe].hashval) >= hashval) { + probe--; + } + while (probe < max && + be32_to_cpu(btree[probe].hashval) < hashval) { + probe++; + } + + /* + * Pick the right block to descend on. + */ + if (probe == max) { + blk->index = max - 1; + blkno = be32_to_cpu(btree[max - 1].before); + } else { + blk->index = probe; + blkno = be32_to_cpu(btree[probe].before); } } @@ -1273,7 +1571,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) } if (((retval == ENOENT) || (retval == ENOATTR)) && (blk->hashval == args->hashval)) { - error = xfs_da_path_shift(state, &state->path, 1, 1, + error = xfs_da3_path_shift(state, &state->path, 1, 1, &retval); if (error) return(error); @@ -1295,16 +1593,52 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) *========================================================================*/ /* + * Compare two intermediate nodes for "order". + */ +STATIC int +xfs_da3_node_order( + struct xfs_buf *node1_bp, + struct xfs_buf *node2_bp) +{ + struct xfs_da_intnode *node1; + struct xfs_da_intnode *node2; + struct xfs_da_node_entry *btree1; + struct xfs_da_node_entry *btree2; + struct xfs_da3_icnode_hdr node1hdr; + struct xfs_da3_icnode_hdr node2hdr; + + node1 = node1_bp->b_addr; + node2 = node2_bp->b_addr; + xfs_da3_node_hdr_from_disk(&node1hdr, node1); + xfs_da3_node_hdr_from_disk(&node2hdr, node2); + btree1 = xfs_da3_node_tree_p(node1); + btree2 = xfs_da3_node_tree_p(node2); + + if (node1hdr.count > 0 && node2hdr.count > 0 && + ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) || + (be32_to_cpu(btree2[node2hdr.count - 1].hashval) < + be32_to_cpu(btree1[node1hdr.count - 1].hashval)))) { + return 1; + } + return 0; +} + +/* * Link a new block into a doubly linked list of blocks (of whatever type). */ int /* error */ -xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, - xfs_da_state_blk_t *new_blk) +xfs_da3_blk_link( + struct xfs_da_state *state, + struct xfs_da_state_blk *old_blk, + struct xfs_da_state_blk *new_blk) { - xfs_da_blkinfo_t *old_info, *new_info, *tmp_info; - xfs_da_args_t *args; - int before=0, error; - struct xfs_buf *bp; + struct xfs_da_blkinfo *old_info; + struct xfs_da_blkinfo *new_info; + struct xfs_da_blkinfo *tmp_info; + struct xfs_da_args *args; + struct xfs_buf *bp; + int before = 0; + int error; /* * Set up environment. @@ -1316,9 +1650,6 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, ASSERT(old_blk->magic == XFS_DA_NODE_MAGIC || old_blk->magic == XFS_DIR2_LEAFN_MAGIC || old_blk->magic == XFS_ATTR_LEAF_MAGIC); - ASSERT(old_blk->magic == be16_to_cpu(old_info->magic)); - ASSERT(new_blk->magic == be16_to_cpu(new_info->magic)); - ASSERT(old_blk->magic == new_blk->magic); switch (old_blk->magic) { case XFS_ATTR_LEAF_MAGIC: @@ -1328,7 +1659,7 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, before = xfs_dir2_leafn_order(old_blk->bp, new_blk->bp); break; case XFS_DA_NODE_MAGIC: - before = xfs_da_node_order(old_blk->bp, new_blk->bp); + before = xfs_da3_node_order(old_blk->bp, new_blk->bp); break; } @@ -1343,14 +1674,14 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, new_info->forw = cpu_to_be32(old_blk->blkno); new_info->back = old_info->back; if (old_info->back) { - error = xfs_da_node_read(args->trans, args->dp, + error = xfs_da3_node_read(args->trans, args->dp, be32_to_cpu(old_info->back), -1, &bp, args->whichfork); if (error) return(error); ASSERT(bp != NULL); tmp_info = bp->b_addr; - ASSERT(be16_to_cpu(tmp_info->magic) == be16_to_cpu(old_info->magic)); + ASSERT(tmp_info->magic == old_info->magic); ASSERT(be32_to_cpu(tmp_info->forw) == old_blk->blkno); tmp_info->forw = cpu_to_be32(new_blk->blkno); xfs_trans_log_buf(args->trans, bp, 0, sizeof(*tmp_info)-1); @@ -1364,7 +1695,7 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, new_info->forw = old_info->forw; new_info->back = cpu_to_be32(old_blk->blkno); if (old_info->forw) { - error = xfs_da_node_read(args->trans, args->dp, + error = xfs_da3_node_read(args->trans, args->dp, be32_to_cpu(old_info->forw), -1, &bp, args->whichfork); if (error) @@ -1385,59 +1716,20 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, } /* - * Compare two intermediate nodes for "order". - */ -STATIC int -xfs_da_node_order( - struct xfs_buf *node1_bp, - struct xfs_buf *node2_bp) -{ - xfs_da_intnode_t *node1, *node2; - - node1 = node1_bp->b_addr; - node2 = node2_bp->b_addr; - ASSERT(node1->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC) && - node2->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - if ((be16_to_cpu(node1->hdr.count) > 0) && (be16_to_cpu(node2->hdr.count) > 0) && - ((be32_to_cpu(node2->btree[0].hashval) < - be32_to_cpu(node1->btree[0].hashval)) || - (be32_to_cpu(node2->btree[be16_to_cpu(node2->hdr.count)-1].hashval) < - be32_to_cpu(node1->btree[be16_to_cpu(node1->hdr.count)-1].hashval)))) { - return(1); - } - return(0); -} - -/* - * Pick up the last hashvalue from an intermediate node. - */ -STATIC uint -xfs_da_node_lasthash( - struct xfs_buf *bp, - int *count) -{ - xfs_da_intnode_t *node; - - node = bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - if (count) - *count = be16_to_cpu(node->hdr.count); - if (!node->hdr.count) - return(0); - return be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1].hashval); -} - -/* * Unlink a block from a doubly linked list of blocks. */ STATIC int /* error */ -xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, - xfs_da_state_blk_t *save_blk) +xfs_da3_blk_unlink( + struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk, + struct xfs_da_state_blk *save_blk) { - xfs_da_blkinfo_t *drop_info, *save_info, *tmp_info; - xfs_da_args_t *args; - struct xfs_buf *bp; - int error; + struct xfs_da_blkinfo *drop_info; + struct xfs_da_blkinfo *save_info; + struct xfs_da_blkinfo *tmp_info; + struct xfs_da_args *args; + struct xfs_buf *bp; + int error; /* * Set up environment. @@ -1449,8 +1741,6 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, ASSERT(save_blk->magic == XFS_DA_NODE_MAGIC || save_blk->magic == XFS_DIR2_LEAFN_MAGIC || save_blk->magic == XFS_ATTR_LEAF_MAGIC); - ASSERT(save_blk->magic == be16_to_cpu(save_info->magic)); - ASSERT(drop_blk->magic == be16_to_cpu(drop_info->magic)); ASSERT(save_blk->magic == drop_blk->magic); ASSERT((be32_to_cpu(save_info->forw) == drop_blk->blkno) || (be32_to_cpu(save_info->back) == drop_blk->blkno)); @@ -1464,7 +1754,7 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, trace_xfs_da_unlink_back(args); save_info->back = drop_info->back; if (drop_info->back) { - error = xfs_da_node_read(args->trans, args->dp, + error = xfs_da3_node_read(args->trans, args->dp, be32_to_cpu(drop_info->back), -1, &bp, args->whichfork); if (error) @@ -1481,7 +1771,7 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, trace_xfs_da_unlink_forward(args); save_info->forw = drop_info->forw; if (drop_info->forw) { - error = xfs_da_node_read(args->trans, args->dp, + error = xfs_da3_node_read(args->trans, args->dp, be32_to_cpu(drop_info->forw), -1, &bp, args->whichfork); if (error) @@ -1509,15 +1799,22 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, * the new bottom and the root. */ int /* error */ -xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, - int forward, int release, int *result) +xfs_da3_path_shift( + struct xfs_da_state *state, + struct xfs_da_state_path *path, + int forward, + int release, + int *result) { - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *info; - xfs_da_intnode_t *node; - xfs_da_args_t *args; - xfs_dablk_t blkno=0; - int level, error; + struct xfs_da_state_blk *blk; + struct xfs_da_blkinfo *info; + struct xfs_da_intnode *node; + struct xfs_da_args *args; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr nodehdr; + xfs_dablk_t blkno = 0; + int level; + int error; trace_xfs_da_path_shift(state->args); @@ -1532,16 +1829,17 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, ASSERT((path->active > 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); level = (path->active-1) - 1; /* skip bottom layer in path */ for (blk = &path->blk[level]; level >= 0; blk--, level--) { - ASSERT(blk->bp != NULL); node = blk->bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - if (forward && (blk->index < be16_to_cpu(node->hdr.count)-1)) { + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree = xfs_da3_node_tree_p(node); + + if (forward && (blk->index < nodehdr.count - 1)) { blk->index++; - blkno = be32_to_cpu(node->btree[blk->index].before); + blkno = be32_to_cpu(btree[blk->index].before); break; } else if (!forward && (blk->index > 0)) { blk->index--; - blkno = be32_to_cpu(node->btree[blk->index].before); + blkno = be32_to_cpu(btree[blk->index].before); break; } } @@ -1567,47 +1865,58 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, * Read the next child block. */ blk->blkno = blkno; - error = xfs_da_node_read(args->trans, args->dp, blkno, -1, + error = xfs_da3_node_read(args->trans, args->dp, blkno, -1, &blk->bp, args->whichfork); if (error) return(error); - ASSERT(blk->bp != NULL); info = blk->bp->b_addr; ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || + info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) || info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - blk->magic = be16_to_cpu(info->magic); - if (blk->magic == XFS_DA_NODE_MAGIC) { + + + /* + * Note: we flatten the magic number to a single type so we + * don't have to compare against crc/non-crc types elsewhere. + */ + switch (be16_to_cpu(info->magic)) { + case XFS_DA_NODE_MAGIC: + case XFS_DA3_NODE_MAGIC: + blk->magic = XFS_DA_NODE_MAGIC; node = (xfs_da_intnode_t *)info; - blk->hashval = be32_to_cpu(node->btree[be16_to_cpu(node->hdr.count)-1].hashval); + xfs_da3_node_hdr_from_disk(&nodehdr, node); + btree = xfs_da3_node_tree_p(node); + blk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval); if (forward) blk->index = 0; else - blk->index = be16_to_cpu(node->hdr.count)-1; - blkno = be32_to_cpu(node->btree[blk->index].before); - } else { + blk->index = nodehdr.count - 1; + blkno = be32_to_cpu(btree[blk->index].before); + break; + case XFS_ATTR_LEAF_MAGIC: + blk->magic = XFS_ATTR_LEAF_MAGIC; ASSERT(level == path->active-1); blk->index = 0; - switch(blk->magic) { - case XFS_ATTR_LEAF_MAGIC: - blk->hashval = xfs_attr_leaf_lasthash(blk->bp, - NULL); - break; - case XFS_DIR2_LEAFN_MAGIC: - case XFS_DIR3_LEAFN_MAGIC: - blk->magic = XFS_DIR2_LEAFN_MAGIC; - blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, - NULL); - break; - default: - ASSERT(0); - break; - } + blk->hashval = xfs_attr_leaf_lasthash(blk->bp, + NULL); + break; + case XFS_DIR2_LEAFN_MAGIC: + case XFS_DIR3_LEAFN_MAGIC: + blk->magic = XFS_DIR2_LEAFN_MAGIC; + ASSERT(level == path->active-1); + blk->index = 0; + blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, + NULL); + break; + default: + ASSERT(0); + break; } } *result = 0; - return(0); + return 0; } @@ -1794,22 +2103,36 @@ xfs_da_grow_inode( * a bmap btree split to do that. */ STATIC int -xfs_da_swap_lastblock( - xfs_da_args_t *args, - xfs_dablk_t *dead_blknop, - struct xfs_buf **dead_bufp) +xfs_da3_swap_lastblock( + struct xfs_da_args *args, + xfs_dablk_t *dead_blknop, + struct xfs_buf **dead_bufp) { - xfs_dablk_t dead_blkno, last_blkno, sib_blkno, par_blkno; - struct xfs_buf *dead_buf, *last_buf, *sib_buf, *par_buf; - xfs_fileoff_t lastoff; - xfs_inode_t *ip; - xfs_trans_t *tp; - xfs_mount_t *mp; - int error, w, entno, level, dead_level; - xfs_da_blkinfo_t *dead_info, *sib_info; - xfs_da_intnode_t *par_node, *dead_node; - xfs_dir2_leaf_t *dead_leaf2; - xfs_dahash_t dead_hash; + struct xfs_da_blkinfo *dead_info; + struct xfs_da_blkinfo *sib_info; + struct xfs_da_intnode *par_node; + struct xfs_da_intnode *dead_node; + struct xfs_dir2_leaf *dead_leaf2; + struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr par_hdr; + struct xfs_inode *ip; + struct xfs_trans *tp; + struct xfs_mount *mp; + struct xfs_buf *dead_buf; + struct xfs_buf *last_buf; + struct xfs_buf *sib_buf; + struct xfs_buf *par_buf; + xfs_dahash_t dead_hash; + xfs_fileoff_t lastoff; + xfs_dablk_t dead_blkno; + xfs_dablk_t last_blkno; + xfs_dablk_t sib_blkno; + xfs_dablk_t par_blkno; + int error; + int w; + int entno; + int level; + int dead_level; trace_xfs_da_swap_lastblock(args); @@ -1833,7 +2156,7 @@ xfs_da_swap_lastblock( * Read the last block in the btree space. */ last_blkno = (xfs_dablk_t)lastoff - mp->m_dirblkfsbs; - error = xfs_da_node_read(tp, ip, last_blkno, -1, &last_buf, w); + error = xfs_da3_node_read(tp, ip, last_blkno, -1, &last_buf, w); if (error) return error; /* @@ -1856,17 +2179,20 @@ xfs_da_swap_lastblock( dead_level = 0; dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval); } else { - ASSERT(dead_info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); + struct xfs_da3_icnode_hdr deadhdr; + dead_node = (xfs_da_intnode_t *)dead_info; - dead_level = be16_to_cpu(dead_node->hdr.level); - dead_hash = be32_to_cpu(dead_node->btree[be16_to_cpu(dead_node->hdr.count) - 1].hashval); + xfs_da3_node_hdr_from_disk(&deadhdr, dead_node); + btree = xfs_da3_node_tree_p(dead_node); + dead_level = deadhdr.level; + dead_hash = be32_to_cpu(btree[deadhdr.count - 1].hashval); } sib_buf = par_buf = NULL; /* * If the moved block has a left sibling, fix up the pointers. */ if ((sib_blkno = be32_to_cpu(dead_info->back))) { - error = xfs_da_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); + error = xfs_da3_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); if (error) goto done; sib_info = sib_buf->b_addr; @@ -1888,7 +2214,7 @@ xfs_da_swap_lastblock( * If the moved block has a right sibling, fix up the pointers. */ if ((sib_blkno = be32_to_cpu(dead_info->forw))) { - error = xfs_da_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); + error = xfs_da3_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); if (error) goto done; sib_info = sib_buf->b_addr; @@ -1912,31 +2238,31 @@ xfs_da_swap_lastblock( * Walk down the tree looking for the parent of the moved block. */ for (;;) { - error = xfs_da_node_read(tp, ip, par_blkno, -1, &par_buf, w); + error = xfs_da3_node_read(tp, ip, par_blkno, -1, &par_buf, w); if (error) goto done; par_node = par_buf->b_addr; - if (unlikely(par_node->hdr.info.magic != - cpu_to_be16(XFS_DA_NODE_MAGIC) || - (level >= 0 && level != be16_to_cpu(par_node->hdr.level) + 1))) { + xfs_da3_node_hdr_from_disk(&par_hdr, par_node); + if (level >= 0 && level != par_hdr.level + 1) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(4)", XFS_ERRLEVEL_LOW, mp); error = XFS_ERROR(EFSCORRUPTED); goto done; } - level = be16_to_cpu(par_node->hdr.level); + level = par_hdr.level; + btree = xfs_da3_node_tree_p(par_node); for (entno = 0; - entno < be16_to_cpu(par_node->hdr.count) && - be32_to_cpu(par_node->btree[entno].hashval) < dead_hash; + entno < par_hdr.count && + be32_to_cpu(btree[entno].hashval) < dead_hash; entno++) continue; - if (unlikely(entno == be16_to_cpu(par_node->hdr.count))) { + if (entno == par_hdr.count) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(5)", XFS_ERRLEVEL_LOW, mp); error = XFS_ERROR(EFSCORRUPTED); goto done; } - par_blkno = be32_to_cpu(par_node->btree[entno].before); + par_blkno = be32_to_cpu(btree[entno].before); if (level == dead_level + 1) break; xfs_trans_brelse(tp, par_buf); @@ -1948,13 +2274,13 @@ xfs_da_swap_lastblock( */ for (;;) { for (; - entno < be16_to_cpu(par_node->hdr.count) && - be32_to_cpu(par_node->btree[entno].before) != last_blkno; + entno < par_hdr.count && + be32_to_cpu(btree[entno].before) != last_blkno; entno++) continue; - if (entno < be16_to_cpu(par_node->hdr.count)) + if (entno < par_hdr.count) break; - par_blkno = be32_to_cpu(par_node->hdr.info.forw); + par_blkno = par_hdr.forw; xfs_trans_brelse(tp, par_buf); par_buf = NULL; if (unlikely(par_blkno == 0)) { @@ -1963,27 +2289,27 @@ xfs_da_swap_lastblock( error = XFS_ERROR(EFSCORRUPTED); goto done; } - error = xfs_da_node_read(tp, ip, par_blkno, -1, &par_buf, w); + error = xfs_da3_node_read(tp, ip, par_blkno, -1, &par_buf, w); if (error) goto done; par_node = par_buf->b_addr; - if (unlikely( - be16_to_cpu(par_node->hdr.level) != level || - par_node->hdr.info.magic != cpu_to_be16(XFS_DA_NODE_MAGIC))) { + xfs_da3_node_hdr_from_disk(&par_hdr, par_node); + if (par_hdr.level != level) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(7)", XFS_ERRLEVEL_LOW, mp); error = XFS_ERROR(EFSCORRUPTED); goto done; } + btree = xfs_da3_node_tree_p(par_node); entno = 0; } /* * Update the parent entry pointing to the moved block. */ - par_node->btree[entno].before = cpu_to_be32(dead_blkno); + btree[entno].before = cpu_to_be32(dead_blkno); xfs_trans_log_buf(tp, par_buf, - XFS_DA_LOGRANGE(par_node, &par_node->btree[entno].before, - sizeof(par_node->btree[entno].before))); + XFS_DA_LOGRANGE(par_node, &btree[entno].before, + sizeof(btree[entno].before))); *dead_blknop = last_blkno; *dead_bufp = last_buf; return 0; @@ -2025,14 +2351,15 @@ xfs_da_shrink_inode( * Remove extents. If we get ENOSPC for a dir we have to move * the last block to the place we want to kill. */ - if ((error = xfs_bunmapi(tp, dp, dead_blkno, count, - xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, - 0, args->firstblock, args->flist, - &done)) == ENOSPC) { + error = xfs_bunmapi(tp, dp, dead_blkno, count, + xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, + 0, args->firstblock, args->flist, &done); + if (error == ENOSPC) { if (w != XFS_DATA_FORK) break; - if ((error = xfs_da_swap_lastblock(args, &dead_blkno, - &dead_buf))) + error = xfs_da3_swap_lastblock(args, &dead_blkno, + &dead_buf); + if (error) break; } else { break; @@ -2297,6 +2624,7 @@ xfs_da_read_buf( magic1 = be32_to_cpu(hdr->magic); if (unlikely( XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && + (magic != XFS_DA3_NODE_MAGIC) && (magic != XFS_ATTR_LEAF_MAGIC) && (magic != XFS_DIR2_LEAF1_MAGIC) && (magic != XFS_DIR3_LEAF1_MAGIC) && @@ -2367,41 +2695,3 @@ out_free: return -1; return mappedbno; } - -kmem_zone_t *xfs_da_state_zone; /* anchor for state struct zone */ - -/* - * Allocate a dir-state structure. - * We don't put them on the stack since they're large. - */ -xfs_da_state_t * -xfs_da_state_alloc(void) -{ - return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS); -} - -/* - * Kill the altpath contents of a da-state structure. - */ -STATIC void -xfs_da_state_kill_altpath(xfs_da_state_t *state) -{ - int i; - - for (i = 0; i < state->altpath.active; i++) - state->altpath.blk[i].bp = NULL; - state->altpath.active = 0; -} - -/* - * Free a da-state structure. - */ -void -xfs_da_state_free(xfs_da_state_t *state) -{ - xfs_da_state_kill_altpath(state); -#ifdef DEBUG - memset((char *)state, 0, sizeof(*state)); -#endif /* DEBUG */ - kmem_zone_free(xfs_da_state_zone, state); -} diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 0854b95..6bedb3c 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2000,2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -20,7 +21,6 @@ struct xfs_bmap_free; struct xfs_inode; -struct xfs_mount; struct xfs_trans; struct zone; @@ -50,8 +50,11 @@ typedef struct xfs_da_blkinfo { * CRC enabled directory structure types * * The headers change size for the additional verification information, but - * otherwise the tree layouts and contents are unchanged. + * otherwise the tree layouts and contents are unchanged. Hence the da btree + * code can use the struct xfs_da_blkinfo for manipulating the tree links and + * magic numbers without modification for both v2 and v3 nodes. */ +#define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */ #define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */ #define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ @@ -80,19 +83,76 @@ struct xfs_da3_blkinfo { */ #define XFS_DA_NODE_MAXDEPTH 5 /* max depth of Btree */ +typedef struct xfs_da_node_hdr { + struct xfs_da_blkinfo info; /* block type, links, etc. */ + __be16 count; /* count of active entries */ + __be16 __level; /* level above leaves (leaf == 0) */ +} xfs_da_node_hdr_t; + +struct xfs_da3_node_hdr { + struct xfs_da3_blkinfo info; /* block type, links, etc. */ + __be16 count; /* count of active entries */ + __be16 __level; /* level above leaves (leaf == 0) */ + __be32 __pad32; +}; + +#define XFS_DA3_NODE_CRC_OFF (offsetof(struct xfs_da3_node_hdr, info.crc)) + +typedef struct xfs_da_node_entry { + __be32 hashval; /* hash value for this descendant */ + __be32 before; /* Btree block before this key */ +} xfs_da_node_entry_t; + typedef struct xfs_da_intnode { - struct xfs_da_node_hdr { /* constant-structure header block */ - xfs_da_blkinfo_t info; /* block type, links, etc. */ - __be16 count; /* count of active entries */ - __be16 level; /* level above leaves (leaf == 0) */ - } hdr; - struct xfs_da_node_entry { - __be32 hashval; /* hash value for this descendant */ - __be32 before; /* Btree block before this key */ - } btree[1]; /* variable sized array of keys */ + struct xfs_da_node_hdr hdr; + struct xfs_da_node_entry __btree[]; } xfs_da_intnode_t; -typedef struct xfs_da_node_hdr xfs_da_node_hdr_t; -typedef struct xfs_da_node_entry xfs_da_node_entry_t; + +struct xfs_da3_intnode { + struct xfs_da3_node_hdr hdr; + struct xfs_da_node_entry __btree[]; +}; + +/* + * In-core version of the node header to abstract the differences in the v2 and + * v3 disk format of the headers. Callers need to convert to/from disk format as + * appropriate. + */ +struct xfs_da3_icnode_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t level; +}; + +extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); +extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); + +static inline int +xfs_da3_node_hdr_size(struct xfs_da_intnode *dap) +{ + if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) + return sizeof(struct xfs_da3_node_hdr); + return sizeof(struct xfs_da_node_hdr); +} + +static inline struct xfs_da_node_entry * +xfs_da3_node_tree_p(struct xfs_da_intnode *dap) +{ + if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { + struct xfs_da3_intnode *dap3 = (struct xfs_da3_intnode *)dap; + return dap3->__btree; + } + return dap->__btree; +} + +extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); +extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); #define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize @@ -214,29 +274,29 @@ struct xfs_nameops { /* * Routines used for growing the Btree. */ -int xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level, - struct xfs_buf **bpp, int whichfork); -int xfs_da_split(xfs_da_state_t *state); +int xfs_da3_node_create(struct xfs_da_args *args, xfs_dablk_t blkno, + int level, struct xfs_buf **bpp, int whichfork); +int xfs_da3_split(xfs_da_state_t *state); /* * Routines used for shrinking the Btree. */ -int xfs_da_join(xfs_da_state_t *state); -void xfs_da_fixhashpath(xfs_da_state_t *state, - xfs_da_state_path_t *path_to_to_fix); +int xfs_da3_join(xfs_da_state_t *state); +void xfs_da3_fixhashpath(struct xfs_da_state *state, + struct xfs_da_state_path *path_to_to_fix); /* * Routines used for finding things in the Btree. */ -int xfs_da_node_lookup_int(xfs_da_state_t *state, int *result); -int xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, +int xfs_da3_node_lookup_int(xfs_da_state_t *state, int *result); +int xfs_da3_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, int forward, int release, int *result); /* * Utility routines. */ -int xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, +int xfs_da3_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, xfs_da_state_blk_t *new_blk); -int xfs_da_node_read(struct xfs_trans *tp, struct xfs_inode *dp, +int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp, int which_fork); diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 1a4888f..d1b8e98 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1371,7 +1371,7 @@ xfs_dir2_leafn_split( * block into the leaves. */ xfs_dir2_leafn_rebalance(state, oldblk, newblk); - error = xfs_da_blk_link(state, oldblk, newblk); + error = xfs_da3_blk_link(state, oldblk, newblk); if (error) { return error; } @@ -1452,7 +1452,7 @@ xfs_dir2_leafn_toosmall( */ forward = (leafhdr.forw != 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); - error = xfs_da_path_shift(state, &state->altpath, forward, 0, + error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &rval); if (error) return error; @@ -1514,10 +1514,10 @@ xfs_dir2_leafn_toosmall( */ memcpy(&state->altpath, &state->path, sizeof(state->path)); if (blkno < blk->blkno) - error = xfs_da_path_shift(state, &state->altpath, forward, 0, + error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &rval); else - error = xfs_da_path_shift(state, &state->path, forward, 0, + error = xfs_da3_path_shift(state, &state->path, forward, 0, &rval); if (error) { return error; @@ -1614,7 +1614,7 @@ xfs_dir2_node_addname( * Look up the name. We're not supposed to find it, but * this gives us the insertion point. */ - error = xfs_da_node_lookup_int(state, &rval); + error = xfs_da3_node_lookup_int(state, &rval); if (error) rval = error; if (rval != ENOENT) { @@ -1640,7 +1640,7 @@ xfs_dir2_node_addname( * It worked, fix the hash values up the btree. */ if (!(args->op_flags & XFS_DA_OP_JUSTCHECK)) - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); } else { /* * It didn't work, we need to split the leaf block. @@ -1652,7 +1652,7 @@ xfs_dir2_node_addname( /* * Split the leaf block and insert the new entry. */ - rval = xfs_da_split(state); + rval = xfs_da3_split(state); } done: xfs_da_state_free(state); @@ -2030,7 +2030,7 @@ xfs_dir2_node_addname_int( /* * Lookup an entry in a node-format directory. - * All the real work happens in xfs_da_node_lookup_int. + * All the real work happens in xfs_da3_node_lookup_int. * The only real output is the inode number of the entry. */ int /* error */ @@ -2055,7 +2055,7 @@ xfs_dir2_node_lookup( /* * Fill in the path to the entry in the cursor. */ - error = xfs_da_node_lookup_int(state, &rval); + error = xfs_da3_node_lookup_int(state, &rval); if (error) rval = error; else if (rval == ENOENT && args->cmpresult == XFS_CMP_CASE) { @@ -2110,7 +2110,7 @@ xfs_dir2_node_removename( /* * Look up the entry we're deleting, set up the cursor. */ - error = xfs_da_node_lookup_int(state, &rval); + error = xfs_da3_node_lookup_int(state, &rval); if (error) rval = error; /* @@ -2134,12 +2134,12 @@ xfs_dir2_node_removename( /* * Fix the hash values up the btree. */ - xfs_da_fixhashpath(state, &state->path); + xfs_da3_fixhashpath(state, &state->path); /* * If we need to join leaf blocks, do it. */ if (rval && state->path.active > 1) - error = xfs_da_join(state); + error = xfs_da3_join(state); /* * If no errors so far, try conversion to leaf format. */ @@ -2181,7 +2181,7 @@ xfs_dir2_node_replace( /* * Lookup the entry to change in the btree. */ - error = xfs_da_node_lookup_int(state, &rval); + error = xfs_da3_node_lookup_int(state, &rval); if (error) { rval = error; } diff --git a/fs/xfs/xfs_trace.c b/fs/xfs/xfs_trace.c index 624bedd..b6e3897 100644 --- a/fs/xfs/xfs_trace.c +++ b/fs/xfs/xfs_trace.c @@ -22,7 +22,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" @@ -30,6 +29,7 @@ #include "xfs_inode.h" #include "xfs_btree.h" #include "xfs_mount.h" +#include "xfs_da_btree.h" #include "xfs_ialloc.h" #include "xfs_itable.h" #include "xfs_alloc.h" From david@fromorbit.com Wed Apr 24 03:59:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DBDF729DFA for ; Wed, 24 Apr 2013 03:59:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C76958F8050 for ; Wed, 24 Apr 2013 01:59:11 -0700 (PDT) X-ASG-Debug-ID: 1366793941-04cb6c2c1d567680001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id jVn9W4gXWHRDghrj for ; Wed, 24 Apr 2013 01:59: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: Aq0RAIGdd1F5LKjR/2dsb2JhbABGCoMGNrkyhRkEAX4XdIIfAQEFGgECChMcMwgYDAwZDwUlAzSIE717FY1XEA+BJAqDPwOMHYcug06BJIVfihuDICqBLgEfBA Received: from ppp121-44-168-209.lns20.syd7.internode.on.net (HELO dastard) ([121.44.168.209]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2013 18:28:56 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UUvXT-0007No-77 for xfs@oss.sgi.com; Wed, 24 Apr 2013 18:58:55 +1000 Date: Wed, 24 Apr 2013 18:58:55 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH V2 16/22] xfs: add CRCs to attr leaf blocks Message-ID: <20130424085855.GS10481@dastard> X-ASG-Orig-Subj: [PATCH V2 16/22] xfs: add CRCs to attr leaf blocks References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-17-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-17-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: 1366793941 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129013 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- Version 2: - fix bugs formatting and other issues found by Ben during review. fs/xfs/xfs_attr.c | 125 ++-- fs/xfs/xfs_attr_leaf.c | 1740 +++++++++++++++++++++++++++--------------------- fs/xfs/xfs_attr_leaf.h | 122 +++- fs/xfs/xfs_da_btree.c | 34 +- fs/xfs/xfs_da_btree.h | 5 +- 5 files changed, 1177 insertions(+), 849 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 7afef28..e706875 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -819,7 +819,7 @@ xfs_attr_inactive(xfs_inode_t *dp) error = 0; goto out; } - error = xfs_attr_root_inactive(&trans, dp); + error = xfs_attr3_root_inactive(&trans, dp); if (error) goto out; @@ -905,7 +905,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) */ dp = args->dp; args->blkno = 0; - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return error; @@ -913,14 +913,14 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Look up the given attribute in the leaf block. Figure out if * the given flags produce an error or call for an atomic rename. */ - retval = xfs_attr_leaf_lookup_int(bp, args); + retval = xfs_attr3_leaf_lookup_int(bp, args); if ((args->flags & ATTR_REPLACE) && (retval == ENOATTR)) { xfs_trans_brelse(args->trans, bp); - return(retval); + return retval; } else if (retval == EEXIST) { if (args->flags & ATTR_CREATE) { /* pure create op */ xfs_trans_brelse(args->trans, bp); - return(retval); + return retval; } trace_xfs_attr_leaf_replace(args); @@ -936,7 +936,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Add the attribute to the leaf block, transitioning to a Btree * if required. */ - retval = xfs_attr_leaf_add(bp, args); + retval = xfs_attr3_leaf_add(bp, args); if (retval == ENOSPC) { /* * Promote the attribute list to the Btree format, then @@ -944,7 +944,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * can manage its own transactions. */ xfs_bmap_init(args->flist, args->firstblock); - error = xfs_attr_leaf_to_node(args); + error = xfs_attr3_leaf_to_node(args); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, &committed); @@ -1009,7 +1009,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * In a separate transaction, set the incomplete flag on the * "old" attr and clear the incomplete flag on the "new" attr. */ - error = xfs_attr_leaf_flipflags(args); + error = xfs_attr3_leaf_flipflags(args); if (error) return(error); @@ -1031,19 +1031,19 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Read in the block containing the "old" attr, then * remove the "old" attr from that block (neat, huh!) */ - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return error; - xfs_attr_leaf_remove(bp, args); + xfs_attr3_leaf_remove(bp, args); /* * If the result is small enough, shrink it all into the inode. */ if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { xfs_bmap_init(args->flist, args->firstblock); - error = xfs_attr_leaf_to_shortform(bp, args, forkoff); + error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { error = xfs_bmap_finish(&args->trans, @@ -1075,9 +1075,9 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) /* * Added a "remote" value, just clear the incomplete flag. */ - error = xfs_attr_leaf_clearflag(args); + error = xfs_attr3_leaf_clearflag(args); } - return(error); + return error; } /* @@ -1100,24 +1100,24 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) */ dp = args->dp; args->blkno = 0; - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return error; - error = xfs_attr_leaf_lookup_int(bp, args); + error = xfs_attr3_leaf_lookup_int(bp, args); if (error == ENOATTR) { xfs_trans_brelse(args->trans, bp); - return(error); + return error; } - xfs_attr_leaf_remove(bp, args); + xfs_attr3_leaf_remove(bp, args); /* * If the result is small enough, shrink it all into the inode. */ if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { xfs_bmap_init(args->flist, args->firstblock); - error = xfs_attr_leaf_to_shortform(bp, args, forkoff); + error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1127,7 +1127,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) ASSERT(committed); args->trans = NULL; xfs_bmap_cancel(args->flist); - return(error); + return error; } /* @@ -1137,7 +1137,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) if (committed) xfs_trans_ijoin(args->trans, dp, 0); } - return(0); + return 0; } /* @@ -1155,21 +1155,21 @@ xfs_attr_leaf_get(xfs_da_args_t *args) trace_xfs_attr_leaf_get(args); args->blkno = 0; - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return error; - error = xfs_attr_leaf_lookup_int(bp, args); + error = xfs_attr3_leaf_lookup_int(bp, args); if (error != EEXIST) { xfs_trans_brelse(args->trans, bp); - return(error); + return error; } - error = xfs_attr_leaf_getvalue(bp, args); + error = xfs_attr3_leaf_getvalue(bp, args); xfs_trans_brelse(args->trans, bp); if (!error && (args->rmtblkno > 0) && !(args->flags & ATTR_KERNOVAL)) { error = xfs_attr_rmtval_get(args); } - return(error); + return error; } /* @@ -1184,11 +1184,11 @@ xfs_attr_leaf_list(xfs_attr_list_context_t *context) trace_xfs_attr_leaf_list(context); context->cursor->blkno = 0; - error = xfs_attr_leaf_read(NULL, context->dp, 0, -1, &bp); + error = xfs_attr3_leaf_read(NULL, context->dp, 0, -1, &bp); if (error) return XFS_ERROR(error); - error = xfs_attr_leaf_list_int(bp, context); + error = xfs_attr3_leaf_list_int(bp, context); xfs_trans_brelse(NULL, bp); return XFS_ERROR(error); } @@ -1257,7 +1257,7 @@ restart: args->rmtblkcnt = 0; } - retval = xfs_attr_leaf_add(blk->bp, state->args); + retval = xfs_attr3_leaf_add(blk->bp, state->args); if (retval == ENOSPC) { if (state->path.active == 1) { /* @@ -1267,7 +1267,7 @@ restart: */ xfs_da_state_free(state); xfs_bmap_init(args->flist, args->firstblock); - error = xfs_attr_leaf_to_node(args); + error = xfs_attr3_leaf_to_node(args); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1369,7 +1369,7 @@ restart: * In a separate transaction, set the incomplete flag on the * "old" attr and clear the incomplete flag on the "new" attr. */ - error = xfs_attr_leaf_flipflags(args); + error = xfs_attr3_leaf_flipflags(args); if (error) goto out; @@ -1408,7 +1408,7 @@ restart: */ blk = &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); - error = xfs_attr_leaf_remove(blk->bp, args); + error = xfs_attr3_leaf_remove(blk->bp, args); xfs_da3_fixhashpath(state, &state->path); /* @@ -1449,7 +1449,7 @@ restart: /* * Added a "remote" value, just clear the incomplete flag. */ - error = xfs_attr_leaf_clearflag(args); + error = xfs_attr3_leaf_clearflag(args); if (error) goto out; } @@ -1523,7 +1523,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) * Mark the attribute as INCOMPLETE, then bunmapi() the * remote value. */ - error = xfs_attr_leaf_setflag(args); + error = xfs_attr3_leaf_setflag(args); if (error) goto out; error = xfs_attr_rmtval_remove(args); @@ -1544,7 +1544,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) */ blk = &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); - retval = xfs_attr_leaf_remove(blk->bp, args); + retval = xfs_attr3_leaf_remove(blk->bp, args); xfs_da3_fixhashpath(state, &state->path); /* @@ -1590,13 +1590,13 @@ xfs_attr_node_removename(xfs_da_args_t *args) ASSERT(state->path.blk[0].bp); state->path.blk[0].bp = NULL; - error = xfs_attr_leaf_read(args->trans, args->dp, 0, -1, &bp); + error = xfs_attr3_leaf_read(args->trans, args->dp, 0, -1, &bp); if (error) goto out; if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { xfs_bmap_init(args->flist, args->firstblock); - error = xfs_attr_leaf_to_shortform(bp, args, forkoff); + error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { error = xfs_bmap_finish(&args->trans, @@ -1768,7 +1768,7 @@ xfs_attr_node_get(xfs_da_args_t *args) /* * Get the value, local or "remote" */ - retval = xfs_attr_leaf_getvalue(blk->bp, args); + retval = xfs_attr3_leaf_getvalue(blk->bp, args); if (!retval && (args->rmtblkno > 0) && !(args->flags & ATTR_KERNOVAL)) { retval = xfs_attr_rmtval_get(args); @@ -1793,7 +1793,9 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) attrlist_cursor_kern_t *cursor; xfs_attr_leafblock_t *leaf; xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; + struct xfs_attr3_icleaf_hdr leafhdr; + struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da_node_entry *btree; int error, i; struct xfs_buf *bp; @@ -1814,22 +1816,28 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) if ((error != 0) && (error != EFSCORRUPTED)) return(error); if (bp) { + struct xfs_attr_leaf_entry *entries; + node = bp->b_addr; switch (be16_to_cpu(node->hdr.info.magic)) { case XFS_DA_NODE_MAGIC: + case XFS_DA3_NODE_MAGIC: trace_xfs_attr_list_wrong_blk(context); xfs_trans_brelse(NULL, bp); bp = NULL; break; case XFS_ATTR_LEAF_MAGIC: + case XFS_ATTR3_LEAF_MAGIC: leaf = bp->b_addr; - if (cursor->hashval > be32_to_cpu(leaf->entries[ - be16_to_cpu(leaf->hdr.count)-1].hashval)) { + xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); + entries = xfs_attr3_leaf_entryp(leaf); + if (cursor->hashval > be32_to_cpu( + entries[leafhdr.count - 1].hashval)) { trace_xfs_attr_list_wrong_blk(context); xfs_trans_brelse(NULL, bp); bp = NULL; - } else if (cursor->hashval <= - be32_to_cpu(leaf->entries[0].hashval)) { + } else if (cursor->hashval <= be32_to_cpu( + entries[0].hashval)) { trace_xfs_attr_list_wrong_blk(context); xfs_trans_brelse(NULL, bp); bp = NULL; @@ -1851,27 +1859,31 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) if (bp == NULL) { cursor->blkno = 0; for (;;) { + __uint16_t magic; + error = xfs_da3_node_read(NULL, context->dp, cursor->blkno, -1, &bp, XFS_ATTR_FORK); if (error) return(error); node = bp->b_addr; - if (node->hdr.info.magic == - cpu_to_be16(XFS_ATTR_LEAF_MAGIC)) + magic = be16_to_cpu(node->hdr.info.magic); + if (magic == XFS_ATTR_LEAF_MAGIC || + magic == XFS_ATTR3_LEAF_MAGIC) break; - if (unlikely(node->hdr.info.magic != - cpu_to_be16(XFS_DA_NODE_MAGIC))) { + if (magic != XFS_DA_NODE_MAGIC && + magic != XFS_DA3_NODE_MAGIC) { XFS_CORRUPTION_ERROR("xfs_attr_node_list(3)", XFS_ERRLEVEL_LOW, context->dp->i_mount, node); xfs_trans_brelse(NULL, bp); - return(XFS_ERROR(EFSCORRUPTED)); + return XFS_ERROR(EFSCORRUPTED); } + + xfs_da3_node_hdr_from_disk(&nodehdr, node); btree = xfs_da3_node_tree_p(node); - for (i = 0; i < be16_to_cpu(node->hdr.count); - btree++, i++) { + for (i = 0; i < nodehdr.count; btree++, i++) { if (cursor->hashval <= be32_to_cpu(btree->hashval)) { cursor->blkno = be32_to_cpu(btree->before); @@ -1880,9 +1892,9 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) break; } } - if (i == be16_to_cpu(node->hdr.count)) { + if (i == nodehdr.count) { xfs_trans_brelse(NULL, bp); - return(0); + return 0; } xfs_trans_brelse(NULL, bp); } @@ -1896,22 +1908,23 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) */ for (;;) { leaf = bp->b_addr; - error = xfs_attr_leaf_list_int(bp, context); + error = xfs_attr3_leaf_list_int(bp, context); if (error) { xfs_trans_brelse(NULL, bp); return error; } - if (context->seen_enough || leaf->hdr.info.forw == 0) + xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); + if (context->seen_enough || leafhdr.forw == 0) break; - cursor->blkno = be32_to_cpu(leaf->hdr.info.forw); + cursor->blkno = leafhdr.forw; xfs_trans_brelse(NULL, bp); - error = xfs_attr_leaf_read(NULL, context->dp, cursor->blkno, -1, + error = xfs_attr3_leaf_read(NULL, context->dp, cursor->blkno, -1, &bp); if (error) return error; } xfs_trans_brelse(NULL, bp); - return(0); + return 0; } diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 54b0dc8..7f8b6c8 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -39,6 +40,9 @@ #include "xfs_attr_leaf.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_buf_item.h" +#include "xfs_cksum.h" + /* * xfs_attr_leaf.c @@ -53,77 +57,213 @@ /* * Routines used for growing the Btree. */ -STATIC int xfs_attr_leaf_create(xfs_da_args_t *args, xfs_dablk_t which_block, - struct xfs_buf **bpp); -STATIC int xfs_attr_leaf_add_work(struct xfs_buf *leaf_buffer, - xfs_da_args_t *args, int freemap_index); -STATIC void xfs_attr_leaf_compact(struct xfs_da_args *args, - struct xfs_buf *leaf_buffer); -STATIC void xfs_attr_leaf_rebalance(xfs_da_state_t *state, +STATIC int xfs_attr3_leaf_create(struct xfs_da_args *args, + xfs_dablk_t which_block, struct xfs_buf **bpp); +STATIC int xfs_attr3_leaf_add_work(struct xfs_buf *leaf_buffer, + struct xfs_attr3_icleaf_hdr *ichdr, + struct xfs_da_args *args, int freemap_index); +STATIC void xfs_attr3_leaf_compact(struct xfs_da_args *args, + struct xfs_attr3_icleaf_hdr *ichdr, + struct xfs_buf *leaf_buffer); +STATIC void xfs_attr3_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, xfs_da_state_blk_t *blk2); -STATIC int xfs_attr_leaf_figure_balance(xfs_da_state_t *state, - xfs_da_state_blk_t *leaf_blk_1, - xfs_da_state_blk_t *leaf_blk_2, - int *number_entries_in_blk1, - int *number_usedbytes_in_blk1); +STATIC int xfs_attr3_leaf_figure_balance(xfs_da_state_t *state, + xfs_da_state_blk_t *leaf_blk_1, + struct xfs_attr3_icleaf_hdr *ichdr1, + xfs_da_state_blk_t *leaf_blk_2, + struct xfs_attr3_icleaf_hdr *ichdr2, + int *number_entries_in_blk1, + int *number_usedbytes_in_blk1); /* * Routines used for shrinking the Btree. */ -STATIC int xfs_attr_node_inactive(xfs_trans_t **trans, xfs_inode_t *dp, +STATIC int xfs_attr3_node_inactive(xfs_trans_t **trans, xfs_inode_t *dp, struct xfs_buf *bp, int level); -STATIC int xfs_attr_leaf_inactive(xfs_trans_t **trans, xfs_inode_t *dp, +STATIC int xfs_attr3_leaf_inactive(xfs_trans_t **trans, xfs_inode_t *dp, struct xfs_buf *bp); -STATIC int xfs_attr_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp, +STATIC int xfs_attr3_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp, xfs_dablk_t blkno, int blkcnt); /* * Utility routines. */ -STATIC void xfs_attr_leaf_moveents(xfs_attr_leafblock_t *src_leaf, - int src_start, - xfs_attr_leafblock_t *dst_leaf, - int dst_start, int move_count, - xfs_mount_t *mp); +STATIC void xfs_attr3_leaf_moveents(struct xfs_attr_leafblock *src_leaf, + struct xfs_attr3_icleaf_hdr *src_ichdr, int src_start, + struct xfs_attr_leafblock *dst_leaf, + struct xfs_attr3_icleaf_hdr *dst_ichdr, int dst_start, + int move_count, struct xfs_mount *mp); STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); -static void -xfs_attr_leaf_verify( +void +xfs_attr3_leaf_hdr_from_disk( + struct xfs_attr3_icleaf_hdr *to, + struct xfs_attr_leafblock *from) +{ + int i; + + ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) || + from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)); + + if (from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) { + struct xfs_attr3_leaf_hdr *hdr3 = (struct xfs_attr3_leaf_hdr *)from; + + to->forw = be32_to_cpu(hdr3->info.hdr.forw); + to->back = be32_to_cpu(hdr3->info.hdr.back); + to->magic = be16_to_cpu(hdr3->info.hdr.magic); + to->count = be16_to_cpu(hdr3->count); + to->usedbytes = be16_to_cpu(hdr3->usedbytes); + to->firstused = be16_to_cpu(hdr3->firstused); + to->holes = hdr3->holes; + + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + to->freemap[i].base = be16_to_cpu(hdr3->freemap[i].base); + to->freemap[i].size = be16_to_cpu(hdr3->freemap[i].size); + } + return; + } + to->forw = be32_to_cpu(from->hdr.info.forw); + to->back = be32_to_cpu(from->hdr.info.back); + to->magic = be16_to_cpu(from->hdr.info.magic); + to->count = be16_to_cpu(from->hdr.count); + to->usedbytes = be16_to_cpu(from->hdr.usedbytes); + to->firstused = be16_to_cpu(from->hdr.firstused); + to->holes = from->hdr.holes; + + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + to->freemap[i].base = be16_to_cpu(from->hdr.freemap[i].base); + to->freemap[i].size = be16_to_cpu(from->hdr.freemap[i].size); + } +} + +void +xfs_attr3_leaf_hdr_to_disk( + struct xfs_attr_leafblock *to, + struct xfs_attr3_icleaf_hdr *from) +{ + int i; + + ASSERT(from->magic == XFS_ATTR_LEAF_MAGIC || + from->magic == XFS_ATTR3_LEAF_MAGIC); + + if (from->magic == XFS_ATTR3_LEAF_MAGIC) { + struct xfs_attr3_leaf_hdr *hdr3 = (struct xfs_attr3_leaf_hdr *)to; + + hdr3->info.hdr.forw = cpu_to_be32(from->forw); + hdr3->info.hdr.back = cpu_to_be32(from->back); + hdr3->info.hdr.magic = cpu_to_be16(from->magic); + hdr3->count = cpu_to_be16(from->count); + hdr3->usedbytes = cpu_to_be16(from->usedbytes); + hdr3->firstused = cpu_to_be16(from->firstused); + hdr3->holes = from->holes; + hdr3->pad1 = 0; + + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + hdr3->freemap[i].base = cpu_to_be16(from->freemap[i].base); + hdr3->freemap[i].size = cpu_to_be16(from->freemap[i].size); + } + return; + } + to->hdr.info.forw = cpu_to_be32(from->forw); + to->hdr.info.back = cpu_to_be32(from->back); + to->hdr.info.magic = cpu_to_be16(from->magic); + to->hdr.count = cpu_to_be16(from->count); + to->hdr.usedbytes = cpu_to_be16(from->usedbytes); + to->hdr.firstused = cpu_to_be16(from->firstused); + to->hdr.holes = from->holes; + to->hdr.pad1 = 0; + + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + to->hdr.freemap[i].base = cpu_to_be16(from->freemap[i].base); + to->hdr.freemap[i].size = cpu_to_be16(from->freemap[i].size); + } +} + +static bool +xfs_attr3_leaf_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_attr_leaf_hdr *hdr = bp->b_addr; - int block_ok = 0; + struct xfs_attr_leafblock *leaf = bp->b_addr; + struct xfs_attr3_icleaf_hdr ichdr; - block_ok = hdr->info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC); - if (!block_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_node_hdr *hdr3 = bp->b_addr; + + if (ichdr.magic != XFS_ATTR3_LEAF_MAGIC) + return false; + + if (!uuid_equal(&hdr3->info.uuid, &mp->m_sb.sb_uuid)) + return false; + if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn) + return false; + } else { + if (ichdr.magic != XFS_ATTR_LEAF_MAGIC) + return false; } + if (ichdr.count == 0) + return false; + + /* XXX: need to range check rest of attr header values */ + /* XXX: hash order check? */ + + return true; } static void -xfs_attr_leaf_read_verify( +xfs_attr3_leaf_write_verify( struct xfs_buf *bp) { - xfs_attr_leaf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + struct xfs_attr3_leaf_hdr *hdr3 = bp->b_addr; + + if (!xfs_attr3_leaf_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_ATTR3_LEAF_CRC_OFF); } +/* + * leaf/node format detection on trees is sketchy, so a node read can be done on + * leaf level blocks when detection identifies the tree as a node format tree + * incorrectly. In this case, we need to swap the verifier to match the correct + * format of the block being read. + */ static void -xfs_attr_leaf_write_verify( - struct xfs_buf *bp) +xfs_attr3_leaf_read_verify( + struct xfs_buf *bp) { - xfs_attr_leaf_verify(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if ((xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + XFS_ATTR3_LEAF_CRC_OFF)) || + !xfs_attr3_leaf_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } } -const struct xfs_buf_ops xfs_attr_leaf_buf_ops = { - .verify_read = xfs_attr_leaf_read_verify, - .verify_write = xfs_attr_leaf_write_verify, +const struct xfs_buf_ops xfs_attr3_leaf_buf_ops = { + .verify_read = xfs_attr3_leaf_read_verify, + .verify_write = xfs_attr3_leaf_write_verify, }; int -xfs_attr_leaf_read( +xfs_attr3_leaf_read( struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, @@ -131,7 +271,7 @@ xfs_attr_leaf_read( struct xfs_buf **bpp) { return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, - XFS_ATTR_FORK, &xfs_attr_leaf_buf_ops); + XFS_ATTR_FORK, &xfs_attr3_leaf_buf_ops); } /*======================================================================== @@ -559,7 +699,7 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) } ASSERT(blkno == 0); - error = xfs_attr_leaf_create(args, blkno, &bp); + error = xfs_attr3_leaf_create(args, blkno, &bp); if (error) { error = xfs_da_shrink_inode(args, 0, bp); bp = NULL; @@ -588,9 +728,9 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) nargs.hashval = xfs_da_hashname(sfe->nameval, sfe->namelen); nargs.flags = XFS_ATTR_NSP_ONDISK_TO_ARGS(sfe->flags); - error = xfs_attr_leaf_lookup_int(bp, &nargs); /* set a->index */ + error = xfs_attr3_leaf_lookup_int(bp, &nargs); /* set a->index */ ASSERT(error == ENOATTR); - error = xfs_attr_leaf_add(bp, &nargs); + error = xfs_attr3_leaf_add(bp, &nargs); ASSERT(error != ENOSPC); if (error) goto out; @@ -803,7 +943,7 @@ xfs_attr_shortform_allfit( continue; /* don't copy partial entries */ if (!(entry->flags & XFS_ATTR_LOCAL)) return(0); - name_loc = xfs_attr_leaf_name_local(leaf, i); + name_loc = xfs_attr3_leaf_name_local(leaf, i); if (name_loc->namelen >= XFS_ATTR_SF_ENTSIZE_MAX) return(0); if (be16_to_cpu(name_loc->valuelen) >= XFS_ATTR_SF_ENTSIZE_MAX) @@ -823,29 +963,34 @@ xfs_attr_shortform_allfit( * Convert a leaf attribute list to shortform attribute list */ int -xfs_attr_leaf_to_shortform( - struct xfs_buf *bp, - xfs_da_args_t *args, - int forkoff) +xfs_attr3_leaf_to_shortform( + struct xfs_buf *bp, + struct xfs_da_args *args, + int forkoff) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_local_t *name_loc; - xfs_da_args_t nargs; - xfs_inode_t *dp; - char *tmpbuffer; - int error, i; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_local *name_loc; + struct xfs_da_args nargs; + struct xfs_inode *dp = args->dp; + char *tmpbuffer; + int error; + int i; trace_xfs_attr_leaf_to_sf(args); - dp = args->dp; tmpbuffer = kmem_alloc(XFS_LBSIZE(dp->i_mount), KM_SLEEP); - ASSERT(tmpbuffer != NULL); + if (!tmpbuffer) + return ENOMEM; - ASSERT(bp != NULL); memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(dp->i_mount)); + leaf = (xfs_attr_leafblock_t *)tmpbuffer; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + entry = xfs_attr3_leaf_entryp(leaf); + + /* XXX (dgc): buffer is about to be marked stale - why zero it? */ memset(bp->b_addr, 0, XFS_LBSIZE(dp->i_mount)); /* @@ -875,14 +1020,14 @@ xfs_attr_leaf_to_shortform( nargs.whichfork = XFS_ATTR_FORK; nargs.trans = args->trans; nargs.op_flags = XFS_DA_OP_OKNOENT; - entry = &leaf->entries[0]; - for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { + + for (i = 0; i < ichdr.count; entry++, i++) { if (entry->flags & XFS_ATTR_INCOMPLETE) continue; /* don't copy partial entries */ if (!entry->nameidx) continue; ASSERT(entry->flags & XFS_ATTR_LOCAL); - name_loc = xfs_attr_leaf_name_local(leaf, i); + name_loc = xfs_attr3_leaf_name_local(leaf, i); nargs.name = name_loc->nameval; nargs.namelen = name_loc->namelen; nargs.value = &name_loc->nameval[nargs.namelen]; @@ -895,43 +1040,50 @@ xfs_attr_leaf_to_shortform( out: kmem_free(tmpbuffer); - return(error); + return error; } /* * Convert from using a single leaf to a root node and a leaf. */ int -xfs_attr_leaf_to_node(xfs_da_args_t *args) +xfs_attr3_leaf_to_node( + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_da_intnode_t *node; - xfs_inode_t *dp; - struct xfs_buf *bp1, *bp2; - xfs_dablk_t blkno; - int error; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr icleafhdr; + struct xfs_attr_leaf_entry *entries; struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr icnodehdr; + struct xfs_da_intnode *node; + struct xfs_inode *dp = args->dp; + struct xfs_mount *mp = dp->i_mount; + struct xfs_buf *bp1 = NULL; + struct xfs_buf *bp2 = NULL; + xfs_dablk_t blkno; + int error; trace_xfs_attr_leaf_to_node(args); - dp = args->dp; - bp1 = bp2 = NULL; error = xfs_da_grow_inode(args, &blkno); if (error) goto out; - error = xfs_attr_leaf_read(args->trans, args->dp, 0, -1, &bp1); + error = xfs_attr3_leaf_read(args->trans, dp, 0, -1, &bp1); if (error) goto out; - bp2 = NULL; - error = xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp2, - XFS_ATTR_FORK); + error = xfs_da_get_buf(args->trans, dp, blkno, -1, &bp2, XFS_ATTR_FORK); if (error) goto out; + + /* copy leaf to new buffer, update identifiers */ bp2->b_ops = bp1->b_ops; - memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(dp->i_mount)); - bp1 = NULL; - xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(dp->i_mount) - 1); + memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp)); + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_blkinfo *hdr3 = bp2->b_addr; + hdr3->blkno = cpu_to_be64(bp2->b_bn); + } + xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(mp) - 1); /* * Set up the new root node. @@ -940,17 +1092,22 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args) if (error) goto out; node = bp1->b_addr; + xfs_da3_node_hdr_from_disk(&icnodehdr, node); + btree = xfs_da3_node_tree_p(node); + leaf = bp2->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + xfs_attr3_leaf_hdr_from_disk(&icleafhdr, leaf); + entries = xfs_attr3_leaf_entryp(leaf); + /* both on-disk, don't endian-flip twice */ - btree = xfs_da3_node_tree_p(node); - btree[0].hashval = leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval; + btree[0].hashval = entries[icleafhdr.count - 1].hashval; btree[0].before = cpu_to_be32(blkno); - node->hdr.count = cpu_to_be16(1); - xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(dp->i_mount) - 1); + icnodehdr.count = 1; + xfs_da3_node_hdr_to_disk(node, &icnodehdr); + xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(mp) - 1); error = 0; out: - return(error); + return error; } @@ -963,52 +1120,62 @@ out: * or a leaf in a node attribute list. */ STATIC int -xfs_attr_leaf_create( - xfs_da_args_t *args, - xfs_dablk_t blkno, - struct xfs_buf **bpp) +xfs_attr3_leaf_create( + struct xfs_da_args *args, + xfs_dablk_t blkno, + struct xfs_buf **bpp) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_hdr_t *hdr; - xfs_inode_t *dp; - struct xfs_buf *bp; - int error; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_inode *dp = args->dp; + struct xfs_mount *mp = dp->i_mount; + struct xfs_buf *bp; + int error; trace_xfs_attr_leaf_create(args); - dp = args->dp; - ASSERT(dp != NULL); error = xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp, XFS_ATTR_FORK); if (error) - return(error); - bp->b_ops = &xfs_attr_leaf_buf_ops; + return error; + bp->b_ops = &xfs_attr3_leaf_buf_ops; leaf = bp->b_addr; - memset((char *)leaf, 0, XFS_LBSIZE(dp->i_mount)); - hdr = &leaf->hdr; - hdr->info.magic = cpu_to_be16(XFS_ATTR_LEAF_MAGIC); - hdr->firstused = cpu_to_be16(XFS_LBSIZE(dp->i_mount)); - if (!hdr->firstused) { - hdr->firstused = cpu_to_be16( - XFS_LBSIZE(dp->i_mount) - XFS_ATTR_LEAF_NAME_ALIGN); - } + memset(leaf, 0, XFS_LBSIZE(mp)); + + memset(&ichdr, 0, sizeof(ichdr)); + ichdr.firstused = XFS_LBSIZE(mp); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + struct xfs_da3_blkinfo *hdr3 = bp->b_addr; + + ichdr.magic = XFS_ATTR3_LEAF_MAGIC; + + hdr3->blkno = cpu_to_be64(bp->b_bn); + hdr3->owner = cpu_to_be64(dp->i_ino); + uuid_copy(&hdr3->uuid, &mp->m_sb.sb_uuid); - hdr->freemap[0].base = cpu_to_be16(sizeof(xfs_attr_leaf_hdr_t)); - hdr->freemap[0].size = cpu_to_be16(be16_to_cpu(hdr->firstused) - - sizeof(xfs_attr_leaf_hdr_t)); + ichdr.freemap[0].base = sizeof(struct xfs_attr3_leaf_hdr); + } else { + ichdr.magic = XFS_ATTR_LEAF_MAGIC; + ichdr.freemap[0].base = sizeof(struct xfs_attr_leaf_hdr); + } + ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base; - xfs_trans_log_buf(args->trans, bp, 0, XFS_LBSIZE(dp->i_mount) - 1); + xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); + xfs_trans_log_buf(args->trans, bp, 0, XFS_LBSIZE(mp) - 1); *bpp = bp; - return(0); + return 0; } /* * Split the leaf node, rebalance, then add the new entry. */ int -xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, - xfs_da_state_blk_t *newblk) +xfs_attr3_leaf_split( + struct xfs_da_state *state, + struct xfs_da_state_blk *oldblk, + struct xfs_da_state_blk *newblk) { xfs_dablk_t blkno; int error; @@ -1022,7 +1189,7 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, error = xfs_da_grow_inode(state->args, &blkno); if (error) return(error); - error = xfs_attr_leaf_create(state->args, blkno, &newblk->bp); + error = xfs_attr3_leaf_create(state->args, blkno, &newblk->bp); if (error) return(error); newblk->blkno = blkno; @@ -1032,7 +1199,7 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * Rebalance the entries across the two leaves. * NOTE: rebalance() currently depends on the 2nd block being empty. */ - xfs_attr_leaf_rebalance(state, oldblk, newblk); + xfs_attr3_leaf_rebalance(state, oldblk, newblk); error = xfs_da3_blk_link(state, oldblk, newblk); if (error) return(error); @@ -1046,10 +1213,10 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, */ if (state->inleaf) { trace_xfs_attr_leaf_add_old(state->args); - error = xfs_attr_leaf_add(oldblk->bp, state->args); + error = xfs_attr3_leaf_add(oldblk->bp, state->args); } else { trace_xfs_attr_leaf_add_new(state->args); - error = xfs_attr_leaf_add(newblk->bp, state->args); + error = xfs_attr3_leaf_add(newblk->bp, state->args); } /* @@ -1064,22 +1231,23 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, * Add a name to the leaf attribute list structure. */ int -xfs_attr_leaf_add( +xfs_attr3_leaf_add( struct xfs_buf *bp, struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_hdr_t *hdr; - xfs_attr_leaf_map_t *map; - int tablesize, entsize, sum, tmp, i; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + int tablesize; + int entsize; + int sum; + int tmp; + int i; trace_xfs_attr_leaf_add(args); leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT((args->index >= 0) - && (args->index <= be16_to_cpu(leaf->hdr.count))); - hdr = &leaf->hdr; + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + ASSERT(args->index >= 0 && args->index <= ichdr.count); entsize = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, args->trans->t_mountp->m_sb.sb_blocksize, NULL); @@ -1087,25 +1255,23 @@ xfs_attr_leaf_add( * Search through freemap for first-fit on new name length. * (may need to figure in size of entry struct too) */ - tablesize = (be16_to_cpu(hdr->count) + 1) - * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t); - map = &hdr->freemap[XFS_ATTR_LEAF_MAPSIZE-1]; - for (sum = 0, i = XFS_ATTR_LEAF_MAPSIZE-1; i >= 0; map--, i--) { - if (tablesize > be16_to_cpu(hdr->firstused)) { - sum += be16_to_cpu(map->size); + tablesize = (ichdr.count + 1) * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf); + for (sum = 0, i = XFS_ATTR_LEAF_MAPSIZE - 1; i >= 0; i--) { + if (tablesize > ichdr.firstused) { + sum += ichdr.freemap[i].size; continue; } - if (!map->size) + if (!ichdr.freemap[i].size) continue; /* no space in this map */ tmp = entsize; - if (be16_to_cpu(map->base) < be16_to_cpu(hdr->firstused)) + if (ichdr.freemap[i].base < ichdr.firstused) tmp += sizeof(xfs_attr_leaf_entry_t); - if (be16_to_cpu(map->size) >= tmp) { - tmp = xfs_attr_leaf_add_work(bp, args, i); - return(tmp); + if (ichdr.freemap[i].size >= tmp) { + tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, i); + goto out_log_hdr; } - sum += be16_to_cpu(map->size); + sum += ichdr.freemap[i].size; } /* @@ -1113,82 +1279,89 @@ xfs_attr_leaf_add( * and we don't have enough freespace, then compaction will do us * no good and we should just give up. */ - if (!hdr->holes && (sum < entsize)) - return(XFS_ERROR(ENOSPC)); + if (!ichdr.holes && sum < entsize) + return XFS_ERROR(ENOSPC); /* * Compact the entries to coalesce free space. * This may change the hdr->count via dropping INCOMPLETE entries. */ - xfs_attr_leaf_compact(args, bp); + xfs_attr3_leaf_compact(args, &ichdr, bp); /* * After compaction, the block is guaranteed to have only one * free region, in freemap[0]. If it is not big enough, give up. */ - if (be16_to_cpu(hdr->freemap[0].size) - < (entsize + sizeof(xfs_attr_leaf_entry_t))) - return(XFS_ERROR(ENOSPC)); + if (ichdr.freemap[0].size < (entsize + sizeof(xfs_attr_leaf_entry_t))) { + tmp = ENOSPC; + goto out_log_hdr; + } + + tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, 0); - return(xfs_attr_leaf_add_work(bp, args, 0)); +out_log_hdr: + xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); + xfs_trans_log_buf(args->trans, bp, + XFS_DA_LOGRANGE(leaf, &leaf->hdr, + xfs_attr3_leaf_hdr_size(leaf))); + return tmp; } /* * Add a name to a leaf attribute list structure. */ STATIC int -xfs_attr_leaf_add_work( - struct xfs_buf *bp, - xfs_da_args_t *args, - int mapindex) +xfs_attr3_leaf_add_work( + struct xfs_buf *bp, + struct xfs_attr3_icleaf_hdr *ichdr, + struct xfs_da_args *args, + int mapindex) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_hdr_t *hdr; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_local_t *name_loc; - xfs_attr_leaf_name_remote_t *name_rmt; - xfs_attr_leaf_map_t *map; - xfs_mount_t *mp; - int tmp, i; + struct xfs_attr_leafblock *leaf; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_local *name_loc; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_mount *mp; + int tmp; + int i; trace_xfs_attr_leaf_add_work(args); leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - hdr = &leaf->hdr; - ASSERT((mapindex >= 0) && (mapindex < XFS_ATTR_LEAF_MAPSIZE)); - ASSERT((args->index >= 0) && (args->index <= be16_to_cpu(hdr->count))); + ASSERT(mapindex >= 0 && mapindex < XFS_ATTR_LEAF_MAPSIZE); + ASSERT(args->index >= 0 && args->index <= ichdr->count); /* * Force open some space in the entry array and fill it in. */ - entry = &leaf->entries[args->index]; - if (args->index < be16_to_cpu(hdr->count)) { - tmp = be16_to_cpu(hdr->count) - args->index; + entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; + if (args->index < ichdr->count) { + tmp = ichdr->count - args->index; tmp *= sizeof(xfs_attr_leaf_entry_t); - memmove((char *)(entry+1), (char *)entry, tmp); + memmove(entry + 1, entry, tmp); xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry))); } - be16_add_cpu(&hdr->count, 1); + ichdr->count++; /* * Allocate space for the new string (at the end of the run). */ - map = &hdr->freemap[mapindex]; mp = args->trans->t_mountp; - ASSERT(be16_to_cpu(map->base) < XFS_LBSIZE(mp)); - ASSERT((be16_to_cpu(map->base) & 0x3) == 0); - ASSERT(be16_to_cpu(map->size) >= + ASSERT(ichdr->freemap[mapindex].base < XFS_LBSIZE(mp)); + ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); + ASSERT(ichdr->freemap[mapindex].size >= xfs_attr_leaf_newentsize(args->namelen, args->valuelen, mp->m_sb.sb_blocksize, NULL)); - ASSERT(be16_to_cpu(map->size) < XFS_LBSIZE(mp)); - ASSERT((be16_to_cpu(map->size) & 0x3) == 0); - be16_add_cpu(&map->size, - -xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, &tmp)); - entry->nameidx = cpu_to_be16(be16_to_cpu(map->base) + - be16_to_cpu(map->size)); + ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); + ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); + + ichdr->freemap[mapindex].size -= + xfs_attr_leaf_newentsize(args->namelen, args->valuelen, + mp->m_sb.sb_blocksize, &tmp); + + entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + + ichdr->freemap[mapindex].size); entry->hashval = cpu_to_be32(args->hashval); entry->flags = tmp ? XFS_ATTR_LOCAL : 0; entry->flags |= XFS_ATTR_NSP_ARGS_TO_ONDISK(args->flags); @@ -1203,7 +1376,7 @@ xfs_attr_leaf_add_work( XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); ASSERT((args->index == 0) || (be32_to_cpu(entry->hashval) >= be32_to_cpu((entry-1)->hashval))); - ASSERT((args->index == be16_to_cpu(hdr->count)-1) || + ASSERT((args->index == ichdr->count - 1) || (be32_to_cpu(entry->hashval) <= be32_to_cpu((entry+1)->hashval))); /* @@ -1214,14 +1387,14 @@ xfs_attr_leaf_add_work( * as part of this transaction (a split operation for example). */ if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf, args->index); + name_loc = xfs_attr3_leaf_name_local(leaf, args->index); name_loc->namelen = args->namelen; name_loc->valuelen = cpu_to_be16(args->valuelen); memcpy((char *)name_loc->nameval, args->name, args->namelen); memcpy((char *)&name_loc->nameval[args->namelen], args->value, be16_to_cpu(name_loc->valuelen)); } else { - name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); name_rmt->namelen = args->namelen; memcpy((char *)name_rmt->name, args->name, args->namelen); entry->flags |= XFS_ATTR_INCOMPLETE; @@ -1232,44 +1405,41 @@ xfs_attr_leaf_add_work( args->rmtblkcnt = XFS_B_TO_FSB(mp, args->valuelen); } xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), + XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), xfs_attr_leaf_entsize(leaf, args->index))); /* * Update the control info for this leaf node */ - if (be16_to_cpu(entry->nameidx) < be16_to_cpu(hdr->firstused)) { - /* both on-disk, don't endian-flip twice */ - hdr->firstused = entry->nameidx; - } - ASSERT(be16_to_cpu(hdr->firstused) >= - ((be16_to_cpu(hdr->count) * sizeof(*entry)) + sizeof(*hdr))); - tmp = (be16_to_cpu(hdr->count)-1) * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t); - map = &hdr->freemap[0]; - for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; map++, i++) { - if (be16_to_cpu(map->base) == tmp) { - be16_add_cpu(&map->base, sizeof(xfs_attr_leaf_entry_t)); - be16_add_cpu(&map->size, - -((int)sizeof(xfs_attr_leaf_entry_t))); + if (be16_to_cpu(entry->nameidx) < ichdr->firstused) + ichdr->firstused = be16_to_cpu(entry->nameidx); + + ASSERT(ichdr->firstused >= ichdr->count * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf)); + tmp = (ichdr->count - 1) * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf); + + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + if (ichdr->freemap[i].base == tmp) { + ichdr->freemap[i].base += sizeof(xfs_attr_leaf_entry_t); + ichdr->freemap[i].size -= sizeof(xfs_attr_leaf_entry_t); } } - be16_add_cpu(&hdr->usedbytes, xfs_attr_leaf_entsize(leaf, args->index)); - xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, hdr, sizeof(*hdr))); - return(0); + ichdr->usedbytes += xfs_attr_leaf_entsize(leaf, args->index); + return 0; } /* * Garbage collect a leaf attribute list block by copying it to a new buffer. */ STATIC void -xfs_attr_leaf_compact( +xfs_attr3_leaf_compact( struct xfs_da_args *args, + struct xfs_attr3_icleaf_hdr *ichdr_d, struct xfs_buf *bp) { xfs_attr_leafblock_t *leaf_s, *leaf_d; - xfs_attr_leaf_hdr_t *hdr_s, *hdr_d; + struct xfs_attr3_icleaf_hdr ichdr_s; struct xfs_trans *trans = args->trans; struct xfs_mount *mp = trans->t_mountp; char *tmpbuffer; @@ -1286,34 +1456,69 @@ xfs_attr_leaf_compact( */ leaf_s = (xfs_attr_leafblock_t *)tmpbuffer; leaf_d = bp->b_addr; - hdr_s = &leaf_s->hdr; - hdr_d = &leaf_d->hdr; - hdr_d->info = hdr_s->info; /* struct copy */ - hdr_d->firstused = cpu_to_be16(XFS_LBSIZE(mp)); - /* handle truncation gracefully */ - if (!hdr_d->firstused) { - hdr_d->firstused = cpu_to_be16( - XFS_LBSIZE(mp) - XFS_ATTR_LEAF_NAME_ALIGN); - } - hdr_d->usedbytes = 0; - hdr_d->count = 0; - hdr_d->holes = 0; - hdr_d->freemap[0].base = cpu_to_be16(sizeof(xfs_attr_leaf_hdr_t)); - hdr_d->freemap[0].size = cpu_to_be16(be16_to_cpu(hdr_d->firstused) - - sizeof(xfs_attr_leaf_hdr_t)); + ichdr_s = *ichdr_d; /* struct copy */ + ichdr_d->firstused = XFS_LBSIZE(mp); + ichdr_d->usedbytes = 0; + ichdr_d->count = 0; + ichdr_d->holes = 0; + ichdr_d->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_s); + ichdr_d->freemap[0].size = ichdr_d->firstused - ichdr_d->freemap[0].base; /* * Copy all entry's in the same (sorted) order, * but allocate name/value pairs packed and in sequence. */ - xfs_attr_leaf_moveents(leaf_s, 0, leaf_d, 0, - be16_to_cpu(hdr_s->count), mp); + xfs_attr3_leaf_moveents(leaf_s, &ichdr_s, 0, leaf_d, ichdr_d, 0, + ichdr_s.count, mp); + /* + * this logs the entire buffer, but the caller must write the header + * back to the buffer when it is finished modifying it. + */ xfs_trans_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); kmem_free(tmpbuffer); } /* + * Compare two leaf blocks "order". + * Return 0 unless leaf2 should go before leaf1. + */ +static int +xfs_attr3_leaf_order( + struct xfs_buf *leaf1_bp, + struct xfs_attr3_icleaf_hdr *leaf1hdr, + struct xfs_buf *leaf2_bp, + struct xfs_attr3_icleaf_hdr *leaf2hdr) +{ + struct xfs_attr_leaf_entry *entries1; + struct xfs_attr_leaf_entry *entries2; + + entries1 = xfs_attr3_leaf_entryp(leaf1_bp->b_addr); + entries2 = xfs_attr3_leaf_entryp(leaf2_bp->b_addr); + if (leaf1hdr->count > 0 && leaf2hdr->count > 0 && + ((be32_to_cpu(entries2[0].hashval) < + be32_to_cpu(entries1[0].hashval)) || + (be32_to_cpu(entries2[leaf2hdr->count - 1].hashval) < + be32_to_cpu(entries1[leaf1hdr->count - 1].hashval)))) { + return 1; + } + return 0; +} + +int +xfs_attr_leaf_order( + struct xfs_buf *leaf1_bp, + struct xfs_buf *leaf2_bp) +{ + struct xfs_attr3_icleaf_hdr ichdr1; + struct xfs_attr3_icleaf_hdr ichdr2; + + xfs_attr3_leaf_hdr_from_disk(&ichdr1, leaf1_bp->b_addr); + xfs_attr3_leaf_hdr_from_disk(&ichdr2, leaf2_bp->b_addr); + return xfs_attr3_leaf_order(leaf1_bp, &ichdr1, leaf2_bp, &ichdr2); +} + +/* * Redistribute the attribute list entries between two leaf nodes, * taking into account the size of the new entry. * @@ -1326,14 +1531,23 @@ xfs_attr_leaf_compact( * the "new" and "old" values can end up in different blocks. */ STATIC void -xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2) +xfs_attr3_leaf_rebalance( + struct xfs_da_state *state, + struct xfs_da_state_blk *blk1, + struct xfs_da_state_blk *blk2) { - xfs_da_args_t *args; - xfs_da_state_blk_t *tmp_blk; - xfs_attr_leafblock_t *leaf1, *leaf2; - xfs_attr_leaf_hdr_t *hdr1, *hdr2; - int count, totallen, max, space, swap; + struct xfs_da_args *args; + struct xfs_attr_leafblock *leaf1; + struct xfs_attr_leafblock *leaf2; + struct xfs_attr3_icleaf_hdr ichdr1; + struct xfs_attr3_icleaf_hdr ichdr2; + struct xfs_attr_leaf_entry *entries1; + struct xfs_attr_leaf_entry *entries2; + int count; + int totallen; + int max; + int space; + int swap; /* * Set up environment. @@ -1342,9 +1556,9 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, ASSERT(blk2->magic == XFS_ATTR_LEAF_MAGIC); leaf1 = blk1->bp->b_addr; leaf2 = blk2->bp->b_addr; - ASSERT(leaf1->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(leaf2->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(leaf2->hdr.count == 0); + xfs_attr3_leaf_hdr_from_disk(&ichdr1, leaf1); + xfs_attr3_leaf_hdr_from_disk(&ichdr2, leaf2); + ASSERT(ichdr2.count == 0); args = state->args; trace_xfs_attr_leaf_rebalance(args); @@ -1356,16 +1570,23 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * second block, this code should never set "swap". */ swap = 0; - if (xfs_attr_leaf_order(blk1->bp, blk2->bp)) { + if (xfs_attr3_leaf_order(blk1->bp, &ichdr1, blk2->bp, &ichdr2)) { + struct xfs_da_state_blk *tmp_blk; + struct xfs_attr3_icleaf_hdr tmp_ichdr; + tmp_blk = blk1; blk1 = blk2; blk2 = tmp_blk; + + /* struct copies to swap them rather than reconverting */ + tmp_ichdr = ichdr1; + ichdr1 = ichdr2; + ichdr2 = tmp_ichdr; + leaf1 = blk1->bp->b_addr; leaf2 = blk2->bp->b_addr; swap = 1; } - hdr1 = &leaf1->hdr; - hdr2 = &leaf2->hdr; /* * Examine entries until we reduce the absolute difference in @@ -1375,41 +1596,39 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * "inleaf" is true if the new entry should be inserted into blk1. * If "swap" is also true, then reverse the sense of "inleaf". */ - state->inleaf = xfs_attr_leaf_figure_balance(state, blk1, blk2, - &count, &totallen); + state->inleaf = xfs_attr3_leaf_figure_balance(state, blk1, &ichdr1, + blk2, &ichdr2, + &count, &totallen); if (swap) state->inleaf = !state->inleaf; /* * Move any entries required from leaf to leaf: */ - if (count < be16_to_cpu(hdr1->count)) { + if (count < ichdr1.count) { /* * Figure the total bytes to be added to the destination leaf. */ /* number entries being moved */ - count = be16_to_cpu(hdr1->count) - count; - space = be16_to_cpu(hdr1->usedbytes) - totallen; + count = ichdr1.count - count; + space = ichdr1.usedbytes - totallen; space += count * sizeof(xfs_attr_leaf_entry_t); /* * leaf2 is the destination, compact it if it looks tight. */ - max = be16_to_cpu(hdr2->firstused) - - sizeof(xfs_attr_leaf_hdr_t); - max -= be16_to_cpu(hdr2->count) * sizeof(xfs_attr_leaf_entry_t); + max = ichdr2.firstused - xfs_attr3_leaf_hdr_size(leaf1); + max -= ichdr2.count * sizeof(xfs_attr_leaf_entry_t); if (space > max) - xfs_attr_leaf_compact(args, blk2->bp); + xfs_attr3_leaf_compact(args, &ichdr2, blk2->bp); /* * Move high entries from leaf1 to low end of leaf2. */ - xfs_attr_leaf_moveents(leaf1, be16_to_cpu(hdr1->count) - count, - leaf2, 0, count, state->mp); + xfs_attr3_leaf_moveents(leaf1, &ichdr1, ichdr1.count - count, + leaf2, &ichdr2, 0, count, state->mp); - xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); - xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); - } else if (count > be16_to_cpu(hdr1->count)) { + } else if (count > ichdr1.count) { /* * I assert that since all callers pass in an empty * second buffer, this code should never execute. @@ -1420,36 +1639,37 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * Figure the total bytes to be added to the destination leaf. */ /* number entries being moved */ - count -= be16_to_cpu(hdr1->count); - space = totallen - be16_to_cpu(hdr1->usedbytes); + count -= ichdr1.count; + space = totallen - ichdr1.usedbytes; space += count * sizeof(xfs_attr_leaf_entry_t); /* * leaf1 is the destination, compact it if it looks tight. */ - max = be16_to_cpu(hdr1->firstused) - - sizeof(xfs_attr_leaf_hdr_t); - max -= be16_to_cpu(hdr1->count) * sizeof(xfs_attr_leaf_entry_t); + max = ichdr1.firstused - xfs_attr3_leaf_hdr_size(leaf1); + max -= ichdr1.count * sizeof(xfs_attr_leaf_entry_t); if (space > max) - xfs_attr_leaf_compact(args, blk1->bp); + xfs_attr3_leaf_compact(args, &ichdr1, blk1->bp); /* * Move low entries from leaf2 to high end of leaf1. */ - xfs_attr_leaf_moveents(leaf2, 0, leaf1, - be16_to_cpu(hdr1->count), count, state->mp); - - xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); - xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); + xfs_attr3_leaf_moveents(leaf2, &ichdr2, 0, leaf1, &ichdr1, + ichdr1.count, count, state->mp); } + xfs_attr3_leaf_hdr_to_disk(leaf1, &ichdr1); + xfs_attr3_leaf_hdr_to_disk(leaf2, &ichdr2); + xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); + xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); + /* * Copy out last hashval in each block for B-tree code. */ - blk1->hashval = be32_to_cpu( - leaf1->entries[be16_to_cpu(leaf1->hdr.count)-1].hashval); - blk2->hashval = be32_to_cpu( - leaf2->entries[be16_to_cpu(leaf2->hdr.count)-1].hashval); + entries1 = xfs_attr3_leaf_entryp(leaf1); + entries2 = xfs_attr3_leaf_entryp(leaf2); + blk1->hashval = be32_to_cpu(entries1[ichdr1.count - 1].hashval); + blk2->hashval = be32_to_cpu(entries2[ichdr2.count - 1].hashval); /* * Adjust the expected index for insertion. @@ -1463,12 +1683,12 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * inserting. The index/blkno fields refer to the "old" entry, * while the index2/blkno2 fields refer to the "new" entry. */ - if (blk1->index > be16_to_cpu(leaf1->hdr.count)) { + if (blk1->index > ichdr1.count) { ASSERT(state->inleaf == 0); - blk2->index = blk1->index - be16_to_cpu(leaf1->hdr.count); + blk2->index = blk1->index - ichdr1.count; args->index = args->index2 = blk2->index; args->blkno = args->blkno2 = blk2->blkno; - } else if (blk1->index == be16_to_cpu(leaf1->hdr.count)) { + } else if (blk1->index == ichdr1.count) { if (state->inleaf) { args->index = blk1->index; args->blkno = blk1->blkno; @@ -1480,8 +1700,7 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * is already stored in blkno2/index2, so don't * overwrite it overwise we corrupt the tree. */ - blk2->index = blk1->index - - be16_to_cpu(leaf1->hdr.count); + blk2->index = blk1->index - ichdr1.count; args->index = blk2->index; args->blkno = blk2->blkno; if (!state->extravalid) { @@ -1509,42 +1728,40 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * GROT: Do a double-split for this case? */ STATIC int -xfs_attr_leaf_figure_balance(xfs_da_state_t *state, - xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2, - int *countarg, int *usedbytesarg) +xfs_attr3_leaf_figure_balance( + struct xfs_da_state *state, + struct xfs_da_state_blk *blk1, + struct xfs_attr3_icleaf_hdr *ichdr1, + struct xfs_da_state_blk *blk2, + struct xfs_attr3_icleaf_hdr *ichdr2, + int *countarg, + int *usedbytesarg) { - xfs_attr_leafblock_t *leaf1, *leaf2; - xfs_attr_leaf_hdr_t *hdr1, *hdr2; - xfs_attr_leaf_entry_t *entry; - int count, max, index, totallen, half; - int lastdelta, foundit, tmp; - - /* - * Set up environment. - */ - leaf1 = blk1->bp->b_addr; - leaf2 = blk2->bp->b_addr; - hdr1 = &leaf1->hdr; - hdr2 = &leaf2->hdr; - foundit = 0; - totallen = 0; + struct xfs_attr_leafblock *leaf1 = blk1->bp->b_addr; + struct xfs_attr_leafblock *leaf2 = blk2->bp->b_addr; + struct xfs_attr_leaf_entry *entry; + int count; + int max; + int index; + int totallen = 0; + int half; + int lastdelta; + int foundit = 0; + int tmp; /* * Examine entries until we reduce the absolute difference in * byte usage between the two blocks to a minimum. */ - max = be16_to_cpu(hdr1->count) + be16_to_cpu(hdr2->count); - half = (max+1) * sizeof(*entry); - half += be16_to_cpu(hdr1->usedbytes) + - be16_to_cpu(hdr2->usedbytes) + - xfs_attr_leaf_newentsize( - state->args->namelen, - state->args->valuelen, - state->blocksize, NULL); + max = ichdr1->count + ichdr2->count; + half = (max + 1) * sizeof(*entry); + half += ichdr1->usedbytes + ichdr2->usedbytes + + xfs_attr_leaf_newentsize(state->args->namelen, + state->args->valuelen, + state->blocksize, NULL); half /= 2; lastdelta = state->blocksize; - entry = &leaf1->entries[0]; + entry = xfs_attr3_leaf_entryp(leaf1); for (count = index = 0; count < max; entry++, index++, count++) { #define XFS_ATTR_ABS(A) (((A) < 0) ? -(A) : (A)) @@ -1567,9 +1784,9 @@ xfs_attr_leaf_figure_balance(xfs_da_state_t *state, /* * Wrap around into the second block if necessary. */ - if (count == be16_to_cpu(hdr1->count)) { + if (count == ichdr1->count) { leaf1 = leaf2; - entry = &leaf1->entries[0]; + entry = xfs_attr3_leaf_entryp(leaf1); index = 0; } @@ -1600,7 +1817,7 @@ xfs_attr_leaf_figure_balance(xfs_da_state_t *state, *countarg = count; *usedbytesarg = totallen; - return(foundit); + return foundit; } /*======================================================================== @@ -1619,14 +1836,20 @@ xfs_attr_leaf_figure_balance(xfs_da_state_t *state, * GROT: allow for INCOMPLETE entries in calculation. */ int -xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) +xfs_attr3_leaf_toosmall( + struct xfs_da_state *state, + int *action) { - xfs_attr_leafblock_t *leaf; - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *info; - int count, bytes, forward, error, retval, i; - xfs_dablk_t blkno; - struct xfs_buf *bp; + struct xfs_attr_leafblock *leaf; + struct xfs_da_state_blk *blk; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_buf *bp; + xfs_dablk_t blkno; + int bytes; + int forward; + int error; + int retval; + int i; trace_xfs_attr_leaf_toosmall(state->args); @@ -1636,13 +1859,11 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) * to coalesce with a sibling. */ blk = &state->path.blk[ state->path.active-1 ]; - info = blk->bp->b_addr; - ASSERT(info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - leaf = (xfs_attr_leafblock_t *)info; - count = be16_to_cpu(leaf->hdr.count); - bytes = sizeof(xfs_attr_leaf_hdr_t) + - count * sizeof(xfs_attr_leaf_entry_t) + - be16_to_cpu(leaf->hdr.usedbytes); + leaf = blk->bp->b_addr; + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + bytes = xfs_attr3_leaf_hdr_size(leaf) + + ichdr.count * sizeof(xfs_attr_leaf_entry_t) + + ichdr.usedbytes; if (bytes > (state->blocksize >> 1)) { *action = 0; /* blk over 50%, don't try to join */ return(0); @@ -1654,12 +1875,12 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) * coalesce it with a sibling block. We choose (arbitrarily) * to merge with the forward block unless it is NULL. */ - if (count == 0) { + if (ichdr.count == 0) { /* * Make altpath point to the block we want to keep and * path point to the block we want to drop (this one). */ - forward = (info->forw != 0); + forward = (ichdr.forw != 0); memcpy(&state->altpath, &state->path, sizeof(state->path)); error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); @@ -1670,7 +1891,7 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) } else { *action = 2; } - return(0); + return 0; } /* @@ -1681,28 +1902,28 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) * to shrink an attribute list over time. */ /* start with smaller blk num */ - forward = (be32_to_cpu(info->forw) < be32_to_cpu(info->back)); + forward = ichdr.forw < ichdr.back; for (i = 0; i < 2; forward = !forward, i++) { + struct xfs_attr3_icleaf_hdr ichdr2; if (forward) - blkno = be32_to_cpu(info->forw); + blkno = ichdr.forw; else - blkno = be32_to_cpu(info->back); + blkno = ichdr.back; if (blkno == 0) continue; - error = xfs_attr_leaf_read(state->args->trans, state->args->dp, + error = xfs_attr3_leaf_read(state->args->trans, state->args->dp, blkno, -1, &bp); if (error) return(error); - leaf = (xfs_attr_leafblock_t *)info; - count = be16_to_cpu(leaf->hdr.count); - bytes = state->blocksize - (state->blocksize>>2); - bytes -= be16_to_cpu(leaf->hdr.usedbytes); - leaf = bp->b_addr; - count += be16_to_cpu(leaf->hdr.count); - bytes -= be16_to_cpu(leaf->hdr.usedbytes); - bytes -= count * sizeof(xfs_attr_leaf_entry_t); - bytes -= sizeof(xfs_attr_leaf_hdr_t); + xfs_attr3_leaf_hdr_from_disk(&ichdr2, bp->b_addr); + + bytes = state->blocksize - (state->blocksize >> 2) - + ichdr.usedbytes - ichdr2.usedbytes - + ((ichdr.count + ichdr2.count) * + sizeof(xfs_attr_leaf_entry_t)) - + xfs_attr3_leaf_hdr_size(leaf); + xfs_trans_brelse(state->args->trans, bp); if (bytes >= 0) break; /* fits with at least 25% to spare */ @@ -1741,32 +1962,35 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action) * If two leaves are 37% full, when combined they will leave 25% free. */ int -xfs_attr_leaf_remove( - struct xfs_buf *bp, - xfs_da_args_t *args) +xfs_attr3_leaf_remove( + struct xfs_buf *bp, + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_hdr_t *hdr; - xfs_attr_leaf_map_t *map; - xfs_attr_leaf_entry_t *entry; - int before, after, smallest, entsize; - int tablesize, tmp, i; - xfs_mount_t *mp; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_mount *mp = args->trans->t_mountp; + int before; + int after; + int smallest; + int entsize; + int tablesize; + int tmp; + int i; trace_xfs_attr_leaf_remove(args); leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - hdr = &leaf->hdr; - mp = args->trans->t_mountp; - ASSERT((be16_to_cpu(hdr->count) > 0) - && (be16_to_cpu(hdr->count) < (XFS_LBSIZE(mp)/8))); - ASSERT((args->index >= 0) - && (args->index < be16_to_cpu(hdr->count))); - ASSERT(be16_to_cpu(hdr->firstused) >= - ((be16_to_cpu(hdr->count) * sizeof(*entry)) + sizeof(*hdr))); - entry = &leaf->entries[args->index]; - ASSERT(be16_to_cpu(entry->nameidx) >= be16_to_cpu(hdr->firstused)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + + ASSERT(ichdr.count > 0 && ichdr.count < XFS_LBSIZE(mp) / 8); + ASSERT(args->index >= 0 && args->index < ichdr.count); + ASSERT(ichdr.firstused >= ichdr.count * sizeof(*entry) + + xfs_attr3_leaf_hdr_size(leaf)); + + entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; + + ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); /* @@ -1775,30 +1999,28 @@ xfs_attr_leaf_remove( * find smallest free region in case we need to replace it, * adjust any map that borders the entry table, */ - tablesize = be16_to_cpu(hdr->count) * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t); - map = &hdr->freemap[0]; - tmp = be16_to_cpu(map->size); + tablesize = ichdr.count * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf); + tmp = ichdr.freemap[0].size; before = after = -1; smallest = XFS_ATTR_LEAF_MAPSIZE - 1; entsize = xfs_attr_leaf_entsize(leaf, args->index); - for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; map++, i++) { - ASSERT(be16_to_cpu(map->base) < XFS_LBSIZE(mp)); - ASSERT(be16_to_cpu(map->size) < XFS_LBSIZE(mp)); - if (be16_to_cpu(map->base) == tablesize) { - be16_add_cpu(&map->base, - -((int)sizeof(xfs_attr_leaf_entry_t))); - be16_add_cpu(&map->size, sizeof(xfs_attr_leaf_entry_t)); + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { + ASSERT(ichdr.freemap[i].base < XFS_LBSIZE(mp)); + ASSERT(ichdr.freemap[i].size < XFS_LBSIZE(mp)); + if (ichdr.freemap[i].base == tablesize) { + ichdr.freemap[i].base -= sizeof(xfs_attr_leaf_entry_t); + ichdr.freemap[i].size += sizeof(xfs_attr_leaf_entry_t); } - if ((be16_to_cpu(map->base) + be16_to_cpu(map->size)) - == be16_to_cpu(entry->nameidx)) { + if (ichdr.freemap[i].base + ichdr.freemap[i].size == + be16_to_cpu(entry->nameidx)) { before = i; - } else if (be16_to_cpu(map->base) - == (be16_to_cpu(entry->nameidx) + entsize)) { + } else if (ichdr.freemap[i].base == + (be16_to_cpu(entry->nameidx) + entsize)) { after = i; - } else if (be16_to_cpu(map->size) < tmp) { - tmp = be16_to_cpu(map->size); + } else if (ichdr.freemap[i].size < tmp) { + tmp = ichdr.freemap[i].size; smallest = i; } } @@ -1809,36 +2031,30 @@ xfs_attr_leaf_remove( */ if ((before >= 0) || (after >= 0)) { if ((before >= 0) && (after >= 0)) { - map = &hdr->freemap[before]; - be16_add_cpu(&map->size, entsize); - be16_add_cpu(&map->size, - be16_to_cpu(hdr->freemap[after].size)); - hdr->freemap[after].base = 0; - hdr->freemap[after].size = 0; + ichdr.freemap[before].size += entsize; + ichdr.freemap[before].size += ichdr.freemap[after].size; + ichdr.freemap[after].base = 0; + ichdr.freemap[after].size = 0; } else if (before >= 0) { - map = &hdr->freemap[before]; - be16_add_cpu(&map->size, entsize); + ichdr.freemap[before].size += entsize; } else { - map = &hdr->freemap[after]; - /* both on-disk, don't endian flip twice */ - map->base = entry->nameidx; - be16_add_cpu(&map->size, entsize); + ichdr.freemap[after].base = be16_to_cpu(entry->nameidx); + ichdr.freemap[after].size += entsize; } } else { /* * Replace smallest region (if it is smaller than free'd entry) */ - map = &hdr->freemap[smallest]; - if (be16_to_cpu(map->size) < entsize) { - map->base = cpu_to_be16(be16_to_cpu(entry->nameidx)); - map->size = cpu_to_be16(entsize); + if (ichdr.freemap[smallest].size < entsize) { + ichdr.freemap[smallest].base = be16_to_cpu(entry->nameidx); + ichdr.freemap[smallest].size = entsize; } } /* * Did we remove the first entry? */ - if (be16_to_cpu(entry->nameidx) == be16_to_cpu(hdr->firstused)) + if (be16_to_cpu(entry->nameidx) == ichdr.firstused) smallest = 1; else smallest = 0; @@ -1846,20 +2062,20 @@ xfs_attr_leaf_remove( /* * Compress the remaining entries and zero out the removed stuff. */ - memset(xfs_attr_leaf_name(leaf, args->index), 0, entsize); - be16_add_cpu(&hdr->usedbytes, -entsize); + memset(xfs_attr3_leaf_name(leaf, args->index), 0, entsize); + ichdr.usedbytes -= entsize; xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), + XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), entsize)); - tmp = (be16_to_cpu(hdr->count) - args->index) - * sizeof(xfs_attr_leaf_entry_t); - memmove((char *)entry, (char *)(entry+1), tmp); - be16_add_cpu(&hdr->count, -1); + tmp = (ichdr.count - args->index) * sizeof(xfs_attr_leaf_entry_t); + memmove(entry, entry + 1, tmp); + ichdr.count--; xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry))); - entry = &leaf->entries[be16_to_cpu(hdr->count)]; - memset((char *)entry, 0, sizeof(xfs_attr_leaf_entry_t)); + XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(xfs_attr_leaf_entry_t))); + + entry = &xfs_attr3_leaf_entryp(leaf)[ichdr.count]; + memset(entry, 0, sizeof(xfs_attr_leaf_entry_t)); /* * If we removed the first entry, re-find the first used byte @@ -1869,130 +2085,130 @@ xfs_attr_leaf_remove( */ if (smallest) { tmp = XFS_LBSIZE(mp); - entry = &leaf->entries[0]; - for (i = be16_to_cpu(hdr->count)-1; i >= 0; entry++, i--) { - ASSERT(be16_to_cpu(entry->nameidx) >= - be16_to_cpu(hdr->firstused)); + entry = xfs_attr3_leaf_entryp(leaf); + for (i = ichdr.count - 1; i >= 0; entry++, i--) { + ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); if (be16_to_cpu(entry->nameidx) < tmp) tmp = be16_to_cpu(entry->nameidx); } - hdr->firstused = cpu_to_be16(tmp); - if (!hdr->firstused) { - hdr->firstused = cpu_to_be16( - tmp - XFS_ATTR_LEAF_NAME_ALIGN); - } + ichdr.firstused = tmp; + if (!ichdr.firstused) + ichdr.firstused = tmp - XFS_ATTR_LEAF_NAME_ALIGN; } else { - hdr->holes = 1; /* mark as needing compaction */ + ichdr.holes = 1; /* mark as needing compaction */ } + xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); xfs_trans_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, hdr, sizeof(*hdr))); + XFS_DA_LOGRANGE(leaf, &leaf->hdr, + xfs_attr3_leaf_hdr_size(leaf))); /* * Check if leaf is less than 50% full, caller may want to * "join" the leaf with a sibling if so. */ - tmp = sizeof(xfs_attr_leaf_hdr_t); - tmp += be16_to_cpu(leaf->hdr.count) * sizeof(xfs_attr_leaf_entry_t); - tmp += be16_to_cpu(leaf->hdr.usedbytes); - return(tmp < mp->m_attr_magicpct); /* leaf is < 37% full */ + tmp = ichdr.usedbytes + xfs_attr3_leaf_hdr_size(leaf) + + ichdr.count * sizeof(xfs_attr_leaf_entry_t); + + return tmp < mp->m_attr_magicpct; /* leaf is < 37% full */ } /* * Move all the attribute list entries from drop_leaf into save_leaf. */ void -xfs_attr_leaf_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, - xfs_da_state_blk_t *save_blk) +xfs_attr3_leaf_unbalance( + struct xfs_da_state *state, + struct xfs_da_state_blk *drop_blk, + struct xfs_da_state_blk *save_blk) { - xfs_attr_leafblock_t *drop_leaf, *save_leaf, *tmp_leaf; - xfs_attr_leaf_hdr_t *drop_hdr, *save_hdr, *tmp_hdr; - xfs_mount_t *mp; - char *tmpbuffer; + struct xfs_attr_leafblock *drop_leaf = drop_blk->bp->b_addr; + struct xfs_attr_leafblock *save_leaf = save_blk->bp->b_addr; + struct xfs_attr3_icleaf_hdr drophdr; + struct xfs_attr3_icleaf_hdr savehdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_mount *mp = state->mp; trace_xfs_attr_leaf_unbalance(state->args); - /* - * Set up environment. - */ - mp = state->mp; - ASSERT(drop_blk->magic == XFS_ATTR_LEAF_MAGIC); - ASSERT(save_blk->magic == XFS_ATTR_LEAF_MAGIC); drop_leaf = drop_blk->bp->b_addr; save_leaf = save_blk->bp->b_addr; - ASSERT(drop_leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(save_leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - drop_hdr = &drop_leaf->hdr; - save_hdr = &save_leaf->hdr; + xfs_attr3_leaf_hdr_from_disk(&drophdr, drop_leaf); + xfs_attr3_leaf_hdr_from_disk(&savehdr, save_leaf); + entry = xfs_attr3_leaf_entryp(drop_leaf); /* * Save last hashval from dying block for later Btree fixup. */ - drop_blk->hashval = be32_to_cpu( - drop_leaf->entries[be16_to_cpu(drop_leaf->hdr.count)-1].hashval); + drop_blk->hashval = be32_to_cpu(entry[drophdr.count - 1].hashval); /* * Check if we need a temp buffer, or can we do it in place. * Note that we don't check "leaf" for holes because we will * always be dropping it, toosmall() decided that for us already. */ - if (save_hdr->holes == 0) { + if (savehdr.holes == 0) { /* * dest leaf has no holes, so we add there. May need * to make some room in the entry array. */ - if (xfs_attr_leaf_order(save_blk->bp, drop_blk->bp)) { - xfs_attr_leaf_moveents(drop_leaf, 0, save_leaf, 0, - be16_to_cpu(drop_hdr->count), mp); + if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, + drop_blk->bp, &drophdr)) { + xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + save_leaf, &savehdr, 0, + drophdr.count, mp); } else { - xfs_attr_leaf_moveents(drop_leaf, 0, save_leaf, - be16_to_cpu(save_hdr->count), - be16_to_cpu(drop_hdr->count), mp); + xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + save_leaf, &savehdr, + savehdr.count, drophdr.count, mp); } } else { /* * Destination has holes, so we make a temporary copy * of the leaf and add them both to that. */ - tmpbuffer = kmem_alloc(state->blocksize, KM_SLEEP); - ASSERT(tmpbuffer != NULL); - memset(tmpbuffer, 0, state->blocksize); - tmp_leaf = (xfs_attr_leafblock_t *)tmpbuffer; - tmp_hdr = &tmp_leaf->hdr; - tmp_hdr->info = save_hdr->info; /* struct copy */ - tmp_hdr->count = 0; - tmp_hdr->firstused = cpu_to_be16(state->blocksize); - if (!tmp_hdr->firstused) { - tmp_hdr->firstused = cpu_to_be16( - state->blocksize - XFS_ATTR_LEAF_NAME_ALIGN); - } - tmp_hdr->usedbytes = 0; - if (xfs_attr_leaf_order(save_blk->bp, drop_blk->bp)) { - xfs_attr_leaf_moveents(drop_leaf, 0, tmp_leaf, 0, - be16_to_cpu(drop_hdr->count), mp); - xfs_attr_leaf_moveents(save_leaf, 0, tmp_leaf, - be16_to_cpu(tmp_leaf->hdr.count), - be16_to_cpu(save_hdr->count), mp); + struct xfs_attr_leafblock *tmp_leaf; + struct xfs_attr3_icleaf_hdr tmphdr; + + tmp_leaf = kmem_alloc(state->blocksize, KM_SLEEP); + memset(tmp_leaf, 0, state->blocksize); + memset(&tmphdr, 0, sizeof(tmphdr)); + + tmphdr.magic = savehdr.magic; + tmphdr.forw = savehdr.forw; + tmphdr.back = savehdr.back; + tmphdr.firstused = state->blocksize; + if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, + drop_blk->bp, &drophdr)) { + xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + tmp_leaf, &tmphdr, 0, + drophdr.count, mp); + xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, + tmp_leaf, &tmphdr, tmphdr.count, + savehdr.count, mp); } else { - xfs_attr_leaf_moveents(save_leaf, 0, tmp_leaf, 0, - be16_to_cpu(save_hdr->count), mp); - xfs_attr_leaf_moveents(drop_leaf, 0, tmp_leaf, - be16_to_cpu(tmp_leaf->hdr.count), - be16_to_cpu(drop_hdr->count), mp); + xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, + tmp_leaf, &tmphdr, 0, + savehdr.count, mp); + xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + tmp_leaf, &tmphdr, tmphdr.count, + drophdr.count, mp); } - memcpy((char *)save_leaf, (char *)tmp_leaf, state->blocksize); - kmem_free(tmpbuffer); + memcpy(save_leaf, tmp_leaf, state->blocksize); + savehdr = tmphdr; /* struct copy */ + kmem_free(tmp_leaf); } + xfs_attr3_leaf_hdr_to_disk(save_leaf, &savehdr); xfs_trans_log_buf(state->args->trans, save_blk->bp, 0, state->blocksize - 1); /* * Copy out last hashval in each block for B-tree code. */ - save_blk->hashval = be32_to_cpu( - save_leaf->entries[be16_to_cpu(save_leaf->hdr.count)-1].hashval); + entry = xfs_attr3_leaf_entryp(save_leaf); + save_blk->hashval = be32_to_cpu(entry[savehdr.count - 1].hashval); } /*======================================================================== @@ -2013,31 +2229,33 @@ xfs_attr_leaf_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, * Don't change the args->value unless we find the attribute. */ int -xfs_attr_leaf_lookup_int( - struct xfs_buf *bp, - xfs_da_args_t *args) +xfs_attr3_leaf_lookup_int( + struct xfs_buf *bp, + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_local_t *name_loc; - xfs_attr_leaf_name_remote_t *name_rmt; - int probe, span; - xfs_dahash_t hashval; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_entry *entries; + struct xfs_attr_leaf_name_local *name_loc; + struct xfs_attr_leaf_name_remote *name_rmt; + xfs_dahash_t hashval; + int probe; + int span; trace_xfs_attr_leaf_lookup(args); leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(be16_to_cpu(leaf->hdr.count) - < (XFS_LBSIZE(args->dp->i_mount)/8)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + entries = xfs_attr3_leaf_entryp(leaf); + ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); /* * Binary search. (note: small blocks will skip this loop) */ hashval = args->hashval; - probe = span = be16_to_cpu(leaf->hdr.count) / 2; - for (entry = &leaf->entries[probe]; span > 4; - entry = &leaf->entries[probe]) { + probe = span = ichdr.count / 2; + for (entry = &entries[probe]; span > 4; entry = &entries[probe]) { span /= 2; if (be32_to_cpu(entry->hashval) < hashval) probe += span; @@ -2046,35 +2264,31 @@ xfs_attr_leaf_lookup_int( else break; } - ASSERT((probe >= 0) && - (!leaf->hdr.count - || (probe < be16_to_cpu(leaf->hdr.count)))); - ASSERT((span <= 4) || (be32_to_cpu(entry->hashval) == hashval)); + ASSERT(probe >= 0 && (!ichdr.count || probe < ichdr.count)); + ASSERT(span <= 4 || be32_to_cpu(entry->hashval) == hashval); /* * Since we may have duplicate hashval's, find the first matching * hashval in the leaf. */ - while ((probe > 0) && (be32_to_cpu(entry->hashval) >= hashval)) { + while (probe > 0 && be32_to_cpu(entry->hashval) >= hashval) { entry--; probe--; } - while ((probe < be16_to_cpu(leaf->hdr.count)) && - (be32_to_cpu(entry->hashval) < hashval)) { + while (probe < ichdr.count && + be32_to_cpu(entry->hashval) < hashval) { entry++; probe++; } - if ((probe == be16_to_cpu(leaf->hdr.count)) || - (be32_to_cpu(entry->hashval) != hashval)) { + if (probe == ichdr.count || be32_to_cpu(entry->hashval) != hashval) { args->index = probe; - return(XFS_ERROR(ENOATTR)); + return XFS_ERROR(ENOATTR); } /* * Duplicate keys may be present, so search all of them for a match. */ - for ( ; (probe < be16_to_cpu(leaf->hdr.count)) && - (be32_to_cpu(entry->hashval) == hashval); + for (; probe < ichdr.count && (be32_to_cpu(entry->hashval) == hashval); entry++, probe++) { /* * GROT: Add code to remove incomplete entries. @@ -2088,21 +2302,22 @@ xfs_attr_leaf_lookup_int( continue; } if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf, probe); + name_loc = xfs_attr3_leaf_name_local(leaf, probe); if (name_loc->namelen != args->namelen) continue; - if (memcmp(args->name, (char *)name_loc->nameval, args->namelen) != 0) + if (memcmp(args->name, name_loc->nameval, + args->namelen) != 0) continue; if (!xfs_attr_namesp_match(args->flags, entry->flags)) continue; args->index = probe; - return(XFS_ERROR(EEXIST)); + return XFS_ERROR(EEXIST); } else { - name_rmt = xfs_attr_leaf_name_remote(leaf, probe); + name_rmt = xfs_attr3_leaf_name_remote(leaf, probe); if (name_rmt->namelen != args->namelen) continue; - if (memcmp(args->name, (char *)name_rmt->name, - args->namelen) != 0) + if (memcmp(args->name, name_rmt->name, + args->namelen) != 0) continue; if (!xfs_attr_namesp_match(args->flags, entry->flags)) continue; @@ -2110,11 +2325,11 @@ xfs_attr_leaf_lookup_int( args->rmtblkno = be32_to_cpu(name_rmt->valueblk); args->rmtblkcnt = XFS_B_TO_FSB(args->dp->i_mount, be32_to_cpu(name_rmt->valuelen)); - return(XFS_ERROR(EEXIST)); + return XFS_ERROR(EEXIST); } } args->index = probe; - return(XFS_ERROR(ENOATTR)); + return XFS_ERROR(ENOATTR); } /* @@ -2122,40 +2337,40 @@ xfs_attr_leaf_lookup_int( * list structure. */ int -xfs_attr_leaf_getvalue( - struct xfs_buf *bp, - xfs_da_args_t *args) +xfs_attr3_leaf_getvalue( + struct xfs_buf *bp, + struct xfs_da_args *args) { - int valuelen; - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_local_t *name_loc; - xfs_attr_leaf_name_remote_t *name_rmt; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_local *name_loc; + struct xfs_attr_leaf_name_remote *name_rmt; + int valuelen; leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(be16_to_cpu(leaf->hdr.count) - < (XFS_LBSIZE(args->dp->i_mount)/8)); - ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); + ASSERT(args->index < ichdr.count); - entry = &leaf->entries[args->index]; + entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf, args->index); + name_loc = xfs_attr3_leaf_name_local(leaf, args->index); ASSERT(name_loc->namelen == args->namelen); ASSERT(memcmp(args->name, name_loc->nameval, args->namelen) == 0); valuelen = be16_to_cpu(name_loc->valuelen); if (args->flags & ATTR_KERNOVAL) { args->valuelen = valuelen; - return(0); + return 0; } if (args->valuelen < valuelen) { args->valuelen = valuelen; - return(XFS_ERROR(ERANGE)); + return XFS_ERROR(ERANGE); } args->valuelen = valuelen; memcpy(args->value, &name_loc->nameval[args->namelen], valuelen); } else { - name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); ASSERT(name_rmt->namelen == args->namelen); ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0); valuelen = be32_to_cpu(name_rmt->valuelen); @@ -2163,15 +2378,15 @@ xfs_attr_leaf_getvalue( args->rmtblkcnt = XFS_B_TO_FSB(args->dp->i_mount, valuelen); if (args->flags & ATTR_KERNOVAL) { args->valuelen = valuelen; - return(0); + return 0; } if (args->valuelen < valuelen) { args->valuelen = valuelen; - return(XFS_ERROR(ERANGE)); + return XFS_ERROR(ERANGE); } args->valuelen = valuelen; } - return(0); + return 0; } /*======================================================================== @@ -2184,13 +2399,21 @@ xfs_attr_leaf_getvalue( */ /*ARGSUSED*/ STATIC void -xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, - xfs_attr_leafblock_t *leaf_d, int start_d, - int count, xfs_mount_t *mp) +xfs_attr3_leaf_moveents( + struct xfs_attr_leafblock *leaf_s, + struct xfs_attr3_icleaf_hdr *ichdr_s, + int start_s, + struct xfs_attr_leafblock *leaf_d, + struct xfs_attr3_icleaf_hdr *ichdr_d, + int start_d, + int count, + struct xfs_mount *mp) { - xfs_attr_leaf_hdr_t *hdr_s, *hdr_d; - xfs_attr_leaf_entry_t *entry_s, *entry_d; - int desti, tmp, i; + struct xfs_attr_leaf_entry *entry_s; + struct xfs_attr_leaf_entry *entry_d; + int desti; + int tmp; + int i; /* * Check for nothing to do. @@ -2201,45 +2424,41 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, /* * Set up environment. */ - ASSERT(leaf_s->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - ASSERT(leaf_d->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - hdr_s = &leaf_s->hdr; - hdr_d = &leaf_d->hdr; - ASSERT((be16_to_cpu(hdr_s->count) > 0) && - (be16_to_cpu(hdr_s->count) < (XFS_LBSIZE(mp)/8))); - ASSERT(be16_to_cpu(hdr_s->firstused) >= - ((be16_to_cpu(hdr_s->count) - * sizeof(*entry_s))+sizeof(*hdr_s))); - ASSERT(be16_to_cpu(hdr_d->count) < (XFS_LBSIZE(mp)/8)); - ASSERT(be16_to_cpu(hdr_d->firstused) >= - ((be16_to_cpu(hdr_d->count) - * sizeof(*entry_d))+sizeof(*hdr_d))); - - ASSERT(start_s < be16_to_cpu(hdr_s->count)); - ASSERT(start_d <= be16_to_cpu(hdr_d->count)); - ASSERT(count <= be16_to_cpu(hdr_s->count)); + ASSERT(ichdr_s->magic == XFS_ATTR_LEAF_MAGIC || + ichdr_s->magic == XFS_ATTR3_LEAF_MAGIC); + ASSERT(ichdr_s->magic == ichdr_d->magic); + ASSERT(ichdr_s->count > 0 && ichdr_s->count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr_s->firstused >= (ichdr_s->count * sizeof(*entry_s)) + + xfs_attr3_leaf_hdr_size(leaf_s)); + ASSERT(ichdr_d->count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr_d->firstused >= (ichdr_d->count * sizeof(*entry_d)) + + xfs_attr3_leaf_hdr_size(leaf_d)); + + ASSERT(start_s < ichdr_s->count); + ASSERT(start_d <= ichdr_d->count); + ASSERT(count <= ichdr_s->count); + /* * Move the entries in the destination leaf up to make a hole? */ - if (start_d < be16_to_cpu(hdr_d->count)) { - tmp = be16_to_cpu(hdr_d->count) - start_d; + if (start_d < ichdr_d->count) { + tmp = ichdr_d->count - start_d; tmp *= sizeof(xfs_attr_leaf_entry_t); - entry_s = &leaf_d->entries[start_d]; - entry_d = &leaf_d->entries[start_d + count]; - memmove((char *)entry_d, (char *)entry_s, tmp); + entry_s = &xfs_attr3_leaf_entryp(leaf_d)[start_d]; + entry_d = &xfs_attr3_leaf_entryp(leaf_d)[start_d + count]; + memmove(entry_d, entry_s, tmp); } /* * Copy all entry's in the same (sorted) order, * but allocate attribute info packed and in sequence. */ - entry_s = &leaf_s->entries[start_s]; - entry_d = &leaf_d->entries[start_d]; + entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; + entry_d = &xfs_attr3_leaf_entryp(leaf_d)[start_d]; desti = start_d; for (i = 0; i < count; entry_s++, entry_d++, desti++, i++) { - ASSERT(be16_to_cpu(entry_s->nameidx) - >= be16_to_cpu(hdr_s->firstused)); + ASSERT(be16_to_cpu(entry_s->nameidx) >= ichdr_s->firstused); tmp = xfs_attr_leaf_entsize(leaf_s, start_s + i); #ifdef GROT /* @@ -2248,36 +2467,34 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, * off for 6.2, should be revisited later. */ if (entry_s->flags & XFS_ATTR_INCOMPLETE) { /* skip partials? */ - memset(xfs_attr_leaf_name(leaf_s, start_s + i), 0, tmp); - be16_add_cpu(&hdr_s->usedbytes, -tmp); - be16_add_cpu(&hdr_s->count, -1); + memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp); + ichdr_s->usedbytes -= tmp; + ichdr_s->count -= 1; entry_d--; /* to compensate for ++ in loop hdr */ desti--; if ((start_s + i) < offset) result++; /* insertion index adjustment */ } else { #endif /* GROT */ - be16_add_cpu(&hdr_d->firstused, -tmp); + ichdr_d->firstused -= tmp; /* both on-disk, don't endian flip twice */ entry_d->hashval = entry_s->hashval; - /* both on-disk, don't endian flip twice */ - entry_d->nameidx = hdr_d->firstused; + entry_d->nameidx = cpu_to_be16(ichdr_d->firstused); entry_d->flags = entry_s->flags; ASSERT(be16_to_cpu(entry_d->nameidx) + tmp <= XFS_LBSIZE(mp)); - memmove(xfs_attr_leaf_name(leaf_d, desti), - xfs_attr_leaf_name(leaf_s, start_s + i), tmp); + memmove(xfs_attr3_leaf_name(leaf_d, desti), + xfs_attr3_leaf_name(leaf_s, start_s + i), tmp); ASSERT(be16_to_cpu(entry_s->nameidx) + tmp <= XFS_LBSIZE(mp)); - memset(xfs_attr_leaf_name(leaf_s, start_s + i), 0, tmp); - be16_add_cpu(&hdr_s->usedbytes, -tmp); - be16_add_cpu(&hdr_d->usedbytes, tmp); - be16_add_cpu(&hdr_s->count, -1); - be16_add_cpu(&hdr_d->count, 1); - tmp = be16_to_cpu(hdr_d->count) - * sizeof(xfs_attr_leaf_entry_t) - + sizeof(xfs_attr_leaf_hdr_t); - ASSERT(be16_to_cpu(hdr_d->firstused) >= tmp); + memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp); + ichdr_s->usedbytes -= tmp; + ichdr_d->usedbytes += tmp; + ichdr_s->count -= 1; + ichdr_d->count += 1; + tmp = ichdr_d->count * sizeof(xfs_attr_leaf_entry_t) + + xfs_attr3_leaf_hdr_size(leaf_d); + ASSERT(ichdr_d->firstused >= tmp); #ifdef GROT } #endif /* GROT */ @@ -2286,71 +2503,40 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, /* * Zero out the entries we just copied. */ - if (start_s == be16_to_cpu(hdr_s->count)) { + if (start_s == ichdr_s->count) { tmp = count * sizeof(xfs_attr_leaf_entry_t); - entry_s = &leaf_s->entries[start_s]; + entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; ASSERT(((char *)entry_s + tmp) <= ((char *)leaf_s + XFS_LBSIZE(mp))); - memset((char *)entry_s, 0, tmp); + memset(entry_s, 0, tmp); } else { /* * Move the remaining entries down to fill the hole, * then zero the entries at the top. */ - tmp = be16_to_cpu(hdr_s->count) - count; - tmp *= sizeof(xfs_attr_leaf_entry_t); - entry_s = &leaf_s->entries[start_s + count]; - entry_d = &leaf_s->entries[start_s]; - memmove((char *)entry_d, (char *)entry_s, tmp); + tmp = (ichdr_s->count - count) * sizeof(xfs_attr_leaf_entry_t); + entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s + count]; + entry_d = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; + memmove(entry_d, entry_s, tmp); tmp = count * sizeof(xfs_attr_leaf_entry_t); - entry_s = &leaf_s->entries[be16_to_cpu(hdr_s->count)]; + entry_s = &xfs_attr3_leaf_entryp(leaf_s)[ichdr_s->count]; ASSERT(((char *)entry_s + tmp) <= ((char *)leaf_s + XFS_LBSIZE(mp))); - memset((char *)entry_s, 0, tmp); + memset(entry_s, 0, tmp); } /* * Fill in the freemap information */ - hdr_d->freemap[0].base = cpu_to_be16(sizeof(xfs_attr_leaf_hdr_t)); - be16_add_cpu(&hdr_d->freemap[0].base, be16_to_cpu(hdr_d->count) * - sizeof(xfs_attr_leaf_entry_t)); - hdr_d->freemap[0].size = cpu_to_be16(be16_to_cpu(hdr_d->firstused) - - be16_to_cpu(hdr_d->freemap[0].base)); - hdr_d->freemap[1].base = 0; - hdr_d->freemap[2].base = 0; - hdr_d->freemap[1].size = 0; - hdr_d->freemap[2].size = 0; - hdr_s->holes = 1; /* leaf may not be compact */ -} - -/* - * Compare two leaf blocks "order". - * Return 0 unless leaf2 should go before leaf1. - */ -int -xfs_attr_leaf_order( - struct xfs_buf *leaf1_bp, - struct xfs_buf *leaf2_bp) -{ - xfs_attr_leafblock_t *leaf1, *leaf2; - - leaf1 = leaf1_bp->b_addr; - leaf2 = leaf2_bp->b_addr; - ASSERT((leaf1->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)) && - (leaf2->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC))); - if ((be16_to_cpu(leaf1->hdr.count) > 0) && - (be16_to_cpu(leaf2->hdr.count) > 0) && - ((be32_to_cpu(leaf2->entries[0].hashval) < - be32_to_cpu(leaf1->entries[0].hashval)) || - (be32_to_cpu(leaf2->entries[ - be16_to_cpu(leaf2->hdr.count)-1].hashval) < - be32_to_cpu(leaf1->entries[ - be16_to_cpu(leaf1->hdr.count)-1].hashval)))) { - return(1); - } - return(0); + ichdr_d->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_d); + ichdr_d->freemap[0].base += ichdr_d->count * sizeof(xfs_attr_leaf_entry_t); + ichdr_d->freemap[0].size = ichdr_d->firstused - ichdr_d->freemap[0].base; + ichdr_d->freemap[1].base = 0; + ichdr_d->freemap[2].base = 0; + ichdr_d->freemap[1].size = 0; + ichdr_d->freemap[2].size = 0; + ichdr_s->holes = 1; /* leaf may not be compact */ } /* @@ -2361,15 +2547,16 @@ xfs_attr_leaf_lasthash( struct xfs_buf *bp, int *count) { - xfs_attr_leafblock_t *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entries; - leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, bp->b_addr); + entries = xfs_attr3_leaf_entryp(bp->b_addr); if (count) - *count = be16_to_cpu(leaf->hdr.count); - if (!leaf->hdr.count) - return(0); - return be32_to_cpu(leaf->entries[be16_to_cpu(leaf->hdr.count)-1].hashval); + *count = ichdr.count; + if (!ichdr.count) + return 0; + return be32_to_cpu(entries[ichdr.count - 1].hashval); } /* @@ -2379,20 +2566,21 @@ xfs_attr_leaf_lasthash( STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) { + struct xfs_attr_leaf_entry *entries; xfs_attr_leaf_name_local_t *name_loc; xfs_attr_leaf_name_remote_t *name_rmt; int size; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); - if (leaf->entries[index].flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf, index); + entries = xfs_attr3_leaf_entryp(leaf); + if (entries[index].flags & XFS_ATTR_LOCAL) { + name_loc = xfs_attr3_leaf_name_local(leaf, index); size = xfs_attr_leaf_entsize_local(name_loc->namelen, be16_to_cpu(name_loc->valuelen)); } else { - name_rmt = xfs_attr_leaf_name_remote(leaf, index); + name_rmt = xfs_attr3_leaf_name_remote(leaf, index); size = xfs_attr_leaf_entsize_remote(name_rmt->namelen); } - return(size); + return size; } /* @@ -2417,35 +2605,40 @@ xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local) *local = 0; } } - return(size); + return size; } /* * Copy out attribute list entries for attr_list(), for leaf attribute lists. */ int -xfs_attr_leaf_list_int( - struct xfs_buf *bp, - xfs_attr_list_context_t *context) +xfs_attr3_leaf_list_int( + struct xfs_buf *bp, + struct xfs_attr_list_context *context) { - attrlist_cursor_kern_t *cursor; - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - int retval, i; + struct attrlist_cursor_kern *cursor; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entries; + struct xfs_attr_leaf_entry *entry; + int retval; + int i; + + trace_xfs_attr_list_leaf(context); - ASSERT(bp != NULL); leaf = bp->b_addr; + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + entries = xfs_attr3_leaf_entryp(leaf); + cursor = context->cursor; cursor->initted = 1; - trace_xfs_attr_list_leaf(context); - /* * Re-find our place in the leaf block if this is a new syscall. */ if (context->resynch) { - entry = &leaf->entries[0]; - for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { + entry = &entries[0]; + for (i = 0; i < ichdr.count; entry++, i++) { if (be32_to_cpu(entry->hashval) == cursor->hashval) { if (cursor->offset == context->dupcnt) { context->dupcnt = 0; @@ -2458,12 +2651,12 @@ xfs_attr_leaf_list_int( break; } } - if (i == be16_to_cpu(leaf->hdr.count)) { + if (i == ichdr.count) { trace_xfs_attr_list_notfound(context); - return(0); + return 0; } } else { - entry = &leaf->entries[0]; + entry = &entries[0]; i = 0; } context->resynch = 0; @@ -2472,7 +2665,7 @@ xfs_attr_leaf_list_int( * We have found our place, start copying out the new attributes. */ retval = 0; - for ( ; (i < be16_to_cpu(leaf->hdr.count)); entry++, i++) { + for (; i < ichdr.count; entry++, i++) { if (be32_to_cpu(entry->hashval) != cursor->hashval) { cursor->hashval = be32_to_cpu(entry->hashval); cursor->offset = 0; @@ -2483,7 +2676,7 @@ xfs_attr_leaf_list_int( if (entry->flags & XFS_ATTR_LOCAL) { xfs_attr_leaf_name_local_t *name_loc = - xfs_attr_leaf_name_local(leaf, i); + xfs_attr3_leaf_name_local(leaf, i); retval = context->put_listent(context, entry->flags, @@ -2495,7 +2688,7 @@ xfs_attr_leaf_list_int( return retval; } else { xfs_attr_leaf_name_remote_t *name_rmt = - xfs_attr_leaf_name_remote(leaf, i); + xfs_attr3_leaf_name_remote(leaf, i); int valuelen = be32_to_cpu(name_rmt->valuelen); @@ -2535,7 +2728,7 @@ xfs_attr_leaf_list_int( cursor->offset++; } trace_xfs_attr_list_leaf_end(context); - return(retval); + return retval; } @@ -2547,14 +2740,16 @@ xfs_attr_leaf_list_int( * Clear the INCOMPLETE flag on an entry in a leaf block. */ int -xfs_attr_leaf_clearflag(xfs_da_args_t *args) +xfs_attr3_leaf_clearflag( + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_remote_t *name_rmt; - struct xfs_buf *bp; - int error; + struct xfs_attr_leafblock *leaf; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_buf *bp; + int error; #ifdef DEBUG + struct xfs_attr3_icleaf_hdr ichdr; xfs_attr_leaf_name_local_t *name_loc; int namelen; char *name; @@ -2564,23 +2759,25 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) /* * Set up the operation. */ - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return(error); leaf = bp->b_addr; - ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); - ASSERT(args->index >= 0); - entry = &leaf->entries[ args->index ]; + entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; ASSERT(entry->flags & XFS_ATTR_INCOMPLETE); #ifdef DEBUG + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + ASSERT(args->index < ichdr.count); + ASSERT(args->index >= 0); + if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf, args->index); + name_loc = xfs_attr3_leaf_name_local(leaf, args->index); namelen = name_loc->namelen; name = (char *)name_loc->nameval; } else { - name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); namelen = name_rmt->namelen; name = (char *)name_rmt->name; } @@ -2595,7 +2792,7 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) if (args->rmtblkno) { ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0); - name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); name_rmt->valuelen = cpu_to_be32(args->valuelen); xfs_trans_log_buf(args->trans, bp, @@ -2612,34 +2809,41 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) * Set the INCOMPLETE flag on an entry in a leaf block. */ int -xfs_attr_leaf_setflag(xfs_da_args_t *args) +xfs_attr3_leaf_setflag( + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_remote_t *name_rmt; - struct xfs_buf *bp; + struct xfs_attr_leafblock *leaf; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_buf *bp; int error; +#ifdef DEBUG + struct xfs_attr3_icleaf_hdr ichdr; +#endif trace_xfs_attr_leaf_setflag(args); /* * Set up the operation. */ - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) return(error); leaf = bp->b_addr; - ASSERT(args->index < be16_to_cpu(leaf->hdr.count)); +#ifdef DEBUG + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + ASSERT(args->index < ichdr.count); ASSERT(args->index >= 0); - entry = &leaf->entries[ args->index ]; +#endif + entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; ASSERT((entry->flags & XFS_ATTR_INCOMPLETE) == 0); entry->flags |= XFS_ATTR_INCOMPLETE; xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); if ((entry->flags & XFS_ATTR_LOCAL) == 0) { - name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); name_rmt->valueblk = 0; name_rmt->valuelen = 0; xfs_trans_log_buf(args->trans, bp, @@ -2660,14 +2864,20 @@ xfs_attr_leaf_setflag(xfs_da_args_t *args) * Note that they could be in different blocks, or in the same block. */ int -xfs_attr_leaf_flipflags(xfs_da_args_t *args) +xfs_attr3_leaf_flipflags( + struct xfs_da_args *args) { - xfs_attr_leafblock_t *leaf1, *leaf2; - xfs_attr_leaf_entry_t *entry1, *entry2; - xfs_attr_leaf_name_remote_t *name_rmt; - struct xfs_buf *bp1, *bp2; + struct xfs_attr_leafblock *leaf1; + struct xfs_attr_leafblock *leaf2; + struct xfs_attr_leaf_entry *entry1; + struct xfs_attr_leaf_entry *entry2; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_buf *bp1; + struct xfs_buf *bp2; int error; #ifdef DEBUG + struct xfs_attr3_icleaf_hdr ichdr1; + struct xfs_attr3_icleaf_hdr ichdr2; xfs_attr_leaf_name_local_t *name_loc; int namelen1, namelen2; char *name1, *name2; @@ -2678,7 +2888,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) /* * Read the block containing the "old" attr */ - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno, -1, &bp1); + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp1); if (error) return error; @@ -2686,7 +2896,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) * Read the block containing the "new" attr, if it is different */ if (args->blkno2 != args->blkno) { - error = xfs_attr_leaf_read(args->trans, args->dp, args->blkno2, + error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno2, -1, &bp2); if (error) return error; @@ -2695,31 +2905,35 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) } leaf1 = bp1->b_addr; - ASSERT(args->index < be16_to_cpu(leaf1->hdr.count)); - ASSERT(args->index >= 0); - entry1 = &leaf1->entries[ args->index ]; + entry1 = &xfs_attr3_leaf_entryp(leaf1)[args->index]; leaf2 = bp2->b_addr; - ASSERT(args->index2 < be16_to_cpu(leaf2->hdr.count)); - ASSERT(args->index2 >= 0); - entry2 = &leaf2->entries[ args->index2 ]; + entry2 = &xfs_attr3_leaf_entryp(leaf2)[args->index2]; #ifdef DEBUG + xfs_attr3_leaf_hdr_from_disk(&ichdr1, leaf1); + ASSERT(args->index < ichdr1.count); + ASSERT(args->index >= 0); + + xfs_attr3_leaf_hdr_from_disk(&ichdr2, leaf2); + ASSERT(args->index2 < ichdr2.count); + ASSERT(args->index2 >= 0); + if (entry1->flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf1, args->index); + name_loc = xfs_attr3_leaf_name_local(leaf1, args->index); namelen1 = name_loc->namelen; name1 = (char *)name_loc->nameval; } else { - name_rmt = xfs_attr_leaf_name_remote(leaf1, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index); namelen1 = name_rmt->namelen; name1 = (char *)name_rmt->name; } if (entry2->flags & XFS_ATTR_LOCAL) { - name_loc = xfs_attr_leaf_name_local(leaf2, args->index2); + name_loc = xfs_attr3_leaf_name_local(leaf2, args->index2); namelen2 = name_loc->namelen; name2 = (char *)name_loc->nameval; } else { - name_rmt = xfs_attr_leaf_name_remote(leaf2, args->index2); + name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2); namelen2 = name_rmt->namelen; name2 = (char *)name_rmt->name; } @@ -2736,7 +2950,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) XFS_DA_LOGRANGE(leaf1, entry1, sizeof(*entry1))); if (args->rmtblkno) { ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0); - name_rmt = xfs_attr_leaf_name_remote(leaf1, args->index); + name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); name_rmt->valuelen = cpu_to_be32(args->valuelen); xfs_trans_log_buf(args->trans, bp1, @@ -2747,7 +2961,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) xfs_trans_log_buf(args->trans, bp2, XFS_DA_LOGRANGE(leaf2, entry2, sizeof(*entry2))); if ((entry2->flags & XFS_ATTR_LOCAL) == 0) { - name_rmt = xfs_attr_leaf_name_remote(leaf2, args->index2); + name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2); name_rmt->valueblk = 0; name_rmt->valuelen = 0; xfs_trans_log_buf(args->trans, bp2, @@ -2759,7 +2973,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) */ error = xfs_trans_roll(&args->trans, args->dp); - return(error); + return error; } /*======================================================================== @@ -2771,12 +2985,14 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) * We're doing a depth-first traversal in order to invalidate everything. */ int -xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp) +xfs_attr3_root_inactive( + struct xfs_trans **trans, + struct xfs_inode *dp) { - xfs_da_blkinfo_t *info; - xfs_daddr_t blkno; - struct xfs_buf *bp; - int error; + struct xfs_da_blkinfo *info; + struct xfs_buf *bp; + xfs_daddr_t blkno; + int error; /* * Read block 0 to see what we have to work with. @@ -2786,38 +3002,44 @@ xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp) */ error = xfs_da3_node_read(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK); if (error) - return(error); - blkno = XFS_BUF_ADDR(bp); + return error; + blkno = bp->b_bn; /* * Invalidate the tree, even if the "tree" is only a single leaf block. * This is a depth-first traversal! */ info = bp->b_addr; - if (info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)) { - error = xfs_attr_node_inactive(trans, dp, bp, 1); - } else if (info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)) { - error = xfs_attr_leaf_inactive(trans, dp, bp); - } else { + switch (info->magic) { + case cpu_to_be16(XFS_DA_NODE_MAGIC): + case cpu_to_be16(XFS_DA3_NODE_MAGIC): + error = xfs_attr3_node_inactive(trans, dp, bp, 1); + break; + case cpu_to_be16(XFS_ATTR_LEAF_MAGIC): + case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC): + error = xfs_attr3_leaf_inactive(trans, dp, bp); + break; + default: error = XFS_ERROR(EIO); xfs_trans_brelse(*trans, bp); + break; } if (error) - return(error); + return error; /* * Invalidate the incore copy of the root block. */ error = xfs_da_get_buf(*trans, dp, 0, blkno, &bp, XFS_ATTR_FORK); if (error) - return(error); + return error; xfs_trans_binval(*trans, bp); /* remove from cache */ /* * Commit the invalidate and start the next transaction. */ error = xfs_trans_roll(trans, dp); - return (error); + return error; } /* @@ -2825,7 +3047,7 @@ xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp) * We're doing a depth-first traversal in order to invalidate everything. */ STATIC int -xfs_attr_node_inactive( +xfs_attr3_node_inactive( struct xfs_trans **trans, struct xfs_inode *dp, struct xfs_buf *bp, @@ -2835,25 +3057,25 @@ xfs_attr_node_inactive( xfs_da_intnode_t *node; xfs_dablk_t child_fsb; xfs_daddr_t parent_blkno, child_blkno; - int error, count, i; + int error, i; struct xfs_buf *child_bp; struct xfs_da_node_entry *btree; + struct xfs_da3_icnode_hdr ichdr; /* * Since this code is recursive (gasp!) we must protect ourselves. */ if (level > XFS_DA_NODE_MAXDEPTH) { xfs_trans_brelse(*trans, bp); /* no locks for later trans */ - return(XFS_ERROR(EIO)); + return XFS_ERROR(EIO); } node = bp->b_addr; - ASSERT(node->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); - parent_blkno = XFS_BUF_ADDR(bp); /* save for re-read later */ - count = be16_to_cpu(node->hdr.count); - if (!count) { + xfs_da3_node_hdr_from_disk(&ichdr, node); + parent_blkno = bp->b_bn; + if (!ichdr.count) { xfs_trans_brelse(*trans, bp); - return(0); + return 0; } btree = xfs_da3_node_tree_p(node); child_fsb = be32_to_cpu(btree[0].before); @@ -2864,7 +3086,7 @@ xfs_attr_node_inactive( * over the leaves removing all of them. If this is higher up * in the tree, recurse downward. */ - for (i = 0; i < count; i++) { + for (i = 0; i < ichdr.count; i++) { /* * Read the subsidiary block to see what we have to work with. * Don't do this in a transaction. This is a depth-first @@ -2883,18 +3105,24 @@ xfs_attr_node_inactive( * Invalidate the subtree, however we have to. */ info = child_bp->b_addr; - if (info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC)) { - error = xfs_attr_node_inactive(trans, dp, - child_bp, level+1); - } else if (info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)) { - error = xfs_attr_leaf_inactive(trans, dp, - child_bp); - } else { + switch (info->magic) { + case cpu_to_be16(XFS_DA_NODE_MAGIC): + case cpu_to_be16(XFS_DA3_NODE_MAGIC): + error = xfs_attr3_node_inactive(trans, dp, + child_bp, level + 1); + break; + case cpu_to_be16(XFS_ATTR_LEAF_MAGIC): + case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC): + error = xfs_attr3_leaf_inactive(trans, dp, + child_bp); + break; + default: error = XFS_ERROR(EIO); xfs_trans_brelse(*trans, child_bp); + break; } if (error) - return(error); + return error; /* * Remove the subsidiary block from the cache @@ -2903,7 +3131,7 @@ xfs_attr_node_inactive( error = xfs_da_get_buf(*trans, dp, 0, child_blkno, &child_bp, XFS_ATTR_FORK); if (error) - return(error); + return error; xfs_trans_binval(*trans, child_bp); } @@ -2911,12 +3139,12 @@ xfs_attr_node_inactive( * If we're not done, re-read the parent to get the next * child block number. */ - if ((i+1) < count) { + if (i + 1 < ichdr.count) { error = xfs_da3_node_read(*trans, dp, 0, parent_blkno, &bp, XFS_ATTR_FORK); if (error) - return(error); - child_fsb = be32_to_cpu(btree[i+1].before); + return error; + child_fsb = be32_to_cpu(btree[i + 1].before); xfs_trans_brelse(*trans, bp); } /* @@ -2924,10 +3152,10 @@ xfs_attr_node_inactive( */ error = xfs_trans_roll(trans, dp); if (error) - return (error); + return error; } - return(0); + return 0; } /* @@ -2937,29 +3165,35 @@ xfs_attr_node_inactive( * caught holding something that the logging code wants to flush to disk. */ STATIC int -xfs_attr_leaf_inactive( - struct xfs_trans **trans, - struct xfs_inode *dp, - struct xfs_buf *bp) +xfs_attr3_leaf_inactive( + struct xfs_trans **trans, + struct xfs_inode *dp, + struct xfs_buf *bp) { - xfs_attr_leafblock_t *leaf; - xfs_attr_leaf_entry_t *entry; - xfs_attr_leaf_name_remote_t *name_rmt; - xfs_attr_inactive_list_t *list, *lp; - int error, count, size, tmp, i; + struct xfs_attr_leafblock *leaf; + struct xfs_attr3_icleaf_hdr ichdr; + struct xfs_attr_leaf_entry *entry; + struct xfs_attr_leaf_name_remote *name_rmt; + struct xfs_attr_inactive_list *list; + struct xfs_attr_inactive_list *lp; + int error; + int count; + int size; + int tmp; + int i; leaf = bp->b_addr; - ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); /* * Count the number of "remote" value extents. */ count = 0; - entry = &leaf->entries[0]; - for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { + entry = xfs_attr3_leaf_entryp(leaf); + for (i = 0; i < ichdr.count; entry++, i++) { if (be16_to_cpu(entry->nameidx) && ((entry->flags & XFS_ATTR_LOCAL) == 0)) { - name_rmt = xfs_attr_leaf_name_remote(leaf, i); + name_rmt = xfs_attr3_leaf_name_remote(leaf, i); if (name_rmt->valueblk) count++; } @@ -2970,24 +3204,24 @@ xfs_attr_leaf_inactive( */ if (count == 0) { xfs_trans_brelse(*trans, bp); - return(0); + return 0; } /* * Allocate storage for a list of all the "remote" value extents. */ size = count * sizeof(xfs_attr_inactive_list_t); - list = (xfs_attr_inactive_list_t *)kmem_alloc(size, KM_SLEEP); + list = kmem_alloc(size, KM_SLEEP); /* * Identify each of the "remote" value extents. */ lp = list; - entry = &leaf->entries[0]; - for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { + entry = xfs_attr3_leaf_entryp(leaf); + for (i = 0; i < ichdr.count; entry++, i++) { if (be16_to_cpu(entry->nameidx) && ((entry->flags & XFS_ATTR_LOCAL) == 0)) { - name_rmt = xfs_attr_leaf_name_remote(leaf, i); + name_rmt = xfs_attr3_leaf_name_remote(leaf, i); if (name_rmt->valueblk) { lp->valueblk = be32_to_cpu(name_rmt->valueblk); lp->valuelen = XFS_B_TO_FSB(dp->i_mount, @@ -3003,15 +3237,15 @@ xfs_attr_leaf_inactive( */ error = 0; for (lp = list, i = 0; i < count; i++, lp++) { - tmp = xfs_attr_leaf_freextent(trans, dp, + tmp = xfs_attr3_leaf_freextent(trans, dp, lp->valueblk, lp->valuelen); if (error == 0) error = tmp; /* save only the 1st errno */ } - kmem_free((xfs_caddr_t)list); - return(error); + kmem_free(list); + return error; } /* @@ -3019,14 +3253,20 @@ xfs_attr_leaf_inactive( * invalidate any buffers that are incore/in transactions. */ STATIC int -xfs_attr_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp, - xfs_dablk_t blkno, int blkcnt) +xfs_attr3_leaf_freextent( + struct xfs_trans **trans, + struct xfs_inode *dp, + xfs_dablk_t blkno, + int blkcnt) { - xfs_bmbt_irec_t map; - xfs_dablk_t tblkno; - int tblkcnt, dblkcnt, nmap, error; - xfs_daddr_t dblkno; - xfs_buf_t *bp; + struct xfs_bmbt_irec map; + struct xfs_buf *bp; + xfs_dablk_t tblkno; + xfs_daddr_t dblkno; + int tblkcnt; + int dblkcnt; + int nmap; + int error; /* * Roll through the "value", invalidating the attribute value's diff --git a/fs/xfs/xfs_attr_leaf.h b/fs/xfs/xfs_attr_leaf.h index 77de139..f9d7846 100644 --- a/fs/xfs/xfs_attr_leaf.h +++ b/fs/xfs/xfs_attr_leaf.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2000,2002-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -89,7 +90,7 @@ typedef struct xfs_attr_leaf_hdr { /* constant-structure header block */ typedef struct xfs_attr_leaf_entry { /* sorted on key, not name */ __be32 hashval; /* hash value of name */ - __be16 nameidx; /* index into buffer of name/value */ + __be16 nameidx; /* index into buffer of name/value */ __u8 flags; /* LOCAL/ROOT/SECURE/INCOMPLETE flag */ __u8 pad2; /* unused pad byte */ } xfs_attr_leaf_entry_t; @@ -115,6 +116,54 @@ typedef struct xfs_attr_leafblock { } xfs_attr_leafblock_t; /* + * CRC enabled leaf structures. Called "version 3" structures to match the + * version number of the directory and dablk structures for this feature, and + * attr2 is already taken by the variable inode attribute fork size feature. + */ +struct xfs_attr3_leaf_hdr { + struct xfs_da3_blkinfo info; + __be16 count; + __be16 usedbytes; + __be16 firstused; + __u8 holes; + __u8 pad1; + struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE]; +}; + +#define XFS_ATTR3_LEAF_CRC_OFF (offsetof(struct xfs_attr3_leaf_hdr, info.crc)) + +struct xfs_attr3_leafblock { + struct xfs_attr3_leaf_hdr hdr; + struct xfs_attr_leaf_entry entries[1]; + + /* + * The rest of the block contains the following structures after the + * leaf entries, growing from the bottom up. The variables are never + * referenced, the locations accessed purely from helper functions. + * + * struct xfs_attr_leaf_name_local + * struct xfs_attr_leaf_name_remote + */ +}; + +/* + * incore, neutral version of the attribute leaf header + */ +struct xfs_attr3_icleaf_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t usedbytes; + __uint16_t firstused; + __u8 holes; + struct { + __uint16_t base; + __uint16_t size; + } freemap[XFS_ATTR_LEAF_MAPSIZE]; +}; + +/* * Flags used in the leaf_entry[i].flags field. * NOTE: the INCOMPLETE bit must not collide with the flags bits specified * on the system call, they are "or"ed together for various operations. @@ -147,26 +196,43 @@ typedef struct xfs_attr_leafblock { */ #define XFS_ATTR_LEAF_NAME_ALIGN ((uint)sizeof(xfs_dablk_t)) +static inline int +xfs_attr3_leaf_hdr_size(struct xfs_attr_leafblock *leafp) +{ + if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) + return sizeof(struct xfs_attr3_leaf_hdr); + return sizeof(struct xfs_attr_leaf_hdr); +} + +static inline struct xfs_attr_leaf_entry * +xfs_attr3_leaf_entryp(xfs_attr_leafblock_t *leafp) +{ + if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) + return &((struct xfs_attr3_leafblock *)leafp)->entries[0]; + return &leafp->entries[0]; +} + /* * Cast typed pointers for "local" and "remote" name/value structs. */ -static inline xfs_attr_leaf_name_remote_t * -xfs_attr_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) +static inline char * +xfs_attr3_leaf_name(xfs_attr_leafblock_t *leafp, int idx) { - return (xfs_attr_leaf_name_remote_t *) - &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; + struct xfs_attr_leaf_entry *entries = xfs_attr3_leaf_entryp(leafp); + + return &((char *)leafp)[be16_to_cpu(entries[idx].nameidx)]; } -static inline xfs_attr_leaf_name_local_t * -xfs_attr_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) +static inline xfs_attr_leaf_name_remote_t * +xfs_attr3_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) { - return (xfs_attr_leaf_name_local_t *) - &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; + return (xfs_attr_leaf_name_remote_t *)xfs_attr3_leaf_name(leafp, idx); } -static inline char *xfs_attr_leaf_name(xfs_attr_leafblock_t *leafp, int idx) +static inline xfs_attr_leaf_name_local_t * +xfs_attr3_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) { - return &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; + return (xfs_attr_leaf_name_local_t *)xfs_attr3_leaf_name(leafp, idx); } /* @@ -221,37 +287,37 @@ int xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes); /* * Internal routines when attribute fork size == XFS_LBSIZE(mp). */ -int xfs_attr_leaf_to_node(struct xfs_da_args *args); -int xfs_attr_leaf_to_shortform(struct xfs_buf *bp, +int xfs_attr3_leaf_to_node(struct xfs_da_args *args); +int xfs_attr3_leaf_to_shortform(struct xfs_buf *bp, struct xfs_da_args *args, int forkoff); -int xfs_attr_leaf_clearflag(struct xfs_da_args *args); -int xfs_attr_leaf_setflag(struct xfs_da_args *args); -int xfs_attr_leaf_flipflags(xfs_da_args_t *args); +int xfs_attr3_leaf_clearflag(struct xfs_da_args *args); +int xfs_attr3_leaf_setflag(struct xfs_da_args *args); +int xfs_attr3_leaf_flipflags(struct xfs_da_args *args); /* * Routines used for growing the Btree. */ -int xfs_attr_leaf_split(struct xfs_da_state *state, +int xfs_attr3_leaf_split(struct xfs_da_state *state, struct xfs_da_state_blk *oldblk, struct xfs_da_state_blk *newblk); -int xfs_attr_leaf_lookup_int(struct xfs_buf *leaf, +int xfs_attr3_leaf_lookup_int(struct xfs_buf *leaf, struct xfs_da_args *args); -int xfs_attr_leaf_getvalue(struct xfs_buf *bp, struct xfs_da_args *args); -int xfs_attr_leaf_add(struct xfs_buf *leaf_buffer, +int xfs_attr3_leaf_getvalue(struct xfs_buf *bp, struct xfs_da_args *args); +int xfs_attr3_leaf_add(struct xfs_buf *leaf_buffer, struct xfs_da_args *args); -int xfs_attr_leaf_remove(struct xfs_buf *leaf_buffer, +int xfs_attr3_leaf_remove(struct xfs_buf *leaf_buffer, struct xfs_da_args *args); -int xfs_attr_leaf_list_int(struct xfs_buf *bp, +int xfs_attr3_leaf_list_int(struct xfs_buf *bp, struct xfs_attr_list_context *context); /* * Routines used for shrinking the Btree. */ -int xfs_attr_leaf_toosmall(struct xfs_da_state *state, int *retval); -void xfs_attr_leaf_unbalance(struct xfs_da_state *state, +int xfs_attr3_leaf_toosmall(struct xfs_da_state *state, int *retval); +void xfs_attr3_leaf_unbalance(struct xfs_da_state *state, struct xfs_da_state_blk *drop_blk, struct xfs_da_state_blk *save_blk); -int xfs_attr_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp); +int xfs_attr3_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp); /* * Utility routines. @@ -261,10 +327,12 @@ int xfs_attr_leaf_order(struct xfs_buf *leaf1_bp, struct xfs_buf *leaf2_bp); int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local); -int xfs_attr_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, +int xfs_attr3_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp); +void xfs_attr3_leaf_hdr_from_disk(struct xfs_attr3_icleaf_hdr *to, + struct xfs_attr_leafblock *from); -extern const struct xfs_buf_ops xfs_attr_leaf_buf_ops; +extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; #endif /* __XFS_ATTR_LEAF_H__ */ diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 6a1eb75..779ecdc 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -143,14 +143,14 @@ xfs_da3_node_hdr_from_disk( to->forw = be32_to_cpu(hdr3->info.hdr.forw); to->back = be32_to_cpu(hdr3->info.hdr.back); to->magic = be16_to_cpu(hdr3->info.hdr.magic); - to->count = be16_to_cpu(hdr3->count); + to->count = be16_to_cpu(hdr3->__count); to->level = be16_to_cpu(hdr3->__level); return; } to->forw = be32_to_cpu(from->hdr.info.forw); to->back = be32_to_cpu(from->hdr.info.back); to->magic = be16_to_cpu(from->hdr.info.magic); - to->count = be16_to_cpu(from->hdr.count); + to->count = be16_to_cpu(from->hdr.__count); to->level = be16_to_cpu(from->hdr.__level); } @@ -168,14 +168,14 @@ xfs_da3_node_hdr_to_disk( hdr3->info.hdr.forw = cpu_to_be32(from->forw); hdr3->info.hdr.back = cpu_to_be32(from->back); hdr3->info.hdr.magic = cpu_to_be16(from->magic); - hdr3->count = cpu_to_be16(from->count); + hdr3->__count = cpu_to_be16(from->count); hdr3->__level = cpu_to_be16(from->level); return; } to->hdr.info.forw = cpu_to_be32(from->forw); to->hdr.info.back = cpu_to_be32(from->back); to->hdr.info.magic = cpu_to_be16(from->magic); - to->hdr.count = cpu_to_be16(from->count); + to->hdr.__count = cpu_to_be16(from->count); to->hdr.__level = cpu_to_be16(from->level); } @@ -270,7 +270,7 @@ xfs_da3_node_read_verify( break; return; case XFS_ATTR_LEAF_MAGIC: - bp->b_ops = &xfs_attr_leaf_buf_ops; + bp->b_ops = &xfs_attr3_leaf_buf_ops; bp->b_ops->verify_read(bp); return; case XFS_DIR2_LEAFN_MAGIC: @@ -401,7 +401,7 @@ xfs_da3_split( */ switch (oldblk->magic) { case XFS_ATTR_LEAF_MAGIC: - error = xfs_attr_leaf_split(state, oldblk, newblk); + error = xfs_attr3_leaf_split(state, oldblk, newblk); if ((error != 0) && (error != ENOSPC)) { return(error); /* GROT: attr is inconsistent */ } @@ -416,12 +416,12 @@ xfs_da3_split( if (state->inleaf) { state->extraafter = 0; /* before newblk */ trace_xfs_attr_leaf_split_before(state->args); - error = xfs_attr_leaf_split(state, oldblk, + error = xfs_attr3_leaf_split(state, oldblk, &state->extrablk); } else { state->extraafter = 1; /* after newblk */ trace_xfs_attr_leaf_split_after(state->args); - error = xfs_attr_leaf_split(state, newblk, + error = xfs_attr3_leaf_split(state, newblk, &state->extrablk); } if (error) @@ -963,12 +963,12 @@ xfs_da3_join( */ switch (drop_blk->magic) { case XFS_ATTR_LEAF_MAGIC: - error = xfs_attr_leaf_toosmall(state, &action); + error = xfs_attr3_leaf_toosmall(state, &action); if (error) return(error); if (action == 0) return(0); - xfs_attr_leaf_unbalance(state, drop_blk, save_blk); + xfs_attr3_leaf_unbalance(state, drop_blk, save_blk); break; case XFS_DIR2_LEAFN_MAGIC: error = xfs_dir2_leafn_toosmall(state, &action); @@ -1024,7 +1024,8 @@ xfs_da_blkinfo_onlychild_validate(struct xfs_da_blkinfo *blkinfo, __u16 level) if (level == 1) { ASSERT(magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || - magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) || + magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)); } else { ASSERT(magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); @@ -1482,7 +1483,9 @@ xfs_da3_node_lookup_int( curr = blk->bp->b_addr; blk->magic = be16_to_cpu(curr->magic); - if (blk->magic == XFS_ATTR_LEAF_MAGIC) { + if (blk->magic == XFS_ATTR_LEAF_MAGIC || + blk->magic == XFS_ATTR3_LEAF_MAGIC) { + blk->magic = XFS_ATTR_LEAF_MAGIC; blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL); break; } @@ -1562,7 +1565,7 @@ xfs_da3_node_lookup_int( retval = xfs_dir2_leafn_lookup_int(blk->bp, args, &blk->index, state); } else if (blk->magic == XFS_ATTR_LEAF_MAGIC) { - retval = xfs_attr_leaf_lookup_int(blk->bp, args); + retval = xfs_attr3_leaf_lookup_int(blk->bp, args); blk->index = args->index; args->blkno = blk->blkno; } else { @@ -1874,7 +1877,8 @@ xfs_da3_path_shift( info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) || info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || info->magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) || - info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); + info->magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) || + info->magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)); /* @@ -1896,6 +1900,7 @@ xfs_da3_path_shift( blkno = be32_to_cpu(btree[blk->index].before); break; case XFS_ATTR_LEAF_MAGIC: + case XFS_ATTR3_LEAF_MAGIC: blk->magic = XFS_ATTR_LEAF_MAGIC; ASSERT(level == path->active-1); blk->index = 0; @@ -2626,6 +2631,7 @@ xfs_da_read_buf( XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && (magic != XFS_DA3_NODE_MAGIC) && (magic != XFS_ATTR_LEAF_MAGIC) && + (magic != XFS_ATTR3_LEAF_MAGIC) && (magic != XFS_DIR2_LEAF1_MAGIC) && (magic != XFS_DIR3_LEAF1_MAGIC) && (magic != XFS_DIR2_LEAFN_MAGIC) && diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 6bedb3c..0e8182c 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -55,6 +55,7 @@ typedef struct xfs_da_blkinfo { * magic numbers without modification for both v2 and v3 nodes. */ #define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */ +#define XFS_ATTR3_LEAF_MAGIC 0x3bee /* magic number: attribute leaf blks */ #define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */ #define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ @@ -85,13 +86,13 @@ struct xfs_da3_blkinfo { typedef struct xfs_da_node_hdr { struct xfs_da_blkinfo info; /* block type, links, etc. */ - __be16 count; /* count of active entries */ + __be16 __count; /* count of active entries */ __be16 __level; /* level above leaves (leaf == 0) */ } xfs_da_node_hdr_t; struct xfs_da3_node_hdr { struct xfs_da3_blkinfo info; /* block type, links, etc. */ - __be16 count; /* count of active entries */ + __be16 __count; /* count of active entries */ __be16 __level; /* level above leaves (leaf == 0) */ __be32 __pad32; }; From david@fromorbit.com Wed Apr 24 04:02:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B3E1E29DFA for ; Wed, 24 Apr 2013 04:02:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 94AB18F8039 for ; Wed, 24 Apr 2013 02:02:16 -0700 (PDT) X-ASG-Debug-ID: 1366794134-04cbb057f7548050001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id qs0snSg06dRuvGJa for ; Wed, 24 Apr 2013 02:02:15 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0RAIued1F5LKjR/2dsb2JhbABQgwY2uTKFGQQBfhd0gh8BAQQBJxMNDyMQCAMUBAklDwUlAyETiA4FDbASjVwVjXaBHQeDSQOXGYoChxyDICo Received: from ppp121-44-168-209.lns20.syd7.internode.on.net (HELO dastard) ([121.44.168.209]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2013 18:32:13 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UUvaf-0007PG-FJ; Wed, 24 Apr 2013 19:02:13 +1000 Date: Wed, 24 Apr 2013 19:02:13 +1000 From: Dave Chinner To: Eric Sandeen Cc: Brian Foster , yongtaofu@gmail.com, xfs@oss.sgi.com Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging Message-ID: <20130424090213.GT10481@dastard> X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging References: <516C89DF.4070904@redhat.com> <517596BA.3060408@sandeen.net> <20130423000835.GL30622@dastard> <5175DB63.6030501@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5175DB63.6030501@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: 1366794134 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129013 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 22, 2013 at 07:52:51PM -0500, Eric Sandeen wrote: > On 4/22/13 7:08 PM, Dave Chinner wrote: > > On Mon, Apr 22, 2013 at 02:59:54PM -0500, Eric Sandeen wrote: > >> On 4/15/13 6:14 PM, Brian Foster wrote: > >>> Hi, > >>> > >>> Thanks for the data in the previous thread: > >>> > >>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > >>> > >>> I'm spinning off a new thread specifically for this because the original > >>> thread is already too large and scattered to track. As Eric stated, > >>> please try to keep data contained in as few messages as possible. > >>> > >> > >> Well, it's always simple in the end. It just took a lot of debugging > >> to figure out what was happening - we do appreciate your help with that! > >> > >> We were able to create a local reproducer, and it looks like > >> this patch fixes things: > >> > >> commit aae8a97d3ec30788790d1720b71d76fd8eb44b73 > >> Author: Aneesh Kumar K.V > >> Date: Sat Jan 29 18:43:27 2011 +0530 > >> > >> fs: Don't allow to create hardlink for deleted file > > > > Good find Eric - great work on the reproducer script. > > > > FWIW, can you confirm that a debug kernel assert fails > > with a non-zero link count in xfs_bumplink() with your test case? > > > > int > > xfs_bumplink( > > xfs_trans_t *tp, > > xfs_inode_t *ip) > > { > > xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG); > > > >>>>>> ASSERT(ip->i_d.di_nlink > 0); > > Yep, it does, I put a printk in there when I was testing > and it fired. > > Guess we should have tested a debug xfs right off the bat ;) Perhaps, but that may have changed the timing sufficiently to make the race go away. What we really needed was a way to just turn the assert into a WARN_ON() without all the other debug code like we've previously talked about. So, rather than talk about it again, I posted patches to do this.... > > ip->i_d.di_nlink++; > > inc_nlink(VFS_I(ip)); > > > > If it does, we should consider this a in-memory corruption case and > > return and trigger a shutdown here.... > > I suppose that makes sense, it'd be a much less cryptic failure for > something that will fail soon anyway. Exactly. Cheers, Dave. -- Dave Chinner david@fromorbit.com From zmudan@stocktonet.com Wed Apr 24 04:28:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4D79029DFA for ; Wed, 24 Apr 2013 04:28:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DEB74AC004 for ; Wed, 24 Apr 2013 02:28:28 -0700 (PDT) X-ASG-Debug-ID: 1366795705-04bdf02d1f570860001-NocioJ Received: from mail.tv-rb.ru (mail.tv-rb.ru [46.191.236.67]) by cuda.sgi.com with ESMTP id HAFUa5C2hVJbEgdp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 24 Apr 2013 02:28:27 -0700 (PDT) X-Barracuda-Envelope-From: zmudan@stocktonet.com X-Barracuda-Apparent-Source-IP: 46.191.236.67 Received: from localhost (localhost [127.0.0.1]) by mail.tv-rb.ru (Postfix) with ESMTP id 541853C09C3; Wed, 24 Apr 2013 19:25:37 +0600 (YEKST) Received: from mail.tv-rb.ru ([127.0.0.1]) by localhost (mail.tv-rb.ru [127.0.0.1]) (amavisd-maia, port 10024) with ESMTP id 28557-09; Wed, 24 Apr 2013 19:25:37 +0600 (YEKST) Received: from Unknown (unknown [61.131.97.36]) (Authenticated sender: reklama@tv-rb.ru) by mail.tv-rb.ru (Postfix) with ESMTPA id E26C53C09EC; Wed, 24 Apr 2013 19:25:29 +0600 (YEKST) Message-ID: <58499D61F5F54853A47CA4E6375C0A54@vrrx> Reply-To: =?windows-1251?B?yO3x8vDz7OXt8vsg5Ov/IPDz6u7i7uTo8uXr?= =?windows-1251?B?/w==?= From: =?windows-1251?B?yO3x8vDz7OXt8vsg5Ov/IPDz6u7i7uTo8uXr?= =?windows-1251?B?/w==?= To: , , , , Subject: =?windows-1251?B?0e/g8eXt6OUg8/Hy4Ovu4+4g7OXt5eTm5fDg?= =?windows-1251?B?LiDQ5eTq6Okg+ODt8SDz6fLoIO7yIPDz8ujt?= =?windows-1251?B?+w==?= Date: Wed, 24 Apr 2013 11:28:18 +0200 X-ASG-Orig-Subj: =?windows-1251?B?0e/g8eXt6OUg8/Hy4Ovu4+4g7OXt5eTm5fDg?= =?windows-1251?B?LiDQ5eTq6Okg+ODt8SDz6fLoIO7yIPDz8ujt?= =?windows-1251?B?+w==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_1585_01CE40DE.D1E66DE0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Barracuda-Connect: mail.tv-rb.ru[46.191.236.67] X-Barracuda-Start-Time: 1366795706 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129015 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_1585_01CE40DE.D1E66DE0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable 2 - 6 =EC=E0=FF =E8 l5-2O =E8=FE=ED=FF 2=EEl=E7 =C3.,=20 =CF=D0=C8=C3=CB=C0=D8=C0=C5=CC =E2 =EE=E1=F3=F7=E0=FE=F9=E8=E9 =EC=EE=F0=F1= =EA=EE=E9 =CA=CE=CD=D4=C5=D0=C5=CD=D6 - =CA=D0=D3=C8=C7 =ED=E0 =EF=E0=F0=EE= =EC=E5! =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3 =96 =D5=E5=EB=FC=F1=E8=ED=EA=E8= =96 =D1=F2=EE=EA=E3=EE=EB=FC=EC =96 =D2=E0=EB=EB=E8=ED =96 =D1=E0=ED=EA=F2= -=CF=E5=F2=E5=F0=E1=F3=F0=E3! =C2=FB =F5=EE=F2=E8=F2=E5 =F0=E0=E7=E2=E8=F2=FC =F1=E2=EE=E8 =F3=EF=F0=E0= =E2=EB=E5=ED=F7=E5=F1=EA=E8=E5 =ED=E0=E2=FB=EA=E8?=20 =EF=F0=EE=E9=F2=E8 =EA=F3=F0=F1 =FD=F4=F4=E5=EA=F2=E8=E2=ED=EE=E3=EE =EC=E5= =ED=E5=E4=E6=EC=E5=ED=F2=E0 =EF=EE=E7=ED=E0=EA=EE=EC=E8=F2=FC=F1=FF =F1 =ED=EE=E2=E5=E9=F8=E8=EC=E8 =EF= =F0=E0=EA=F2=E8=EA=E0=EC=E8 =E2 =F1=F4=E5=F0=E5 =F3=EF=F0=E0=E2=EB=E5=ED=E8= =FF =EE=F0=E3=E0=ED=E8=E7=E0=F6=E8=E5=E9 =EE=E1=EC=E5=ED=FF=F2=FC=F1=FF =EE=EF=FB=F2=EE=EC =F1 =E4=F0=F3=E3=E8=EC=E8= =F3=EF=F0=E0=E2=EB=E5=ED=F6=E0=EC=E8 =F0=E5=E0=EB=E8=E7=EE=E2=E0=F2=FC =F1=E2=EE=E9 =EF=EE=F2=E5=ED=F6=E8=E0=EB= =ED=E0 =EA=E0=F7=E5=F1=F2=E2=E5=ED=ED=EE =ED=EE=E2=EE=EC =F3=F0=EE=E2=ED= =E5. =C2=FB =EB=FE=E1=E8=F2=E5 =E0=EA=F2=E8=E2=ED=FB=E9 =E8 =FF=F0=EA=E8=E9 =EE= =F2=E4=FB=F5? =EA=F0=F3=E8=E7 =ED=E0 =E1=EE=F0=F2=F3 =F1=EE=E2=F0=E5=EC=E5=ED=ED=EE=E3=EE= =EB=E0=E9=ED=E5=F0=E0 =EF=EE=F1=E5=F9=E5=ED=E8=E5 =D1=F2=EE=EA=E3=EE=EB=FC=EC=E0=20 =EE=E1=F8=E8=F0=ED=E0=FF =F0=E0=E7=E2=EB=E5=EA=E0=F2=E5=EB=FC=ED=E0=FF =EF= =F0=EE=E3=F0=E0=EC=EC=E0 =C2=E8=E7=EE=E2=E0=FF =EF=EE=E4=E4=E5=F0=E6=EA=E0, =EA=F0=F3=E8=E7 =ED=E0= =EB=E0=E9=ED=E5=F0=E5, =EF=EE=F1=E5=F9=E5=ED=E8=E5 =D1=F2=EE=EA=E3=EE=EB= =FC=EC=E0 =E2=EA=EB=FE=F7=E5=ED=FB! =D3=F1=EB=EE=E2=E8=FF, =EF=F0=EE=E3=F0=E0=EC=EC=E0: - =CF=E8=F2=E5=F0= - 6-=F72 .. 7.6 - 6l=20 ------=_NextPart_000_1585_01CE40DE.D1E66DE0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
2 - 6 =EC=E0=FF =E8 l5-2O =E8=FE=ED=FF=20 2=EEl=E7 =C3.,
=CF=D0=C8=C3=CB=C0=D8=C0=C5=CC =E2=20 =EE=E1=F3=F7=E0=FE=F9=E8=E9 =EC=EE=F0=F1=EA=EE=E9 =CA=CE=CD=D4=C5=D0=C5=CD= =D6 - =CA=D0=D3=C8=C7 =ED=E0 =EF=E0=F0=EE=EC=E5!
=D1=E0=ED=EA=F2-=CF=E5= =F2=E5=F0=E1=F3=F0=E3 =96 =D5=E5=EB=FC=F1=E8=ED=EA=E8 =96=20 =D1=F2=EE=EA=E3=EE=EB=FC=EC =96 =D2=E0=EB=EB=E8=ED =96 =D1=E0=ED=EA=F2-=CF= =E5=F2=E5=F0=E1=F3=F0=E3!
 
=C2=FB =F5=EE=F2=E8=F2=E5 =F0=E0=E7=E2=E8=F2=FC =F1=E2=EE=E8 =F3=EF=F0= =E0=E2=EB=E5=ED=F7=E5=F1=EA=E8=E5 =ED=E0=E2=FB=EA=E8?
 
=EF=F0=EE=E9=F2=E8 =EA=F3=F0=F1 =FD=F4=F4=E5=EA=F2=E8=E2=ED=EE=E3=EE= =EC=E5=ED=E5=E4=E6=EC=E5=ED=F2=E0
=EF=EE=E7=ED=E0=EA=EE=EC=E8=F2=FC=F1= =FF =F1 =ED=EE=E2=E5=E9=F8=E8=EC=E8=20 =EF=F0=E0=EA=F2=E8=EA=E0=EC=E8 =E2 =F1=F4=E5=F0=E5 =F3=EF=F0=E0=E2=EB=E5=ED= =E8=FF =EE=F0=E3=E0=ED=E8=E7=E0=F6=E8=E5=E9
=EE=E1=EC=E5=ED=FF=F2=FC=F1= =FF =EE=EF=FB=F2=EE=EC =F1 =E4=F0=F3=E3=E8=EC=E8=20 =F3=EF=F0=E0=E2=EB=E5=ED=F6=E0=EC=E8
=F0=E5=E0=EB=E8=E7=EE=E2=E0=F2=FC= =F1=E2=EE=E9 =EF=EE=F2=E5=ED=F6=E8=E0=EB =ED=E0 =EA=E0=F7=E5=F1=F2=E2=E5= =ED=ED=EE =ED=EE=E2=EE=EC =F3=F0=EE=E2=ED=E5.
 
=C2=FB =EB=FE=E1=E8=F2=E5 =E0=EA=F2=E8=E2=ED=FB=E9 =E8 =FF=F0=EA=E8=E9= =EE=F2=E4=FB=F5?
 
=EA=F0=F3=E8=E7 =ED=E0 =E1=EE=F0=F2=F3 =F1=EE=E2=F0=E5=EC=E5=ED=ED=EE= =E3=EE =EB=E0=E9=ED=E5=F0=E0
=EF=EE=F1=E5=F9=E5=ED=E8=E5 =D1=F2=EE=EA=E3= =EE=EB=FC=EC=E0
=EE=E1=F8=E8=F0=ED=E0=FF=20 =F0=E0=E7=E2=EB=E5=EA=E0=F2=E5=EB=FC=ED=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0=
 
=C2=E8=E7=EE=E2=E0=FF =EF=EE=E4=E4=E5=F0=E6=EA=E0, =EA=F0=F3=E8=E7 =ED= =E0 =EB=E0=E9=ED=E5=F0=E5, =EF=EE=F1=E5=F9=E5=ED=E8=E5 =D1=F2=EE=EA=E3=EE= =EB=FC=EC=E0 =E2=EA=EB=FE=F7=E5=ED=FB!
 
=D3=F1=EB=EE=E2=E8=FF, =EF=F0=EE=E3=F0=E0=EC=EC=E0:=20 - =CF=E8=F2=E5=F0 - 6-=F72 .. 7.6 - 6l
<= /HTML> ------=_NextPart_000_1585_01CE40DE.D1E66DE0-- From eguan@redhat.com Wed Apr 24 04:41:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 38DFA29DFA for ; Wed, 24 Apr 2013 04:41:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BCF21AC002 for ; Wed, 24 Apr 2013 02:41:51 -0700 (PDT) X-ASG-Debug-ID: 1366796510-04cbb057f754b1f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id f6sfGmccFGgw3mPi for ; Wed, 24 Apr 2013 02:41:50 -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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3O9fnaO021045 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 24 Apr 2013 05:41:49 -0400 Received: from localhost (dhcp-13-36.nay.redhat.com [10.66.13.36]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r3O9fl7Q007200; Wed, 24 Apr 2013 05:41:48 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH v2] xfstests generic 311: test fallocate(2) ENOSPC when file size is greater than 4G Date: Wed, 24 Apr 2013 17:41:35 +0800 X-ASG-Orig-Subj: [PATCH v2] xfstests generic 311: test fallocate(2) ENOSPC when file size is greater than 4G Message-Id: <1366796495-7420-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366796510 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 ENOSPC in fallocate(2) could corrupt ext4 when file size > 4G Regression test for commit 29ae07b ext4: Fix overflow caused by missing cast in ext4_fallocate() Signed-off-by: Eryu Guan --- v2: Check for $SCRATCH_DEV size, _notrun if it's smaller than 5G tests/generic/311 | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/311.out | 2 ++ tests/generic/group | 1 + 3 files changed, 75 insertions(+) create mode 100644 tests/generic/311 create mode 100644 tests/generic/311.out diff --git a/tests/generic/311 b/tests/generic/311 new file mode 100644 index 0000000..235be6e --- /dev/null +++ b/tests/generic/311 @@ -0,0 +1,72 @@ +#! /bin/bash +# FS QA Test No. 311 +# +# ENOSPC in fallocate(2) could corrupt ext4 when file size > 4G +# +# Regression test for commit +# 29ae07b ext4: Fix overflow caused by missing cast in ext4_fallocate() +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 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 +_supported_fs generic +_supported_os Linux +_require_xfs_io_falloc +_require_scratch + +# 5G in byte +fssize=$((2**30 * 5)) +required_blocks=$(($fssize / 1024)) +dev_blocks=$(grep $(basename $(readlink -f $SCRATCH_DEV)) /proc/partitions | $AWK_PROG '{print $3}') +if [ $required_blocks -gt $dev_blocks ];then + _notrun "this test requires \$SCRATCH_DEV has ${fssize}B space" +fi + +rm -f $seqres.full +_scratch_mkfs_sized $fssize >>$seqres.full 2>&1 +_scratch_mount >>$seqres.full 2>&1 + +echo "Silence is golden" + +# fallocate(2) a 6G(> 4G) file on a 5G fs +$XFS_IO_PROG -f -c "falloc 0 6g" $SCRATCH_MNT/testfile.$seq >>$seqres.full 2>&1 + +_scratch_unmount +_check_scratch_fs +status=0 +exit diff --git a/tests/generic/311.out b/tests/generic/311.out new file mode 100644 index 0000000..62f2530 --- /dev/null +++ b/tests/generic/311.out @@ -0,0 +1,2 @@ +QA output created by 311 +Silence is golden diff --git a/tests/generic/group b/tests/generic/group index eb52833..cb15afe 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -113,3 +113,4 @@ 308 auto quick 309 auto quick 310 auto +311 auto quick prealloc enospc -- 1.8.1.4 From yongtaofu@gmail.com Wed Apr 24 05:21:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3D5FC29E03 for ; Wed, 24 Apr 2013 05:21:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F357830407A for ; Wed, 24 Apr 2013 03:21:46 -0700 (PDT) X-ASG-Debug-ID: 1366798902-04bdf02d20574790001-NocioJ Received: from mail-ie0-f182.google.com (mail-ie0-f182.google.com [209.85.223.182]) by cuda.sgi.com with ESMTP id SkAAzfztdaYZGxZV (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 24 Apr 2013 03:21:43 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.182 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.182] Received: by mail-ie0-f182.google.com with SMTP id bn7so1851578ieb.13 for ; Wed, 24 Apr 2013 03:21:42 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.182] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.182] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=07hYBtFuxK9axXfK5e4nJsYtcwmIk9T9pXQnME/6AaQ=; b=yncNvAf/Pxc6WoasTKyEYkiN+vM9bgixHtf1vrJFzq1NlmU+sByIok1K7ltgP00tHA c5P2cil6pkrrnRy/iI7ao8m+dP55qoE/QfQZ9Atc41aaluhrugSKXZFjSLQyqHKmeC7i Z1tzQergAUX0z9SDyTsUPfmB+GxZpJVkJRHKVIcz2YwPewZe2QBDT89xfvEZ0llT2rbn F+LTgGydR/B7GUYrwAD7/C44jULhJO4CNcVQvKwppLs3BIYDSlOJzTM5pdWVBdswSMwG nEKeKUAtBQOU6+46vGJf0r3Wwy+Fr6skypSyxTQL2xgr0dRMFWImvj0h5mb7L2AqjMeq FTaQ== MIME-Version: 1.0 X-Received: by 10.50.192.165 with SMTP id hh5mr13932638igc.89.1366798902745; Wed, 24 Apr 2013 03:21:42 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Wed, 24 Apr 2013 03:21:42 -0700 (PDT) In-Reply-To: <20130424090213.GT10481@dastard> References: <516C89DF.4070904@redhat.com> <517596BA.3060408@sandeen.net> <20130423000835.GL30622@dastard> <5175DB63.6030501@sandeen.net> <20130424090213.GT10481@dastard> Date: Wed, 24 Apr 2013 18:21:42 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Dave Chinner Cc: Eric Sandeen , Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=14dae934086513e31504db18abb5 X-Barracuda-Connect: mail-ie0-f182.google.com[209.85.223.182] X-Barracuda-Start-Time: 1366798903 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129019 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 --14dae934086513e31504db18abb5 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Dear Eric and Dave, The xfs shutdown seems go away however one of our server report the following error it make glusterfsd hang again. Is this just related to high load? Or the same issue with different behavior after change the vfs. Apr 24 12:35:07 10 kernel: [] system_call_fastpath+0x16/0x1b Apr 24 12:37:07 10 kernel: INFO: task glusterfsd:5835 blocked for more than 120 seconds. Apr 24 12:37:07 10 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Apr 24 12:37:07 10 kernel: glusterfsd D 0000000000000003 0 5835 1 0x00000080 Apr 24 12:37:07 10 kernel: ffff88100ed77a28 0000000000000082 0000000000000000 ffff8818e843cdd8 Apr 24 12:37:07 10 kernel: ffff8810177c1bc0 ffff8818e8422ea0 0000000000004004 ffff882019453000 Apr 24 12:37:07 10 kernel: ffff88101609b098 ffff88100ed77fd8 000000000000fb88 ffff88101609b098 Apr 24 12:37:07 10 kernel: Call Trace: Apr 24 12:37:07 10 kernel: [] schedule_timeout+0x215/0x2e= 0 Apr 24 12:37:07 10 kernel: [] ? xfs_da_do_buf+0x618/0x770 [xfs] Apr 24 12:37:07 10 kernel: [] __down+0x72/0xb0 Apr 24 12:37:07 10 kernel: [] ? _xfs_buf_find+0x102/0x280 [xfs] Apr 24 12:37:07 10 kernel: [] down+0x41/0x50 Apr 24 12:37:07 10 kernel: [] xfs_buf_lock+0x53/0x110 [xfs] Apr 24 12:37:07 10 kernel: [] _xfs_buf_find+0x102/0x280 [xfs] Apr 24 12:37:07 10 kernel: [] xfs_buf_get+0x6b/0x1a0 [xfs= ] Apr 24 12:37:07 10 kernel: [] xfs_buf_read+0x2c/0x100 [xfs] Apr 24 12:37:07 10 kernel: [] xfs_trans_read_buf+0x1f8/0x400 [xfs] Apr 24 12:37:07 10 kernel: [] xfs_read_agi+0x74/0x100 [xfs] Apr 24 12:37:07 10 kernel: [] xfs_iunlink+0x4b/0x170 [xfs= ] Apr 24 12:37:07 10 kernel: [] ? current_fs_time+0x27/0x30 Apr 24 12:37:07 10 kernel: [] ? xfs_trans_ichgtime+0x27/0xa0 [xfs] Apr 24 12:37:07 10 kernel: [] xfs_droplink+0x5b/0x70 [xfs= ] Apr 24 12:37:07 10 kernel: [] xfs_remove+0x27e/0x3a0 [xfs= ] Apr 24 12:37:07 10 kernel: [] ? generic_permission+0x5c/0xb0 Apr 24 12:37:07 10 kernel: [] xfs_vn_unlink+0x48/0x90 [xfs] Apr 24 12:37:07 10 kernel: [] vfs_unlink+0x9f/0xe0 Apr 24 12:37:07 10 kernel: [] ? lookup_hash+0x3a/0x50 Apr 24 12:37:07 10 kernel: [] do_unlinkat+0x183/0x1c0 Apr 24 12:37:07 10 kernel: [] ? sys_newstat+0x36/0x50 Apr 24 12:37:07 10 kernel: [] sys_unlink+0x16/0x20 Apr 24 12:37:07 10 kernel: [] system_call_fastpath+0x16/0x1b . BTW: I use kernel 279.19.1 2675 mutex_lock(&inode->i_mutex); 2676 /* Make sure we don't allow creating hardlink to an unlinked file */ 2677 if (inode->i_nlink =3D=3D 0) 2678 error =3D -ENOENT; 2679 else 2680 vfs_dq_init(dir); 2681 error =3D dir->i_op->link(old_dentry, dir, new_dentry)= ; 2682 mutex_unlock(&inode->i_mutex); Thank you. 2013/4/24 Dave Chinner > On Mon, Apr 22, 2013 at 07:52:51PM -0500, Eric Sandeen wrote: > > On 4/22/13 7:08 PM, Dave Chinner wrote: > > > On Mon, Apr 22, 2013 at 02:59:54PM -0500, Eric Sandeen wrote: > > >> On 4/15/13 6:14 PM, Brian Foster wrote: > > >>> Hi, > > >>> > > >>> Thanks for the data in the previous thread: > > >>> > > >>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html > > >>> > > >>> I'm spinning off a new thread specifically for this because the > original > > >>> thread is already too large and scattered to track. As Eric stated, > > >>> please try to keep data contained in as few messages as possible. > > >>> > > >> > > >> Well, it's always simple in the end. It just took a lot of debuggin= g > > >> to figure out what was happening - we do appreciate your help with > that! > > >> > > >> We were able to create a local reproducer, and it looks like > > >> this patch fixes things: > > >> > > >> commit aae8a97d3ec30788790d1720b71d76fd8eb44b73 > > >> Author: Aneesh Kumar K.V > > >> Date: Sat Jan 29 18:43:27 2011 +0530 > > >> > > >> fs: Don't allow to create hardlink for deleted file > > > > > > Good find Eric - great work on the reproducer script. > > > > > > FWIW, can you confirm that a debug kernel assert fails > > > with a non-zero link count in xfs_bumplink() with your test case? > > > > > > int > > > xfs_bumplink( > > > xfs_trans_t *tp, > > > xfs_inode_t *ip) > > > { > > > xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG); > > > > > >>>>>> ASSERT(ip->i_d.di_nlink > 0); > > > > Yep, it does, I put a printk in there when I was testing > > and it fired. > > > > Guess we should have tested a debug xfs right off the bat ;) > > Perhaps, but that may have changed the timing sufficiently to make > the race go away. What we really needed was a way to just turn the > assert into a WARN_ON() without all the other debug code like we've > previously talked about. So, rather than talk about it again, I > posted patches to do this.... > > > > ip->i_d.di_nlink++; > > > inc_nlink(VFS_I(ip)); > > > > > > If it does, we should consider this a in-memory corruption case and > > > return and trigger a shutdown here.... > > > > I suppose that makes sense, it'd be a much less cryptic failure for > > something that will fail soon anyway. > > Exactly. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --=20 =B7=FB=D3=C0=CC=CE --14dae934086513e31504db18abb5 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Dear Eric and Dave,
The xfs s= hutdown seems go away however one of our server report the following error = it make glusterfsd hang again. Is this just related to high load? Or the sa= me issue with different behavior after change the vfs.
Apr 24 12:35:07 10 kernel: [<ffffffff8100b072>] system_call_fastpath+= 0x16/0x1b
Apr 24 12:37:07 10 kernel: INFO: task glusterfsd:5835 blocked = for more than 120 seconds.
Apr 24 12:37:07 10 kernel: "echo 0 > = /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Apr 24 12:37:07 10 kernel: glusterfsd    D 0000000000000003&= nbsp;    0  5835      1 0x0000= 0080
Apr 24 12:37:07 10 kernel: ffff88100ed77a28 0000000000000082 000000= 0000000000 ffff8818e843cdd8
Apr 24 12:37:07 10 kernel: ffff8810177c1bc0 = ffff8818e8422ea0 0000000000004004 ffff882019453000
Apr 24 12:37:07 10 kernel: ffff88101609b098 ffff88100ed77fd8 000000000000fb= 88 ffff88101609b098
Apr 24 12:37:07 10 kernel: Call Trace:
Apr 24 12:= 37:07 10 kernel: [<ffffffff814eaad5>] schedule_timeout+0x215/0x2e0 Apr 24 12:37:07 10 kernel: [<ffffffffa02a4978>] ? xfs_da_do_buf+0x618= /0x770 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffff814eb9f2>] __dow= n+0x72/0xb0
Apr 24 12:37:07 10 kernel: [<ffffffffa02daae2>] ? _xfs= _buf_find+0x102/0x280 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffff810967f1>] down+0x41/0x50
Apr= 24 12:37:07 10 kernel: [<ffffffffa02da923>] xfs_buf_lock+0x53/0x110 = [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02daae2>] _xfs_buf_fin= d+0x102/0x280 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02daccb>] xfs_buf_get+0x6b/0x1a= 0 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02db33c>] xfs_buf_re= ad+0x2c/0x100 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02d0f88>= ] xfs_trans_read_buf+0x1f8/0x400 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02b3774>] xfs_read_agi+0x74/0x1= 00 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02b999b>] xfs_iunli= nk+0x4b/0x170 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffff81070f97>= ] ? current_fs_time+0x27/0x30
Apr 24 12:37:07 10 kernel: [<ffffffffa02d1737>] ? xfs_trans_ichgtime+= 0x27/0xa0 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02d1a8b>] xf= s_droplink+0x5b/0x70 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02d3= 42e>] xfs_remove+0x27e/0x3a0 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffff8118215c>] ? generic_permission+= 0x5c/0xb0
Apr 24 12:37:07 10 kernel: [<ffffffffa02e0da8>] xfs_vn_u= nlink+0x48/0x90 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffff81183d6f&g= t;] vfs_unlink+0x9f/0xe0
Apr 24 12:37:07 10 kernel: [<ffffffff81182aaa>] ? lookup_hash+0x3a/0x= 50
Apr 24 12:37:07 10 kernel: [<ffffffff811862a3>] do_unlinkat+0x1= 83/0x1c0
Apr 24 12:37:07 10 kernel: [<ffffffff8117b876>] ? sys_new= stat+0x36/0x50
Apr 24 12:37:07 10 kernel: [<ffffffff811862f6>] sys_unlink+0x16/0x20<= br>Apr 24 12:37:07 10 kernel: [<ffffffff8100b072>] system_call_fastpa= th+0x16/0x1b
.

BTW:
I use kernel 279.19.1
2675&= nbsp;        mutex_lock(&inode->i= _mutex);
2676         /* Make sure we don= 9;t allow creating hardlink to an unlinked file */
2677   = ;      if (inode->i_nlink =3D=3D 0)
2678&nbs= p;            &= nbsp;   error =3D  -ENOENT;
2679    &= nbsp;    else
2680      &nb= sp;          vfs_dq_init(dir);=
2681            = ;     error =3D dir->i_op->link(old_dentry, dir, = new_dentry);
2682         mutex_= unlock(&inode->i_mutex);

Thank you.


2013/4/24 Dave Chinner <david@fromorbit.com>
On Mon, Apr 22, 2013 at 07:52:51PM = -0500, Eric Sandeen wrote:
> On 4/22/13 7:08 PM, Dave Chinner wrote:
> > On Mon, Apr 22, 2013 at 02:59:54PM -0500, Eric Sandeen wrote:
> >> On 4/15/13 6:14 PM, Brian Foster wrote:
> >>> Hi,
> >>>
> >>> Thanks for the data in the previous thread:
> >>>
> >>> http://oss.sgi.com/archives/xfs/2013-04/msg00327= .html
> >>>
> >>> I'm spinning off a new thread specifically for this b= ecause the original
> >>> thread is already too large and scattered to track. As Er= ic stated,
> >>> please try to keep data contained in as few messages as p= ossible.
> >>>
> >>
> >> Well, it's always simple in the end.  It just took a= lot of debugging
> >> to figure out what was happening - we do appreciate your help= with that!
> >>
> >> We were able to create a local reproducer, and it looks like<= br> > >> this patch fixes things:
> >>
> >> commit aae8a97d3ec30788790d1720b71d76fd8eb44b73
> >> Author: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> >> Date:   Sat Jan 29 18:43:27 2011 +0530
> >>
> >>     fs: Don't allow to create hardlink for dele= ted file
> >
> > Good find Eric - great work on the reproducer script.
> >
> > FWIW, can you confirm that a debug kernel assert fails
> > with a non-zero link count in xfs_bumplink() with your test case?=
> >
> > int
> > xfs_bumplink(
> >         xfs_trans_t *tp,
> >         xfs_inode_t *ip)
> > {
> >         xfs_trans_ichgtime(tp, ip, XFS_ICHGTI= ME_CHG);
> >
> >>>>>>   ASSERT(ip->i_d.di_nlink > 0); >
> Yep, it does, I put a printk in there when I was testing
> and it fired.
>
> Guess we should have tested a debug xfs right off the bat ;)

Perhaps, but that may have changed the timing sufficiently to m= ake
the race go away. What we really needed was a way to just turn the
assert into a WARN_ON() without all the other debug code like we've
previously talked about. So, rather than talk about it again, I
posted patches to do this....

> >         ip->i_d.di_nlink++;
> >         inc_nlink(VFS_I(ip));
> >
> > If it does, we should consider this a in-memory corruption case a= nd
> > return and trigger a shutdown here....
>
> I suppose that makes sense, it'd be a much less cryptic failure fo= r
> something that will fail soon anyway.

Exactly.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com



--
=B7=FB=D3= =C0=CC=CE
--14dae934086513e31504db18abb5-- From evrenoglou@rowan.edu Wed Apr 24 05:42:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=EMAIL_URI_PHISH,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 197BD29DFA for ; Wed, 24 Apr 2013 05:42:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 026FE304081 for ; Wed, 24 Apr 2013 03:42:37 -0700 (PDT) X-ASG-Debug-ID: 1366800156-04cb6c2c1d56ea20001-NocioJ Received: from mx5.rowan.edu (mx5.rowan.edu [150.250.65.17]) by cuda.sgi.com with ESMTP id uLnifWHeiQWwfBCs for ; Wed, 24 Apr 2013 03:42:36 -0700 (PDT) X-Barracuda-Envelope-From: evrenoglou@rowan.edu X-Barracuda-Apparent-Source-IP: 150.250.65.17 X-Barracuda-Registry: Level1 [rowan.edu/150.250.65.17] X-IronPort-Anti-Spam-Filtered: true X-Barracuda-Registry: Level1 [rowan.edu/150.250.65.17] X-IronPort-Anti-Spam-Result: AuxPAJ62d1GW+kAx/2dsb2JhbAA0HQcHghgcI1exDoUOAYgzgRV0gh8BAQVHQgIBCAQNBAEBFhkyHQgCBBMIhgYVIgKBTAILrwGBM4VahGyCXI1mCgYNdDgGBIJeYQOIV51HgXInH4IwW4FOAgcXBoELDA X-IronPort-AV: E=Sophos;i="4.87,542,1363147200"; d="scan'208,217";a="26847943" Received: from exchange2007-ca-1.rowan.edu (HELO ex2k7-ca-1.rowanads.rowan.edu) ([150.250.64.49]) by mx2-outbound.rowan.edu with ESMTP; 24 Apr 2013 06:42:35 -0400 Received: from ex2k7-mb1-v1.rowanads.rowan.edu ([fe80::f472:56ab:dfa0:459c]) by ex2k7-ca-1.rowanads.rowan.edu ([fe80::81d0:18b3:b6b7:2ff5%15]) with mapi; Wed, 24 Apr 2013 06:41:39 -0400 From: "Evrenoglou, Kyriakos M." To: "Evrenoglou, Kyriakos M." Date: Wed, 24 Apr 2013 06:38:19 -0400 Subject: RE: Notice!!! Thread-Topic: Notice!!! X-ASG-Orig-Subj: RE: Notice!!! Thread-Index: AQHOQNevnnekyh1XvUqEZaGBR892FJjlLfzs Message-ID: <139AD20477B8D944AADF3ED57683DC1D2A5CB15A6D@EX2K7-MB1-V1.rowanads.rowan.edu> References: <139AD20477B8D944AADF3ED57683DC1D2A5CB15A55@EX2K7-MB1-V1.rowanads.rowan.edu> In-Reply-To: <139AD20477B8D944AADF3ED57683DC1D2A5CB15A55@EX2K7-MB1-V1.rowanads.rowan.edu> 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_139AD20477B8D944AADF3ED57683DC1D2A5CB15A6DEX2K7MB1V1row_" MIME-Version: 1.0 X-Barracuda-Connect: mx5.rowan.edu[150.250.65.17] X-Barracuda-Start-Time: 1366800156 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.98 X-Barracuda-Spam-Status: No, SCORE=0.98 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, HTML_MESSAGE, PLING_PLING, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129019 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 HTML_MESSAGE BODY: HTML included in message 0.46 PLING_PLING Subject has lots of exclamation marks 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address --_000_139AD20477B8D944AADF3ED57683DC1D2A5CB15A6DEX2K7MB1V1row_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable ________________________________ From: Evrenoglou, Kyriakos M. Sent: Wednesday, April 24, 2013 6:37 AM To: robert-glasgow@uiowa.edu Subject: Notice!!! This Message is From the Admin Help Desk. Due to our latest IP Security upg= rades we have reason to believe that your E-mail account was accessed by a = third party. Protecting the security of your E-mail account is our primary concern; we h= ave limited access to sensitive E-mail account features. To resolve this issue you have to Re-validate your e-mail account. Failure = to Re-validate your E-mail account as soon as you see this message will cau= se the deactivation of your E-mail account be warned. Help Desk requires you to validated your email account by clicking HERE Thank you for your cooperation. Admin Help Desk 2013 =A9. --_000_139AD20477B8D944AADF3ED57683DC1D2A5CB15A6DEX2K7MB1V1row_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
 
=  

From: Evrenoglou,= Kyriakos M.
Sent: Wednesday, April 24, 2013 6:37 AM
To: robert-glasgow@uiowa.edu
Subject: Notice!!!

This Me= ssage is From the Admin Help Desk. Due to our latest IP Security upgrades w= e have reason to believe that your E-mail account was accessed by a third p= arty.
Protect= ing the security of your E-mail account is our primary concern; we have lim= ited access to sensitive E-mail account features.
To reso= lve this issue you have to Re-validate your e-mail account. Failure to Re-v= alidate your E-mail account as soon as you see this message will cause the = deactivation of your E-mail account be warned.
Help De= sk requires you to validated your email account by clicking HERE=
Thank y= ou for your cooperation.
Admin Help Desk 2013 =A9.
--_000_139AD20477B8D944AADF3ED57683DC1D2A5CB15A6DEX2K7MB1V1row_-- From mw@dermichi.com Wed Apr 24 05:49:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0F35129DFA for ; Wed, 24 Apr 2013 05:49:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DEEE08F8054 for ; Wed, 24 Apr 2013 03:49:03 -0700 (PDT) X-ASG-Debug-ID: 1366800541-04cbb057f8550390001-NocioJ Received: from firestarter.dermichi.com (firestarter.dermichi.com [194.177.153.153]) by cuda.sgi.com with ESMTP id W8iD78jd9RuQTcgi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 24 Apr 2013 03:49:02 -0700 (PDT) X-Barracuda-Envelope-From: mw@dermichi.com X-Barracuda-Apparent-Source-IP: 194.177.153.153 Received: from noclinksys.net4you.net ([194.177.153.180] helo=[192.168.34.189]) by firestarter.dermichi.com with esmtpsa (TLSv1:DHE-RSA-CAMELLIA256-SHA:256) (Exim 4.80.1) (envelope-from ) id 1UUxG1-00050j-6V for xfs@oss.sgi.com; Wed, 24 Apr 2013 12:49:01 +0200 Message-ID: <5177B899.4000707@dermichi.com> Date: Wed, 24 Apr 2013 12:48:57 +0200 From: Michael Weissenbacher User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130329 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: XFS Support in RHEL Server 6.4 x86_64 X-Enigmail-Version: 1.5.1 X-ASG-Orig-Subj: XFS Support in RHEL Server 6.4 x86_64 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: firestarter.dermichi.com[194.177.153.153] X-Barracuda-Start-Time: 1366800542 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129021 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi List! I was under the impression that XFS was officially supported by Red Hat Enterprise Linux. During the installation i noticed that Anaconda wouldn't allow XFS as root file system. Well, that's not a big problem for me. But after installation i realized that they don't even include xfsprogs so that i could do mkfs.xfs. Well, also not a big problem, i used the latest tarball and compiled them myself. But the big question now is: can anybody actually recommend using XFS on stock RHEL? It does feel like being just a stepchild there. On the other hand there seem be be quite a number of patches that were backported for Red Hat's kernel and it does use delaylog by default (which IIRC wasn't the default with a stock 2.6.32 Kernel). tia, Michael From jamesb@loreland.org Wed Apr 24 10:00:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D316529DFA for ; Wed, 24 Apr 2013 10:00:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7D40DAC006 for ; Wed, 24 Apr 2013 08:00:46 -0700 (PDT) X-ASG-Debug-ID: 1366815644-04bdf02d1d58a110001-NocioJ Received: from mail-oa0-f47.google.com (mail-oa0-f47.google.com [209.85.219.47]) by cuda.sgi.com with ESMTP id EyE6tOS1AVRK75up (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 24 Apr 2013 08:00:45 -0700 (PDT) X-Barracuda-Envelope-From: jamesb@loreland.org X-Barracuda-Apparent-Source-IP: 209.85.219.47 Received: by mail-oa0-f47.google.com with SMTP id n9so1801965oag.34 for ; Wed, 24 Apr 2013 08:00:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:mime-version:x-originating-ip:in-reply-to:references :from:date:message-id:subject:to:cc:content-type:x-gm-message-state; bh=148PIT9TypVlN9maF1xWxM2cOUjy4FYgJ3CzM3SXnO8=; b=R863ajx+fAGzSzg8j3mcHdBarIE01ahNvuT5yMxf2bdSuR70fORj6aVAMbBuHfNFAI KRebgbRW1/m6Uw17bQ9WIHH7H/zLhr51RSp21FCOiWOYbLAPjnz7mV6IgIxM+CMijsot +pXWkU1mDY38CEHZXdrkQLwAEt9qkVNYFsDSa3GKka7SUFE1z/0cgsO9NNq03maifkvY JZq6w0lww1t4Q5q//ju6Iokp5NrCSbeb7RNkJTgiGSqWQEoCjlHzcv+hPYbqAAYMRjvJ PPYugIJk8GJVU17uqvLnC3j8XWszCA+vXhYOg8t8DIXOJCltIxAA7S4nAlVLEDZdIERe Pj7w== X-Received: by 10.182.106.129 with SMTP id gu1mr13210383obb.34.1366815644582; Wed, 24 Apr 2013 08:00:44 -0700 (PDT) MIME-Version: 1.0 Received: by 10.76.143.197 with HTTP; Wed, 24 Apr 2013 08:00:24 -0700 (PDT) X-Originating-IP: [2001:470:69e1:beef:94db:55e:7a01:c1ce] In-Reply-To: <5177B899.4000707@dermichi.com> References: <5177B899.4000707@dermichi.com> From: James Braid Date: Wed, 24 Apr 2013 16:00:24 +0100 Message-ID: Subject: Re: XFS Support in RHEL Server 6.4 x86_64 To: Michael Weissenbacher X-ASG-Orig-Subj: Re: XFS Support in RHEL Server 6.4 x86_64 Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e0149c500fa207004db1c904d X-Gm-Message-State: ALoCoQlQ8w0TThKCG7BnwTUFuyw5ge8xzOQVNITJhV3Dd/XlCqeJb1hMmn6Pp9gO8WJ/Q3CxbnNH X-Barracuda-Connect: mail-oa0-f47.google.com[209.85.219.47] X-Barracuda-Start-Time: 1366815645 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.129037 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --089e0149c500fa207004db1c904d Content-Type: text/plain; charset=ISO-8859-1 On 24 April 2013 11:48, Michael Weissenbacher wrote: > But the big question now is: can anybody actually recommend using XFS on > stock RHEL? It does feel like being just a stepchild there. On the other > hand there seem be be quite a number of patches that were backported for > Red Hat's kernel and it does use delaylog by default (which IIRC wasn't > the default with a stock 2.6.32 Kernel). > It's an addon product and not supported as a root filesystem on RHEL 6: http://www.redhat.com/products/enterprise-linux-add-ons/file-systems/ A number of the XFS developers are employed by Red Hat... --089e0149c500fa207004db1c904d Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

= On 24 April 2013 11:48, Michael Weissenbacher <mw@dermichi.com> wrote:
But the big question now is: can anybody = actually recommend using XFS on
stock RHEL? It does feel like being just a stepchild there. On the other hand there seem be be quite a number of patches that were backported for Red Hat's kernel and it does use delaylog by default (which IIRC wasn&#= 39;t
the default with a stock 2.6.32 Kernel).

It= 's an addon product and not supported as a root filesystem on RHEL 6:


A num= ber of the XFS developers are employed by Red Hat...=A0

--089e0149c500fa207004db1c904d-- From rwheeler@redhat.com Wed Apr 24 12:32:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D33FD29DFA for ; Wed, 24 Apr 2013 12:32:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1B6E304070 for ; Wed, 24 Apr 2013 10:32:14 -0700 (PDT) X-ASG-Debug-ID: 1366824733-04cbb057f7572ad0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iBGi075pw0s7JPTR for ; Wed, 24 Apr 2013 10:32:13 -0700 (PDT) X-Barracuda-Envelope-From: rwheeler@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3OHWDvX024464 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 24 Apr 2013 13:32:13 -0400 Received: from [10.3.113.131] (ovpn-113-131.phx2.redhat.com [10.3.113.131]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3OHWCiK013732 for ; Wed, 24 Apr 2013 13:32:13 -0400 Message-ID: <5178171C.7060109@redhat.com> Date: Wed, 24 Apr 2013 13:32:12 -0400 From: Ric Wheeler User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130402 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: XFS Support in RHEL Server 6.4 x86_64 References: <5177B899.4000707@dermichi.com> X-ASG-Orig-Subj: Re: XFS Support in RHEL Server 6.4 x86_64 In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366824733 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 04/24/2013 11:00 AM, James Braid wrote: > > On 24 April 2013 11:48, Michael Weissenbacher > wrote: > > But the big question now is: can anybody actually recommend using XFS on > stock RHEL? It does feel like being just a stepchild there. On the other > hand there seem be be quite a number of patches that were backported for > Red Hat's kernel and it does use delaylog by default (which IIRC wasn't > the default with a stock 2.6.32 Kernel). > > > It's an addon product and not supported as a root filesystem on RHEL 6: > > http://www.redhat.com/products/enterprise-linux-add-ons/file-systems/ > > A number of the XFS developers are employed by Red Hat... > > And it is the only file system in RH Storage (gluster) that we support and quite popular with normal RHEL users as well. Definitely not ignored in any way. If you have questions about how to get it, let me know. Regards, Ric From sekharan@us.ibm.com Wed Apr 24 13:40:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 58AF429DFA for ; Wed, 24 Apr 2013 13:40:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1C0CF304082 for ; Wed, 24 Apr 2013 11:40:04 -0700 (PDT) X-ASG-Debug-ID: 1366828802-04bdf02d1f59d850001-NocioJ Received: from e7.ny.us.ibm.com (e7.ny.us.ibm.com [32.97.182.137]) by cuda.sgi.com with ESMTP id FYLTy7F7FrqFRQOv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 24 Apr 2013 11:40:03 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.137 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] Received: from /spool/local by e7.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 24 Apr 2013 14:40:02 -0400 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] Received: from d01dlp01.pok.ibm.com (9.56.250.166) by e7.ny.us.ibm.com (192.168.1.107) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 24 Apr 2013 14:40:00 -0400 Received: from d01relay07.pok.ibm.com (d01relay07.pok.ibm.com [9.56.227.147]) by d01dlp01.pok.ibm.com (Postfix) with ESMTP id CF69938C801A for ; Wed, 24 Apr 2013 14:39:59 -0400 (EDT) Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay07.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3OIdr1033226902 for ; Wed, 24 Apr 2013 14:39:53 -0400 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3OIdrRl011665 for ; Wed, 24 Apr 2013 15:39:53 -0300 Received: from [9.41.106.170] ([9.41.106.170]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3OIdqVO011598; Wed, 24 Apr 2013 15:39:52 -0300 Subject: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN From: Chandra Seetharaman X-ASG-Orig-Subj: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN Reply-To: sekharan@us.ibm.com To: Dave Chinner Cc: Brian Foster , xfs@oss.sgi.com In-Reply-To: <20130424085546.GQ10481@dastard> References: <1366699138-24055-1-git-send-email-david@fromorbit.com> <5176833C.8070305@redhat.com> <20130423210226.GN10481@dastard> <20130424085546.GQ10481@dastard> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Wed, 24 Apr 2013 13:39:52 -0500 Message-ID: <1366828792.3762.32405.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13042418-5806-0000-0000-000020DC11B0 X-Barracuda-Connect: e7.ny.us.ibm.com[32.97.182.137] X-Barracuda-Start-Time: 1366828803 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com Hi Dave, Since this solution is for production environment, would it be valuable to have a sysctl variable to allow enabling/disabling XFS_WARN, as opposed to needing to recompile the module afresh ? regards, Chandra On Wed, 2013-04-24 at 18:55 +1000, Dave Chinner wrote: > From: Dave Chinner > > Running a CONFIG_XFS_DEBUG kernel in production environments is not > the best idea as it introduces significant overhead, can change > the behaviour of algorithms (such as allocation) to improve test > coverage, and (most importantly) panic the machine on non-fatal > errors. > > There are many cases where all we want to do is run a > kernel with more bounds checking enabled, such as is provided by the > ASSERT() statements throughout the code, but without all the > potential overhead and drawbacks. > > This patch converts all the ASSERT statements to evaluate as > WARN_ON(1) statements and hence if they fail dump a warning and a > stack trace to the log. This has minimal overhead and does not > change any algorithms, and will allow us to find strange "out of > bounds" problems more easily on production machines. > > There are a few places where assert statements contain debug only > code. These are converted to be debug-or-warn only code so that we > still get all the assert checks in the code. > > Signed-off-by: Dave Chinner > --- > Version 2: > - fix transaction accounting for superblock debug fields. > > fs/xfs/Kconfig | 13 +++++++++++++ > fs/xfs/mrlock.h | 12 ++++++------ > fs/xfs/xfs.h | 5 +++++ > fs/xfs/xfs_alloc_btree.c | 4 ++-- > fs/xfs/xfs_bmap_btree.c | 4 ++-- > fs/xfs/xfs_btree.h | 2 +- > fs/xfs/xfs_dir2_node.c | 4 ++-- > fs/xfs/xfs_ialloc_btree.c | 4 ++-- > fs/xfs/xfs_inode.c | 2 +- > fs/xfs/xfs_linux.h | 24 ++++++++++++++++++------ > fs/xfs/xfs_message.c | 8 ++++++++ > fs/xfs/xfs_message.h | 1 + > fs/xfs/xfs_trans.h | 4 ++-- > 13 files changed, 63 insertions(+), 24 deletions(-) > > diff --git a/fs/xfs/Kconfig b/fs/xfs/Kconfig > index cc33aaf..399e8ce 100644 > --- a/fs/xfs/Kconfig > +++ b/fs/xfs/Kconfig > @@ -69,6 +69,19 @@ config XFS_RT > > If unsure, say N. > > +config XFS_WARN > + bool "XFS Verbose Warnings" > + depends on XFS_FS && !XFS_DEBUG > + help > + Say Y here to get an XFS build with many additional warnings. > + It converts ASSERT checks to WARN, so will log any out-of-bounds > + conditions that occur that would otherwise be missed. It is much > + lighter weight than XFS_DEBUG and does not modify algorithms and will > + not cause the kernel to panic on non-fatal errors. > + > + However, similar to XFS_DEBUG, it is only advisable to use this if you > + are debugging a particular problem. > + > config XFS_DEBUG > bool "XFS Debugging support" > depends on XFS_FS > diff --git a/fs/xfs/mrlock.h b/fs/xfs/mrlock.h > index ff6a198..e3c92d1 100644 > --- a/fs/xfs/mrlock.h > +++ b/fs/xfs/mrlock.h > @@ -22,12 +22,12 @@ > > typedef struct { > struct rw_semaphore mr_lock; > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > int mr_writer; > #endif > } mrlock_t; > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > #define mrinit(mrp, name) \ > do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) > #else > @@ -46,7 +46,7 @@ static inline void mraccess_nested(mrlock_t *mrp, int subclass) > static inline void mrupdate_nested(mrlock_t *mrp, int subclass) > { > down_write_nested(&mrp->mr_lock, subclass); > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > mrp->mr_writer = 1; > #endif > } > @@ -60,7 +60,7 @@ static inline int mrtryupdate(mrlock_t *mrp) > { > if (!down_write_trylock(&mrp->mr_lock)) > return 0; > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > mrp->mr_writer = 1; > #endif > return 1; > @@ -68,7 +68,7 @@ static inline int mrtryupdate(mrlock_t *mrp) > > static inline void mrunlock_excl(mrlock_t *mrp) > { > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > mrp->mr_writer = 0; > #endif > up_write(&mrp->mr_lock); > @@ -81,7 +81,7 @@ static inline void mrunlock_shared(mrlock_t *mrp) > > static inline void mrdemote(mrlock_t *mrp) > { > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > mrp->mr_writer = 0; > #endif > downgrade_write(&mrp->mr_lock); > diff --git a/fs/xfs/xfs.h b/fs/xfs/xfs.h > index d8b11b7..a742c47 100644 > --- a/fs/xfs/xfs.h > +++ b/fs/xfs/xfs.h > @@ -24,6 +24,11 @@ > #define XFS_BUF_LOCK_TRACKING 1 > #endif > > +#ifdef CONFIG_XFS_WARN > +#define XFS_WARN 1 > +#endif > + > + > #include "xfs_linux.h" > > #endif /* __XFS_H__ */ > diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c > index b1ddef6..cbcd34b 100644 > --- a/fs/xfs/xfs_alloc_btree.c > +++ b/fs/xfs/xfs_alloc_btree.c > @@ -348,7 +348,7 @@ const struct xfs_buf_ops xfs_allocbt_buf_ops = { > }; > > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > STATIC int > xfs_allocbt_keys_inorder( > struct xfs_btree_cur *cur, > @@ -404,7 +404,7 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { > .init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur, > .key_diff = xfs_allocbt_key_diff, > .buf_ops = &xfs_allocbt_buf_ops, > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > .keys_inorder = xfs_allocbt_keys_inorder, > .recs_inorder = xfs_allocbt_recs_inorder, > #endif > diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c > index 061b45c..5eaaa4b 100644 > --- a/fs/xfs/xfs_bmap_btree.c > +++ b/fs/xfs/xfs_bmap_btree.c > @@ -769,7 +769,7 @@ const struct xfs_buf_ops xfs_bmbt_buf_ops = { > }; > > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > STATIC int > xfs_bmbt_keys_inorder( > struct xfs_btree_cur *cur, > @@ -809,7 +809,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { > .init_ptr_from_cur = xfs_bmbt_init_ptr_from_cur, > .key_diff = xfs_bmbt_key_diff, > .buf_ops = &xfs_bmbt_buf_ops, > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > .keys_inorder = xfs_bmbt_keys_inorder, > .recs_inorder = xfs_bmbt_recs_inorder, > #endif > diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h > index f932897..6302e9a 100644 > --- a/fs/xfs/xfs_btree.h > +++ b/fs/xfs/xfs_btree.h > @@ -190,7 +190,7 @@ struct xfs_btree_ops { > > const struct xfs_buf_ops *buf_ops; > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > /* check that k1 is lower than k2 */ > int (*keys_inorder)(struct xfs_btree_cur *cur, > union xfs_btree_key *k1, > diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c > index 5980f9b..33177c3 100644 > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -811,7 +811,7 @@ xfs_dir2_leafn_rebalance( > xfs_dir2_leaf_t *leaf1; /* first leaf structure */ > xfs_dir2_leaf_t *leaf2; /* second leaf structure */ > int mid; /* midpoint leaf index */ > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > int oldstale; /* old count of stale leaves */ > #endif > int oldsum; /* old total leaf count */ > @@ -831,7 +831,7 @@ xfs_dir2_leafn_rebalance( > leaf1 = blk1->bp->b_addr; > leaf2 = blk2->bp->b_addr; > oldsum = be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count); > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > oldstale = be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale); > #endif > mid = oldsum >> 1; > diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c > index bec344b..7b9c7be 100644 > --- a/fs/xfs/xfs_ialloc_btree.c > +++ b/fs/xfs/xfs_ialloc_btree.c > @@ -235,7 +235,7 @@ const struct xfs_buf_ops xfs_inobt_buf_ops = { > .verify_write = xfs_inobt_write_verify, > }; > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > STATIC int > xfs_inobt_keys_inorder( > struct xfs_btree_cur *cur, > @@ -273,7 +273,7 @@ static const struct xfs_btree_ops xfs_inobt_ops = { > .init_ptr_from_cur = xfs_inobt_init_ptr_from_cur, > .key_diff = xfs_inobt_key_diff, > .buf_ops = &xfs_inobt_buf_ops, > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > .keys_inorder = xfs_inobt_keys_inorder, > .recs_inorder = xfs_inobt_recs_inorder, > #endif > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 4f20165..4630d47 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -286,7 +286,7 @@ xfs_ilock_demote( > trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_); > } > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > int > xfs_isilocked( > xfs_inode_t *ip, > diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h > index 14e59d9..800f896 100644 > --- a/fs/xfs/xfs_linux.h > +++ b/fs/xfs/xfs_linux.h > @@ -293,22 +293,34 @@ static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y) > #define ASSERT_ALWAYS(expr) \ > (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) > > -#ifndef DEBUG > -#define ASSERT(expr) ((void)0) > +#ifdef DEBUG > +#define ASSERT(expr) \ > + (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) > > #ifndef STATIC > -# define STATIC static noinline > +# define STATIC noinline > #endif > > -#else /* DEBUG */ > +#else /* !DEBUG */ > + > +#ifdef XFS_WARN > > #define ASSERT(expr) \ > - (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) > + (unlikely(expr) ? (void)0 : asswarn(#expr, __FILE__, __LINE__)) > > #ifndef STATIC > -# define STATIC noinline > +# define STATIC static noinline > +#endif > + > +#else /* !DEBUG && !XFS_WARN */ > + > +#define ASSERT(expr) ((void)0) > + > +#ifndef STATIC > +# define STATIC static noinline > #endif > > +#endif /* XFS_WARN */ > #endif /* DEBUG */ > > #endif /* __XFS_LINUX__ */ > diff --git a/fs/xfs/xfs_message.c b/fs/xfs/xfs_message.c > index 331cd9f..9163dc1 100644 > --- a/fs/xfs/xfs_message.c > +++ b/fs/xfs/xfs_message.c > @@ -93,6 +93,14 @@ xfs_alert_tag( > } > > void > +asswarn(char *expr, char *file, int line) > +{ > + xfs_warn(NULL, "Assertion failed: %s, file: %s, line: %d", > + expr, file, line); > + WARN_ON(1); > +} > + > +void > assfail(char *expr, char *file, int line) > { > xfs_emerg(NULL, "Assertion failed: %s, file: %s, line: %d", > diff --git a/fs/xfs/xfs_message.h b/fs/xfs/xfs_message.h > index 76c8198..8540115 100644 > --- a/fs/xfs/xfs_message.h > +++ b/fs/xfs/xfs_message.h > @@ -57,6 +57,7 @@ do { \ > xfs_printk_ratelimited(xfs_debug, dev, fmt, ##__VA_ARGS__) > > extern void assfail(char *expr, char *f, int l); > +extern void asswarn(char *expr, char *f, int l); > > extern void xfs_hex_dump(void *p, int length); > > diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h > index cd29f61..a44dba5 100644 > --- a/fs/xfs/xfs_trans.h > +++ b/fs/xfs/xfs_trans.h > @@ -405,7 +405,7 @@ typedef struct xfs_trans { > int64_t t_res_fdblocks_delta; /* on-disk only chg */ > int64_t t_frextents_delta;/* superblock freextents chg*/ > int64_t t_res_frextents_delta; /* on-disk only chg */ > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > int64_t t_ag_freeblks_delta; /* debugging counter */ > int64_t t_ag_flist_delta; /* debugging counter */ > int64_t t_ag_btree_delta; /* debugging counter */ > @@ -433,7 +433,7 @@ typedef struct xfs_trans { > #define xfs_trans_get_block_res(tp) ((tp)->t_blk_res) > #define xfs_trans_set_sync(tp) ((tp)->t_flags |= XFS_TRANS_SYNC) > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > #define xfs_trans_agblocks_delta(tp, d) ((tp)->t_ag_freeblks_delta += (int64_t)d) > #define xfs_trans_agflist_delta(tp, d) ((tp)->t_ag_flist_delta += (int64_t)d) > #define xfs_trans_agbtree_delta(tp, d) ((tp)->t_ag_btree_delta += (int64_t)d) > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From bpm@sgi.com Wed Apr 24 14:13:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 B994829DFA for ; Wed, 24 Apr 2013 14:13:16 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 960828F8039; Wed, 24 Apr 2013 12:13:13 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 520F3500B4E; Wed, 24 Apr 2013 14:13:13 -0500 (CDT) Date: Wed, 24 Apr 2013 14:13:13 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 17/22] xfs: split remote attribute code out Message-ID: <20130424191313.GD29359@sgi.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-18-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-18-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Wed, Apr 03, 2013 at 04:11:27PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Adding CRC support to remote attributes adds a significant amount of > remote attribute specific code. Split the existing remote attribute > code out into it's own file so that all the relevant remote > attribute code is in a single, easy to find place. > > Signed-off-by: Dave Chinner Looks fine. From sandeen@sandeen.net Wed Apr 24 14:50:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EA23329DFA for ; Wed, 24 Apr 2013 14:50:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D51B18F8037 for ; Wed, 24 Apr 2013 12:50:02 -0700 (PDT) X-ASG-Debug-ID: 1366833001-04cbb057f557d060001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id XmNiomGiLoMmo5d2 for ; Wed, 24 Apr 2013 12:50:01 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 06B2A617EC82; Wed, 24 Apr 2013 14:50:00 -0500 (CDT) Message-ID: <51783768.5050508@sandeen.net> Date: Wed, 24 Apr 2013 14:50:00 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Michael Weissenbacher CC: xfs@oss.sgi.com Subject: Re: XFS Support in RHEL Server 6.4 x86_64 References: <5177B899.4000707@dermichi.com> X-ASG-Orig-Subj: Re: XFS Support in RHEL Server 6.4 x86_64 In-Reply-To: <5177B899.4000707@dermichi.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366833001 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129057 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/24/13 5:48 AM, Michael Weissenbacher wrote: > Hi List! > I was under the impression that XFS was officially supported by Red Hat > Enterprise Linux. > > During the installation i noticed that Anaconda wouldn't allow XFS as > root file system. Well, that's not a big problem for me. But after > installation i realized that they don't even include xfsprogs so that i > could do mkfs.xfs. Well, also not a big problem, i used the latest > tarball and compiled them myself. Which gets you into unsupported land I'm afraid. As others mentioned, it's an add-on product in RHEL6, available w/ a separate subscription. That subscription comes with official RHEL xfsprogs, and support. > But the big question now is: can anybody actually recommend using XFS on > stock RHEL? It does feel like being just a stepchild there. On the other > hand there seem be be quite a number of patches that were backported for > Red Hat's kernel and it does use delaylog by default (which IIRC wasn't > the default with a stock 2.6.32 Kernel). As Ric said, it's very much *not* a stepchild. :) -Eric > tia, > Michael > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From mazohistdd@associatedprinters.com Wed Apr 24 16:50:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7E2A329DFA for ; Wed, 24 Apr 2013 16:50:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6A6FA30404E for ; Wed, 24 Apr 2013 14:50:15 -0700 (PDT) X-ASG-Debug-ID: 1366840206-04cbb057f55850e0001-NocioJ Received: from p143974.vps (hosted-by.ihc.ru [46.254.18.243]) by cuda.sgi.com with ESMTP id L7zUJSgnYCc0rVJV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 24 Apr 2013 14:50:08 -0700 (PDT) X-Barracuda-Envelope-From: mazohistdd@associatedprinters.com X-Barracuda-Apparent-Source-IP: 46.254.18.243 Received: from Unknown (waynec12.lnk.telstra.net [110.142.163.253]) (authenticated bits=0) by p143974.vps (8.13.8/8.13.8) with ESMTP id r3OLnmfs015745; Thu, 25 Apr 2013 01:49:56 +0400 Message-ID: Reply-To: =?windows-1251?B?wuDr/vLt++Ug7u/l8OD26Og=?= From: =?windows-1251?B?wuDr/vLt++Ug7u/l8OD26Og=?= To: , , , , Subject: =?windows-1251?B?9/LuIO3u4u7j7iDiIPH05fDlIOLg6/7y7e7j?= =?windows-1251?B?7iDq7u3y8O7r/z8=?= Date: Wed, 24 Apr 2013 23:50:12 +0200 X-ASG-Orig-Subj: =?windows-1251?B?9/LuIO3u4u7j7iDiIPH05fDlIOLg6/7y7e7j?= =?windows-1251?B?7iDq7u3y8O7r/z8=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0A96_01CE4146.763034F0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Greylist: Sender succeeded SMTP AUTH authentication, not delayed by milter-greylist-3.0 (p143974.vps [46.254.18.243]); Thu, 25 Apr 2013 01:50:03 +0400 (MSK) X-Barracuda-Connect: hosted-by.ihc.ru[46.254.18.243] X-Barracuda-Start-Time: 1366840208 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129065 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_0A96_01CE4146.763034F0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C0=ED=EE=ED=F1 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=EE=E3=EE =EC=E5= =F0=EE=EF=F0=E8=FF=F2=E8=FF: =C0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =E2=EE=EF=F0=EE=F1=FB =E2=E0=EB=FE=F2=ED=EE= =E3=EE =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF =E8 =E2=E0=EB=FE=F2=ED=EE=E3= =EE =EA=EE=ED=F2=F0=EE=EB=FF =F1 =F3=F7=E5=F2=EE=EC =E8=E7=EC=E5=ED=E5=ED= =E8=E9 =E2 2=CEI=C7 =E3.=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3, I=E7 - I4 =EC=E0=FF 2=EEI=C7= =E3. =CE =F7=B8=EC(=EA=F0=E0=F2=EA=EE): - =C8=E7=EC=E5=ED=E5=ED=E8=E5 =F1=E8=F1=F2=E5=EC=FB =E2=E0=EB=FE=F2=ED=EE= =E3=EE =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF =EF=EE=F1=EB=E5 OI =FF=ED=E2= =E0=F0=FF 2=CE=EE8 =E3=EE=E4=E0. - =CF=EE=F0=FF=E4=EE=EA =EE=F2=EA=F0=FB=F2=E8=FF =E8 =E2=E5=E4=E5=ED=E8=FF= =F1=F7=E5=F2=EE=E2 =F0=E5=E7=E8=E4=E5=ED=F2=EE=E2 =E7=E0 =EF=F0=E5=E4=E5= =EB=E0=EC=E8 =F2=E5=F0=F0=E8=F2=EE=F0=E8=E8 =D0=D4. - =CF=F0=E0=E2=E8=EB=E0 =EE=F1=F3=F9=E5=F1=F2=E2=EB=E5=ED=E8=FF =F0=E5=E7= =E8=E4=E5=ED=F2=E0=EC=E8 =E2=E0=EB=FE=F2=ED=FB=F5 =EE=EF=E5=F0=E0=F6=E8=E9= =E7=E0 =F1=F7=E5=F2 =F1=F0=E5=E4=F1=F2=E2, =ED=E0=F5=EE=E4=FF=F9=E8=F5=F1= =FF =ED=E0 =F1=F7=E5=F2=E0=F5 =E7=E0 =F0=F3=E1=E5=E6=EE=EC. - =C2=E0=EB=FE=F2=ED=FB=E9 =EA=EE=ED=F2=F0=EE=EB=FC =EF=F0=E8 =EE=F1=F3=F9= =E5=F1=F2=E2=EB=E5=ED=E8=E8 =E2=E0=EB=FE=F2=ED=FB=F5 =EE=EF=E5=F0=E0=F6=E8= =E9, =F1=E2=FF=E7=E0=ED=ED=FB=F5 =F1 =E2=ED=E5=F8=ED=E5=F2=EE=F0=E3=EE=E2= =EE=E9 =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=FC=FE, =EF=EE=EB=F3=F7=E5=ED=E8=E5= =EC =E8 =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=E5=ED=E8=E5=EC =EA=F0=E5=E4=E8=F2=EE= =E2 =E8 =E7=E0=E9=EC=EE=E2. - =CE=F4=EE=F0=EC=EB=E5=ED=E8=E5 =EF=E0=F1=EF=EE=F0=F2=EE=E2 =F1=E4=E5=EB= =EE=EA =E8 =EF=F0=E5=E4=F1=F2=E0=E2=EB=E5=ED=E8=E5=EC =EF=EE=E4=F2=E2=E5=F0= =E6=E4=E0=FE=F9=E8=F5 =E4=EE=EA=F3=EC=E5=ED=F2=EE=E2. - =C2=E0=EB=FE=F2=ED=FB=E9 =EA=EE=ED=F2=F0=EE=EB=FC, =EE=F1=F3=F9=E5=F1=F2= =E2=EB=FF=E5=EC=FB=E9 =F1 =F3=F7=E0=F1=F2=E8=E5=EC =F2=E0=EC=EE=E6=E5=ED=ED= =FB=F5 =E8 =ED=E0=EB=EE=E3=EE=E2=FB=F5 =EE=F0=E3=E0=ED=EE=E2. - =C0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED=E0=FF =EE=F2=E2=E5=F2=F1=F2=E2= =E5=ED=ED=EE=F1=F2=FC =E7=E0 =ED=E0=F0=F3=F8=E5=ED=E8=E5 =E2=E0=EB=FE=F2=ED= =EE=E3=EE =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=E0. =C2 =F5=EE=E4=E5 =F1=E5=EC=E8=ED=E0=F0=E0 =E2=E5=E4=F3=F9=E8=E5 =F1=EF=E5= =F6=E8=E0=EB=E8=F1=F2=FB =F0=E0=F1=F1=EC=EE=F2=F0=FF=F2 =F1=EF=EE=F1=EE=E1= =FB =F0=E5=F8=E5=ED=E8=FF =F1=EB=EE=E6=ED=FB=F5 =E2=EE=EF=F0=EE=F1=EE=E2 = =E2 =F1=F4=E5=F0=E5 =E2=E0=EB=FE=F2=ED=EE=E3=EE =F0=E5=E3=F3=EB=E8=F0=EE=E2= =E0=ED=E8=FF =E8 =EA=EE=ED=F2=F0=EE=EB=FF, =EF=F0=E0=E2=EE=EF=F0=E8=EC=E5= =ED=E8=F2=E5=EB=FC=ED=F3=FE =E8 =F1=F3=E4=E5=E1=ED=F3=FE =EF=F0=E0=EA=F2=E8= =EA=F3, =E4=E0=E4=F3=F2 =E0=ED=E0=EB=E8=E7 =EF=F0=E5=E4=EF=F0=E8=ED=E8=EC= =E0=F2=E5=EB=FC=F1=EA=E8=F5 =F0=E8=F1=EA=EE=E2 =E8 =EF=EE=EA=E0=E6=F3=F2 = =EF=F3=F2=E8 =EE=EF=F2=E8=EC=E8=E7=E0=F6=E8=E8 =E4=E5=E9=F1=F2=E2=E8=E9 =E2= =F1=EF=EE=F0=ED=FB=F5 =F1=E8=F2=F3=E0=F6=E8=FF=F5.=20 =20 =D0=C5=C3=C8=D1=D2=D0=C0=D6=C8=DF =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3 [ = =EA=EE=E4 =D1=CF=E1 ] 9 8..7 * 8=E7 I7 =20 ------=_NextPart_000_0A96_01CE4146.763034F0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C0=ED=EE=ED=F1 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=EE=E3=EE = =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=FF:
=C0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =E2=EE= =EF=F0=EE=F1=FB =E2=E0=EB=FE=F2=ED=EE=E3=EE=20 =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF =E8 =E2=E0=EB=FE=F2=ED=EE=E3=EE =EA= =EE=ED=F2=F0=EE=EB=FF =F1 =F3=F7=E5=F2=EE=EC =E8=E7=EC=E5=ED=E5=ED=E8=E9 = =E2=20 2=CEI=C7 =E3.
=D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3,=20 I=E7 - I4 =EC=E0=FF=20 2=EEI=C7=E3.
 
=CE =F7=B8=EC(=EA=F0=E0=F2=EA=EE):
 
- =C8=E7=EC=E5=ED=E5=ED=E8=E5 =F1=E8=F1=F2=E5=EC=FB =E2=E0=EB=FE=F2=ED= =EE=E3=EE =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF =EF=EE=F1=EB=E5=20 OI =FF=ED=E2=E0=F0=FF=20 2=CE=EE8 =E3=EE=E4=E0.
 
- =CF=EE=F0=FF=E4=EE=EA =EE=F2=EA=F0=FB=F2=E8=FF =E8 =E2=E5=E4=E5=ED= =E8=FF =F1=F7=E5=F2=EE=E2 =F0=E5=E7=E8=E4=E5=ED=F2=EE=E2 =E7=E0 =EF=F0=E5= =E4=E5=EB=E0=EC=E8 =F2=E5=F0=F0=E8=F2=EE=F0=E8=E8=20 =D0=D4.
 
- =CF=F0=E0=E2=E8=EB=E0 =EE=F1=F3=F9=E5=F1=F2=E2=EB=E5=ED=E8=FF =F0=E5= =E7=E8=E4=E5=ED=F2=E0=EC=E8 =E2=E0=EB=FE=F2=ED=FB=F5 =EE=EF=E5=F0=E0=F6=E8= =E9 =E7=E0 =F1=F7=E5=F2 =F1=F0=E5=E4=F1=F2=E2,=20 =ED=E0=F5=EE=E4=FF=F9=E8=F5=F1=FF =ED=E0 =F1=F7=E5=F2=E0=F5 =E7=E0 =F0=F3= =E1=E5=E6=EE=EC.
 
- =C2=E0=EB=FE=F2=ED=FB=E9 =EA=EE=ED=F2=F0=EE=EB=FC =EF=F0=E8 =EE=F1= =F3=F9=E5=F1=F2=E2=EB=E5=ED=E8=E8 =E2=E0=EB=FE=F2=ED=FB=F5 =EE=EF=E5=F0=E0= =F6=E8=E9, =F1=E2=FF=E7=E0=ED=ED=FB=F5 =F1=20 =E2=ED=E5=F8=ED=E5=F2=EE=F0=E3=EE=E2=EE=E9 =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1= =F2=FC=FE, =EF=EE=EB=F3=F7=E5=ED=E8=E5=EC =E8 =EF=F0=E5=E4=EE=F1=F2=E0=E2= =EB=E5=ED=E8=E5=EC =EA=F0=E5=E4=E8=F2=EE=E2 =E8=20 =E7=E0=E9=EC=EE=E2.
 
- =CE=F4=EE=F0=EC=EB=E5=ED=E8=E5 =EF=E0=F1=EF=EE=F0=F2=EE=E2 =F1=E4=E5= =EB=EE=EA =E8 =EF=F0=E5=E4=F1=F2=E0=E2=EB=E5=ED=E8=E5=EC =EF=EE=E4=F2=E2=E5= =F0=E6=E4=E0=FE=F9=E8=F5=20 =E4=EE=EA=F3=EC=E5=ED=F2=EE=E2.
 
- =C2=E0=EB=FE=F2=ED=FB=E9 =EA=EE=ED=F2=F0=EE=EB=FC, =EE=F1=F3=F9=E5= =F1=F2=E2=EB=FF=E5=EC=FB=E9 =F1 =F3=F7=E0=F1=F2=E8=E5=EC =F2=E0=EC=EE=E6=E5= =ED=ED=FB=F5 =E8 =ED=E0=EB=EE=E3=EE=E2=FB=F5=20 =EE=F0=E3=E0=ED=EE=E2.
 
- =C0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED=E0=FF =EE=F2=E2=E5=F2=F1= =F2=E2=E5=ED=ED=EE=F1=F2=FC =E7=E0 =ED=E0=F0=F3=F8=E5=ED=E8=E5 =E2=E0=EB=FE= =F2=ED=EE=E3=EE=20 =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=E0.
 
 
=C2 =F5=EE=E4=E5 =F1=E5=EC=E8=ED=E0=F0=E0 =E2=E5=E4=F3=F9=E8=E5 =F1=EF= =E5=F6=E8=E0=EB=E8=F1=F2=FB =F0=E0=F1=F1=EC=EE=F2=F0=FF=F2 =F1=EF=EE=F1=EE= =E1=FB =F0=E5=F8=E5=ED=E8=FF =F1=EB=EE=E6=ED=FB=F5=20 =E2=EE=EF=F0=EE=F1=EE=E2 =E2 =F1=F4=E5=F0=E5 =E2=E0=EB=FE=F2=ED=EE=E3=EE = =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF =E8 =EA=EE=ED=F2=F0=EE=EB=FF, =EF= =F0=E0=E2=EE=EF=F0=E8=EC=E5=ED=E8=F2=E5=EB=FC=ED=F3=FE =E8=20 =F1=F3=E4=E5=E1=ED=F3=FE =EF=F0=E0=EA=F2=E8=EA=F3, =E4=E0=E4=F3=F2 =E0=ED= =E0=EB=E8=E7 =EF=F0=E5=E4=EF=F0=E8=ED=E8=EC=E0=F2=E5=EB=FC=F1=EA=E8=F5 =F0= =E8=F1=EA=EE=E2 =E8 =EF=EE=EA=E0=E6=F3=F2 =EF=F3=F2=E8=20 =EE=EF=F2=E8=EC=E8=E7=E0=F6=E8=E8 =E4=E5=E9=F1=F2=E2=E8=E9 =E2 =F1=EF=EE=F0= =ED=FB=F5 =F1=E8=F2=F3=E0=F6=E8=FF=F5.
 
=D0=C5=C3=C8=D1=D2=D0=C0=D6=C8=DF =EF=EE =F2=E5=EB=E5=F4=EE= =ED=F3=20 [ =EA=EE=E4 =D1=CF=E1 ] 9 8..7 * 8=E7 I7
------=_NextPart_000_0A96_01CE4146.763034F0-- From david@fromorbit.com Wed Apr 24 17:58:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D2C0729DFA for ; Wed, 24 Apr 2013 17:58:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B09FB8F8033 for ; Wed, 24 Apr 2013 15:58:39 -0700 (PDT) X-ASG-Debug-ID: 1366844317-04cb6c2c1c5aa9b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id qXmGOoEleIBuPdvj for ; Wed, 24 Apr 2013 15:58:38 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 Received: from ppp121-44-168-209.lns20.syd7.internode.on.net (HELO dastard) ([121.44.168.209]) by ipmail06.adl6.internode.on.net with ESMTP; 25 Apr 2013 08:28:22 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UV8dp-0000de-Ks; Thu, 25 Apr 2013 08:58:21 +1000 Date: Thu, 25 Apr 2013 08:58:21 +1000 From: Dave Chinner To: Chandra Seetharaman Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN Message-ID: <20130424225821.GV10481@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN References: <1366699138-24055-1-git-send-email-david@fromorbit.com> <5176833C.8070305@redhat.com> <20130423210226.GN10481@dastard> <20130424085546.GQ10481@dastard> <1366828792.3762.32405.camel@chandra-dt.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1366828792.3762.32405.camel@chandra-dt.ibm.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: 1366844317 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 24, 2013 at 01:39:52PM -0500, Chandra Seetharaman wrote: > Hi Dave, > > Since this solution is for production environment, would it be valuable > to have a sysctl variable to allow enabling/disabling XFS_WARN, as > opposed to needing to recompile the module afresh ? The idea is that distros enable it on the debug kernel packages rather than using CONFIG_XFS_DEBUG=y. Hence if someone has a problem, they just install the debug kernel and they get all this additional checking. There are roughly 1700 ASSERT statements in the XFS code, so compiling them in unconditionally is a lot of extra code. Adding a sysctl to make them conditional adds as many branches into the code than in 99.99999% of calls are never going to evaluate as true. The convenience of a sysctl is more than outweighed by the additional overhead for the majortiy of people that don't need to diagnose problems on their system. Hence I don't think the overhead of unconditionally compiling in ASSERT checks is worth while for the majority of users, especially as most distros ship a debug kernel for exactly this purpose.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Apr 24 19:21:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D7F9829DFA for ; Wed, 24 Apr 2013 19:21:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 65104AC002 for ; Wed, 24 Apr 2013 17:21:20 -0700 (PDT) X-ASG-Debug-ID: 1366849279-04cbb057f858ead0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id nqXzoZGMVt7gTtup for ; Wed, 24 Apr 2013 17:21:19 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 26C716130FEA; Wed, 24 Apr 2013 19:21:19 -0500 (CDT) Message-ID: <517876FD.1000508@sandeen.net> Date: Wed, 24 Apr 2013 19:21:17 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Dave Chinner CC: Chandra Seetharaman , Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN References: <1366699138-24055-1-git-send-email-david@fromorbit.com> <5176833C.8070305@redhat.com> <20130423210226.GN10481@dastard> <20130424085546.GQ10481@dastard> <1366828792.3762.32405.camel@chandra-dt.ibm.com> <20130424225821.GV10481@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN In-Reply-To: <20130424225821.GV10481@dastard> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366849279 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129075 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/24/13 5:58 PM, Dave Chinner wrote: > On Wed, Apr 24, 2013 at 01:39:52PM -0500, Chandra Seetharaman wrote: >> Hi Dave, >> >> Since this solution is for production environment, would it be valuable >> to have a sysctl variable to allow enabling/disabling XFS_WARN, as >> opposed to needing to recompile the module afresh ? > > The idea is that distros enable it on the debug kernel packages > rather than using CONFIG_XFS_DEBUG=y. Hence if someone has a > problem, they just install the debug kernel and they get all this > additional checking. > > There are roughly 1700 ASSERT statements in the XFS code, so > compiling them in unconditionally is a lot of extra code. Adding a > sysctl to make them conditional adds as many branches into the code > than in 99.99999% of calls are never going to evaluate as true. The > convenience of a sysctl is more than outweighed by the additional > overhead for the majortiy of people that don't need to diagnose > problems on their system. > > Hence I don't think the overhead of unconditionally compiling in > ASSERT checks is worth while for the majority of users, especially > as most distros ship a debug kernel for exactly this purpose.... I agree. kernel-debug, or whatever your distro does similarly, is the right use for this code. -Eric > Cheers, > > Dave. > From yongtaofu@gmail.com Wed Apr 24 19:48:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4865D29DFA for ; Wed, 24 Apr 2013 19:48:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D0ED5AC002 for ; Wed, 24 Apr 2013 17:48:28 -0700 (PDT) X-ASG-Debug-ID: 1366850906-04bdf02d1d5b7330001-NocioJ Received: from mail-ie0-f178.google.com (mail-ie0-f178.google.com [209.85.223.178]) by cuda.sgi.com with ESMTP id FAUyQTPDxKlzS86w (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 24 Apr 2013 17:48:27 -0700 (PDT) X-Barracuda-Envelope-From: yongtaofu@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] Received: by mail-ie0-f178.google.com with SMTP id aq17so2891440iec.37 for ; Wed, 24 Apr 2013 17:48:26 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=LCp3LxNv8b6z0mbhHd7c68qIn+8yJe/kOv6hR4LjX9E=; b=ZnEvJWKbOfViJ9gU8Sz8TYbWZOdINPHxD00AQXScOUrkM4CJZV7IgTPRg1Uv0n8d49 e3G0Isp+YvAgaoBiVazpINWom1KIRt2zkzAlC+lPZDGwuSG/UoqHmy/vkPq7cnKIhxpT yP1mQQ2eM/GJA+lBsWSZMGE6HtczEaKwl3pjukMeojjpO21VoKjHpwXdRAwiCYGqeL8n OxD9/O/qHKSdFRkZWfjs1DpE/HWbHgGx62DZsBuXL/ZoK6SrzDvxtf+GUxotJkQ4oibZ k2W44lx0V6SMofiJW5nh9LR0w/RQkOdd1dDgBynX1rtmhk8LNDe4jEr8Tzba+kpX4AYR FP3Q== MIME-Version: 1.0 X-Received: by 10.42.56.196 with SMTP id a4mr6594276ich.35.1366850906505; Wed, 24 Apr 2013 17:48:26 -0700 (PDT) Received: by 10.42.173.2 with HTTP; Wed, 24 Apr 2013 17:48:26 -0700 (PDT) In-Reply-To: References: <516C89DF.4070904@redhat.com> <517596BA.3060408@sandeen.net> <20130423000835.GL30622@dastard> <5175DB63.6030501@sandeen.net> <20130424090213.GT10481@dastard> Date: Thu, 25 Apr 2013 08:48:26 +0800 Message-ID: Subject: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging From: =?GB2312?B?t/vTwMzO?= X-ASG-Orig-Subj: Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging To: Dave Chinner Cc: Eric Sandeen , Brian Foster , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=90e6ba3fcee3be4aa904db24c6e8 X-Barracuda-Connect: mail-ie0-f178.google.com[209.85.223.178] X-Barracuda-Start-Time: 1366850906 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.2.129075 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 --90e6ba3fcee3be4aa904db24c6e8 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: quoted-printable Sorry I make it wrong, I'll change it a little bit and test again, thank you. 2013/4/24 =B7=FB=D3=C0=CC=CE > Dear Eric and Dave, > The xfs shutdown seems go away however one of our server report the > following error it make glusterfsd hang again. Is this just related to hi= gh > load? Or the same issue with different behavior after change the vfs. > Apr 24 12:35:07 10 kernel: [] > system_call_fastpath+0x16/0x1b > Apr 24 12:37:07 10 kernel: INFO: task glusterfsd:5835 blocked for more > than 120 seconds. > Apr 24 12:37:07 10 kernel: "echo 0 > > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Apr 24 12:37:07 10 kernel: glusterfsd D 0000000000000003 0 > 5835 1 0x00000080 > Apr 24 12:37:07 10 kernel: ffff88100ed77a28 0000000000000082 > 0000000000000000 ffff8818e843cdd8 > Apr 24 12:37:07 10 kernel: ffff8810177c1bc0 ffff8818e8422ea0 > 0000000000004004 ffff882019453000 > Apr 24 12:37:07 10 kernel: ffff88101609b098 ffff88100ed77fd8 > 000000000000fb88 ffff88101609b098 > Apr 24 12:37:07 10 kernel: Call Trace: > Apr 24 12:37:07 10 kernel: [] > schedule_timeout+0x215/0x2e0 > Apr 24 12:37:07 10 kernel: [] ? > xfs_da_do_buf+0x618/0x770 [xfs] > Apr 24 12:37:07 10 kernel: [] __down+0x72/0xb0 > Apr 24 12:37:07 10 kernel: [] ? > _xfs_buf_find+0x102/0x280 [xfs] > Apr 24 12:37:07 10 kernel: [] down+0x41/0x50 > Apr 24 12:37:07 10 kernel: [] xfs_buf_lock+0x53/0x110 > [xfs] > Apr 24 12:37:07 10 kernel: [] _xfs_buf_find+0x102/0x280 > [xfs] > Apr 24 12:37:07 10 kernel: [] xfs_buf_get+0x6b/0x1a0 > [xfs] > Apr 24 12:37:07 10 kernel: [] xfs_buf_read+0x2c/0x100 > [xfs] > Apr 24 12:37:07 10 kernel: [] > xfs_trans_read_buf+0x1f8/0x400 [xfs] > Apr 24 12:37:07 10 kernel: [] xfs_read_agi+0x74/0x100 > [xfs] > Apr 24 12:37:07 10 kernel: [] xfs_iunlink+0x4b/0x170 > [xfs] > Apr 24 12:37:07 10 kernel: [] ? current_fs_time+0x27/0x= 30 > Apr 24 12:37:07 10 kernel: [] ? > xfs_trans_ichgtime+0x27/0xa0 [xfs] > Apr 24 12:37:07 10 kernel: [] xfs_droplink+0x5b/0x70 > [xfs] > Apr 24 12:37:07 10 kernel: [] xfs_remove+0x27e/0x3a0 > [xfs] > Apr 24 12:37:07 10 kernel: [] ? > generic_permission+0x5c/0xb0 > Apr 24 12:37:07 10 kernel: [] xfs_vn_unlink+0x48/0x90 > [xfs] > Apr 24 12:37:07 10 kernel: [] vfs_unlink+0x9f/0xe0 > Apr 24 12:37:07 10 kernel: [] ? lookup_hash+0x3a/0x50 > Apr 24 12:37:07 10 kernel: [] do_unlinkat+0x183/0x1c0 > Apr 24 12:37:07 10 kernel: [] ? sys_newstat+0x36/0x50 > Apr 24 12:37:07 10 kernel: [] sys_unlink+0x16/0x20 > Apr 24 12:37:07 10 kernel: [] > system_call_fastpath+0x16/0x1b > . > > BTW: > I use kernel 279.19.1 > 2675 mutex_lock(&inode->i_mutex); > 2676 /* Make sure we don't allow creating hardlink to an unlinked > file */ > 2677 if (inode->i_nlink =3D=3D 0) > 2678 error =3D -ENOENT; > 2679 else > 2680 vfs_dq_init(dir); > 2681 error =3D dir->i_op->link(old_dentry, dir, new_dentr= y); > 2682 mutex_unlock(&inode->i_mutex); > > Thank you. > > > 2013/4/24 Dave Chinner > >> On Mon, Apr 22, 2013 at 07:52:51PM -0500, Eric Sandeen wrote: >> > On 4/22/13 7:08 PM, Dave Chinner wrote: >> > > On Mon, Apr 22, 2013 at 02:59:54PM -0500, Eric Sandeen wrote: >> > >> On 4/15/13 6:14 PM, Brian Foster wrote: >> > >>> Hi, >> > >>> >> > >>> Thanks for the data in the previous thread: >> > >>> >> > >>> http://oss.sgi.com/archives/xfs/2013-04/msg00327.html >> > >>> >> > >>> I'm spinning off a new thread specifically for this because the >> original >> > >>> thread is already too large and scattered to track. As Eric stated= , >> > >>> please try to keep data contained in as few messages as possible. >> > >>> >> > >> >> > >> Well, it's always simple in the end. It just took a lot of debuggi= ng >> > >> to figure out what was happening - we do appreciate your help with >> that! >> > >> >> > >> We were able to create a local reproducer, and it looks like >> > >> this patch fixes things: >> > >> >> > >> commit aae8a97d3ec30788790d1720b71d76fd8eb44b73 >> > >> Author: Aneesh Kumar K.V >> > >> Date: Sat Jan 29 18:43:27 2011 +0530 >> > >> >> > >> fs: Don't allow to create hardlink for deleted file >> > > >> > > Good find Eric - great work on the reproducer script. >> > > >> > > FWIW, can you confirm that a debug kernel assert fails >> > > with a non-zero link count in xfs_bumplink() with your test case? >> > > >> > > int >> > > xfs_bumplink( >> > > xfs_trans_t *tp, >> > > xfs_inode_t *ip) >> > > { >> > > xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG); >> > > >> > >>>>>> ASSERT(ip->i_d.di_nlink > 0); >> > >> > Yep, it does, I put a printk in there when I was testing >> > and it fired. >> > >> > Guess we should have tested a debug xfs right off the bat ;) >> >> Perhaps, but that may have changed the timing sufficiently to make >> the race go away. What we really needed was a way to just turn the >> assert into a WARN_ON() without all the other debug code like we've >> previously talked about. So, rather than talk about it again, I >> posted patches to do this.... >> >> > > ip->i_d.di_nlink++; >> > > inc_nlink(VFS_I(ip)); >> > > >> > > If it does, we should consider this a in-memory corruption case and >> > > return and trigger a shutdown here.... >> > >> > I suppose that makes sense, it'd be a much less cryptic failure for >> > something that will fail soon anyway. >> >> Exactly. >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >> > > > > -- > =B7=FB=D3=C0=CC=CE > --=20 =B7=FB=D3=C0=CC=CE --90e6ba3fcee3be4aa904db24c6e8 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
Sorry I make it wrong, I'll change it a little bi= t and test again, thank you. 


=
2013/4/24 =B7=FB=D3=C0=CC=CE &= lt;yongtaofu@gmail= .com>
Dear Er= ic and Dave,
The xfs shutdown seems go away however one of our ser= ver report the following error it make glusterfsd hang again. Is this just = related to high load? Or the same issue with different behavior after chang= e the vfs.
Apr 24 12:35:07 10 kernel: [<ffffffff8100b072>] system_call_fastpath+= 0x16/0x1b
Apr 24 12:37:07 10 kernel: INFO: task glusterfsd:5835 blocked = for more than 120 seconds.
Apr 24 12:37:07 10 kernel: "echo 0 > = /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Apr 24 12:37:07 10 kernel: glusterfsd    D 0000000000000003&= nbsp;    0  5835      1 0x0000= 0080
Apr 24 12:37:07 10 kernel: ffff88100ed77a28 0000000000000082 000000= 0000000000 ffff8818e843cdd8
Apr 24 12:37:07 10 kernel: ffff8810177c1bc0 = ffff8818e8422ea0 0000000000004004 ffff882019453000
Apr 24 12:37:07 10 kernel: ffff88101609b098 ffff88100ed77fd8 000000000000fb= 88 ffff88101609b098
Apr 24 12:37:07 10 kernel: Call Trace:
Apr 24 12:= 37:07 10 kernel: [<ffffffff814eaad5>] schedule_timeout+0x215/0x2e0 Apr 24 12:37:07 10 kernel: [<ffffffffa02a4978>] ? xfs_da_do_buf+0x618= /0x770 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffff814eb9f2>] __dow= n+0x72/0xb0
Apr 24 12:37:07 10 kernel: [<ffffffffa02daae2>] ? _xfs= _buf_find+0x102/0x280 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffff810967f1>] down+0x41/0x50
Apr= 24 12:37:07 10 kernel: [<ffffffffa02da923>] xfs_buf_lock+0x53/0x110 = [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02daae2>] _xfs_buf_fin= d+0x102/0x280 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02daccb>] xfs_buf_get+0x6b/0x1a= 0 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02db33c>] xfs_buf_re= ad+0x2c/0x100 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02d0f88>= ] xfs_trans_read_buf+0x1f8/0x400 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02b3774>] xfs_read_agi+0x74/0x1= 00 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02b999b>] xfs_iunli= nk+0x4b/0x170 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffff81070f97>= ] ? current_fs_time+0x27/0x30
Apr 24 12:37:07 10 kernel: [<ffffffffa02d1737>] ? xfs_trans_ichgtime+= 0x27/0xa0 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02d1a8b>] xf= s_droplink+0x5b/0x70 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffffa02d3= 42e>] xfs_remove+0x27e/0x3a0 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffff8118215c>] ? generic_permission+= 0x5c/0xb0
Apr 24 12:37:07 10 kernel: [<ffffffffa02e0da8>] xfs_vn_u= nlink+0x48/0x90 [xfs]
Apr 24 12:37:07 10 kernel: [<ffffffff81183d6f&g= t;] vfs_unlink+0x9f/0xe0
Apr 24 12:37:07 10 kernel: [<ffffffff81182aaa>] ? lookup_hash+0x3a/0x= 50
Apr 24 12:37:07 10 kernel: [<ffffffff811862a3>] do_unlinkat+0x1= 83/0x1c0
Apr 24 12:37:07 10 kernel: [<ffffffff8117b876>] ? sys_new= stat+0x36/0x50
Apr 24 12:37:07 10 kernel: [<ffffffff811862f6>] sys_unlink+0x16/0x20<= br>Apr 24 12:37:07 10 kernel: [<ffffffff8100b072>] system_call_fastpa= th+0x16/0x1b
.

BTW:
I use kernel 279.19.1
2675         mutex_lock(&inode-= >i_mutex);
2676         /* Make sure we don= 9;t allow creating hardlink to an unlinked file */
2677   = ;      if (inode->i_nlink =3D=3D 0)
2678&nbs= p;            &= nbsp;   error =3D  -ENOENT;
2679    &= nbsp;    else
2680      &nb= sp;          vfs_dq_init(dir);=
2681            = ;     error =3D dir->i_op->link(old_dentry, dir, = new_dentry);
2682         mutex_= unlock(&inode->i_mutex);

Thank you.


2013/4/24 Dave Chinner <david@fromorbit.com>
On Mon, Apr 22, 2013 at 07:52:51PM -0500, Eric Sandeen wrote:
> On 4/22/13 7:08 PM, Dave Chinner wrote:
> > On Mon, Apr 22, 2013 at 02:59:54PM -0500, Eric Sandeen wrote:
> >> On 4/15/13 6:14 PM, Brian Foster wrote:
> >>> Hi,
> >>>
> >>> Thanks for the data in the previous thread:
> >>>
> >>> http://oss.sgi.com/archives/xfs/2013-04/msg00327= .html
> >>>
> >>> I'm spinning off a new thread specifically for this b= ecause the original
> >>> thread is already too large and scattered to track. As Er= ic stated,
> >>> please try to keep data contained in as few messages as p= ossible.
> >>>
> >>
> >> Well, it's always simple in the end.  It just took a= lot of debugging
> >> to figure out what was happening - we do appreciate your help= with that!
> >>
> >> We were able to create a local reproducer, and it looks like<= br> > >> this patch fixes things:
> >>
> >> commit aae8a97d3ec30788790d1720b71d76fd8eb44b73
> >> Author: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>= ;
> >> Date:   Sat Jan 29 18:43:27 2011 +0530
> >>
> >>     fs: Don't allow to create hardlink for dele= ted file
> >
> > Good find Eric - great work on the reproducer script.
> >
> > FWIW, can you confirm that a debug kernel assert fails
> > with a non-zero link count in xfs_bumplink() with your test case?=
> >
> > int
> > xfs_bumplink(
> >         xfs_trans_t *tp,
> >         xfs_inode_t *ip)
> > {
> >         xfs_trans_ichgtime(tp, ip, XFS_ICHGTI= ME_CHG);
> >
> >>>>>>   ASSERT(ip->i_d.di_nlink > 0); >
> Yep, it does, I put a printk in there when I was testing
> and it fired.
>
> Guess we should have tested a debug xfs right off the bat ;)

Perhaps, but that may have changed the timing sufficiently to m= ake
the race go away. What we really needed was a way to just turn the
assert into a WARN_ON() without all the other debug code like we've
previously talked about. So, rather than talk about it again, I
posted patches to do this....

> >         ip->i_d.di_nlink++;
> >         inc_nlink(VFS_I(ip));
> >
> > If it does, we should consider this a in-memory corruption case a= nd
> > return and trigger a shutdown here....
>
> I suppose that makes sense, it'd be a much less cryptic failure fo= r
> something that will fail soon anyway.

Exactly.

Cheers,

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



--
=B7=FB=D3=C0=CC=CE



--
=B7=FB=D3=C0= =CC=CE
--90e6ba3fcee3be4aa904db24c6e8-- From service-client@espriv05.com Thu Apr 25 00:09:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.6 required=5.0 tests=HTML_IMAGE_RATIO_06, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,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 2B9627CBF for ; Thu, 25 Apr 2013 00:09:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1846F304059 for ; Wed, 24 Apr 2013 22:08:56 -0700 (PDT) X-ASG-Debug-ID: 1366866533-04cb6c6e2b49c560001-NocioJ Received: from s2.espriv05.com (s2.espriv05.com [178.32.20.8]) by cuda.sgi.com with ESMTP id vlnZElclNwrbF9b5 for ; Wed, 24 Apr 2013 22:08:53 -0700 (PDT) X-Barracuda-Envelope-From: service-client@espriv05.com X-Barracuda-Apparent-Source-IP: 178.32.20.8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=espriv05.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@espriv05.com; bh=Am9GweaqpxIsSlMagMp2coqzNwSF08Yc8PK3OMdCYXk=; b=SyJMoXYA2huXFWulIfiXot1kKrynW5yw1svJB6+GW5K/Ur86Xvde6iVykYMqt/Utn722OJ8baYYW D/Ua5ygWZVJx0tpkq6ijYl0vVUIW/sqPm7s7/jgtYW0IUvvj94xwucnSEvEQFBBzhq88JsYrlVMk vPND3Fkg66u4IZ6YSxA= From: Tati.fr par Espace Pri X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 40753 X-EN-uuid: 1005-100540753-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Des milliers de robes a moins de 10 euros MIME-Version: 1.0 X-ASG-Orig-Subj: Des milliers de robes a moins de 10 euros List-Unsubscribe: http://track.espriv05.com/V7vhtpuuk155KHcywmpS3OEheiAVDlaHYCD0RouR94Y.html, Content-Type: multipart/alternative; boundary=009a86566daf23b8f1217714ff935e94 Message-ID: <0.0.8.6E8.1CE4172852C192A.0@s2.espriv05.com> Date: Thu, 25 Apr 2013 07:05:35 +0200 X-Barracuda-Connect: s2.espriv05.com[178.32.20.8] X-Barracuda-Start-Time: 1366866533 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.25 X-Barracuda-Spam-Status: No, SCORE=0.25 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, HTML_IMAGE_RATIO_06, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129093 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 MIME_HTML_MOSTLY BODY: Multipart message mostly text/html MIME 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary --009a86566daf23b8f1217714ff935e94 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --009a86566daf23b8f1217714ff935e94 Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit News - TATI

Tati.FrBoutique CadeauxParrainage
FEMMEHOMMEENFANTCHAUSSURESMAISONMEUBLESMARIAGETATI OR
15 000 robes à 9,99 eurosLa robe bustier
Les héros de vos enfants
La piscine gonflable

Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From mw@dermichi.com Thu Apr 25 02:31:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 65C1629DFA for ; Thu, 25 Apr 2013 02:31:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 52F7B304051 for ; Thu, 25 Apr 2013 00:31:09 -0700 (PDT) X-ASG-Debug-ID: 1366875066-04cb6c747113570001-NocioJ Received: from firestarter.dermichi.com (firestarter.dermichi.com [194.177.153.153]) by cuda.sgi.com with ESMTP id EQ2HeMiG8xhuxjlC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 25 Apr 2013 00:31:07 -0700 (PDT) X-Barracuda-Envelope-From: mw@dermichi.com X-Barracuda-Apparent-Source-IP: 194.177.153.153 Received: from noclinksys.net4you.net ([194.177.153.180] helo=[192.168.34.189]) by firestarter.dermichi.com with esmtpsa (TLSv1:DHE-RSA-CAMELLIA256-SHA:256) (Exim 4.80.1) (envelope-from ) id 1UVGe2-0002L1-48 for xfs@oss.sgi.com; Thu, 25 Apr 2013 09:31:06 +0200 Message-ID: <5178DBB7.4090204@dermichi.com> Date: Thu, 25 Apr 2013 09:31:03 +0200 From: Michael Weissenbacher User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130329 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: XFS Support in RHEL Server 6.4 x86_64 References: <5177B899.4000707@dermichi.com> X-ASG-Orig-Subj: Re: XFS Support in RHEL Server 6.4 x86_64 In-Reply-To: <5177B899.4000707@dermichi.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: firestarter.dermichi.com[194.177.153.153] X-Barracuda-Start-Time: 1366875067 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129103 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Thanks for your answers, it's much clearer now! Michael From evelinab@wifi.e4a.it Thu Apr 25 07:25:03 2013 Return-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=HTML_MESSAGE,SUBJ_ALL_CAPS, UPPERCASE_75_100 autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F12FF29DFA for ; Thu, 25 Apr 2013 07:25:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6D307AC006 for ; Thu, 25 Apr 2013 05:25:02 -0700 (PDT) X-ASG-Debug-ID: 1366892691-04cb6c747125f50001-w1Z2WR Received: from smtp.auth.e4a.it (smtp.auth.e4a.it [80.79.48.119]) by cuda.sgi.com with ESMTP id ihBeAo7yEmJlkZmQ for ; Thu, 25 Apr 2013 05:24:51 -0700 (PDT) X-Barracuda-Envelope-From: evelinab@wifi.e4a.it X-Barracuda-Apparent-Source-IP: 80.79.48.119 Received: from webmail.e4a.it (unknown [80.79.48.68]) by smtp.auth.e4a.it (Postfix) with ESMTPA id 2740223234; Thu, 25 Apr 2013 14:35:07 +0200 (CEST) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=_8340bc985ff8923cd033dc11094514b3" Date: Thu, 25 Apr 2013 14:35:07 +0200 From: SUISSE BOUSSE ETUDE To: undisclosed-recipients:; Subject: APPEL A LA CANDIDATURE POUR 500 BOURSES D'ETUDES SUISSES Organization: SUISSE BOUSSE ETUDE X-ASG-Orig-Subj: APPEL A LA CANDIDATURE POUR 500 BOURSES D'ETUDES SUISSES Reply-To: Mail-Reply-To: Message-ID: X-Sender: evelinab@wifi.e4a.it User-Agent: Roundcube Webmail/0.8.5 X-Barracuda-Connect: smtp.auth.e4a.it[80.79.48.119] X-Barracuda-Start-Time: 1366892691 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.94 X-Barracuda-Spam-Status: No, SCORE=1.94 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, UPPERCASE_75_100, UPPERCASE_75_100_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129123 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 UPPERCASE_75_100 message body is 75-100% uppercase 1.93 UPPERCASE_75_100_2 message body is 75-100% uppercase --=_8340bc985ff8923cd033dc11094514b3 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 -- __ _ _ PAR L'INTERMEDIAIRE DE LA COMMISSION FEDERALE DES BOURSES ETRANGERES (CFBE-SUISSE) , LE SECRETARIAT D'ETAT A L'ETUDE ET A LA RECHERCHE DE LA CONFEDERATION LANCE UN APPEL A LA CANDIDATURE POUR 500 BOURSES D'ETUDES SUISSES AU TITRE DE L'ANNEE ACADEMIQUE 2013 - 2014. CES BOURSES SONT DESTINEES AUX RESSORTISSANTS DES PAYS DE LA CATEGORIE A (pays industrialisés européens, et extra-européens) ET CEUX DES PAYS DE LA CATEGORIE B ( pays en developpement, du tiers monde et extra - européens). _ELLES DOIVENT LEUR PERMETTRE DE POURSUIVRE LEURS ETUDES, DE PARFAIRE LEURS CONNAISSANCES POUR LES TRAVAUX DE RECHERCHES DANS LES DOMAINES AUXQUELS LES UNIVERSITES SUISSES ACCORDENT UNE ATTENTION PARTICULIERE._ _SPECIFICITE DE LA BOURSE_ _- PAR L'OCTROI DES 500 BOURSES ETUDES EMPLOIS, LA CONFEDERATION SUISSE ENTEND FACILITER L'IMMIGRATION AUX PERSONNES DESIREUSES DE POURSUIVRE LEURS ETUDES ET D'OBTENIR DES DIPLOMES D'ETAT SUISSE._ - LES CANDIDATS RETENUS AU TERME DE LA SELECTION DE CANDIDATURES SERONT INSERES OUTRE LEUR ETUDE DANS LES SECTEURS SENSIBLES DE LA VIE ECONOMIQUE ET SOCIALE DE LA SUISSE : ( santé, droit, diplomatie, communication,finance, énergie, industrie, transport, agriculture..). _CETTE OPTION DE LA CONFEDERATION SUISSE VISE A DONNER UNE APTITUDE PROFESSIONNELLE AUX BOURSIERS POUR POUVOIR TRAVAILLER S'ILS LE DESIRENT EN SUISSE A LA FIN DE LEUR FORMATION._ _DUREE DE LA BOURSE_ _LES BOURSES COUVRENT LA PERIODE D'UN CYCLE DE FORMATION OU AU MAXIMUM SIX (06) SEMESTRES ._ _FRAIS DE VOYAGE_ _LES BILLETS D'AVION ALLER-RETOUR ( PAYS DE PROVENANCE -GENEVE) , SONT PRIS EN CHARGE PAR LA COMMISSION FEDERALE DES BOURSES ETRANGERES._ _CONDITIONS PREALABLES A LA CANDIDATURE_ EN REGLE GENERALE, LES CANDIDATS AUX BOURSES ETRANGERES SUISSES DOIVENT: - AVOIR AU MAXIMUM 18 ANS a 45 ANS ; - COMPRENDRE ET PARLER CORRECTEMENT L'UNE DES LANGUES D'ENSEIGNEMENT EN SUISSE ( ESPAGNOL, ALLEMAND, ANGLAIS, ITALIE, FRANCAIS) ; _- AVOIR UN DIPLOME EQUIVALENT AU BREVET D'ETUDE DE PREMIER CYCLE D'ENSEIGNEMENT, AU BACCALAUREAT OU AU BREVET D'APTITUDE PROFESSIONELLE DES PAYS DE L'UNION EUROPEENNE._ _PROCEDURE DE SELECTION_ _- RETIRER AUPRES DE LA COMMISSION FEDERALE DES BOURSES ETRANGERES SUISSEs(CFBES)LE FORMULAIRE DE DEMANDE DE_ _BOURSE VIA_ A LEUR ADRESSE _E_MAIL: BOURSSESUISSE@ROCKETMAIL.COM _- REMPLIR ET ENVOYER PAR PIECE JOINTE LE FORMULAIRE._ - LA COMMISSION FEDERALE DES BOURSES ETRANGERES FERA ETUDIER VOTRE DOSSIER PAR LA REPRESENTATION SUISSE DELEGUEE DE VOTRE ZONE ET CATEGORIE DE PAYS. - LES CANDIDATS RETENUS RECEVRONT UNE ATTESTATION DU SECRETARIAT D'ETAT A L'ETUDE ET A LA RECHERCHE POUR NOTIFICATION DE LA BOURSE. _LES CANDIDATS DESIREUX DE PARTICIPER AUX BOURSES D'ETUDES 2013 - 2014 DOIVENT RETIRER LEUR FORMULAIRE A REMPLIR AUPRES DE LA CFBES:_ A LEUR ADRESSE _E_MAIL: BOURSSESUISSE@ROCKETMAIL.COM [1] _ _ _DATE LIMITE DE DEPÖT DES DOSSIERS_ LA DATE LIMITE DE DEPÖT DES DOSSIERS EST PREVUE POUR LE 28 MARS 2013_. CEPENDANT, LA COMMISSION FEDERALE DES BOURSES ETRANGERES SUISSEs(CFBES) SE RESERVE LE DROIT DE CLOTURER L'OCTROI DES BOURSES A CONCURRENCE DES BOURSES DISPONIBLES._ LE PRESIDENT DE LA COMMISSION FEDERALE DES BOURSES ETRANGERES SUISSES Links: ------ [1] http://fr.mc295.mail.yahoo.com/mc/compose?to=cfdbes_avis1@yahoo.fr --=_8340bc985ff8923cd033dc11094514b3 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8

 

--

 

3D"http://www.fiup.umontreal.ca/fr/univ/images/logo_UNIGE50.png"

 = ; PAR L'INTERMEDIAIRE DE LA COMMISSION FEDER= ALE DES BOURSES ETRANGERES (CFBE-SUISSE) , LE SECRETARIAT D'ETAT A L'ETUDE = ET A LA RECHERCHE DE LA CONFEDERATION LANCE UN APPEL A LA CANDIDATURE POUR = 500 BOURSES D'ETUDES SUISSES AU TITRE DE L'ANNEE ACADEMIQUE 2013 - 2014. CE= S BOURSES SONT DESTINEES AUX RESSORTISSANTS DES PAYS
DE LA CATEGORIE A=
(pays industrialisés européens, et extra-europée= ns)
ET CEUX DES PAYS DE LA CATEGORIE B
( pays en developpement, d= u tiers monde et extra - européens).
=

ELLES DOIVENT= LEUR PERMETTRE DE POURSUIVRE LEURS ETUDES, DE PARFAIRE LEURS CONNAISSANCES= POUR LES TRAVAUX DE RECHERCHES DANS LES DOMAINES AUXQUELS LES UNIVERSITES = SUISSES ACCORDENT UNE ATTENTION PARTICULIERE.

 

SPECIFICITE D= E LA BOURSE

- PAR L'OCTRO= I DES 500 BOURSES ETUDES EMPLOIS, LA CONFEDERATION SUISSE ENTEND FACILITER = L'IMMIGRATION AUX PERSONNES DESIREUSES DE POURSUIVRE LEURS ETUDES ET D'OBTE= NIR DES DIPLOMES D'ETAT SUISSE.

- LES CANDIDA= TS RETENUS AU TERME DE LA SELECTION DE CANDIDATURES SERONT INSERES OUTRE LE= UR ETUDE DANS LES SECTEURS SENSIBLES DE LA VIE ECONOMIQUE ET SOCIALE DE LA = SUISSE :
( santé, droit, diplomatie, communication,finance, &ea= cute;nergie, industrie, transport, agriculture..).

CETTE OPTION = DE LA CONFEDERATION SUISSE VISE A DONNER UNE APTITUDE PROFESSIONNELLE AUX B= OURSIERS POUR POUVOIR TRAVAILLER S'ILS LE DESIRENT EN SUISSE A LA FIN DE LE= UR FORMATION.

  DUREE DE LA BOURSE

LES BOURSES C= OUVRENT LA PERIODE D'UN CYCLE DE FORMATION OU AU MAXIMUM SIX (06) SEMESTRES= .

FRAIS DE VOYA= GE

LES BILLETS D= 'AVION ALLER-RETOUR ( PAYS DE PROVENANCE -GENEVE) , SONT PRIS EN CHARGE PAR= LA COMMISSION FEDERALE DES BOURSES ETRANGERES.

CONDITIONS PR= EALABLES A LA CANDIDATURE

EN REGLE GENE= RALE, LES CANDIDATS AUX BOURSES ETRANGERES SUISSES DOIVENT:
- AVOIR AU= MAXIMUM 18 ANS a 45 ANS ;
- COMPRENDRE ET PARLER CORRECTEMENT L'UNE D= ES LANGUES D'ENSEIGNEMENT EN SUISSE
( ESPAGNOL, ALLEMAND, ANGLAIS, ITA= LIE, FRANCAIS) ;

- AVOIR UN DI= PLOME EQUIVALENT AU BREVET D'ETUDE DE PREMIER CYCLE D'ENSEIGNEMENT, AU BACC= ALAUREAT OU AU BREVET D'APTITUDE PROFESSIONELLE DES PAYS DE L'UNION EUROPEE= NNE.

  PROCEDURE DE SELECTION

- RETIRER AUP= RES DE LA COMMISSION FEDERALE DES BOURSES ETRANGERES SUISSEs(CFBES)LE FORMU= LAIRE DE DEMANDE DE

BOURSE VIA

  A LEUR ADRESSE EMAILbourssesuisse@rocketmail.com

  - REMPLIR ET ENVOYER PAR PIECE JOINTE LE FORMULAIRE.

- LA COMMISSI= ON FEDERALE DES BOURSES ETRANGERES FERA ETUDIER VOTRE DOSSIER PAR LA REPRES= ENTATION SUISSE DELEGUEE
DE VOTRE ZONE ET CATEGORIE DE PAYS.
- LE= S CANDIDATS RETENUS RECEVRONT UNE ATTESTATION DU SECRETARIAT D'ETAT A L'ETU= DE ET A LA RECHERCHE POUR NOTIFICATION DE LA BOURSE.

LES CANDIDATS= DESIREUX DE PARTICIPER AUX BOURSES D'ETUDES 2013 - 2014 DOIVENT RETIRER LE= UR FORMULAIRE A REMPLIR AUPRES DE LA CFBES:

A LEUR ADRESSE EMAIL: bourssesuisse@rocketmail.com

 = DATE LIMITE DE DEPÖT DES DOSSIERS<= /em>

LA DATE LIMIT= E DE DEPÖT DES DOSSIERS EST PREVUE POUR LE
28 MARS 2013
. CEPENDANT, LA COMMISSION FEDERALE DES BOURSES ETRANGERES SUIS= SEs(CFBES) SE RESERVE LE DROIT DE CLOTURER L'OCTROI DES BOURSES A CONCURREN= CE DES BOURSES DISPONIBLES.

LE PRESIDENT = DE LA COMMISSION FEDERALE
DES BOURSES ETRANGERES SUISSES

--=_8340bc985ff8923cd033dc11094514b3-- From 6379503@unionstreet.com Thu Apr 25 08:48:51 2013 Return-Path: <6379503@unionstreet.com> X-Spam-Checker-Version: SpamAssassin 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 DD93329DFA for ; Thu, 25 Apr 2013 08:48:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B42E5304059 for ; Thu, 25 Apr 2013 06:48:51 -0700 (PDT) X-ASG-Debug-ID: 1366897726-04cbb057f55bcc20001-NocioJ Received: from mail.astv.ru (ns.astv.ru [89.232.138.18]) by cuda.sgi.com with ESMTP id 7mktTjGLSFtzFoIU for ; Thu, 25 Apr 2013 06:48:48 -0700 (PDT) X-Barracuda-Envelope-From: 6379503@unionstreet.com X-Barracuda-Apparent-Source-IP: 89.232.138.18 Received: from kas30pipe.localhost (localhost.astv.ru [127.0.0.1]) by mail.astv.ru (Postfix) with SMTP id 41F2A10A9E11; Fri, 26 Apr 2013 00:54:00 +1100 (SAKST) Received: from Unknown (unknown [202.131.237.134]) by mail.astv.ru (Postfix) with ESMTP id D14D210A9DD2; Fri, 26 Apr 2013 00:53:56 +1100 (SAKST) Message-ID: <6DD0615235494FE0AD5EC7D28568A943@svoexlu> Reply-To: =?windows-1251?B?wOryIO/w6OXs6ugg7uH85ery4A==?= From: =?windows-1251?B?wOryIO/w6OXs6ugg7uH85ery4A==?= <6379503@unionstreet.com> To: , , , , Subject: =?windows-1251?B?0ODn8OX45e3o5SDt4CDi4u7kIO7h+uXq8uAg?= =?windows-1251?B?4iD96vHv6/Pg8uD26P4g4vvk4OXyIOIg0eDt?= =?windows-1251?B?6vItz+Xy5fDh8/Dj5SDD7vHx8vDu6e3g5Ofu?= =?windows-1251?B?8CE=?= Date: Thu, 25 Apr 2013 15:49:11 +0200 X-ASG-Orig-Subj: =?windows-1251?B?0ODn8OX45e3o5SDt4CDi4u7kIO7h+uXq8uAg?= =?windows-1251?B?4iD96vHv6/Pg8uD26P4g4vvk4OXyIOIg0eDt?= =?windows-1251?B?6vItz+Xy5fDh8/Dj5SDD7vHx8vDu6e3g5Ofu?= =?windows-1251?B?8CE=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_1654_01CE41CC.6DBA41E0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-SpamTest-Version: SMTP-Filter Version 3.0.0 [0284], KAS30/Release X-SpamTest-Info: Not protected X-Barracuda-Connect: ns.astv.ru[89.232.138.18] X-Barracuda-Start-Time: 1366897727 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.73 X-Barracuda-Spam-Status: No, SCORE=0.73 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FROM_STARTS_WITH_NUMS, FROM_STARTS_WITH_NUMS_2, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 FROM_STARTS_WITH_NUMS From: starts with many numbers 0.00 HTML_MESSAGE BODY: HTML included in message 0.72 FROM_STARTS_WITH_NUMS_2 From: starts with many numbers This is a multi-part message in MIME format. ------=_NextPart_000_1654_01CE41CC.6DBA41E0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C2=E2=EE=E4 =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE= =FF=E2=EB=FF=E5=F2=F1=FF =E7=E0=EA=EB=FE=F7=E8=F2=E5=EB=FC=ED=FB=EC =FD=F2= =E0=EF=EE=EC =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E0, =EF=EE=F1=EB=E5 =EA= =EE=F2=EE=F0=EE=E3=EE =EE=E1=FA=E5=EA=F2=EE=EC =F0=E0=E7=F0=E5=F8=E5=ED=EE= =EF=EE=EB=FC=E7=EE=E2=E0=F2=FC=F1=FF =E8 =F1=F2=E0=ED=EE=E2=E8=F2=F1=FF = =E2=EE=E7=EC=EE=E6=ED=EE=E9 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=E0=FF= =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF =EF=F0=E0=E2 =F1=EE=E1=F1=F2=E2=E5=ED=ED= =EE=F1=F2=E8. =CA =F1=EE=E6=E0=EB=E5=ED=E8=FE, =E4=E0=ED=ED=FB=E9 =FD=F2=E0= =EF =EC=EE=E6=E5=F2 =E2=FB=E7=E2=E0=F2=FC =F1=F3=F9=E5=F1=F2=E2=E5=ED=ED=FB= =E5 =E7=E0=E4=E5=F0=E6=EA=E8 =E2 =F1=EB=F3=F7=E0=E5 =E8=E7=FA=FF=ED=EE=E2= =E2 =E8=F1=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0= =F6=E8=E8 =E8 =ED=E5=ED=E0=E4=EB=E5=E6=E0=F9=E5=E3=EE =E2=FB=EF=EE=EB=ED=E5= =ED=E8=FF =EF=F0=EE=E5=EA=F2=E0. =C8=E7=E1=E5=E6=E0=F2=FC =EE=F8=E8=E1=EE= =EA =E2=E0=EC =EF=EE=EC=EE=E6=E5=F2 =ED=EE=E2=FB=E9 =F1=E5=EC=E8=ED=E0=F0 =C2=C2=CE=C4 =C2 =DD=CA=D1=CF=CB=D3=C0=D2=C0=D6=C8=DE =CE=C1=DA=C5=CA=D2=C0= =CA=C0=CF. =D1=D2=D0-=C2=C0. =D0=C5=CA=CE=CD=D1=D2=D0=D3=CA=D6=C8=DF =C8= =D1=D2=D0=CE=C8=D2=C5=CB=DC=D1=D2=C2=CE =CE=C1=DA=C5=CA=D2=CE=C2 =CA=C0=CF= =C8=D2=C0=CB=DC=CD=CE=C3=CE =D1=D2=D0=CE=C8=D2=C5=CB=DC=D1=D2=C2=C0. =CD=CE= =D0=CC=C0=D2=C8=C2=CD=CE=C5 =D0=C5=C3=D3=CB=C8=D0=CE=C2=C0=CD=C8=C5 =D1=D2= =D0=CE=C8=D2=C5=CB=DC=CD=CE-=C8=CD=C2=C5=D1=D2=C8=D6=C8=CE=CD=CD=CE=C9 =C4= =C5=DF=D2=C5=CB=DC=CD=CE=D1=D2=C8. =CE=E1=F1=F3=E6=E4=E0=E5=EC=FB=E5 =ED=E0 =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E8= =E2=EE=EF=F0=EE=F1=FB: - =C0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED=FB=E9 =F0=E5=E3=EB=E0=EC=E5=ED= =F2: =C2=FB=E4=E0=F7=E0 =F0=E0=E7=F0=E5=F8=E5=ED=E8=E9 =ED=E0 =E2=E2=EE=E4= =EE=E1=FA=E5=EA=F2=EE=E2 =EA=E0=EF=E8=F2=E0=EB=FC=ED=EE=E3=EE =F1=F2=F0=EE= =E8=F2=E5=EB=FC=F1=F2=E2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =CD=EE=F0=EC=E0=F2=E8=E2=ED=FB=E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB, =F0=E5=E3= =EB=E0=EC=E5=ED=F2=E8=F0=F3=FE=F9=E8=E5 =EF=EE=F0=FF=E4=EE=EA =E2=E2=EE=E4= =E0 =E7=E0=EA=EE=ED=F7=E5=ED=ED=EE=E3=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2= =E2=EE=EC =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =CE=F1=ED=EE=E2=ED=FB=E5 =EE=F8=E8=E1=EA=E8, =E2=EB=E8=FF=FE=F9=E8=E5 =ED= =E0 =F1=F0=EE=EA=E8 =E2=E2=EE=E4=E0 =EE=E1=FA=E5=EA=F2=E0 =ED=E5=E4=E2=E8= =E6=E8=EC=EE=F1=F2=E8 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =D1=EE=F1=F2=E0=E2 =E8=F1=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=EE=E9 =E4=EE=EA= =F3=EC=E5=ED=F2=E0=F6=E8=E8 =EF=F0=E8 =F1=E4=E0=F7=E5 =EE=E1=FA=E5=EA=F2=E0= . - =CF=F0=EE=F6=E5=E4=F3=F0=E0 =E2=FB=E4=E0=F7=E8 =E7=E0=EA=EB=FE=F7=E5=ED= =E8=FF =EE =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =EF=EE=F1=F2=F0=EE=E5=ED=ED= =EE=E3=EE =EE=E1=FA=E5=EA=F2=E0 =EF=F0=EE=E5=EA=F2=ED=EE=E9 =E4=EE=EA=F3=EC= =E5=ED=F2=E0=F6=E8=E8 =E8 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF=EC =F2=E5=F5=ED=E8= =F7=E5=F1=EA=E8=F5 =F0=E5=E3=EB=E0=EC=E5=ED=F2=EE=E2. - =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =D1=ED=E8=CF =E8 =E4=F0=F3=E3=E8=F5 =ED=EE= =F0=EC=E0=F2=E8=E2=EE=E2 =EF=F0=E8 =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8= =E8 =E8 =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E5. =E8 =F2.=E4. =CF=F0=EE=E3=F0=E0=EC=EC=E0 =EF=EE=E4=E3=EE=F2=EE=E2=EB=E5=ED=E0 =EB=F3=F7= =F8=E8=EC=E8 =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2=E0=EC=E8 (=EF=F0=EE=F4=E5=F1=F1= =E8=EE=ED=E0=EB=E0=EC=E8) =E2 =EE=E1=EB=E0=F1=F2=E8 =F1=F2=F0=EE=E8=F2=E5= =EB=FC=F1=F2=E2=E0! =CD=E0 =F1=E5=EC=E8=ED=E0=F0=E5 =E2=FB=F1=F2=F3=EF=E0=FE=F2 =F1 =E4=EE=EA= =EB=E0=E4=E0=EC=E8 =EF=F0=E5=E4=F1=F2=E0=E2=E8=F2=E5=EB=E8 =F1=EB=F3=E6=E1= , =EE=F2=E2=E5=F7=E0=FE=F9=E8=F5 =E7=E0 =F1=EE=E3=EB=E0=F1=EE=E2=E0=ED=E8= =E5 =E2=E2=EE=E4=E0 =EE=E1=FA=E5=EA=F2=EE=E2 =E2 =FD=EA=F1=EF=EB=F3=E0=F2= =E0=F6=E8=FE =E8 =F1=E0=EC=EE=F0=E5=E3=F3=EB=E8=F0=F3=E5=EC=FB=F5 =EE=F0=E3= =E0=ED=E8=E7=E0=F6=E8=E9; =E0 =F2=E0=EA=E6=E5 =FD=EA=F1=EF=E5=F0=F2=FB =E2= =EE=E1=EB=E0=F1=F2=E8 =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=FF =E8 =F1= =F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E0! =CE=E1=F3=F7=E5=ED=E8=E5 =F1=EE=F1=F2=EE=E8=F2=F1=FF =E2 =EF=E5=F0=E8=EE=E4= =F1 2=CE =EF=EE 21 =EC=E0=E9 2=CEI=E7 =E3. =E2 =D1=E0=ED=EA=F2-=CF=E5=F2= =E5=F0=E1=F3=F0=E3=E5 =C7=C0=D0=C5=C3=C8=D1=D2=D0=C8=D0=CE=C2=C0=D2=DC=D1=DF, =EF=EE=EB=F3=F7=E8= =F2=FC =CF=CE=CB=CD=D3=DE =CF=D0=CE=C3=D0=C0=CC=CC=D3 =EC=E5=F0=EE=EF=F0=E8= =FF=F2=E8=FF, =E0 =F2=E0=EA=E6=E5 =E7=E0=E4=E0=F2=FC =E4=EE=EF=EE=EB=ED=E8= =F2=E5=EB=FC=ED=FB=E5 =E2=EE=EF=F0=EE=F1=FB =EC=EE=E6=ED=EE =EF=EE =F2=E5= =EB. =EE=F0=E3=EA=EE=EC=E8=F2=E5=F2=E0: 8 [ =EA=EE=E4_=CF=E5=F2=E5=F0=E1=F3=F0=E3=E0 ] 9.8__6 ^ 9=E7= . =D77=20 ------=_NextPart_000_1654_01CE41CC.6DBA41E0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable

=C2=E2=EE=E4 =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8= =FE =FF=E2=EB=FF=E5=F2=F1=FF =E7=E0=EA=EB=FE=F7=E8=F2=E5=EB=FC=ED=FB=EC =FD= =F2=E0=EF=EE=EC =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E0, =EF=EE=F1=EB=E5 = =EA=EE=F2=EE=F0=EE=E3=EE =EE=E1=FA=E5=EA=F2=EE=EC =F0=E0=E7=F0=E5=F8=E5=ED= =EE =EF=EE=EB=FC=E7=EE=E2=E0=F2=FC=F1=FF =E8 =F1=F2=E0=ED=EE=E2=E8=F2=F1=FF= =E2=EE=E7=EC=EE=E6=ED=EE=E9 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=E0=FF= =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF =EF=F0=E0=E2 =F1=EE=E1=F1=F2=E2=E5=ED=ED= =EE=F1=F2=E8. =CA =F1=EE=E6=E0=EB=E5=ED=E8=FE, =E4=E0=ED=ED=FB=E9 =FD=F2=E0= =EF =EC=EE=E6=E5=F2 =E2=FB=E7=E2=E0=F2=FC =F1=F3=F9=E5=F1=F2=E2=E5=ED=ED=FB= =E5 =E7=E0=E4=E5=F0=E6=EA=E8 =E2 =F1=EB=F3=F7=E0=E5 =E8=E7=FA=FF=ED=EE=E2= =E2 =E8=F1=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0= =F6=E8=E8 =E8 =ED=E5=ED=E0=E4=EB=E5=E6=E0=F9=E5=E3=EE =E2=FB=EF=EE=EB=ED=E5= =ED=E8=FF =EF=F0=EE=E5=EA=F2=E0. =C8=E7=E1=E5=E6=E0=F2=FC =EE=F8=E8=E1=EE= =EA =E2=E0=EC =EF=EE=EC=EE=E6=E5=F2 =ED=EE=E2=FB=E9 =F1=E5=EC=E8=ED=E0=F0=

=C2=C2=CE=C4 =C2 =DD=CA=D1=CF=CB=D3=C0=D2=C0=D6=C8=DE =CE=C1= =DA=C5=CA=D2=C0 =CA=C0=CF. =D1=D2=D0-=C2=C0. =D0=C5=CA=CE=CD=D1=D2=D0=D3=CA= =D6=C8=DF =C8 =D1=D2=D0=CE=C8=D2=C5=CB=DC=D1=D2=C2=CE =CE=C1=DA=C5=CA=D2=CE= =C2 =CA=C0=CF=C8=D2=C0=CB=DC=CD=CE=C3=CE =D1=D2=D0=CE=C8=D2=C5=CB=DC=D1=D2= =C2=C0. =CD=CE=D0=CC=C0=D2=C8=C2=CD=CE=C5 =D0=C5=C3=D3=CB=C8=D0=CE=C2=C0=CD= =C8=C5 =D1=D2=D0=CE=C8=D2=C5=CB=DC=CD=CE-=C8=CD=C2=C5=D1=D2=C8=D6=C8=CE=CD= =CD=CE=C9 =C4=C5=DF=D2=C5=CB=DC=CD=CE=D1=D2=C8.

=CE=E1= =F1=F3=E6=E4=E0=E5=EC=FB=E5 =ED=E0 =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E8 =E2=EE= =EF=F0=EE=F1=FB:
- =C0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED= =FB=E9 =F0=E5=E3=EB=E0=EC=E5=ED=F2: =C2=FB=E4=E0=F7=E0 =F0=E0=E7=F0=E5=F8= =E5=ED=E8=E9 =ED=E0 =E2=E2=EE=E4 =EE=E1=FA=E5=EA=F2=EE=E2 =EA=E0=EF=E8=F2= =E0=EB=FC=ED=EE=E3=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E0 =E2 =FD=EA=F1= =EF=EB=F3=E0=F2=E0=F6=E8=FE.
- =CD=EE=F0=EC=E0=F2=E8=E2=ED=FB= =E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB, =F0=E5=E3=EB=E0=EC=E5=ED=F2=E8=F0=F3=FE=F9= =E8=E5 =EF=EE=F0=FF=E4=EE=EA =E2=E2=EE=E4=E0 =E7=E0=EA=EE=ED=F7=E5=ED=ED=EE= =E3=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=EE=EC =EE=E1=FA=E5=EA=F2=E0 =E2= =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE.
- =CE=F1=ED=EE=E2=ED=FB= =E5 =EE=F8=E8=E1=EA=E8, =E2=EB=E8=FF=FE=F9=E8=E5 =ED=E0 =F1=F0=EE=EA=E8 =E2= =E2=EE=E4=E0 =EE=E1=FA=E5=EA=F2=E0 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8 =E2= =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE.
- =D1=EE=F1=F2=E0=E2 = =E8=F1=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6= =E8=E8 =EF=F0=E8 =F1=E4=E0=F7=E5 =EE=E1=FA=E5=EA=F2=E0.
- =CF= =F0=EE=F6=E5=E4=F3=F0=E0 =E2=FB=E4=E0=F7=E8 =E7=E0=EA=EB=FE=F7=E5=ED=E8=FF= =EE =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =EF=EE=F1=F2=F0=EE=E5=ED=ED=EE=E3= =EE =EE=E1=FA=E5=EA=F2=E0 =EF=F0=EE=E5=EA=F2=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED= =F2=E0=F6=E8=E8 =E8 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF=EC =F2=E5=F5=ED=E8=F7=E5= =F1=EA=E8=F5 =F0=E5=E3=EB=E0=EC=E5=ED=F2=EE=E2.
- =D2=F0=E5=E1= =EE=E2=E0=ED=E8=FF =D1=ED=E8=CF =E8 =E4=F0=F3=E3=E8=F5 =ED=EE=F0=EC=E0=F2= =E8=E2=EE=E2 =EF=F0=E8 =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=E8 =E8 =F1= =F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E5.
=E8 =F2.=E4.

=CF=F0=EE=E3=F0=E0=EC=EC=E0 =EF=EE=E4=E3=EE=F2=EE=E2=EB=E5=ED=E0= =EB=F3=F7=F8=E8=EC=E8 =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2=E0=EC=E8 (=EF=F0=EE= =F4=E5=F1=F1=E8=EE=ED=E0=EB=E0=EC=E8) =E2 =EE=E1=EB=E0=F1=F2=E8 =F1=F2=F0= =EE=E8=F2=E5=EB=FC=F1=F2=E2=E0!
=CD=E0 =F1=E5=EC=E8=ED=E0=F0= =E5 =E2=FB=F1=F2=F3=EF=E0=FE=F2 =F1 =E4=EE=EA=EB=E0=E4=E0=EC=E8 =EF=F0=E5= =E4=F1=F2=E0=E2=E8=F2=E5=EB=E8 =F1=EB=F3=E6=E1, =EE=F2=E2=E5=F7=E0=FE=F9=E8= =F5 =E7=E0 =F1=EE=E3=EB=E0=F1=EE=E2=E0=ED=E8=E5 =E2=E2=EE=E4=E0 =EE=E1=FA= =E5=EA=F2=EE=E2 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =E8 =F1=E0=EC=EE= =F0=E5=E3=F3=EB=E8=F0=F3=E5=EC=FB=F5 =EE=F0=E3=E0=ED=E8=E7=E0=F6=E8=E9; =E0= =F2=E0=EA=E6=E5 =FD=EA=F1=EF=E5=F0=F2=FB =E2 =EE=E1=EB=E0=F1=F2=E8 =EF=F0= =EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=FF =E8 =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2= =E2=E0!

=CE=E1=F3=F7=E5=ED=E8=E5 =F1=EE=F1=F2=EE=E8=F2=F1=FF = =E2 =EF=E5=F0=E8=EE=E4 =F1 2=CE =EF=EE 21 =EC=E0=E9 2=CEI=E7 =E3. =E2 =D1= =E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5

=C7=C0=D0= =C5=C3=C8=D1=D2=D0=C8=D0=CE=C2=C0=D2=DC=D1=DF, =EF=EE=EB=F3=F7=E8=F2=FC =CF= =CE=CB=CD=D3=DE =CF=D0=CE=C3=D0=C0=CC=CC=D3 =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8= =FF, =E0 =F2=E0=EA=E6=E5 =E7=E0=E4=E0=F2=FC =E4=EE=EF=EE=EB=ED=E8=F2=E5=EB= =FC=ED=FB=E5 =E2=EE=EF=F0=EE=F1=FB =EC=EE=E6=ED=EE =EF=EE =F2=E5=EB. =EE=F0= =E3=EA=EE=EC=E8=F2=E5=F2=E0:
8 [ =EA=EE=E4_=CF=E5=F2=E5= =F0=E1=F3=F0=E3=E0 ] 9.8__6 ^ 9=E7 . =D77

------=_NextPart_000_1654_01CE41CC.6DBA41E0-- From sekharan@us.ibm.com Thu Apr 25 09:08:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 03FE429DFA for ; Thu, 25 Apr 2013 09:08:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 86D0CAC006 for ; Thu, 25 Apr 2013 07:08:07 -0700 (PDT) X-ASG-Debug-ID: 1366898885-04cbb057f65be7d0001-NocioJ Received: from e39.co.us.ibm.com (e39.co.us.ibm.com [32.97.110.160]) by cuda.sgi.com with ESMTP id Uj3WIzduCZELk4Ip (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 25 Apr 2013 07:08:06 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.110.160 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.160] Received: from /spool/local by e39.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 25 Apr 2013 08:08:05 -0600 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.160] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.160] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.160] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.160] Received: from d03dlp03.boulder.ibm.com (9.17.202.179) by e39.co.us.ibm.com (192.168.1.139) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 25 Apr 2013 08:08:03 -0600 Received: from d03relay01.boulder.ibm.com (d03relay01.boulder.ibm.com [9.17.195.226]) by d03dlp03.boulder.ibm.com (Postfix) with ESMTP id C1DF219D806A for ; Thu, 25 Apr 2013 08:07:54 -0600 (MDT) Received: from d03av06.boulder.ibm.com (d03av06.boulder.ibm.com [9.17.195.245]) by d03relay01.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3PE7osu113612 for ; Thu, 25 Apr 2013 08:07:53 -0600 Received: from d03av06.boulder.ibm.com (loopback [127.0.0.1]) by d03av06.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3PEAg3c028458 for ; Thu, 25 Apr 2013 08:10:42 -0600 Received: from [9.41.106.170] ([9.41.106.170]) by d03av06.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3PEAg88028422; Thu, 25 Apr 2013 08:10:42 -0600 Subject: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN From: Chandra Seetharaman X-ASG-Orig-Subj: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN Reply-To: sekharan@us.ibm.com To: Dave Chinner Cc: Brian Foster , xfs@oss.sgi.com In-Reply-To: <20130424225821.GV10481@dastard> References: <1366699138-24055-1-git-send-email-david@fromorbit.com> <5176833C.8070305@redhat.com> <20130423210226.GN10481@dastard> <20130424085546.GQ10481@dastard> <1366828792.3762.32405.camel@chandra-dt.ibm.com> <20130424225821.GV10481@dastard> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Thu, 25 Apr 2013 09:07:49 -0500 Message-ID: <1366898869.3762.32410.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13042514-3620-0000-0000-0000022F2C89 X-Barracuda-Connect: e39.co.us.ibm.com[32.97.110.160] X-Barracuda-Start-Time: 1366898886 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, 2013-04-25 at 08:58 +1000, Dave Chinner wrote: > On Wed, Apr 24, 2013 at 01:39:52PM -0500, Chandra Seetharaman wrote: > > Hi Dave, > > > > Since this solution is for production environment, would it be valuable > > to have a sysctl variable to allow enabling/disabling XFS_WARN, as > > opposed to needing to recompile the module afresh ? > > The idea is that distros enable it on the debug kernel packages > rather than using CONFIG_XFS_DEBUG=y. Hence if someone has a > problem, they just install the debug kernel and they get all this > additional checking. Thanks for the clarification. I was thinking that CONFIG_XFS_DEBUG would be enabled in the distro's debug kernel and this new option is in addition to that. Hence, my question. So, with this new config option, CONFIG_XFS_DEBUG will only be used in development environment, correct ? > > There are roughly 1700 ASSERT statements in the XFS code, so > compiling them in unconditionally is a lot of extra code. Adding a > sysctl to make them conditional adds as many branches into the code > than in 99.99999% of calls are never going to evaluate as true. The > convenience of a sysctl is more than outweighed by the additional > overhead for the majortiy of people that don't need to diagnose > problems on their system. > > Hence I don't think the overhead of unconditionally compiling in > ASSERT checks is worth while for the majority of users, especially > as most distros ship a debug kernel for exactly this purpose.... > > Cheers, > > Dave. From sandeen@sandeen.net Thu Apr 25 09:12:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 73C9B29E03 for ; Thu, 25 Apr 2013 09:12:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E27A9AC007 for ; Thu, 25 Apr 2013 07:12:11 -0700 (PDT) X-ASG-Debug-ID: 1366899130-04cb6c2c1c5e4490001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id cNcdWTRYr5t2J4QI for ; Thu, 25 Apr 2013 07:12:10 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 2C02763C59BC for ; Thu, 25 Apr 2013 09:12:09 -0500 (CDT) Message-ID: <517939B8.2010701@sandeen.net> Date: Thu, 25 Apr 2013 09:12:08 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 1/3 V2] xfsprogs: manpage spelling fixes References: <5175BB8F.5090604@sandeen.net> <5175BC20.9010403@sandeen.net> X-ASG-Orig-Subj: [PATCH 1/3 V2] xfsprogs: manpage spelling fixes In-Reply-To: <5175BC20.9010403@sandeen.net> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366899130 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Fix several spelling errors in xfsprogs manpages. Signed-off-by: Eric Sandeen --- V2: fix serialization, guaranteed diff --git a/man/man5/projects.5 b/man/man5/projects.5 index d8fb56d..6845540 100644 --- a/man/man5/projects.5 +++ b/man/man5/projects.5 @@ -1,6 +1,6 @@ .TH projects 5 .SH NAME -projects \- persistent project root defintion +projects \- persistent project root definition .SH DESCRIPTION The .I /etc/projects diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 index fa52152..f707881 100644 --- a/man/man8/mkfs.xfs.8 +++ b/man/man8/mkfs.xfs.8 @@ -279,7 +279,7 @@ with .BR log= , or as the number fitting in a filesystem block with .BR perblock= . -The mininum (and default) +The minimum (and default) .I value is 256 bytes. The maximum @@ -297,7 +297,7 @@ so if no inode size is given on the command line, .B mkfs.xfs will attempt to choose a size such that inode numbers will be < 32 bits. If an inode size -is specified, or if a filesystem is sufficently large, +is specified, or if a filesystem is sufficiently large, .B mkfs.xfs will warn if this will create inode numbers > 32 significant bits. @@ -450,7 +450,7 @@ suboption is specified. This changes the method of logging various persistent counters in the superblock. Under metadata intensive workloads, these counters are updated and logged frequently enough that the superblock -updates become a serialisation point in the filesystem. The +updates become a serialization point in the filesystem. The .I value can be either 0 or 1. .IP diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 index 17ac601..0558671 100644 --- a/man/man8/xfs_db.8 +++ b/man/man8/xfs_db.8 @@ -64,7 +64,7 @@ and Allows execution on a mounted filesystem, provided it is mounted read-only. Useful for shell scripts such as .BR xfs_check (8), -which must only operate on filesystems in a guarenteed consistent state +which must only operate on filesystems in a guaranteed consistent state (either unmounted or mounted read-only). These semantics are slightly different to that of the .B -r @@ -960,12 +960,12 @@ and (1 if the extent is unwritten). .TP .B keys -[nonleaf blocks only] array of key records. These are the first key +[non-leaf blocks only] array of key records. These are the first key value of each block in the level below this one. Each record contains .BR startoff . .TP .B ptrs -[nonleaf blocks only] array of child block pointers. +[non-leaf blocks only] array of child block pointers. Each pointer is a filesystem block number to the next level in the Btree. .PD .RE @@ -975,7 +975,7 @@ There is one set of filesystem blocks forming the by-block-number allocation Btree for each allocation group. The root block of this Btree is designated by the .B bnoroot -field in the coresponding AGF block. +field in the corresponding AGF block. The blocks are linked to sibling left and right blocks at each level, as well as by pointers from parent to child blocks. Each block has the following fields: @@ -1004,14 +1004,14 @@ and .BR blockcount . .TP .B keys -[nonleaf blocks only] array of key records. These are the first value +[non-leaf blocks only] array of key records. These are the first value of each block in the level below this one. Each record contains .B startblock and .BR blockcount . .TP .B ptrs -[nonleaf blocks only] array of child block pointers. Each pointer is a +[non-leaf blocks only] array of child block pointers. Each pointer is a block number within the allocation group to the next level in the Btree. .PD .RE @@ -1021,7 +1021,7 @@ There is one set of filesystem blocks forming the by-block-count allocation Btree for each allocation group. The root block of this Btree is designated by the .B cntroot -field in the coresponding AGF block. The blocks are linked to sibling +field in the corresponding AGF block. The blocks are linked to sibling left and right blocks at each level, as well as by pointers from parent to child blocks. Each block has the following fields: .RS 1.4i @@ -1049,14 +1049,14 @@ and .BR blockcount . .TP .B keys -[nonleaf blocks only] array of key records. These are the first value +[non-leaf blocks only] array of key records. These are the first value of each block in the level below this one. Each record contains .B blockcount and .BR startblock . .TP .B ptrs -[nonleaf blocks only] array of child block pointers. Each pointer is a +[non-leaf blocks only] array of child block pointers. Each pointer is a block number within the allocation group to the next level in the Btree. .PD .RE @@ -1368,7 +1368,7 @@ number of warnings issued about realtime block limit violations. There is one set of filesystem blocks forming the inode allocation Btree for each allocation group. The root block of this Btree is designated by the .B root -field in the coresponding AGI block. +field in the corresponding AGI block. The blocks are linked to sibling left and right blocks at each level, as well as by pointers from parent to child blocks. Each block has the following fields: @@ -1400,12 +1400,12 @@ count of free inodes in this chunk, and bitmap, LSB corresponds to inode 0. .TP .B keys -[nonleaf blocks only] array of key records. These are the first value of each +[non-leaf blocks only] array of key records. These are the first value of each block in the level below this one. Each record contains .BR startino . .TP .B ptrs -[nonleaf blocks only] array of child block pointers. Each pointer is a +[non-leaf blocks only] array of child block pointers. Each pointer is a block number within the allocation group to the next level in the Btree. .PD .RE diff --git a/man/man8/xfs_mdrestore.8 b/man/man8/xfs_mdrestore.8 index a7d2b68..7b9ba89 100644 --- a/man/man8/xfs_mdrestore.8 +++ b/man/man8/xfs_mdrestore.8 @@ -16,7 +16,7 @@ to a filesystem. The .I source argument specifies the location of the metadump image and the .I target -argument specifies the destination for the filsystem image. +argument specifies the destination for the filesystem image. If the .I source is \-, then the metadata image is read from stdin. This allows the output of diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 index f3b54cc..9327feb 100644 --- a/man/man8/xfs_quota.8 +++ b/man/man8/xfs_quota.8 @@ -623,7 +623,7 @@ can be used to limit recursion level (\-1 is infinite, 0 is top level only, 1 is first level ... ). Option .B \-p -adds posibility to specify project paths in command line without a need +adds possibility to specify project paths in command line without a need for .I /etc/projects to exist. Note that if projects file exists then it is also used. diff --git a/man/man8/xfs_repair.8 b/man/man8/xfs_repair.8 index 57c97da..7b296ba 100644 --- a/man/man8/xfs_repair.8 +++ b/man/man8/xfs_repair.8 @@ -170,7 +170,7 @@ Verbose output. Repair dangerously. Allow .B xfs_repair to repair an XFS filesystem mounted read only. This is typically done -on a root fileystem from single user mode, immediately followed by a reboot. +on a root filesystem from single user mode, immediately followed by a reboot. .TP .B \-V Prints out the current version number and exits. @@ -239,7 +239,7 @@ The name assigned is the inode number. aborts on most disk I/O errors. Therefore, if you are trying to repair a filesystem that was damaged due to a disk drive failure, steps should be taken to ensure that all blocks in the filesystem are -readable and writeable before attempting to use +readable and writable before attempting to use .B xfs_repair to repair the filesystem. A possible method is using .BR dd (8) From JBacik@fusionio.com Thu Apr 25 09:13:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D3C0B29E03 for ; Thu, 25 Apr 2013 09:13:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6B4FAAC007 for ; Thu, 25 Apr 2013 07:13:04 -0700 (PDT) X-ASG-Debug-ID: 1366899181-04bdf01d633d66b0001-NocioJ Received: from dkim1.fusionio.com (dkim1.fusionio.com [66.114.96.53]) by cuda.sgi.com with ESMTP id tltO0T7Y1LGklRZu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 25 Apr 2013 07:13:01 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.53 Received: from mx1.fusionio.com (unknown [10.101.1.160]) by dkim1.fusionio.com (Postfix) with ESMTP id E72DE7C042F for ; Thu, 25 Apr 2013 08:13:00 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1366899180; bh=dFu/p8zoI9/sbUsdr/+KQiFeatllao7CVod0rLBxTZs=; h=From:To:Subject:Date; b=nT3dbmP4Y+feWYdK9f4DD/+r5O+IvdWfWMRsSY7y5cizxtP8jbtA1I3zroUh7RUmB SvGLuPb3XK2gigQHCSO27nkQHWyR1nDZ64soeU2S850hLjrAsIAPgpWQGqW6Gcf/j7 AbGDYGFiJBzmcdDqsPQnYgO90A2JhkeNfZcT3V4M= Received: from mail1.int.fusionio.com (mail1.int.fusionio.com [10.101.1.21]) by mx1.fusionio.com with ESMTP id EJTaFYVNsDHMNTHC (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Thu, 25 Apr 2013 08:12:59 -0600 (MDT) Received: from localhost (76.182.72.146) by mail.fusionio.com (10.101.1.19) with Microsoft SMTP Server (TLS) id 8.3.83.0; Thu, 25 Apr 2013 08:12:57 -0600 From: Josef Bacik To: , Subject: [PATCH] xfstests 311: test fsync with dm flakey V2 Date: Thu, 25 Apr 2013 10:12:56 -0400 X-ASG-Orig-Subj: [PATCH] xfstests 311: test fsync with dm flakey V2 Message-ID: <1366899176-12876-1-git-send-email-jbacik@fusionio.com> X-Mailer: git-send-email 1.7.7.6 MIME-Version: 1.0 Content-Type: text/plain X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim1.fusionio.com[66.114.96.53] X-Barracuda-Start-Time: 1366899181 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This test sets up a dm flakey target and then runs my fsync tester I've been using to verify btrfs's fsync() is working properly. It will create a dm flakey device, mount it, run my test, make the flakey device start dropping writes, and then unmount the fs. Then we mount it back up and make sure the md5sums match and then run fsck on the device to make sure we got a consistent fs. I used the output from a run on BTRFS since it's the only one that passes this test properly. I verified each test manually to make sure they were in fact valid files. XFS and Ext4 both fail this test in one way or another. Thanks, Signed-off-by: Josef Bacik --- V1->V2 -make _test_check_fs take an argument on wether or not to force an exit, this is because if we failed to fsck we'd leave the dmflakey device around which was super annoying. -fixed the drop caches bug (thanks Zach!) -fixed the output since XFS has a bug with that particular test, it leaves a 0 length file behind which isn't right. common/config | 1 + common/punch | 7 - common/rc | 71 +++++-- src/Makefile | 2 +- src/fsync-tester.c | 538 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/311 | 177 ++++++++++++++++ tests/generic/311.out | 193 ++++++++++++++++++ tests/generic/group | 1 + 8 files changed, 967 insertions(+), 23 deletions(-) create mode 100644 src/fsync-tester.c create mode 100755 tests/generic/311 create mode 100644 tests/generic/311.out diff --git a/common/config b/common/config index dfbb5c2..b8ab593 100644 --- a/common/config +++ b/common/config @@ -177,6 +177,7 @@ export FIO_PROG="`set_prog_path fio`" export FILEFRAG_PROG="`set_prog_path filefrag`" export E4DEFRAG_PROG="`set_prog_path e4defrag`" export LOGGER_PROG="`set_prog_path logger`" +export DMSETUP_PROG="`set_prog_path dmsetup`" # Generate a comparable xfsprogs version number in the form of # major * 10000 + minor * 100 + release diff --git a/common/punch b/common/punch index cfbe576..b9f9acd 100644 --- a/common/punch +++ b/common/punch @@ -234,13 +234,6 @@ _filter_hole_fiemap() _coalesce_extents } - -# Prints the md5 checksum of a given file -_md5_checksum() -{ - md5sum $1 | cut -d ' ' -f1 -} - _filter_bmap() { awk ' diff --git a/common/rc b/common/rc index b980697..0eea37d 100644 --- a/common/rc +++ b/common/rc @@ -57,6 +57,13 @@ dd() fi } +# Prints the md5 checksum of a given file +_md5_checksum() +{ + md5sum $1 | cut -d ' ' -f1 +} + + # ls -l w/ selinux sometimes puts a dot at the end: # -rwxrw-r--. id1 id2 file1 @@ -478,7 +485,7 @@ _scratch_mkfs_ext4() { local tmp_dir=/tmp/ - /sbin/mkfs -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV \ + /sbin/mkfs -t $FSTYP -- -F $MKFS_OPTIONS $* $SCRATCH_DEV \ 2>$tmp_dir.mkfserr 1>$tmp_dir.mkfsstd local mkfs_status=$? @@ -1041,6 +1048,27 @@ _require_command() [ -n "$1" -a -x "$1" ] || _notrun "$_cmd utility required, skipped this test" } +# this test requires the device mapper flakey target +# +_require_dm_flakey() +{ + if [ "$HOSTOS" != "Linux" ] + then + _notrun "This test requires linux for dm flakey support" + fi + + _require_command $DMSETUP_PROG + + modprobe dm-flakey >/dev/null 2>&1 + $DMSETUP_PROG targets | grep flakey >/dev/null 2>&1 + if [ $? -eq 0 ] + then + : + else + _notrun "This test requires dm flakey support" + fi +} + # this test requires the projid32bit feature to be available in # mkfs.xfs # @@ -1356,7 +1384,9 @@ _mount_or_remount_rw() _check_generic_filesystem() { device=$1 + force_exit=$2 + ret=0 # If type is set, we're mounted type=`_fs_type $device` ok=1 @@ -1395,22 +1425,24 @@ _check_generic_filesystem() if [ $ok -eq 0 ]; then status=1 - exit 1 + ret=1 + [ $force_exit -eq 1 ] && exit 1 fi - return 0 + return $ret } # run xfs_check and friends on a FS. _check_xfs_filesystem() { - if [ $# -ne 3 ] + if [ $# -ne 4 ] then - echo "Usage: _check_xfs_filesystem device |none |none" 1>&2 + echo "Usage: _check_xfs_filesystem device |none |none force_exit" 1>&2 exit 1 fi + force_exit=$4 extra_mount_options="" device=$1 if [ "$2" != "none" ]; then @@ -1428,6 +1460,7 @@ _check_xfs_filesystem() type=`_fs_type $device` ok=1 + ret=0 if [ "$type" = "xfs" ] then @@ -1494,10 +1527,11 @@ _check_xfs_filesystem() if [ $ok -eq 0 ]; then status=1 - exit 1 + ret=1 + [ $force_exit -eq 1 ] && exit 1 fi - return 0 + return $ret } # Filter the knowen errors the UDF Verifier reports. @@ -1553,7 +1587,7 @@ _check_xfs_test_fs() [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_RTDEV" ] && \ TEST_RT="$TEST_RTDEV" - _check_xfs_filesystem $TEST_DEV $TEST_LOG $TEST_RT + _check_xfs_filesystem $TEST_DEV $TEST_LOG $TEST_RT 1 # check for ipath consistency if $XFS_GROWFS_PROG -n $TEST_DIR | grep -q 'inode-paths=1'; then @@ -1566,10 +1600,12 @@ _check_xfs_test_fs() _check_btrfs_filesystem() { device=$1 + force_exit=$2 # If type is set, we're mounted type=`_fs_type $device` ok=1 + ret=0 if [ "$type" = "$FSTYP" ] then @@ -1605,10 +1641,11 @@ _check_btrfs_filesystem() if [ $ok -eq 0 ]; then status=1 - exit 1 + ret=1 + [ $force_exit -eq 1 ] && exit 1 fi - return 0 + return $ret } _check_test_fs() @@ -1624,16 +1661,18 @@ _check_test_fs() # do nothing for now ;; btrfs) - _check_btrfs_filesystem $TEST_DEV + _check_btrfs_filesystem $TEST_DEV 1 ;; *) - _check_generic_filesystem $TEST_DEV + _check_generic_filesystem $TEST_DEV 1 ;; esac } _check_scratch_fs() { + force_exit=1 + [ $# -eq 1 ] && force_exit=$1 case $FSTYP in xfs) SCRATCH_LOG="none" @@ -1644,19 +1683,21 @@ _check_scratch_fs() [ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \ SCRATCH_RT="$SCRATCH_RTDEV" - _check_xfs_filesystem $SCRATCH_DEV $SCRATCH_LOG $SCRATCH_RT + _check_xfs_filesystem $SCRATCH_DEV $SCRATCH_LOG $SCRATCH_RT $force_exit ;; udf) + # Seems _check_udf_filesystem doesnt exit 1 if it fails so we're good + # here _check_udf_filesystem $SCRATCH_DEV $udf_fsize ;; nfs*) # Don't know how to check an NFS filesystem, yet. ;; btrfs) - _check_btrfs_filesystem $SCRATCH_DEV + _check_btrfs_filesystem $SCRATCH_DEV $force_exit ;; *) - _check_generic_filesystem $SCRATCH_DEV + _check_generic_filesystem $SCRATCH_DEV $force_exit ;; esac } diff --git a/src/Makefile b/src/Makefile index 8d8e97f..c18ffc9 100644 --- a/src/Makefile +++ b/src/Makefile @@ -18,7 +18,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ stale_handle pwrite_mmap_blocked t_dir_offset2 seek_sanity_test \ - seek_copy_test t_readdir_1 t_readdir_2 + seek_copy_test t_readdir_1 t_readdir_2 fsync-tester SUBDIRS = diff --git a/src/fsync-tester.c b/src/fsync-tester.c new file mode 100644 index 0000000..092d953 --- /dev/null +++ b/src/fsync-tester.c @@ -0,0 +1,538 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int test_fd; +static char *buf; +static char *fname; + +/* + * Just creates a random file, overwriting the file in a random number of loops + * and fsyncing between each loop. + */ +static int test_one(int *max_blocks) +{ + int loops = (random() % 20) + 5; + + lseek(test_fd, 0, SEEK_SET); + while (loops--) { + int character = (random() % 126) + 33; /* printable character */ + int blocks = (random() % 100) + 1; + + if (blocks > *max_blocks) + *max_blocks = blocks; + lseek(test_fd, 0, SEEK_SET); + memset(buf, character, 4096); + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results will be " + "invalid: %d\n", errno); + return 1; + } + + while (blocks--) { + if (write(test_fd, buf, 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + } + + return 0; +} + +/* + * Preallocate a randomly sized file and then overwrite the entire thing and + * then fsync. + */ +static int test_two(int *max_blocks) +{ + int blocks = (random() % 1024) + 1; + int character = (random() % 126) + 33; + + *max_blocks = blocks; + + if (fallocate(test_fd, 0, 0, blocks * 4096)) { + fprintf(stderr, "Error fallocating %d (%s)\n", errno, + strerror(errno)); + return 1; + } + + lseek(test_fd, 0, SEEK_SET); + memset(buf, character, 4096); + while (blocks--) { + if (write(test_fd, buf, 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + return 0; +} + +static void drop_all_caches() +{ + char value[] = "3\n"; + int fd; + + if ((fd = open("/proc/sys/vm/drop_caches", O_WRONLY)) < 0) { + fprintf(stderr, "Error opening drop caches: %d\n", errno); + return; + } + + write(fd, value, sizeof(value)-1); + close(fd); +} + +/* + * Randomly write inside of a file, either creating a sparse file or prealloc + * the file and randomly write within it, depending on the prealloc flag + */ +static int test_three(int *max_blocks, int prealloc, int rand_fsync, + int sync, int drop_caches) +{ + int size = (random() % 2048) + 4; + int blocks = size / 2; + int sync_block = blocks / 2; + int rand_sync_interval = (random() % blocks) + 1; + int character = (random() % 126) + 33; + + printf("Size is %d, blocks is %d\n", size, blocks); + if (prealloc && fallocate(test_fd, 0, 0, size * 4096)) { + fprintf(stderr, "Error fallocating %d (%s)\n", errno, + strerror(errno)); + return 1; + } + + if (prealloc) + *max_blocks = size; + + memset(buf, character, 4096); + while (blocks--) { + int block = (random() % size); + + if ((block + 1) > *max_blocks) + *max_blocks = block + 1; + + if (rand_fsync && !(blocks % rand_sync_interval)) { + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results " + "will be invalid: %d\n", errno); + return 1; + } + } + + /* Force a transaction commit in between just for fun */ + if (blocks == sync_block && (sync || drop_caches)) { + if (sync) + syncfs(test_fd); + else + sync_file_range(test_fd, 0, 0, + SYNC_FILE_RANGE_WRITE| + SYNC_FILE_RANGE_WAIT_AFTER); + + if (drop_caches) { + close(test_fd); + drop_all_caches(); + test_fd = open(fname, O_RDWR); + if (test_fd < 0) { + test_fd = 0; + fprintf(stderr, "Error re-opening file: %d\n", + errno); + return 1; + } + } + } + + if (pwrite(test_fd, buf, 4096, block * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + return 0; +} + +static void timeval_subtract(struct timeval *result,struct timeval *x, + struct timeval *y) +{ + if (x->tv_usec < y->tv_usec) { + int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1; + y->tv_usec -= 1000000 * nsec; + y->tv_sec += nsec; + } + + if (x->tv_usec - y->tv_usec > 1000000) { + int nsec = (x->tv_usec - y->tv_usec) / 1000000; + y->tv_usec += 1000000 * nsec; + y->tv_sec -= nsec; + } + + result->tv_sec = x->tv_sec - y->tv_sec; + result->tv_usec = x->tv_usec - y->tv_usec; +} + +static int test_four(int *max_blocks) +{ + size_t size = 2621440; /* 10 gigabytes */ + size_t blocks = size / 2; + size_t sync_block = blocks / 8; /* fsync 8 times */ + int character = (random() % 126) + 33; + struct timeval start, end, diff; + + memset(buf, character, 4096); + while (blocks--) { + off_t block = (random() % size); + + if ((block + 1) > *max_blocks) + *max_blocks = block + 1; + + if ((blocks % sync_block) == 0) { + if (gettimeofday(&start, NULL)) { + fprintf(stderr, "Error getting time: %d\n", + errno); + return 1; + } + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results " + "will be invalid: %d\n", errno); + return 1; + } + if (gettimeofday(&end, NULL)) { + fprintf(stderr, "Error getting time: %d\n", + errno); + return 1; + } + timeval_subtract(&diff, &end, &start); + printf("Fsync time was %ds and %dus\n", + (int)diff.tv_sec, (int)diff.tv_usec); + } + + if (pwrite(test_fd, buf, 4096, block * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + return 0; +} + +static int test_five() +{ + int character = (random() % 126) + 33; + int runs = (random() % 100) + 1; + int i; + + memset(buf, character, 3072); + for (i = 0; i < runs; i++) { + size_t write_size = (random() % 3072) + 1; + + if (pwrite(test_fd, buf, write_size, 0) < write_size) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + + if ((i % 8) == 0) { + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results " + "will be invalid: %d\n", errno); + return 1; + } + } + } + + return 0; +} + +/* + * Reproducer for something like this + * + * [data][prealloc][data] + * + * and then in the [prealloc] section we have + * + * [ pre ][pre][ pre ] + * [d][pp][dd][ppp][d][ppp][d] + * + * where each letter represents on block of either data or prealloc. + * + * This explains all the weirdly specific numbers. + */ +static int test_six() +{ + int character = (random() % 126) + 33; + int i; + + memset(buf, character, 4096); + + /* Write on either side of the file, leaving a hole in the middle */ + for (i = 0; i < 10; i++) { + if (pwrite(test_fd, buf, 4096, i * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + /* + * The test fs I had the prealloc extent was 13 4k blocks long so I'm + * just using that to give myself the best chances of reproducing. + */ + for (i = 23; i < 33; i++) { + if (pwrite(test_fd, buf, 4096, i * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + if (fallocate(test_fd, 0, 10 * 4096, 4 * 4096)) { + fprintf(stderr, "Error fallocating %d\n", errno); + return 1; + } + + if (fallocate(test_fd, 0, 14 * 4096, 5 * 4096)) { + fprintf(stderr, "Error fallocating %d\n", errno); + return 1; + } + + if (fallocate(test_fd, 0, 19 * 4096, 4 * 4096)) { + fprintf(stderr, "Error fallocating %d\n", errno); + return 1; + } + + if (pwrite(test_fd, buf, 4096, 10 * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + for (i = 13; i < 15; i++) { + if (pwrite(test_fd, buf, 4096, i * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + if (pwrite(test_fd, buf, 4096, 18 * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + if (pwrite(test_fd, buf, 4096, 22 * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + return 0; +} + +static void usage() +{ + printf("Usage fsync-tester [-s ] [-r] [-d] -t \n"); + printf(" -s seed : seed for teh random map generator (defaults to reading /dev/urandom)\n"); + printf(" -r : don't reboot the box immediately\n"); + printf(" -d : use O_DIRECT\n"); + printf(" -t test : test nr to run, required\n"); + exit(1); +} + +int main(int argc, char **argv) +{ + int opt; + int fd; + int max_blocks = 0; + char *endptr; + unsigned int seed = 123; + int reboot = 1; + int direct_io = 0; + long int test = 1; + long int tmp; + int ret = 0; + int flags = O_RDWR|O_CREAT|O_TRUNC; + + if (argc < 2) + usage(); + + fd = open("/dev/urandom", O_RDONLY); + if (fd >= 0) { + read(fd, &seed, sizeof(seed)); + close(fd); + } + + while ((opt = getopt(argc, argv, "s:rdt:")) != -1) { + switch (opt) { + case 's': + tmp = strtol(optarg, &endptr, 10); + if (tmp == LONG_MAX || endptr == optarg) + usage(); + seed = tmp; + break; + case 'r': + reboot = 0; + break; + case 'd': + direct_io = 1; + break; + case 't': + test = strtol(optarg, &endptr, 10); + if (test == LONG_MAX || endptr == optarg) + usage(); + break; + default: + usage(); + } + } + + if (optind >= argc) + usage(); + + fname = argv[optind]; + if (!fname) + usage(); + + printf("Random seed is %u\n", seed); + srandom(seed); + + if (direct_io) { + flags |= O_DIRECT; + ret = posix_memalign((void **)&buf, getpagesize(), 4096); + if (ret) + buf = NULL; + } else { + buf = malloc(4096); + } + + if (!buf) { + fprintf(stderr, "Error allocating buf: %d\n", errno); + return 1; + } + + test_fd = open(fname, flags, 0644); + if (test_fd < 0) { + fprintf(stderr, "Error opening file %d (%s)\n", errno, + strerror(errno)); + return 1; + } + + switch (test) { + case 1: + ret = test_one(&max_blocks); + break; + case 2: + ret = test_two(&max_blocks); + break; + case 3: + ret = test_three(&max_blocks, 0, 0, 0, 0); + break; + case 4: + ret = test_three(&max_blocks, 1, 0, 0, 0); + break; + case 5: + ret = test_three(&max_blocks, 0, 1, 0, 0); + break; + case 6: + ret = test_three(&max_blocks, 1, 1, 0, 0); + break; + case 7: + ret = test_three(&max_blocks, 0, 0, 1, 0); + break; + case 8: + ret = test_three(&max_blocks, 1, 0, 1, 0); + break; + case 9: + ret = test_three(&max_blocks, 0, 1, 1, 0); + break; + case 10: + ret = test_three(&max_blocks, 1, 1, 1, 0); + break; + case 11: + ret = test_three(&max_blocks, 0, 0, 0, 1); + break; + case 12: + ret = test_three(&max_blocks, 0, 1, 0, 1); + break; + case 13: + ret = test_three(&max_blocks, 0, 0, 1, 1); + break; + case 14: + ret = test_three(&max_blocks, 0, 1, 1, 1); + break; + case 15: + ret = test_three(&max_blocks, 1, 0, 0, 1); + break; + case 16: + ret = test_three(&max_blocks, 1, 1, 0, 1); + break; + case 17: + ret = test_three(&max_blocks, 1, 0, 1, 1); + break; + case 18: + ret = test_three(&max_blocks, 1, 1, 1, 1); + break; + case 19: + ret = test_five(); + break; + case 20: + ret = test_six(); + break; + case 21: + /* + * This is just a perf test, keep moving it down so it's always + * the last test option. + */ + reboot = 0; + ret = test_four(&max_blocks); + goto out; + default: + usage(); + } + + if (ret) + goto out; + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results will be invalid: " + "%d\n", errno); + return 1; + } + if (reboot) + system("reboot -fn"); +out: + free(buf); + close(test_fd); + return ret; +} diff --git a/tests/generic/311 b/tests/generic/311 new file mode 100755 index 0000000..3f7abe2 --- /dev/null +++ b/tests/generic/311 @@ -0,0 +1,177 @@ +#! /bin/bash +# FS QA Test No. 311 +# +#Verify a file systems fsync is working properly. This won't catch problems +#with blockdev flushing, but at the very least it makes sure the file system is +#doing the right thing with fsync logically. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Fusion IO. 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 +#----------------------------------------------------------------------- +# +# creator +owner=jbacik@fusionio.com + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +status=1 # failure is the default! + +_cleanup() +{ + $UMOUNT_PROG $SCRATCH_MNT > /dev/null 2>&1 + $DMSETUP_PROG remove flakey-test > /dev/null 2>&1 +} + +_cleanup + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_need_to_be_root +_require_scratch +_require_dm_flakey + +[ -x $here/src/fsync-tester ] || _notrun "fsync-tester not build" + +rm -f $seqres.full +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` +FLAKEY_DEV=/dev/mapper/flakey-test +SEED=1 +testfile=$SCRATCH_MNT/$seq.fsync + +_mount_flakey() +{ + _scratch_options mount + _mount -t $FSTYP $SCRATCH_OPTIONS $MOUNT_OPTIONS $SELINUX_MOUNT_OPTIONS $* $FLAKEY_DEV $SCRATCH_MNT +} + +_unmount_flakey() +{ + $UMOUNT_PROG $FLAKEY_DEV +} +_drop_writes() +{ + $DMSETUP_PROG suspend flakey-test + if [ $? -ne 0 ]; then + echo "failed to suspend flakey-test" + _unmount_flakey + _cleanup + exit + fi + $DMSETUP_PROG load flakey-test --table "0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 0 180 1 drop_writes" + if [ $? -ne 0 ]; then + echo "failed to load table into flakey-test" + _unmount_flakey + _cleanup + exit + fi + $DMSETUP_PROG resume flakey-test + if [ $? -ne 0 ]; then + echo "failed to resumeflakey-test" + _unmount_flakey + _cleanup + exit + fi +} + +_resume_writes() +{ + $DMSETUP_PROG suspend flakey-test + if [ $? -ne 0 ]; then + echo "failed to suspend flakey-test" + _unmount_flakey + _cleanup + exit + fi + $DMSETUP_PROG load flakey-test --table "0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 180 0" + if [ $? -ne 0 ]; then + echo "failed to load table into flakey-test" + _unmount_flakey + _cleanup + exit + fi + $DMSETUP_PROG resume flakey-test + if [ $? -ne 0 ]; then + echo "failed to resumeflakey-test" + _unmount_flakey + _cleanup + exit + fi +} + +_run_test() +{ + test_num=$1 + extra="" + + [ $2 -eq 1 ] && extra="-d" + + $here/src/fsync-tester -s $SEED -r -t $test_num $extra $testfile + if [ $? -ne 0 ]; then + _unmount_flakey + _cleanup + exit + fi + + _md5_checksum $testfile + _drop_writes + _unmount_flakey + + #Ok mount so that any recovery that needs to happen is done + _resume_writes + _mount_flakey + _md5_checksum $testfile + + #Unmount and fsck to make sure we got a valid fs after replay + _unmount_flakey + _check_scratch_fs 0 + if [ $? -ne 0 ]; then + echo "fs inconsistent" + _cleanup + exit + fi + _mount_flakey +} + +_scratch_mkfs >> $seqres.full 2>&1 + +# Create a basic flakey device that will never error out +$DMSETUP_PROG create flakey-test --table "0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 180 0" +if [ $? -ne 0 ]; then + echo "failed to create flakey device" + status=1 + exit +fi + +_mount_flakey + +for i in $(seq 1 20); do + echo "Running test $i buffered" + _run_test $i 0 + echo "Running test $i direct" + _run_test $i 1 +done + +_cleanup +status=0 +exit diff --git a/tests/generic/311.out b/tests/generic/311.out new file mode 100644 index 0000000..59d173b --- /dev/null +++ b/tests/generic/311.out @@ -0,0 +1,193 @@ +QA output created by 311 +Running test 1 buffered +Random seed is 1 +ee6103415276cde95544b11b2675f132 +ee6103415276cde95544b11b2675f132 +Running test 1 direct +Random seed is 1 +ee6103415276cde95544b11b2675f132 +ee6103415276cde95544b11b2675f132 +Running test 2 buffered +Random seed is 1 +6ec7dd6da414514b832d9a8fc9098a06 +6ec7dd6da414514b832d9a8fc9098a06 +Running test 2 direct +Random seed is 1 +6ec7dd6da414514b832d9a8fc9098a06 +6ec7dd6da414514b832d9a8fc9098a06 +Running test 3 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 3 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 4 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 4 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 5 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 5 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 6 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 6 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 7 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 7 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 8 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 8 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 9 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 9 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 10 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 10 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 11 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 11 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 12 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 12 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 13 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 13 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 14 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 14 direct +Random seed is 1 +Size is 1924, blocks is 962 +c80ba7f17988006f10bdc488efa9b372 +c80ba7f17988006f10bdc488efa9b372 +Running test 15 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 15 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 16 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 16 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 17 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 17 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 18 buffered +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 18 direct +Random seed is 1 +Size is 1924, blocks is 962 +c5f2b19e14d0f3e6755cac2986b8366d +c5f2b19e14d0f3e6755cac2986b8366d +Running test 19 buffered +Random seed is 1 +9cc0323438bb10f5cc88cfbd5aaf5cfa +9cc0323438bb10f5cc88cfbd5aaf5cfa +Running test 19 direct +Random seed is 1 +9cc0323438bb10f5cc88cfbd5aaf5cfa +9cc0323438bb10f5cc88cfbd5aaf5cfa +Running test 20 buffered +Random seed is 1 +764e24deb80dc89aaecdadce4a656052 +764e24deb80dc89aaecdadce4a656052 +Running test 20 direct +Random seed is 1 +764e24deb80dc89aaecdadce4a656052 +764e24deb80dc89aaecdadce4a656052 diff --git a/tests/generic/group b/tests/generic/group index eb52833..a0830c1 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -113,3 +113,4 @@ 308 auto quick 309 auto quick 310 auto +311 auto -- 1.7.7.6 From bfoster@redhat.com Thu Apr 25 09:51:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 68F8229E03 for ; Thu, 25 Apr 2013 09:51:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2B41F304081 for ; Thu, 25 Apr 2013 07:51:14 -0700 (PDT) X-ASG-Debug-ID: 1366901472-04bdf06c45002b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id f7WZQG1LAjVIALtD for ; Thu, 25 Apr 2013 07:51:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3PEp7kb012784 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Apr 2013 10:51:08 -0400 Received: from laptop.bfoster (vpn-57-223.rdu2.redhat.com [10.10.57.223]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r3PEp5ne000831 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 25 Apr 2013 10:51:06 -0400 Message-ID: <5179423B.3040308@redhat.com> Date: Thu, 25 Apr 2013 10:48:27 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN References: <1366699138-24055-1-git-send-email-david@fromorbit.com> <5176833C.8070305@redhat.com> <20130423210226.GN10481@dastard> <20130424085546.GQ10481@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN In-Reply-To: <20130424085546.GQ10481@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366901473 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com On 04/24/2013 04:55 AM, Dave Chinner wrote: > From: Dave Chinner > > Running a CONFIG_XFS_DEBUG kernel in production environments is not > the best idea as it introduces significant overhead, can change > the behaviour of algorithms (such as allocation) to improve test > coverage, and (most importantly) panic the machine on non-fatal > errors. > > There are many cases where all we want to do is run a > kernel with more bounds checking enabled, such as is provided by the > ASSERT() statements throughout the code, but without all the > potential overhead and drawbacks. > > This patch converts all the ASSERT statements to evaluate as > WARN_ON(1) statements and hence if they fail dump a warning and a > stack trace to the log. This has minimal overhead and does not > change any algorithms, and will allow us to find strange "out of > bounds" problems more easily on production machines. > > There are a few places where assert statements contain debug only > code. These are converted to be debug-or-warn only code so that we > still get all the assert checks in the code. > > Signed-off-by: Dave Chinner > --- > Version 2: > - fix transaction accounting for superblock debug fields. > Looks good. Reviewed-by: Brian Foster > fs/xfs/Kconfig | 13 +++++++++++++ > fs/xfs/mrlock.h | 12 ++++++------ > fs/xfs/xfs.h | 5 +++++ > fs/xfs/xfs_alloc_btree.c | 4 ++-- > fs/xfs/xfs_bmap_btree.c | 4 ++-- > fs/xfs/xfs_btree.h | 2 +- > fs/xfs/xfs_dir2_node.c | 4 ++-- > fs/xfs/xfs_ialloc_btree.c | 4 ++-- > fs/xfs/xfs_inode.c | 2 +- > fs/xfs/xfs_linux.h | 24 ++++++++++++++++++------ > fs/xfs/xfs_message.c | 8 ++++++++ > fs/xfs/xfs_message.h | 1 + > fs/xfs/xfs_trans.h | 4 ++-- > 13 files changed, 63 insertions(+), 24 deletions(-) > > diff --git a/fs/xfs/Kconfig b/fs/xfs/Kconfig > index cc33aaf..399e8ce 100644 > --- a/fs/xfs/Kconfig > +++ b/fs/xfs/Kconfig > @@ -69,6 +69,19 @@ config XFS_RT > > If unsure, say N. > > +config XFS_WARN > + bool "XFS Verbose Warnings" > + depends on XFS_FS && !XFS_DEBUG > + help > + Say Y here to get an XFS build with many additional warnings. > + It converts ASSERT checks to WARN, so will log any out-of-bounds > + conditions that occur that would otherwise be missed. It is much > + lighter weight than XFS_DEBUG and does not modify algorithms and will > + not cause the kernel to panic on non-fatal errors. > + > + However, similar to XFS_DEBUG, it is only advisable to use this if you > + are debugging a particular problem. > + > config XFS_DEBUG > bool "XFS Debugging support" > depends on XFS_FS > diff --git a/fs/xfs/mrlock.h b/fs/xfs/mrlock.h > index ff6a198..e3c92d1 100644 > --- a/fs/xfs/mrlock.h > +++ b/fs/xfs/mrlock.h > @@ -22,12 +22,12 @@ > > typedef struct { > struct rw_semaphore mr_lock; > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > int mr_writer; > #endif > } mrlock_t; > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > #define mrinit(mrp, name) \ > do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) > #else > @@ -46,7 +46,7 @@ static inline void mraccess_nested(mrlock_t *mrp, int subclass) > static inline void mrupdate_nested(mrlock_t *mrp, int subclass) > { > down_write_nested(&mrp->mr_lock, subclass); > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > mrp->mr_writer = 1; > #endif > } > @@ -60,7 +60,7 @@ static inline int mrtryupdate(mrlock_t *mrp) > { > if (!down_write_trylock(&mrp->mr_lock)) > return 0; > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > mrp->mr_writer = 1; > #endif > return 1; > @@ -68,7 +68,7 @@ static inline int mrtryupdate(mrlock_t *mrp) > > static inline void mrunlock_excl(mrlock_t *mrp) > { > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > mrp->mr_writer = 0; > #endif > up_write(&mrp->mr_lock); > @@ -81,7 +81,7 @@ static inline void mrunlock_shared(mrlock_t *mrp) > > static inline void mrdemote(mrlock_t *mrp) > { > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > mrp->mr_writer = 0; > #endif > downgrade_write(&mrp->mr_lock); > diff --git a/fs/xfs/xfs.h b/fs/xfs/xfs.h > index d8b11b7..a742c47 100644 > --- a/fs/xfs/xfs.h > +++ b/fs/xfs/xfs.h > @@ -24,6 +24,11 @@ > #define XFS_BUF_LOCK_TRACKING 1 > #endif > > +#ifdef CONFIG_XFS_WARN > +#define XFS_WARN 1 > +#endif > + > + > #include "xfs_linux.h" > > #endif /* __XFS_H__ */ > diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c > index b1ddef6..cbcd34b 100644 > --- a/fs/xfs/xfs_alloc_btree.c > +++ b/fs/xfs/xfs_alloc_btree.c > @@ -348,7 +348,7 @@ const struct xfs_buf_ops xfs_allocbt_buf_ops = { > }; > > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > STATIC int > xfs_allocbt_keys_inorder( > struct xfs_btree_cur *cur, > @@ -404,7 +404,7 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { > .init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur, > .key_diff = xfs_allocbt_key_diff, > .buf_ops = &xfs_allocbt_buf_ops, > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > .keys_inorder = xfs_allocbt_keys_inorder, > .recs_inorder = xfs_allocbt_recs_inorder, > #endif > diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c > index 061b45c..5eaaa4b 100644 > --- a/fs/xfs/xfs_bmap_btree.c > +++ b/fs/xfs/xfs_bmap_btree.c > @@ -769,7 +769,7 @@ const struct xfs_buf_ops xfs_bmbt_buf_ops = { > }; > > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > STATIC int > xfs_bmbt_keys_inorder( > struct xfs_btree_cur *cur, > @@ -809,7 +809,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { > .init_ptr_from_cur = xfs_bmbt_init_ptr_from_cur, > .key_diff = xfs_bmbt_key_diff, > .buf_ops = &xfs_bmbt_buf_ops, > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > .keys_inorder = xfs_bmbt_keys_inorder, > .recs_inorder = xfs_bmbt_recs_inorder, > #endif > diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h > index f932897..6302e9a 100644 > --- a/fs/xfs/xfs_btree.h > +++ b/fs/xfs/xfs_btree.h > @@ -190,7 +190,7 @@ struct xfs_btree_ops { > > const struct xfs_buf_ops *buf_ops; > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > /* check that k1 is lower than k2 */ > int (*keys_inorder)(struct xfs_btree_cur *cur, > union xfs_btree_key *k1, > diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c > index 5980f9b..33177c3 100644 > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -811,7 +811,7 @@ xfs_dir2_leafn_rebalance( > xfs_dir2_leaf_t *leaf1; /* first leaf structure */ > xfs_dir2_leaf_t *leaf2; /* second leaf structure */ > int mid; /* midpoint leaf index */ > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > int oldstale; /* old count of stale leaves */ > #endif > int oldsum; /* old total leaf count */ > @@ -831,7 +831,7 @@ xfs_dir2_leafn_rebalance( > leaf1 = blk1->bp->b_addr; > leaf2 = blk2->bp->b_addr; > oldsum = be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count); > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > oldstale = be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale); > #endif > mid = oldsum >> 1; > diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c > index bec344b..7b9c7be 100644 > --- a/fs/xfs/xfs_ialloc_btree.c > +++ b/fs/xfs/xfs_ialloc_btree.c > @@ -235,7 +235,7 @@ const struct xfs_buf_ops xfs_inobt_buf_ops = { > .verify_write = xfs_inobt_write_verify, > }; > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > STATIC int > xfs_inobt_keys_inorder( > struct xfs_btree_cur *cur, > @@ -273,7 +273,7 @@ static const struct xfs_btree_ops xfs_inobt_ops = { > .init_ptr_from_cur = xfs_inobt_init_ptr_from_cur, > .key_diff = xfs_inobt_key_diff, > .buf_ops = &xfs_inobt_buf_ops, > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > .keys_inorder = xfs_inobt_keys_inorder, > .recs_inorder = xfs_inobt_recs_inorder, > #endif > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 4f20165..4630d47 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -286,7 +286,7 @@ xfs_ilock_demote( > trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_); > } > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > int > xfs_isilocked( > xfs_inode_t *ip, > diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h > index 14e59d9..800f896 100644 > --- a/fs/xfs/xfs_linux.h > +++ b/fs/xfs/xfs_linux.h > @@ -293,22 +293,34 @@ static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y) > #define ASSERT_ALWAYS(expr) \ > (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) > > -#ifndef DEBUG > -#define ASSERT(expr) ((void)0) > +#ifdef DEBUG > +#define ASSERT(expr) \ > + (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) > > #ifndef STATIC > -# define STATIC static noinline > +# define STATIC noinline > #endif > > -#else /* DEBUG */ > +#else /* !DEBUG */ > + > +#ifdef XFS_WARN > > #define ASSERT(expr) \ > - (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) > + (unlikely(expr) ? (void)0 : asswarn(#expr, __FILE__, __LINE__)) > > #ifndef STATIC > -# define STATIC noinline > +# define STATIC static noinline > +#endif > + > +#else /* !DEBUG && !XFS_WARN */ > + > +#define ASSERT(expr) ((void)0) > + > +#ifndef STATIC > +# define STATIC static noinline > #endif > > +#endif /* XFS_WARN */ > #endif /* DEBUG */ > > #endif /* __XFS_LINUX__ */ > diff --git a/fs/xfs/xfs_message.c b/fs/xfs/xfs_message.c > index 331cd9f..9163dc1 100644 > --- a/fs/xfs/xfs_message.c > +++ b/fs/xfs/xfs_message.c > @@ -93,6 +93,14 @@ xfs_alert_tag( > } > > void > +asswarn(char *expr, char *file, int line) > +{ > + xfs_warn(NULL, "Assertion failed: %s, file: %s, line: %d", > + expr, file, line); > + WARN_ON(1); > +} > + > +void > assfail(char *expr, char *file, int line) > { > xfs_emerg(NULL, "Assertion failed: %s, file: %s, line: %d", > diff --git a/fs/xfs/xfs_message.h b/fs/xfs/xfs_message.h > index 76c8198..8540115 100644 > --- a/fs/xfs/xfs_message.h > +++ b/fs/xfs/xfs_message.h > @@ -57,6 +57,7 @@ do { \ > xfs_printk_ratelimited(xfs_debug, dev, fmt, ##__VA_ARGS__) > > extern void assfail(char *expr, char *f, int l); > +extern void asswarn(char *expr, char *f, int l); > > extern void xfs_hex_dump(void *p, int length); > > diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h > index cd29f61..a44dba5 100644 > --- a/fs/xfs/xfs_trans.h > +++ b/fs/xfs/xfs_trans.h > @@ -405,7 +405,7 @@ typedef struct xfs_trans { > int64_t t_res_fdblocks_delta; /* on-disk only chg */ > int64_t t_frextents_delta;/* superblock freextents chg*/ > int64_t t_res_frextents_delta; /* on-disk only chg */ > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > int64_t t_ag_freeblks_delta; /* debugging counter */ > int64_t t_ag_flist_delta; /* debugging counter */ > int64_t t_ag_btree_delta; /* debugging counter */ > @@ -433,7 +433,7 @@ typedef struct xfs_trans { > #define xfs_trans_get_block_res(tp) ((tp)->t_blk_res) > #define xfs_trans_set_sync(tp) ((tp)->t_flags |= XFS_TRANS_SYNC) > > -#ifdef DEBUG > +#if defined(DEBUG) || defined(XFS_WARN) > #define xfs_trans_agblocks_delta(tp, d) ((tp)->t_ag_freeblks_delta += (int64_t)d) > #define xfs_trans_agflist_delta(tp, d) ((tp)->t_ag_flist_delta += (int64_t)d) > #define xfs_trans_agbtree_delta(tp, d) ((tp)->t_ag_btree_delta += (int64_t)d) > From rjohnston@sgi.com Thu Apr 25 09:59:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A62CA29E03 for ; Thu, 25 Apr 2013 09:59:20 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 82C7130405F for ; Thu, 25 Apr 2013 07:59:20 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Thu, 25 Apr 2013 09:59:20 -0500 Message-ID: <517944D8.3030605@sgi.com> Date: Thu, 25 Apr 2013 09:59:36 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Subject: Re: [PATCH 1/3 V2] xfsprogs: manpage spelling fixes References: <5175BB8F.5090604@sandeen.net> <5175BC20.9010403@sandeen.net> <517939B8.2010701@sandeen.net> In-Reply-To: <517939B8.2010701@sandeen.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Sorry for being so picky. Thanks for V2! Looks good. Reviewed-by: Rich Johnston From sandeen@sandeen.net Thu Apr 25 10:03:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 923E729DFA for ; Thu, 25 Apr 2013 10:03:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F2692AC007 for ; Thu, 25 Apr 2013 08:03:49 -0700 (PDT) X-ASG-Debug-ID: 1366902227-04cb6c529301230001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id SPZqmb6Ju2f83kfp for ; Thu, 25 Apr 2013 08:03:47 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7E0DE63C59BC for ; Thu, 25 Apr 2013 10:03:47 -0500 (CDT) Message-ID: <517945D3.4020701@sandeen.net> Date: Thu, 25 Apr 2013 10:03:47 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 2/3 V2] xfsprogs: Fix manpages for missing or incorrect options References: <5175BB8F.5090604@sandeen.net> <5175BC67.1000902@sandeen.net> X-ASG-Orig-Subj: [PATCH 2/3 V2] xfsprogs: Fix manpages for missing or incorrect options In-Reply-To: <5175BC67.1000902@sandeen.net> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366902227 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129133 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add valid options which aren't in manpages, and remove invalid options which are in manpages: * Document -V (show version and exit) for many manpages. * Remove -? option from xfs_estimate.8 * Document -p passes, -d (debug) and -g (syslog) in xfs_fsr.8 * Document -n (O_NONBLOCK) in xfs_io.8 * Document -v (print overwrite) in xfs_logprint.8 * Document -m max_extents in xfs_metadump.8 * Document -p (preallocate) in xfs_mkfile.8 Signed-off-by: Eric Sandeeen --- V2: move "-V" SYNOPSIS to their own line, move -V documentation to end of option documentation list diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 index f707881..04c19b4 100644 --- a/man/man8/mkfs.xfs.8 +++ b/man/man8/mkfs.xfs.8 @@ -40,6 +40,8 @@ mkfs.xfs \- construct an XFS filesystem .B \-K ] .I device +.br +.B mkfs.xfs \-V .SH DESCRIPTION .B mkfs.xfs constructs an XFS filesystem by writing on a special @@ -728,6 +730,9 @@ creating the file system. .TP .B \-K Do not attempt to discard blocks at mkfs time. +.TP +.B \-V +Prints the version number and exits. .SH SEE ALSO .BR xfs (5), .BR mkfs (8), diff --git a/man/man8/xfs_admin.8 b/man/man8/xfs_admin.8 index 2de907b..b393d74 100644 --- a/man/man8/xfs_admin.8 +++ b/man/man8/xfs_admin.8 @@ -15,6 +15,8 @@ xfs_admin \- change parameters of an XFS filesystem .I uuid ] .I device +.br +.B xfs_admin \-V .SH DESCRIPTION .B xfs_admin uses the @@ -97,6 +99,9 @@ The may also be .BR generate , which will generate a new UUID for the filesystem. +.TP +.B \-V +Prints the version number and exits. .PP The .BR mount (8) diff --git a/man/man8/xfs_bmap.8 b/man/man8/xfs_bmap.8 index ccaa79b..e196559 100644 --- a/man/man8/xfs_bmap.8 +++ b/man/man8/xfs_bmap.8 @@ -10,6 +10,8 @@ xfs_bmap \- print block mapping for an XFS file .I num_extents ] .I file +.br +.B xfs_bmap \-V .SH DESCRIPTION .B xfs_bmap prints the map of disk blocks used by files in an XFS filesystem. @@ -91,6 +93,9 @@ A second option will print out the .I flags legend. +.TP +.B \-V +Prints the version number and exits. .SH SEE ALSO .BR xfs_fsr (8), .BR xfs (5). diff --git a/man/man8/xfs_check.8 b/man/man8/xfs_check.8 index 1654532..23027ca 100644 --- a/man/man8/xfs_check.8 +++ b/man/man8/xfs_check.8 @@ -20,6 +20,8 @@ xfs_check \- check XFS filesystem consistency .I logdev ] .I device +.br +.B xfs_check \-V .SH DESCRIPTION .B xfs_check checks whether an XFS filesystem is consistent. @@ -89,6 +91,9 @@ Conversion between disk addresses (i.e. addresses reported by and file system blocks may be accomplished using .BR xfs_db "(8)'s " convert command. +.TP +.B \-V +Prints the version number and exits. .PP Any output that is produced when .B xfs_check diff --git a/man/man8/xfs_copy.8 b/man/man8/xfs_copy.8 index 3028db8..1eaf85d 100644 --- a/man/man8/xfs_copy.8 +++ b/man/man8/xfs_copy.8 @@ -13,6 +13,8 @@ xfs_copy \- copy the contents of an XFS filesystem [ .I target2 \&... ] +.br +.B xfs_copy \-V .SH DESCRIPTION .B xfs_copy copies an XFS filesystem to one or more targets in parallel (see @@ -87,6 +89,9 @@ Specifies the location of the if the default location of .I /var/tmp/xfs_copy.log.XXXXXX is not desired. +.TP +.B \-V +Prints the version number and exits. .SH DIAGNOSTICS .B xfs_copy reports errors to both diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 index 0558671..7a43a2c 100644 --- a/man/man8/xfs_db.8 +++ b/man/man8/xfs_db.8 @@ -103,7 +103,7 @@ and commands. .TP .B \-V -Prints out the current version number and exits. +Prints the version number and exits. .SH CONCEPTS .B xfs_db commands can be broken up into two classes. Most commands are for diff --git a/man/man8/xfs_estimate.8 b/man/man8/xfs_estimate.8 index bb458ec..2594eb8 100644 --- a/man/man8/xfs_estimate.8 +++ b/man/man8/xfs_estimate.8 @@ -3,8 +3,10 @@ xfs_estimate \- estimate the space that an XFS filesystem will take .SH SYNOPSIS .nf -\f3xfs_estimate\f1 [ \f3\-h?\f1 ] [ \f3\-b\f1 blocksize ] [ \f3\-i\f1 logsize ] +\f3xfs_estimate\f1 [ \f3\-h\f1 ] [ \f3\-b\f1 blocksize ] [ \f3\-i\f1 logsize ] [ \f3\-e\f1 logsize ] [ \f3\-v\f1 ] directory ... +.br +.B xfs_estimate \-V .fi .SH DESCRIPTION For each \f2directory\f1 argument, @@ -51,9 +53,6 @@ Display more information, formatted. .B \-h Display usage message. .TP -.B \-? -Display usage message. -.TP \f3\-i, \-e\f1 \f2logsize\f1 Use .I logsize @@ -77,6 +76,9 @@ For example, .IP requests an estimate of the space required by the directory / on an XFS filesystem using an internal log of 1 megabyte. +.TP +.B \-V +Print the version number and exits. .SH EXAMPLES .nf .sp 8v diff --git a/man/man8/xfs_freeze.8 b/man/man8/xfs_freeze.8 index 97c7911..c581ad7 100644 --- a/man/man8/xfs_freeze.8 +++ b/man/man8/xfs_freeze.8 @@ -2,10 +2,15 @@ .SH NAME xfs_freeze \- suspend access to an XFS filesystem .SH SYNOPSIS -.B xfs_freeze \-f +.B xfs_freeze +[ +.B \-f | .B \-u +] .I mount-point +.br +.B xfs_freeze \-V .fi .SH DESCRIPTION .B xfs_freeze @@ -25,6 +30,7 @@ is mounted. The filesystem must be mounted to be frozen (see .BR mount (8)). .PP +.PP The .B \-f flag requests the specified XFS filesystem to be @@ -48,7 +54,13 @@ operations to continue. Any filesystem modifications that were blocked by the freeze are unblocked and allowed to complete. .PP -One of +The +.B \-V +flag prints the version number and exits. +.PP +Unless +.B \-V +is specified, one of .B \-f or .B \-u diff --git a/man/man8/xfs_fsr.8 b/man/man8/xfs_fsr.8 index bf5e942..0a162b6 100644 --- a/man/man8/xfs_fsr.8 +++ b/man/man8/xfs_fsr.8 @@ -3,10 +3,12 @@ xfs_fsr \- filesystem reorganizer for XFS .SH SYNOPSIS .nf -\f3xfs_fsr\f1 [\f3\-v\f1] \c -[\f3\-t\f1 seconds] [\f3\-f\f1 leftoff] [\f3\-m\f1 mtab] -\f3xfs_fsr\f1 [\f3\-v\f1] \c +\f3xfs_fsr\f1 [\f3\-vdg\f1] \c +[\f3\-t\f1 seconds] [\f3\-p\f1 passes] [\f3\-f\f1 leftoff] [\f3\-m\f1 mtab] +\f3xfs_fsr\f1 [\f3\-vdg\f1] \c [xfsdev | file] ... +.br +.B xfs_fsr \-V .fi .SH DESCRIPTION .I xfs_fsr @@ -35,7 +37,11 @@ The default is to use .TP .BI \-t " seconds" How long to reorganize. -The default is 7200 (2 hours). +The default is 7200 seconds (2 hours). +.TP +.BI \-p " passes" +Number of passes before terminating global re-org. +The default is 10 passes. .TP .BI \-f " leftoff" Use this file instead of @@ -47,6 +53,16 @@ to store the state of where reorganization left off. Verbose. Print cryptic information about each file being reorganized. +.TP +.B \-d +Debug. Print even more cryptic information. +.TP +.B \-g +Print to syslog (default if stdout not a tty). +.TP +.B \-V +Prints the version number and exits. + .PP When invoked with no arguments .I xfs_fsr diff --git a/man/man8/xfs_growfs.8 b/man/man8/xfs_growfs.8 index b55438b..e23d30e 100644 --- a/man/man8/xfs_growfs.8 +++ b/man/man8/xfs_growfs.8 @@ -15,7 +15,7 @@ xfs_growfs, xfs_info \- expand an XFS filesystem .SH SYNOPSIS .B xfs_growfs [ -.B \-dilnrxV +.B \-dilnrx ] [ .B \-D .I size @@ -37,12 +37,17 @@ xfs_growfs, xfs_info \- expand an XFS filesystem ] .I mount-point .br +.B xfs_growfs \-V +.PP +.br .B xfs_info [ .B \-t .I mtab ] .I mount-point +.br +.B xfs_info \-V .SH DESCRIPTION .B xfs_growfs expands an existing XFS filesystem (see diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 33a5944..5e3535b 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -13,6 +13,8 @@ xfs_io \- debug the I/O path of an XFS filesystem .I prog ] .I file +.br +.B xfs_io \-V .SH DESCRIPTION .B xfs_io is a debugging tool like @@ -52,6 +54,9 @@ is immutable or append-only. .B \-x Expert mode. Dangerous commands are only available in this mode. These commands also tend to require additional privileges. +.TP +.B \-V +Prints the version number and exits. .PP The other .BR open (2) @@ -111,6 +116,9 @@ opens for synchronous I/O (O_SYNC). .B \-t truncates on open (O_TRUNC). .TP +.B \-n +opens in non-blocking mode if possible (O_NONBLOCK). +.TP .B \-R marks the file as a realtime XFS file after opening it, if it is not already marked as such. diff --git a/man/man8/xfs_logprint.8 b/man/man8/xfs_logprint.8 index c1a8077..16e881e 100644 --- a/man/man8/xfs_logprint.8 +++ b/man/man8/xfs_logprint.8 @@ -97,6 +97,12 @@ Override any notion of where to start printing. .TP .B \-t Print out the transactional view. +.TP +.B \-v +Print "overwrite" data. +.TP +.B \-V +Prints the version number and exits. .SH SEE ALSO .BR mkfs.xfs (8), .BR mount (8). diff --git a/man/man8/xfs_mdrestore.8 b/man/man8/xfs_mdrestore.8 index 7b9ba89..51297c4 100644 --- a/man/man8/xfs_mdrestore.8 +++ b/man/man8/xfs_mdrestore.8 @@ -8,6 +8,8 @@ xfs_mdrestore \- restores an XFS metadump image to a filesystem image ] .I source .I target +.br +.B xfs_mdrestore \-V .SH DESCRIPTION .B xfs_mdrestore is a debugging tool that restores a metadata image generated by @@ -36,6 +38,9 @@ can be destroyed. .TP .B \-g Shows restore progress on stdout. +.TP +.B \-V +Prints the version number and exits. .SH DIAGNOSTICS .B xfs_mdrestore returns an exit code of 0 if all the metadata is successfully restored or diff --git a/man/man8/xfs_metadump.8 b/man/man8/xfs_metadump.8 index 9672713..26cea97 100644 --- a/man/man8/xfs_metadump.8 +++ b/man/man8/xfs_metadump.8 @@ -6,11 +6,17 @@ xfs_metadump \- copy XFS filesystem metadata to a file [ .B \-efgow ] [ +.B \-m +.I max_extents +] +] [ .B \-l .I logdev ] .I source .I target +.br +.B xfs_metadump \-V .SH DESCRIPTION .B xfs_metadump is a debugging tool that copies the metadata from an XFS filesystem to a file. @@ -94,12 +100,20 @@ For filesystems which use an external log, this specifies the device where the external log resides. The external log is not copied, only internal logs are copied. .TP +.B \-m +Set the maximum size of an allowed metadata extent. Extremely large metadata +extents are likely to be corrupt, and will be skipped if they exceed +this value. The default size is 1000 blocks. +.TP .B \-o Disables obfuscation of file names and extended attributes. .TP .B \-w Prints warnings of inconsistent metadata encountered to stderr. Bad metadata is still copied. +.TP +.B \-V +Prints the version number and exits. .SH DIAGNOSTICS .B xfs_metadump returns an exit code of 0 if all readable metadata is successfully copied or diff --git a/man/man8/xfs_mkfile.8 b/man/man8/xfs_mkfile.8 index 96f443f..abaa4e6 100644 --- a/man/man8/xfs_mkfile.8 +++ b/man/man8/xfs_mkfile.8 @@ -7,10 +7,14 @@ xfs_mkfile \- create an XFS file .B \-v ] [ .B \-n +] [ +.B \-p ] .I size\c .RB [ k | b | m | g ] .IR filename " ..." +.br +.B xfs_mkfile \-V .SH DESCRIPTION .B xfs_mkfile creates one or more files. The file is padded with zeroes by default. @@ -30,3 +34,10 @@ Verbose. Report the names and sizes of created files. .B \-n No bytes. Create a holey file - that is, do not write out any data, just seek to end of file and write a block. +.TP +.B \-p +Preallocate. The file is preallocated, then overwritten with zeroes, +then truncated to the desired size. +.TP +.B \-V +Prints the version number and exits. diff --git a/man/man8/xfs_ncheck.8 b/man/man8/xfs_ncheck.8 index 408919d..4099772 100644 --- a/man/man8/xfs_ncheck.8 +++ b/man/man8/xfs_ncheck.8 @@ -15,6 +15,8 @@ xfs_ncheck \- generate pathnames from i-numbers for XFS .I logdev ] .I device +.br +.B xfs_ncheck \-V .SH DESCRIPTION .B xfs_ncheck with no @@ -56,6 +58,9 @@ This option may be used to detect violations of security policy. .BI \-i " ino" Limits the report to only those files whose inode numbers follow. May be given multiple times to select multiple inode numbers. +.TP +.B \-V +Prints the version number and exits. .PP If the filesystem is seriously corrupted, or very busy and looks like it is corrupt, a message of the form that would be generated by diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 index 9327feb..8cc8ab7 100644 --- a/man/man8/xfs_quota.8 +++ b/man/man8/xfs_quota.8 @@ -16,6 +16,8 @@ xfs_quota \- manage use of quota on XFS filesystems .I project ] ... [ .IR path " ... ]" +.br +.B xfs_quota \-V .SH DESCRIPTION .B xfs_quota is a utility for reporting and editing various aspects of filesystem quota. @@ -50,6 +52,9 @@ which restricts the output of the individual commands to the set of projects specified. Multiple .B \-d arguments may be given. +.TP +.B \-V +Prints the version number and exits. .PP The optional .I path diff --git a/man/man8/xfs_repair.8 b/man/man8/xfs_repair.8 index 7b296ba..96adb29 100644 --- a/man/man8/xfs_repair.8 +++ b/man/man8/xfs_repair.8 @@ -173,7 +173,7 @@ to repair an XFS filesystem mounted read only. This is typically done on a root filesystem from single user mode, immediately followed by a reboot. .TP .B \-V -Prints out the current version number and exits. +Prints the version number and exits. .SS Checks Performed Inconsistencies corrected include the following: .IP 1. diff --git a/man/man8/xfs_rtcp.8 b/man/man8/xfs_rtcp.8 index be81cb3..40e9097 100644 --- a/man/man8/xfs_rtcp.8 +++ b/man/man8/xfs_rtcp.8 @@ -10,6 +10,8 @@ xfs_rtcp \- XFS realtime copy command .B -p ] .IR source " ... " target +.br +.B xfs_rtcp \-V .SH DESCRIPTION .B xfs_rtcp copies a file to the realtime partition on an XFS filesystem. @@ -35,6 +37,9 @@ will pad the destination file to a size which is an even multiple of the filesystem block size. This is necessary since the realtime file is created using direct I/O and the minimum I/O is the filesystem block size. +.TP +.B \-V +Prints the version number and exits. .SH SEE ALSO .BR xfs (5), .BR mkfs.xfs (8), From sandeen@sandeen.net Thu Apr 25 10:16:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B984D29DFA for ; Thu, 25 Apr 2013 10:16:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 333A7AC004 for ; Thu, 25 Apr 2013 08:16:37 -0700 (PDT) X-ASG-Debug-ID: 1366902995-04cb6c529602290001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id VyGb3i6bw4KDi3UO for ; Thu, 25 Apr 2013 08:16:35 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id DD90563C59BC for ; Thu, 25 Apr 2013 10:16:34 -0500 (CDT) Message-ID: <517948D2.7070706@sandeen.net> Date: Thu, 25 Apr 2013 10:16:34 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 3/3 V2] xfsprogs: Fix up usage() errors and omissions References: <5175BB8F.5090604@sandeen.net> <5175BCBE.8040306@sandeen.net> X-ASG-Orig-Subj: [PATCH 3/3 V2] xfsprogs: Fix up usage() errors and omissions In-Reply-To: <5175BCBE.8040306@sandeen.net> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366902995 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_RULE_7580D X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129133 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.75 BSF_RULE_7580D Custom Rule 7580D Add missing options and remove invalid options in usage() output strings. * Add -V to several usage() strings * Remove deprecated/invalid -n and -s otions from xfs_fsr's usage * Remove invalid -I option from xfs_growfs's usage * Add -n (O_NONBLOCK) option to xfs_io's usage * Add -e (exit on error) option to xfs_logprint's usage * Remove invalid -b option from xfs_mdrestore's usage * Add -N (no-op), -K (no discard), and -f (force) to mkfs.xfs's usage * Add -x (expert) option to xfs_quota's usage Signed-off-by: Eric Sandeen --- V2: address Rich's nitpicky review ;) (i.e. fix good stuff) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index c01e0b9..7f65de3 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -301,7 +301,7 @@ void usage(void) { fprintf(stderr, - _("Usage: %s [-bd] [-L logfile] source target [target ...]\n"), + _("Usage: %s [-bdV] [-L logfile] source target [target ...]\n"), progname); exit(1); } diff --git a/db/init.c b/db/init.c index 2a31cb8..0e9e1a2 100644 --- a/db/init.c +++ b/db/init.c @@ -43,7 +43,7 @@ static void usage(void) { fprintf(stderr, _( - "Usage: %s [-fFrxV] [-p prog] [-l logdev] [-c cmd]... device\n" + "Usage: %s [-ifFrxV] [-p prog] [-l logdev] [-c cmd]... device\n" ), progname); exit(1); } diff --git a/estimate/xfs_estimate.c b/estimate/xfs_estimate.c index 54a72e9..ddc6f62 100644 --- a/estimate/xfs_estimate.c +++ b/estimate/xfs_estimate.c @@ -78,6 +78,7 @@ usage(char *progname) "\t-i logsize (internal log size)\n" "\t-e logsize (external log size)\n" "\t-v prints more verbose messages\n" + "\t-V prints version and exits\n" "\t-h prints this usage message\n\n" "Note:\tblocksize may have 'k' appended to indicate x1024\n" "\tlogsize may also have 'm' appended to indicate (1024 x 1024)\n"), diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 3d017ca..6852b3f 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -386,20 +386,19 @@ void usage(int ret) { fprintf(stderr, _( -"Usage: %s [-d] [-v] [-n] [-s] [-g] [-t time] [-p passes] [-f leftf] [-m mtab]\n" -" %s [-d] [-v] [-n] [-s] [-g] xfsdev | dir | file ...\n\n" +"Usage: %s [-d] [-v] [-g] [-t time] [-p passes] [-f leftf] [-m mtab]\n" +" %s [-d] [-v] [-g] xfsdev | dir | file ...\n" +" %s -V\n\n" "Options:\n" -" -n Do nothing, only interesting with -v. Not\n" -" effective with in mtab mode.\n" -" -s Print statistics only.\n" " -g Print to syslog (default if stdout not a tty).\n" " -t time How long to run in seconds.\n" -" -p passes Number of passes before terminating global re-org.\n" +" -p passes Number of passes before terminating global re-org.\n" " -f leftoff Use this instead of %s.\n" " -m mtab Use something other than /etc/mtab.\n" " -d Debug, print even more.\n" -" -v Verbose, more -v's more verbose.\n" - ), progname, progname, _PATH_FSRLAST); +" -v Verbose, more -v's more verbose.\n" +" -V Print version number and exit.\n" + ), progname, progname, progname, _PATH_FSRLAST); exit(ret); } diff --git a/growfs/xfs_growfs.c b/growfs/xfs_growfs.c index a6d298b..5d544da 100644 --- a/growfs/xfs_growfs.c +++ b/growfs/xfs_growfs.c @@ -19,14 +19,6 @@ #include #include -/* - * When growing a filesystem, this is the most significant - * bits we'll accept in the resulting inode numbers - * without warning the user. - */ - -#define XFS_MAX_INODE_SIG_BITS 32 - static void usage(void) { @@ -37,7 +29,6 @@ Options:\n\ -l grow log section\n\ -r grow realtime section\n\ -n don't change anything, just show geometry\n\ - -I allow inode numbers to exceed %d significant bits\n\ -i convert log from external to internal format\n\ -t alternate location for mount table (/etc/mtab)\n\ -x convert log from internal to external format\n\ @@ -47,7 +38,7 @@ Options:\n\ -e size set realtime extent size to size blks\n\ -m imaxpct set inode max percent to imaxpct\n\ -V print version information\n"), - progname, XFS_MAX_INODE_SIG_BITS); + progname); exit(2); } diff --git a/io/init.c b/io/init.c index fb93082..ca3055a 100644 --- a/io/init.c +++ b/io/init.c @@ -32,7 +32,7 @@ void usage(void) { fprintf(stderr, - _("Usage: %s [-adfmrRstx] [-p prog] [-c cmd]... file\n"), + _("Usage: %s [-adfmnrRstVx] [-p prog] [-c cmd]... file\n"), progname); exit(1); } diff --git a/io/xfs_freeze.sh b/io/xfs_freeze.sh index 45e20d2..647aa96 100644 --- a/io/xfs_freeze.sh +++ b/io/xfs_freeze.sh @@ -4,7 +4,7 @@ # OPTS="" -USAGE="Usage: xfs_freeze -f | -u " +USAGE="Usage: xfs_freeze [-V] [-f | -u] " DIRNAME=`dirname $0` VERSION=false FREEZE=false diff --git a/logprint/logprint.c b/logprint/logprint.c index 482fd4e..0923b0a 100644 --- a/logprint/logprint.c +++ b/logprint/logprint.c @@ -44,6 +44,7 @@ Options:\n\ -c try to continue if error found in log\n\ -C copy the log from the filesystem to filename\n\ -d dump the log in log-record format\n\ + -e exit when an error is found in the log\n\ -f specified device is actually a file\n\ -l filename of external log\n\ -n don't try and interpret log data\n\ diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index 509a3ed..479e677 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -178,7 +178,7 @@ perform_restore( static void usage(void) { - fprintf(stderr, "Usage: %s [-bg] source target\n", progname); + fprintf(stderr, "Usage: %s [-V] [-g] source target\n", progname); exit(1); } diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index c57a855..a393607 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2899,13 +2899,16 @@ usage( void ) /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num,\n\ (sunit=value,swidth=value|su=num,sw=num),\n\ sectlog=n|sectsize=num\n\ +/* force overwrite */ [-f]\n\ /* inode size */ [-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2,\n\ projid32bit=0|1]\n\ +/* no discard */ [-K]\n\ /* log subvol */ [-l agnum=n,internal,size=num,logdev=xxx,version=n\n\ sunit=value|su=num,sectlog=n|sectsize=num,\n\ lazy-count=0|1]\n\ /* label */ [-L label (maximum 12 characters)]\n\ /* naming */ [-n log=n|size=num,version=2|ci]\n\ +/* no-op info only */ [-N]\n\ /* prototype file */ [-p fname]\n\ /* quiet */ [-q]\n\ /* realtime subvol */ [-r extsize=num,size=num,rtdev=xxx]\n\ diff --git a/quota/init.c b/quota/init.c index 0b481f7..639e9e7 100644 --- a/quota/init.c +++ b/quota/init.c @@ -45,7 +45,7 @@ static void usage(void) { fprintf(stderr, - _("Usage: %s [-p prog] [-c cmd]... [-d project]... [path]\n"), + _("Usage: %s [-V] [-x] [-p prog] [-c cmd]... [-d project]... [path]\n"), progname); exit(1); } diff --git a/rtcp/xfs_rtcp.c b/rtcp/xfs_rtcp.c index 6ea7ab9..f0b5936 100644 --- a/rtcp/xfs_rtcp.c +++ b/rtcp/xfs_rtcp.c @@ -27,7 +27,7 @@ char *progname; void usage() { - fprintf(stderr, _("%s [-e extsize] [-p] source target\n"), progname); + fprintf(stderr, _("%s [-e extsize] [-p] [-V] source target\n"), progname); exit(2); } From rjohnston@sgi.com Thu Apr 25 10:26:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DB0B129DFA for ; Thu, 25 Apr 2013 10:26:10 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id BBB24304051; Thu, 25 Apr 2013 08:26:07 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Thu, 25 Apr 2013 10:26:07 -0500 Message-ID: <51794B1F.2040506@sgi.com> Date: Thu, 25 Apr 2013 10:26:23 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH 2/3 V2] xfsprogs: Fix manpages for missing or incorrect options References: <5175BB8F.5090604@sandeen.net> <5175BC67.1000902@sandeen.net> <517945D3.4020701@sandeen.net> In-Reply-To: <517945D3.4020701@sandeen.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks Eric for posing V2. Looks good. Reviewed-by: Rich Johnston From service-client@espriv05.com Thu Apr 25 10:34:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.6 required=5.0 tests=HTML_MESSAGE,MIME_HTML_MOSTLY, MPART_ALT_DIFF,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8E63929DFA for ; Thu, 25 Apr 2013 10:34:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F0D18F8033 for ; Thu, 25 Apr 2013 08:34:46 -0700 (PDT) X-ASG-Debug-ID: 1366904082-04cb6c529603a60001-NocioJ Received: from s2.espriv05.com (s2.espriv05.com [178.32.20.8]) by cuda.sgi.com with ESMTP id XqtSJoMk23YEGrV4 for ; Thu, 25 Apr 2013 08:34:42 -0700 (PDT) X-Barracuda-Envelope-From: service-client@espriv05.com X-Barracuda-Apparent-Source-IP: 178.32.20.8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=espriv05.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@espriv05.com; bh=9YumtrSIuOG/VLCnlQFxifD2i0bQGj5ClEDLYxIBIXU=; b=Co0RhLkLnTvhsvBZgn6dj0XN14GjRHwFSj//lrMviLQgpAdxI6ov2PmsZQa4LIYQgv/zcVC7Znl0 5VLR0XRCW+ITcy83p1Pl+R9bs325qEjN3A049eVekwMdEQEqinGXoXjf+HgvAUruIY2LiZJX5Ol/ fOYYFXhrYQqvljl0Pps= From: Guide des radiateurs a inertie X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 40822 X-EN-uuid: 1005-100540822-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Le meilleur choix pour reduire votre facture de chauffage MIME-Version: 1.0 X-ASG-Orig-Subj: Le meilleur choix pour reduire votre facture de chauffage List-Unsubscribe: http://track.espriv05.com/KcntxkSJuJcFOD8bdL1RPlbj1BZVOHjO9SWaWYupKAU.html, Content-Type: multipart/alternative; boundary=52a243f138c482b5168de0b7c58d042b Message-ID: <0.0.0.532.1CE41C9F2A186B4.0@s2.espriv05.com> Date: Thu, 25 Apr 2013 17:31:25 +0200 X-Barracuda-Connect: s2.espriv05.com[178.32.20.8] X-Barracuda-Start-Time: 1366904082 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.25 X-Barracuda-Spam-Status: No, SCORE=0.25 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, INFO_TLD, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129135 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 INFO_TLD URI: Contains an URL in the INFO top-level domain 0.00 MIME_HTML_MOSTLY BODY: Multipart message mostly text/html MIME 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary --52a243f138c482b5168de0b7c58d042b Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --52a243f138c482b5168de0b7c58d042b Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit Mieux Choisir son radiateur electrique

                                 
                                 
    Quel radiateur électrique choisir?
           
      Convecteur?   Panneau
rayonnant?
   
 
                       
 
      Réchauffement de l´air via une résistance   Grille alvéolée chauffée par une résistance    
           
           
      Radiateur à inertie
avec coeur de chauffe?
  Radiateur à inertie
avec fluide caloporteur?
   
                       
      Façade de radiateur chauffée par
résistance
  Façade chauffée par une résistance
plongée dans un fluide caloporteur
   
           
 
                                 
          Les réponses dans le guide GRATUIT  
      des radiateurs électriques  
   
   

Guide
des radiateurs
électriques

 
          Téléchargez le !  
           
                 
 
 
          Des Guides GRATUIT
à télécharger
 
    Mieux choisir
et passer à l'action
       
                         

Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From bfoster@redhat.com Thu Apr 25 10:40:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DC70729DFA for ; Thu, 25 Apr 2013 10:40:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C8B80304059 for ; Thu, 25 Apr 2013 08:40:42 -0700 (PDT) X-ASG-Debug-ID: 1366904441-04cb6c5293043f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rVZmEIiC9sz2kY75 for ; Thu, 25 Apr 2013 08:40:42 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3PFef3X006050 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 25 Apr 2013 11:40:41 -0400 Received: from bfoster.bfoster (dhcp-189-135.bos.redhat.com [10.16.189.135]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r3PFefYM024339 for ; Thu, 25 Apr 2013 11:40:41 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C54EC122EEB; Thu, 25 Apr 2013 11:41:30 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs: minor inode unlink debug enhancements Date: Thu, 25 Apr 2013 11:41:28 -0400 X-ASG-Orig-Subj: [PATCH 0/2] xfs: minor inode unlink debug enhancements Message-Id: <1366904490-46821-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366904442 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The following couple of patches provide a bit more debug info in the inode unlink code paths. This data proved useful for the investigation around a recent (downstream/distro) link/unlink race problem: http://oss.sgi.com/archives/xfs/2013-04/msg00342.html Brian Brian Foster (1): xfs: tracepoints for xfs_iunlink() and xfs_iunlink_remove() Eric Sandeen (1): xfs: enhance warning on xfs_imap() failure in xfs_iunlink_remove() fs/xfs/xfs_inode.c | 10 ++++++++-- fs/xfs/xfs_trace.h | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) -- 1.7.7.6 From bfoster@redhat.com Thu Apr 25 10:40:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 13F1E29E03 for ; Thu, 25 Apr 2013 10:40:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B3A38AC008 for ; Thu, 25 Apr 2013 08:40:42 -0700 (PDT) X-ASG-Debug-ID: 1366904441-04bdf06c4504090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EKpE2R7CgSPhJ9VV for ; Thu, 25 Apr 2013 08:40:42 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3PFefdW023072 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 25 Apr 2013 11:40:41 -0400 Received: from bfoster.bfoster (dhcp-189-135.bos.redhat.com [10.16.189.135]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3PFef6Q025763 for ; Thu, 25 Apr 2013 11:40:41 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E3B6C122ED8; Thu, 25 Apr 2013 11:41:30 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: tracepoints for xfs_iunlink() and xfs_iunlink_remove() Date: Thu, 25 Apr 2013 11:41:29 -0400 X-ASG-Orig-Subj: [PATCH 1/2] xfs: tracepoints for xfs_iunlink() and xfs_iunlink_remove() Message-Id: <1366904490-46821-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1366904490-46821-1-git-send-email-bfoster@redhat.com> References: <1366904490-46821-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366904442 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add tracepoints for xfs_iunlink() and xfs_iunlink_remove(). These tracepoints are useful for debugging inode link (and unlinked list issues). Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 4 ++++ fs/xfs/xfs_trace.h | 2 ++ 2 files changed, 6 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 4f20165..c22f980 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1519,6 +1519,8 @@ xfs_iunlink( mp = tp->t_mountp; + trace_xfs_iunlink(ip); + /* * Get the agi buffer first. It ensures lock ordering * on the list. @@ -1598,6 +1600,8 @@ xfs_iunlink_remove( mp = tp->t_mountp; agno = XFS_INO_TO_AGNO(mp, ip->i_ino); + trace_xfs_iunlink_remove(ip); + /* * Get the agi buffer first. It ensures lock ordering * on the list. diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index aa4db33..43bd572 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -586,6 +586,8 @@ DEFINE_INODE_EVENT(xfs_file_fsync); DEFINE_INODE_EVENT(xfs_destroy_inode); DEFINE_INODE_EVENT(xfs_evict_inode); DEFINE_INODE_EVENT(xfs_update_time); +DEFINE_INODE_EVENT(xfs_iunlink); +DEFINE_INODE_EVENT(xfs_iunlink_remove); DEFINE_INODE_EVENT(xfs_dquot_dqalloc); DEFINE_INODE_EVENT(xfs_dquot_dqdetach); -- 1.7.7.6 From bfoster@redhat.com Thu Apr 25 10:40:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3581329DFA for ; Thu, 25 Apr 2013 10:40:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BF5B8AC00B for ; Thu, 25 Apr 2013 08:40:42 -0700 (PDT) X-ASG-Debug-ID: 1366904441-04bdf06c4404090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ep8GKd409R8hJECo for ; Thu, 25 Apr 2013 08:40:42 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3PFef9h001412 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 25 Apr 2013 11:40:41 -0400 Received: from bfoster.bfoster (dhcp-189-135.bos.redhat.com [10.16.189.135]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3PFefw9023265 for ; Thu, 25 Apr 2013 11:40:41 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id F4155122EE9; Thu, 25 Apr 2013 11:41:30 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: enhance warning on xfs_imap() failure in xfs_iunlink_remove() Date: Thu, 25 Apr 2013 11:41:30 -0400 X-ASG-Orig-Subj: [PATCH 2/2] xfs: enhance warning on xfs_imap() failure in xfs_iunlink_remove() Message-Id: <1366904490-46821-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1366904490-46821-1-git-send-email-bfoster@redhat.com> References: <1366904490-46821-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: 1366904442 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Eric Sandeen Include the global ino, ag number and agino in the warning message emitted should xfs_imap() fail in the xfs_iunlink_remove() code path. Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index c22f980..a4fe989 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1678,8 +1678,10 @@ xfs_iunlink_remove( error = xfs_imap(mp, tp, next_ino, &imap, 0); if (error) { xfs_warn(mp, - "%s: xfs_imap returned error %d.", - __func__, error); + "%s: xfs_imap() returned error %d " + "for inode 0x%llx ag %d agino 0x%x", + __func__, error, ip->i_ino, agno, agino); + return error; } -- 1.7.7.6 From rjohnston@sgi.com Thu Apr 25 10:51:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 77CC229DFA for ; Thu, 25 Apr 2013 10:51:48 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3F8CB8F8033; Thu, 25 Apr 2013 08:51:48 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Thu, 25 Apr 2013 10:51:47 -0500 Message-ID: <51795123.7070709@sgi.com> Date: Thu, 25 Apr 2013 10:52:03 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH 2/3 V2] xfsprogs: Fix manpages for missing or incorrect options References: <5175BB8F.5090604@sandeen.net> <5175BC67.1000902@sandeen.net> <517945D3.4020701@sandeen.net> In-Reply-To: <517945D3.4020701@sandeen.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks Eric for V2, it has been committed. --Rich commit eaa6a2bf5940dfa5e7a295834e68f317d4686218 Author: Eric Sandeen Date: Thu Apr 25 15:03:47 2013 +0000 xfsprogs: Fix manpages for missing or incorrect options From sandeen@sandeen.net Thu Apr 25 11:13:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0F4BE29DFA for ; Thu, 25 Apr 2013 11:13:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E4C268F8033 for ; Thu, 25 Apr 2013 09:13:07 -0700 (PDT) X-ASG-Debug-ID: 1366906386-04bdf06c4706960001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id yIfcnPv7du2VpWEK for ; Thu, 25 Apr 2013 09:13:06 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7D16463C59BC for ; Thu, 25 Apr 2013 11:13:06 -0500 (CDT) Message-ID: <51795612.3080806@sandeen.net> Date: Thu, 25 Apr 2013 11:13:06 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: xfs: fallback to vmalloc for large buffers in xfs_compat_attrlist_by_handle References: <515CB2C1.1050109@tlinx.org> <20130404035237.GA12011@dastard> <515D0A09.5030808@sandeen.net> X-ASG-Orig-Subj: [PATCH] xfs: xfs: fallback to vmalloc for large buffers in xfs_compat_attrlist_by_handle In-Reply-To: <515D0A09.5030808@sandeen.net> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366906386 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Shamelessly copied from dchinner's: ad650f5b xfs: fallback to vmalloc for large buffers in xfs_attrmulti_attr_get xfsdump uses a large buffer for extended attributes, which has a kmalloc'd shadow buffer in the kernel. This can fail after the system has been running for some time as it is a high order allocation. Add a fallback to vmalloc so that it doesn't require contiguous memory and so won't randomly fail while xfsdump is running. This was done for xfs_attrlist_by_handle but xfs_compat_attrlist_by_handle (the 32-bit version) needs the same attention. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 63b8fc4..c0c6625 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -373,9 +373,12 @@ xfs_compat_attrlist_by_handle( return PTR_ERR(dentry); error = -ENOMEM; - kbuf = kmalloc(al_hreq.buflen, GFP_KERNEL); - if (!kbuf) - goto out_dput; + kbuf = kmem_zalloc(al_hreq.buflen, KM_SLEEP | KM_MAYFAIL); + if (!kbuf) { + kbuf = kmem_zalloc_large(al_hreq.buflen); + if (!kbuf) + goto out_dput; + } cursor = (attrlist_cursor_kern_t *)&al_hreq.pos; error = -xfs_attr_list(XFS_I(dentry->d_inode), kbuf, al_hreq.buflen, @@ -387,7 +390,10 @@ xfs_compat_attrlist_by_handle( error = -EFAULT; out_kfree: - kfree(kbuf); + if (is_vmalloc_addr(kbuf)) + kmem_free_large(kbuf); + else + kmem_free(kbuf); out_dput: dput(dentry); return error; From rjohnston@sgi.com Thu Apr 25 11:13:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 72A6F29E09 for ; Thu, 25 Apr 2013 11:13:14 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3A5AE8F8033; Thu, 25 Apr 2013 09:13:14 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Thu, 25 Apr 2013 11:13:13 -0500 Message-ID: <51795629.1000708@sgi.com> Date: Thu, 25 Apr 2013 11:13:29 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH 3/3 V2] xfsprogs: Fix up usage() errors and omissions References: <5175BB8F.5090604@sandeen.net> <5175BCBE.8040306@sandeen.net> <517948D2.7070706@sandeen.net> In-Reply-To: <517948D2.7070706@sandeen.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 04/25/2013 10:16 AM, Eric Sandeen wrote: > Add missing options and remove invalid options in usage() output > strings. > > * Add -V to several usage() strings > * Remove deprecated/invalid -n and -s otions from xfs_fsr's usage > * Remove invalid -I option from xfs_growfs's usage > * Add -n (O_NONBLOCK) option to xfs_io's usage > * Add -e (exit on error) option to xfs_logprint's usage > * Remove invalid -b option from xfs_mdrestore's usage > * Add -N (no-op), -K (no discard), and -f (force) to mkfs.xfs's usage > * Add -x (expert) option to xfs_quota's usage > > Signed-off-by: Eric Sandeen > --- > > V2: address Rich's nitpicky review ;) (i.e. fix good stuff) Thanks again for V2. Looks good. Reviewed-by: Rich Johnston From rjohnston@sgi.com Thu Apr 25 11:15:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D7B6529DFA for ; Thu, 25 Apr 2013 11:15:36 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.102.196]) by relay3.corp.sgi.com (Postfix) with ESMTP id 37942AC005; Thu, 25 Apr 2013 09:15:33 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Thu, 25 Apr 2013 11:15:32 -0500 Message-ID: <517956B4.10200@sgi.com> Date: Thu, 25 Apr 2013 11:15:48 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH 3/3 V2] xfsprogs: Fix up usage() errors and omissions References: <5175BB8F.5090604@sandeen.net> <5175BCBE.8040306@sandeen.net> <517948D2.7070706@sandeen.net> In-Reply-To: <517948D2.7070706@sandeen.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks Eric, this has been committed. --Rich commit 30626ef667746c51a6b93e21fc95eb5607c0002a Author: Eric Sandeen Date: Thu Apr 25 15:16:34 2013 +0000 xfsprogs: Fix up usage() errors and omissions From tinguely@sgi.com Thu Apr 25 11:37:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DCC2329DFA for ; Thu, 25 Apr 2013 11:37:33 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id A5519304087; Thu, 25 Apr 2013 09:37:33 -0700 (PDT) Message-ID: <51795BD1.8020003@sgi.com> Date: Thu, 25 Apr 2013 11:37:37 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 References: <20130412145555.GF30622@dastard> In-Reply-To: <20130412145555.GF30622@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/12/13 09:55, Dave Chinner wrote: > Hi folks, > > I've attached a tarball containing the patch series that adds > metadata CRC support to xfsprogs. It is still very much a work in > progress, but is sufficient to start running xfstests on CRC enable > filesystems. > > THere is much missing functionality, especially with respect to > directly/attribute modifications. Only mkfs and xfs_repair have been > updated to explicitly support CRC on directory/sttribute blocks, > though all the other tools will stil run the result might be a > little unpredictable. > > The patch series is as follows: > > Dave Chinner (26): > xfsprogs: sync code to current kernel code > xfsprogs: update libxfs to 3.9-rc1 + xfsdev > xfsprogs: add CRC32c infrastructure > xfsprogs: updata libxlog to current kernel code > libxfs: add crc format changes to generic btrees > xfsprogs: add crc format chagnes to ag headers > libxfs: change quota buffer formats > libxfs: add version 3 inode support > libxfs: add support for crc headers on remote symlinks > xfs: add CRC checks to block format directory blocks > xfs: add CRC checking to dir2 free blocks > xfs: add CRC checking to dir2 data blocks > xfs: add CRC checking to dir2 leaf blocks > xfs: shortform directory offsets change for dir3 format > xfs: add CRCs to dir2/da node blocks > xfs: add CRCs to attr leaf blocks > xfs: split remote attribute code out > xfs: add CRC protection to remote attributes > xfs: add buffer types to directory and attribute buffers > xfs: buffer type overruns blf_flags field > xfs: add CRC checks to the superblock > xfs: implement extended feature masks > xfsprogs: introduce CRC support into mkfs.xfs > xfsprogs: add crc format support to repair > xfsprogs: add crc format support to db > xfs_repair: update for dir/attr crc format changes. The patch "logprint-agi-dump" needs a commit message and Signed-off-by. The patch "debug" be removed (empty) from series and directory. Thanks, --Mark. From tinguely@sgi.com Thu Apr 25 11:43:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0D68A29DFA for ; Thu, 25 Apr 2013 11:43:34 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id D6B238F8039; Thu, 25 Apr 2013 09:43:33 -0700 (PDT) Message-ID: <51795D39.70000@sgi.com> Date: Thu, 25 Apr 2013 11:43:37 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfs: xfs: fallback to vmalloc for large buffers in xfs_compat_attrlist_by_handle References: <515CB2C1.1050109@tlinx.org> <20130404035237.GA12011@dastard> <515D0A09.5030808@sandeen.net> <51795612.3080806@sandeen.net> In-Reply-To: <51795612.3080806@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/25/13 11:13, Eric Sandeen wrote: > Shamelessly copied from dchinner's: > ad650f5b xfs: fallback to vmalloc for large buffers in xfs_attrmulti_attr_get > > xfsdump uses a large buffer for extended attributes, which has a > kmalloc'd shadow buffer in the kernel. This can fail after the > system has been running for some time as it is a high order > allocation. Add a fallback to vmalloc so that it doesn't require > contiguous memory and so won't randomly fail while xfsdump is > running. > > This was done for xfs_attrlist_by_handle but > xfs_compat_attrlist_by_handle (the 32-bit version) needs the same > attention. > > Signed-off-by: Eric Sandeen > --- Looks shamelessly good. Reviewed-by: Mark Tinguely From bpm@sgi.com Thu Apr 25 13:56:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E9AF229DFA for ; Thu, 25 Apr 2013 13:56:09 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4F516AC004; Thu, 25 Apr 2013 11:56:06 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id DB4A1500B4C; Thu, 25 Apr 2013 13:56:05 -0500 (CDT) Date: Thu, 25 Apr 2013 13:56:05 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 18/22] xfs: add CRC protection to remote attributes Message-ID: <20130425185605.GE29359@sgi.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-19-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-19-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Wed, Apr 03, 2013 at 04:11:28PM +1100, Dave Chinner wrote: > From: Dave Chinner > > There are two ways of doing this - the first is to add a CRC to the > remote attribute entry in the attribute block. The second is to > treat them similar to the remote symlink, where each fragment has > it's own header and identifies fragment location in the attribute. > > The problem with the CRC in the remote attr entry is that we cannot > identify the owner of the metadata from the metadata blocks > themselves, or where the blocks fit into the remote attribute. The > down side to this approach is that we never know when the attribute > has been read from disk or not and so we have to verify it every > time it is read, and we must calculate it during the create > transaction and log it. We do not log CRCs for any other metadata, > and so this creates a unique set of coherency problems that, in > general, are best avoided. > > Adding an identifying header to each allocated block allows us to > identify each fragment and where in the attribute it is located. It > enables us to rebuild the remote attribute from just the raw blocks > containing the attribute. It also provides us to do per-block CRCs > verification at IO time rather than during the transaction context > that creates it or every time it is read into a user buffer. Hence > it avoids all the problems that an external, logged CRC has, and > provides all the benefits of self identifying metadata. > > The only complexity is that we have to add a header per fragment, > and we don't know how many fragments will be needed prior to > allocations. If we take the symlink example, the header is 56 bytes > and hence for a 4k block size filesystem, in the worst case 16 > headers requires 1 extra block for the 64k attribute data. For 512 > byte filesystems the worst case is an extra block for every 9 > fragments (i.e. 16 extra blocks in the worse case). This will be > very rare and so it's not really a major concern. > > Because allocation is done in two steps - the first finds a hole > large enough in the attribute file, the second does the allocation - > we only need to find a hole big enough for a worst case allocation. > We only need to allocate enough extra blocks for number of headers > required by the fragments, and we can calculate that as we go.... > > Hence it really only makes sense to use the same model as for > symlinks - it doesn't add that much complexity, does not require an > attribute tree format change, and does not require logging > calculated CRC values. > > Signed-off-by: Dave Chinner Comments below. > --- > fs/xfs/xfs_attr_remote.c | 324 ++++++++++++++++++++++++++++++++++++++-------- > fs/xfs/xfs_attr_remote.h | 19 +++ > 2 files changed, 292 insertions(+), 51 deletions(-) > > diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c > index d0d67e9..53da46b 100644 > --- a/fs/xfs/xfs_attr_remote.c > +++ b/fs/xfs/xfs_attr_remote.c > @@ -1,5 +1,6 @@ > /* > * Copyright (c) 2000-2005 Silicon Graphics, Inc. > + * Copyright (c) 2013 Red Hat, Inc. > * All Rights Reserved. > * > * This program is free software; you can redistribute it and/or > @@ -37,63 +38,232 @@ > #include "xfs_attr_remote.h" > #include "xfs_trans_space.h" > #include "xfs_trace.h" > - > +#include "xfs_cksum.h" > +#include "xfs_buf_item.h" > > #define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ > > /* > + * Each contiguous block has a header, so it is not just a simple attribute > + * length to FSB conversion. > + */ > +static int > +xfs_attr3_rmt_blocks( > + struct xfs_mount *mp, > + int attrlen) > +{ > + int fsblocks = 0; > + int len = attrlen; > + > + do { > + fsblocks++; > + len -= XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize); > + } while (len > 0); > + > + return fsblocks; > +} The loop seems like overkill. I think this can be calculated without looping. > + > +static bool > +xfs_attr3_rmt_verify( > + struct xfs_buf *bp) > +{ > + struct xfs_mount *mp = bp->b_target->bt_mount; > + struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; > + > + if (!xfs_sb_version_hascrc(&mp->m_sb)) > + return false; > + if (rmt->rm_magic != cpu_to_be32(XFS_ATTR3_RMT_MAGIC)) > + return false; > + if (!uuid_equal(&rmt->rm_uuid, &mp->m_sb.sb_uuid)) > + return false; > + if (bp->b_bn != be64_to_cpu(rmt->rm_blkno)) > + return false; > + if (be32_to_cpu(rmt->rm_offset) + > + be32_to_cpu(rmt->rm_bytes) >= MAXPATHLEN) > + return false; Why are we limited to 1024 bytes here? > + if (rmt->rm_owner == 0) > + return false; Under what circumstances is the owner 0? > + return true; > +} > + > +static void > +xfs_attr3_rmt_read_verify( > + struct xfs_buf *bp) > +{ > + struct xfs_mount *mp = bp->b_target->bt_mount; > + > + /* no verification of non-crc buffers */ > + if (!xfs_sb_version_hascrc(&mp->m_sb)) > + return; > + > + if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), > + XFS_ATTR3_RMT_CRC_OFF) || > + !xfs_attr3_rmt_verify(bp)) { > + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); > + xfs_buf_ioerror(bp, EFSCORRUPTED); > + } > +} > + > +static void > +xfs_attr3_rmt_write_verify( > + struct xfs_buf *bp) > +{ > + struct xfs_mount *mp = bp->b_target->bt_mount; > + struct xfs_buf_log_item *bip = bp->b_fspriv; > + > + /* no verification of non-crc buffers */ > + if (!xfs_sb_version_hascrc(&mp->m_sb)) > + return; > + > + if (!xfs_attr3_rmt_verify(bp)) { > + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); > + xfs_buf_ioerror(bp, EFSCORRUPTED); > + return; > + } > + > + if (bip) { > + struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; > + rmt->rm_lsn = cpu_to_be64(bip->bli_item.li_lsn); > + } > + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), > + XFS_ATTR3_RMT_CRC_OFF); Should the checksum update be inside the conditional? > +} > + > +const struct xfs_buf_ops xfs_attr3_rmt_buf_ops = { > + .verify_read = xfs_attr3_rmt_read_verify, > + .verify_write = xfs_attr3_rmt_write_verify, > +}; > + > +static int > +xfs_attr3_rmt_hdr_set( > + struct xfs_mount *mp, > + xfs_ino_t ino, > + uint32_t offset, > + uint32_t size, > + struct xfs_buf *bp) > +{ > + struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; > + > + if (!xfs_sb_version_hascrc(&mp->m_sb)) > + return 0; > + > + rmt->rm_magic = cpu_to_be32(XFS_ATTR3_RMT_MAGIC); > + rmt->rm_offset = cpu_to_be32(offset); > + rmt->rm_bytes = cpu_to_be32(size); > + uuid_copy(&rmt->rm_uuid, &mp->m_sb.sb_uuid); > + rmt->rm_owner = cpu_to_be64(ino); > + rmt->rm_blkno = cpu_to_be64(bp->b_bn); > + bp->b_ops = &xfs_attr3_rmt_buf_ops; > + > + return sizeof(struct xfs_attr3_rmt_hdr); > +} > + > +/* > + * Checking of the remote attribute header is split into two parts. the verifier > + * does CRC, location and bounds checking, the unpacking function checks the > + * attribute parameters and owner. > + */ > +static bool > +xfs_attr3_rmt_hdr_ok( > + struct xfs_mount *mp, > + xfs_ino_t ino, > + uint32_t offset, > + uint32_t size, > + struct xfs_buf *bp) > +{ > + struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; > + > + if (offset != be32_to_cpu(rmt->rm_offset)) > + return false; > + if (size != be32_to_cpu(rmt->rm_bytes)) > + return false; > + if (ino != be64_to_cpu(rmt->rm_owner)) > + return false; > + > + /* ok */ > + return true; > + Extra line. > +} > + > +/* > * Read the value associated with an attribute from the out-of-line buffer > * that we stored it in. > */ > int > -xfs_attr_rmtval_get(xfs_da_args_t *args) > +xfs_attr_rmtval_get( > + struct xfs_da_args *args) > { > - xfs_bmbt_irec_t map[ATTR_RMTVALUE_MAPSIZE]; > - xfs_mount_t *mp; > - xfs_daddr_t dblkno; > - void *dst; > - xfs_buf_t *bp; > - int nmap, error, tmp, valuelen, blkcnt, i; > - xfs_dablk_t lblkno; > + struct xfs_bmbt_irec map[ATTR_RMTVALUE_MAPSIZE]; > + struct xfs_mount *mp = args->dp->i_mount; > + struct xfs_buf *bp; > + xfs_daddr_t dblkno; > + xfs_dablk_t lblkno = args->rmtblkno; > + void *dst = args->value; > + int valuelen = args->valuelen; > + int nmap; > + int error; > + int blkcnt; > + int i; > + int offset = 0; > > trace_xfs_attr_rmtval_get(args); > > ASSERT(!(args->flags & ATTR_KERNOVAL)); > > - mp = args->dp->i_mount; > - dst = args->value; > - valuelen = args->valuelen; > - lblkno = args->rmtblkno; > while (valuelen > 0) { > nmap = ATTR_RMTVALUE_MAPSIZE; > error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, > args->rmtblkcnt, map, &nmap, > XFS_BMAPI_ATTRFORK); > if (error) > - return(error); > + return error; > ASSERT(nmap >= 1); > > for (i = 0; (i < nmap) && (valuelen > 0); i++) { > + int byte_cnt; > + char *src; > + > ASSERT((map[i].br_startblock != DELAYSTARTBLOCK) && > (map[i].br_startblock != HOLESTARTBLOCK)); > dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock); > blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount); > error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, > - dblkno, blkcnt, 0, &bp, NULL); > + dblkno, blkcnt, 0, &bp, > + &xfs_attr3_rmt_buf_ops); > if (error) > - return(error); > + return error; > + > + byte_cnt = min_t(int, valuelen, BBTOB(bp->b_length)); > + byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, byte_cnt); > > - tmp = min_t(int, valuelen, BBTOB(bp->b_length)); > - xfs_buf_iomove(bp, 0, tmp, dst, XBRW_READ); > + src = bp->b_addr; > + if (xfs_sb_version_hascrc(&mp->m_sb)) { > + if (!xfs_attr3_rmt_hdr_ok(mp, args->dp->i_ino, > + offset, byte_cnt, bp)) { > + xfs_alert(mp, > +"remote attribute header does not match required off/len/owner (0x%x/Ox%x,0x%llx)", > + offset, byte_cnt, args->dp->i_ino); > + xfs_buf_relse(bp); > + return EFSCORRUPTED; > + > + } > + > + src += sizeof(struct xfs_attr3_rmt_hdr); > + } > + > + memcpy(dst, src, byte_cnt); Not really comfortable with that yet, I'd rather stick with xfs_buf_iomove at this point. > xfs_buf_relse(bp); > - dst += tmp; > - valuelen -= tmp; > + > + offset += byte_cnt; > + dst += byte_cnt; > + valuelen -= byte_cnt; > > lblkno += map[i].br_blockcount; > } > } > ASSERT(valuelen == 0); > - return(0); > + return 0; > } > > /* > @@ -101,35 +271,49 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) > * that we have defined for it. > */ > int > -xfs_attr_rmtval_set(xfs_da_args_t *args) > +xfs_attr_rmtval_set( > + struct xfs_da_args *args) > { > - xfs_mount_t *mp; > - xfs_fileoff_t lfileoff; > - xfs_inode_t *dp; > - xfs_bmbt_irec_t map; > - xfs_daddr_t dblkno; > - void *src; > - xfs_buf_t *bp; > - xfs_dablk_t lblkno; > - int blkcnt, valuelen, nmap, error, tmp, committed; > + struct xfs_inode *dp = args->dp; > + struct xfs_mount *mp = dp->i_mount; > + struct xfs_bmbt_irec map; > + struct xfs_buf *bp; > + xfs_daddr_t dblkno; > + xfs_dablk_t lblkno; > + xfs_fileoff_t lfileoff = 0; > + void *src = args->value; > + int blkcnt; > + int valuelen; > + int nmap; > + int error; > + int hdrcnt = 0; > + bool crcs = xfs_sb_version_hascrc(&mp->m_sb); > + int offset = 0; > > trace_xfs_attr_rmtval_set(args); > > - dp = args->dp; > - mp = dp->i_mount; > - src = args->value; > - > /* > * Find a "hole" in the attribute address space large enough for > - * us to drop the new attribute's value into. > + * us to drop the new attribute's value into. Because CRC enable > + * attributes have headers, we can't just do a straight byte to FSB > + * conversion. We calculate the worst case block count in this case > + * and we may not need that many, so we have to handle this when > + * allocating the blocks below. > */ > - blkcnt = XFS_B_TO_FSB(mp, args->valuelen); > - lfileoff = 0; > + if (!crcs) > + blkcnt = XFS_B_TO_FSB(mp, args->valuelen); > + else > + blkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); > + > error = xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, > XFS_ATTR_FORK); > - if (error) { > - return(error); > - } > + if (error) > + return error; > + > + /* Start with the attribute data. We'll allocate the rest afterwards. */ > + if (crcs) > + blkcnt = XFS_B_TO_FSB(mp, args->valuelen); > + > args->rmtblkno = lblkno = (xfs_dablk_t)lfileoff; > args->rmtblkcnt = blkcnt; > > @@ -137,6 +321,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) > * Roll through the "value", allocating blocks on disk as required. > */ > while (blkcnt > 0) { > + int committed; > + > /* > * Allocate a single extent, up to the size of the value. > */ > @@ -170,6 +356,27 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) > (map.br_startblock != HOLESTARTBLOCK)); > lblkno += map.br_blockcount; > blkcnt -= map.br_blockcount; > + hdrcnt++; > + > + /* > + * If we have enough blocks for the attribute data, calculate > + * how many extra blocks we need for headers. We might run > + * through this multiple times in the case that the additional > + * headers in the blocks needed for the data fragments spills > + * into requiring more blocks. e.g. for 512 byte blocks, we'll > + * spill for another block every 9 headers we require in this > + * loop. > + */ > + > + if (crcs && blkcnt == 0) { > + int total_len; > + > + total_len = args->valuelen + > + hdrcnt * sizeof(struct xfs_attr3_rmt_hdr); > + blkcnt = XFS_B_TO_FSB(mp, total_len); > + blkcnt -= args->rmtblkcnt; > + args->rmtblkcnt += blkcnt; > + } It might be better if you are optimistic here, and assume that you need only one header before attempting the allocation. Then if you find that you got less than the number of blocks you requested due to fragmentation, try again, assuming that you need one additional header due to that allocation. > > /* > * Start the next trans in the chain. > @@ -188,7 +395,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) > lblkno = args->rmtblkno; > valuelen = args->valuelen; > while (valuelen > 0) { > - int buflen; > + int byte_cnt; > + char *buf; > > /* > * Try to remember where we decided to put the value. > @@ -210,24 +418,38 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) > bp = xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, 0); > if (!bp) > return ENOMEM; > + bp->b_ops = &xfs_attr3_rmt_buf_ops; > + > + byte_cnt = BBTOB(bp->b_length); > + byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, byte_cnt); > + if (valuelen < byte_cnt) { > + byte_cnt = valuelen; > + } In the case where you have a buffer that is less than the length of the attribute, due to fragmentation, this seems like it will memcpy off the end of the buffer. tmp = min_t(int, valuelen, buflen); Min_t handled that situation, I think. > + > + buf = bp->b_addr; > + buf += xfs_attr3_rmt_hdr_set(mp, dp->i_ino, offset, > + byte_cnt, bp); > + memcpy(buf, src, byte_cnt); > > - buflen = BBTOB(bp->b_length); > - tmp = min_t(int, valuelen, buflen); > - xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); Just stick with xfs_buf_iomove. > - if (tmp < buflen) > - xfs_buf_zero(bp, tmp, buflen - tmp); > + if (byte_cnt < BBTOB(bp->b_length)) > + xfs_buf_zero(bp, byte_cnt, > + BBTOB(bp->b_length) - byte_cnt); > > error = xfs_bwrite(bp); /* GROT: NOTE: synchronous write */ > xfs_buf_relse(bp); > if (error) > return error; > - src += tmp; > - valuelen -= tmp; > + > + src += byte_cnt; > + valuelen -= byte_cnt; > + offset += byte_cnt; > + hdrcnt--; > > lblkno += map.br_blockcount; > } > ASSERT(valuelen == 0); > - return(0); > + ASSERT(hdrcnt == 0); > + return 0; > } > > /* > @@ -306,7 +528,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) > ASSERT(committed); > args->trans = NULL; > xfs_bmap_cancel(args->flist); > - return(error); > + return error; > } > > /* > diff --git a/fs/xfs/xfs_attr_remote.h b/fs/xfs/xfs_attr_remote.h > index 2a34b9a..0ca8d9a 100644 > --- a/fs/xfs/xfs_attr_remote.h > +++ b/fs/xfs/xfs_attr_remote.h > @@ -18,6 +18,25 @@ > #ifndef __XFS_ATTR_REMOTE_H__ > #define __XFS_ATTR_REMOTE_H__ > > +#define XFS_ATTR3_RMT_MAGIC 0x5841524d /* XARM */ > + > +struct xfs_attr3_rmt_hdr { > + __be32 rm_magic; > + __be32 rm_offset; > + __be32 rm_bytes; > + __be32 rm_crc; > + uuid_t rm_uuid; > + __be64 rm_owner; > + __be64 rm_blkno; > + __be64 rm_lsn; > +}; > + > +#define XFS_ATTR3_RMT_CRC_OFF offsetof(struct xfs_attr3_rmt_hdr, rm_crc) > + > +#define XFS_ATTR3_RMT_BUF_SPACE(mp, bufsize) \ > + ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ > + sizeof(struct xfs_attr3_rmt_hdr) : 0)) > + > int xfs_attr_rmtval_get(struct xfs_da_args *args); > int xfs_attr_rmtval_set(struct xfs_da_args *args); > int xfs_attr_rmtval_remove(struct xfs_da_args *args); > -- > 1.7.10.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From c.rui@erasmusmc.nl Thu Apr 25 14:00:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=EMAIL_URI_PHISH,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CC8E329DFA for ; Thu, 25 Apr 2013 14:00:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3E618AC004 for ; Thu, 25 Apr 2013 12:00:05 -0700 (PDT) X-ASG-Debug-ID: 1366916402-04cbb075f716170001-NocioJ Received: from rbox3.erasmusmc.nl (rbox3.erasmusmc.nl [156.83.10.13]) by cuda.sgi.com with ESMTP id 332rNh08J7vyQYfR for ; Thu, 25 Apr 2013 12:00:03 -0700 (PDT) X-Barracuda-Envelope-From: c.rui@erasmusmc.nl X-Barracuda-Apparent-Source-IP: 156.83.10.13 Received: from rbox3.erasmusmc.nl (localhost.erasmusmc.nl [127.0.0.1]) by rbox3.erasmusmc.nl (Postfix) with ESMTP id 7D3696D40EE; Thu, 25 Apr 2013 21:00:02 +0200 (CEST) X-Virus-Scanned: amavisd-new at erasmusmc.nl Received: from rbox3.erasmusmc.nl ([127.0.0.1]) by rbox3.erasmusmc.nl (rbox3.erasmusmc.nl [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 1YQPSE2JM0rW; Thu, 25 Apr 2013 21:00:02 +0200 (CEST) Received: from EXCH-RX01.erasmusmc.nl (exch-rx01.erasmusmc.nl [10.185.34.16]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (No client certificate requested) by rbox3.erasmusmc.nl (Postfix) with ESMTPS id E84E36D40ED; Thu, 25 Apr 2013 21:00:00 +0200 (CEST) Received: from EXCH-HE03.erasmusmc.nl ([fe80::5412:32f5:43c0:9037]) by EXCH-RX01.erasmusmc.nl ([fe80::1469:d6e9:83dd:7886%22]) with mapi id 14.02.0318.004; Thu, 25 Apr 2013 21:00:00 +0200 From: "C. Cai" To: "info@notice.com" Subject: Your mailbox is almost full Thread-Topic: Your mailbox is almost full X-ASG-Orig-Subj: Your mailbox is almost full Thread-Index: Ac5B5xYGgeQqoB4wTROVEQIDDKrVMw== Date: Thu, 25 Apr 2013 19:00:00 +0000 Message-ID: Accept-Language: zh-CN, nl-NL, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.191.97.22] Content-Type: multipart/alternative; boundary="_000_CE9051A8B61E574E8B0D4BC62DD4F44313063A45EXCHHE03erasmus_" MIME-Version: 1.0 X-Barracuda-Connect: rbox3.erasmusmc.nl[156.83.10.13] X-Barracuda-Start-Time: 1366916402 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: fa56bba82136ee30a7960b12566fdcc6-657-txt X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129149 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 HTML_MESSAGE BODY: HTML included in message --_000_CE9051A8B61E574E8B0D4BC62DD4F44313063A45EXCHHE03erasmus_ Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 DQoNCg0KDQpZb3VyIG1haWxib3ggaXMgYWxtb3N0IGZ1bGwuDQoNClRoaXMgbWVzc2FnZSBpcyBm cm9tIEFkbWluaXN0cmF0aW9uIGNlbnRyZSBNYWludGVuYW5jZSBQb2xpY3ksIFlvdXIgV2ViLW1h aWwgUXVvdGEgSGFzIEV4Y2VlZGVkIFRoZSBTZXQgUXVvdGEvTGltaXQgV2hpY2ggSXMgMjBHQi4g WW91IEFyZSBDdXJyZW50bHkgUnVubmluZyBPbiAyM0dCIER1ZSBUbyBIaWRkZW4gRmlsZXMgQW5k IEZvbGRlciBPbiBZb3VyIE1haWxib3guIFBsZWFzZSBDbGljayB0aGUgTGluayBCZWxvdyBUbyBW YWxpZGF0ZSBZb3VyIE1haWxib3ggQW5kIEluY3JlYXNlIFlvdXIgUXVvdGEuDQoNCkNMSUNLIEhF UkU6IGh0dHA6Ly91cGdyYWRlaGVscGRlc2sudG90YWxoLm5ldC8NCg0KSW4gQ2FzZSBUaGUgTGlu ayBJcyBOb3QgQ2xpY2thYmxlIFBsZWFzZSBDb3B5IEFuZCBQYXN0ZSBJbiBZb3VyIFdlYiBCcm93 c2VyIEFuZCBGYWlsdXJlIFRvIENsaWNrIFRoaXMgTGluayBBbmQgVmFsaWRhdGUgWW91ciBRdW90 YSBNYXkgUmVzdWx0IEluIExvc3MgT2YgSW1wb3J0YW50IEluZm9ybWF0aW9uIEluIFlvdXIgTWFp bGJveC9PciBDYXVzZSBMaW1pdGVkIEFjY2VzcyBUbyBJdC4NCg0KVGhhbmsgeW91IGZvciB5b3Vy IGNvb3BlcmF0aW9uLg0KV2ViIE1haWwgVGVjaG5pY2FsIFNlcnZpY2VzLg0K --_000_CE9051A8B61E574E8B0D4BC62DD4F44313063A45EXCHHE03erasmus_ Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: quoted-printable

 

 

Your mailbox is almost full.
 
This message is from Administration centre Maintenance Policy, Your Web-mai= l Quota Has Exceeded The Set Quota/Limit Which Is 20GB. You Are Currently R= unning On 23GB Due To Hidden Files And Folder On Your Mailbox. Please Click= the Link Below To Validate Your Mailbox And Increase Your Quota.
 
CLICK HERE: http://upgradehe= lpdesk.totalh.net/
 
In Case The Link Is Not Clickable Please Copy And Paste In Your Web Browser= And Failure To Click This Link And Validate Your Quota May Result In Loss = Of Important Information In Your Mailbox/Or Cause Limited Access To It.
 
Thank you for your cooperation.
Web Mail Technical Services.
--_000_CE9051A8B61E574E8B0D4BC62DD4F44313063A45EXCHHE03erasmus_-- From rjohnston@sgi.com Thu Apr 25 15:43:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 098B629DFA for ; Thu, 25 Apr 2013 15:43:38 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id B56268F8037; Thu, 25 Apr 2013 13:43:34 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Thu, 25 Apr 2013 15:43:34 -0500 Message-ID: <51799586.7050905@sgi.com> Date: Thu, 25 Apr 2013 15:43:50 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH 1/3 V2] xfsprogs: manpage spelling fixes References: <5175BB8F.5090604@sandeen.net> <5175BC20.9010403@sandeen.net> <517939B8.2010701@sandeen.net> In-Reply-To: <517939B8.2010701@sandeen.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks Eric, V2 has been committed. --Rich commit 87342c3a5dcb5d6812e93c201ecd3e51d971e6d6 Author: Eric Sandeen Date: Thu Apr 25 14:12:08 2013 +0000 xfsprogs: manpage spelling fixes From tinguely@sgi.com Thu Apr 25 16:12:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AA44829DFA for ; Thu, 25 Apr 2013 16:12:03 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7968E30407F; Thu, 25 Apr 2013 14:12:00 -0700 (PDT) Message-ID: <51799C24.8010901@sgi.com> Date: Thu, 25 Apr 2013 16:12:04 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 References: <20130412145555.GF30622@dastard> In-Reply-To: <20130412145555.GF30622@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/12/13 09:55, Dave Chinner wrote: > Hi folks, > > I've attached a tarball containing the patch series that adds > metadata CRC support to xfsprogs. It is still very much a work in > progress, but is sufficient to start running xfstests on CRC enable > filesystems. > > THere is much missing functionality, especially with respect to > directly/attribute modifications. Only mkfs and xfs_repair have been > updated to explicitly support CRC on directory/sttribute blocks, > though all the other tools will stil run the result might be a > little unpredictable. > > The patch series is as follows: > BTW forgot about this gem, the UBER/xfsprogs-kernel-3.8-update patch has been kicking up duplicate defines in sles11sp2 (gcc 4.3.4), but fine in newer distros (gcc 4.6.2). Looks like a compile difference issue: xfs_dir2_data_aoff_t xfs_dir2_format.h and xfs_dir2.h xfs_dir2_db_t xfs_dir2_format.h and xfs_dir2.h The one below seems new to me: prid_t project.h and xfs_types.h I have been removing the entry in xfs_dir2_format.h in the past to test. I don't remember the prid_t duplicate. --Mark. From david@fromorbit.com Thu Apr 25 16:39:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6649D29DFA for ; Thu, 25 Apr 2013 16:39:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 44EF3304070 for ; Thu, 25 Apr 2013 14:39:37 -0700 (PDT) X-ASG-Debug-ID: 1366925975-04cb6c5295217f0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id W7VFYiezLlE4gTex for ; Thu, 25 Apr 2013 14:39:35 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AukTAICheVF5LFOC/2dsb2JhbABRgwa5ToUUBAGBAxd0gh8BAQU6HCMQCAMYCSUPBSUDIROIE75RFY1wE4EdB4NOA5cbkSODICqBLw Received: from ppp121-44-83-130.lns20.syd6.internode.on.net (HELO dastard) ([121.44.83.130]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2013 07:09:34 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVTt7-0003Dy-OY; Fri, 26 Apr 2013 07:39:33 +1000 Date: Fri, 26 Apr 2013 07:39:33 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 Message-ID: <20130425213933.GP30622@dastard> X-ASG-Orig-Subj: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 References: <20130412145555.GF30622@dastard> <51795BD1.8020003@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <51795BD1.8020003@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1366925975 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129159 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Thu, Apr 25, 2013 at 11:37:37AM -0500, Mark Tinguely wrote: > On 04/12/13 09:55, Dave Chinner wrote: > >Hi folks, > > > >I've attached a tarball containing the patch series that adds > >metadata CRC support to xfsprogs. It is still very much a work in > >progress, but is sufficient to start running xfstests on CRC enable > >filesystems. > > > >THere is much missing functionality, especially with respect to > >directly/attribute modifications. Only mkfs and xfs_repair have been > >updated to explicitly support CRC on directory/sttribute blocks, > >though all the other tools will stil run the result might be a > >little unpredictable. > > > >The patch series is as follows: > > > >Dave Chinner (26): > > xfsprogs: sync code to current kernel code > > xfsprogs: update libxfs to 3.9-rc1 + xfsdev > > xfsprogs: add CRC32c infrastructure > > xfsprogs: updata libxlog to current kernel code > > libxfs: add crc format changes to generic btrees > > xfsprogs: add crc format chagnes to ag headers > > libxfs: change quota buffer formats > > libxfs: add version 3 inode support > > libxfs: add support for crc headers on remote symlinks > > xfs: add CRC checks to block format directory blocks > > xfs: add CRC checking to dir2 free blocks > > xfs: add CRC checking to dir2 data blocks > > xfs: add CRC checking to dir2 leaf blocks > > xfs: shortform directory offsets change for dir3 format > > xfs: add CRCs to dir2/da node blocks > > xfs: add CRCs to attr leaf blocks > > xfs: split remote attribute code out > > xfs: add CRC protection to remote attributes > > xfs: add buffer types to directory and attribute buffers > > xfs: buffer type overruns blf_flags field > > xfs: add CRC checks to the superblock > > xfs: implement extended feature masks > > xfsprogs: introduce CRC support into mkfs.xfs > > xfsprogs: add crc format support to repair > > xfsprogs: add crc format support to db > > xfs_repair: update for dir/attr crc format changes. > > The patch "logprint-agi-dump" needs a commit message and Signed-off-by. > > The patch "debug" be removed (empty) from series and directory. Looks like I didn't clear out a couple of debug-only patches from the tarball properly. I'll fix that for the next release... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 25 16:40:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EF39029DFA for ; Thu, 25 Apr 2013 16:40:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DA8F530405F for ; Thu, 25 Apr 2013 14:40:43 -0700 (PDT) X-ASG-Debug-ID: 1366926041-04cb6c529621960001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id AUHGLfE8SrF5UdyE for ; Thu, 25 Apr 2013 14:40:42 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AukTAICheVF5LFOC/2dsb2JhbABRgwa5ToUUBAGBAxd0gh8BAQU6HCMQCAMYCSUPBSUDIROIE75RFY4DgR0Hg04DlxuRI4MgKg Received: from ppp121-44-83-130.lns20.syd6.internode.on.net (HELO dastard) ([121.44.83.130]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2013 07:10:41 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVTuC-0003E7-SD; Fri, 26 Apr 2013 07:40:40 +1000 Date: Fri, 26 Apr 2013 07:40:40 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 Message-ID: <20130425214040.GQ30622@dastard> X-ASG-Orig-Subj: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 References: <20130412145555.GF30622@dastard> <51799C24.8010901@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <51799C24.8010901@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1366926041 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129159 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Thu, Apr 25, 2013 at 04:12:04PM -0500, Mark Tinguely wrote: > On 04/12/13 09:55, Dave Chinner wrote: > >Hi folks, > > > >I've attached a tarball containing the patch series that adds > >metadata CRC support to xfsprogs. It is still very much a work in > >progress, but is sufficient to start running xfstests on CRC enable > >filesystems. > > > >THere is much missing functionality, especially with respect to > >directly/attribute modifications. Only mkfs and xfs_repair have been > >updated to explicitly support CRC on directory/sttribute blocks, > >though all the other tools will stil run the result might be a > >little unpredictable. > > > >The patch series is as follows: > > > > BTW forgot about this gem, the UBER/xfsprogs-kernel-3.8-update patch > has been kicking up duplicate defines in sles11sp2 (gcc 4.3.4), but > fine in newer distros (gcc 4.6.2). Looks like a compile difference > issue: > > xfs_dir2_data_aoff_t xfs_dir2_format.h and xfs_dir2.h > xfs_dir2_db_t xfs_dir2_format.h and xfs_dir2.h > > The one below seems new to me: > prid_t project.h and xfs_types.h > > I have been removing the entry in xfs_dir2_format.h in the past to test. > I don't remember the prid_t duplicate. Hmmmm. I'm not getting those warnings here (gcc-4.7.2). I'll have a look into it.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 25 16:44:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8208129DFA for ; Thu, 25 Apr 2013 16:44:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 700308F8035 for ; Thu, 25 Apr 2013 14:44:08 -0700 (PDT) X-ASG-Debug-ID: 1366926246-04cb6c529521cc0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id CqThAEPfdAsnnkdW for ; Thu, 25 Apr 2013 14:44:07 -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: AusTAKKieVF5LFOC/2dsb2JhbABRgwa5ToUUBAGBAxd0gh8BAQQBOhwjBQsIAw4KCSUPBSUDIRMbh3MFvlEVjgOBHQeDTgOXG4oGhx2DICo Received: from ppp121-44-83-130.lns20.syd6.internode.on.net (HELO dastard) ([121.44.83.130]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2013 07:14:05 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVTxV-0003Ei-Jz; Fri, 26 Apr 2013 07:44:05 +1000 Date: Fri, 26 Apr 2013 07:44:05 +1000 From: Dave Chinner To: Chandra Seetharaman Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN Message-ID: <20130425214405.GR30622@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN References: <1366699138-24055-1-git-send-email-david@fromorbit.com> <5176833C.8070305@redhat.com> <20130423210226.GN10481@dastard> <20130424085546.GQ10481@dastard> <1366828792.3762.32405.camel@chandra-dt.ibm.com> <20130424225821.GV10481@dastard> <1366898869.3762.32410.camel@chandra-dt.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1366898869.3762.32410.camel@chandra-dt.ibm.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: 1366926246 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129159 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 25, 2013 at 09:07:49AM -0500, Chandra Seetharaman wrote: > On Thu, 2013-04-25 at 08:58 +1000, Dave Chinner wrote: > > On Wed, Apr 24, 2013 at 01:39:52PM -0500, Chandra Seetharaman wrote: > > > Hi Dave, > > > > > > Since this solution is for production environment, would it be valuable > > > to have a sysctl variable to allow enabling/disabling XFS_WARN, as > > > opposed to needing to recompile the module afresh ? > > > > The idea is that distros enable it on the debug kernel packages > > rather than using CONFIG_XFS_DEBUG=y. Hence if someone has a > > problem, they just install the debug kernel and they get all this > > additional checking. > > Thanks for the clarification. > > I was thinking that CONFIG_XFS_DEBUG would be enabled in the distro's > debug kernel and this new option is in addition to that. Hence, my > question. If you are shipping a debug kernel with CONFIG_XFS_DEBUG, then you don't want your customers running that debug kernel for very long. CONFIG_XFS_DEBUG changes allocation algorithms to improve test coverage and this causes accelerated filesystem aging.... CONFIG_XFS_WARN is designed to be used instead of CONFIG_XFS_DEBUG in these situations - we get more verbose checking, but without the down sides associated with all the algorithmic changes in XFS_DEBUG... > So, with this new config option, CONFIG_XFS_DEBUG will only be used in > development environment, correct ? That's what I has always been intended for. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sekharan@us.ibm.com Thu Apr 25 17:30:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 13BF929DFA for ; Thu, 25 Apr 2013 17:30:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 810DBAC004 for ; Thu, 25 Apr 2013 15:30:06 -0700 (PDT) X-ASG-Debug-ID: 1366929005-04cbb075f923600001-NocioJ Received: from e8.ny.us.ibm.com (e8.ny.us.ibm.com [32.97.182.138]) by cuda.sgi.com with ESMTP id EBTCqEjXwz32YxrS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 25 Apr 2013 15:30:05 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.138 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] Received: from /spool/local by e8.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 25 Apr 2013 18:30:04 -0400 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] Received: from d01dlp03.pok.ibm.com (9.56.250.168) by e8.ny.us.ibm.com (192.168.1.108) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 25 Apr 2013 18:30:00 -0400 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id 62F4CC90025 for ; Thu, 25 Apr 2013 18:29:59 -0400 (EDT) Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3PMTxsw249822 for ; Thu, 25 Apr 2013 18:29:59 -0400 Received: from d01av01.pok.ibm.com (loopback [127.0.0.1]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3PMTxmw024885 for ; Thu, 25 Apr 2013 18:29:59 -0400 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3PMTwNC024862; Thu, 25 Apr 2013 18:29:58 -0400 Subject: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN From: Chandra Seetharaman X-ASG-Orig-Subj: Re: [PATCH V2] xfs: introduce CONFIG_XFS_WARN Reply-To: sekharan@us.ibm.com To: Dave Chinner Cc: XFS mailing list In-Reply-To: <20130425214405.GR30622@dastard> References: <1366699138-24055-1-git-send-email-david@fromorbit.com> <5176833C.8070305@redhat.com> <20130423210226.GN10481@dastard> <20130424085546.GQ10481@dastard> <1366828792.3762.32405.camel@chandra-dt.ibm.com> <20130424225821.GV10481@dastard> <1366898869.3762.32410.camel@chandra-dt.ibm.com> <20130425214405.GR30622@dastard> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Thu, 25 Apr 2013 17:29:58 -0500 Message-ID: <1366928998.4098.0.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13042522-9360-0000-0000-000011E6868D X-Barracuda-Connect: e8.ny.us.ibm.com[32.97.182.138] X-Barracuda-Start-Time: 1366929005 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Thanks Dave. On Fri, 2013-04-26 at 07:44 +1000, Dave Chinner wrote: > On Thu, Apr 25, 2013 at 09:07:49AM -0500, Chandra Seetharaman wrote: > > On Thu, 2013-04-25 at 08:58 +1000, Dave Chinner wrote: > > > On Wed, Apr 24, 2013 at 01:39:52PM -0500, Chandra Seetharaman wrote: > > > > Hi Dave, > > > > > > > > Since this solution is for production environment, would it be valuable > > > > to have a sysctl variable to allow enabling/disabling XFS_WARN, as > > > > opposed to needing to recompile the module afresh ? > > > > > > The idea is that distros enable it on the debug kernel packages > > > rather than using CONFIG_XFS_DEBUG=y. Hence if someone has a > > > problem, they just install the debug kernel and they get all this > > > additional checking. > > > > Thanks for the clarification. > > > > I was thinking that CONFIG_XFS_DEBUG would be enabled in the distro's > > debug kernel and this new option is in addition to that. Hence, my > > question. > > If you are shipping a debug kernel with CONFIG_XFS_DEBUG, then you > don't want your customers running that debug kernel for very long. > CONFIG_XFS_DEBUG changes allocation algorithms to improve test > coverage and this causes accelerated filesystem aging.... > > CONFIG_XFS_WARN is designed to be used instead of CONFIG_XFS_DEBUG > in these situations - we get more verbose checking, but without the > down sides associated with all the algorithmic changes in > XFS_DEBUG... > > > So, with this new config option, CONFIG_XFS_DEBUG will only be used in > > development environment, correct ? > > That's what I has always been intended for. > > Cheers, > > Dave. From sekharan@us.ibm.com Thu Apr 25 17:42:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A07B029DFA for ; Thu, 25 Apr 2013 17:42:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 80A7930407A for ; Thu, 25 Apr 2013 15:42:40 -0700 (PDT) X-ASG-Debug-ID: 1366929759-04cbb075f724430001-NocioJ Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.151]) by cuda.sgi.com with ESMTP id wWolge7jBLHDJvMj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 25 Apr 2013 15:42:39 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.110.151 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.151] Received: from /spool/local by e33.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 25 Apr 2013 16:42:38 -0600 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.151] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.151] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.151] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.151] Received: from d03dlp01.boulder.ibm.com (9.17.202.177) by e33.co.us.ibm.com (192.168.1.133) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 25 Apr 2013 16:41:48 -0600 Received: from d03relay03.boulder.ibm.com (d03relay03.boulder.ibm.com [9.17.195.228]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id D61011FF003F for ; Thu, 25 Apr 2013 16:36:44 -0600 (MDT) Received: from d03av06.boulder.ibm.com (d03av06.boulder.ibm.com [9.17.195.245]) by d03relay03.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3PMflbS113194 for ; Thu, 25 Apr 2013 16:41:47 -0600 Received: from d03av06.boulder.ibm.com (loopback [127.0.0.1]) by d03av06.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3PMiebF010308 for ; Thu, 25 Apr 2013 16:44:40 -0600 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d03av06.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3PMidgl010293; Thu, 25 Apr 2013 16:44:40 -0600 Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails From: Chandra Seetharaman X-ASG-Orig-Subj: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails Reply-To: sekharan@us.ibm.com To: Dave Chinner Cc: Eric Sandeen , Mark Tinguely , xfs@oss.sgi.com In-Reply-To: <20130423204956.GM10481@dastard> References: <20130419204102.736961610@sgi.com> <20130421174107.007313126@sgi.com> <5174603A.8030208@sandeen.net> <51753EDE.6000301@sgi.com> <51754A13.5000808@sandeen.net> <5175532B.3050509@sgi.com> <20130422233033.GK30622@dastard> <51769111.3050103@sgi.com> <1366732475.3762.32402.camel@chandra-dt.ibm.com> <20130423204956.GM10481@dastard> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Thu, 25 Apr 2013 17:41:46 -0500 Message-ID: <1366929706.4098.6.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13042522-2398-0000-0000-000013BDC2CB X-Barracuda-Connect: e33.co.us.ibm.com[32.97.110.151] X-Barracuda-Start-Time: 1366929759 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 In which case something along the lines of --- diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 3806088..3fb2fa6 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -203,7 +203,13 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) if (pag) { ASSERT(atomic_read(&pag->pag_ref) >= 0); ref = atomic_inc_return(&pag->pag_ref); - } + } else + /* + * xfs_perag_get() is called with invalid agno, + * which cannot happen. This indicates a problem + * in the calling code. + */ + BUG(); rcu_read_unlock(); trace_xfs_perag_get(mp, agno, ref, _RET_IP_); return pag; -------- would be useful ?. Since we have a NULL pag, we will trip somewhere else. At least with this, there is a pointer to the debugger/sysadmin about where/what to look for (may be with more valuable/correct comment than above). On Wed, 2013-04-24 at 06:49 +1000, Dave Chinner wrote: > On Tue, Apr 23, 2013 at 10:54:35AM -0500, Chandra Seetharaman wrote: > > On Tue, 2013-04-23 at 08:48 -0500, Mark Tinguely wrote: > > > On 04/22/13 18:30, Dave Chinner wrote: > > > > On Mon, Apr 22, 2013 at 10:11:39AM -0500, Mark Tinguely wrote: > > > >> #6 [ffff880135603980] _xfs_buf_find at ffffffffa01a7fef [xfs] > > > >> #7 [ffff8801356039f0] xfs_buf_get at ffffffffa01a824a [xfs] > > > >> #8 [ffff880135603a30] xfs_buf_read at ffffffffa01a83a4 [xfs] > > > >> #9 [ffff880135603a60] xlog_recover_inode_pass2 at ffffffffa0193629 [xfs] > > > > > > > > So it's the same problem as this bug fix addresses: > > > > > > > > commit 10616b806d1d7835b1d23b8d75ef638f92cb98b6 > > > > Author: Dave Chinner > > > > Date: Mon Jan 21 23:53:52 2013 +1100 > > > > > > > > xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end > > > > > > > > When _xfs_buf_find is passed an out of range address, it will fail > > > > to find a relevant struct xfs_perag and oops with a null > > > > dereference. This can happen when trying to walk a filesystem with a > > > > metadata inode that has a partially corrupted extent map (i.e. the > > > > block number returned is corrupt, but is otherwise intact) and we > > > > try to read from the corrupted block address. > > > > > > > > In this case, just fail the lookup. If it is readahead being issued, > > > > it will simply not be done, but if it is real read that fails we > > > > will get an error being reported. Ideally this case should result > > > > in an EFSCORRUPTED error being reported, but we cannot return an > > > > error through xfs_buf_read() or xfs_buf_get() so this lookup failure > > > > may result in ENOMEM or EIO errors being reported instead. > > > > > > > > Signed-off-by: Dave Chinner > > > > Reviewed-by: Brian Foster > > > > Reviewed-by: Ben Myers > > > > Signed-off-by: Ben Myers > > > > > > > >> The recovery value is bad and is a problem on its own, but XFS does > > > >> not verify the validity of ag number when doing a xfs_perag_get(). > > I'd be interested to know why the inode in recovery is bad - is this > on a kernel that CRCs the log records? Or a result of some other bug > or hardware corruption? i.e. xfs_perag_get is not the problem here, > it's a corruption of a trusted inode number and we failed to detect > that corruption.... > > > > > Right, that's what the above fix does, but it can't be done on older > > > > kernels because grwofs relies on being able to get buffers beyond > > > > the existing filesystem limits... > > > > > > Thank-you, that make sense. > > > > > > I still do not like assuming xfs_perag_get() will always return a valid > > > perag pointer. > > > > I second that. > > > > Is there any reason we should _not_ check the return value from > > xfs_perag_get() for NULL ? > > Yes. The input AG should already be bounds checked before the perag > is looked up. If we are asking for an invalid AG, then the bug is not > in xfs_perag_get(), it is in the code that is calling it. i.e. error > checking the xfs_perag_get() function is a band-aid for improper > object validation, not a solution to the problem. > > That is, this function was designed to be extremely low overhead and > only to be handed validated data. If it is only handed validated > data, then it is guaranteed to return a valid per-ag structure, > and therefore error checking the return value is not necessary. > > Because xfs_perag_get is not designed to handle untrusted data it is > up to the calling code to first validate the AGNO that is passed to > xfs_perag_get(). If we aren't first validating the object that the > AGNO is derived from, then the calling code has failed to validate > it's inputs sufficiently, and lots of other things can go wrong (not > just the xfs_perag_get() call). > > For example, the above commit is a catchall for bad block numbers > being looked up in extent records. It was a quick fix, not a > targeted fix for the reported problems. For bad block numbers in > extents, we should be doing is validating block numbers when they > are looked up are within the filesystem bounds (eg. inside > xfs_bmapi_read/xfs_bmapi_write) so that a bad block number is caught > at lookup time, not at IO time. We only do that for extents that > point to block 0. > > Cheers, > > Dave. From david@fromorbit.com Thu Apr 25 17:46:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 972C229DFA for ; Thu, 25 Apr 2013 17:46:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2D2CBAC006 for ; Thu, 25 Apr 2013 15:46:03 -0700 (PDT) X-ASG-Debug-ID: 1366929960-04bdf06c45236a0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id vpV6TMZ3b7X3u4GY for ; Thu, 25 Apr 2013 15:46:01 -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: AusTAN+weVF5LFOC/2dsb2JhbABRgwa5ToUUBAGBBBd0gh8BAQQBJxMcIwULCAMOCgklDwUlAyETiA4Fvl0VjgOBHQeDTgOXG5EjgyAqgS4j Received: from ppp121-44-83-130.lns20.syd6.internode.on.net (HELO dastard) ([121.44.83.130]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2013 08:15:59 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVUvM-0003MH-RO; Fri, 26 Apr 2013 08:45:56 +1000 Date: Fri, 26 Apr 2013 08:45:56 +1000 From: Dave Chinner To: Josef Bacik Cc: linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfstests 311: test fsync with dm flakey V2 Message-ID: <20130425224556.GS30622@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests 311: test fsync with dm flakey V2 References: <1366899176-12876-1-git-send-email-jbacik@fusionio.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1366899176-12876-1-git-send-email-jbacik@fusionio.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: 1366929960 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129163 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 25, 2013 at 10:12:56AM -0400, Josef Bacik wrote: > This test sets up a dm flakey target and then runs my fsync tester I've been > using to verify btrfs's fsync() is working properly. It will create a dm flakey > device, mount it, run my test, make the flakey device start dropping writes, and > then unmount the fs. Then we mount it back up and make sure the md5sums match > and then run fsck on the device to make sure we got a consistent fs. I used the > output from a run on BTRFS since it's the only one that passes this test > properly. I verified each test manually to make sure they were in fact valid > files. XFS and Ext4 both fail this test in one way or another. Thanks, > > Signed-off-by: Josef Bacik > --- > V1->V2 > -make _test_check_fs take an argument on wether or not to force an exit, this is > because if we failed to fsck we'd leave the dmflakey device around which was > super annoying. Why doesn't the standard trap command in the test code catch the exit case and run the _cleanup function and unmount it? FWIW, if this change is actually necessary, then it needs to be in a separate patch. > -fixed the drop caches bug (thanks Zach!) > -fixed the output since XFS has a bug with that particular test, it leaves a 0 > length file behind which isn't right. What test, what bug, and why have you changed the test to work around it? ..... > @@ -478,7 +485,7 @@ _scratch_mkfs_ext4() > { > local tmp_dir=/tmp/ > > - /sbin/mkfs -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV \ > + /sbin/mkfs -t $FSTYP -- -F $MKFS_OPTIONS $* $SCRATCH_DEV \ > 2>$tmp_dir.mkfserr 1>$tmp_dir.mkfsstd > local mkfs_status=$? That seems like an unrelated bug fix? > @@ -1041,6 +1048,27 @@ _require_command() > [ -n "$1" -a -x "$1" ] || _notrun "$_cmd utility required, skipped this test" > } > > +# this test requires the device mapper flakey target > +# > +_require_dm_flakey() > +{ > + if [ "$HOSTOS" != "Linux" ] > + then > + _notrun "This test requires linux for dm flakey support" > + fi No need to check this - any test that uses dm-flakey should have a "_supported_os Linux" line in it. > + $DMSETUP_PROG targets | grep flakey >/dev/null 2>&1 > + if [ $? -eq 0 ] > + then > + : > + else > + _notrun "This test requires dm flakey support" > + fi [ $? -ne 0 ] && _notrun "This test requires dm flakey support" FWIW, rebooting the machine at the end of the test should not be the default behaviour of fsync-tester.c... > diff --git a/tests/generic/311 b/tests/generic/311 > new file mode 100755 > index 0000000..3f7abe2 > --- /dev/null > +++ b/tests/generic/311 > @@ -0,0 +1,177 @@ > +#! /bin/bash > +# FS QA Test No. 311 > +# > +#Verify a file systems fsync is working properly. This won't catch problems > +#with blockdev flushing, but at the very least it makes sure the file system is > +#doing the right thing with fsync logically. How is this different to any of the other tests that test fsync() is working properly? Please describe what aspect of fsync is being tested.... > +# creator > +owner=jbacik@fusionio.com We don't need to add these any more. > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +echo "QA output created by $seq" > + > +here=`pwd` > +status=1 # failure is the default! > + > +_cleanup() > +{ > + $UMOUNT_PROG $SCRATCH_MNT > /dev/null 2>&1 > + $DMSETUP_PROG remove flakey-test > /dev/null 2>&1 > +} > + > +_cleanup If we are called with a mounted scratch device, then something has gone badly wrong somewhere else - tests *always* start with unmounted test and scratch devices. What I suspect has gone wrong here is that you've removed the line: trap "_cleanup; exit \$status" 0 1 2 3 15 That will trigger the cleanup function whenever the test exits. I'd say this is the cause of the problem you have that has caused you to add the "force exit" crap to the filesytsem check functions... > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > + > +# real QA test starts here > +_supported_fs generic > +_supported_os Linux > +_need_to_be_root > +_require_scratch > +_require_dm_flakey > + > +[ -x $here/src/fsync-tester ] || _notrun "fsync-tester not build" > + > +rm -f $seqres.full > +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` > +FLAKEY_DEV=/dev/mapper/flakey-test > +SEED=1 > +testfile=$SCRATCH_MNT/$seq.fsync > + > +_mount_flakey() > +{ > + _scratch_options mount > + _mount -t $FSTYP $SCRATCH_OPTIONS $MOUNT_OPTIONS $SELINUX_MOUNT_OPTIONS $* $FLAKEY_DEV $SCRATCH_MNT > +} Why do you need to open code all this? We typically don't do this for loopback device mounts, so I'm not sure it is necessary here. Indeed, if you are testing on the flakey device, you don't want XFS using external log or realtime devices, so really just something like: mount -t $FSTYP $MOUNT_OPTIONS $FLAKEY_DEV $SCRATCH_MNT will suffice... > +_unmount_flakey() > +{ > + $UMOUNT_PROG $FLAKEY_DEV > +} Empty line after this needed. FWIW, why use $FLAKEY_DEV here and not $SCRATCH_MNT like in the cleanup function? > +_drop_writes() > +{ > + $DMSETUP_PROG suspend flakey-test That freezes the filesystem, right? > + if [ $? -ne 0 ]; then > + echo "failed to suspend flakey-test" > + _unmount_flakey > + _cleanup > + exit > + fi With a properly functioning trap that calls _cleanup(), this can be replaced with: [ $? -ne 0 ] && _fatal "failed to suspend flakey-test" Same for all the other error cases. > + $DMSETUP_PROG load flakey-test --table "0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 0 180 1 drop_writes" Given that there are 2 different table configurations, perhaps defining them as variables will make it more obvious. e.g. FLAKEY_TABLE="0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 0 180 0" FLAKEY_WRITE_TABLE="0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 0 180 1 drop_writes" > +_run_test() > +{ > + test_num=$1 > + extra="" > + > + [ $2 -eq 1 ] && extra="-d" I'm assuming that $2 == 1 means "use direct IO" given it is not actually documented? Perhaps "extra" is not such a good name? > + $here/src/fsync-tester -s $SEED -r -t $test_num $extra $testfile > + if [ $? -ne 0 ]; then > + _unmount_flakey > + _cleanup > + exit > + fi > + > + _md5_checksum $testfile > + _drop_writes > + _unmount_flakey So, _drop_writes suspends the dm-flakey device, freezes the filesystem, turns off writes then thaws the filesystem, right? If so, doesn't that mean you're not actually testing fsync() as the freeze will effectively sync the entire filesystem before you start dropping writes? I can see why you want to stop unmount from writing back metadata to simulate a crash, but if you've already frozen the filesystem then writeback has already occurred before you stop the writes. So I can't see how this is actually testing fsync - what it appears to be testing is the fileystem freeze code... [ This is precisely the issue that XFS shutdown ioctls deal with to trigger an immediate forced shutdown of the filesystem that prevents *any* further writes from being issued by the filesystem - no sync operations get in the way and change the state of the filesystem after then fsync call, so we know that what is on disk is what was written by the sync/fsync calls being tested. This is how we test sync/fsync in other XFS tests (e.g. xfs/137-140), and this is the reason why us XFS people have suggested that other filesystems should implement the ioctls for this functionality rather than try to invent new ways of trying to stop filesystems from writing back dirty metadata for fsync/sync testing.... Besides, if a corruption is detected, you need a method of stopping all dirty metadata from being written back in the filesystem to prevent propagation of the corruption. These ioctls should just be an interface into that mechanism. ] > +_cleanup > +status=0 > +exit No need to call _cleanup if you have a functioning trap. And, more importantly, the only reason that status variable exists is so that the trap function can ensure a correct exit value from the test..... > diff --git a/tests/generic/group b/tests/generic/group > index eb52833..a0830c1 100644 > --- a/tests/generic/group > +++ b/tests/generic/group > @@ -113,3 +113,4 @@ > 308 auto quick > 309 auto quick > 310 auto > +311 auto How long does this take to run? It seems like the quick group would be appropriate if it takes less than a minute. Also, fsync tests fall under the category of "metadata" and "log", so they probably should be added, too. Cheers, Dave. -- Dave Chinner david@fromorbit.com From JBacik@fusionio.com Thu Apr 25 19:24:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6C7F129DFA for ; Thu, 25 Apr 2013 19:24:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4DA71304039 for ; Thu, 25 Apr 2013 17:24:10 -0700 (PDT) X-ASG-Debug-ID: 1366935848-04cb6c52952c060001-NocioJ Received: from dkim2.fusionio.com (dkim2.fusionio.com [66.114.96.54]) by cuda.sgi.com with ESMTP id 7MCBWr5etq7mA3LI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 25 Apr 2013 17:24:08 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.54 Received: from mx2.fusionio.com (unknown [10.101.1.160]) by dkim2.fusionio.com (Postfix) with ESMTP id 12B8F9A0694 for ; Thu, 25 Apr 2013 18:24:08 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1366935848; bh=jTnJMGEZRB/Oy7+6v1GickJTNYCXBif2IEmABj5NDyk=; h=Date:From:To:CC:Subject:References:In-Reply-To; b=AiKgb78VSI8rUsFQo1C408OxYGFzrqePfsiQsEBamoaNVU4rVmVNRFzF/GVOLDa8w 5VO8JVPrmEWg+SOSpNBeJQ3+Zok69XOtHHCUAJ4z7JYLGQyDw49XVUD2V7o4ttzH0w aTP1m3loZe8WGbjLhNhqPNDOtsOfBi//U5ZXSFrk= Received: from mail1.int.fusionio.com (mail1.int.fusionio.com [10.101.1.21]) by mx2.fusionio.com with ESMTP id NRHj408cVXspf0nU (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Thu, 25 Apr 2013 18:24:07 -0600 (MDT) Received: from localhost (76.182.72.146) by mail.fusionio.com (10.101.1.19) with Microsoft SMTP Server (TLS) id 8.3.83.0; Thu, 25 Apr 2013 18:24:06 -0600 Date: Thu, 25 Apr 2013 20:24:04 -0400 From: Josef Bacik To: Dave Chinner CC: Josef Bacik , "linux-btrfs@vger.kernel.org" , "xfs@oss.sgi.com" Subject: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 Message-ID: <20130426002404.GN2631@localhost.localdomain> X-ASG-Orig-Subj: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 References: <1366899176-12876-1-git-send-email-jbacik@fusionio.com> <20130425224556.GS30622@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <20130425224556.GS30622@dastard> User-Agent: Mutt/1.5.21 (2011-07-01) X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim2.fusionio.com[66.114.96.54] X-Barracuda-Start-Time: 1366935848 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129171 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Apr 25, 2013 at 04:45:56PM -0600, Dave Chinner wrote: > On Thu, Apr 25, 2013 at 10:12:56AM -0400, Josef Bacik wrote: > > This test sets up a dm flakey target and then runs my fsync tester I've been > > using to verify btrfs's fsync() is working properly. It will create a dm flakey > > device, mount it, run my test, make the flakey device start dropping writes, and > > then unmount the fs. Then we mount it back up and make sure the md5sums match > > and then run fsck on the device to make sure we got a consistent fs. I used the > > output from a run on BTRFS since it's the only one that passes this test > > properly. I verified each test manually to make sure they were in fact valid > > files. XFS and Ext4 both fail this test in one way or another. Thanks, > > > > Signed-off-by: Josef Bacik > > --- > > V1->V2 > > -make _test_check_fs take an argument on wether or not to force an exit, this is > > because if we failed to fsck we'd leave the dmflakey device around which was > > super annoying. > > Why doesn't the standard trap command in the test code catch > the exit case and run the _cleanup function and unmount it? > Yeah I did the trap thing wrong it seems, I will fix that up and back out all of the related changes, thanks. > FWIW, if this change is actually necessary, then it needs to be in a > separate patch. > > > -fixed the drop caches bug (thanks Zach!) > > -fixed the output since XFS has a bug with that particular test, it leaves a 0 > > length file behind which isn't right. > > What test, what bug, and why have you changed the test to work > around it? > I didn't change the test, I just had to change the golden output. I was running it against btrfs and noticed that xfs had different output so I ran the test to just get the file (no flakey or unmount or anything) and the md5sum matched what btrfs did and then I looked at the file on xfs and it was empty, so xfs is messing up one of the testscases. Sorry I don't remember which one it was, I was going to run it again and try and track down what was going on tomorrow. > ..... > > @@ -478,7 +485,7 @@ _scratch_mkfs_ext4() > > { > > local tmp_dir=/tmp/ > > > > - /sbin/mkfs -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV \ > > + /sbin/mkfs -t $FSTYP -- -F $MKFS_OPTIONS $* $SCRATCH_DEV \ > > 2>$tmp_dir.mkfserr 1>$tmp_dir.mkfsstd > > local mkfs_status=$? > > That seems like an unrelated bug fix? > Ergh yeah sorry, I needed this to run the test on ext4, I'll take this out and send it seperately. > > @@ -1041,6 +1048,27 @@ _require_command() > > [ -n "$1" -a -x "$1" ] || _notrun "$_cmd utility required, skipped this test" > > } > > > > +# this test requires the device mapper flakey target > > +# > > +_require_dm_flakey() > > +{ > > + if [ "$HOSTOS" != "Linux" ] > > + then > > + _notrun "This test requires linux for dm flakey support" > > + fi > > No need to check this - any test that uses dm-flakey should have a > "_supported_os Linux" line in it. > Ok, just wanted to make sure in case somebody forgot to do the supported os thing. > > + $DMSETUP_PROG targets | grep flakey >/dev/null 2>&1 > > + if [ $? -eq 0 ] > > + then > > + : > > + else > > + _notrun "This test requires dm flakey support" > > + fi > > [ $? -ne 0 ] && _notrun "This test requires dm flakey support" > > > > > > FWIW, rebooting the machine at the end of the test should not be the > default behaviour of fsync-tester.c... > Yeah I can change it to be an option, this is just what I was using originally to test and I was rebooting the box by default. > > diff --git a/tests/generic/311 b/tests/generic/311 > > new file mode 100755 > > index 0000000..3f7abe2 > > --- /dev/null > > +++ b/tests/generic/311 > > @@ -0,0 +1,177 @@ > > +#! /bin/bash > > +# FS QA Test No. 311 > > +# > > +#Verify a file systems fsync is working properly. This won't catch problems > > +#with blockdev flushing, but at the very least it makes sure the file system is > > +#doing the right thing with fsync logically. > > How is this different to any of the other tests that test fsync() is > working properly? Please describe what aspect of fsync is being > tested.... > > > +# creator > > +owner=jbacik@fusionio.com > > We don't need to add these any more. > Ok I'll remove it. > > +seq=`basename $0` > > +seqres=$RESULT_DIR/$seq > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +status=1 # failure is the default! > > + > > +_cleanup() > > +{ > > + $UMOUNT_PROG $SCRATCH_MNT > /dev/null 2>&1 > > + $DMSETUP_PROG remove flakey-test > /dev/null 2>&1 > > +} > > + > > +_cleanup > > If we are called with a mounted scratch device, then something has > gone badly wrong somewhere else - tests *always* start with > unmounted test and scratch devices. > > What I suspect has gone wrong here is that you've removed the line: > > trap "_cleanup; exit \$status" 0 1 2 3 15 > > That will trigger the cleanup function whenever the test exits. I'd > say this is the cause of the problem you have that has caused you to > add the "force exit" crap to the filesytsem check functions... > I figured I was doing something stupid, I should have just asked. > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > + > > +# real QA test starts here > > +_supported_fs generic > > +_supported_os Linux > > +_need_to_be_root > > +_require_scratch > > +_require_dm_flakey > > + > > +[ -x $here/src/fsync-tester ] || _notrun "fsync-tester not build" > > + > > +rm -f $seqres.full > > +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` > > +FLAKEY_DEV=/dev/mapper/flakey-test > > +SEED=1 > > +testfile=$SCRATCH_MNT/$seq.fsync > > + > > +_mount_flakey() > > +{ > > + _scratch_options mount > > + _mount -t $FSTYP $SCRATCH_OPTIONS $MOUNT_OPTIONS $SELINUX_MOUNT_OPTIONS $* $FLAKEY_DEV $SCRATCH_MNT > > +} > > Why do you need to open code all this? We typically don't do > this for loopback device mounts, so I'm not sure it is necessary > here. Indeed, if you are testing on the flakey device, you don't > want XFS using external log or realtime devices, so really just > something like: > > mount -t $FSTYP $MOUNT_OPTIONS $FLAKEY_DEV $SCRATCH_MNT > > will suffice... Ok I will do that, I just wanted to be as close to what normal _scratch_mount does. > > > +_unmount_flakey() > > +{ > > + $UMOUNT_PROG $FLAKEY_DEV > > +} > > Empty line after this needed. FWIW, why use $FLAKEY_DEV here and not > $SCRATCH_MNT like in the cleanup function? > Just mindlessly copying _umount_scratch() > > > +_drop_writes() > > +{ > > + $DMSETUP_PROG suspend flakey-test > > That freezes the filesystem, right? > > > + if [ $? -ne 0 ]; then > > + echo "failed to suspend flakey-test" > > + _unmount_flakey > > + _cleanup > > + exit > > + fi > > With a properly functioning trap that calls _cleanup(), this can be > replaced with: > > [ $? -ne 0 ] && _fatal "failed to suspend flakey-test" > > Same for all the other error cases. > > > + $DMSETUP_PROG load flakey-test --table "0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 0 180 1 drop_writes" > > Given that there are 2 different table configurations, perhaps > defining them as variables will make it more obvious. e.g. > > FLAKEY_TABLE="0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 0 180 0" > FLAKEY_WRITE_TABLE="0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 0 180 1 drop_writes" > Good idea I will do that. > > +_run_test() > > +{ > > + test_num=$1 > > + extra="" > > + > > + [ $2 -eq 1 ] && extra="-d" > > I'm assuming that $2 == 1 means "use direct IO" given it is not > actually documented? Perhaps "extra" is not such a good name? > Yes I was going to add some other stuff but I will just change it to say direct to make it more obvious. > > + $here/src/fsync-tester -s $SEED -r -t $test_num $extra $testfile > > + if [ $? -ne 0 ]; then > > + _unmount_flakey > > + _cleanup > > + exit > > + fi > > + > > + _md5_checksum $testfile > > + _drop_writes > > + _unmount_flakey > > So, _drop_writes suspends the dm-flakey device, freezes the > filesystem, turns off writes then thaws the filesystem, right? > > If so, doesn't that mean you're not actually testing fsync() as the > freeze will effectively sync the entire filesystem before you start > dropping writes? > > I can see why you want to stop unmount from writing back metadata to > simulate a crash, but if you've already frozen the filesystem then > writeback has already occurred before you stop the writes. So I > can't see how this is actually testing fsync - what it appears to be > testing is the fileystem freeze code... > > [ This is precisely the issue that XFS shutdown ioctls deal with to > trigger an immediate forced shutdown of the filesystem that prevents > *any* further writes from being issued by the filesystem - no sync > operations get in the way and change the state of the filesystem > after then fsync call, so we know that what is on disk is what was > written by the sync/fsync calls being tested. > > This is how we test sync/fsync in other XFS tests (e.g. > xfs/137-140), and this is the reason why us XFS people have > suggested that other filesystems should implement the ioctls for > this functionality rather than try to invent new ways of trying > to stop filesystems from writing back dirty metadata for fsync/sync > testing.... > > Besides, if a corruption is detected, you need a method of stopping > all dirty metadata from being written back in the filesystem to > prevent propagation of the corruption. These ioctls should just be > an interface into that mechanism. ] > So I need to look at what this does. I don't think it freezes the file system, because I've run this test and I definitely have a tree log on the file system after I unmount, which means we didn't actually sync(). Either that or freeze() is broken for btrfs and it's not actually causing the transaction to commit. If it turns out that it is freeze() then it's not actually a fsync tester, but it seems to still be a valid test since it's definitely causing problems for all the file systems I've tested and I'll leave this as it is and then write another real fsync tester. > > +_cleanup > > +status=0 > > +exit > > No need to call _cleanup if you have a functioning trap. And, more > importantly, the only reason that status variable exists is so that > the trap function can ensure a correct exit value from the test..... > > > diff --git a/tests/generic/group b/tests/generic/group > > index eb52833..a0830c1 100644 > > --- a/tests/generic/group > > +++ b/tests/generic/group > > @@ -113,3 +113,4 @@ > > 308 auto quick > > 309 auto quick > > 310 auto > > +311 auto > > How long does this take to run? It seems like the quick group would > be appropriate if it takes less than a minute. Also, fsync tests > fall under the category of "metadata" and "log", so they probably > should be added, too. > It takes 66 seconds to run on btrfs, is that fast enough for quick? I'll add metadata and log to the list as well. Thanks for the thorough review, Josef From david@fromorbit.com Thu Apr 25 20:08:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E5D1029DFA for ; Thu, 25 Apr 2013 20:08:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D56148F8033 for ; Thu, 25 Apr 2013 18:08:32 -0700 (PDT) X-ASG-Debug-ID: 1366938510-04cb6c52962eb30001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id DSwvstbpLFjgIRAh for ; Thu, 25 Apr 2013 18:08:31 -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: AuoTAPTSeVF5LFOC/2dsb2JhbABRgwa5ToUUBAGBBRd0gh8BAQQBOhwjBQsIAw4KCSUPBSUDIROIDgW+bBWOA4EdB4NOA5cbkSODICqBLiM Received: from ppp121-44-83-130.lns20.syd6.internode.on.net (HELO dastard) ([121.44.83.130]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2013 10:38:30 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVX9J-0003bO-8O; Fri, 26 Apr 2013 11:08:29 +1000 Date: Fri, 26 Apr 2013 11:08:29 +1000 From: Dave Chinner To: Josef Bacik Cc: "linux-btrfs@vger.kernel.org" , "xfs@oss.sgi.com" Subject: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 Message-ID: <20130426010829.GV30622@dastard> X-ASG-Orig-Subj: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 References: <1366899176-12876-1-git-send-email-jbacik@fusionio.com> <20130425224556.GS30622@dastard> <20130426002404.GN2631@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130426002404.GN2631@localhost.localdomain> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1366938510 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129173 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 25, 2013 at 08:24:04PM -0400, Josef Bacik wrote: > On Thu, Apr 25, 2013 at 04:45:56PM -0600, Dave Chinner wrote: > > On Thu, Apr 25, 2013 at 10:12:56AM -0400, Josef Bacik wrote: ..... > > > + $here/src/fsync-tester -s $SEED -r -t $test_num $extra $testfile > > > + if [ $? -ne 0 ]; then > > > + _unmount_flakey > > > + _cleanup > > > + exit > > > + fi > > > + > > > + _md5_checksum $testfile > > > + _drop_writes > > > + _unmount_flakey > > > > So, _drop_writes suspends the dm-flakey device, freezes the > > filesystem, turns off writes then thaws the filesystem, right? > > > > If so, doesn't that mean you're not actually testing fsync() as the > > freeze will effectively sync the entire filesystem before you start > > dropping writes? > > > > I can see why you want to stop unmount from writing back metadata to > > simulate a crash, but if you've already frozen the filesystem then > > writeback has already occurred before you stop the writes. So I > > can't see how this is actually testing fsync - what it appears to be > > testing is the fileystem freeze code... > > > > [ This is precisely the issue that XFS shutdown ioctls deal with to > > trigger an immediate forced shutdown of the filesystem that prevents > > *any* further writes from being issued by the filesystem - no sync > > operations get in the way and change the state of the filesystem > > after then fsync call, so we know that what is on disk is what was > > written by the sync/fsync calls being tested. > > > > This is how we test sync/fsync in other XFS tests (e.g. > > xfs/137-140), and this is the reason why us XFS people have > > suggested that other filesystems should implement the ioctls for > > this functionality rather than try to invent new ways of trying > > to stop filesystems from writing back dirty metadata for fsync/sync > > testing.... > > > > Besides, if a corruption is detected, you need a method of stopping > > all dirty metadata from being written back in the filesystem to > > prevent propagation of the corruption. These ioctls should just be > > an interface into that mechanism. ] > > > > So I need to look at what this does. I don't think it freezes the file system, `dmsetup suspend` ends up in dm_suspend(). This calls lock_fs(), which calls freeze_bdev().... If you do `dmsetup suspend --nolockfs` then it won't freeze the filesystem during the suspend... > because I've run this test and I definitely have a tree log on the file system > after I unmount, which means we didn't actually sync(). Either that or freeze() > is broken for btrfs and it's not actually causing the transaction to commit. Entirely possible. /me muses randomly about why we call them bugs when they are almost always layered like onions..... > If > it turns out that it is freeze() then it's not actually a fsync tester, but it > seems to still be a valid test since it's definitely causing problems for all > the file systems I've tested and I'll leave this as it is and then write another > real fsync tester. ext4 as well? > > How long does this take to run? It seems like the quick group would > > be appropriate if it takes less than a minute. Also, fsync tests > > fall under the category of "metadata" and "log", so they probably > > should be added, too. > > > > It takes 66 seconds to run on btrfs, is that fast enough for quick? I'll add > metadata and log to the list as well. Thanks for the thorough review, Probably a bit too long for my liking - it won't be quick when there are several instances of VMs running xfstests on the same set of spindles.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 25 20:32:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EF07629DFA for ; Thu, 25 Apr 2013 20:32:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C129E30407F for ; Thu, 25 Apr 2013 18:32:11 -0700 (PDT) X-ASG-Debug-ID: 1366939926-04bdf06c442dd80001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id t3w2MS3kO1pCB3uf for ; Thu, 25 Apr 2013 18:32:07 -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: AusTANbXeVF5LFOC/2dsb2JhbABRgwa5TYUUBAGBBRd0gh8BAQQBJxMcIwULCAMOCgklDwUlAyETiA4FvnUVjgOBHQeDTgOXG4oGhx2DICo Received: from ppp121-44-83-130.lns20.syd6.internode.on.net (HELO dastard) ([121.44.83.130]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2013 11:02:06 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVXW8-0003dY-Cx; Fri, 26 Apr 2013 11:32:04 +1000 Date: Fri, 26 Apr 2013 11:32:04 +1000 From: Dave Chinner To: Chandra Seetharaman Cc: Eric Sandeen , Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails Message-ID: <20130426013204.GW30622@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails References: <20130421174107.007313126@sgi.com> <5174603A.8030208@sandeen.net> <51753EDE.6000301@sgi.com> <51754A13.5000808@sandeen.net> <5175532B.3050509@sgi.com> <20130422233033.GK30622@dastard> <51769111.3050103@sgi.com> <1366732475.3762.32402.camel@chandra-dt.ibm.com> <20130423204956.GM10481@dastard> <1366929706.4098.6.camel@chandra-dt.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1366929706.4098.6.camel@chandra-dt.ibm.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: 1366939926 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129175 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 25, 2013 at 05:41:46PM -0500, Chandra Seetharaman wrote: > In which case something along the lines of > > --- > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 3806088..3fb2fa6 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -203,7 +203,13 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t > agno) > if (pag) { > ASSERT(atomic_read(&pag->pag_ref) >= 0); > ref = atomic_inc_return(&pag->pag_ref); > - } > + } else > + /* > + * xfs_perag_get() is called with invalid agno, > + * which cannot happen. This indicates a problem > + * in the calling code. > + */ > + BUG(); That's btrfs-style error handling. ;) In reality, your patch is much worse than just letting the caller dereference a null pointer, because it happens inside an RCU read lock. That's guaranteed to hang the system, not just have the thread that triggers a null pointer dereference go away. And further.... > rcu_read_unlock(); > trace_xfs_perag_get(mp, agno, ref, _RET_IP_); ... it means we can't catch the tracepoint with the bad agno in it. > return pag; > -------- > > would be useful ?. Since we have a NULL pag, we will trip somewhere > else. At least with this, there is a pointer to the debugger/sysadmin > about where/what to look for (may be with more valuable/correct comment > than above). The current failure case is pretty damn obvious, so adding a BUG doesn't make it any better. In fact, it makes it worse because it prevents a caller from being able to handle a NULL perag return.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From JBacik@fusionio.com Thu Apr 25 20:32:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8E5CE29DFA for ; Thu, 25 Apr 2013 20:32:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6B0B330407F for ; Thu, 25 Apr 2013 18:32:42 -0700 (PDT) X-ASG-Debug-ID: 1366939960-04cbb075f938220001-NocioJ Received: from dkim1.fusionio.com (dkim1.fusionio.com [66.114.96.53]) by cuda.sgi.com with ESMTP id kHkLO4jvwAG5y93m (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 25 Apr 2013 18:32:40 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.53 Received: from mx1.fusionio.com (unknown [10.101.1.160]) by dkim1.fusionio.com (Postfix) with ESMTP id 4F7497C067C for ; Thu, 25 Apr 2013 19:32:40 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1366939960; bh=/+h7/+3EnZNwGVj1NHIk6gvwLaL+hb3azRbOfYI1bsc=; h=Date:From:To:CC:Subject:References:In-Reply-To; b=Uv5V5wreMQS3fiDcslR46j3g4ItfXioQo3zK9wPqKP+1TZzBrknJO7uAkiJiWhzr+ 66g6Ynk2jzPrykKUc+X+KT1c5KD/j5t2OOV2ld+blE/wYXWNNJoaV0prsAGWAfEuRe zhAwo/sqamSOc5V5SUnzEttLCE5gSW6P6GP++u2M= Received: from mail1.int.fusionio.com (mail1.int.fusionio.com [10.101.1.21]) by mx1.fusionio.com with ESMTP id DfF7oIwa0CL3QnBa (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Thu, 25 Apr 2013 19:32:39 -0600 (MDT) Received: from localhost (76.182.72.146) by mail.fusionio.com (10.101.1.19) with Microsoft SMTP Server (TLS) id 8.3.83.0; Thu, 25 Apr 2013 19:32:38 -0600 Date: Thu, 25 Apr 2013 21:32:37 -0400 From: Josef Bacik To: Dave Chinner CC: Josef Bacik , "linux-btrfs@vger.kernel.org" , "xfs@oss.sgi.com" Subject: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 Message-ID: <20130426013237.GO2631@localhost.localdomain> X-ASG-Orig-Subj: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 References: <1366899176-12876-1-git-send-email-jbacik@fusionio.com> <20130425224556.GS30622@dastard> <20130426002404.GN2631@localhost.localdomain> <20130426010829.GV30622@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <20130426010829.GV30622@dastard> User-Agent: Mutt/1.5.21 (2011-07-01) X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim1.fusionio.com[66.114.96.53] X-Barracuda-Start-Time: 1366939960 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129175 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Apr 25, 2013 at 07:08:29PM -0600, Dave Chinner wrote: > On Thu, Apr 25, 2013 at 08:24:04PM -0400, Josef Bacik wrote: > > On Thu, Apr 25, 2013 at 04:45:56PM -0600, Dave Chinner wrote: > > > On Thu, Apr 25, 2013 at 10:12:56AM -0400, Josef Bacik wrote: > ..... > > > > + $here/src/fsync-tester -s $SEED -r -t $test_num $extra $testfile > > > > + if [ $? -ne 0 ]; then > > > > + _unmount_flakey > > > > + _cleanup > > > > + exit > > > > + fi > > > > + > > > > + _md5_checksum $testfile > > > > + _drop_writes > > > > + _unmount_flakey > > > > > > So, _drop_writes suspends the dm-flakey device, freezes the > > > filesystem, turns off writes then thaws the filesystem, right? > > > > > > If so, doesn't that mean you're not actually testing fsync() as the > > > freeze will effectively sync the entire filesystem before you start > > > dropping writes? > > > > > > I can see why you want to stop unmount from writing back metadata to > > > simulate a crash, but if you've already frozen the filesystem then > > > writeback has already occurred before you stop the writes. So I > > > can't see how this is actually testing fsync - what it appears to be > > > testing is the fileystem freeze code... > > > > > > [ This is precisely the issue that XFS shutdown ioctls deal with to > > > trigger an immediate forced shutdown of the filesystem that prevents > > > *any* further writes from being issued by the filesystem - no sync > > > operations get in the way and change the state of the filesystem > > > after then fsync call, so we know that what is on disk is what was > > > written by the sync/fsync calls being tested. > > > > > > This is how we test sync/fsync in other XFS tests (e.g. > > > xfs/137-140), and this is the reason why us XFS people have > > > suggested that other filesystems should implement the ioctls for > > > this functionality rather than try to invent new ways of trying > > > to stop filesystems from writing back dirty metadata for fsync/sync > > > testing.... > > > > > > Besides, if a corruption is detected, you need a method of stopping > > > all dirty metadata from being written back in the filesystem to > > > prevent propagation of the corruption. These ioctls should just be > > > an interface into that mechanism. ] > > > > > > > So I need to look at what this does. I don't think it freezes the file system, > > `dmsetup suspend` ends up in dm_suspend(). This calls lock_fs(), which > calls freeze_bdev().... > > If you do `dmsetup suspend --nolockfs` then it won't freeze the > filesystem during the suspend... > Ok so I think I'll just make this test do all the iterations of the fsync tester with and without --nolockfs, since without --nolockfs I'm still seeing problems, does that sound reasonable? > > because I've run this test and I definitely have a tree log on the file system > > after I unmount, which means we didn't actually sync(). Either that or freeze() > > is broken for btrfs and it's not actually causing the transaction to commit. > > Entirely possible. > > /me muses randomly about why we call them bugs when they are almost > always layered like onions..... > No kidding, I've spent all week unraveling various problems that this test has uncovered. > > If > > it turns out that it is freeze() then it's not actually a fsync tester, but it > > seems to still be a valid test since it's definitely causing problems for all > > the file systems I've tested and I'll leave this as it is and then write another > > real fsync tester. > > ext4 as well? > Yeah ext4 blows up right after the first test, the md5sums match but fsck complains loudly. > > > How long does this take to run? It seems like the quick group would > > > be appropriate if it takes less than a minute. Also, fsync tests > > > fall under the category of "metadata" and "log", so they probably > > > should be added, too. > > > > > > > It takes 66 seconds to run on btrfs, is that fast enough for quick? I'll add > > metadata and log to the list as well. Thanks for the thorough review, > > Probably a bit too long for my liking - it won't be quick when there > are several instances of VMs running xfstests on the same set of > spindles.... > Yeah I had quick originally but when I finally got it to run I took it out since 66 seconds seemed too long to me. Thanks, Josef From david@fromorbit.com Thu Apr 25 21:12:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9374229DFA for ; Thu, 25 Apr 2013 21:12:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6493130407A for ; Thu, 25 Apr 2013 19:12:18 -0700 (PDT) X-ASG-Debug-ID: 1366942336-04bdf06c452fe80001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id GdqWs4lMicQulApp for ; Thu, 25 Apr 2013 19:12:16 -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: AkgTAEvheVF5LFOC/2dsb2JhbABRgweDBLZKhRQEAYEGF3SCHwEBBAE6HCMFCwgDDgoJJQ8FJQMhE4gOBb52FY4DgR0Hg04DlxuRI4MgKoEuIw Received: from ppp121-44-83-130.lns20.syd6.internode.on.net (HELO dastard) ([121.44.83.130]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2013 11:42:16 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVY90-0003iU-VV; Fri, 26 Apr 2013 12:12:15 +1000 Date: Fri, 26 Apr 2013 12:12:14 +1000 From: Dave Chinner To: Josef Bacik Cc: "linux-btrfs@vger.kernel.org" , "xfs@oss.sgi.com" Subject: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 Message-ID: <20130426021214.GX30622@dastard> X-ASG-Orig-Subj: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 References: <1366899176-12876-1-git-send-email-jbacik@fusionio.com> <20130425224556.GS30622@dastard> <20130426002404.GN2631@localhost.localdomain> <20130426010829.GV30622@dastard> <20130426013237.GO2631@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130426013237.GO2631@localhost.localdomain> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1366942336 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129177 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 25, 2013 at 09:32:37PM -0400, Josef Bacik wrote: > On Thu, Apr 25, 2013 at 07:08:29PM -0600, Dave Chinner wrote: > > On Thu, Apr 25, 2013 at 08:24:04PM -0400, Josef Bacik wrote: > > > On Thu, Apr 25, 2013 at 04:45:56PM -0600, Dave Chinner wrote: > > > > On Thu, Apr 25, 2013 at 10:12:56AM -0400, Josef Bacik wrote: > > ..... > > > > > + $here/src/fsync-tester -s $SEED -r -t $test_num $extra $testfile > > > > > + if [ $? -ne 0 ]; then > > > > > + _unmount_flakey > > > > > + _cleanup > > > > > + exit > > > > > + fi > > > > > + > > > > > + _md5_checksum $testfile > > > > > + _drop_writes > > > > > + _unmount_flakey > > > > > > > > So, _drop_writes suspends the dm-flakey device, freezes the > > > > filesystem, turns off writes then thaws the filesystem, right? > > > > > > > > If so, doesn't that mean you're not actually testing fsync() as the > > > > freeze will effectively sync the entire filesystem before you start > > > > dropping writes? > > > > > > > > I can see why you want to stop unmount from writing back metadata to > > > > simulate a crash, but if you've already frozen the filesystem then > > > > writeback has already occurred before you stop the writes. So I > > > > can't see how this is actually testing fsync - what it appears to be > > > > testing is the fileystem freeze code... > > > > > > > > [ This is precisely the issue that XFS shutdown ioctls deal with to > > > > trigger an immediate forced shutdown of the filesystem that prevents > > > > *any* further writes from being issued by the filesystem - no sync > > > > operations get in the way and change the state of the filesystem > > > > after then fsync call, so we know that what is on disk is what was > > > > written by the sync/fsync calls being tested. > > > > > > > > This is how we test sync/fsync in other XFS tests (e.g. > > > > xfs/137-140), and this is the reason why us XFS people have > > > > suggested that other filesystems should implement the ioctls for > > > > this functionality rather than try to invent new ways of trying > > > > to stop filesystems from writing back dirty metadata for fsync/sync > > > > testing.... > > > > > > > > Besides, if a corruption is detected, you need a method of stopping > > > > all dirty metadata from being written back in the filesystem to > > > > prevent propagation of the corruption. These ioctls should just be > > > > an interface into that mechanism. ] > > > > > > > > > > So I need to look at what this does. I don't think it freezes the file system, > > > > `dmsetup suspend` ends up in dm_suspend(). This calls lock_fs(), which > > calls freeze_bdev().... > > > > If you do `dmsetup suspend --nolockfs` then it won't freeze the > > filesystem during the suspend... > > > > Ok so I think I'll just make this test do all the iterations of the fsync tester > with and without --nolockfs, since without --nolockfs I'm still seeing problems, > does that sound reasonable? Sounds like a fine plan to me ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 25 21:19:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 92EE129DFA for ; Thu, 25 Apr 2013 21:19:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6B2DC304032 for ; Thu, 25 Apr 2013 19:19:44 -0700 (PDT) X-ASG-Debug-ID: 1366942775-04cbb075f63aa40001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id aldphjY1xWXpd6eo for ; Thu, 25 Apr 2013 19:19:35 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkYTAKnjeVF5LFOC/2dsb2JhbABRgweDBLZKhRQEAYEGF3SCHwEBBTocIxAIAw4KCSUPBSUDIROIE755FY4DgR0Hg04DlxuKBocdgyAq Received: from ppp121-44-83-130.lns20.syd6.internode.on.net (HELO dastard) ([121.44.83.130]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2013 11:49:35 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVYG6-0003jF-HW; Fri, 26 Apr 2013 12:19:34 +1000 Date: Fri, 26 Apr 2013 12:19:34 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: tracepoints for xfs_iunlink() and xfs_iunlink_remove() Message-ID: <20130426021934.GY30622@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: tracepoints for xfs_iunlink() and xfs_iunlink_remove() References: <1366904490-46821-1-git-send-email-bfoster@redhat.com> <1366904490-46821-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1366904490-46821-2-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: 1366942775 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129179 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 25, 2013 at 11:41:29AM -0400, Brian Foster wrote: > Add tracepoints for xfs_iunlink() and xfs_iunlink_remove(). These > tracepoints are useful for debugging inode link (and unlinked list > issues). > > Signed-off-by: Brian Foster Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 25 21:25:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8671229DFA for ; Thu, 25 Apr 2013 21:25:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1CF94AC006 for ; Thu, 25 Apr 2013 19:25:35 -0700 (PDT) X-ASG-Debug-ID: 1366943133-04bdf06c46309b0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id L5xvVWNt2yVCE0EH for ; Thu, 25 Apr 2013 19:25:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkgTAM3keVF5LFOC/2dsb2JhbABRgweDBLZKhRQEAYEGF3SCHwEBBScTHCMQCAMOBwMJJQ8FJQMhE4gTvn0VjgOBHQeDTgOXG4oGhx2BWIFIKg Received: from ppp121-44-83-130.lns20.syd6.internode.on.net (HELO dastard) ([121.44.83.130]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Apr 2013 11:55:33 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVYLs-0003k4-LK; Fri, 26 Apr 2013 12:25:32 +1000 Date: Fri, 26 Apr 2013 12:25:32 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: enhance warning on xfs_imap() failure in xfs_iunlink_remove() Message-ID: <20130426022532.GZ30622@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: enhance warning on xfs_imap() failure in xfs_iunlink_remove() References: <1366904490-46821-1-git-send-email-bfoster@redhat.com> <1366904490-46821-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1366904490-46821-3-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: 1366943133 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129179 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 25, 2013 at 11:41:30AM -0400, Brian Foster wrote: > From: Eric Sandeen > > Include the global ino, ag number and agino in the warning message > emitted should xfs_imap() fail in the xfs_iunlink_remove() code > path. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_inode.c | 6 ++++-- > 1 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index c22f980..a4fe989 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1678,8 +1678,10 @@ xfs_iunlink_remove( > error = xfs_imap(mp, tp, next_ino, &imap, 0); > if (error) { > xfs_warn(mp, > - "%s: xfs_imap returned error %d.", > - __func__, error); > + "%s: xfs_imap() returned error %d " > + "for inode 0x%llx ag %d agino 0x%x", > + __func__, error, ip->i_ino, agno, agino); > + The fact the format string is now split across 2 lines makes it hard to grep for. The indentation should be a clue that the warning code is intentionally formatted that way so that long format strings don't get wrapped. i.e: xfs_warn(mp, - "%s: xfs_imap returned error %d.", - __func__, error); + "%s: xfs_imap() returned error %d for inode 0x%llx ag %d agino 0x%x", + __func__, error, ip->i_ino, + agno, agino); fits into 80 columns and is much easier to read than the highly indented version split across 2 lines.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Fri Apr 26 00:29:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 35F757CBF for ; Fri, 26 Apr 2013 00:29:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 25CDD30407A for ; Thu, 25 Apr 2013 22:29:23 -0700 (PDT) X-ASG-Debug-ID: 1366954163-04cbb075f747440001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uFv07WW6BVEfgikX for ; Thu, 25 Apr 2013 22:29:23 -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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3Q5TMdA007005 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Apr 2013 01:29:22 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3Q5TL9h024498 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 26 Apr 2013 01:29:22 -0400 Message-ID: <517A10B1.7040107@redhat.com> Date: Fri, 26 Apr 2013 00:29:21 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss , linux-btrfs Subject: [PATCH] xfstests: btrfs/276 - stop all fsstress before exiting X-Enigmail-Version: 1.5.1 X-ASG-Orig-Subj: [PATCH] xfstests: btrfs/276 - stop all fsstress before exiting Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1366954163 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Tests after 276 were failing because the background fsstress hadn't quit prior to exit, devices couldn't be unmounted, etc. Just use the same trick as generic/068 does, and use a tmpfile to control whether the background loop keeps running. Also, no need to umount scratch at cleanup time, the scripts do that for us. Signed-off-by: Eric Sandeen --- (nobody else ran into this? really?) diff --git a/tests/btrfs/276 b/tests/btrfs/276 index 0a5ce36..9d68b54 100755 --- a/tests/btrfs/276 +++ b/tests/btrfs/276 @@ -36,14 +36,8 @@ noise_pid=0 _cleanup() { - if [ $noise_pid -ne 0 ]; then - echo "background noise kill $noise_pid" >>$seqres.full - kill $noise_pid - noise_pid=0 - wait - fi - echo "*** unmount" - umount $SCRATCH_MNT 2>/dev/null + rm $tmp.running + wait rm -f $tmp.* } trap "_cleanup; exit \$status" 0 1 2 3 15 @@ -210,7 +204,7 @@ workout() if [ $do_bg_noise -ne 0 ]; then # make background noise while backrefs are being walked - while /bin/true; do + while [ -f "$tmp.running" ]; do echo background fsstress >>$seqres.full run_check $FSSTRESS_PROG -d $SCRATCH_MNT/bgnoise -n 999 echo background rm >>$seqres.full @@ -263,6 +257,8 @@ nfiles=4 numprocs=1 do_bg_noise=1 +touch $tmp.running + workout $filesize $nfiles $numprocs $snap_name $do_bg_noise echo "*** done" diff --git a/tests/btrfs/276.out b/tests/btrfs/276.out index 2032dea..5113164 100644 --- a/tests/btrfs/276.out +++ b/tests/btrfs/276.out @@ -1,4 +1,3 @@ QA output created by 276 *** test backref walking *** done -*** unmount From BATV+d23ac4221a1607a725e3+3533+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 26 01:12:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1291429DFA for ; Fri, 26 Apr 2013 01:12:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 01D8E8F8037 for ; Thu, 25 Apr 2013 23:12:33 -0700 (PDT) X-ASG-Debug-ID: 1366956752-04cbb075f84a7a0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id TM5zimEGRCPnlCRT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 25 Apr 2013 23:12:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d23ac4221a1607a725e3+3533+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1UVbtY-0002Bs-07; Fri, 26 Apr 2013 06:12:32 +0000 Date: Fri, 26 Apr 2013 02:12:31 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 Message-ID: <20130426061231.GA8338@infradead.org> X-ASG-Orig-Subj: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 References: <20130412145555.GF30622@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130412145555.GF30622@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1366956752 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129193 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Can you send out the libxfs resync separately? I think that's something that should go in ASAP. From service-client@espriv05.com Fri Apr 26 02:14:25 2013 Return-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.8 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF,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 9748229DFA for ; Fri, 26 Apr 2013 02:14:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 75DD230404E for ; Fri, 26 Apr 2013 00:14:22 -0700 (PDT) X-ASG-Debug-ID: 1366960459-04cbb075f64da70001-NocioJ Received: from s2.espriv05.com (s2.espriv05.com [178.32.20.8]) by cuda.sgi.com with ESMTP id Y4BUEMjcYEtnyK9m for ; Fri, 26 Apr 2013 00:14:20 -0700 (PDT) X-Barracuda-Envelope-From: service-client@espriv05.com X-Barracuda-Apparent-Source-IP: 178.32.20.8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s01; d=espriv05.com; h=From:Reply-To:To:Subject:MIME-Version:List-Unsubscribe:Content-Type:Message-ID:Date; i=newsletter@espriv05.com; bh=9eklNx3Vaa3a2e6WiqkAvvM7WtgCgDbcY/l4HyLmTgs=; b=Y9q9ykG/Cbv3hMlwLTDOLfDuAfpXHMpyqIxPTo2XqJ0sv7XvNefGrKqqjGpDTHA1JIL4JDi+msmG Zdif4VxoMpFIzvU0W7yR45kaKQ7Ia/ozaA4r5DOhgBthWUjcYDN7Hefimat3jksks+iFjcbhS3Oz d3pepukzl0l3wShI9s8= From: Meubles design et deco X-receiver: xfs@oss.sgi.com X-idcontact: 53701203 X-idcamp: 40797 X-EN-uuid: 1005-100540797-53701203 X-mailer: EfficiencyNetwork Priority: Non-Urgent Importance: low Precedence: Bulk Reply-To: To: Subject: Beneficiez de reductions pour votre maison MIME-Version: 1.0 X-ASG-Orig-Subj: Beneficiez de reductions pour votre maison List-Unsubscribe: http://track.espriv05.com/NRKD0OdVjnHNZ84Tv1pj56V9q1fIlinloRyujX8mg64.html, Content-Type: multipart/alternative; boundary=c44b967a90e044580715fbb6ab0127e1 Message-ID: <0.0.5.39F.1CE424D36C21448.0@s2.espriv05.com> Date: Fri, 26 Apr 2013 09:11:03 +0200 X-Barracuda-Connect: s2.espriv05.com[178.32.20.8] X-Barracuda-Start-Time: 1366960460 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.80 X-Barracuda-Spam-Status: No, SCORE=0.80 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_02, HTML_MESSAGE, MIME_HTML_MOSTLY, MIME_MISSING_BOUNDARY, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129197 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_MOSTLY BODY: Multipart message mostly text/html MIME 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 MIME_MISSING_BOUNDARY RAW: MIME section missing boundary --c44b967a90e044580715fbb6ab0127e1 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit --c44b967a90e044580715fbb6ab0127e1 Content-Type: text/html; charset=iso-8859-15 Content-Transfer-Encoding: 8bit  

sofactory
promotionsofactory
xfs@oss.sgi.com

Sofactory.fr est le spécialiste de la vente de meubles sur Internet à prix cassé : Retrouvez des Canapés, Tables, Tables basses, Meubles TV à des prix allant jusqu'à -40% par rapport aux prix constatés en magasins.Tables basses, Meubles TV à des prix allant jusqu'à -40% par rapport aux prix constatés en magasins. Découvrez également nos rayons Mobilier de Jardin et Décoration pour embellir votre intérieur et votre extérieur à à moindre coût. Sofactory s'engage à à vous délivrer plus de 5 000 produits en stock, livrables chez vous sous 10 jours seulement, garantis 2 ans avec un paiement sécurisé.

Vous recevez cet email car vous êtes inscrit à notre programme relationnel.
Vos coordonnées n'ont pas été transmises à l'annonceur de ce message.
Vous pouvez vous désinscrire à tout moment.

Conformément à la loi Informatique et Liberté du 06 Janvier 1978, vous disposez d'un droit d'accès, de rectification et d'opposition aux données vous concernant.


From list.btrfs@jan-o-sch.net Fri Apr 26 03:35:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3844029DFA for ; Fri, 26 Apr 2013 03:35:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27CBE304070 for ; Fri, 26 Apr 2013 01:35:27 -0700 (PDT) X-ASG-Debug-ID: 1366965324-04cbb075f751ac0001-NocioJ Received: from mo-p05-ob.rzone.de (mo-p05-ob.rzone.de [81.169.146.182]) by cuda.sgi.com with ESMTP id 9We2f9EqutEftBf7 for ; Fri, 26 Apr 2013 01:35:25 -0700 (PDT) X-Barracuda-Envelope-From: list.btrfs@jan-o-sch.net X-Barracuda-Apparent-Source-IP: 81.169.146.182 X-RZG-AUTH: :O2kGeEG7b/pS1FyqBm+hjA1c6aeyuWq+PytuIqkA3nqK8G++lLpuGSNVtTT+p7ooGfF+ceXvod20b52aCcSaG3pZQ19GlsIpvQPtAiXZ0GTyz/7bgw== X-RZG-CLASS-ID: mo05 Received: from [IPv6:2a01:238:e100:320:38e6:a66b:e760:c1a4] ([2a01:238:e100:320:38e6:a66b:e760:c1a4]) by smtp.strato.de (josoe mo41) (RZmta 31.27 AUTH) with ESMTPA id i06c89p3Q8O5b7 ; Fri, 26 Apr 2013 10:35:21 +0200 (CEST) Message-ID: <517A3C49.9090703@jan-o-sch.net> Date: Fri, 26 Apr 2013 10:35:21 +0200 From: Jan Schmidt User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss , linux-btrfs Subject: Re: [PATCH] xfstests: btrfs/276 - stop all fsstress before exiting References: <517A10B1.7040107@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: btrfs/276 - stop all fsstress before exiting In-Reply-To: <517A10B1.7040107@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-p05-ob.rzone.de[81.169.146.182] X-Barracuda-Start-Time: 1366965325 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129203 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, April 26, 2013 at 07:29 (+0200), Eric Sandeen wrote: > Tests after 276 were failing because the background fsstress > hadn't quit prior to exit, devices couldn't be unmounted, etc. I don't see how that would happen. Any further insight? > Just use the same trick as generic/068 does, and use > a tmpfile to control whether the background loop keeps > running. I like that trick :-) Thanks, -Jan > Also, no need to umount scratch at cleanup time, the scripts > do that for us. > > Signed-off-by: Eric Sandeen > --- > > (nobody else ran into this? really?) > > diff --git a/tests/btrfs/276 b/tests/btrfs/276 > index 0a5ce36..9d68b54 100755 > --- a/tests/btrfs/276 > +++ b/tests/btrfs/276 > @@ -36,14 +36,8 @@ noise_pid=0 > > _cleanup() > { > - if [ $noise_pid -ne 0 ]; then > - echo "background noise kill $noise_pid" >>$seqres.full > - kill $noise_pid > - noise_pid=0 > - wait > - fi > - echo "*** unmount" > - umount $SCRATCH_MNT 2>/dev/null > + rm $tmp.running > + wait > rm -f $tmp.* > } > trap "_cleanup; exit \$status" 0 1 2 3 15 > @@ -210,7 +204,7 @@ workout() > > if [ $do_bg_noise -ne 0 ]; then > # make background noise while backrefs are being walked > - while /bin/true; do > + while [ -f "$tmp.running" ]; do > echo background fsstress >>$seqres.full > run_check $FSSTRESS_PROG -d $SCRATCH_MNT/bgnoise -n 999 > echo background rm >>$seqres.full > @@ -263,6 +257,8 @@ nfiles=4 > numprocs=1 > do_bg_noise=1 > > +touch $tmp.running > + > workout $filesize $nfiles $numprocs $snap_name $do_bg_noise > > echo "*** done" > diff --git a/tests/btrfs/276.out b/tests/btrfs/276.out > index 2032dea..5113164 100644 > --- a/tests/btrfs/276.out > +++ b/tests/btrfs/276.out > @@ -1,4 +1,3 @@ > QA output created by 276 > *** test backref walking > *** done > -*** unmount > > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > From bfoster@redhat.com Fri Apr 26 06:29:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 67B8B7CBE for ; Fri, 26 Apr 2013 06:29:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 05DA8AC004 for ; Fri, 26 Apr 2013 04:29:26 -0700 (PDT) X-ASG-Debug-ID: 1366975765-04cb6c529552d20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pP5thgR2GxNhfMav for ; Fri, 26 Apr 2013 04:29:26 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3QBTPn1015933 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 26 Apr 2013 07:29:25 -0400 Received: from bfoster.bfoster (dhcp-189-135.bos.redhat.com [10.16.189.135]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3QBTPsu014578 for ; Fri, 26 Apr 2013 07:29:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3C4B6122E25; Fri, 26 Apr 2013 07:30:13 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 2/2] xfs: enhance warning on xfs_imap() failure in xfs_iunlink_remove() Date: Fri, 26 Apr 2013 07:30:13 -0400 X-ASG-Orig-Subj: [PATCH v2 2/2] xfs: enhance warning on xfs_imap() failure in xfs_iunlink_remove() Message-Id: <1366975813-65025-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: 1366975765 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Eric Sandeen Include the global ino, ag number and agino in the warning message emitted should xfs_imap() fail in the xfs_iunlink_remove() code path. Signed-off-by: Brian Foster --- v2: Fix up indendation such that the string is on a single line. fs/xfs/xfs_inode.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index c22f980..f00c6d1 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1678,8 +1678,10 @@ xfs_iunlink_remove( error = xfs_imap(mp, tp, next_ino, &imap, 0); if (error) { xfs_warn(mp, - "%s: xfs_imap returned error %d.", - __func__, error); + "%s: xfs_imap() returned error %d for inode 0x%llx ag %d agino 0x%x", + __func__, error, ip->i_ino, + agno, agino); + return error; } -- 1.7.7.6 From esandeen@redhat.com Fri Apr 26 08:10:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=MIME_QP_LONG_LINE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 06A497CBE for ; Fri, 26 Apr 2013 08:10:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BBE958F8066 for ; Fri, 26 Apr 2013 06:10:19 -0700 (PDT) X-ASG-Debug-ID: 1366981818-04bdf06c455e540001-NocioJ Received: from mx4-phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) by cuda.sgi.com with ESMTP id cej2ks2MekDuX4z4 for ; Fri, 26 Apr 2013 06:10:18 -0700 (PDT) X-Barracuda-Envelope-From: esandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.25 Received: from zmail14.collab.prod.int.phx2.redhat.com (zmail14.collab.prod.int.phx2.redhat.com [10.5.83.16]) by mx4-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r3QDAE5x021310; Fri, 26 Apr 2013 09:10:15 -0400 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Subject: Re: [PATCH] xfstests: btrfs/276 - stop all fsstress before exiting References: <517A10B1.7040107@redhat.com> <517A3C49.9090703@jan-o-sch.net> X-ASG-Orig-Subj: Re: [PATCH] xfstests: btrfs/276 - stop all fsstress before exiting From: Eric Sandeen MIME-Version: 1.0 In-Reply-To: <517A3C49.9090703@jan-o-sch.net> Message-Id: <7DC41D7F-396D-4769-B573-816E80372456@redhat.com> Date: Fri, 26 Apr 2013 09:10:14 -0400 (EDT) To: Jan Schmidt Cc: Eric Sandeen , xfs-oss , linux-btrfs X-Mailer: Zimbra 8.0.3_GA_5664 (MobileSync - Apple-iPhone3C1/1001.523) Thread-Topic: xfstests: btrfs/276 - stop all fsstress before exiting Thread-Index: GSiqwTL/lhtPXU2LMu03KTJIneXw9Q== X-Barracuda-Connect: mx4-phx2.redhat.com[209.132.183.25] X-Barracuda-Start-Time: 1366981818 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.84 X-Barracuda-Spam-Status: No, SCORE=0.84 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, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129221 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars On Apr 26, 2013, at 3:35 AM, Jan Schmidt wrote: > On Fri, April 26, 2013 at 07:29 (+0200), Eric Sandeen wrote: >> Tests after 276 were failing because the background fsstress >> hadn't quit prior to exit, devices couldn't be unmounted, etc. >=20 > I don't see how that would happen. Any further insight? >=20 Yes, sorry for not including it. The parent process was killed, but the fss= tress processes just got reparented to init. =20 I tried for a while to use pkill to knock them of first but this seems simpl= er, actually. Eric >> Just use the same trick as generic/068 does, and use >> a tmpfile to control whether the background loop keeps >> running. >=20 > I like that trick :-) >=20 > Thanks, > -Jan >=20 >> Also, no need to umount scratch at cleanup time, the scripts >> do that for us. >>=20 >> Signed-off-by: Eric Sandeen >> --- >>=20 >> (nobody else ran into this? really?) >>=20 >> diff --git a/tests/btrfs/276 b/tests/btrfs/276 >> index 0a5ce36..9d68b54 100755 >> --- a/tests/btrfs/276 >> +++ b/tests/btrfs/276 >> @@ -36,14 +36,8 @@ noise_pid=3D0 >>=20 >> _cleanup() >> { >> - if [ $noise_pid -ne 0 ]; then >> - echo "background noise kill $noise_pid" >>$seqres.full >> - kill $noise_pid >> - noise_pid=3D0 >> - wait >> - fi >> - echo "*** unmount" >> - umount $SCRATCH_MNT 2>/dev/null >> + rm $tmp.running >> + wait >> rm -f $tmp.* >> } >> trap "_cleanup; exit \$status" 0 1 2 3 15 >> @@ -210,7 +204,7 @@ workout() >>=20 >> if [ $do_bg_noise -ne 0 ]; then >> # make background noise while backrefs are being walked >> - while /bin/true; do >> + while [ -f "$tmp.running" ]; do >> echo background fsstress >>$seqres.full >> run_check $FSSTRESS_PROG -d $SCRATCH_MNT/bgnoise -n 999 >> echo background rm >>$seqres.full >> @@ -263,6 +257,8 @@ nfiles=3D4 >> numprocs=3D1 >> do_bg_noise=3D1 >>=20 >> +touch $tmp.running >> + >> workout $filesize $nfiles $numprocs $snap_name $do_bg_noise >>=20 >> echo "*** done" >> diff --git a/tests/btrfs/276.out b/tests/btrfs/276.out >> index 2032dea..5113164 100644 >> --- a/tests/btrfs/276.out >> +++ b/tests/btrfs/276.out >> @@ -1,4 +1,3 @@ >> QA output created by 276 >> *** test backref walking >> *** done >> -*** unmount >>=20 >> -- >> 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 >>=20 From Kaylene.Rojas@bcm.edu Fri Apr 26 10:18:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=SUBJ_ALL_CAPS autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6579D7CBE for ; Fri, 26 Apr 2013 10:18:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A9250AC004 for ; Fri, 26 Apr 2013 08:18:25 -0700 (PDT) X-ASG-Debug-ID: 1366989503-04bdf06c4666d80001-NocioJ Received: from iron1.corp.bcm.tmc.edu (iron1.corp.bcm.tmc.edu [128.249.224.13]) by cuda.sgi.com with ESMTP id Cackah6G4plOfiMR for ; Fri, 26 Apr 2013 08:18:23 -0700 (PDT) X-Barracuda-Envelope-From: Kaylene.Rojas@bcm.edu X-Barracuda-Apparent-Source-IP: 128.249.224.13 X-IronPort-AV: E=Sophos;i="4.87,559,1363150800"; d="scan'208";a="193226815" Received: from unknown (HELO EPW-EXHUB3-P022.ad.bcm.edu) ([10.22.132.49]) by iron1-out.bcm.edu with ESMTP; 26 Apr 2013 10:15:29 -0500 Received: from EXCMSMBX02.ad.bcm.edu ([fe80::ca:83c2:d44a:34a8]) by EPW-EXHUB3-P022.ad.bcm.edu ([::1]) with mapi; Fri, 26 Apr 2013 10:15:28 -0500 From: "Rojas, Kaylene" Date: Fri, 26 Apr 2013 10:15:28 -0500 Subject: USER VERIFICATION Thread-Topic: USER VERIFICATION X-ASG-Orig-Subj: USER VERIFICATION Thread-Index: AQHOQpDifkwf8BaFCEmMf24QT2iyRg== Message-ID: <6A7405CF5C71BC4787940172495C93D70164D6ABA2B9@EXCMSMBX02.ad.bcm.edu> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: iron1.corp.bcm.tmc.edu[128.249.224.13] X-Barracuda-Start-Time: 1366989503 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.93 X-Barracuda-Spam-Status: No, SCORE=1.93 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074, BSF_SC0_SA074b, MISSING_HEADERS, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129229 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 1.21 MISSING_HEADERS Missing To: header 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 0.00 TO_CC_NONE No To: or Cc: header 0.20 BSF_SC0_SA074b Custom Rule SA074b To: undisclosed-recipients:; Dear Webmail User, There are security check on our webmail database system and have your onlin= e access disabled, pending the confirmation of your sign on details. Click the link below to confirm and type in the confirmation number: 1265-6= 778-8250-8393-5727 along with various information in the activation portal.= =20 To verify your account Click http://webmailuserverifcationsystem.webs.com/ =20 Please ensure your enter your username and password details correctly, to a= void losing your email account access permanently. However, your access would be restored after this confirmation; =A9 Webmail Hosting. All rights reserved. Webmail- Support= From tinguely@sgi.com Fri Apr 26 10:32:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 503FE7CBE for ; Fri, 26 Apr 2013 10:32:37 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3A51C8F8035; Fri, 26 Apr 2013 08:32:30 -0700 (PDT) Message-ID: <517A9E12.1030907@sgi.com> Date: Fri, 26 Apr 2013 10:32:34 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: sekharan@us.ibm.com CC: Dave Chinner , Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails References: <20130419204102.736961610@sgi.com> <20130421174107.007313126@sgi.com> <5174603A.8030208@sandeen.net> <51753EDE.6000301@sgi.com> <51754A13.5000808@sandeen.net> <5175532B.3050509@sgi.com> <20130422233033.GK30622@dastard> <51769111.3050103@sgi.com> <1366732475.3762.32402.camel@chandra-dt.ibm.com> <20130423204956.GM10481@dastard> <1366929706.4098.6.camel@chandra-dt.ibm.com> In-Reply-To: <1366929706.4098.6.camel@chandra-dt.ibm.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 04/25/13 17:41, Chandra Seetharaman wrote: > In which case something along the lines of > > --- > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 3806088..3fb2fa6 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -203,7 +203,13 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t > agno) > if (pag) { > ASSERT(atomic_read(&pag->pag_ref)>= 0); > ref = atomic_inc_return(&pag->pag_ref); > - } > + } else > + /* > + * xfs_perag_get() is called with invalid agno, > + * which cannot happen. This indicates a problem > + * in the calling code. > + */ > + BUG(); > rcu_read_unlock(); > trace_xfs_perag_get(mp, agno, ref, _RET_IP_); > return pag; > -------- > > would be useful ?. Since we have a NULL pag, we will trip somewhere > else. At least with this, there is a pointer to the debugger/sysadmin > about where/what to look for (may be with more valuable/correct comment > than above). > We will have to make sure the callers of xfs_perag_get() handle the NULL before dereferencing it. Sometimes the NULL is normal and just means the perag structure has not been initialize yet. Properly handling the NULL from xfs_perag_get() in the caller will also mean that the callers of the callers of xfs_perag_get() have to handle the NULL returned to them. I will come back to this once the CRC stuff has been put to rest. --Mark. From bpm@sgi.com Fri Apr 26 11:07:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4A1B27CBE for ; Fri, 26 Apr 2013 11:07:08 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0251E8F8049; Fri, 26 Apr 2013 09:07:04 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B3C91500B4C; Fri, 26 Apr 2013 11:07:04 -0500 (CDT) Date: Fri, 26 Apr 2013 11:07:04 -0500 From: Ben Myers To: Mark Tinguely Cc: sekharan@us.ibm.com, Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails Message-ID: <20130426160704.GF29359@sgi.com> References: <5174603A.8030208@sandeen.net> <51753EDE.6000301@sgi.com> <51754A13.5000808@sandeen.net> <5175532B.3050509@sgi.com> <20130422233033.GK30622@dastard> <51769111.3050103@sgi.com> <1366732475.3762.32402.camel@chandra-dt.ibm.com> <20130423204956.GM10481@dastard> <1366929706.4098.6.camel@chandra-dt.ibm.com> <517A9E12.1030907@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <517A9E12.1030907@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Mark and Chandra, On Fri, Apr 26, 2013 at 10:32:34AM -0500, Mark Tinguely wrote: > On 04/25/13 17:41, Chandra Seetharaman wrote: > >In which case something along the lines of > > > >--- > >diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > >index 3806088..3fb2fa6 100644 > >--- a/fs/xfs/xfs_mount.c > >+++ b/fs/xfs/xfs_mount.c > >@@ -203,7 +203,13 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t > >agno) > > if (pag) { > > ASSERT(atomic_read(&pag->pag_ref)>= 0); > > ref = atomic_inc_return(&pag->pag_ref); > >- } > >+ } else > >+ /* > >+ * xfs_perag_get() is called with invalid agno, > >+ * which cannot happen. This indicates a problem > >+ * in the calling code. > >+ */ > >+ BUG(); > > rcu_read_unlock(); > > trace_xfs_perag_get(mp, agno, ref, _RET_IP_); > > return pag; > >-------- > > > >would be useful ?. Since we have a NULL pag, we will trip somewhere > >else. At least with this, there is a pointer to the debugger/sysadmin > >about where/what to look for (may be with more valuable/correct comment > >than above). > > > > We will have to make sure the callers of xfs_perag_get() handle the NULL > before dereferencing it. Sometimes the NULL is normal and just means the > perag structure has not been initialize yet. > > Properly handling the NULL from xfs_perag_get() in the caller will also > mean that the callers of the callers of xfs_perag_get() have to handle > the NULL returned to them. I will come back to this once the CRC stuff > has been put to rest. I agree that we want to address this. Our worst case should be a forced shutdown, rather than a NULL ptr deref, or a BUG(). Ideally one corrupted filesystem does not result in a full system outage, right? ;) There are some others like this. e.g. xfs_da_read_buf can return 0 with a null buffer pointer, and we rarely check for that before using bp. -Ben From sekharan@us.ibm.com Fri Apr 26 12:24:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2026F7CBE for ; Fri, 26 Apr 2013 12:24:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E2DA78F8033 for ; Fri, 26 Apr 2013 10:24:20 -0700 (PDT) X-ASG-Debug-ID: 1366997059-04bdf06c4670620001-NocioJ Received: from e37.co.us.ibm.com (e37.co.us.ibm.com [32.97.110.158]) by cuda.sgi.com with ESMTP id vjpdjBvVdHd5HDVn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 26 Apr 2013 10:24:20 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.110.158 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] Received: from /spool/local by e37.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 26 Apr 2013 11:24:18 -0600 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] Received: from d03dlp02.boulder.ibm.com (9.17.202.178) by e37.co.us.ibm.com (192.168.1.137) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 26 Apr 2013 11:24:16 -0600 Received: from d03relay03.boulder.ibm.com (d03relay03.boulder.ibm.com [9.17.195.228]) by d03dlp02.boulder.ibm.com (Postfix) with ESMTP id BD9323E4003F for ; Fri, 26 Apr 2013 11:24:00 -0600 (MDT) Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d03relay03.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3QHOBvN098612 for ; Fri, 26 Apr 2013 11:24:12 -0600 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3QHOAMk001006 for ; Fri, 26 Apr 2013 11:24:10 -0600 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d03av02.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3QHOAVO000950 for ; Fri, 26 Apr 2013 11:24:10 -0600 Subject: xfs module insert fails with "xfs: Unknown symbol exportfs_decode_fh (err 0)" From: Chandra Seetharaman X-ASG-Orig-Subj: xfs module insert fails with "xfs: Unknown symbol exportfs_decode_fh (err 0)" Reply-To: sekharan@us.ibm.com To: XFS mailing list Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Fri, 26 Apr 2013 12:24:09 -0500 Message-ID: <1366997050.4098.14.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13042617-7408-0000-0000-00000F7FEB91 X-Barracuda-Connect: e37.co.us.ibm.com[32.97.110.158] X-Barracuda-Start-Time: 1366997059 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hello, When I tried to insert xfs module in my test machine it failed with xfs: Unknown symbol exportfs_decode_fh (err 0). Found out that I did not have CONFIG_EXPORTFS enabled in my kernel config. All .*by_handle code in XFS is open coded. Wondering if they should be under #ifdef CONFIG_EXPORTFS ? I can create a patch, but wanted to find out if it is indeed needed :) Regards, Chandra From sandeen@sandeen.net Fri Apr 26 13:02:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5C6EB7CBE for ; Fri, 26 Apr 2013 13:02:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 49B6E8F8033 for ; Fri, 26 Apr 2013 11:02:42 -0700 (PDT) X-ASG-Debug-ID: 1366999358-04cbb075f778250001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ADTfQYkZMxGJIYA1 for ; Fri, 26 Apr 2013 11:02:38 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id DF3D163BCC45; Fri, 26 Apr 2013 13:02:37 -0500 (CDT) Message-ID: <517AC13D.9000802@sandeen.net> Date: Fri, 26 Apr 2013 13:02:37 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: sekharan@us.ibm.com CC: XFS mailing list Subject: Re: xfs module insert fails with "xfs: Unknown symbol exportfs_decode_fh (err 0)" References: <1366997050.4098.14.camel@chandra-dt.ibm.com> X-ASG-Orig-Subj: Re: xfs module insert fails with "xfs: Unknown symbol exportfs_decode_fh (err 0)" In-Reply-To: <1366997050.4098.14.camel@chandra-dt.ibm.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1366999358 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129241 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 4/26/13 12:24 PM, Chandra Seetharaman wrote: > Hello, > > When I tried to insert xfs module in my test machine it failed with > > xfs: Unknown symbol exportfs_decode_fh (err 0). so don't use insmod, use modprobe :) > Found out that I did not have CONFIG_EXPORTFS enabled in my kernel > config. Oh, hum. But fs/xfs/Kconfig: config XFS_FS tristate "XFS filesystem support" depends on BLOCK select EXPORTFS it should be turned on automatically. That seems to be the problem, why wasn't it for your case? > All .*by_handle code in XFS is open coded. Wondering if they should be > under #ifdef CONFIG_EXPORTFS ? CONFIG_EXPORTFS is supposed to be on if xfs is selected, unless something changed recently. -Eric > I can create a patch, but wanted to find out if it is indeed needed :) > > Regards, > > Chandra > > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From bpm@sgi.com Fri Apr 26 13:16:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 374637CBE for ; Fri, 26 Apr 2013 13:16:25 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id DFEE030407A; Fri, 26 Apr 2013 11:16:24 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id BBD7C500B4C; Fri, 26 Apr 2013 13:16:24 -0500 (CDT) Date: Fri, 26 Apr 2013 13:16:24 -0500 From: Ben Myers To: Chandra Seetharaman Cc: XFS mailing list Subject: Re: xfs module insert fails with "xfs: Unknown symbol exportfs_decode_fh (err 0)" Message-ID: <20130426181624.GG29359@sgi.com> References: <1366997050.4098.14.camel@chandra-dt.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1366997050.4098.14.camel@chandra-dt.ibm.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Chandra, On Fri, Apr 26, 2013 at 12:24:09PM -0500, Chandra Seetharaman wrote: > When I tried to insert xfs module in my test machine it failed with > > xfs: Unknown symbol exportfs_decode_fh (err 0). > > Found out that I did not have CONFIG_EXPORTFS enabled in my kernel > config. Most people are running with NFS enabled in their kernel config, I think. > All .*by_handle code in XFS is open coded. Wondering if they should be > under #ifdef CONFIG_EXPORTFS ? > > I can create a patch, but wanted to find out if it is indeed needed :) foo_by_handle xfs_handlereq_to_dentry xfs_handle_to_dentry exportfs_decode_fh xfsdump does open by handle, so making that conditional on CONFIG_EXPORTFS will break things. I think would be better to just make CONFIG_XFS depend upon CONFIG_EXPORTFS in fs/xfs/Kconfig. Looks like we'll have the same problem with libcrc32c. Regards, Ben From sekharan@us.ibm.com Fri Apr 26 13:29:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1225A7CBE for ; Fri, 26 Apr 2013 13:29:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E1C2630405F for ; Fri, 26 Apr 2013 11:29:19 -0700 (PDT) X-ASG-Debug-ID: 1367000958-04cb6c529471d60001-NocioJ Received: from e8.ny.us.ibm.com (e8.ny.us.ibm.com [32.97.182.138]) by cuda.sgi.com with ESMTP id McI8gM4cY9xCClY5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 26 Apr 2013 11:29:19 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.138 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] Received: from /spool/local by e8.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 26 Apr 2013 14:29:18 -0400 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.138] Received: from d01dlp03.pok.ibm.com (9.56.250.168) by e8.ny.us.ibm.com (192.168.1.108) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 26 Apr 2013 14:29:16 -0400 Received: from d01relay01.pok.ibm.com (d01relay01.pok.ibm.com [9.56.227.233]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id 2C047C90046 for ; Fri, 26 Apr 2013 14:29:15 -0400 (EDT) Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay01.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3QITFCw309856 for ; Fri, 26 Apr 2013 14:29:15 -0400 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3QITFOj021678 for ; Fri, 26 Apr 2013 15:29:15 -0300 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3QITEBJ021635; Fri, 26 Apr 2013 15:29:14 -0300 Subject: Re: xfs module insert fails with "xfs: Unknown symbol exportfs_decode_fh (err 0)" From: Chandra Seetharaman X-ASG-Orig-Subj: Re: xfs module insert fails with "xfs: Unknown symbol exportfs_decode_fh (err 0)" Reply-To: sekharan@us.ibm.com To: Eric Sandeen Cc: XFS mailing list In-Reply-To: <517AC13D.9000802@sandeen.net> References: <1366997050.4098.14.camel@chandra-dt.ibm.com> <517AC13D.9000802@sandeen.net> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Fri, 26 Apr 2013 13:29:14 -0500 Message-ID: <1367000954.4098.16.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13042618-9360-0000-0000-000011EA8E82 X-Barracuda-Connect: e8.ny.us.ibm.com[32.97.182.138] X-Barracuda-Start-Time: 1367000959 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, 2013-04-26 at 13:02 -0500, Eric Sandeen wrote: > On 4/26/13 12:24 PM, Chandra Seetharaman wrote: > > Hello, > > > > When I tried to insert xfs module in my test machine it failed with > > > > xfs: Unknown symbol exportfs_decode_fh (err 0). > > so don't use insmod, use modprobe :) > yup. It is the problem. Config seems to be fine. false alarm. > > Found out that I did not have CONFIG_EXPORTFS enabled in my kernel > > config. > > Oh, hum. But fs/xfs/Kconfig: > > config XFS_FS > tristate "XFS filesystem support" > depends on BLOCK > select EXPORTFS > > it should be turned on automatically. That seems to be the problem, > why wasn't it for your case? > > > All .*by_handle code in XFS is open coded. Wondering if they should be > > under #ifdef CONFIG_EXPORTFS ? > > CONFIG_EXPORTFS is supposed to be on if xfs is selected, unless something > changed recently. > > -Eric > > > I can create a patch, but wanted to find out if it is indeed needed :) > > > > Regards, > > > > Chandra > > > > > > > > > > _______________________________________________ > > 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@redhat.com Fri Apr 26 13:45:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 27A637CBE for ; Fri, 26 Apr 2013 13:45:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 105B68F8033 for ; Fri, 26 Apr 2013 11:45:30 -0700 (PDT) X-ASG-Debug-ID: 1367001930-04cb6c529372bc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 89VYh06nPA9374Cx for ; Fri, 26 Apr 2013 11:45:30 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3QIjN7g022929 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Apr 2013 14:45:23 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3QIjMsk031158 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 26 Apr 2013 14:45:22 -0400 Message-ID: <517ACB41.2030002@redhat.com> Date: Fri, 26 Apr 2013 13:45:21 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss CC: linux-btrfs , Liu Bo Subject: [PATCH] xfstests btrfs/284: shorten duration, fix output X-Enigmail-Version: 1.5.1 X-ASG-Orig-Subj: [PATCH] xfstests btrfs/284: shorten duration, fix output Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1367001930 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 test 284 had... some issues. First, it took so long nobody ran it; so shorten the extent count by a factor of about 100. Having fixed that, we see failures in 2 cases; when start or len is -1, but the golden output file didn't have error output, as if they should pass. I'm going to argue that these *should* both fail; start = -1 has no real meaning. length = -1 might mean "the rest of the file" but if that's what you really want, just don't specify -l. So add failure output for those cases. Send all command output to $seq.full, in case that changes in the future; just capture the return value. Then remove the return value echo on failure (50?) because who knows when that might change to some other magic value. Ok, then when defrag actually works, old defrag returned "20" (because?) but a recent commit changed it to 0. So accommodate that too. And remove a stray "HAVE_DEFRAG=1" while we're at it. That variable is never used. Signed-off-by: Eric Sandeen --- diff --git a/tests/btrfs/284 b/tests/btrfs/284 old mode 100644 new mode 100755 index d952977..67161a3 --- a/tests/btrfs/284 +++ b/tests/btrfs/284 @@ -26,7 +26,7 @@ seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here="`pwd`" tmp=/tmp/$$ -cnt=11999 +cnt=119 filesize=48000 status=1 # failure is the default! @@ -58,11 +58,12 @@ _create_file() _btrfs_online_defrag() { str="" + # start = -1 is invalid, should fail if [ "$2" = "2" ];then str="$str -s -1 -l $((filesize / 2)) " elif [ "$2" = "3" ];then str="$str -s $((filesize + 1)) -l $((filesize / 2)) " - HAVE_DEFRAG=1 + # len = -1 is invalid, should fail elif [ "$2" = "4" ];then str="$str -l -1 " elif [ "$2" = "5" ];then @@ -76,20 +77,22 @@ _btrfs_online_defrag() fi if [ "$str" != "" ]; then - $BTRFS_UTIL_PROG filesystem defragment $str $SCRATCH_MNT/tmp_file + $BTRFS_UTIL_PROG filesystem defragment $str $SCRATCH_MNT/tmp_file >> $seq.full 2>&1 else if [ "$1" = "1" ];then - $BTRFS_UTIL_PROG filesystem defragment $SCRATCH_MNT/tmp_file + $BTRFS_UTIL_PROG filesystem defragment $SCRATCH_MNT/tmp_file >> $seq.full 2>&1 elif [ "$1" = "2" ];then - $BTRFS_UTIL_PROG filesystem defragment $SCRATCH_MNT/tmp_dir + $BTRFS_UTIL_PROG filesystem defragment $SCRATCH_MNT/tmp_dir >> $seq.full 2>&1 elif [ "$1" = "3" ];then - $BTRFS_UTIL_PROG filesystem defragment $SCRATCH_MNT + $BTRFS_UTIL_PROG filesystem defragment $SCRATCH_MNT >> $seq.full 2>&1 fi fi ret_val=$? _scratch_remount - if [ $ret_val -ne 20 ];then - echo "btrfs filesystem defragment failed! err is $ret_val" + # Older defrag returned "20" for success + # e9393c2 btrfs-progs: defrag return zero on success + if [ $ret_val -ne 0 -a $ret_val -ne 20 ]; then + echo "btrfs filesystem defragment failed!" fi } @@ -140,19 +143,19 @@ _scratch_mount _require_defrag echo "defrag object | defragment range | defragment compress" -echo "a single file | default | off" +echo "a single file | default | off" _rundefrag 1 1 1 echo "a single file | default | on" _rundefrag 1 1 2 -echo "a single file | start < 0 && 0 < len < file size | off" +echo "a single file | start < 0 && 0 < len < file size | off (should fail)" _rundefrag 1 2 1 echo "a single file | start > file size && 0 < len < file size | off" _rundefrag 1 3 1 -echo "a single file | start = 0 && len < 0 | off" +echo "a single file | start = 0 && len < 0 | off (should fail)" _rundefrag 1 4 1 echo "a single file | start = 0 && len > file size | off" diff --git a/tests/btrfs/284.out b/tests/btrfs/284.out index 4a69f82..c942271 100644 --- a/tests/btrfs/284.out +++ b/tests/btrfs/284.out @@ -1,10 +1,12 @@ QA output created by 284 defrag object | defragment range | defragment compress -a single file | default | off +a single file | default | off a single file | default | on -a single file | start < 0 && 0 < len < file size | off +a single file | start < 0 && 0 < len < file size | off (should fail) +btrfs filesystem defragment failed! a single file | start > file size && 0 < len < file size | off -a single file | start = 0 && len < 0 | off +a single file | start = 0 && len < 0 | off (should fail) +btrfs filesystem defragment failed! a single file | start = 0 && len > file size | off a single file | start = 0 && 0 < len < file size | off a directory | default | off From bpm@sgi.com Fri Apr 26 14:09:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7B5BF7CBE for ; Fri, 26 Apr 2013 14:09:59 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 61B7E304093; Fri, 26 Apr 2013 12:09:53 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 3DA5A500B4C; Fri, 26 Apr 2013 14:09:53 -0500 (CDT) Date: Fri, 26 Apr 2013 14:09:53 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 19/22] xfs: add buffer types to directory and attribute buffers Message-ID: <20130426190953.GH29359@sgi.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-20-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-20-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Wed, Apr 03, 2013 at 04:11:29PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Add buffer types to the buffer log items so that log recovery can > validate the buffers and calculate CRCs correctly after the buffers > are recovered. > > Signed-off-by: Dave Chinner Comments below. > diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c > index 2b7c9f6..a78865e 100644 > --- a/fs/xfs/xfs_da_btree.c > +++ b/fs/xfs/xfs_da_btree.c > @@ -292,7 +292,6 @@ const struct xfs_buf_ops xfs_da3_node_buf_ops = { > .verify_write = xfs_da3_node_write_verify, > }; > > - > int > xfs_da3_node_read( > struct xfs_trans *tp, > @@ -302,8 +301,35 @@ xfs_da3_node_read( > struct xfs_buf **bpp, > int which_fork) > { > - return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, > + int err; > + > + err = xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, > which_fork, &xfs_da3_node_buf_ops); > + if (!err && tp) { > + struct xfs_da_blkinfo *info = (*bpp)->b_addr; > + int type; > + > + switch (be16_to_cpu(info->magic)) { > + case XFS_DA3_NODE_MAGIC: > + case XFS_DA_NODE_MAGIC: Nit: case XFS_DA_NODE_MAGIC: case XFS_DA3_NODE_MAGIC: > + type = XFS_BLF_DA_NODE_BUF; > + break; > + case XFS_ATTR_LEAF_MAGIC: > + case XFS_ATTR3_LEAF_MAGIC: > + type = XFS_BLF_ATTR_LEAF_BUF; > + break; > + case XFS_DIR2_LEAFN_MAGIC: > + case XFS_DIR3_LEAFN_MAGIC: > + type = XFS_BLF_DIR_LEAFN_BUF; > + break; > + default: > + type = 0; > + ASSERT(0); > + break; Would some kind of shutdown be desireable here? Maybe not. > @@ -2004,19 +1960,169 @@ xlog_recover_do_reg_buffer( > bp->b_ops = &xfs_inode_buf_ops; > break; > case XFS_BLF_SYMLINK_BUF: > - if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_SYMLINK_MAGIC)) { > + if (magic32 != XFS_SYMLINK_MAGIC) { > xfs_warn(mp, "Bad symlink block magic!"); > ASSERT(0); > break; > } > bp->b_ops = &xfs_symlink_buf_ops; > break; ... > + case XFS_BLF_ATTR_RMT_BUF: > + if (!xfs_sb_version_hascrc(&mp->m_sb)) > + break; > + if (magicda != XFS_ATTR3_RMT_MAGIC) { magic32 The new remote attribute header has magic at offset 0. > +STATIC void > +xlog_recover_do_reg_buffer( > + struct xfs_mount *mp, > + xlog_recover_item_t *item, > + struct xfs_buf *bp, > + xfs_buf_log_format_t *buf_f) > +{ ... > + /* Shouldn't be any more regions */ > + ASSERT(i == item->ri_total); > + > + xlog_recovery_validate_buf_type(mp, bp, buf_f); > + Extra line. Looks good. -Ben From JBacik@fusionio.com Fri Apr 26 14:14:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7787A7CBE for ; Fri, 26 Apr 2013 14:14:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 55E138F8035 for ; Fri, 26 Apr 2013 12:14:07 -0700 (PDT) X-ASG-Debug-ID: 1367003643-04cbb075f87c540001-NocioJ Received: from dkim2.fusionio.com (dkim2.fusionio.com [66.114.96.54]) by cuda.sgi.com with ESMTP id zGYA8WeMZRXCVDF2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 26 Apr 2013 12:14:04 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.54 Received: from mx1.fusionio.com (unknown [10.101.1.160]) by dkim2.fusionio.com (Postfix) with ESMTP id 743139A033F for ; Fri, 26 Apr 2013 13:14:03 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1367003643; bh=yF93481yfT/KHIbV52xLvwB0xboTQFEFSZ6FNJs1DRs=; h=From:To:Subject:Date; b=VHSBFvkkmyHtxK0IIqfhIAXfK4beZw5dEUSxOmCpwYpJVL7gJ0G9LyenM6bG9oRbo tCK2AfKTudVC2qi88XMkyLmYORO0db7z3Lh39MRQoo2Ru1kkAo/UCy14Ero/uueptk 8ZTDQizeUomEBOFaDn4DoIstqvf3Dp/mU6i5+Z50= Received: from mail1.int.fusionio.com ([10.101.1.21]) by mx1.fusionio.com with ESMTP id TAGWoYKAlsp0WL86 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Fri, 26 Apr 2013 13:14:02 -0600 (MDT) Received: from localhost (76.182.72.146) by mail.fusionio.com (10.101.1.19) with Microsoft SMTP Server (TLS) id 8.3.83.0; Fri, 26 Apr 2013 13:14:00 -0600 From: Josef Bacik To: , Subject: [PATCH] xfstests 311: test fsync with dm flakey V3 Date: Fri, 26 Apr 2013 15:13:59 -0400 X-ASG-Orig-Subj: [PATCH] xfstests 311: test fsync with dm flakey V3 Message-ID: <1367003639-17621-1-git-send-email-jbacik@fusionio.com> X-Mailer: git-send-email 1.7.7.6 MIME-Version: 1.0 Content-Type: text/plain X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim2.fusionio.com[66.114.96.54] X-Barracuda-Start-Time: 1367003643 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This test sets up a dm flakey target and then runs my fsync tester I've been using to verify btrfs's fsync() is working properly. It will create a dm flakey device, mount it, run my test, make the flakey device start dropping writes, and then unmount the fs. Then we mount it back up and make sure the md5sums match and then run fsck on the device to make sure we got a consistent fs. I used the output from a run on BTRFS since it's the only one that passes this test properly. I verified each test manually to make sure they were in fact valid files. XFS and Ext4 both fail this test in one way or another. Thanks, Signed-off-by: Josef Bacik --- V2->V3: -encorporate all of Dave Chinners feedback -expand the testing to run the tests with normal dmsetup suspend and with --nolockfs common/config | 1 + common/punch | 7 - common/rc | 23 ++ src/Makefile | 2 +- src/fsync-tester.c | 537 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/311 | 161 +++++++++++++++ tests/generic/311.out | 321 +++++++++++++++++++++++++++++ tests/generic/group | 1 + 8 files changed, 1045 insertions(+), 8 deletions(-) create mode 100644 src/fsync-tester.c create mode 100755 tests/generic/311 create mode 100644 tests/generic/311.out diff --git a/common/config b/common/config index dfbb5c2..b8ab593 100644 --- a/common/config +++ b/common/config @@ -177,6 +177,7 @@ export FIO_PROG="`set_prog_path fio`" export FILEFRAG_PROG="`set_prog_path filefrag`" export E4DEFRAG_PROG="`set_prog_path e4defrag`" export LOGGER_PROG="`set_prog_path logger`" +export DMSETUP_PROG="`set_prog_path dmsetup`" # Generate a comparable xfsprogs version number in the form of # major * 10000 + minor * 100 + release diff --git a/common/punch b/common/punch index cfbe576..b9f9acd 100644 --- a/common/punch +++ b/common/punch @@ -234,13 +234,6 @@ _filter_hole_fiemap() _coalesce_extents } - -# Prints the md5 checksum of a given file -_md5_checksum() -{ - md5sum $1 | cut -d ' ' -f1 -} - _filter_bmap() { awk ' diff --git a/common/rc b/common/rc index b980697..ff18cc2 100644 --- a/common/rc +++ b/common/rc @@ -57,6 +57,13 @@ dd() fi } +# Prints the md5 checksum of a given file +_md5_checksum() +{ + md5sum $1 | cut -d ' ' -f1 +} + + # ls -l w/ selinux sometimes puts a dot at the end: # -rwxrw-r--. id1 id2 file1 @@ -1041,6 +1048,22 @@ _require_command() [ -n "$1" -a -x "$1" ] || _notrun "$_cmd utility required, skipped this test" } +# this test requires the device mapper flakey target +# +_require_dm_flakey() +{ + _require_command $DMSETUP_PROG + + modprobe dm-flakey >/dev/null 2>&1 + $DMSETUP_PROG targets | grep flakey >/dev/null 2>&1 + if [ $? -eq 0 ] + then + : + else + _notrun "This test requires dm flakey support" + fi +} + # this test requires the projid32bit feature to be available in # mkfs.xfs # diff --git a/src/Makefile b/src/Makefile index 8d8e97f..c18ffc9 100644 --- a/src/Makefile +++ b/src/Makefile @@ -18,7 +18,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ stale_handle pwrite_mmap_blocked t_dir_offset2 seek_sanity_test \ - seek_copy_test t_readdir_1 t_readdir_2 + seek_copy_test t_readdir_1 t_readdir_2 fsync-tester SUBDIRS = diff --git a/src/fsync-tester.c b/src/fsync-tester.c new file mode 100644 index 0000000..9f6b12d --- /dev/null +++ b/src/fsync-tester.c @@ -0,0 +1,537 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int test_fd; +static char *buf; +static char *fname; + +/* + * Just creates a random file, overwriting the file in a random number of loops + * and fsyncing between each loop. + */ +static int test_one(int *max_blocks) +{ + int loops = (random() % 20) + 5; + + lseek(test_fd, 0, SEEK_SET); + while (loops--) { + int character = (random() % 126) + 33; /* printable character */ + int blocks = (random() % 100) + 1; + + if (blocks > *max_blocks) + *max_blocks = blocks; + lseek(test_fd, 0, SEEK_SET); + memset(buf, character, 4096); + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results will be " + "invalid: %d\n", errno); + return 1; + } + + while (blocks--) { + if (write(test_fd, buf, 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + } + + return 0; +} + +/* + * Preallocate a randomly sized file and then overwrite the entire thing and + * then fsync. + */ +static int test_two(int *max_blocks) +{ + int blocks = (random() % 1024) + 1; + int character = (random() % 126) + 33; + + *max_blocks = blocks; + + if (fallocate(test_fd, 0, 0, blocks * 4096)) { + fprintf(stderr, "Error fallocating %d (%s)\n", errno, + strerror(errno)); + return 1; + } + + lseek(test_fd, 0, SEEK_SET); + memset(buf, character, 4096); + while (blocks--) { + if (write(test_fd, buf, 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + return 0; +} + +static void drop_all_caches() +{ + char value[] = "3\n"; + int fd; + + if ((fd = open("/proc/sys/vm/drop_caches", O_WRONLY)) < 0) { + fprintf(stderr, "Error opening drop caches: %d\n", errno); + return; + } + + write(fd, value, sizeof(value)-1); + close(fd); +} + +/* + * Randomly write inside of a file, either creating a sparse file or prealloc + * the file and randomly write within it, depending on the prealloc flag + */ +static int test_three(int *max_blocks, int prealloc, int rand_fsync, + int sync, int drop_caches) +{ + int size = (random() % 2048) + 4; + int blocks = size / 2; + int sync_block = blocks / 2; + int rand_sync_interval = (random() % blocks) + 1; + int character = (random() % 126) + 33; + + if (prealloc && fallocate(test_fd, 0, 0, size * 4096)) { + fprintf(stderr, "Error fallocating %d (%s)\n", errno, + strerror(errno)); + return 1; + } + + if (prealloc) + *max_blocks = size; + + memset(buf, character, 4096); + while (blocks--) { + int block = (random() % size); + + if ((block + 1) > *max_blocks) + *max_blocks = block + 1; + + if (rand_fsync && !(blocks % rand_sync_interval)) { + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results " + "will be invalid: %d\n", errno); + return 1; + } + } + + /* Force a transaction commit in between just for fun */ + if (blocks == sync_block && (sync || drop_caches)) { + if (sync) + syncfs(test_fd); + else + sync_file_range(test_fd, 0, 0, + SYNC_FILE_RANGE_WRITE| + SYNC_FILE_RANGE_WAIT_AFTER); + + if (drop_caches) { + close(test_fd); + drop_all_caches(); + test_fd = open(fname, O_RDWR); + if (test_fd < 0) { + test_fd = 0; + fprintf(stderr, "Error re-opening file: %d\n", + errno); + return 1; + } + } + } + + if (pwrite(test_fd, buf, 4096, block * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + return 0; +} + +static void timeval_subtract(struct timeval *result,struct timeval *x, + struct timeval *y) +{ + if (x->tv_usec < y->tv_usec) { + int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1; + y->tv_usec -= 1000000 * nsec; + y->tv_sec += nsec; + } + + if (x->tv_usec - y->tv_usec > 1000000) { + int nsec = (x->tv_usec - y->tv_usec) / 1000000; + y->tv_usec += 1000000 * nsec; + y->tv_sec -= nsec; + } + + result->tv_sec = x->tv_sec - y->tv_sec; + result->tv_usec = x->tv_usec - y->tv_usec; +} + +static int test_four(int *max_blocks) +{ + size_t size = 2621440; /* 10 gigabytes */ + size_t blocks = size / 2; + size_t sync_block = blocks / 8; /* fsync 8 times */ + int character = (random() % 126) + 33; + struct timeval start, end, diff; + + memset(buf, character, 4096); + while (blocks--) { + off_t block = (random() % size); + + if ((block + 1) > *max_blocks) + *max_blocks = block + 1; + + if ((blocks % sync_block) == 0) { + if (gettimeofday(&start, NULL)) { + fprintf(stderr, "Error getting time: %d\n", + errno); + return 1; + } + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results " + "will be invalid: %d\n", errno); + return 1; + } + if (gettimeofday(&end, NULL)) { + fprintf(stderr, "Error getting time: %d\n", + errno); + return 1; + } + timeval_subtract(&diff, &end, &start); + printf("Fsync time was %ds and %dus\n", + (int)diff.tv_sec, (int)diff.tv_usec); + } + + if (pwrite(test_fd, buf, 4096, block * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + return 0; +} + +static int test_five() +{ + int character = (random() % 126) + 33; + int runs = (random() % 100) + 1; + int i; + + memset(buf, character, 3072); + for (i = 0; i < runs; i++) { + size_t write_size = (random() % 3072) + 1; + + if (pwrite(test_fd, buf, write_size, 0) < write_size) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + + if ((i % 8) == 0) { + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results " + "will be invalid: %d\n", errno); + return 1; + } + } + } + + return 0; +} + +/* + * Reproducer for something like this + * + * [data][prealloc][data] + * + * and then in the [prealloc] section we have + * + * [ pre ][pre][ pre ] + * [d][pp][dd][ppp][d][ppp][d] + * + * where each letter represents on block of either data or prealloc. + * + * This explains all the weirdly specific numbers. + */ +static int test_six() +{ + int character = (random() % 126) + 33; + int i; + + memset(buf, character, 4096); + + /* Write on either side of the file, leaving a hole in the middle */ + for (i = 0; i < 10; i++) { + if (pwrite(test_fd, buf, 4096, i * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + /* + * The test fs I had the prealloc extent was 13 4k blocks long so I'm + * just using that to give myself the best chances of reproducing. + */ + for (i = 23; i < 33; i++) { + if (pwrite(test_fd, buf, 4096, i * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + if (fallocate(test_fd, 0, 10 * 4096, 4 * 4096)) { + fprintf(stderr, "Error fallocating %d\n", errno); + return 1; + } + + if (fallocate(test_fd, 0, 14 * 4096, 5 * 4096)) { + fprintf(stderr, "Error fallocating %d\n", errno); + return 1; + } + + if (fallocate(test_fd, 0, 19 * 4096, 4 * 4096)) { + fprintf(stderr, "Error fallocating %d\n", errno); + return 1; + } + + if (pwrite(test_fd, buf, 4096, 10 * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + for (i = 13; i < 15; i++) { + if (pwrite(test_fd, buf, 4096, i * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + if (pwrite(test_fd, buf, 4096, 18 * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + if (pwrite(test_fd, buf, 4096, 22 * 4096) < 4096) { + fprintf(stderr, "Short write %d\n", errno); + return 1; + } + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed %d\n", errno); + return 1; + } + + return 0; +} + +static void usage() +{ + printf("Usage fsync-tester [-s ] [-r] [-d] -t \n"); + printf(" -s seed : seed for teh random map generator (defaults to reading /dev/urandom)\n"); + printf(" -r : don't reboot the box immediately\n"); + printf(" -d : use O_DIRECT\n"); + printf(" -t test : test nr to run, required\n"); + exit(1); +} + +int main(int argc, char **argv) +{ + int opt; + int fd; + int max_blocks = 0; + char *endptr; + unsigned int seed = 123; + int reboot = 0; + int direct_io = 0; + long int test = 1; + long int tmp; + int ret = 0; + int flags = O_RDWR|O_CREAT|O_TRUNC; + + if (argc < 2) + usage(); + + fd = open("/dev/urandom", O_RDONLY); + if (fd >= 0) { + read(fd, &seed, sizeof(seed)); + close(fd); + } + + while ((opt = getopt(argc, argv, "s:rdt:")) != -1) { + switch (opt) { + case 's': + tmp = strtol(optarg, &endptr, 10); + if (tmp == LONG_MAX || endptr == optarg) + usage(); + seed = tmp; + break; + case 'r': + reboot = 1; + break; + case 'd': + direct_io = 1; + break; + case 't': + test = strtol(optarg, &endptr, 10); + if (test == LONG_MAX || endptr == optarg) + usage(); + break; + default: + usage(); + } + } + + if (optind >= argc) + usage(); + + fname = argv[optind]; + if (!fname) + usage(); + + printf("Random seed is %u\n", seed); + srandom(seed); + + if (direct_io) { + flags |= O_DIRECT; + ret = posix_memalign((void **)&buf, getpagesize(), 4096); + if (ret) + buf = NULL; + } else { + buf = malloc(4096); + } + + if (!buf) { + fprintf(stderr, "Error allocating buf: %d\n", errno); + return 1; + } + + test_fd = open(fname, flags, 0644); + if (test_fd < 0) { + fprintf(stderr, "Error opening file %d (%s)\n", errno, + strerror(errno)); + return 1; + } + + switch (test) { + case 1: + ret = test_one(&max_blocks); + break; + case 2: + ret = test_two(&max_blocks); + break; + case 3: + ret = test_three(&max_blocks, 0, 0, 0, 0); + break; + case 4: + ret = test_three(&max_blocks, 1, 0, 0, 0); + break; + case 5: + ret = test_three(&max_blocks, 0, 1, 0, 0); + break; + case 6: + ret = test_three(&max_blocks, 1, 1, 0, 0); + break; + case 7: + ret = test_three(&max_blocks, 0, 0, 1, 0); + break; + case 8: + ret = test_three(&max_blocks, 1, 0, 1, 0); + break; + case 9: + ret = test_three(&max_blocks, 0, 1, 1, 0); + break; + case 10: + ret = test_three(&max_blocks, 1, 1, 1, 0); + break; + case 11: + ret = test_three(&max_blocks, 0, 0, 0, 1); + break; + case 12: + ret = test_three(&max_blocks, 0, 1, 0, 1); + break; + case 13: + ret = test_three(&max_blocks, 0, 0, 1, 1); + break; + case 14: + ret = test_three(&max_blocks, 0, 1, 1, 1); + break; + case 15: + ret = test_three(&max_blocks, 1, 0, 0, 1); + break; + case 16: + ret = test_three(&max_blocks, 1, 1, 0, 1); + break; + case 17: + ret = test_three(&max_blocks, 1, 0, 1, 1); + break; + case 18: + ret = test_three(&max_blocks, 1, 1, 1, 1); + break; + case 19: + ret = test_five(); + break; + case 20: + ret = test_six(); + break; + case 21: + /* + * This is just a perf test, keep moving it down so it's always + * the last test option. + */ + reboot = 0; + ret = test_four(&max_blocks); + goto out; + default: + usage(); + } + + if (ret) + goto out; + + if (fsync(test_fd)) { + fprintf(stderr, "Fsync failed, test results will be invalid: " + "%d\n", errno); + return 1; + } + if (reboot) + system("reboot -fn"); +out: + free(buf); + close(test_fd); + return ret; +} diff --git a/tests/generic/311 b/tests/generic/311 new file mode 100755 index 0000000..2b3b569 --- /dev/null +++ b/tests/generic/311 @@ -0,0 +1,161 @@ +#! /bin/bash +# FS QA Test No. 311 +# +# Run various fsync tests with dm flakey in freeze() mode and non freeze() +# mode. The idea is that we do random writes and randomly fsync and verify that +# after a fsync() followed by a freeze()+failure or just failure that the file +# is correct. We remount the file system after the failure so that the file +# system can do whatever cleanup it needs to and md5sum the file to make sure +# it matches hat it was before the failure. We also fsck to make sure the file +# system is consistent. +# +# The fsync tester just random writes into prealloc or not, and then fsync()s +# randomly or sync()'s randomly and then fsync()'s before exit. There are a few +# tests that were handcrafted to reproduce bugs in btrfs, so it's also a +# regression test of sorts. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Fusion IO. 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` +status=1 # failure is the default! + +_cleanup() +{ + # If dmsetup load fails then we need to make sure to do resume here + # otherwise the umount will hang + $DMSETUP_PROG resume flakey-test > /dev/null 2>&1 + $UMOUNT_PROG $SCRATCH_MNT > /dev/null 2>&1 + $DMSETUP_PROG remove flakey-test > /dev/null 2>&1 +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_need_to_be_root +_require_scratch +_require_dm_flakey + +[ -x $here/src/fsync-tester ] || _notrun "fsync-tester not build" + +rm -f $seqres.full +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` +FLAKEY_DEV=/dev/mapper/flakey-test +SEED=1 +testfile=$SCRATCH_MNT/$seq.fsync +FLAKEY_TABLE="0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 180 0" +FLAKEY_TABLE_DROP="0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 0 180 1 drop_writes" +_TEST_OPTIONS="" + +_mount_flakey() +{ + mount -t $FSTYP $MOUNT_OPTIONS $FLAKEY_DEV $SCRATCH_MNT +} + +_unmount_flakey() +{ + $UMOUNT_PROG $SCRATCH_MNT +} + +_load_flakey_table() +{ + # _load_flakey_table + + table="$FLAKEY_TABLE" + [ $1 -eq 1 ] && table="$FLAKEY_TABLE_DROP" + + suspend_opt="" + [ $nolockfs -eq 1 ] && suspend_opt="--nolockfs" + + $DMSETUP_PROG suspend $suspend_opt flakey-test + [ $? -ne 0 ] && _fatal "failed to suspend flakey-test" + + $DMSETUP_PROG load flakey-test --table "$table" + [ $? -ne 0 ] && _fatal "failed to load table into flakey-test" + + $DMSETUP_PROG resume flakey-test + [ $? -ne 0 ] && _fatal "failed to resumeflakey-test" +} + +_run_test() +{ + # _run_test <0 - buffered | 1 - O_DIRECT> + allow_writes=0 + drop_writes=1 + test_num=$1 + + direct_opt="" + [ $2 -eq 1 ] && direct_opt="-d" + + $here/src/fsync-tester -s $SEED -t $test_num $direct_opt $testfile + [ $? -ne 0 ] && _fatal "fsync tester exited abnormally" + + _md5_checksum $testfile + _load_flakey_table $drop_writes + _unmount_flakey + + #Ok mount so that any recovery that needs to happen is done + _load_flakey_table $allow_writes + _mount_flakey + _md5_checksum $testfile + + #Unmount and fsck to make sure we got a valid fs after replay + _unmount_flakey + _check_scratch_fs + [ $? -ne 0 ] && _fatal "fsck failed" + + _mount_flakey +} + +_scratch_mkfs >> $seqres.full 2>&1 + +# Create a basic flakey device that will never error out +$DMSETUP_PROG create flakey-test --table "$FLAKEY_TABLE" +[ $? -ne 0 ] && _fatal "failed to create flakey device" + +_mount_flakey + +buffered=0 +direct=1 + +for i in $(seq 1 20); do + nolockfs=0 + SEED=$i + echo "Running test $i buffered, normal suspend" + _run_test $i $buffered + echo "Running test $i direct, normal suspend" + _run_test $i $direct + + nolockfs=1 + echo "Running test $i buffered, nolockfs" + _run_test $i $buffered + echo "Running test $i direct, nolockfs" + _run_test $i $direct +done + +status=0 +exit diff --git a/tests/generic/311.out b/tests/generic/311.out new file mode 100644 index 0000000..5bad6a7 --- /dev/null +++ b/tests/generic/311.out @@ -0,0 +1,321 @@ +QA output created by 311 +Running test 1 buffered, normal suspend +Random seed is 1 +ee6103415276cde95544b11b2675f132 +ee6103415276cde95544b11b2675f132 +Running test 1 direct, normal suspend +Random seed is 1 +ee6103415276cde95544b11b2675f132 +ee6103415276cde95544b11b2675f132 +Running test 1 buffered, nolockfs +Random seed is 1 +ee6103415276cde95544b11b2675f132 +ee6103415276cde95544b11b2675f132 +Running test 1 direct, nolockfs +Random seed is 1 +ee6103415276cde95544b11b2675f132 +ee6103415276cde95544b11b2675f132 +Running test 2 buffered, normal suspend +Random seed is 2 +42d4a277a0a64deff214f15bb932a6e6 +42d4a277a0a64deff214f15bb932a6e6 +Running test 2 direct, normal suspend +Random seed is 2 +42d4a277a0a64deff214f15bb932a6e6 +42d4a277a0a64deff214f15bb932a6e6 +Running test 2 buffered, nolockfs +Random seed is 2 +42d4a277a0a64deff214f15bb932a6e6 +42d4a277a0a64deff214f15bb932a6e6 +Running test 2 direct, nolockfs +Random seed is 2 +42d4a277a0a64deff214f15bb932a6e6 +42d4a277a0a64deff214f15bb932a6e6 +Running test 3 buffered, normal suspend +Random seed is 3 +076dcf77aa365c8dfe567d973cad207a +076dcf77aa365c8dfe567d973cad207a +Running test 3 direct, normal suspend +Random seed is 3 +076dcf77aa365c8dfe567d973cad207a +076dcf77aa365c8dfe567d973cad207a +Running test 3 buffered, nolockfs +Random seed is 3 +076dcf77aa365c8dfe567d973cad207a +076dcf77aa365c8dfe567d973cad207a +Running test 3 direct, nolockfs +Random seed is 3 +076dcf77aa365c8dfe567d973cad207a +076dcf77aa365c8dfe567d973cad207a +Running test 4 buffered, normal suspend +Random seed is 4 +4c76ca100e40574a32f98b520d2e210d +4c76ca100e40574a32f98b520d2e210d +Running test 4 direct, normal suspend +Random seed is 4 +4c76ca100e40574a32f98b520d2e210d +4c76ca100e40574a32f98b520d2e210d +Running test 4 buffered, nolockfs +Random seed is 4 +4c76ca100e40574a32f98b520d2e210d +4c76ca100e40574a32f98b520d2e210d +Running test 4 direct, nolockfs +Random seed is 4 +4c76ca100e40574a32f98b520d2e210d +4c76ca100e40574a32f98b520d2e210d +Running test 5 buffered, normal suspend +Random seed is 5 +c79cdc2af7d4a18af401a919f7c21f20 +c79cdc2af7d4a18af401a919f7c21f20 +Running test 5 direct, normal suspend +Random seed is 5 +c79cdc2af7d4a18af401a919f7c21f20 +c79cdc2af7d4a18af401a919f7c21f20 +Running test 5 buffered, nolockfs +Random seed is 5 +c79cdc2af7d4a18af401a919f7c21f20 +c79cdc2af7d4a18af401a919f7c21f20 +Running test 5 direct, nolockfs +Random seed is 5 +c79cdc2af7d4a18af401a919f7c21f20 +c79cdc2af7d4a18af401a919f7c21f20 +Running test 6 buffered, normal suspend +Random seed is 6 +02d28dd2bbd4be579fea4128e7804dda +02d28dd2bbd4be579fea4128e7804dda +Running test 6 direct, normal suspend +Random seed is 6 +02d28dd2bbd4be579fea4128e7804dda +02d28dd2bbd4be579fea4128e7804dda +Running test 6 buffered, nolockfs +Random seed is 6 +02d28dd2bbd4be579fea4128e7804dda +02d28dd2bbd4be579fea4128e7804dda +Running test 6 direct, nolockfs +Random seed is 6 +02d28dd2bbd4be579fea4128e7804dda +02d28dd2bbd4be579fea4128e7804dda +Running test 7 buffered, normal suspend +Random seed is 7 +15b0f93f2f12c3feb34024af345adc21 +15b0f93f2f12c3feb34024af345adc21 +Running test 7 direct, normal suspend +Random seed is 7 +15b0f93f2f12c3feb34024af345adc21 +15b0f93f2f12c3feb34024af345adc21 +Running test 7 buffered, nolockfs +Random seed is 7 +15b0f93f2f12c3feb34024af345adc21 +15b0f93f2f12c3feb34024af345adc21 +Running test 7 direct, nolockfs +Random seed is 7 +15b0f93f2f12c3feb34024af345adc21 +15b0f93f2f12c3feb34024af345adc21 +Running test 8 buffered, normal suspend +Random seed is 8 +77bad17366ceaa24f538c915345aeb02 +77bad17366ceaa24f538c915345aeb02 +Running test 8 direct, normal suspend +Random seed is 8 +77bad17366ceaa24f538c915345aeb02 +77bad17366ceaa24f538c915345aeb02 +Running test 8 buffered, nolockfs +Random seed is 8 +77bad17366ceaa24f538c915345aeb02 +77bad17366ceaa24f538c915345aeb02 +Running test 8 direct, nolockfs +Random seed is 8 +77bad17366ceaa24f538c915345aeb02 +77bad17366ceaa24f538c915345aeb02 +Running test 9 buffered, normal suspend +Random seed is 9 +c989c34943ff1b1115d582d8cb7afa0d +c989c34943ff1b1115d582d8cb7afa0d +Running test 9 direct, normal suspend +Random seed is 9 +c989c34943ff1b1115d582d8cb7afa0d +c989c34943ff1b1115d582d8cb7afa0d +Running test 9 buffered, nolockfs +Random seed is 9 +c989c34943ff1b1115d582d8cb7afa0d +c989c34943ff1b1115d582d8cb7afa0d +Running test 9 direct, nolockfs +Random seed is 9 +c989c34943ff1b1115d582d8cb7afa0d +c989c34943ff1b1115d582d8cb7afa0d +Running test 10 buffered, normal suspend +Random seed is 10 +d76096280f08ca8907dfd53c102b3987 +d76096280f08ca8907dfd53c102b3987 +Running test 10 direct, normal suspend +Random seed is 10 +d76096280f08ca8907dfd53c102b3987 +d76096280f08ca8907dfd53c102b3987 +Running test 10 buffered, nolockfs +Random seed is 10 +d76096280f08ca8907dfd53c102b3987 +d76096280f08ca8907dfd53c102b3987 +Running test 10 direct, nolockfs +Random seed is 10 +d76096280f08ca8907dfd53c102b3987 +d76096280f08ca8907dfd53c102b3987 +Running test 11 buffered, normal suspend +Random seed is 11 +1144c9b3147873328cf4e81d066cd3da +1144c9b3147873328cf4e81d066cd3da +Running test 11 direct, normal suspend +Random seed is 11 +1144c9b3147873328cf4e81d066cd3da +1144c9b3147873328cf4e81d066cd3da +Running test 11 buffered, nolockfs +Random seed is 11 +1144c9b3147873328cf4e81d066cd3da +1144c9b3147873328cf4e81d066cd3da +Running test 11 direct, nolockfs +Random seed is 11 +1144c9b3147873328cf4e81d066cd3da +1144c9b3147873328cf4e81d066cd3da +Running test 12 buffered, normal suspend +Random seed is 12 +ae31d41d825b392bdd6b2453e05ad02e +ae31d41d825b392bdd6b2453e05ad02e +Running test 12 direct, normal suspend +Random seed is 12 +ae31d41d825b392bdd6b2453e05ad02e +ae31d41d825b392bdd6b2453e05ad02e +Running test 12 buffered, nolockfs +Random seed is 12 +ae31d41d825b392bdd6b2453e05ad02e +ae31d41d825b392bdd6b2453e05ad02e +Running test 12 direct, nolockfs +Random seed is 12 +ae31d41d825b392bdd6b2453e05ad02e +ae31d41d825b392bdd6b2453e05ad02e +Running test 13 buffered, normal suspend +Random seed is 13 +63f0ccfc767186236f887e5b25466e7d +63f0ccfc767186236f887e5b25466e7d +Running test 13 direct, normal suspend +Random seed is 13 +63f0ccfc767186236f887e5b25466e7d +63f0ccfc767186236f887e5b25466e7d +Running test 13 buffered, nolockfs +Random seed is 13 +63f0ccfc767186236f887e5b25466e7d +63f0ccfc767186236f887e5b25466e7d +Running test 13 direct, nolockfs +Random seed is 13 +63f0ccfc767186236f887e5b25466e7d +63f0ccfc767186236f887e5b25466e7d +Running test 14 buffered, normal suspend +Random seed is 14 +9085b05b3af61c8ce63430219d4a72d1 +9085b05b3af61c8ce63430219d4a72d1 +Running test 14 direct, normal suspend +Random seed is 14 +9085b05b3af61c8ce63430219d4a72d1 +9085b05b3af61c8ce63430219d4a72d1 +Running test 14 buffered, nolockfs +Random seed is 14 +9085b05b3af61c8ce63430219d4a72d1 +9085b05b3af61c8ce63430219d4a72d1 +Running test 14 direct, nolockfs +Random seed is 14 +9085b05b3af61c8ce63430219d4a72d1 +9085b05b3af61c8ce63430219d4a72d1 +Running test 15 buffered, normal suspend +Random seed is 15 +bda67622d5430b65c60d3d929949dbd8 +bda67622d5430b65c60d3d929949dbd8 +Running test 15 direct, normal suspend +Random seed is 15 +bda67622d5430b65c60d3d929949dbd8 +bda67622d5430b65c60d3d929949dbd8 +Running test 15 buffered, nolockfs +Random seed is 15 +bda67622d5430b65c60d3d929949dbd8 +bda67622d5430b65c60d3d929949dbd8 +Running test 15 direct, nolockfs +Random seed is 15 +bda67622d5430b65c60d3d929949dbd8 +bda67622d5430b65c60d3d929949dbd8 +Running test 16 buffered, normal suspend +Random seed is 16 +840e068eb58a9b68d31d6f8addc5b5dd +840e068eb58a9b68d31d6f8addc5b5dd +Running test 16 direct, normal suspend +Random seed is 16 +840e068eb58a9b68d31d6f8addc5b5dd +840e068eb58a9b68d31d6f8addc5b5dd +Running test 16 buffered, nolockfs +Random seed is 16 +840e068eb58a9b68d31d6f8addc5b5dd +840e068eb58a9b68d31d6f8addc5b5dd +Running test 16 direct, nolockfs +Random seed is 16 +840e068eb58a9b68d31d6f8addc5b5dd +840e068eb58a9b68d31d6f8addc5b5dd +Running test 17 buffered, normal suspend +Random seed is 17 +9d2d33931de2bb1fb07ee67a7daea6e8 +9d2d33931de2bb1fb07ee67a7daea6e8 +Running test 17 direct, normal suspend +Random seed is 17 +9d2d33931de2bb1fb07ee67a7daea6e8 +9d2d33931de2bb1fb07ee67a7daea6e8 +Running test 17 buffered, nolockfs +Random seed is 17 +9d2d33931de2bb1fb07ee67a7daea6e8 +9d2d33931de2bb1fb07ee67a7daea6e8 +Running test 17 direct, nolockfs +Random seed is 17 +9d2d33931de2bb1fb07ee67a7daea6e8 +9d2d33931de2bb1fb07ee67a7daea6e8 +Running test 18 buffered, normal suspend +Random seed is 18 +4bf90f24854b21e314924996bd7ec39e +4bf90f24854b21e314924996bd7ec39e +Running test 18 direct, normal suspend +Random seed is 18 +4bf90f24854b21e314924996bd7ec39e +4bf90f24854b21e314924996bd7ec39e +Running test 18 buffered, nolockfs +Random seed is 18 +4bf90f24854b21e314924996bd7ec39e +4bf90f24854b21e314924996bd7ec39e +Running test 18 direct, nolockfs +Random seed is 18 +4bf90f24854b21e314924996bd7ec39e +4bf90f24854b21e314924996bd7ec39e +Running test 19 buffered, normal suspend +Random seed is 19 +26b2ad08ac2589804a15ceb473f0b1ac +26b2ad08ac2589804a15ceb473f0b1ac +Running test 19 direct, normal suspend +Random seed is 19 +26b2ad08ac2589804a15ceb473f0b1ac +26b2ad08ac2589804a15ceb473f0b1ac +Running test 19 buffered, nolockfs +Random seed is 19 +26b2ad08ac2589804a15ceb473f0b1ac +26b2ad08ac2589804a15ceb473f0b1ac +Running test 19 direct, nolockfs +Random seed is 19 +26b2ad08ac2589804a15ceb473f0b1ac +26b2ad08ac2589804a15ceb473f0b1ac +Running test 20 buffered, normal suspend +Random seed is 20 +a16ac2b84456d41a15a1a4cc1202179f +a16ac2b84456d41a15a1a4cc1202179f +Running test 20 direct, normal suspend +Random seed is 20 +a16ac2b84456d41a15a1a4cc1202179f +a16ac2b84456d41a15a1a4cc1202179f +Running test 20 buffered, nolockfs +Random seed is 20 +a16ac2b84456d41a15a1a4cc1202179f +a16ac2b84456d41a15a1a4cc1202179f +Running test 20 direct, nolockfs +Random seed is 20 +a16ac2b84456d41a15a1a4cc1202179f +a16ac2b84456d41a15a1a4cc1202179f diff --git a/tests/generic/group b/tests/generic/group index eb52833..5a03a09 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -113,3 +113,4 @@ 308 auto quick 309 auto quick 310 auto +311 auto metadata log -- 1.7.7.6 From JBacik@fusionio.com Fri Apr 26 14:17:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3766E7CBE for ; Fri, 26 Apr 2013 14:17:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AB603AC004 for ; Fri, 26 Apr 2013 12:16:56 -0700 (PDT) X-ASG-Debug-ID: 1367003815-04bdf06c4577600001-NocioJ Received: from dkim1.fusionio.com (dkim1.fusionio.com [66.114.96.53]) by cuda.sgi.com with ESMTP id hUud3O0QfC0BckuC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 26 Apr 2013 12:16:55 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.53 Received: from mx1.fusionio.com (unknown [10.101.1.160]) by dkim1.fusionio.com (Postfix) with ESMTP id A01C07C067C for ; Fri, 26 Apr 2013 13:16:55 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1367003815; bh=x+hl+rUOfQh7xO2z0YPEPnSsRvJlFOqrgne5sXRzZqo=; h=From:To:Subject:Date; b=rx0NqwsHCL+ICDzgKzkLKIiApcOWLi2f4n2+QkJFu3NCsBWYTh2nxTYMlS9Mjo9mH nwNbX1ghvBDvRiTUtY09Q/X1712d5i9o5UTax0lqHSXlWIEoocL1hCavEfInI+Nx+p MuAnR+pGry5gaSUOFRtBPrYD0CmLTc/0nHXXxAbE= Received: from mail1.int.fusionio.com ([10.101.1.21]) by mx1.fusionio.com with ESMTP id 8MtjpCoNLCHcwA8m (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Fri, 26 Apr 2013 13:16:55 -0600 (MDT) Received: from localhost (76.182.72.146) by mail.fusionio.com (10.101.1.19) with Microsoft SMTP Server (TLS) id 8.3.83.0; Fri, 26 Apr 2013 13:16:54 -0600 From: Josef Bacik To: , Subject: [PATCH] [PATCH] xfstests: use -F when making scratch ext4 fs Date: Fri, 26 Apr 2013 15:16:53 -0400 X-ASG-Orig-Subj: [PATCH] [PATCH] xfstests: use -F when making scratch ext4 fs Message-ID: <1367003813-17686-1-git-send-email-jbacik@fusionio.com> X-Mailer: git-send-email 1.7.7.6 MIME-Version: 1.0 Content-Type: text/plain X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim1.fusionio.com[66.114.96.53] X-Barracuda-Start-Time: 1367003815 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129245 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 mkfs.ext4 will ask you if you are sure if you try to mkfs an entire disk instead of just a partition, so any xfstest that uses a scratch device and you specify a full disk will appear to hang because it's waiting for you to say yes. This fixes the problem by just forcing it to do its thing. Thanks, Signed-off-by: Josef Bacik --- common/rc | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/common/rc b/common/rc index ff18cc2..9d1c3fc 100644 --- a/common/rc +++ b/common/rc @@ -485,7 +485,7 @@ _scratch_mkfs_ext4() { local tmp_dir=/tmp/ - /sbin/mkfs -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV \ + /sbin/mkfs -t $FSTYP -- -F $MKFS_OPTIONS $* $SCRATCH_DEV \ 2>$tmp_dir.mkfserr 1>$tmp_dir.mkfsstd local mkfs_status=$? -- 1.7.7.6 From sandeen@redhat.com Fri Apr 26 14:18:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E236C7CBE for ; Fri, 26 Apr 2013 14:18:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A81308F8033 for ; Fri, 26 Apr 2013 12:18:29 -0700 (PDT) X-ASG-Debug-ID: 1367003908-04bdf06c4477760001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5rma0CK4cmDV0FIJ for ; Fri, 26 Apr 2013 12:18:28 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3QJIRk4002467 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Apr 2013 15:18:27 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3QJIQmE013803 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 26 Apr 2013 15:18:27 -0400 Message-ID: <517AD302.4000905@redhat.com> Date: Fri, 26 Apr 2013 14:18:26 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Josef Bacik CC: linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] [PATCH] xfstests: use -F when making scratch ext4 fs References: <1367003813-17686-1-git-send-email-jbacik@fusionio.com> X-ASG-Orig-Subj: Re: [PATCH] [PATCH] xfstests: use -F when making scratch ext4 fs In-Reply-To: <1367003813-17686-1-git-send-email-jbacik@fusionio.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1367003908 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 4/26/13 2:16 PM, Josef Bacik wrote: > mkfs.ext4 will ask you if you are sure if you try to mkfs an entire disk instead > of just a partition, so any xfstest that uses a scratch device and you specify a > full disk will appear to hang because it's waiting for you to say yes. This > fixes the problem by just forcing it to do its thing. Thanks, > > Signed-off-by: Josef Bacik Reviewed-by: Eric Sandeen The whole-disk test is pretty derpy anyway. Too bad -F overrides much more than just that, but this is probably a decent thing to do. Thanks, -Eric > --- > common/rc | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/common/rc b/common/rc > index ff18cc2..9d1c3fc 100644 > --- a/common/rc > +++ b/common/rc > @@ -485,7 +485,7 @@ _scratch_mkfs_ext4() > { > local tmp_dir=/tmp/ > > - /sbin/mkfs -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV \ > + /sbin/mkfs -t $FSTYP -- -F $MKFS_OPTIONS $* $SCRATCH_DEV \ > 2>$tmp_dir.mkfserr 1>$tmp_dir.mkfsstd > local mkfs_status=$? > > From sandeen@redhat.com Fri Apr 26 14:28:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D4F747CBE for ; Fri, 26 Apr 2013 14:28:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AE93630407A for ; Fri, 26 Apr 2013 12:28:36 -0700 (PDT) X-ASG-Debug-ID: 1367004515-04cb6c529475720001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KaBki7jRV8KgB0wD for ; Fri, 26 Apr 2013 12:28:35 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3QJSZFA031906 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 26 Apr 2013 15:28:35 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3QJSYgg002277 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO) for ; Fri, 26 Apr 2013 15:28:35 -0400 Message-ID: <517AD562.3060208@redhat.com> Date: Fri, 26 Apr 2013 14:28:34 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfstests generic/306 fixes X-Enigmail-Version: 1.5.1 X-ASG-Orig-Subj: [PATCH] xfstests generic/306 fixes Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1367004515 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 older xfs_io refused to write to /dev/null because it's not a file on an xfs filesystem. So add -F. While we're at it, add another testcase, symlink on a RO device pointing to a file on a RW device. That should pass too (and burned me as well). Signed-off-by: Eric Sandeen --- diff --git a/tests/generic/306 b/tests/generic/306 index 35fb5ef..b990e38 100755 --- a/tests/generic/306 +++ b/tests/generic/306 @@ -49,6 +49,8 @@ _require_scratch DEVNULL=$SCRATCH_MNT/devnull DEVZERO=$SCRATCH_MNT/devzero +SYMLINK=$SCRATCH_MNT/symlink +TARGET=$TEST_DIR/target rm -f $seqres.full _scratch_mkfs > $seqres.full 2>&1 @@ -58,6 +60,8 @@ rm -f $DEVNULL $DEVZERO mknod $DEVNULL c 1 3 || _fail "Could not create devnull device" mknod $DEVZERO c 1 5 || _fail "Could not create devzero device" +touch $TARGET || _fail "Could not create symlink target" +ln -s $TARGET $SYMLINK _scratch_unmount || _fail "Could not unmount scratch device" _scratch_mount -o ro || _fail "Could notemount scratch readonly" @@ -66,15 +70,18 @@ _scratch_mount -o ro || _fail "Could notemount scratch readonly" echo "== try to create new file" touch $SCRATCH_MNT/this_should_fail 2>&1 | _filter_scratch echo "== pwrite to null device" -$XFS_IO_PROG -c "pwrite 0 512" /dev/null | _filter_xfs_io +$XFS_IO_PROG -F -c "pwrite 0 512" /dev/null | _filter_xfs_io echo "== pread from zero device" -$XFS_IO_PROG -c "pread 0 512" /dev/zero | _filter_xfs_io +$XFS_IO_PROG -F -c "pread 0 512" /dev/zero | _filter_xfs_io echo "== truncating write to null device" echo foo > $DEVNULL 2>&1 | _filter_scratch echo "== appending write to null device" echo foo >> $DEVNULL 2>&1 | _filter_scratch +echo "== writing to symlink from ro dev to rw dev" +$XFS_IO_PROG -F -c "pwrite 0 512" $SYMLINK | _filter_xfs_io + # success, all done status=0 exit diff --git a/tests/generic/306.out b/tests/generic/306.out index 8644f38..3fd5f63 100644 --- a/tests/generic/306.out +++ b/tests/generic/306.out @@ -9,3 +9,6 @@ read 512/512 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) == truncating write to null device == appending write to null device +== writing to symlink from ro dev to rw dev +wrote 512/512 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) From JBacik@fusionio.com Fri Apr 26 14:31:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D75BD7CBE for ; Fri, 26 Apr 2013 14:31:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C09F88F8033 for ; Fri, 26 Apr 2013 12:31:05 -0700 (PDT) X-ASG-Debug-ID: 1367004664-04cb6c529675930001-NocioJ Received: from dkim1.fusionio.com (dkim1.fusionio.com [66.114.96.53]) by cuda.sgi.com with ESMTP id 21pioygdjNMRBVFR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 26 Apr 2013 12:31:04 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.53 Received: from mx1.fusionio.com (unknown [10.101.1.160]) by dkim1.fusionio.com (Postfix) with ESMTP id 1689C7C0691 for ; Fri, 26 Apr 2013 13:31:04 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1367004664; bh=4xZe+Ff4RvPkFvDf7zHn2HPuTlfOuVcqGYlIkP0nWNM=; h=Date:From:To:CC:Subject:References:In-Reply-To; b=nCTPyq8R30IsZ7vJmEL/8glfebczdU5reD+IMeGEyOe8dN6MvpldjfBpBfs0OkN8b OJLUqzdBF+y7m4zUHHcGGsEgV7VbSn/pNdf8j46pjpD8VherWnxTsRAXM1ptDOfAos gIVwp0jhYZ9uJxAO6QY/XWBsmsxzt1qeHi6IMXdo= Received: from mail1.int.fusionio.com ([10.101.1.21]) by mx1.fusionio.com with ESMTP id Hr2FgoSMtY0fwqm8 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Fri, 26 Apr 2013 13:31:03 -0600 (MDT) Received: from localhost (76.182.72.146) by mail.fusionio.com (10.101.1.19) with Microsoft SMTP Server (TLS) id 8.3.83.0; Fri, 26 Apr 2013 13:31:02 -0600 Date: Fri, 26 Apr 2013 15:31:01 -0400 From: Josef Bacik To: Dave Chinner CC: Josef Bacik , "linux-btrfs@vger.kernel.org" , "xfs@oss.sgi.com" Subject: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 Message-ID: <20130426193101.GR2631@localhost.localdomain> X-ASG-Orig-Subj: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 References: <1366899176-12876-1-git-send-email-jbacik@fusionio.com> <20130425224556.GS30622@dastard> <20130426002404.GN2631@localhost.localdomain> <20130426010829.GV30622@dastard> <20130426013237.GO2631@localhost.localdomain> <20130426021214.GX30622@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <20130426021214.GX30622@dastard> User-Agent: Mutt/1.5.21 (2011-07-01) X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim1.fusionio.com[66.114.96.53] X-Barracuda-Start-Time: 1367004664 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129247 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Apr 25, 2013 at 08:12:14PM -0600, Dave Chinner wrote: > On Thu, Apr 25, 2013 at 09:32:37PM -0400, Josef Bacik wrote: > > On Thu, Apr 25, 2013 at 07:08:29PM -0600, Dave Chinner wrote: > > > On Thu, Apr 25, 2013 at 08:24:04PM -0400, Josef Bacik wrote: > > > > On Thu, Apr 25, 2013 at 04:45:56PM -0600, Dave Chinner wrote: > > > > > On Thu, Apr 25, 2013 at 10:12:56AM -0400, Josef Bacik wrote: > > > ..... > > > > > > + $here/src/fsync-tester -s $SEED -r -t $test_num $extra $testfile > > > > > > + if [ $? -ne 0 ]; then > > > > > > + _unmount_flakey > > > > > > + _cleanup > > > > > > + exit > > > > > > + fi > > > > > > + > > > > > > + _md5_checksum $testfile > > > > > > + _drop_writes > > > > > > + _unmount_flakey > > > > > > > > > > So, _drop_writes suspends the dm-flakey device, freezes the > > > > > filesystem, turns off writes then thaws the filesystem, right? > > > > > > > > > > If so, doesn't that mean you're not actually testing fsync() as the > > > > > freeze will effectively sync the entire filesystem before you start > > > > > dropping writes? > > > > > > > > > > I can see why you want to stop unmount from writing back metadata to > > > > > simulate a crash, but if you've already frozen the filesystem then > > > > > writeback has already occurred before you stop the writes. So I > > > > > can't see how this is actually testing fsync - what it appears to be > > > > > testing is the fileystem freeze code... > > > > > > > > > > [ This is precisely the issue that XFS shutdown ioctls deal with to > > > > > trigger an immediate forced shutdown of the filesystem that prevents > > > > > *any* further writes from being issued by the filesystem - no sync > > > > > operations get in the way and change the state of the filesystem > > > > > after then fsync call, so we know that what is on disk is what was > > > > > written by the sync/fsync calls being tested. > > > > > > > > > > This is how we test sync/fsync in other XFS tests (e.g. > > > > > xfs/137-140), and this is the reason why us XFS people have > > > > > suggested that other filesystems should implement the ioctls for > > > > > this functionality rather than try to invent new ways of trying > > > > > to stop filesystems from writing back dirty metadata for fsync/sync > > > > > testing.... > > > > > > > > > > Besides, if a corruption is detected, you need a method of stopping > > > > > all dirty metadata from being written back in the filesystem to > > > > > prevent propagation of the corruption. These ioctls should just be > > > > > an interface into that mechanism. ] > > > > > > > > > > > > > So I need to look at what this does. I don't think it freezes the file system, > > > > > > `dmsetup suspend` ends up in dm_suspend(). This calls lock_fs(), which > > > calls freeze_bdev().... > > > > > > If you do `dmsetup suspend --nolockfs` then it won't freeze the > > > filesystem during the suspend... > > > > > > > Ok so I think I'll just make this test do all the iterations of the fsync tester > > with and without --nolockfs, since without --nolockfs I'm still seeing problems, > > does that sound reasonable? > > Sounds like a fine plan to me ;) > Btw its test 19 O_DIRECT that gives me a 0 length file, the buffered case is fine. The test just does a randomly sized sub-block sized write over and over again for a random number of times and fsync()'s in there randomly. The number is 3072 because that's the largest inline extent we can have in btrfs, I added it specifically to test our inline extent logging. Thanks, Josef From sandeen@redhat.com Fri Apr 26 15:18:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 14D7F7CBE for ; Fri, 26 Apr 2013 15:18:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8A645AC005 for ; Fri, 26 Apr 2013 13:18:55 -0700 (PDT) X-ASG-Debug-ID: 1367007534-04cbb075f8808d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KcVKBJyfUn5zCpNn for ; Fri, 26 Apr 2013 13:18:54 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3QKIr8I002377 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 26 Apr 2013 16:18:54 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3QKIqTv003525 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO) for ; Fri, 26 Apr 2013 16:18:53 -0400 Message-ID: <517AE12C.2050902@redhat.com> Date: Fri, 26 Apr 2013 15:18:52 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfstests shared/298: various fixes X-Enigmail-Version: 1.5.1 X-ASG-Orig-Subj: [PATCH] xfstests shared/298: various fixes Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1367007534 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 fix shared/298: * don't include common/config, not needed and breaks stuff when $SCRATCH_DEV_POOL is defined: Error: $SCRATCH_DEV should be unset when $SCRATCH_DEV_POOL is set * make sure xfs_io has fiemap, we'll need it * add -F to the xfs_io invocation, again * ignore ENOSPC errors from "garbage" loop; the only goal is to fill it, ENOSPC doesn't matter. Signed-off-by: Eric Sandeen --- Wondering if we should just add " -F" to $XFS_IO_PROG . . . diff --git a/tests/shared/298 b/tests/shared/298 index f1a3432..e2eddda 100755 --- a/tests/shared/298 +++ b/tests/shared/298 @@ -28,12 +28,12 @@ echo "QA output created by $seq" status=1 # failure is the default! trap "_cleanup; exit \$status" 0 1 2 3 15 -. common/config . common/rc _supported_fs ext4 xfs _supported_os Linux _require_fstrim +_require_xfs_io_fiemap _require_fs_space $TEST_DIR 307200 [ "$FSTYP" = "ext4" ] && _require_dumpe2fs @@ -49,7 +49,7 @@ _cleanup() get_holes() { - $XFS_IO_PROG -c fiemap $1 | grep hole | $SED_PROG 's/.*\[\(.*\)\.\.\(.*\)\].*/\1 \2/' + $XFS_IO_PROG -F -c fiemap $1 | grep hole | $SED_PROG 's/.*\[\(.*\)\.\.\(.*\)\].*/\1 \2/' } get_free_sectors() @@ -136,9 +136,10 @@ $MKFS_PROG -t $FSTYP $MKFS_OPTIONS $loop_dev &> /dev/null $MOUNT_PROG $loop_dev $loop_mnt echo -n "Generating garbage on loop..." +# Goal is to fill it up, ignore any errors. for i in `seq 1 10`; do - mkdir $loop_mnt/$i - cp -r $here/* $loop_mnt/$i + mkdir $loop_mnt/$i &> /dev/null + cp -r $here/* $loop_mnt/$i &> /dev/null done # Get reference fiemap, this can contain i.e. uninitialized inode table From david@fromorbit.com Fri Apr 26 16:33:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A4C607CBE for ; Fri, 26 Apr 2013 16:33:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2A817AC004 for ; Fri, 26 Apr 2013 14:33:19 -0700 (PDT) X-ASG-Debug-ID: 1367011993-04bdf06c457f7b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cwcLtJSm27sHWJmI for ; Fri, 26 Apr 2013 14:33:13 -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: AvMQALPxelF5LFOC/2dsb2JhbABRgweDBLZPhRoEAYEFF3SCHwEBBTocIxAIAw4HAwklDwUlAyETiBO/EBWNYIEdB4JtYQOXHIoLhx+BWIFIKg Received: from ppp121-44-83-130.lns20.syd6.internode.on.net (HELO dastard) ([121.44.83.130]) by ipmail04.adl6.internode.on.net with ESMTP; 27 Apr 2013 07:03:13 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVqGS-0005sA-Ck; Sat, 27 Apr 2013 07:33:08 +1000 Date: Sat, 27 Apr 2013 07:33:08 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/2] xfs: enhance warning on xfs_imap() failure in xfs_iunlink_remove() Message-ID: <20130426213308.GA30622@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 2/2] xfs: enhance warning on xfs_imap() failure in xfs_iunlink_remove() References: <1366975813-65025-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1366975813-65025-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1367011993 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129255 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 26, 2013 at 07:30:13AM -0400, Brian Foster wrote: > From: Eric Sandeen > > Include the global ino, ag number and agino in the warning message > emitted should xfs_imap() fail in the xfs_iunlink_remove() code > path. > > Signed-off-by: Brian Foster Looks good now. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 26 16:46:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C60D67CBE for ; Fri, 26 Apr 2013 16:46:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A19B3304039 for ; Fri, 26 Apr 2013 14:46:29 -0700 (PDT) X-ASG-Debug-ID: 1367012787-04bdf06c4480200001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 5MBnycVMqfGUDBIV for ; Fri, 26 Apr 2013 14:46:28 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvMQAAH1elF5LFOC/2dsb2JhbABRgweDBLZRhRoEAYEFF3SCHwEBBTocIxAIAw4KCSUPBSUDIROIE78LFY1ggR0Hgm1hA5cciguHH4FYgUgq Received: from ppp121-44-83-130.lns20.syd6.internode.on.net (HELO dastard) ([121.44.83.130]) by ipmail04.adl6.internode.on.net with ESMTP; 27 Apr 2013 07:16:27 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVqTK-0005w4-On; Sat, 27 Apr 2013 07:46:26 +1000 Date: Sat, 27 Apr 2013 07:46:26 +1000 From: Dave Chinner To: Ben Myers Cc: Chandra Seetharaman , XFS mailing list Subject: Re: xfs module insert fails with "xfs: Unknown symbol exportfs_decode_fh (err 0)" Message-ID: <20130426214626.GB30622@dastard> X-ASG-Orig-Subj: Re: xfs module insert fails with "xfs: Unknown symbol exportfs_decode_fh (err 0)" References: <1366997050.4098.14.camel@chandra-dt.ibm.com> <20130426181624.GG29359@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130426181624.GG29359@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: 1367012787 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129255 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 26, 2013 at 01:16:24PM -0500, Ben Myers wrote: > Hey Chandra, > > On Fri, Apr 26, 2013 at 12:24:09PM -0500, Chandra Seetharaman wrote: > > When I tried to insert xfs module in my test machine it failed with > > > > xfs: Unknown symbol exportfs_decode_fh (err 0). > > > > Found out that I did not have CONFIG_EXPORTFS enabled in my kernel > > config. > > Most people are running with NFS enabled in their kernel config, I think. > > > All .*by_handle code in XFS is open coded. Wondering if they should be > > under #ifdef CONFIG_EXPORTFS ? > > > > I can create a patch, but wanted to find out if it is indeed needed :) > > foo_by_handle > xfs_handlereq_to_dentry > xfs_handle_to_dentry > exportfs_decode_fh > > xfsdump does open by handle, so making that conditional on CONFIG_EXPORTFS will > break things. I think would be better to just make CONFIG_XFS depend upon > CONFIG_EXPORTFS in fs/xfs/Kconfig. Looks like we'll have the same problem with > libcrc32c. AFAIK, "select" isthe right keyword for these dependencies. They are like saying "depends on", but instead of having the XFS config options only appear in the menus if CONFIG_EXPORTFS is selected, it will select CONFIG_EXPORTFS=y when CONFIG_XFS_FS=y.... So I don't think there are any problems here... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 26 17:05:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A8E887CBE for ; Fri, 26 Apr 2013 17:05:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 88E568F8035 for ; Fri, 26 Apr 2013 15:05:25 -0700 (PDT) X-ASG-Debug-ID: 1367013923-04bdf06c4781130001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id CjyAX2VEgxSqAd1s for ; Fri, 26 Apr 2013 15:05:24 -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: AvMQAGL5elF5LA8K/2dsb2JhbABRgweDBLZShRoEAYEFF3SCHwEBBTocIxAIAw4KCSUPBSUDIROIE78OFY1ggR0Hgm1hA5cckSqDICo Received: from ppp121-44-15-10.lns20.syd6.internode.on.net (HELO dastard) ([121.44.15.10]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Apr 2013 07:35:22 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVqle-0005yo-22; Sat, 27 Apr 2013 08:05:22 +1000 Date: Sat, 27 Apr 2013 08:05:22 +1000 From: Dave Chinner To: Josef Bacik Cc: "linux-btrfs@vger.kernel.org" , "xfs@oss.sgi.com" Subject: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 Message-ID: <20130426220521.GC30622@dastard> X-ASG-Orig-Subj: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 References: <1366899176-12876-1-git-send-email-jbacik@fusionio.com> <20130425224556.GS30622@dastard> <20130426002404.GN2631@localhost.localdomain> <20130426010829.GV30622@dastard> <20130426013237.GO2631@localhost.localdomain> <20130426021214.GX30622@dastard> <20130426193101.GR2631@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130426193101.GR2631@localhost.localdomain> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1367013923 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129257 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 26, 2013 at 03:31:01PM -0400, Josef Bacik wrote: > On Thu, Apr 25, 2013 at 08:12:14PM -0600, Dave Chinner wrote: > > > Ok so I think I'll just make this test do all the iterations of the fsync tester > > > with and without --nolockfs, since without --nolockfs I'm still seeing problems, > > > does that sound reasonable? > > > > Sounds like a fine plan to me ;) > > > > Btw its test 19 O_DIRECT that gives me a 0 length file, the buffered case is > fine. The test just does a randomly sized sub-block sized write over and over > again for a random number of times and fsync()'s in there randomly. The number > is 3072 because that's the largest inline extent we can have in btrfs, I added > it specifically to test our inline extent logging. Thanks, Interesting - it only runs fsync every 8 iterations of the loop. Can you check that it is running enough loops to execute a fsync? Cheers, Dave. -- Dave Chinner david@fromorbit.com From JBacik@fusionio.com Fri Apr 26 17:32:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 6E4C77CBE for ; Fri, 26 Apr 2013 17:32:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 403798F8035 for ; Fri, 26 Apr 2013 15:32:19 -0700 (PDT) X-ASG-Debug-ID: 1367015537-04cb6c529380ae0001-NocioJ Received: from dkim2.fusionio.com (dkim2.fusionio.com [66.114.96.54]) by cuda.sgi.com with ESMTP id N9ZK21NV9lfiGBty (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 26 Apr 2013 15:32:18 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.54 Received: from mx2.fusionio.com (unknown [10.101.1.160]) by dkim2.fusionio.com (Postfix) with ESMTP id 984579A04FA for ; Fri, 26 Apr 2013 16:32:17 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1367015537; bh=aEC990uf/QEhnr5/4HuZRtLJBa4OpHGdoU9lanL3z0E=; h=Date:From:To:CC:Subject:References:In-Reply-To; b=Ftt8FgSdnSJp9+bb3axsVW6P+zdS/z1ltxnyTKKCWul9M+ePsdK+FhLo7hvzFNwVc eivQJzR+CizwXsNAN9PsB9VYpZNB+orJyHkD9BBA5Oxu8u1IdtyEboFOfi0oJkvXz8 7XVt45J2qfu3oOScqIyVUkGZz/kuQZcLFGDN110k= Received: from mail1.int.fusionio.com ([10.101.1.21]) by mx2.fusionio.com with ESMTP id 2U2NUZJVUhi9ZLuV (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Fri, 26 Apr 2013 16:32:17 -0600 (MDT) Received: from localhost (76.182.72.146) by mail.fusionio.com (10.101.1.19) with Microsoft SMTP Server (TLS) id 8.3.83.0; Fri, 26 Apr 2013 16:32:16 -0600 Date: Fri, 26 Apr 2013 18:32:14 -0400 From: Josef Bacik To: Dave Chinner CC: Josef Bacik , "linux-btrfs@vger.kernel.org" , "xfs@oss.sgi.com" Subject: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 Message-ID: <20130426223214.GA4117@localhost.localdomain> X-ASG-Orig-Subj: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 References: <1366899176-12876-1-git-send-email-jbacik@fusionio.com> <20130425224556.GS30622@dastard> <20130426002404.GN2631@localhost.localdomain> <20130426010829.GV30622@dastard> <20130426013237.GO2631@localhost.localdomain> <20130426021214.GX30622@dastard> <20130426193101.GR2631@localhost.localdomain> <20130426220521.GC30622@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <20130426220521.GC30622@dastard> User-Agent: Mutt/1.5.21 (2011-07-01) X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim2.fusionio.com[66.114.96.54] X-Barracuda-Start-Time: 1367015538 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129259 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Apr 26, 2013 at 04:05:22PM -0600, Dave Chinner wrote: > On Fri, Apr 26, 2013 at 03:31:01PM -0400, Josef Bacik wrote: > > On Thu, Apr 25, 2013 at 08:12:14PM -0600, Dave Chinner wrote: > > > > Ok so I think I'll just make this test do all the iterations of the fsync tester > > > > with and without --nolockfs, since without --nolockfs I'm still seeing problems, > > > > does that sound reasonable? > > > > > > Sounds like a fine plan to me ;) > > > > > > > Btw its test 19 O_DIRECT that gives me a 0 length file, the buffered case is > > fine. The test just does a randomly sized sub-block sized write over and over > > again for a random number of times and fsync()'s in there randomly. The number > > is 3072 because that's the largest inline extent we can have in btrfs, I added > > it specifically to test our inline extent logging. Thanks, > > Interesting - it only runs fsync every 8 iterations of the loop. Can > you check that it is running enough loops to execute a fsync? > If the loop doesn't fsync it still fsyncs before the program exits. Side note I once wasted a week because Chris's fsync tester _didn't_ fsync() before exit so it would tell you a md5sum of a file that hadn't fsync()ed before the md5sum and I just assumed btrfs was broken. This test does not make this mistake for that reason :). Thanks, Josef From david@fromorbit.com Fri Apr 26 17:49:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9EE217CBE for ; Fri, 26 Apr 2013 17:49:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 881E28F8033 for ; Fri, 26 Apr 2013 15:49:43 -0700 (PDT) X-ASG-Debug-ID: 1367016579-04cb6c529582490001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id vMFTsOJaMgWGh2UF for ; Fri, 26 Apr 2013 15:49:39 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvQQAA4Ee1F5LA8K/2dsb2JhbABRgweDBLZShRoEAYEDF3SCHwEBBAE6HCMFCwgDDgoJJQ8FJQMhE4gOBb8HFY1ggR0Hgm1hA5cckSqDICo Received: from ppp121-44-15-10.lns20.syd6.internode.on.net (HELO dastard) ([121.44.15.10]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Apr 2013 08:19:39 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UVrST-00063R-Hx; Sat, 27 Apr 2013 08:49:37 +1000 Date: Sat, 27 Apr 2013 08:49:37 +1000 From: Dave Chinner To: Josef Bacik Cc: "linux-btrfs@vger.kernel.org" , "xfs@oss.sgi.com" Subject: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 Message-ID: <20130426224937.GA23072@dastard> X-ASG-Orig-Subj: Re: [BULK] Re: [PATCH] xfstests 311: test fsync with dm flakey V2 References: <1366899176-12876-1-git-send-email-jbacik@fusionio.com> <20130425224556.GS30622@dastard> <20130426002404.GN2631@localhost.localdomain> <20130426010829.GV30622@dastard> <20130426013237.GO2631@localhost.localdomain> <20130426021214.GX30622@dastard> <20130426193101.GR2631@localhost.localdomain> <20130426220521.GC30622@dastard> <20130426223214.GA4117@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130426223214.GA4117@localhost.localdomain> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1367016579 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 26, 2013 at 06:32:14PM -0400, Josef Bacik wrote: > On Fri, Apr 26, 2013 at 04:05:22PM -0600, Dave Chinner wrote: > > On Fri, Apr 26, 2013 at 03:31:01PM -0400, Josef Bacik wrote: > > > On Thu, Apr 25, 2013 at 08:12:14PM -0600, Dave Chinner wrote: > > > > > Ok so I think I'll just make this test do all the iterations of the fsync tester > > > > > with and without --nolockfs, since without --nolockfs I'm still seeing problems, > > > > > does that sound reasonable? > > > > > > > > Sounds like a fine plan to me ;) > > > > > > > > > > Btw its test 19 O_DIRECT that gives me a 0 length file, the buffered case is > > > fine. The test just does a randomly sized sub-block sized write over and over > > > again for a random number of times and fsync()'s in there randomly. The number > > > is 3072 because that's the largest inline extent we can have in btrfs, I added > > > it specifically to test our inline extent logging. Thanks, > > > > Interesting - it only runs fsync every 8 iterations of the loop. Can > > you check that it is running enough loops to execute a fsync? > > > > If the loop doesn't fsync it still fsyncs before the program exits. Doh! I noticed that yesterday but forgot about it. Not enough coffee. I'll have a closer look, then. > Side note I once wasted a week because Chris's fsync tester > _didn't_ fsync() before exit so it would tell you a md5sum of a > file that hadn't fsync()ed before the md5sum and I just assumed > btrfs was broken. This test does not make this mistake for that > reason :). Thanks, I think we've all made mistakes like that at least once.... :/ Cheers, Dave. -- Dave Chinner david@fromorbit.com From adilger@dilger.ca Fri Apr 26 18:09:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5978D7CBE for ; Fri, 26 Apr 2013 18:09:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 465968F8033 for ; Fri, 26 Apr 2013 16:09:33 -0700 (PDT) X-ASG-Debug-ID: 1367017771-04cb6c5296838e0001-NocioJ Received: from mail-pd0-f172.google.com (mail-pd0-f172.google.com [209.85.192.172]) by cuda.sgi.com with ESMTP id NvdxXlvT37Raai68 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 26 Apr 2013 16:09:32 -0700 (PDT) X-Barracuda-Envelope-From: adilger@dilger.ca X-Barracuda-Apparent-Source-IP: 209.85.192.172 Received: by mail-pd0-f172.google.com with SMTP id 4so2692180pdd.17 for ; Fri, 26 Apr 2013 16:09:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:subject:mime-version:content-type:from:in-reply-to:date :cc:content-transfer-encoding:message-id:references:to:x-mailer :x-gm-message-state; bh=9DWFMNgH/PdfMVVDtGYtNxgv+V/BKducAxYHKZIkNPM=; b=c/G1cyQ9bJEIQ4lELolec6ApIAKSUGfbA/ESAM/rzEmiX8LICKqErO8gD8rPNvmNBx J8chyuTg7eMbQOAuFNzNPRgycTlTAxv6F1X6CDV1MQi+gqb+kyG2mjPQYhfWItuKuRAX MOfJSm9+lDJRUkj0EQadwoH2nGY2UcuhI7Vrta/ttIRsNDrM1H1j/cgxhv0X1QFf3aml QsudEz4MIFTDVtJ7nRHhpCyequYqWRgEtuFwhE2vFrVvmWwDVbhU+mN7WuqUIZEFJQiZ AWKupIFwGkDaX0Xln+6Q61NbMMDQvPi/DPRbrrE5uGpalAZxGErA3EQjEvhKyGy+eqA+ gwIA== X-Received: by 10.68.211.73 with SMTP id na9mr5752810pbc.90.1367017771468; Fri, 26 Apr 2013 16:09:31 -0700 (PDT) Received: from cabot-wlan.adilger.int (S0106002191d9348b.cg.shawcable.net. [96.51.76.157]) by mx.google.com with ESMTPSA id fa5sm13323765pbb.35.2013.04.26.16.09.29 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 26 Apr 2013 16:09:30 -0700 (PDT) Subject: Re: [PATCH] [PATCH] xfstests: use -F when making scratch ext4 fs Mime-Version: 1.0 (Apple Message framework v1085) X-ASG-Orig-Subj: Re: [PATCH] [PATCH] xfstests: use -F when making scratch ext4 fs Content-Type: text/plain; charset=us-ascii From: Andreas Dilger In-Reply-To: <517AD302.4000905@redhat.com> Date: Fri, 26 Apr 2013 17:09:28 -0600 Cc: Josef Bacik , linux-ext4@vger.kernel.org, xfs@oss.sgi.com Content-Transfer-Encoding: quoted-printable Message-Id: References: <1367003813-17686-1-git-send-email-jbacik@fusionio.com> <517AD302.4000905@redhat.com> To: Eric Sandeen X-Mailer: Apple Mail (2.1085) X-Gm-Message-State: ALoCoQkApTY9luFSGKkSmO2Mj43GkVtz+8t4C7oENbBrf6B2zLsN0G5oLElCpxCw4Hpy/PF9p/MV X-Barracuda-Connect: mail-pd0-f172.google.com[209.85.192.172] X-Barracuda-Start-Time: 1367017771 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2013-04-26, at 1:18 PM, Eric Sandeen wrote: > On 4/26/13 2:16 PM, Josef Bacik wrote: >> mkfs.ext4 will ask you if you are sure if you try to mkfs an entire = disk instead of just a partition, so any xfstest that uses a scratch = device and you specify a full disk will appear to hang because it's = waiting for you to say yes. This fixes the problem by just forcing it = to do its thing. Thanks, >>=20 >> Signed-off-by: Josef Bacik >=20 > Reviewed-by: Eric Sandeen >=20 > The whole-disk test is pretty derpy anyway. Too bad -F overrides > much more than just that, but this is probably a decent > thing to do. Yeah, we've had to work around the whole-device check for years, because the 512-byte sector offset for the DOS partition table kills performance on RAID systems. Given that the kernel should hold the whole block device busy these days for O_EXCL opens if there are partitions on the device, it should be safe to remove this check from mke2fs, though the above workaround would still be needed for a while. Cheers, Andreas From america@tinmarinregalos.com Fri Apr 26 23:49:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.7 required=5.0 tests=FH_FROM_GET_NAME 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 8B5EE7CBE for ; Fri, 26 Apr 2013 23:49:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 03182AC004 for ; Fri, 26 Apr 2013 21:49:09 -0700 (PDT) X-ASG-Debug-ID: 1367038121-04cbb075f79c010001-NocioJ Received: from gator1107.hostgator.com (gator1107.hostgator.com [174.120.188.98]) by cuda.sgi.com with ESMTP id JGOHrshxMbuYNTXw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 26 Apr 2013 21:48:41 -0700 (PDT) X-Barracuda-Envelope-From: america@tinmarinregalos.com X-Barracuda-Apparent-Source-IP: 174.120.188.98 Received: from floreria by gator1107.hostgator.com with local (Exim 4.80) (envelope-from ) id 1UVx3w-0001zD-Lk for xfs@oss.sgi.com; Fri, 26 Apr 2013 23:48:40 -0500 To: xfs@oss.sgi.com Subject: Su amigo ....Get paid $25 for each email you process................................................................. ha recomendado este gran producto de tinmarinregalos.com X-PHP-Script: tinmarinregalos.com/index.php for 46.166.180.103 X-ASG-Orig-Subj: Su amigo ....Get paid $25 for each email you process................................................................. ha recomendado este gran producto de tinmarinregalos.com Date: Fri, 26 Apr 2013 23:48:40 -0500 From: "....Get paid $25 for each email you process................................................................." Reply-To: "....Get paid $25 for each email you process................................................................." Message-ID: <9e706cdde3165a5ace32e34172bcbf72@tinmarinregalos.com> X-Priority: 3 X-Mailer: PHPMailer [version 1.73] via Zen Cart MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="iso-8859-1" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - gator1107.hostgator.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [1090 32003] / [47 12] X-AntiAbuse: Sender Address Domain - tinmarinregalos.com X-BWhitelist: no X-Source: X-Source-Args: /usr/bin/php /home/floreria/public_html/tinmarinregalos.com/index.php X-Source-Dir: floreriaonline.com:/public_html/tinmarinregalos.com X-Source-Sender: X-Source-Auth: floreria X-Email-Count: 0 X-Source-Cap: ZmxvcmVyaWE7ZmxvcmVyaWE7Z2F0b3IxMTA3Lmhvc3RnYXRvci5jb20= X-Barracuda-Connect: gator1107.hostgator.com[174.120.188.98] X-Barracuda-Start-Time: 1367038121 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129285 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hola ....No skills required to get started! Su amigo, ....Get paid $25 for each email you process................................................................., ha pensado que estaría interesado en Arreglo de Grduación de tinmarinregalos.com. ....Get paid $25 for each email you process................................................................. envió una nota diciendo: Hello- THIS IS A-B-C EASY (Anyone Can Do It) http://domearena.me.cc/?v=xfs@oss.sgi.com=dvg1=it_ep (copy and paste in your web browser) No skills required to get started User-friendly system and extremely clear instructions Get started and make moneyas easy as A-B-C! http://domearena.me.cc/?v=xfs@oss.sgi.com=dvg1=it_ep (copy and paste in your web browser) =A - Check your inbox =B - Process e-mails with the information we will supply =C - Get paid $25 for each email you process Your Earnings Are Unlimited... Check this site and get started: http://domearena.me.cc/?v=xfs@oss.sgi.com=dvg1=it_ep (copy and paste in your web browser) To your success, Work At Home Coach Removal link: http://domearena.me.cc/?v=xfs@oss.sgi.com=dvg=it_ep=unsub (copy and paste in your web browser) -------------------- Para ver este producto, pulse en el enlace inferior o copie y pegue el enlace en su navegador web: http://tinmarinregalos.com/index.php?main_page=product_info&products_id=191&zenid=916613176f6e2eeaef3a46688c845945 Atentamente, tinmarinregalos.com http://tinmarinregalos.com/ ----- IMPORTANTE: Para su protección y para prevenir usos maliciosos, todos los correos electrónicos enviados desde este sitio son almacenados y están a disposición del administrador del sitio. Si usted ha recibido este correo por error, por favor envie un correo electrónico a america@tinmarinregalos.com Esta dirección de correo nos ha sido facilitada por usted o por uno de sus clientes. Si no se registró para tener una cuenta, por favor envie un correo electrónico a america@tinmarinregalos.com Las peticiones de eliminación se pueden enviar a esta dirección y serán respetadas. From bpm@oss.sgi.com Sat Apr 27 15:37:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id CBBF67F3F; Sat, 27 Apr 2013 15:37:41 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.9-rc1-43-gdccc3f447 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 7fe3258c50de383037102129c57df5cb66ab2000 X-Git-Newrev: dccc3f447a5e065a1c4406aede72d160ae38a736 Message-Id: <20130427203741.CBBF67F3F@oss.sgi.com> Date: Sat, 27 Apr 2013 15:37:41 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated e721f50 xfs: implement extended feature masks 04a1e6c xfs: add CRC checks to the superblock 61fe135 xfs: buffer type overruns blf_flags field d75afeb xfs: add buffer types to directory and attribute buffers d2e448d xfs: add CRC protection to remote attributes 95920cd xfs: split remote attribute code out 517c222 xfs: add CRCs to attr leaf blocks f5ea110 xfs: add CRCs to dir2/da node blocks 6b2647a xfs: shortform directory offsets change for dir3 format 24df33b xfs: add CRC checking to dir2 leaf blocks 33363fe xfs: add CRC checking to dir2 data blocks cbc8adf xfs: add CRC checking to dir2 free blocks f5f3d9b xfs: add CRC checks to block format directory blocks f948dd7 xfs: add CRC checks to remote symlinks 19de735 xfs: split out symlink code into it's own file. 93848a9 xfs: add version 3 inode format with CRCs 3fe58f3 xfs: add CRC checks for quota blocks 983d09f xfs: add CRC checks to the AGI 77c95bb xfs: add CRC checks to the AGFL 4e0e604 xfs: add CRC checks to the AGF ee1a47a xfs: add support for large btree blocks a205064 xfs: increase hexdump output in xfs_corruption_error from 7fe3258c50de383037102129c57df5cb66ab2000 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit e721f504cf46a0c84741ba2137d7a052d79436db Author: Dave Chinner Date: Wed Apr 3 16:11:32 2013 +1100 xfs: implement extended feature masks The version 5 superblock has extended feature masks for compatible, incompatible and read-only compatible feature sets. Implement the masking and mount-time checking for these feature masks. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 04a1e6c5b222b089c6960dfc5352002002a4355f Author: Dave Chinner Date: Wed Apr 3 16:11:31 2013 +1100 xfs: add CRC checks to the superblock With the addition of CRCs, there is such a wide and varied change to the on disk format that it makes sense to bump the superblock version number rather than try to use feature bits for all the new functionality. This commit introduces all the new superblock fields needed for all the new functionality: feature masks similar to ext4, separate project quota inodes, a LSN field for recovery and the CRC field. This commit does not bump the superblock version number, however. That will be done as a separate commit at the end of the series after all the new functionality is present so we switch it all on in one commit. This means that we can slowly introduce the changes without them being active and hence maintain bisectability of the tree. This patch is based on a patch originally written by myself back from SGI days, which was subsequently modified by Christoph Hellwig. There is relatively little of that patch remaining, but the history of the patch still should be acknowledged here. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 61fe135c1dde112f483bba01d645debd881b5428 Author: Dave Chinner Date: Wed Apr 3 16:11:30 2013 +1100 xfs: buffer type overruns blf_flags field The buffer type passed to log recvoery in the buffer log item overruns the blf_flags field. I had assumed that flags field was a 32 bit value, and it turns out it is a unisgned short. Therefore having 19 flags doesn't really work. Convert the buffer type field to numeric value, and use the top 5 bits of the flags field for it. We currently have 17 types of buffers, so using 5 bits gives us plenty of room for expansion in future.... Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit d75afeb3d302019527331520a2632b6614425b40 Author: Dave Chinner Date: Wed Apr 3 16:11:29 2013 +1100 xfs: add buffer types to directory and attribute buffers Add buffer types to the buffer log items so that log recovery can validate the buffers and calculate CRCs correctly after the buffers are recovered. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit d2e448d5fdebdcda93ed171339a3d864f65c227e Author: Dave Chinner Date: Wed Apr 3 16:11:28 2013 +1100 xfs: add CRC protection to remote attributes There are two ways of doing this - the first is to add a CRC to the remote attribute entry in the attribute block. The second is to treat them similar to the remote symlink, where each fragment has it's own header and identifies fragment location in the attribute. The problem with the CRC in the remote attr entry is that we cannot identify the owner of the metadata from the metadata blocks themselves, or where the blocks fit into the remote attribute. The down side to this approach is that we never know when the attribute has been read from disk or not and so we have to verify it every time it is read, and we must calculate it during the create transaction and log it. We do not log CRCs for any other metadata, and so this creates a unique set of coherency problems that, in general, are best avoided. Adding an identifying header to each allocated block allows us to identify each fragment and where in the attribute it is located. It enables us to rebuild the remote attribute from just the raw blocks containing the attribute. It also provides us to do per-block CRCs verification at IO time rather than during the transaction context that creates it or every time it is read into a user buffer. Hence it avoids all the problems that an external, logged CRC has, and provides all the benefits of self identifying metadata. The only complexity is that we have to add a header per fragment, and we don't know how many fragments will be needed prior to allocations. If we take the symlink example, the header is 56 bytes and hence for a 4k block size filesystem, in the worst case 16 headers requires 1 extra block for the 64k attribute data. For 512 byte filesystems the worst case is an extra block for every 9 fragments (i.e. 16 extra blocks in the worse case). This will be very rare and so it's not really a major concern. Because allocation is done in two steps - the first finds a hole large enough in the attribute file, the second does the allocation - we only need to find a hole big enough for a worst case allocation. We only need to allocate enough extra blocks for number of headers required by the fragments, and we can calculate that as we go.... Hence it really only makes sense to use the same model as for symlinks - it doesn't add that much complexity, does not require an attribute tree format change, and does not require logging calculated CRC values. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 95920cd6ce1c9cd8d3a0f639a674aa26c974ed57 Author: Dave Chinner Date: Wed Apr 3 16:11:27 2013 +1100 xfs: split remote attribute code out Adding CRC support to remote attributes adds a significant amount of remote attribute specific code. Split the existing remote attribute code out into it's own file so that all the relevant remote attribute code is in a single, easy to find place. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 517c22207b045993a6529e1f8684095adaae9cf3 Author: Dave Chinner Date: Wed Apr 24 18:58:55 2013 +1000 xfs: add CRCs to attr leaf blocks Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit f5ea110044fa858925a880b4fa9f551bfa2dfc38 Author: Dave Chinner Date: Wed Apr 24 18:58:02 2013 +1000 xfs: add CRCs to dir2/da node blocks Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 6b2647a12a00bdad431ac1e9049c5e8579aa7869 Author: Dave Chinner Date: Wed Apr 3 16:11:24 2013 +1100 xfs: shortform directory offsets change for dir3 format Because the header size for the CRC enabled directory blocks is larger, the offset of the first entry into a directory block is different to the dir2 format. The shortform directory stores the dirent's offset so that it doesn't change when moving from shortform to block form and back again, and hence it needs to take into account the different header sizes to maintain the correct offsets. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 24df33b45ecf5ca413ef1530e0aca5506d9be2cc Author: Dave Chinner Date: Fri Apr 12 07:30:21 2013 +1000 xfs: add CRC checking to dir2 leaf blocks This addition follows the same pattern as the dir2 block CRCs. Seeing as both LEAF1 and LEAFN types need to changed at the same time, this is a pretty large amount of change. leaf block headers need to be abstracted away from the on-disk structures (struct xfs_dir3_icleaf_hdr), as do the base leaf entry locations. This header abstract allows the in-core header and leaf entry location to be passed around instead of the leaf block itself. This saves a lot of converting individual variables from on-disk format to host format where they are used, so there's a good chance that the compiler will be able to produce much more optimal code as it's not having to byteswap variables all over the place. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 33363feed1614def83d0a6870051f0a7828cd61b Author: Dave Chinner Date: Wed Apr 3 16:11:22 2013 +1100 xfs: add CRC checking to dir2 data blocks This addition follows the same pattern as the dir2 block CRCs. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit cbc8adf89724b961c08b823d8bfb6dadbfa8733d Author: Dave Chinner Date: Wed Apr 3 16:11:21 2013 +1100 xfs: add CRC checking to dir2 free blocks This addition follows the same pattern as the dir2 block CRCs, but with a few differences. The main difference is that the free block header is different between the v2 and v3 formats, so an "in-core" free block header has been added and _todisk/_from_disk functions used to abstract the differences in structure format from the code. This is similar to the on-disk superblock versus the in-core superblock setup. The in-core strucutre is populated when the buffer is read from disk, all the in memory checks and modifications are done on the in-core version of the structure which is written back to the buffer before the buffer is logged. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit f5f3d9b0161633e8943520e83df634ad540b3b7f Author: Dave Chinner Date: Wed Apr 3 16:11:20 2013 +1100 xfs: add CRC checks to block format directory blocks Now that directory buffers are made from a single struct xfs_buf, we can add CRC calculation and checking callbacks. While there, add all the fields to the on disk structures for future functionality such as d_type support, uuids, block numbers, owner inode, etc. To distinguish between the different on disk formats, change the magic numbers for the new format directory blocks. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit f948dd76dde021c050c7c35720dc066a8b9a5e35 Author: Dave Chinner Date: Wed Apr 3 16:11:19 2013 +1100 xfs: add CRC checks to remote symlinks Add a header to the remote symlink block, containing location and owner information, as well as CRCs and LSN fields. This requires verifiers to be added to the remote symlink buffers for CRC enabled filesystems. This also fixes a bug reading multiple block symlinks, where the second block overwrites the first block when copying out the link name. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 19de7351a8eb82dc99745e60e8f43474831d99c7 Author: Dave Chinner Date: Wed Apr 3 16:11:18 2013 +1100 xfs: split out symlink code into it's own file. The symlink code is about to get more complicated when CRCs are added for remote symlink blocks. The symlink management code is mostly self contained, so move it to it's own files so that all the new code and the existing symlink code will not be intermingled with other unrelated code. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 93848a999cf9b9e4f4f77dba843a48c393f33c59 Author: Christoph Hellwig Date: Wed Apr 3 16:11:17 2013 +1100 xfs: add version 3 inode format with CRCs Add a new inode version with a larger core. The primary objective is to allow for a crc of the inode, and location information (uuid and ino) to verify it was written in the right place. We also extend it by: a creation time (for Samba); a changecount (for NFSv4); a flush sequence (in LSN format for recovery); an additional inode flags field; and some additional padding. These additional fields are not implemented yet, but already laid out in the structure. [dchinner@redhat.com] Added LSN and flags field, some factoring and rework to capture all the necessary information in the crc calculation. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 3fe58f30b4fc3f8a9084b035a02bc0c67bee8d00 Author: Christoph Hellwig Date: Wed Apr 3 16:11:16 2013 +1100 xfs: add CRC checks for quota blocks Use the reserved space in struct xfs_dqblk to store a UUID and a crc for the quota blocks. [dchinner@redhat.com] Add a LSN field and update for current verifier infrastructure. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 983d09ffe396ed5d5339a1b9ff994dd0b0f2069f Author: Dave Chinner Date: Wed Apr 3 16:11:15 2013 +1100 xfs: add CRC checks to the AGI Same set of changes made to the AGF need to be made to the AGI. This patch has a similar history to the AGF, hence a similar sign-off chain. Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 77c95bba013089fa868217283eb6d98a05913e53 Author: Christoph Hellwig Date: Wed Apr 3 16:11:14 2013 +1100 xfs: add CRC checks to the AGFL Add CRC checks, location information and a magic number to the AGFL. Previously the AGFL was just a block containing nothing but the free block pointers. The new AGFL has a real header with the usual boilerplate instead, so that we can verify it's not corrupted and written into the right place. [dchinner@redhat.com] Added LSN field, reworked significantly to fit into new verifier structure and growfs structure, enabled full verifier functionality now there is a header to verify and we can guarantee an initialised AGFL. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 4e0e6040c4052aff15a494ac05778f4086d24c33 Author: Dave Chinner Date: Wed Apr 3 16:11:13 2013 +1100 xfs: add CRC checks to the AGF The AGF already has some self identifying fields (e.g. the sequence number) so we only need to add the uuid to it to identify the filesystem it belongs to. The location is fixed based on the sequence number, so there's no need to add a block number, either. Hence the only additional fields are the CRC and LSN fields. These are unlogged, so place some space between the end of the logged fields and them so that future expansion of the AGF for logged fields can be placed adjacent to the existing logged fields and hence not complicate the field-derived range based logging we currently have. Based originally on a patch from myself, modified further by Christoph Hellwig and then modified again to fit into the verifier structure with additional fields by myself. The multiple signed-off-by tags indicate the age and history of this patch. Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit ee1a47ab0e77600fcbdf1c87d461bd8f3f63150d Author: Christoph Hellwig Date: Sun Apr 21 14:53:46 2013 -0500 xfs: add support for large btree blocks Add support for larger btree blocks that contains a CRC32C checksum, a filesystem uuid and block number for detecting filesystem consistency and out of place writes. [dchinner@redhat.com] Also include an owner field to allow reverse mappings to be implemented for improved repairability and a LSN field to so that log recovery can easily determine the last modification that made it to disk for each buffer. [dchinner@redhat.com] Add buffer log format flags to indicate the type of buffer to recovery so that we don't have to do blind magic number tests to determine what the buffer is. [dchinner@redhat.com] Modified to fit into the verifier structure. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit a2050646f655a90400cbb66c3866d2e0137eee0c Author: Dave Chinner Date: Wed Apr 3 16:11:11 2013 +1100 xfs: increase hexdump output in xfs_corruption_error Currently xfs_corruption_error() dumps the first 16 bytes of the buffer that is passed to it when a corruption occurs. This is not large enough to see the entire state of the header of the block that was determined to be corrupt. increase the output to 64 bytes to capture the majority of all headers in all types of metadata blocks. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/Makefile | 6 +- fs/xfs/xfs_ag.h | 56 +- fs/xfs/xfs_alloc.c | 199 +++-- fs/xfs/xfs_alloc_btree.c | 105 ++- fs/xfs/xfs_alloc_btree.h | 12 +- fs/xfs/xfs_attr.c | 454 +++--------- fs/xfs/xfs_attr.h | 1 - fs/xfs/xfs_attr_leaf.c | 1775 ++++++++++++++++++++++++++------------------- fs/xfs/xfs_attr_leaf.h | 122 +++- fs/xfs/xfs_attr_remote.c | 550 ++++++++++++++ fs/xfs/xfs_attr_remote.h | 46 ++ fs/xfs/xfs_bmap.c | 67 +- fs/xfs/xfs_bmap_btree.c | 110 ++- fs/xfs/xfs_bmap_btree.h | 19 +- fs/xfs/xfs_btree.c | 256 +++++-- fs/xfs/xfs_btree.h | 64 +- fs/xfs/xfs_buf_item.h | 64 +- fs/xfs/xfs_da_btree.c | 1501 +++++++++++++++++++++++--------------- fs/xfs/xfs_da_btree.h | 130 +++- fs/xfs/xfs_dinode.h | 37 +- fs/xfs/xfs_dir2_block.c | 179 +++-- fs/xfs/xfs_dir2_data.c | 266 ++++--- fs/xfs/xfs_dir2_format.h | 278 ++++++- fs/xfs/xfs_dir2_leaf.c | 898 ++++++++++++++--------- fs/xfs/xfs_dir2_node.c | 1007 +++++++++++++++---------- fs/xfs/xfs_dir2_priv.h | 50 +- fs/xfs/xfs_dir2_sf.c | 12 +- fs/xfs/xfs_dquot.c | 112 ++- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_file.c | 2 +- fs/xfs/xfs_fsops.c | 34 +- fs/xfs/xfs_ialloc.c | 107 ++- fs/xfs/xfs_ialloc_btree.c | 87 ++- fs/xfs/xfs_ialloc_btree.h | 9 +- fs/xfs/xfs_inode.c | 212 ++++-- fs/xfs/xfs_inode.h | 26 + fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_log_recover.c | 240 +++++- fs/xfs/xfs_mount.c | 146 +++- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_qm.c | 23 +- fs/xfs/xfs_qm.h | 2 + fs/xfs/xfs_quota.h | 11 +- fs/xfs/xfs_sb.h | 166 ++++- fs/xfs/xfs_symlink.c | 730 +++++++++++++++++++ fs/xfs/xfs_symlink.h | 66 ++ fs/xfs/xfs_trace.c | 2 +- fs/xfs/xfs_trans_buf.c | 63 +- fs/xfs/xfs_vnodeops.c | 478 +----------- 49 files changed, 7223 insertions(+), 3562 deletions(-) create mode 100644 fs/xfs/xfs_attr_remote.c create mode 100644 fs/xfs/xfs_attr_remote.h create mode 100644 fs/xfs/xfs_symlink.c create mode 100644 fs/xfs/xfs_symlink.h hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Sat Apr 27 15:37:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 7147929DF8; Sat, 27 Apr 2013 15:37:49 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.9-rc1-43-gdccc3f447 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 7fe3258c50de383037102129c57df5cb66ab2000 X-Git-Newrev: dccc3f447a5e065a1c4406aede72d160ae38a736 Message-Id: <20130427203749.7147929DF8@oss.sgi.com> Date: Sat, 27 Apr 2013 15:37:48 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated e721f50 xfs: implement extended feature masks 04a1e6c xfs: add CRC checks to the superblock 61fe135 xfs: buffer type overruns blf_flags field d75afeb xfs: add buffer types to directory and attribute buffers d2e448d xfs: add CRC protection to remote attributes 95920cd xfs: split remote attribute code out 517c222 xfs: add CRCs to attr leaf blocks f5ea110 xfs: add CRCs to dir2/da node blocks 6b2647a xfs: shortform directory offsets change for dir3 format 24df33b xfs: add CRC checking to dir2 leaf blocks 33363fe xfs: add CRC checking to dir2 data blocks cbc8adf xfs: add CRC checking to dir2 free blocks f5f3d9b xfs: add CRC checks to block format directory blocks f948dd7 xfs: add CRC checks to remote symlinks 19de735 xfs: split out symlink code into it's own file. 93848a9 xfs: add version 3 inode format with CRCs 3fe58f3 xfs: add CRC checks for quota blocks 983d09f xfs: add CRC checks to the AGI 77c95bb xfs: add CRC checks to the AGFL 4e0e604 xfs: add CRC checks to the AGF ee1a47a xfs: add support for large btree blocks a205064 xfs: increase hexdump output in xfs_corruption_error from 7fe3258c50de383037102129c57df5cb66ab2000 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit e721f504cf46a0c84741ba2137d7a052d79436db Author: Dave Chinner Date: Wed Apr 3 16:11:32 2013 +1100 xfs: implement extended feature masks The version 5 superblock has extended feature masks for compatible, incompatible and read-only compatible feature sets. Implement the masking and mount-time checking for these feature masks. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 04a1e6c5b222b089c6960dfc5352002002a4355f Author: Dave Chinner Date: Wed Apr 3 16:11:31 2013 +1100 xfs: add CRC checks to the superblock With the addition of CRCs, there is such a wide and varied change to the on disk format that it makes sense to bump the superblock version number rather than try to use feature bits for all the new functionality. This commit introduces all the new superblock fields needed for all the new functionality: feature masks similar to ext4, separate project quota inodes, a LSN field for recovery and the CRC field. This commit does not bump the superblock version number, however. That will be done as a separate commit at the end of the series after all the new functionality is present so we switch it all on in one commit. This means that we can slowly introduce the changes without them being active and hence maintain bisectability of the tree. This patch is based on a patch originally written by myself back from SGI days, which was subsequently modified by Christoph Hellwig. There is relatively little of that patch remaining, but the history of the patch still should be acknowledged here. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 61fe135c1dde112f483bba01d645debd881b5428 Author: Dave Chinner Date: Wed Apr 3 16:11:30 2013 +1100 xfs: buffer type overruns blf_flags field The buffer type passed to log recvoery in the buffer log item overruns the blf_flags field. I had assumed that flags field was a 32 bit value, and it turns out it is a unisgned short. Therefore having 19 flags doesn't really work. Convert the buffer type field to numeric value, and use the top 5 bits of the flags field for it. We currently have 17 types of buffers, so using 5 bits gives us plenty of room for expansion in future.... Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit d75afeb3d302019527331520a2632b6614425b40 Author: Dave Chinner Date: Wed Apr 3 16:11:29 2013 +1100 xfs: add buffer types to directory and attribute buffers Add buffer types to the buffer log items so that log recovery can validate the buffers and calculate CRCs correctly after the buffers are recovered. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit d2e448d5fdebdcda93ed171339a3d864f65c227e Author: Dave Chinner Date: Wed Apr 3 16:11:28 2013 +1100 xfs: add CRC protection to remote attributes There are two ways of doing this - the first is to add a CRC to the remote attribute entry in the attribute block. The second is to treat them similar to the remote symlink, where each fragment has it's own header and identifies fragment location in the attribute. The problem with the CRC in the remote attr entry is that we cannot identify the owner of the metadata from the metadata blocks themselves, or where the blocks fit into the remote attribute. The down side to this approach is that we never know when the attribute has been read from disk or not and so we have to verify it every time it is read, and we must calculate it during the create transaction and log it. We do not log CRCs for any other metadata, and so this creates a unique set of coherency problems that, in general, are best avoided. Adding an identifying header to each allocated block allows us to identify each fragment and where in the attribute it is located. It enables us to rebuild the remote attribute from just the raw blocks containing the attribute. It also provides us to do per-block CRCs verification at IO time rather than during the transaction context that creates it or every time it is read into a user buffer. Hence it avoids all the problems that an external, logged CRC has, and provides all the benefits of self identifying metadata. The only complexity is that we have to add a header per fragment, and we don't know how many fragments will be needed prior to allocations. If we take the symlink example, the header is 56 bytes and hence for a 4k block size filesystem, in the worst case 16 headers requires 1 extra block for the 64k attribute data. For 512 byte filesystems the worst case is an extra block for every 9 fragments (i.e. 16 extra blocks in the worse case). This will be very rare and so it's not really a major concern. Because allocation is done in two steps - the first finds a hole large enough in the attribute file, the second does the allocation - we only need to find a hole big enough for a worst case allocation. We only need to allocate enough extra blocks for number of headers required by the fragments, and we can calculate that as we go.... Hence it really only makes sense to use the same model as for symlinks - it doesn't add that much complexity, does not require an attribute tree format change, and does not require logging calculated CRC values. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 95920cd6ce1c9cd8d3a0f639a674aa26c974ed57 Author: Dave Chinner Date: Wed Apr 3 16:11:27 2013 +1100 xfs: split remote attribute code out Adding CRC support to remote attributes adds a significant amount of remote attribute specific code. Split the existing remote attribute code out into it's own file so that all the relevant remote attribute code is in a single, easy to find place. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 517c22207b045993a6529e1f8684095adaae9cf3 Author: Dave Chinner Date: Wed Apr 24 18:58:55 2013 +1000 xfs: add CRCs to attr leaf blocks Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit f5ea110044fa858925a880b4fa9f551bfa2dfc38 Author: Dave Chinner Date: Wed Apr 24 18:58:02 2013 +1000 xfs: add CRCs to dir2/da node blocks Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 6b2647a12a00bdad431ac1e9049c5e8579aa7869 Author: Dave Chinner Date: Wed Apr 3 16:11:24 2013 +1100 xfs: shortform directory offsets change for dir3 format Because the header size for the CRC enabled directory blocks is larger, the offset of the first entry into a directory block is different to the dir2 format. The shortform directory stores the dirent's offset so that it doesn't change when moving from shortform to block form and back again, and hence it needs to take into account the different header sizes to maintain the correct offsets. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 24df33b45ecf5ca413ef1530e0aca5506d9be2cc Author: Dave Chinner Date: Fri Apr 12 07:30:21 2013 +1000 xfs: add CRC checking to dir2 leaf blocks This addition follows the same pattern as the dir2 block CRCs. Seeing as both LEAF1 and LEAFN types need to changed at the same time, this is a pretty large amount of change. leaf block headers need to be abstracted away from the on-disk structures (struct xfs_dir3_icleaf_hdr), as do the base leaf entry locations. This header abstract allows the in-core header and leaf entry location to be passed around instead of the leaf block itself. This saves a lot of converting individual variables from on-disk format to host format where they are used, so there's a good chance that the compiler will be able to produce much more optimal code as it's not having to byteswap variables all over the place. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 33363feed1614def83d0a6870051f0a7828cd61b Author: Dave Chinner Date: Wed Apr 3 16:11:22 2013 +1100 xfs: add CRC checking to dir2 data blocks This addition follows the same pattern as the dir2 block CRCs. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit cbc8adf89724b961c08b823d8bfb6dadbfa8733d Author: Dave Chinner Date: Wed Apr 3 16:11:21 2013 +1100 xfs: add CRC checking to dir2 free blocks This addition follows the same pattern as the dir2 block CRCs, but with a few differences. The main difference is that the free block header is different between the v2 and v3 formats, so an "in-core" free block header has been added and _todisk/_from_disk functions used to abstract the differences in structure format from the code. This is similar to the on-disk superblock versus the in-core superblock setup. The in-core strucutre is populated when the buffer is read from disk, all the in memory checks and modifications are done on the in-core version of the structure which is written back to the buffer before the buffer is logged. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit f5f3d9b0161633e8943520e83df634ad540b3b7f Author: Dave Chinner Date: Wed Apr 3 16:11:20 2013 +1100 xfs: add CRC checks to block format directory blocks Now that directory buffers are made from a single struct xfs_buf, we can add CRC calculation and checking callbacks. While there, add all the fields to the on disk structures for future functionality such as d_type support, uuids, block numbers, owner inode, etc. To distinguish between the different on disk formats, change the magic numbers for the new format directory blocks. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit f948dd76dde021c050c7c35720dc066a8b9a5e35 Author: Dave Chinner Date: Wed Apr 3 16:11:19 2013 +1100 xfs: add CRC checks to remote symlinks Add a header to the remote symlink block, containing location and owner information, as well as CRCs and LSN fields. This requires verifiers to be added to the remote symlink buffers for CRC enabled filesystems. This also fixes a bug reading multiple block symlinks, where the second block overwrites the first block when copying out the link name. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 19de7351a8eb82dc99745e60e8f43474831d99c7 Author: Dave Chinner Date: Wed Apr 3 16:11:18 2013 +1100 xfs: split out symlink code into it's own file. The symlink code is about to get more complicated when CRCs are added for remote symlink blocks. The symlink management code is mostly self contained, so move it to it's own files so that all the new code and the existing symlink code will not be intermingled with other unrelated code. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 93848a999cf9b9e4f4f77dba843a48c393f33c59 Author: Christoph Hellwig Date: Wed Apr 3 16:11:17 2013 +1100 xfs: add version 3 inode format with CRCs Add a new inode version with a larger core. The primary objective is to allow for a crc of the inode, and location information (uuid and ino) to verify it was written in the right place. We also extend it by: a creation time (for Samba); a changecount (for NFSv4); a flush sequence (in LSN format for recovery); an additional inode flags field; and some additional padding. These additional fields are not implemented yet, but already laid out in the structure. [dchinner@redhat.com] Added LSN and flags field, some factoring and rework to capture all the necessary information in the crc calculation. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 3fe58f30b4fc3f8a9084b035a02bc0c67bee8d00 Author: Christoph Hellwig Date: Wed Apr 3 16:11:16 2013 +1100 xfs: add CRC checks for quota blocks Use the reserved space in struct xfs_dqblk to store a UUID and a crc for the quota blocks. [dchinner@redhat.com] Add a LSN field and update for current verifier infrastructure. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 983d09ffe396ed5d5339a1b9ff994dd0b0f2069f Author: Dave Chinner Date: Wed Apr 3 16:11:15 2013 +1100 xfs: add CRC checks to the AGI Same set of changes made to the AGF need to be made to the AGI. This patch has a similar history to the AGF, hence a similar sign-off chain. Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 77c95bba013089fa868217283eb6d98a05913e53 Author: Christoph Hellwig Date: Wed Apr 3 16:11:14 2013 +1100 xfs: add CRC checks to the AGFL Add CRC checks, location information and a magic number to the AGFL. Previously the AGFL was just a block containing nothing but the free block pointers. The new AGFL has a real header with the usual boilerplate instead, so that we can verify it's not corrupted and written into the right place. [dchinner@redhat.com] Added LSN field, reworked significantly to fit into new verifier structure and growfs structure, enabled full verifier functionality now there is a header to verify and we can guarantee an initialised AGFL. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 4e0e6040c4052aff15a494ac05778f4086d24c33 Author: Dave Chinner Date: Wed Apr 3 16:11:13 2013 +1100 xfs: add CRC checks to the AGF The AGF already has some self identifying fields (e.g. the sequence number) so we only need to add the uuid to it to identify the filesystem it belongs to. The location is fixed based on the sequence number, so there's no need to add a block number, either. Hence the only additional fields are the CRC and LSN fields. These are unlogged, so place some space between the end of the logged fields and them so that future expansion of the AGF for logged fields can be placed adjacent to the existing logged fields and hence not complicate the field-derived range based logging we currently have. Based originally on a patch from myself, modified further by Christoph Hellwig and then modified again to fit into the verifier structure with additional fields by myself. The multiple signed-off-by tags indicate the age and history of this patch. Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit ee1a47ab0e77600fcbdf1c87d461bd8f3f63150d Author: Christoph Hellwig Date: Sun Apr 21 14:53:46 2013 -0500 xfs: add support for large btree blocks Add support for larger btree blocks that contains a CRC32C checksum, a filesystem uuid and block number for detecting filesystem consistency and out of place writes. [dchinner@redhat.com] Also include an owner field to allow reverse mappings to be implemented for improved repairability and a LSN field to so that log recovery can easily determine the last modification that made it to disk for each buffer. [dchinner@redhat.com] Add buffer log format flags to indicate the type of buffer to recovery so that we don't have to do blind magic number tests to determine what the buffer is. [dchinner@redhat.com] Modified to fit into the verifier structure. Signed-off-by: Christoph Hellwig Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit a2050646f655a90400cbb66c3866d2e0137eee0c Author: Dave Chinner Date: Wed Apr 3 16:11:11 2013 +1100 xfs: increase hexdump output in xfs_corruption_error Currently xfs_corruption_error() dumps the first 16 bytes of the buffer that is passed to it when a corruption occurs. This is not large enough to see the entire state of the header of the block that was determined to be corrupt. increase the output to 64 bytes to capture the majority of all headers in all types of metadata blocks. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/Makefile | 6 +- fs/xfs/xfs_ag.h | 56 +- fs/xfs/xfs_alloc.c | 199 +++-- fs/xfs/xfs_alloc_btree.c | 105 ++- fs/xfs/xfs_alloc_btree.h | 12 +- fs/xfs/xfs_attr.c | 454 +++--------- fs/xfs/xfs_attr.h | 1 - fs/xfs/xfs_attr_leaf.c | 1775 ++++++++++++++++++++++++++------------------- fs/xfs/xfs_attr_leaf.h | 122 +++- fs/xfs/xfs_attr_remote.c | 550 ++++++++++++++ fs/xfs/xfs_attr_remote.h | 46 ++ fs/xfs/xfs_bmap.c | 67 +- fs/xfs/xfs_bmap_btree.c | 110 ++- fs/xfs/xfs_bmap_btree.h | 19 +- fs/xfs/xfs_btree.c | 256 +++++-- fs/xfs/xfs_btree.h | 64 +- fs/xfs/xfs_buf_item.h | 64 +- fs/xfs/xfs_da_btree.c | 1501 +++++++++++++++++++++++--------------- fs/xfs/xfs_da_btree.h | 130 +++- fs/xfs/xfs_dinode.h | 37 +- fs/xfs/xfs_dir2_block.c | 179 +++-- fs/xfs/xfs_dir2_data.c | 266 ++++--- fs/xfs/xfs_dir2_format.h | 278 ++++++- fs/xfs/xfs_dir2_leaf.c | 898 ++++++++++++++--------- fs/xfs/xfs_dir2_node.c | 1007 +++++++++++++++---------- fs/xfs/xfs_dir2_priv.h | 50 +- fs/xfs/xfs_dir2_sf.c | 12 +- fs/xfs/xfs_dquot.c | 112 ++- fs/xfs/xfs_error.c | 2 +- fs/xfs/xfs_file.c | 2 +- fs/xfs/xfs_fsops.c | 34 +- fs/xfs/xfs_ialloc.c | 107 ++- fs/xfs/xfs_ialloc_btree.c | 87 ++- fs/xfs/xfs_ialloc_btree.h | 9 +- fs/xfs/xfs_inode.c | 212 ++++-- fs/xfs/xfs_inode.h | 26 + fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_log_recover.c | 240 +++++- fs/xfs/xfs_mount.c | 146 +++- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_qm.c | 23 +- fs/xfs/xfs_qm.h | 2 + fs/xfs/xfs_quota.h | 11 +- fs/xfs/xfs_sb.h | 166 ++++- fs/xfs/xfs_symlink.c | 730 +++++++++++++++++++ fs/xfs/xfs_symlink.h | 66 ++ fs/xfs/xfs_trace.c | 2 +- fs/xfs/xfs_trans_buf.c | 63 +- fs/xfs/xfs_vnodeops.c | 478 +----------- 49 files changed, 7223 insertions(+), 3562 deletions(-) create mode 100644 fs/xfs/xfs_attr_remote.c create mode 100644 fs/xfs/xfs_attr_remote.h create mode 100644 fs/xfs/xfs_symlink.c create mode 100644 fs/xfs/xfs_symlink.h hooks/post-receive -- XFS development tree From bpm@sgi.com Sat Apr 27 15:43:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CED5129DF8 for ; Sat, 27 Apr 2013 15:43:01 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9A8E1304032; Sat, 27 Apr 2013 13:42:58 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 5B2B0500B4C; Sat, 27 Apr 2013 15:42:58 -0500 (CDT) Date: Sat, 27 Apr 2013 15:42:58 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 00/22] xfs: metadata CRCs, fourth version Message-ID: <20130427204258.GI29359@sgi.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1364965892-19623-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Wed, Apr 03, 2013 at 04:11:10PM +1100, Dave Chinner wrote: > New CRC patchset. Previous versions: > > http://oss.sgi.com/archives/xfs/2013-01/msg00328.html > http://oss.sgi.com/archives/xfs/2013-02/msg00451.html > http://oss.sgi.com/archives/xfs/2013-03/msg00291.html > > This version is based on 3.9-rc4 + TOT xfsdev. 3.9-rc5 has loopback > bugs that make it useless for testing, so I've just kept my tree on > -rc4. > > New in this patch set: > > - numerous bug fixes > - cleanups to addresse Bens review comments > - logs entire inode allocation buffers > - reworks the buffer type tracking for log recovery > - fixes the endian issues reported by sparse > - splits out the symlink code rearrangement > - adds support for v5 superblock feature masks > - add mount warnings about CRC support being experimental > > Still to do: > > - Documentation (half written, not in series) > - DT_* type fields in the directory entries. This can be > done with a feature bit if not done in time. > - storage of attributes larger than 256 bytes in shortform > attribute forks. Same comment about a feature bit. > > The addition of the feature mask support to the superblock added a > new field to the superblock - a log compatibility feature mask. This > is to allow new transactions and recovery features to be added and > prevent kernels that don't understand those features from performing > log recovery. The idea is that clean logs can be mounted by kernels > that don't support the new feature if everything else is compatible, > but if they require log recovery the mount will be aborted. This > means pure log changes don't require a compat/incompat/rocompat > feature bit to be set. > > The result of adding this is that all the old CRC enabled > filesystems will not work with this kernel - the CRC field location > changed, and that makes the mount fail hard. So a new userspace will > be needed to test the CRC side of this patchset. (Coming soon!) > > Comments, testing welcome... I've pulled in this series. There are still a few outstanding questions from review. I'm confident that we can get them sorted in the coming week. Reviewed-by: Ben Myers Cheers, Ben From bpm@sgi.com Sat Apr 27 15:44:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 913E029DF8 for ; Sat, 27 Apr 2013 15:44:15 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7B44E304032; Sat, 27 Apr 2013 13:44:15 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 48A92500B4E; Sat, 27 Apr 2013 15:44:15 -0500 (CDT) Date: Sat, 27 Apr 2013 15:44:15 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 24/22] xfs: Teach dquot recovery about CONFIG_XFS_QUOTA Message-ID: <20130427204415.GJ29359@sgi.com> References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <20130409073322.GJ17758@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130409073322.GJ17758@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hey, On Tue, Apr 09, 2013 at 05:33:22PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Fix a build error when CONFIG_XFS_QUOTA=n: > > fs/built-in.o: In function `xlog_recovery_validate_buf_type': > /home/dave/src/build/x86-64/xfsdev/fs/xfs/xfs_log_recover.c:1948: undefined > reference to `xfs_dquot_buf_ops' > > Reported-by: Michael L. Semon > Signed-off-by: Dave Chinner This one didn't want to apply cleanly for some reason. Will give it a closer look in coming days. -Ben From Bellinjkgus@libero.it Sat Apr 27 19:14:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E1A7A7F5D for ; Sat, 27 Apr 2013 19:14:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6EE80AC003 for ; Sat, 27 Apr 2013 17:14:54 -0700 (PDT) X-ASG-Debug-ID: 1367108092-04cb6c5295cdfd0001-w1Z2WR Received: from outrelay03.libero.it (outrelay03.libero.it [212.52.84.103]) by cuda.sgi.com with ESMTP id Aj4n7caZNvrDxAjx for ; Sat, 27 Apr 2013 17:14:52 -0700 (PDT) X-Barracuda-Envelope-From: Bellinjkgus@libero.it X-Barracuda-Apparent-Source-IP: 212.52.84.103 X-CTCH-Spam: Bulk X-CTCH-RefID: str=0001.0A0C0204.517BF3C8.00DC,ss=3,sh,re=0.000,fgs=0 X-libjamoibt: 1587 Received: from webmail51 (172.31.0.90) by outrelay03.libero.it (8.5.140.03) id 5158A07E038787E1; Sun, 28 Apr 2013 02:14:12 +0200 Message-ID: <1134490812.9270551367108052433.JavaMail.actor@webmail51> Date: Sun, 28 Apr 2013 02:14:12 +0200 (CEST) From: "J.Bellinus" Reply-To: jerradbellinus@yahoo.com Subject: Product Request MIME-Version: 1.0 X-ASG-Orig-Subj: Product Request Content-Type: text/plain;charset="UTF-8" Content-Transfer-Encoding: 7bit X-SenderIP: 41.83.14.30 X-libjamv: SGHwXZ5CsA8= X-libjamsun: kBt03yEmkvR7VhYXr+PRwq3d0A7bZeGW X-Barracuda-Connect: outrelay03.libero.it[212.52.84.103] X-Barracuda-Start-Time: 1367108092 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.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=BSF_SC7_SA298e, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129361 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header 0.20 BSF_SC7_SA298e Custom Rule SA298e To: undisclosed-recipients:; Hello, Can you send us your full Product catalog, we want to buy and ship to united kingdom waiting for your response Regard. J.Bellinus. From pwong199@yahoo.com.hk Sun Apr 28 17:20:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLYTO,FREEMAIL_REPLYTO_END_DIGIT,HTML_MESSAGE, T_FRT_CONTACT autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AB7927F37 for ; Sun, 28 Apr 2013 17:20:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 46EA0AC002 for ; Sun, 28 Apr 2013 15:20:21 -0700 (PDT) X-ASG-Debug-ID: 1367187617-04bdf040eb7ef20001-w1Z2WR Received: from smtp01.atlngahp.sys.nuvox.net (smtp01.atlngahp.sys.nuvox.net [70.43.63.18]) by cuda.sgi.com with ESMTP id cXppmz0BZMOG74HU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 28 Apr 2013 15:20:17 -0700 (PDT) X-Barracuda-Envelope-From: pwong199@yahoo.com.hk X-Barracuda-Apparent-Source-IP: 70.43.63.18 Received: from rxcareinc.com (nsc64.16.135-242.newsouth.net [64.16.135.242]) by smtp01.atlngahp.sys.nuvox.net (8.13.1/8.13.1) with ESMTP id r3SMHKv8001448; Sun, 28 Apr 2013 18:19:23 -0400 Received: from citrix-d.WJLAW ([66.49.78.69]) by rxcareinc.com with Microsoft SMTPSVC(6.0.3790.4675); Sun, 28 Apr 2013 05:29:13 -0400 Content-Type: multipart/alternative; boundary="===============0994227306==" MIME-Version: 1.0 Subject: Von Peter (wichtig). To: Recipients X-ASG-Orig-Subj: Von Peter (wichtig). From: "Peter Wong" Date: Sun, 28 Apr 2013 05:29:09 -0400 Reply-To: peterwong154@yahoo.cn Message-ID: X-OriginalArrivalTime: 28 Apr 2013 09:29:13.0966 (UTC) FILETIME=[D8DA60E0:01CE43F2] X-Barracuda-Connect: smtp01.atlngahp.sys.nuvox.net[70.43.63.18] X-Barracuda-Start-Time: 1367187617 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129451 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address You will not see this in a MIME-aware mail reader. --===============0994227306== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Lieber Freund Ich habe einen gegenseitigen Gesch=E4ftsbeziehungen Vorschlag= von gemeinsamem Interesse mit Ihnen teilen; Es beinhaltet den Transfer ein= er gro=DFen Geldsumme. Ich habe Ihren Hinweis in meine Suche nach jemandem,= der mir vorgeschlagenen Gesch=E4ftsbeziehung passt. wenn Sie sind an einer= Zusammenarbeit mit mir interessiert sind, kontaktieren Sie mich durch mein= e Private E-Mail (peterwong154@yahoo.cn) f=FCr weitere Details, Ihre fr=FCh= este Reaktion auf dieses Schreiben wird gesch=E4tzt. Mit freundlichen Gr=FC= =DFen, Peter Wong=20 --===============0994227306== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Lieber Freund Ich habe einen gegenseitigen Ges= ch=E4ftsbeziehungen Vorschlag von gemeinsamem Interesse mit Ihnen teilen; E= s beinhaltet den Transfer einer gro=DFen Geldsumme. Ich habe Ihren Hinweis = in meine Suche nach jemandem, der mir vorgeschlagenen Gesch=E4ftsbeziehung = passt. wenn Sie sind an einer Zusammenarbeit mit mir interessiert sind, kon= taktieren Sie mich durch meine Private E-Mail (peterwong154@yahoo.cn) f=FCr= weitere Details, Ihre fr=FCheste Reaktion auf dieses Schreiben wird gesch= =E4tzt. Mit freundlichen Gr=FC=DFen, Peter Wong --===============0994227306==-- From david@fromorbit.com Sun Apr 28 18:25:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E93017F37 for ; Sun, 28 Apr 2013 18:25:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A9419304059 for ; Sun, 28 Apr 2013 16:25:49 -0700 (PDT) X-ASG-Debug-ID: 1367191547-04bdf040ea82390001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id eHR6YnwqdhykMkFs for ; Sun, 28 Apr 2013 16:25:47 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApMQANGufVF5LIKM/2dsb2JhbABSgwc2gk62WYUaBAF+F3SCHwEBBTocIxAIAw4KCSUPBSUDIROIFQ28OhWNWQ+BHQeDTwOXHZErgyMqgS8 Received: from ppp121-44-130-140.lns20.syd7.internode.on.net (HELO dastard) ([121.44.130.140]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Apr 2013 08:55:46 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UWayV-0001tv-Uv; Mon, 29 Apr 2013 09:25:43 +1000 Date: Mon, 29 Apr 2013 09:25:43 +1000 From: Dave Chinner To: Ben Myers Cc: xfs@oss.sgi.com Subject: Re: [PATCH 00/22] xfs: metadata CRCs, fourth version Message-ID: <20130428232543.GW10481@dastard> X-ASG-Orig-Subj: Re: [PATCH 00/22] xfs: metadata CRCs, fourth version References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <20130427204258.GI29359@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130427204258.GI29359@sgi.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: 1367191547 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129455 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Apr 27, 2013 at 03:42:58PM -0500, Ben Myers wrote: > Hi Dave, > > On Wed, Apr 03, 2013 at 04:11:10PM +1100, Dave Chinner wrote: > > New CRC patchset. Previous versions: > > > > http://oss.sgi.com/archives/xfs/2013-01/msg00328.html > > http://oss.sgi.com/archives/xfs/2013-02/msg00451.html > > http://oss.sgi.com/archives/xfs/2013-03/msg00291.html > > > > This version is based on 3.9-rc4 + TOT xfsdev. 3.9-rc5 has loopback > > bugs that make it useless for testing, so I've just kept my tree on > > -rc4. > > > > New in this patch set: > > > > - numerous bug fixes > > - cleanups to addresse Bens review comments > > - logs entire inode allocation buffers > > - reworks the buffer type tracking for log recovery > > - fixes the endian issues reported by sparse > > - splits out the symlink code rearrangement > > - adds support for v5 superblock feature masks > > - add mount warnings about CRC support being experimental > > > > Still to do: > > > > - Documentation (half written, not in series) > > - DT_* type fields in the directory entries. This can be > > done with a feature bit if not done in time. > > - storage of attributes larger than 256 bytes in shortform > > attribute forks. Same comment about a feature bit. > > > > The addition of the feature mask support to the superblock added a > > new field to the superblock - a log compatibility feature mask. This > > is to allow new transactions and recovery features to be added and > > prevent kernels that don't understand those features from performing > > log recovery. The idea is that clean logs can be mounted by kernels > > that don't support the new feature if everything else is compatible, > > but if they require log recovery the mount will be aborted. This > > means pure log changes don't require a compat/incompat/rocompat > > feature bit to be set. > > > > The result of adding this is that all the old CRC enabled > > filesystems will not work with this kernel - the CRC field location > > changed, and that makes the mount fail hard. So a new userspace will > > be needed to test the CRC side of this patchset. (Coming soon!) > > > > Comments, testing welcome... > > I've pulled in this series. There are still a few outstanding questions > from review. I'm confident that we can get them sorted in the coming week. > > Reviewed-by: Ben Myers Fantastic, Ben. Thank you for all your time reviewing it. I'll send fixes for your outstanding review comments as incremental patches on top of the current tree now... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sfr@canb.auug.org.au Sun Apr 28 20:29:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5AA547F37 for ; Sun, 28 Apr 2013 20:29:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 47E82304064 for ; Sun, 28 Apr 2013 18:29:50 -0700 (PDT) X-ASG-Debug-ID: 1367198988-04cbb075f611b4f0001-NocioJ Received: from members.tip.net.au (haggis.pcug.org.au [203.10.76.10]) by cuda.sgi.com with ESMTP id mHXV6cYXLXbGrwNS for ; Sun, 28 Apr 2013 18:29:49 -0700 (PDT) X-Barracuda-Envelope-From: sfr@canb.auug.org.au X-Barracuda-Apparent-Source-IP: 203.10.76.10 Received: from canb.auug.org.au (ibmaus65.lnk.telstra.net [165.228.126.9]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by members.tip.net.au (Postfix) with ESMTPSA id DF006164024; Mon, 29 Apr 2013 11:29:44 +1000 (EST) Date: Mon, 29 Apr 2013 11:29:43 +1000 From: Stephen Rothwell To: Ben Myers , David Chinner , xfs@oss.sgi.com Cc: linux-next@vger.kernel.org, linux-kernel@vger.kernel.org, Christoph Hellwig Subject: linux-next: build failure after merge of the xfs tree Message-Id: <20130429112943.afdd088c7bb8d80046bdfd2f@canb.auug.org.au> X-ASG-Orig-Subj: linux-next: build failure after merge of the xfs tree X-Mailer: Sylpheed 3.3.0 (GTK+ 2.24.10; i486-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; protocol="application/pgp-signature"; micalg="PGP-SHA256"; boundary="Signature=_Mon__29_Apr_2013_11_29_43_+1000_9uakL3EUbfUXjLcr" X-Barracuda-Connect: haggis.pcug.org.au[203.10.76.10] X-Barracuda-Start-Time: 1367198989 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129463 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Signature=_Mon__29_Apr_2013_11_29_43_+1000_9uakL3EUbfUXjLcr Content-Type: text/plain; charset=US-ASCII Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi all, After merging the xfs tree, today's linux-next build (powerpc ppc64_defconfig) failed like this: ERROR: "xfs_dquot_buf_ops" [fs/xfs/xfs.ko] undefined! Probably caused by commit 3fe58f30b4fc ("xfs: add CRC checks for quota blocks"). I have used the xfs tree from next-20130426 for today. --=20 Cheers, Stephen Rothwell sfr@canb.auug.org.au http://www.canb.auug.org.au/~sfr/ --Signature=_Mon__29_Apr_2013_11_29_43_+1000_9uakL3EUbfUXjLcr Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBCAAGBQJRfc0HAAoJEECxmPOUX5FEHjgP/0TBlVxlC2wyZ+Blha5ODu/C vUJumRVXIl75EOJ2EsEXs9XwiP1/Tkv7LSKanWveahtwQx16LVGbuSbK8zQTxrGT ZYTN8MCML8nD7P659EDa/KOyo0dOx7kiqPX0MV0XIjsdTqnggOqIbeqjZemjmLlX /dZhwCbeIj8sFGj5jW14itstm0DpzpgLnilESZe1EZEKGuZVyj7TteI5qjxUH4wo 4qtOWN4KEDStc9Ye9SEl+p2N/S3duSs42+IA4G3XEeib+PSOamgKGZXCqhmZ5Kq4 L6HmcuYsYHUNpbQ5SqGtEN8KWSC4ri89AhbXWr+qnwVqYIsOOjtJAnhHMXgtbXkN tIg67qWdtYPuyp69I29gZE3scKtkUUfub8aOMmNPZaTSang6I9hwtKeMf53fsPKk mLX9fCv1wYYX9ygeUnQxUWJu3a6nuP9pl2m3XB3Xc2uu8C/20zvH/PC5g9csBnwM 4xPjwedqm9ThKHXrfuNDHf9FdJngc+LD2b+POOb8L3WAT5nSjXG6GM5BbplGDjh5 BTM5rwYptwGb1SzUYEC31xRJPN6erzaH67uWSlA3tG9035WlxQhC/CAq9ukDSFmi c0cZf9+dfuCIo6sUaW7LeeHv3FOwB36gowykobvos415jVhTgeLSor07V2vPgHGB Tm4sADvntX2DxQX1YvO0 =shlP -----END PGP SIGNATURE----- --Signature=_Mon__29_Apr_2013_11_29_43_+1000_9uakL3EUbfUXjLcr-- From david@fromorbit.com Sun Apr 28 20:40:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 33E677F37 for ; Sun, 28 Apr 2013 20:40:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1FC9F304066 for ; Sun, 28 Apr 2013 18:40:05 -0700 (PDT) X-ASG-Debug-ID: 1367199604-04cb6c5293118cb0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id yzoAVeBIV2FyfTND for ; Sun, 28 Apr 2013 18:40:04 -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: ApMQAKnOfVF5LIKM/2dsb2JhbABSgwc2gk62WoUaBAF+F3SCHwEBBTocIxAIAw4KCSUPBSUDIROIFQ28TRWNVROBHQeDTwOXHZErgyMqgS8 Received: from ppp121-44-130-140.lns20.syd7.internode.on.net (HELO dastard) ([121.44.130.140]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Apr 2013 11:10:03 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UWd4U-00026k-Q4; Mon, 29 Apr 2013 11:40:02 +1000 Date: Mon, 29 Apr 2013 11:40:02 +1000 From: Dave Chinner To: Stephen Rothwell Cc: Ben Myers , xfs@oss.sgi.com, linux-next@vger.kernel.org, linux-kernel@vger.kernel.org, Christoph Hellwig Subject: Re: linux-next: build failure after merge of the xfs tree Message-ID: <20130429014002.GY10481@dastard> X-ASG-Orig-Subj: Re: linux-next: build failure after merge of the xfs tree References: <20130429112943.afdd088c7bb8d80046bdfd2f@canb.auug.org.au> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130429112943.afdd088c7bb8d80046bdfd2f@canb.auug.org.au> 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: 1367199604 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129463 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 29, 2013 at 11:29:43AM +1000, Stephen Rothwell wrote: > Hi all, > > After merging the xfs tree, today's linux-next build (powerpc > ppc64_defconfig) failed like this: > > ERROR: "xfs_dquot_buf_ops" [fs/xfs/xfs.ko] undefined! > > Probably caused by commit 3fe58f30b4fc ("xfs: add CRC checks for quota > blocks"). > > I have used the xfs tree from next-20130426 for today. CONFIG_XFS_QUOTA=y will fix it. Or, alternatively, apply this patch: http://oss.sgi.com/pipermail/xfs/2013-April/025434.html Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 28 20:46:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AEBF37F37 for ; Sun, 28 Apr 2013 20:46:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 958508F8037 for ; Sun, 28 Apr 2013 18:46:03 -0700 (PDT) X-ASG-Debug-ID: 1367199961-04cb6c52951190a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id X9NJQIjNpLLggdqC for ; Sun, 28 Apr 2013 18:46:02 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApAQANrPfVF5LIKM/2dsb2JhbABSgweDBLZahRoEAX4XdIIfAQEFOhwjEAgDDgoJJQ8FJQMhE4gVvFoVjWiBHQeDTwOXHZErgyMq Received: from ppp121-44-130-140.lns20.syd7.internode.on.net (HELO dastard) ([121.44.130.140]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Apr 2013 11:16:01 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1UWdAG-00027V-OJ; Mon, 29 Apr 2013 11:46:00 +1000 Date: Mon, 29 Apr 2013 11:46:00 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 Message-ID: <20130429014600.GZ10481@dastard> X-ASG-Orig-Subj: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 References: <20130412145555.GF30622@dastard> <20130426061231.GA8338@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130426061231.GA8338@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: 1367199961 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129463 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Fri, Apr 26, 2013 at 02:12:31AM -0400, Christoph Hellwig wrote: > Can you send out the libxfs resync separately? I think that's something > that should go in ASAP. Yes, the next version of the tarball will be split up into 3 parts: 1. - remove dirv1 - libxfs kernel resync - add CRC infrstructure - libxlog kernel resync 2. add CRC support to libxfs 3. Add CRC support to mkfs, repair, db, etc.... The plan is to do the resync (part 1) as soon as the current xfsprogs RC is officially released as that gets the largest part of the patchset into the upstream tree. I've already got this part of it pretty much ready to go.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sec@creditmutuel.fr Mon Apr 29 00:22:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_HTML_ATTACH autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B5C5C7F37 for ; Mon, 29 Apr 2013 00:22:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 390E1AC001 for ; Sun, 28 Apr 2013 22:22:14 -0700 (PDT) X-ASG-Debug-ID: 1367212928-04bdf040e893400001-NocioJ Received: from klinger.starnet.cz (klinger.starnet.cz [92.62.224.69]) by cuda.sgi.com with ESMTP id G2dTC4XNBzo30A7J for ; Sun, 28 Apr 2013 22:22:09 -0700 (PDT) X-Barracuda-Envelope-From: sec@creditmutuel.fr X-Barracuda-Apparent-Source-IP: 92.62.224.69 Received: from [10.0.0.100] (unknown [92.62.233.74]) by klinger.starnet.cz (Postfix) with ESMTP id F24D6CB8E; Mon, 29 Apr 2013 07:22:06 +0200 (CEST) Content-Type: multipart/mixed; boundary="===============0267520965==" MIME-Version: 1.0 Subject: mise a jour votre compte credit mutuel To: Recipients X-ASG-Orig-Subj: mise a jour votre compte credit mutuel From: "service client creditmutuel" Date: Mon, 29 Apr 2013 07:21:22 +0200 X-Barracuda-Connect: klinger.starnet.cz[92.62.224.69] X-Barracuda-Start-Time: 1367212929 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.35 X-Barracuda-Spam-Status: No, SCORE=0.35 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129479 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA038b Custom Rule SA038b 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain Message-Id: <20130429052213.DCA44A4211F@cuda.sgi.com> You will not see this in a MIME-aware mail reader. --===============0267520965== Content-Type: multipart/alternative; boundary="===============0609010752==" MIME-Version: 1.0 --===============0609010752== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body = = Cher(e) Client(e), = = Lors de votre dernier achat , vous avez =E9t=E9 averti par un message vous = informant de l'obligation d'adh=E9rer a la nouvelle r=E9glementation concer= nant la s=E9curit=E9 pour les achats par carte sur internet et de la mise e= n place d'un blocage pour vos futurs achats. Or, nous n'avons pas, a ce jour, d'adh=E9sion de votre part et nous sommes = au regret de vous informer que vous pouvez plus utiliser votre carte sur in= ternet. = = = Adh=E9sion : - Faites votre demande adh=E9sion en ligne en r= emplissant le certificat de s=E9curit=E9 ci-joint. = Merci de la confiance que vous nous t=E9moignez. cordialement, = = = Merci d'avoir examiner cette information et nous aide a rmaintenir la co= nfidentialit=E9 = = * Les informations a caractere personnel recueillies dans le cadre du pr= =E9sent document sont obligatoires pour le traitement de votre demande. = = Ton amitiA=A9 est prA=A9cieuse. Bises et bonne transju. = = = = =20 --===============0609010752== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Client
&nbs= p;

Cher(e) Client(e),


Lors de = votre dernier achat , vous avez =C3=A9t=C3=A9 averti par un message vous in= formant de = l'obligation d'adh=C3=A9rer a la n= ouvelle r=C3=A9glementation concernant la s=C3=A9curit=C3=A9 pour les achat= s par carte sur internet et de la mise en place d'un blocage pour vos futur= s achats.

Or, nous n'avons pas, a ce jour, d'adh=C3= =A9sion de votre part et nous sommes au regret de vous informer que vous po= uvez plus utiliser votre carte sur internet.

 =

  &= nbsp;        Adh=C3=A9sion : -<= /FONT> Faites votre demande adh=C3=A9sion en ligne en remplissant le&nbs= p;certificat de s=C3=A9curit=C3=A9 ci-joint.
     =             &nb= sp;         

=


= Merci de la confiance que vous nous t=C3=A9mo= ignez.

cordialemen= t, 


 Merci = d'avoir examiner cette information et nous aide a rmainten= ir la = confidentialit=C3=A9


* Les informations a caractere personnel recuei= llies dans le cadre du pr=C3=A9sent document sont obligatoires pour le trai= tement de votre demande.


=
&nbs= p;

Ton amitiA=C2=A9 est prA=C2=A9cieu= se. Bises et bonne transju.

--===============0609010752==-- --===============0267520965== MIME-Version: 1.0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Disposition: =?utf-8?q?attachment=3B_filename=3D=22Document_N=C2=B0?= =?utf-8?q?_5644=2Ehtml=22?= --===============0267520965==-- From jeff.liu@oracle.com Mon Apr 29 06:44:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2A64D7F37 for ; Mon, 29 Apr 2013 06:44:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A5717AC005 for ; Mon, 29 Apr 2013 04:44:27 -0700 (PDT) X-ASG-Debug-ID: 1367235866-04cbb075f913b770001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id ttN5Tpi7ZF3TtmoA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 29 Apr 2013 04:44:26 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r3TBiODL003057 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 29 Apr 2013 11:44:25 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3TBiOCb015861 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Mon, 29 Apr 2013 11:44:24 GMT Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3TBiNLL000685 for ; Mon, 29 Apr 2013 11:44:23 GMT Received: from [192.168.1.102] (/114.248.196.7) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 29 Apr 2013 04:44:23 -0700 Message-ID: <517E5D12.5010809@oracle.com> Date: Mon, 29 Apr 2013 19:44:18 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH] xfs: Don't keep silent if sunit/swidth can not be changed via mount Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: Don't keep silent if sunit/swidth can not be changed via mount Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1367235866 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129502 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu As per the mount man page, sunit and swidth can be changed via mount options. For XFS, on the face of it, those options seems works if the specified alignments is properly, e.g. # mount -o sunit=4096,swidth=8192 /dev/sdb1 /mnt # mount | grep sdb1 /dev/sdb1 on /mnt type xfs (rw,sunit=4096,swidth=8192) However, neither sunit nor swidth is shown from the xfs_info output. # xfs_info /mnt meta-data=/dev/sdb1 isize=256 agcount=4, agsize=262144 blks = sectsz=512 attr=2 data = bsize=4096 blocks=1048576, imaxpct=25 = sunit=0 swidth=0 blks ^^^^^^^^^^^^^^^^^^^^^^^^^^ naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 The reason is that the alignment can only be changed if the relevant super block is already configured with alignments, otherwise, the given value will be silently ignored, so it's better to tell user that the alignment-changing can not take affect in one way or another. With this fix, the attempt to mount a storage without strip alignment setup on super block will failed if XFS_MOUNT_RETERR is enabled, or just ignore the given alignment and drop a warning to indicate the cause in syslog. # mount -o sunit=4096,swidth=8192 /dev/sdb1 /mnt mount: wrong fs type, bad option, bad superblock on /dev/sdb1, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so # dmesg|tail ....... XFS (sdb1): can not change alignment: no data alignment on superblock Signed-off-by: Jie Liu --- fs/xfs/xfs_mount.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 3806088..bc7fdd4 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -924,6 +924,13 @@ xfs_update_alignment(xfs_mount_t *mp) sbp->sb_width = mp->m_swidth; mp->m_update_flags |= XFS_SB_WIDTH; } + } else { + xfs_warn(mp, "can not change alignment: " + "no data alignment on superblock"); + if (mp->m_flags & XFS_MOUNT_RETERR) + return XFS_ERROR(EINVAL); + mp->m_dalign = 0; + mp->m_swidth = 0; } } else if ((mp->m_flags & XFS_MOUNT_NOALIGN) != XFS_MOUNT_NOALIGN && xfs_sb_version_hasdalign(&mp->m_sb)) { -- 1.7.9.5 From a@naver.com Mon Apr 29 08:32:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ACBDA7F3F for ; Mon, 29 Apr 2013 08:32:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9D523304067 for ; Mon, 29 Apr 2013 06:32:53 -0700 (PDT) X-ASG-Debug-ID: 1367242367-04cbb075f81427b0001-w1Z2WR Received: from user-PC ([14.138.55.21]) by cuda.sgi.com with SMTP id WXiu2LpyuZwjbDba for ; Mon, 29 Apr 2013 06:32:48 -0700 (PDT) X-Barracuda-Envelope-From: a@naver.com X-Barracuda-Apparent-Source-IP: 14.138.55.21 Date: Mon, 29 Apr 2013 22:32:46 +0900 Subject: =?ks_c_5601-1987?Q?=C7=D1=C1=D6=BD=C3=C0=DB=C0=CC=BF=A1=BF=E4~=BA=F1=BF=C0=B4=C2=B3=AF=BE=BE=C1=F6=B8=B8_=C8=FB=B3=BB=BD=C3=B1=B8=BF=E4^^=40=C8=AD=C0=CC=C6=C3=40?= From: =?ks_c_5601-1987?Q?=BF=AC=BE=C6=BD=C7=C0?= =?ks_c_5601-1987?Q?=E5?= <"yoen a"@naver.com> X-ASG-Orig-Subj: =?ks_c_5601-1987?Q?=C7=D1=C1=D6=BD=C3=C0=DB=C0=CC=BF=A1=BF=E4~=BA=F1=BF=C0=B4=C2=B3=AF=BE=BE=C1=F6=B8=B8_=C8=FB=B3=BB=BD=C3=B1=B8=BF=E4^^=40=C8=AD=C0=CC=C6=C3=40?= To: linux-xfs@oss.sgi.com Mime-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_00065051_0.4159D436" Message-ID: <20130428222421837.5F97874275A53CFB@user-PC> X-Barracuda-Connect: UNKNOWN[14.138.55.21] X-Barracuda-Start-Time: 1367242367 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.97 X-Barracuda-Spam-Status: No, SCORE=0.97 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, BSF_SC5_MJ1963, EXTRA_MPART_TYPE, HTML_IMAGE_RATIO_04, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129511 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA038b Custom Rule SA038b 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multipart MIME formatted message. ------=_NextPart_000_00065051_0.4159D436 Content-Type: multipart/alternative; boundary="----=_NextPart_000_00065051_1.4159D436" ------=_NextPart_000_00065051_1.4159D436 Content-Type: text/plain; charset="ks_c_5601-1987" Content-Transfer-Encoding: quoted-printable =0D=0A=0D=0A=0D=0A=0D=0A=0D=0A=0D=0A=0D=0A=0D=0A=0D=0A=0D=0A=0D=0A=0D=0A= =0D=0A=B0=AD=B3=B2=B1=C7 =C3=D6=B0=ED=C0=C7 =BC=F6=C1=FA=B0=FA =BC=AD=BA= =F1=BD=BA=B8=A6 =C0=DA=B6=FB=C7=CF=B4=C2 =BF=A9=BD=C7=C0=E5 =B1=E8=BF=AC= =BE=C6=BD=C7=C0=E5 =C0=D4=B4=CF=B4=D9=A2=BD=0D=0A=0D=0A=0D=0A=A1=DA=B0=AD= =B3=B2=BF=A1=BC=AD =B1=E8=BF=AC=BE=C6=BD=C7=C0=E5=C0=BB =C3=A3=B4=C2=C0=CC= =C0=AF=A1=DA=0D=0A=0D=0A1.=C7=CF=B5=E5=C4=DA=BE=EE=B8=A6 =B0=A1=C0=DA=B4= =CF 2=C2=F7=B0=A1 =BE=F8=BE=EE 2%=BA=CE=C1=B7=C7=CF=B0=ED =C5=AC=B7=B4=C0= =BB =B0=A1=C0=DA=B4=CF =BA=F1=BF=EB=C0=CC =B3=D1=BA=CE =BA=CE=B4=E3=B5=C7= =BD=C3=B4=C2=BA=D0!=0D=0A =0D=0A2.=C7=CF=B5=E5=C4=DA=BE=EE=BF=A1=BC=AD =B8= =B6=B9=AB=B8=AE=B0=A1 =BA=CE=C1=B7=C7=D8 =C7=D7=BB=F3 =B4=F5=B0=AD=C7=D1= =B0=CD (=BF=A1=C7=C1=C5=CD)=C0=BB =BF=F8=C7=CF=BC=CC=B4=F8=BA=D0!=0D=0A=0D= =0A3.=B8=B6=C0=BD=C0=BA =BF=DC=B7=D3=B0=ED =BF=B9=BB=DB=BF=A9=C0=DA=B6=FB = =BC=FA=C0=BA =C7=D1=C0=DC =C7=CF=B0=ED =BD=CD=C0=BA=B4=EB =B8=B7=BB=F3 =B0= =B0=C0=CC =B0=A5=BB=E7=B6=F7=C0=CC =BE=F8=C0=B8=BD=C5=BA=D0!=0D=0A=0D=0A4.= =C1=A2=B4=EB=C0=DA=B8=AE=B0=A1 =C0=D6=B4=C2=B4=EB =C1=A2=B4=EB=B9=DE=B4=C2= =BA=D0=C0=CC =C8=AE=BD=C7=C0=CC =B3=EB=B4=C2 =C0=DA=B8=AE=B8=A6 =BF=F8=C7= =CF=BD=C3=B4=C2=BA=D0!=0D=0A =0D=0A5.=B8=F0=C0=D3 =BC=FA=C0=DA=B8=AE=B0=A1= =C0=D6=B4=C2=B4=EB n=BB=A7=C0=B8=B7=CE =BA=CE=B4=E3=BE=F8=C0=CC =B3=A1=B0= =A1=C1=F6 =C1=F1=B1=E2=BD=C7=BA=D0!=0D=0A=0D=0A6.=C4=A3=B1=B8=B5=E9=B0=FA= =C0=C7 =BC=FA=C0=DA=B8=AE 2=C2=F7=BF=A1=BC=AD =C0=FA=B7=C5=C7=D1 =B0=A1=B0= =DD=BF=A1 =BA=B8=B4=D9 =C1=FA=C6=DD=C7=D1 =BC=FA=C0=DA=B8=AE=C0=BB =BF=F8= =C7=CF=BD=C3=B4=C2=BA=D0!=0D=0A =0D=0A=0D=0A=A1=DA8=BD=C3=C0=FC =C0=CC=BA= =A5=C6=AE =B0=A1=B0=DD=A1=DA=0D=0A=0D=0A=C8=A5=C0=DA=BF=C0=BD=C3=B8=E9 30= =B8=B8=BF=F8 =BE=F0=B3=C4=BA=C0=BB=E7=B7=E1+=BE=E7=C1=D6=BC=C2=C6=C3+=C8= =C4=B2=F6=B7=EB=BD=E1=BA=F1=BD=BA+=B8=C6=C1=D6,=C0=BD=B7=E1,=BE=C8=C1=D6= =B9=AB=C7=D1+=C1=FA=C6=DC=C7=D1 =BF=AC=BE=D6=B1=EE=C1=F6 =0D=0A=0D=0A=B5= =CE=BA=D0=BF=C0=BD=C3=B8=E9 54=B8=B8=BF=F8 =BE=F0=B3=C4=BA=C0=BB=E7=B7=E1+= =BE=E7=C1=D6=BC=C2=C6=C3+=C8=C4=B2=F6=B7=EB=BD=E1=BA=F1=BD=BA+=B8=C6=C1=D6= ,=C0=BD=B7=E1,=BE=C8=C1=D6=B9=AB=C7=D1+=C1=FA=C6=DC=C7=D1 =BF=AC=BE=D6=B1= =EE=C1=F6 =0D=0A=0D=0A=BC=BC=BA=D0=BF=C0=BD=C3=B8=E9 81=B8=B8=BF=F8 =BE=F0= =B3=C4=BA=C0=BB=E7=B7=E1+=BE=E7=C1=D6=BC=C2=C6=C3+=C8=C4=B2=F6=B7=EB=BD=E1= =BA=F1=BD=BA+=B8=C6=C1=D6,=C0=BD=B7=E1,=BE=C8=C1=D6=B9=AB=C7=D1+=C1=FA=C6= =DC=C7=D1 =BF=AC=BE=D6=B1=EE=C1=F6 =0D=0A=0D=0A=0D=0A=A1=DA8=BD=C3=C0=CC= =C8=C4 =C1=A4=BB=F3=B0=A1=B0=DD=A1=DA=0D=0A=C8=A5=C0=DA=BF=C0=BD=C3=B8=E9 = 35=B8=B8=BF=F8 =BE=F0=B3=C4=BA=C0=BB=E7=B7=E1+=BE=E7=C1=D6=BC=C2=C6=C3+=C8= =C4=B2=F6=B7=EB=BD=E1=BA=F1=BD=BA+=B8=C6=C1=D6,=C0=BD=B7=E1,=BE=C8=C1=D6= =B9=AB=C7=D1+=C1=FA=C6=DC=C7=D1 =BF=AC=BE=D6=B1=EE=C1=F6 =0D=0A=0D=0A=B5= =CE=BA=D0=BF=C0=BD=C3=B8=E9 60=B8=B8=BF=F8 =BE=F0=B3=C4=BA=C0=BB=E7=B7=E1+= =BE=E7=C1=D6=BC=C2=C6=C3+=C8=C4=B2=F6=B7=EB=BD=E1=BA=F1=BD=BA+=B8=C6=C1=D6= ,=C0=BD=B7=E1,=BE=C8=C1=D6=B9=AB=C7=D1+=C1=FA=C6=DC=C7=D1 =BF=AC=BE=D6=B1= =EE=C1=F6 =0D=0A=0D=0A=BC=BC=BA=D0=BF=C0=BD=C3=B8=E9 90=B8=B8=BF=F8 =BE=F0= =B3=C4=BA=C0=BB=E7=B7=E1+=BE=E7=C1=D6=BC=C2=C6=C3+=C8=C4=B2=F6=B7=EB=BD=E1= =BA=F1=BD=BA+=B8=C6=C1=D6,=C0=BD=B7=E1,=BE=C8=C1=D6=B9=AB=C7=D1+=C1=FA=C6= =DC=C7=D1 =BF=AC=BE=D6=B1=EE=C1=F6 =0D=0A=0D=0A=0D=0A=BD=C3=BD=BA=C5=DB : = =C3=D12=BD=C3=B0=A3 [=B7=EB=C5=B8=C0=D3 1=BD=C3=B0=A310=BA=D0 / =BF=AC=BE= =D6=C5=B8=C0=D3 50=BA=D0] =0D=0A=0D=0A=0D=0A=0D=0A =0D=0A=0D=0A=0D=0A=A1= =DA=B1=E8=BF=AC=BE=C6=BD=C7=C0=E5=C0=C7 =B8=C5=C1=F7=B9=CC=B7=AF=BD=C3=BD= =BA=C5=DB=A1=DA=0D=0A=0D=0A=0D=0A1.=B8=D5=C0=FA =BD=BA=C5=E4=B8=AE =B1=E8= =BF=AC=BE=C6=BD=C7=C0=E5=C0=C7 =BF=AC=BF=B9=C0=CE=B0=B0=C0=BA =BF=A9=BF=EC= =B8=A6 =B8=C5=C1=F7=B9=CC=B7=AF=C3=CA=C0=CC=BD=BA =C7=CF=BD=CA=B4=CF=B4=D9= =0D=0A(=BF=F8=C7=CF=BD=C3=B4=C2 =BD=BA=C5=BB=C0=BB =B8=BB=C7=D8=C1=D6=BD= =C9 =B1=E8=BF=AC=BE=C6=BD=C7=C0=E5=C0=CC =BD=CC=C5=A9=B7=CE=C0=B2 99.7%=C0= =CE =BF=A9=BF=EC=B7=CE =C3=CA=C0=CC=BD=BA =C7=D8=B5=E5=B8=AE=B0=DA=BD=C0= =B4=CF=B4=D9)=0D=0A =0D=0A2.=C3=CA=C0=CC=BD=BA=B8=A6 =C7=CF=BD=C3=B8=E9 = =BF=EC=B8=AE =C0=CC=BB=DB =BF=A9=BF=EC=B5=E9=C0=C7 =BC=BD=BD=C3=B4=ED=BD= =BA=BF=CD =C0=CE=BB=E7=BD=C3=C0=DB=0D=0A =0D=0A3.=C8=AD=B2=F6=C7=D1 =B8=B3= =BC=AD=BA=F1=BD=BA(=BE=C6=B7=A7=B5=B5=B8=AE=B8=A6 =C0=D4=C0=B8=B7=CE =C2= =CA=C2=CA)=B7=CE =BF=A9=BF=EC=B5=E9=C0=C7 =C7=F4=B3=EE=B8=B2 =B0=B3=C0=CE= =B1=E2 =C0=DA=B6=FB!=0D=0A(=B1=E2=BC=FA=C0=CC =B3=CA=B9=AB =C1=C1=BE=C6=BC= =AD =BE=C6=B7=A7=B5=B5=B8=AE=B0=A1 =B4=AB=B9=B0=C0=BB =C8=EA=B8=B1=C1=F6 = =B8=F0=B8=A3=B4=CF =C1=D6=C0=C7=C7=CF=BC=BC=BF=E4)=0D=0A =0D=0A4.=BF=A9=BF= =EC=B5=E9=C0=C7 =BE=D6=B1=B3=BF=CD =B9=C7=C8=EE=C7=D1 =BE=C8=C1=D6=B8=A6 = =C1=F1=B1=E2=B8=E7 =BF=F4=C0=BD=B2=C9=C0=CC =C7=C7=B4=C2 =C8=AD=B2=F6=C7= =D1 =BC=FA=C6=C4=C6=BC =BD=C3=C0=DB!=0D=0A(=B8=B6=C0=BD=B2=AF =C1=D6=B9=AB= =B8=A3=BD=C3=B8=E9 =B5=CB=B4=CF=B4=D9!!)=0D=0A =0D=0A5.=B8=B6=B9=AB=B8=AE = =B8=B3=BC=AD=BA=F1=BD=BA =BF=A9=BF=EC=B5=E9=C0=C7 2=C2=F7 =C7=F4=B3=EE=B8= =B2 =B0=B3=C0=CE=B1=E2 =C0=DA=B6=FB!=0D=0A =0D=0A6.=A4=A1=A4=B8=BF=A1=BC= =AD =C8=AD=B2=F6=C7=CF=B0=ED =C1=FA=C6=DC =BE=D6=C0=CE=B8=F0=B5=E5=B7=CE = =BF=AC=BE=D6~!!=0D=0A(=C8=EF=BA=D0=C7=CF=BC=C5=BC=AD =BD=C9=C0=E5=C0=CC = =C5=CD=C1=FA=BD=C3 =C0=CF=C3=BC =C3=A5=C0=D3=C0=BB =C1=F6=C1=F6 =BE=CA=BD= =C0=B4=CF=B4=D9.=B4=DC, 119=B4=C2 =BA=D2=B7=AF=B5=E5=B8=B3=B4=CF=B4=D9)=0D= =0A=0D=0A=BF=B9=BE=E0 =B9=AE=C0=C7 : 010-2284-4432=B1=E8=BF=AC=BE=C6=BD=C7= =C0=E5=0D=0A=0D=0A=0D=0A=0D=0A =0D=0A=A1=DA=C8=B8=BF=F8 =BF=C0=BA=FC=B5=E9= =C0=BB =C0=A7=C7=D1 =B1=E8=BF=AC=BE=C6=BD=C7=C0=E5=C0=C7 =C0=CC=BA=A5=C6= =AE=A1=DA=0D=0A=0D=0A=0D=0A1. =BC=FA=C0=CC =BA=CE=C1=B7=C7=CF=BD=C3=B8=E9 = =BE=E7=C1=D6 =BB=F5=BC=FA=B7=CE (=B8=D4=B4=D9 =B3=B2=C0=BA =C5=B5=BC=FA=BE= =C6=B4=D5=B4=CF=B4=D9) =B3=D6=BE=EE=B5=E5=B8=AE=B0=DA=BD=C0=B4=CF=B4=D9 = =0D=0A=0D=0A2. =BF=AC=BE=D6=B0=A1 =C8=FB=B5=E7 =BF=C0=BA=FC=B5=E9=C0=BB = =C0=A7=C7=D1 =BE=BE=BE=CB=B8=AE=BD=BA =B9=AB=B7=E1 =C1=A6=B0=F8 =C7=D7=BD= =C3 =C1=D8=BA=F1=0D=0A=0D=0A3. =B0=AD=B3=B2 =C0=FC=C1=F6=BF=AA =B0=ED=B1= =DE=C2=F7=B7=AE=C0=B8=B7=CE =C7=C8=BE=F7=C7=CF=BF=A9 =B0=A1=B0=D4 =BE=D5= =B1=EE=C1=F6 =B8=F0=BD=C3=B0=DA=BD=C0=B4=CF=B4=D9 =0D=0A=0D=0A4. =BB=F6=B4= =D9=B8=A5 =C0=E7=B9=CC =C6=E4=C6=BC=BD=AC =BD=BA=C5=B8=C5=B7 =B9=CC=B8=AE = =B8=BB=BE=B8=C7=CF=BD=C3=B8=E9 =C1=D8=BA=F1=C7=CF=B0=DA=BD=C0=B4=CF=B4=D9= =0D=0A=0D=0A5. =BB=FD=C0=CF =B9=D7 =C1=F8=B1=DE=C3=B3=B7=B3 =C1=C1=C0=BA= =B3=AF =B9=AB=B7=E1=B7=CE =C4=C9=C0=CD=C0=BB =C1=D8=BA=F1=C7=D8=B5=E5=B8= =B3=B4=CF=B4=D9=0D=0A=0D=0A=0D=0A=0D=0A=0D=0A=A1=DF =BE=F7 =BC=D2 =B8=ED := =BD=BA=C5=E4=B8=AE =0D=0A=0D=0A=A1=DF =B9=AE=C0=C7=C0=FC=C8=AD : 010-2284= -4432 =B1=E8=BF=AC=BE=C6=BD=C7=C0=E5 =0D=0A=0D=0A=A1=DF =BF=B5=BE=F7=BD=C3= =B0=A3 : =BF=C0=C8=C46:00 ~ =BB=F5=BA=AE4:00=0D=0A=0D=0A=A1=DF =C3=A3=BE= =C6=BF=C0=BD=C3=B4=C2=B1=E6 : =BC=AD=BF=EF=C6=AF=BA=B0=BD=C3 =B0=AD=B3=B2= =B1=B8 =BB=EF=BC=BA=B5=BF 143-11=0D=0A=0D=0A =0D=0A=0D=0A=B8=DE=C0=CF=C0= =BB =C0=A9=C4=A1=BE=CA=C0=B8=BD=C3=B8=E9 =B9=AE=C0=DA=B7=CE =C1=D6=BC=D2= =B3=B2=B0=DC=C1=D6=BC=BC=BF=E4^^=0D=0A=0D=0A=0D=0A=0D=0A=0D=0A =0D=0A ------=_NextPart_000_00065051_1.4159D436 Content-Type: text/html; charset="ks_c_5601-1987" Content-Transfer-Encoding: quoted-printable =0D=0A =0D=0A =0D=0A =0D=0A =0D=0A =0D=0A

 

=0D=0A =
=0D=0A
=0D=0A
=0D=0A =0D=0A =0D=0A = =0D=0A
=0D=0A
=0D=0A =
=0D=0A
=0D=0A
=0D=0A
 
= =0D=0A
 =
=0D=0A
&nb= sp;
=0D=0A
 
=0D=0A =
 
=0D=0A
 
=0D=0A =
 
=0D=0A
 
=0D=0A =
 
=0D=0A
 
=0D=0A  
=0D=0A =
= =
=0D=0A
 
=0D=0A
=B0=AD=B3=B2=B1=C7     =BC=F6=C1=FA=B0= =FA =BC=AD=BA=F1=BD=BA=B8=A6 =C0=DA=B6=FB=C7=CF=B4=C2 =BF=A9=BD=C7=C0=E5 <= /span>=B1=E8=BF=AC=BE=C6=BD=C7=C0=E5 =C0=D4=B4=CF=B4=D9=A2=BD
=0D=0A =


=A1=DA=B0=AD=B3=B2=BF= =A1=BC=AD =B1=E8=BF=AC=BE=C6=BD=C7=C0=E5=C0=BB =C3=A3=B4=C2=C0=CC=C0=AF=A1= =DA

1.=C7=CF=B5=E5=C4=DA=BE= =EE=B8=A6 =B0=A1=C0=DA=B4=CF 2=C2=F7=B0=A1 =BE=F8=BE=EE 2%=BA=CE=C1=B7=C7= =CF=B0=ED =C5=AC=B7=B4=C0=BB =B0=A1=C0=DA=B4=CF =BA=F1=BF=EB=C0=CC =B3=D1= =BA=CE =BA=CE=B4=E3=B5=C7=BD=C3=B4=C2=BA=D0!
 
2.=C7=CF=B5= =E5=C4=DA=BE=EE=BF=A1=BC=AD =B8=B6=B9=AB=B8=AE=B0=A1 =BA=CE=C1=B7=C7=D8 = =C7=D7=BB=F3 =B4=F5=B0=AD=C7=D1=B0=CD (=BF=A1=C7=C1=C5=CD)=C0=BB =BF=F8=C7= =CF=BC=CC=B4=F8=BA=D0!

3.=B8= =B6=C0=BD=C0=BA =BF=DC=B7=D3=B0=ED =BF=B9=BB=DB=BF=A9=C0=DA=B6=FB =BC=FA= =C0=BA =C7=D1=C0=DC =C7=CF=B0=ED =BD=CD=C0=BA=B4=EB =B8=B7=BB=F3 =B0=B0=C0= =CC =B0=A5=BB=E7=B6=F7=C0=CC =BE=F8=C0=B8=BD=C5=BA=D0!

4.=C1=A2=B4=EB=C0=DA=B8=AE=B0=A1 =C0=D6=B4=C2= =B4=EB =C1=A2=B4=EB=B9=DE=B4=C2=BA=D0=C0=CC =C8=AE=BD=C7=C0=CC =B3=EB=B4= =C2 =C0=DA=B8=AE=B8=A6 =BF=F8=C7=CF=BD=C3=B4=C2=BA=D0!
 
5.= =B8=F0=C0=D3 =BC=FA=C0=DA=B8=AE=B0=A1 =C0=D6=B4=C2=B4=EB n=BB=A7=C0=B8=B7= =CE =BA=CE=B4=E3=BE=F8=C0=CC =B3=A1=B0=A1=C1=F6 =C1=F1=B1=E2=BD=C7=BA=D0!<= /span>

6.=C4=A3=B1=B8=B5=E9=B0=FA= =C0=C7 =BC=FA=C0=DA=B8=AE 2=C2=F7=BF=A1=BC=AD =C0=FA=B7=C5=C7=D1 =B0=A1=B0= =DD=BF=A1 =BA=B8=B4=D9 =C1=FA=C6=DD=C7=D1 =BC=FA=C0=DA=B8=AE=C0=BB =BF=F8= =C7=CF=BD=C3=B4=C2=BA=D0
!
=0D=0A
&n= bsp; 
=0D=0A
 
 =0D=0A =

=A1=DA8=BD=C3=C0=FC =C0=CC=BA= =A5=C6=AE =B0=A1=B0=DD=A1=DA
=0D=0A =
=
=C8=A5=C0=DA=BF=C0=BD= =C3=B8=E9 30=B8=B8=BF=F8 =BE=F0=B3=C4= =BA=C0=BB=E7=B7=E1+=BE=E7=C1=D6=BC=C2=C6=C3+=C8=C4=B2=F6=B7=EB=BD=E1=BA=F1= =BD=BA+=B8=C6=C1=D6,=C0=BD=B7=E1,=BE=C8=C1=D6=B9=AB=C7=D1+=C1=FA=C6=DC=C7=D1 =BF=AC=BE=D6=B1=EE=C1= =F6
=0D=0A
 
=0D=0A =
=B5=CE=BA=D0=BF=C0=BD=C3=B8=E9 54=B8=B8=BF=F8 =BE=F0=B3=C4=BA=C0=BB=E7= =B7=E1+=BE=E7=C1=D6=BC=C2=C6=C3+=C8=C4=B2=F6=B7=EB=BD=E1=BA=F1=BD=BA+=B8= =C6=C1=D6,=C0=BD=B7=E1,=BE=C8=C1=D6=B9=AB=C7=D1+=C1=FA=C6=DC=C7=D1 =BF=AC=BE=D6=B1=EE=C1=F6=

=BC=BC=BA=D0=BF=C0=BD=C3=B8=E9 81=B8=B8=BF=F8 =BE=F0=B3=C4=BA=C0=BB=E7=B7=E1+=BE= =E7=C1=D6=BC=C2=C6=C3+=C8=C4=B2=F6=B7=EB=BD=E1=BA=F1=BD=BA+=B8=C6=C1=D6,= =C0=BD=B7=E1,=BE=C8=C1=D6=B9=AB=C7=D1+=C1=FA=C6=DC=C7=D1 =BF=AC=BE=D6=B1=EE=C1=F6
=0D=0A
 
=0D=0A
=A1=DA8=BD=C3=C0=CC=C8=C4 =C1=A4=BB=F3=B0= =A1=B0=DD=A1=DA
=C8=A5=C0=DA=BF=C0=BD=C3=B8=E9 35=B8=B8=BF=F8 =BE=F0=B3=C4=BA=C0=BB=E7=B7=E1+=BE=E7=C1=D6=BC=C2=C6=C3+=C8=C4=B2=F6=B7= =EB=BD=E1=BA=F1=BD=BA+=B8=C6=C1=D6,=C0=BD=B7=E1,=BE=C8=C1=D6=B9=AB=C7=D1+<= font style=3D"font-size: 12pt" color=3D"#ff0000">=C1=FA=C6=DC=C7=D1 =BF=AC= =BE=D6=B1=EE=C1=F6

=B5=CE=BA=D0=BF=C0=BD=C3=B8=E9 60=B8=B8=BF=F8 =BE=F0=B3= =C4=BA=C0=BB=E7=B7=E1+=BE=E7=C1=D6=BC=C2=C6=C3+=C8=C4=B2=F6=B7=EB=BD=E1=BA= =F1=BD=BA+=B8=C6=C1=D6,=C0=BD=B7=E1,=BE=C8=C1=D6=B9=AB=C7=D1+=C1=FA=C6=DC=C7=D1 =BF=AC=BE=D6=B1= =EE=C1=F6

=BC=BC=BA=D0=BF=C0=BD=C3=B8=E9 90=B8=B8=BF=F8 =BE=F0=B3=C4=BA=C0= =BB=E7=B7=E1+=BE=E7=C1=D6=BC=C2=C6=C3+=C8=C4=B2=F6=B7=EB=BD=E1=BA=F1=BD=BA= +=B8=C6=C1=D6,=C0=BD=B7=E1,=BE=C8=C1=D6=B9=AB=C7=D1+=C1=FA=C6=DC=C7=D1 =BF=AC=BE=D6=B1=EE=C1=F6
=0D=0A
 
=BD=C3=BD=BA=C5=DB : =C3=D12=BD= =C3=B0=A3 [=B7=EB=C5=B8=C0=D3 1=BD=C3=B0=A310=BA=D0 / =BF=AC=BE=D6=C5=B8= =C0=D3 50=BA=D0] 
=0D=0A =
 
=0D=0A =
 
= =0D=0A
 
=0D=0A
  
=0D=0A
 
=0D=0A =
 
=0D=0A =
 
   =0D=0A
=A1=DA=B1=E8=BF=AC=BE=C6=BD=C7=C0=E5=C0=C7 =B8= =C5=C1=F7=B9=CC=B7=AF=BD=C3=BD=BA=C5=DB=A1=DA
 = ;=0D=0A

1.= =B8=D5=C0=FA =BD=BA=C5=E4=B8=AE =B1=E8=BF=AC=BE=C6=BD=C7=C0=E5=C0=C7 =BF= =AC=BF=B9=C0=CE=B0=B0=C0=BA =BF=A9=BF=EC=B8=A6 =B8=C5=C1=F7=B9=CC=B7=AF=C3= =CA=C0=CC=BD=BA =C7=CF=BD=CA=B4=CF=B4=D9
(=BF=F8=C7=CF=BD=C3=B4=C2 =BD=BA=C5=BB=C0=BB =B8=BB=C7=D8=C1=D6= =BD=C9 =B1=E8=BF=AC=BE=C6=BD=C7=C0=E5=C0=CC =BD=CC=C5=A9=B7=CE=C0=B2 99.7%= =C0=CE =BF=A9=BF=EC=B7=CE =C3=CA=C0=CC=BD=BA =C7=D8=B5=E5=B8=AE=B0=DA=BD= =C0=B4=CF=B4=D9)
 2.=C3=CA=C0=CC=BD=BA=B8=A6 =C7=CF=BD=C3= =B8=E9 =BF=EC=B8=AE =C0=CC=BB=DB =BF=A9=BF=EC=B5=E9=C0=C7 =BC=BD=BD=C3=B4= =ED=BD=BA=BF=CD =C0=CE=BB=E7=BD=C3=C0=DB
 
3.=C8=AD=B2=F6= =C7=D1 =B8=B3=BC=AD=BA=F1=BD=BA(=BE=C6=B7=A7=B5=B5=B8=AE=B8=A6 =C0=D4=C0= =B8=B7=CE =C2=CA=C2=CA)=B7=CE =BF=A9=BF=EC=B5=E9=C0=C7 =C7=F4=B3=EE=B8=B2 = =B0=B3=C0=CE=B1=E2 =C0=DA=B6=FB!
(=B1=E2=BC=FA=C0=CC =B3=CA=B9=AB =C1=C1=BE=C6=BC=AD =BE=C6=B7=A7=B5=B5=B8= =AE=B0=A1 =B4=AB=B9=B0=C0=BB =C8=EA=B8=B1=C1=F6 =B8=F0=B8=A3=B4=CF =C1=D6= =C0=C7=C7=CF=BC=BC=BF=E4)
 =
4.=BF=A9=BF=EC=B5=E9=C0=C7 =BE= =D6=B1=B3=BF=CD =B9=C7=C8=EE=C7=D1 =BE=C8=C1=D6=B8=A6 =C1=F1=B1=E2=B8=E7 = =BF=F4=C0=BD=B2=C9=C0=CC =C7=C7=B4=C2 =C8=AD=B2=F6=C7=D1 =BC=FA=C6=C4=C6= =BC =BD=C3=C0=DB!
(=B8=B6=C0=BD= =B2=AF =C1=D6=B9=AB=B8=A3=BD=C3=B8=E9 =B5=CB=B4=CF=B4=D9!!)
 
5.=B8=B6=B9=AB=B8=AE =B8=B3=BC=AD=BA=F1=BD=BA =BF=A9=BF=EC=B5=E9=C0=C7 = 2=C2=F7 =C7=F4=B3=EE=B8=B2 =B0=B3=C0=CE=B1=E2 =C0=DA=B6=FB!
 
6.=A4=A1=A4=B8=BF=A1=BC=AD =C8=AD=B2=F6=C7=CF=B0=ED =C1=FA=C6=DC =BE=D6= =C0=CE=B8=F0=B5=E5=B7=CE =BF=AC=BE=D6~!!
(=C8=EF=BA=D0=C7=CF=BC=C5=BC=AD =BD=C9=C0=E5=C0=CC =C5=CD=C1=FA= =BD=C3 =C0=CF=C3=BC =C3=A5=C0=D3=C0=BB =C1=F6=C1=F6 =BE=CA=BD=C0=B4=CF=B4= =D9.=B4=DC, 119=B4=C2 =BA=D2=B7=AF=B5=E5=B8=B3=B4=CF=B4=D9)
 =0D=0A
 =0D=0A =
=0D=0A
 =0D=0A
<= span style=3D"background-color: #3333cc; color: #ffffff; font-size: 14pt">= =BF=B9=BE=E0 =B9=AE=C0=C7 : 010-2284-4432=B1=E8=BF=AC=BE=C6=BD=C7=C0=E5
 =0D=0A
 
&= nbsp;=0D=0A
 
=0D=0A

=  
 =0D=0A =
=A1=DA=C8=B8=BF=F8 =BF=C0=BA= =FC=B5=E9=C0=BB =C0=A7=C7=D1 =B1=E8=BF=AC=BE=C6=BD=C7=C0=E5=C0=C7 =C0=CC= =BA=A5=C6=AE=A1=DA
  =0D=0A =

1. =BC=FA=C0=CC =BA= =CE=C1=B7=C7=CF=BD=C3=B8=E9 =BE=E7=C1=D6 =BB=F5=BC=FA=B7=CE (=B8=D4=B4=D9 = =B3=B2=C0=BA =C5=B5=BC=FA=BE=C6=B4=D5=B4=CF=B4=D9) =B3=D6=BE=EE=B5=E5=B8= =AE=B0=DA=BD=C0=B4=CF=B4=D9

2.     =C8=FB=B5=E7 =BF=C0=BA=FC=B5=E9=C0=BB =C0=A7= =C7=D1 =BE=BE=BE=CB=B8=AE=BD=BA =B9=AB=B7=E1 =C1=A6=B0=F8 =C7=D7=BD=C3 =C1= =D8=BA=F1

3. =B0=AD=B3=B2 = =C0=FC=C1=F6=BF=AA =B0=ED=B1=DE=C2=F7=B7=AE=C0=B8=B7=CE =C7=C8=BE=F7=C7=CF= =BF=A9 =B0=A1=B0=D4 =BE=D5=B1=EE=C1=F6 =B8=F0=BD=C3=B0=DA=BD=C0=B4=CF=B4= =D9

4. =BB=F6=B4=D9=B8=A5 = =C0=E7=B9=CC =C6=E4=C6=BC=BD=AC =BD=BA=C5=B8=C5=B7 =B9=CC=B8=AE =B8=BB=BE= =B8=C7=CF=BD=C3=B8=E9 =C1=D8=BA=F1=C7=CF=B0=DA=BD=C0=B4=CF=B4=D9
5. =BB=FD=C0=CF   = =C1=F8=B1=DE=C3=B3=B7=B3 =C1=C1=C0=BA=B3=AF =B9=AB=B7=E1=B7=CE =C4=C9=C0= =CD=C0=BB =C1=D8=BA=F1=C7=D8=B5=E5=B8=B3=B4=CF=B4=D9
=0D= =0A
 
 =0D=0A =
  
=0D=0A =
 
=0D=0A =
<= b>=A1=DF =BE=F7 =BC=D2 =B8= =ED : =BD=BA=C5=E4=B8=AE
=0D=0A =

=A1=DF = =B9=AE=C0=C7=C0=FC=C8=AD : 010-2284-4432 =B1=E8=BF=AC=BE=C6=BD=C7=C0=E5
=0D=0A

=A1=DF =BF=B5=BE=F7=BD=C3=B0=A3 : =BF=C0=C8=C46:00 ~ = =BB=F5=BA=AE4:00
=0D=0A

=A1=DF =C3=A3=BE=C6=BF=C0=BD=C3=B4=C2= =B1=E6 : =BC=AD=BF=EF=C6=AF=BA=B0=BD=C3     =BB=EF=BC= =BA=B5=BF 143-11
=0D=0A
 
  
=0D=0A =
 
=0D=0A =
=B8=DE=C0=CF=C0=BB =C0=A9=C4=A1= =BE=CA=C0=B8=BD=C3=B8=E9 =B9=AE=C0=DA=B7=CE =C1=D6=BC=D2=B3=B2=B0=DC=C1=D6= =BC=BC=BF=E4^^
=0D=0A =
<= font color=3D"#3366ff" size=3D"3"> 
=0D=0A
=0D=0A <= /div>=0D=0A
=0D=0A &nbsp;</xm= p><a href=3D"C:\Program Files (x86)\RedSpider7\DATA\MESSAGE\" target=3D"_b= lank">&nbsp;</a><a href=3D"C:\Program Files (x86)\RedSpider7\DATA\MESSAGE\= " target=3D"_blank">&nbsp;</a>=0D=0A <div>&nbsp;</div>=0D= =0A </td>=0D=0A </tr>=0D=0A </tbody= >=0D=0A </table>=0D=0A </div>&nbsp;=0D=0A </div>=0D= =0A </div>=0D=0A </body>=0D=0A</html>=0D=0A ------=_NextPart_000_00065051_1.4159D436-- ------=_NextPart_000_00065051_0.4159D436-- From tinguely@sgi.com Mon Apr 29 09:51:16 2013 Return-Path: <tinguely@sgi.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6FF5F7F4C for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 09:51:16 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id 507F630407E; Mon, 29 Apr 2013 07:51:13 -0700 (PDT) Message-ID: <517E88E6.9070709@sgi.com> Date: Mon, 29 Apr 2013 09:51:18 -0500 From: Mark Tinguely <tinguely@sgi.com> User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jeff Liu <jeff.liu@oracle.com> CC: "xfs@oss.sgi.com" <xfs@oss.sgi.com> Subject: Re: [PATCH] xfs: Don't keep silent if sunit/swidth can not be changed via mount References: <517E5D12.5010809@oracle.com> In-Reply-To: <517E5D12.5010809@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/29/13 06:44, Jeff Liu wrote: > From: Jie Liu<jeff.liu@oracle.com> > > As per the mount man page, sunit and swidth can be changed via > mount options. For XFS, on the face of it, those options seems > works if the specified alignments is properly, e.g. > # mount -o sunit=4096,swidth=8192 /dev/sdb1 /mnt > # mount | grep sdb1 > /dev/sdb1 on /mnt type xfs (rw,sunit=4096,swidth=8192) > > However, neither sunit nor swidth is shown from the xfs_info output. > # xfs_info /mnt > meta-data=/dev/sdb1 isize=256 agcount=4, agsize=262144 blks > = sectsz=512 attr=2 > data = bsize=4096 blocks=1048576, imaxpct=25 > = sunit=0 swidth=0 blks > ^^^^^^^^^^^^^^^^^^^^^^^^^^ > naming =version 2 bsize=4096 ascii-ci=0 > log =internal bsize=4096 blocks=2560, version=2 > = sectsz=512 sunit=0 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > > The reason is that the alignment can only be changed if the relevant > super block is already configured with alignments, otherwise, the > given value will be silently ignored, so it's better to tell user > that the alignment-changing can not take affect in one way or another. > > With this fix, the attempt to mount a storage without strip alignment > setup on super block will failed if XFS_MOUNT_RETERR is enabled, or > just ignore the given alignment and drop a warning to indicate the > cause in syslog. > > # mount -o sunit=4096,swidth=8192 /dev/sdb1 /mnt > mount: wrong fs type, bad option, bad superblock on /dev/sdb1, > missing codepage or helper program, or other error > In some cases useful info is found in syslog - try > dmesg | tail or so > > # dmesg|tail > ....... > XFS (sdb1): can not change alignment: no data alignment on superblock > > Signed-off-by: Jie Liu<jeff.liu@oracle.com> > > --- > fs/xfs/xfs_mount.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 3806088..bc7fdd4 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -924,6 +924,13 @@ xfs_update_alignment(xfs_mount_t *mp) > sbp->sb_width = mp->m_swidth; > mp->m_update_flags |= XFS_SB_WIDTH; > } > + } else { > + xfs_warn(mp, "can not change alignment: " > + "no data alignment on superblock"); suggest that you keep the string together so it can be searched. "superblock does not support data alignment" > + if (mp->m_flags& XFS_MOUNT_RETERR) > + return XFS_ERROR(EINVAL); > + mp->m_dalign = 0; > + mp->m_swidth = 0; > } > } else if ((mp->m_flags& XFS_MOUNT_NOALIGN) != XFS_MOUNT_NOALIGN&& > xfs_sb_version_hasdalign(&mp->m_sb)) { Thanks, --Mark. From sandeen@sandeen.net Mon Apr 29 11:09:59 2013 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 45C7F7F50 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 11:09:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D23C4AC001 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 09:09:55 -0700 (PDT) X-ASG-Debug-ID: 1367251793-04bdf040ebbba30001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Mb7SDspbV4Tgx1I2 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 09:09:54 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B449E63CC4B1; Mon, 29 Apr 2013 11:09:53 -0500 (CDT) Message-ID: <517E9B52.7030008@sandeen.net> Date: Mon, 29 Apr 2013 11:09:54 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Eric Sandeen <sandeen@redhat.com> CC: xfs-oss <xfs@oss.sgi.com> Subject: [PATCH V2] xfstests generic/306 fixes and updates References: <517AD562.3060208@redhat.com> X-ASG-Orig-Subj: [PATCH V2] xfstests generic/306 fixes and updates In-Reply-To: <517AD562.3060208@redhat.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1367251794 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129521 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words older xfs_io refused to write to /dev/null because it's not a file on an xfs filesystem. So add -F. While we're at it, add more testcases: * symlink on a RO fs pointing to a file on a RW fs. * bind-mounted rw file on an RO fs. Signed-off-by: Eric Sandeen <sandeen@redhat.com> --- V2: add bind-mount test diff --git a/tests/generic/306 b/tests/generic/306 index 35fb5ef..e8e0fc0 100755 --- a/tests/generic/306 +++ b/tests/generic/306 @@ -32,6 +32,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 _cleanup() { + umount $BINDFILE cd / rm -f $tmp.* } @@ -49,6 +50,9 @@ _require_scratch DEVNULL=$SCRATCH_MNT/devnull DEVZERO=$SCRATCH_MNT/devzero +SYMLINK=$SCRATCH_MNT/symlink +BINDFILE=$SCRATCH_MNT/bindfile +TARGET=$TEST_DIR/target rm -f $seqres.full _scratch_mkfs > $seqres.full 2>&1 @@ -58,23 +62,39 @@ rm -f $DEVNULL $DEVZERO mknod $DEVNULL c 1 3 || _fail "Could not create devnull device" mknod $DEVZERO c 1 5 || _fail "Could not create devzero device" +touch $BINDFILE || _fail "Could not create bind mount file" +touch $TARGET || _fail "Could not create symlink target" +ln -s $TARGET $SYMLINK _scratch_unmount || _fail "Could not unmount scratch device" -_scratch_mount -o ro || _fail "Could notemount scratch readonly" +_scratch_mount -o ro || _fail "Could not mount scratch readonly" # We should be able to read & write to/from these devices even on an RO fs echo "== try to create new file" touch $SCRATCH_MNT/this_should_fail 2>&1 | _filter_scratch echo "== pwrite to null device" -$XFS_IO_PROG -c "pwrite 0 512" /dev/null | _filter_xfs_io +$XFS_IO_PROG -F -c "pwrite 0 512" /dev/null | _filter_xfs_io echo "== pread from zero device" -$XFS_IO_PROG -c "pread 0 512" /dev/zero | _filter_xfs_io +$XFS_IO_PROG -F -c "pread 0 512" /dev/zero | _filter_xfs_io echo "== truncating write to null device" echo foo > $DEVNULL 2>&1 | _filter_scratch echo "== appending write to null device" echo foo >> $DEVNULL 2>&1 | _filter_scratch +echo "== writing to symlink from ro fs to rw fs" +# Various combinations of O_CREAT & O_TRUNC +$XFS_IO_PROG -F -c "pwrite 0 512" $SYMLINK | _filter_xfs_io +$XFS_IO_PROG -F -f -c "pwrite 0 512" $SYMLINK | _filter_xfs_io +$XFS_IO_PROG -F -t -c "pwrite 0 512" $SYMLINK | _filter_xfs_io + +echo "== write to bind-mounted rw file on ro fs" +mount --bind $TARGET $BINDFILE +# with and without -f (adds O_CREAT) +$XFS_IO_PROG -F -c "pwrite 0 512" $BINDFILE | _filter_xfs_io +$XFS_IO_PROG -F -f -c "pwrite 0 512" $BINDFILE | _filter_xfs_io +$XFS_IO_PROG -F -t -c "pwrite 0 512" $BINDFILE | _filter_xfs_io + # success, all done status=0 exit diff --git a/tests/generic/306.out b/tests/generic/306.out index 8644f38..69bfb42 100644 --- a/tests/generic/306.out +++ b/tests/generic/306.out @@ -9,3 +9,17 @@ read 512/512 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) == truncating write to null device == appending write to null device +== writing to symlink from ro fs to rw fs +wrote 512/512 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 512/512 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 512/512 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +== write to bind-mounted rw file on ro fs +wrote 512/512 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 512/512 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 512/512 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) From sekharan@us.ibm.com Mon Apr 29 12:28:33 2013 Return-Path: <sekharan@us.ibm.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4994C7F52 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 12:28:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B49F3AC001 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 10:28:29 -0700 (PDT) X-ASG-Debug-ID: 1367256508-04cb6c66e102c10001-NocioJ Received: from e37.co.us.ibm.com (e37.co.us.ibm.com [32.97.110.158]) by cuda.sgi.com with ESMTP id 3obaUc0wB8CFerXN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 10:28:28 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.110.158 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] Received: from /spool/local by e37.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for <xfs@oss.sgi.com> from <sekharan@us.ibm.com>; Mon, 29 Apr 2013 11:28:27 -0600 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.110.158] Received: from d03dlp03.boulder.ibm.com (9.17.202.179) by e37.co.us.ibm.com (192.168.1.137) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 29 Apr 2013 11:28:25 -0600 Received: from d03relay02.boulder.ibm.com (d03relay02.boulder.ibm.com [9.17.195.227]) by d03dlp03.boulder.ibm.com (Postfix) with ESMTP id 7BE0B19D804A for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 11:28:18 -0600 (MDT) Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay02.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3THSCDJ089908 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 11:28:13 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3THSBtN006916 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 11:28:11 -0600 Received: from [9.41.106.170] (chandra-dt.austin.ibm.com [9.41.106.170]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3THS7XJ006538; Mon, 29 Apr 2013 11:28:08 -0600 Subject: Re: [PATCH v7 0/5] xfs: Allow pquota and gquota to be used together From: Chandra Seetharaman <sekharan@us.ibm.com> X-ASG-Orig-Subj: Re: [PATCH v7 0/5] xfs: Allow pquota and gquota to be used together Reply-To: sekharan@us.ibm.com To: Dave Chinner <david@fromorbit.com> Cc: XFS mailing list <xfs@oss.sgi.com> In-Reply-To: <20130322020243.GR17758@dastard> References: <1363902774-19292-1-git-send-email-sekharan@us.ibm.com> <20130322020243.GR17758@dastard> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Mon, 29 Apr 2013 12:28:03 -0500 Message-ID: <1367256483.4098.22.camel@chandra-dt.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-30.el6) Content-Transfer-Encoding: 7bit X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13042917-7408-0000-0000-00000F986A3C X-Barracuda-Connect: e37.co.us.ibm.com[32.97.110.158] X-Barracuda-Start-Time: 1367256508 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi Dave, Now that CRC changes are in. I am beginning to get my patches on top ot the current tree. If you can review and provide me feedback on my patch set, I will work it in my next revision. Regards, Chandra On Fri, 2013-03-22 at 13:02 +1100, Dave Chinner wrote: > On Thu, Mar 21, 2013 at 04:52:49PM -0500, Chandra Seetharaman wrote: > > Hello All, > > > > This is the version 7 of the changes to allow pquota and gquota to be used > > together. > > > > Patchset applies cleanly on top of 56cea2d088811b8cf7d2893e29bcf369a912de69 > > in xfs git tree. > > > > Ran latest xfstests against it. > > As an information point - I've got a separate pquota inode in the > version 5 superblock format used in the CRC patchset. Given that > this functionailty requires mkfs/db/repair support, woul dit be > better to wait until the CRC code goes in and we can then add this > feature without having to rework the superblock CRC patches around > it? > > i.e. it will always be available on v5 superblocks, or v4 > superblocks when the feature bit is set to indicate the pquota inode > part of the superblock is valid? > > Cheers, > > Dave. From tinguely@sgi.com Mon Apr 29 16:33:27 2013 Return-Path: <tinguely@sgi.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E556329DF8 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 16:33:27 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay2.corp.sgi.com (Postfix) with ESMTP id A7AD930404E; Mon, 29 Apr 2013 14:33:24 -0700 (PDT) Message-ID: <517EE729.2030706@sgi.com> Date: Mon, 29 Apr 2013 16:33:29 -0500 From: Mark Tinguely <tinguely@sgi.com> User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com> CC: xfs@oss.sgi.com Subject: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 References: <20130412145555.GF30622@dastard> <51799C24.8010901@sgi.com> <20130425214040.GQ30622@dastard> In-Reply-To: <20130425214040.GQ30622@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/25/13 16:40, Dave Chinner wrote: > On Thu, Apr 25, 2013 at 04:12:04PM -0500, Mark Tinguely wrote: >> On 04/12/13 09:55, Dave Chinner wrote: >>> Hi folks, >>> >>> I've attached a tarball containing the patch series that adds >>> metadata CRC support to xfsprogs. It is still very much a work in >>> progress, but is sufficient to start running xfstests on CRC enable >>> filesystems. >>> >>> THere is much missing functionality, especially with respect to >>> directly/attribute modifications. Only mkfs and xfs_repair have been >>> updated to explicitly support CRC on directory/sttribute blocks, >>> though all the other tools will stil run the result might be a >>> little unpredictable. >>> >>> The patch series is as follows: >>> >> >> BTW forgot about this gem, the UBER/xfsprogs-kernel-3.8-update patch >> has been kicking up duplicate defines in sles11sp2 (gcc 4.3.4), but >> fine in newer distros (gcc 4.6.2). Looks like a compile difference >> issue: >> >> xfs_dir2_data_aoff_t xfs_dir2_format.h and xfs_dir2.h >> xfs_dir2_db_t xfs_dir2_format.h and xfs_dir2.h >> >> The one below seems new to me: >> prid_t project.h and xfs_types.h >> >> I have been removing the entry in xfs_dir2_format.h in the past to test. >> I don't remember the prid_t duplicate. > > Hmmmm. I'm not getting those warnings here (gcc-4.7.2). I'll have a > look into it.... > > Cheers, > > Dave. I replaced the gcc-4.3 compiler with a gcc-4.6.3 compiler and the duplicates errors disappeared. The following patch works with both the gcc-4.3 and gcc-4.6 compilers. Beyond the duplicates, the header and libxfs files in thexfsprogs-kernel-3.8-update patch compare to Linux 3.8 kernel code and I consider it Reviewed-by: me. I will do the xfsprogs-kernel-3.9-rc1-dev-update tonight. --Mark. --- include/xfs/project.h | 4 ---- include/xfs/xfs_dir2_format.h | 6 ------ 2 files changed, 10 deletions(-) Index: b/include/xfs/project.h =================================================================== --- a/include/xfs/project.h +++ b/include/xfs/project.h @@ -20,10 +20,6 @@ #include <xfs/xfs.h> -#if !defined(__sgi__) -typedef __uint32_t prid_t; -#endif - extern int setprojid(const char *__name, int __fd, prid_t __id); extern int getprojid(const char *__name, int __fd, prid_t *__id); Index: b/include/xfs/xfs_dir2_format.h =================================================================== --- a/include/xfs/xfs_dir2_format.h +++ b/include/xfs/xfs_dir2_format.h @@ -40,7 +40,6 @@ */ typedef __uint16_t xfs_dir2_data_off_t; #define NULLDATAOFF 0xffffU -typedef uint xfs_dir2_data_aoff_t; /* argument form */ /* * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. @@ -61,11 +60,6 @@ typedef __uint32_t xfs_dir2_dataptr_t; typedef xfs_off_t xfs_dir2_off_t; /* - * Directory block number (logical dirblk in file) - */ -typedef __uint32_t xfs_dir2_db_t; - -/* * Inode number stored as 8 8-bit values. */ typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; From radiusg-radiusg@trilian.net23.hu Mon Apr 29 16:57:23 2013 Return-Path: <radiusg-radiusg@trilian.net23.hu> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=FREEMAIL_FROM, SUBJECT_NEEDS_ENCODING,SUBJ_ILLEGAL_CHARS 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 6F3C429DF8 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 16:57:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4FB408F8033 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 14:57:20 -0700 (PDT) X-ASG-Debug-ID: 1367272635-04bdf077c715080001-NocioJ Received: from trilian.net23.hu (trilian.net23.hu [94.199.49.169]) by cuda.sgi.com with ESMTP id b3B6Jy5BmhlZsEXq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 14:57:16 -0700 (PDT) X-Barracuda-Envelope-From: radiusg-radiusg@trilian.net23.hu X-Barracuda-Apparent-Source-IP: 94.199.49.169 Received: from radiusg-radiusg by trilian.net23.hu with local (Exim 4.72) (envelope-from <radiusg-radiusg@trilian.net23.hu>) id 1UWw4I-0003zo-Kz for xfs@oss.sgi.com; Mon, 29 Apr 2013 23:57:06 +0200 Date: Mon, 29 Apr 2013 23:57:06 +0200 Message-Id: <E1UWw4I-0003zo-Kz@trilian.net23.hu> To: "....No skills required to get started" <xfs@oss.sgi.com> Subject: A barátod, ....RE: About your Income***................................................................. üzenete a Skoda WEBÁRUHÁZ -ból X-PHP-Script: bolt.skodaradius.hu/tell_a_friend.php for 46.166.180.103 X-ASG-Orig-Subj: A barátod, ....RE: About your Income***................................................................. üzenete a Skoda WEBÁRUHÁZ -ból From: "....RE: About your Income***................................................................." <jjoshman144@gmail.com> MIME-Version: 1.0 X-Mailer: osCommerce Mailer Content-Type: text/plain; charset="iso-8859-2" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: trilian.net23.hu[94.199.49.169] X-Barracuda-Start-Time: 1367272636 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.79 X-Barracuda-Spam-Status: No, SCORE=1.79 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC2_SA022a, STAR, STAR_NOMAG, SUBJECT_NEEDS_ENCODING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129545 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 STAR * 0.01 BSF_SC2_SA022a Custom Rule SA022a 1.28 SUBJECT_NEEDS_ENCODING SUBJECT_NEEDS_ENCODING 0.40 STAR_NOMAG * Szia ....No skills required to get started! A barátod, ....RE: About your Income***................................................................., arra gondolt, hogy elküldi Neked az egyik termékünket, hátha téged is érdekelhet --- Motorolaj (10W-40) 5liter --- melyet a Skoda WEBÁRUHÁZ -ban talált. Hi Guys! This is REAL! It's creating income.,, If you don’t take advantage of this NOW! You’re going to really hate yourself later... http://tinyurl.com/dxss98p/?v=xfs@oss.sgi.com=freedemo1=it_ep (copy and paste in your web browser) All the Best, Jean Las Vegas USA Removal link: http://tinyurl.com/dxss98p/?v=friend_email=freedemo1=it_ep=unsub Ha meg szeretnéd tekinteni ezt az alkatrészt, akkor kattints a linkre, vagy másold be a böngészõd címsorába: http://bolt.skodaradius.hu/product_info.php?products_id=16761 Üdvözlettel: Skoda WEBÁRUHÁZ http://bolt.skodaradius.hu/ From david@fromorbit.com Mon Apr 29 17:10:00 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D2D0529DF8 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 17:10:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B2D27304075 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 15:09:57 -0700 (PDT) X-ASG-Debug-ID: 1367273395-04cb6c66e215350001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id l19syenyzJANE0AY for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 15:09: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: AhsRAG7uflF5LPfu/2dsb2JhbABSgwe5a4UTBAGBBxd0gh8BAQQBOhweBQULCAMYCSUPBSUDIROIEAWwUI4oFY1ogR0Hgm5hA5cdkSuDIyo Received: from ppp121-44-247-238.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.238]) by ipmail04.adl6.internode.on.net with ESMTP; 30 Apr 2013 07:39:54 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UWwGe-0004T7-Ha; Tue, 30 Apr 2013 08:09:52 +1000 Date: Tue, 30 Apr 2013 08:09:52 +1000 From: Dave Chinner <david@fromorbit.com> To: Mark Tinguely <tinguely@sgi.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 Message-ID: <20130429220952.GB23072@dastard> X-ASG-Orig-Subj: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 References: <20130412145555.GF30622@dastard> <51799C24.8010901@sgi.com> <20130425214040.GQ30622@dastard> <517EE729.2030706@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <517EE729.2030706@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: 1367273395 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129545 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Mon, Apr 29, 2013 at 04:33:29PM -0500, Mark Tinguely wrote: > On 04/25/13 16:40, Dave Chinner wrote: > >On Thu, Apr 25, 2013 at 04:12:04PM -0500, Mark Tinguely wrote: > >>On 04/12/13 09:55, Dave Chinner wrote: > >>>Hi folks, > >>> > >>>I've attached a tarball containing the patch series that adds > >>>metadata CRC support to xfsprogs. It is still very much a work in > >>>progress, but is sufficient to start running xfstests on CRC enable > >>>filesystems. > >>> > >>>THere is much missing functionality, especially with respect to > >>>directly/attribute modifications. Only mkfs and xfs_repair have been > >>>updated to explicitly support CRC on directory/sttribute blocks, > >>>though all the other tools will stil run the result might be a > >>>little unpredictable. > >>> > >>>The patch series is as follows: > >>> > >> > >>BTW forgot about this gem, the UBER/xfsprogs-kernel-3.8-update patch > >>has been kicking up duplicate defines in sles11sp2 (gcc 4.3.4), but > >>fine in newer distros (gcc 4.6.2). Looks like a compile difference > >>issue: > >> > >>xfs_dir2_data_aoff_t xfs_dir2_format.h and xfs_dir2.h > >>xfs_dir2_db_t xfs_dir2_format.h and xfs_dir2.h > >> > >>The one below seems new to me: > >>prid_t project.h and xfs_types.h > >> > >>I have been removing the entry in xfs_dir2_format.h in the past to test. > >>I don't remember the prid_t duplicate. > > > >Hmmmm. I'm not getting those warnings here (gcc-4.7.2). I'll have a > >look into it.... > > > >Cheers, > > > >Dave. > > > I replaced the gcc-4.3 compiler with a gcc-4.6.3 compiler and the > duplicates errors disappeared. > > The following patch works with both the gcc-4.3 and gcc-4.6 compilers. > > Beyond the duplicates, the header and libxfs files in > thexfsprogs-kernel-3.8-update patch compare to Linux 3.8 kernel code > and I consider it Reviewed-by: me. I've got an updated version of the the update that has the dir v1 removal staged before it that I've been testing the last couple of days. I'll post that later today with an updated version of your fixes and a couple of other fixes that I've been sent in the last couple of days as well... > I will do the xfsprogs-kernel-3.9-rc1-dev-update tonight. It's probably worth waiting a short while before doing that ;) > Index: b/include/xfs/project.h > =================================================================== > --- a/include/xfs/project.h > +++ b/include/xfs/project.h > @@ -20,10 +20,6 @@ > > #include <xfs/xfs.h> > > -#if !defined(__sgi__) > -typedef __uint32_t prid_t; > -#endif > - Yeah, that can go, but what it means is that the Irix build will probably now break with duplicate definitions. I don't have an Irix build environment, so somebody else is going to have to fix that if they care... > extern int setprojid(const char *__name, int __fd, prid_t __id); > extern int getprojid(const char *__name, int __fd, prid_t *__id); > > Index: b/include/xfs/xfs_dir2_format.h > =================================================================== > --- a/include/xfs/xfs_dir2_format.h > +++ b/include/xfs/xfs_dir2_format.h > @@ -40,7 +40,6 @@ > */ > typedef __uint16_t xfs_dir2_data_off_t; > #define NULLDATAOFF 0xffffU > -typedef uint xfs_dir2_data_aoff_t; /* argument form */ This file is common with the kernel code, so whatever other definition it conflicts with is the one to remove. > @@ -61,11 +60,6 @@ typedef __uint32_t xfs_dir2_dataptr_t; > typedef xfs_off_t xfs_dir2_off_t; > > /* > - * Directory block number (logical dirblk in file) > - */ > -typedef __uint32_t xfs_dir2_db_t; Same here. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 29 17:30:08 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 783707F52 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 17:30:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D9A99AC001 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 15:30:07 -0700 (PDT) X-ASG-Debug-ID: 1367274602-04cbb03c2f15ec0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ScMkvXFBvdsQhqSm for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 15:30:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhsRADzzflF5LPfu/2dsb2JhbABSgwe5bIUTBAGBBxd0gh8BAQQBJxMcIwULCAMOCgklDwUlAyETiBAFsFeOKRWNaIEdB4JuYQOXHYoMhx+DIyqBMCQ Received: from ppp121-44-247-238.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.238]) by ipmail04.adl6.internode.on.net with ESMTP; 30 Apr 2013 08:00:01 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UWwa9-0004VN-AC; Tue, 30 Apr 2013 08:30:01 +1000 Date: Tue, 30 Apr 2013 08:30:01 +1000 From: Dave Chinner <david@fromorbit.com> To: Ben Myers <bpm@sgi.com> Cc: Mark Tinguely <tinguely@sgi.com>, Eric Sandeen <sandeen@sandeen.net>, sekharan@us.ibm.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails Message-ID: <20130429223001.GC23072@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: shutdown filesystem if xfs_perag_get fails References: <51753EDE.6000301@sgi.com> <51754A13.5000808@sandeen.net> <5175532B.3050509@sgi.com> <20130422233033.GK30622@dastard> <51769111.3050103@sgi.com> <1366732475.3762.32402.camel@chandra-dt.ibm.com> <20130423204956.GM10481@dastard> <1366929706.4098.6.camel@chandra-dt.ibm.com> <517A9E12.1030907@sgi.com> <20130426160704.GF29359@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130426160704.GF29359@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: 1367274602 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129547 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 26, 2013 at 11:07:04AM -0500, Ben Myers wrote: > Hi Mark and Chandra, > > On Fri, Apr 26, 2013 at 10:32:34AM -0500, Mark Tinguely wrote: > > On 04/25/13 17:41, Chandra Seetharaman wrote: > > >In which case something along the lines of > > > > > >--- > > >diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > > >index 3806088..3fb2fa6 100644 > > >--- a/fs/xfs/xfs_mount.c > > >+++ b/fs/xfs/xfs_mount.c > > >@@ -203,7 +203,13 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t > > >agno) > > > if (pag) { > > > ASSERT(atomic_read(&pag->pag_ref)>= 0); > > > ref = atomic_inc_return(&pag->pag_ref); > > >- } > > >+ } else > > >+ /* > > >+ * xfs_perag_get() is called with invalid agno, > > >+ * which cannot happen. This indicates a problem > > >+ * in the calling code. > > >+ */ > > >+ BUG(); > > > rcu_read_unlock(); > > > trace_xfs_perag_get(mp, agno, ref, _RET_IP_); > > > return pag; > > >-------- > > > > > >would be useful ?. Since we have a NULL pag, we will trip somewhere > > >else. At least with this, there is a pointer to the debugger/sysadmin > > >about where/what to look for (may be with more valuable/correct comment > > >than above). > > > > > > > We will have to make sure the callers of xfs_perag_get() handle the NULL > > before dereferencing it. Sometimes the NULL is normal and just means the > > perag structure has not been initialize yet. > > > > Properly handling the NULL from xfs_perag_get() in the caller will also > > mean that the callers of the callers of xfs_perag_get() have to handle > > the NULL returned to them. I will come back to this once the CRC stuff > > has been put to rest. > > I agree that we want to address this. Our worst case should be a forced > shutdown, rather than a NULL ptr deref, or a BUG(). Ideally one corrupted > filesystem does not result in a full system outage, right? ;) A BUG() or null pointer deref simply segv's the current process. It doesn't cause a reboot, hang or crash dump unless the system is configured to do so. But, as I've already stated, checking the return of xfs_perag_get() is not answer to this problem - it's just a band-aid. Lots of them, and mostly unneccessary, too. We need to address the input validation problem prior to calling xfs_perag_get() to catch the error at the source, not somewhere in the downstream call chain when an invalid agno is tripped over. Indeed, the design of the code is such that the agno is *trusted* to be correct, just like we trust inode numbers coming from on-disk structures to be correct. We validate inode numbers properly, but we aren't validating block numbers returned from extent records completely. That's the source of the problem we are seeing - xfs_perag_get() returning NULL is just a symptom. Put simply: no-one should *ever* pass an invalid agno to xfs_perag_get(). > There are some others like this. e.g. xfs_da_read_buf can return 0 with a > null buffer pointer, and we rarely check for that before using bp. I've also pointed out that the case where that can occur is handled by the callers that trigger it. It does not need to be checked by every caller, because most of them can't trigger this return case. Let's not make a mountain out of a molehill.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From promo@happydiscount.net Mon Apr 29 18:31:39 2013 Return-Path: <promo@happydiscount.net> X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E975829DFA for <linux-xfs@oss.sgi.com>; Mon, 29 Apr 2013 18:31:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B6882304039 for <linux-xfs@oss.sgi.com>; Mon, 29 Apr 2013 16:31:35 -0700 (PDT) X-ASG-Debug-ID: 1367278288-04cbb03c2c199c0001-w1Z2WR Received: from apmail.digemid.minsa.gob.pe (dmail.digemid.minsa.gob.pe [190.116.33.3]) by cuda.sgi.com with ESMTP id MDi51t38WSdvszvP for <linux-xfs@oss.sgi.com>; Mon, 29 Apr 2013 16:31:29 -0700 (PDT) X-Barracuda-Envelope-From: promo@happydiscount.net X-Barracuda-Apparent-Source-IP: 190.116.33.3 Received: from happydiscount.net ([200.75.157.222]) by apmail.digemid.minsa.gob.pe with Microsoft SMTPSVC(6.0.3790.4675); Mon, 29 Apr 2013 18:28:25 -0500 Message-ID: <3820-22013412923311516@happydiscount.net> To: "Venezuela L" <promo@happydiscount.net> From: "" <promo@happydiscount.net> Subject: Viaja en baja temporada con promociones Date: Mon, 29 Apr 2013 19:01:01 -0430 X-ASG-Orig-Subj: Viaja en baja temporada con promociones MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_888214031291504723311547" X-Antivirus: avast! (VPS 130429-1, 29/04/2013), Outbound message X-Antivirus-Status: Clean X-OriginalArrivalTime: 29 Apr 2013 23:28:25.0812 (UTC) FILETIME=[3F4E1940:01CE4531] X-Barracuda-Connect: dmail.digemid.minsa.gob.pe[190.116.33.3] X-Barracuda-Start-Time: 1367278288 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 This is a multi-part message in MIME format. ------=_NextPart_888214031291504723311547 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: quoted-printable <!-- saved from url=3D(0022)http://internet=2Ee-mail --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1=2E0 Transitional//EN" "http://w= ww=2Ew3=2Eorg/TR/xhtml1/DTD/xhtml1-transitional=2Edtd"> <!-- saved from url=3D(0014)about:internet --> <html xmlns=3D"http://www=2Ew3=2Eorg/1999/xhtml"><head> <title>promorapida2</title> <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3DUTF-8"> <!--Fireworks CS3 Dreamweaver CS3 target=2E Created Wed Jan 19 11:46:43 G= MT-0400 2011--> <style type=3D"text/css"> <!-- =2EEstilo1 {font-size: 9px} --> </style> </head> <body bgcolor=3D"#ffffff"><div align=3D"center"> <p><a href=3D"http://seagatours=2Ecom/v4/index=2Ephp=3Foption=3Dcom=5Fwr= apper&amp;view=3Dwrapper&amp;Itemid=3D80" target=3D"=5Ftop">Si no puede ve= r correctamente este email haga click Aqui</a></p> <p><img name=3D"promorapida2" src=3D"cid:1925819-2201341292329535941880@= happydiscount=2Enet" id=3D"promorapida2" usemap=3D"#m=5Fpromorapida2" alt=3D= "" height=3D"2901" width=3D"498"><map name=3D"m=5Fpromorapida2" id=3D"m=5F= promorapida2"> <area shape=3D"rect" coords=3D"0,978,498,1148" href=3D"http://seagatours=2E= com/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D89= 8:tour-quinceaneras-norte-america&amp;catid=3D173:quinceaneras&amp;Itemid=3D= 141" target=3D"=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"0,1168,498,1362" href=3D"http://seagatours=2E= com/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D89= 7:tours-quinceaneras-por-europa-2014f&amp;catid=3D173:quinceaneras&amp;Ite= mid=3D141" target=3D"=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"0,1379,498,1536" href=3D"http://seagatours=2E= com/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D95= 0:mexico-2013&amp;catid=3D76:mexico-paquetes&amp;Itemid=3D103" target=3D"=5F= top" alt=3D""> <area shape=3D"rect" coords=3D"0,1537,498,1650" href=3D"http://seagatours=2E= com/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D94= 1:saint-martin-2013&amp;catid=3D160:san-martin&amp;Itemid=3D139" target=3D= "=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"0,639,363,697" href=3D"http://seagatours=2E= com/v4/trapsatur=2Ehtml" target=3D"=5Ftop" title=3D"visita www=2Eseagatour= s=2Ecom" alt=3D"visita www=2Eseagatours=2Ecom"> <area shape=3D"rect" coords=3D"3,693,361,756" href=3D"http://seagatours=2E= com/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Dsection&amp;id=3D17= &amp;Itemid=3D96" target=3D"=5Ftop" title=3D"visita www=2Eseagatours=2Ecom= " alt=3D"visita www=2Eseagatours=2Ecom"> <area shape=3D"rect" coords=3D"2,756,498,974" href=3D"http://seagatours=2E= com/v4/index=2Ephp=3Foption=3Dcom=5Fflexicontact&amp;view=3Dcontact&amp;It= emid=3D136" target=3D"=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"-1,2395,487,2548" href=3D"http://seagatours= =2Ecom/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D= 948:rio-de-janeiro-buzios-2013&amp;catid=3D87:paquetes-&amp;Itemid=3D107" = target=3D"=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"-6,2228,492,2384" href=3D"http://seagatours= =2Ecom/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D= 949:punta-cana-2013&amp;catid=3D20:republica-dominicana&amp;Itemid=3D138" = target=3D"=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"-1,2039,497,2221" href=3D"http://seagatours= =2Ecom/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D= 947:bonaire-2013&amp;catid=3D18:aruba&amp;Itemid=3D137" target=3D"=5Ftop" = alt=3D""> <area shape=3D"rect" coords=3D"-1,1843,497,2031" href=3D"http://seagatours= =2Ecom/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D= 951:inspirate-en-machu-picchu-2013&amp;catid=3D107:paquetes&amp;Itemid=3D1= 17" target=3D"=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"-1,1652,497,1843" href=3D"http://seagatours= =2Ecom/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D= 943:buenos-aires-y-bariloche-clasico&amp;catid=3D111:argentina&amp;Itemid=3D= 134" target=3D"=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"-1,425,497,590" href=3D"http://seagatours=2E= com/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D94= 5:orlando-con-auto-de-1-a-3-dias&amp;catid=3D180:florida&amp;Itemid=3D104"= target=3D"=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"-1,310,497,420" href=3D"http://seagatours=2E= com/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D94= 2:miami-de-compras-2013&amp;catid=3D180:florida&amp;Itemid=3D104" target=3D= "=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"5,2765,496,2871" href=3D"http://seagatours=2E= com/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D93= 5:copa-del-mundo-brasil-2014&amp;catid=3D92:futbol&amp;Itemid=3D84" target= =3D"=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"-1,2673,497,2762" href=3D"http://seagatours= =2Ecom/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Dcategory&amp;id=3D= 177&amp;Itemid=3D144" target=3D"=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"-6,2563,492,2671" href=3D"http://seagatours= =2Ecom/v4/index=2Ephp=3Foption=3Dcom=5Fcontent&amp;view=3Darticle&amp;id=3D= 938:margarita-2013&amp;catid=3D116:caracas-para-residentes&amp;Itemid=3D11= 9" target=3D"=5Ftop" alt=3D""> <area shape=3D"rect" coords=3D"-4,13,497,233" href=3D"http://seagatours=2E= com/" target=3D"=5Ftop" title=3D"visita www=2Eseagatours=2Ecom" alt=3D"vis= ita www=2Eseagatours=2Ecom"> </map> </p> <table style=3D"text-align: left; margin-left: auto; margin-right: auto;= " align=3D"center" border=3D"1" cellpadding=3D"0" cellspacing=3D"0" width=3D= "656"> <tbody> <tr> <td class=3D"noticias2" valign=3D"middle" width=3D"464"><div align= =3D"center"><strong><font color=3D"#3366cc" face=3D"Verdana" size=3D"1">No= se considera SPAM (Correo no Deseado) aquellos correos que tenga= n maneras de ser removidos=2E Nuestros correos pueden ser plenamen= te identificados, cualquier duda o reclamo no dude en comunicarse c= on nosotros=2E Sus requerimientos ser=C3=A1n atendidos a la breveda= d posible=2E Este correo ha llegado a usted ya que se ha inscrito en nuestro = web site o ha sido recomendado por un amigo=2E Si este correo ha lle= gado por error, haga </font><font face=3D"Verdana" size=3D"1"><span class= =3D"Estilo35 Estilo46"><a href=3D"http://www=2Ehappydiscount=2Enet/reg=2Eh= tml" target=3D"=5Fblank" onclick=3D"window=2Eopen(this=2Ehref, this=2Etarg= et, 'width=3D360,height=3D200'); return false;">click aqui</a></span></fon= t><font color=3D"#3366cc" face=3D"Verdana" size=3D"1"> para que sea elimin= ado de nuestra lista=2E&nbsp;</font></strong></div></td> <td class=3D"noticias2" valign=3D"middle" width=3D"268"><div align= =3D"center"><strong><font color=3D"#3366cc" face=3D"Verdana" size=3D"1">Co= mun=C3=ADquese con nosotros</font></strong> <p class=3D"copyright Estilo1" style=3D"margin-top: 0=2E5e= m; margin-right: 0px; margin-bottom: 0=2E5em; margin-left: 0px; overflow-x= : hidden; overflow-y: hidden; ">Direcci=C3=B3n USA:&nbsp;7215&nbsp;NW&nbsp= ;46TH&nbsp;ST,&nbsp;Miami&nbsp;-&nbsp;Florida&nbsp;33166<br> Tel=C3=A9fono: 1-305-5033992 &nbsp;</p> <p class=3D"copyright Estilo1" style=3D"margin-top: 0=2E5em; mar= gin-right: 0px; margin-bottom: 0=2E5em; margin-left: 0px; overflow-x: hidd= en; overflow-y: hidden; ">Venezuela:<br> Tel=C3=A9fono Master:&nbsp;58-212-740-6111 al&nbsp;15&nbsp;</p= > <strong><font color=3D"#3366cc"><font face=3D"Verdana" size=3D"1= ">=C2=A9 SEAGATOURS=2E 2012 Todos los derechos reservados=2E&nbsp;<br> </font></font> </strong></div></td> </tr> </tbody> </table> <p>&nbsp; </p> </div> </body></html> ------=_NextPart_888214031291504723311547 Content-Type: image/jpeg; name="promorapida2.jpg" Content-Transfer-Encoding: base64 Content-Description: promorapida2.jpg Content-Id: <1925819-2201341292329535941880@happydiscount.net> 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 aXvYaNY6sKkpVerhzOeIZbvwGEpUM5xy609/P1n7w6TU9aXvCOsNYqwDfJw5+wJbufD79wyAOZPn S39T1n7w6TV9Z+8JOr9YeFPy7cVEhWR3h45+kcELPuAxRv6nrMOk1fWl72KXq7V5Xk3u4N7h/VT4 6HCghIUoE++nv6nrP3j6TV9aXvYv779VtpTuvtwTtRu8cl4jODncrdlXM+VG/n6z94dJqetL3sYO ttW4ClX2clKSTt7y9uXz9N+RyyPTNLpE/WfvI9Kqes/ex06w1ZvH82rjuXtVnvToSN3kBuPSnv5+ s/eS6TU9aXvC+/DWAK0m83EqRt6SHzy9o/S59MeVG/qc372HSavrS97B9+Wr+Jyvc4FAwUqlu81E 45+M88Amjf1PWfvF0qr6z94X34at8Thvs/ZuCUYlvEFR+BScYPSlv5+s/eHSanrS94bmstW7OKb1 cU7PbSZDySQD0AC8fEmjfz9Zh0qp60vewvvy1aoqV8tzwcnkJT20D3HiDnjn0o39T1n7w6VV9aXv YaNY6sKkpVerhzOeIZbvwGEpUM5xy609/P1n7w6TU9aXvCOsNYqwDfJw5+wJbufD79wyAOZPnS39 T1n7w6TV9Z+8JOr9YeFPy7cVEhWR3h45+kcELPuAxRv6nrMOk1fWl72KXq7V5Xk3u4N7h/VT46HC ghIUoE++nv6nrP3j6TV9aXvYv779VtpTuvtwTtRu8cl4jODncrdlXM+VG/n6z94dJqetL3sYOttW 4ClX2clKSTt7y9uXz9N+RyyPTNLpE/WfvI9Kqes/ex06w1ZvH82rjuXtVnvToSN3kBuPSnv5+s/e S6TU9aXvC+/DWAK0m83EqRt6SHzy9o/S59MeVG/qc372HSavrS97B9+Wr+Jyvc4FAwUqlu81E45+ M88Amjf1PWfvF0qr6z94X34at8Thvs/ZuCUYlvEFR+BScYPSlv5+s/eHSanrS94bmstW7OKb1cU7 PbSZDySQD0AC8fEmjfz9Zh0qp60vewvvy1aoqV8tzwcnkJT20D3HiDnjn0o39T1n7w6VV9aXvYaN Y6sKkpVerhzOeIZbvwGEpUM5xy609/P1n7w6TU9aXvCOsNYqwDfJw5+wJbufD79wyAOZPnS39T1n 7w6TV9Z+8JOr9YeFPy7cVEhWR3h45+kcELPuAxRv6nrMOk1fWl72KXq7V5Xk3u4N7h/VT46HCghI UoE++nv6nrP3j6TV9aXvYv779VtpTuvtwTtRu8cl4jODncrdlXM+VG/n6z94dJqetL3sYOttW4Cl X2clKSTt7y9uXz9N+RyyPTNLpE/WfvI9Kqes/ex06w1ZvH82rjuXtVnvToSN3kBuPSnv5+s/eS6T U9aXvC+/DWAK0m83EqRt6SHzy9o/S59MeVG/qc372HSavrS97B9+Wr+Jyvc4FAwUqlu81E45+M88 Amjf1PWfvF0qr6z94X34at8Thvs/ZuCUYlvEFR+BScYPSlv5+s/eHSanrS94bmstW7OKb1cU7PbS ZDySQD0AC8fEmjfz9Zh0qp60vewvvy1aoqV8tzwcnkJT20D3HiDnjn0o39T1n7w6VV9aXvZ6figK isqVzUUJJJ8+VelXA9fHgeSglSQ31zjanlhXXr59MeZ5V5U8UGtkpbKSCPZ3buXhxnG45JI2+XIU WCwGwndsbzgJOcnOevknPPn8fhQCEp3klOBtR4dmAPCrHkeXUUATMKGrNBp55AjAZ68rq/j1q+Pp 0/Z/mZ9w8iv/AN36/wD9X/IijixO2p9R3pv7YPIbu/CujLOufxPls94vW+JYactmpBrqzKva5Rlo nRSrvZXxdqXUkZ4nixVKn11fjdGdVP3iTve6M49/yKuH/eduz/eJp51nwXoy9n5n17/ab6ND+/8A +JbWVajDbIAUpH4NRJCcnAJwPKqqvE+I1uJOaDxVwG2ypxxRwASOZ9QOfTGOQqpFK5FgY1un6qlw 5Cki3WmMLPHc6I71IV3ffzz/ANIfde+ArXCmp1LdkVb9e27PuFGr5m2PQt9pVqRm1zWkvko38WZe S4/8hxHSCmTZpK4bwOdwakbnG/3rqHd37oUUtadu2Jxv9o2z1v44mOsa0ePev6WNFYo/eIrzwiv3 B6OwFx4MYlLzhLqEnol4nakk/VVUIe08JsLZlLF4pUqtRUoNPrPst4teHEdU1MS2rdoq7BGPESt3 on3mL5YzUsn8kv17D3v7A7N//PYf9v8ArFWF22XeDcXYlnll2E23wWES0qL63HAgtjLHtBsrX5nA opRU07Renf8A0KdpeQOEwdSnCpiLKpfXLwsvHtehUxZNzm6m1HmzPyH7jx++wGVbXWMzG3leItr9 lxAQcp86VOUnUl1b37Pae+27svDV9mUqNSsoUlktO3pWi7aX7eJLNq4Vwg26Ky7HmzYilyo0txKj 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 ------=_NextPart_888214031291504723311547-- From jeff.liu@oracle.com Mon Apr 29 21:11:48 2013 Return-Path: <jeff.liu@oracle.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 38F0A29DFA for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 21:11:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 277CD304081 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 19:11:45 -0700 (PDT) X-ASG-Debug-ID: 1367287903-04cbb03c2f23e70001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id tqKxCqLEQMu4aqzu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Mon, 29 Apr 2013 19:11:43 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r3U2BfR4006407 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Apr 2013 02:11:42 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3U2BfWc001854 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 30 Apr 2013 02:11:42 GMT Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3U2Bfie002735; Tue, 30 Apr 2013 02:11:41 GMT Received: from [192.168.1.102] (/114.248.195.99) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 29 Apr 2013 19:11:41 -0700 Message-ID: <517F2858.70004@oracle.com> Date: Tue, 30 Apr 2013 10:11:36 +0800 From: Jeff Liu <jeff.liu@oracle.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Mark Tinguely <tinguely@sgi.com> CC: "xfs@oss.sgi.com" <xfs@oss.sgi.com> Subject: Re: [PATCH] xfs: Don't keep silent if sunit/swidth can not be changed via mount References: <517E5D12.5010809@oracle.com> <517E88E6.9070709@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: Don't keep silent if sunit/swidth can not be changed via mount In-Reply-To: <517E88E6.9070709@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1367287903 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129561 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/29/2013 10:51 PM, Mark Tinguely wrote: > On 04/29/13 06:44, Jeff Liu wrote: >> From: Jie Liu<jeff.liu@oracle.com> >> >> As per the mount man page, sunit and swidth can be changed via >> mount options. For XFS, on the face of it, those options seems >> works if the specified alignments is properly, e.g. >> # mount -o sunit=4096,swidth=8192 /dev/sdb1 /mnt >> # mount | grep sdb1 >> /dev/sdb1 on /mnt type xfs (rw,sunit=4096,swidth=8192) >> >> However, neither sunit nor swidth is shown from the xfs_info output. >> # xfs_info /mnt >> meta-data=/dev/sdb1 isize=256 agcount=4, agsize=262144 blks >> = sectsz=512 attr=2 >> data = bsize=4096 blocks=1048576, imaxpct=25 >> = sunit=0 swidth=0 blks >> ^^^^^^^^^^^^^^^^^^^^^^^^^^ >> naming =version 2 bsize=4096 ascii-ci=0 >> log =internal bsize=4096 blocks=2560, version=2 >> = sectsz=512 sunit=0 blks, lazy-count=1 >> realtime =none extsz=4096 blocks=0, rtextents=0 >> >> The reason is that the alignment can only be changed if the relevant >> super block is already configured with alignments, otherwise, the >> given value will be silently ignored, so it's better to tell user >> that the alignment-changing can not take affect in one way or another. >> >> With this fix, the attempt to mount a storage without strip alignment >> setup on super block will failed if XFS_MOUNT_RETERR is enabled, or >> just ignore the given alignment and drop a warning to indicate the >> cause in syslog. >> >> # mount -o sunit=4096,swidth=8192 /dev/sdb1 /mnt >> mount: wrong fs type, bad option, bad superblock on /dev/sdb1, >> missing codepage or helper program, or other error >> In some cases useful info is found in syslog - try >> dmesg | tail or so >> >> # dmesg|tail >> ....... >> XFS (sdb1): can not change alignment: no data alignment on superblock >> >> Signed-off-by: Jie Liu<jeff.liu@oracle.com> >> >> --- >> fs/xfs/xfs_mount.c | 7 +++++++ >> 1 file changed, 7 insertions(+) >> >> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c >> index 3806088..bc7fdd4 100644 >> --- a/fs/xfs/xfs_mount.c >> +++ b/fs/xfs/xfs_mount.c >> @@ -924,6 +924,13 @@ xfs_update_alignment(xfs_mount_t *mp) >> sbp->sb_width = mp->m_swidth; >> mp->m_update_flags |= XFS_SB_WIDTH; >> } >> + } else { >> + xfs_warn(mp, "can not change alignment: " >> + "no data alignment on superblock"); > suggest that you keep the string together so it can be searched. > "superblock does not support data alignment" Do you means that the string would shown as: "superblock does not support data alignment"? Or "cannot change alignment: superblock does not support data alignment"? I prefer to the later format because it can distinguish this special case from the previous alignment validation procedure, i.e, "alignment check failed: xxx". Thanks, -Jeff > >> + if (mp->m_flags& XFS_MOUNT_RETERR) >> + return XFS_ERROR(EINVAL); >> + mp->m_dalign = 0; >> + mp->m_swidth = 0; >> } >> } else if ((mp->m_flags& XFS_MOUNT_NOALIGN) != XFS_MOUNT_NOALIGN&& >> xfs_sb_version_hasdalign(&mp->m_sb)) { > > > Thanks, > > --Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From david@fromorbit.com Tue Apr 30 01:19:06 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 446AD29DFA for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 01:19:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E06DDAC001 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 23:19:02 -0700 (PDT) X-ASG-Debug-ID: 1367302740-04cbb03c2e35190001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Co3AxQSgu6I5JcO2 for <xfs@oss.sgi.com>; Mon, 29 Apr 2013 23:19:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhERAFZhf1F5LE2O/2dsb2JhbABSgweDBLZrhRkEAYEHF3SCHwEBBTocIxAIAw4HAwklDwUNGAMhE4gEAw6wNIY+DYgIFYwvgTmBHQeCbmEDlTqBY4oMggCFH4MjKg Received: from ppp121-44-77-142.lns20.syd6.internode.on.net (HELO dastard) ([121.44.77.142]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Apr 2013 15:49:00 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UX3tw-0005I2-NQ; Tue, 30 Apr 2013 16:18:56 +1000 Date: Tue, 30 Apr 2013 16:18:56 +1000 From: Dave Chinner <david@fromorbit.com> To: Ben Myers <bpm@sgi.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 24/22] xfs: Teach dquot recovery about CONFIG_XFS_QUOTA Message-ID: <20130430061856.GE23072@dastard> X-ASG-Orig-Subj: Re: [PATCH 24/22] xfs: Teach dquot recovery about CONFIG_XFS_QUOTA References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <20130409073322.GJ17758@dastard> <20130427204415.GJ29359@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130427204415.GJ29359@sgi.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: 1367302740 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_SA620b Custom Rule SA620b On Sat, Apr 27, 2013 at 03:44:15PM -0500, Ben Myers wrote: > Hey, > > On Tue, Apr 09, 2013 at 05:33:22PM +1000, Dave Chinner wrote: > > From: Dave Chinner <dchinner@redhat.com> > > > > Fix a build error when CONFIG_XFS_QUOTA=n: > > > > fs/built-in.o: In function `xlog_recovery_validate_buf_type': > > /home/dave/src/build/x86-64/xfsdev/fs/xfs/xfs_log_recover.c:1948: undefined > > reference to `xfs_dquot_buf_ops' > > > > Reported-by: Michael L. Semon <mlsemon35@gmail.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > > This one didn't want to apply cleanly for some reason. Will give it a closer > look in coming days. Strange, my local copy applied cleanly to the updated tree. I'll repost it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 30 02:20:40 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 46D367F37 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 02:20:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0A7D7304043 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:20:36 -0700 (PDT) X-ASG-Debug-ID: 1367306433-04bdf077c93a0c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id wUmESf7XNTDWzBrc for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:20:34 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhIRAFlvf1F5LE2O/2dsb2JhbABICoMHgwS2a4UZBAGBBRd0gh8BAQQBJxMcIwULCAMOBwMJJQ8FJQMhE4gQBbAyjlkVjUkEG4EdB4JuYQOXHZErgyMqgS4 Received: from ppp121-44-77-142.lns20.syd6.internode.on.net (HELO dastard) ([121.44.77.142]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Apr 2013 16:50:32 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UX4rW-0005P1-2c; Tue, 30 Apr 2013 17:20:30 +1000 Date: Tue, 30 Apr 2013 17:20:30 +1000 From: Dave Chinner <david@fromorbit.com> To: Ben Myers <bpm@sgi.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 18/22] xfs: add CRC protection to remote attributes Message-ID: <20130430072030.GF23072@dastard> X-ASG-Orig-Subj: Re: [PATCH 18/22] xfs: add CRC protection to remote attributes References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-19-git-send-email-david@fromorbit.com> <20130425185605.GE29359@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130425185605.GE29359@sgi.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: 1367306433 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129583 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 25, 2013 at 01:56:05PM -0500, Ben Myers wrote: > On Wed, Apr 03, 2013 at 04:11:28PM +1100, Dave Chinner wrote: > > From: Dave Chinner <dchinner@redhat.com> > > > > There are two ways of doing this - the first is to add a CRC to the > > remote attribute entry in the attribute block. The second is to > > treat them similar to the remote symlink, where each fragment has > > it's own header and identifies fragment location in the attribute. > > > > The problem with the CRC in the remote attr entry is that we cannot > > identify the owner of the metadata from the metadata blocks > > themselves, or where the blocks fit into the remote attribute. The > > down side to this approach is that we never know when the attribute > > has been read from disk or not and so we have to verify it every > > time it is read, and we must calculate it during the create > > transaction and log it. We do not log CRCs for any other metadata, > > and so this creates a unique set of coherency problems that, in > > general, are best avoided. > > > > Adding an identifying header to each allocated block allows us to > > identify each fragment and where in the attribute it is located. It > > enables us to rebuild the remote attribute from just the raw blocks > > containing the attribute. It also provides us to do per-block CRCs > > verification at IO time rather than during the transaction context > > that creates it or every time it is read into a user buffer. Hence > > it avoids all the problems that an external, logged CRC has, and > > provides all the benefits of self identifying metadata. > > > > The only complexity is that we have to add a header per fragment, > > and we don't know how many fragments will be needed prior to > > allocations. If we take the symlink example, the header is 56 bytes > > and hence for a 4k block size filesystem, in the worst case 16 > > headers requires 1 extra block for the 64k attribute data. For 512 > > byte filesystems the worst case is an extra block for every 9 > > fragments (i.e. 16 extra blocks in the worse case). This will be > > very rare and so it's not really a major concern. > > > > Because allocation is done in two steps - the first finds a hole > > large enough in the attribute file, the second does the allocation - > > we only need to find a hole big enough for a worst case allocation. > > We only need to allocate enough extra blocks for number of headers > > required by the fragments, and we can calculate that as we go.... > > > > Hence it really only makes sense to use the same model as for > > symlinks - it doesn't add that much complexity, does not require an > > attribute tree format change, and does not require logging > > calculated CRC values. > > > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > > Comments below. > > > --- > > fs/xfs/xfs_attr_remote.c | 324 ++++++++++++++++++++++++++++++++++++++-------- > > fs/xfs/xfs_attr_remote.h | 19 +++ > > 2 files changed, 292 insertions(+), 51 deletions(-) > > > > diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c > > index d0d67e9..53da46b 100644 > > --- a/fs/xfs/xfs_attr_remote.c > > +++ b/fs/xfs/xfs_attr_remote.c > > @@ -1,5 +1,6 @@ > > /* > > * Copyright (c) 2000-2005 Silicon Graphics, Inc. > > + * Copyright (c) 2013 Red Hat, Inc. > > * All Rights Reserved. > > * > > * This program is free software; you can redistribute it and/or > > @@ -37,63 +38,232 @@ > > #include "xfs_attr_remote.h" > > #include "xfs_trans_space.h" > > #include "xfs_trace.h" > > - > > +#include "xfs_cksum.h" > > +#include "xfs_buf_item.h" > > > > #define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ > > > > /* > > + * Each contiguous block has a header, so it is not just a simple attribute > > + * length to FSB conversion. > > + */ > > +static int > > +xfs_attr3_rmt_blocks( > > + struct xfs_mount *mp, > > + int attrlen) > > +{ > > + int fsblocks = 0; > > + int len = attrlen; > > + > > + do { > > + fsblocks++; > > + len -= XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize); > > + } while (len > 0); > > + > > + return fsblocks; > > +} > > The loop seems like overkill. I think this can be calculated without looping. Possibly, but the loop is obviously correct. The issue is that XFS_ATTR3_RMT_BUF_SPACE() returns different lengths depending on the crc version. Perhaps this could be done with division instead, but it's far from a critial performance path so I haven't spend any time trying to optimise it. I think: buflen = XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize); fsblocks = (attrlen + buflen - 1) / buflen; should give the right value. Fixed. > > +static bool > > +xfs_attr3_rmt_verify( > > + struct xfs_buf *bp) > > +{ > > + struct xfs_mount *mp = bp->b_target->bt_mount; > > + struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; > > + > > + if (!xfs_sb_version_hascrc(&mp->m_sb)) > > + return false; > > + if (rmt->rm_magic != cpu_to_be32(XFS_ATTR3_RMT_MAGIC)) > > + return false; > > + if (!uuid_equal(&rmt->rm_uuid, &mp->m_sb.sb_uuid)) > > + return false; > > + if (bp->b_bn != be64_to_cpu(rmt->rm_blkno)) > > + return false; > > + if (be32_to_cpu(rmt->rm_offset) + > > + be32_to_cpu(rmt->rm_bytes) >= MAXPATHLEN) > > + return false; > > Why are we limited to 1024 bytes here? Copy and paste error, I think. it was copied from the remote symlink code. Should be XATTR_SIZE_MAX (64k). Fixed. > > > + if (rmt->rm_owner == 0) > > + return false; > > Under what circumstances is the owner 0? Never. Hence owner == 0 means the block is corrupted.... > > +static void > > +xfs_attr3_rmt_write_verify( > > + struct xfs_buf *bp) > > +{ > > + struct xfs_mount *mp = bp->b_target->bt_mount; > > + struct xfs_buf_log_item *bip = bp->b_fspriv; > > + > > + /* no verification of non-crc buffers */ > > + if (!xfs_sb_version_hascrc(&mp->m_sb)) > > + return; > > + > > + if (!xfs_attr3_rmt_verify(bp)) { > > + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); > > + xfs_buf_ioerror(bp, EFSCORRUPTED); > > + return; > > + } > > + > > + if (bip) { > > + struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; > > + rmt->rm_lsn = cpu_to_be64(bip->bli_item.li_lsn); > > + } > > + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), > > + XFS_ATTR3_RMT_CRC_OFF); > > Should the checksum update be inside the conditional? If CRCs aren't enabled, we don't get past the first check. Otherwise we'll always calculate them. > > - xfs_buf_iomove(bp, 0, tmp, dst, XBRW_READ); > > + src = bp->b_addr; > > + if (xfs_sb_version_hascrc(&mp->m_sb)) { > > + if (!xfs_attr3_rmt_hdr_ok(mp, args->dp->i_ino, > > + offset, byte_cnt, bp)) { > > + xfs_alert(mp, > > +"remote attribute header does not match required off/len/owner (0x%x/Ox%x,0x%llx)", > > + offset, byte_cnt, args->dp->i_ino); > > + xfs_buf_relse(bp); > > + return EFSCORRUPTED; > > + > > + } > > + > > + src += sizeof(struct xfs_attr3_rmt_hdr); > > + } > > + > > + memcpy(dst, src, byte_cnt); > > Not really comfortable with that yet, I'd rather stick with xfs_buf_iomove at this point. xfs_buf_iomove() is only necessary for unmapped buffers. We are using mapped buffers here, so xfs_buf_iomove() is unnecessary as we are guaranteed to have a contiguous buffer to manipulate at bp->b_addr. The above code is exactly the same as what we do all through the directory code.... FWIW, the only place that xfs_buf_iomove() is actually used is in xfs_attr_rmtval_get(), xfs_attr_rmtval_set(), and xfs_buf_zero(), so I plan to get rid of it soon and just leave xfs_buf_zero() behind... > > @@ -170,6 +356,27 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) > > (map.br_startblock != HOLESTARTBLOCK)); > > lblkno += map.br_blockcount; > > blkcnt -= map.br_blockcount; > > + hdrcnt++; > > + > > + /* > > + * If we have enough blocks for the attribute data, calculate > > + * how many extra blocks we need for headers. We might run > > + * through this multiple times in the case that the additional > > + * headers in the blocks needed for the data fragments spills > > + * into requiring more blocks. e.g. for 512 byte blocks, we'll > > + * spill for another block every 9 headers we require in this > > + * loop. > > + */ > > + > > + if (crcs && blkcnt == 0) { > > + int total_len; > > + > > + total_len = args->valuelen + > > + hdrcnt * sizeof(struct xfs_attr3_rmt_hdr); > > + blkcnt = XFS_B_TO_FSB(mp, total_len); > > + blkcnt -= args->rmtblkcnt; > > + args->rmtblkcnt += blkcnt; > > + } > > It might be better if you are optimistic here, and assume that you need only > one header before attempting the allocation. Then if you find that you got > less than the number of blocks you requested due to fragmentation, try again, > assuming that you need one additional header due to that allocation. That's exactly what the code does. It finds a hole in the extent map large enough for worse case fragmentation (xfs_attr3_rmt_blocks()), then resets the block count to the best case (single header, single extent) for the first allocation. The above code only triggers when we don't get an allocation big enough to fit the optimistic case, so then we go around the loop again after incrementing the required header count by one and recalculating the remaining number of blocks required for the next allocation. > > @@ -188,7 +395,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) > > lblkno = args->rmtblkno; > > valuelen = args->valuelen; > > while (valuelen > 0) { > > - int buflen; > > + int byte_cnt; > > + char *buf; > > > > /* > > * Try to remember where we decided to put the value. > > @@ -210,24 +418,38 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) > > bp = xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, 0); > > if (!bp) > > return ENOMEM; > > + bp->b_ops = &xfs_attr3_rmt_buf_ops; > > + > > + byte_cnt = BBTOB(bp->b_length); > > + byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, byte_cnt); > > + if (valuelen < byte_cnt) { > > + byte_cnt = valuelen; > > + } > > In the case where you have a buffer that is less than the length of the > attribute, due to fragmentation, this seems like it will memcpy off the end of > the buffer. bytecnt is the space available in the destination buffer and valuelen is the remaining number of bytes in the source buffer. it only ever reduces the byte count if the source is smaller than the destination. IOWs, the destination buffer can never be overrun.... > tmp = min_t(int, valuelen, buflen); Which is functionally identical to the above code.... > > + > > + buf = bp->b_addr; > > + buf += xfs_attr3_rmt_hdr_set(mp, dp->i_ino, offset, > > + byte_cnt, bp); > > + memcpy(buf, src, byte_cnt); > > > > - buflen = BBTOB(bp->b_length); > > - tmp = min_t(int, valuelen, buflen); > > - xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); > > Just stick with xfs_buf_iomove. See my comments about that above.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 30 02:29:02 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 53BF37F3F for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 02:29:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DBA29AC001 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:28:58 -0700 (PDT) X-ASG-Debug-ID: 1367306936-04cbb03c2f38e70001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 2nvmdOG27dsgImFc for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:28:56 -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: AhERALpxf1F5LE2O/2dsb2JhbABSgweDBLZrhRkEAYEFF3SCHwEBBScTHCMQCAMOBwMJJQ8FJQMhE4gVsDOOWRWNaIEdB4NPA5cdkSuDIyqBMCQ Received: from ppp121-44-77-142.lns20.syd6.internode.on.net (HELO dastard) ([121.44.77.142]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Apr 2013 16:58:55 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UX4zf-0005Pv-Gb; Tue, 30 Apr 2013 17:28:55 +1000 Date: Tue, 30 Apr 2013 17:28:55 +1000 From: Dave Chinner <david@fromorbit.com> To: Ben Myers <bpm@sgi.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 19/22] xfs: add buffer types to directory and attribute buffers Message-ID: <20130430072855.GG23072@dastard> X-ASG-Orig-Subj: Re: [PATCH 19/22] xfs: add buffer types to directory and attribute buffers References: <1364965892-19623-1-git-send-email-david@fromorbit.com> <1364965892-19623-20-git-send-email-david@fromorbit.com> <20130426190953.GH29359@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130426190953.GH29359@sgi.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: 1367306936 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129583 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 26, 2013 at 02:09:53PM -0500, Ben Myers wrote: > Hi Dave, > > On Wed, Apr 03, 2013 at 04:11:29PM +1100, Dave Chinner wrote: > > From: Dave Chinner <dchinner@redhat.com> > > > > Add buffer types to the buffer log items so that log recovery can > > validate the buffers and calculate CRCs correctly after the buffers > > are recovered. > > > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > > Comments below. ..... > > + struct xfs_da_blkinfo *info = (*bpp)->b_addr; > > + int type; > > + > > + switch (be16_to_cpu(info->magic)) { > > + case XFS_DA3_NODE_MAGIC: > > + case XFS_DA_NODE_MAGIC: > > Nit: > case XFS_DA_NODE_MAGIC: > case XFS_DA3_NODE_MAGIC: Fixed. > > + case XFS_ATTR3_LEAF_MAGIC: > > + type = XFS_BLF_ATTR_LEAF_BUF; > > + break; > > + case XFS_DIR2_LEAFN_MAGIC: > > + case XFS_DIR3_LEAFN_MAGIC: > > + type = XFS_BLF_DIR_LEAFN_BUF; > > + break; > > + default: > > + type = 0; > > + ASSERT(0); > > + break; > > Would some kind of shutdown be desireable here? Maybe not. We've already run the buffer verification callbacks at this point, so if the magic number is not one of the types in the above case statement then we should have an EFSCORRUPTED error and no buffer. It's a "can't happen" case, and hence the assert. If it happens on a production system, then we don't know what the type is so just let it go so the caller can fail the buffer appropriately.... > > @@ -2004,19 +1960,169 @@ xlog_recover_do_reg_buffer( > > bp->b_ops = &xfs_inode_buf_ops; > > break; > > case XFS_BLF_SYMLINK_BUF: > > - if (*(__be32 *)bp->b_addr != cpu_to_be32(XFS_SYMLINK_MAGIC)) { > > + if (magic32 != XFS_SYMLINK_MAGIC) { > > xfs_warn(mp, "Bad symlink block magic!"); > > ASSERT(0); > > break; > > } > > bp->b_ops = &xfs_symlink_buf_ops; > > break; > > ... > > > + case XFS_BLF_ATTR_RMT_BUF: > > + if (!xfs_sb_version_hascrc(&mp->m_sb)) > > + break; > > + if (magicda != XFS_ATTR3_RMT_MAGIC) { > magic32 > > The new remote attribute header has magic at offset 0. Good catch. Fixed. > > +STATIC void > > +xlog_recover_do_reg_buffer( > > + struct xfs_mount *mp, > > + xlog_recover_item_t *item, > > + struct xfs_buf *bp, > > + xfs_buf_log_format_t *buf_f) > > +{ > > ... > > > + /* Shouldn't be any more regions */ > > + ASSERT(i == item->ri_total); > > + > > + xlog_recovery_validate_buf_type(mp, bp, buf_f); > > + > > Extra line. Fixed. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 30 02:37:04 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 499737F53 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 02:37:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E23E9AC002 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:37:03 -0700 (PDT) X-ASG-Debug-ID: 1367307421-04cb6c66e33a6c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id GwCUHFH2pxdaPADX for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:37:02 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhERADl0f1F5LE2O/2dsb2JhbABSgweDBLZrhRkEAYEDF3SCHwEBBScTHCMQCAMVAwklDwUlAyETiBWwRI5ZFY1ZD4EdB4NPA5cdkSuDIyqBLw Received: from ppp121-44-77-142.lns20.syd6.internode.on.net (HELO dastard) ([121.44.77.142]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Apr 2013 17:07:00 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UX57T-0005Qp-KX; Tue, 30 Apr 2013 17:36:59 +1000 Date: Tue, 30 Apr 2013 17:36:59 +1000 From: Dave Chinner <david@fromorbit.com> To: Jeff Liu <jeff.liu@oracle.com> Cc: "xfs@oss.sgi.com" <xfs@oss.sgi.com> Subject: Re: [PATCH] xfs: Don't keep silent if sunit/swidth can not be changed via mount Message-ID: <20130430073659.GH23072@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Don't keep silent if sunit/swidth can not be changed via mount References: <517E5D12.5010809@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <517E5D12.5010809@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1367307421 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129583 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 29, 2013 at 07:44:18PM +0800, Jeff Liu wrote: > From: Jie Liu <jeff.liu@oracle.com> > > As per the mount man page, sunit and swidth can be changed via > mount options. For XFS, on the face of it, those options seems > works if the specified alignments is properly, e.g. > # mount -o sunit=4096,swidth=8192 /dev/sdb1 /mnt > # mount | grep sdb1 > /dev/sdb1 on /mnt type xfs (rw,sunit=4096,swidth=8192) > > However, neither sunit nor swidth is shown from the xfs_info output. > # xfs_info /mnt > meta-data=/dev/sdb1 isize=256 agcount=4, agsize=262144 blks > = sectsz=512 attr=2 > data = bsize=4096 blocks=1048576, imaxpct=25 > = sunit=0 swidth=0 blks > ^^^^^^^^^^^^^^^^^^^^^^^^^^ > naming =version 2 bsize=4096 ascii-ci=0 > log =internal bsize=4096 blocks=2560, version=2 > = sectsz=512 sunit=0 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > > The reason is that the alignment can only be changed if the relevant > super block is already configured with alignments, otherwise, the > given value will be silently ignored, so it's better to tell user > that the alignment-changing can not take affect in one way or another. > > With this fix, the attempt to mount a storage without strip alignment > setup on super block will failed if XFS_MOUNT_RETERR is enabled, or > just ignore the given alignment and drop a warning to indicate the > cause in syslog. > > # mount -o sunit=4096,swidth=8192 /dev/sdb1 /mnt > mount: wrong fs type, bad option, bad superblock on /dev/sdb1, > missing codepage or helper program, or other error > In some cases useful info is found in syslog - try > dmesg | tail or so > > # dmesg|tail > ....... > XFS (sdb1): can not change alignment: no data alignment on superblock > > Signed-off-by: Jie Liu <jeff.liu@oracle.com> > > --- > fs/xfs/xfs_mount.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 3806088..bc7fdd4 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -924,6 +924,13 @@ xfs_update_alignment(xfs_mount_t *mp) > sbp->sb_width = mp->m_swidth; > mp->m_update_flags |= XFS_SB_WIDTH; > } > + } else { > + xfs_warn(mp, "can not change alignment: " > + "no data alignment on superblock"); > + if (mp->m_flags & XFS_MOUNT_RETERR) > + return XFS_ERROR(EINVAL); > + mp->m_dalign = 0; > + mp->m_swidth = 0; Can someone tell me why the XFS_MOUNT_RETERR flag exists? It looks like dead code to me as the only time mp->m_dalign is set prior to calling xfs_update_alignment() is the same code that sets XFS_MOUNT_RETERR in xfs_parseargs(). IOWs, any time we enter this "if (mp->m_dalign)" branch in xfs_update_alignment(), XFS_MOUNT_RETERR is going to be set and so we should always be emitting a warning and returning an error. If this is correct, Jeff, can you remove the XFS_MOUNT_RETERR flag and get rid of all the dead code in xfs_update_alignment() at the same time, please? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 30 02:38:37 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0D0FD7F50 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 02:38:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A1DCBAC002 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:38:36 -0700 (PDT) X-ASG-Debug-ID: 1367307514-04cb6c66e33a820001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id AduImKgZcCzNDmnR for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:38:34 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhERADl0f1F5LE2O/2dsb2JhbABSgweDBLZrhRkEAYEDF3SCHwEBBScTHCMQCAMOCgklDwUlAyETiBWwRI5ZFY1ogR0Hg08Dlx2RK4MjKoEuIw Received: from ppp121-44-77-142.lns20.syd6.internode.on.net (HELO dastard) ([121.44.77.142]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Apr 2013 17:08:33 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UX58z-0005RB-8w; Tue, 30 Apr 2013 17:38:33 +1000 Date: Tue, 30 Apr 2013 17:38:33 +1000 From: Dave Chinner <david@fromorbit.com> To: Josef Bacik <jbacik@fusionio.com> Cc: linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfstests 311: test fsync with dm flakey V3 Message-ID: <20130430073833.GI23072@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests 311: test fsync with dm flakey V3 References: <1367003639-17621-1-git-send-email-jbacik@fusionio.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1367003639-17621-1-git-send-email-jbacik@fusionio.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: 1367307514 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129583 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 26, 2013 at 03:13:59PM -0400, Josef Bacik wrote: > This test sets up a dm flakey target and then runs my fsync tester I've been > using to verify btrfs's fsync() is working properly. It will create a dm flakey > device, mount it, run my test, make the flakey device start dropping writes, and > then unmount the fs. Then we mount it back up and make sure the md5sums match > and then run fsck on the device to make sure we got a consistent fs. I used the > output from a run on BTRFS since it's the only one that passes this test > properly. I verified each test manually to make sure they were in fact valid > files. XFS and Ext4 both fail this test in one way or another. Thanks, > > Signed-off-by: Josef Bacik <jbacik@fusionio.com> > --- > V2->V3: > -encorporate all of Dave Chinners feedback > -expand the testing to run the tests with normal dmsetup suspend and with > --nolockfs I haven't tested the new version yet, but all the changes I asked for look good now. Acked-by: Dave Chinner <dchinner@redhat.com> Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 30 02:41:20 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BA2C07F55 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 02:41:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5BA0DAC001 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:41:20 -0700 (PDT) X-ASG-Debug-ID: 1367307678-04cbb03c2f39940001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id mvlYqaVqkzvqODON for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:41:18 -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: AhARAC91f1F5LE2O/2dsb2JhbABSgweDBLZrhRkEAYEBF3SCHwEBBTocIxAIAxgJJQ8FJQMhE4gVsEyOWRWNaIEdB4NPA5cdkSuDIyo Received: from ppp121-44-77-142.lns20.syd6.internode.on.net (HELO dastard) ([121.44.77.142]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Apr 2013 17:10:52 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UX5BE-0005RQ-3H; Tue, 30 Apr 2013 17:40:52 +1000 Date: Tue, 30 Apr 2013 17:40:52 +1000 From: Dave Chinner <david@fromorbit.com> To: Eric Sandeen <sandeen@sandeen.net> Cc: Eric Sandeen <sandeen@redhat.com>, xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH V2] xfstests generic/306 fixes and updates Message-ID: <20130430074052.GJ23072@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfstests generic/306 fixes and updates References: <517AD562.3060208@redhat.com> <517E9B52.7030008@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <517E9B52.7030008@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1367307678 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129583 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Mon, Apr 29, 2013 at 11:09:54AM -0500, Eric Sandeen wrote: > older xfs_io refused to write to /dev/null because it's > not a file on an xfs filesystem. So add -F. You could just do: export XFS_IO_PROG="$XFS_IO_PROG -F" and not have to change so much of the test. And with a comment it would make it obvious to a future ready why the -F flag is used ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 30 02:43:52 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 18E557F4E for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 02: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 048E5304039 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:43:51 -0700 (PDT) X-ASG-Debug-ID: 1367307830-04cb6c66e33ad80001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id jI3DaGiNO3EZFE8U for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:43:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhARAC91f1F5LE2O/2dsb2JhbABSgweDBLZrhRkEAYEBF3SCHwEBBTocIxAIAxgJJQ8FJQMhE4gVsEyOWRWNaIEdB4NPA5cdkSuDIyo Received: from ppp121-44-77-142.lns20.syd6.internode.on.net (HELO dastard) ([121.44.77.142]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Apr 2013 17:13:49 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UX5E5-0005S9-1s; Tue, 30 Apr 2013 17:43:49 +1000 Date: Tue, 30 Apr 2013 17:43:49 +1000 From: Dave Chinner <david@fromorbit.com> To: Eric Sandeen <sandeen@redhat.com> Cc: xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH] xfstests shared/298: various fixes Message-ID: <20130430074348.GK23072@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests shared/298: various fixes References: <517AE12C.2050902@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <517AE12C.2050902@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1367307830 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129583 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 26, 2013 at 03:18:52PM -0500, Eric Sandeen wrote: > fix shared/298: > > * don't include common/config, not needed and breaks > stuff when $SCRATCH_DEV_POOL is defined: > Error: $SCRATCH_DEV should be unset when $SCRATCH_DEV_POOL is set > * make sure xfs_io has fiemap, we'll need it > * add -F to the xfs_io invocation, again What's it needed for this time? > * ignore ENOSPC errors from "garbage" loop; the only goal > is to fill it, ENOSPC doesn't matter. > > Signed-off-by: Eric Sandeen <sandeen@redhat.com> > --- > > Wondering if we should just add " -F" to $XFS_IO_PROG . . . > > diff --git a/tests/shared/298 b/tests/shared/298 > index f1a3432..e2eddda 100755 > --- a/tests/shared/298 > +++ b/tests/shared/298 > @@ -28,12 +28,12 @@ echo "QA output created by $seq" > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > > -. common/config > . common/rc > > _supported_fs ext4 xfs > _supported_os Linux > _require_fstrim > +_require_xfs_io_fiemap > _require_fs_space $TEST_DIR 307200 > [ "$FSTYP" = "ext4" ] && _require_dumpe2fs > > @@ -49,7 +49,7 @@ _cleanup() > > get_holes() > { > - $XFS_IO_PROG -c fiemap $1 | grep hole | $SED_PROG 's/.*\[\(.*\)\.\.\(.*\)\].*/\1 \2/' > + $XFS_IO_PROG -F -c fiemap $1 | grep hole | $SED_PROG 's/.*\[\(.*\)\.\.\(.*\)\].*/\1 \2/' > } > > get_free_sectors() > @@ -136,9 +136,10 @@ $MKFS_PROG -t $FSTYP $MKFS_OPTIONS $loop_dev &> /dev/null > $MOUNT_PROG $loop_dev $loop_mnt > > echo -n "Generating garbage on loop..." > +# Goal is to fill it up, ignore any errors. > for i in `seq 1 10`; do > - mkdir $loop_mnt/$i > - cp -r $here/* $loop_mnt/$i > + mkdir $loop_mnt/$i &> /dev/null > + cp -r $here/* $loop_mnt/$i &> /dev/null Can you break out of the loop once cp fails with an error? There's no point hammering the filesystem for several loops after the first ENOSPC occurs.... -Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Tue Apr 30 02:55:22 2013 Return-Path: <jeff.liu@oracle.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 473517F5A for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 02:55:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0ACCE8F8035 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:55:19 -0700 (PDT) X-ASG-Debug-ID: 1367308517-04bdf077c63bce0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id vj2FtDb4VYdOkoCI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 00:55:17 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r3U7tFxg009322 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Apr 2013 07:55:15 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3U7tEum023301 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 30 Apr 2013 07:55:14 GMT Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3U7tDVY020263; Tue, 30 Apr 2013 07:55:13 GMT Received: from [192.168.1.102] (/221.223.96.216) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 30 Apr 2013 00:55:13 -0700 Message-ID: <517F78D2.5020503@oracle.com> Date: Tue, 30 Apr 2013 15:54:58 +0800 From: Jeff Liu <jeff.liu@oracle.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com> CC: "xfs@oss.sgi.com" <xfs@oss.sgi.com> Subject: Re: [PATCH] xfs: Don't keep silent if sunit/swidth can not be changed via mount References: <517E5D12.5010809@oracle.com> <20130430073659.GH23072@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Don't keep silent if sunit/swidth can not be changed via mount In-Reply-To: <20130430073659.GH23072@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1367308517 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129585 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/30/2013 03:36 PM, Dave Chinner wrote: > On Mon, Apr 29, 2013 at 07:44:18PM +0800, Jeff Liu wrote: >> From: Jie Liu <jeff.liu@oracle.com> >> >> As per the mount man page, sunit and swidth can be changed via >> mount options. For XFS, on the face of it, those options seems >> works if the specified alignments is properly, e.g. >> # mount -o sunit=4096,swidth=8192 /dev/sdb1 /mnt >> # mount | grep sdb1 >> /dev/sdb1 on /mnt type xfs (rw,sunit=4096,swidth=8192) >> >> However, neither sunit nor swidth is shown from the xfs_info output. >> # xfs_info /mnt >> meta-data=/dev/sdb1 isize=256 agcount=4, agsize=262144 blks >> = sectsz=512 attr=2 >> data = bsize=4096 blocks=1048576, imaxpct=25 >> = sunit=0 swidth=0 blks >> ^^^^^^^^^^^^^^^^^^^^^^^^^^ >> naming =version 2 bsize=4096 ascii-ci=0 >> log =internal bsize=4096 blocks=2560, version=2 >> = sectsz=512 sunit=0 blks, lazy-count=1 >> realtime =none extsz=4096 blocks=0, rtextents=0 >> >> The reason is that the alignment can only be changed if the relevant >> super block is already configured with alignments, otherwise, the >> given value will be silently ignored, so it's better to tell user >> that the alignment-changing can not take affect in one way or another. >> >> With this fix, the attempt to mount a storage without strip alignment >> setup on super block will failed if XFS_MOUNT_RETERR is enabled, or >> just ignore the given alignment and drop a warning to indicate the >> cause in syslog. >> >> # mount -o sunit=4096,swidth=8192 /dev/sdb1 /mnt >> mount: wrong fs type, bad option, bad superblock on /dev/sdb1, >> missing codepage or helper program, or other error >> In some cases useful info is found in syslog - try >> dmesg | tail or so >> >> # dmesg|tail >> ....... >> XFS (sdb1): can not change alignment: no data alignment on superblock >> >> Signed-off-by: Jie Liu <jeff.liu@oracle.com> >> >> --- >> fs/xfs/xfs_mount.c | 7 +++++++ >> 1 file changed, 7 insertions(+) >> >> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c >> index 3806088..bc7fdd4 100644 >> --- a/fs/xfs/xfs_mount.c >> +++ b/fs/xfs/xfs_mount.c >> @@ -924,6 +924,13 @@ xfs_update_alignment(xfs_mount_t *mp) >> sbp->sb_width = mp->m_swidth; >> mp->m_update_flags |= XFS_SB_WIDTH; >> } >> + } else { >> + xfs_warn(mp, "can not change alignment: " >> + "no data alignment on superblock"); >> + if (mp->m_flags & XFS_MOUNT_RETERR) >> + return XFS_ERROR(EINVAL); >> + mp->m_dalign = 0; >> + mp->m_swidth = 0; > > Can someone tell me why the XFS_MOUNT_RETERR flag exists? This is really a very opportune response because I also worked out another tiny patch for removing XFS_MOUNT_RETERR a few minutes ago, just hesitating if I missed anything or not. > > It looks like dead code to me as the only time mp->m_dalign is set > prior to calling xfs_update_alignment() is the same code that sets > XFS_MOUNT_RETERR in xfs_parseargs(). > > IOWs, any time we enter this "if (mp->m_dalign)" branch in > xfs_update_alignment(), XFS_MOUNT_RETERR is going to be set and so > we should always be emitting a warning and returning an error. Yes, I realized that as I can not trigger a warning only, it always returning an error to me. :( > > If this is correct, Jeff, can you remove the XFS_MOUNT_RETERR flag > and get rid of all the dead code in xfs_update_alignment() at the > same time, please? Sure, I'll post this patch tonight together with another initial patch for fixing transaction space over-reservation we have discussed two weeks ago, xfstests is running now. Thanks, -Jeff From david@fromorbit.com Tue Apr 30 06:35:49 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A97957F37 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 06:35:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 97D8830405F for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 04:35:46 -0700 (PDT) X-ASG-Debug-ID: 1367321741-04cb6c66e448920001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id lqYDTzL5lUzqF8wy for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 04:35:41 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhERAEusf1F5LC+Z/2dsb2JhbABSgweDBLZrhRkEAYEBF3SCHwEBBAEnExwjEAgDGAklDwUlAyETiBAFsT2OYRWNaIEdB4JuYQOXHZErgyMq Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail07.adl2.internode.on.net with ESMTP; 30 Apr 2013 21:05:16 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UX8q2-0005rG-79; Tue, 30 Apr 2013 21:35:14 +1000 Date: Tue, 30 Apr 2013 21:35:14 +1000 From: Dave Chinner <david@fromorbit.com> To: Jeff Liu <jeff.liu@oracle.com> Cc: "xfs@oss.sgi.com" <xfs@oss.sgi.com> Subject: Re: [PATCH] xfs: Don't keep silent if sunit/swidth can not be changed via mount Message-ID: <20130430113514.GA10481@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Don't keep silent if sunit/swidth can not be changed via mount References: <517E5D12.5010809@oracle.com> <20130430073659.GH23072@dastard> <517F78D2.5020503@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <517F78D2.5020503@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1367321741 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129599 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 30, 2013 at 03:54:58PM +0800, Jeff Liu wrote: > On 04/30/2013 03:36 PM, Dave Chinner wrote: > > On Mon, Apr 29, 2013 at 07:44:18PM +0800, Jeff Liu wrote: > >> --- > >> fs/xfs/xfs_mount.c | 7 +++++++ > >> 1 file changed, 7 insertions(+) > >> > >> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > >> index 3806088..bc7fdd4 100644 > >> --- a/fs/xfs/xfs_mount.c > >> +++ b/fs/xfs/xfs_mount.c > >> @@ -924,6 +924,13 @@ xfs_update_alignment(xfs_mount_t *mp) > >> sbp->sb_width = mp->m_swidth; > >> mp->m_update_flags |= XFS_SB_WIDTH; > >> } > >> + } else { > >> + xfs_warn(mp, "can not change alignment: " > >> + "no data alignment on superblock"); > >> + if (mp->m_flags & XFS_MOUNT_RETERR) > >> + return XFS_ERROR(EINVAL); > >> + mp->m_dalign = 0; > >> + mp->m_swidth = 0; > > > > Can someone tell me why the XFS_MOUNT_RETERR flag exists? > This is really a very opportune response because I also worked out > another tiny patch for removing XFS_MOUNT_RETERR a few minutes ago, > just hesitating if I missed anything or not. Excellent - you're one step ahead of me :) > > It looks like dead code to me as the only time mp->m_dalign is set > > prior to calling xfs_update_alignment() is the same code that sets > > XFS_MOUNT_RETERR in xfs_parseargs(). > > > > IOWs, any time we enter this "if (mp->m_dalign)" branch in > > xfs_update_alignment(), XFS_MOUNT_RETERR is going to be set and so > > we should always be emitting a warning and returning an error. > Yes, I realized that as I can not trigger a warning only, it always > returning an error to me. :( > > > > If this is correct, Jeff, can you remove the XFS_MOUNT_RETERR flag > > and get rid of all the dead code in xfs_update_alignment() at the > > same time, please? > Sure, I'll post this patch tonight together with another initial patch > for fixing transaction space over-reservation we have discussed two > weeks ago, xfstests is running now. I'll have a look when it appears on the list ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Tue Apr 30 06:39:42 2013 Return-Path: <dave@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 816DF7F52 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 06:39:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2201FAC004 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 04:39:42 -0700 (PDT) X-ASG-Debug-ID: 1367321979-04cbb03c2f47bf0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id LZCiQYHia95BhY13 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 04:39:40 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsMLAEusf1F5LC+Z/2dsb2JhbABSgwe/CASBAhd0gnw7gQIDiEmgKZEUjmGNfYE6gzkDqEiDIyo Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail07.adl2.internode.on.net with ESMTP; 30 Apr 2013 21:09:39 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from <dave@fromorbit.com>) id 1UX8uI-0005sM-T7 for xfs@oss.sgi.com; Tue, 30 Apr 2013 21:39:38 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from <dave@disappointment.disaster>) id 1UX8uI-0004lI-Ob for xfs@oss.sgi.com; Tue, 30 Apr 2013 21:39:38 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 0/4] xfs: fixes for 3.10 merge window. Date: Tue, 30 Apr 2013 21:39:32 +1000 X-ASG-Orig-Subj: [PATCH 0/4] xfs: fixes for 3.10 merge window. Message-Id: <1367321976-18268-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1367321979 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129599 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Ben, The following 4 patches are for the 3.10 merge window. The first is a repost of the CONFIG_XFS_QUOTA build fix, the second is the CONFIG_XFS_WARN functionality, and the remaining two are updates to the CRC patchset in response to your review comments. The first patch really needs to go in ASAP to fix the linux-next build problems, the others aren't quite so critical. Cheers, Dave. From dave@fromorbit.com Tue Apr 30 06:39:43 2013 Return-Path: <dave@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A77077F52 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 06:39:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4B038AC004 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 04:39:43 -0700 (PDT) X-ASG-Debug-ID: 1367321979-04cbb03c2f47bf0002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id RlHNKGSpOlfJvSYB for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 04:39:41 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsULAEusf1F5LC+Z/2dsb2JhbABSgwe/CASBAhd0gh8BAQUnLzMIGDEhGAMbGYgEAw6xPYZMDYgIjESBJhOBOoM5A5U6i2+CAIUfgyMqgS8 Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail07.adl2.internode.on.net with ESMTP; 30 Apr 2013 21:09:39 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from <dave@fromorbit.com>) id 1UX8uI-0005sN-Th for xfs@oss.sgi.com; Tue, 30 Apr 2013 21:39:38 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from <dave@disappointment.disaster>) id 1UX8uI-0004lL-Po for xfs@oss.sgi.com; Tue, 30 Apr 2013 21:39:38 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: Teach dquot recovery about CONFIG_XFS_QUOTA Date: Tue, 30 Apr 2013 21:39:33 +1000 X-ASG-Orig-Subj: [PATCH 1/4] xfs: Teach dquot recovery about CONFIG_XFS_QUOTA Message-Id: <1367321976-18268-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1367321976-18268-1-git-send-email-david@fromorbit.com> References: <1367321976-18268-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1367321981 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129599 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_SA620b Custom Rule SA620b From: Dave Chinner <dchinner@redhat.com> Fix a build error when CONFIG_XFS_QUOTA=n: fs/built-in.o: In function `xlog_recovery_validate_buf_type': /home/dave/src/build/x86-64/xfsdev/fs/xfs/xfs_log_recover.c:1948: undefined reference to `xfs_dquot_buf_ops' Reported-by: Michael L. Semon <mlsemon35@gmail.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_log_recover.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 35ac504..ecaa4d4 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1940,12 +1940,18 @@ xlog_recovery_validate_buf_type( case XFS_BLFT_UDQUOT_BUF: case XFS_BLFT_PDQUOT_BUF: case XFS_BLFT_GDQUOT_BUF: +#ifdef CONFIG_XFS_QUOTA if (magic16 != XFS_DQUOT_MAGIC) { xfs_warn(mp, "Bad DQUOT block magic!"); ASSERT(0); break; } bp->b_ops = &xfs_dquot_buf_ops; +#else + xfs_alert(mp, + "Trying to recover dquots without QUOTA support built in!"); + ASSERT(0); +#endif break; case XFS_BLFT_DINO_BUF: /* -- 1.7.10.4 From dave@fromorbit.com Tue Apr 30 06:39:44 2013 Return-Path: <dave@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 696807F54 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 06:39:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4EF768F8064 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 04:39:44 -0700 (PDT) X-ASG-Debug-ID: 1367321981-04cbb03c2c47bf0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id Ccyz4gtieF7hIKW4 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 04:39:42 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsULAEusf1F5LC+Z/2dsb2JhbABSgwe/CASBAhd0gh8BAQUnLzMIGDE5AxsZiBWxPY5hjX2BOoM5A6hIgyMqgTAk Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail07.adl2.internode.on.net with ESMTP; 30 Apr 2013 21:09:39 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from <dave@fromorbit.com>) id 1UX8uI-0005sP-Vw for xfs@oss.sgi.com; Tue, 30 Apr 2013 21:39:39 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from <dave@disappointment.disaster>) id 1UX8uI-0004lV-Sj for xfs@oss.sgi.com; Tue, 30 Apr 2013 21:39:38 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: Remote attr validation fixes and optimisations Date: Tue, 30 Apr 2013 21:39:35 +1000 X-ASG-Orig-Subj: [PATCH 3/4] xfs: Remote attr validation fixes and optimisations Message-Id: <1367321976-18268-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1367321976-18268-1-git-send-email-david@fromorbit.com> References: <1367321976-18268-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1367321981 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129599 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> - optimise the calcuation for the number of blocks in a remote xattr. - check attribute length against MAX_XATTR_SIZE, not MAXPATHLEN - whitespace fixes Reviewed-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr_remote.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index 53da46b..dee8446 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -52,15 +52,9 @@ xfs_attr3_rmt_blocks( struct xfs_mount *mp, int attrlen) { - int fsblocks = 0; - int len = attrlen; - - do { - fsblocks++; - len -= XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize); - } while (len > 0); - - return fsblocks; + int buflen = XFS_ATTR3_RMT_BUF_SPACE(mp, + mp->m_sb.sb_blocksize); + return (attrlen + buflen - 1) / buflen; } static bool @@ -79,7 +73,7 @@ xfs_attr3_rmt_verify( if (bp->b_bn != be64_to_cpu(rmt->rm_blkno)) return false; if (be32_to_cpu(rmt->rm_offset) + - be32_to_cpu(rmt->rm_bytes) >= MAXPATHLEN) + be32_to_cpu(rmt->rm_bytes) >= XATTR_SIZE_MAX) return false; if (rmt->rm_owner == 0) return false; @@ -183,7 +177,6 @@ xfs_attr3_rmt_hdr_ok( /* ok */ return true; - } /* @@ -367,7 +360,6 @@ xfs_attr_rmtval_set( * spill for another block every 9 headers we require in this * loop. */ - if (crcs && blkcnt == 0) { int total_len; @@ -422,9 +414,8 @@ xfs_attr_rmtval_set( byte_cnt = BBTOB(bp->b_length); byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, byte_cnt); - if (valuelen < byte_cnt) { + if (valuelen < byte_cnt) byte_cnt = valuelen; - } buf = bp->b_addr; buf += xfs_attr3_rmt_hdr_set(mp, dp->i_ino, offset, -- 1.7.10.4 From dave@fromorbit.com Tue Apr 30 06:39:45 2013 Return-Path: <dave@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8FFF17F54 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 06:39:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6E83F304051 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 04:39:45 -0700 (PDT) X-ASG-Debug-ID: 1367321979-04cbb03c2f47bf0003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id UOI5lJuWbuodj6I9 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 04:39:42 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsULAEusf1F5LC+Z/2dsb2JhbABSgwe/CASBAhd0gh8BAQUnLzMIGDE5AxsZiBWxPY5hjX2BOoM5A6hIgyMq Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail07.adl2.internode.on.net with ESMTP; 30 Apr 2013 21:09:39 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from <dave@fromorbit.com>) id 1UX8uJ-0005sQ-0b for xfs@oss.sgi.com; Tue, 30 Apr 2013 21:39:39 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from <dave@disappointment.disaster>) id 1UX8uI-0004lZ-Tg for xfs@oss.sgi.com; Tue, 30 Apr 2013 21:39:38 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: fix da node magic number mismatches Date: Tue, 30 Apr 2013 21:39:36 +1000 X-ASG-Orig-Subj: [PATCH 4/4] xfs: fix da node magic number mismatches Message-Id: <1367321976-18268-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1367321976-18268-1-git-send-email-david@fromorbit.com> References: <1367321976-18268-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1367321982 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129599 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.c | 2 +- fs/xfs/xfs_log_recover.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 56814e3..9b26a99 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -310,8 +310,8 @@ xfs_da3_node_read( int type; switch (be16_to_cpu(info->magic)) { - case XFS_DA3_NODE_MAGIC: case XFS_DA_NODE_MAGIC: + case XFS_DA3_NODE_MAGIC: type = XFS_BLFT_DA_NODE_BUF; break; case XFS_ATTR_LEAF_MAGIC: diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index ecaa4d4..93f03ec 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2039,7 +2039,7 @@ xlog_recovery_validate_buf_type( case XFS_BLFT_ATTR_RMT_BUF: if (!xfs_sb_version_hascrc(&mp->m_sb)) break; - if (magicda != XFS_ATTR3_RMT_MAGIC) { + if (magic32 != XFS_ATTR3_RMT_MAGIC) { xfs_warn(mp, "Bad attr remote magic!"); ASSERT(0); break; @@ -2135,7 +2135,6 @@ xlog_recover_do_reg_buffer( ASSERT(i == item->ri_total); xlog_recovery_validate_buf_type(mp, bp, buf_f); - } /* -- 1.7.10.4 From dave@fromorbit.com Tue Apr 30 06:39:48 2013 Return-Path: <dave@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 273F67F6F for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 06:39:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 15D39304051 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 04:39:48 -0700 (PDT) X-ASG-Debug-ID: 1367321983-04cb6c66e148d90001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id IJW9yNnoDwJWJpeb for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 04:39:44 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsULAEusf1F5LC+Z/2dsb2JhbABSgwe/CASBAhd0gh8BAQUnLzMIGDE5AxsZiBWxPY5hjVcmhHMDoSmHH4MjKg Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail07.adl2.internode.on.net with ESMTP; 30 Apr 2013 21:09:39 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from <dave@fromorbit.com>) id 1UX8uI-0005sO-V2 for xfs@oss.sgi.com; Tue, 30 Apr 2013 21:39:39 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from <dave@disappointment.disaster>) id 1UX8uI-0004lP-RV for xfs@oss.sgi.com; Tue, 30 Apr 2013 21:39:38 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 2/4] xfs: introduce CONFIG_XFS_WARN Date: Tue, 30 Apr 2013 21:39:34 +1000 X-ASG-Orig-Subj: [PATCH 2/4] xfs: introduce CONFIG_XFS_WARN Message-Id: <1367321976-18268-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1367321976-18268-1-git-send-email-david@fromorbit.com> References: <1367321976-18268-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1367321983 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129599 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Running a CONFIG_XFS_DEBUG kernel in production environments is not the best idea as it introduces significant overhead, can change the behaviour of algorithms (such as allocation) to improve test coverage, and (most importantly) panic the machine on non-fatal errors. There are many cases where all we want to do is run a kernel with more bounds checking enabled, such as is provided by the ASSERT() statements throughout the code, but without all the potential overhead and drawbacks. This patch converts all the ASSERT statements to evaluate as WARN_ON(1) statements and hence if they fail dump a warning and a stack trace to the log. This has minimal overhead and does not change any algorithms, and will allow us to find strange "out of bounds" problems more easily on production machines. There are a few places where assert statements contain debug only code. These are converted to be debug-or-warn only code so that we still get all the assert checks in the code. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/Kconfig | 13 +++++++++++++ fs/xfs/mrlock.h | 12 ++++++------ fs/xfs/xfs.h | 5 +++++ fs/xfs/xfs_alloc_btree.c | 4 ++-- fs/xfs/xfs_bmap_btree.c | 4 ++-- fs/xfs/xfs_btree.h | 2 +- fs/xfs/xfs_dir2_node.c | 4 ++-- fs/xfs/xfs_ialloc_btree.c | 4 ++-- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_linux.h | 24 ++++++++++++++++++------ fs/xfs/xfs_message.c | 8 ++++++++ fs/xfs/xfs_message.h | 1 + fs/xfs/xfs_trans.h | 4 ++-- 13 files changed, 63 insertions(+), 24 deletions(-) diff --git a/fs/xfs/Kconfig b/fs/xfs/Kconfig index cc33aaf..399e8ce 100644 --- a/fs/xfs/Kconfig +++ b/fs/xfs/Kconfig @@ -69,6 +69,19 @@ config XFS_RT If unsure, say N. +config XFS_WARN + bool "XFS Verbose Warnings" + depends on XFS_FS && !XFS_DEBUG + help + Say Y here to get an XFS build with many additional warnings. + It converts ASSERT checks to WARN, so will log any out-of-bounds + conditions that occur that would otherwise be missed. It is much + lighter weight than XFS_DEBUG and does not modify algorithms and will + not cause the kernel to panic on non-fatal errors. + + However, similar to XFS_DEBUG, it is only advisable to use this if you + are debugging a particular problem. + config XFS_DEBUG bool "XFS Debugging support" depends on XFS_FS diff --git a/fs/xfs/mrlock.h b/fs/xfs/mrlock.h index ff6a198..e3c92d1 100644 --- a/fs/xfs/mrlock.h +++ b/fs/xfs/mrlock.h @@ -22,12 +22,12 @@ typedef struct { struct rw_semaphore mr_lock; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int mr_writer; #endif } mrlock_t; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) #define mrinit(mrp, name) \ do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) #else @@ -46,7 +46,7 @@ static inline void mraccess_nested(mrlock_t *mrp, int subclass) static inline void mrupdate_nested(mrlock_t *mrp, int subclass) { down_write_nested(&mrp->mr_lock, subclass); -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) mrp->mr_writer = 1; #endif } @@ -60,7 +60,7 @@ static inline int mrtryupdate(mrlock_t *mrp) { if (!down_write_trylock(&mrp->mr_lock)) return 0; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) mrp->mr_writer = 1; #endif return 1; @@ -68,7 +68,7 @@ static inline int mrtryupdate(mrlock_t *mrp) static inline void mrunlock_excl(mrlock_t *mrp) { -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) mrp->mr_writer = 0; #endif up_write(&mrp->mr_lock); @@ -81,7 +81,7 @@ static inline void mrunlock_shared(mrlock_t *mrp) static inline void mrdemote(mrlock_t *mrp) { -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) mrp->mr_writer = 0; #endif downgrade_write(&mrp->mr_lock); diff --git a/fs/xfs/xfs.h b/fs/xfs/xfs.h index d8b11b7..a742c47 100644 --- a/fs/xfs/xfs.h +++ b/fs/xfs/xfs.h @@ -24,6 +24,11 @@ #define XFS_BUF_LOCK_TRACKING 1 #endif +#ifdef CONFIG_XFS_WARN +#define XFS_WARN 1 +#endif + + #include "xfs_linux.h" #endif /* __XFS_H__ */ diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index 30c4c14..cafc902 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -386,7 +386,7 @@ const struct xfs_buf_ops xfs_allocbt_buf_ops = { }; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_allocbt_keys_inorder( struct xfs_btree_cur *cur, @@ -442,7 +442,7 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { .init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur, .key_diff = xfs_allocbt_key_diff, .buf_ops = &xfs_allocbt_buf_ops, -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_allocbt_keys_inorder, .recs_inorder = xfs_allocbt_recs_inorder, #endif diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index 3a86c3f..0c61a22 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -813,7 +813,7 @@ const struct xfs_buf_ops xfs_bmbt_buf_ops = { }; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_bmbt_keys_inorder( struct xfs_btree_cur *cur, @@ -853,7 +853,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { .init_ptr_from_cur = xfs_bmbt_init_ptr_from_cur, .key_diff = xfs_bmbt_key_diff, .buf_ops = &xfs_bmbt_buf_ops, -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_bmbt_keys_inorder, .recs_inorder = xfs_bmbt_recs_inorder, #endif diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h index 6e6c915..55e3c7c 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/xfs_btree.h @@ -215,7 +215,7 @@ struct xfs_btree_ops { const struct xfs_buf_ops *buf_ops; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) /* check that k1 is lower than k2 */ int (*keys_inorder)(struct xfs_btree_cur *cur, union xfs_btree_key *k1, diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index ecc6c66..5246de4 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -993,7 +993,7 @@ xfs_dir2_leafn_rebalance( xfs_dir2_leaf_t *leaf1; /* first leaf structure */ xfs_dir2_leaf_t *leaf2; /* second leaf structure */ int mid; /* midpoint leaf index */ -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int oldstale; /* old count of stale leaves */ #endif int oldsum; /* old total leaf count */ @@ -1022,7 +1022,7 @@ xfs_dir2_leafn_rebalance( ents2 = xfs_dir3_leaf_ents_p(leaf2); oldsum = hdr1.count + hdr2.count; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) oldstale = hdr1.stale + hdr2.stale; #endif mid = oldsum >> 1; diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index c82ac88..5448eb6 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -272,7 +272,7 @@ const struct xfs_buf_ops xfs_inobt_buf_ops = { .verify_write = xfs_inobt_write_verify, }; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_inobt_keys_inorder( struct xfs_btree_cur *cur, @@ -310,7 +310,7 @@ static const struct xfs_btree_ops xfs_inobt_ops = { .init_ptr_from_cur = xfs_inobt_init_ptr_from_cur, .key_diff = xfs_inobt_key_diff, .buf_ops = &xfs_inobt_buf_ops, -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_inobt_keys_inorder, .recs_inorder = xfs_inobt_recs_inorder, #endif diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 558ef49..efbe1ac 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -287,7 +287,7 @@ xfs_ilock_demote( trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_); } -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int xfs_isilocked( xfs_inode_t *ip, diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index 14e59d9..800f896 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -293,22 +293,34 @@ static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y) #define ASSERT_ALWAYS(expr) \ (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) -#ifndef DEBUG -#define ASSERT(expr) ((void)0) +#ifdef DEBUG +#define ASSERT(expr) \ + (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) #ifndef STATIC -# define STATIC static noinline +# define STATIC noinline #endif -#else /* DEBUG */ +#else /* !DEBUG */ + +#ifdef XFS_WARN #define ASSERT(expr) \ - (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) + (unlikely(expr) ? (void)0 : asswarn(#expr, __FILE__, __LINE__)) #ifndef STATIC -# define STATIC noinline +# define STATIC static noinline +#endif + +#else /* !DEBUG && !XFS_WARN */ + +#define ASSERT(expr) ((void)0) + +#ifndef STATIC +# define STATIC static noinline #endif +#endif /* XFS_WARN */ #endif /* DEBUG */ #endif /* __XFS_LINUX__ */ diff --git a/fs/xfs/xfs_message.c b/fs/xfs/xfs_message.c index 331cd9f..9163dc1 100644 --- a/fs/xfs/xfs_message.c +++ b/fs/xfs/xfs_message.c @@ -93,6 +93,14 @@ xfs_alert_tag( } void +asswarn(char *expr, char *file, int line) +{ + xfs_warn(NULL, "Assertion failed: %s, file: %s, line: %d", + expr, file, line); + WARN_ON(1); +} + +void assfail(char *expr, char *file, int line) { xfs_emerg(NULL, "Assertion failed: %s, file: %s, line: %d", diff --git a/fs/xfs/xfs_message.h b/fs/xfs/xfs_message.h index 76c8198..8540115 100644 --- a/fs/xfs/xfs_message.h +++ b/fs/xfs/xfs_message.h @@ -57,6 +57,7 @@ do { \ xfs_printk_ratelimited(xfs_debug, dev, fmt, ##__VA_ARGS__) extern void assfail(char *expr, char *f, int l); +extern void asswarn(char *expr, char *f, int l); extern void xfs_hex_dump(void *p, int length); diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index cd29f61..a44dba5 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -405,7 +405,7 @@ typedef struct xfs_trans { int64_t t_res_fdblocks_delta; /* on-disk only chg */ int64_t t_frextents_delta;/* superblock freextents chg*/ int64_t t_res_frextents_delta; /* on-disk only chg */ -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int64_t t_ag_freeblks_delta; /* debugging counter */ int64_t t_ag_flist_delta; /* debugging counter */ int64_t t_ag_btree_delta; /* debugging counter */ @@ -433,7 +433,7 @@ typedef struct xfs_trans { #define xfs_trans_get_block_res(tp) ((tp)->t_blk_res) #define xfs_trans_set_sync(tp) ((tp)->t_flags |= XFS_TRANS_SYNC) -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) #define xfs_trans_agblocks_delta(tp, d) ((tp)->t_ag_freeblks_delta += (int64_t)d) #define xfs_trans_agflist_delta(tp, d) ((tp)->t_ag_flist_delta += (int64_t)d) #define xfs_trans_agbtree_delta(tp, d) ((tp)->t_ag_btree_delta += (int64_t)d) -- 1.7.10.4 From david@fromorbit.com Tue Apr 30 07:03:17 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DE2E17F37 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 07:03:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BE46E8F807A for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 05:03:14 -0700 (PDT) X-ASG-Debug-ID: 1367323392-04bdf077c64a330001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id CLsKnYym8e3Gpjnn for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 05:03:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhARAC+yf1F5LC+Z/2dsb2JhbABSgweDBLZrhRkEAYEBF3SCHwEBBTocIxAIAxgJJQ8FJQMhE4gVsVKOPBWNaIEdB4NPA5cdkSuDIyqBLiQ Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail07.adl2.internode.on.net with ESMTP; 30 Apr 2013 21:33:12 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UX9H0-0005vk-H8; Tue, 30 Apr 2013 22:03:06 +1000 Date: Tue, 30 Apr 2013 22:03:06 +1000 From: Dave Chinner <david@fromorbit.com> To: Mark Tinguely <tinguely@sgi.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 Message-ID: <20130430120306.GL23072@dastard> X-ASG-Orig-Subj: Re: [PATCH TARBALL, DEV ONLY] xfsprogs: metadata CRC support V2 References: <20130412145555.GF30622@dastard> <51799C24.8010901@sgi.com> <20130425214040.GQ30622@dastard> <517EE729.2030706@sgi.com> <20130429220952.GB23072@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130429220952.GB23072@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1367323393 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129601 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Tue, Apr 30, 2013 at 08:09:52AM +1000, Dave Chinner wrote: > On Mon, Apr 29, 2013 at 04:33:29PM -0500, Mark Tinguely wrote: > > On 04/25/13 16:40, Dave Chinner wrote: > > >On Thu, Apr 25, 2013 at 04:12:04PM -0500, Mark Tinguely wrote: > > Index: b/include/xfs/xfs_dir2_format.h > > =================================================================== > > --- a/include/xfs/xfs_dir2_format.h > > +++ b/include/xfs/xfs_dir2_format.h > > @@ -40,7 +40,6 @@ > > */ > > typedef __uint16_t xfs_dir2_data_off_t; > > #define NULLDATAOFF 0xffffU > > -typedef uint xfs_dir2_data_aoff_t; /* argument form */ > > This file is common with the kernel code, so whatever other > definition it conflicts with is the one to remove. > > > @@ -61,11 +60,6 @@ typedef __uint32_t xfs_dir2_dataptr_t; > > typedef xfs_off_t xfs_dir2_off_t; > > > > /* > > - * Directory block number (logical dirblk in file) > > - */ > > -typedef __uint32_t xfs_dir2_db_t; > > Same here. So looking at this in more detail, the reason these got added to xfs_dir2.h was that there are a bunch of function prototypes I had to move from xfs_dir2_priv.h to xfs_dir2.h so that they were visible outside libxfs. This is one of the changes I need to propagate back into the kernel code to bring the kernel headers inline with what is needed by userspace. So as a temporary measure, the above patch that just removes them from xfs_dir2_format.h is OK. I'll fold these into the current patchset. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 30 07:13:27 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AF70C7F37 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 07:13:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 540EAAC007 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 05:13:23 -0700 (PDT) X-ASG-Debug-ID: 1367323992-04bdf077c84b040001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id uPadFd2H9ztT16lt for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 05:13:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-NotFiltered: toobig X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApsEAHS0f1F5LC+Z/2dsb2JhbADDfg Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail07.adl2.internode.on.net with ESMTP; 30 Apr 2013 21:43:01 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UX9Qa-0005wz-P8 for xfs@oss.sgi.com; Tue, 30 Apr 2013 22:13:00 +1000 Date: Tue, 30 Apr 2013 22:13:00 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [TARBALL] xfsprogs: fixes and updates to current kernel code Message-ID: <20130430121300.GB10481@dastard> X-ASG-Orig-Subj: [TARBALL] xfsprogs: fixes and updates to current kernel code MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="HlL+5n6rz5pIUxbD" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1367323992 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129601 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --HlL+5n6rz5pIUxbD Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi folks, The attached tarball contains the following patches and a series file: xfs_repair: validate on-disk extent count better xfs_logprint: print all AGI unlinked buckets xfs_fsr: file reads should be O_DIRECT xfsprogs: Die dir1 Die! xfsprogs: sync code to current kernel code xfsprogs: update libxfs to 3.9-rc1 + xfsdev xfsprogs: add CRC32c infrastructure xfsprogs: update libxlog to current kernel code The first 3 patches are miscellaneous fixes I have for various issues that I've triaged over the past couple of weeks, and there should be nothing controversial about them. The xfs_fsr fix almost doubled the speed of defragmenting a large sparse VM image with millions of extents (from copy rate of ~100MB/s to ~180MB/s), so while it's a simple change the effect can be quite dramatic. The fourth patch (Die dir1 Die!) removes support for V1 directories from the userspace toolchains as we discussed last week. I put that before the kernel code sync as it removes over 4000 lines of code and various header files that then don't have to be modified and juggled for the dir2 header changes in the kernel sync patches, making them a little simpler and smaller. The next 3 patches pull all the libxfs code up to match the xfs dev tree shortly after the 3.9-rc1 merge. This is roughly the version of the xfs dev tree the kernel CRC patches apply to, and is close enough for the purposes of adding CRC support to the userspace code without needing to greatly modify the kernel patches. The second-to-last patch introduces all the CRC32c infrastructure necessary to allow the libxlog code to be synced to the kernel code as the 3.8 kernel adds CRC32c encapuslation to the log buffers written to disk. This also lays the groundwork for bring the kernel CRC patches across to userspace. The final patch updates the libxlog code to match the kernel code now that all the infrastructure is in place to allow it to be copied across. This update seems to be relatively robust - I'm not seeing any xfstests regressions as a result of making these changes, and while there are a couple of compile warnings in the libxfs code, they need to be fixed in the kernel code first and sync'd across. Hopefully this tarball is now small enough to make it through the list without getting held up. It's still a large amount of change: 114 files changed, 13327 insertions(+), 14808 deletions(-) but thanks to the dirv1 removal it's actually a net reduction by 1500 lines of code. Full diffstat is below. Comments, testing and feedback welcome.... Cheers, Dave. -- Dave Chinner david@fromorbit.com $ git diff --stat --summary 30626ef.. db/Makefile | 2 +- db/check.c | 321 +- db/dir.c | 255 -- db/dir.h | 30 - db/dir2.c | 11 +- db/dir2.h | 30 + db/dir2sf.c | 15 +- db/dirshort.c | 132 - db/dirshort.h | 25 - db/field.c | 29 - db/inode.c | 20 +- db/metadump.c | 23 +- db/sb.c | 7 +- db/type.c | 3 - db/type.h | 2 +- estimate/xfs_estimate.c | 4 +- fsr/xfs_fsr.c | 7 +- include/Makefile | 9 +- include/libxfs.h | 155 +- include/libxlog.h | 32 +- include/linux.h | 1 + include/platform_defs.h.in | 5 + include/project.h | 4 - include/swab.h | 38 + include/xfs.h | 1 + include/xfs_ag.h | 29 +- include/xfs_alloc.h | 57 +- include/xfs_alloc_btree.h | 16 +- include/xfs_arch.h | 16 + include/xfs_attr_leaf.h | 27 +- include/xfs_bmap.h | 325 +- include/xfs_bmap_btree.h | 1 + include/xfs_btree.h | 24 +- include/xfs_buf_item.h | 55 +- include/xfs_cksum.h | 63 + include/xfs_da_btree.h | 59 +- include/xfs_dinode.h | 10 +- include/xfs_dir2.h | 83 +- include/xfs_dir2_block.h | 92 - include/xfs_dir2_data.h | 184 - include/xfs_dir2_format.h | 591 +++ include/xfs_dir2_leaf.h | 253 -- include/xfs_dir2_node.h | 100 - include/xfs_dir2_sf.h | 171 - include/xfs_dir_leaf.h | 113 - include/xfs_dir_sf.h | 99 - include/xfs_fs.h | 38 +- include/xfs_ialloc.h | 17 +- include/xfs_ialloc_btree.h | 2 + include/xfs_inode.h | 237 +- include/xfs_inode_item.h | 22 +- include/xfs_inum.h | 16 - include/xfs_log.h | 31 +- include/xfs_log_priv.h | 101 +- include/xfs_mount.h | 47 +- include/xfs_quota.h | 47 +- include/xfs_rtalloc.h | 4 +- include/xfs_sb.h | 10 +- include/xfs_trace.h | 69 +- include/xfs_trans.h | 88 +- include/xfs_types.h | 25 +- libxfs/Makefile | 26 +- libxfs/crc32.c | 1036 ++++++ libxfs/crc32defs.h | 72 + libxfs/gen_crc32table.c | 144 + libxfs/init.c | 32 +- libxfs/logitem.c | 20 +- libxfs/rdwr.c | 409 ++- libxfs/trans.c | 50 +- libxfs/util.c | 202 +- libxfs/xfs.h | 112 +- libxfs/xfs_alloc.c | 592 +-- libxfs/xfs_alloc_btree.c | 105 +- libxfs/xfs_attr.c | 260 +- libxfs/xfs_attr_leaf.c | 501 +-- libxfs/xfs_bmap.c | 8937 ++++++++++++++++++++++++---------------------- libxfs/xfs_bmap_btree.c | 71 +- libxfs/xfs_btree.c | 188 +- libxfs/xfs_da_btree.c | 1278 ++++--- libxfs/xfs_dir2.c | 149 +- libxfs/xfs_dir2_block.c | 709 ++-- libxfs/xfs_dir2_data.c | 506 ++- libxfs/xfs_dir2_leaf.c | 720 ++-- libxfs/xfs_dir2_node.c | 722 ++-- libxfs/xfs_dir2_priv.h | 152 + libxfs/xfs_dir2_sf.c | 320 +- libxfs/xfs_ialloc.c | 582 +-- libxfs/xfs_ialloc_btree.c | 55 +- libxfs/xfs_inode.c | 409 ++- libxfs/xfs_mount.c | 176 +- libxfs/xfs_rtalloc.c | 77 +- libxfs/xfs_trans.c | 9 +- libxlog/xfs_log_recover.c | 301 +- logprint/log_copy.c | 2 +- logprint/log_dump.c | 2 +- logprint/log_misc.c | 31 +- logprint/log_print_all.c | 23 +- logprint/log_print_trans.c | 4 +- logprint/logprint.c | 2 +- logprint/logprint.h | 10 +- mkfs/proto.c | 10 +- repair/Makefile | 4 +- repair/attr_repair.c | 634 +++- repair/dino_chunks.c | 1 - repair/dinode.c | 39 +- repair/dir.c | 2642 -------------- repair/dir.h | 126 - repair/dir2.c | 354 +- repair/dir2.h | 33 +- repair/init.c | 1 - repair/phase2.c | 7 +- repair/phase4.c | 1 - repair/phase6.c | 1001 +----- repair/prefetch.c | 3 +- 114 files changed, 13327 insertions(+), 14808 deletions(-) delete mode 100644 db/dir.c delete mode 100644 db/dir.h delete mode 100644 db/dirshort.c delete mode 100644 db/dirshort.h create mode 100644 include/xfs_cksum.h delete mode 100644 include/xfs_dir2_block.h delete mode 100644 include/xfs_dir2_data.h create mode 100644 include/xfs_dir2_format.h delete mode 100644 include/xfs_dir2_leaf.h delete mode 100644 include/xfs_dir2_node.h delete mode 100644 include/xfs_dir2_sf.h delete mode 100644 include/xfs_dir_leaf.h delete mode 100644 include/xfs_dir_sf.h create mode 100644 libxfs/crc32.c create mode 100644 libxfs/crc32defs.h create mode 100644 libxfs/gen_crc32table.c create mode 100644 libxfs/xfs_dir2_priv.h delete mode 100644 repair/dir.c delete mode 100644 repair/dir.h --HlL+5n6rz5pIUxbD Content-Type: application/octet-stream Content-Disposition: attachment; filename="xfsprogs-kern-sync-patchset.tar.gz" Content-Transfer-Encoding: base64 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 0hWTdlHzB++dTrpyjXTSubR4e6WTzqVt2yeddGVXOulsBuN90knnEi/ul05a1IE70klvyYu8 M510Ze900lGGl80zGGFuR4JRvilFuVAxDQ3BMrX4EvfsBn2+YViFDZ31rYQz9cHXcco5F4Km +2VtzCayndyrAzY986XGMmWnV5lswvn0iXQ3MslyJW0v8iln/qrS96oIpymnJipJw3ubs2hF LN0WZ+S17Nd1uC7NYZ3memXSURZ2I1efe9HfYdvqP51FufzFFNWUPfHgvXhTcq8mZ6N8kt0E iysDSlylaikqxIdbkl4XpJrcmfS6sl/S6y15Rrcmva7sm/Q6i2P2SXpdlm10a9LrwtSg23KD 7pf0Ojv/vZJeV66d9Nq9Zp+k10V5TbcmNr120uuCE9gn6XWOuK32THpduXbS68q1k17nUtPv SHqdo3SU9FpzlH6oRpNZZ74lqpC/dhJtnESSr2ZclN+5cp1s25Wd2bajPbNtq+7PJd5EMebM GNtezDGpDFITjgDGGIMCkQbYjiFywXNyawFeH4uSekscD1AmU7GQfXZoEtRicw2kyqodXLIB Mk8FM+fEodRrX/FxyxB8dIF8s9CanybmXIxIj+F8nz23yygqIU+OoHeDCKj4wsdKFfV8uK0r yyjHoYX0m7lXXBONQr3yFEWdsZwlhrFwrXRkEuAGvgtCJngYRcNHGOd9CSTnmCgSdONR/PmK NZ1+rdXo5DTBXvSSxX5UclLoC6exIiwj6cAyhJd+snY40YeS1c3szGN/lFzFXtWPiZN8g6Eb BVlHCiqzU9RUQW32wurs+qikSPuWZCOD2ZwKgHvFit7F4orttXLvExra7dYKZO71Fd8Y3h00 C9AVM+p3U3BWLqdzRHZOBmEq/srHp+L/0CF8Kv7Kh6TiZ2+2MBV/ZXcqfg4gLk51vCUVf+HI lIo/CnVlosjAXEZ08sisJ/FqMoz4CKMjcmqMKaPUm/RqpUkToDOgndFmMZ1QeU7BAU6VVjnI Jfp2PwWJviO11ZSg17oLONytUGtUc7rMxo82u20BHi0Hab3mLx88e/Lqj4NH357DPdCrXo2y IOzveeHNlxh1ryxI6OodyVVfqHazsnda88oHpTWvZNOaVz48rXmlOK15JUhrXrFpzcl6tT2t eeUTpDWvhGnNK2VpzSufJq15xac1j4w5+FtUMlNsJtASdHLlOyYKG7IQCVFjsshqQ08yjReR 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 --HlL+5n6rz5pIUxbD-- From sandeen@sandeen.net Tue Apr 30 09:17:04 2013 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 01C027F37 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 09: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 D6DD530408F for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 07:17:00 -0700 (PDT) X-ASG-Debug-ID: 1367331419-04cb6c66e455220001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 6ydw0akRPbtz5FG4 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 07:16:59 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7AF9963C3CA7; Tue, 30 Apr 2013 09:16:59 -0500 (CDT) Message-ID: <517FD25B.7060206@sandeen.net> Date: Tue, 30 Apr 2013 09:16:59 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com> CC: Eric Sandeen <sandeen@redhat.com>, xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH V2] xfstests generic/306 fixes and updates References: <517AD562.3060208@redhat.com> <517E9B52.7030008@sandeen.net> <20130430074052.GJ23072@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfstests generic/306 fixes and updates In-Reply-To: <20130430074052.GJ23072@dastard> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1367331419 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 4/30/13 2:40 AM, Dave Chinner wrote: > On Mon, Apr 29, 2013 at 11:09:54AM -0500, Eric Sandeen wrote: >> older xfs_io refused to write to /dev/null because it's >> not a file on an xfs filesystem. So add -F. > > You could just do: > > export XFS_IO_PROG="$XFS_IO_PROG -F" > > and not have to change so much of the test. And with a comment it > would make it obvious to a future ready why the -F flag is used ;) > > Cheers, > > Dave. > Well, it's not just this test; it's any non-xfs-specific test which uses xfs_io for anything at all. We have -F's sprinkled through many tests for that reason, even though -F is deprecated upstream. There are 15 non-xfs-specific tests which use XFS_IO_PROG: [sandeen@sandeen xfstests]$ grep -l XFS_IO_PROG tests/generic/* tests/shared/* | wc -l 15 and in most cases -F is explicitly added: [sandeen@sandeen xfstests]$ grep XFS_IO_PROG tests/generic/* tests/shared/* | grep "\-F" | wc -l 42 but in this case it wasn't; ditto for 298. So I guess it's a question of remembering to fix each individual test (and every new test) or somehow making it automatic. It'll get missed often, since this really only comes up when testing a distro with an old xfsprogs. -Eric From sandeen@sandeen.net Tue Apr 30 09:17:54 2013 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2C6A07F4C for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 09:17:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1B1788F8033 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 07:17:50 -0700 (PDT) X-ASG-Debug-ID: 1367331470-04cb6c66e455340001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 8DnNz3xHN9rezHNV for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 07:17:50 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 17A4363C3CA7; Tue, 30 Apr 2013 09:17:50 -0500 (CDT) Message-ID: <517FD28D.3020402@sandeen.net> Date: Tue, 30 Apr 2013 09:17:49 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com> CC: Eric Sandeen <sandeen@redhat.com>, xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH] xfstests shared/298: various fixes References: <517AE12C.2050902@redhat.com> <20130430074348.GK23072@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests shared/298: various fixes In-Reply-To: <20130430074348.GK23072@dastard> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1367331470 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/30/13 2:43 AM, Dave Chinner wrote: > On Fri, Apr 26, 2013 at 03:18:52PM -0500, Eric Sandeen wrote: >> fix shared/298: >> >> * don't include common/config, not needed and breaks >> stuff when $SCRATCH_DEV_POOL is defined: >> Error: $SCRATCH_DEV should be unset when $SCRATCH_DEV_POOL is set >> * make sure xfs_io has fiemap, we'll need it >> * add -F to the xfs_io invocation, again > > What's it needed for this time? the same as last time. :) using old xfs_io on a non-xfs fs. >> * ignore ENOSPC errors from "garbage" loop; the only goal >> is to fill it, ENOSPC doesn't matter. >> >> Signed-off-by: Eric Sandeen <sandeen@redhat.com> >> --- >> >> Wondering if we should just add " -F" to $XFS_IO_PROG . . . >> >> diff --git a/tests/shared/298 b/tests/shared/298 >> index f1a3432..e2eddda 100755 >> --- a/tests/shared/298 >> +++ b/tests/shared/298 >> @@ -28,12 +28,12 @@ echo "QA output created by $seq" >> status=1 # failure is the default! >> trap "_cleanup; exit \$status" 0 1 2 3 15 >> >> -. common/config >> . common/rc >> >> _supported_fs ext4 xfs >> _supported_os Linux >> _require_fstrim >> +_require_xfs_io_fiemap >> _require_fs_space $TEST_DIR 307200 >> [ "$FSTYP" = "ext4" ] && _require_dumpe2fs >> >> @@ -49,7 +49,7 @@ _cleanup() >> >> get_holes() >> { >> - $XFS_IO_PROG -c fiemap $1 | grep hole | $SED_PROG 's/.*\[\(.*\)\.\.\(.*\)\].*/\1 \2/' >> + $XFS_IO_PROG -F -c fiemap $1 | grep hole | $SED_PROG 's/.*\[\(.*\)\.\.\(.*\)\].*/\1 \2/' >> } >> >> get_free_sectors() >> @@ -136,9 +136,10 @@ $MKFS_PROG -t $FSTYP $MKFS_OPTIONS $loop_dev &> /dev/null >> $MOUNT_PROG $loop_dev $loop_mnt >> >> echo -n "Generating garbage on loop..." >> +# Goal is to fill it up, ignore any errors. >> for i in `seq 1 10`; do >> - mkdir $loop_mnt/$i >> - cp -r $here/* $loop_mnt/$i >> + mkdir $loop_mnt/$i &> /dev/null >> + cp -r $here/* $loop_mnt/$i &> /dev/null > > Can you break out of the loop once cp fails with an error? There's > no point hammering the filesystem for several loops after the first > ENOSPC occurs.... yeah, ok. Thanks, -Eric > -Dave. > From tinguely@sgi.com Tue Apr 30 10:22:10 2013 Return-Path: <tinguely@sgi.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8A1437F3F for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 10:22:10 -0500 (CDT) Received: from eagdhcp-232-136.americas.sgi.com (eagdhcp-232-136.americas.sgi.com [128.162.232.136]) by relay1.corp.sgi.com (Postfix) with ESMTP id 56E968F807A; Tue, 30 Apr 2013 08:22:07 -0700 (PDT) Message-ID: <517FE1A4.9010708@sgi.com> Date: Tue, 30 Apr 2013 10:22:12 -0500 From: Mark Tinguely <tinguely@sgi.com> User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com> CC: xfs@oss.sgi.com Subject: Re: [TARBALL] xfsprogs: fixes and updates to current kernel code References: <20130430121300.GB10481@dastard> In-Reply-To: <20130430121300.GB10481@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/30/13 07:13, Dave Chinner wrote: > > Hi folks, > > The attached tarball contains the following patches and a series > file: > > xfs_repair: validate on-disk extent count better Looks okay. > xfs_logprint: print all AGI unlinked buckets I understand that the AGI print in xlog_recover_print_buffer() came from xlog_print_trans_buffer(). The entries are added to the agi_unlinked[] indexed by (agino % XFS_AGI_UNLINKED_BUCKETS). Why limit the number of agi_unlinked entries base on the xfs_log_iovec region length? Commit 2bd0ea1 that put this code into log_print_trans_buffer() did not enlighten me. > xfs_fsr: file reads should be O_DIRECT Looks okay. > xfsprogs: Die dir1 Die! Looks okay > xfsprogs: sync code to current kernel code Looks okay. > xfsprogs: update libxfs to 3.9-rc1 + xfsdev > xfsprogs: add CRC32c infrastructure > xfsprogs: update libxlog to current kernel code > ... > > Cheers, > > Dave. Thanks, --Mark. From sandeen@sandeen.net Tue Apr 30 11:46:05 2013 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 935D97F4C for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 11:46:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7DFD68F806F for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 09:46:02 -0700 (PDT) X-ASG-Debug-ID: 1367340361-04cb6c66e460c50001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id OBH9QzFrOC6E4Am7 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 09:46:01 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id CC63963C3A3C; Tue, 30 Apr 2013 11:46:00 -0500 (CDT) Message-ID: <517FF548.1010309@sandeen.net> Date: Tue, 30 Apr 2013 11:46:00 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Eric Sandeen <sandeen@redhat.com> CC: xfs-oss <xfs@oss.sgi.com> Subject: [PATCH V2] xfstests shared/298: various fixes References: <517AE12C.2050902@redhat.com> X-ASG-Orig-Subj: [PATCH V2] xfstests shared/298: various fixes In-Reply-To: <517AE12C.2050902@redhat.com> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1367340361 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129619 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- fix shared/298: * don't include common/config, not needed and breaks stuff when $SCRATCH_DEV_POOL is defined: Error: $SCRATCH_DEV should be unset when $SCRATCH_DEV_POOL is set * make sure xfs_io has fiemap, we'll need it * add -F to the xfs_io invocation, again, for use on old xfsprogs on non-xfs filesystems * ignore ENOSPC errors from "garbage" loop; the only goal is to fill it, ENOSPC doesn't matter. Signed-off-by: Eric Sandeen <sandeen@redhat.com> --- V2: break out of copy loop when full diff --git a/tests/shared/298 b/tests/shared/298 index f1a3432..4541798 100755 --- a/tests/shared/298 +++ b/tests/shared/298 @@ -28,12 +28,12 @@ echo "QA output created by $seq" status=1 # failure is the default! trap "_cleanup; exit \$status" 0 1 2 3 15 -. common/config -. common/rc +. ./common/rc _supported_fs ext4 xfs _supported_os Linux _require_fstrim +_require_xfs_io_fiemap _require_fs_space $TEST_DIR 307200 [ "$FSTYP" = "ext4" ] && _require_dumpe2fs @@ -49,7 +49,7 @@ _cleanup() get_holes() { - $XFS_IO_PROG -c fiemap $1 | grep hole | $SED_PROG 's/.*\[\(.*\)\.\.\(.*\)\].*/\1 \2/' + $XFS_IO_PROG -F -c fiemap $1 | grep hole | $SED_PROG 's/.*\[\(.*\)\.\.\(.*\)\].*/\1 \2/' } get_free_sectors() @@ -136,9 +136,10 @@ $MKFS_PROG -t $FSTYP $MKFS_OPTIONS $loop_dev &> /dev/null $MOUNT_PROG $loop_dev $loop_mnt echo -n "Generating garbage on loop..." +# Goal is to fill it up, ignore any errors. for i in `seq 1 10`; do - mkdir $loop_mnt/$i - cp -r $here/* $loop_mnt/$i + mkdir $loop_mnt/$i &> /dev/null + cp -r $here/* $loop_mnt/$i &> /dev/null || break done # Get reference fiemap, this can contain i.e. uninitialized inode table From bpm@oss.sgi.com Tue Apr 30 13:08:53 2013 Return-Path: <bpm@oss.sgi.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id E75607F51; Tue, 30 Apr 2013 13:08:52 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.9-rc1-44-g123887e X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: dccc3f447a5e065a1c4406aede72d160ae38a736 X-Git-Newrev: 123887e8433e58ebbcc4c91491d8b8cde31d6d79 Message-Id: <20130430180852.E75607F51@oss.sgi.com> Date: Tue, 30 Apr 2013 13:08:52 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated 123887e xfs: Teach dquot recovery about CONFIG_XFS_QUOTA from dccc3f447a5e065a1c4406aede72d160ae38a736 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 123887e8433e58ebbcc4c91491d8b8cde31d6d79 Author: Dave Chinner <dchinner@redhat.com> Date: Tue Apr 30 21:39:33 2013 +1000 xfs: Teach dquot recovery about CONFIG_XFS_QUOTA Fix a build error when CONFIG_XFS_QUOTA=n: fs/built-in.o: In function `xlog_recovery_validate_buf_type': /home/dave/src/build/x86-64/xfsdev/fs/xfs/xfs_log_recover.c:1948: undefined reference to `xfs_dquot_buf_ops' Reported-by: Michael L. Semon <mlsemon35@gmail.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Ben Myers <bpm@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com> ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_log_recover.c | 6 ++++++ 1 file changed, 6 insertions(+) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Tue Apr 30 13:19:07 2013 Return-Path: <bpm@oss.sgi.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 69A5C7F52; Tue, 30 Apr 2013 13:19:07 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.9-rc1-44-g123887e X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: dccc3f447a5e065a1c4406aede72d160ae38a736 X-Git-Newrev: 123887e8433e58ebbcc4c91491d8b8cde31d6d79 Message-Id: <20130430181907.69A5C7F52@oss.sgi.com> Date: Tue, 30 Apr 2013 13:19:07 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated 123887e xfs: Teach dquot recovery about CONFIG_XFS_QUOTA from dccc3f447a5e065a1c4406aede72d160ae38a736 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 123887e8433e58ebbcc4c91491d8b8cde31d6d79 Author: Dave Chinner <dchinner@redhat.com> Date: Tue Apr 30 21:39:33 2013 +1000 xfs: Teach dquot recovery about CONFIG_XFS_QUOTA Fix a build error when CONFIG_XFS_QUOTA=n: fs/built-in.o: In function `xlog_recovery_validate_buf_type': /home/dave/src/build/x86-64/xfsdev/fs/xfs/xfs_log_recover.c:1948: undefined reference to `xfs_dquot_buf_ops' Reported-by: Michael L. Semon <mlsemon35@gmail.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Ben Myers <bpm@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com> ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_log_recover.c | 6 ++++++ 1 file changed, 6 insertions(+) hooks/post-receive -- XFS development tree From bpm@sgi.com Tue Apr 30 13:22:07 2013 Return-Path: <bpm@sgi.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 180847F51 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 13:22:07 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id F11FE8F8094; Tue, 30 Apr 2013 11:22:03 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 8E645500B4C; Tue, 30 Apr 2013 13:22:03 -0500 (CDT) Date: Tue, 30 Apr 2013 13:22:03 -0500 From: Ben Myers <bpm@sgi.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: Teach dquot recovery about CONFIG_XFS_QUOTA Message-ID: <20130430182203.GK29359@sgi.com> References: <1367321976-18268-1-git-send-email-david@fromorbit.com> <1367321976-18268-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1367321976-18268-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Apr 30, 2013 at 09:39:33PM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Fix a build error when CONFIG_XFS_QUOTA=n: > > fs/built-in.o: In function `xlog_recovery_validate_buf_type': > /home/dave/src/build/x86-64/xfsdev/fs/xfs/xfs_log_recover.c:1948: undefined > reference to `xfs_dquot_buf_ops' > > Reported-by: Michael L. Semon <mlsemon35@gmail.com> > Signed-off-by: Dave Chinner <dchinner@redhat.com> Applied fine this time. Must have been a PEBKAC. Reviewed-by: Ben Myers <bpm@sgi.com> > --- > fs/xfs/xfs_log_recover.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 35ac504..ecaa4d4 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -1940,12 +1940,18 @@ xlog_recovery_validate_buf_type( > case XFS_BLFT_UDQUOT_BUF: > case XFS_BLFT_PDQUOT_BUF: > case XFS_BLFT_GDQUOT_BUF: > +#ifdef CONFIG_XFS_QUOTA > if (magic16 != XFS_DQUOT_MAGIC) { > xfs_warn(mp, "Bad DQUOT block magic!"); > ASSERT(0); > break; > } > bp->b_ops = &xfs_dquot_buf_ops; > +#else > + xfs_alert(mp, > + "Trying to recover dquots without QUOTA support built in!"); > + ASSERT(0); Maybe it makes sense for recovery to fail in that case. -Ben From bpm@sgi.com Tue Apr 30 13:36:49 2013 Return-Path: <bpm@sgi.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 211827F52 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 13:36:49 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 95DB58F809B; Tue, 30 Apr 2013 11:36:48 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id F3763500B4C; Tue, 30 Apr 2013 13:36:47 -0500 (CDT) Date: Tue, 30 Apr 2013 13:36:47 -0500 From: Ben Myers <bpm@sgi.com> To: Dave Chinner <david@fromorbit.com>, Stephen Rothwell <sfr@canb.auug.org.au> Cc: xfs@oss.sgi.com, linux-next@vger.kernel.org, linux-kernel@vger.kernel.org, Christoph Hellwig <hch@lst.de> Subject: Re: linux-next: build failure after merge of the xfs tree Message-ID: <20130430183647.GF812@sgi.com> References: <20130429112943.afdd088c7bb8d80046bdfd2f@canb.auug.org.au> <20130429014002.GY10481@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130429014002.GY10481@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Stephen and Dave, On Mon, Apr 29, 2013 at 11:40:02AM +1000, Dave Chinner wrote: > On Mon, Apr 29, 2013 at 11:29:43AM +1000, Stephen Rothwell wrote: > > Hi all, > > > > After merging the xfs tree, today's linux-next build (powerpc > > ppc64_defconfig) failed like this: > > > > ERROR: "xfs_dquot_buf_ops" [fs/xfs/xfs.ko] undefined! > > > > Probably caused by commit 3fe58f30b4fc ("xfs: add CRC checks for quota > > blocks"). > > > > I have used the xfs tree from next-20130426 for today. > > CONFIG_XFS_QUOTA=y will fix it. > > Or, alternatively, apply this patch: > > http://oss.sgi.com/pipermail/xfs/2013-April/025434.html I applied this patch so it should be fixed today. Regards, Ben From rjohnston@sgi.com Tue Apr 30 15:01:09 2013 Return-Path: <rjohnston@sgi.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 314477F51 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 15:01:09 -0500 (CDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0369C30405F; Tue, 30 Apr 2013 13:01:05 -0700 (PDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id 9A31FAB8537C; Tue, 30 Apr 2013 15:01:05 -0500 (CDT) Message-Id: <20130430193734.216401872@sgi.com> User-Agent: quilt/0.60-1 Date: Tue, 30 Apr 2013 14:37:34 -0500 From: rjohnston@sgi.com To: xfs@oss.sgi.com Cc: Nathan Scott <nathans@debian.org> Subject: [PATCH] xfsprogs: 3.1.11 release Content-Disposition: inline; filename=xfsprogs-update-version-to-3.1.11.patch Signed-off-by: Rich Johnston <rjohnston@sgi.com> --- VERSION | 2 +- configure.ac | 2 +- debian/changelog | 6 ++++++ doc/CHANGES | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-) Index: b/VERSION =================================================================== --- a/VERSION +++ b/VERSION @@ -3,5 +3,5 @@ # PKG_MAJOR=3 PKG_MINOR=1 -PKG_REVISION=10 +PKG_REVISION=11 PKG_BUILD=1 Index: b/configure.ac =================================================================== --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([xfsprogs], [3.1.10]) +AC_INIT([xfsprogs], [3.1.11]) AC_PREREQ(2.50) AC_CONFIG_AUX_DIR([.]) AC_CONFIG_MACRO_DIR([m4]) Index: b/debian/changelog =================================================================== --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +xfsprogs (3.1.11) unstable; urgency=low + + * New upstream release + + -- Nathan Scott <nathans@debian.org> Tue, 19 Mar 2013 14:25:00 +1100 + xfsprogs (3.1.9) unstable; urgency=low * New upstream release Index: b/doc/CHANGES =================================================================== --- a/doc/CHANGES +++ b/doc/CHANGES @@ -1,3 +1,40 @@ +xfsprogs-3.1.11 (30 April 2013) + - Support for relative paths in xfs_quota thanks to Satoru Takeuchi. + - mkfs.xfs will always go into multidisk mode when filesystem + geometry is specified on the command line. + - Document all commands in xfs_io. + - Remove setfl command from xfs_io. + - xfs_metadump will obfuscate symlinks by path component. + - mkfs.xfs no longer accepts geometry settings smaller than the + physical sector size. + - xfs_logprint now supports multiply-logged inode fields and + handles continued inode transactions correctly. + - kill XLOG_SET + - Update release scripts to use git archive to address a + missing source file reported by Arkadiusz Mi?kiewicz + - Fix a build error with -Werror=format-security, reported + by Arkadiusz Mi?kiewicz + - mkfs.xfs no longer attempts to discard when -N option is used. + - Update 'make deb' to use tarball + - Sync up with log reservation changes in the kernel. + - Fix possible unallocated memory access in fiemap. + - Guard against string overflow in path_to_fspath. + - Fix setup_cursor array allocation. + - Fix free of unintialized pointer in xfs_acl_valid error path. + - Guard against path string overflows. + - Check strdup results properly in initallfs(). + - Fix attribute no_change_count logic. + - Remove extraneous close() in fsrallfs(). + - xfs_repair now skips the freelist scan of a corrupt agf + when in no-modify mode. + - xfs_db now skips freelist scans of corrupt agfs. + - Remove unconditional ASSERT(0) in xfs_repair. + - Reduce bb_numrecs in bno/cnt btrees when log consumes all agf space. + - Add depraction message for xfs_check. + - xfs_quota allow user or group names beginning with digits reported by + James Carter. + - Fix manpages and usage() spelling, errors and omissions. + xfsprogs-3.1.10 (13 December 2012) - Update release script to make a source tarball. From rjohnston@sgi.com Tue Apr 30 15:01:25 2013 Return-Path: <rjohnston@sgi.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F030929E03 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 15:01:25 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21-nlb.corp.sgi.com [137.38.102.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id DC89C8F8073; Tue, 30 Apr 2013 13:01:22 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.2.318.1; Tue, 30 Apr 2013 15:01:17 -0500 Message-ID: <51802313.40507@sgi.com> Date: Tue, 30 Apr 2013 15:01:23 -0500 From: Rich Johnston <rjohnston@sgi.com> User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130329 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss <xfs@oss.sgi.com> CC: Nathan Scott <nathans@debian.org> Subject: xfsprogs-3.1.11 pre-release please test! Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Hi Folks, Here are the changes for this release: xfsprogs-3.1.11 (30 April 2013) - Support for relative paths in xfs_quota thanks to Satoru Takeuchi. - mkfs.xfs will always go into multidisk mode when filesystem geometry is specified on the command line. - Document all commands in xfs_io. - Remove setfl command from xfs_io. - xfs_metadump will obfuscate symlinks by path component. - mkfs.xfs no longer accepts geometry settings smaller than the physical sector size. - xfs_logprint now supports multiply-logged inode fields and handles continued inode transactions correctly. - kill XLOG_SET - Update release scripts to use git archive to address a missing source file reported by Arkadiusz Mi?kiewicz - Fix a build error with -Werror=format-security, reported by Arkadiusz Mi?kiewicz - mkfs.xfs no longer attempts to discard when -N option is used. - Update 'make deb' to use tarball - Sync up with log reservation changes in the kernel. - Fix possible unallocated memory access in fiemap. - Guard against string overflow in path_to_fspath. - Fix setup_cursor array allocation. - Fix free of unintialized pointer in xfs_acl_valid error path. - Guard against path string overflows. - Check strdup results properly in initallfs(). - Fix attribute no_change_count logic. - Remove extraneous close() in fsrallfs(). - xfs_repair now skips the freelist scan of a corrupt agf when in no-modify mode. - xfs_db now skips freelist scans of corrupt agfs. - Remove unconditional ASSERT(0) in xfs_repair. - Reduce bb_numrecs in bno/cnt btrees when log consumes all agf space. - Add depraction message for xfs_check. - xfs_quota allow user or group names beginning with digits reported by James Carter. - Fix manpages and usage() spelling, errors and omissions. I have placed a pre-release tarball here: ftp://oss.sgi.com/projects/xfs/cmd_tars/pre-release/xfsprogs-pre-3.1.11-3.tar.gz Please take a look and report any issues before next Wednesday (08 May 2013). If there are other patches which you feel are essential, now is the time to say so. Regards --Rich From david@fromorbit.com Tue Apr 30 15:09:48 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 89D197F54 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 15:09:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 26DF1AC003 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 13:09:44 -0700 (PDT) X-ASG-Debug-ID: 1367352583-04bdf077c66d8c0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id DqwginuaFQ51YKLT for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 13:09: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: ApoSANMjgFF5LC+Z/2dsb2JhbABSgweDBLZ3hRkEAX0XdIIfAQEFOhwjEAgDGAklDwUlAyETiAvAEhWNZ4EdB4JvYQOXJZEugx8q Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail04.adl6.internode.on.net with ESMTP; 01 May 2013 05:39:42 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UXGrs-0006r0-NJ; Wed, 01 May 2013 06:09:40 +1000 Date: Wed, 1 May 2013 06:09:40 +1000 From: Dave Chinner <david@fromorbit.com> To: Eric Sandeen <sandeen@sandeen.net> Cc: Eric Sandeen <sandeen@redhat.com>, xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH V2] xfstests generic/306 fixes and updates Message-ID: <20130430200940.GC10481@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfstests generic/306 fixes and updates References: <517AD562.3060208@redhat.com> <517E9B52.7030008@sandeen.net> <20130430074052.GJ23072@dastard> <517FD25B.7060206@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <517FD25B.7060206@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: 1367352583 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129633 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Tue, Apr 30, 2013 at 09:16:59AM -0500, Eric Sandeen wrote: > On 4/30/13 2:40 AM, Dave Chinner wrote: > > On Mon, Apr 29, 2013 at 11:09:54AM -0500, Eric Sandeen wrote: > >> older xfs_io refused to write to /dev/null because it's > >> not a file on an xfs filesystem. So add -F. > > > > You could just do: > > > > export XFS_IO_PROG="$XFS_IO_PROG -F" > > > > and not have to change so much of the test. And with a comment it > > would make it obvious to a future ready why the -F flag is used ;) > > > > Cheers, > > > > Dave. > > > > Well, it's not just this test; it's any non-xfs-specific test > which uses xfs_io for anything at all. We have -F's sprinkled > through many tests for that reason, even though -F is deprecated upstream. > > There are 15 non-xfs-specific tests which use XFS_IO_PROG: OK, sounds like we should detect if it is needed when setting up XFS_IO_PROG in common/config rather than changing every test.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 30 15:12:08 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DBB0D29DF8 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 15:12:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C223D8F8059 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 13:12:08 -0700 (PDT) X-ASG-Debug-ID: 1367352726-04cbb03c2d6e210001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id BXG3So2JF4JJG2ek for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 13:12:07 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApoSAEslgFF5LC+Z/2dsb2JhbABSgweDBLZ3hRkEAX0XdIIfAQEFOhwjEAgDGAklDwUlAyETiAvAEBWNTRqBHQeCb2EDlyWRLoMfKoEuAR4G Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail04.adl6.internode.on.net with ESMTP; 01 May 2013 05:41:38 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UXGtl-0006r9-Iz; Wed, 01 May 2013 06:11:37 +1000 Date: Wed, 1 May 2013 06:11:37 +1000 From: Dave Chinner <david@fromorbit.com> To: Mark Tinguely <tinguely@sgi.com> Cc: xfs@oss.sgi.com Subject: Re: [TARBALL] xfsprogs: fixes and updates to current kernel code Message-ID: <20130430201137.GD10481@dastard> X-ASG-Orig-Subj: Re: [TARBALL] xfsprogs: fixes and updates to current kernel code References: <20130430121300.GB10481@dastard> <517FE1A4.9010708@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <517FE1A4.9010708@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: 1367352726 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129633 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 30, 2013 at 10:22:12AM -0500, Mark Tinguely wrote: > On 04/30/13 07:13, Dave Chinner wrote: > > > >Hi folks, > > > >The attached tarball contains the following patches and a series > >file: > > > >xfs_repair: validate on-disk extent count better > > Looks okay. > > >xfs_logprint: print all AGI unlinked buckets > > I understand that the AGI print in xlog_recover_print_buffer() came > from xlog_print_trans_buffer(). The entries are added to the > agi_unlinked[] indexed by (agino % XFS_AGI_UNLINKED_BUCKETS). Why > limit the number of agi_unlinked entries base on the xfs_log_iovec > region length? Commit 2bd0ea1 that put this code into > log_print_trans_buffer() did not enlighten me. Because we may only log partial regions of the AGI. The size of the region determines how many unlinked buckets are in the region that can be printed.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Tue Apr 30 15:40:38 2013 Return-Path: <sandeen@redhat.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0207F7F5A for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 15:40:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8DBEAAC008 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 13:40:37 -0700 (PDT) X-ASG-Debug-ID: 1367354436-04bdf077c86f6c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hMxWV1kQkxD7DyEX for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 13:40:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3UKeY6X020151 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Apr 2013 16:40:34 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r3UKeWE6011224 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 30 Apr 2013 16:40:33 -0400 Message-ID: <51802C41.2050803@redhat.com> Date: Tue, 30 Apr 2013 15:40:33 -0500 From: Eric Sandeen <sandeen@redhat.com> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com> CC: Eric Sandeen <sandeen@sandeen.net>, xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH V2] xfstests generic/306 fixes and updates References: <517AD562.3060208@redhat.com> <517E9B52.7030008@sandeen.net> <20130430074052.GJ23072@dastard> <517FD25B.7060206@sandeen.net> <20130430200940.GC10481@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfstests generic/306 fixes and updates In-Reply-To: <20130430200940.GC10481@dastard> X-Enigmail-Version: 1.5.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1367354436 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 4/30/13 3:09 PM, Dave Chinner wrote: > On Tue, Apr 30, 2013 at 09:16:59AM -0500, Eric Sandeen wrote: >> On 4/30/13 2:40 AM, Dave Chinner wrote: >>> On Mon, Apr 29, 2013 at 11:09:54AM -0500, Eric Sandeen wrote: >>>> older xfs_io refused to write to /dev/null because it's >>>> not a file on an xfs filesystem. So add -F. >>> >>> You could just do: >>> >>> export XFS_IO_PROG="$XFS_IO_PROG -F" >>> >>> and not have to change so much of the test. And with a comment it >>> would make it obvious to a future ready why the -F flag is used ;) >>> >>> Cheers, >>> >>> Dave. >>> >> >> Well, it's not just this test; it's any non-xfs-specific test >> which uses xfs_io for anything at all. We have -F's sprinkled >> through many tests for that reason, even though -F is deprecated upstream. >> >> There are 15 non-xfs-specific tests which use XFS_IO_PROG: > > OK, sounds like we should detect if it is needed when setting up > XFS_IO_PROG in common/config rather than changing every test.... It's just these 2 for now; I'd like to see if we can go ahead & merge this as is and I'll follow up with something to change over every non-xfs-specific test to DTRT, ok? Thanks, -Eric > Cheers, > > Dave. > From david@fromorbit.com Tue Apr 30 15:44:49 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E0C2D7F5A for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 15:44:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id ADF5C304062 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 13:44:49 -0700 (PDT) X-ASG-Debug-ID: 1367354687-04bdf077c86fa90001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id LPXtBOYUFsstQHVI for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 13:44:48 -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: ApoSADosgFF5LC+Z/2dsb2JhbABSgweDBLZ3hRkEAX0XdIIfAQEFOhwjEAgDGAklDwUlAyETiAvACRWNZ4EdB4JvYQOXJZEugx8q Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail04.adl6.internode.on.net with ESMTP; 01 May 2013 06:14:47 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UXHPp-0006uZ-TQ; Wed, 01 May 2013 06:44:45 +1000 Date: Wed, 1 May 2013 06:44:45 +1000 From: Dave Chinner <david@fromorbit.com> To: Eric Sandeen <sandeen@redhat.com> Cc: Eric Sandeen <sandeen@sandeen.net>, xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH V2] xfstests generic/306 fixes and updates Message-ID: <20130430204445.GE10481@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfstests generic/306 fixes and updates References: <517AD562.3060208@redhat.com> <517E9B52.7030008@sandeen.net> <20130430074052.GJ23072@dastard> <517FD25B.7060206@sandeen.net> <20130430200940.GC10481@dastard> <51802C41.2050803@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <51802C41.2050803@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: 1367354687 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129635 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Tue, Apr 30, 2013 at 03:40:33PM -0500, Eric Sandeen wrote: > On 4/30/13 3:09 PM, Dave Chinner wrote: > > On Tue, Apr 30, 2013 at 09:16:59AM -0500, Eric Sandeen wrote: > >> On 4/30/13 2:40 AM, Dave Chinner wrote: > >>> On Mon, Apr 29, 2013 at 11:09:54AM -0500, Eric Sandeen wrote: > >>>> older xfs_io refused to write to /dev/null because it's > >>>> not a file on an xfs filesystem. So add -F. > >>> > >>> You could just do: > >>> > >>> export XFS_IO_PROG="$XFS_IO_PROG -F" > >>> > >>> and not have to change so much of the test. And with a comment it > >>> would make it obvious to a future ready why the -F flag is used ;) > >>> > >>> Cheers, > >>> > >>> Dave. > >>> > >> > >> Well, it's not just this test; it's any non-xfs-specific test > >> which uses xfs_io for anything at all. We have -F's sprinkled > >> through many tests for that reason, even though -F is deprecated upstream. > >> > >> There are 15 non-xfs-specific tests which use XFS_IO_PROG: > > > > OK, sounds like we should detect if it is needed when setting up > > XFS_IO_PROG in common/config rather than changing every test.... > > It's just these 2 for now; I'd like to see if we can go ahead & merge this > as is and I'll follow up with something to change over every > non-xfs-specific test to DTRT, ok? That's fine by me.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Tue Apr 30 16:31:13 2013 Return-Path: <bpm@sgi.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4B62E7F5E for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 16:31:13 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id C2793AC001; Tue, 30 Apr 2013 14:31:09 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 73653500B4E; Tue, 30 Apr 2013 16:31:09 -0500 (CDT) Date: Tue, 30 Apr 2013 16:31:09 -0500 From: Ben Myers <bpm@sgi.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: Remote attr validation fixes and optimisations Message-ID: <20130430213109.GL29359@sgi.com> References: <1367321976-18268-1-git-send-email-david@fromorbit.com> <1367321976-18268-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1367321976-18268-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Tue, Apr 30, 2013 at 09:39:35PM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > - optimise the calcuation for the number of blocks in a remote > xattr. > - check attribute length against MAX_XATTR_SIZE, not MAXPATHLEN > - whitespace fixes > > Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: I guess this is what you intended? Else, looks good to me. Reviewed-by: Ben Myers <bpm@sgi.com> Thanks, Ben > --- > fs/xfs/xfs_attr_remote.c | 19 +++++-------------- > 1 file changed, 5 insertions(+), 14 deletions(-) > > diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c > index 53da46b..dee8446 100644 > --- a/fs/xfs/xfs_attr_remote.c > +++ b/fs/xfs/xfs_attr_remote.c > @@ -52,15 +52,9 @@ xfs_attr3_rmt_blocks( > struct xfs_mount *mp, > int attrlen) > { > - int fsblocks = 0; > - int len = attrlen; > - > - do { > - fsblocks++; > - len -= XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize); > - } while (len > 0); > - > - return fsblocks; > + int buflen = XFS_ATTR3_RMT_BUF_SPACE(mp, > + mp->m_sb.sb_blocksize); > + return (attrlen + buflen - 1) / buflen; > } > > static bool > @@ -79,7 +73,7 @@ xfs_attr3_rmt_verify( > if (bp->b_bn != be64_to_cpu(rmt->rm_blkno)) > return false; > if (be32_to_cpu(rmt->rm_offset) + > - be32_to_cpu(rmt->rm_bytes) >= MAXPATHLEN) > + be32_to_cpu(rmt->rm_bytes) >= XATTR_SIZE_MAX) > return false; > if (rmt->rm_owner == 0) > return false; > @@ -183,7 +177,6 @@ xfs_attr3_rmt_hdr_ok( > > /* ok */ > return true; > - > } > > /* > @@ -367,7 +360,6 @@ xfs_attr_rmtval_set( > * spill for another block every 9 headers we require in this > * loop. > */ > - > if (crcs && blkcnt == 0) { > int total_len; > > @@ -422,9 +414,8 @@ xfs_attr_rmtval_set( > > byte_cnt = BBTOB(bp->b_length); > byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, byte_cnt); > - if (valuelen < byte_cnt) { > + if (valuelen < byte_cnt) > byte_cnt = valuelen; > - } > > buf = bp->b_addr; > buf += xfs_attr3_rmt_hdr_set(mp, dp->i_ino, offset, > -- > 1.7.10.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bpm@sgi.com Tue Apr 30 16:33:10 2013 Return-Path: <bpm@sgi.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0AE2C7F5E for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 16:33:10 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 86B83AC001; Tue, 30 Apr 2013 14:33:09 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 44AC7500B4C; Tue, 30 Apr 2013 16:33:09 -0500 (CDT) Date: Tue, 30 Apr 2013 16:33:09 -0500 From: Ben Myers <bpm@sgi.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: fix da node magic number mismatches Message-ID: <20130430213309.GM29359@sgi.com> References: <1367321976-18268-1-git-send-email-david@fromorbit.com> <1367321976-18268-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1367321976-18268-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Apr 30, 2013 at 09:39:36PM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Ben Myers <bpm@sgi.com> From david@fromorbit.com Tue Apr 30 17:16:32 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B0D1A7F54 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 17:16:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 50EA9AC002 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 15:16:32 -0700 (PDT) X-ASG-Debug-ID: 1367360186-04cbb03c2d75870001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id gG5UUyhk1BBEvMC0 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 15:16:27 -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: ApsSAIxBgFF5LC+Z/2dsb2JhbABSgweDBLZ9hRkEAXwXdIIfAQEFOhwjEAgDDgcDCSUPBSUDIROIC79lFY1ngR0Hg1ADlyWRLoMfKoEvJA Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail04.adl6.internode.on.net with ESMTP; 01 May 2013 07:46:26 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UXIqW-00078G-Rj; Wed, 01 May 2013 08:16:24 +1000 Date: Wed, 1 May 2013 08:16:24 +1000 From: Dave Chinner <david@fromorbit.com> To: Ben Myers <bpm@sgi.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: Remote attr validation fixes and optimisations Message-ID: <20130430221624.GG10481@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: Remote attr validation fixes and optimisations References: <1367321976-18268-1-git-send-email-david@fromorbit.com> <1367321976-18268-4-git-send-email-david@fromorbit.com> <20130430213109.GL29359@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130430213109.GL29359@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: 1367360187 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129641 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 30, 2013 at 04:31:09PM -0500, Ben Myers wrote: > Hi Dave, > > On Tue, Apr 30, 2013 at 09:39:35PM +1000, Dave Chinner wrote: > > From: Dave Chinner <dchinner@redhat.com> > > > > - optimise the calcuation for the number of blocks in a remote > > xattr. > > - check attribute length against MAX_XATTR_SIZE, not MAXPATHLEN > > - whitespace fixes > > > > Reviewed-by: Dave Chinner <dchinner@redhat.com> > Signed-off-by: > > I guess this is what you intended? Er, yeah. Wrong vim paste macro.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 30 19:17:27 2013 Return-Path: <david@fromorbit.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D38317F37 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 19:17:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 534A8AC006 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 17:17:23 -0700 (PDT) X-ASG-Debug-ID: 1367367437-04cb6c66e47b7b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 0BdRs43k1gd5G5oU for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 17:17:17 -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: ApkSAH5dgFF5LC+Z/2dsb2JhbABSgweDBLcThRkEAXwXdIIfAQEFJxMcMwgYDCUPBSUDNIgLv0IVjUAngSSDUAOMJYsAhwaKKIMfKoEt Received: from ppp121-44-47-153.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.153]) by ipmail04.adl6.internode.on.net with ESMTP; 01 May 2013 09:47:16 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from <david@fromorbit.com>) id 1UXKjS-0007LA-4v for xfs@oss.sgi.com; Wed, 01 May 2013 10:17:14 +1000 Date: Wed, 1 May 2013 10:17:14 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 9/8] libxlog: fix log buffer alignment Message-ID: <20130501001714.GH10481@dastard> X-ASG-Orig-Subj: [PATCH 9/8] libxlog: fix log buffer alignment References: <20130430121300.GB10481@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130430121300.GB10481@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1367367437 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129649 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> The libxlog sync changed the way log buffers used in recovery are aligned to sector sizes. The old code used to check for a zero log sector size and not do any alignment - this check was removed from the kernel code because there is always log sector size configured. It turns out that userspace *never* sets the log sector size, so userspace has always simply ignored the alignment in log replay (oops!). This problem manifested itself as detecting a freshly mkfs'd filesystem as having a totally zeroed log and hence xfs_check was emitting output and hence xfstests was refusing to run. This patch correctly configures the callers that use the log recovery code so that the log sector size is set appropriately and ensures that log recovery operates as expected. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- db/sb.c | 5 +++++ libxlog/xfs_log_recover.c | 5 ++++- logprint/logprint.c | 6 ++++++ repair/phase2.c | 4 ++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/db/sb.c b/db/sb.c index d83db9c..4da1f6a 100644 --- a/db/sb.c +++ b/db/sb.c @@ -235,10 +235,15 @@ sb_logcheck(void) x.logdev = x.ddev; x.logBBsize = XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); x.logBBstart = XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart); + x.lbsize = BBSIZE; + if (xfs_sb_version_hassector(&mp->m_sb)) + x.lbsize <<= (mp->m_sb.sb_logsectlog - BBSHIFT); + log.l_dev = (mp->m_sb.sb_logstart == 0) ? x.logdev : x.ddev; log.l_logsize = BBTOB(log.l_logBBsize); log.l_logBBsize = x.logBBsize; log.l_logBBstart = x.logBBstart; + log.l_sectBBsize = BTOBB(x.lbsize); log.l_mp = mp; if (xlog_find_tail(&log, &head_blk, &tail_blk)) { diff --git a/libxlog/xfs_log_recover.c b/libxlog/xfs_log_recover.c index ad53e86..028d1e3 100644 --- a/libxlog/xfs_log_recover.c +++ b/libxlog/xfs_log_recover.c @@ -21,7 +21,10 @@ #define xfs_readonly_buftarg(buftarg) (0) /* avoid set-but-unused var warning. gcc is not very bright. */ -#define xlog_clear_stale_blocks(log, taillsn) ((taillsn) = (taillsn)) +#define xlog_clear_stale_blocks(log, taillsn) ({ \ + (taillsn) = (taillsn); \ + (0); \ +}) /* diff --git a/logprint/logprint.c b/logprint/logprint.c index 813424a..3fbcdba 100644 --- a/logprint/logprint.c +++ b/logprint/logprint.c @@ -94,6 +94,10 @@ logstat(xfs_mount_t *mp) x.logBBsize = XFS_FSB_TO_BB(mp, sb->sb_logblocks); x.logBBstart = XFS_FSB_TO_DADDR(mp, sb->sb_logstart); + x.lbsize = BBSIZE; + if (xfs_sb_version_hassector(sb)) + x.lbsize <<= (sb->sb_logsectlog - BBSHIFT); + if (!x.logname && sb->sb_logstart == 0) { fprintf(stderr, _(" external log device not specified\n\n")); usage(); @@ -105,6 +109,7 @@ logstat(xfs_mount_t *mp) stat(x.dname, &s); x.logBBsize = s.st_size >> 9; x.logBBstart = 0; + x.lbsize = BBSIZE; } @@ -235,6 +240,7 @@ main(int argc, char **argv) log.l_logsize = BBTOB(x.logBBsize); log.l_logBBstart = x.logBBstart; log.l_logBBsize = x.logBBsize; + log.l_sectBBsize = BTOBB(x.lbsize); log.l_mp = &mount; switch (print_operation) { diff --git a/repair/phase2.c b/repair/phase2.c index 23b457a..382cd7b 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -47,11 +47,15 @@ zero_log(xfs_mount_t *mp) x.logdev = x.ddev; x.logBBsize = XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); x.logBBstart = XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart); + x.lbsize = BBSIZE; + if (xfs_sb_version_hassector(&mp->m_sb)) + x.lbsize <<= (mp->m_sb.sb_logsectlog - BBSHIFT); log.l_dev = logdev; log.l_logsize = BBTOB(x.logBBsize); log.l_logBBsize = x.logBBsize; log.l_logBBstart = x.logBBstart; + log.l_sectBBsize = BTOBB(x.lbsize); log.l_mp = mp; if (xfs_sb_version_hassector(&mp->m_sb)) { log.l_sectbb_log = mp->m_sb.sb_logsectlog - BBSHIFT; From arabwom@parksian00.empoweringmedia.net Tue Apr 30 20:48:49 2013 Return-Path: <arabwom@parksian00.empoweringmedia.net> 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=DATE_IN_PAST_03_06, HTML_MESSAGE,HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E81B37F6B for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 20:48:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 81C15AC002 for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 18:48:44 -0700 (PDT) X-ASG-Debug-ID: 1367372922-04bdf077c681ca0001-NocioJ Received: from parksian00.empoweringmedia.net (parksian00.empoweringmedia.net [67.72.106.29]) by cuda.sgi.com with ESMTP id VL2kDHXugV3f8YW4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 30 Apr 2013 18:48:43 -0700 (PDT) X-Barracuda-Envelope-From: arabwom@parksian00.empoweringmedia.net X-Barracuda-Apparent-Source-IP: 67.72.106.29 Received: from arabwom by parksian00.empoweringmedia.net with local (Exim 4.76) (envelope-from <arabwom@parksian00.empoweringmedia.net>) id 1UXIEj-0001Ex-RR for xfs@oss.sgi.com; Tue, 30 Apr 2013 17:37:21 -0400 To: xfs@oss.sgi.com Subject: westpac e-statement From: Westpac Bank <e-statement@westpac.com.au> X-ASG-Orig-Subj: westpac e-statement Reply-To: MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 8bit Message-Id: <E1UXIEj-0001Ex-RR@parksian00.empoweringmedia.net> Sender: <arabwom@parksian00.empoweringmedia.net> Date: Tue, 30 Apr 2013 17:37:21 -0400 X-Barracuda-Connect: parksian00.empoweringmedia.net[67.72.106.29] X-Barracuda-Start-Time: 1367372923 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.14 X-Barracuda-Spam-Status: No, SCORE=2.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_03_06, DATE_IN_PAST_03_06_2, HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.129655 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_03_06 Date: is 3 to 6 hours before Received: date 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag 1.08 DATE_IN_PAST_03_06_2 DATE_IN_PAST_03_06_2 Your Westpac new e-statement is available.<br> To view, click on the <a href="http://wallartdiy.com/joomla/libraries/openid/Auth/west/">"ACCOUNTS"</a><br> tab and then click on <a href="http://avair-seafreight.com.my/modules/UserManager/west/">"Statements"</a> to verify your Westpac transaction.<br>